diff options
-rw-r--r-- | lib/Target/X86/InstSelectSimple.cpp | 9 | ||||
-rw-r--r-- | lib/Target/X86/X86ISelSimple.cpp | 9 |
2 files changed, 18 insertions, 0 deletions
diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index abfcad1566..45df82906b 100644 --- a/lib/Target/X86/InstSelectSimple.cpp +++ b/lib/Target/X86/InstSelectSimple.cpp @@ -702,6 +702,15 @@ unsigned ISel::EmitComparison(unsigned OpNum, Value *Op0, Value *Op1, return OpNum; } + // Special case handling of comparison against +/- 0.0 + if (ConstantFP *CFP = dyn_cast<ConstantFP>(Op1)) + if (CFP->isExactlyValue(+0.0) || CFP->isExactlyValue(-0.0)) { + BMI(MBB, IP, X86::FTST, 1).addReg(Op0r); + BMI(MBB, IP, X86::FNSTSWr8, 0); + BMI(MBB, IP, X86::SAHF, 1); + return OpNum; + } + unsigned Op1r = getReg(Op1, MBB, IP); switch (Class) { default: assert(0 && "Unknown type class!"); diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp index abfcad1566..45df82906b 100644 --- a/lib/Target/X86/X86ISelSimple.cpp +++ b/lib/Target/X86/X86ISelSimple.cpp @@ -702,6 +702,15 @@ unsigned ISel::EmitComparison(unsigned OpNum, Value *Op0, Value *Op1, return OpNum; } + // Special case handling of comparison against +/- 0.0 + if (ConstantFP *CFP = dyn_cast<ConstantFP>(Op1)) + if (CFP->isExactlyValue(+0.0) || CFP->isExactlyValue(-0.0)) { + BMI(MBB, IP, X86::FTST, 1).addReg(Op0r); + BMI(MBB, IP, X86::FNSTSWr8, 0); + BMI(MBB, IP, X86::SAHF, 1); + return OpNum; + } + unsigned Op1r = getReg(Op1, MBB, IP); switch (Class) { default: assert(0 && "Unknown type class!"); |