and swap the iteration-variable/#iterations arguments.
(do-count): New rtl handler.
* rtl-traverse.scm (-rtx-traverse-iteration): New function.
(-rtx-make-traverser-table): Add ITERATION.
- * rtl.scm (rtx-env-make-iteration-locals): New function.
+ * rtl.scm (rtx-make-iteration-limit-var): New function.
+ (rtx-env-make-iteration-locals): New function.
* rtx-funcs.scm (do-count): New rtl function.
* cpu/play.cpu: Add do-count-test insn.
* doc/rtl.texi: Add docs on do-count.
()
"do-count-test $dr,$sr"
(+ OP1_7 OP2_0 dr sr)
- (do-count VOID 4 iter (set dr (add sr iter)))
+ (sequence ()
+ (do-count VOID iter 4 (set dr (add sr iter)))
+ (do-count iter (and sr 7) (set dr (add sr iter)))
+ )
()
)
is present for consistency with @samp{sequence}.
@samp{mode} must be @samp{VOID} (void mode), or it can be elided.
-@item (do-count mode number-of-iterations iteration-variable expr1 ...)
+@item (do-count mode iteration-variable number-of-iterations expr1 ...)
Execute @samp{expr1}, @samp{expr2}, etc. the specified number of times.
@samp{iteration-variable} will contain the iteration number and is
available for use in expressions. It has mode @samp{INT}.
; Return a <c-expr> node for a `do-count'.
-(define (s-do-count estate nr-times iter-var . exprs)
- (let* ((env (rtx-env-make-iteration-locals iter-var))
+(define (s-do-count estate iter-var nr-times . exprs)
+ (let* ((limit-var (rtx-make-iteration-limit-var iter-var))
+ (env (rtx-env-make-iteration-locals iter-var))
(estate (estate-push-env estate env))
- (c-iter-var (rtx-temp-value (rtx-temp-lookup (estate-env estate) iter-var))))
+ (temp-iter (rtx-temp-lookup (estate-env estate) iter-var))
+ (temp-limit (rtx-temp-lookup (estate-env estate) limit-var))
+ (c-iter-var (rtx-temp-value temp-iter))
+ (c-limit-var (rtx-temp-value temp-limit)))
(cx:make VOID
(string-append
"{\n"
(gen-temp-defs estate env)
+ " " c-limit-var " = "
+ (cx:c (rtl-c-get estate (rtx-temp-mode temp-limit) nr-times))
+ ";\n"
" for (" c-iter-var " = 0;\n"
- " " c-iter-var " < " (number->string nr-times) ";\n"
+ " " c-iter-var " < " c-limit-var ";\n"
" ++" c-iter-var ")\n"
" {\n"
(string-map (lambda (e)
(cons estate (cons mode (cons locals (cons expr exprs)))))
)
-(define-fn do-count (estate options mode nr-times iter-var expr . exprs)
+(define-fn do-count (estate options mode iter-var nr-times expr . exprs)
(apply s-do-count
- (cons estate (cons nr-times (cons iter-var (cons expr exprs)))))
+ (cons estate (cons iter-var (cons nr-times (cons expr exprs)))))
)
(define-fn closure (estate options mode expr env)
var-list)
)
-; Create an environment with the iteration local variable of `do-count'.
+; Return the symbol name of the limit variable of `do-count'
+; given iteration-variable ITER-VAR.
+; ??? We don't publish that this variable is available to use, but we could.
+
+(define (rtx-make-iteration-limit-var iter-var)
+ (symbol-append iter-var '-limit)
+)
+
+; Create an environment with the iteration local variables of `do-count'.
(define (rtx-env-make-iteration-locals iter-var)
- (rtx-env-make-locals (list (list 'INT iter-var)))
+ (rtx-env-make-locals (list (list 'INT iter-var)
+ (list 'INT (rtx-make-iteration-limit-var iter-var))))
)
; Push environment ENV onto the front of environment stack ENV-STACK,
; This has to be a syntax node to handle iter-var properly: it's not defined
; yet and thus pre-evaluating the expressions doesn't work.
-(drsn (do-count &options &mode nr-times iter-var expr . exprs)
- (OPTIONS VOIDMODE NUMBER ITERATION RTX . RTX) (NA NA NA NA VOID . VOID)
+(drsn (do-count &options &mode iter-var nr-times expr . exprs)
+ (OPTIONS VOIDMODE ITERATION RTX RTX . RTX) (NA NA NA INT VOID . VOID)
SEQUENCE
#f
)