Skip to content

Commit 66180b5

Browse files
committed
Start jumptable implementation
1 parent dcae3ce commit 66180b5

File tree

1 file changed

+224
-17
lines changed

1 file changed

+224
-17
lines changed

src/L2Compressor.huff

Lines changed: 224 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
[FREE_MEMORY_START] // [windex, rindex]
1818

1919
0x01 // [flag, windex, rindex]
20-
FLAG_READ_BYTES32() // [windex, rindex]
20+
READ_FLAG() // [windex, rindex]
2121
}
2222

2323
#define macro ADDRESSES_NUM() = takes (0) returns (1) {
@@ -84,6 +84,213 @@
8484
// output stack: [num + 1]
8585
}
8686

87+
#define jumptable__packed FLAG_TABLE {
88+
FLAG_READ_BYTES32_0_BYTES
89+
FLAG_READ_BYTES32_1_BYTES
90+
FLAG_READ_BYTES32_2_BYTES
91+
FLAG_READ_BYTES32_3_BYTES
92+
FLAG_READ_BYTES32_4_BYTES
93+
FLAG_READ_BYTES32_5_BYTES
94+
FLAG_READ_BYTES32_6_BYTES
95+
FLAG_READ_BYTES32_7_BYTES
96+
FLAG_READ_BYTES32_8_BYTES
97+
FLAG_READ_BYTES32_9_BYTES
98+
FLAG_READ_BYTES32_10_BYTES
99+
FLAG_READ_BYTES32_11_BYTES
100+
FLAG_READ_BYTES32_12_BYTES
101+
FLAG_READ_BYTES32_13_BYTES
102+
FLAG_READ_BYTES32_14_BYTES
103+
FLAG_READ_BYTES32_15_BYTES
104+
FLAG_READ_BYTES32_16_BYTES
105+
FLAG_READ_BYTES32_17_BYTES
106+
FLAG_READ_BYTES32_18_BYTES
107+
FLAG_READ_BYTES32_19_BYTES
108+
FLAG_READ_BYTES32_20_BYTES
109+
FLAG_READ_BYTES32_21_BYTES
110+
FLAG_READ_BYTES32_22_BYTES
111+
FLAG_READ_BYTES32_23_BYTES
112+
FLAG_READ_BYTES32_24_BYTES
113+
FLAG_READ_BYTES32_25_BYTES
114+
FLAG_READ_BYTES32_26_BYTES
115+
FLAG_READ_BYTES32_27_BYTES
116+
FLAG_READ_BYTES32_28_BYTES
117+
FLAG_READ_BYTES32_29_BYTES
118+
FLAG_READ_BYTES32_30_BYTES
119+
FLAG_READ_BYTES32_31_BYTES
120+
FLAG_READ_BYTES32_32_BYTES
121+
JUMP_SAVE_ADDRESS // 0x00
122+
JUMP_SAVE_BYTES32 // 0x01
123+
JUMP_READ_ADDRESS_2 // 0x02
124+
JUMP_READ_ADDRESS_3 // 0x03
125+
JUMP_READ_ADDRESS_4 // 0x04
126+
JUMP_READ_ADDRESS_5 // 0x05
127+
JUMP_READ_BYTES32_2 // 0x06
128+
JUMP_READ_BYTES32_3 // 0x07
129+
JUMP_READ_BYTES32_4 // 0x08
130+
JUMP_READ_BYTES32_5 // 0x09
131+
JUMP_READ_N_BYTES // 0x0a
132+
JUMP_READ_POWER_OF_2 // 0x0b
133+
}
134+
135+
#define macro READ_FLAG(nested_read_flag_jump) = takes (2) returns (2) {
136+
// input stack: [windex, rindex]
137+
138+
dup2 // [rindex, windex, rindex]
139+
calldataload // [cdata[rindex], windex, rindex]
140+
0x00 byte // [flag, windex, rindex]
141+
142+
swap3 // [rindex, windex, flag]
143+
0x01 add // [rindex + 1, windex, flag]
144+
swap3 // [flag, windex, rindex + 1]
145+
146+
__tablesize(FLAG_TABLE) // [table_size, flag, windex, rindex + 1]
147+
__tablestart(FLAG_TABLE) // [table_start, table_size, flag, windex, rindex + 1]
148+
0x00 // [0x00, table_start, table_size, flag, windex, rindex + 1]
149+
codecopy // [flag, windex, rindex + 1]
150+
151+
dup1 // [flag, flag, windex, rindex + 1]
152+
0x0b lt // [0x0b < flag, flag, windex, rindex + 1]
153+
default jumpi // [flag, windex, rindex + 1]
154+
155+
dup1 // [flag, flag, windex, rindex + 1]
156+
mload 0xf0 shr // [dst, flag, windex, rindex + 1]
157+
jump // [flag, windex, rindex + 1]
158+
159+
FLAG_READ_BYTES32_0_BYTES:
160+
READ_BYTES32() // [windex, rindex]
161+
jump end
162+
FLAG_READ_BYTES32_1_BYTES:
163+
READ_BYTES32() // [windex, rindex]
164+
jump end
165+
FLAG_READ_BYTES32_2_BYTES:
166+
READ_BYTES32() // [windex, rindex]
167+
jump end
168+
FLAG_READ_BYTES32_3_BYTES:
169+
READ_BYTES32() // [windex, rindex]
170+
jump end
171+
FLAG_READ_BYTES32_4_BYTES:
172+
READ_BYTES32() // [windex, rindex]
173+
jump end
174+
FLAG_READ_BYTES32_5_BYTES:
175+
READ_BYTES32() // [windex, rindex]
176+
jump end
177+
FLAG_READ_BYTES32_6_BYTES:
178+
READ_BYTES32() // [windex, rindex]
179+
jump end
180+
FLAG_READ_BYTES32_7_BYTES:
181+
READ_BYTES32() // [windex, rindex]
182+
jump end
183+
FLAG_READ_BYTES32_8_BYTES:
184+
READ_BYTES32() // [windex, rindex]
185+
jump end
186+
FLAG_READ_BYTES32_9_BYTES:
187+
READ_BYTES32() // [windex, rindex]
188+
jump end
189+
FLAG_READ_BYTES32_10_BYTES:
190+
READ_BYTES32() // [windex, rindex]
191+
jump end
192+
FLAG_READ_BYTES32_11_BYTES:
193+
READ_BYTES32() // [windex, rindex]
194+
jump end
195+
FLAG_READ_BYTES32_12_BYTES:
196+
READ_BYTES32() // [windex, rindex]
197+
jump end
198+
FLAG_READ_BYTES32_13_BYTES:
199+
READ_BYTES32() // [windex, rindex]
200+
jump end
201+
FLAG_READ_BYTES32_14_BYTES:
202+
READ_BYTES32() // [windex, rindex]
203+
jump end
204+
FLAG_READ_BYTES32_15_BYTES:
205+
READ_BYTES32() // [windex, rindex]
206+
jump end
207+
FLAG_READ_BYTES32_16_BYTES:
208+
READ_BYTES32() // [windex, rindex]
209+
jump end
210+
FLAG_READ_BYTES32_17_BYTES:
211+
READ_BYTES32() // [windex, rindex]
212+
jump end
213+
FLAG_READ_BYTES32_18_BYTES:
214+
READ_BYTES32() // [windex, rindex]
215+
jump end
216+
FLAG_READ_BYTES32_19_BYTES:
217+
READ_BYTES32() // [windex, rindex]
218+
jump end
219+
FLAG_READ_BYTES32_20_BYTES:
220+
READ_BYTES32() // [windex, rindex]
221+
jump end
222+
FLAG_READ_BYTES32_21_BYTES:
223+
READ_BYTES32() // [windex, rindex]
224+
jump end
225+
FLAG_READ_BYTES32_22_BYTES:
226+
READ_BYTES32() // [windex, rindex]
227+
jump end
228+
FLAG_READ_BYTES32_23_BYTES:
229+
READ_BYTES32() // [windex, rindex]
230+
jump end
231+
FLAG_READ_BYTES32_24_BYTES:
232+
READ_BYTES32() // [windex, rindex]
233+
jump end
234+
FLAG_READ_BYTES32_25_BYTES:
235+
READ_BYTES32() // [windex, rindex]
236+
jump end
237+
FLAG_READ_BYTES32_26_BYTES:
238+
READ_BYTES32() // [windex, rindex]
239+
jump end
240+
FLAG_READ_BYTES32_27_BYTES:
241+
READ_BYTES32() // [windex, rindex]
242+
jump end
243+
FLAG_READ_BYTES32_28_BYTES:
244+
READ_BYTES32() // [windex, rindex]
245+
jump end
246+
FLAG_READ_BYTES32_29_BYTES:
247+
READ_BYTES32() // [windex, rindex]
248+
jump end
249+
FLAG_READ_BYTES32_30_BYTES:
250+
READ_BYTES32() // [windex, rindex]
251+
jump end
252+
FLAG_READ_BYTES32_31_BYTES:
253+
READ_BYTES32() // [windex, rindex]
254+
jump end
255+
FLAG_READ_BYTES32_32_BYTES:
256+
READ_BYTES32() // [windex, rindex]
257+
jump end
258+
259+
JUMP_SAVE_ADDRESS:
260+
SAVE_ADDRESS() // [windex, rindex]
261+
jump end
262+
263+
JUMP_SAVE_BYTES32:
264+
SAVE_BYTES32() // [windex, rindex]
265+
jump end
266+
267+
JUMP_READ_ADDRESS_2:
268+
JUMP_READ_ADDRESS_3:
269+
JUMP_READ_ADDRESS_4:
270+
JUMP_READ_ADDRESS_5:
271+
READ_ADDRESS_STORAGE() // [windex, rindex]
272+
jump end
273+
274+
JUMP_READ_BYTES32_2:
275+
JUMP_READ_BYTES32_3:
276+
JUMP_READ_BYTES32_4:
277+
JUMP_READ_BYTES32_5:
278+
READ_BYTES32_STORAGE() // [windex, rindex]
279+
jump end
280+
281+
JUMP_READ_N_BYTES:
282+
READ_N_BYTES() // [windex, rindex]
283+
jump end
284+
285+
JUMP_READ_POWER_OF_2:
286+
READ_POWER_OF_2() // [windex, rindex]
287+
jump end
288+
289+
default:
290+
291+
end:
292+
}
293+
87294
#define test TEST_NUMS() = {
88295
ADDRESSES_NUM() // [num]
89296
0x00 eq ASSERT() // []
@@ -116,7 +323,7 @@
116323
0x01 eq ASSERT() // []
117324
}
118325

119-
#define macro FLAG_READ_BYTES32() = takes (3) returns (2) {
326+
#define macro READ_BYTES32() = takes (3) returns (2) {
120327
// input stack: [flag, windex, rindex, initial]
121328

122329
0x20 // [0x20, flag, windex, rindex, initial]
@@ -145,7 +352,7 @@
145352

146353
0x02 // [flag, windex, rindex]
147354

148-
FLAG_READ_BYTES32() // [windex, rindex]
355+
READ_BYTES32() // [windex, rindex]
149356

150357
0x22 eq ASSERT() // [rindex]
151358
0x03 eq ASSERT() // []
@@ -158,7 +365,7 @@
158365
eq ASSERT() // []
159366
}
160367

161-
#define macro FLAG_SAVE_ADDRESS() = takes (3) returns (2) {
368+
#define macro SAVE_ADDRESS() = takes (3) returns (2) {
162369
// input stack: [flag, windex, rindex]
163370

164371
pop // [windex, rindex]
@@ -191,13 +398,13 @@
191398

192399
// 0xd10eb37ef5838bb835ea71bbd4053daf8de7bd8e
193400
#[calldata("0xb2d10eb37ef5838bb835ea71bbd4053daf8de7bd8ecdf638451a2bc966a145a8"), value(0x01)]
194-
#define test TEST_FLAG_SAVE_ADDRESS() = {
401+
#define test TEST_SAVE_ADDRESS() = {
195402
0x01 // [rindex]
196403
0x20 // [windex, rindex]
197404

198405
0x02 // [flag, windex, rindex]
199406

200-
FLAG_SAVE_ADDRESS() // [windex, rindex]
407+
SAVE_ADDRESS() // [windex, rindex]
201408

202409
0x40 eq ASSERT() // [rindex]
203410
0x21 eq ASSERT() // []
@@ -217,7 +424,7 @@
217424
ADDRESSES_NUM() 0x01 eq ASSERT() // []
218425
}
219426

220-
#define macro FLAG_SAVE_BYTES32() = takes (3) returns (2) {
427+
#define macro SAVE_BYTES32() = takes (3) returns (2) {
221428
// input stack: [flag, windex, rindex]
222429

223430
pop // [windex, rindex]
@@ -245,13 +452,13 @@
245452
}
246453

247454
#[calldata("0xb2d10eb37ef5838bb835ea71bbd4053daf8de7bd8ecdf638451a2bc966a145a899"), value(0x01)]
248-
#define test TEST_FLAG_SAVE_BYTES32() = {
455+
#define test TEST_SAVE_BYTES32() = {
249456
0x01 // [rindex]
250457
0x20 // [windex, rindex]
251458

252459
0x02 // [flag, windex, rindex]
253460

254-
FLAG_SAVE_BYTES32() // [windex, rindex]
461+
SAVE_BYTES32() // [windex, rindex]
255462

256463
0x40 eq ASSERT() // []
257464
0x21 eq ASSERT() // [rindex]
@@ -272,11 +479,11 @@
272479
}
273480

274481
// Reads a stored bytes32 using a 2 to 5 bytes pointer index
275-
#define macro READ_BYTES32() = takes (3) returns (2) {
482+
#define macro READ_BYTES32_STORAGE() = takes (3) returns (2) {
276483
READ_STORAGE(READ_BYTES32_X_BYTES_FLAG_OFFSET, BYTES32_SMV, shl)
277484
}
278485

279-
#define macro READ_ADDRESS() = takes (3) returns (2) {
486+
#define macro READ_ADDRESS_STORAGE() = takes (3) returns (2) {
280487
READ_STORAGE(READ_ADDRESS_X_BYTES_FLAG_OFFSET, ADDRESS_SMV, add)
281488
}
282489

@@ -320,7 +527,7 @@
320527
0x00 // [windex, rindex]
321528
[FLAG_READ_BYTES32_2_BYTES] // [flag, windex, rindex]
322529

323-
READ_BYTES32() // [windex, rindex]
530+
READ_BYTES32_STORAGE() // [windex, rindex]
324531

325532
0x20 eq ASSERT() // [rindex]
326533
0x02 eq ASSERT() // []
@@ -332,7 +539,7 @@
332539
0x20 // [windex, rindex]
333540
[FLAG_READ_BYTES32_2_BYTES] 0x02 add // [flag, windex, rindex]
334541

335-
READ_BYTES32() // [windex, rindex]
542+
READ_BYTES32_STORAGE() // [windex, rindex]
336543

337544
0x40 eq ASSERT() // [rindex]
338545
0x06 eq ASSERT() // []
@@ -345,7 +552,7 @@
345552

346553
[FLAG_READ_BYTES32_2_BYTES] 0x03 add // [flag, windex, rindex]
347554

348-
READ_BYTES32() // [windex, rindex]
555+
READ_BYTES32_STORAGE() // [windex, rindex]
349556

350557
0x30 eq ASSERT() // [rindex]
351558
0x0b eq ASSERT() // []
@@ -371,7 +578,7 @@
371578
0x00 // [windex, rindex]
372579
[FLAG_READ_ADDRESS_2_BYTES] // [flag, windex, rindex]
373580

374-
READ_ADDRESS() // [windex, rindex]
581+
READ_ADDRESS_STORAGE() // [windex, rindex]
375582

376583
0x20 eq ASSERT() // [rindex]
377584
0x02 eq ASSERT() // []
@@ -383,7 +590,7 @@
383590
0x20 // [windex, rindex]
384591
[FLAG_READ_ADDRESS_2_BYTES] 0x02 add // [flag, windex, rindex]
385592

386-
READ_ADDRESS() // [windex, rindex]
593+
READ_ADDRESS_STORAGE() // [windex, rindex]
387594

388595
0x40 eq ASSERT() // [rindex]
389596
0x06 eq ASSERT() // []
@@ -396,7 +603,7 @@
396603

397604
[FLAG_READ_ADDRESS_2_BYTES] 0x03 add // [flag, windex, rindex]
398605

399-
READ_ADDRESS() // [windex, rindex]
606+
READ_ADDRESS_STORAGE() // [windex, rindex]
400607

401608
0x30 eq ASSERT() // [rindex]
402609
0x0b eq ASSERT() // []

0 commit comments

Comments
 (0)