1.0.4.64: more stack-alignment x86/Darwin
[sbcl.git] / src / compiler / x86 / c-call.lisp
index e441003..27ebe1e 100644 (file)
                    :from :eval :to :result) ecx)
   (:temporary (:sc unsigned-reg :offset edx-offset
                    :from :eval :to :result) edx)
+  (:temporary (:sc unsigned-reg :offset esi-offset) prev-esp)
   (:node-var node)
   (:vop-var vop)
   (:save-p t)
   (:ignore args ecx edx)
   (:generator 0
+    ;; FIXME & OAOOM: This is brittle and error-prone to maintain two
+    ;; instances of the same logic, on in arch-assem.S, and one in
+    ;; c-call.lisp. If you modify this, modify that one too...
     (cond ((policy node (> space speed))
            (move eax function)
            (inst call (make-fixup "call_into_c" :foreign)))
            (dotimes (i 8)
              (inst fstp fr0-tn))
 
-           #!+win32 (inst cld)
+           #!+win32
+           (inst cld)
+
+           #!+darwin
+           ;; Align stack for C.
+           (progn
+             (move prev-esp esp-tn)
+             (inst and esp-tn -16))
 
            (inst call function)
            ;; To give the debugger a clue. XX not really internal-error?
            (note-this-location vop :internal-error)
 
+           #!+darwin
+           ;; Restore
+           (move esp-tn prev-esp)
+
            ;; Restore the NPX for lisp; ensure no regs are empty
            (dotimes (i 7)
              (inst fldz))