~james/remy

perf(encoding): select compact stack displacement encodings

commit
e43395488ea9ada734e845de1d029e87990e690f browse tree
parent
8e48ea3a9f597777240655497fbbe561dc1a539c
author
james <j@cpl0.zip>
signature
Verified ~james signed with a key registered by ~james
date
2026-10-12 11:00 UTC

2 files changed, +14 −2

src/Encoding.thy modified

@@ -75,7 +75,8 @@ fun encode :: "opcode \<Rightarrow> nat list" where
7575 else [72,184] @ octets 8 (unat v))"
7676 | "encode (Push r) = pushcode r"
7777 | "encode (Pop r) = popcode r"
78-| "encode (Peek i) = [72,139,132,36] @ octets 4 (8 * i)"
78+| "encode (Peek i) = (if i < 16 then [72,139,68,36,8 * i]
79+ else [72,139,132,36] @ octets 4 (8 * i))"
7980 | "encode (Arithmetic op) = arithmetic op"
8081 | "encode Conditional = [72,133,219,72,15,69,193]"
8182 | "encode (Move dst src) = movecode dst src"
@@ -96,6 +97,10 @@ definition decode :: "nat list \<Rightarrow> (opcode \<times> nat list) option"
9697 else if take 3 bs = [72,199,192] then
9798 if 7 \<le> length bs \<and> list_all (\<lambda>b. b < 256) (take 4 (drop 3 bs)) then
9899 Some (Immediate (extend32 (integer (take 4 (drop 3 bs)))), drop 7 bs) else None
100+ else if take 4 bs = [72,139,68,36] then
101+ let n = integer (take 1 (drop 4 bs)) in
102+ if 5 \<le> length bs \<and> n < 128 \<and> n mod 8 = 0
103+ then Some (Peek (n div 8), drop 5 bs) else None
99104 else if take 4 bs = [72,139,132,36] then
100105 let n = integer (take 4 (drop 4 bs)) in
101106 if 8 \<le> length bs \<and> list_all (\<lambda>b. b < 256) (take 4 (drop 4 bs)) \<and>
@@ -128,7 +133,7 @@ next
128133 have small: "i < 2 ^ 28" using valid Peek by simp
129134 have bound: "8 * i < 4294967296" using peek_bound[OF small] by simp
130135 show ?thesis using Peek small bound
131- by (simp add: decode_def integer_octets Let_def)
136+ by (auto simp: decode_def integer_octets Let_def split: if_splits)
132137 next
133138 case (Arithmetic op)
134139 then show ?thesis by (cases op) (simp_all add: decode_def fixed_def)

src/Examples.thy modified

@@ -68,6 +68,13 @@ lemma signed_immediates:
6868 length (encode (Immediate (-2147483649))) = 10"
6969 by eval
7070
71+lemma compact_slots:
72+ "encode (Peek 15) = [72,139,68,36,120] \<and>
73+ length (encode (Peek 16)) = 8 \<and>
74+ decode [72,139,68,36,128] = None \<and>
75+ decode [72,139,68,36,7] = None"
76+ by eval
77+
7178 lemma opcode_roundtrip:
7279 "decode [72,145,72,211,232,195] = Some (Arithmetic Shr,[195])"
7380 by eval