mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[ARM] Rename HW div feature to HW div Thumb. NFCI.
The hardware div feature refers only to Thumb, but because of its name it is tempting to use it to check for hardware division in general, which may cause problems in ARM mode. See https://reviews.llvm.org/D32005. This patch adds "Thumb" to its name, to make its scope clear. One notable place where I haven't made the change is in the feature flag (used with -mattr), which is still hwdiv. Changing it would also require changes in a lot of tests, including clang tests, and it doesn't seem like it's worth the effort. Differential Revision: https://reviews.llvm.org/D32160 llvm-svn: 300827
This commit is contained in:
parent
1792ac28fa
commit
7d3f6c0293
@ -78,33 +78,33 @@ ARM_ARCH("armv7-a", AK_ARMV7A, "7-A", "v7", ARMBuildAttrs::CPUArch::v7,
|
||||
FK_NEON, ARM::AEK_DSP)
|
||||
ARM_ARCH("armv7ve", AK_ARMV7VE, "7VE", "v7ve", ARMBuildAttrs::CPUArch::v7,
|
||||
FK_NEON, (ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIV | ARM::AEK_DSP))
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP))
|
||||
ARM_ARCH("armv7-r", AK_ARMV7R, "7-R", "v7r", ARMBuildAttrs::CPUArch::v7,
|
||||
FK_NONE, (ARM::AEK_HWDIV | ARM::AEK_DSP))
|
||||
FK_NONE, (ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP))
|
||||
ARM_ARCH("armv7-m", AK_ARMV7M, "7-M", "v7m", ARMBuildAttrs::CPUArch::v7,
|
||||
FK_NONE, ARM::AEK_HWDIV)
|
||||
FK_NONE, ARM::AEK_HWDIVTHUMB)
|
||||
ARM_ARCH("armv7e-m", AK_ARMV7EM, "7E-M", "v7em", ARMBuildAttrs::CPUArch::v7E_M,
|
||||
FK_NONE, (ARM::AEK_HWDIV | ARM::AEK_DSP))
|
||||
FK_NONE, (ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP))
|
||||
ARM_ARCH("armv8-a", AK_ARMV8A, "8-A", "v8", ARMBuildAttrs::CPUArch::v8_A,
|
||||
FK_CRYPTO_NEON_FP_ARMV8,
|
||||
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP | ARM::AEK_CRC))
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC))
|
||||
ARM_ARCH("armv8.1-a", AK_ARMV8_1A, "8.1-A", "v8.1a",
|
||||
ARMBuildAttrs::CPUArch::v8_A, FK_CRYPTO_NEON_FP_ARMV8,
|
||||
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP | ARM::AEK_CRC))
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC))
|
||||
ARM_ARCH("armv8.2-a", AK_ARMV8_2A, "8.2-A", "v8.2a",
|
||||
ARMBuildAttrs::CPUArch::v8_A, FK_CRYPTO_NEON_FP_ARMV8,
|
||||
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS))
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS))
|
||||
ARM_ARCH("armv8-r", AK_ARMV8R, "8-R", "v8r", ARMBuildAttrs::CPUArch::v8_R,
|
||||
FK_NEON_FP_ARMV8,
|
||||
(ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM | ARM::AEK_HWDIV |
|
||||
(ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
|
||||
ARM::AEK_DSP | ARM::AEK_CRC))
|
||||
ARM_ARCH("armv8-m.base", AK_ARMV8MBaseline, "8-M.Baseline", "v8m.base",
|
||||
ARMBuildAttrs::CPUArch::v8_M_Base, FK_NONE, ARM::AEK_HWDIV)
|
||||
ARMBuildAttrs::CPUArch::v8_M_Base, FK_NONE, ARM::AEK_HWDIVTHUMB)
|
||||
ARM_ARCH("armv8-m.main", AK_ARMV8MMainline, "8-M.Mainline", "v8m.main",
|
||||
ARMBuildAttrs::CPUArch::v8_M_Main, FK_FPV5_D16, ARM::AEK_HWDIV)
|
||||
ARMBuildAttrs::CPUArch::v8_M_Main, FK_FPV5_D16, ARM::AEK_HWDIVTHUMB)
|
||||
// Non-standard Arch names.
|
||||
ARM_ARCH("iwmmxt", AK_IWMMXT, "iwmmxt", "", ARMBuildAttrs::CPUArch::v5TE,
|
||||
FK_NONE, ARM::AEK_NONE)
|
||||
@ -128,7 +128,7 @@ ARM_ARCH_EXT_NAME("crc", ARM::AEK_CRC, "+crc", "-crc")
|
||||
ARM_ARCH_EXT_NAME("crypto", ARM::AEK_CRYPTO, "+crypto","-crypto")
|
||||
ARM_ARCH_EXT_NAME("dsp", ARM::AEK_DSP, "+dsp", "-dsp")
|
||||
ARM_ARCH_EXT_NAME("fp", ARM::AEK_FP, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("idiv", (ARM::AEK_HWDIVARM | ARM::AEK_HWDIV), nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("idiv", (ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB), nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("mp", ARM::AEK_MP, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("simd", ARM::AEK_SIMD, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("sec", ARM::AEK_SEC, nullptr, nullptr)
|
||||
@ -147,9 +147,9 @@ ARM_ARCH_EXT_NAME("xscale", ARM::AEK_XSCALE, nullptr, nullptr)
|
||||
#endif
|
||||
ARM_HW_DIV_NAME("invalid", ARM::AEK_INVALID)
|
||||
ARM_HW_DIV_NAME("none", ARM::AEK_NONE)
|
||||
ARM_HW_DIV_NAME("thumb", ARM::AEK_HWDIV)
|
||||
ARM_HW_DIV_NAME("thumb", ARM::AEK_HWDIVTHUMB)
|
||||
ARM_HW_DIV_NAME("arm", ARM::AEK_HWDIVARM)
|
||||
ARM_HW_DIV_NAME("arm,thumb", (ARM::AEK_HWDIVARM | ARM::AEK_HWDIV))
|
||||
ARM_HW_DIV_NAME("arm,thumb", (ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB))
|
||||
#undef ARM_HW_DIV_NAME
|
||||
|
||||
#ifndef ARM_CPU_NAME
|
||||
@ -205,20 +205,20 @@ ARM_CPU_NAME("cortex-a5", AK_ARMV7A, FK_NEON_VFPV4, false,
|
||||
(ARM::AEK_SEC | ARM::AEK_MP))
|
||||
ARM_CPU_NAME("cortex-a7", AK_ARMV7A, FK_NEON_VFPV4, false,
|
||||
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV))
|
||||
ARM::AEK_HWDIVTHUMB))
|
||||
ARM_CPU_NAME("cortex-a8", AK_ARMV7A, FK_NEON, true, ARM::AEK_SEC)
|
||||
ARM_CPU_NAME("cortex-a9", AK_ARMV7A, FK_NEON_FP16, false, (ARM::AEK_SEC | ARM::AEK_MP))
|
||||
ARM_CPU_NAME("cortex-a12", AK_ARMV7A, FK_NEON_VFPV4, false,
|
||||
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV))
|
||||
ARM::AEK_HWDIVTHUMB))
|
||||
ARM_CPU_NAME("cortex-a15", AK_ARMV7A, FK_NEON_VFPV4, false,
|
||||
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV))
|
||||
ARM::AEK_HWDIVTHUMB))
|
||||
ARM_CPU_NAME("cortex-a17", AK_ARMV7A, FK_NEON_VFPV4, false,
|
||||
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV))
|
||||
ARM::AEK_HWDIVTHUMB))
|
||||
ARM_CPU_NAME("krait", AK_ARMV7A, FK_NEON_VFPV4, false,
|
||||
(ARM::AEK_HWDIVARM | ARM::AEK_HWDIV))
|
||||
(ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB))
|
||||
ARM_CPU_NAME("cortex-r4", AK_ARMV7R, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-r4f", AK_ARMV7R, FK_VFPV3_D16, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-r5", AK_ARMV7R, FK_VFPV3_D16, false,
|
||||
@ -249,7 +249,7 @@ ARM_CPU_NAME("kryo", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, ARM::AEK_CRC)
|
||||
ARM_CPU_NAME("iwmmxt", AK_IWMMXT, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("xscale", AK_XSCALE, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("swift", AK_ARMV7S, FK_NEON_VFPV4, true,
|
||||
(ARM::AEK_HWDIVARM | ARM::AEK_HWDIV))
|
||||
(ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB))
|
||||
// Invalid CPU
|
||||
ARM_CPU_NAME("invalid", AK_INVALID, FK_INVALID, true, ARM::AEK_INVALID)
|
||||
#undef ARM_CPU_NAME
|
||||
|
@ -75,7 +75,7 @@ enum ArchExtKind : unsigned {
|
||||
AEK_CRC = 0x2,
|
||||
AEK_CRYPTO = 0x4,
|
||||
AEK_FP = 0x8,
|
||||
AEK_HWDIV = 0x10,
|
||||
AEK_HWDIVTHUMB = 0x10,
|
||||
AEK_HWDIVARM = 0x20,
|
||||
AEK_MP = 0x40,
|
||||
AEK_SIMD = 0x80,
|
||||
|
@ -210,7 +210,7 @@ bool llvm::ARM::getHWDivFeatures(unsigned HWDivKind,
|
||||
else
|
||||
Features.push_back("-hwdiv-arm");
|
||||
|
||||
if (HWDivKind & ARM::AEK_HWDIV)
|
||||
if (HWDivKind & ARM::AEK_HWDIVTHUMB)
|
||||
Features.push_back("+hwdiv");
|
||||
else
|
||||
Features.push_back("-hwdiv");
|
||||
|
@ -67,8 +67,9 @@ def FeatureFullFP16 : SubtargetFeature<"fullfp16", "HasFullFP16", "true",
|
||||
[FeatureFPARMv8]>;
|
||||
def FeatureD16 : SubtargetFeature<"d16", "HasD16", "true",
|
||||
"Restrict FP to 16 double registers">;
|
||||
def FeatureHWDiv : SubtargetFeature<"hwdiv", "HasHardwareDivide", "true",
|
||||
"Enable divide instructions">;
|
||||
def FeatureHWDivThumb : SubtargetFeature<"hwdiv", "HasHardwareDivideInThumb",
|
||||
"true",
|
||||
"Enable divide instructions in Thumb">;
|
||||
def FeatureHWDivARM : SubtargetFeature<"hwdiv-arm",
|
||||
"HasHardwareDivideInARM", "true",
|
||||
"Enable divide instructions in ARM mode">;
|
||||
@ -225,7 +226,7 @@ def FeatureMP : SubtargetFeature<"mp", "HasMPExtension", "true",
|
||||
def FeatureVirtualization : SubtargetFeature<"virtualization",
|
||||
"HasVirtualization", "true",
|
||||
"Supports Virtualization extension",
|
||||
[FeatureHWDiv, FeatureHWDivARM]>;
|
||||
[FeatureHWDivThumb, FeatureHWDivARM]>;
|
||||
|
||||
// M-series ISA
|
||||
def FeatureMClass : SubtargetFeature<"mclass", "ARMProcClass", "MClass",
|
||||
@ -433,21 +434,21 @@ def ARMv7ve : Architecture<"armv7ve", "ARMv7ve", [HasV7Ops,
|
||||
def ARMv7r : Architecture<"armv7-r", "ARMv7r", [HasV7Ops,
|
||||
FeatureDB,
|
||||
FeatureDSP,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureRClass]>;
|
||||
|
||||
def ARMv7m : Architecture<"armv7-m", "ARMv7m", [HasV7Ops,
|
||||
FeatureThumb2,
|
||||
FeatureNoARM,
|
||||
FeatureDB,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureMClass]>;
|
||||
|
||||
def ARMv7em : Architecture<"armv7e-m", "ARMv7em", [HasV7Ops,
|
||||
FeatureThumb2,
|
||||
FeatureNoARM,
|
||||
FeatureDB,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureMClass,
|
||||
FeatureDSP]>;
|
||||
|
||||
@ -502,7 +503,7 @@ def ARMv8mBaseline : Architecture<"armv8-m.base", "ARMv8mBaseline",
|
||||
[HasV8MBaselineOps,
|
||||
FeatureNoARM,
|
||||
FeatureDB,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureV7Clrex,
|
||||
Feature8MSecExt,
|
||||
FeatureAcquireRelease,
|
||||
@ -512,7 +513,7 @@ def ARMv8mMainline : Architecture<"armv8-m.main", "ARMv8mMainline",
|
||||
[HasV8MMainlineOps,
|
||||
FeatureNoARM,
|
||||
FeatureDB,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
Feature8MSecExt,
|
||||
FeatureAcquireRelease,
|
||||
FeatureMClass]>;
|
||||
@ -678,7 +679,7 @@ def : ProcessorModel<"krait", CortexA9Model, [ARMv7a, ProcKrait,
|
||||
FeatureFP16,
|
||||
FeatureAvoidPartialCPSR,
|
||||
FeatureVFP4,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM]>;
|
||||
|
||||
def : ProcessorModel<"swift", SwiftModel, [ARMv7a, ProcSwift,
|
||||
@ -686,7 +687,7 @@ def : ProcessorModel<"swift", SwiftModel, [ARMv7a, ProcSwift,
|
||||
FeatureNEONForFP,
|
||||
FeatureVFP4,
|
||||
FeatureMP,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM,
|
||||
FeatureAvoidPartialCPSR,
|
||||
FeatureAvoidMOVsShOp,
|
||||
@ -768,39 +769,39 @@ def : ProcNoItin<"cortex-m33", [ARMv8mMainline,
|
||||
FeatureVFPOnlySP]>;
|
||||
|
||||
def : ProcNoItin<"cortex-a32", [ARMv8a,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM,
|
||||
FeatureCrypto,
|
||||
FeatureCRC]>;
|
||||
|
||||
def : ProcNoItin<"cortex-a35", [ARMv8a, ProcA35,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM,
|
||||
FeatureCrypto,
|
||||
FeatureCRC]>;
|
||||
|
||||
def : ProcNoItin<"cortex-a53", [ARMv8a, ProcA53,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM,
|
||||
FeatureCrypto,
|
||||
FeatureCRC,
|
||||
FeatureFPAO]>;
|
||||
|
||||
def : ProcNoItin<"cortex-a57", [ARMv8a, ProcA57,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM,
|
||||
FeatureCrypto,
|
||||
FeatureCRC,
|
||||
FeatureFPAO]>;
|
||||
|
||||
def : ProcNoItin<"cortex-a72", [ARMv8a, ProcA72,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM,
|
||||
FeatureCrypto,
|
||||
FeatureCRC]>;
|
||||
|
||||
def : ProcNoItin<"cortex-a73", [ARMv8a, ProcA73,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM,
|
||||
FeatureCrypto,
|
||||
FeatureCRC]>;
|
||||
@ -811,7 +812,7 @@ def : ProcessorModel<"cyclone", SwiftModel, [ARMv8a, ProcSwift,
|
||||
FeatureNEONForFP,
|
||||
FeatureVFP4,
|
||||
FeatureMP,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM,
|
||||
FeatureAvoidPartialCPSR,
|
||||
FeatureAvoidMOVsShOp,
|
||||
@ -820,25 +821,25 @@ def : ProcessorModel<"cyclone", SwiftModel, [ARMv8a, ProcSwift,
|
||||
FeatureZCZeroing]>;
|
||||
|
||||
def : ProcNoItin<"exynos-m1", [ARMv8a, ProcExynosM1,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM,
|
||||
FeatureCrypto,
|
||||
FeatureCRC]>;
|
||||
|
||||
def : ProcNoItin<"exynos-m2", [ARMv8a, ProcExynosM1,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM,
|
||||
FeatureCrypto,
|
||||
FeatureCRC]>;
|
||||
|
||||
def : ProcNoItin<"exynos-m3", [ARMv8a, ProcExynosM1,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM,
|
||||
FeatureCrypto,
|
||||
FeatureCRC]>;
|
||||
|
||||
def : ProcNoItin<"kryo", [ARMv8a, ProcKryo,
|
||||
FeatureHWDiv,
|
||||
FeatureHWDivThumb,
|
||||
FeatureHWDivARM,
|
||||
FeatureCrypto,
|
||||
FeatureCRC]>;
|
||||
|
@ -1702,7 +1702,8 @@ bool ARMFastISel::SelectDiv(const Instruction *I, bool isSigned) {
|
||||
// If we have integer div support we should have selected this automagically.
|
||||
// In case we have a real miss go ahead and return false and we'll pick
|
||||
// it up later.
|
||||
if (Subtarget->hasDivide()) return false;
|
||||
if (Subtarget->hasDivideInThumbMode())
|
||||
return false;
|
||||
|
||||
// Otherwise emit a libcall.
|
||||
RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
|
||||
|
@ -852,7 +852,7 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
|
||||
if (!Subtarget->hasV6Ops())
|
||||
setOperationAction(ISD::BSWAP, MVT::i32, Expand);
|
||||
|
||||
bool hasDivide = Subtarget->isThumb() ? Subtarget->hasDivide()
|
||||
bool hasDivide = Subtarget->isThumb() ? Subtarget->hasDivideInThumbMode()
|
||||
: Subtarget->hasDivideInARMMode();
|
||||
if (!hasDivide) {
|
||||
// These are expanded into libcalls if the cpu doesn't have HW divider.
|
||||
@ -860,7 +860,7 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
|
||||
setOperationAction(ISD::UDIV, MVT::i32, LibCall);
|
||||
}
|
||||
|
||||
if (Subtarget->isTargetWindows() && !Subtarget->hasDivide()) {
|
||||
if (Subtarget->isTargetWindows() && !Subtarget->hasDivideInThumbMode()) {
|
||||
setOperationAction(ISD::SDIV, MVT::i32, Custom);
|
||||
setOperationAction(ISD::UDIV, MVT::i32, Custom);
|
||||
|
||||
@ -13043,7 +13043,7 @@ SDValue ARMTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
|
||||
// rem = a - b * div
|
||||
// return {div, rem}
|
||||
// This should be lowered into UDIV/SDIV + MLS later on.
|
||||
bool hasDivide = Subtarget->isThumb() ? Subtarget->hasDivide()
|
||||
bool hasDivide = Subtarget->isThumb() ? Subtarget->hasDivideInThumbMode()
|
||||
: Subtarget->hasDivideInARMMode();
|
||||
if (hasDivide && Op->getValueType(0).isSimple() &&
|
||||
Op->getSimpleValueType(0) == MVT::i32) {
|
||||
|
@ -259,8 +259,8 @@ def HasFP16 : Predicate<"Subtarget->hasFP16()">,
|
||||
AssemblerPredicate<"FeatureFP16","half-float conversions">;
|
||||
def HasFullFP16 : Predicate<"Subtarget->hasFullFP16()">,
|
||||
AssemblerPredicate<"FeatureFullFP16","full half-float">;
|
||||
def HasDivide : Predicate<"Subtarget->hasDivide()">,
|
||||
AssemblerPredicate<"FeatureHWDiv", "divide in THUMB">;
|
||||
def HasDivideInThumb : Predicate<"Subtarget->hasDivideInThumbMode()">,
|
||||
AssemblerPredicate<"FeatureHWDivThumb", "divide in THUMB">;
|
||||
def HasDivideInARM : Predicate<"Subtarget->hasDivideInARMMode()">,
|
||||
AssemblerPredicate<"FeatureHWDivARM", "divide in ARM">;
|
||||
def HasDSP : Predicate<"Subtarget->hasDSP()">,
|
||||
|
@ -2797,7 +2797,7 @@ def t2SMLSLDX : T2DualHalfMulAddLong<0b101, 0b1101, "smlsldx">;
|
||||
def t2SDIV : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iDIV,
|
||||
"sdiv", "\t$Rd, $Rn, $Rm",
|
||||
[(set rGPR:$Rd, (sdiv rGPR:$Rn, rGPR:$Rm))]>,
|
||||
Requires<[HasDivide, IsThumb, HasV8MBaseline]>,
|
||||
Requires<[HasDivideInThumb, IsThumb, HasV8MBaseline]>,
|
||||
Sched<[WriteDIV]> {
|
||||
let Inst{31-27} = 0b11111;
|
||||
let Inst{26-21} = 0b011100;
|
||||
@ -2809,7 +2809,7 @@ def t2SDIV : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iDIV,
|
||||
def t2UDIV : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iDIV,
|
||||
"udiv", "\t$Rd, $Rn, $Rm",
|
||||
[(set rGPR:$Rd, (udiv rGPR:$Rn, rGPR:$Rm))]>,
|
||||
Requires<[HasDivide, IsThumb, HasV8MBaseline]>,
|
||||
Requires<[HasDivideInThumb, IsThumb, HasV8MBaseline]>,
|
||||
Sched<[WriteDIV]> {
|
||||
let Inst{31-27} = 0b11111;
|
||||
let Inst{26-21} = 0b011101;
|
||||
|
@ -208,8 +208,8 @@ protected:
|
||||
/// FP registers for VFPv3.
|
||||
bool HasD16 = false;
|
||||
|
||||
/// HasHardwareDivide - True if subtarget supports [su]div
|
||||
bool HasHardwareDivide = false;
|
||||
/// HasHardwareDivide - True if subtarget supports [su]div in Thumb mode
|
||||
bool HasHardwareDivideInThumb = false;
|
||||
|
||||
/// HasHardwareDivideInARM - True if subtarget supports [su]div in ARM mode
|
||||
bool HasHardwareDivideInARM = false;
|
||||
@ -507,7 +507,7 @@ public:
|
||||
return hasNEON() && UseNEONForSinglePrecisionFP;
|
||||
}
|
||||
|
||||
bool hasDivide() const { return HasHardwareDivide; }
|
||||
bool hasDivideInThumbMode() const { return HasHardwareDivideInThumb; }
|
||||
bool hasDivideInARMMode() const { return HasHardwareDivideInARM; }
|
||||
bool hasDataBarrier() const { return HasDataBarrier; }
|
||||
bool hasV7Clrex() const { return HasV7Clrex; }
|
||||
|
@ -10196,8 +10196,8 @@ static const struct {
|
||||
{ ARM::AEK_CRYPTO, Feature_HasV8,
|
||||
{ARM::FeatureCrypto, ARM::FeatureNEON, ARM::FeatureFPARMv8} },
|
||||
{ ARM::AEK_FP, Feature_HasV8, {ARM::FeatureFPARMv8} },
|
||||
{ (ARM::AEK_HWDIV | ARM::AEK_HWDIVARM), Feature_HasV7 | Feature_IsNotMClass,
|
||||
{ARM::FeatureHWDiv, ARM::FeatureHWDivARM} },
|
||||
{ (ARM::AEK_HWDIVTHUMB | ARM::AEK_HWDIVARM), Feature_HasV7 | Feature_IsNotMClass,
|
||||
{ARM::FeatureHWDivThumb, ARM::FeatureHWDivARM} },
|
||||
{ ARM::AEK_MP, Feature_HasV7 | Feature_IsNotMClass, {ARM::FeatureMP} },
|
||||
{ ARM::AEK_SIMD, Feature_HasV8, {ARM::FeatureNEON, ARM::FeatureFPARMv8} },
|
||||
{ ARM::AEK_SEC, Feature_HasV6K, {ARM::FeatureTrustZone} },
|
||||
|
@ -131,9 +131,9 @@ void ARMTargetStreamer::emitTargetAttributes(const MCSubtargetInfo &STI) {
|
||||
emitTextAttribute(ARMBuildAttrs::CPU_name, "cortex-a9");
|
||||
// We consider krait as a "cortex-a9" + hwdiv CPU
|
||||
// Enable hwdiv through ".arch_extension idiv"
|
||||
if (STI.hasFeature(ARM::FeatureHWDiv) ||
|
||||
if (STI.hasFeature(ARM::FeatureHWDivThumb) ||
|
||||
STI.hasFeature(ARM::FeatureHWDivARM))
|
||||
emitArchExtension(ARM::AEK_HWDIV | ARM::AEK_HWDIVARM);
|
||||
emitArchExtension(ARM::AEK_HWDIVTHUMB | ARM::AEK_HWDIVARM);
|
||||
} else {
|
||||
emitTextAttribute(ARMBuildAttrs::CPU_name, CPUString);
|
||||
}
|
||||
|
@ -149,8 +149,8 @@ TEST(TargetParserTest, testARMCPU) {
|
||||
EXPECT_TRUE(testARMCPU("cortex-a5", "armv7-a", "neon-vfpv4",
|
||||
ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_DSP, "7-A"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-a7", "armv7-a", "neon-vfpv4",
|
||||
ARM::AEK_HWDIV | ARM::AEK_HWDIVARM | ARM::AEK_MP |
|
||||
ARM::AEK_SEC | ARM::AEK_VIRT | ARM::AEK_DSP,
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_HWDIVARM | ARM::AEK_MP |
|
||||
ARM::AEK_SEC | ARM::AEK_VIRT | ARM::AEK_DSP,
|
||||
"7-A"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-a8", "armv7-a", "neon",
|
||||
ARM::AEK_SEC | ARM::AEK_DSP, "7-A"));
|
||||
@ -158,104 +158,111 @@ TEST(TargetParserTest, testARMCPU) {
|
||||
ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_DSP, "7-A"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-a12", "armv7-a", "neon-vfpv4",
|
||||
ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
|
||||
ARM::AEK_DSP,
|
||||
"7-A"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-a15", "armv7-a", "neon-vfpv4",
|
||||
ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
|
||||
ARM::AEK_DSP,
|
||||
"7-A"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-a17", "armv7-a", "neon-vfpv4",
|
||||
ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
|
||||
ARM::AEK_DSP,
|
||||
"7-A"));
|
||||
EXPECT_TRUE(testARMCPU("krait", "armv7-a", "neon-vfpv4",
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
|
||||
"7-A"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-r4", "armv7-r", "none",
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP, "7-R"));
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "7-R"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-r4f", "armv7-r", "vfpv3-d16",
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP, "7-R"));
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "7-R"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-r5", "armv7-r", "vfpv3-d16",
|
||||
ARM::AEK_MP | ARM::AEK_HWDIVARM | ARM::AEK_HWDIV |
|
||||
ARM::AEK_DSP, "7-R"));
|
||||
ARM::AEK_MP | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
|
||||
ARM::AEK_DSP,
|
||||
"7-R"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-r7", "armv7-r", "vfpv3-d16-fp16",
|
||||
ARM::AEK_MP | ARM::AEK_HWDIVARM | ARM::AEK_HWDIV |
|
||||
ARM::AEK_DSP, "7-R"));
|
||||
ARM::AEK_MP | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
|
||||
ARM::AEK_DSP,
|
||||
"7-R"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-r8", "armv7-r", "vfpv3-d16-fp16",
|
||||
ARM::AEK_MP | ARM::AEK_HWDIVARM | ARM::AEK_HWDIV |
|
||||
ARM::AEK_DSP, "7-R"));
|
||||
ARM::AEK_MP | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
|
||||
ARM::AEK_DSP,
|
||||
"7-R"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-r52", "armv8-r", "neon-fp-armv8",
|
||||
ARM::AEK_CRC | ARM::AEK_MP | ARM::AEK_VIRT |
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
|
||||
ARM::AEK_DSP,
|
||||
"8-R"));
|
||||
EXPECT_TRUE(testARMCPU("sc300", "armv7-m", "none",
|
||||
ARM::AEK_HWDIV, "7-M"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-m3", "armv7-m", "none",
|
||||
ARM::AEK_HWDIV, "7-M"));
|
||||
EXPECT_TRUE(
|
||||
testARMCPU("sc300", "armv7-m", "none", ARM::AEK_HWDIVTHUMB, "7-M"));
|
||||
EXPECT_TRUE(
|
||||
testARMCPU("cortex-m3", "armv7-m", "none", ARM::AEK_HWDIVTHUMB, "7-M"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-m4", "armv7e-m", "fpv4-sp-d16",
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP, "7E-M"));
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "7E-M"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-m7", "armv7e-m", "fpv5-d16",
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP, "7E-M"));
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "7E-M"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-a32", "armv8-a", "crypto-neon-fp-armv8",
|
||||
ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
|
||||
"8-A"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-a35", "armv8-a", "crypto-neon-fp-armv8",
|
||||
ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
|
||||
"8-A"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-a53", "armv8-a", "crypto-neon-fp-armv8",
|
||||
ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
|
||||
"8-A"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-a57", "armv8-a", "crypto-neon-fp-armv8",
|
||||
ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
|
||||
"8-A"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-a72", "armv8-a", "crypto-neon-fp-armv8",
|
||||
ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
|
||||
"8-A"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-a73", "armv8-a", "crypto-neon-fp-armv8",
|
||||
ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
|
||||
"8-A"));
|
||||
EXPECT_TRUE(testARMCPU("cyclone", "armv8-a", "crypto-neon-fp-armv8",
|
||||
ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
|
||||
"8-A"));
|
||||
EXPECT_TRUE(testARMCPU("exynos-m1", "armv8-a", "crypto-neon-fp-armv8",
|
||||
ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
|
||||
"8-A"));
|
||||
EXPECT_TRUE(testARMCPU("exynos-m2", "armv8-a", "crypto-neon-fp-armv8",
|
||||
ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
|
||||
"8-A"));
|
||||
EXPECT_TRUE(testARMCPU("exynos-m3", "armv8-a", "crypto-neon-fp-armv8",
|
||||
ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
|
||||
"8-A"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-m23", "armv8-m.base", "none",
|
||||
ARM::AEK_HWDIV, "8-M.Baseline"));
|
||||
ARM::AEK_HWDIVTHUMB, "8-M.Baseline"));
|
||||
EXPECT_TRUE(testARMCPU("cortex-m33", "armv8-m.main", "fpv5-sp-d16",
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP, "8-M.Mainline"));
|
||||
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "8-M.Mainline"));
|
||||
EXPECT_TRUE(testARMCPU("iwmmxt", "iwmmxt", "none",
|
||||
ARM::AEK_NONE, "iwmmxt"));
|
||||
EXPECT_TRUE(testARMCPU("xscale", "xscale", "none",
|
||||
ARM::AEK_NONE, "xscale"));
|
||||
EXPECT_TRUE(testARMCPU("swift", "armv7s", "neon-vfpv4",
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIV | ARM::AEK_DSP,
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
|
||||
"7-S"));
|
||||
}
|
||||
|
||||
@ -454,7 +461,7 @@ TEST(TargetParserTest, ARMFPURestriction) {
|
||||
TEST(TargetParserTest, ARMExtensionFeatures) {
|
||||
std::vector<StringRef> Features;
|
||||
unsigned Extensions = ARM::AEK_CRC | ARM::AEK_CRYPTO | ARM::AEK_DSP |
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIV | ARM::AEK_MP |
|
||||
ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_MP |
|
||||
ARM::AEK_SEC | ARM::AEK_VIRT | ARM::AEK_RAS;
|
||||
|
||||
for (unsigned i = 0; i <= Extensions; i++)
|
||||
|
Loading…
Reference in New Issue
Block a user