Skip to content

Commit e315455

Browse files
authored
[AMDGPU] Select mul_lohi to V_MAD_NC_{I|U}64_I32 on gfx1250 (#153851)
1 parent 334e9bf commit e315455

File tree

2 files changed

+325
-7
lines changed

2 files changed

+325
-7
lines changed

llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,18 +1196,25 @@ void AMDGPUDAGToDAGISel::SelectMAD_64_32(SDNode *N) {
11961196
void AMDGPUDAGToDAGISel::SelectMUL_LOHI(SDNode *N) {
11971197
SDLoc SL(N);
11981198
bool Signed = N->getOpcode() == ISD::SMUL_LOHI;
1199+
SDVTList VTList;
11991200
unsigned Opc;
1200-
if (Subtarget->hasMADIntraFwdBug())
1201-
Opc = Signed ? AMDGPU::V_MAD_I64_I32_gfx11_e64
1202-
: AMDGPU::V_MAD_U64_U32_gfx11_e64;
1203-
else
1204-
Opc = Signed ? AMDGPU::V_MAD_I64_I32_e64 : AMDGPU::V_MAD_U64_U32_e64;
1201+
if (Subtarget->hasMadU64U32NoCarry()) {
1202+
VTList = CurDAG->getVTList(MVT::i64);
1203+
Opc = Signed ? AMDGPU::V_MAD_NC_I64_I32_e64 : AMDGPU::V_MAD_NC_U64_U32_e64;
1204+
} else {
1205+
VTList = CurDAG->getVTList(MVT::i64, MVT::i1);
1206+
if (Subtarget->hasMADIntraFwdBug()) {
1207+
Opc = Signed ? AMDGPU::V_MAD_I64_I32_gfx11_e64
1208+
: AMDGPU::V_MAD_U64_U32_gfx11_e64;
1209+
} else {
1210+
Opc = Signed ? AMDGPU::V_MAD_I64_I32_e64 : AMDGPU::V_MAD_U64_U32_e64;
1211+
}
1212+
}
12051213

12061214
SDValue Zero = CurDAG->getTargetConstant(0, SL, MVT::i64);
12071215
SDValue Clamp = CurDAG->getTargetConstant(0, SL, MVT::i1);
12081216
SDValue Ops[] = {N->getOperand(0), N->getOperand(1), Zero, Clamp};
1209-
SDNode *Mad = CurDAG->getMachineNode(
1210-
Opc, SL, CurDAG->getVTList(MVT::i64, MVT::i1), Ops);
1217+
SDNode *Mad = CurDAG->getMachineNode(Opc, SL, VTList, Ops);
12111218
if (!SDValue(N, 0).use_empty()) {
12121219
SDValue Sub0 = CurDAG->getTargetConstant(AMDGPU::sub0, SL, MVT::i32);
12131220
SDNode *Lo = CurDAG->getMachineNode(TargetOpcode::EXTRACT_SUBREG, SL,

0 commit comments

Comments
 (0)