mescc: Proper support for i++,++i,i--,--i.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 7 Jan 2017 20:53:12 +0000 (21:53 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 7 Jan 2017 20:53:12 +0000 (21:53 +0100)
* module/language/c99/compiler.mes (ast->info): Bugfix: locals.
  Add i--, --i.  Properly support i++, ++i.
* module/mes/libc-i386.mes (i386:function-locals): Support 8 local vars.
* scaffold/t.c (test): Test it.

module/language/c99/compiler.mes
module/mes/libc-i386.mes
scaffold/t.c

index 0b8721b4c6cfafa2e28cba490d9e945fa11e52bf..b1eb6cc1a60a158ead9af4ac23c39684bb8314d3 100644 (file)
           (locals (.locals info))
           (text (.text info)))
       (define (add-local name)
-         (acons name (1+ (or (and=> (member 1 (map cdr locals)) length) 0)) locals))
+        (let ((locals (acons name (1+ (length (filter positive? (map cdr locals)))) locals)))
+          locals))
 
       ;; (stderr "\nS=~a\n" o)
       ;; (stderr "  text=~a\n" text)
                           (list (lambda (f g t d)
                                   (i386:accu-zero?)))))))
 
+        ;; FIXME
+        ((post-inc ,expr) ((ast->info info) `(expr-stmt ,o)))
+        ((post-dec ,expr) ((ast->info info) `(expr-stmt ,o)))
+        ((pre-inc ,expr) ((ast->info info) `(expr-stmt ,o)))
+        ((pre-dec ,expr) ((ast->info info) `(expr-stmt ,o)))
+
         ;; i++
         ((expr-stmt (post-inc (p-expr (ident ,name))))
          (clone info #:text
                 (append text (list (lambda (f g t d)
-                                     (i386:local-add (assoc-ref locals name) 1))))))
+                                     (append (i386:local->accu (assoc-ref locals name))
+                                             (i386:local-add (assoc-ref locals name) 1)
+                                             (i386:accu-zero?)))))))
 
-        ;; ++i -- same for now FIXME
+        ;; ++i
         ((expr-stmt (pre-inc (p-expr (ident ,name))))
          (clone info #:text
                 (append text (list (lambda (f g t d)
-                                     (i386:local-add (assoc-ref locals name) 1))))))
+                                     (append (i386:local-add (assoc-ref locals name) 1)
+                                             (i386:local->accu (assoc-ref locals name))
+                                             (i386:accu-zero?)))))))
+
+        ;; i--
+        ((expr-stmt (post-dec (p-expr (ident ,name))))
+         (clone info #:text
+                (append text (list (lambda (f g t d)
+                                     (append (i386:local->accu (assoc-ref locals name))
+                                             (i386:local-add (assoc-ref locals name) -1)
+                                             (i386:accu-zero?)))))))
+
+        ;; --i
+        ((expr-stmt (pre-dec (p-expr (ident ,name))))
+         (clone info #:text
+                (append text (list (lambda (f g t d)
+                                     (append (i386:local-add (assoc-ref locals name) -1)
+                                             (i386:local->accu (assoc-ref locals name))
+                                             (i386:accu-zero?)))))))
 
         ((not ,expr)
          (let* ((test-info ((ast->info info) expr)))
index 014bd4ace7933bf3bf308d474012319fb012733b..b61052084545ba9ac11d9bdc0b46a1d56712f40f 100644 (file)
@@ -29,7 +29,7 @@
     #x89 #xe5))                         ; mov    %esp,%ebp
 
 (define (i386:function-locals)
-  '(#x83 #xec #x10))               ; sub    $0x10,%esp -- 4 local vars
+  '(#x83 #xec #x20))               ; sub    $0x10,%esp -- 8 local vars
 
 (define (i386:ref-global o)
   `(#x68 ,@(int->bv32 o)))               ; push  $0x<o>
index 59b74797fdddb797407905e9476b9fa20db236d5..cf4aef4e787cde04eb7f2852355cd360837d3625 100644 (file)
@@ -122,6 +122,13 @@ test ()
   puts ("t: if (1 && 0)\n");
   if (1 && 0) return 1;
 
+  int i=0;
+  puts ("t: if (i++)\n");
+  if (i++) return 1;
+
+  puts ("t: if (--i)\n");
+  if (--i) return 1;
+
   puts ("t: if (1)\n");
   if (1) goto ok0;
   return 1;
@@ -167,8 +174,15 @@ test ()
   return 1;
  ok8:
 
+  puts ("t: if (++i)\n");
+  if (++i) goto ok9;
+ ok9:
+
+  puts ("t: if (i--)\n");
+  if (i--) goto ok10;
+ ok10:
+
   puts ("t: for (i=0; i<4; ++i)\n");
-  int i;
   for (i=0; i<4; ++i);
   if (i != 4) return i;