[Openmcl-cvs-notifications] r12241 - /trunk/source/level-0/X86/x86-def.lisp

gb at clozure.com gb at clozure.com
Wed Jun 10 04:53:13 EDT 2009


Author: gb
Date: Wed Jun 10 04:53:13 2009
New Revision: 12241

Log:
Handle :REGISTERS pseudo-arg in x8664 %FF-CALL.

Modified:
    trunk/source/level-0/X86/x86-def.lisp

Modified: trunk/source/level-0/X86/x86-def.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/level-0/X86/x86-def.lisp (original)
+++ trunk/source/level-0/X86/x86-def.lisp Wed Jun 10 04:53:13 2009
@@ -587,12 +587,38 @@
   (movl ($ nil) (%l arg_z))
   (restore-simple-frame)
   (single-value-return))
+
+(defx86lapfunction %do-ff-call-return-registers ((fp-regs 8)(nfp 0) (frame=
 arg_x) (regbuf arg_y) (entry arg_z))
+  (popq (% ra0))
+  (popq (% rax))
+  (popq (% temp0))
+  (movq (% rbp) (@  (% rsp)))
+  (movq (% rsp) (% rbp))
+  (movq (% ra0) (@ 8 (% rbp)))
+  (macptr-ptr temp0 temp0)
+  (sarq ($ x8664::fixnumshift) (% rax))
+  (movq (@ (% temp0)) (% fp0))
+  (movq (@ 8 (% temp0)) (% fp1))
+  (movq (@ 16 (% temp0)) (% fp2))
+  (movq (@ 24 (% temp0)) (% fp3))
+  (movq (@ 32 (% temp0)) (% fp4))
+  (movq (@ 40 (% temp0)) (% fp5))
+  (movq (@ 48 (% temp0)) (% fp6))
+  (movq (@ 56 (% temp0)) (% fp7))
+  (call-subprim .SPffcall-return-registers)
+  (movq (:rcontext x8664::tcr.foreign-sp) (% mm5))
+  (movq (% mm5) (@ (% frame)))
+  (movq (% frame) (:rcontext x8664::tcr.foreign-sp))
+  (movl ($ nil) (%l arg_z))
+  (restore-simple-frame)
+  (single-value-return))
   =

 =

 (defun %ff-call (entry &rest specs-and-vals)
   (declare (dynamic-extent specs-and-vals))
   (let* ((len (length specs-and-vals))
-         (total-words 0))
+         (total-words 0)
+         (regbuf nil))
     (declare (fixnum len total-words))
     (let* ((result-spec (or (car (last specs-and-vals)) :void))
            (nargs (ash (the fixnum (1- len)) -1))
@@ -617,6 +643,7 @@
                         :signed-halfword :unsigned-halfword
                         :signed-byte :unsigned-byte)
               (incf total-words))
+             (:registers )
              (t (if (typep spec 'unsigned-byte)
                   (incf total-words spec)
                   (error "unknown arg spec ~s" spec)))))
@@ -679,6 +706,7 @@
                               (t =

                                (setf (%get-single-float argptr other-offse=
t) val)
                                (incf other-offset 8))))
+                       (:registers (setq regbuf val))
                        (t
                         (let* ((p 0))
                           (declare (fixnum p))
@@ -686,7 +714,9 @@
                             (setf (%get-ptr argptr other-offset) (%get-ptr=
 val p))
                             (incf p 8)
                             (incf other-offset 8)))))))
-                 (%do-ff-call (min n-fp-args 8) frame fp-args entry)
+                 (if regbuf
+                   (%do-ff-call-return-registers fp-args (min n-fp-args 8)=
 frame regbuf entry)
+                   (%do-ff-call (min n-fp-args 8) frame fp-args entry))
                  (ecase result-spec
                    (:void nil)
                    (:address (%get-ptr argptr 8))



More information about the Openmcl-cvs-notifications mailing list