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)))))