diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-04-30 04:12:40 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-04-30 04:12:40 +0000 |
| commit | 3b203865514c9b8d85ea5e3a73e260291e98c36a (patch) | |
| tree | 88e8a70caafcaca4170a08356996b4d4c70f31df /llvm/lib | |
| parent | 4a2cc6603d09198ec5f447c0775d293167ebfde0 (diff) | |
| download | bcm5719-llvm-3b203865514c9b8d85ea5e3a73e260291e98c36a.tar.gz bcm5719-llvm-3b203865514c9b8d85ea5e3a73e260291e98c36a.zip | |
Add support for llvm.sqrt and sin/cos if unsafe math optimizations are enabled.
llvm-svn: 21631
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelSimple.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelSimple.cpp b/llvm/lib/Target/X86/X86ISelSimple.cpp index cd0c0d31475..9ab05c33aab 100644 --- a/llvm/lib/Target/X86/X86ISelSimple.cpp +++ b/llvm/lib/Target/X86/X86ISelSimple.cpp @@ -26,6 +26,7 @@ #include "llvm/CodeGen/SSARegMap.h" #include "llvm/Target/MRegisterInfo.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetOptions.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/InstVisitor.h" #include "llvm/ADT/Statistic.h" @@ -1744,6 +1745,25 @@ void X86ISel::visitCallInst(CallInst &CI) { BuildMI(BB, X86::FABS, 1, DestReg).addReg(op1Reg); return; } + } else if (F->getName() == "sin" && UnsafeFPMath || F->getName() == "sinf") { + if (CI.getNumOperands() == 2 && // Basic sanity checks. + CI.getOperand(1)->getType()->isFloatingPoint() && + CI.getType() == CI.getOperand(1)->getType()) { + unsigned op1Reg = getReg(CI.getOperand(1)); + unsigned DestReg = getReg(CI); + BuildMI(BB, X86::FSIN, 1, DestReg).addReg(op1Reg); + return; + } + } + else if (F->getName() == "cos" && UnsafeFPMath || F->getName() == "cosf") { + if (CI.getNumOperands() == 2 && // Basic sanity checks. + CI.getOperand(1)->getType()->isFloatingPoint() && + CI.getType() == CI.getOperand(1)->getType()) { + unsigned op1Reg = getReg(CI.getOperand(1)); + unsigned DestReg = getReg(CI); + BuildMI(BB, X86::FCOS, 1, DestReg).addReg(op1Reg); + return; + } } // Emit a CALL instruction with PC-relative displacement. @@ -1780,6 +1800,7 @@ void X86ISel::LowerUnknownIntrinsicFunctionCalls(Function &F) { case Intrinsic::memcpy: case Intrinsic::memset: case Intrinsic::isunordered: + case Intrinsic::sqrt: case Intrinsic::readport: case Intrinsic::writeport: // We directly implement these intrinsics @@ -1860,6 +1881,12 @@ void X86ISel::visitIntrinsicCall(Intrinsic::ID ID, CallInst &CI) { BuildMI(BB, X86::SETPr, 0, TmpReg2); return; + case Intrinsic::sqrt: + TmpReg1 = getReg(CI.getOperand(1)); + TmpReg2 = getReg(CI); + BuildMI(BB, X86::FSQRT, 1, TmpReg2).addReg(TmpReg1); + return; + case Intrinsic::memcpy: { assert(CI.getNumOperands() == 5 && "Illegal llvm.memcpy call!"); unsigned Align = 1; |

