OSDN Git Service

Rework do-count to take an expression for the iteration count,
authordevans <devans>
Fri, 28 Aug 2009 06:20:28 +0000 (06:20 +0000)
committerdevans <devans>
Fri, 28 Aug 2009 06:20:28 +0000 (06:20 +0000)
and swap the iteration-variable/#iterations arguments.

cgen/ChangeLog
cgen/cpu/play.cpu
cgen/doc/rtl.texi
cgen/rtl-c.scm
cgen/rtl.scm
cgen/rtx-funcs.scm

index 806f453..9361cc9 100644 (file)
@@ -5,7 +5,8 @@
        (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.
index a0dbfde..da27ec1 100644 (file)
      ()
      "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)))
+              )
      ()
 )
index 91804a2..37df747 100644 (file)
@@ -2536,7 +2536,7 @@ read before any output is written.  @samp{empty} must be @samp{()} and
 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}.
index 81ed29e..bf09a5c 100644 (file)
 
 ; 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)
index 68fbe6f..7ec57ca 100644 (file)
        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,
index 6fe45bc..5f37a80 100644 (file)
 ; 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
 )