perf: disasm bits/sign-extend use ash+bitwise-and (was expt per field extract)

ober

3894a985bee9ea381ac7ff5b5887e5de7c7eb2df

diff --git a/lib/jasm/disasm.ss b/lib/jasm/disasm.ss
index 4256df4..a35ef74 100644
--- 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"