X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86%2Fvalues.lisp;h=9e5a4c1bc4aa1a89592895589dae7f71a77a033c;hb=bffa99d35c7d50ac46b9eb7dbe25d1ab1a0e6145;hp=eae7075175ad021594f177453d3d821a5d3d512c;hpb=50305b602c3953440af716137a56f50cd204375d;p=sbcl.git diff --git a/src/compiler/x86/values.lisp b/src/compiler/x86/values.lisp index eae7075..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