Skip to content

Commit 9c9bffe

Browse files
authored
[AArch64] Disable FP loads/stores when fp-armv8 not enabled (#77817)
Most of the floating-point instructions are already gated on the fp-armv8 subtarget feature (or some other feature), but most of the load and store instructions, and one move instruction, were not. I found this list of instructions with a script which consumes the output of llvm-tblgen --dump-json, looking for instructions which have an FPR operand but no predicate. That script now finds zero instructions. This only affects assembly, not codegen, because the floating-point types and registers are already not marked as legal when the FPU is disabled, so it is impossible for any of these to be selected.
1 parent 3168192 commit 9c9bffe

File tree

3 files changed

+236
-1
lines changed

3 files changed

+236
-1
lines changed

llvm/lib/Target/AArch64/AArch64InstrInfo.td

+41-1
Original file line numberDiff line numberDiff line change
@@ -2925,37 +2925,45 @@ def UDF : UDFType<0, "udf">;
29252925
// Pair (indexed, offset)
29262926
defm LDPW : LoadPairOffset<0b00, 0, GPR32z, simm7s4, "ldp">;
29272927
defm LDPX : LoadPairOffset<0b10, 0, GPR64z, simm7s8, "ldp">;
2928+
let Predicates = [HasFPARMv8] in {
29282929
defm LDPS : LoadPairOffset<0b00, 1, FPR32Op, simm7s4, "ldp">;
29292930
defm LDPD : LoadPairOffset<0b01, 1, FPR64Op, simm7s8, "ldp">;
29302931
defm LDPQ : LoadPairOffset<0b10, 1, FPR128Op, simm7s16, "ldp">;
2932+
}
29312933

29322934
defm LDPSW : LoadPairOffset<0b01, 0, GPR64z, simm7s4, "ldpsw">;
29332935

29342936
// Pair (pre-indexed)
29352937
def LDPWpre : LoadPairPreIdx<0b00, 0, GPR32z, simm7s4, "ldp">;
29362938
def LDPXpre : LoadPairPreIdx<0b10, 0, GPR64z, simm7s8, "ldp">;
2939+
let Predicates = [HasFPARMv8] in {
29372940
def LDPSpre : LoadPairPreIdx<0b00, 1, FPR32Op, simm7s4, "ldp">;
29382941
def LDPDpre : LoadPairPreIdx<0b01, 1, FPR64Op, simm7s8, "ldp">;
29392942
def LDPQpre : LoadPairPreIdx<0b10, 1, FPR128Op, simm7s16, "ldp">;
2943+
}
29402944

29412945
def LDPSWpre : LoadPairPreIdx<0b01, 0, GPR64z, simm7s4, "ldpsw">;
29422946

29432947
// Pair (post-indexed)
29442948
def LDPWpost : LoadPairPostIdx<0b00, 0, GPR32z, simm7s4, "ldp">;
29452949
def LDPXpost : LoadPairPostIdx<0b10, 0, GPR64z, simm7s8, "ldp">;
2950+
let Predicates = [HasFPARMv8] in {
29462951
def LDPSpost : LoadPairPostIdx<0b00, 1, FPR32Op, simm7s4, "ldp">;
29472952
def LDPDpost : LoadPairPostIdx<0b01, 1, FPR64Op, simm7s8, "ldp">;
29482953
def LDPQpost : LoadPairPostIdx<0b10, 1, FPR128Op, simm7s16, "ldp">;
2954+
}
29492955

29502956
def LDPSWpost : LoadPairPostIdx<0b01, 0, GPR64z, simm7s4, "ldpsw">;
29512957

29522958

29532959
// Pair (no allocate)
29542960
defm LDNPW : LoadPairNoAlloc<0b00, 0, GPR32z, simm7s4, "ldnp">;
29552961
defm LDNPX : LoadPairNoAlloc<0b10, 0, GPR64z, simm7s8, "ldnp">;
2962+
let Predicates = [HasFPARMv8] in {
29562963
defm LDNPS : LoadPairNoAlloc<0b00, 1, FPR32Op, simm7s4, "ldnp">;
29572964
defm LDNPD : LoadPairNoAlloc<0b01, 1, FPR64Op, simm7s8, "ldnp">;
29582965
defm LDNPQ : LoadPairNoAlloc<0b10, 1, FPR128Op, simm7s16, "ldnp">;
2966+
}
29592967

29602968
def : Pat<(AArch64ldp (am_indexed7s64 GPR64sp:$Rn, simm7s8:$offset)),
29612969
(LDPXi GPR64sp:$Rn, simm7s8:$offset)>;
@@ -2973,11 +2981,13 @@ defm LDRW : Load32RO<0b10, 0, 0b01, GPR32, "ldr", i32, load>;
29732981
defm LDRX : Load64RO<0b11, 0, 0b01, GPR64, "ldr", i64, load>;
29742982

29752983
// Floating-point
2984+
let Predicates = [HasFPARMv8] in {
29762985
defm LDRB : Load8RO<0b00, 1, 0b01, FPR8Op, "ldr", i8, load>;
29772986
defm LDRH : Load16RO<0b01, 1, 0b01, FPR16Op, "ldr", f16, load>;
29782987
defm LDRS : Load32RO<0b10, 1, 0b01, FPR32Op, "ldr", f32, load>;
29792988
defm LDRD : Load64RO<0b11, 1, 0b01, FPR64Op, "ldr", f64, load>;
29802989
defm LDRQ : Load128RO<0b00, 1, 0b11, FPR128Op, "ldr", f128, load>;
2990+
}
29812991

29822992
// Load sign-extended half-word
29832993
defm LDRSHW : Load16RO<0b01, 0, 0b11, GPR32, "ldrsh", i32, sextloadi16>;
@@ -3147,6 +3157,7 @@ defm LDRX : LoadUI<0b11, 0, 0b01, GPR64z, uimm12s8, "ldr",
31473157
defm LDRW : LoadUI<0b10, 0, 0b01, GPR32z, uimm12s4, "ldr",
31483158
[(set GPR32z:$Rt,
31493159
(load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset)))]>;
3160+
let Predicates = [HasFPARMv8] in {
31503161
defm LDRB : LoadUI<0b00, 1, 0b01, FPR8Op, uimm12s1, "ldr",
31513162
[(set FPR8Op:$Rt,
31523163
(load (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset)))]>;
@@ -3162,6 +3173,7 @@ defm LDRD : LoadUI<0b11, 1, 0b01, FPR64Op, uimm12s8, "ldr",
31623173
defm LDRQ : LoadUI<0b00, 1, 0b11, FPR128Op, uimm12s16, "ldr",
31633174
[(set (f128 FPR128Op:$Rt),
31643175
(load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)))]>;
3176+
}
31653177

31663178
// bf16 load pattern
31673179
def : Pat <(bf16 (load (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))),
@@ -3339,12 +3351,14 @@ def LDRWl : LoadLiteral<0b00, 0, GPR32z, "ldr",
33393351
[(set GPR32z:$Rt, (load (AArch64adr alignedglobal:$label)))]>;
33403352
def LDRXl : LoadLiteral<0b01, 0, GPR64z, "ldr",
33413353
[(set GPR64z:$Rt, (load (AArch64adr alignedglobal:$label)))]>;
3354+
let Predicates = [HasFPARMv8] in {
33423355
def LDRSl : LoadLiteral<0b00, 1, FPR32Op, "ldr",
33433356
[(set (f32 FPR32Op:$Rt), (load (AArch64adr alignedglobal:$label)))]>;
33443357
def LDRDl : LoadLiteral<0b01, 1, FPR64Op, "ldr",
33453358
[(set (f64 FPR64Op:$Rt), (load (AArch64adr alignedglobal:$label)))]>;
33463359
def LDRQl : LoadLiteral<0b10, 1, FPR128Op, "ldr",
33473360
[(set (f128 FPR128Op:$Rt), (load (AArch64adr alignedglobal:$label)))]>;
3361+
}
33483362

33493363
// load sign-extended word
33503364
def LDRSWl : LoadLiteral<0b10, 0, GPR64z, "ldrsw",
@@ -3367,6 +3381,7 @@ defm LDURX : LoadUnscaled<0b11, 0, 0b01, GPR64z, "ldur",
33673381
defm LDURW : LoadUnscaled<0b10, 0, 0b01, GPR32z, "ldur",
33683382
[(set GPR32z:$Rt,
33693383
(load (am_unscaled32 GPR64sp:$Rn, simm9:$offset)))]>;
3384+
let Predicates = [HasFPARMv8] in {
33703385
defm LDURB : LoadUnscaled<0b00, 1, 0b01, FPR8Op, "ldur",
33713386
[(set FPR8Op:$Rt,
33723387
(load (am_unscaled8 GPR64sp:$Rn, simm9:$offset)))]>;
@@ -3382,6 +3397,7 @@ defm LDURD : LoadUnscaled<0b11, 1, 0b01, FPR64Op, "ldur",
33823397
defm LDURQ : LoadUnscaled<0b00, 1, 0b11, FPR128Op, "ldur",
33833398
[(set (f128 FPR128Op:$Rt),
33843399
(load (am_unscaled128 GPR64sp:$Rn, simm9:$offset)))]>;
3400+
}
33853401

33863402
defm LDURHH
33873403
: LoadUnscaled<0b01, 0, 0b01, GPR32, "ldurh",
@@ -3641,11 +3657,13 @@ defm LDTRSW : LoadUnprivileged<0b10, 0, 0b10, GPR64, "ldtrsw">;
36413657
// (immediate pre-indexed)
36423658
def LDRWpre : LoadPreIdx<0b10, 0, 0b01, GPR32z, "ldr">;
36433659
def LDRXpre : LoadPreIdx<0b11, 0, 0b01, GPR64z, "ldr">;
3660+
let Predicates = [HasFPARMv8] in {
36443661
def LDRBpre : LoadPreIdx<0b00, 1, 0b01, FPR8Op, "ldr">;
36453662
def LDRHpre : LoadPreIdx<0b01, 1, 0b01, FPR16Op, "ldr">;
36463663
def LDRSpre : LoadPreIdx<0b10, 1, 0b01, FPR32Op, "ldr">;
36473664
def LDRDpre : LoadPreIdx<0b11, 1, 0b01, FPR64Op, "ldr">;
36483665
def LDRQpre : LoadPreIdx<0b00, 1, 0b11, FPR128Op, "ldr">;
3666+
}
36493667

36503668
// load sign-extended half-word
36513669
def LDRSHWpre : LoadPreIdx<0b01, 0, 0b11, GPR32z, "ldrsh">;
@@ -3666,11 +3684,13 @@ def LDRSWpre : LoadPreIdx<0b10, 0, 0b10, GPR64z, "ldrsw">;
36663684
// (immediate post-indexed)
36673685
def LDRWpost : LoadPostIdx<0b10, 0, 0b01, GPR32z, "ldr">;
36683686
def LDRXpost : LoadPostIdx<0b11, 0, 0b01, GPR64z, "ldr">;
3687+
let Predicates = [HasFPARMv8] in {
36693688
def LDRBpost : LoadPostIdx<0b00, 1, 0b01, FPR8Op, "ldr">;
36703689
def LDRHpost : LoadPostIdx<0b01, 1, 0b01, FPR16Op, "ldr">;
36713690
def LDRSpost : LoadPostIdx<0b10, 1, 0b01, FPR32Op, "ldr">;
36723691
def LDRDpost : LoadPostIdx<0b11, 1, 0b01, FPR64Op, "ldr">;
36733692
def LDRQpost : LoadPostIdx<0b00, 1, 0b11, FPR128Op, "ldr">;
3693+
}
36743694

36753695
// load sign-extended half-word
36763696
def LDRSHWpost : LoadPostIdx<0b01, 0, 0b11, GPR32z, "ldrsh">;
@@ -3695,30 +3715,38 @@ def LDRSWpost : LoadPostIdx<0b10, 0, 0b10, GPR64z, "ldrsw">;
36953715
// FIXME: Use dedicated range-checked addressing mode operand here.
36963716
defm STPW : StorePairOffset<0b00, 0, GPR32z, simm7s4, "stp">;
36973717
defm STPX : StorePairOffset<0b10, 0, GPR64z, simm7s8, "stp">;
3718+
let Predicates = [HasFPARMv8] in {
36983719
defm STPS : StorePairOffset<0b00, 1, FPR32Op, simm7s4, "stp">;
36993720
defm STPD : StorePairOffset<0b01, 1, FPR64Op, simm7s8, "stp">;
37003721
defm STPQ : StorePairOffset<0b10, 1, FPR128Op, simm7s16, "stp">;
3722+
}
37013723

37023724
// Pair (pre-indexed)
37033725
def STPWpre : StorePairPreIdx<0b00, 0, GPR32z, simm7s4, "stp">;
37043726
def STPXpre : StorePairPreIdx<0b10, 0, GPR64z, simm7s8, "stp">;
3727+
let Predicates = [HasFPARMv8] in {
37053728
def STPSpre : StorePairPreIdx<0b00, 1, FPR32Op, simm7s4, "stp">;
37063729
def STPDpre : StorePairPreIdx<0b01, 1, FPR64Op, simm7s8, "stp">;
37073730
def STPQpre : StorePairPreIdx<0b10, 1, FPR128Op, simm7s16, "stp">;
3731+
}
37083732

37093733
// Pair (post-indexed)
37103734
def STPWpost : StorePairPostIdx<0b00, 0, GPR32z, simm7s4, "stp">;
37113735
def STPXpost : StorePairPostIdx<0b10, 0, GPR64z, simm7s8, "stp">;
3736+
let Predicates = [HasFPARMv8] in {
37123737
def STPSpost : StorePairPostIdx<0b00, 1, FPR32Op, simm7s4, "stp">;
37133738
def STPDpost : StorePairPostIdx<0b01, 1, FPR64Op, simm7s8, "stp">;
37143739
def STPQpost : StorePairPostIdx<0b10, 1, FPR128Op, simm7s16, "stp">;
3740+
}
37153741

37163742
// Pair (no allocate)
37173743
defm STNPW : StorePairNoAlloc<0b00, 0, GPR32z, simm7s4, "stnp">;
37183744
defm STNPX : StorePairNoAlloc<0b10, 0, GPR64z, simm7s8, "stnp">;
3745+
let Predicates = [HasFPARMv8] in {
37193746
defm STNPS : StorePairNoAlloc<0b00, 1, FPR32Op, simm7s4, "stnp">;
37203747
defm STNPD : StorePairNoAlloc<0b01, 1, FPR64Op, simm7s8, "stnp">;
37213748
defm STNPQ : StorePairNoAlloc<0b10, 1, FPR128Op, simm7s16, "stnp">;
3749+
}
37223750

37233751
def : Pat<(AArch64stp GPR64z:$Rt, GPR64z:$Rt2, (am_indexed7s64 GPR64sp:$Rn, simm7s8:$offset)),
37243752
(STPXi GPR64z:$Rt, GPR64z:$Rt2, GPR64sp:$Rn, simm7s8:$offset)>;
@@ -3738,11 +3766,13 @@ defm STRX : Store64RO<0b11, 0, 0b00, GPR64, "str", i64, store>;
37383766

37393767

37403768
// Floating-point
3769+
let Predicates = [HasFPARMv8] in {
37413770
defm STRB : Store8RO< 0b00, 1, 0b00, FPR8Op, "str", i8, store>;
37423771
defm STRH : Store16RO<0b01, 1, 0b00, FPR16Op, "str", f16, store>;
37433772
defm STRS : Store32RO<0b10, 1, 0b00, FPR32Op, "str", f32, store>;
37443773
defm STRD : Store64RO<0b11, 1, 0b00, FPR64Op, "str", f64, store>;
37453774
defm STRQ : Store128RO<0b00, 1, 0b10, FPR128Op, "str">;
3775+
}
37463776

37473777
let Predicates = [UseSTRQro], AddedComplexity = 10 in {
37483778
def : Pat<(store (f128 FPR128:$Rt),
@@ -3851,6 +3881,7 @@ defm STRX : StoreUIz<0b11, 0, 0b00, GPR64z, uimm12s8, "str",
38513881
defm STRW : StoreUIz<0b10, 0, 0b00, GPR32z, uimm12s4, "str",
38523882
[(store GPR32z:$Rt,
38533883
(am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))]>;
3884+
let Predicates = [HasFPARMv8] in {
38543885
defm STRB : StoreUI<0b00, 1, 0b00, FPR8Op, uimm12s1, "str",
38553886
[(store FPR8Op:$Rt,
38563887
(am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))]>;
@@ -3864,6 +3895,7 @@ defm STRD : StoreUI<0b11, 1, 0b00, FPR64Op, uimm12s8, "str",
38643895
[(store (f64 FPR64Op:$Rt),
38653896
(am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))]>;
38663897
defm STRQ : StoreUI<0b00, 1, 0b10, FPR128Op, uimm12s16, "str", []>;
3898+
}
38673899

38683900
defm STRHH : StoreUIz<0b01, 0, 0b00, GPR32z, uimm12s2, "strh",
38693901
[(truncstorei16 GPR32z:$Rt,
@@ -3985,6 +4017,7 @@ defm STURX : StoreUnscaled<0b11, 0, 0b00, GPR64z, "stur",
39854017
defm STURW : StoreUnscaled<0b10, 0, 0b00, GPR32z, "stur",
39864018
[(store GPR32z:$Rt,
39874019
(am_unscaled32 GPR64sp:$Rn, simm9:$offset))]>;
4020+
let Predicates = [HasFPARMv8] in {
39884021
defm STURB : StoreUnscaled<0b00, 1, 0b00, FPR8Op, "stur",
39894022
[(store FPR8Op:$Rt,
39904023
(am_unscaled8 GPR64sp:$Rn, simm9:$offset))]>;
@@ -4000,6 +4033,7 @@ defm STURD : StoreUnscaled<0b11, 1, 0b00, FPR64Op, "stur",
40004033
defm STURQ : StoreUnscaled<0b00, 1, 0b10, FPR128Op, "stur",
40014034
[(store (f128 FPR128Op:$Rt),
40024035
(am_unscaled128 GPR64sp:$Rn, simm9:$offset))]>;
4036+
}
40034037
defm STURHH : StoreUnscaled<0b01, 0, 0b00, GPR32z, "sturh",
40044038
[(truncstorei16 GPR32z:$Rt,
40054039
(am_unscaled16 GPR64sp:$Rn, simm9:$offset))]>;
@@ -4156,11 +4190,13 @@ defm STTRB : StoreUnprivileged<0b00, 0, 0b00, GPR32, "sttrb">;
41564190
// (immediate pre-indexed)
41574191
def STRWpre : StorePreIdx<0b10, 0, 0b00, GPR32z, "str", pre_store, i32>;
41584192
def STRXpre : StorePreIdx<0b11, 0, 0b00, GPR64z, "str", pre_store, i64>;
4193+
let Predicates = [HasFPARMv8] in {
41594194
def STRBpre : StorePreIdx<0b00, 1, 0b00, FPR8Op, "str", pre_store, i8>;
41604195
def STRHpre : StorePreIdx<0b01, 1, 0b00, FPR16Op, "str", pre_store, f16>;
41614196
def STRSpre : StorePreIdx<0b10, 1, 0b00, FPR32Op, "str", pre_store, f32>;
41624197
def STRDpre : StorePreIdx<0b11, 1, 0b00, FPR64Op, "str", pre_store, f64>;
41634198
def STRQpre : StorePreIdx<0b00, 1, 0b10, FPR128Op, "str", pre_store, f128>;
4199+
}
41644200

41654201
def STRBBpre : StorePreIdx<0b00, 0, 0b00, GPR32z, "strb", pre_truncsti8, i32>;
41664202
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),
42104246
// (immediate post-indexed)
42114247
def STRWpost : StorePostIdx<0b10, 0, 0b00, GPR32z, "str", post_store, i32>;
42124248
def STRXpost : StorePostIdx<0b11, 0, 0b00, GPR64z, "str", post_store, i64>;
4249+
let Predicates = [HasFPARMv8] in {
42134250
def STRBpost : StorePostIdx<0b00, 1, 0b00, FPR8Op, "str", post_store, i8>;
42144251
def STRHpost : StorePostIdx<0b01, 1, 0b00, FPR16Op, "str", post_store, f16>;
42154252
def STRSpost : StorePostIdx<0b10, 1, 0b00, FPR32Op, "str", post_store, f32>;
42164253
def STRDpost : StorePostIdx<0b11, 1, 0b00, FPR64Op, "str", post_store, f64>;
42174254
def STRQpost : StorePostIdx<0b00, 1, 0b10, FPR128Op, "str", post_store, f128>;
4255+
}
42184256

42194257
def STRBBpost : StorePostIdx<0b00, 0, 0b00, GPR32z, "strb", post_truncsti8, i32>;
42204258
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:
45314569
defm FMOV : UnscaledConversion<"fmov">;
45324570

45334571
// 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 {
45354574
def FMOVH0 : Pseudo<(outs FPR16:$Rd), (ins), [(set f16:$Rd, (fpimm0))]>,
45364575
Sched<[WriteF]>;
45374576
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)
47584797
// CSEL instructions providing f128 types need to be handled by a
47594798
// pseudo-instruction since the eventual code will need to introduce basic
47604799
// blocks and control flow.
4800+
let Predicates = [HasFPARMv8] in
47614801
def F128CSEL : Pseudo<(outs FPR128:$Rd),
47624802
(ins FPR128:$Rn, FPR128:$Rm, ccode:$cond),
47634803
[(set (f128 FPR128:$Rd),

llvm/lib/Target/AArch64/AArch64SystemOperands.td

+2
Original file line numberDiff line numberDiff line change
@@ -986,8 +986,10 @@ def : RWSysReg<"SPSR_irq", 0b11, 0b100, 0b0100, 0b0011, 0b000>;
986986
def : RWSysReg<"SPSR_abt", 0b11, 0b100, 0b0100, 0b0011, 0b001>;
987987
def : RWSysReg<"SPSR_und", 0b11, 0b100, 0b0100, 0b0011, 0b010>;
988988
def : RWSysReg<"SPSR_fiq", 0b11, 0b100, 0b0100, 0b0011, 0b011>;
989+
let Requires = [{ {AArch64::FeatureFPARMv8} }] in {
989990
def : RWSysReg<"FPCR", 0b11, 0b011, 0b0100, 0b0100, 0b000>;
990991
def : RWSysReg<"FPSR", 0b11, 0b011, 0b0100, 0b0100, 0b001>;
992+
}
991993
def : RWSysReg<"DSPSR_EL0", 0b11, 0b011, 0b0100, 0b0101, 0b000>;
992994
def : RWSysReg<"DLR_EL0", 0b11, 0b011, 0b0100, 0b0101, 0b001>;
993995
def : RWSysReg<"IFSR32_EL2", 0b11, 0b100, 0b0101, 0b0000, 0b001>;

0 commit comments

Comments
 (0)