message
[sbcl.git] / src / compiler / x86 / call.lisp
index 6caa160..00e4572 100644 (file)
@@ -15,7 +15,7 @@
 
 ;;; Return a wired TN describing the N'th full call argument passing
 ;;; location.
-(!def-vm-support-routine standard-argument-location (n)
+(!def-vm-support-routine standard-arg-location (n)
   (declare (type unsigned-byte n))
   (if (< n register-arg-count)
       (make-wired-tn *backend-t-primitive-type* descriptor-reg-sc-number
@@ -31,8 +31,8 @@
   (make-wired-tn (primitive-type-or-lose 'system-area-pointer)
                 sap-stack-sc-number return-pc-save-offset))
 
-;;; Similar to Make-Return-PC-Passing-Location, but makes a location
-;;; to pass Old-FP in.
+;;; This is similar to MAKE-RETURN-PC-PASSING-LOCATION, but makes a
+;;; location to pass OLD-FP in.
 ;;;
 ;;; This is wired in both the standard and the local-call conventions,
 ;;; because we want to be able to assume it's always there. Besides,
   (make-wired-tn *fixnum-primitive-type* control-stack-sc-number
                 ocfp-save-offset))
 
-;;; Make the TNs used to hold Old-FP and Return-PC within the current
+;;; Make the TNs used to hold OLD-FP and RETURN-PC within the current
 ;;; function. We treat these specially so that the debugger can find
 ;;; them at a known location.
 ;;;
 ;;; Without using a save-tn - which does not make much sense if it is
-;;; wire to the stack? 
-(!def-vm-support-routine make-old-fp-save-location (env)
+;;; wired to the stack? 
+(!def-vm-support-routine make-old-fp-save-location (physenv)
   (physenv-debug-live-tn (make-wired-tn *fixnum-primitive-type*
                                        control-stack-sc-number
                                        ocfp-save-offset)
-                        env))
-
-(!def-vm-support-routine make-return-pc-save-location (env)
+                        physenv))
+(!def-vm-support-routine make-return-pc-save-location (physenv)
   (physenv-debug-live-tn
    (make-wired-tn (primitive-type-or-lose 'system-area-pointer)
                  sap-stack-sc-number return-pc-save-offset)
-   env))
+   physenv))
 
 ;;; Make a TN for the standard argument count passing location. We only
 ;;; need to make the standard location, since a count is never passed when we
     (inst sub esp-tn (* (max nargs 3) n-word-bytes))))
 \f
 ;;; Emit code needed at the return-point from an unknown-values call
-;;; for a fixed number of values. Values is the head of the TN-Ref
+;;; for a fixed number of values. Values is the head of the TN-REF
 ;;; list for the locations that the values are to be received into.
 ;;; Nvals is the number of values that are to be received (should
 ;;; equal the length of Values).
 ;;;
-;;; Move-Temp is a Descriptor-Reg TN used as a temporary.
+;;; MOVE-TEMP is a DESCRIPTOR-REG TN used as a temporary.
 ;;;
 ;;; This code exploits the fact that in the unknown-values convention,
 ;;; a single value return returns at the return PC + 2, whereas a
        (done (gen-label)))
     (inst jmp-short variable-values)
 
-    (inst mov start esp-tn)
-    (inst push (first *register-arg-tns*))
+    (cond ((location= start (first *register-arg-tns*))
+           (inst push (first *register-arg-tns*))
+           (inst lea start (make-ea :dword :base esp-tn :disp 4)))
+          (t (inst mov start esp-tn)
+             (inst push (first *register-arg-tns*))))
     (inst mov count (fixnumize 1))
     (inst jmp done)
 
                 (inst pop ebp-tn))
 
                (t
-                (cerror "Continue any-way"
-                        "VOP return-local doesn't work if old-fp (in slot %s) is not in slot 0"
+                (cerror "Continue anyway"
+                        "VOP return-local doesn't work if old-fp (in slot ~
+                          ~S) is not in slot 0"
                         (tn-offset old-fp)))))
 
         ((any-reg descriptor-reg)
 ;;; the last fixed argument. If Variable is false, then the passing
 ;;; locations are passed as a more arg. Variable is true if there are
 ;;; a variable number of arguments passed on the stack. Variable
-;;; cannot be specified with :Tail return. TR variable argument call
+;;; cannot be specified with :TAIL return. TR variable argument call
 ;;; is implemented separately.
 ;;;
 ;;; In tail call with fixed arguments, the passing locations are
 
 
 ;;; Turn more arg (context, count) into a list.
+(defoptimizer (%listify-rest-args stack-allocate-result) ((&rest args))
+  t)
+
 (define-vop (listify-rest-args)
   (:translate %listify-rest-args)
   (:policy :safe)
   (:generator 20
     (let ((enter (gen-label))
          (loop (gen-label))
-         (done (gen-label)))
+         (done (gen-label))
+          (stack-allocate-p (node-stack-allocate-p node)))
       (move src context)
       (move ecx count)
       ;; Check to see whether there are no args, and just return NIL if so.
       (inst mov result nil-value)
       (inst jecxz done)
       (inst lea dst (make-ea :dword :index ecx :scale 2))
-      (pseudo-atomic
-       (allocation dst dst node)
+      (maybe-pseudo-atomic stack-allocate-p
+       (allocation dst dst node stack-allocate-p)
        (inst lea dst (make-ea :byte :base dst :disp list-pointer-lowtag))
        ;; Convert the count into a raw value, so that we can use the
        ;; LOOP instruction.