Utility predicates for packing: UNBOUNDED-SC-P and UNBOUNDED-TN-P
[sbcl.git] / src / compiler / x86-64 / nlx.lisp
index 4cc02fd..523ef31 100644 (file)
 (in-package "SB!VM")
 
 ;;; Make an environment-live stack TN for saving the SP for NLX entry.
-(!def-vm-support-routine make-nlx-sp-tn (env)
+(defun make-nlx-sp-tn (env)
   (physenv-live-tn
    (make-representation-tn *fixnum-primitive-type* any-reg-sc-number)
    env))
 
 ;;; Make a TN for the argument count passing location for a non-local entry.
-(!def-vm-support-routine make-nlx-entry-arg-start-location ()
+(defun make-nlx-entry-arg-start-location ()
   (make-wired-tn *fixnum-primitive-type* any-reg-sc-number rbx-offset))
 
 (defun catch-block-ea (tn)
     (inst sub rdi n-word-bytes)
     (move rcx count)                    ; fixnum words == bytes
     (move num rcx)
-    (inst shr rcx word-shift)           ; word count for <rep movs>
+    (inst shr rcx n-fixnum-tag-bits)    ; word count for <rep movs>
     ;; If we got zero, we be done.
     (inst jrcxz DONE)
     ;; Copy them down.
 (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 rbx-offset) saved-function)
   (:temporary (:sc unsigned-reg :offset rax-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 RBX 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 rsp-tn (* unwind-block-size n-word-bytes))
             catch-block-entry-pc-slot)
 
     ;; Run any required UWPs.
-    (inst lea temp-reg-tn (make-fixup 'unwind :assembly-routine))
+    (inst mov temp-reg-tn (make-fixup 'unwind :assembly-routine))
     (inst jmp temp-reg-tn)
     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
     (zeroize rcx-tn)