[X86][AVX512] Tag VPERMILV instruction scheduler class

llvm-svn: 319316
This commit is contained in:
Simon Pilgrim 2017-11-29 14:58:34 +00:00
parent 2b6338b2bc
commit 1401a75341
2 changed files with 32 additions and 17 deletions

View File

@ -5595,21 +5595,23 @@ defm VPERMPD : avx512_vpermi_dq_sizes<0x01, MRMSrcReg, MRMSrcMem, "vpermpd",
// AVX-512 - VPERMIL // AVX-512 - VPERMIL
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
multiclass avx512_permil_vec<bits<8> OpcVar, string OpcodeStr, SDNode OpNode, multiclass avx512_permil_vec<bits<8> OpcVar, string OpcodeStr, SDNode OpNode,
X86VectorVTInfo _, X86VectorVTInfo Ctrl> { OpndItins itins, X86VectorVTInfo _,
X86VectorVTInfo Ctrl> {
defm rr: AVX512_maskable<OpcVar, MRMSrcReg, _, (outs _.RC:$dst), defm rr: AVX512_maskable<OpcVar, MRMSrcReg, _, (outs _.RC:$dst),
(ins _.RC:$src1, Ctrl.RC:$src2), OpcodeStr, (ins _.RC:$src1, Ctrl.RC:$src2), OpcodeStr,
"$src2, $src1", "$src1, $src2", "$src2, $src1", "$src1, $src2",
(_.VT (OpNode _.RC:$src1, (_.VT (OpNode _.RC:$src1,
(Ctrl.VT Ctrl.RC:$src2)))>, (Ctrl.VT Ctrl.RC:$src2))), itins.rr>,
T8PD, EVEX_4V; T8PD, EVEX_4V, Sched<[itins.Sched]>;
defm rm: AVX512_maskable<OpcVar, MRMSrcMem, _, (outs _.RC:$dst), defm rm: AVX512_maskable<OpcVar, MRMSrcMem, _, (outs _.RC:$dst),
(ins _.RC:$src1, Ctrl.MemOp:$src2), OpcodeStr, (ins _.RC:$src1, Ctrl.MemOp:$src2), OpcodeStr,
"$src2, $src1", "$src1, $src2", "$src2, $src1", "$src1, $src2",
(_.VT (OpNode (_.VT (OpNode
_.RC:$src1, _.RC:$src1,
(Ctrl.VT (bitconvert(Ctrl.LdFrag addr:$src2)))))>, (Ctrl.VT (bitconvert(Ctrl.LdFrag addr:$src2))))),
T8PD, EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>; itins.rm>, T8PD, EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>,
Sched<[itins.Sched.Folded, ReadAfterLd]>;
defm rmb: AVX512_maskable<OpcVar, MRMSrcMem, _, (outs _.RC:$dst), defm rmb: AVX512_maskable<OpcVar, MRMSrcMem, _, (outs _.RC:$dst),
(ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr, (ins _.RC:$src1, _.ScalarMemOp:$src2), OpcodeStr,
"${src2}"##_.BroadcastStr##", $src1", "${src2}"##_.BroadcastStr##", $src1",
@ -5617,28 +5619,29 @@ multiclass avx512_permil_vec<bits<8> OpcVar, string OpcodeStr, SDNode OpNode,
(_.VT (OpNode (_.VT (OpNode
_.RC:$src1, _.RC:$src1,
(Ctrl.VT (X86VBroadcast (Ctrl.VT (X86VBroadcast
(Ctrl.ScalarLdFrag addr:$src2)))))>, (Ctrl.ScalarLdFrag addr:$src2))))),
T8PD, EVEX_4V, EVEX_B, EVEX_CD8<_.EltSize, CD8VF>; itins.rm>, T8PD, EVEX_4V, EVEX_B, EVEX_CD8<_.EltSize, CD8VF>,
Sched<[itins.Sched.Folded, ReadAfterLd]>;
} }
multiclass avx512_permil_vec_common<string OpcodeStr, bits<8> OpcVar, multiclass avx512_permil_vec_common<string OpcodeStr, bits<8> OpcVar,
AVX512VLVectorVTInfo _, AVX512VLVectorVTInfo Ctrl>{ OpndItins itins, AVX512VLVectorVTInfo _,
AVX512VLVectorVTInfo Ctrl> {
let Predicates = [HasAVX512] in { let Predicates = [HasAVX512] in {
defm Z : avx512_permil_vec<OpcVar, OpcodeStr, X86VPermilpv, _.info512, defm Z : avx512_permil_vec<OpcVar, OpcodeStr, X86VPermilpv, itins,
Ctrl.info512>, EVEX_V512; _.info512, Ctrl.info512>, EVEX_V512;
} }
let Predicates = [HasAVX512, HasVLX] in { let Predicates = [HasAVX512, HasVLX] in {
defm Z128 : avx512_permil_vec<OpcVar, OpcodeStr, X86VPermilpv, _.info128, defm Z128 : avx512_permil_vec<OpcVar, OpcodeStr, X86VPermilpv, itins,
Ctrl.info128>, EVEX_V128; _.info128, Ctrl.info128>, EVEX_V128;
defm Z256 : avx512_permil_vec<OpcVar, OpcodeStr, X86VPermilpv, _.info256, defm Z256 : avx512_permil_vec<OpcVar, OpcodeStr, X86VPermilpv, itins,
Ctrl.info256>, EVEX_V256; _.info256, Ctrl.info256>, EVEX_V256;
} }
} }
multiclass avx512_permil<string OpcodeStr, bits<8> OpcImm, bits<8> OpcVar, multiclass avx512_permil<string OpcodeStr, bits<8> OpcImm, bits<8> OpcVar,
AVX512VLVectorVTInfo _, AVX512VLVectorVTInfo Ctrl>{ AVX512VLVectorVTInfo _, AVX512VLVectorVTInfo Ctrl>{
defm NAME: avx512_permil_vec_common<OpcodeStr, OpcVar, AVX_VPERMILV, _, Ctrl>;
defm NAME: avx512_permil_vec_common<OpcodeStr, OpcVar, _, Ctrl>;
defm NAME: avx512_shift_rmi_sizes<OpcImm, MRMSrcReg, MRMSrcMem, OpcodeStr, defm NAME: avx512_shift_rmi_sizes<OpcImm, MRMSrcReg, MRMSrcMem, OpcodeStr,
X86VPermilpi, _>, X86VPermilpi, _>,
EVEX, AVX512AIi8Base, EVEX_CD8<_.info128.EltSize, CD8VF>; 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 let ExeDomain = SSEPackedDouble in
defm VPERMILPD : avx512_permil<"vpermilpd", 0x05, 0x0D, avx512vl_f64_info, defm VPERMILPD : avx512_permil<"vpermilpd", 0x05, 0x0D, avx512vl_f64_info,
avx512vl_i64_info>, VEX_W; avx512vl_i64_info>, VEX_W;
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// AVX-512 - VPSHUFD, VPSHUFLW, VPSHUFHW // AVX-512 - VPSHUFD, VPSHUFLW, VPSHUFHW
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//

View File

@ -7612,6 +7612,17 @@ defm VMASKMOVPD : avx_movmask_rm<0x2D, 0x2F, "vmaskmovpd",
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// VPERMIL - Permute Single and Double Floating-Point Values // 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<bits<8> opc_rm, bits<8> opc_rmi, string OpcodeStr, multiclass avx_permil<bits<8> opc_rm, bits<8> opc_rmi, string OpcodeStr,
RegisterClass RC, X86MemOperand x86memop_f, RegisterClass RC, X86MemOperand x86memop_f,
X86MemOperand x86memop_i, PatFrag i_frag, X86MemOperand x86memop_i, PatFrag i_frag,