@@ -2925,37 +2925,45 @@ def UDF : UDFType<0, "udf">;
2925
2925
// Pair (indexed, offset)
2926
2926
defm LDPW : LoadPairOffset<0b00, 0, GPR32z, simm7s4, "ldp">;
2927
2927
defm LDPX : LoadPairOffset<0b10, 0, GPR64z, simm7s8, "ldp">;
2928
+ let Predicates = [HasFPARMv8] in {
2928
2929
defm LDPS : LoadPairOffset<0b00, 1, FPR32Op, simm7s4, "ldp">;
2929
2930
defm LDPD : LoadPairOffset<0b01, 1, FPR64Op, simm7s8, "ldp">;
2930
2931
defm LDPQ : LoadPairOffset<0b10, 1, FPR128Op, simm7s16, "ldp">;
2932
+ }
2931
2933
2932
2934
defm LDPSW : LoadPairOffset<0b01, 0, GPR64z, simm7s4, "ldpsw">;
2933
2935
2934
2936
// Pair (pre-indexed)
2935
2937
def LDPWpre : LoadPairPreIdx<0b00, 0, GPR32z, simm7s4, "ldp">;
2936
2938
def LDPXpre : LoadPairPreIdx<0b10, 0, GPR64z, simm7s8, "ldp">;
2939
+ let Predicates = [HasFPARMv8] in {
2937
2940
def LDPSpre : LoadPairPreIdx<0b00, 1, FPR32Op, simm7s4, "ldp">;
2938
2941
def LDPDpre : LoadPairPreIdx<0b01, 1, FPR64Op, simm7s8, "ldp">;
2939
2942
def LDPQpre : LoadPairPreIdx<0b10, 1, FPR128Op, simm7s16, "ldp">;
2943
+ }
2940
2944
2941
2945
def LDPSWpre : LoadPairPreIdx<0b01, 0, GPR64z, simm7s4, "ldpsw">;
2942
2946
2943
2947
// Pair (post-indexed)
2944
2948
def LDPWpost : LoadPairPostIdx<0b00, 0, GPR32z, simm7s4, "ldp">;
2945
2949
def LDPXpost : LoadPairPostIdx<0b10, 0, GPR64z, simm7s8, "ldp">;
2950
+ let Predicates = [HasFPARMv8] in {
2946
2951
def LDPSpost : LoadPairPostIdx<0b00, 1, FPR32Op, simm7s4, "ldp">;
2947
2952
def LDPDpost : LoadPairPostIdx<0b01, 1, FPR64Op, simm7s8, "ldp">;
2948
2953
def LDPQpost : LoadPairPostIdx<0b10, 1, FPR128Op, simm7s16, "ldp">;
2954
+ }
2949
2955
2950
2956
def LDPSWpost : LoadPairPostIdx<0b01, 0, GPR64z, simm7s4, "ldpsw">;
2951
2957
2952
2958
2953
2959
// Pair (no allocate)
2954
2960
defm LDNPW : LoadPairNoAlloc<0b00, 0, GPR32z, simm7s4, "ldnp">;
2955
2961
defm LDNPX : LoadPairNoAlloc<0b10, 0, GPR64z, simm7s8, "ldnp">;
2962
+ let Predicates = [HasFPARMv8] in {
2956
2963
defm LDNPS : LoadPairNoAlloc<0b00, 1, FPR32Op, simm7s4, "ldnp">;
2957
2964
defm LDNPD : LoadPairNoAlloc<0b01, 1, FPR64Op, simm7s8, "ldnp">;
2958
2965
defm LDNPQ : LoadPairNoAlloc<0b10, 1, FPR128Op, simm7s16, "ldnp">;
2966
+ }
2959
2967
2960
2968
def : Pat<(AArch64ldp (am_indexed7s64 GPR64sp:$Rn, simm7s8:$offset)),
2961
2969
(LDPXi GPR64sp:$Rn, simm7s8:$offset)>;
@@ -2973,11 +2981,13 @@ defm LDRW : Load32RO<0b10, 0, 0b01, GPR32, "ldr", i32, load>;
2973
2981
defm LDRX : Load64RO<0b11, 0, 0b01, GPR64, "ldr", i64, load>;
2974
2982
2975
2983
// Floating-point
2984
+ let Predicates = [HasFPARMv8] in {
2976
2985
defm LDRB : Load8RO<0b00, 1, 0b01, FPR8Op, "ldr", i8, load>;
2977
2986
defm LDRH : Load16RO<0b01, 1, 0b01, FPR16Op, "ldr", f16, load>;
2978
2987
defm LDRS : Load32RO<0b10, 1, 0b01, FPR32Op, "ldr", f32, load>;
2979
2988
defm LDRD : Load64RO<0b11, 1, 0b01, FPR64Op, "ldr", f64, load>;
2980
2989
defm LDRQ : Load128RO<0b00, 1, 0b11, FPR128Op, "ldr", f128, load>;
2990
+ }
2981
2991
2982
2992
// Load sign-extended half-word
2983
2993
defm LDRSHW : Load16RO<0b01, 0, 0b11, GPR32, "ldrsh", i32, sextloadi16>;
@@ -3147,6 +3157,7 @@ defm LDRX : LoadUI<0b11, 0, 0b01, GPR64z, uimm12s8, "ldr",
3147
3157
defm LDRW : LoadUI<0b10, 0, 0b01, GPR32z, uimm12s4, "ldr",
3148
3158
[(set GPR32z:$Rt,
3149
3159
(load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset)))]>;
3160
+ let Predicates = [HasFPARMv8] in {
3150
3161
defm LDRB : LoadUI<0b00, 1, 0b01, FPR8Op, uimm12s1, "ldr",
3151
3162
[(set FPR8Op:$Rt,
3152
3163
(load (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset)))]>;
@@ -3162,6 +3173,7 @@ defm LDRD : LoadUI<0b11, 1, 0b01, FPR64Op, uimm12s8, "ldr",
3162
3173
defm LDRQ : LoadUI<0b00, 1, 0b11, FPR128Op, uimm12s16, "ldr",
3163
3174
[(set (f128 FPR128Op:$Rt),
3164
3175
(load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)))]>;
3176
+ }
3165
3177
3166
3178
// bf16 load pattern
3167
3179
def : Pat <(bf16 (load (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))),
@@ -3339,12 +3351,14 @@ def LDRWl : LoadLiteral<0b00, 0, GPR32z, "ldr",
3339
3351
[(set GPR32z:$Rt, (load (AArch64adr alignedglobal:$label)))]>;
3340
3352
def LDRXl : LoadLiteral<0b01, 0, GPR64z, "ldr",
3341
3353
[(set GPR64z:$Rt, (load (AArch64adr alignedglobal:$label)))]>;
3354
+ let Predicates = [HasFPARMv8] in {
3342
3355
def LDRSl : LoadLiteral<0b00, 1, FPR32Op, "ldr",
3343
3356
[(set (f32 FPR32Op:$Rt), (load (AArch64adr alignedglobal:$label)))]>;
3344
3357
def LDRDl : LoadLiteral<0b01, 1, FPR64Op, "ldr",
3345
3358
[(set (f64 FPR64Op:$Rt), (load (AArch64adr alignedglobal:$label)))]>;
3346
3359
def LDRQl : LoadLiteral<0b10, 1, FPR128Op, "ldr",
3347
3360
[(set (f128 FPR128Op:$Rt), (load (AArch64adr alignedglobal:$label)))]>;
3361
+ }
3348
3362
3349
3363
// load sign-extended word
3350
3364
def LDRSWl : LoadLiteral<0b10, 0, GPR64z, "ldrsw",
@@ -3367,6 +3381,7 @@ defm LDURX : LoadUnscaled<0b11, 0, 0b01, GPR64z, "ldur",
3367
3381
defm LDURW : LoadUnscaled<0b10, 0, 0b01, GPR32z, "ldur",
3368
3382
[(set GPR32z:$Rt,
3369
3383
(load (am_unscaled32 GPR64sp:$Rn, simm9:$offset)))]>;
3384
+ let Predicates = [HasFPARMv8] in {
3370
3385
defm LDURB : LoadUnscaled<0b00, 1, 0b01, FPR8Op, "ldur",
3371
3386
[(set FPR8Op:$Rt,
3372
3387
(load (am_unscaled8 GPR64sp:$Rn, simm9:$offset)))]>;
@@ -3382,6 +3397,7 @@ defm LDURD : LoadUnscaled<0b11, 1, 0b01, FPR64Op, "ldur",
3382
3397
defm LDURQ : LoadUnscaled<0b00, 1, 0b11, FPR128Op, "ldur",
3383
3398
[(set (f128 FPR128Op:$Rt),
3384
3399
(load (am_unscaled128 GPR64sp:$Rn, simm9:$offset)))]>;
3400
+ }
3385
3401
3386
3402
defm LDURHH
3387
3403
: LoadUnscaled<0b01, 0, 0b01, GPR32, "ldurh",
@@ -3641,11 +3657,13 @@ defm LDTRSW : LoadUnprivileged<0b10, 0, 0b10, GPR64, "ldtrsw">;
3641
3657
// (immediate pre-indexed)
3642
3658
def LDRWpre : LoadPreIdx<0b10, 0, 0b01, GPR32z, "ldr">;
3643
3659
def LDRXpre : LoadPreIdx<0b11, 0, 0b01, GPR64z, "ldr">;
3660
+ let Predicates = [HasFPARMv8] in {
3644
3661
def LDRBpre : LoadPreIdx<0b00, 1, 0b01, FPR8Op, "ldr">;
3645
3662
def LDRHpre : LoadPreIdx<0b01, 1, 0b01, FPR16Op, "ldr">;
3646
3663
def LDRSpre : LoadPreIdx<0b10, 1, 0b01, FPR32Op, "ldr">;
3647
3664
def LDRDpre : LoadPreIdx<0b11, 1, 0b01, FPR64Op, "ldr">;
3648
3665
def LDRQpre : LoadPreIdx<0b00, 1, 0b11, FPR128Op, "ldr">;
3666
+ }
3649
3667
3650
3668
// load sign-extended half-word
3651
3669
def LDRSHWpre : LoadPreIdx<0b01, 0, 0b11, GPR32z, "ldrsh">;
@@ -3666,11 +3684,13 @@ def LDRSWpre : LoadPreIdx<0b10, 0, 0b10, GPR64z, "ldrsw">;
3666
3684
// (immediate post-indexed)
3667
3685
def LDRWpost : LoadPostIdx<0b10, 0, 0b01, GPR32z, "ldr">;
3668
3686
def LDRXpost : LoadPostIdx<0b11, 0, 0b01, GPR64z, "ldr">;
3687
+ let Predicates = [HasFPARMv8] in {
3669
3688
def LDRBpost : LoadPostIdx<0b00, 1, 0b01, FPR8Op, "ldr">;
3670
3689
def LDRHpost : LoadPostIdx<0b01, 1, 0b01, FPR16Op, "ldr">;
3671
3690
def LDRSpost : LoadPostIdx<0b10, 1, 0b01, FPR32Op, "ldr">;
3672
3691
def LDRDpost : LoadPostIdx<0b11, 1, 0b01, FPR64Op, "ldr">;
3673
3692
def LDRQpost : LoadPostIdx<0b00, 1, 0b11, FPR128Op, "ldr">;
3693
+ }
3674
3694
3675
3695
// load sign-extended half-word
3676
3696
def LDRSHWpost : LoadPostIdx<0b01, 0, 0b11, GPR32z, "ldrsh">;
@@ -3695,30 +3715,38 @@ def LDRSWpost : LoadPostIdx<0b10, 0, 0b10, GPR64z, "ldrsw">;
3695
3715
// FIXME: Use dedicated range-checked addressing mode operand here.
3696
3716
defm STPW : StorePairOffset<0b00, 0, GPR32z, simm7s4, "stp">;
3697
3717
defm STPX : StorePairOffset<0b10, 0, GPR64z, simm7s8, "stp">;
3718
+ let Predicates = [HasFPARMv8] in {
3698
3719
defm STPS : StorePairOffset<0b00, 1, FPR32Op, simm7s4, "stp">;
3699
3720
defm STPD : StorePairOffset<0b01, 1, FPR64Op, simm7s8, "stp">;
3700
3721
defm STPQ : StorePairOffset<0b10, 1, FPR128Op, simm7s16, "stp">;
3722
+ }
3701
3723
3702
3724
// Pair (pre-indexed)
3703
3725
def STPWpre : StorePairPreIdx<0b00, 0, GPR32z, simm7s4, "stp">;
3704
3726
def STPXpre : StorePairPreIdx<0b10, 0, GPR64z, simm7s8, "stp">;
3727
+ let Predicates = [HasFPARMv8] in {
3705
3728
def STPSpre : StorePairPreIdx<0b00, 1, FPR32Op, simm7s4, "stp">;
3706
3729
def STPDpre : StorePairPreIdx<0b01, 1, FPR64Op, simm7s8, "stp">;
3707
3730
def STPQpre : StorePairPreIdx<0b10, 1, FPR128Op, simm7s16, "stp">;
3731
+ }
3708
3732
3709
3733
// Pair (post-indexed)
3710
3734
def STPWpost : StorePairPostIdx<0b00, 0, GPR32z, simm7s4, "stp">;
3711
3735
def STPXpost : StorePairPostIdx<0b10, 0, GPR64z, simm7s8, "stp">;
3736
+ let Predicates = [HasFPARMv8] in {
3712
3737
def STPSpost : StorePairPostIdx<0b00, 1, FPR32Op, simm7s4, "stp">;
3713
3738
def STPDpost : StorePairPostIdx<0b01, 1, FPR64Op, simm7s8, "stp">;
3714
3739
def STPQpost : StorePairPostIdx<0b10, 1, FPR128Op, simm7s16, "stp">;
3740
+ }
3715
3741
3716
3742
// Pair (no allocate)
3717
3743
defm STNPW : StorePairNoAlloc<0b00, 0, GPR32z, simm7s4, "stnp">;
3718
3744
defm STNPX : StorePairNoAlloc<0b10, 0, GPR64z, simm7s8, "stnp">;
3745
+ let Predicates = [HasFPARMv8] in {
3719
3746
defm STNPS : StorePairNoAlloc<0b00, 1, FPR32Op, simm7s4, "stnp">;
3720
3747
defm STNPD : StorePairNoAlloc<0b01, 1, FPR64Op, simm7s8, "stnp">;
3721
3748
defm STNPQ : StorePairNoAlloc<0b10, 1, FPR128Op, simm7s16, "stnp">;
3749
+ }
3722
3750
3723
3751
def : Pat<(AArch64stp GPR64z:$Rt, GPR64z:$Rt2, (am_indexed7s64 GPR64sp:$Rn, simm7s8:$offset)),
3724
3752
(STPXi GPR64z:$Rt, GPR64z:$Rt2, GPR64sp:$Rn, simm7s8:$offset)>;
@@ -3738,11 +3766,13 @@ defm STRX : Store64RO<0b11, 0, 0b00, GPR64, "str", i64, store>;
3738
3766
3739
3767
3740
3768
// Floating-point
3769
+ let Predicates = [HasFPARMv8] in {
3741
3770
defm STRB : Store8RO< 0b00, 1, 0b00, FPR8Op, "str", i8, store>;
3742
3771
defm STRH : Store16RO<0b01, 1, 0b00, FPR16Op, "str", f16, store>;
3743
3772
defm STRS : Store32RO<0b10, 1, 0b00, FPR32Op, "str", f32, store>;
3744
3773
defm STRD : Store64RO<0b11, 1, 0b00, FPR64Op, "str", f64, store>;
3745
3774
defm STRQ : Store128RO<0b00, 1, 0b10, FPR128Op, "str">;
3775
+ }
3746
3776
3747
3777
let Predicates = [UseSTRQro], AddedComplexity = 10 in {
3748
3778
def : Pat<(store (f128 FPR128:$Rt),
@@ -3851,6 +3881,7 @@ defm STRX : StoreUIz<0b11, 0, 0b00, GPR64z, uimm12s8, "str",
3851
3881
defm STRW : StoreUIz<0b10, 0, 0b00, GPR32z, uimm12s4, "str",
3852
3882
[(store GPR32z:$Rt,
3853
3883
(am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))]>;
3884
+ let Predicates = [HasFPARMv8] in {
3854
3885
defm STRB : StoreUI<0b00, 1, 0b00, FPR8Op, uimm12s1, "str",
3855
3886
[(store FPR8Op:$Rt,
3856
3887
(am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))]>;
@@ -3864,6 +3895,7 @@ defm STRD : StoreUI<0b11, 1, 0b00, FPR64Op, uimm12s8, "str",
3864
3895
[(store (f64 FPR64Op:$Rt),
3865
3896
(am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))]>;
3866
3897
defm STRQ : StoreUI<0b00, 1, 0b10, FPR128Op, uimm12s16, "str", []>;
3898
+ }
3867
3899
3868
3900
defm STRHH : StoreUIz<0b01, 0, 0b00, GPR32z, uimm12s2, "strh",
3869
3901
[(truncstorei16 GPR32z:$Rt,
@@ -3985,6 +4017,7 @@ defm STURX : StoreUnscaled<0b11, 0, 0b00, GPR64z, "stur",
3985
4017
defm STURW : StoreUnscaled<0b10, 0, 0b00, GPR32z, "stur",
3986
4018
[(store GPR32z:$Rt,
3987
4019
(am_unscaled32 GPR64sp:$Rn, simm9:$offset))]>;
4020
+ let Predicates = [HasFPARMv8] in {
3988
4021
defm STURB : StoreUnscaled<0b00, 1, 0b00, FPR8Op, "stur",
3989
4022
[(store FPR8Op:$Rt,
3990
4023
(am_unscaled8 GPR64sp:$Rn, simm9:$offset))]>;
@@ -4000,6 +4033,7 @@ defm STURD : StoreUnscaled<0b11, 1, 0b00, FPR64Op, "stur",
4000
4033
defm STURQ : StoreUnscaled<0b00, 1, 0b10, FPR128Op, "stur",
4001
4034
[(store (f128 FPR128Op:$Rt),
4002
4035
(am_unscaled128 GPR64sp:$Rn, simm9:$offset))]>;
4036
+ }
4003
4037
defm STURHH : StoreUnscaled<0b01, 0, 0b00, GPR32z, "sturh",
4004
4038
[(truncstorei16 GPR32z:$Rt,
4005
4039
(am_unscaled16 GPR64sp:$Rn, simm9:$offset))]>;
@@ -4156,11 +4190,13 @@ defm STTRB : StoreUnprivileged<0b00, 0, 0b00, GPR32, "sttrb">;
4156
4190
// (immediate pre-indexed)
4157
4191
def STRWpre : StorePreIdx<0b10, 0, 0b00, GPR32z, "str", pre_store, i32>;
4158
4192
def STRXpre : StorePreIdx<0b11, 0, 0b00, GPR64z, "str", pre_store, i64>;
4193
+ let Predicates = [HasFPARMv8] in {
4159
4194
def STRBpre : StorePreIdx<0b00, 1, 0b00, FPR8Op, "str", pre_store, i8>;
4160
4195
def STRHpre : StorePreIdx<0b01, 1, 0b00, FPR16Op, "str", pre_store, f16>;
4161
4196
def STRSpre : StorePreIdx<0b10, 1, 0b00, FPR32Op, "str", pre_store, f32>;
4162
4197
def STRDpre : StorePreIdx<0b11, 1, 0b00, FPR64Op, "str", pre_store, f64>;
4163
4198
def STRQpre : StorePreIdx<0b00, 1, 0b10, FPR128Op, "str", pre_store, f128>;
4199
+ }
4164
4200
4165
4201
def STRBBpre : StorePreIdx<0b00, 0, 0b00, GPR32z, "strb", pre_truncsti8, i32>;
4166
4202
def STRHHpre : StorePreIdx<0b01, 0, 0b00, GPR32z, "strh", pre_truncsti16, i32>;
@@ -4210,11 +4246,13 @@ def : Pat<(pre_store (v8f16 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4210
4246
// (immediate post-indexed)
4211
4247
def STRWpost : StorePostIdx<0b10, 0, 0b00, GPR32z, "str", post_store, i32>;
4212
4248
def STRXpost : StorePostIdx<0b11, 0, 0b00, GPR64z, "str", post_store, i64>;
4249
+ let Predicates = [HasFPARMv8] in {
4213
4250
def STRBpost : StorePostIdx<0b00, 1, 0b00, FPR8Op, "str", post_store, i8>;
4214
4251
def STRHpost : StorePostIdx<0b01, 1, 0b00, FPR16Op, "str", post_store, f16>;
4215
4252
def STRSpost : StorePostIdx<0b10, 1, 0b00, FPR32Op, "str", post_store, f32>;
4216
4253
def STRDpost : StorePostIdx<0b11, 1, 0b00, FPR64Op, "str", post_store, f64>;
4217
4254
def STRQpost : StorePostIdx<0b00, 1, 0b10, FPR128Op, "str", post_store, f128>;
4255
+ }
4218
4256
4219
4257
def STRBBpost : StorePostIdx<0b00, 0, 0b00, GPR32z, "strb", post_truncsti8, i32>;
4220
4258
def STRHHpost : StorePostIdx<0b01, 0, 0b00, GPR32z, "strh", post_truncsti16, i32>;
@@ -4531,7 +4569,8 @@ def : Pat<(f64 (fdiv (f64 (any_uint_to_fp (i32 GPR32:$Rn))), fixedpoint_f64_i32:
4531
4569
defm FMOV : UnscaledConversion<"fmov">;
4532
4570
4533
4571
// Add pseudo ops for FMOV 0 so we can mark them as isReMaterializable
4534
- let isReMaterializable = 1, isCodeGenOnly = 1, isAsCheapAsAMove = 1 in {
4572
+ let isReMaterializable = 1, isCodeGenOnly = 1, isAsCheapAsAMove = 1,
4573
+ Predicates = [HasFPARMv8] in {
4535
4574
def FMOVH0 : Pseudo<(outs FPR16:$Rd), (ins), [(set f16:$Rd, (fpimm0))]>,
4536
4575
Sched<[WriteF]>;
4537
4576
def FMOVS0 : Pseudo<(outs FPR32:$Rd), (ins), [(set f32:$Rd, (fpimm0))]>,
@@ -4758,6 +4797,7 @@ def : Pat<(bf16 (AArch64csel (bf16 FPR16:$Rn), (bf16 FPR16:$Rm), (i32 imm:$cond)
4758
4797
// CSEL instructions providing f128 types need to be handled by a
4759
4798
// pseudo-instruction since the eventual code will need to introduce basic
4760
4799
// blocks and control flow.
4800
+ let Predicates = [HasFPARMv8] in
4761
4801
def F128CSEL : Pseudo<(outs FPR128:$Rd),
4762
4802
(ins FPR128:$Rn, FPR128:$Rm, ccode:$cond),
4763
4803
[(set (f128 FPR128:$Rd),
0 commit comments