(count :scs (any-reg)))
(:temporary (:sc descriptor-reg :from (:argument 0) :to (:result 1)) list)
(:temporary (:sc descriptor-reg :to (:result 1)) nil-temp)
- (:temporary (:sc unsigned-reg :offset rax-offset :to (:result 1)) rax)
+ (:temporary (:sc dword-reg :offset eax-offset :to (:result 1)) eax)
(:vop-var vop)
(:save-p :compute-only)
(:generator 0
(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 mov eax (make-dword-tn list))
(inst and al-tn lowtag-mask)
(inst cmp al-tn list-pointer-lowtag)
(inst jmp :e LOOP)
- (error-call vop bogus-arg-to-values-list-error list)
+ (error-call vop 'bogus-arg-to-values-list-error list)
DONE
(inst mov count start) ; start is high address
- (inst sub count rsp-tn))) ; stackp is low address
+ (inst sub count rsp-tn) ; stackp is low address
+ #!-#.(cl:if (cl:= sb!vm:word-shift sb!vm:n-fixnum-tag-bits) '(and) '(or))
+ (inst shr count (- word-shift n-fixnum-tag-bits))))
;;; Copy the more arg block to the top of the stack so we can use them
;;; as function arguments.
(any-reg
(move src context)
+ #!+#.(cl:if (cl:= sb!vm:word-shift sb!vm:n-fixnum-tag-bits) '(and) '(or))
(inst sub src skip)
+ #!-#.(cl:if (cl:= sb!vm:word-shift sb!vm:n-fixnum-tag-bits) '(and) '(or))
+ (progn
+ ;; FIXME: This can't be efficient, but LEA (my first choice)
+ ;; doesn't do subtraction.
+ (inst shl skip (- word-shift n-fixnum-tag-bits))
+ (inst sub src skip)
+ (inst shr skip (- word-shift n-fixnum-tag-bits)))
(move count num)
(inst sub count skip)))
- (move loop-index count)
+ (inst lea loop-index (make-ea :byte :index count
+ :scale (ash 1 (- word-shift n-fixnum-tag-bits))))
(inst mov start rsp-tn)
(inst jrcxz DONE) ; check for 0 count?
- (inst sub rsp-tn count)
- (inst sub src count)
+ (inst sub rsp-tn loop-index)
+ (inst sub src loop-index)
LOOP
(inst mov temp (make-ea :qword :base src :index loop-index))