X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86%2Fvalues.lisp;h=9e5a4c1bc4aa1a89592895589dae7f71a77a033c;hb=079ef9dad558ca07cb8178ef428bf738112174fa;hp=d4f4e00490ae33ac8b3b4d5d72e24d40ee8e97a6;hpb=6fb6e66f531dfb6140ec3e0cc8f84f6ecd1927ca;p=sbcl.git diff --git a/src/compiler/x86/values.lisp b/src/compiler/x86/values.lisp index d4f4e00..9e5a4c1 100644 --- a/src/compiler/x86/values.lisp +++ b/src/compiler/x86/values.lisp @@ -16,6 +16,35 @@ (:generator 1 (move esp-tn ptr))) +(define-vop (%%nip-values) + (:args (last-nipped-ptr :scs (any-reg) :target edi) + (last-preserved-ptr :scs (any-reg) :target esi) + (moved-ptrs :scs (any-reg) :more t)) + (:results (r-moved-ptrs :scs (any-reg) :more t) + ;; same as MOVED-PTRS + ) + (:temporary (:sc any-reg :offset esi-offset) esi) + (:temporary (:sc any-reg :offset edi-offset) edi) + (:ignore r-moved-ptrs) + (:generator 1 + (move edi last-nipped-ptr) + (move esi last-preserved-ptr) + (inst sub esi n-word-bytes) + (inst sub edi n-word-bytes) + (inst cmp esp-tn esi) + (inst jmp :a done) + (inst std) + LOOP + (inst movs :dword) + (inst cmp esp-tn esi) + (inst jmp :be loop) + DONE + (inst lea esp-tn (make-ea :dword :base edi :disp n-word-bytes)) + (inst sub edi esi) + (loop for moved = moved-ptrs then (tn-ref-across moved) + while moved + do (inst add (tn-ref-tn moved) edi)))) + ;;; Push some values onto the stack, returning the start and number of values ;;; pushed as results. It is assumed that the Vals are wired to the standard ;;; argument locations. Nvals is the number of values to push. @@ -63,7 +92,7 @@ (inst and al-tn lowtag-mask) (inst cmp al-tn list-pointer-lowtag) (inst jmp :e loop) - (error-call vop bogus-argument-to-values-list-error list) + (error-call vop bogus-arg-to-values-list-error list) DONE (inst mov count start) ; start is high address @@ -95,9 +124,10 @@ (move count num)) (t (inst lea src (make-ea :dword :base context - :disp (- (* (tn-value skip) word-bytes)))) + :disp (- (* (tn-value skip) + n-word-bytes)))) (move count num) - (inst sub count (* (tn-value skip) word-bytes))))) + (inst sub count (* (tn-value skip) n-word-bytes))))) (any-reg (move src context)