mescc: Lshift support non-fixed shift value.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 24 Mar 2017 21:32:02 +0000 (22:32 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 24 Mar 2017 21:32:02 +0000 (22:32 +0100)
* module/mes/as-i386.mes (i386:accu<<base): New function.
* module/mes/as-i386.scm: Export it.
* module/language/c99/compiler.mes (expr->accu): Use it.
* scaffold/t.c (math_test): Test it.

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

index 51d24870d8ec16ec43cd5c73b775ce1f8cd7616f..719ec5e7b9d44e3180cf09e607b6b7dd5606797f 100644 (file)
                           (list (lambda (f g ta t d)
                                   (i386:accu-base)))))))        
 
-        ((lshift ,a (p-expr (fixed ,value)))
+        ((bitwise-or ,a ,b)
          (let* ((empty (clone info #:text '()))
                 (accu ((expr->accu empty) a))
-                (value (cstring->number value)))
+                (base ((expr->base empty) b)))
            (clone info #:text
                   (append text
                           (.text accu)
+                          (.text base)
+                          (list (lambda (f g ta t d)
+                                  (i386:accu-or-base)))))))
+
+        ((lshift ,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-shl value)))))))
+                                  (i386:accu<<base)))))))
 
         ((div ,a ,b)
          (let* ((empty (clone info #:text '()))
index 287066cd02559b67fd9ead8411afa16be18f1605..a2762740682dba39c738c4ccfc771fd492d869f1 100644 (file)
   (or n accu:shl n)
   `(#xc1 #xe0 ,n))                      ; shl    $0x8,%eax
 
+(define (i386:accu<<base)
+  '(#x31 #xc9                           ; xor    %ecx,%ecx
+    #x89 #xd1                           ; mov    %edx,%ecx
+    #xd3 #xe0))                         ; shl    %cl,%eax
+
 (define (i386:accu+accu)
   '(#x01 #xc0))                         ; add    %eax,%eax
 
index 9c5fd4398349287af1757bd40189c1744ac16c0f..fa543c54080876795e08408c5d922312eec6829b 100644 (file)
@@ -46,6 +46,7 @@
             i386:accu*base
             i386:accu-base
             i386:accu-shl
+            i386:accu<<base
             i386:base-sub
             i386:base->accu
             i386:base->accu-address
index cffa2ce7593b22c857d306f61805c9e2c247c986..419e75330d8c24404c784f10d7a3454c26abf76b 100644 (file)
@@ -212,6 +212,13 @@ math_test ()
   puts ("t: 3*4=");
   i = 3 * 4;
   if (i!=12) return 1;
+
+  puts ("t: 1 << 3\n");
+  if (1 << 3 != 8) return 1 << 3;
+
+  puts ("t: 3 << 4\n");
+  if (3 << 4 != 48) return 3 << 4;
+
   return read_test ();
 }