Index: /trunk/source/compiler/ARM/arm-vinsns.lisp
===================================================================
--- /trunk/source/compiler/ARM/arm-vinsns.lisp	(revision 14938)
+++ /trunk/source/compiler/ARM/arm-vinsns.lisp	(revision 14939)
@@ -144,28 +144,29 @@
 
                               
-(define-arm-vinsn (misc-ref-single-float :predicatable)
+(define-arm-vinsn (misc-ref-single-float :predicatable :sets-lr)
     (((dest :single-float))
      ((v :lisp)
-      (scaled-idx :u32))
-     ((temp :u32)))
-  (ldr temp (:@ v scaled-idx))
-  (fmsr dest temp))
-
-(define-arm-vinsn (misc-ref-c-single-float :predicatable)
+      (scaled-idx :u32)))
+  (add lr v scaled-idx)
+  (flds dest (:@ lr (:$ 0)))
+  (mov lr (:$ 0)))
+
+(define-arm-vinsn (misc-ref-c-single-float :predicatable :sets-lr)
     (((dest :single-float))
      ((v :lisp)
       (idx :u32const))
-     ((temp :u32)))
-  (ldr temp (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2)))))
-  (fmsr dest temp))
-
-(define-arm-vinsn (misc-ref-double-float :predicatable)
+     ())
+  (add lr v (:$ arm::misc-data-offset))
+  (flds dest (:@ lr (:$ (:apply ash idx 2))))
+  (mov lr (:$ 0)))
+
+(define-arm-vinsn (misc-ref-double-float :predicatable :sets-lr)
     (((dest :double-float))
      ((v :lisp)
-      (scaled-idx :u32))
-     ((low (:u32 #.arm::imm0))
-      (high (:u32 #.arm::imm1))))
-  (ldrd low (:@ v scaled-idx))
-  (fmdrr dest low high))
+      (unscaled-idx :imm)))
+  (add arm::lr v (:$ arm::misc-dfloat-offset))
+  (add arm::lr arm::lr (:lsl unscaled-idx (:$ 1)))
+  (fldd dest (:@ arm::lr (:$ 0)))
+  (mov lr (:$ 0)))
 
 
@@ -176,23 +177,25 @@
      ((v :lisp)
       (idx :u32const)))
-  (add lr v (:$ arm::double-float.pad))
-  (fldd dest (:@ lr (:$ (:apply + (:apply ash idx 3) (- arm::double-float.value arm::double-float.pad))))))
-
-(define-arm-vinsn (misc-set-c-double-float :predicatable)
+  (add lr v (:$ arm::double-float.value))
+  (fldd dest (:@ lr (:$ (:apply ash idx 3))))
+  (mov lr (:$ 0)))
+
+(define-arm-vinsn (misc-set-c-double-float :predicatable :sets-lr)
     (((val :double-float))
      ((v :lisp)
       (idx :u32const)))
-  (add lr v (:$ arm::double-float.pad))
-  (fstd val (:@ lr (:$ (:apply + (:apply ash idx 3) (- arm::double-float.value arm::double-float.pad))))))
-
-(define-arm-vinsn (misc-set-double-float :predicatable)
+  (add lr v (:$ arm::double-float.value))
+  (fstd val (:@ lr (:$ (:apply ash idx 3))))
+  (mov lr (:$ 0)))
+
+(define-arm-vinsn (misc-set-double-float :predicatable :sets-lr)
     (()
      ((val :double-float)
       (v :lisp)
-      (scaled-idx :u32))
-     ((low (:u32 #.arm::imm0))
-      (high (:u32 #.arm::imm1))))
-  (fmrrd low high val)
-  (strd low (:@ v scaled-idx)))
+      (unscaled-idx :imm)))             ; a fixnum
+  (add lr v (:$ arm::misc-dfloat-offset))
+  (add lr lr (:lsl unscaled-idx (:$ 1)))
+  (fstd val (:@ lr (:$ 0)))
+  (mov lr (:$ 0)))
 
 (define-arm-vinsn (misc-set-c-single-float :predicatable)
@@ -200,8 +203,9 @@
      ((val :single-float)
       (v :lisp)
-      (idx :u32const))
-     ((temp :u32)))
-  (fmrs temp val)
-  (str temp (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2))))))
+      (idx :u32const)))
+  (add lr v (:$ arm::misc-data-offset))
+  (fsts val (:@ lr (:$ (:apply ash idx 2))))
+  (mov lr (:$ 0)))
+
 
 
@@ -2428,5 +2432,5 @@
 ;;; Heap-cons a double-float to store contents of FPREG.  Hope that we don't do
 ;;; this blindly.
-(define-arm-vinsn double->heap (((result :lisp)) ; tagged as a double-float
+(define-arm-vinsn (double->heap :sets-lr) (((result :lisp)) ; tagged as a double-float
                                 ((fpreg :double-float)) 
                                 ((header-temp (:u32 #.arm::imm0))
@@ -2442,6 +2446,7 @@
   (mov result allocptr)
   (bic allocptr allocptr (:$ arm::fulltagmask))
-  (add lr result (:$ arm::double-float.pad))
-  (fstd fpreg (:@ lr (:$ (- arm::double-float.value arm::double-float.pad)))))
+  (add lr result (:$ arm::double-float.value))
+  (fstd fpreg (:@ lr (:$ 0)))
+  (mov lr (:$ 0)))
 
 
@@ -2463,4 +2468,5 @@
   (mov result allocptr)
   (bic allocptr allocptr (:$ arm::fulltagmask))
+  (add lr result (:$ arm::single-float.value))
   (fmrs header-temp fpreg)
   (str header-temp (:@ result (:$ arm::single-float.value))))
@@ -2469,18 +2475,18 @@
 
 ;;; "dest" is preallocated, presumably on a stack somewhere.
-(define-arm-vinsn (store-double :predicatable)
+(define-arm-vinsn (store-double :predicatable :sets-lr)
     (()
      ((dest :lisp)
-      (source :double-float))
-     ((low (:u32 #.arm::imm0))
-      (high (:u32 #.arm::imm1))))
-  (fmrrd low high source)
-  (strd low (:@ dest (:$ arm::double-float.value))))
+      (source :double-float)))
+  (add lr dest (:$ arm::double-float.value))
+  (fstd source (:@ lr (:$ 0)))
+  (mov lr (:$ 0)))
 
 (define-arm-vinsn (get-double :predicatable :sets-lr)
     (((target :double-float))
      ((source :lisp)))
-  (add lr source (:$ arm::double-float.pad))
-  (fldd target (:@ lr (:$ (- arm::double-float.value arm::double-float.pad)))))
+  (add lr source (:$ arm::double-float.value))
+  (fldd target (:@ lr (:$ 0)))
+  (mov lr (:$ 0)))
 
 ;;; Extract a double-float value, typechecking in the process.
Index: /trunk/source/compiler/ARM/arm2.lisp
===================================================================
--- /trunk/source/compiler/ARM/arm2.lisp	(revision 14938)
+++ /trunk/source/compiler/ARM/arm2.lisp	(revision 14939)
@@ -1582,7 +1582,8 @@
                     (with-imm-target () idx-reg
                       (if index-known-fixnum
-                        (arm2-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 3)))
-                        (! scale-64bit-misc-index idx-reg unscaled-idx))
-                      (! misc-ref-double-float fp-val src idx-reg)))
+                        (unless unscaled-idx
+                          (setq unscaled-idx idx-reg)
+                          (arm2-absolute-natural seg unscaled-idx nil (ash index-known-fixnum arm::fixnumshift))))
+                      (! misc-ref-double-float fp-val src unscaled-idx)))
                   (if (eq vreg-class hard-reg-class-fpr)
                     (<- fp-val)
@@ -2154,7 +2155,8 @@
                     (progn
                       (if index-known-fixnum
-                        (arm2-absolute-natural seg scaled-idx nil (+ (arch::target-misc-dfloat-offset arch) (ash index-known-fixnum 3)))
-                        (! scale-64bit-misc-index scaled-idx unscaled-idx))
-                      (! misc-set-double-float unboxed-val-reg src scaled-idx)))))
+                        (unless unscaled-idx
+                          (setq unscaled-idx scaled-idx)
+                          (arm2-absolute-natural seg unscaled-idx nil (ash index-known-fixnum arm::fixnumshift))))
+                      (! misc-set-double-float unboxed-val-reg src unscaled-idx)))))
                  (t
                   (with-imm-target (unboxed-val-reg) scaled-idx
Index: /trunk/source/lisp-kernel/arm-gc.c
===================================================================
--- /trunk/source/lisp-kernel/arm-gc.c	(revision 14938)
+++ /trunk/source/lisp-kernel/arm-gc.c	(revision 14939)
@@ -1056,6 +1056,4 @@
 {
   natural *regs = (natural *) xpGPRvector(xp);
-  LispObj lr_value;
-
   int r;
   /* registers between arg_z and Rfn should be tagged and marked as
@@ -1076,10 +1074,5 @@
 
   mark_pc_root(ptr_to_lispobj(xpPC(xp)));
-  lr_value = ptr_to_lispobj(xpLR(xp));
-  if (*((LispObj *)lr_value) == 0) { /* pointing into a double-float/double-float vector */
-    mark_root(untag(lr_value)+fulltag_misc);
-  } else {
-    mark_pc_root(lr_value);
-  }
+  mark_pc_root(ptr_to_lispobj(xpLR(xp)));
 }
 
