diff --git a/cbackend.cpp b/cbackend.cpp index 41614f26..7eaa7abe 100644 --- a/cbackend.cpp +++ b/cbackend.cpp @@ -3785,11 +3785,6 @@ void CWriter::visitFCmpInst(llvm::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) { Out << lPredicateToString(I.getPredicate()); Out << "_"; @@ -3803,12 +3798,12 @@ void CWriter::visitFCmpInst(llvm::FCmpInst &I) { case llvm::FCmpInst::FCMP_ORD: op = "ord"; break; case llvm::FCmpInst::FCMP_UNO: op = "uno"; break; - case llvm::FCmpInst::FCMP_UEQ: op = "oeq"; break; - case llvm::FCmpInst::FCMP_UNE: op = "one"; break; - case llvm::FCmpInst::FCMP_ULT: op = "olt"; break; - case llvm::FCmpInst::FCMP_ULE: op = "ole"; break; - case llvm::FCmpInst::FCMP_UGT: op = "ogt"; break; - case llvm::FCmpInst::FCMP_UGE: op = "oge"; break; + case llvm::FCmpInst::FCMP_UEQ: op = "ueq"; break; + case llvm::FCmpInst::FCMP_UNE: op = "une"; break; + case llvm::FCmpInst::FCMP_ULT: op = "ult"; break; + case llvm::FCmpInst::FCMP_ULE: op = "ule"; break; + case llvm::FCmpInst::FCMP_UGT: op = "ugt"; break; + case llvm::FCmpInst::FCMP_UGE: op = "uge"; break; case llvm::FCmpInst::FCMP_OEQ: op = "oeq"; break; case llvm::FCmpInst::FCMP_ONE: op = "one"; break; diff --git a/tests/isnan.ispc b/tests/isnan.ispc new file mode 100644 index 00000000..1cbf928e --- /dev/null +++ b/tests/isnan.ispc @@ -0,0 +1,39 @@ + +export uniform int width() { return programCount; } + +export void f_v(uniform float RET[]) { + int errors = 0; + for (uniform int i = -2; i <= 2; ++i) { + float f = log((float)i); + + if ((i < 0) && (!isnan(f))) errors ++; + if ((i >= 0) && isnan(f)) errors ++; + } + + for (uniform int i = -2; i <= 2; ++i) { + uniform float f = log((uniform float)i); + + if ((i < 0) && (!isnan(f))) errors ++; + if ((i >= 0) && isnan(f)) errors ++; + } + + for (uniform int i = -2; i <= 2; ++i) { + double f = log((double)i); + + if ((i < 0) && (!isnan(f))) errors ++; + if ((i >= 0) && isnan(f)) errors ++; + } + + for (uniform int i = -2; i <= 2; ++i) { + uniform double f = log((uniform double)i); + + if ((i < 0) && (!isnan(f))) errors ++; + if ((i >= 0) && isnan(f)) errors ++; + } + + RET[programIndex] = errors; +} + +export void result(uniform float RET[]) { + RET[programIndex] = 0; +}