diff options
author | Evan Cheng <evan.cheng@apple.com> | 2013-01-30 22:56:35 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2013-01-30 22:56:35 +0000 |
commit | a66f40a8cc685b2869e7f8d988f9a17439875ece (patch) | |
tree | b78131ccddb8e0ee0ec63179995908bb5a500c48 /lib | |
parent | bc977bab42fb3f45df054af63b4bd748300f005a (diff) | |
download | external_llvm-a66f40a8cc685b2869e7f8d988f9a17439875ece.zip external_llvm-a66f40a8cc685b2869e7f8d988f9a17439875ece.tar.gz external_llvm-a66f40a8cc685b2869e7f8d988f9a17439875ece.tar.bz2 |
Restrict sin/cos optimization to 64-bit only for now. 32-bit is a bit messy and less critical.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173987 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 21 | ||||
-rw-r--r-- | lib/Target/X86/X86Subtarget.cpp | 3 |
2 files changed, 14 insertions, 10 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 0a53a3e..36d1ad4 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -1294,7 +1294,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM) if (Subtarget->hasSinCos()) { setLibcallName(RTLIB::SINCOS_F32, "sincosf"); setLibcallName(RTLIB::SINCOS_F64, "sincos"); - if (Subtarget->isTargetDarwin() && Subtarget->is64Bit()) { + if (Subtarget->isTargetDarwin()) { // For MacOSX, we don't want to the normal expansion of a libcall to // sincos. We want to issue a libcall to __sincos_stret to avoid memory // traffic. @@ -12037,7 +12037,7 @@ static SDValue LowerADDC_ADDE_SUBC_SUBE(SDValue Op, SelectionDAG &DAG) { } SDValue X86TargetLowering::LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const { - assert(Subtarget->isTargetDarwin()); + assert(Subtarget->isTargetDarwin() && Subtarget->is64Bit()); // For MacOSX, we want to call an alternative entry point: __sincos_stret, // which returns the values in two XMM registers. @@ -12054,18 +12054,21 @@ SDValue X86TargetLowering::LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const { Entry.isSExt = false; Entry.isZExt = false; Args.push_back(Entry); - + + // Only optimize x86_64 for now. i386 is a bit messy. For f32, + // the small struct {f32, f32} is returned in (eax, edx). For f64, + // the results are returned via SRet in memory. const char *LibcallName = (ArgVT == MVT::f64) ? "__sincos_stret" : "__sincosf_stret"; SDValue Callee = DAG.getExternalSymbol(LibcallName, getPointerTy()); - + StructType *RetTy = StructType::get(ArgTy, ArgTy, NULL); TargetLowering:: - CallLoweringInfo CLI(DAG.getEntryNode(), RetTy, - false, false, false, false, 0, - CallingConv::C, /*isTaillCall=*/false, - /*doesNotRet=*/false, /*isReturnValueUsed*/true, - Callee, Args, DAG, dl); + CallLoweringInfo CLI(DAG.getEntryNode(), RetTy, + false, false, false, false, 0, + CallingConv::C, /*isTaillCall=*/false, + /*doesNotRet=*/false, /*isReturnValueUsed*/true, + Callee, Args, DAG, dl); std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI); return CallResult.first; } diff --git a/lib/Target/X86/X86Subtarget.cpp b/lib/Target/X86/X86Subtarget.cpp index dad95c6..6305501 100644 --- a/lib/Target/X86/X86Subtarget.cpp +++ b/lib/Target/X86/X86Subtarget.cpp @@ -157,7 +157,8 @@ const char *X86Subtarget::getBZeroEntry() const { bool X86Subtarget::hasSinCos() const { return getTargetTriple().isMacOSX() && - !getTargetTriple().isMacOSXVersionLT(10, 9); + !getTargetTriple().isMacOSXVersionLT(10, 9) && + is64Bit(); } /// IsLegalToCallImmediateAddr - Return true if the subtarget allows calls |