~james/remy

perf(encoding): select compact signed immediate encodings

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

2 files changed, +25 −3

src/Encoding.thy modified

@@ -60,8 +60,19 @@ definition movecode :: "register \<Rightarrow> register \<Rightarrow> nat list"
6060 "movecode dst src = [72 + (if regno src \<ge> 8 then 4 else 0) + (if regno dst \<ge> 8 then 1 else 0),
6161 137, 192 + 8 * (regno src mod 8) + regno dst mod 8]"
6262
63+definition extend32 :: "nat \<Rightarrow> pixel" where
64+ "extend32 n = word_of_int (signed_take_bit 31 (int n))"
65+
66+lemma extend32_octets [simp]: "extend32 (integer (octets 4 n)) = extend32 n"
67+proof -
68+ have "signed_take_bit 31 (int (n mod 256 ^ 4)) = signed_take_bit 31 (int n)"
69+ by (simp add: signed_take_bit_eq_iff_take_bit_eq take_bit_eq_mod of_nat_mod)
70+ then show ?thesis by (simp add: extend32_def integer_octets)
71+qed
72+
6373 fun encode :: "opcode \<Rightarrow> nat list" where
64- "encode (Immediate v) = [72,184] @ octets 8 (unat v)"
74+ "encode (Immediate v) = (if extend32 (unat v) = v then [72,199,192] @ octets 4 (unat v)
75+ else [72,184] @ octets 8 (unat v))"
6576 | "encode (Push r) = pushcode r"
6677 | "encode (Pop r) = popcode r"
6778 | "encode (Peek i) = [72,139,132,36] @ octets 4 (8 * i)"
@@ -82,6 +93,9 @@ definition decode :: "nat list \<Rightarrow> (opcode \<times> nat list) option"
8293 "decode bs = (if take 2 bs = [72,184] then
8394 if 10 \<le> length bs \<and> list_all (\<lambda>b. b < 256) (take 8 (drop 2 bs)) then
8495 Some (Immediate (word_of_nat (integer (take 8 (drop 2 bs)))), drop 10 bs) else None
96+ else if take 3 bs = [72,199,192] then
97+ if 7 \<le> length bs \<and> list_all (\<lambda>b. b < 256) (take 4 (drop 3 bs)) then
98+ Some (Immediate (extend32 (integer (take 4 (drop 3 bs)))), drop 7 bs) else None
8599 else if take 4 bs = [72,139,132,36] then
86100 let n = integer (take 4 (drop 4 bs)) in
87101 if 8 \<le> length bs \<and> list_all (\<lambda>b. b < 256) (take 4 (drop 4 bs)) \<and>
@@ -102,7 +116,7 @@ theorem decode_encode:
102116 proof (cases op)
103117 case (Immediate v)
104118 then show ?thesis
105- by (simp add: decode_def take_add integer_literal)
119+ by (auto simp: decode_def take_add integer_literal split: if_splits)
106120 next
107121 case (Push r)
108122 then show ?thesis by (cases r) (simp_all add: decode_def fixed_def)

src/Examples.thy modified

@@ -57,7 +57,15 @@ lemma stack_bound_tight:
5757 by eval
5858
5959 lemma literal_code:
60- "executable (Literal 42) = [72,184,42,0,0,0,0,0,0,0,195]"
60+ "executable (Literal 42) = [72,199,192,42,0,0,0,195]"
61+ by eval
62+
63+lemma signed_immediates:
64+ "encode (Immediate (-1)) = [72,199,192,255,255,255,255] \<and>
65+ length (encode (Immediate 2147483647)) = 7 \<and>
66+ length (encode (Immediate 2147483648)) = 10 \<and>
67+ length (encode (Immediate (-2147483648))) = 7 \<and>
68+ length (encode (Immediate (-2147483649))) = 10"
6169 by eval
6270
6371 lemma opcode_roundtrip: