perf: disasm bits/sign-extend use ash+bitwise-and (was expt per field extract)
ober
3894a985bee9ea381ac7ff5b5887e5de7c7eb2df
--- a/lib/jasm/disasm.ss +++ b/lib/jasm/disasm.ss @@ -156,12 +156,13 @@ (if (>= x #x8000) (- x #x10000) x)) (define (sign-extend x width) - (let ([sign (expt 2 (- width 1))] - [limit (expt 2 width)]) + (let ([sign (ash 1 (- width 1))] + [limit (ash 1 width)]) (if (>= x sign) (- x limit) x))) (define (bits n hi lo) - (mod (div n (expt 2 lo)) (expt 2 (+ 1 (- hi lo))))) + (bitwise-and (ash n (- lo)) + (- (ash 1 (+ 1 (- hi lo))) 1))) (define x86-reg64 '#("rax" "rcx" "rdx" "rbx" "rsp" "rbp" "rsi" "rdi"