@@ -7230,8 +7230,23 @@ def : Pat<(v2i64 (int_aarch64_neon_vcopy_lane
7230
7230
V128:$Vd, VectorIndexD:$idx, V128:$Vs, VectorIndexD:$idx2)
7231
7231
)>;
7232
7232
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
7235
7250
def : Pat<(VT128 (vector_insert V128:$src,
7236
7251
(VTScal (vector_extract (VT128 V128:$Rn), (i64 imm:$Immn))),
7237
7252
(i64 imm:$Immd))),
@@ -7259,15 +7274,15 @@ multiclass Neon_INS_elt_pattern<ValueType VT128, ValueType VT64,
7259
7274
dsub)>;
7260
7275
}
7261
7276
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>;
7266
7281
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>;
7271
7286
7272
7287
// Insert from bitcast
7273
7288
// vector_insert(bitcast(f32 src), n, lane) -> INSvi32lane(src, lane, INSERT_SUBREG(-, n), 0)
0 commit comments