diff --git a/compiler/mips/array.lisp b/compiler/mips/array.lisp index 80bdd0814d1ef32c7fe336502b4d54936be559c8..d9021531dc9c8ea2ceb69eaa8c83efa420005937 100644 --- a/compiler/mips/array.lisp +++ b/compiler/mips/array.lisp @@ -5,7 +5,7 @@ ;;; Carnegie Mellon University, and has been placed in the public domain. ;;; (ext:file-comment - "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/mips/array.lisp,v 1.51 1999/05/29 17:46:39 dtc Exp $") + "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/mips/array.lisp,v 1.52 1999/06/17 15:18:14 dtc Exp $") ;;; ;;; ********************************************************************** ;;; @@ -480,8 +480,7 @@ (inst lwc1 real-tn lip (- (* vector-data-offset word-bytes) other-pointer-type))) (let ((imag-tn (complex-single-reg-imag-tn value))) - (inst addu lip word-bytes) - (inst lwc1 imag-tn lip (- (* vector-data-offset word-bytes) + (inst lwc1 imag-tn lip (- (* (1+ vector-data-offset) word-bytes) other-pointer-type))) (inst nop))) @@ -509,8 +508,7 @@ (inst fmove :single result-real value-real))) (let ((value-imag (complex-single-reg-imag-tn value)) (result-imag (complex-single-reg-imag-tn result))) - (inst addu lip word-bytes) - (inst swc1 value-imag lip (- (* vector-data-offset word-bytes) + (inst swc1 value-imag lip (- (* (1+ vector-data-offset) word-bytes) other-pointer-type)) (unless (location= result-imag value-imag) (inst fmove :single result-imag value-imag))))) @@ -520,22 +518,20 @@ (:translate data-vector-ref) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) + (index :scs (any-reg) :target shift)) (:arg-types simple-array-complex-double-float positive-fixnum) (:results (value :scs (complex-double-reg))) (:result-types complex-double-float) (:temporary (:scs (interior-reg)) lip) - (:generator 7 - (inst addu lip object index) - (inst addu lip index) - (inst addu lip index) - (inst addu lip index) + (:temporary (:scs (any-reg) :from (:argument 1)) shift) + (:generator 6 + (inst sll shift index 2) + (inst addu lip object shift) (let ((real-tn (complex-double-reg-real-tn value))) (ld-double real-tn lip (- (* vector-data-offset word-bytes) other-pointer-type))) (let ((imag-tn (complex-double-reg-imag-tn value))) - (inst addu lip (* 2 word-bytes)) - (ld-double imag-tn lip (- (* vector-data-offset word-bytes) + (ld-double imag-tn lip (- (* (+ vector-data-offset 2) word-bytes) other-pointer-type))) (inst nop))) @@ -544,18 +540,17 @@ (:translate data-vector-set) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) + (index :scs (any-reg) :target shift) (value :scs (complex-double-reg) :target result)) (:arg-types simple-array-complex-double-float positive-fixnum complex-double-float) (:results (result :scs (complex-double-reg))) (:result-types complex-double-float) (:temporary (:scs (interior-reg)) lip) - (:generator 20 - (inst addu lip object index) - (inst addu lip index) - (inst addu lip index) - (inst addu lip index) + (:temporary (:scs (any-reg) :from (:argument 1)) shift) + (:generator 6 + (inst sll shift index 2) + (inst addu lip object shift) (let ((value-real (complex-double-reg-real-tn value)) (result-real (complex-double-reg-real-tn result))) (str-double value-real lip (- (* vector-data-offset word-bytes) @@ -564,8 +559,7 @@ (inst fmove :double result-real value-real))) (let ((value-imag (complex-double-reg-imag-tn value)) (result-imag (complex-double-reg-imag-tn result))) - (inst addu lip (* 2 word-bytes)) - (str-double value-imag lip (- (* vector-data-offset word-bytes) + (str-double value-imag lip (- (* (+ vector-data-offset 2) word-bytes) other-pointer-type)) (unless (location= result-imag value-imag) (inst fmove :double result-imag value-imag)))))