X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86%2Farray.lisp;h=f617419a60ec45210b95cb2f098cf3d0e074fc7f;hb=9be48f2a73ca5f4cc0848b8c0adad7127de10373;hp=d07ec98c6b67b424df702799b5843ce3b41593c6;hpb=51e63f301624e39febdd85b5feba19b7c980f307;p=sbcl.git diff --git a/src/compiler/x86/array.lisp b/src/compiler/x86/array.lisp index d07ec98..f617419 100644 --- a/src/compiler/x86/array.lisp +++ b/src/compiler/x86/array.lisp @@ -171,10 +171,7 @@ (:generator 20 (move ecx index) (inst shr ecx ,bit-shift) - (inst mov result - (make-ea :dword :base object :index ecx :scale 4 - :disp (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag))) + (inst mov result (make-ea-for-vector-data object :index ecx)) (move ecx index) ;; We used to mask ECX for all values of ELEMENT-PER-WORD, ;; but since Intel's documentation says that the chip will @@ -206,7 +203,7 @@ (: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) @@ -214,14 +211,11 @@ (: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) - (inst mov old - (make-ea :dword :base object :index word-index :scale 4 - :disp (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag))) + (inst mov old (make-ea-for-vector-data object :index word-index)) (move ecx index) ;; We used to mask ECX for all values of ELEMENT-PER-WORD, ;; but since Intel's documentation says that the chip will @@ -242,9 +236,7 @@ (unsigned-reg (inst or old value))) (inst rol old :cl) - (inst mov (make-ea :dword :base object :index word-index :scale 4 - :disp (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag)) + (inst mov (make-ea-for-vector-data object :index word-index) old) (sc-case value (immediate @@ -263,11 +255,7 @@ (:temporary (:sc unsigned-reg :to (:result 0)) old) (:generator 20 (multiple-value-bind (word extra) (floor index ,elements-per-word) - (inst mov old - (make-ea :dword :base object - :disp (- (* (+ word vector-data-offset) - n-word-bytes) - other-pointer-lowtag))) + (loadw old object (+ word vector-data-offset) other-pointer-lowtag) (sc-case value (immediate (let* ((value (tn-value value)) @@ -286,11 +274,7 @@ (inst or old value) (unless (zerop shift) (inst rol old shift))))) - (inst mov (make-ea :dword :base object - :disp (- (* (+ word vector-data-offset) - n-word-bytes) - other-pointer-lowtag)) - old) + (storew old object (+ word vector-data-offset) other-pointer-lowtag) (sc-case value (immediate (inst mov result (tn-value value))) @@ -308,9 +292,9 @@ (immediate (make-ea :dword :base object :disp (- (+ (* vector-data-offset n-word-bytes) - (* element-size (+ offset complex-offset - (tn-value index))) - other-pointer-lowtag)))) + (* element-size (+ offset (tn-value index))) + complex-offset) + other-pointer-lowtag))) (t (make-ea :dword :base object :index index :scale scale :disp (- (+ (* vector-data-offset n-word-bytes) @@ -557,7 +541,8 @@ ;;; {un,}signed-byte-8, simple-base-string -(macrolet ((define-data-vector-frobs (ptype element-type ref-inst &rest scs) +(macrolet ((define-data-vector-frobs (ptype element-type ref-inst + 8-bit-tns-p &rest scs) `(progn (define-vop (,(symbolicate "DATA-VECTOR-REF-WITH-OFFSET/" ptype)) (:translate data-vector-ref-with-offset) @@ -573,58 +558,59 @@ (:generator 5 (sc-case index (immediate - (inst ,ref-inst value - (make-ea :byte :base object - :disp (- (+ (* vector-data-offset n-word-bytes) - (tn-value index) - offset) - other-pointer-lowtag)))) + (inst ,ref-inst value (make-ea-for-vector-data + object :size :byte + :offset (+ (tn-value index) offset)))) (t (inst ,ref-inst value - (make-ea :byte :base object :index index :scale 1 - :disp (- (+ (* vector-data-offset n-word-bytes) - offset) - other-pointer-lowtag))))))) + (make-ea-for-vector-data object :size :byte + :index index :offset offset)))))) (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 immediate) :to (:eval 0)) - (value :scs ,scs :target eax)) + (value :scs ,scs ,@(unless 8-bit-tns-p + '(:target eax)))) (:info offset) (:arg-types ,ptype positive-fixnum (:constant (constant-displacement other-pointer-lowtag 1 vector-data-offset)) ,element-type) - (:temporary (:sc unsigned-reg :offset eax-offset :target result - :from (:argument 2) :to (:result 0)) - eax) + ,@(unless 8-bit-tns-p + '((:temporary (:sc unsigned-reg :offset eax-offset :target result + :from (:argument 2) :to (:result 0)) + eax))) (:results (result :scs ,scs)) (:result-types ,element-type) (:generator 5 - (move eax value) + ,@(unless 8-bit-tns-p + '((move eax value))) (sc-case index (immediate - (inst mov (make-ea :byte :base object - :disp (- (+ (* vector-data-offset n-word-bytes) - (tn-value index) - offset) - other-pointer-lowtag)) - al-tn)) + (inst mov (make-ea-for-vector-data + object :size :byte :offset (+ (tn-value index) offset)) + ,(if 8-bit-tns-p + 'value + 'al-tn))) (t - (inst mov (make-ea :byte :base object :index index :scale 1 - :disp (- (+ (* vector-data-offset n-word-bytes) - offset) - other-pointer-lowtag)) - al-tn))) - (move result eax)))))) + (inst mov (make-ea-for-vector-data object :size :byte + :index index :offset offset) + ,(if 8-bit-tns-p + 'value + 'al-tn)))) + (move result ,(if 8-bit-tns-p + 'value + 'eax))))))) (define-data-vector-frobs simple-array-unsigned-byte-7 positive-fixnum - movzx unsigned-reg signed-reg) + movzx nil unsigned-reg signed-reg) (define-data-vector-frobs simple-array-unsigned-byte-8 positive-fixnum - movzx unsigned-reg signed-reg) + movzx nil unsigned-reg signed-reg) (define-data-vector-frobs simple-array-signed-byte-8 tagged-num - movsx signed-reg) - (define-data-vector-frobs simple-base-string character movzx character-reg)) + movsx nil signed-reg) + (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 (macrolet ((define-data-vector-frobs (ptype element-type ref-inst &rest scs) @@ -644,16 +630,12 @@ (sc-case index (immediate (inst ,ref-inst value - (make-ea :word :base object - :disp (- (+ (* vector-data-offset n-word-bytes) - (* 2 (+ offset (tn-value index))) - other-pointer-lowtag))))) + (make-ea-for-vector-data object :size :word + :offset (+ (tn-value index) offset)))) (t (inst ,ref-inst value - (make-ea :word :base object :index index :scale 2 - :disp (- (+ (* vector-data-offset n-word-bytes) - (* 2 offset)) - other-pointer-lowtag))))))) + (make-ea-for-vector-data object :size :word + :index index :offset offset)))))) (define-vop (,(symbolicate "DATA-VECTOR-SET-WITH-OFFSET/" ptype)) (:translate data-vector-set-with-offset) (:policy :fast-safe) @@ -674,16 +656,12 @@ (move eax value) (sc-case index (immediate - (inst mov (make-ea :word :base object - :disp (- (+ (* vector-data-offset n-word-bytes) - (* 2 (+ offset (tn-value index)))) - other-pointer-lowtag)) + (inst mov (make-ea-for-vector-data + object :size :word :offset (+ (tn-value index) offset)) ax-tn)) (t - (inst mov (make-ea :word :base object :index index :scale 2 - :disp (- (+ (* vector-data-offset n-word-bytes) - (* 2 offset)) - other-pointer-lowtag)) + (inst mov (make-ea-for-vector-data object :size :word + :index index :offset offset) ax-tn))) (move result eax)))))) (define-data-vector-frobs simple-array-unsigned-byte-15 positive-fixnum @@ -696,14 +674,11 @@ ;;; 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) + ;;;; miscellaneous array VOPs