@@ -7227,8 +7227,23 @@ def : Pat<(v2i64 (int_aarch64_neon_vcopy_lane
72277227 V128:$Vd, VectorIndexD:$idx, V128:$Vs, VectorIndexD:$idx2)
72287228 )>;
72297229
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
72327247 def : Pat<(VT128 (vector_insert V128:$src,
72337248 (VTScal (vector_extract (VT128 V128:$Rn), (i64 imm:$Immn))),
72347249 (i64 imm:$Immd))),
@@ -7256,15 +7271,15 @@ multiclass Neon_INS_elt_pattern<ValueType VT128, ValueType VT64,
72567271 dsub)>;
72577272}
72587273
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>;
72637278
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>;
72687283
72697284// Insert from bitcast
72707285// vector_insert(bitcast(f32 src), n, lane) -> INSvi32lane(src, lane, INSERT_SUBREG(-, n), 0)
0 commit comments