diff --git a/lib/Target/X86/X86InstrAVX512.td b/lib/Target/X86/X86InstrAVX512.td index a43718ab29b..b208f816800 100644 --- a/lib/Target/X86/X86InstrAVX512.td +++ b/lib/Target/X86/X86InstrAVX512.td @@ -324,12 +324,14 @@ multiclass AVX512_maskable_3src O, Format F, X86VectorVTInfo _, string AttSrcAsm, string IntelSrcAsm, dag RHS, bit IsCommutable = 0, bit IsKCommutable = 0, - SDNode Select = vselect> : + SDNode Select = vselect, + bit MaskOnly = 0> : AVX512_maskable_common; @@ -337,10 +339,11 @@ multiclass AVX512_maskable_3src_scalar O, Format F, X86VectorVTInfo _, dag Outs, dag NonTiedIns, string OpcodeStr, string AttSrcAsm, string IntelSrcAsm, dag RHS, bit IsCommutable = 0, - bit IsKCommutable = 0> : + bit IsKCommutable = 0, + bit MaskOnly = 0> : AVX512_maskable_3src; + X86selects, MaskOnly>; multiclass AVX512_maskable_in_asm O, Format F, X86VectorVTInfo _, dag Outs, dag Ins, @@ -6429,7 +6432,7 @@ let Predicates = [HasAVX512] in { multiclass avx512_fma3p_213_rm opc, string OpcodeStr, SDNode OpNode, X86VectorVTInfo _, string Suff> { - let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain in { + let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain, hasSideEffects = 0 in { defm r: AVX512_maskable_3src opc, string OpcodeStr, SDNode OpNode, multiclass avx512_fma3_213_round opc, string OpcodeStr, SDNode OpNode, X86VectorVTInfo _, string Suff> { - let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain in + let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain, hasSideEffects = 0 in defm rb: AVX512_maskable_3src opc, string OpcodeStr, SDNode OpNode, X86VectorVTInfo _, string Suff> { - let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain in { + let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain, hasSideEffects = 0 in { defm r: AVX512_maskable_3src, + (_.VT (OpNode _.RC:$src2, _.RC:$src3, _.RC:$src1)), 1, 1, vselect, 1>, AVX512FMA3Base; defm m: AVX512_maskable_3src opc, string OpcodeStr, SDNode OpNode, multiclass avx512_fma3_231_round opc, string OpcodeStr, SDNode OpNode, X86VectorVTInfo _, string Suff> { - let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain in + let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain, hasSideEffects = 0 in defm rb: AVX512_maskable_3src, + (_.VT ( OpNode _.RC:$src2, _.RC:$src3, _.RC:$src1, (i32 imm:$rc))), 1, + 1, vselect, 1>, AVX512FMA3Base, EVEX_B, EVEX_RC; } @@ -6588,11 +6592,11 @@ defm VFNMSUB231 : avx512_fma3p_231_f<0xBE, "vfnmsub231", X86Fnmsub, X86FnmsubR multiclass avx512_fma3p_132_rm opc, string OpcodeStr, SDNode OpNode, X86VectorVTInfo _, string Suff> { - let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain in { + let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain, hasSideEffects = 0 in { defm r: AVX512_maskable_3src, + (_.VT (OpNode _.RC:$src1, _.RC:$src3, _.RC:$src2)), 1, 1, vselect, 1>, AVX512FMA3Base; defm m: AVX512_maskable_3src opc, string OpcodeStr, SDNode OpNode, multiclass avx512_fma3_132_round opc, string OpcodeStr, SDNode OpNode, X86VectorVTInfo _, string Suff> { - let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain in + let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain, hasSideEffects = 0 in defm rb: AVX512_maskable_3src, + (_.VT ( OpNode _.RC:$src1, _.RC:$src3, _.RC:$src2, (i32 imm:$rc))), 1, + 1, vselect, 1>, AVX512FMA3Base, EVEX_B, EVEX_RC; } @@ -6661,13 +6666,15 @@ defm VFNMADD132 : avx512_fma3p_132_f<0x9C, "vfnmadd132", X86Fnmadd, X86FnmaddR defm VFNMSUB132 : avx512_fma3p_132_f<0x9E, "vfnmsub132", X86Fnmsub, X86FnmsubRnd>; // Scalar FMA -let Constraints = "$src1 = $dst" in { multiclass avx512_fma3s_common opc, string OpcodeStr, X86VectorVTInfo _, dag RHS_VEC_r, dag RHS_VEC_m, dag RHS_VEC_rb, - dag RHS_r, dag RHS_m > { + dag RHS_r, dag RHS_m, bit MaskOnlyReg, + bit MaskOnlyRegInt> { +let Constraints = "$src1 = $dst", hasSideEffects = 0 in { defm r_Int: AVX512_maskable_3src_scalar, AVX512FMA3Base; + "$src3, $src2", "$src2, $src3", RHS_VEC_r, 1, 1, MaskOnlyRegInt>, + AVX512FMA3Base; defm m_Int: AVX512_maskable_3src_scalar opc, string OpcodeStr, X86VectorVTInfo _, defm rb_Int: AVX512_maskable_3src_scalar, - AVX512FMA3Base, EVEX_B, EVEX_RC; + OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc", RHS_VEC_rb, 1, 1, + MaskOnlyRegInt>, AVX512FMA3Base, EVEX_B, EVEX_RC; let isCodeGenOnly = 1, isCommutable = 1 in { def r : AVX512FMA3; + !if(MaskOnlyReg, [], [RHS_r])>; def m : AVX512FMA3; }// isCodeGenOnly = 1 -} }// Constraints = "$src1 = $dst" +} multiclass avx512_fma3s_all opc213, bits<8> opc231, bits<8> opc132, string OpcodeStr, SDNode OpNode, SDNode OpNodeRnds1, SDNode OpNodeRnds3, X86VectorVTInfo _ , string SUFF> { let ExeDomain = _.ExeDomain in { - defm NAME#213#SUFF#Z: avx512_fma3s_common opc213, bits<8> opc231, bits<8> opc132, (set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src2, _.FRC:$src1, _.FRC:$src3))), (set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src2, _.FRC:$src1, - (_.ScalarLdFrag addr:$src3))))>; + (_.ScalarLdFrag addr:$src3)))), 0, 0>; - defm NAME#231#SUFF#Z: avx512_fma3s_common opc213, bits<8> opc231, bits<8> opc132, (set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src2, _.FRC:$src3, _.FRC:$src1))), (set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src2, - (_.ScalarLdFrag addr:$src3), _.FRC:$src1)))>; + (_.ScalarLdFrag addr:$src3), _.FRC:$src1))), 1, 0>; - defm NAME#132#SUFF#Z: avx512_fma3s_common opc213, bits<8> opc231, bits<8> opc132, (set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src1, _.FRC:$src3, _.FRC:$src2))), (set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src1, - (_.ScalarLdFrag addr:$src3), _.FRC:$src2)))>; + (_.ScalarLdFrag addr:$src3), _.FRC:$src2))), 1, 1>; } }