shithub: mc

Download patch

ref: 97635cb8850d14b42c4e6882d0d7b6aa05485271
parent: 47188c33df351d338a569e99006bd5761bddc715
author: Ori Bernstein <[email protected]>
date: Wed Oct 2 14:52:17 EDT 2013

Fix floating point comparison.

    We now generate appropriate assembly. Hopefully.

--- a/6/insns.def
+++ b/6/insns.def
@@ -62,7 +62,7 @@
 Insn(Icvttsi2sd, "\tcvttsd2si%2t %x,%r\n",      Use(.l={1}),                    Def(.l={2}))
 Insn(Ifdiv,      "\tdiv%t %x,%r\n",             Use(.l={1},.r={Reax,Redx}),     Def(.r={Reax,Redx}))
 Insn(Ifmul,      "\tmul%t %x,%r\n",             Use(.l={1,2}),                  Def(.l={2}))
-Insn(Icomi,      "\tcomi%d %x,%r\n",            Use(.l={1,2}),                  Def())
+Insn(Icomi,      "\tcomi%t %x,%r\n",            Use(.l={1,2}),                  Def())
 
 /* branch instructions */
 Insn(Icall,     "\tcall %v\n",                  Use(.l={1}), Def(.r={Rrax}))
--- a/6/isel.c
+++ b/6/isel.c
@@ -40,17 +40,18 @@
 /* used to decide which operator is appropriate
  * for implementing various conditional operators */
 struct {
-    AsmOp test;
+    AsmOp itest;
+    AsmOp fptest;
     AsmOp jmp;
     AsmOp getflag;
 } reloptab[Numops] = {
-    [Olnot] = {Itest, Ijz, Isetz},
-    [Oeq] = {Icmp, Ijz, Isetz},
-    [One] = {Icmp, Ijnz, Isetnz},
-    [Ogt] = {Icmp, Ijg, Isetg},
-    [Oge] = {Icmp, Ijge, Isetge},
-    [Olt] = {Icmp, Ijl, Isetl},
-    [Ole] = {Icmp, Ijle, Isetle}
+    [Olnot] = {Itest, 0, Ijz, Isetz}, /* lnot invalid for floats */
+    [Oeq] = {Icmp, Icomi, Ijz, Isetz},
+    [One] = {Icmp, Icomi, Ijnz, Isetnz},
+    [Ogt] = {Icmp, Icomi, Ijg, Isetg},
+    [Oge] = {Icmp, Icomi, Ijge, Isetge},
+    [Olt] = {Icmp, Icomi, Ijl, Isetl},
+    [Ole] = {Icmp, Icomi, Ijle, Isetle}
 };
 
 static Mode mode(Node *n)
@@ -221,6 +222,14 @@
         return inr(s, a);
 }
 
+static int floatcompare(Node *e)
+{
+    if (exprop(e) == Ovar || exprop(e) == Olit)
+        return floatnode(e);
+    assert(e->expr.nargs > 0);
+    return floatnode(e->expr.args[0]);
+}
+
 /* If we're testing equality, etc, it's a bit silly
  * to generate the test, store it to a bite, expand it
  * to the right width, and then test it again. Try to optimize
@@ -236,7 +245,10 @@
     Loc *l1, *l2;
     AsmOp cond, jmp;
 
-    cond = reloptab[exprop(args[0])].test;
+    if (floatcompare(args[0]))
+        cond = reloptab[exprop(args[0])].fptest;
+    else
+        cond = reloptab[exprop(args[0])].itest;
     jmp = reloptab[exprop(args[0])].jmp;
     /* if we have a cond, we're knocking off the redundant test,
      * and want to eval the children */
@@ -542,7 +554,8 @@
             a = inr(s, selexpr(s, args[0]));
             b = locreg(ModeB);
             r = locreg(mode(n));
-            g(s, reloptab[exprop(n)].test, a, a, NULL);
+            /* lnot only valid for integer-like values */
+            g(s, reloptab[exprop(n)].itest, a, a, NULL);
             g(s, reloptab[exprop(n)].getflag, b, NULL);
             movz(s, b, r);
             break;
@@ -553,7 +566,10 @@
             a = inr(s, a);
             c = locreg(ModeB);
             r = locreg(mode(n));
-            g(s, reloptab[exprop(n)].test, b, a, NULL);
+            if (floatnode(args[0]))
+                g(s, reloptab[exprop(n)].fptest, b, a, NULL);
+            else
+                g(s, reloptab[exprop(n)].itest, b, a, NULL);
             g(s, reloptab[exprop(n)].getflag, c, NULL);
             movz(s, c, r);
             return r;