106f32e7eSjoerg//===-- ARMPredicates.td - ARM Instruction Predicates ------*- tablegen -*-===//
206f32e7eSjoerg//
306f32e7eSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406f32e7eSjoerg// See https://llvm.org/LICENSE.txt for license information.
506f32e7eSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606f32e7eSjoerg//
706f32e7eSjoerg//===----------------------------------------------------------------------===//
806f32e7eSjoerg
906f32e7eSjoergdef HasV4T           : Predicate<"Subtarget->hasV4TOps()">,
10*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV4TOps), "armv4t">;
1106f32e7eSjoergdef NoV4T            : Predicate<"!Subtarget->hasV4TOps()">;
1206f32e7eSjoergdef HasV5T           : Predicate<"Subtarget->hasV5TOps()">,
13*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV5TOps), "armv5t">;
1406f32e7eSjoergdef NoV5T            : Predicate<"!Subtarget->hasV5TOps()">;
1506f32e7eSjoergdef HasV5TE          : Predicate<"Subtarget->hasV5TEOps()">,
16*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV5TEOps), "armv5te">;
1706f32e7eSjoergdef HasV6            : Predicate<"Subtarget->hasV6Ops()">,
18*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV6Ops), "armv6">;
1906f32e7eSjoergdef NoV6             : Predicate<"!Subtarget->hasV6Ops()">;
2006f32e7eSjoergdef HasV6M           : Predicate<"Subtarget->hasV6MOps()">,
21*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV6MOps),
2206f32e7eSjoerg                                                    "armv6m or armv6t2">;
2306f32e7eSjoergdef HasV8MBaseline   : Predicate<"Subtarget->hasV8MBaselineOps()">,
24*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV8MBaselineOps),
2506f32e7eSjoerg                                                    "armv8m.base">;
2606f32e7eSjoergdef HasV8MMainline   : Predicate<"Subtarget->hasV8MMainlineOps()">,
27*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV8MMainlineOps),
2806f32e7eSjoerg                                                    "armv8m.main">;
2906f32e7eSjoergdef HasV8_1MMainline : Predicate<"Subtarget->hasV8_1MMainlineOps()">,
30*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV8_1MMainlineOps),
3106f32e7eSjoerg                                                    "armv8.1m.main">;
3206f32e7eSjoergdef HasMVEInt        : Predicate<"Subtarget->hasMVEIntegerOps()">,
33*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasMVEIntegerOps),
3406f32e7eSjoerg                                                    "mve">;
3506f32e7eSjoergdef HasMVEFloat      : Predicate<"Subtarget->hasMVEFloatOps()">,
36*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasMVEFloatOps),
3706f32e7eSjoerg                                                    "mve.fp">;
38*da58b97aSjoergdef HasCDE           : Predicate<"Subtarget->hasCDEOps()">,
39*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasCDEOps),
40*da58b97aSjoerg                                                    "cde">;
4106f32e7eSjoergdef HasFPRegs        : Predicate<"Subtarget->hasFPRegs()">,
42*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureFPRegs),
4306f32e7eSjoerg                                                    "fp registers">;
4406f32e7eSjoergdef HasFPRegs16      : Predicate<"Subtarget->hasFPRegs16()">,
45*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureFPRegs16),
46*da58b97aSjoerg                                                    "16-bit fp registers">;
47*da58b97aSjoergdef HasNoFPRegs16    : Predicate<"!Subtarget->hasFPRegs16()">,
48*da58b97aSjoerg                                 AssemblerPredicate<(all_of (not FeatureFPRegs16)),
4906f32e7eSjoerg                                                    "16-bit fp registers">;
5006f32e7eSjoergdef HasFPRegs64      : Predicate<"Subtarget->hasFPRegs64()">,
51*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureFPRegs64),
5206f32e7eSjoerg                                                    "64-bit fp registers">;
5306f32e7eSjoergdef HasFPRegsV8_1M   : Predicate<"Subtarget->hasFPRegs() && Subtarget->hasV8_1MMainlineOps()">,
54*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureFPRegs, HasV8_1MMainlineOps),
5506f32e7eSjoerg                                                    "armv8.1m.main with FP or MVE">;
5606f32e7eSjoergdef HasV6T2          : Predicate<"Subtarget->hasV6T2Ops()">,
57*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV6T2Ops), "armv6t2">;
5806f32e7eSjoergdef NoV6T2           : Predicate<"!Subtarget->hasV6T2Ops()">;
5906f32e7eSjoergdef HasV6K           : Predicate<"Subtarget->hasV6KOps()">,
60*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV6KOps), "armv6k">;
6106f32e7eSjoergdef NoV6K            : Predicate<"!Subtarget->hasV6KOps()">;
6206f32e7eSjoergdef HasV7            : Predicate<"Subtarget->hasV7Ops()">,
63*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV7Ops), "armv7">;
6406f32e7eSjoergdef HasV8            : Predicate<"Subtarget->hasV8Ops()">,
65*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV8Ops), "armv8">;
6606f32e7eSjoergdef PreV8            : Predicate<"!Subtarget->hasV8Ops()">,
67*da58b97aSjoerg                                 AssemblerPredicate<(all_of (not HasV8Ops)), "armv7 or earlier">;
6806f32e7eSjoergdef HasV8_1a         : Predicate<"Subtarget->hasV8_1aOps()">,
69*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV8_1aOps), "armv8.1a">;
7006f32e7eSjoergdef HasV8_2a         : Predicate<"Subtarget->hasV8_2aOps()">,
71*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV8_2aOps), "armv8.2a">;
7206f32e7eSjoergdef HasV8_3a         : Predicate<"Subtarget->hasV8_3aOps()">,
73*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV8_3aOps), "armv8.3a">;
7406f32e7eSjoergdef HasV8_4a         : Predicate<"Subtarget->hasV8_4aOps()">,
75*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV8_4aOps), "armv8.4a">;
7606f32e7eSjoergdef HasV8_5a         : Predicate<"Subtarget->hasV8_5aOps()">,
77*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV8_5aOps), "armv8.5a">;
78*da58b97aSjoergdef HasV8_6a         : Predicate<"Subtarget->hasV8_6aOps()">,
79*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV8_6aOps), "armv8.6a">;
80*da58b97aSjoergdef HasV8_7a         : Predicate<"Subtarget->hasV8_7aOps()">,
81*da58b97aSjoerg                                 AssemblerPredicate<(all_of HasV8_7aOps), "armv8.7a">;
8206f32e7eSjoergdef NoVFP            : Predicate<"!Subtarget->hasVFP2Base()">;
8306f32e7eSjoergdef HasVFP2          : Predicate<"Subtarget->hasVFP2Base()">,
84*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureVFP2_SP), "VFP2">;
8506f32e7eSjoergdef HasVFP3          : Predicate<"Subtarget->hasVFP3Base()">,
86*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureVFP3_D16_SP), "VFP3">;
8706f32e7eSjoergdef HasVFP4          : Predicate<"Subtarget->hasVFP4Base()">,
88*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureVFP4_D16_SP), "VFP4">;
8906f32e7eSjoergdef HasDPVFP         : Predicate<"Subtarget->hasFP64()">,
90*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureFP64),
9106f32e7eSjoerg                                                    "double precision VFP">;
9206f32e7eSjoergdef HasFPARMv8       : Predicate<"Subtarget->hasFPARMv8Base()">,
93*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureFPARMv8_D16_SP), "FPARMv8">;
9406f32e7eSjoergdef HasNEON          : Predicate<"Subtarget->hasNEON()">,
95*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureNEON), "NEON">;
9606f32e7eSjoergdef HasSHA2          : Predicate<"Subtarget->hasSHA2()">,
97*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureSHA2), "sha2">;
9806f32e7eSjoergdef HasAES           : Predicate<"Subtarget->hasAES()">,
99*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureAES), "aes">;
10006f32e7eSjoergdef HasCrypto        : Predicate<"Subtarget->hasCrypto()">,
101*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureCrypto), "crypto">;
10206f32e7eSjoergdef HasDotProd       : Predicate<"Subtarget->hasDotProd()">,
103*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureDotProd), "dotprod">;
10406f32e7eSjoergdef HasCRC           : Predicate<"Subtarget->hasCRC()">,
105*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureCRC), "crc">;
10606f32e7eSjoergdef HasRAS           : Predicate<"Subtarget->hasRAS()">,
107*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureRAS), "ras">;
10806f32e7eSjoergdef HasLOB           : Predicate<"Subtarget->hasLOB()">,
109*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureLOB), "lob">;
11006f32e7eSjoergdef HasFP16          : Predicate<"Subtarget->hasFP16()">,
111*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureFP16),"half-float conversions">;
11206f32e7eSjoergdef HasFullFP16      : Predicate<"Subtarget->hasFullFP16()">,
113*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureFullFP16),"full half-float">;
11406f32e7eSjoergdef HasFP16FML       : Predicate<"Subtarget->hasFP16FML()">,
115*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureFP16FML),"full half-float fml">;
116*da58b97aSjoergdef HasBF16          : Predicate<"Subtarget->hasBF16()">,
117*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureBF16),"BFloat16 floating point extension">;
118*da58b97aSjoergdef HasMatMulInt8    : Predicate<"Subtarget->hasMatMulInt8()">,
119*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureMatMulInt8),"8-bit integer matrix multiply">;
12006f32e7eSjoergdef HasDivideInThumb : Predicate<"Subtarget->hasDivideInThumbMode()">,
121*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureHWDivThumb), "divide in THUMB">;
12206f32e7eSjoergdef HasDivideInARM   : Predicate<"Subtarget->hasDivideInARMMode()">,
123*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureHWDivARM), "divide in ARM">;
12406f32e7eSjoergdef HasDSP           : Predicate<"Subtarget->hasDSP()">,
125*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureDSP), "dsp">;
12606f32e7eSjoergdef HasDB            : Predicate<"Subtarget->hasDataBarrier()">,
127*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureDB),
12806f32e7eSjoerg                                                    "data-barriers">;
12906f32e7eSjoergdef HasDFB           : Predicate<"Subtarget->hasFullDataBarrier()">,
130*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureDFB),
13106f32e7eSjoerg                                                    "full-data-barrier">;
13206f32e7eSjoergdef HasV7Clrex  : Predicate<"Subtarget->hasV7Clrex()">,
133*da58b97aSjoerg                            AssemblerPredicate<(all_of FeatureV7Clrex),
13406f32e7eSjoerg                                               "v7 clrex">;
13506f32e7eSjoergdef HasAcquireRelease : Predicate<"Subtarget->hasAcquireRelease()">,
136*da58b97aSjoerg                                  AssemblerPredicate<(all_of FeatureAcquireRelease),
13706f32e7eSjoerg                                                     "acquire/release">;
13806f32e7eSjoergdef HasMP            : Predicate<"Subtarget->hasMPExtension()">,
139*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureMP),
14006f32e7eSjoerg                                                    "mp-extensions">;
14106f32e7eSjoergdef HasVirtualization: Predicate<"false">,
142*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureVirtualization),
14306f32e7eSjoerg                                                   "virtualization-extensions">;
14406f32e7eSjoergdef HasTrustZone     : Predicate<"Subtarget->hasTrustZone()">,
145*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureTrustZone),
14606f32e7eSjoerg                                                    "TrustZone">;
14706f32e7eSjoergdef Has8MSecExt      : Predicate<"Subtarget->has8MSecExt()">,
148*da58b97aSjoerg                                 AssemblerPredicate<(all_of Feature8MSecExt),
14906f32e7eSjoerg                                                    "ARMv8-M Security Extensions">;
15006f32e7eSjoergdef HasZCZ           : Predicate<"Subtarget->hasZeroCycleZeroing()">;
15106f32e7eSjoergdef UseNEONForFP     : Predicate<"Subtarget->useNEONForSinglePrecisionFP()">;
15206f32e7eSjoergdef DontUseNEONForFP : Predicate<"!Subtarget->useNEONForSinglePrecisionFP()">;
15306f32e7eSjoergdef IsThumb          : Predicate<"Subtarget->isThumb()">,
154*da58b97aSjoerg                                 AssemblerPredicate<(all_of ModeThumb), "thumb">;
15506f32e7eSjoergdef IsThumb1Only     : Predicate<"Subtarget->isThumb1Only()">;
15606f32e7eSjoergdef IsThumb2         : Predicate<"Subtarget->isThumb2()">,
157*da58b97aSjoerg                                 AssemblerPredicate<(all_of ModeThumb, FeatureThumb2),
15806f32e7eSjoerg                                                    "thumb2">;
15906f32e7eSjoergdef IsMClass         : Predicate<"Subtarget->isMClass()">,
160*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureMClass), "armv*m">;
16106f32e7eSjoergdef IsNotMClass      : Predicate<"!Subtarget->isMClass()">,
162*da58b97aSjoerg                                 AssemblerPredicate<(all_of (not FeatureMClass)),
16306f32e7eSjoerg                                                    "!armv*m">;
16406f32e7eSjoergdef IsARM            : Predicate<"!Subtarget->isThumb()">,
165*da58b97aSjoerg                                 AssemblerPredicate<(all_of (not ModeThumb)), "arm-mode">;
16606f32e7eSjoergdef IsMachO          : Predicate<"Subtarget->isTargetMachO()">;
16706f32e7eSjoergdef IsNotMachO       : Predicate<"!Subtarget->isTargetMachO()">;
16806f32e7eSjoergdef IsNaCl           : Predicate<"Subtarget->isTargetNaCl()">;
16906f32e7eSjoergdef IsWindows        : Predicate<"Subtarget->isTargetWindows()">;
17006f32e7eSjoergdef IsNotWindows     : Predicate<"!Subtarget->isTargetWindows()">;
17106f32e7eSjoergdef IsReadTPHard     : Predicate<"Subtarget->isReadTPHard()">;
17206f32e7eSjoergdef IsReadTPSoft     : Predicate<"!Subtarget->isReadTPHard()">;
17306f32e7eSjoergdef UseNaClTrap      : Predicate<"Subtarget->useNaClTrap()">,
174*da58b97aSjoerg                                 AssemblerPredicate<(all_of FeatureNaClTrap), "NaCl">;
17506f32e7eSjoergdef DontUseNaClTrap  : Predicate<"!Subtarget->useNaClTrap()">;
17606f32e7eSjoerg
17706f32e7eSjoergdef UseNegativeImmediates :
17806f32e7eSjoerg  Predicate<"false">,
179*da58b97aSjoerg            AssemblerPredicate<(all_of (not FeatureNoNegativeImmediates)),
18006f32e7eSjoerg                               "NegativeImmediates">;
18106f32e7eSjoerg
18206f32e7eSjoerg// FIXME: Eventually this will be just "hasV6T2Ops".
18306f32e7eSjoerglet RecomputePerFunction = 1 in {
18406f32e7eSjoerg  def UseMovt          : Predicate<"Subtarget->useMovt()">;
18506f32e7eSjoerg  def DontUseMovt      : Predicate<"!Subtarget->useMovt()">;
18606f32e7eSjoerg  def UseMovtInPic     : Predicate<"Subtarget->useMovt() && Subtarget->allowPositionIndependentMovt()">;
18706f32e7eSjoerg  def DontUseMovtInPic : Predicate<"!Subtarget->useMovt() || !Subtarget->allowPositionIndependentMovt()">;
18806f32e7eSjoerg
18906f32e7eSjoerg  def UseFPVMLx: Predicate<"((Subtarget->useFPVMLx() &&"
19006f32e7eSjoerg                           "  TM.Options.AllowFPOpFusion != FPOpFusion::Fast) ||"
19106f32e7eSjoerg                           "Subtarget->hasMinSize())">;
192*da58b97aSjoerg  def SLSBLRMitigation : Predicate<[{ MF->getSubtarget<ARMSubtarget>().hardenSlsBlr() }]>;
193*da58b97aSjoerg  def NoSLSBLRMitigation : Predicate<[{ !MF->getSubtarget<ARMSubtarget>().hardenSlsBlr() }]>;
194*da58b97aSjoerg
19506f32e7eSjoerg}
19606f32e7eSjoergdef UseMulOps        : Predicate<"Subtarget->useMulOps()">;
19706f32e7eSjoerg
19806f32e7eSjoerg// Prefer fused MAC for fp mul + add over fp VMLA / VMLS if they are available.
19906f32e7eSjoerg// But only select them if more precision in FP computation is allowed, and when
20006f32e7eSjoerg// they are not slower than a mul + add sequence.
20106f32e7eSjoerg// Do not use them for Darwin platforms.
202*da58b97aSjoergdef UseFusedMAC      : Predicate<"TM.Options.AllowFPOpFusion =="
20306f32e7eSjoerg                                 "  FPOpFusion::Fast && "
204*da58b97aSjoerg                                 "Subtarget->useFPVFMx()">;
20506f32e7eSjoerg
20606f32e7eSjoergdef HasFastVGETLNi32 : Predicate<"!Subtarget->hasSlowVGETLNi32()">;
20706f32e7eSjoergdef HasSlowVGETLNi32 : Predicate<"Subtarget->hasSlowVGETLNi32()">;
20806f32e7eSjoerg
20906f32e7eSjoergdef HasFastVDUP32 : Predicate<"!Subtarget->hasSlowVDUP32()">;
21006f32e7eSjoergdef HasSlowVDUP32 : Predicate<"Subtarget->hasSlowVDUP32()">;
21106f32e7eSjoerg
21206f32e7eSjoergdef UseVMOVSR : Predicate<"Subtarget->preferVMOVSR() ||"
21306f32e7eSjoerg                          "!Subtarget->useNEONForSinglePrecisionFP()">;
21406f32e7eSjoergdef DontUseVMOVSR : Predicate<"!Subtarget->preferVMOVSR() &&"
21506f32e7eSjoerg                              "Subtarget->useNEONForSinglePrecisionFP()">;
21606f32e7eSjoerg
21706f32e7eSjoerglet RecomputePerFunction = 1 in {
21806f32e7eSjoerg  def IsLE             : Predicate<"MF->getDataLayout().isLittleEndian()">;
21906f32e7eSjoerg  def IsBE             : Predicate<"MF->getDataLayout().isBigEndian()">;
22006f32e7eSjoerg}
22106f32e7eSjoerg
22206f32e7eSjoergdef GenExecuteOnly : Predicate<"Subtarget->genExecuteOnly()">;
22306f32e7eSjoerg
22406f32e7eSjoerg// Armv8.5-A extensions
22506f32e7eSjoergdef HasSB            : Predicate<"Subtarget->hasSB()">,
226*da58b97aSjoerg                       AssemblerPredicate<(all_of FeatureSB), "sb">;
227