(: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))))
+