@@ -1196,18 +1196,25 @@ void AMDGPUDAGToDAGISel::SelectMAD_64_32(SDNode *N) {
1196
1196
void AMDGPUDAGToDAGISel::SelectMUL_LOHI (SDNode *N) {
1197
1197
SDLoc SL (N);
1198
1198
bool Signed = N->getOpcode () == ISD::SMUL_LOHI;
1199
+ SDVTList VTList;
1199
1200
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
+ }
1205
1213
1206
1214
SDValue Zero = CurDAG->getTargetConstant (0 , SL, MVT::i64 );
1207
1215
SDValue Clamp = CurDAG->getTargetConstant (0 , SL, MVT::i1);
1208
1216
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);
1211
1218
if (!SDValue (N, 0 ).use_empty ()) {
1212
1219
SDValue Sub0 = CurDAG->getTargetConstant (AMDGPU::sub0, SL, MVT::i32 );
1213
1220
SDNode *Lo = CurDAG->getMachineNode (TargetOpcode::EXTRACT_SUBREG, SL,
0 commit comments