2022-07-07 08:59:53 -07:00
|
|
|
%macro jump(dst)
|
2022-09-14 11:29:13 -07:00
|
|
|
PUSH $dst
|
2022-07-07 08:59:53 -07:00
|
|
|
jump
|
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro jumpi(dst)
|
2022-09-14 11:29:13 -07:00
|
|
|
PUSH $dst
|
2022-07-07 08:59:53 -07:00
|
|
|
jumpi
|
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro pop2
|
2022-07-14 14:55:17 -07:00
|
|
|
%rep 2
|
2022-09-14 11:29:13 -07:00
|
|
|
POP
|
2022-07-14 14:55:17 -07:00
|
|
|
%endrep
|
2022-07-07 08:59:53 -07:00
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro pop3
|
2022-07-14 14:55:17 -07:00
|
|
|
%rep 3
|
2022-09-14 11:29:13 -07:00
|
|
|
POP
|
2022-07-14 14:55:17 -07:00
|
|
|
%endrep
|
2022-07-07 08:59:53 -07:00
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro pop4
|
2022-07-14 14:55:17 -07:00
|
|
|
%rep 4
|
2022-09-14 11:29:13 -07:00
|
|
|
POP
|
2022-07-14 14:55:17 -07:00
|
|
|
%endrep
|
2022-07-07 08:59:53 -07:00
|
|
|
%endmacro
|
|
|
|
|
|
2022-07-18 14:55:15 -07:00
|
|
|
%macro pop5
|
|
|
|
|
%rep 5
|
2022-09-14 11:29:13 -07:00
|
|
|
POP
|
2022-07-18 14:55:15 -07:00
|
|
|
%endrep
|
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro pop6
|
|
|
|
|
%rep 6
|
2022-09-14 11:29:13 -07:00
|
|
|
POP
|
2022-07-18 14:55:15 -07:00
|
|
|
%endrep
|
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro pop7
|
|
|
|
|
%rep 7
|
2022-09-14 11:29:13 -07:00
|
|
|
POP
|
2022-07-18 14:55:15 -07:00
|
|
|
%endrep
|
|
|
|
|
%endmacro
|
|
|
|
|
|
2022-08-30 13:06:03 -07:00
|
|
|
%macro and_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
AND
|
|
|
|
|
// stack: input & c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
2022-07-17 09:14:24 -07:00
|
|
|
%macro add_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
ADD
|
|
|
|
|
// stack: input + c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
// Slightly inefficient as we need to swap the inputs.
|
|
|
|
|
// Consider avoiding this in performance-critical code.
|
|
|
|
|
%macro sub_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
// stack: c, input, ...
|
|
|
|
|
SWAP1
|
|
|
|
|
// stack: input, c, ...
|
|
|
|
|
SUB
|
|
|
|
|
// stack: input - c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro mul_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
MUL
|
|
|
|
|
// stack: input * c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
// Slightly inefficient as we need to swap the inputs.
|
|
|
|
|
// Consider avoiding this in performance-critical code.
|
|
|
|
|
%macro div_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
// stack: c, input, ...
|
|
|
|
|
SWAP1
|
|
|
|
|
// stack: input, c, ...
|
2022-07-06 19:47:58 -07:00
|
|
|
DIV
|
2022-07-17 09:14:24 -07:00
|
|
|
// stack: input / c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
2022-07-06 19:47:58 -07:00
|
|
|
// Slightly inefficient as we need to swap the inputs.
|
|
|
|
|
// Consider avoiding this in performance-critical code.
|
|
|
|
|
%macro mod_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
// stack: c, input, ...
|
|
|
|
|
SWAP1
|
|
|
|
|
// stack: input, c, ...
|
|
|
|
|
MOD
|
|
|
|
|
// stack: input % c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
2022-07-19 10:36:18 -07:00
|
|
|
%macro shl_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
SHL
|
|
|
|
|
// stack: input << c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
2022-08-30 13:06:03 -07:00
|
|
|
%macro shr_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
SHR
|
|
|
|
|
// stack: input >> c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
2022-07-17 09:14:24 -07:00
|
|
|
%macro eq_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
EQ
|
|
|
|
|
// stack: input == c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro lt_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
// stack: c, input, ...
|
|
|
|
|
GT // Check it backwards: (input < c) == (c > input)
|
|
|
|
|
// stack: input <= c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro le_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
// stack: c, input, ...
|
2022-08-02 15:44:50 -07:00
|
|
|
LT ISZERO // Check it backwards: (input <= c) == !(c < input)
|
2022-07-17 09:14:24 -07:00
|
|
|
// stack: input <= c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro gt_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
// stack: c, input, ...
|
|
|
|
|
LT // Check it backwards: (input > c) == (c < input)
|
|
|
|
|
// stack: input >= c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro ge_const(c)
|
|
|
|
|
// stack: input, ...
|
|
|
|
|
PUSH $c
|
|
|
|
|
// stack: c, input, ...
|
2022-08-02 15:44:50 -07:00
|
|
|
GT ISZERO // Check it backwards: (input >= c) == !(c > input)
|
2022-07-17 09:14:24 -07:00
|
|
|
// stack: input >= c, ...
|
|
|
|
|
%endmacro
|
|
|
|
|
|
2022-08-03 13:44:44 -07:00
|
|
|
%macro consume_gas_const(c)
|
|
|
|
|
PUSH $c
|
|
|
|
|
CONSUME_GAS
|
|
|
|
|
%endmacro
|
|
|
|
|
|
2022-06-25 23:10:08 -07:00
|
|
|
// If pred is zero, yields z; otherwise, yields nz
|
|
|
|
|
%macro select
|
|
|
|
|
// stack: pred, nz, z
|
2022-09-14 11:29:13 -07:00
|
|
|
ISZERO
|
2022-06-25 23:10:08 -07:00
|
|
|
// stack: pred == 0, nz, z
|
2022-09-14 11:29:13 -07:00
|
|
|
DUP1
|
2022-06-25 23:10:08 -07:00
|
|
|
// stack: pred == 0, pred == 0, nz, z
|
2022-09-14 11:29:13 -07:00
|
|
|
ISZERO
|
2022-06-25 23:10:08 -07:00
|
|
|
// stack: pred != 0, pred == 0, nz, z
|
2022-09-14 11:29:13 -07:00
|
|
|
SWAP3
|
2022-06-25 23:10:08 -07:00
|
|
|
// stack: z, pred == 0, nz, pred != 0
|
2022-09-14 11:29:13 -07:00
|
|
|
MUL
|
2022-06-25 23:10:08 -07:00
|
|
|
// stack: (pred == 0) * z, nz, pred != 0
|
2022-09-14 11:29:13 -07:00
|
|
|
SWAP2
|
2022-06-25 23:10:08 -07:00
|
|
|
// stack: pred != 0, nz, (pred == 0) * z
|
2022-09-14 11:29:13 -07:00
|
|
|
MUL
|
2022-06-25 23:10:08 -07:00
|
|
|
// stack: (pred != 0) * nz, (pred == 0) * z
|
2022-09-14 11:29:13 -07:00
|
|
|
ADD
|
2022-06-25 23:10:08 -07:00
|
|
|
// stack: (pred != 0) * nz + (pred == 0) * z
|
|
|
|
|
%endmacro
|
|
|
|
|
|
2022-07-14 11:30:47 +02:00
|
|
|
// If pred, yields z; otherwise, yields nz
|
|
|
|
|
// Assumes pred is boolean (either 0 or 1).
|
|
|
|
|
%macro select_bool
|
|
|
|
|
// stack: pred, nz, z
|
2022-09-14 11:29:13 -07:00
|
|
|
DUP1
|
2022-07-14 11:30:47 +02:00
|
|
|
// stack: pred, pred, nz, z
|
2022-09-14 11:29:13 -07:00
|
|
|
ISZERO
|
2022-07-14 11:30:47 +02:00
|
|
|
// stack: notpred, pred, nz, z
|
2022-09-14 11:29:13 -07:00
|
|
|
SWAP3
|
2022-07-14 11:30:47 +02:00
|
|
|
// stack: z, pred, nz, notpred
|
2022-09-14 11:29:13 -07:00
|
|
|
MUL
|
2022-07-14 11:30:47 +02:00
|
|
|
// stack: pred * z, nz, notpred
|
2022-09-14 11:29:13 -07:00
|
|
|
SWAP2
|
2022-07-14 11:30:47 +02:00
|
|
|
// stack: notpred, nz, pred * z
|
2022-09-14 11:29:13 -07:00
|
|
|
MUL
|
2022-07-14 11:30:47 +02:00
|
|
|
// stack: notpred * nz, pred * z
|
2022-09-14 11:29:13 -07:00
|
|
|
ADD
|
2022-07-14 11:30:47 +02:00
|
|
|
// stack: notpred * nz + pred * z
|
|
|
|
|
%endmacro
|
|
|
|
|
|
2022-06-25 23:10:08 -07:00
|
|
|
%macro square
|
|
|
|
|
// stack: x
|
2022-09-14 11:29:13 -07:00
|
|
|
DUP1
|
2022-06-25 23:10:08 -07:00
|
|
|
// stack: x, x
|
2022-09-14 11:29:13 -07:00
|
|
|
MUL
|
2022-06-25 23:10:08 -07:00
|
|
|
// stack: x^2
|
|
|
|
|
%endmacro
|
2022-07-30 14:52:39 -04:00
|
|
|
|
2022-08-03 13:44:44 -07:00
|
|
|
%macro min
|
|
|
|
|
// stack: x, y
|
|
|
|
|
DUP2
|
|
|
|
|
DUP2
|
|
|
|
|
// stack: x, y, x, y
|
|
|
|
|
LT
|
|
|
|
|
// stack: x < y, x, y
|
|
|
|
|
%select_bool
|
|
|
|
|
// stack: min
|
|
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro max
|
|
|
|
|
// stack: x, y
|
|
|
|
|
DUP2
|
|
|
|
|
DUP2
|
|
|
|
|
// stack: x, y, x, y
|
|
|
|
|
GT
|
|
|
|
|
// stack: x > y, x, y
|
|
|
|
|
%select_bool
|
|
|
|
|
// stack: max
|
2022-08-08 10:51:01 -04:00
|
|
|
%endmacro
|
2022-08-08 10:57:39 -04:00
|
|
|
|
2022-09-29 13:58:49 -07:00
|
|
|
%macro as_u32
|
2022-09-15 11:02:03 -07:00
|
|
|
%and_const(0xffffffff)
|
2022-09-08 15:47:18 -07:00
|
|
|
%endmacro
|
2022-08-23 12:03:06 -07:00
|
|
|
|
2022-09-21 20:03:11 -07:00
|
|
|
%macro not_u32
|
2022-08-08 10:57:39 -04:00
|
|
|
// stack: x
|
2022-09-09 17:42:49 -07:00
|
|
|
PUSH 0xffffffff
|
2022-08-08 10:57:39 -04:00
|
|
|
// stack: 0xffffffff, x
|
2022-09-09 17:42:49 -07:00
|
|
|
SUB
|
2022-08-08 10:57:39 -04:00
|
|
|
// stack: 0xffffffff - x
|
|
|
|
|
%endmacro
|
|
|
|
|
|
2022-10-03 14:25:33 -07:00
|
|
|
// u32 addition (discarding 2^32 bit)
|
|
|
|
|
%macro add_u32
|
|
|
|
|
// stack: x, y
|
|
|
|
|
ADD
|
|
|
|
|
// stack: x + y
|
|
|
|
|
%as_u32
|
|
|
|
|
// stack: (x + y) & u32::MAX
|
|
|
|
|
%endmacro
|
|
|
|
|
|
2022-09-21 20:03:11 -07:00
|
|
|
%macro add3_u32
|
2022-09-29 13:58:49 -07:00
|
|
|
// stack: x , y , z
|
2022-09-09 17:42:49 -07:00
|
|
|
ADD
|
2022-09-29 13:58:49 -07:00
|
|
|
// stack: x + y , z
|
2022-09-09 17:42:49 -07:00
|
|
|
ADD
|
2022-09-29 13:58:49 -07:00
|
|
|
// stack: x + y + z
|
|
|
|
|
%as_u32
|
2022-08-23 12:03:06 -07:00
|
|
|
%endmacro
|
2022-09-15 11:02:03 -07:00
|
|
|
|
2022-07-14 09:29:29 -07:00
|
|
|
%macro increment
|
2022-09-14 11:29:13 -07:00
|
|
|
%add_const(1)
|
2022-07-14 09:29:29 -07:00
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro decrement
|
2022-09-14 11:29:13 -07:00
|
|
|
%sub_const(1)
|
2022-07-14 09:29:29 -07:00
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro div2
|
2022-09-14 11:29:13 -07:00
|
|
|
%div_const(2)
|
2022-07-15 14:30:15 -07:00
|
|
|
%endmacro
|
|
|
|
|
|
|
|
|
|
%macro iseven
|
2022-09-14 11:29:13 -07:00
|
|
|
%mod_const(2)
|
|
|
|
|
ISZERO
|
2022-07-15 14:30:15 -07:00
|
|
|
%endmacro
|
2022-10-03 14:07:21 -07:00
|
|
|
|
2022-09-15 11:02:03 -07:00
|
|
|
// given u32 bytestring abcd return dcba
|
2022-09-21 20:03:11 -07:00
|
|
|
%macro reverse_bytes_u32
|
2022-09-15 11:02:03 -07:00
|
|
|
// stack: abcd
|
|
|
|
|
DUP1
|
2022-09-29 16:21:10 -07:00
|
|
|
PUSH 28
|
|
|
|
|
BYTE
|
|
|
|
|
// stack: a, abcd
|
|
|
|
|
DUP2
|
|
|
|
|
PUSH 29
|
|
|
|
|
BYTE
|
2022-09-23 10:39:49 -07:00
|
|
|
%shl_const(8)
|
2022-09-29 16:21:10 -07:00
|
|
|
// stack: b0, a, abcd
|
|
|
|
|
DUP3
|
|
|
|
|
PUSH 30
|
|
|
|
|
BYTE
|
2022-09-23 10:39:49 -07:00
|
|
|
%shl_const(16)
|
2022-09-29 16:21:10 -07:00
|
|
|
// stack: c00, b0, a, abcd
|
|
|
|
|
SWAP3
|
|
|
|
|
PUSH 31
|
|
|
|
|
BYTE
|
2022-09-23 10:39:49 -07:00
|
|
|
%shl_const(24)
|
2022-09-29 16:21:10 -07:00
|
|
|
// stack: d000, b0, a, c00
|
|
|
|
|
OR
|
|
|
|
|
OR
|
2022-09-23 10:39:49 -07:00
|
|
|
OR
|
2022-09-15 11:02:03 -07:00
|
|
|
// stack: dcba
|
|
|
|
|
%endmacro
|