mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-13 23:18:51 +00:00
Add in support for expansion of all of the comparison operations to the absolute minimum required set. This allows a backend to expand any arbitrary set of comparisons as long as a minimum set is supported.
The minimum set of required instructions is ISD::AND, ISD::OR, ISD::SETO(or ISD::SETOEQ) and ISD::SETUO(or ISD::SETUNE). Everything is expanded into one of two patterns: Pattern 1: (LHS CC1 RHS) Opc (LHS CC2 RHS) Pattern 2: (LHS CC1 LHS) Opc (RHS CC2 RHS) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165655 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d2139c4e7a
commit
d6458a0aa1
@ -1587,26 +1587,71 @@ void SelectionDAGLegalize::LegalizeSetCCCondCode(EVT VT,
|
||||
break;
|
||||
case TargetLowering::Expand: {
|
||||
ISD::CondCode CC1 = ISD::SETCC_INVALID, CC2 = ISD::SETCC_INVALID;
|
||||
ISD::CondCode InvCC = ISD::SETCC_INVALID;
|
||||
unsigned Opc = 0;
|
||||
switch (CCCode) {
|
||||
default: llvm_unreachable("Don't know how to expand this condition!");
|
||||
case ISD::SETOEQ: CC1 = ISD::SETEQ; CC2 = ISD::SETO; Opc = ISD::AND; break;
|
||||
case ISD::SETOGT: CC1 = ISD::SETGT; CC2 = ISD::SETO; Opc = ISD::AND; break;
|
||||
case ISD::SETOGE: CC1 = ISD::SETGE; CC2 = ISD::SETO; Opc = ISD::AND; break;
|
||||
case ISD::SETOLT: CC1 = ISD::SETLT; CC2 = ISD::SETO; Opc = ISD::AND; break;
|
||||
case ISD::SETOLE: CC1 = ISD::SETLE; CC2 = ISD::SETO; Opc = ISD::AND; break;
|
||||
case ISD::SETONE: CC1 = ISD::SETNE; CC2 = ISD::SETO; Opc = ISD::AND; break;
|
||||
case ISD::SETUEQ: CC1 = ISD::SETEQ; CC2 = ISD::SETUO; Opc = ISD::OR; break;
|
||||
case ISD::SETUGT: CC1 = ISD::SETGT; CC2 = ISD::SETUO; Opc = ISD::OR; break;
|
||||
case ISD::SETUGE: CC1 = ISD::SETGE; CC2 = ISD::SETUO; Opc = ISD::OR; break;
|
||||
case ISD::SETULT: CC1 = ISD::SETLT; CC2 = ISD::SETUO; Opc = ISD::OR; break;
|
||||
case ISD::SETULE: CC1 = ISD::SETLE; CC2 = ISD::SETUO; Opc = ISD::OR; break;
|
||||
case ISD::SETUNE: CC1 = ISD::SETNE; CC2 = ISD::SETUO; Opc = ISD::OR; break;
|
||||
// FIXME: Implement more expansions.
|
||||
case ISD::SETO:
|
||||
assert(TLI.getCondCodeAction(ISD::SETOEQ, OpVT)
|
||||
== TargetLowering::Legal
|
||||
&& "If SETO is expanded, SETOEQ must be legal!");
|
||||
CC1 = ISD::SETOEQ; CC2 = ISD::SETOEQ; Opc = ISD::AND; break;
|
||||
case ISD::SETUO:
|
||||
assert(TLI.getCondCodeAction(ISD::SETUNE, OpVT)
|
||||
== TargetLowering::Legal
|
||||
&& "If SETUO is expanded, SETUNE must be legal!");
|
||||
CC1 = ISD::SETUNE; CC2 = ISD::SETUNE; Opc = ISD::OR; break;
|
||||
case ISD::SETOEQ:
|
||||
case ISD::SETOGT:
|
||||
case ISD::SETOGE:
|
||||
case ISD::SETOLT:
|
||||
case ISD::SETOLE:
|
||||
case ISD::SETONE:
|
||||
case ISD::SETUEQ:
|
||||
case ISD::SETUNE:
|
||||
case ISD::SETUGT:
|
||||
case ISD::SETUGE:
|
||||
case ISD::SETULT:
|
||||
case ISD::SETULE:
|
||||
// If we are floating point, assign and break, otherwise fall through.
|
||||
if (!OpVT.isInteger()) {
|
||||
// We can use the 4th bit to tell if we are the unordered
|
||||
// or ordered version of the opcode.
|
||||
CC2 = ((unsigned)CCCode & 0x8U) ? ISD::SETUO : ISD::SETO;
|
||||
Opc = ((unsigned)CCCode & 0x8U) ? ISD::OR : ISD::AND;
|
||||
CC1 = (ISD::CondCode)(((int)CCCode & 0x7) | 0x10);
|
||||
break;
|
||||
}
|
||||
// Fallthrough if we are unsigned integer.
|
||||
case ISD::SETLE:
|
||||
case ISD::SETGT:
|
||||
case ISD::SETGE:
|
||||
case ISD::SETLT:
|
||||
case ISD::SETNE:
|
||||
case ISD::SETEQ:
|
||||
InvCC = ISD::getSetCCSwappedOperands(CCCode);
|
||||
if (TLI.getCondCodeAction(InvCC, OpVT) == TargetLowering::Expand) {
|
||||
// We only support using the inverted operation and not a
|
||||
// different manner of supporting expanding these cases.
|
||||
llvm_unreachable("Don't know how to expand this condition!");
|
||||
}
|
||||
LHS = DAG.getSetCC(dl, VT, RHS, LHS, InvCC);
|
||||
RHS = SDValue();
|
||||
CC = SDValue();
|
||||
return;
|
||||
}
|
||||
|
||||
SDValue SetCC1, SetCC2;
|
||||
if (CCCode != ISD::SETO && CCCode != ISD::SETUO) {
|
||||
// If we aren't the ordered or unorder operation,
|
||||
// then the pattern is (LHS CC1 RHS) Opc (LHS CC2 RHS).
|
||||
SetCC1 = DAG.getSetCC(dl, VT, LHS, RHS, CC1);
|
||||
SetCC2 = DAG.getSetCC(dl, VT, LHS, RHS, CC2);
|
||||
} else {
|
||||
// Otherwise, the pattern is (LHS CC1 LHS) Opc (RHS CC2 RHS)
|
||||
SetCC1 = DAG.getSetCC(dl, VT, LHS, LHS, CC1);
|
||||
SetCC2 = DAG.getSetCC(dl, VT, RHS, RHS, CC2);
|
||||
}
|
||||
|
||||
SDValue SetCC1 = DAG.getSetCC(dl, VT, LHS, RHS, CC1);
|
||||
SDValue SetCC2 = DAG.getSetCC(dl, VT, LHS, RHS, CC2);
|
||||
LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2);
|
||||
RHS = SDValue();
|
||||
CC = SDValue();
|
||||
|
Loading…
Reference in New Issue
Block a user