0.8.19.30: less COMPILE-FILE verbosity
[sbcl.git] / src / compiler / alpha / arith.lisp
index fccb1f0..4c3d931 100644 (file)
 (define-vop (fast-signed-c-binop fast-signed-binop)
   (:args (x :target r :scs (signed-reg)))
   (:info y)
-  (:arg-types tagged-num (:constant integer)))
+  (:arg-types signed-num (:constant integer)))
 
 (define-vop (fast-unsigned-c-binop fast-unsigned-binop)
   (:args (x :target r :scs (unsigned-reg)))
   (:info y)
-  (:arg-types tagged-num (:constant integer)))
+  (:arg-types unsigned-num (:constant integer)))
 
 (defmacro define-binop (translate cost untagged-cost op 
                        tagged-type untagged-type
      ,@(when (and tagged-type (not arg-swap))
         `((define-vop (,(symbolicate "FAST-" translate "-C/FIXNUM=>FIXNUM")
                        fast-fixnum-c-binop)
+            (:args (x ,@(unless restore-fixnum-mask `(:target r)) 
+                      :scs (any-reg)))
             (:arg-types tagged-num (:constant ,tagged-type))
             ,@(when restore-fixnum-mask
                 `((:temporary (:sc non-descriptor-reg) temp)))
     (inst bne temp done)
     (move zero-tn result)
     (inst br zero-tn done)
-      
+
     POSITIVE
     (inst sll number amount result)
-      
+
     DONE))
 
 (define-vop (fast-ash/signed=>signed)
     (inst bne temp done)
     (inst sra number 63 result)
     (inst br zero-tn done)
-      
+
     POSITIVE
     (inst sll number amount result)
-      
+
     DONE))
 
 (define-vop (fast-ash-c/signed=>signed)
       ((> count 0) (inst sll number (min 63 count) result))
       (t (bug "identity ASH not transformed away")))))
 
+(macrolet ((def (name sc-type type result-type cost)
+             `(define-vop (,name)
+                (:note "inline ASH")
+                (:translate ash)
+                (:args (number :scs (,sc-type))
+                       (amount :scs (signed-reg unsigned-reg immediate)))
+                (:arg-types ,type positive-fixnum)
+                (:results (result :scs (,result-type)))
+                (:result-types ,type)
+                (:policy :fast-safe)
+                (:generator ,cost
+                   (sc-case amount
+                     ((signed-reg unsigned-reg)
+                      (inst sll number amount result))
+                     (immediate
+                      (let ((amount (tn-value amount)))
+                        (aver (> amount 0))
+                        (inst sll number amount result))))))))
+  (def fast-ash-left/fixnum=>fixnum any-reg tagged-num any-reg 2)
+  (def fast-ash-left/signed=>signed signed-reg signed-num signed-reg 3)
+  (def fast-ash-left/unsigned=>unsigned unsigned-reg unsigned-num unsigned-reg 3))
+
 (define-vop (signed-byte-64-len)
   (:translate integer-length)
   (:note "inline (signed-byte 64) integer-length")
   (:translate logcount)
   (:note "inline (unsigned-byte 64) logcount")
   (:policy :fast-safe)
+  (:args (arg :scs (unsigned-reg)))
+  (:arg-types unsigned-num)
+  (:results (res :scs (unsigned-reg)))
+  (:result-types positive-fixnum)
+  (:guard (member :cix *backend-subfeatures*))
+  (:generator 1
+    (inst ctpop zero-tn arg res)))
+
+(define-vop (unsigned-byte-64-count)
+  (:translate logcount)
+  (:note "inline (unsigned-byte 64) logcount")
+  (:policy :fast-safe)
   (:args (arg :scs (unsigned-reg) :target num))
   (:arg-types unsigned-num)
   (:results (res :scs (unsigned-reg)))
   (:temporary (:scs (non-descriptor-reg)) temp)
   (:translate *)
   (:generator 4
-    (inst sra y 2 temp)
+    (inst sra y n-fixnum-tag-bits temp)
     (inst mulq x temp r)))
 
 (define-vop (fast-*/signed=>signed fast-signed-binop)
     (inst mulq x y r)))
 \f
 ;;;; Modular functions:
-(define-modular-fun lognot-mod64 (x) lognot 64)
+(define-modular-fun lognot-mod64 (x) lognot :unsigned 64)
 (define-vop (lognot-mod64/unsigned=>unsigned)
   (:translate lognot-mod64)
   (:args (x :scs (unsigned-reg)))
 (define-vop (fast-ash-left-mod64-c/unsigned=>unsigned
             fast-ash-c/unsigned=>unsigned)
   (:translate ash-left-mod64))
+(define-vop (fast-ash-left-mod64/unsigned=>unsigned
+             fast-ash-left/unsigned=>unsigned))
+(deftransform ash-left-mod64 ((integer count)
+                             ((unsigned-byte 64) (unsigned-byte 6)))
+  (when (sb!c::constant-lvar-p count)
+    (sb!c::give-up-ir1-transform))
+  '(%primitive fast-ash-left-mod64/unsigned=>unsigned integer count))
 
 (macrolet
     ((define-modular-backend (fun &optional constantp)
              (vop (symbolicate 'fast- fun '/unsigned=>unsigned))
              (cvop (symbolicate 'fast- fun '-c/unsigned=>unsigned)))
          `(progn
-            (define-modular-fun ,mfun-name (x y) ,fun 64)
+            (define-modular-fun ,mfun-name (x y) ,fun :unsigned 64)
             (define-vop (,modvop ,vop)
               (:translate ,mfun-name))
             ,@(when constantp
       (emit-label done)
       (move res result))))
 
-(define-source-transform 32bit-logical-not (x)
-  `(logand (lognot (the (unsigned-byte 32) ,x)) #.(1- (ash 1 32))))
-
-(deftransform 32bit-logical-and ((x y))
-  '(logand x y))
-
-(define-source-transform 32bit-logical-nand (x y)
-  `(32bit-logical-not (32bit-logical-and ,x ,y)))
-
-(deftransform 32bit-logical-or ((x y))
-  '(logior x y))
-
-(define-source-transform 32bit-logical-nor (x y)
-  `(logand (lognor (the (unsigned-byte 32) ,x) (the (unsigned-byte 32) ,y))
-           #.(1- (ash 1 32))))
-
-(deftransform 32bit-logical-xor ((x y))
-  '(logxor x y))
-
-(define-source-transform 32bit-logical-eqv (x y)
-  `(logand (logeqv (the (unsigned-byte 32) ,x) (the (unsigned-byte 32) ,y))
-          #.(1- (ash 1 32))))
-
-(define-source-transform 32bit-logical-orc1 (x y)
-  `(logand (logorc1 (the (unsigned-byte 32) ,x) (the (unsigned-byte 32) ,y))
-          #.(1- (ash 1 32))))
-
-(define-source-transform 32bit-logical-orc2 (x y)
-  `(logand (logorc2 (the (unsigned-byte 32) ,x) (the (unsigned-byte 32) ,y))
-          #.(1- (ash 1 32))))
-
-(define-source-transform 32bit-logical-andc1 (x y)
-  `(logandc1 (the (unsigned-byte 32) ,x) (the (unsigned-byte 32) ,y)))
-
-(define-source-transform 32bit-logical-andc2 (x y)
-  `(logandc2 (the (unsigned-byte 32) ,x) (the (unsigned-byte 32) ,y)))
-
 (define-vop (shift-towards-someplace)
   (:policy :fast-safe)
   (:args (num :scs (unsigned-reg))
   (:results (digit :scs (unsigned-reg)))
   (:result-types unsigned-num)
   (:generator 1
-    (inst sra fixnum 2 digit)))
+    (inst sra fixnum n-fixnum-tag-bits digit)))
 
 (define-vop (bignum-floor)
   (:translate sb!bignum:%floor)