X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fgeneric%2Fvm-tran.lisp;h=8b24413c345a1a68a3136d18db40cbb8d2e40986;hb=0c7ffa8fb85a94482814835c9f28abfd0400ab99;hp=64f5fb107bf82ae143d7b1237e393f5750d0c74b;hpb=4ad052044a22f502d9dc6faf6dfe01f3bab84262;p=sbcl.git diff --git a/src/compiler/generic/vm-tran.lisp b/src/compiler/generic/vm-tran.lisp index 64f5fb1..8b24413 100644 --- a/src/compiler/generic/vm-tran.lisp +++ b/src/compiler/generic/vm-tran.lisp @@ -179,24 +179,30 @@ (frob (simple-array (unsigned-byte 2) (*)) 2) (frob (simple-array (unsigned-byte 4) (*)) 4)) -;;;; bit vector hackery +;;;; BIT-VECTOR hackery -;;; SIMPLE-BIT-VECTOR bit-array operations are transformed to a word loop that -;;; does 32 bits at a time. +;;; SIMPLE-BIT-VECTOR bit-array operations are transformed to a word +;;; loop that does 32 bits at a time. ;;; -;;; FIXME: This is a lot of repeatedly macroexpanded code. It should be a -;;; function call instead. -(macrolet ((def-frob (bitfun wordfun) +;;; FIXME: This is a lot of repeatedly macroexpanded code. It should +;;; be a function call instead. +(macrolet ((def (bitfun wordfun) `(deftransform ,bitfun ((bit-array-1 bit-array-2 result-bit-array) - (simple-bit-vector simple-bit-vector simple-bit-vector) * + (simple-bit-vector + simple-bit-vector + simple-bit-vector) + * :node node :policy (>= speed space)) `(progn ,@(unless (policy node (zerop safety)) - '((unless (= (length bit-array-1) (length bit-array-2) + '((unless (= (length bit-array-1) + (length bit-array-2) (length result-bit-array)) (error "Argument and/or result bit arrays are not the same length:~ ~% ~S~% ~S ~% ~S" - bit-array-1 bit-array-2 result-bit-array)))) + bit-array-1 + bit-array-2 + result-bit-array)))) (do ((index sb!vm:vector-data-offset (1+ index)) (end (+ sb!vm:vector-data-offset (truncate (the index @@ -209,16 +215,16 @@ (setf (%raw-bits result-bit-array index) (,',wordfun (%raw-bits bit-array-1 index) (%raw-bits bit-array-2 index)))))))) - (def-frob bit-and 32bit-logical-and) - (def-frob bit-ior 32bit-logical-or) - (def-frob bit-xor 32bit-logical-xor) - (def-frob bit-eqv 32bit-logical-eqv) - (def-frob bit-nand 32bit-logical-nand) - (def-frob bit-nor 32bit-logical-nor) - (def-frob bit-andc1 32bit-logical-andc1) - (def-frob bit-andc2 32bit-logical-andc2) - (def-frob bit-orc1 32bit-logical-orc1) - (def-frob bit-orc2 32bit-logical-orc2)) + (def bit-and 32bit-logical-and) + (def bit-ior 32bit-logical-or) + (def bit-xor 32bit-logical-xor) + (def bit-eqv 32bit-logical-eqv) + (def bit-nand 32bit-logical-nand) + (def bit-nor 32bit-logical-nor) + (def bit-andc1 32bit-logical-andc1) + (def bit-andc2 32bit-logical-andc2) + (def bit-orc1 32bit-logical-orc1) + (def bit-orc2 32bit-logical-orc2)) (deftransform bit-not ((bit-array result-bit-array)