mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-17 19:51:13 +00:00
AMDGPU: Move amdgcn intrinsic handling into SITargetLowering
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@258608 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6b44025db3
commit
79f77a9c0d
@ -925,67 +925,13 @@ SDValue AMDGPUTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
|
||||
return DAG.getNode(AMDGPUISD::CLAMP, DL, VT,
|
||||
Op.getOperand(1), Op.getOperand(2), Op.getOperand(3));
|
||||
|
||||
case Intrinsic::amdgcn_div_scale: {
|
||||
// 3rd parameter required to be a constant.
|
||||
const ConstantSDNode *Param = dyn_cast<ConstantSDNode>(Op.getOperand(3));
|
||||
if (!Param)
|
||||
return DAG.getUNDEF(VT);
|
||||
|
||||
// Translate to the operands expected by the machine instruction. The
|
||||
// first parameter must be the same as the first instruction.
|
||||
SDValue Numerator = Op.getOperand(1);
|
||||
SDValue Denominator = Op.getOperand(2);
|
||||
|
||||
// Note this order is opposite of the machine instruction's operations,
|
||||
// which is s0.f = Quotient, s1.f = Denominator, s2.f = Numerator. The
|
||||
// intrinsic has the numerator as the first operand to match a normal
|
||||
// division operation.
|
||||
|
||||
SDValue Src0 = Param->isAllOnesValue() ? Numerator : Denominator;
|
||||
|
||||
return DAG.getNode(AMDGPUISD::DIV_SCALE, DL, Op->getVTList(), Src0,
|
||||
Denominator, Numerator);
|
||||
}
|
||||
|
||||
case Intrinsic::amdgcn_div_fmas:
|
||||
return DAG.getNode(AMDGPUISD::DIV_FMAS, DL, VT,
|
||||
Op.getOperand(1), Op.getOperand(2), Op.getOperand(3),
|
||||
Op.getOperand(4));
|
||||
|
||||
case Intrinsic::amdgcn_div_fixup:
|
||||
return DAG.getNode(AMDGPUISD::DIV_FIXUP, DL, VT,
|
||||
Op.getOperand(1), Op.getOperand(2), Op.getOperand(3));
|
||||
|
||||
case Intrinsic::amdgcn_trig_preop:
|
||||
return DAG.getNode(AMDGPUISD::TRIG_PREOP, DL, VT,
|
||||
Op.getOperand(1), Op.getOperand(2));
|
||||
|
||||
case Intrinsic::amdgcn_rcp:
|
||||
return DAG.getNode(AMDGPUISD::RCP, DL, VT, Op.getOperand(1));
|
||||
|
||||
case Intrinsic::amdgcn_rsq:
|
||||
return DAG.getNode(AMDGPUISD::RSQ, DL, VT, Op.getOperand(1));
|
||||
|
||||
case AMDGPUIntrinsic::AMDGPU_legacy_rsq:
|
||||
return DAG.getNode(AMDGPUISD::RSQ_LEGACY, DL, VT, Op.getOperand(1));
|
||||
|
||||
case Intrinsic::amdgcn_rsq_clamped:
|
||||
case Intrinsic::AMDGPU_rsq_clamped:
|
||||
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);
|
||||
assert(Subtarget->getGeneration() < AMDGPUSubtarget::SOUTHERN_ISLANDS);
|
||||
return DAG.getNode(AMDGPUISD::RSQ_CLAMPED, DL, VT, Op.getOperand(1));
|
||||
|
||||
SDValue Rsq = DAG.getNode(AMDGPUISD::RSQ, DL, VT, Op.getOperand(1));
|
||||
SDValue Tmp = DAG.getNode(ISD::FMINNUM, DL, VT, Rsq,
|
||||
DAG.getConstantFP(Max, DL, VT));
|
||||
return DAG.getNode(ISD::FMAXNUM, DL, VT, Tmp,
|
||||
DAG.getConstantFP(Min, DL, VT));
|
||||
} else {
|
||||
return DAG.getNode(AMDGPUISD::RSQ_CLAMPED, DL, VT, Op.getOperand(1));
|
||||
}
|
||||
|
||||
case Intrinsic::amdgcn_ldexp:
|
||||
case Intrinsic::AMDGPU_ldexp: // Legacy name
|
||||
return DAG.getNode(AMDGPUISD::LDEXP, DL, VT, Op.getOperand(1),
|
||||
Op.getOperand(2));
|
||||
@ -1006,18 +952,6 @@ SDValue AMDGPUTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
|
||||
return DAG.getNode(AMDGPUISD::MAD_I24, DL, VT,
|
||||
Op.getOperand(1), Op.getOperand(2), Op.getOperand(3));
|
||||
|
||||
case AMDGPUIntrinsic::AMDGPU_cvt_f32_ubyte0:
|
||||
return DAG.getNode(AMDGPUISD::CVT_F32_UBYTE0, DL, VT, Op.getOperand(1));
|
||||
|
||||
case AMDGPUIntrinsic::AMDGPU_cvt_f32_ubyte1:
|
||||
return DAG.getNode(AMDGPUISD::CVT_F32_UBYTE1, DL, VT, Op.getOperand(1));
|
||||
|
||||
case AMDGPUIntrinsic::AMDGPU_cvt_f32_ubyte2:
|
||||
return DAG.getNode(AMDGPUISD::CVT_F32_UBYTE2, DL, VT, Op.getOperand(1));
|
||||
|
||||
case AMDGPUIntrinsic::AMDGPU_cvt_f32_ubyte3:
|
||||
return DAG.getNode(AMDGPUISD::CVT_F32_UBYTE3, DL, VT, Op.getOperand(1));
|
||||
|
||||
case AMDGPUIntrinsic::AMDGPU_bfe_i32:
|
||||
return DAG.getNode(AMDGPUISD::BFE_I32, DL, VT,
|
||||
Op.getOperand(1),
|
||||
@ -1041,10 +975,6 @@ SDValue AMDGPUTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
|
||||
Op.getOperand(1),
|
||||
Op.getOperand(2));
|
||||
|
||||
case Intrinsic::amdgcn_class:
|
||||
return DAG.getNode(AMDGPUISD::FP_CLASS, DL, VT,
|
||||
Op.getOperand(1), Op.getOperand(2));
|
||||
|
||||
case AMDGPUIntrinsic::AMDIL_exp: // Legacy name.
|
||||
return DAG.getNode(ISD::FEXP2, DL, VT, Op.getOperand(1));
|
||||
|
||||
|
@ -1284,7 +1284,25 @@ SDValue SITargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
|
||||
|
||||
return CreateLiveInRegister(DAG, &AMDGPU::SReg_64RegClass,
|
||||
TRI->getPreloadedValue(MF, SIRegisterInfo::DISPATCH_PTR), VT);
|
||||
case Intrinsic::amdgcn_rcp:
|
||||
return DAG.getNode(AMDGPUISD::RCP, DL, VT, Op.getOperand(1));
|
||||
case Intrinsic::amdgcn_rsq:
|
||||
return DAG.getNode(AMDGPUISD::RSQ, DL, VT, Op.getOperand(1));
|
||||
case Intrinsic::amdgcn_rsq_clamped:
|
||||
case Intrinsic::AMDGPU_rsq_clamped: { // Legacy name
|
||||
if (Subtarget->getGeneration() < AMDGPUSubtarget::VOLCANIC_ISLANDS)
|
||||
return DAG.getNode(AMDGPUISD::RSQ_CLAMPED, DL, VT, Op.getOperand(1));
|
||||
|
||||
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, DL, VT));
|
||||
return DAG.getNode(ISD::FMAXNUM, DL, VT, Tmp,
|
||||
DAG.getConstantFP(Min, DL, VT));
|
||||
}
|
||||
case Intrinsic::r600_read_ngroups_x:
|
||||
return LowerParameter(DAG, VT, VT, DL, DAG.getEntryNode(),
|
||||
SI::KernelInputOffsets::NGROUPS_X, false);
|
||||
@ -1401,6 +1419,53 @@ SDValue SITargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
|
||||
Op.getOperand(2), Op.getOperand(3), Op.getOperand(4),
|
||||
Glue);
|
||||
}
|
||||
case Intrinsic::amdgcn_ldexp:
|
||||
return DAG.getNode(AMDGPUISD::LDEXP, DL, VT,
|
||||
Op.getOperand(1), Op.getOperand(2));
|
||||
case Intrinsic::amdgcn_class:
|
||||
return DAG.getNode(AMDGPUISD::FP_CLASS, DL, VT,
|
||||
Op.getOperand(1), Op.getOperand(2));
|
||||
case Intrinsic::amdgcn_div_fmas:
|
||||
return DAG.getNode(AMDGPUISD::DIV_FMAS, DL, VT,
|
||||
Op.getOperand(1), Op.getOperand(2), Op.getOperand(3),
|
||||
Op.getOperand(4));
|
||||
|
||||
case Intrinsic::amdgcn_div_fixup:
|
||||
return DAG.getNode(AMDGPUISD::DIV_FIXUP, DL, VT,
|
||||
Op.getOperand(1), Op.getOperand(2), Op.getOperand(3));
|
||||
|
||||
case Intrinsic::amdgcn_trig_preop:
|
||||
return DAG.getNode(AMDGPUISD::TRIG_PREOP, DL, VT,
|
||||
Op.getOperand(1), Op.getOperand(2));
|
||||
case Intrinsic::amdgcn_div_scale: {
|
||||
// 3rd parameter required to be a constant.
|
||||
const ConstantSDNode *Param = dyn_cast<ConstantSDNode>(Op.getOperand(3));
|
||||
if (!Param)
|
||||
return DAG.getUNDEF(VT);
|
||||
|
||||
// Translate to the operands expected by the machine instruction. The
|
||||
// first parameter must be the same as the first instruction.
|
||||
SDValue Numerator = Op.getOperand(1);
|
||||
SDValue Denominator = Op.getOperand(2);
|
||||
|
||||
// Note this order is opposite of the machine instruction's operations,
|
||||
// which is s0.f = Quotient, s1.f = Denominator, s2.f = Numerator. The
|
||||
// intrinsic has the numerator as the first operand to match a normal
|
||||
// division operation.
|
||||
|
||||
SDValue Src0 = Param->isAllOnesValue() ? Numerator : Denominator;
|
||||
|
||||
return DAG.getNode(AMDGPUISD::DIV_SCALE, DL, Op->getVTList(), Src0,
|
||||
Denominator, Numerator);
|
||||
}
|
||||
case AMDGPUIntrinsic::AMDGPU_cvt_f32_ubyte0:
|
||||
return DAG.getNode(AMDGPUISD::CVT_F32_UBYTE0, DL, VT, Op.getOperand(1));
|
||||
case AMDGPUIntrinsic::AMDGPU_cvt_f32_ubyte1:
|
||||
return DAG.getNode(AMDGPUISD::CVT_F32_UBYTE1, DL, VT, Op.getOperand(1));
|
||||
case AMDGPUIntrinsic::AMDGPU_cvt_f32_ubyte2:
|
||||
return DAG.getNode(AMDGPUISD::CVT_F32_UBYTE2, DL, VT, Op.getOperand(1));
|
||||
case AMDGPUIntrinsic::AMDGPU_cvt_f32_ubyte3:
|
||||
return DAG.getNode(AMDGPUISD::CVT_F32_UBYTE3, DL, VT, Op.getOperand(1));
|
||||
default:
|
||||
return AMDGPUTargetLowering::LowerOperation(Op, DAG);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user