diff options
author | Russ Cox <rsc@golang.org> | 2014-08-13 15:49:19 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-08-13 15:49:19 -0400 |
commit | df0ee6bbcfb9b7cfb497347df464563ac8a3aefe (patch) | |
tree | ed3fecf2752b1693091f743653e84989b674e458 | |
parent | c0e9275f05847d76e747f0161d2ea11d0fb2e521 (diff) | |
download | go-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.c | 19 |
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; |