0.8.0.78.vector-nil-string.11:
[sbcl.git] / src / compiler / x86 / arith.lisp
index a857524..865fade 100644 (file)
   (:policy :fast-safe)
   (:args (arg :scs (signed-reg) :target res))
   (:arg-types signed-num)
-  (:results (res :scs (any-reg)))
-  (:result-types positive-fixnum)
-  (:generator 30
+  (:results (res :scs (unsigned-reg)))
+  (:result-types unsigned-num)
+  (:generator 28
     (move res arg)
     (inst cmp res 0)
     (inst jmp :ge POS)
     (inst bsr res res)
     (inst jmp :z zero)
     (inst inc res)
-    (inst shl res 2)
+    (inst jmp done)
+    ZERO
+    (inst xor res res)
+    DONE))
+
+(define-vop (unsigned-byte-32-len)
+  (:translate integer-length)
+  (:note "inline (unsigned-byte 32) integer-length")
+  (:policy :fast-safe)
+  (:args (arg :scs (unsigned-reg)))
+  (:arg-types unsigned-num)
+  (:results (res :scs (unsigned-reg)))
+  (:result-types unsigned-num)
+  (:generator 26
+    (inst bsr res arg)
+    (inst jmp :z zero)
+    (inst inc res)
     (inst jmp done)
     ZERO
     (inst xor res res)
 (macrolet ((define-conditional-vop (tran cond unsigned not-cond not-unsigned)
             `(progn
                ,@(mapcar
-                  #'(lambda (suffix cost signed)
-                      `(define-vop (;; FIXME: These could be done more
-                                    ;; cleanly with SYMBOLICATE.
-                                    ,(intern (format nil "~:@(FAST-IF-~A~A~)"
-                                                     tran suffix))
-                                    ,(intern
-                                      (format nil "~:@(FAST-CONDITIONAL~A~)"
-                                              suffix)))
-                         (:translate ,tran)
-                         (:generator ,cost
-                                     (inst cmp x
-                                           ,(if (eq suffix '-c/fixnum)
-                                                '(fixnumize y)
-                                                'y))
-                                     (inst jmp (if not-p
-                                                   ,(if signed
-                                                        not-cond
-                                                        not-unsigned)
-                                                   ,(if signed
-                                                        cond
-                                                        unsigned))
-                                           target))))
+                  (lambda (suffix cost signed)
+                    `(define-vop (;; FIXME: These could be done more
+                                  ;; cleanly with SYMBOLICATE.
+                                  ,(intern (format nil "~:@(FAST-IF-~A~A~)"
+                                                   tran suffix))
+                                  ,(intern
+                                    (format nil "~:@(FAST-CONDITIONAL~A~)"
+                                            suffix)))
+                       (:translate ,tran)
+                       (:generator ,cost
+                                   (inst cmp x
+                                         ,(if (eq suffix '-c/fixnum)
+                                              '(fixnumize y)
+                                              'y))
+                                   (inst jmp (if not-p
+                                                 ,(if signed
+                                                      not-cond
+                                                      not-unsigned)
+                                                 ,(if signed
+                                                      cond
+                                                      unsigned))
+                                         target))))
                   '(/fixnum -c/fixnum /signed -c/signed /unsigned -c/unsigned)
                   '(4 3 6 5 6 5)
                   '(t t t t nil nil)))))
     (move r x)
     (inst and r y)))
 
-(def-source-transform 32bit-logical-nand (x y)
+(define-source-transform 32bit-logical-nand (x y)
   `(32bit-logical-not (32bit-logical-and ,x ,y)))
 
 (define-vop (32bit-logical-or 32bit-logical)
     (move r x)
     (inst or r y)))
 
-(def-source-transform 32bit-logical-nor (x y)
+(define-source-transform 32bit-logical-nor (x y)
   `(32bit-logical-not (32bit-logical-or ,x ,y)))
 
 (define-vop (32bit-logical-xor 32bit-logical)
     (move r x)
     (inst xor r y)))
 
-(def-source-transform 32bit-logical-eqv (x y)
+(define-source-transform 32bit-logical-eqv (x y)
   `(32bit-logical-not (32bit-logical-xor ,x ,y)))
 
-(def-source-transform 32bit-logical-orc1 (x y)
+(define-source-transform 32bit-logical-orc1 (x y)
   `(32bit-logical-or (32bit-logical-not ,x) ,y))
 
-(def-source-transform 32bit-logical-orc2 (x y)
+(define-source-transform 32bit-logical-orc2 (x y)
   `(32bit-logical-or ,x (32bit-logical-not ,y)))
 
-(def-source-transform 32bit-logical-andc1 (x y)
+(define-source-transform 32bit-logical-andc1 (x y)
   `(32bit-logical-and (32bit-logical-not ,x) ,y))
 
-(def-source-transform 32bit-logical-andc2 (x y)
+(define-source-transform 32bit-logical-andc2 (x y)
   `(32bit-logical-and ,x (32bit-logical-not ,y)))
 
 ;;; Only the lower 5 bits of the shift amount are significant.