@@ -925,6 +925,17 @@ let isAdd = 1 in {
925925 defm V_ADDC_U32 : VOP2bInst <"v_addc_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_addc_u32">;
926926}
927927
928+ let isReMaterializable = 1 in {
929+ let SubtargetPredicate = HasAddSubU64Insts, SchedRW = [Write64Bit] in {
930+ defm V_ADD_U64 : VOP2Inst <"v_add_nc_u64", VOP_I64_I64_I64_ARITH>;
931+ // We don't actually have something like V_SUBREV_U64 so V_SUB_U64 can't be treated as commutable.
932+ let isCommutable = 0 in
933+ defm V_SUB_U64 : VOP2Inst <"v_sub_nc_u64", VOP_I64_I64_I64_ARITH>;
934+ } // End SubtargetPredicate = HasAddSubU64Insts, SchedRW = [Write64Bit]
935+ let SubtargetPredicate = isGFX1250Plus, SchedRW = [WriteDouble] in
936+ defm V_MUL_U64 : VOP2Inst <"v_mul_u64", VOP_I64_I64_I64, DivergentBinFrag<mul>>;
937+ } // End isReMaterializable = 1
938+
928939} // End isCommutable = 1
929940
930941// These are special and do not read the exec mask.
@@ -1754,6 +1765,9 @@ multiclass VOP2_Real_FULL_with_name<GFXGen Gen, bits<6> op, string opName,
17541765 VOP2_Realtriple_e64_with_name<Gen, op, opName, asmName>,
17551766 VOP2_Real_NO_VOP3_with_name<Gen, op, opName, asmName>;
17561767
1768+ multiclass VOP2_Real_NO_DPP<GFXGen Gen, bits<6> op> :
1769+ VOP2_Real_e32<Gen, op>, VOP2_Real_e64<Gen, op>;
1770+
17571771multiclass VOP2_Real_NO_DPP_with_name<GFXGen Gen, bits<6> op, string opName,
17581772 string asmName> {
17591773 defm NAME : VOP2_Real_e32_with_name<Gen, op, opName, asmName>,
@@ -1843,6 +1857,9 @@ defm V_FMAC_F64 : VOP2_Real_FULL<GFX12Gen, 0x17>;
18431857
18441858defm V_FMAMK_F64 : VOP2Only_Real_MADK64<GFX1250Gen, 0x23>;
18451859defm V_FMAAK_F64 : VOP2Only_Real_MADK64<GFX1250Gen, 0x24>;
1860+ defm V_ADD_U64 : VOP2_Real_FULL<GFX1250Gen, 0x28>;
1861+ defm V_SUB_U64 : VOP2_Real_FULL<GFX1250Gen, 0x29>;
1862+ defm V_MUL_U64 : VOP2_Real_NO_DPP<GFX1250Gen, 0x2a>;
18461863
18471864//===----------------------------------------------------------------------===//
18481865// GFX11.
0 commit comments