diff options
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrAVX512.td | 17 | 
2 files changed, 23 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 74299e92d4a..3a013a24111 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -13102,10 +13102,13 @@ SDValue X86TargetLowering::LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const {    }    // vpmovqb/w/d, vpmovdb/w, vpmovwb -  if (((!InVT.is512BitVector() && Subtarget->hasVLX()) || InVT.is512BitVector()) && -      (InVT.getVectorElementType() != MVT::i16 || Subtarget->hasBWI())) +  if (Subtarget->hasAVX512()) { +    // word to byte only under BWI +    if (InVT == MVT::v16i16 && !Subtarget->hasBWI()) // v16i16 -> v16i8 +      return DAG.getNode(X86ISD::VTRUNC, DL, VT, +                         DAG.getNode(X86ISD::VSEXT, DL, MVT::v16i32, In));      return DAG.getNode(X86ISD::VTRUNC, DL, VT, In); - +  }    if ((VT == MVT::v4i32) && (InVT == MVT::v4i64)) {      // On AVX2, v4i64 -> v4i32 becomes VPERMD.      if (Subtarget->hasInt256()) { diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index ca124ed253c..60ba687da62 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -6036,6 +6036,23 @@ defm VPMOVWB    : avx512_trunc_wb<0x30, "vpmovwb", X86vtrunc>;  defm VPMOVSWB   : avx512_trunc_sat_wb<0x20, "s",   X86vtruncs>;  defm VPMOVUSWB  : avx512_trunc_sat_wb<0x10, "us",  X86vtruncus>; +let Predicates = [HasAVX512, NoVLX] in { +def: Pat<(v8i16 (X86vtrunc (v8i32 VR256X:$src))), +         (v8i16 (EXTRACT_SUBREG +                 (v16i16 (VPMOVDWZrr (v16i32 (SUBREG_TO_REG (i32 0), +                                          VR256X:$src, sub_ymm)))), sub_xmm))>; +def: Pat<(v4i32 (X86vtrunc (v4i64 VR256X:$src))), +         (v4i32 (EXTRACT_SUBREG +                 (v8i32 (VPMOVQDZrr (v8i64 (SUBREG_TO_REG (i32 0), +                                           VR256X:$src, sub_ymm)))), sub_xmm))>; +} + +let Predicates = [HasBWI, NoVLX] in { +def: Pat<(v16i8 (X86vtrunc (v16i16 VR256X:$src))), +         (v16i8 (EXTRACT_SUBREG  (VPMOVWBZrr (v32i16 (SUBREG_TO_REG (i32 0), +                                            VR256X:$src, sub_ymm))), sub_xmm))>; +} +  multiclass avx512_extend_common<bits<8> opc, string OpcodeStr,                    X86VectorVTInfo DestInfo, X86VectorVTInfo SrcInfo,                    X86MemOperand x86memop, PatFrag LdFrag, SDNode OpNode>{  | 

