diff options
author | Adam Nemet <anemet@apple.com> | 2014-10-15 23:42:17 +0000 |
---|---|---|
committer | Adam Nemet <anemet@apple.com> | 2014-10-15 23:42:17 +0000 |
commit | 4285c1f8cc98a779d3733529ceadf3941c4b86d4 (patch) | |
tree | e93ef0deb6328e078c47185e4ac545d33ad61d51 /llvm/lib | |
parent | 2b71ca5d88746ca83ce4aed15ca7984ea1224b5a (diff) | |
download | llvm-4285c1f8cc98a779d3733529ceadf3941c4b86d4.zip llvm-4285c1f8cc98a779d3733529ceadf3941c4b86d4.tar.gz llvm-4285c1f8cc98a779d3733529ceadf3941c4b86d4.tar.bz2 |
[AVX512] Add DQ subvector inserts
In AVX512f we support 64x2 and 32x8 inserts via matching them to 32x4 and 64x4
respectively. These are matched by "Alt" Pat<>'s (Alt stands for alternative
VTs).
Since DQ has native support for these intructions, I peeled off the non-"Alt"
part of the baseclass into vinsert_for_size_no_alt. The DQ instructions are
derived from this multiclass. The "Alt" Pat<>'s are disabled with DQ.
Fixes <rdar://problem/18426089>
llvm-svn: 219874
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86InstrAVX512.td | 43 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.td | 1 |
2 files changed, 33 insertions, 11 deletions
diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index 788fcab7..f20c882 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -347,11 +347,10 @@ def : Pat<(v8f64 immAllZerosV), (AVX512_512_SET0)>; // AVX-512 - VECTOR INSERT // -multiclass vinsert_for_size<int Opcode, - X86VectorVTInfo From, X86VectorVTInfo To, - X86VectorVTInfo AltFrom, X86VectorVTInfo AltTo, - PatFrag vinsert_insert, - SDNodeXForm INSERT_get_vinsert_imm> { +multiclass vinsert_for_size_no_alt<int Opcode, + X86VectorVTInfo From, X86VectorVTInfo To, + PatFrag vinsert_insert, + SDNodeXForm INSERT_get_vinsert_imm> { let hasSideEffects = 0, ExeDomain = To.ExeDomain in { def rr : AVX512AIi8<Opcode, MRMSrcReg, (outs VR512:$dst), (ins VR512:$src1, From.RC:$src2, i8imm:$src3), @@ -372,14 +371,24 @@ multiclass vinsert_for_size<int Opcode, []>, EVEX_4V, EVEX_V512, EVEX_CD8<From.EltSize, From.CD8TupleForm>; } +} +multiclass vinsert_for_size<int Opcode, + X86VectorVTInfo From, X86VectorVTInfo To, + X86VectorVTInfo AltFrom, X86VectorVTInfo AltTo, + PatFrag vinsert_insert, + SDNodeXForm INSERT_get_vinsert_imm> : + vinsert_for_size_no_alt<Opcode, From, To, + vinsert_insert, INSERT_get_vinsert_imm> { // Codegen pattern with the alternative types, e.g. v2i64 -> v8i64 for - // vinserti32x4 - def : Pat<(vinsert_insert:$ins - (AltTo.VT VR512:$src1), (AltFrom.VT From.RC:$src2), (iPTR imm)), - (AltTo.VT (!cast<Instruction>(NAME # From.EltSize # "x4rr") - VR512:$src1, From.RC:$src2, - (INSERT_get_vinsert_imm VR512:$ins)))>; + // vinserti32x4. Only add this if 64x2 and friends are not supported + // natively via AVX512DQ. + let Predicates = [NoDQI] in + def : Pat<(vinsert_insert:$ins + (AltTo.VT VR512:$src1), (AltFrom.VT From.RC:$src2), (iPTR imm)), + (AltTo.VT (!cast<Instruction>(NAME # From.EltSize # "x4rr") + VR512:$src1, From.RC:$src2, + (INSERT_get_vinsert_imm VR512:$ins)))>; } multiclass vinsert_for_type<ValueType EltVT32, int Opcode128, @@ -391,6 +400,12 @@ multiclass vinsert_for_type<ValueType EltVT32, int Opcode128, X86VectorVTInfo< 8, EltVT64, VR512>, vinsert128_insert, INSERT_get_vinsert128_imm>; + let Predicates = [HasDQI] in + defm NAME # "64x2" : vinsert_for_size_no_alt<Opcode128, + X86VectorVTInfo< 2, EltVT64, VR128X>, + X86VectorVTInfo< 8, EltVT64, VR512>, + vinsert128_insert, + INSERT_get_vinsert128_imm>, VEX_W; defm NAME # "64x4" : vinsert_for_size<Opcode256, X86VectorVTInfo< 4, EltVT64, VR256X>, X86VectorVTInfo< 8, EltVT64, VR512>, @@ -398,6 +413,12 @@ multiclass vinsert_for_type<ValueType EltVT32, int Opcode128, X86VectorVTInfo<16, EltVT32, VR512>, vinsert256_insert, INSERT_get_vinsert256_imm>, VEX_W; + let Predicates = [HasDQI] in + defm NAME # "32x8" : vinsert_for_size_no_alt<Opcode256, + X86VectorVTInfo< 8, EltVT32, VR256X>, + X86VectorVTInfo<16, EltVT32, VR512>, + vinsert256_insert, + INSERT_get_vinsert256_imm>; } defm VINSERTF : vinsert_for_type<f32, 0x18, f64, 0x1a>; diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index 4c55f7c..3dbf819 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -710,6 +710,7 @@ def HasCDI : Predicate<"Subtarget->hasCDI()">; def HasPFI : Predicate<"Subtarget->hasPFI()">; def HasERI : Predicate<"Subtarget->hasERI()">; def HasDQI : Predicate<"Subtarget->hasDQI()">; +def NoDQI : Predicate<"!Subtarget->hasDQI()">; def HasBWI : Predicate<"Subtarget->hasBWI()">; def HasVLX : Predicate<"Subtarget->hasVLX()">, AssemblerPredicate<"FeatureVLX", "AVX-512 VLX ISA">; |