Index: /trunk/source/compiler/ARM/arm-vinsns.lisp
===================================================================
--- /trunk/source/compiler/ARM/arm-vinsns.lisp	(revision 14786)
+++ /trunk/source/compiler/ARM/arm-vinsns.lisp	(revision 14787)
@@ -658,6 +658,6 @@
       (src :address))
      ((src :address)
-      (index :s32)))
-  (add src src index)
+      (index :lisp)))
+  (add src src (:asr index (:$ arm::fixnumshift)))
   (fldd dest (:@ src (:$ 0))))
 
@@ -683,16 +683,14 @@
     (((dest :single-float))
      ((src :address)
-      (index :s16const))
-     ((temp :u32)))
-  (ldr temp (:@ src (:$ index)))
-  (fmsr dest temp))
+      (index :s16const)))
+  (flds dest (:@ src (:$ index))))
 
 (define-arm-vinsn (mem-ref-single-float :predicatable)
-    (((dest :single-float))
+    (((dest :single-float)
+      (src :address))
      ((src :address)
-      (index :lisp))
-     ((temp :u32)))
-  (ldr temp (:@ src (:asr index (:$ arm::fixnumshift))))
-  (fmsr dest temp))
+      (index :lisp)))
+  (add src  src (:asr index (:$ arm::fixnumshift)))
+  (flds dest (:@ src (:$ 0))))
 
 (define-arm-vinsn (mem-set-c-single-float :predicatable)
Index: /trunk/source/compiler/ARM/arm2.lisp
===================================================================
--- /trunk/source/compiler/ARM/arm2.lisp	(revision 14786)
+++ /trunk/source/compiler/ARM/arm2.lisp	(revision 14787)
@@ -6773,23 +6773,24 @@
                    (! mem-ref-c-single-float fp-reg ptrreg fixoffset)))
                (with-imm-target () (ptrreg :address)
-                 (with-imm-target (ptrreg) (offsetreg :s32)
-                 (arm2-two-targeted-reg-forms seg
-                                              ptr ptrreg
-                                              offset offsetreg)
-                 (let* ((last (dll-node-pred seg)))
-                   (if (and (typep last 'vinsn)
+                 (with-node-target (ptrreg) offsetreg
+                   (multiple-value-setq (ptrreg offsetreg)
+                     (arm2-two-untargeted-reg-forms seg
+                                                    ptr ptrreg
+                                                    offset offsetreg))
+                   (let* ((last (dll-node-pred seg)))
+                     (if (and (typep last 'vinsn)
                               (eq (vinsn-template-name (vinsn-template last)) 'lri)
-                              (typep (setq fixoffset (svref (vinsn-variable-parts last) 1))
+                              (typep (setq fixoffset (ash (svref (vinsn-variable-parts last) 1) (- arm::fixnumshift)))
                                      '(signed-byte 10))
                               (not (logtest fixoffset #x3)))
-                     (progn
-                       (remove-dll-node last)
-                       (if double-p
-                         (! mem-ref-c-double-float fp-reg ptrreg fixoffset)
-                         (! mem-ref-c-single-float fp-reg ptrreg fixoffset)))
-                     (progn
-                       (if double-p
-                         (! mem-ref-double-float fp-reg ptrreg offsetreg)
-                         (! mem-ref-single-float fp-reg ptrreg offsetreg))))))))
+                       (progn
+                         (elide-vinsn last)
+                         (if double-p
+                           (! mem-ref-c-double-float fp-reg ptrreg fixoffset)
+                           (! mem-ref-c-single-float fp-reg ptrreg fixoffset)))
+                       (progn
+                         (if double-p
+                           (! mem-ref-double-float fp-reg ptrreg offsetreg)
+                           (! mem-ref-single-float fp-reg ptrreg offsetreg))))))))
              (<- fp-reg))
            (^)))))
