1.0.28.52: fix x86-64 build, oops
[sbcl.git] / src / compiler / x86-64 / array.lisp
index 2c6530c..bf50ef8 100644 (file)
   (:vop-var vop)
   (:save-p :compute-only)
   (:generator 5
-    (let ((error (generate-error-code vop invalid-array-index-error
+    (let ((error (generate-error-code vop 'invalid-array-index-error
                                       array bound index))
           (index (if (sc-is index immediate)
                    (fixnumize (tn-value index))
   (def-full-data-vector-frobs simple-array-unsigned-byte-63 unsigned-num
     unsigned-reg))
 
-(define-full-compare-and-swap simple-vector-compare-and-swap
-    simple-vector vector-data-offset other-pointer-lowtag
-    (descriptor-reg any-reg) *
-    %simple-vector-compare-and-swap)
+(define-full-compare-and-swap %compare-and-swap-svref simple-vector
+  vector-data-offset other-pointer-lowtag
+  (descriptor-reg any-reg) *
+  %compare-and-swap-svref)
 \f
 ;;;; integer vectors whose elements are smaller than a byte, i.e.,
 ;;;; bit, 2-bit, and 4-bit vectors
              (let* ((elements-per-word (floor n-word-bits bits))
                     (bit-shift (1- (integer-length elements-per-word))))
     `(progn
-       (define-vop (,(symbolicate 'data-vector-ref/ type))
+       (define-vop (,(symbolicate 'data-vector-ref-with-offset/ type))
          (:note "inline array access")
-         (:translate data-vector-ref)
+         (:translate data-vector-ref-with-offset)
          (:policy :fast-safe)
          (:args (object :scs (descriptor-reg))
                 (index :scs (unsigned-reg)))
-         (:arg-types ,type positive-fixnum)
+         (:info offset)
+         (:arg-types ,type positive-fixnum (:constant (integer 0 0)))
          (:results (result :scs (unsigned-reg) :from (:argument 0)))
          (:result-types positive-fixnum)
          (:temporary (:sc unsigned-reg :offset ecx-offset) ecx)
          (:generator 20
+           (aver (zerop offset))
            (move ecx index)
            (inst shr ecx ,bit-shift)
            (inst mov result
                  (inst shl ecx ,(1- (integer-length bits)))))
            (inst shr result :cl)
            (inst and result ,(1- (ash 1 bits)))))
-       (define-vop (,(symbolicate 'data-vector-ref-c/ type))
-         (:translate data-vector-ref)
+       (define-vop (,(symbolicate 'data-vector-ref-c-with-offset/ type))
+         (:translate data-vector-ref-with-offset)
          (:policy :fast-safe)
          (:args (object :scs (descriptor-reg)))
-         (:arg-types ,type (:constant low-index))
-         (:info index)
+         (:arg-types ,type (:constant low-index) (:constant (integer 0 0)))
+         (:info index offset)
          (:results (result :scs (unsigned-reg)))
          (:result-types positive-fixnum)
          (:generator 15
+           (aver (zerop offset))
            (multiple-value-bind (word extra) (floor index ,elements-per-word)
              (loadw result object (+ word vector-data-offset)
                     other-pointer-lowtag)
                (inst shr result (* extra ,bits)))
              (unless (= extra ,(1- elements-per-word))
                (inst and result ,(1- (ash 1 bits)))))))
-       (define-vop (,(symbolicate 'data-vector-set/ type))
+       (define-vop (,(symbolicate 'data-vector-set-with-offset/ type))
          (:note "inline array store")
-         (:translate data-vector-set)
+         (:translate data-vector-set-with-offset)
          (:policy :fast-safe)
          (:args (object :scs (descriptor-reg))
                 (index :scs (unsigned-reg) :target ecx)
                 (value :scs (unsigned-reg immediate) :target result))
-         (:arg-types ,type positive-fixnum positive-fixnum)
+         (:info offset)
+         (:arg-types ,type positive-fixnum (:constant (integer 0 0))
+                     positive-fixnum)
          (:results (result :scs (unsigned-reg)))
          (:result-types positive-fixnum)
          (:temporary (:sc unsigned-reg) word-index)
          (:temporary (:sc unsigned-reg) old)
          (:temporary (:sc unsigned-reg :offset ecx-offset) ecx)
          (:generator 25
+           (aver (zerop offset))
            (move word-index index)
            (inst shr word-index ,bit-shift)
            (inst mov old
               (inst mov result (tn-value value)))
              (unsigned-reg
               (move result value)))))
-       (define-vop (,(symbolicate 'data-vector-set-c/ type))
-         (:translate data-vector-set)
+       (define-vop (,(symbolicate 'data-vector-set-c-with-offset/ type))
+         (:translate data-vector-set-with-offset)
          (:policy :fast-safe)
          (:args (object :scs (descriptor-reg))
                 (value :scs (unsigned-reg immediate) :target result))
-         (:arg-types ,type (:constant low-index) positive-fixnum)
+         (:arg-types ,type (:constant low-index)
+                     (:constant (integer 0 0)) positive-fixnum)
          (:temporary (:sc unsigned-reg) mask-tn)
-         (:info index)
+         (:info index offset)
          (:results (result :scs (unsigned-reg)))
          (:result-types positive-fixnum)
          (:temporary (:sc unsigned-reg :to (:result 0)) old)
          (:generator 20
+           (aver (zerop offset))
            (multiple-value-bind (word extra) (floor index ,elements-per-word)
              (inst mov old
                    (make-ea :qword :base object
                             complex-offset)
                          other-pointer-lowtag))))))
 
-(define-vop (data-vector-ref/simple-array-single-float)
+(define-vop (data-vector-ref-with-offset/simple-array-single-float)
   (:note "inline array access")
   (:translate data-vector-ref-with-offset)
   (:policy :fast-safe)
    (inst shr dword-index 1)
    (inst movss value (make-ea-for-float-ref object dword-index offset 4))))
 
-(define-vop (data-vector-ref-c/simple-array-single-float)
+(define-vop (data-vector-ref-c-with-offset/simple-array-single-float)
   (:note "inline array access")
   (:translate data-vector-ref-with-offset)
   (:policy :fast-safe)
   (:generator 4
    (inst movss value (make-ea-for-float-ref object index offset 4))))
 
-(define-vop (data-vector-set/simple-array-single-float)
+(define-vop (data-vector-set-with-offset/simple-array-single-float)
   (:note "inline array store")
   (:translate data-vector-set-with-offset)
   (:policy :fast-safe)
   (:generator 5
    (move dword-index index)
    (inst shr dword-index 1)
-   (inst movss (make-ea-for-float-ref object index offset 4) value)
+   (inst movss (make-ea-for-float-ref object dword-index offset 4) value)
    (unless (location= result value)
      (inst movss result value))))
 
-(define-vop (data-vector-set-c/simple-array-single-float)
+(define-vop (data-vector-set-c-with-offset/simple-array-single-float)
   (:note "inline array store")
   (:translate data-vector-set-with-offset)
   (:policy :fast-safe)
    (unless (location= result value)
      (inst movss result value))))
 
-(define-vop (data-vector-ref/simple-array-double-float)
+(define-vop (data-vector-ref-with-offset/simple-array-double-float)
   (:note "inline array access")
   (:translate data-vector-ref-with-offset)
   (:policy :fast-safe)
   (:generator 6
    (inst movsd value (make-ea-for-float-ref object index offset 8))))
 
-(define-vop (data-vector-set/simple-array-double-float)
+(define-vop (data-vector-set-with-offset/simple-array-double-float)
   (:note "inline array store")
   (:translate data-vector-set-with-offset)
   (:policy :fast-safe)
    (unless (location= result value)
      (inst movsd result value))))
 
-(define-vop (data-vector-set-c/simple-array-double-float)
+(define-vop (data-vector-set-c-with-offset/simple-array-double-float)
   (:note "inline array store")
   (:translate data-vector-set-with-offset)
   (:policy :fast-safe)
 
 ;;; complex float variants
 
-(define-vop (data-vector-ref/simple-array-complex-single-float)
+(define-vop (data-vector-ref-with-offset/simple-array-complex-single-float)
   (:note "inline array access")
   (:translate data-vector-ref-with-offset)
   (:policy :fast-safe)
       (inst movss imag-tn (make-ea-for-float-ref object index offset 8
                                                  :complex-offset 4)))))
 
-(define-vop (data-vector-ref-c/simple-array-complex-single-float)
+(define-vop (data-vector-ref-c-with-offset/simple-array-complex-single-float)
   (:note "inline array access")
   (:translate data-vector-ref-with-offset)
   (:policy :fast-safe)
       (inst movss imag-tn (make-ea-for-float-ref object index offset 8
                                                  :complex-offset 4)))))
 
-(define-vop (data-vector-set/simple-array-complex-single-float)
+(define-vop (data-vector-set-with-offset/simple-array-complex-single-float)
   (:note "inline array store")
   (:translate data-vector-set-with-offset)
   (:policy :fast-safe)
       (unless (location= value-imag result-imag)
         (inst movss result-imag value-imag)))))
 
-(define-vop (data-vector-set-c/simple-array-complex-single-float)
+(define-vop (data-vector-set-c-with-offset/simple-array-complex-single-float)
   (:note "inline array store")
   (:translate data-vector-set-with-offset)
   (:policy :fast-safe)
       (unless (location= value-imag result-imag)
         (inst movss result-imag value-imag)))))
 
-(define-vop (data-vector-ref/simple-array-complex-double-float)
+(define-vop (data-vector-ref-with-offset/simple-array-complex-double-float)
   (:note "inline array access")
   (:translate data-vector-ref-with-offset)
   (:policy :fast-safe)
       (inst movsd imag-tn (make-ea-for-float-ref object index offset 16 :scale 2
                                                  :complex-offset 8)))))
 
-(define-vop (data-vector-ref-c/simple-array-complex-double-float)
+(define-vop (data-vector-ref-c-with-offset/simple-array-complex-double-float)
   (:note "inline array access")
   (:translate data-vector-ref-with-offset)
   (:policy :fast-safe)
       (inst movsd imag-tn (make-ea-for-float-ref object index offset 16 :scale 2
                                                  :complex-offset 8)))))
 
-(define-vop (data-vector-set/simple-array-complex-double-float)
+(define-vop (data-vector-set-with-offset/simple-array-complex-double-float)
   (:note "inline array store")
   (:translate data-vector-set-with-offset)
   (:policy :fast-safe)
       (unless (location= value-imag result-imag)
         (inst movsd result-imag value-imag)))))
 
-(define-vop (data-vector-set-c/simple-array-complex-double-float)
+(define-vop (data-vector-set-c-with-offset/simple-array-complex-double-float)
   (:note "inline array store")
   (:translate data-vector-set-with-offset)
   (:policy :fast-safe)
 (macrolet ((define-data-vector-frobs (ptype mov-inst type
                                             8-bit-tns-p &rest scs)
   `(progn
-    (define-vop (,(symbolicate "DATA-VECTOR-REF/" ptype))
+    (define-vop (,(symbolicate "DATA-VECTOR-REF-WITH-OFFSET/" ptype))
       (:translate data-vector-ref-with-offset)
       (:policy :fast-safe)
       (:args (object :scs (descriptor-reg))
                        :disp (- (+ (* vector-data-offset n-word-bytes)
                                    offset)
                                 other-pointer-lowtag)))))
-    (define-vop (,(symbolicate "DATA-VECTOR-REF-C/" ptype))
+    (define-vop (,(symbolicate "DATA-VECTOR-REF-C-WITH-OFFSET/" ptype))
       (:translate data-vector-ref-with-offset)
       (:policy :fast-safe)
       (:args (object :scs (descriptor-reg)))
                        :disp (- (+ (* vector-data-offset n-word-bytes)
                                    index offset)
                                 other-pointer-lowtag)))))
-    (define-vop (,(symbolicate "DATA-VECTOR-SET/" ptype))
+    (define-vop (,(symbolicate "DATA-VECTOR-SET-WITH-OFFSET/" ptype))
       (:translate data-vector-set-with-offset)
       (:policy :fast-safe)
       (:args (object :scs (descriptor-reg) :to (:eval 0))
              (index :scs (unsigned-reg) :to (:eval 0))
-             (value :scs ,scs :target rax))
+             (value :scs ,scs ,@(unless 8-bit-tns-p '(:target rax))))
       (:info offset)
       (:arg-types ,ptype positive-fixnum
                   (:constant (constant-displacement other-pointer-lowtag
                                     other-pointer-lowtag))
               ,(if 8-bit-tns-p 'value 'al-tn))
         (move result ,(if 8-bit-tns-p 'value 'rax))))
-    (define-vop (,(symbolicate "DATA-VECTOR-SET-C/" ptype))
+    (define-vop (,(symbolicate "DATA-VECTOR-SET-C-WITH-OFFSET/" ptype))
       (:translate data-vector-set-with-offset)
       (:policy :fast-safe)
       (:args (object :scs (descriptor-reg) :to (:eval 0))
-             (value :scs ,scs :target rax))
+             (value :scs ,scs ,@(unless 8-bit-tns-p '(:target rax))))
       (:info index offset)
       (:arg-types ,ptype (:constant low-index)
                   (:constant (constant-displacement other-pointer-lowtag
 ;;; unsigned-byte-16
 (macrolet ((define-data-vector-frobs (ptype mov-inst type &rest scs)
     `(progn
-      (define-vop (,(symbolicate "DATA-VECTOR-REF/" ptype))
+      (define-vop (,(symbolicate "DATA-VECTOR-REF-WITH-OFFSET/" ptype))
         (:translate data-vector-ref-with-offset)
         (:policy :fast-safe)
         (:args (object :scs (descriptor-reg))
                          :disp (- (+ (* vector-data-offset n-word-bytes)
                                      (* offset 2))
                                   other-pointer-lowtag)))))
-      (define-vop (,(symbolicate "DATA-VECTOR-REF-C/" ptype))
+      (define-vop (,(symbolicate "DATA-VECTOR-REF-C-WITH-OFFSET/" ptype))
         (:translate data-vector-ref-with-offset)
         (:policy :fast-safe)
         (:args (object :scs (descriptor-reg)))
                                      (* 2 index)
                                      (* 2 offset))
                                   other-pointer-lowtag)))))
-      (define-vop (,(symbolicate "DATA-VECTOR-SET/" ptype))
+      (define-vop (,(symbolicate "DATA-VECTOR-SET-WITH-OFFSET/" ptype))
         (:translate data-vector-set-with-offset)
         (:policy :fast-safe)
         (:args (object :scs (descriptor-reg) :to (:eval 0))
                 ax-tn)
           (move result eax)))
 
-      (define-vop (,(symbolicate "DATA-VECTOR-SET-C/" ptype))
+      (define-vop (,(symbolicate "DATA-VECTOR-SET-C-WITH-OFFSET/" ptype))
         (:translate data-vector-set-with-offset)
         (:policy :fast-safe)
         (:args (object :scs (descriptor-reg) :to (:eval 0))
 
 (macrolet ((define-data-vector-frobs (ptype mov-inst type &rest scs)
     `(progn
-      (define-vop (,(symbolicate "DATA-VECTOR-REF/" ptype))
+      (define-vop (,(symbolicate "DATA-VECTOR-REF-WITH-OFFSET/" ptype))
         (:translate data-vector-ref-with-offset)
         (:policy :fast-safe)
         (:args (object :scs (descriptor-reg))
                          :disp (- (+ (* vector-data-offset n-word-bytes)
                                      (* offset 4))
                                   other-pointer-lowtag)))))
-      (define-vop (,(symbolicate "DATA-VECTOR-REF-C/" ptype))
+      (define-vop (,(symbolicate "DATA-VECTOR-REF-C-WITH-OFFSET/" ptype))
         (:translate data-vector-ref-with-offset)
         (:policy :fast-safe)
         (:args (object :scs (descriptor-reg)))
                                      (* 4 index)
                                      (* 4 offset))
                                   other-pointer-lowtag)))))
-      (define-vop (,(symbolicate "DATA-VECTOR-SET/" ptype))
+      (define-vop (,(symbolicate "DATA-VECTOR-SET-WITH-OFFSET/" ptype))
         (:translate data-vector-set-with-offset)
         (:policy :fast-safe)
         (:args (object :scs (descriptor-reg) :to (:eval 0))
                 eax-tn)
           (move result rax)))
 
-      (define-vop (,(symbolicate "DATA-VECTOR-SET-C/" ptype))
+      (define-vop (,(symbolicate "DATA-VECTOR-SET-C-WITH-OFFSET/" ptype))
         (:translate data-vector-set-with-offset)
         (:policy :fast-safe)
         (:args (object :scs (descriptor-reg) :to (:eval 0))
     unsigned-reg signed-reg)
   (define-data-vector-frobs simple-array-signed-byte-32 movsxd tagged-num
     signed-reg)
+  #!+sb-unicode
   (define-data-vector-frobs simple-character-string movzxd character
     character-reg))
 
 \f
 ;;; These vops are useful for accessing the bits of a vector
 ;;; irrespective of what type of vector it is.
-(define-full-reffer raw-bits * 0 other-pointer-lowtag (unsigned-reg)
-  unsigned-num %raw-bits)
-(define-full-setter set-raw-bits * 0 other-pointer-lowtag (unsigned-reg)
-  unsigned-num %set-raw-bits)
 (define-full-reffer vector-raw-bits * vector-data-offset other-pointer-lowtag
   (unsigned-reg) unsigned-num %vector-raw-bits)
 (define-full-setter set-vector-raw-bits * vector-data-offset other-pointer-lowtag