mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 13:30:12 +01:00
radeon/llvm: Remove AMDIL CMP instructions and associated lowering code
This commit is contained in:
parent
ea00632fe0
commit
e9d8901a80
3 changed files with 22 additions and 661 deletions
|
|
@ -414,216 +414,6 @@ CondCCodeToCC(ISD::CondCode CC, const MVT::SimpleValueType& type)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int
|
|
||||||
translateToOpcode(uint64_t CCCode, unsigned int regClass)
|
|
||||||
{
|
|
||||||
switch (CCCode) {
|
|
||||||
case AMDILCC::IL_CC_D_EQ:
|
|
||||||
case AMDILCC::IL_CC_D_OEQ:
|
|
||||||
if (regClass == AMDIL::GPRV2F64RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::DEQ_v2f64;
|
|
||||||
} else {
|
|
||||||
return (unsigned int)AMDIL::DEQ;
|
|
||||||
}
|
|
||||||
case AMDILCC::IL_CC_D_LE:
|
|
||||||
case AMDILCC::IL_CC_D_OLE:
|
|
||||||
case AMDILCC::IL_CC_D_ULE:
|
|
||||||
case AMDILCC::IL_CC_D_GE:
|
|
||||||
case AMDILCC::IL_CC_D_OGE:
|
|
||||||
case AMDILCC::IL_CC_D_UGE:
|
|
||||||
return (unsigned int)AMDIL::DGE;
|
|
||||||
case AMDILCC::IL_CC_D_LT:
|
|
||||||
case AMDILCC::IL_CC_D_OLT:
|
|
||||||
case AMDILCC::IL_CC_D_ULT:
|
|
||||||
case AMDILCC::IL_CC_D_GT:
|
|
||||||
case AMDILCC::IL_CC_D_OGT:
|
|
||||||
case AMDILCC::IL_CC_D_UGT:
|
|
||||||
return (unsigned int)AMDIL::DLT;
|
|
||||||
case AMDILCC::IL_CC_D_NE:
|
|
||||||
case AMDILCC::IL_CC_D_UNE:
|
|
||||||
return (unsigned int)AMDIL::DNE;
|
|
||||||
case AMDILCC::IL_CC_F_EQ:
|
|
||||||
case AMDILCC::IL_CC_F_OEQ:
|
|
||||||
return (unsigned int)AMDIL::FEQ;
|
|
||||||
case AMDILCC::IL_CC_F_LE:
|
|
||||||
case AMDILCC::IL_CC_F_ULE:
|
|
||||||
case AMDILCC::IL_CC_F_OLE:
|
|
||||||
case AMDILCC::IL_CC_F_GE:
|
|
||||||
case AMDILCC::IL_CC_F_UGE:
|
|
||||||
case AMDILCC::IL_CC_F_OGE:
|
|
||||||
return (unsigned int)AMDIL::FGE;
|
|
||||||
case AMDILCC::IL_CC_F_LT:
|
|
||||||
case AMDILCC::IL_CC_F_OLT:
|
|
||||||
case AMDILCC::IL_CC_F_ULT:
|
|
||||||
case AMDILCC::IL_CC_F_GT:
|
|
||||||
case AMDILCC::IL_CC_F_OGT:
|
|
||||||
case AMDILCC::IL_CC_F_UGT:
|
|
||||||
if (regClass == AMDIL::GPRV2F32RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::FLT_v2f32;
|
|
||||||
} else if (regClass == AMDIL::GPRV4F32RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::FLT_v4f32;
|
|
||||||
} else {
|
|
||||||
return (unsigned int)AMDIL::FLT;
|
|
||||||
}
|
|
||||||
case AMDILCC::IL_CC_F_NE:
|
|
||||||
case AMDILCC::IL_CC_F_UNE:
|
|
||||||
return (unsigned int)AMDIL::FNE;
|
|
||||||
case AMDILCC::IL_CC_I_EQ:
|
|
||||||
case AMDILCC::IL_CC_U_EQ:
|
|
||||||
if (regClass == AMDIL::GPRI32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::IEQ;
|
|
||||||
} else if (regClass == AMDIL::GPRV2I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRV2I8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRV2I16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::IEQ_v2i32;
|
|
||||||
} else if (regClass == AMDIL::GPRV4I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRV4I8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRV4I16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::IEQ_v4i32;
|
|
||||||
} else {
|
|
||||||
assert(!"Unknown reg class!");
|
|
||||||
}
|
|
||||||
case AMDILCC::IL_CC_L_EQ:
|
|
||||||
case AMDILCC::IL_CC_UL_EQ:
|
|
||||||
return (unsigned int)AMDIL::LEQ;
|
|
||||||
case AMDILCC::IL_CC_I_GE:
|
|
||||||
case AMDILCC::IL_CC_I_LE:
|
|
||||||
if (regClass == AMDIL::GPRI32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::IGE;
|
|
||||||
} else if (regClass == AMDIL::GPRV2I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::IGE_v2i32;
|
|
||||||
} else if (regClass == AMDIL::GPRV4I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::IGE_v4i32;
|
|
||||||
} else {
|
|
||||||
assert(!"Unknown reg class!");
|
|
||||||
}
|
|
||||||
case AMDILCC::IL_CC_I_LT:
|
|
||||||
case AMDILCC::IL_CC_I_GT:
|
|
||||||
if (regClass == AMDIL::GPRI32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::ILT;
|
|
||||||
} else if (regClass == AMDIL::GPRV2I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::ILT_v2i32;
|
|
||||||
} else if (regClass == AMDIL::GPRV4I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::ILT_v4i32;
|
|
||||||
} else {
|
|
||||||
assert(!"Unknown reg class!");
|
|
||||||
}
|
|
||||||
case AMDILCC::IL_CC_L_GE:
|
|
||||||
return (unsigned int)AMDIL::LGE;
|
|
||||||
case AMDILCC::IL_CC_L_LE:
|
|
||||||
return (unsigned int)AMDIL::LLE;
|
|
||||||
case AMDILCC::IL_CC_L_LT:
|
|
||||||
return (unsigned int)AMDIL::LLT;
|
|
||||||
case AMDILCC::IL_CC_L_GT:
|
|
||||||
return (unsigned int)AMDIL::LGT;
|
|
||||||
case AMDILCC::IL_CC_I_NE:
|
|
||||||
case AMDILCC::IL_CC_U_NE:
|
|
||||||
if (regClass == AMDIL::GPRI32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::INE;
|
|
||||||
} else if (regClass == AMDIL::GPRV2I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::INE_v2i32;
|
|
||||||
} else if (regClass == AMDIL::GPRV4I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::INE_v4i32;
|
|
||||||
} else {
|
|
||||||
assert(!"Unknown reg class!");
|
|
||||||
}
|
|
||||||
case AMDILCC::IL_CC_U_GE:
|
|
||||||
case AMDILCC::IL_CC_U_LE:
|
|
||||||
if (regClass == AMDIL::GPRI32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::UGE;
|
|
||||||
} else if (regClass == AMDIL::GPRV2I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::UGE_v2i32;
|
|
||||||
} else if (regClass == AMDIL::GPRV4I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::UGE_v4i32;
|
|
||||||
} else {
|
|
||||||
assert(!"Unknown reg class!");
|
|
||||||
}
|
|
||||||
case AMDILCC::IL_CC_L_NE:
|
|
||||||
case AMDILCC::IL_CC_UL_NE:
|
|
||||||
return (unsigned int)AMDIL::LNE;
|
|
||||||
case AMDILCC::IL_CC_UL_GE:
|
|
||||||
return (unsigned int)AMDIL::ULGE;
|
|
||||||
case AMDILCC::IL_CC_UL_LE:
|
|
||||||
return (unsigned int)AMDIL::ULLE;
|
|
||||||
case AMDILCC::IL_CC_U_LT:
|
|
||||||
if (regClass == AMDIL::GPRI32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::ULT;
|
|
||||||
} else if (regClass == AMDIL::GPRV2I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::ULT_v2i32;
|
|
||||||
} else if (regClass == AMDIL::GPRV4I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::ULT_v4i32;
|
|
||||||
} else {
|
|
||||||
assert(!"Unknown reg class!");
|
|
||||||
}
|
|
||||||
case AMDILCC::IL_CC_U_GT:
|
|
||||||
if (regClass == AMDIL::GPRI32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::UGT;
|
|
||||||
} else if (regClass == AMDIL::GPRV2I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::UGT_v2i32;
|
|
||||||
} else if (regClass == AMDIL::GPRV4I32RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI8RegClassID
|
|
||||||
|| regClass == AMDIL::GPRI16RegClassID) {
|
|
||||||
return (unsigned int)AMDIL::UGT_v4i32;
|
|
||||||
} else {
|
|
||||||
assert(!"Unknown reg class!");
|
|
||||||
}
|
|
||||||
case AMDILCC::IL_CC_UL_LT:
|
|
||||||
return (unsigned int)AMDIL::ULLT;
|
|
||||||
case AMDILCC::IL_CC_UL_GT:
|
|
||||||
return (unsigned int)AMDIL::ULGT;
|
|
||||||
case AMDILCC::IL_CC_F_UEQ:
|
|
||||||
case AMDILCC::IL_CC_D_UEQ:
|
|
||||||
case AMDILCC::IL_CC_F_ONE:
|
|
||||||
case AMDILCC::IL_CC_D_ONE:
|
|
||||||
case AMDILCC::IL_CC_F_O:
|
|
||||||
case AMDILCC::IL_CC_F_UO:
|
|
||||||
case AMDILCC::IL_CC_D_O:
|
|
||||||
case AMDILCC::IL_CC_D_UO:
|
|
||||||
// we don't care
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
errs()<<"Opcode: "<<CCCode<<"\n";
|
|
||||||
assert(0 && "Unknown opcode retrieved");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Helper function used by LowerFormalArguments
|
/// Helper function used by LowerFormalArguments
|
||||||
static const TargetRegisterClass*
|
static const TargetRegisterClass*
|
||||||
getRegClassFromType(unsigned int type) {
|
getRegClassFromType(unsigned int type) {
|
||||||
|
|
@ -812,322 +602,6 @@ AMDILTargetLowering::convertToReg(MachineOperand op) const
|
||||||
return op;
|
return op;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
AMDILTargetLowering::generateCMPInstr(
|
|
||||||
MachineInstr *MI,
|
|
||||||
MachineBasicBlock *BB,
|
|
||||||
const TargetInstrInfo& TII)
|
|
||||||
const
|
|
||||||
{
|
|
||||||
MachineOperand DST = MI->getOperand(0);
|
|
||||||
MachineOperand CC = MI->getOperand(1);
|
|
||||||
MachineOperand LHS = MI->getOperand(2);
|
|
||||||
MachineOperand RHS = MI->getOperand(3);
|
|
||||||
int64_t ccCode = CC.getImm();
|
|
||||||
unsigned int simpleVT = MI->getDesc().OpInfo[0].RegClass;
|
|
||||||
unsigned int opCode = translateToOpcode(ccCode, simpleVT);
|
|
||||||
DebugLoc DL = MI->getDebugLoc();
|
|
||||||
MachineBasicBlock::iterator BBI = MI;
|
|
||||||
setPrivateData(BB, BBI, &DL, &TII);
|
|
||||||
if (!LHS.isReg()) {
|
|
||||||
LHS = convertToReg(LHS);
|
|
||||||
}
|
|
||||||
if (!RHS.isReg()) {
|
|
||||||
RHS = convertToReg(RHS);
|
|
||||||
}
|
|
||||||
switch (ccCode) {
|
|
||||||
case AMDILCC::IL_CC_I_EQ:
|
|
||||||
case AMDILCC::IL_CC_I_NE:
|
|
||||||
case AMDILCC::IL_CC_I_GE:
|
|
||||||
case AMDILCC::IL_CC_I_LT:
|
|
||||||
{
|
|
||||||
uint32_t lhsreg = addExtensionInstructions(
|
|
||||||
LHS.getReg(), true, simpleVT);
|
|
||||||
uint32_t rhsreg = addExtensionInstructions(
|
|
||||||
RHS.getReg(), true, simpleVT);
|
|
||||||
generateMachineInst(opCode, DST.getReg(), lhsreg, rhsreg);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_U_EQ:
|
|
||||||
case AMDILCC::IL_CC_U_NE:
|
|
||||||
case AMDILCC::IL_CC_U_GE:
|
|
||||||
case AMDILCC::IL_CC_U_LT:
|
|
||||||
case AMDILCC::IL_CC_D_EQ:
|
|
||||||
case AMDILCC::IL_CC_F_EQ:
|
|
||||||
case AMDILCC::IL_CC_F_OEQ:
|
|
||||||
case AMDILCC::IL_CC_D_OEQ:
|
|
||||||
case AMDILCC::IL_CC_D_NE:
|
|
||||||
case AMDILCC::IL_CC_F_NE:
|
|
||||||
case AMDILCC::IL_CC_F_UNE:
|
|
||||||
case AMDILCC::IL_CC_D_UNE:
|
|
||||||
case AMDILCC::IL_CC_D_GE:
|
|
||||||
case AMDILCC::IL_CC_F_GE:
|
|
||||||
case AMDILCC::IL_CC_D_OGE:
|
|
||||||
case AMDILCC::IL_CC_F_OGE:
|
|
||||||
case AMDILCC::IL_CC_D_LT:
|
|
||||||
case AMDILCC::IL_CC_F_LT:
|
|
||||||
case AMDILCC::IL_CC_F_OLT:
|
|
||||||
case AMDILCC::IL_CC_D_OLT:
|
|
||||||
generateMachineInst(opCode, DST.getReg(),
|
|
||||||
LHS.getReg(), RHS.getReg());
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_I_GT:
|
|
||||||
case AMDILCC::IL_CC_I_LE:
|
|
||||||
{
|
|
||||||
uint32_t lhsreg = addExtensionInstructions(
|
|
||||||
LHS.getReg(), true, simpleVT);
|
|
||||||
uint32_t rhsreg = addExtensionInstructions(
|
|
||||||
RHS.getReg(), true, simpleVT);
|
|
||||||
generateMachineInst(opCode, DST.getReg(), rhsreg, lhsreg);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_U_GT:
|
|
||||||
case AMDILCC::IL_CC_U_LE:
|
|
||||||
case AMDILCC::IL_CC_F_GT:
|
|
||||||
case AMDILCC::IL_CC_D_GT:
|
|
||||||
case AMDILCC::IL_CC_F_OGT:
|
|
||||||
case AMDILCC::IL_CC_D_OGT:
|
|
||||||
case AMDILCC::IL_CC_F_LE:
|
|
||||||
case AMDILCC::IL_CC_D_LE:
|
|
||||||
case AMDILCC::IL_CC_D_OLE:
|
|
||||||
case AMDILCC::IL_CC_F_OLE:
|
|
||||||
generateMachineInst(opCode, DST.getReg(),
|
|
||||||
RHS.getReg(), LHS.getReg());
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_F_UGT:
|
|
||||||
case AMDILCC::IL_CC_F_ULE:
|
|
||||||
{
|
|
||||||
uint32_t VReg[4] = {
|
|
||||||
genVReg(simpleVT), genVReg(simpleVT),
|
|
||||||
genVReg(simpleVT), genVReg(simpleVT)
|
|
||||||
};
|
|
||||||
generateMachineInst(opCode, VReg[0],
|
|
||||||
RHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::FNE, VReg[1],
|
|
||||||
RHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::FNE, VReg[2],
|
|
||||||
LHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
VReg[3], VReg[0], VReg[1]);
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
DST.getReg(), VReg[2], VReg[3]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_F_ULT:
|
|
||||||
case AMDILCC::IL_CC_F_UGE:
|
|
||||||
{
|
|
||||||
uint32_t VReg[4] = {
|
|
||||||
genVReg(simpleVT), genVReg(simpleVT),
|
|
||||||
genVReg(simpleVT), genVReg(simpleVT)
|
|
||||||
};
|
|
||||||
generateMachineInst(opCode, VReg[0],
|
|
||||||
LHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::FNE, VReg[1],
|
|
||||||
RHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::FNE, VReg[2],
|
|
||||||
LHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
VReg[3], VReg[0], VReg[1]);
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
DST.getReg(), VReg[2], VReg[3]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_D_UGT:
|
|
||||||
case AMDILCC::IL_CC_D_ULE:
|
|
||||||
{
|
|
||||||
uint32_t regID = AMDIL::GPRF64RegClassID;
|
|
||||||
uint32_t VReg[4] = {
|
|
||||||
genVReg(regID), genVReg(regID),
|
|
||||||
genVReg(regID), genVReg(regID)
|
|
||||||
};
|
|
||||||
// The result of a double comparison is a 32bit result
|
|
||||||
generateMachineInst(opCode, VReg[0],
|
|
||||||
RHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::DNE, VReg[1],
|
|
||||||
RHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::DNE, VReg[2],
|
|
||||||
LHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
VReg[3], VReg[0], VReg[1]);
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
DST.getReg(), VReg[2], VReg[3]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_D_UGE:
|
|
||||||
case AMDILCC::IL_CC_D_ULT:
|
|
||||||
{
|
|
||||||
uint32_t regID = AMDIL::GPRF64RegClassID;
|
|
||||||
uint32_t VReg[4] = {
|
|
||||||
genVReg(regID), genVReg(regID),
|
|
||||||
genVReg(regID), genVReg(regID)
|
|
||||||
};
|
|
||||||
// The result of a double comparison is a 32bit result
|
|
||||||
generateMachineInst(opCode, VReg[0],
|
|
||||||
LHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::DNE, VReg[1],
|
|
||||||
RHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::DNE, VReg[2],
|
|
||||||
LHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
VReg[3], VReg[0], VReg[1]);
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
DST.getReg(), VReg[2], VReg[3]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_F_UEQ:
|
|
||||||
{
|
|
||||||
uint32_t VReg[4] = {
|
|
||||||
genVReg(simpleVT), genVReg(simpleVT),
|
|
||||||
genVReg(simpleVT), genVReg(simpleVT)
|
|
||||||
};
|
|
||||||
generateMachineInst(AMDIL::FEQ, VReg[0],
|
|
||||||
LHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::FNE, VReg[1],
|
|
||||||
LHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::FNE, VReg[2],
|
|
||||||
RHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
VReg[3], VReg[0], VReg[1]);
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
DST.getReg(), VReg[2], VReg[3]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_F_ONE:
|
|
||||||
{
|
|
||||||
uint32_t VReg[4] = {
|
|
||||||
genVReg(simpleVT), genVReg(simpleVT),
|
|
||||||
genVReg(simpleVT), genVReg(simpleVT)
|
|
||||||
};
|
|
||||||
generateMachineInst(AMDIL::FNE, VReg[0],
|
|
||||||
LHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::FEQ, VReg[1],
|
|
||||||
LHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::FEQ, VReg[2],
|
|
||||||
RHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::BINARY_AND_f32,
|
|
||||||
VReg[3], VReg[0], VReg[1]);
|
|
||||||
generateMachineInst(AMDIL::BINARY_AND_f32,
|
|
||||||
DST.getReg(), VReg[2], VReg[3]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_D_UEQ:
|
|
||||||
{
|
|
||||||
uint32_t regID = AMDIL::GPRF64RegClassID;
|
|
||||||
uint32_t VReg[4] = {
|
|
||||||
genVReg(regID), genVReg(regID),
|
|
||||||
genVReg(regID), genVReg(regID)
|
|
||||||
};
|
|
||||||
// The result of a double comparison is a 32bit result
|
|
||||||
generateMachineInst(AMDIL::DEQ, VReg[0],
|
|
||||||
LHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::DNE, VReg[1],
|
|
||||||
LHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::DNE, VReg[2],
|
|
||||||
RHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
VReg[3], VReg[0], VReg[1]);
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
DST.getReg(), VReg[2], VReg[3]);
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_D_ONE:
|
|
||||||
{
|
|
||||||
uint32_t regID = AMDIL::GPRF64RegClassID;
|
|
||||||
uint32_t VReg[4] = {
|
|
||||||
genVReg(regID), genVReg(regID),
|
|
||||||
genVReg(regID), genVReg(regID)
|
|
||||||
};
|
|
||||||
// The result of a double comparison is a 32bit result
|
|
||||||
generateMachineInst(AMDIL::DNE, VReg[0],
|
|
||||||
LHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::DEQ, VReg[1],
|
|
||||||
LHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::DEQ, VReg[2],
|
|
||||||
RHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::BINARY_AND_f32,
|
|
||||||
VReg[3], VReg[0], VReg[1]);
|
|
||||||
generateMachineInst(AMDIL::BINARY_AND_f32,
|
|
||||||
DST.getReg(), VReg[2], VReg[3]);
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_F_O:
|
|
||||||
{
|
|
||||||
uint32_t VReg[2] = { genVReg(simpleVT), genVReg(simpleVT) };
|
|
||||||
generateMachineInst(AMDIL::FEQ, VReg[0],
|
|
||||||
RHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::FEQ, VReg[1],
|
|
||||||
LHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::BINARY_AND_f32,
|
|
||||||
DST.getReg(), VReg[0], VReg[1]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_D_O:
|
|
||||||
{
|
|
||||||
uint32_t regID = AMDIL::GPRF64RegClassID;
|
|
||||||
uint32_t VReg[2] = { genVReg(regID), genVReg(regID) };
|
|
||||||
// The result of a double comparison is a 32bit result
|
|
||||||
generateMachineInst(AMDIL::DEQ, VReg[0],
|
|
||||||
RHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::DEQ, VReg[1],
|
|
||||||
LHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::BINARY_AND_f32,
|
|
||||||
DST.getReg(), VReg[0], VReg[1]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_F_UO:
|
|
||||||
{
|
|
||||||
uint32_t VReg[2] = { genVReg(simpleVT), genVReg(simpleVT) };
|
|
||||||
generateMachineInst(AMDIL::FNE, VReg[0],
|
|
||||||
RHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::FNE, VReg[1],
|
|
||||||
LHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
DST.getReg(), VReg[0], VReg[1]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_D_UO:
|
|
||||||
{
|
|
||||||
uint32_t regID = AMDIL::GPRF64RegClassID;
|
|
||||||
uint32_t VReg[2] = { genVReg(regID), genVReg(regID) };
|
|
||||||
// The result of a double comparison is a 32bit result
|
|
||||||
generateMachineInst(AMDIL::DNE, VReg[0],
|
|
||||||
RHS.getReg(), RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::DNE, VReg[1],
|
|
||||||
LHS.getReg(), LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_f32,
|
|
||||||
DST.getReg(), VReg[0], VReg[1]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::IL_CC_L_LE:
|
|
||||||
case AMDILCC::IL_CC_L_GE:
|
|
||||||
case AMDILCC::IL_CC_L_EQ:
|
|
||||||
case AMDILCC::IL_CC_L_NE:
|
|
||||||
case AMDILCC::IL_CC_L_LT:
|
|
||||||
case AMDILCC::IL_CC_L_GT:
|
|
||||||
case AMDILCC::IL_CC_UL_LE:
|
|
||||||
case AMDILCC::IL_CC_UL_GE:
|
|
||||||
case AMDILCC::IL_CC_UL_EQ:
|
|
||||||
case AMDILCC::IL_CC_UL_NE:
|
|
||||||
case AMDILCC::IL_CC_UL_LT:
|
|
||||||
case AMDILCC::IL_CC_UL_GT:
|
|
||||||
{
|
|
||||||
const AMDILSubtarget *stm = reinterpret_cast<const AMDILTargetMachine*>(
|
|
||||||
&this->getTargetMachine())->getSubtargetImpl();
|
|
||||||
if (stm->device()->usesHardware(AMDILDeviceInfo::LongOps)) {
|
|
||||||
generateMachineInst(opCode, DST.getReg(), LHS.getReg(), RHS.getReg());
|
|
||||||
} else {
|
|
||||||
generateLongRelational(MI, opCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AMDILCC::COND_ERROR:
|
|
||||||
assert(0 && "Invalid CC code");
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// TargetLowering Class Implementation Begins
|
// TargetLowering Class Implementation Begins
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
@ -2076,22 +1550,6 @@ AMDILTargetLowering::LowerCallResult(
|
||||||
// Other Lowering Hooks
|
// Other Lowering Hooks
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
MachineBasicBlock *
|
|
||||||
AMDILTargetLowering::EmitInstrWithCustomInserter(
|
|
||||||
MachineInstr *MI, MachineBasicBlock *BB) const
|
|
||||||
{
|
|
||||||
const TargetInstrInfo &TII = *getTargetMachine().getInstrInfo();
|
|
||||||
switch (MI->getOpcode()) {
|
|
||||||
ExpandCaseToAllTypes(AMDIL::CMP);
|
|
||||||
generateCMPInstr(MI, BB, TII);
|
|
||||||
MI->eraseFromParent();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return BB;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Recursively assign SDNodeOrdering to any unordered nodes
|
// Recursively assign SDNodeOrdering to any unordered nodes
|
||||||
// This is necessary to maintain source ordering of instructions
|
// This is necessary to maintain source ordering of instructions
|
||||||
// under -O0 to avoid odd-looking "skipping around" issues.
|
// under -O0 to avoid odd-looking "skipping around" issues.
|
||||||
|
|
@ -4210,12 +3668,13 @@ AMDILTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const
|
||||||
LHS.getValueType().getSimpleVT().SimpleTy);
|
LHS.getValueType().getSimpleVT().SimpleTy);
|
||||||
assert((AMDILCC != AMDILCC::COND_ERROR) && "Invalid SetCC!");
|
assert((AMDILCC != AMDILCC::COND_ERROR) && "Invalid SetCC!");
|
||||||
Cond = DAG.getNode(
|
Cond = DAG.getNode(
|
||||||
AMDILISD::CMP,
|
ISD::SELECT_CC,
|
||||||
DL,
|
Op.getDebugLoc(),
|
||||||
LHS.getValueType(),
|
LHS.getValueType(),
|
||||||
DAG.getConstant(AMDILCC, MVT::i32),
|
LHS, RHS,
|
||||||
LHS,
|
DAG.getConstant(-1, MVT::i32),
|
||||||
RHS);
|
DAG.getConstant(0, MVT::i32),
|
||||||
|
CC);
|
||||||
Cond = getConversionNode(DAG, Cond, Op, true);
|
Cond = getConversionNode(DAG, Cond, Op, true);
|
||||||
Cond = DAG.getNode(
|
Cond = DAG.getNode(
|
||||||
ISD::AND,
|
ISD::AND,
|
||||||
|
|
@ -4603,22 +4062,20 @@ SDValue
|
||||||
AMDILTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const
|
AMDILTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const
|
||||||
{
|
{
|
||||||
SDValue Chain = Op.getOperand(0);
|
SDValue Chain = Op.getOperand(0);
|
||||||
CondCodeSDNode *CCNode = cast<CondCodeSDNode>(Op.getOperand(1));
|
SDValue CC = Op.getOperand(1);
|
||||||
SDValue LHS = Op.getOperand(2);
|
SDValue LHS = Op.getOperand(2);
|
||||||
SDValue RHS = Op.getOperand(3);
|
SDValue RHS = Op.getOperand(3);
|
||||||
SDValue JumpT = Op.getOperand(4);
|
SDValue JumpT = Op.getOperand(4);
|
||||||
SDValue CmpValue;
|
SDValue CmpValue;
|
||||||
ISD::CondCode CC = CCNode->get();
|
|
||||||
SDValue Result;
|
SDValue Result;
|
||||||
unsigned int cmpOpcode = CondCCodeToCC(
|
|
||||||
CC,
|
|
||||||
LHS.getValueType().getSimpleVT().SimpleTy);
|
|
||||||
CmpValue = DAG.getNode(
|
CmpValue = DAG.getNode(
|
||||||
AMDILISD::CMP,
|
ISD::SELECT_CC,
|
||||||
Op.getDebugLoc(),
|
Op.getDebugLoc(),
|
||||||
LHS.getValueType(),
|
LHS.getValueType(),
|
||||||
DAG.getConstant(cmpOpcode, MVT::i32),
|
LHS, RHS,
|
||||||
LHS, RHS);
|
DAG.getConstant(-1, MVT::i32),
|
||||||
|
DAG.getConstant(0, MVT::i32),
|
||||||
|
CC);
|
||||||
Result = DAG.getNode(
|
Result = DAG.getNode(
|
||||||
AMDILISD::BRANCH_COND,
|
AMDILISD::BRANCH_COND,
|
||||||
CmpValue.getDebugLoc(),
|
CmpValue.getDebugLoc(),
|
||||||
|
|
@ -4715,95 +4172,6 @@ const
|
||||||
MVT::Other, &RetOps[0], RetOps.size());
|
MVT::Other, &RetOps[0], RetOps.size());
|
||||||
return Flag;
|
return Flag;
|
||||||
}
|
}
|
||||||
void
|
|
||||||
AMDILTargetLowering::generateLongRelational(MachineInstr *MI,
|
|
||||||
unsigned int opCode) const
|
|
||||||
{
|
|
||||||
MachineOperand DST = MI->getOperand(0);
|
|
||||||
MachineOperand LHS = MI->getOperand(2);
|
|
||||||
MachineOperand RHS = MI->getOperand(3);
|
|
||||||
unsigned int opi32Code = 0, si32Code = 0;
|
|
||||||
unsigned int simpleVT = MI->getDesc().OpInfo[0].RegClass;
|
|
||||||
uint32_t REGS[12];
|
|
||||||
// All the relationals can be generated with with 6 temp registers
|
|
||||||
for (int x = 0; x < 12; ++x) {
|
|
||||||
REGS[x] = genVReg(simpleVT);
|
|
||||||
}
|
|
||||||
// Pull out the high and low components of each 64 bit register
|
|
||||||
generateMachineInst(AMDIL::LHI, REGS[0], LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::LLO, REGS[1], LHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::LHI, REGS[2], RHS.getReg());
|
|
||||||
generateMachineInst(AMDIL::LLO, REGS[3], RHS.getReg());
|
|
||||||
// Determine the correct opcode that we should use
|
|
||||||
switch(opCode) {
|
|
||||||
default:
|
|
||||||
assert(!"comparison case not handled!");
|
|
||||||
break;
|
|
||||||
case AMDIL::LEQ:
|
|
||||||
si32Code = opi32Code = AMDIL::IEQ;
|
|
||||||
break;
|
|
||||||
case AMDIL::LNE:
|
|
||||||
si32Code = opi32Code = AMDIL::INE;
|
|
||||||
break;
|
|
||||||
case AMDIL::LLE:
|
|
||||||
case AMDIL::ULLE:
|
|
||||||
case AMDIL::LGE:
|
|
||||||
case AMDIL::ULGE:
|
|
||||||
if (opCode == AMDIL::LGE || opCode == AMDIL::ULGE) {
|
|
||||||
std::swap(REGS[0], REGS[2]);
|
|
||||||
} else {
|
|
||||||
std::swap(REGS[1], REGS[3]);
|
|
||||||
}
|
|
||||||
if (opCode == AMDIL::LLE || opCode == AMDIL::LGE) {
|
|
||||||
opi32Code = AMDIL::ILT;
|
|
||||||
} else {
|
|
||||||
opi32Code = AMDIL::ULT;
|
|
||||||
}
|
|
||||||
si32Code = AMDIL::UGE;
|
|
||||||
break;
|
|
||||||
case AMDIL::LGT:
|
|
||||||
case AMDIL::ULGT:
|
|
||||||
std::swap(REGS[0], REGS[2]);
|
|
||||||
std::swap(REGS[1], REGS[3]);
|
|
||||||
case AMDIL::LLT:
|
|
||||||
case AMDIL::ULLT:
|
|
||||||
if (opCode == AMDIL::LGT || opCode == AMDIL::LLT) {
|
|
||||||
opi32Code = AMDIL::ILT;
|
|
||||||
} else {
|
|
||||||
opi32Code = AMDIL::ULT;
|
|
||||||
}
|
|
||||||
si32Code = AMDIL::ULT;
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
// Do the initial opcode on the high and low components.
|
|
||||||
// This leaves the following:
|
|
||||||
// REGS[4] = L_HI OP R_HI
|
|
||||||
// REGS[5] = L_LO OP R_LO
|
|
||||||
generateMachineInst(opi32Code, REGS[4], REGS[0], REGS[2]);
|
|
||||||
generateMachineInst(si32Code, REGS[5], REGS[1], REGS[3]);
|
|
||||||
switch(opi32Code) {
|
|
||||||
case AMDIL::IEQ:
|
|
||||||
case AMDIL::INE:
|
|
||||||
{
|
|
||||||
// combine the results with an and or or depending on if
|
|
||||||
// we are eq or ne
|
|
||||||
uint32_t combineOp = (opi32Code == AMDIL::IEQ)
|
|
||||||
? AMDIL::BINARY_AND_i32 : AMDIL::BINARY_OR_i32;
|
|
||||||
generateMachineInst(combineOp, REGS[11], REGS[4], REGS[5]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// this finishes codegen for the following pattern
|
|
||||||
// REGS[4] || (REGS[5] && (L_HI == R_HI))
|
|
||||||
generateMachineInst(AMDIL::IEQ, REGS[9], REGS[0], REGS[2]);
|
|
||||||
generateMachineInst(AMDIL::BINARY_AND_i32, REGS[10], REGS[5],
|
|
||||||
REGS[9]);
|
|
||||||
generateMachineInst(AMDIL::BINARY_OR_i32, REGS[11], REGS[4],
|
|
||||||
REGS[10]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
generateMachineInst(AMDIL::LCREATE, DST.getReg(), REGS[11], REGS[11]);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
AMDILTargetLowering::getFunctionAlignment(const Function *) const
|
AMDILTargetLowering::getFunctionAlignment(const Function *) const
|
||||||
|
|
@ -4965,14 +4333,18 @@ AMDILTargetLowering::LowerSDIV32(SDValue Op, SelectionDAG &DAG) const
|
||||||
SDValue r1 = RHS;
|
SDValue r1 = RHS;
|
||||||
|
|
||||||
// ilt r10, r0, 0
|
// ilt r10, r0, 0
|
||||||
SDValue r10 = DAG.getNode(AMDILISD::CMP, DL, OVT,
|
SDValue r10 = DAG.getSelectCC(DL,
|
||||||
DAG.getConstant(CondCCodeToCC(ISD::SETLT, MVT::i32), MVT::i32),
|
r0, DAG.getConstant(0, OVT),
|
||||||
r0, DAG.getConstant(0, OVT));
|
DAG.getConstant(-1, MVT::i32),
|
||||||
|
DAG.getConstant(0, MVT::i32),
|
||||||
|
ISD::SETLT);
|
||||||
|
|
||||||
// ilt r11, r1, 0
|
// ilt r11, r1, 0
|
||||||
SDValue r11 = DAG.getNode(AMDILISD::CMP, DL, OVT,
|
SDValue r11 = DAG.getSelectCC(DL,
|
||||||
DAG.getConstant(CondCCodeToCC(ISD::SETLT, MVT::i32), MVT::i32),
|
r1, DAG.getConstant(0, OVT),
|
||||||
r1, DAG.getConstant(0, OVT));
|
DAG.getConstant(-1, MVT::i32),
|
||||||
|
DAG.getConstant(0, MVT::i32),
|
||||||
|
ISD::SETLT);
|
||||||
|
|
||||||
// iadd r0, r0, r10
|
// iadd r0, r0, r10
|
||||||
r0 = DAG.getNode(ISD::ADD, DL, OVT, r0, r10);
|
r0 = DAG.getNode(ISD::ADD, DL, OVT, r0, r10);
|
||||||
|
|
|
||||||
|
|
@ -239,11 +239,6 @@ namespace llvm
|
||||||
unsigned Depth = 0
|
unsigned Depth = 0
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
virtual MachineBasicBlock*
|
|
||||||
EmitInstrWithCustomInserter(
|
|
||||||
MachineInstr *MI,
|
|
||||||
MachineBasicBlock *MBB) const;
|
|
||||||
|
|
||||||
virtual bool
|
virtual bool
|
||||||
getTgtMemIntrinsic(IntrinsicInfo &Info,
|
getTgtMemIntrinsic(IntrinsicInfo &Info,
|
||||||
const CallInst &I, unsigned Intrinsic) const;
|
const CallInst &I, unsigned Intrinsic) const;
|
||||||
|
|
|
||||||
|
|
@ -441,12 +441,6 @@ def MACRO__shl_i64 : BinaryMacro<GPRI64, GPRI64, GPRI32, shl>;
|
||||||
def MACRO__sra_i64 : BinaryMacro<GPRI64, GPRI64, GPRI32, sra>;
|
def MACRO__sra_i64 : BinaryMacro<GPRI64, GPRI64, GPRI32, sra>;
|
||||||
}
|
}
|
||||||
//===---------------------------------------------------------------------===//
|
//===---------------------------------------------------------------------===//
|
||||||
// Comparison Instructions
|
|
||||||
//===---------------------------------------------------------------------===//
|
|
||||||
let usesCustomInserter = 1 in {
|
|
||||||
defm CMP : Compare<"Pseudo comparison instr">;
|
|
||||||
}
|
|
||||||
//===---------------------------------------------------------------------===//
|
|
||||||
// 32-bit floating point operations
|
// 32-bit floating point operations
|
||||||
//===---------------------------------------------------------------------===//
|
//===---------------------------------------------------------------------===//
|
||||||
def FEQ : TwoInOneOut<IL_OP_EQ, (outs GPRF32:$dst),
|
def FEQ : TwoInOneOut<IL_OP_EQ, (outs GPRF32:$dst),
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue