mescc: Support &, ^.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 6 May 2017 12:57:39 +0000 (14:57 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 6 May 2017 12:57:39 +0000 (14:57 +0200)
* module/mes/as-i386.mes (i386:accu-and-base, i386:accu-xor-base): New functions.
* module/mes/as-i386.scm: Export them.
* module/language/c99/compiler.mes (expr->accu): Support bitwise-and, bitwise-xor.

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

index 490e6c2118e067ee97d4c26c94d8da8597a2b7f3..1bc6900c695c58d7864786329db20ec0fb11c609 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-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)))
         ((div ,a ,b) ((binop->accu info) a b (i386:accu/base)))
         ((le ,a ,b) ((binop->accu info) b a (i386:base-sub)))
         ((lt ,a ,b) ((binop->accu info) b a (i386:base-sub)))
 
+        ((or ,a ,b)
+         (let* ((empty (clone info #:text '()))
+                (b-length (length (append (i386:Xjump-nz 0)
+                                          (i386:accu-test))))
+                (info ((expr->accu info) a))
+                (info (append-text info (wrap-as (i386:accu-test))))
+                (info (append-text info (wrap-as (append (i386:Xjump-nz (- b-length 1))
+                                                         (i386:accu-test)))))
+                (info ((expr->accu info) b))
+                (info (append-text info (wrap-as (i386:accu-test)))))
+           info))
+
+        ((and ,a ,b)
+         (let* ((empty (clone info #:text '()))
+                (b-length (length (append (i386:Xjump-z 0)
+                                          (i386:accu-test))))
+                (info ((expr->accu info) a))
+                (info (append-text info (wrap-as (i386:accu-test))))
+                (info (append-text info (wrap-as (append (i386:Xjump-z (- b-length 1))
+                                                         (i386:accu-test)))))
+                (info ((expr->accu info) b))
+                (info (append-text info (wrap-as (i386:accu-test)))))
+           info))
+
         ((cast ,cast ,o)
          ((expr->accu info) o))
 
index c325729b5ef527cf1fb0b3fa34afe640bbd57b2f..3ffa64487eee2711f4ad4e4281ef79b926b247b1 100644 (file)
 (define (i386:accu-or-base)
   '(#x09 #xd0))                         ; or    %edx,%eax
 
+(define (i386:accu-and-base)
+  '(#x21 #xd0))                         ; and    %edx,%eax
+
+(define (i386:accu-xor-base)
+  '(#x31 #xd0))                         ; and    %edx,%eax
+
 (define (i386:accu+accu)
   '(#x01 #xc0))                         ; add    %eax,%eax
 
index 330d9bb3da60bf2b34b6ffbab8f4696b6b5dfed4..b5e1c8f886bdfb04260c381381b13768ce40ee5c 100644 (file)
@@ -46,7 +46,9 @@
             i386:accu*base
             i386:accu-base
             i386:accu-shl
+            i386:accu-and-base
             i386:accu-or-base
+            i386:accu-xor-base
             i386:accu<<base
             i386:accu>>base
             i386:base-sub
index d2b4861d13bd76401b1db26d04ce50a23df0dec9..227efca109e205226cd9457c173b862b033aa026 100644 (file)
@@ -332,6 +332,15 @@ math_test ()
   puts ("t: -1 + 2\n");
   if (-1 + 2 != 1) return 1;
 
+  puts ("t: 1 & 3\n");
+  if ((1 & 3) != 1) return 1;
+
+  puts ("t: 1 | 3\n");
+  if ((1 | 2) != 3) return 1;
+
+  puts ("t: ^ 1 \n");
+  if ((1 ^ 3) != 2) return 1;
+
   return array_test (env);
 }