(inst lda csp-tn (* nargs n-word-bytes) csp-tn))))
;;; Emit code needed at the return-point from an unknown-values call
-;;; for a fixed number of values. Values is the head of the TN-Ref
+;;; for a fixed number of values. Values is the head of the TN-REF
;;; list for the locations that the values are to be received into.
;;; Nvals is the number of values that are to be received (should
;;; equal the length of Values).
(tn (tn-ref-tn val)))
(defaults (cons default-lab tn))
- (inst blt temp default-lab)
+ (inst ble temp default-lab)
(inst ldl move-temp (* i n-word-bytes) ocfp-tn)
(inst subq temp (fixnumize 1) temp)
(store-stack-tn tn move-temp)))
((null remaining))
(let ((def (car remaining)))
(emit-label (car def))
- (when (null (cdr remaining))
- (inst br zero-tn defaulting-done))
- (store-stack-tn (cdr def) null-tn)))))))
+ (store-stack-tn (cdr def) null-tn)))
+ (inst br zero-tn defaulting-done)))))
(when lra-label
(inst compute-code-from-lra code-tn code-tn lra-label temp))))
;; restore the frame pointer and clear as much of the control
;; stack as possible.
(move ocfp cfp-tn)
- (inst addq val-ptr (* nvals n-word-bytes) csp-tn)
+ ;; ADDQ only accepts immediates of type (UNSIGNED-BYTE 8). Here,
+ ;; instead of adding (* NVALS N-WORD-BYTES), we use NARGS that
+ ;; we've carefully set up, but protect ourselves by averring that
+ ;; FIXNUMIZEation and multiplication by N-WORD-BYTES is the same.
+ (aver (= (* nvals n-word-bytes) (fixnumize nvals)))
+ (inst addq val-ptr nargs csp-tn)
;; pre-default any argument register that need it.
(when (< nvals register-arg-count)
(dolist (reg (subseq (list a0 a1 a2 a3 a4 a5) nvals))
(define-vop (listify-rest-args)
(:args (context-arg :target context :scs (descriptor-reg))
(count-arg :target count :scs (any-reg)))
- (:arg-types * tagged-num)
+ (:info dx)
+ (:ignore dx)
+ (:arg-types * tagged-num (:constant t))
(:temporary (:scs (any-reg) :from (:argument 0)) context)
(:temporary (:scs (any-reg) :from (:argument 1)) count)
(:temporary (:scs (descriptor-reg) :from :eval) temp dst)