(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.
- (progn
- (loadw temp lexenv closure-fun-slot fun-pointer-lowtag)
- (lisp-jump temp lip)))
+ (loadw temp lexenv closure-fun-slot fun-pointer-lowtag)
+ (lisp-jump temp lip))
\f
;;;; Non-local exit noise.
(define-assembly-routine
(unwind
+ (:return-style :none)
(:translate %continue-unwind)
(:policy :fast-safe))
((:arg block (any-reg descriptor-reg) a0-offset)
(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
-
+ DO-EXIT
+
(loadw cfp-tn cur-uwp unwind-block-current-cont-slot)
(loadw code-tn cur-uwp unwind-block-current-code-slot)
- (progn
- (loadw lra cur-uwp unwind-block-entry-pc-slot)
- (lisp-return lra lip :frob-code nil))
+ (loadw lra cur-uwp unwind-block-entry-pc-slot)
+ (lisp-return lra lip :frob-code nil)
- do-uwp
+ DO-UWP
(loadw next-uwp cur-uwp unwind-block-current-uwp-slot)
(inst b do-exit)
(store-symbol-value next-uwp *current-unwind-protect-block*))
(define-assembly-routine
- throw
+ (throw
+ (:return-style :none))
((:arg target descriptor-reg a0-offset)
(:arg start any-reg ocfp-offset)
(:arg count any-reg nargs-offset)
(:temp catch any-reg a1-offset)
(:temp tag descriptor-reg a2-offset))
-
- (progn start count) ; We just need them in the registers.
+
+ (declare (ignore start count)) ; We only need them in the registers.
(load-symbol-value catch *current-catch-block*)
-
- loop
-
+
+ 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))