(inst subu count (fixnumize 1))
(inst bne count zero-tn loop)
(inst addu dst n-word-bytes)
-
+
(inst b done)
(inst nop)
DEFAULT-A5-AND-ON
(move a5 null-tn)
DONE
-
+
;; Clear the stack.
(move ocfp-tn cfp-tn)
(move cfp-tn ocfp)
(inst addu csp-tn ocfp-tn nvals)
-
+
;; Return.
(lisp-return lra lip))
;; Calculate NARGS (as a fixnum)
(inst subu nargs csp-tn args)
-
+
;; Load the argument regs (must do this now, 'cause the blt might
;; trash these locations)
(inst lw a0 args (* 0 n-word-bytes))
(inst blez count done)
(inst addu src args (* n-word-bytes register-arg-count))
(inst addu dst cfp-tn (* n-word-bytes register-arg-count))
-
+
LOOP
;; Copy one arg.
(inst lw temp src)
(inst addu count (fixnumize -1))
(inst bgtz count loop)
(inst addu dst dst n-word-bytes)
-
+
DONE
;; We are done. Do the jump.
(loadw temp lexenv closure-fun-slot fun-pointer-lowtag)
(loadw target-uwp block unwind-block-current-uwp-slot)
(inst bne cur-uwp target-uwp do-uwp)
(inst nop)
-
+
(move cur-uwp block)
DO-EXIT
-
+
(loadw cfp-tn cur-uwp unwind-block-current-cont-slot)
(loadw code-tn cur-uwp unwind-block-current-code-slot)
(loadw lra cur-uwp unwind-block-entry-pc-slot)
(:arg count any-reg nargs-offset)
(:temp catch any-reg a1-offset)
(:temp tag descriptor-reg a2-offset))
-
+
(declare (ignore start count)) ; We only need them in the registers.
(load-symbol-value catch *current-catch-block*)
LOOP
-
+
(let ((error (generate-error-code nil unseen-throw-tag-error target)))
(inst beq catch zero-tn error)
(inst nop))
-
+
(loadw tag catch catch-block-tag-slot)
(inst beq tag target exit)
(inst nop)
(inst b loop)
(loadw catch catch catch-block-previous-catch-slot)
-
+
EXIT
-
+
(inst j (make-fixup 'unwind :assembly-routine))
(move target catch t))