@@ -3532,6 +3532,7 @@ def : InstAlias<"ldr $Rt, [$Rn, $offset]",
3532
3532
(LDURXi GPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb64:$offset), 0>;
3533
3533
def : InstAlias<"ldr $Rt, [$Rn, $offset]",
3534
3534
(LDURWi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb32:$offset), 0>;
3535
+ let Predicates = [HasFPARMv8] in {
3535
3536
def : InstAlias<"ldr $Rt, [$Rn, $offset]",
3536
3537
(LDURBi FPR8Op:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>;
3537
3538
def : InstAlias<"ldr $Rt, [$Rn, $offset]",
@@ -3542,6 +3543,7 @@ def : InstAlias<"ldr $Rt, [$Rn, $offset]",
3542
3543
(LDURDi FPR64Op:$Rt, GPR64sp:$Rn, simm9_offset_fb64:$offset), 0>;
3543
3544
def : InstAlias<"ldr $Rt, [$Rn, $offset]",
3544
3545
(LDURQi FPR128Op:$Rt, GPR64sp:$Rn, simm9_offset_fb128:$offset), 0>;
3546
+ }
3545
3547
3546
3548
// zextload -> i64
3547
3549
def : Pat<(i64 (zextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))),
@@ -4175,6 +4177,7 @@ def : InstAlias<"str $Rt, [$Rn, $offset]",
4175
4177
(STURXi GPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb64:$offset), 0>;
4176
4178
def : InstAlias<"str $Rt, [$Rn, $offset]",
4177
4179
(STURWi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb32:$offset), 0>;
4180
+ let Predicates = [HasFPARMv8] in {
4178
4181
def : InstAlias<"str $Rt, [$Rn, $offset]",
4179
4182
(STURBi FPR8Op:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>;
4180
4183
def : InstAlias<"str $Rt, [$Rn, $offset]",
@@ -4185,6 +4188,7 @@ def : InstAlias<"str $Rt, [$Rn, $offset]",
4185
4188
(STURDi FPR64Op:$Rt, GPR64sp:$Rn, simm9_offset_fb64:$offset), 0>;
4186
4189
def : InstAlias<"str $Rt, [$Rn, $offset]",
4187
4190
(STURQi FPR128Op:$Rt, GPR64sp:$Rn, simm9_offset_fb128:$offset), 0>;
4191
+ }
4188
4192
4189
4193
def : InstAlias<"strb $Rt, [$Rn, $offset]",
4190
4194
(STURBBi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>;
@@ -4595,8 +4599,10 @@ def FMOVD0 : Pseudo<(outs FPR64:$Rd), (ins), [(set f64:$Rd, (fpimm0))]>,
4595
4599
// Similarly add aliases
4596
4600
def : InstAlias<"fmov $Rd, #0.0", (FMOVWHr FPR16:$Rd, WZR), 0>,
4597
4601
Requires<[HasFullFP16]>;
4602
+ let Predicates = [HasFPARMv8] in {
4598
4603
def : InstAlias<"fmov $Rd, #0.0", (FMOVWSr FPR32:$Rd, WZR), 0>;
4599
4604
def : InstAlias<"fmov $Rd, #0.0", (FMOVXDr FPR64:$Rd, XZR), 0>;
4605
+ }
4600
4606
4601
4607
def : Pat<(bf16 fpimm0),
4602
4608
(FMOVH0)>;
@@ -5040,10 +5046,12 @@ defm NEG : SIMDTwoVectorBHSD<1, 0b01011, "neg",
5040
5046
UnOpFrag<(sub immAllZerosV, node:$LHS)> >;
5041
5047
defm NOT : SIMDTwoVectorB<1, 0b00, 0b00101, "not", vnot>;
5042
5048
// Aliases for MVN -> NOT.
5049
+ let Predicates = [HasNEON] in {
5043
5050
def : InstAlias<"mvn{ $Vd.8b, $Vn.8b|.8b $Vd, $Vn}",
5044
5051
(NOTv8i8 V64:$Vd, V64:$Vn)>;
5045
5052
def : InstAlias<"mvn{ $Vd.16b, $Vn.16b|.16b $Vd, $Vn}",
5046
5053
(NOTv16i8 V128:$Vd, V128:$Vn)>;
5054
+ }
5047
5055
5048
5056
def : Pat<(vnot (v4i16 V64:$Rn)), (NOTv8i8 V64:$Rn)>;
5049
5057
def : Pat<(vnot (v8i16 V128:$Rn)), (NOTv16i8 V128:$Rn)>;
@@ -5318,6 +5326,7 @@ def : Pat<(AArch64bsp (v4i32 V128:$Rd), V128:$Rn, V128:$Rm),
5318
5326
def : Pat<(AArch64bsp (v2i64 V128:$Rd), V128:$Rn, V128:$Rm),
5319
5327
(BSPv16i8 V128:$Rd, V128:$Rn, V128:$Rm)>;
5320
5328
5329
+ let Predicates = [HasNEON] in {
5321
5330
def : InstAlias<"mov{\t$dst.16b, $src.16b|.16b\t$dst, $src}",
5322
5331
(ORRv16i8 V128:$dst, V128:$src, V128:$src), 1>;
5323
5332
def : InstAlias<"mov{\t$dst.8h, $src.8h|.8h\t$dst, $src}",
@@ -5495,6 +5504,7 @@ def : InstAlias<"{faclt\t$dst.4s, $src1.4s, $src2.4s" #
5495
5504
def : InstAlias<"{faclt\t$dst.2d, $src1.2d, $src2.2d" #
5496
5505
"|faclt.2d\t$dst, $src1, $src2}",
5497
5506
(FACGTv2f64 V128:$dst, V128:$src2, V128:$src1), 0>;
5507
+ }
5498
5508
5499
5509
//===----------------------------------------------------------------------===//
5500
5510
// Advanced SIMD three scalar instructions.
@@ -5557,6 +5567,7 @@ defm : FMULScalarFromIndexedLane0Patterns<"FMULX", "16", "32", "64",
5557
5567
int_aarch64_neon_fmulx,
5558
5568
[HasNEONorSME]>;
5559
5569
5570
+ let Predicates = [HasNEON] in {
5560
5571
def : InstAlias<"cmls $dst, $src1, $src2",
5561
5572
(CMHSv1i64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>;
5562
5573
def : InstAlias<"cmle $dst, $src1, $src2",
@@ -5565,6 +5576,8 @@ def : InstAlias<"cmlo $dst, $src1, $src2",
5565
5576
(CMHIv1i64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>;
5566
5577
def : InstAlias<"cmlt $dst, $src1, $src2",
5567
5578
(CMGTv1i64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>;
5579
+ }
5580
+ let Predicates = [HasFPARMv8] in {
5568
5581
def : InstAlias<"fcmle $dst, $src1, $src2",
5569
5582
(FCMGE32 FPR32:$dst, FPR32:$src2, FPR32:$src1), 0>;
5570
5583
def : InstAlias<"fcmle $dst, $src1, $src2",
@@ -5581,6 +5594,7 @@ def : InstAlias<"faclt $dst, $src1, $src2",
5581
5594
(FACGT32 FPR32:$dst, FPR32:$src2, FPR32:$src1), 0>;
5582
5595
def : InstAlias<"faclt $dst, $src1, $src2",
5583
5596
(FACGT64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>;
5597
+ }
5584
5598
5585
5599
//===----------------------------------------------------------------------===//
5586
5600
// Advanced SIMD three scalar instructions (mixed operands).
@@ -7027,6 +7041,7 @@ defm BIC : SIMDModifiedImmVectorShiftTied<1, 0b11, 0b01, "bic", AArch64bici>;
7027
7041
// AdvSIMD ORR
7028
7042
defm ORR : SIMDModifiedImmVectorShiftTied<0, 0b11, 0b01, "orr", AArch64orri>;
7029
7043
7044
+ let Predicates = [HasNEON] in {
7030
7045
def : InstAlias<"bic $Vd.4h, $imm", (BICv4i16 V64:$Vd, imm0_255:$imm, 0)>;
7031
7046
def : InstAlias<"bic $Vd.8h, $imm", (BICv8i16 V128:$Vd, imm0_255:$imm, 0)>;
7032
7047
def : InstAlias<"bic $Vd.2s, $imm", (BICv2i32 V64:$Vd, imm0_255:$imm, 0)>;
@@ -7046,6 +7061,7 @@ def : InstAlias<"orr.4h $Vd, $imm", (ORRv4i16 V64:$Vd, imm0_255:$imm, 0)>;
7046
7061
def : InstAlias<"orr.8h $Vd, $imm", (ORRv8i16 V128:$Vd, imm0_255:$imm, 0)>;
7047
7062
def : InstAlias<"orr.2s $Vd, $imm", (ORRv2i32 V64:$Vd, imm0_255:$imm, 0)>;
7048
7063
def : InstAlias<"orr.4s $Vd, $imm", (ORRv4i32 V128:$Vd, imm0_255:$imm, 0)>;
7064
+ }
7049
7065
7050
7066
// AdvSIMD FMOV
7051
7067
def FMOVv2f64_ns : SIMDModifiedImmVectorNoShift<1, 1, 0, 0b1111, V128, fpimm8,
@@ -7129,6 +7145,7 @@ let Predicates = [HasNEON] in {
7129
7145
ssub)>;
7130
7146
}
7131
7147
7148
+ let Predicates = [HasNEON] in {
7132
7149
def : InstAlias<"movi $Vd.4h, $imm", (MOVIv4i16 V64:$Vd, imm0_255:$imm, 0), 0>;
7133
7150
def : InstAlias<"movi $Vd.8h, $imm", (MOVIv8i16 V128:$Vd, imm0_255:$imm, 0), 0>;
7134
7151
def : InstAlias<"movi $Vd.2s, $imm", (MOVIv2i32 V64:$Vd, imm0_255:$imm, 0), 0>;
@@ -7138,6 +7155,7 @@ def : InstAlias<"movi.4h $Vd, $imm", (MOVIv4i16 V64:$Vd, imm0_255:$imm, 0), 0>;
7138
7155
def : InstAlias<"movi.8h $Vd, $imm", (MOVIv8i16 V128:$Vd, imm0_255:$imm, 0), 0>;
7139
7156
def : InstAlias<"movi.2s $Vd, $imm", (MOVIv2i32 V64:$Vd, imm0_255:$imm, 0), 0>;
7140
7157
def : InstAlias<"movi.4s $Vd, $imm", (MOVIv4i32 V128:$Vd, imm0_255:$imm, 0), 0>;
7158
+ }
7141
7159
7142
7160
def : Pat<(v2i32 (AArch64movi_shift imm0_255:$imm8, (i32 imm:$shift))),
7143
7161
(MOVIv2i32 imm0_255:$imm8, imm:$shift)>;
@@ -7173,6 +7191,7 @@ def MOVIv16b_ns : SIMDModifiedImmVectorNoShift<1, 0, 0, 0b1110, V128, imm0_255,
7173
7191
let isReMaterializable = 1, isAsCheapAsAMove = 1 in
7174
7192
defm MVNI : SIMDModifiedImmVectorShift<1, 0b10, 0b00, "mvni">;
7175
7193
7194
+ let Predicates = [HasNEON] in {
7176
7195
def : InstAlias<"mvni $Vd.4h, $imm", (MVNIv4i16 V64:$Vd, imm0_255:$imm, 0), 0>;
7177
7196
def : InstAlias<"mvni $Vd.8h, $imm", (MVNIv8i16 V128:$Vd, imm0_255:$imm, 0), 0>;
7178
7197
def : InstAlias<"mvni $Vd.2s, $imm", (MVNIv2i32 V64:$Vd, imm0_255:$imm, 0), 0>;
@@ -7182,6 +7201,7 @@ def : InstAlias<"mvni.4h $Vd, $imm", (MVNIv4i16 V64:$Vd, imm0_255:$imm, 0), 0>;
7182
7201
def : InstAlias<"mvni.8h $Vd, $imm", (MVNIv8i16 V128:$Vd, imm0_255:$imm, 0), 0>;
7183
7202
def : InstAlias<"mvni.2s $Vd, $imm", (MVNIv2i32 V64:$Vd, imm0_255:$imm, 0), 0>;
7184
7203
def : InstAlias<"mvni.4s $Vd, $imm", (MVNIv4i32 V128:$Vd, imm0_255:$imm, 0), 0>;
7204
+ }
7185
7205
7186
7206
def : Pat<(v2i32 (AArch64mvni_shift imm0_255:$imm8, (i32 imm:$shift))),
7187
7207
(MVNIv2i32 imm0_255:$imm8, imm:$shift)>;
@@ -7669,6 +7689,7 @@ def : Pat<(v2i64 (zext (v2i32 (extract_high_v4i32 (v4i32 V128:$Rn)) ))),
7669
7689
def : Pat<(v2i64 (sext (v2i32 (extract_high_v4i32 (v4i32 V128:$Rn)) ))),
7670
7690
(SSHLLv4i32_shift V128:$Rn, (i32 0))>;
7671
7691
7692
+ let Predicates = [HasNEON] in {
7672
7693
// Vector shift sxtl aliases
7673
7694
def : InstAlias<"sxtl.8h $dst, $src1",
7674
7695
(SSHLLv8i8_shift V128:$dst, V64:$src1, 0)>;
@@ -7724,6 +7745,7 @@ def : InstAlias<"uxtl2.2d $dst, $src1",
7724
7745
(USHLLv4i32_shift V128:$dst, V128:$src1, 0)>;
7725
7746
def : InstAlias<"uxtl2 $dst.2d, $src1.4s",
7726
7747
(USHLLv4i32_shift V128:$dst, V128:$src1, 0)>;
7748
+ }
7727
7749
7728
7750
// If an integer is about to be converted to a floating point value,
7729
7751
// just load it on the floating point unit.
@@ -8172,7 +8194,7 @@ def AESIMCrr : AESInst< 0b0111, "aesimc", int_aarch64_crypto_aesimc>;
8172
8194
8173
8195
// Pseudo instructions for AESMCrr/AESIMCrr with a register constraint required
8174
8196
// for AES fusion on some CPUs.
8175
- let hasSideEffects = 0, mayStore = 0, mayLoad = 0 in {
8197
+ let hasSideEffects = 0, mayStore = 0, mayLoad = 0, Predicates = [HasAES] in {
8176
8198
def AESMCrrTied: Pseudo<(outs V128:$Rd), (ins V128:$Rn), [], "$Rn = $Rd">,
8177
8199
Sched<[WriteVq]>;
8178
8200
def AESIMCrrTied: Pseudo<(outs V128:$Rd), (ins V128:$Rn), [], "$Rn = $Rd">,
0 commit comments