From 27e657ef68a67b3160358f6ab20f6338bbf30706 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 13 Aug 2014 15:49:19 -0400 Subject: [PATCH] [dev.power64] cmd/9g: fix floating-point comparison for NaN LGTM=minux R=minux CC=golang-codereviews https://golang.org/cl/127300043 --- src/cmd/9g/cgen.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/cmd/9g/cgen.c b/src/cmd/9g/cgen.c index a8d628f43b..6bb44f547c 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;