diff options
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/ARM64/ARM64InstrInfo.td | 47 | 
1 files changed, 47 insertions, 0 deletions
| diff --git a/llvm/lib/Target/ARM64/ARM64InstrInfo.td b/llvm/lib/Target/ARM64/ARM64InstrInfo.td index d2f8452a9fb..51fe207ced8 100644 --- a/llvm/lib/Target/ARM64/ARM64InstrInfo.td +++ b/llvm/lib/Target/ARM64/ARM64InstrInfo.td @@ -4416,6 +4416,53 @@ def : St1Lane64Pat<truncstorei16, VectorIndexH, v4i16, i32, ST1i16>;  def : St1Lane64Pat<store,         VectorIndexS, v2i32, i32, ST1i32>;  def : St1Lane64Pat<store,         VectorIndexS, v2f32, f32, ST1i32>; +multiclass St1LanePost64Pat<SDPatternOperator scalar_store, Operand VecIndex, +                             ValueType VTy, ValueType STy, Instruction ST1, +                             int offset> { +  def : Pat<(scalar_store +              (STy (vector_extract (VTy VecListOne64:$Vt), VecIndex:$idx)), +              am_simdnoindex:$vaddr, offset), +        (ST1 (SUBREG_TO_REG (i32 0), VecListOne64:$Vt, dsub), +             VecIndex:$idx, am_simdnoindex:$vaddr, XZR)>; + +  def : Pat<(scalar_store +              (STy (vector_extract (VTy VecListOne64:$Vt), VecIndex:$idx)), +              am_simdnoindex:$vaddr, GPR64:$Rm), +        (ST1 (SUBREG_TO_REG (i32 0), VecListOne64:$Vt, dsub), +             VecIndex:$idx, am_simdnoindex:$vaddr, $Rm)>; +} + +defm : St1LanePost64Pat<post_truncsti8, VectorIndexB, v8i8, i32, ST1i8_POST, 1>; +defm : St1LanePost64Pat<post_truncsti16, VectorIndexH, v4i16, i32, ST1i16_POST, +                        2>; +defm : St1LanePost64Pat<post_store, VectorIndexS, v2i32, i32, ST1i32_POST, 4>; +defm : St1LanePost64Pat<post_store, VectorIndexS, v2f32, f32, ST1i32_POST, 4>; +defm : St1LanePost64Pat<post_store, VectorIndexD, v1i64, i64, ST1i64_POST, 8>; +defm : St1LanePost64Pat<post_store, VectorIndexD, v1f64, f64, ST1i64_POST, 8>; + +multiclass St1LanePost128Pat<SDPatternOperator scalar_store, Operand VecIndex, +                             ValueType VTy, ValueType STy, Instruction ST1, +                             int offset> { +  def : Pat<(scalar_store +              (STy (vector_extract (VTy VecListOne128:$Vt), VecIndex:$idx)), +              am_simdnoindex:$vaddr, offset), +        (ST1 VecListOne128:$Vt, VecIndex:$idx, am_simdnoindex:$vaddr, XZR)>; + +  def : Pat<(scalar_store +              (STy (vector_extract (VTy VecListOne128:$Vt), VecIndex:$idx)), +              am_simdnoindex:$vaddr, GPR64:$Rm), +        (ST1 VecListOne128:$Vt, VecIndex:$idx, am_simdnoindex:$vaddr, $Rm)>; +} + +defm : St1LanePost128Pat<post_truncsti8, VectorIndexB, v16i8, i32, ST1i8_POST, +                         1>; +defm : St1LanePost128Pat<post_truncsti16, VectorIndexH, v8i16, i32, ST1i16_POST, +                         2>; +defm : St1LanePost128Pat<post_store, VectorIndexS, v4i32, i32, ST1i32_POST, 4>; +defm : St1LanePost128Pat<post_store, VectorIndexS, v4f32, f32, ST1i32_POST, 4>; +defm : St1LanePost128Pat<post_store, VectorIndexD, v2i64, i64, ST1i64_POST, 8>; +defm : St1LanePost128Pat<post_store, VectorIndexD, v2f64, f64, ST1i64_POST, 8>; +  let mayStore = 1, neverHasSideEffects = 1 in {  defm ST2 : SIMDStSingleB<1, 0b000,       "st2", VecListTwob,   GPR64pi2>;  defm ST2 : SIMDStSingleH<1, 0b010, 0,    "st2", VecListTwoh,   GPR64pi4>; | 

