X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86%2Fcall.lisp;h=42c8c85ca7ea27e9aada9ba7f8909ac3d6782361;hb=7646aefa188758e2892fea2ad02be4f29b3938f2;hp=173e4859ce5055fe9274c9c5f7e9b97a8f740c15;hpb=581e3d62de8cb37e13ad9db63e5537c0f962be28;p=sbcl.git diff --git a/src/compiler/x86/call.lisp b/src/compiler/x86/call.lisp index 173e485..42c8c85 100644 --- a/src/compiler/x86/call.lisp +++ b/src/compiler/x86/call.lisp @@ -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 @@ -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) @@ -1262,7 +1265,8 @@ (:policy :safe) (:args (context :scs (descriptor-reg) :target src) (count :scs (any-reg) :target ecx)) - (:arg-types * tagged-num) + (:info *dynamic-extent*) + (:arg-types * tagged-num (:constant t)) (:temporary (:sc unsigned-reg :offset esi-offset :from (:argument 0)) src) (:temporary (:sc unsigned-reg :offset ecx-offset :from (:argument 1)) ecx) (:temporary (:sc unsigned-reg :offset eax-offset) eax) @@ -1280,7 +1284,7 @@ (inst jecxz done) (inst lea dst (make-ea :dword :index ecx :scale 2)) (pseudo-atomic - (allocation dst dst node) + (allocation dst dst node *dynamic-extent*) (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.