X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86%2Farith.lisp;h=af7da99188d9e2effe5ec8785be284865e1cad82;hb=11f02398a1a9ccbde847c82fd233e8378e45c29c;hp=88c81228f3ba125e7f733e62bc2e143befb3cf35;hpb=ebf2239bc0f2e306ed98acaef232fce9c8f1d5d2;p=sbcl.git diff --git a/src/compiler/x86/arith.lisp b/src/compiler/x86/arith.lisp index 88c8122..af7da99 100644 --- a/src/compiler/x86/arith.lisp +++ b/src/compiler/x86/arith.lisp @@ -184,7 +184,6 @@ (define-binop logior 2 or) (define-binop logxor 2 xor)) - ;;; Special handling of add on the x86; can use lea to avoid a ;;; register load, otherwise it uses add. (define-vop (fast-+/fixnum=>fixnum fast-safe-arith-op) @@ -1170,6 +1169,23 @@ (define-vop (fast-logxor-mod32-c/unsigned=>unsigned fast-logxor-c/unsigned=>unsigned) (:translate logxor-mod32)) + +(define-source-transform logeqv (&rest args) + (if (oddp (length args)) + `(logxor ,@args) + `(lognot (logxor ,@args)))) +(define-source-transform logandc1 (x y) + `(logand (lognot ,x) ,y)) +(define-source-transform logandc2 (x y) + `(logand ,x (lognot ,y))) +(define-source-transform logorc1 (x y) + `(logior (lognot ,x) ,y)) +(define-source-transform logorc2 (x y) + `(logior ,x (lognot ,y))) +(define-source-transform lognor (x y) + `(lognot (logior ,x ,y))) +(define-source-transform lognand (x y) + `(lognot (logand ,x ,y))) ;;;; bignum stuff @@ -1482,12 +1498,12 @@ (foldable flushable)) (defoptimizer (%lea derive-type) ((base index scale disp)) - (when (and (constant-continuation-p scale) - (constant-continuation-p disp)) - (let ((scale (continuation-value scale)) - (disp (continuation-value disp)) - (base-type (continuation-type base)) - (index-type (continuation-type index))) + (when (and (constant-lvar-p scale) + (constant-lvar-p disp)) + (let ((scale (lvar-value scale)) + (disp (lvar-value disp)) + (base-type (lvar-type base)) + (index-type (lvar-type index))) (when (and (numeric-type-p base-type) (numeric-type-p index-type)) (let ((base-lo (numeric-type-low base-type)) @@ -1629,7 +1645,7 @@ ((unsigned-byte 32) (constant-arg (unsigned-byte 32))) (unsigned-byte 32)) "recode as leas, shifts and adds" - (let ((y (continuation-value y))) + (let ((y (lvar-value y))) (cond ((= y (ash 1 (integer-length y))) ;; there's a generic transform for y = 2^k