Index: /trunk/source/compiler/ARM/arm-vinsns.lisp
===================================================================
--- /trunk/source/compiler/ARM/arm-vinsns.lisp	(revision 14471)
+++ /trunk/source/compiler/ARM/arm-vinsns.lisp	(revision 14472)
@@ -669,10 +669,7 @@
       (src :address)
       (index :s16const))
-     ((low (:u32 #.arm::imm0))
-      (high (:u32 #.arm::imm1))
-      (addr (:u32 #.arm::imm2))))       ; addr should be :address
+     ((addr :u32)))
   (add addr src (:$ index))
-  (fmrrd low high src)
-  (strd low (:@ addr (:$ 0))))
+  (fstd src (:@ addr (:$ 0))))
 
 (define-arm-vinsn (mem-set-double-float :predicatable)
@@ -681,10 +678,7 @@
       (src :address)
       (index :s32))                     
-     ((low (:u32 #.arm::imm0))
-      (high (:u32 #.arm::imm1))
-      (addr (:u32 #.arm::imm2))))       ; addr should be :address
+     ((addr :u32)))
   (add addr src index)
-  (fmrrd low high src)
-  (strd low (:@ addr (:$ 0))))
+  (fstd src (:@ addr (:$ 0))))
 
 (define-arm-vinsn (mem-ref-c-single-float :predicatable)
@@ -710,5 +704,5 @@
       (index :s16const))
      ((temp :u32)))
-  (fmrs temp src)
+  (fmrs temp val)
   (str temp (:@ src (:$ index))))
 
@@ -719,6 +713,6 @@
       (index :s32))
      ((temp :u32)))
-  (fmrs temp src)
-  (str temp (:@ src (:$ index))))
+  (fmrs temp val)
+  (str temp (:@ src  index)))
 
 
@@ -2211,6 +2205,6 @@
      ((val :s8)) 
      ())
-  (mov result (:lsr val (:$ 24)))
-  (mov result (:asr val (:$ (- 24 arm::fixnumshift)))))
+  (mov result (:lsl val (:$ 24)))
+  (mov result (:asr result (:$ (- 24 arm::fixnumshift)))))
 
 
@@ -2357,11 +2351,9 @@
   (strd low (:@ dest (:$ arm::double-float.value))))
 
-(define-arm-vinsn (get-double :predicatable)
+(define-arm-vinsn (get-double :predicatable :sets-lr)
     (((target :double-float))
-     ((source :lisp))
-     ((low (:u32 #.arm::imm0))
-      (high (:u32 #.arm::imm1))))
-  (ldrd low (:@ source (:$ arm::double-float.value)))
-  (fmdrr target low high))
+     ((source :lisp)))
+  (add lr source (:$ arm::double-float.pad))
+  (fldd target (:@ lr (:$ (- arm::double-float.value arm::double-float.pad)))))
 
 ;;; Extract a double-float value, typechecking in the process.
@@ -2369,15 +2361,15 @@
 ;;; instead of replicating it ..
 
-(define-arm-vinsn get-double? (((target :double-float))
-                               ((source :lisp))
-                               ((low (:u32 #.arm::imm0))
-                                (high (:u32 #.arm::imm1))))
-  (and low source (:$ arm::tagmask))
-  (cmp low (:$ arm::tag-misc))
-  (ldrbeq low (:@ source (:$ arm::misc-subtag-offset)))
-  (cmp imm0 (:$ arm::subtag-double-float))
+(define-arm-vinsn (get-double? :sets-lr)
+    (((target :double-float))
+     ((source :lisp))
+     ((tag :u8)))
+  (and tag source (:$ arm::tagmask))
+  (cmp tag (:$ arm::tag-misc))
+  (ldrbeq tag (:@ source (:$ arm::misc-subtag-offset)))
+  (cmp tag (:$ arm::subtag-double-float))
   (uuo-error-reg-not-xtype (:? ne) source (:$ arm::subtag-double-float))
-  (ldrd imm0 (:@ source (:$ arm::double-float.value)))
-  (fmdrr target imm0 imm1))
+  (add lr source (:$ arm::double-float.pad))
+  (fldd target (:@ lr (:$ (- arm::double-float.value arm::double-float.pad)))))
   
 
Index: /trunk/source/compiler/vinsn.lisp
===================================================================
--- /trunk/source/compiler/vinsn.lisp	(revision 14471)
+++ /trunk/source/compiler/vinsn.lisp	(revision 14472)
@@ -265,4 +265,5 @@
     :sp
     :predicatable                       ; all instructions can be predicated, no instructions set or test condition codes.
+    :sets-lr                            ; uses the link register, if there is one.
     ))
 
Index: /trunk/source/lib/ffi-linuxarm.lisp
===================================================================
--- /trunk/source/lib/ffi-linuxarm.lisp	(revision 14471)
+++ /trunk/source/lib/ffi-linuxarm.lisp	(revision 14472)
@@ -148,5 +148,5 @@
                                       (cond ((<= bits 8)
                                              (if signed
-                                               '%get-signed-byte '
+                                               '%get-signed-byte
                                                '%get-unsigned-byte))
                                             ((<= bits 16)
Index: /trunk/source/lisp-kernel/arm-gc.c
===================================================================
--- /trunk/source/lisp-kernel/arm-gc.c	(revision 14471)
+++ /trunk/source/lisp-kernel/arm-gc.c	(revision 14472)
@@ -1006,4 +1006,5 @@
 {
   natural *regs = (natural *) xpGPRvector(xp);
+  LispObj lr_value;
 
   int r;
@@ -1025,7 +1026,10 @@
 
   mark_pc_root(ptr_to_lispobj(xpPC(xp)));
-  mark_pc_root(ptr_to_lispobj(xpLR(xp)));
-
-
+  lr_value = ptr_to_lispobj(xpLR(xp));
+  if (*((LispObj *)lr_value) == 0) { /* pointing into a double-float */
+    mark_root(untag(lr_value)+fulltag_misc);
+  } else {
+    mark_pc_root(lr_value);
+  }
 }
 
Index: /trunk/source/lisp-kernel/linuxarm/Makefile
===================================================================
--- /trunk/source/lisp-kernel/linuxarm/Makefile	(revision 14471)
+++ /trunk/source/lisp-kernel/linuxarm/Makefile	(revision 14472)
@@ -22,5 +22,5 @@
 AS = as
 M4 = m4
-ASFLAGS = -mfpu=vfpv2
+ASFLAGS = -mfpu=vfp
 M4FLAGS = -DLINUX -DARM
 CDEFINES = -DLINUX -DARM -D_REENTRANT -D_GNU_SOURCE -DUSE_FUTEX -DSVN_REVISION=$(SVN_REVISION)
