mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-17 06:33:21 +00:00
R600/SI: Update instruction conversions for VI
There are 3 changes: - Convert 32-bit S_LSHL/LSHR/ASHR to their V_*REV variants for VI - Lower RSQ_CLAMP for VI - Don't generate MIN/MAX_LEGACY on VI git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223604 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7eeb607497
commit
ac1f24a06a
@ -892,7 +892,19 @@ SDValue AMDGPUTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
|
||||
return DAG.getNode(AMDGPUISD::RSQ_LEGACY, DL, VT, Op.getOperand(1));
|
||||
|
||||
case Intrinsic::AMDGPU_rsq_clamped:
|
||||
return DAG.getNode(AMDGPUISD::RSQ_CLAMPED, DL, VT, Op.getOperand(1));
|
||||
if (Subtarget->getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
|
||||
Type *Type = VT.getTypeForEVT(*DAG.getContext());
|
||||
APFloat Max = APFloat::getLargest(Type->getFltSemantics());
|
||||
APFloat Min = APFloat::getLargest(Type->getFltSemantics(), true);
|
||||
|
||||
SDValue Rsq = DAG.getNode(AMDGPUISD::RSQ, DL, VT, Op.getOperand(1));
|
||||
SDValue Tmp = DAG.getNode(ISD::FMINNUM, DL, VT, Rsq,
|
||||
DAG.getConstantFP(Max, VT));
|
||||
return DAG.getNode(ISD::FMAXNUM, DL, VT, Tmp,
|
||||
DAG.getConstantFP(Min, VT));
|
||||
} else {
|
||||
return DAG.getNode(AMDGPUISD::RSQ_CLAMPED, DL, VT, Op.getOperand(1));
|
||||
}
|
||||
|
||||
case Intrinsic::AMDGPU_ldexp:
|
||||
return DAG.getNode(AMDGPUISD::LDEXP, DL, VT, Op.getOperand(1),
|
||||
@ -1035,6 +1047,9 @@ SDValue AMDGPUTargetLowering::CombineFMinMax(SDLoc DL,
|
||||
case ISD::SETOLT:
|
||||
case ISD::SETLE:
|
||||
case ISD::SETLT: {
|
||||
if (Subtarget->getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS)
|
||||
break;
|
||||
|
||||
// We need to permute the operands to get the correct NaN behavior. The
|
||||
// selected operand is the second one based on the failing compare with NaN,
|
||||
// so permute it based on the compare type the hardware uses.
|
||||
@ -1048,6 +1063,9 @@ SDValue AMDGPUTargetLowering::CombineFMinMax(SDLoc DL,
|
||||
case ISD::SETOGE:
|
||||
case ISD::SETUGT:
|
||||
case ISD::SETOGT: {
|
||||
if (Subtarget->getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS)
|
||||
break;
|
||||
|
||||
if (LHS == True)
|
||||
return DAG.getNode(AMDGPUISD::FMAX_LEGACY, DL, VT, RHS, LHS);
|
||||
return DAG.getNode(AMDGPUISD::FMIN_LEGACY, DL, VT, LHS, RHS);
|
||||
|
@ -1356,6 +1356,14 @@ unsigned SIInstrInfo::split64BitImm(SmallVectorImpl<MachineInstr *> &Worklist,
|
||||
return Dst;
|
||||
}
|
||||
|
||||
// Change the order of operands from (0, 1, 2) to (0, 2, 1)
|
||||
void SIInstrInfo::swapOperands(MachineBasicBlock::iterator Inst) const {
|
||||
assert(Inst->getNumExplicitOperands() == 3);
|
||||
MachineOperand Op1 = Inst->getOperand(1);
|
||||
Inst->RemoveOperand(1);
|
||||
Inst->addOperand(Op1);
|
||||
}
|
||||
|
||||
bool SIInstrInfo::isOperandLegal(const MachineInstr *MI, unsigned OpIdx,
|
||||
const MachineOperand *MO) const {
|
||||
const MachineRegisterInfo &MRI = MI->getParent()->getParent()->getRegInfo();
|
||||
@ -1931,6 +1939,25 @@ void SIInstrInfo::moveToVALU(MachineInstr &TopInst) const {
|
||||
continue;
|
||||
}
|
||||
|
||||
case AMDGPU::S_LSHL_B32:
|
||||
if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
|
||||
NewOpcode = AMDGPU::V_LSHLREV_B32_e64;
|
||||
swapOperands(Inst);
|
||||
}
|
||||
break;
|
||||
case AMDGPU::S_ASHR_I32:
|
||||
if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
|
||||
NewOpcode = AMDGPU::V_ASHRREV_I32_e64;
|
||||
swapOperands(Inst);
|
||||
}
|
||||
break;
|
||||
case AMDGPU::S_LSHR_B32:
|
||||
if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
|
||||
NewOpcode = AMDGPU::V_LSHRREV_B32_e64;
|
||||
swapOperands(Inst);
|
||||
}
|
||||
break;
|
||||
|
||||
case AMDGPU::S_BFE_U64:
|
||||
case AMDGPU::S_BFM_B64:
|
||||
llvm_unreachable("Moving this op to VALU not implemented");
|
||||
|
@ -45,6 +45,8 @@ private:
|
||||
const TargetRegisterClass *RC,
|
||||
const MachineOperand &Op) const;
|
||||
|
||||
void swapOperands(MachineBasicBlock::iterator Inst) const;
|
||||
|
||||
void splitScalar64BitUnaryOp(SmallVectorImpl<MachineInstr *> &Worklist,
|
||||
MachineInstr *Inst, unsigned Opcode) const;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user