diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2008-10-15 02:05:31 +0000 |
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2008-10-15 02:05:31 +0000 |
| commit | 3b0f5e4d617b4a03e0117629e19ec83b65860a66 (patch) | |
| tree | 8eebdad44233b50e157fcd3b9b94607d1404baf0 /llvm/lib/Target | |
| parent | 88e1b97f16c752ca889f24cc7e2a795b47c64696 (diff) | |
| download | bcm5719-llvm-3b0f5e4d617b4a03e0117629e19ec83b65860a66.tar.gz bcm5719-llvm-3b0f5e4d617b4a03e0117629e19ec83b65860a66.zip | |
- Add target lowering hooks that specify which setcc conditions are illegal,
i.e. conditions that cannot be checked with a single instruction. For example,
SETONE and SETUEQ on x86.
- Teach legalizer to implement *illegal* setcc as a and / or of a number of
legal setcc nodes. For now, only implement FP conditions. e.g. SETONE is
implemented as SETO & SETNE, SETUEQ is SETUO | SETEQ.
- Move x86 target over.
llvm-svn: 57542
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 32 |
1 files changed, 11 insertions, 21 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 1841de2dc87..f21055782df 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -92,7 +92,15 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM) setTruncStoreAction(MVT::i64, MVT::i8 , Expand); setTruncStoreAction(MVT::i32, MVT::i16, Expand); setTruncStoreAction(MVT::i32, MVT::i8 , Expand); - setTruncStoreAction(MVT::i16, MVT::i8, Expand); + setTruncStoreAction(MVT::i16, MVT::i8, Expand); + + // SETOEQ and SETUNE require checking two conditions. + setCondCodeAction(ISD::SETOEQ, MVT::f32, Expand); + setCondCodeAction(ISD::SETOEQ, MVT::f64, Expand); + setCondCodeAction(ISD::SETOEQ, MVT::f80, Expand); + setCondCodeAction(ISD::SETUNE, MVT::f32, Expand); + setCondCodeAction(ISD::SETUNE, MVT::f64, Expand); + setCondCodeAction(ISD::SETUNE, MVT::f80, Expand); // Promote all UINT_TO_FP to larger SINT_TO_FP's, as X86 doesn't have this // operation. @@ -4883,26 +4891,8 @@ SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) { DAG.getConstant(X86CC, MVT::i8), Cond); } - assert(isFP && "Illegal integer SetCC!"); - - Cond = DAG.getNode(X86ISD::CMP, MVT::i32, Op0, Op1); - switch (SetCCOpcode) { - default: assert(false && "Illegal floating point SetCC!"); - case ISD::SETOEQ: { // !PF & ZF - SDValue Tmp1 = DAG.getNode(X86ISD::SETCC, MVT::i8, - DAG.getConstant(X86::COND_NP, MVT::i8), Cond); - SDValue Tmp2 = DAG.getNode(X86ISD::SETCC, MVT::i8, - DAG.getConstant(X86::COND_E, MVT::i8), Cond); - return DAG.getNode(ISD::AND, MVT::i8, Tmp1, Tmp2); - } - case ISD::SETUNE: { // PF | !ZF - SDValue Tmp1 = DAG.getNode(X86ISD::SETCC, MVT::i8, - DAG.getConstant(X86::COND_P, MVT::i8), Cond); - SDValue Tmp2 = DAG.getNode(X86ISD::SETCC, MVT::i8, - DAG.getConstant(X86::COND_NE, MVT::i8), Cond); - return DAG.getNode(ISD::OR, MVT::i8, Tmp1, Tmp2); - } - } + assert(0 && "Illegal SetCC!"); + return SDValue(); } SDValue X86TargetLowering::LowerVSETCC(SDValue Op, SelectionDAG &DAG) { |

