1.0.4.61: stack-alignment on CALL-OUT VOP on x86/Darwin
[sbcl.git] / src / compiler / x86 / array.lisp
index 08634b2..3926463 100644 (file)
          (:note "inline array store")
          (:translate data-vector-set)
          (:policy :fast-safe)
-         (:args (object :scs (descriptor-reg))
+         (:args (object :scs (descriptor-reg) :to (:argument 2))
                 (index :scs (unsigned-reg) :target ecx)
                 (value :scs (unsigned-reg immediate) :target result))
          (:arg-types ,type positive-fixnum positive-fixnum)
          (:result-types positive-fixnum)
          (:temporary (:sc unsigned-reg) word-index)
          (:temporary (:sc unsigned-reg) old)
-         (:temporary (:sc unsigned-reg :offset ecx-offset) ecx)
+         (:temporary (:sc unsigned-reg :offset ecx-offset :from (:argument 1)) ecx)
          (:generator 25
            (move word-index index)
            (inst shr word-index ,bit-shift)
     movzx nil unsigned-reg signed-reg)
   (define-data-vector-frobs simple-array-signed-byte-8 tagged-num
     movsx nil signed-reg)
-  (define-data-vector-frobs simple-base-string character mov
+  (define-data-vector-frobs simple-base-string character
+                            #!+sb-unicode movzx #!-sb-unicode mov
                             #!+sb-unicode nil #!-sb-unicode t character-reg))
 
 ;;; {un,}signed-byte-16
              (inst ,ref-inst value
                    (make-ea :word :base object
                             :disp (- (+ (* vector-data-offset n-word-bytes)
-                                        (* 2 (+ offset (tn-value index)))
-                                     other-pointer-lowtag)))))
+                                        (* 2 (+ offset (tn-value index))))
+                                     other-pointer-lowtag))))
             (t
              (inst ,ref-inst value
                    (make-ea :word :base object :index index :scale 2
 \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
-  (unsigned-reg) unsigned-num %set-vector-raw-bits)
+(define-full-reffer+offset raw-bits-with-offset * 0 other-pointer-lowtag (unsigned-reg)
+  unsigned-num %raw-bits-with-offset)
+(define-full-setter+offset set-raw-bits-with-offset * 0 other-pointer-lowtag (unsigned-reg)
+  unsigned-num %set-raw-bits-with-offset)
+
 \f
 ;;;; miscellaneous array VOPs