From: Simon Pilgrim Date: Wed, 29 Nov 2017 14:58:34 +0000 (+0000) Subject: [X86][AVX512] Tag VPERMILV instruction scheduler class X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bc89401e6cf2e82c8fd045f4c176e8584e455a44;p=llvm [X86][AVX512] Tag VPERMILV instruction scheduler class git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319316 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86InstrAVX512.td b/lib/Target/X86/X86InstrAVX512.td index 1e1a885409c..5eedd471f60 100644 --- a/lib/Target/X86/X86InstrAVX512.td +++ b/lib/Target/X86/X86InstrAVX512.td @@ -5595,21 +5595,23 @@ defm VPERMPD : avx512_vpermi_dq_sizes<0x01, MRMSrcReg, MRMSrcMem, "vpermpd", // AVX-512 - VPERMIL //===----------------------------------------------------------------------===// -multiclass avx512_permil_vec OpcVar, string OpcodeStr, SDNode OpNode, - X86VectorVTInfo _, X86VectorVTInfo Ctrl> { +multiclass avx512_permil_vec OpcVar, string OpcodeStr, SDNode OpNode, + OpndItins itins, X86VectorVTInfo _, + X86VectorVTInfo Ctrl> { defm rr: AVX512_maskable, - T8PD, EVEX_4V; + (Ctrl.VT Ctrl.RC:$src2))), itins.rr>, + T8PD, EVEX_4V, Sched<[itins.Sched]>; defm rm: AVX512_maskable, - T8PD, EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>; + (Ctrl.VT (bitconvert(Ctrl.LdFrag addr:$src2))))), + itins.rm>, T8PD, EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>, + Sched<[itins.Sched.Folded, ReadAfterLd]>; defm rmb: AVX512_maskable OpcVar, string OpcodeStr, SDNode OpNode, (_.VT (OpNode _.RC:$src1, (Ctrl.VT (X86VBroadcast - (Ctrl.ScalarLdFrag addr:$src2)))))>, - T8PD, EVEX_4V, EVEX_B, EVEX_CD8<_.EltSize, CD8VF>; + (Ctrl.ScalarLdFrag addr:$src2))))), + itins.rm>, T8PD, EVEX_4V, EVEX_B, EVEX_CD8<_.EltSize, CD8VF>, + Sched<[itins.Sched.Folded, ReadAfterLd]>; } multiclass avx512_permil_vec_common OpcVar, - AVX512VLVectorVTInfo _, AVX512VLVectorVTInfo Ctrl>{ + OpndItins itins, AVX512VLVectorVTInfo _, + AVX512VLVectorVTInfo Ctrl> { let Predicates = [HasAVX512] in { - defm Z : avx512_permil_vec, EVEX_V512; + defm Z : avx512_permil_vec, EVEX_V512; } let Predicates = [HasAVX512, HasVLX] in { - defm Z128 : avx512_permil_vec, EVEX_V128; - defm Z256 : avx512_permil_vec, EVEX_V256; + defm Z128 : avx512_permil_vec, EVEX_V128; + defm Z256 : avx512_permil_vec, EVEX_V256; } } multiclass avx512_permil OpcImm, bits<8> OpcVar, AVX512VLVectorVTInfo _, AVX512VLVectorVTInfo Ctrl>{ - - defm NAME: avx512_permil_vec_common; + defm NAME: avx512_permil_vec_common; defm NAME: avx512_shift_rmi_sizes, EVEX, AVX512AIi8Base, EVEX_CD8<_.info128.EltSize, CD8VF>; @@ -5650,6 +5653,7 @@ defm VPERMILPS : avx512_permil<"vpermilps", 0x04, 0x0C, avx512vl_f32_info, let ExeDomain = SSEPackedDouble in defm VPERMILPD : avx512_permil<"vpermilpd", 0x05, 0x0D, avx512vl_f64_info, avx512vl_i64_info>, VEX_W; + //===----------------------------------------------------------------------===// // AVX-512 - VPSHUFD, VPSHUFLW, VPSHUFHW //===----------------------------------------------------------------------===// diff --git a/lib/Target/X86/X86InstrSSE.td b/lib/Target/X86/X86InstrSSE.td index c87a338cb1e..ed05b32f30a 100644 --- a/lib/Target/X86/X86InstrSSE.td +++ b/lib/Target/X86/X86InstrSSE.td @@ -7612,6 +7612,17 @@ defm VMASKMOVPD : avx_movmask_rm<0x2D, 0x2F, "vmaskmovpd", //===----------------------------------------------------------------------===// // VPERMIL - Permute Single and Double Floating-Point Values // + +let Sched = WriteFShuffle in +def AVX_VPERMILV : OpndItins< + IIC_SSE_SHUFP, IIC_SSE_SHUFP +>; + +let Sched = WriteFShuffle in +def AVX_VPERMIL : OpndItins< + IIC_SSE_SHUFP, IIC_SSE_SHUFP +>; + multiclass avx_permil opc_rm, bits<8> opc_rmi, string OpcodeStr, RegisterClass RC, X86MemOperand x86memop_f, X86MemOperand x86memop_i, PatFrag i_frag,