Unwind-to-frame-and-call-VOP doesn't need static symbols.
[sbcl.git] / src / compiler / x86 / nlx.lisp
index 96d2ca4..b31e635 100644 (file)
 (define-vop (unwind-to-frame-and-call)
     (:args (ofp :scs (descriptor-reg))
            (uwp :scs (descriptor-reg))
-           (function :scs (descriptor-reg)))
+           (function :scs (descriptor-reg) :to :load :target saved-function))
   (:arg-types system-area-pointer system-area-pointer t)
   (:temporary (:sc sap-reg) temp)
+  (:temporary (:sc descriptor-reg :offset ebx-offset) saved-function)
   (:temporary (:sc unsigned-reg :offset eax-offset) block)
   (:generator 22
     ;; Store the function into a non-stack location, since we'll be
     ;; unwinding the stack and destroying register contents before we
-    ;; use it.
-    (store-tl-symbol-value function
-                           *unwind-to-frame-function*
-                           temp)
+    ;; use it.  It turns out that EBX is preserved as part of the
+    ;; normal multiple-value handling of an unwind, so use that.
+    (move saved-function function)
 
     ;; Allocate space for magic UWP block.
     (inst sub esp-tn (* unwind-block-size n-word-bytes))
     (inst jmp (make-fixup 'unwind :assembly-routine))
     ENTRY-LABEL
 
-    ;; Load function from symbol
-    (load-tl-symbol-value block *unwind-to-frame-function*)
+    ;; Move our saved function to where we want it now.
+    (move block saved-function)
 
     ;; No parameters
     (inst xor ecx-tn ecx-tn)