[Openmcl-cvs-notifications] r14771 - /trunk/source/compiler/ARM/arm-vinsns.lisp

gb at clozure.com gb at clozure.com
Mon May 2 13:35:22 CDT 2011


Author: gb
Date: Mon May  2 13:35:21 2011
New Revision: 14771

Log:
Use the LR to point into double-float vectors when getting/setting
constant-indexed elements.  (Floating-point loads/stores can only
use indices that're a multiple of 4 bytes.)

Modified:
    trunk/source/compiler/ARM/arm-vinsns.lisp

Modified: trunk/source/compiler/ARM/arm-vinsns.lisp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/compiler/ARM/arm-vinsns.lisp (original)
+++ trunk/source/compiler/ARM/arm-vinsns.lisp Mon May  2 13:35:21 2011
@@ -169,23 +169,21 @@
   (fmdrr dest low high))
 =

 =

-(define-arm-vinsn (misc-ref-c-double-float :predicatable)
+
+
+(define-arm-vinsn (misc-ref-c-double-float :predicatable :sets-lr)
     (((dest :double-float))
      ((v :lisp)
-      (idx :u32const))
-     ((low (:u32 #.arm::imm0))
-      (high (:u32 #.arm::imm1))))
-  (ldrd low (:@ v (:$ (:apply + arm::misc-dfloat-offset (:apply ash idx 3)=
))))
-  (fmdrr dest low high))
+      (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)
     (((val :double-float))
      ((v :lisp)
-      (idx :u32const))
-     ((low (:u32 #.arm::imm0))
-      (high (:u32 #.arm::imm1))))
-  (fmrrd low high val)
-  (strd low (:@ v (:$ (:apply + arm::misc-dfloat-offset (:apply ash idx 3)=
)))))
+      (idx :u32const)))
+  (add lr v (:$ arm::double-float.pad))
+  (fstd val (:@ lr (:$ (:apply + (:apply ash idx 3) (- arm::double-float.v=
alue arm::double-float.pad))))))
 =

 (define-arm-vinsn (misc-set-double-float :predicatable)
     (()
@@ -2405,8 +2403,8 @@
   (str header-temp (:@ allocptr (:$ arm::misc-header-offset)))
   (mov result allocptr)
   (bic allocptr allocptr (:$ arm::fulltagmask))
-  (fmrrd header-temp high fpreg)
-  (strd header-temp (:@ result (:$ arm::double-float.value))))
+  (add lr result (:$ arm::double-float.pad))
+  (fstd fpreg (:@ lr (:$ (- arm::double-float.value arm::double-float.pad)=
))))
 =

 =

 ;;; This is about as bad as heap-consing a double-float.  (In terms of



More information about the Openmcl-cvs-notifications mailing list