Skip to content

Commit acf404e

Browse files
author
git apple-llvm automerger
committed
Merge commit '0800351da4c7' from llvm.org/main into next
2 parents f78791b + 0800351 commit acf404e

File tree

5 files changed

+568
-96
lines changed

5 files changed

+568
-96
lines changed

llvm/lib/Target/AArch64/AArch64InstrInfo.td

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7230,8 +7230,23 @@ def : Pat<(v2i64 (int_aarch64_neon_vcopy_lane
72307230
V128:$Vd, VectorIndexD:$idx, V128:$Vs, VectorIndexD:$idx2)
72317231
)>;
72327232

7233-
multiclass Neon_INS_elt_pattern<ValueType VT128, ValueType VT64,
7234-
ValueType VTScal, Instruction INS> {
7233+
// Move elements between vectors
7234+
multiclass Neon_INS_elt_pattern<ValueType VT128, ValueType VT64, ValueType VTSVE,
7235+
ValueType VTScal, Operand SVEIdxTy, Instruction INS> {
7236+
// Extracting from the lowest 128-bits of an SVE vector
7237+
def : Pat<(VT128 (vector_insert VT128:$Rn,
7238+
(VTScal (vector_extract VTSVE:$Rm, (i64 SVEIdxTy:$Immn))),
7239+
(i64 imm:$Immd))),
7240+
(INS VT128:$Rn, imm:$Immd, (VT128 (EXTRACT_SUBREG VTSVE:$Rm, zsub)), SVEIdxTy:$Immn)>;
7241+
7242+
def : Pat<(VT64 (vector_insert VT64:$Rn,
7243+
(VTScal (vector_extract VTSVE:$Rm, (i64 SVEIdxTy:$Immn))),
7244+
(i64 imm:$Immd))),
7245+
(EXTRACT_SUBREG
7246+
(INS (SUBREG_TO_REG (i64 0), VT64:$Rn, dsub), imm:$Immd,
7247+
(VT128 (EXTRACT_SUBREG VTSVE:$Rm, zsub)), SVEIdxTy:$Immn),
7248+
dsub)>;
7249+
// Extracting from another NEON vector
72357250
def : Pat<(VT128 (vector_insert V128:$src,
72367251
(VTScal (vector_extract (VT128 V128:$Rn), (i64 imm:$Immn))),
72377252
(i64 imm:$Immd))),
@@ -7259,15 +7274,15 @@ multiclass Neon_INS_elt_pattern<ValueType VT128, ValueType VT64,
72597274
dsub)>;
72607275
}
72617276

7262-
defm : Neon_INS_elt_pattern<v8f16, v4f16, f16, INSvi16lane>;
7263-
defm : Neon_INS_elt_pattern<v8bf16, v4bf16, bf16, INSvi16lane>;
7264-
defm : Neon_INS_elt_pattern<v4f32, v2f32, f32, INSvi32lane>;
7265-
defm : Neon_INS_elt_pattern<v2f64, v1f64, f64, INSvi64lane>;
7277+
defm : Neon_INS_elt_pattern<v8f16, v4f16, nxv8f16, f16, VectorIndexH, INSvi16lane>;
7278+
defm : Neon_INS_elt_pattern<v8bf16, v4bf16, nxv8bf16, bf16, VectorIndexH, INSvi16lane>;
7279+
defm : Neon_INS_elt_pattern<v4f32, v2f32, nxv4f32, f32, VectorIndexS, INSvi32lane>;
7280+
defm : Neon_INS_elt_pattern<v2f64, v1f64, nxv2f64, f64, VectorIndexD, INSvi64lane>;
72667281

7267-
defm : Neon_INS_elt_pattern<v16i8, v8i8, i32, INSvi8lane>;
7268-
defm : Neon_INS_elt_pattern<v8i16, v4i16, i32, INSvi16lane>;
7269-
defm : Neon_INS_elt_pattern<v4i32, v2i32, i32, INSvi32lane>;
7270-
defm : Neon_INS_elt_pattern<v2i64, v1i64, i64, INSvi64lane>;
7282+
defm : Neon_INS_elt_pattern<v16i8, v8i8, nxv16i8, i32, VectorIndexB, INSvi8lane>;
7283+
defm : Neon_INS_elt_pattern<v8i16, v4i16, nxv8i16, i32, VectorIndexH, INSvi16lane>;
7284+
defm : Neon_INS_elt_pattern<v4i32, v2i32, nxv4i32, i32, VectorIndexS, INSvi32lane>;
7285+
defm : Neon_INS_elt_pattern<v2i64, v1i64, nxv2i64, i64, VectorIndexD, INSvi64lane>;
72717286

72727287
// Insert from bitcast
72737288
// vector_insert(bitcast(f32 src), n, lane) -> INSvi32lane(src, lane, INSERT_SUBREG(-, n), 0)

llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3366,6 +3366,21 @@ let Predicates = [HasSVEorSME] in {
33663366
(UMOVvi32 (v4i32 (EXTRACT_SUBREG ZPR:$vec, zsub)), VectorIndexS:$index)>;
33673367
def : Pat<(i64 (vector_extract nxv2i64:$vec, VectorIndexD:$index)),
33683368
(UMOVvi64 (v2i64 (EXTRACT_SUBREG ZPR:$vec, zsub)), VectorIndexD:$index)>;
3369+
3370+
// Move element from the bottom 128-bits of a scalable vector to a single-element vector.
3371+
// Alternative case where insertelement is just scalar_to_vector rather than vector_insert.
3372+
def : Pat<(v1f64 (scalar_to_vector
3373+
(f64 (vector_extract nxv2f64:$vec, VectorIndexD:$index)))),
3374+
(EXTRACT_SUBREG
3375+
(INSvi64lane (IMPLICIT_DEF), (i64 0),
3376+
(EXTRACT_SUBREG nxv2f64:$vec, zsub), VectorIndexD:$index),
3377+
dsub)>;
3378+
def : Pat<(v1i64 (scalar_to_vector
3379+
(i64 (vector_extract nxv2i64:$vec, VectorIndexD:$index)))),
3380+
(EXTRACT_SUBREG
3381+
(INSvi64lane (IMPLICIT_DEF), (i64 0),
3382+
(EXTRACT_SUBREG nxv2i64:$vec, zsub), VectorIndexD:$index),
3383+
dsub)>;
33693384
} // End HasNEON
33703385

33713386
let Predicates = [HasNEON] in {

0 commit comments

Comments
 (0)