(:generator 1
(move rsp-tn ptr)))
+(define-vop (%%nip-values)
+ (:args (last-nipped-ptr :scs (any-reg) :target rdi)
+ (last-preserved-ptr :scs (any-reg) :target rsi)
+ (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 rsi-offset) rsi)
+ (:temporary (:sc any-reg :offset rdi-offset) rdi)
+ (:ignore r-moved-ptrs)
+ (:generator 1
+ (move rdi last-nipped-ptr)
+ (move rsi last-preserved-ptr)
+ (inst sub rsi n-word-bytes)
+ (inst sub rdi n-word-bytes)
+ (inst cmp rsp-tn rsi)
+ (inst jmp :a DONE)
+ (inst std)
+ LOOP
+ (inst movs :qword)
+ (inst cmp rsp-tn rsi)
+ (inst jmp :be LOOP)
+ DONE
+ (inst lea rsp-tn (make-ea :qword :base rdi :disp n-word-bytes))
+ (inst sub rdi rsi)
+ (loop for moved = moved-ptrs then (tn-ref-across moved)
+ while moved
+ do (inst add (tn-ref-tn moved) rdi))))
+
;;; 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.
LOOP
(inst cmp list nil-temp)
- (inst jmp :e done)
+ (inst jmp :e DONE)
(pushw list cons-car-slot list-pointer-lowtag)
(loadw list list cons-cdr-slot list-pointer-lowtag)
(inst mov rax list)
(inst and al-tn lowtag-mask)
(inst cmp al-tn list-pointer-lowtag)
- (inst jmp :e loop)
+ (inst jmp :e LOOP)
(error-call vop bogus-arg-to-values-list-error list)
DONE
(move temp1 count)
(inst mov start rsp-tn)
- (inst jecxz done) ; check for 0 count?
+ (inst jecxz DONE) ; check for 0 count?
(inst shr temp1 word-shift) ; convert the fixnum to a count.
LOOP
(inst lods temp)
(inst push temp)
- (inst loop loop)
+ (inst loop LOOP)
DONE))