diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrAVX512.td | 24 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrFragmentsSIMD.td | 62 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrSSE.td | 8 | 
3 files changed, 35 insertions, 59 deletions
| diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index b7172050b36..48da35f11a2 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -3376,15 +3376,15 @@ multiclass avx512_alignedload_vl<bits<8> opc, string OpcodeStr,                                   string EVEX2VEXOvrd, bit NoRMPattern = 0> {    let Predicates = [prd] in    defm Z : avx512_load<opc, OpcodeStr, NAME, _.info512, -                       _.info512.AlignedLdFrag, masked_load_aligned512, +                       _.info512.AlignedLdFrag, masked_load_aligned,                         Sched.ZMM, "", NoRMPattern>, EVEX_V512;    let Predicates = [prd, HasVLX] in {    defm Z256 : avx512_load<opc, OpcodeStr, NAME, _.info256, -                          _.info256.AlignedLdFrag, masked_load_aligned256, +                          _.info256.AlignedLdFrag, masked_load_aligned,                            Sched.YMM, EVEX2VEXOvrd#"Y", NoRMPattern>, EVEX_V256;    defm Z128 : avx512_load<opc, OpcodeStr, NAME, _.info128, -                          _.info128.AlignedLdFrag, masked_load_aligned128, +                          _.info128.AlignedLdFrag, masked_load_aligned,                            Sched.XMM, EVEX2VEXOvrd, NoRMPattern>, EVEX_V128;    }  } @@ -3396,15 +3396,15 @@ multiclass avx512_load_vl<bits<8> opc, string OpcodeStr,                            SDPatternOperator SelectOprr = vselect> {    let Predicates = [prd] in    defm Z : avx512_load<opc, OpcodeStr, NAME, _.info512, _.info512.LdFrag, -                       masked_load_unaligned, Sched.ZMM, "", +                       masked_load, Sched.ZMM, "",                         NoRMPattern, SelectOprr>, EVEX_V512;    let Predicates = [prd, HasVLX] in {    defm Z256 : avx512_load<opc, OpcodeStr, NAME, _.info256, _.info256.LdFrag, -                         masked_load_unaligned, Sched.YMM, EVEX2VEXOvrd#"Y", +                         masked_load, Sched.YMM, EVEX2VEXOvrd#"Y",                           NoRMPattern, SelectOprr>, EVEX_V256;    defm Z128 : avx512_load<opc, OpcodeStr, NAME, _.info128, _.info128.LdFrag, -                         masked_load_unaligned, Sched.XMM, EVEX2VEXOvrd, +                         masked_load, Sched.XMM, EVEX2VEXOvrd,                           NoRMPattern, SelectOprr>, EVEX_V128;    }  } @@ -3470,14 +3470,14 @@ multiclass avx512_store_vl< bits<8> opc, string OpcodeStr,                              string EVEX2VEXOvrd, bit NoMRPattern = 0> {    let Predicates = [prd] in    defm Z : avx512_store<opc, OpcodeStr, NAME, _.info512, store, -                        masked_store_unaligned, Sched.ZMM, "", +                        masked_store, Sched.ZMM, "",                          NoMRPattern>, EVEX_V512;    let Predicates = [prd, HasVLX] in {      defm Z256 : avx512_store<opc, OpcodeStr, NAME, _.info256, store, -                             masked_store_unaligned, Sched.YMM, +                             masked_store, Sched.YMM,                               EVEX2VEXOvrd#"Y", NoMRPattern>, EVEX_V256;      defm Z128 : avx512_store<opc, OpcodeStr, NAME, _.info128, store, -                             masked_store_unaligned, Sched.XMM, EVEX2VEXOvrd, +                             masked_store, Sched.XMM, EVEX2VEXOvrd,                               NoMRPattern>, EVEX_V128;    }  } @@ -3488,15 +3488,15 @@ multiclass avx512_alignedstore_vl<bits<8> opc, string OpcodeStr,                                    string EVEX2VEXOvrd, bit NoMRPattern = 0> {    let Predicates = [prd] in    defm Z : avx512_store<opc, OpcodeStr, NAME, _.info512, alignedstore, -                        masked_store_aligned512, Sched.ZMM, "", +                        masked_store_aligned, Sched.ZMM, "",                          NoMRPattern>, EVEX_V512;    let Predicates = [prd, HasVLX] in {      defm Z256 : avx512_store<opc, OpcodeStr, NAME, _.info256, alignedstore, -                             masked_store_aligned256, Sched.YMM, +                             masked_store_aligned, Sched.YMM,                               EVEX2VEXOvrd#"Y", NoMRPattern>, EVEX_V256;      defm Z128 : avx512_store<opc, OpcodeStr, NAME, _.info128, alignedstore, -                             masked_store_aligned128, Sched.XMM, EVEX2VEXOvrd, +                             masked_store_aligned, Sched.XMM, EVEX2VEXOvrd,                               NoMRPattern>, EVEX_V128;    }  } diff --git a/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td b/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td index 766194abf04..85fae57a6ef 100644 --- a/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td +++ b/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td @@ -1008,70 +1008,46 @@ def vinsert256_insert : PatFrag<(ops node:$bigvec, node:$smallvec,                                                     node:$index), [{}],                                  INSERT_get_vinsert256_imm>; -def X86mload : PatFrag<(ops node:$src1, node:$src2, node:$src3), -                         (masked_load node:$src1, node:$src2, node:$src3), [{ +def masked_load : PatFrag<(ops node:$src1, node:$src2, node:$src3), +                          (masked_ld node:$src1, node:$src2, node:$src3), [{    return !cast<MaskedLoadSDNode>(N)->isExpandingLoad() &&      cast<MaskedLoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD;  }]>; -def masked_load_aligned128 : PatFrag<(ops node:$src1, node:$src2, node:$src3), -                         (X86mload node:$src1, node:$src2, node:$src3), [{ -  return cast<MaskedLoadSDNode>(N)->getAlignment() >= 16; -}]>; - -def masked_load_aligned256 : PatFrag<(ops node:$src1, node:$src2, node:$src3), -                         (X86mload node:$src1, node:$src2, node:$src3), [{ -  return cast<MaskedLoadSDNode>(N)->getAlignment() >= 32; -}]>; - -def masked_load_aligned512 : PatFrag<(ops node:$src1, node:$src2, node:$src3), -                         (X86mload node:$src1, node:$src2, node:$src3), [{ -  return cast<MaskedLoadSDNode>(N)->getAlignment() >= 64; -}]>; - -def masked_load_unaligned : PatFrag<(ops node:$src1, node:$src2, node:$src3), +def masked_load_aligned : PatFrag<(ops node:$src1, node:$src2, node:$src3),                           (masked_load node:$src1, node:$src2, node:$src3), [{ -  return !cast<MaskedLoadSDNode>(N)->isExpandingLoad() && -    cast<MaskedLoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD; +  // Use the node type to determine the size the alignment needs to match. +  // We can't use memory VT because type widening changes the node VT, but +  // not the memory VT. +  auto *Ld = cast<MaskedLoadSDNode>(N); +  return Ld->getAlignment() >= Ld->getValueType(0).getStoreSize();  }]>;  def X86mExpandingLoad : PatFrag<(ops node:$src1, node:$src2, node:$src3), -                         (masked_load node:$src1, node:$src2, node:$src3), [{ +                         (masked_ld node:$src1, node:$src2, node:$src3), [{    return cast<MaskedLoadSDNode>(N)->isExpandingLoad();  }]>;  // Masked store fragments.  // X86mstore can't be implemented in core DAG files because some targets  // do not support vector types (llvm-tblgen will fail). -def X86mstore : PatFrag<(ops node:$src1, node:$src2, node:$src3), -                        (masked_store node:$src1, node:$src2, node:$src3), [{ +def masked_store : PatFrag<(ops node:$src1, node:$src2, node:$src3), +                        (masked_st node:$src1, node:$src2, node:$src3), [{    return (!cast<MaskedStoreSDNode>(N)->isTruncatingStore()) &&           (!cast<MaskedStoreSDNode>(N)->isCompressingStore());  }]>; -def masked_store_aligned128 : PatFrag<(ops node:$src1, node:$src2, node:$src3), -                         (X86mstore node:$src1, node:$src2, node:$src3), [{ -  return cast<MaskedStoreSDNode>(N)->getAlignment() >= 16; -}]>; - -def masked_store_aligned256 : PatFrag<(ops node:$src1, node:$src2, node:$src3), -                         (X86mstore node:$src1, node:$src2, node:$src3), [{ -  return cast<MaskedStoreSDNode>(N)->getAlignment() >= 32; -}]>; - -def masked_store_aligned512 : PatFrag<(ops node:$src1, node:$src2, node:$src3), -                         (X86mstore node:$src1, node:$src2, node:$src3), [{ -  return cast<MaskedStoreSDNode>(N)->getAlignment() >= 64; -}]>; - -def masked_store_unaligned : PatFrag<(ops node:$src1, node:$src2, node:$src3), +def masked_store_aligned : PatFrag<(ops node:$src1, node:$src2, node:$src3),                           (masked_store node:$src1, node:$src2, node:$src3), [{ -  return (!cast<MaskedStoreSDNode>(N)->isTruncatingStore()) && -         (!cast<MaskedStoreSDNode>(N)->isCompressingStore()); +  // Use the node type to determine the size the alignment needs to match. +  // We can't use memory VT because type widening changes the node VT, but +  // not the memory VT. +  auto *St = cast<MaskedStoreSDNode>(N); +  return St->getAlignment() >= St->getOperand(1).getValueType().getStoreSize();  }]>;  def X86mCompressingStore : PatFrag<(ops node:$src1, node:$src2, node:$src3), -                             (masked_store node:$src1, node:$src2, node:$src3), [{ +                             (masked_st node:$src1, node:$src2, node:$src3), [{      return cast<MaskedStoreSDNode>(N)->isCompressingStore();  }]>; @@ -1079,7 +1055,7 @@ def X86mCompressingStore : PatFrag<(ops node:$src1, node:$src2, node:$src3),  // X86mtruncstore can't be implemented in core DAG files because some targets  // doesn't support vector type ( llvm-tblgen will fail)  def X86mtruncstore : PatFrag<(ops node:$src1, node:$src2, node:$src3), -                             (masked_store node:$src1, node:$src2, node:$src3), [{ +                             (masked_st node:$src1, node:$src2, node:$src3), [{      return cast<MaskedStoreSDNode>(N)->isTruncatingStore();  }]>;  def masked_truncstorevi8 : diff --git a/llvm/lib/Target/X86/X86InstrSSE.td b/llvm/lib/Target/X86/X86InstrSSE.td index 810beb6f40b..1ab7af56797 100644 --- a/llvm/lib/Target/X86/X86InstrSSE.td +++ b/llvm/lib/Target/X86/X86InstrSSE.td @@ -7819,15 +7819,15 @@ defm VPMASKMOVQ : avx2_pmovmask<"vpmaskmovq",  multiclass maskmov_lowering<string InstrStr, RegisterClass RC, ValueType VT,                            ValueType MaskVT, string BlendStr, ValueType ZeroVT> {      // masked store -    def: Pat<(X86mstore (VT RC:$src), addr:$ptr, (MaskVT RC:$mask)), +    def: Pat<(masked_store (VT RC:$src), addr:$ptr, (MaskVT RC:$mask)),               (!cast<Instruction>(InstrStr#"mr") addr:$ptr, RC:$mask, RC:$src)>;      // masked load -    def: Pat<(VT (X86mload addr:$ptr, (MaskVT RC:$mask), undef)), +    def: Pat<(VT (masked_load addr:$ptr, (MaskVT RC:$mask), undef)),               (!cast<Instruction>(InstrStr#"rm") RC:$mask, addr:$ptr)>; -    def: Pat<(VT (X86mload addr:$ptr, (MaskVT RC:$mask), +    def: Pat<(VT (masked_load addr:$ptr, (MaskVT RC:$mask),                                (VT immAllZerosV))),               (!cast<Instruction>(InstrStr#"rm") RC:$mask, addr:$ptr)>; -    def: Pat<(VT (X86mload addr:$ptr, (MaskVT RC:$mask), (VT RC:$src0))), +    def: Pat<(VT (masked_load addr:$ptr, (MaskVT RC:$mask), (VT RC:$src0))),               (!cast<Instruction>(BlendStr#"rr")                   RC:$src0,                   (VT (!cast<Instruction>(InstrStr#"rm") RC:$mask, addr:$ptr)), | 

