@@ -7227,8 +7227,23 @@ def : Pat<(v2i64 (int_aarch64_neon_vcopy_lane
7227
7227
V128:$Vd, VectorIndexD:$idx, V128:$Vs, VectorIndexD:$idx2)
7228
7228
)>;
7229
7229
7230
- multiclass Neon_INS_elt_pattern<ValueType VT128, ValueType VT64,
7231
- ValueType VTScal, Instruction INS> {
7230
+ // Move elements between vectors
7231
+ multiclass Neon_INS_elt_pattern<ValueType VT128, ValueType VT64, ValueType VTSVE,
7232
+ ValueType VTScal, Operand SVEIdxTy, Instruction INS> {
7233
+ // Extracting from the lowest 128-bits of an SVE vector
7234
+ def : Pat<(VT128 (vector_insert VT128:$Rn,
7235
+ (VTScal (vector_extract VTSVE:$Rm, (i64 SVEIdxTy:$Immn))),
7236
+ (i64 imm:$Immd))),
7237
+ (INS VT128:$Rn, imm:$Immd, (VT128 (EXTRACT_SUBREG VTSVE:$Rm, zsub)), SVEIdxTy:$Immn)>;
7238
+
7239
+ def : Pat<(VT64 (vector_insert VT64:$Rn,
7240
+ (VTScal (vector_extract VTSVE:$Rm, (i64 SVEIdxTy:$Immn))),
7241
+ (i64 imm:$Immd))),
7242
+ (EXTRACT_SUBREG
7243
+ (INS (SUBREG_TO_REG (i64 0), VT64:$Rn, dsub), imm:$Immd,
7244
+ (VT128 (EXTRACT_SUBREG VTSVE:$Rm, zsub)), SVEIdxTy:$Immn),
7245
+ dsub)>;
7246
+ // Extracting from another NEON vector
7232
7247
def : Pat<(VT128 (vector_insert V128:$src,
7233
7248
(VTScal (vector_extract (VT128 V128:$Rn), (i64 imm:$Immn))),
7234
7249
(i64 imm:$Immd))),
@@ -7256,15 +7271,15 @@ multiclass Neon_INS_elt_pattern<ValueType VT128, ValueType VT64,
7256
7271
dsub)>;
7257
7272
}
7258
7273
7259
- defm : Neon_INS_elt_pattern<v8f16, v4f16, f16, INSvi16lane>;
7260
- defm : Neon_INS_elt_pattern<v8bf16, v4bf16, bf16, INSvi16lane>;
7261
- defm : Neon_INS_elt_pattern<v4f32, v2f32, f32, INSvi32lane>;
7262
- defm : Neon_INS_elt_pattern<v2f64, v1f64, f64, INSvi64lane>;
7274
+ defm : Neon_INS_elt_pattern<v8f16, v4f16, nxv8f16, f16, VectorIndexH , INSvi16lane>;
7275
+ defm : Neon_INS_elt_pattern<v8bf16, v4bf16, nxv8bf16, bf16, VectorIndexH , INSvi16lane>;
7276
+ defm : Neon_INS_elt_pattern<v4f32, v2f32, nxv4f32, f32, VectorIndexS , INSvi32lane>;
7277
+ defm : Neon_INS_elt_pattern<v2f64, v1f64, nxv2f64, f64, VectorIndexD , INSvi64lane>;
7263
7278
7264
- defm : Neon_INS_elt_pattern<v16i8, v8i8, i32, INSvi8lane>;
7265
- defm : Neon_INS_elt_pattern<v8i16, v4i16, i32, INSvi16lane>;
7266
- defm : Neon_INS_elt_pattern<v4i32, v2i32, i32, INSvi32lane>;
7267
- defm : Neon_INS_elt_pattern<v2i64, v1i64, i64, INSvi64lane>;
7279
+ defm : Neon_INS_elt_pattern<v16i8, v8i8, nxv16i8, i32, VectorIndexB , INSvi8lane>;
7280
+ defm : Neon_INS_elt_pattern<v8i16, v4i16, nxv8i16, i32, VectorIndexH , INSvi16lane>;
7281
+ defm : Neon_INS_elt_pattern<v4i32, v2i32, nxv4i32, i32, VectorIndexS , INSvi32lane>;
7282
+ defm : Neon_INS_elt_pattern<v2i64, v1i64, nxv2i64, i64, VectorIndexD , INSvi64lane>;
7268
7283
7269
7284
// Insert from bitcast
7270
7285
// vector_insert(bitcast(f32 src), n, lane) -> INSvi32lane(src, lane, INSERT_SUBREG(-, n), 0)
0 commit comments