mescc: Tinycc support: ~, ^=.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 21 Jul 2017 08:39:04 +0000 (10:39 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 26 Jul 2017 09:36:08 +0000 (11:36 +0200)
* module/mes/as-i386.mes (i386:accu-not): New function.
  (i386:accu-negate): Rename from i386:accu-not.
* module/mes/as-i386.scm (mes): Export them.
* module/language/c99/compiler.mes (expr->accu): Support ~, ^=.
* scaffold/tests/60-math.c (test): Test it.
* stage0/x86.M1 (not____%eax): New define.

module/language/c99/compiler.mes
module/mes/as-i386.mes
module/mes/as-i386.scm
scaffold/tests/60-math.c
stage0/x86.M1

index 70f0e0c0d257c05964dba0480afb49c3689f25a1..99cba7d9a773966c7395b6e03f466e0d2abfed67 100644 (file)
 
         ((add ,a ,b) ((binop->accu info) a b (i386:accu+base)))
         ((sub ,a ,b) ((binop->accu info) a b (i386:accu-base)))
-        ((bitwise-or ,a ,b) ((binop->accu info) a b (i386:accu-or-base)))
         ((bitwise-and ,a ,b) ((binop->accu info) a b (i386:accu-and-base)))
+        ((bitwise-not ,expr)
+         (let ((info ((ast->info info) expr)))
+           (append-text info (wrap-as (i386:accu-not)))))
+        ((bitwise-or ,a ,b) ((binop->accu info) a b (i386:accu-or-base)))
         ((bitwise-xor ,a ,b) ((binop->accu info) a b (i386:accu-xor-base)))
         ((lshift ,a ,b) ((binop->accu info) a b (i386:accu<<base)))
         ((rshift ,a ,b) ((binop->accu info) a b (i386:accu>>base)))
          (let* ((test-info ((ast->info info) expr)))
            (clone info #:text
                   (append (.text test-info)
-                          (wrap-as (i386:accu-not)))
+                          (wrap-as (i386:accu-negate)))
                   #:globals (.globals test-info))))
 
         ((neg (p-expr (fixed ,value)))
                                                     ((equal? op "*=") (wrap-as (i386:accu*base)))
                                                     ((equal? op "/=") (wrap-as (i386:accu/base)))
                                                     ((equal? op "%=") (wrap-as (i386:accu%base)))
-                                                    ((equal? op "|=") (wrap-as (i386:accu-or-base)))
                                                     ((equal? op "&=") (wrap-as (i386:accu-and-base)))
-                                                    (else (error "mescc: op ~a not supported: ~a\n" op o))))))))
+                                                    ((equal? op "|=") (wrap-as (i386:accu-or-base)))
+                                                    ((equal? op "^=") (wrap-as (i386:accu-xor-base)))
+                                                    (else (error (format #f "mescc: op ~a not supported: ~a\n" op o)))))))))
            (pmatch a
              ((p-expr (ident ,name)) (append-text info ((accu->ident info) name)))
              ((d-sel (ident ,field) ,p-expr)
index 06c12b7fc5d442a6b49961974ce9fb07c367e391..df5de2558c1efea398aee8673977eecee1d023a6 100644 (file)
     ("mov____%edx,%ecx")                ; mov    %edx,%ecx
     ("shr____%cl,%eax")))               ; shr    %cl,%eax
 
-(define (i386:accu-or-base)
-  '(("or_____%edx,%eax")))              ; or    %edx,%eax
-
 (define (i386:accu-and-base)
   '(("and____%edx,%eax")))              ; and    %edx,%eax
 
+(define (i386:accu-not)
+  '(("not____%eax")))                   ; not %eax
+
+(define (i386:accu-or-base)
+  '(("or_____%edx,%eax")))              ; or    %edx,%eax
+
 (define (i386:accu-xor-base)
   '(("xor____%edx,%eax")))              ; xor    %edx,%eax
 
     ("call___*%eax")                    ; call   *%eax
     ("add____$i8,%esp" (#:immediate1  ,(* n 4))))) ; add    $00,%esp
 
-(define (i386:accu-not)
+(define (i386:accu-negate)
   '(("sete___%al")                      ; sete %al
     ("movzbl_%al,%eax")))               ; movzbl %al,%eax
 
index ea6e573a7161a66e84d8a927c7a6e08c92309e97..a1c3ae48faddc6a453f55d92a45d5cbcb8f90310 100644 (file)
@@ -28,7 +28,6 @@
   #:use-module (mes guile)
   #:use-module (mes as)
   #:export (
-            i386:accu-not
             i386:accu-cmp-value
             i386:accu->base
             i386:accu->base-address
@@ -47,6 +46,8 @@
             i386:accu-base
             i386:accu-shl
             i386:accu-and-base
+            i386:accu-negate
+            i386:accu-not
             i386:accu-or-base
             i386:accu-xor-base
             i386:accu<<base
index 637f4b24afb1c71ea48e510a166b3cec68700efa..c39c5bd1f61c6f95e2bebd043ac6abad19b9d510 100644 (file)
@@ -122,6 +122,9 @@ test ()
   puts ("t: 1 & 3\n");
   if ((1 & 3) != 1) return 1;
 
+  puts ("t: ~0\n");
+  if (~0 != -1) return 1;
+
   puts ("t: 1 | 3\n");
   if ((1 | 2) != 3) return 1;
 
index d8d55115de8da6125e5736eed531b159a53590c4..b4d722ab5aa24c6969466cb1887943cdbd51ab74 100644 (file)
@@ -48,6 +48,7 @@ DEFINE lea____0x8(%ebp),%eax 8d45
 DEFINE lea____0x8(%ebp),%edx 8d55
 DEFINE leave c9
 DEFINE nop 90
+DEFINE not____%eax f7d0
 DEFINE mov____$i32,%eax b8
 DEFINE mov____$i32,%ebx bb
 DEFINE mov____$i32,%ecx b9