mescc: Another attempt at divide.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 7 Oct 2018 13:15:45 +0000 (15:15 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 7 Oct 2018 13:15:45 +0000 (15:15 +0200)
* module/mescc/i386/as.scm (i386:r0/r1): Never be signed.  Use div for unsigned.
(i386:r0%r1): Likewise.
* module/mescc/x86_64/as.scm (x86_64:r0/r1): Likewise.
(x86_64:r0%r1): Likewise.
* lib/x86-mes/x86.M1: Add div.
* lib/x86_64-mes/x86_64.M1: Likewise.

lib/x86-mes/x86.M1
lib/x86_64-mes/x86_64.M1
module/mescc/i386/as.scm
module/mescc/x86_64/as.scm

index 4e850b349b01761a53e9d409fdb1f94cd0c5a183..c36e46ee5c9ed65c9e1c678490744fc3784e03cd 100644 (file)
@@ -17,7 +17,7 @@
 ### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
 
 # reduced instruction set: eax, ebx (some ecx for shift, edx for mul, div)
-# 191 instructions
+# 193 instructions
 
 DEFINE add____$i32,%eax 05
 DEFINE add____$i32,%ebx 81c3
@@ -53,6 +53,7 @@ DEFINE cltd 99
 DEFINE cmp____$0x32,%eax 3d
 DEFINE cmp____$i32,%eax 3d
 DEFINE cmp____$i8,%eax 83f8
+DEFINE div___%ebx f7f3
 DEFINE hlt f4
 DEFINE idiv___%ebx f7fb
 DEFINE int cd
index a7b26bccf5cd6682b1626ba0f33af675d371df60..364adb7dc44ee4daf264c05efd41d265280e287c 100644 (file)
@@ -18,7 +18,7 @@
 
 # reduced instruction set: rax, rdi (some rcx for shift, rdx for mul, div)
 # and r10 as i64 immediate helper
-# 211 instructions
+# 212 instructions
 
 DEFINE add____$i32,%rax 4805
 DEFINE add____$i32,%rbp 4881c5
@@ -57,6 +57,7 @@ DEFINE cmp____$i8,%rax 4883f8
 DEFINE cmp____%r15,%rax 4c39f8
 DEFINE cmp____%r15,%rdi 4c39ff
 DEFINE cqto 4899
+DEFINE div___%rdi 48f7f7
 DEFINE hlt f4
 DEFINE idiv___%rdi 48f7ff
 DEFINE ja32  0f87
index 178ab98e9da9b32c2a93c96a67ab00a41bc53de4..3256a323a77f69f2a31b892e5419513a5abdbd18 100644 (file)
     `((,(string-append "and____%" r1 ",%" r0)))))
 
 (define (i386:r0/r1 info signed?)
-  (let ((allocated (.allocated info))
+  (let ((signed? #f)              ; nobody knows, -- all advice are belong to us?
+        (allocated (.allocated info))
         (r0 (get-r0 info))
         (r1 (get-r1 info)))
     (if (not (member "edx" allocated))
                 `(("push___%eax")
                   (,(string-append "mov____%" r0 ",%eax"))))
           ,(if signed? '("cltd") '("xor____%edx,%edx"))
-          (,(string-append "idiv___%" r1))
+          ,(if signed? `(,(string-append "idiv___%" r1)) `(,(string-append "div___%" r1)))
           ,@(if (equal? r0 "eax") '()
                 `((,(string-append "mov____%eax,%" r0))
                   ("pop____%eax"))))
           (,(string-append "mov____%" r1 ",%ebx"))
           (,(string-append "mov____%" r0 ",%eax"))
           ,(if signed? '("cltd") '("xor____%edx,%edx"))
-          (,(string-append "idiv___%ebx"))
+          ,(if signed? `(,(string-append "idiv___%ebx")) `(,(string-append "div___%ebx")))
           ("pop____%edx")
           ("pop____%ebx")
           (,(string-append "mov____%eax,%" r0))
           ("pop____%eax")))))
 
 (define (i386:r0%r1 info signed?)
-  (let ((allocated (.allocated info))
+  (let ((signed? #f)              ; nobody knows, -- all advice are belong to us?
+        (allocated (.allocated info))
         (r0 (get-r0 info))
         (r1 (get-r1 info)))
     (if (not (member "edx" allocated))
                 `(("push___%eax")
                   (,(string-append "mov____%" r0 ",%eax"))))
           ,(if signed? '("cltd") '("xor____%edx,%edx"))
-          (,(string-append "idiv___%" r1))
+          ,(if signed? `(,(string-append "idiv___%" r1)) `(,(string-append "div___%" r1)))
           (,(string-append "mov____%edx,%" r0)))
         `(("push___%eax")
           ("push___%ebx")
           (,(string-append "mov____%" r1 ",%ebx"))
           (,(string-append "mov____%" r0 ",%eax"))
           ,(if signed? '("cltd") '("xor____%edx,%edx"))
-          (,(string-append "idiv___%ebx"))
+          ,(if signed? `(,(string-append "idiv___%ebx")) `(,(string-append "div___%ebx")))
           ("pop____%edx")
           ("pop____%ebx")
           (,(string-append "mov____%edx,%" r0))
index 968d7c4beb2a218597df27189aeeef86abf71b27..9bc6d1f7b00ea80676a7a24addd6c2dd3d266121 100644 (file)
     `((,(string-append "and____%" r1 ",%" r0)))))
 
 (define (x86_64:r0/r1 info signed?)
-  (let ((allocated (.allocated info))
+  (let ((signed? #f)              ; nobody knows, -- all advice are belong to us?
+        (allocated (.allocated info))
         (r0 (get-r0 info))
         (r1 (get-r1 info)))
     (if (not (member "rdx" allocated))
                 `(("push___%rax")
                   (,(string-append "mov____%" r0 ",%rax"))))
           ,(if signed? '("cqto") '("xor____%rdx,%rdx"))
-          (,(string-append "idiv___%" r1))
+          ,(if signed? `(,(string-append "idiv___%" r1)) `(,(string-append "div___%" r1)))
           ,@(if (equal? r0 "rax") '()
                 `((,(string-append "mov____%rax,%" r0))
                   ("pop____%rax"))))
           (,(string-append "mov____%" r1 ",%rdi"))
           (,(string-append "mov____%" r0 ",%rax"))
           ,(if signed? '("cqto") '("xor____%rdx,%rdx"))
-          (,(string-append "idiv___%rdi"))
+          ,(if signed? `(,(string-append "idiv___%rdi")) `(,(string-append "div___%rdi")))
           ("pop____%rdx")
           ("pop____%rdi")
           (,(string-append "mov____%rax,%" r0))
           ("pop____%rax")))))
 
 (define (x86_64:r0%r1 info signed?)
-  (let ((allocated (.allocated info))
+  (let ((signed? #f)              ; nobody knows, -- all advice are belong to us?
+        (allocated (.allocated info))
         (r0 (get-r0 info))
         (r1 (get-r1 info)))
     (if (not (member "rdx" allocated))
                 `(("push___%rax")
                   (,(string-append "mov____%" r0 ",%rax"))))
           ,(if signed? '("cqto") '("xor____%rdx,%rdx"))
-          (,(string-append "idiv___%" r1))
+          ,(if signed? `(,(string-append "idiv___%" r1)) `(,(string-append "div___%" r1)))
           (,(string-append "mov____%rdx,%" r0)))
         `(("push___%rax")
           ("push___%rdi")
           (,(string-append "mov____%" r1 ",%rdi"))
           (,(string-append "mov____%" r0 ",%rax"))
           ,(if signed? '("cqto") '("xor____%rdx,%rdx"))
-          (,(string-append "idiv___%rdi"))
+          ,(if signed? `(,(string-append "idiv___%rdi")) `(,(string-append "div___%rdi")))
           ("pop____%rdx")
           ("pop____%rdi")
           (,(string-append "mov____%rdx,%" r0))