mescc: Support rshift, have guile-mini-mes pass math test.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 25 Mar 2017 17:48:40 +0000 (18:48 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 25 Mar 2017 17:48:40 +0000 (18:48 +0100)
* module/mes/as-i386.mes (i386:accu>>base): New function.
* module/mes/as-i386.scm (mes): Export it.
* module/language/c99/compiler.mes (expr->accu): Support rshift.
* scaffold/t.c (math_test): Test it.
* scaffold/mini-mes.c (ash): Use it.

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

index 719ec5e7b9d44e3180cf09e607b6b7dd5606797f..d22bd35178da9467a431b46a56902b0e3a666a58 100644 (file)
                           (list (lambda (f g ta t d)
                                   (i386:accu<<base)))))))
 
+        ((rshift ,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)))))))
+
         ((div ,a ,b)
          (let* ((empty (clone info #:text '()))
                 (accu ((expr->accu empty) a))
                           (list (lambda (f g ta t d)
                                   (i386:base-sub)))))))
 
+        ;; HMM
+        ((lshift . _) ((expr->accu info) o))
+        ((rshift . _) ((expr->accu info) o))
+
         ;; TODO: byte dinges
         ((Xsub ,a ,b)
          (let* ((base ((expr->base info) a))
index 9806f0e0c61f4e6691df6f0156f7c5200baee200..82bc844c0403b270e75c96bea8f6fd3253324213 100644 (file)
     #x89 #xd1                           ; mov    %edx,%ecx
     #xd3 #xe0))                         ; shl    %cl,%eax
 
+(define (i386:accu>>base)
+  '(#x31 #xc9                           ; xor    %ecx,%ecx
+    #x89 #xd1                           ; mov    %edx,%ecx
+    #xd3 #xe8))                         ; shr    %cl,%eax
+
 (define (i386:accu-or-base)
   '(#x09 #xd0))                         ; or    %edx,%eax
 
index 7f094c076bb2dfd8dd785433d927d2df5a87b984..2456ad9c10ced90fcb2ac7bba50fc9e38b57dd37 100644 (file)
@@ -48,6 +48,7 @@
             i386:accu-shl
             i386:accu-or-base
             i386:accu<<base
+            i386:accu>>base
             i386:base-sub
             i386:base->accu
             i386:base->accu-address
index d5a4bcb46eb9f839aea95b0181241e5cd55b931a..9032fe8fd24af4e5a0f44d500930a93118456c42 100644 (file)
@@ -1278,9 +1278,10 @@ ash (SCM n, SCM count)
 #if __GNUC__
   return MAKE_NUMBER ((ccount < 0) ? cn >> -ccount : cn << ccount);
 #else
-  //FIXME
-  assert (ccount >= 0);
-  return MAKE_NUMBER (cn << ccount);
+  int x;
+  if (ccount < 0) x = cn >> INT_MIN - ccount;
+  else x = cn << ccount;
+  return MAKE_NUMBER (x);
 #endif
 }
 
index 0a620d6761ae3ecd1d42097d7c44a4f2f42c3dac..459c61782b99dfe7c536d02eb5e20e3e62024293 100644 (file)
@@ -219,9 +219,22 @@ math_test ()
   puts ("t: 3 << 4\n");
   if (3 << 4 != 48) return 3 << 4;
 
+  puts ("t: 48 >> 3\n");
+  if (48 >> 4 != 3) return 48 >> 4;
+
+  puts ("t: 10 >> 1\n");
+  if (10 >> 1 != 5) return 10 >> 1;
+
   puts ("t: 1 | 4\n");
   if ((1 | 4) != 5) return 1 | 4;
 
+  i = -3;
+  puts ("t: -i\n");
+  if (-i != 3) return -i;
+
+  puts ("t: -1 + 2\n");
+  if (-1 + 2 != 1) return -1 + 2;
+
   return read_test ();
 }
 
@@ -566,6 +579,9 @@ test (char *p)
   puts ("t: 1 << 3\n");
   if (1 << 3 != 8) return 1;
 
+  puts ("t: 8 >> 3\n");
+  if (8 >> 3 != 1) return 1;
+
   puts ("t: 8 / 4\n");
   if (8 / 4 != 2) return 1;