@@ -1196,18 +1196,25 @@ void AMDGPUDAGToDAGISel::SelectMAD_64_32(SDNode *N) {
11961196void 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