0.8.3.23
[sbcl.git] / src / compiler / x86 / c-call.lisp
index 3a4542f..f56fd52 100644 (file)
     (setf (result-state-num-results state) (1+ num-results))
     (my-make-wired-tn 'single-float 'single-reg (* num-results 2))))
 
-#+nil ;;pfw obsolete now?
-(define-alien-type-method (values :result-tn) (type state)
-  (mapcar (lambda (type)
-           (invoke-alien-type-method :result-tn type state))
-         (alien-values-type-values type)))
-
-;;; pfw - from alpha
 (define-alien-type-method (values :result-tn) (type state)
   (let ((values (alien-values-type-values type)))
-    (when (cdr values)
+    (when (> (length values) 2)
       (error "Too many result values from c-call."))
-    (when values
-      (invoke-alien-type-method :result-tn (car values) state))))
+    (mapcar (lambda (type)
+             (invoke-alien-type-method :result-tn type state))
+           values)))
 
 (!def-vm-support-routine make-call-out-tns (type)
   (let ((arg-state (make-arg-state)))
     (collect ((arg-tns))
-      (dolist #+nil ;; this reversed list seems to cause the alien botches!!
-       (arg-type (reverse (alien-fun-type-arg-types type)))
-       (arg-type (alien-fun-type-arg-types type))
+      (dolist (arg-type (alien-fun-type-arg-types type))
        (arg-tns (invoke-alien-type-method :arg-tn arg-type arg-state)))
       (values (my-make-wired-tn 'positive-fixnum 'any-reg esp-offset)
              (* (arg-state-stack-frame-size arg-state) n-word-bytes)
   (:args (function :scs (sap-reg))
         (args :more t))
   (:results (results :more t))
-  ;; eax is already wired
-  (:temporary (:sc unsigned-reg :offset ecx-offset) ecx)
-  (:temporary (:sc unsigned-reg :offset edx-offset) edx)
+  (:temporary (:sc unsigned-reg :offset eax-offset
+                  :from :eval :to :result) eax)
+  (:temporary (:sc unsigned-reg :offset ecx-offset
+                  :from :eval :to :result) ecx)
+  (:temporary (:sc unsigned-reg :offset edx-offset
+                  :from :eval :to :result) edx)
   (:node-var node)
   (:vop-var vop)
   (:save-p t)
   (:ignore args ecx edx)
   (:generator 0
     (cond ((policy node (> space speed))
-          (move eax-tn function)
+          (move eax function)
           (inst call (make-fixup (extern-alien-name "call_into_c") :foreign)))
          (t
           ;; Setup the NPX for C; all the FP registers need to be
           ;; empty; pop them all.
-          (inst fstp fr0-tn)
-          (inst fstp fr0-tn)
-          (inst fstp fr0-tn)
-          (inst fstp fr0-tn)
-          (inst fstp fr0-tn)
-          (inst fstp fr0-tn)
-          (inst fstp fr0-tn)
-          (inst fstp fr0-tn)
+          (dotimes (i 8)
+            (inst fstp fr0-tn))
 
           (inst call function)
           ;; To give the debugger a clue. XX not really internal-error?
           (note-this-location vop :internal-error)
 
-          ;; Restore the NPX for lisp.
-          (inst fldz) ; insure no regs are empty
-          (inst fldz)
-          (inst fldz)
-          (inst fldz)
-          (inst fldz)
-          (inst fldz)
-          (inst fldz)
+          ;; Restore the NPX for lisp; ensure no regs are empty
+          (dotimes (i 7)
+            (inst fldz))
 
           (if (and results
                    (location= (tn-ref-tn results) fr0-tn))
                                     (ash symbol-value-slot word-shift)
                                     (- other-pointer-lowtag)))
               delta)))))
+
+;;; these are not strictly part of the c-call convention, but are
+;;; needed for the WITH-PRESERVED-POINTERS macro used for "locking
+;;; down" lisp objects so that GC won't move them while foreign
+;;; functions go to work.
+
+(define-vop (push-word-on-c-stack)
+    (:translate push-word-on-c-stack)
+  (:args (val :scs (sap-reg)))
+  (:policy :fast-safe)
+  (:arg-types system-area-pointer)
+  (:generator 2
+    (inst push val)))
+
+(define-vop (pop-words-from-c-stack)
+    (:translate pop-words-from-c-stack)
+  (:args)
+  (:arg-types (:constant (unsigned-byte 29)))
+  (:info number)
+  (:policy :fast-safe)
+  (:generator 2
+    (inst add esp-tn (fixnumize number))))
+