X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86%2Farith.lisp;h=cdadbb219897cb7334df030842391188feb94fb5;hb=0dcc957ae6bf24809fda82fd59c134e70058c42a;hp=f6cbab8a37b7c19bac056752d016f47092daae70;hpb=cfb9e3640e34706acdfccd26236024de259f3b4f;p=sbcl.git diff --git a/src/compiler/x86/arith.lisp b/src/compiler/x86/arith.lisp index f6cbab8..cdadbb2 100644 --- a/src/compiler/x86/arith.lisp +++ b/src/compiler/x86/arith.lisp @@ -250,6 +250,35 @@ (move r x) (inst add r y))))) + +;;;; Special logand cases: (logand signed unsigned) => unsigned + +(define-vop (fast-logand/signed-unsigned=>unsigned + fast-logand/unsigned=>unsigned) + (:args (x :target r :scs (signed-reg) + :load-if (not (and (sc-is x signed-stack) + (sc-is y unsigned-reg) + (sc-is r unsigned-stack) + (location= x r)))) + (y :scs (unsigned-reg unsigned-stack))) + (:arg-types signed-num unsigned-num)) + +(define-vop (fast-logand-c/signed-unsigned=>unsigned + fast-logand-c/unsigned=>unsigned) + (:args (x :target r :scs (signed-reg signed-stack))) + (:arg-types signed-num (:constant (unsigned-byte 32)))) + +(define-vop (fast-logand/unsigned-signed=>unsigned + fast-logand/unsigned=>unsigned) + (:args (x :target r :scs (unsigned-reg) + :load-if (not (and (sc-is x unsigned-stack) + (sc-is y signed-reg) + (sc-is r unsigned-stack) + (location= x r)))) + (y :scs (signed-reg signed-stack))) + (:arg-types unsigned-num signed-num)) + + (define-vop (fast-+-c/signed=>signed fast-safe-arith-op) (:translate +) (:args (x :target r :scs (signed-reg signed-stack)))