From aa66dbe530be49721155dbb646f7653f04301833 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Mon, 2 Apr 2018 02:44:55 +0000 Subject: [PATCH] [X86] Give the AVX512 VEXTRACT instructions the same SchedRWs as the SSE/AVX versions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@328958 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86InstrAVX512.td | 48 ++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/lib/Target/X86/X86InstrAVX512.td b/lib/Target/X86/X86InstrAVX512.td index 188a1679ef3..7eaed32d634 100644 --- a/lib/Target/X86/X86InstrAVX512.td +++ b/lib/Target/X86/X86InstrAVX512.td @@ -799,7 +799,7 @@ multiclass vextract_for_size_split { + SchedWrite SchedRR, SchedWrite SchedMR> { let hasSideEffects = 0, ExeDomain = To.ExeDomain in { defm rr : AVX512_maskable_split, AVX512AIi8Base, EVEX, Sched<[itins.Sched]>; + NoItinerary>, AVX512AIi8Base, EVEX, Sched<[SchedRR]>; def mr : AVX512AIi8, EVEX, - Sched<[itins.Sched.Folded, ReadAfterLd]>; + addr:$dst)], NoItinerary>, EVEX, + Sched<[SchedMR]>; let mayStore = 1, hasSideEffects = 0 in def mrk : AVX512AIi8, EVEX_K, EVEX, - Sched<[itins.Sched.Folded, ReadAfterLd]>; + [], NoItinerary>, EVEX_K, EVEX, + Sched<[SchedMR]>; } } @@ -835,8 +835,8 @@ multiclass vextract_for_size_split : - vextract_for_size_split; + SchedWrite SchedRR, SchedWrite SchedMR> : + vextract_for_size_split; // Codegen pattern for the alternative types multiclass vextract_for_size_lowering { + SchedWrite SchedRR, SchedWrite SchedMR> { let Predicates = [HasAVX512] in { defm NAME # "32x4Z" : vextract_for_size, X86VectorVTInfo< 4, EltVT32, VR128X>, - vextract128_extract, itins>, + vextract128_extract, SchedRR, SchedMR>, EVEX_V512, EVEX_CD8<32, CD8VT4>; defm NAME # "64x4Z" : vextract_for_size, X86VectorVTInfo< 4, EltVT64, VR256X>, - vextract256_extract, itins>, + vextract256_extract, SchedRR, SchedMR>, VEX_W, EVEX_V512, EVEX_CD8<64, CD8VT4>; } let Predicates = [HasVLX] in defm NAME # "32x4Z256" : vextract_for_size, X86VectorVTInfo< 4, EltVT32, VR128X>, - vextract128_extract, itins>, + vextract128_extract, SchedRR, SchedMR>, EVEX_V256, EVEX_CD8<32, CD8VT4>; // Even with DQI we'd like to only use these instructions for masking. @@ -881,7 +881,7 @@ multiclass vextract_for_type, X86VectorVTInfo< 2, EltVT64, VR128X>, - null_frag, vextract128_extract, itins>, + null_frag, vextract128_extract, SchedRR, SchedMR>, VEX_W, EVEX_V256, EVEX_CD8<64, CD8VT2>; // Even with DQI we'd like to only use these instructions for masking. @@ -889,28 +889,18 @@ multiclass vextract_for_type, X86VectorVTInfo< 2, EltVT64, VR128X>, - null_frag, vextract128_extract, itins>, + null_frag, vextract128_extract, SchedRR, SchedMR>, VEX_W, EVEX_V512, EVEX_CD8<64, CD8VT2>; defm NAME # "32x8Z" : vextract_for_size_split, X86VectorVTInfo< 8, EltVT32, VR256X>, - null_frag, vextract256_extract, itins>, + null_frag, vextract256_extract, SchedRR, SchedMR>, EVEX_V512, EVEX_CD8<32, CD8VT8>; } } -// FIXME: Is there a better scheduler itinerary for VEXTRACTF/VEXTRACTI? -let Sched = WriteFShuffle256 in -def AVX512_VEXTRACTF : OpndItins< - IIC_SSE_SHUFP, IIC_SSE_SHUFP ->; -let Sched = WriteShuffle256 in -def AVX512_VEXTRACTI : OpndItins< - IIC_SSE_PSHUF_RI, IIC_SSE_PSHUF_MI ->; - -defm VEXTRACTF : vextract_for_type; -defm VEXTRACTI : vextract_for_type; +defm VEXTRACTF : vextract_for_type; +defm VEXTRACTI : vextract_for_type; // extract_subvector codegen patterns with the alternative types. // Even with AVX512DQ we'll still use these for unmasked operations. @@ -1117,14 +1107,14 @@ def VEXTRACTPSZrr : AVX512AIi8<0x17, MRMDestReg, (outs GR32:$dst), (ins VR128X:$src1, u8imm:$src2), "vextractps\t{$src2, $src1, $dst|$dst, $src1, $src2}", [(set GR32:$dst, (extractelt (bc_v4i32 (v4f32 VR128X:$src1)), imm:$src2))], - IIC_SSE_EXTRACTPS_RR>, EVEX, VEX_WIG, Sched<[WriteFShuffle]>; + IIC_SSE_EXTRACTPS_RR>, EVEX, VEX_WIG, Sched<[WriteFBlend]>; def VEXTRACTPSZmr : AVX512AIi8<0x17, MRMDestMem, (outs), (ins f32mem:$dst, VR128X:$src1, u8imm:$src2), "vextractps\t{$src2, $src1, $dst|$dst, $src1, $src2}", [(store (extractelt (bc_v4i32 (v4f32 VR128X:$src1)), imm:$src2), addr:$dst)], IIC_SSE_EXTRACTPS_RM>, - EVEX, VEX_WIG, EVEX_CD8<32, CD8VT1>, Sched<[WriteFShuffleLd]>; + EVEX, VEX_WIG, EVEX_CD8<32, CD8VT1>, Sched<[WriteFBlendLd, WriteRMW]>; //===---------------------------------------------------------------------===// // AVX-512 BROADCAST -- 2.11.0