(in-package "SB!VM")
-(file-comment
- "$Header$")
-
(define-vop (reset-stack-pointer)
(:args (ptr :scs (any-reg)))
(: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.
(:generator 0
(move list arg)
(move start esp-tn) ; WARN pointing 1 below
- (inst mov nil-temp *nil-value*)
+ (inst mov nil-temp nil-value)
LOOP
(inst cmp list nil-temp)
(inst jmp :e done)
- (pushw list cons-car-slot list-pointer-type)
- (loadw list list cons-cdr-slot list-pointer-type)
+ (pushw list cons-car-slot list-pointer-lowtag)
+ (loadw list list cons-cdr-slot list-pointer-lowtag)
(inst mov eax list)
(inst and al-tn lowtag-mask)
- (inst cmp al-tn list-pointer-type)
+ (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
(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)