X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Farith.lisp;h=cc41f3daff5a7f0584a3222a7309afde592504ae;hb=2e5263a05f55e2b56a3194ad7853e9ae18ad69af;hp=cfe4ad4e5c3167716776159567cadbfa7c96de32;hpb=7deecae2d959173eda6a153d490c752c32050a9e;p=sbcl.git diff --git a/src/compiler/x86-64/arith.lisp b/src/compiler/x86-64/arith.lisp index cfe4ad4..cc41f3d 100644 --- a/src/compiler/x86-64/arith.lisp +++ b/src/compiler/x86-64/arith.lisp @@ -667,6 +667,8 @@ (location= number result))))) (:result-types tagged-num) (:note "inline ASH") + (:variant nil) + (:variant-vars modularp) (:generator 2 (cond ((and (= amount 1) (not (location= number result))) (inst lea result (make-ea :qword :base number :index number))) @@ -685,8 +687,11 @@ (inst sar result (- amount)) (inst and result (lognot fixnum-tag-mask))))) ((plusp amount) + (unless modularp + (aver (not "Impossible: fixnum ASH should not be called with +constant shift greater than word length"))) (if (sc-is result any-reg) - (inst xor result result) + (zeroize result) (inst mov result 0))) (t (inst sar result 63) (inst and result (lognot fixnum-tag-mask)))))))) @@ -1367,6 +1372,7 @@ (define-vop (fast-ash-left-smod61-c/fixnum=>fixnum fast-ash-c/fixnum=>fixnum) + (:variant :modular) (:translate ash-left-smod61)) (define-vop (fast-ash-left-smod61/fixnum=>fixnum fast-ash-left/fixnum=>fixnum))