mescc: Tinycc support: Respect word size better.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 3 Dec 2017 15:33:35 +0000 (16:33 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 3 Dec 2017 15:33:35 +0000 (16:33 +0100)
* stage0/x86.M1 (movzwl_0x32(%ebp),%eax,movzwl_0x8(%ebp),%eax): New
  define.
* module/mes/as-i386.mes (i386:push-word-local-de-ref,
  i386:word-local->accu): New function.
* module/mes/as-i386.scm: Export them.
* module/language/c99/compiler.mes (push-local-de-ref): Respect word size.
  (ident->accu): Likewise.

module/language/c99/compiler.mes
module/mes/as-i386.mes
module/mes/as-i386.scm
stage0/x86.M1

index e45a6b464a3894728d84419c401f26481881578d..f07edbb66902f6d723a7264e10d2279e3e9e84de 100644 (file)
            (ptr (local:pointer local))
            (size (if (= ptr 1) (ast-type->size info (local:type o))
                      4)))
-      (if (= size 1)
-          (wrap-as (i386:push-byte-local-de-ref (local:id o)))
-          (wrap-as (i386:push-local-de-ref (local:id o)))))))
+      (case size
+        ((1) (wrap-as (i386:push-byte-local-de-ref (local:id o))))
+        ((2) (wrap-as (i386:push-word-local-de-ref (local:id o))))
+        ((4) (wrap-as (i386:push-local-de-ref (local:id o))))
+        (else (error (format #f "TODO: push size >4: ~a\n" size)))))))
 
 (define (push-local-de-de-ref info)
   (lambda (o)
                  (size (if (= ptr 0) (ast-type->size info type)
                            4)))
             (cond ((< ptr 0) (wrap-as (i386:local-ptr->accu (local:id local))))
-                  (else (wrap-as (if (= size 1) (i386:byte-local->accu (local:id local))
-                                     (i386:local->accu (local:id local)))))))
+                  (else (wrap-as (case size
+                                   ((1) (i386:byte-local->accu (local:id local)))
+                                   ((2) (i386:word-local->accu (local:id local)))
+                                   (else (i386:local->accu (local:id local))))))))
           (if global
               (let* ((ptr (ident->pointer info o)))
                 (cond ((< ptr 0) (list (i386:label->accu `(#:address ,o))))
index c280fdd8a83275b298f1c9899a10120eb6de62b9..c4eca7c0e5fbd7301e625303fb21a4602950bedc 100644 (file)
       ("movzbl_(%eax),%eax")
       ("push___%eax"))))
 
+(define (i386:push-word-local-de-ref n)
+  (or n (error "invalid value: push-word-local-de-ref: " n))
+  (let ((n (- 0 (* 4 n))))
+    `(,(if (< (abs n) #x80) `("mov____0x8(%ebp),%eax" (#:immediate1 ,n))
+           `("mov____0x32(%ebp),%eax" (#:immediate ,n)))
+      ("movzwl_(%eax),%eax")
+      ("push___%eax"))))
+
 (define (i386:push-byte-local-de-de-ref n)
   (or n (error "invalid value: push-byte-local-de-de-ref: " n))
   (let ((n (- 0 (* 4 n))))
     `(,(if (< (abs n) #x80) `("movzbl_0x8(%ebp),%eax" (#:immediate1 ,n))
            `("movzbl_0x32(%ebp),%eax" (#:immediate ,n))))))
 
+(define (i386:word-local->accu n)
+  (or n (error "invalid value: word-local->accu: " n))
+  (let ((n (- 0 (* 4 n))))
+    `(,(if (< (abs n) #x80) `("movzwl_0x8(%ebp),%eax" (#:immediate1 ,n))
+           `("movzwl_0x32(%ebp),%eax" (#:immediate ,n))))))
+
 (define (i386:byte-local->base n)
   (or n (error "invalid value: byte-local->base: " n))
   (let ((n (- 0 (* 4 n))))
index ea6dd7e8ff809147206c01758292800fdafbbb4b..4df6886454eb513b141a5e6d4a1ff84613c35581 100644 (file)
@@ -47,6 +47,7 @@
             i386:accu->local+n
             i386:byte-accu->local+n
             i386:word-accu->local+n
+            i386:accu->local+n
             i386:accu-and-base
             i386:accu-base
             i386:accu-cmp-value
@@ -78,6 +79,7 @@
             i386:byte-base-mem->accu
             i386:byte-base-sub
             i386:byte-local->accu
+            i386:word-local->accu
             i386:byte-local->base
             i386:byte-mem->accu
             i386:word-mem->accu
             i386:push-base
             i386:push-byte-local-de-de-ref
             i386:push-byte-local-de-ref
+            i386:push-word-local-de-ref
             i386:push-label
             i386:push-label-mem
             i386:push-local
index c6f74522f479a6d05649978b9d92b987b99dfee0..ca7cf5d5b0e0d2f0d0ef5b7011485a886a740860 100644 (file)
@@ -150,7 +150,9 @@ DEFINE movzbl_0x8(%ebp),%eax 0fb645
 DEFINE movzbl_0x8(%ebp),%edx 0fb655
 DEFINE movzwl_(%eax),%eax 0fb700
 DEFINE movzwl_0x32(%eax),%eax 0fb780
+DEFINE movzwl_0x32(%ebp),%eax 0fb785
 DEFINE movzwl_0x8(%eax),%eax 0fb740
+DEFINE movzwl_0x8(%ebp),%eax 0fb745
 DEFINE mul____%edx f7e2
 DEFINE nop 90
 DEFINE not____%eax f7d0