X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86%2Fcall.lisp;h=00e4572e64f56e46127a7901a02a7397ad569817;hb=079ef9dad558ca07cb8178ef428bf738112174fa;hp=6caa160b0638e492df9d327ab6d78814539a4757;hpb=80304981972c91c1b3f3fca75f36dacf1fecf307;p=sbcl.git diff --git a/src/compiler/x86/call.lisp b/src/compiler/x86/call.lisp index 6caa160..00e4572 100644 --- a/src/compiler/x86/call.lisp +++ b/src/compiler/x86/call.lisp @@ -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, @@ -43,23 +43,22 @@ (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 @@ -172,12 +171,12 @@ (inst sub esp-tn (* (max nargs 3) n-word-bytes)))) ;;; 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 @@ -386,8 +385,11 @@ (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) @@ -643,8 +645,9 @@ (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) @@ -707,7 +710,7 @@ ;;; 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 @@ -1257,6 +1260,9 @@ ;;; 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) @@ -1272,15 +1278,16 @@ (: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.