summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-08-13 15:49:19 -0400
committerRuss Cox <rsc@golang.org>2014-08-13 15:49:19 -0400
commitdf0ee6bbcfb9b7cfb497347df464563ac8a3aefe (patch)
treeed3fecf2752b1693091f743653e84989b674e458
parentc0e9275f05847d76e747f0161d2ea11d0fb2e521 (diff)
downloadgo-df0ee6bbcfb9b7cfb497347df464563ac8a3aefe.tar.gz
[dev.power64] cmd/9g: fix floating-point comparison for NaN
LGTM=minux R=minux CC=golang-codereviews https://codereview.appspot.com/127300043
-rw-r--r--src/cmd/9g/cgen.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/cmd/9g/cgen.c b/src/cmd/9g/cgen.c
index a8d628f43..6bb44f547 100644
--- a/src/cmd/9g/cgen.c
+++ b/src/cmd/9g/cgen.c
@@ -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;