@@ -2925,37 +2925,45 @@ def UDF : UDFType<0, "udf">;
29252925// Pair (indexed, offset)
29262926defm LDPW : LoadPairOffset<0b00, 0, GPR32z, simm7s4, "ldp">;
29272927defm LDPX : LoadPairOffset<0b10, 0, GPR64z, simm7s8, "ldp">;
2928+ let Predicates = [HasFPARMv8] in {
29282929defm LDPS : LoadPairOffset<0b00, 1, FPR32Op, simm7s4, "ldp">;
29292930defm LDPD : LoadPairOffset<0b01, 1, FPR64Op, simm7s8, "ldp">;
29302931defm LDPQ : LoadPairOffset<0b10, 1, FPR128Op, simm7s16, "ldp">;
2932+ }
29312933
29322934defm LDPSW : LoadPairOffset<0b01, 0, GPR64z, simm7s4, "ldpsw">;
29332935
29342936// Pair (pre-indexed)
29352937def LDPWpre : LoadPairPreIdx<0b00, 0, GPR32z, simm7s4, "ldp">;
29362938def LDPXpre : LoadPairPreIdx<0b10, 0, GPR64z, simm7s8, "ldp">;
2939+ let Predicates = [HasFPARMv8] in {
29372940def LDPSpre : LoadPairPreIdx<0b00, 1, FPR32Op, simm7s4, "ldp">;
29382941def LDPDpre : LoadPairPreIdx<0b01, 1, FPR64Op, simm7s8, "ldp">;
29392942def LDPQpre : LoadPairPreIdx<0b10, 1, FPR128Op, simm7s16, "ldp">;
2943+ }
29402944
29412945def LDPSWpre : LoadPairPreIdx<0b01, 0, GPR64z, simm7s4, "ldpsw">;
29422946
29432947// Pair (post-indexed)
29442948def LDPWpost : LoadPairPostIdx<0b00, 0, GPR32z, simm7s4, "ldp">;
29452949def LDPXpost : LoadPairPostIdx<0b10, 0, GPR64z, simm7s8, "ldp">;
2950+ let Predicates = [HasFPARMv8] in {
29462951def LDPSpost : LoadPairPostIdx<0b00, 1, FPR32Op, simm7s4, "ldp">;
29472952def LDPDpost : LoadPairPostIdx<0b01, 1, FPR64Op, simm7s8, "ldp">;
29482953def LDPQpost : LoadPairPostIdx<0b10, 1, FPR128Op, simm7s16, "ldp">;
2954+ }
29492955
29502956def LDPSWpost : LoadPairPostIdx<0b01, 0, GPR64z, simm7s4, "ldpsw">;
29512957
29522958
29532959// Pair (no allocate)
29542960defm LDNPW : LoadPairNoAlloc<0b00, 0, GPR32z, simm7s4, "ldnp">;
29552961defm LDNPX : LoadPairNoAlloc<0b10, 0, GPR64z, simm7s8, "ldnp">;
2962+ let Predicates = [HasFPARMv8] in {
29562963defm LDNPS : LoadPairNoAlloc<0b00, 1, FPR32Op, simm7s4, "ldnp">;
29572964defm LDNPD : LoadPairNoAlloc<0b01, 1, FPR64Op, simm7s8, "ldnp">;
29582965defm LDNPQ : LoadPairNoAlloc<0b10, 1, FPR128Op, simm7s16, "ldnp">;
2966+ }
29592967
29602968def : 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>;
29732981defm LDRX : Load64RO<0b11, 0, 0b01, GPR64, "ldr", i64, load>;
29742982
29752983// Floating-point
2984+ let Predicates = [HasFPARMv8] in {
29762985defm LDRB : Load8RO<0b00, 1, 0b01, FPR8Op, "ldr", i8, load>;
29772986defm LDRH : Load16RO<0b01, 1, 0b01, FPR16Op, "ldr", f16, load>;
29782987defm LDRS : Load32RO<0b10, 1, 0b01, FPR32Op, "ldr", f32, load>;
29792988defm LDRD : Load64RO<0b11, 1, 0b01, FPR64Op, "ldr", f64, load>;
29802989defm LDRQ : Load128RO<0b00, 1, 0b11, FPR128Op, "ldr", f128, load>;
2990+ }
29812991
29822992// Load sign-extended half-word
29832993defm LDRSHW : Load16RO<0b01, 0, 0b11, GPR32, "ldrsh", i32, sextloadi16>;
@@ -3147,6 +3157,7 @@ defm LDRX : LoadUI<0b11, 0, 0b01, GPR64z, uimm12s8, "ldr",
31473157defm 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 {
31503161defm 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",
31623173defm 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
31673179def : 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)))]>;
33403352def LDRXl : LoadLiteral<0b01, 0, GPR64z, "ldr",
33413353 [(set GPR64z:$Rt, (load (AArch64adr alignedglobal:$label)))]>;
3354+ let Predicates = [HasFPARMv8] in {
33423355def LDRSl : LoadLiteral<0b00, 1, FPR32Op, "ldr",
33433356 [(set (f32 FPR32Op:$Rt), (load (AArch64adr alignedglobal:$label)))]>;
33443357def LDRDl : LoadLiteral<0b01, 1, FPR64Op, "ldr",
33453358 [(set (f64 FPR64Op:$Rt), (load (AArch64adr alignedglobal:$label)))]>;
33463359def LDRQl : LoadLiteral<0b10, 1, FPR128Op, "ldr",
33473360 [(set (f128 FPR128Op:$Rt), (load (AArch64adr alignedglobal:$label)))]>;
3361+ }
33483362
33493363// load sign-extended word
33503364def LDRSWl : LoadLiteral<0b10, 0, GPR64z, "ldrsw",
@@ -3367,6 +3381,7 @@ defm LDURX : LoadUnscaled<0b11, 0, 0b01, GPR64z, "ldur",
33673381defm LDURW : LoadUnscaled<0b10, 0, 0b01, GPR32z, "ldur",
33683382 [(set GPR32z:$Rt,
33693383 (load (am_unscaled32 GPR64sp:$Rn, simm9:$offset)))]>;
3384+ let Predicates = [HasFPARMv8] in {
33703385defm 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",
33823397defm LDURQ : LoadUnscaled<0b00, 1, 0b11, FPR128Op, "ldur",
33833398 [(set (f128 FPR128Op:$Rt),
33843399 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset)))]>;
3400+ }
33853401
33863402defm LDURHH
33873403 : LoadUnscaled<0b01, 0, 0b01, GPR32, "ldurh",
@@ -3641,11 +3657,13 @@ defm LDTRSW : LoadUnprivileged<0b10, 0, 0b10, GPR64, "ldtrsw">;
36413657// (immediate pre-indexed)
36423658def LDRWpre : LoadPreIdx<0b10, 0, 0b01, GPR32z, "ldr">;
36433659def LDRXpre : LoadPreIdx<0b11, 0, 0b01, GPR64z, "ldr">;
3660+ let Predicates = [HasFPARMv8] in {
36443661def LDRBpre : LoadPreIdx<0b00, 1, 0b01, FPR8Op, "ldr">;
36453662def LDRHpre : LoadPreIdx<0b01, 1, 0b01, FPR16Op, "ldr">;
36463663def LDRSpre : LoadPreIdx<0b10, 1, 0b01, FPR32Op, "ldr">;
36473664def LDRDpre : LoadPreIdx<0b11, 1, 0b01, FPR64Op, "ldr">;
36483665def LDRQpre : LoadPreIdx<0b00, 1, 0b11, FPR128Op, "ldr">;
3666+ }
36493667
36503668// load sign-extended half-word
36513669def LDRSHWpre : LoadPreIdx<0b01, 0, 0b11, GPR32z, "ldrsh">;
@@ -3666,11 +3684,13 @@ def LDRSWpre : LoadPreIdx<0b10, 0, 0b10, GPR64z, "ldrsw">;
36663684// (immediate post-indexed)
36673685def LDRWpost : LoadPostIdx<0b10, 0, 0b01, GPR32z, "ldr">;
36683686def LDRXpost : LoadPostIdx<0b11, 0, 0b01, GPR64z, "ldr">;
3687+ let Predicates = [HasFPARMv8] in {
36693688def LDRBpost : LoadPostIdx<0b00, 1, 0b01, FPR8Op, "ldr">;
36703689def LDRHpost : LoadPostIdx<0b01, 1, 0b01, FPR16Op, "ldr">;
36713690def LDRSpost : LoadPostIdx<0b10, 1, 0b01, FPR32Op, "ldr">;
36723691def LDRDpost : LoadPostIdx<0b11, 1, 0b01, FPR64Op, "ldr">;
36733692def LDRQpost : LoadPostIdx<0b00, 1, 0b11, FPR128Op, "ldr">;
3693+ }
36743694
36753695// load sign-extended half-word
36763696def 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.
36963716defm STPW : StorePairOffset<0b00, 0, GPR32z, simm7s4, "stp">;
36973717defm STPX : StorePairOffset<0b10, 0, GPR64z, simm7s8, "stp">;
3718+ let Predicates = [HasFPARMv8] in {
36983719defm STPS : StorePairOffset<0b00, 1, FPR32Op, simm7s4, "stp">;
36993720defm STPD : StorePairOffset<0b01, 1, FPR64Op, simm7s8, "stp">;
37003721defm STPQ : StorePairOffset<0b10, 1, FPR128Op, simm7s16, "stp">;
3722+ }
37013723
37023724// Pair (pre-indexed)
37033725def STPWpre : StorePairPreIdx<0b00, 0, GPR32z, simm7s4, "stp">;
37043726def STPXpre : StorePairPreIdx<0b10, 0, GPR64z, simm7s8, "stp">;
3727+ let Predicates = [HasFPARMv8] in {
37053728def STPSpre : StorePairPreIdx<0b00, 1, FPR32Op, simm7s4, "stp">;
37063729def STPDpre : StorePairPreIdx<0b01, 1, FPR64Op, simm7s8, "stp">;
37073730def STPQpre : StorePairPreIdx<0b10, 1, FPR128Op, simm7s16, "stp">;
3731+ }
37083732
37093733// Pair (post-indexed)
37103734def STPWpost : StorePairPostIdx<0b00, 0, GPR32z, simm7s4, "stp">;
37113735def STPXpost : StorePairPostIdx<0b10, 0, GPR64z, simm7s8, "stp">;
3736+ let Predicates = [HasFPARMv8] in {
37123737def STPSpost : StorePairPostIdx<0b00, 1, FPR32Op, simm7s4, "stp">;
37133738def STPDpost : StorePairPostIdx<0b01, 1, FPR64Op, simm7s8, "stp">;
37143739def STPQpost : StorePairPostIdx<0b10, 1, FPR128Op, simm7s16, "stp">;
3740+ }
37153741
37163742// Pair (no allocate)
37173743defm STNPW : StorePairNoAlloc<0b00, 0, GPR32z, simm7s4, "stnp">;
37183744defm STNPX : StorePairNoAlloc<0b10, 0, GPR64z, simm7s8, "stnp">;
3745+ let Predicates = [HasFPARMv8] in {
37193746defm STNPS : StorePairNoAlloc<0b00, 1, FPR32Op, simm7s4, "stnp">;
37203747defm STNPD : StorePairNoAlloc<0b01, 1, FPR64Op, simm7s8, "stnp">;
37213748defm STNPQ : StorePairNoAlloc<0b10, 1, FPR128Op, simm7s16, "stnp">;
3749+ }
37223750
37233751def : 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 {
37413770defm STRB : Store8RO< 0b00, 1, 0b00, FPR8Op, "str", i8, store>;
37423771defm STRH : Store16RO<0b01, 1, 0b00, FPR16Op, "str", f16, store>;
37433772defm STRS : Store32RO<0b10, 1, 0b00, FPR32Op, "str", f32, store>;
37443773defm STRD : Store64RO<0b11, 1, 0b00, FPR64Op, "str", f64, store>;
37453774defm STRQ : Store128RO<0b00, 1, 0b10, FPR128Op, "str">;
3775+ }
37463776
37473777let 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",
38513881defm STRW : StoreUIz<0b10, 0, 0b00, GPR32z, uimm12s4, "str",
38523882 [(store GPR32z:$Rt,
38533883 (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))]>;
3884+ let Predicates = [HasFPARMv8] in {
38543885defm 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))]>;
38663897defm STRQ : StoreUI<0b00, 1, 0b10, FPR128Op, uimm12s16, "str", []>;
3898+ }
38673899
38683900defm STRHH : StoreUIz<0b01, 0, 0b00, GPR32z, uimm12s2, "strh",
38693901 [(truncstorei16 GPR32z:$Rt,
@@ -3985,6 +4017,7 @@ defm STURX : StoreUnscaled<0b11, 0, 0b00, GPR64z, "stur",
39854017defm STURW : StoreUnscaled<0b10, 0, 0b00, GPR32z, "stur",
39864018 [(store GPR32z:$Rt,
39874019 (am_unscaled32 GPR64sp:$Rn, simm9:$offset))]>;
4020+ let Predicates = [HasFPARMv8] in {
39884021defm 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",
40004033defm STURQ : StoreUnscaled<0b00, 1, 0b10, FPR128Op, "stur",
40014034 [(store (f128 FPR128Op:$Rt),
40024035 (am_unscaled128 GPR64sp:$Rn, simm9:$offset))]>;
4036+ }
40034037defm 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)
41574191def STRWpre : StorePreIdx<0b10, 0, 0b00, GPR32z, "str", pre_store, i32>;
41584192def STRXpre : StorePreIdx<0b11, 0, 0b00, GPR64z, "str", pre_store, i64>;
4193+ let Predicates = [HasFPARMv8] in {
41594194def STRBpre : StorePreIdx<0b00, 1, 0b00, FPR8Op, "str", pre_store, i8>;
41604195def STRHpre : StorePreIdx<0b01, 1, 0b00, FPR16Op, "str", pre_store, f16>;
41614196def STRSpre : StorePreIdx<0b10, 1, 0b00, FPR32Op, "str", pre_store, f32>;
41624197def STRDpre : StorePreIdx<0b11, 1, 0b00, FPR64Op, "str", pre_store, f64>;
41634198def STRQpre : StorePreIdx<0b00, 1, 0b10, FPR128Op, "str", pre_store, f128>;
4199+ }
41644200
41654201def STRBBpre : StorePreIdx<0b00, 0, 0b00, GPR32z, "strb", pre_truncsti8, i32>;
41664202def 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)
42114247def STRWpost : StorePostIdx<0b10, 0, 0b00, GPR32z, "str", post_store, i32>;
42124248def STRXpost : StorePostIdx<0b11, 0, 0b00, GPR64z, "str", post_store, i64>;
4249+ let Predicates = [HasFPARMv8] in {
42134250def STRBpost : StorePostIdx<0b00, 1, 0b00, FPR8Op, "str", post_store, i8>;
42144251def STRHpost : StorePostIdx<0b01, 1, 0b00, FPR16Op, "str", post_store, f16>;
42154252def STRSpost : StorePostIdx<0b10, 1, 0b00, FPR32Op, "str", post_store, f32>;
42164253def STRDpost : StorePostIdx<0b11, 1, 0b00, FPR64Op, "str", post_store, f64>;
42174254def STRQpost : StorePostIdx<0b00, 1, 0b10, FPR128Op, "str", post_store, f128>;
4255+ }
42184256
42194257def STRBBpost : StorePostIdx<0b00, 0, 0b00, GPR32z, "strb", post_truncsti8, i32>;
42204258def 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:
45314569defm 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 {
45354574def FMOVH0 : Pseudo<(outs FPR16:$Rd), (ins), [(set f16:$Rd, (fpimm0))]>,
45364575 Sched<[WriteF]>;
45374576def 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
47614801def F128CSEL : Pseudo<(outs FPR128:$Rd),
47624802 (ins FPR128:$Rn, FPR128:$Rm, ccode:$cond),
47634803 [(set (f128 FPR128:$Rd),
0 commit comments