@@ -3315,6 +3315,10 @@ defm LDRSW : Load32RO<0b10, 0, 0b10, GPR64, "ldrsw", i64, sextloadi32>;
3315
3315
// Pre-fetch.
3316
3316
defm PRFM : PrefetchRO<0b11, 0, 0b10, "prfm">;
3317
3317
3318
+ def vec_ins_or_scal_vec : PatFrags<(ops node:$src),
3319
+ [(vector_insert undef, node:$src, (i64 0)),
3320
+ (scalar_to_vector node:$src)]>;
3321
+
3318
3322
// For regular load, we do not have any alignment requirement.
3319
3323
// Thus, it is safe to directly map the vector loads with interesting
3320
3324
// addressing modes.
@@ -3323,13 +3327,13 @@ multiclass ScalToVecROLoadPat<ROAddrMode ro, SDPatternOperator loadop,
3323
3327
ValueType ScalTy, ValueType VecTy,
3324
3328
Instruction LOADW, Instruction LOADX,
3325
3329
SubRegIndex sub> {
3326
- def : Pat<(VecTy (scalar_to_vector (ScalTy
3330
+ def : Pat<(VecTy (vec_ins_or_scal_vec (ScalTy
3327
3331
(loadop (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$offset))))),
3328
3332
(INSERT_SUBREG (VecTy (IMPLICIT_DEF)),
3329
3333
(LOADW GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$offset),
3330
3334
sub)>;
3331
3335
3332
- def : Pat<(VecTy (scalar_to_vector (ScalTy
3336
+ def : Pat<(VecTy (vec_ins_or_scal_vec (ScalTy
3333
3337
(loadop (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$offset))))),
3334
3338
(INSERT_SUBREG (VecTy (IMPLICIT_DEF)),
3335
3339
(LOADX GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$offset),
@@ -3357,12 +3361,12 @@ defm : ScalToVecROLoadPat<ro64, load, i64, v2i64, LDRDroW, LDRDroX, dsub>;
3357
3361
defm : ScalToVecROLoadPat<ro64, load, f64, v2f64, LDRDroW, LDRDroX, dsub>;
3358
3362
3359
3363
3360
- def : Pat <(v1i64 (scalar_to_vector (i64
3364
+ def : Pat <(v1i64 (vec_ins_or_scal_vec (i64
3361
3365
(load (ro_Windexed64 GPR64sp:$Rn, GPR32:$Rm,
3362
3366
ro_Wextend64:$extend))))),
3363
3367
(LDRDroW GPR64sp:$Rn, GPR32:$Rm, ro_Wextend64:$extend)>;
3364
3368
3365
- def : Pat <(v1i64 (scalar_to_vector (i64
3369
+ def : Pat <(v1i64 (vec_ins_or_scal_vec (i64
3366
3370
(load (ro_Xindexed64 GPR64sp:$Rn, GPR64:$Rm,
3367
3371
ro_Xextend64:$extend))))),
3368
3372
(LDRDroX GPR64sp:$Rn, GPR64:$Rm, ro_Xextend64:$extend)>;
@@ -3495,34 +3499,34 @@ def : Pat <(bf16 (load (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))),
3495
3499
// Thus, it is safe to directly map the vector loads with interesting
3496
3500
// addressing modes.
3497
3501
// FIXME: We could do the same for bitconvert to floating point vectors.
3498
- def : Pat <(v8i8 (scalar_to_vector (i32
3502
+ def : Pat <(v8i8 (vec_ins_or_scal_vec (i32
3499
3503
(extloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))))),
3500
3504
(INSERT_SUBREG (v8i8 (IMPLICIT_DEF)),
3501
3505
(LDRBui GPR64sp:$Rn, uimm12s1:$offset), bsub)>;
3502
- def : Pat <(v16i8 (scalar_to_vector (i32
3506
+ def : Pat <(v16i8 (vec_ins_or_scal_vec (i32
3503
3507
(extloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))))),
3504
3508
(INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
3505
3509
(LDRBui GPR64sp:$Rn, uimm12s1:$offset), bsub)>;
3506
- def : Pat <(v4i16 (scalar_to_vector (i32
3510
+ def : Pat <(v4i16 (vec_ins_or_scal_vec (i32
3507
3511
(extloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))))),
3508
3512
(INSERT_SUBREG (v4i16 (IMPLICIT_DEF)),
3509
3513
(LDRHui GPR64sp:$Rn, uimm12s2:$offset), hsub)>;
3510
- def : Pat <(v8i16 (scalar_to_vector (i32
3514
+ def : Pat <(v8i16 (vec_ins_or_scal_vec (i32
3511
3515
(extloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))))),
3512
3516
(INSERT_SUBREG (v8i16 (IMPLICIT_DEF)),
3513
3517
(LDRHui GPR64sp:$Rn, uimm12s2:$offset), hsub)>;
3514
- def : Pat <(v2i32 (scalar_to_vector (i32
3518
+ def : Pat <(v2i32 (vec_ins_or_scal_vec (i32
3515
3519
(load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))))),
3516
3520
(INSERT_SUBREG (v2i32 (IMPLICIT_DEF)),
3517
3521
(LDRSui GPR64sp:$Rn, uimm12s4:$offset), ssub)>;
3518
- def : Pat <(v4i32 (scalar_to_vector (i32
3522
+ def : Pat <(v4i32 (vec_ins_or_scal_vec (i32
3519
3523
(load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))))),
3520
3524
(INSERT_SUBREG (v4i32 (IMPLICIT_DEF)),
3521
3525
(LDRSui GPR64sp:$Rn, uimm12s4:$offset), ssub)>;
3522
- def : Pat <(v1i64 (scalar_to_vector (i64
3526
+ def : Pat <(v1i64 (vec_ins_or_scal_vec (i64
3523
3527
(load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))))),
3524
3528
(LDRDui GPR64sp:$Rn, uimm12s8:$offset)>;
3525
- def : Pat <(v2i64 (scalar_to_vector (i64
3529
+ def : Pat <(v2i64 (vec_ins_or_scal_vec (i64
3526
3530
(load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))))),
3527
3531
(INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
3528
3532
(LDRDui GPR64sp:$Rn, uimm12s8:$offset), dsub)>;
@@ -6848,61 +6852,60 @@ def : Pat<(i64 (and (i64 (anyext (i32 (vector_extract (v8i16 V128:$Rn),
6848
6852
6849
6853
defm INS : SIMDIns;
6850
6854
6851
- def : Pat<(v16i8 (scalar_to_vector GPR32:$Rn)),
6855
+ def : Pat<(v16i8 (vec_ins_or_scal_vec GPR32:$Rn)),
6852
6856
(SUBREG_TO_REG (i32 0),
6853
6857
(f32 (COPY_TO_REGCLASS GPR32:$Rn, FPR32)), ssub)>;
6854
- def : Pat<(v8i8 (scalar_to_vector GPR32:$Rn)),
6858
+ def : Pat<(v8i8 (vec_ins_or_scal_vec GPR32:$Rn)),
6855
6859
(SUBREG_TO_REG (i32 0),
6856
6860
(f32 (COPY_TO_REGCLASS GPR32:$Rn, FPR32)), ssub)>;
6857
6861
6858
6862
// The top bits will be zero from the FMOVWSr
6859
6863
def : Pat<(v8i8 (bitconvert (i64 (zext GPR32:$Rn)))),
6860
6864
(SUBREG_TO_REG (i32 0), (f32 (FMOVWSr GPR32:$Rn)), ssub)>;
6861
6865
6862
- def : Pat<(v8i16 (scalar_to_vector GPR32:$Rn)),
6866
+ def : Pat<(v8i16 (vec_ins_or_scal_vec GPR32:$Rn)),
6863
6867
(SUBREG_TO_REG (i32 0),
6864
6868
(f32 (COPY_TO_REGCLASS GPR32:$Rn, FPR32)), ssub)>;
6865
- def : Pat<(v4i16 (scalar_to_vector GPR32:$Rn)),
6869
+ def : Pat<(v4i16 (vec_ins_or_scal_vec GPR32:$Rn)),
6866
6870
(SUBREG_TO_REG (i32 0),
6867
6871
(f32 (COPY_TO_REGCLASS GPR32:$Rn, FPR32)), ssub)>;
6868
6872
6869
- def : Pat<(v4f16 (scalar_to_vector (f16 FPR16:$Rn))),
6873
+ def : Pat<(v4f16 (vec_ins_or_scal_vec (f16 FPR16:$Rn))),
6870
6874
(INSERT_SUBREG (v4f16 (IMPLICIT_DEF)), FPR16:$Rn, hsub)>;
6871
- def : Pat<(v8f16 (scalar_to_vector (f16 FPR16:$Rn))),
6875
+ def : Pat<(v8f16 (vec_ins_or_scal_vec (f16 FPR16:$Rn))),
6872
6876
(INSERT_SUBREG (v8f16 (IMPLICIT_DEF)), FPR16:$Rn, hsub)>;
6873
6877
6874
- def : Pat<(v4bf16 (scalar_to_vector (bf16 FPR16:$Rn))),
6878
+ def : Pat<(v4bf16 (vec_ins_or_scal_vec (bf16 FPR16:$Rn))),
6875
6879
(INSERT_SUBREG (v4bf16 (IMPLICIT_DEF)), FPR16:$Rn, hsub)>;
6876
- def : Pat<(v8bf16 (scalar_to_vector (bf16 FPR16:$Rn))),
6880
+ def : Pat<(v8bf16 (vec_ins_or_scal_vec (bf16 FPR16:$Rn))),
6877
6881
(INSERT_SUBREG (v8bf16 (IMPLICIT_DEF)), FPR16:$Rn, hsub)>;
6878
6882
6879
- def : Pat<(v2i32 (scalar_to_vector (i32 FPR32:$Rn))),
6883
+ def : Pat<(v2i32 (vec_ins_or_scal_vec (i32 FPR32:$Rn))),
6880
6884
(v2i32 (INSERT_SUBREG (v2i32 (IMPLICIT_DEF)),
6881
6885
(i32 FPR32:$Rn), ssub))>;
6882
- def : Pat<(v4i32 (scalar_to_vector (i32 FPR32:$Rn))),
6886
+ def : Pat<(v4i32 (vec_ins_or_scal_vec (i32 FPR32:$Rn))),
6883
6887
(v4i32 (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)),
6884
6888
(i32 FPR32:$Rn), ssub))>;
6885
-
6886
- def : Pat<(v2i64 (scalar_to_vector (i64 FPR64:$Rn))),
6889
+ def : Pat<(v2i64 (vec_ins_or_scal_vec (i64 FPR64:$Rn))),
6887
6890
(v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
6888
6891
(i64 FPR64:$Rn), dsub))>;
6889
6892
6890
- def : Pat<(v4f16 (scalar_to_vector (f16 FPR16:$Rn))),
6893
+ def : Pat<(v4f16 (vec_ins_or_scal_vec (f16 FPR16:$Rn))),
6891
6894
(INSERT_SUBREG (v4f16 (IMPLICIT_DEF)), FPR16:$Rn, hsub)>;
6892
- def : Pat<(v8f16 (scalar_to_vector (f16 FPR16:$Rn))),
6895
+ def : Pat<(v8f16 (vec_ins_or_scal_vec (f16 FPR16:$Rn))),
6893
6896
(INSERT_SUBREG (v8f16 (IMPLICIT_DEF)), FPR16:$Rn, hsub)>;
6894
6897
6895
- def : Pat<(v4bf16 (scalar_to_vector (bf16 FPR16:$Rn))),
6898
+ def : Pat<(v4bf16 (vec_ins_or_scal_vec (bf16 FPR16:$Rn))),
6896
6899
(INSERT_SUBREG (v4bf16 (IMPLICIT_DEF)), FPR16:$Rn, hsub)>;
6897
- def : Pat<(v8bf16 (scalar_to_vector (bf16 FPR16:$Rn))),
6900
+ def : Pat<(v8bf16 (vec_ins_or_scal_vec (bf16 FPR16:$Rn))),
6898
6901
(INSERT_SUBREG (v8bf16 (IMPLICIT_DEF)), FPR16:$Rn, hsub)>;
6899
6902
6900
- def : Pat<(v4f32 (scalar_to_vector (f32 FPR32:$Rn))),
6903
+ def : Pat<(v4f32 (vec_ins_or_scal_vec (f32 FPR32:$Rn))),
6901
6904
(INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), FPR32:$Rn, ssub)>;
6902
- def : Pat<(v2f32 (scalar_to_vector (f32 FPR32:$Rn))),
6905
+ def : Pat<(v2f32 (vec_ins_or_scal_vec (f32 FPR32:$Rn))),
6903
6906
(INSERT_SUBREG (v2f32 (IMPLICIT_DEF)), FPR32:$Rn, ssub)>;
6904
6907
6905
- def : Pat<(v2f64 (scalar_to_vector (f64 FPR64:$Rn))),
6908
+ def : Pat<(v2f64 (vec_ins_or_scal_vec (f64 FPR64:$Rn))),
6906
6909
(INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), FPR64:$Rn, dsub)>;
6907
6910
6908
6911
def : Pat<(v4f16 (vector_insert (v4f16 V64:$Rn),
@@ -8507,7 +8510,7 @@ def : Ld1Lane64IdxOpPat<extloadi8, VectorIndexH, v4i16, i32, LD1i8, VectorIndexH
8507
8510
let Predicates = [HasNEON] in {
8508
8511
class Ld1Lane128FirstElm<ValueType ResultTy, ValueType VecTy,
8509
8512
SDPatternOperator ExtLoad, Instruction LD1>
8510
- : Pat<(ResultTy (scalar_to_vector (i32 (ExtLoad GPR64sp:$Rn)))),
8513
+ : Pat<(ResultTy (vec_ins_or_scal_vec (i32 (ExtLoad GPR64sp:$Rn)))),
8511
8514
(ResultTy (EXTRACT_SUBREG
8512
8515
(LD1 (VecTy (IMPLICIT_DEF)), 0, GPR64sp:$Rn), dsub))>;
8513
8516
@@ -8940,11 +8943,11 @@ def : Pat<(v1i64 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
8940
8943
def : Pat<(v1f64 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
8941
8944
def : Pat<(i64 (bitconvert (v1i64 V64:$Vn))),
8942
8945
(COPY_TO_REGCLASS V64:$Vn, GPR64)>;
8943
- def : Pat<(v1i64 (scalar_to_vector GPR64:$Xn)),
8946
+ def : Pat<(v1i64 (vec_ins_or_scal_vec GPR64:$Xn)),
8944
8947
(COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
8945
- def : Pat<(v1f64 (scalar_to_vector GPR64:$Xn)),
8948
+ def : Pat<(v1f64 (vec_ins_or_scal_vec GPR64:$Xn)),
8946
8949
(COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
8947
- def : Pat<(v1f64 (scalar_to_vector (f64 FPR64:$Xn))), (v1f64 FPR64:$Xn)>;
8950
+ def : Pat<(v1f64 (vec_ins_or_scal_vec (f64 FPR64:$Xn))), (v1f64 FPR64:$Xn)>;
8948
8951
8949
8952
def : Pat<(f32 (bitconvert (i32 GPR32:$Xn))),
8950
8953
(COPY_TO_REGCLASS GPR32:$Xn, FPR32)>;
0 commit comments