2023-05-01 13:03:48 -07:00

38 lines
763 B
NASM

log2_floor_helper:
// stack: val, counter, retdest
DUP1
// stack: val, val, counter, retdest
ISZERO
%jumpi(end)
// stack: val, counter, retdest
%div_const(2)
// stack: val/2, counter, retdest
SWAP1
%increment
SWAP1
// stack: val/2, counter + 1, retdest
%jump(log2_floor_helper)
end:
// stack: val, counter, retdest
POP
// stack: counter, retdest
SWAP1
// stack: retdest, counter
JUMP
global log2_floor:
// stack: val, retdest
%div_const(2)
// stack: val/2, retdest
PUSH 0
// stack: 0, val/2, retdest
SWAP1
// stack: val/2, 0, retdest
%jump(log2_floor_helper)
%macro log2_floor
%stack (val) -> (val, %%after)
%jump(log2_floor)
%%after:
%endmacro