2023-04-25 17:19:44 -07:00
|
|
|
log2_floor_helper:
|
|
|
|
|
// stack: val, counter, retdest
|
|
|
|
|
DUP1
|
|
|
|
|
// stack: val, val, counter, retdest
|
|
|
|
|
ISZERO
|
|
|
|
|
%jumpi(end)
|
|
|
|
|
// stack: val, counter, retdest
|
2023-05-01 13:03:48 -07:00
|
|
|
%div_const(2)
|
|
|
|
|
// stack: val/2, counter, retdest
|
2023-04-25 17:19:44 -07:00
|
|
|
SWAP1
|
|
|
|
|
%increment
|
|
|
|
|
SWAP1
|
2023-05-01 13:03:48 -07:00
|
|
|
// stack: val/2, counter + 1, retdest
|
2023-04-25 17:19:44 -07:00
|
|
|
%jump(log2_floor_helper)
|
|
|
|
|
end:
|
|
|
|
|
// stack: val, counter, retdest
|
|
|
|
|
POP
|
|
|
|
|
// stack: counter, retdest
|
|
|
|
|
SWAP1
|
|
|
|
|
// stack: retdest, counter
|
|
|
|
|
JUMP
|
|
|
|
|
|
|
|
|
|
global log2_floor:
|
|
|
|
|
// stack: val, retdest
|
2023-05-01 13:03:48 -07:00
|
|
|
%div_const(2)
|
|
|
|
|
// stack: val/2, retdest
|
2023-04-25 17:19:44 -07:00
|
|
|
PUSH 0
|
2023-05-01 13:03:48 -07:00
|
|
|
// stack: 0, val/2, retdest
|
2023-04-25 17:19:44 -07:00
|
|
|
SWAP1
|
2023-05-01 13:03:48 -07:00
|
|
|
// stack: val/2, 0, retdest
|
2023-04-25 17:19:44 -07:00
|
|
|
%jump(log2_floor_helper)
|
|
|
|
|
|
|
|
|
|
%macro log2_floor
|
|
|
|
|
%stack (val) -> (val, %%after)
|
|
|
|
|
%jump(log2_floor)
|
|
|
|
|
%%after:
|
2023-04-25 17:47:19 -07:00
|
|
|
%endmacro
|