mescc: Support [for] itoa.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 12 Mar 2017 10:05:20 +0000 (11:05 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 12 Mar 2017 10:05:20 +0000 (11:05 +0100)
* module/mes/libc-i386.mes (i386:accu%base): New function.
* module/mes/libc-i386.scm: Export it.
* module/language/c99/compiler.mes (expr->accu): Use it to support mod.
* doc/examples/t.c (itoa): New function.
  (test): Test it.
* doc/examples/mini-mes.c (itoa)[!__GNUC__]: New function.

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

index e007fd97b0eb6be20573ee16bedb1b01d7a27823..339bbdae89eae605c919cb6bce187fc4843a5988 100644 (file)
                           (list (lambda (f g ta t d)
                                   (i386:accu/base)))))))
 
+        ((mod ,a ,b)
+         (let* ((empty (clone info #:text '()))
+                (accu ((expr->accu empty) a))
+                (base ((expr->base empty) b)))
+           (clone info #:text
+                  (append text
+                          (.text accu)
+                          (.text base)
+                          (list (lambda (f g ta t d)
+                                  (i386:accu%base)))))))
+
+        ;; FIXME: c/p ast->info
+        ((lt ,a ,b)
+         (let* ((base ((expr->base info) a))
+                (empty (clone base #:text '()))
+                (accu ((expr->accu empty) b)))
+           (clone info #:text
+                  (append text
+                          (.text base)
+                          (.text accu)
+                          (list (lambda (f g ta t d)
+                                  (i386:base-sub)))))))
+
+        ;; FIXME: ...c/p ast->info
+        ((neg (p-expr (ident ,name)))
+         (clone info #:text (append text
+                                    ((ident->base info) name)
+                                    (list (lambda (f g ta t d)
+                                            (i386:value->accu 0)))
+                                    (list (lambda (f g ta t d)
+                                            (i386:base-sub))))))
+
         ;;((cast (type-name (decl-spec-list (type-spec (typename "SCM"))) (abs-declr (declr-fctn (declr-scope (abs-declr (pointer))) (param-list (param-decl (decl-spec-list (type-spec (typename "SCM")))))))) (d-sel (ident "function") (array-ref (d-sel (ident "cdr") (array-ref (p-expr (ident "fn")) (p-expr (ident "g_cells")))) (p-expr (ident "functions"))))))
         ((cast ,cast ,o)
          ((expr->accu info) o))
                   #:globals (append globals (list-tail (.globals body-info) (length globals)))
                   #:locals locals)))
 
+        ;; FIXME: support break statement (see switch/case)
         ((while ,test ,body)
          (let* ((skip-info (lambda (body-length)
                              (clone info #:text (append text
                           ((base->ident-address info) name)
                           ((ident-add info) name 1)))))
 
+        ;; *p-- = b;
+        ((expr-stmt (assn-expr (de-ref (post-dec (p-expr (ident ,name)))) (op ,op) ,b))
+         (when (not (equal? op "="))
+           (stderr "OOOPS0.0: op=~s\n" op)
+           barf)
+         (let* ((empty (clone info #:text '()))
+                (base ((expr->base empty) b)))
+           (clone info #:text
+                  (append text
+                          (.text base)
+                          ((base->ident-address info) name)
+                          ((ident-add info) name -1)))))
+
         ;; CAR (x) = 0
         ;; TYPE (x) = PAIR;
         ((expr-stmt (assn-expr (d-sel (ident ,field) . ,d-sel) (op ,op) ,b))
index f6ae7c54d06d471bb455e29cce11d13adf62a3b0..70bc493524c2e8440de5d3baf6927d91386455ef 100644 (file)
 (define (i386:accu-base)
   `(#x29 #xd0))                         ; sub    %edx,%eax
 
-;; (define (i386:accu/base)
-;;   '(#xf7 #xf2))                         ; div    %edx,%eax
-
 (define (i386:accu/base)
   '(#x86 #xd3                           ; mov    %edx,%ebx
     #x31 #xd2                           ; xor    %edx,%edx
     #xf7 #xf3))                         ; div    %ebx
 
+(define (i386:accu%base)
+  '(#x86 #xd3                           ; mov    %edx,%ebx
+    #x31 #xd2                           ; xor    %edx,%edx
+    #xf7 #xf3                           ; div    %ebx
+    #x89 #xd0))                         ; mov    %edx,%eax
+
 (define (i386:base->accu)
   '(#x89 #xd0))                         ; mov    %edx,%eax
 
index 3f2762b700863cb2bf46c14a44bf9b8b0f560dda..a710b1663bf31d96d5231881c1139b37292eb1b5 100644 (file)
@@ -43,6 +43,7 @@
             i386:accu+base
             i386:accu+value
             i386:accu/base
+            i386:accu%base
             i386:accu-base
             i386:accu-shl
             i386:base-sub
index a1349ac9407f810ceb976290bc00952c7d832954..62245d08d6e341e6b70a4dd2bada8abf4c505bb9 100644 (file)
@@ -198,15 +198,22 @@ eputs (char const* s)
   write (2, s, i);
   return 0;
 }
+#endif
+
+char itoa_buf[10];
 
 char const*
 itoa (int x)
 {
-  static char buf[10];
-  char *p = buf+9;
+  //static char itoa_buf[10];
+  //char *p = buf+9;
+  char *p = itoa_buf;
+  p += 9;
   *p-- = 0;
 
-  int sign = x < 0;
+  //int sign = x < 0;
+  int sign;
+  sign = x < 0;
   if (sign)
     x = -x;
   
@@ -221,7 +228,6 @@ itoa (int x)
 
   return p+1;
 }
-#endif
 
 void
 assert_fail (char* s)
index 7ba9cc84831233cd6a272c7916a84284bb2f4b0b..5121c9695bafc12442182ca697e2d4b0336fada2 100644 (file)
@@ -135,6 +135,35 @@ SCM cell_fun;
 
 #if 1
 
+char itoa_buf[10];
+
+char const*
+itoa (int x)
+{
+  //static char itoa_buf[10];
+  //char *p = buf+9;
+  char *p = itoa_buf;
+  p += 9;
+  *p-- = 0;
+
+  //int sign = x < 0;
+  int sign;
+  sign = x < 0;
+  if (sign)
+    x = -x;
+  
+  do
+    {
+      *p-- = '0' + (x % 10);
+      x = x / 10;
+    } while (x);
+
+  if (sign)
+    *p-- = '-';
+
+  return p+1;
+}
+
 int
 add (int a, int b)
 {
@@ -663,9 +692,8 @@ test (char *p)
   return 1;
  ok15:
 
-  puts ("t: for (i=1; i<5; ++i)\n");
-  for (i=1; i<5; ++i);
-  if (i != 5) return i;
+  puts ("t: itoa (33) == \"33\"\n");
+  if (strcmp (itoa (33), "33")) return 1;
 
   return struct_test ();
 }