]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.power64] cmd/9g: fix floating-point comparison for NaN
authorRuss Cox <rsc@golang.org>
Wed, 13 Aug 2014 19:49:19 +0000 (15:49 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 13 Aug 2014 19:49:19 +0000 (15:49 -0400)
LGTM=minux
R=minux
CC=golang-codereviews
https://golang.org/cl/127300043

src/cmd/9g/cgen.c

index a8d628f43b3abb07cb992af280634cb796c8cf70..6bb44f547c74468ff6402a9db5b8b5397dccaf17 100644 (file)
@@ -1267,12 +1267,21 @@ bgen(Node *n, int true, int likely, Prog *to)
                l = &n1;
                r = &n2;
                gins(optoas(OCMP, nr->type), l, r);
-
-               // TODO(minux): determine the reason for failed test/floatcmp.go.
-               // we might need to specially handle floating point comparisons.
-               /*if(isfloat[nr->type->etype] && (n->op == OEQ || n->op == ONE)) {
-               } else*/
+               if(isfloat[nr->type->etype] && (n->op == OLE || n->op == OGE)) {
+                       // To get NaN right, must rewrite x <= y into separate x < y or x = y.
+                       switch(n->op) {
+                       case OLE:
+                               a = OLT;
+                               break;
+                       case OGE:
+                               a = OGT;
+                               break;
+                       }
                        patch(gbranch(optoas(a, nr->type), nr->type, likely), to);
+                       patch(gbranch(optoas(OEQ, nr->type), nr->type, likely), to);                    
+               } else {
+                       patch(gbranch(optoas(a, nr->type), nr->type, likely), to);
+               }
                regfree(&n1);
                regfree(&n2);
                break;