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 | 7f042681764c6f8eae22781d8b4cb4c218a86b76 (patch) | |
tree | b9d7f3b18ef30b2c65ea64abe4fa304688e450a4 /include/llvm/Target | |
parent | dd5b58ad7be78be90390074f0df138778af5c895 (diff) | |
download | external_llvm-7f042681764c6f8eae22781d8b4cb4c218a86b76.zip external_llvm-7f042681764c6f8eae22781d8b4cb4c218a86b76.tar.gz external_llvm-7f042681764c6f8eae22781d8b4cb4c218a86b76.tar.bz2 |
- 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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@57542 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Target')
-rw-r--r-- | include/llvm/Target/TargetLowering.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/include/llvm/Target/TargetLowering.h b/include/llvm/Target/TargetLowering.h index c9ea401..cd75163 100644 --- a/include/llvm/Target/TargetLowering.h +++ b/include/llvm/Target/TargetLowering.h @@ -409,6 +409,28 @@ public: getConvertAction(FromVT, ToVT) == Custom); } + /// getCondCodeAction - Return how the condition code should be treated: + /// either it is legal, needs to be expanded to some other code sequence, + /// or the target has a custom expander for it. + LegalizeAction + getCondCodeAction(ISD::CondCode CC, MVT VT) const { + assert((unsigned)CC < array_lengthof(CondCodeActions) && + (unsigned)VT.getSimpleVT() < sizeof(CondCodeActions[0])*4 && + "Table isn't big enough!"); + LegalizeAction Action = (LegalizeAction) + ((CondCodeActions[CC] >> (2*VT.getSimpleVT())) & 3); + assert(Action != Promote && "Can't promote condition code!"); + return Action; + } + + /// isCondCodeLegal - Return true if the specified condition code is legal + /// on this target. + bool isCondCodeLegal(ISD::CondCode CC, MVT VT) const { + return getCondCodeAction(CC, VT) == Legal || + getCondCodeAction(CC, VT) == Custom; + } + + /// getTypeToPromoteTo - If the action for this operation is to promote, this /// method returns the ValueType to promote to. MVT getTypeToPromoteTo(unsigned Op, MVT VT) const { @@ -903,6 +925,16 @@ protected: ToVT.getSimpleVT()*2; } + /// setCondCodeAction - Indicate that the specified condition code is or isn't + /// supported on the target and indicate what to do about it. + void setCondCodeAction(ISD::CondCode CC, MVT VT, LegalizeAction Action) { + assert((unsigned)VT.getSimpleVT() < sizeof(CondCodeActions[0])*4 && + (unsigned)CC < array_lengthof(CondCodeActions) && + "Table isn't big enough!"); + CondCodeActions[(unsigned)CC] &= ~(uint64_t(3UL) << VT.getSimpleVT()*2); + CondCodeActions[(unsigned)CC] |= (uint64_t)Action << VT.getSimpleVT()*2; + } + /// AddPromotedToType - If Opc/OrigVT is specified as being promoted, the /// promotion code defaults to trying a larger integer/fp until it can find /// one that works. If that default is insufficient, this method can be used @@ -1437,6 +1469,11 @@ private: /// (FP_EXTEND and FP_ROUND). uint64_t ConvertActions[MVT::LAST_VALUETYPE]; + /// CondCodeActions - For each condition code (ISD::CondCode) keep a + /// LegalizeAction that indicates how instruction selection should + /// deal with the condition code. + uint64_t CondCodeActions[ISD::SETCC_INVALID]; + ValueTypeActionImpl ValueTypeActions; std::vector<APFloat> LegalFPImmediates; |