From: Simon Pilgrim Date: Mon, 27 Nov 2017 16:43:18 +0000 (+0000) Subject: [X86][AVX512] Tag AVX512 sqrt instructions with SSE_SQRT schedule classes X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c17b6156036f110d218fe3609803a40178698d76;p=llvm [X86][AVX512] Tag AVX512 sqrt instructions with SSE_SQRT schedule classes git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319045 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86InstrAVX512.td b/lib/Target/X86/X86InstrAVX512.td index c30faed2387..02532128d95 100644 --- a/lib/Target/X86/X86InstrAVX512.td +++ b/lib/Target/X86/X86InstrAVX512.td @@ -7522,97 +7522,100 @@ let Predicates = [HasERI] in { defm VGETEXP : avx512_eri<0x42, "vgetexp", X86fgetexpRnd>, avx512_fp_unaryop_packed<0x42, "vgetexp", X86fgetexpRnd> , EVEX; -multiclass avx512_sqrt_packed_round opc, string OpcodeStr, +multiclass avx512_sqrt_packed_round opc, string OpcodeStr, OpndItins itins, X86VectorVTInfo _>{ let ExeDomain = _.ExeDomain in defm rb: AVX512_maskable, - EVEX, EVEX_B, EVEX_RC; + (_.VT (X86fsqrtRnd _.RC:$src, (i32 imm:$rc))), itins.rr>, + EVEX, EVEX_B, EVEX_RC, Sched<[itins.Sched]>; } -multiclass avx512_sqrt_packed opc, string OpcodeStr, +multiclass avx512_sqrt_packed opc, string OpcodeStr, OpndItins itins, X86VectorVTInfo _>{ let ExeDomain = _.ExeDomain in { defm r: AVX512_maskable, EVEX; + (_.FloatVT (fsqrt _.RC:$src)), itins.rr>, EVEX, + Sched<[itins.Sched]>; defm m: AVX512_maskable, EVEX; - + (bitconvert (_.LdFrag addr:$src)))), itins.rm>, EVEX, + Sched<[itins.Sched.Folded, ReadAfterLd]>; defm mb: AVX512_maskable, - EVEX, EVEX_B; + (X86VBroadcast (_.ScalarLdFrag addr:$src)))), itins.rm>, + EVEX, EVEX_B, Sched<[itins.Sched.Folded, ReadAfterLd]>; } } multiclass avx512_sqrt_packed_all opc, string OpcodeStr> { - defm PSZ : avx512_sqrt_packed, + defm PSZ : avx512_sqrt_packed, EVEX_V512, PS, EVEX_CD8<32, CD8VF>; - defm PDZ : avx512_sqrt_packed, + defm PDZ : avx512_sqrt_packed, EVEX_V512, VEX_W, PD, EVEX_CD8<64, CD8VF>; // Define only if AVX512VL feature is present. let Predicates = [HasVLX] in { defm PSZ128 : avx512_sqrt_packed, + SSE_SQRTPS, v4f32x_info>, EVEX_V128, PS, EVEX_CD8<32, CD8VF>; defm PSZ256 : avx512_sqrt_packed, + SSE_SQRTPS, v8f32x_info>, EVEX_V256, PS, EVEX_CD8<32, CD8VF>; defm PDZ128 : avx512_sqrt_packed, + SSE_SQRTPD, v2f64x_info>, EVEX_V128, VEX_W, PD, EVEX_CD8<64, CD8VF>; defm PDZ256 : avx512_sqrt_packed, + SSE_SQRTPD, v4f64x_info>, EVEX_V256, VEX_W, PD, EVEX_CD8<64, CD8VF>; } } multiclass avx512_sqrt_packed_all_round opc, string OpcodeStr> { - defm PSZ : avx512_sqrt_packed_round, EVEX_V512, PS, EVEX_CD8<32, CD8VF>; - defm PDZ : avx512_sqrt_packed_round, EVEX_V512, VEX_W, PD, EVEX_CD8<64, CD8VF>; } -multiclass avx512_sqrt_scalar opc, string OpcodeStr,X86VectorVTInfo _, - string SUFF, Intrinsic Intr> { +multiclass avx512_sqrt_scalar opc, string OpcodeStr, OpndItins itins, + X86VectorVTInfo _, string SUFF, Intrinsic Intr> { let ExeDomain = _.ExeDomain in { defm r_Int : AVX512_maskable_scalar; + (i32 FROUND_CURRENT)), itins.rr>, + Sched<[itins.Sched]>; defm m_Int : AVX512_maskable_scalar; - + (i32 FROUND_CURRENT)), itins.rm>, + Sched<[itins.Sched.Folded, ReadAfterLd]>; defm rb_Int : AVX512_maskable_scalar, - EVEX_B, EVEX_RC; + (i32 imm:$rc)), itins.rr>, + EVEX_B, EVEX_RC, Sched<[itins.Sched.Folded, ReadAfterLd]>; let isCodeGenOnly = 1, hasSideEffects = 0 in { def r : I; - + OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", [], itins.rr>, + Sched<[itins.Sched]>; let mayLoad = 1 in def m : I; + OpcodeStr#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", [], itins.rm>, + Sched<[itins.Sched.Folded, ReadAfterLd]>; } } @@ -7639,10 +7642,10 @@ let Predicates = [HasAVX512, OptForSize] in { } multiclass avx512_sqrt_scalar_all opc, string OpcodeStr> { - defm SSZ : avx512_sqrt_scalar, EVEX_CD8<32, CD8VT1>, EVEX_4V, XS, NotMemoryFoldable; - defm SDZ : avx512_sqrt_scalar, EVEX_CD8<64, CD8VT1>, EVEX_4V, XD, VEX_W, NotMemoryFoldable;