From 10fbaec24779cf6bed3610d5dc1a163ce78e918d Mon Sep 17 00:00:00 2001 From: Matt Pharr Date: Thu, 21 Jun 2012 09:57:19 -0700 Subject: [PATCH] Fix C++ output for unordered fp compares. Fixes a bug introduced in 46716aada33d029010d92e6f52ef6a82a55ab10f. --- cbackend.cpp | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/cbackend.cpp b/cbackend.cpp index 086f1d5a..732d26d6 100644 --- a/cbackend.cpp +++ b/cbackend.cpp @@ -3233,17 +3233,22 @@ void CWriter::visitFCmpInst(FCmpInst &I) { return; } + // Note that we always generate calls to the ordered functions here, + // since the regular C++ comparison ops should give us what we + // originally wanted when we generated the unordered ones from the + // ispc source. + if (isVector) { switch (I.getPredicate()) { default: llvm_unreachable("Illegal FCmp predicate"); case FCmpInst::FCMP_ORD: Out << "__ordered("; break; case FCmpInst::FCMP_UNO: Out << "__cmpunord("; break; - case FCmpInst::FCMP_UEQ: Out << "__ucomeq("; break; - case FCmpInst::FCMP_UNE: Out << "__ucomneq("; break; - case FCmpInst::FCMP_ULT: Out << "__ucomlt("; break; - case FCmpInst::FCMP_ULE: Out << "__ucomle("; break; - case FCmpInst::FCMP_UGT: Out << "__ucomgt("; break; - case FCmpInst::FCMP_UGE: Out << "__ucomge("; break; + case FCmpInst::FCMP_UEQ: Out << "__equal("; break; + case FCmpInst::FCMP_UNE: Out << "__not_equal("; break; + case FCmpInst::FCMP_ULT: Out << "__less_than("; break; + case FCmpInst::FCMP_ULE: Out << "__less_equal("; break; + case FCmpInst::FCMP_UGT: Out << "__greater_than("; break; + case FCmpInst::FCMP_UGE: Out << "__greater_equal("; break; case FCmpInst::FCMP_OEQ: Out << "__equal("; break; case FCmpInst::FCMP_ONE: Out << "__not_equal("; break; case FCmpInst::FCMP_OLT: Out << "__less_than("; break; @@ -3258,12 +3263,14 @@ void CWriter::visitFCmpInst(FCmpInst &I) { default: llvm_unreachable("Illegal FCmp predicate"); case FCmpInst::FCMP_ORD: op = "ord"; break; case FCmpInst::FCMP_UNO: op = "uno"; break; - case FCmpInst::FCMP_UEQ: op = "ueq"; break; - case FCmpInst::FCMP_UNE: op = "une"; break; - case FCmpInst::FCMP_ULT: op = "ult"; break; - case FCmpInst::FCMP_ULE: op = "ule"; break; - case FCmpInst::FCMP_UGT: op = "ugt"; break; - case FCmpInst::FCMP_UGE: op = "uge"; break; + + case FCmpInst::FCMP_UEQ: op = "oeq"; break; + case FCmpInst::FCMP_UNE: op = "one"; break; + case FCmpInst::FCMP_ULT: op = "olt"; break; + case FCmpInst::FCMP_ULE: op = "ole"; break; + case FCmpInst::FCMP_UGT: op = "ogt"; break; + case FCmpInst::FCMP_UGE: op = "oge"; break; + case FCmpInst::FCMP_OEQ: op = "oeq"; break; case FCmpInst::FCMP_ONE: op = "one"; break; case FCmpInst::FCMP_OLT: op = "olt"; break;