forked from OSchip/llvm-project
[ARM] Add subtarget features for ARMv8.2-A
This adds subtarget features for ARMv8.2-A, which builds on (and requires the features from) ARMv8.1-A. Most assembler-visible features of ARMv8.2-A are system instructions, and are all required parts of the architecture, so just depend on the HasV8_2aOps subtarget feature. There is also one large, optional feature, which adds 16-bit floating point versions of all existing floating-point instructions (VFP and SIMD), this is represented by the FeatureFullFP16 subtarget feature. Differential Revision: http://reviews.llvm.org/D15036 llvm-svn: 254399
This commit is contained in:
parent
a056935a2f
commit
8addbf4350
|
@ -62,6 +62,9 @@ def FeatureVFP4 : SubtargetFeature<"vfp4", "HasVFPv4", "true",
|
|||
def FeatureFPARMv8 : SubtargetFeature<"fp-armv8", "HasFPARMv8",
|
||||
"true", "Enable ARMv8 FP",
|
||||
[FeatureVFP4]>;
|
||||
def FeatureFullFP16 : SubtargetFeature<"fullfp16", "HasFullFP16", "true",
|
||||
"Enable full half-precision floating point",
|
||||
[FeatureFPARMv8]>;
|
||||
def FeatureD16 : SubtargetFeature<"d16", "HasD16", "true",
|
||||
"Restrict FP to 16 double registers">;
|
||||
def FeatureHWDiv : SubtargetFeature<"hwdiv", "HasHardwareDivide", "true",
|
||||
|
@ -212,6 +215,9 @@ def HasV8Ops : SubtargetFeature<"v8", "HasV8Ops", "true",
|
|||
def HasV8_1aOps : SubtargetFeature<"v8.1a", "HasV8_1aOps", "true",
|
||||
"Support ARM v8.1a instructions",
|
||||
[HasV8Ops]>;
|
||||
def HasV8_2aOps : SubtargetFeature<"v8.2a", "HasV8_2aOps", "true",
|
||||
"Support ARM v8.2a instructions",
|
||||
[HasV8_1aOps]>;
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -215,6 +215,8 @@ def PreV8 : Predicate<"!Subtarget->hasV8Ops()">,
|
|||
AssemblerPredicate<"!HasV8Ops", "armv7 or earlier">;
|
||||
def HasV8_1a : Predicate<"Subtarget->hasV8_1aOps()">,
|
||||
AssemblerPredicate<"HasV8_1aOps", "armv8.1a">;
|
||||
def HasV8_2a : Predicate<"Subtarget->hasV8_2aOps()">,
|
||||
AssemblerPredicate<"HasV8_2aOps", "armv8.2a">;
|
||||
def NoVFP : Predicate<"!Subtarget->hasVFP2()">;
|
||||
def HasVFP2 : Predicate<"Subtarget->hasVFP2()">,
|
||||
AssemblerPredicate<"FeatureVFP2", "VFP2">;
|
||||
|
@ -234,7 +236,9 @@ def HasCrypto : Predicate<"Subtarget->hasCrypto()">,
|
|||
def HasCRC : Predicate<"Subtarget->hasCRC()">,
|
||||
AssemblerPredicate<"FeatureCRC", "crc">;
|
||||
def HasFP16 : Predicate<"Subtarget->hasFP16()">,
|
||||
AssemblerPredicate<"FeatureFP16","half-float">;
|
||||
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 HasDivideInARM : Predicate<"Subtarget->hasDivideInARMMode()">,
|
||||
|
|
|
@ -112,6 +112,7 @@ void ARMSubtarget::initializeEnvironment() {
|
|||
HasV7Ops = false;
|
||||
HasV8Ops = false;
|
||||
HasV8_1aOps = false;
|
||||
HasV8_2aOps = false;
|
||||
HasVFPv2 = false;
|
||||
HasVFPv3 = false;
|
||||
HasVFPv4 = false;
|
||||
|
@ -130,6 +131,7 @@ void ARMSubtarget::initializeEnvironment() {
|
|||
NoMovt = false;
|
||||
SupportsTailCall = false;
|
||||
HasFP16 = false;
|
||||
HasFullFP16 = false;
|
||||
HasD16 = false;
|
||||
HasHardwareDivide = false;
|
||||
HasHardwareDivideInARM = false;
|
||||
|
|
|
@ -77,6 +77,7 @@ protected:
|
|||
bool HasV7Ops;
|
||||
bool HasV8Ops;
|
||||
bool HasV8_1aOps;
|
||||
bool HasV8_2aOps;
|
||||
|
||||
/// HasVFPv2, HasVFPv3, HasVFPv4, HasFPARMv8, HasNEON - Specify what
|
||||
/// floating point ISAs are supported.
|
||||
|
@ -130,10 +131,12 @@ protected:
|
|||
/// Thumb.
|
||||
bool SupportsTailCall;
|
||||
|
||||
/// HasFP16 - True if subtarget supports half-precision FP (We support VFP+HF
|
||||
/// only so far)
|
||||
/// HasFP16 - True if subtarget supports half-precision FP conversions
|
||||
bool HasFP16;
|
||||
|
||||
/// HasFullFP16 - True if subtarget supports half-precision FP operations
|
||||
bool HasFullFP16;
|
||||
|
||||
/// HasD16 - True if subtarget is limited to 16 double precision
|
||||
/// FP registers for VFPv3.
|
||||
bool HasD16;
|
||||
|
@ -309,6 +312,7 @@ public:
|
|||
bool hasV7Ops() const { return HasV7Ops; }
|
||||
bool hasV8Ops() const { return HasV8Ops; }
|
||||
bool hasV8_1aOps() const { return HasV8_1aOps; }
|
||||
bool hasV8_2aOps() const { return HasV8_2aOps; }
|
||||
|
||||
bool isCortexA5() const { return ARMProcFamily == CortexA5; }
|
||||
bool isCortexA7() const { return ARMProcFamily == CortexA7; }
|
||||
|
@ -362,6 +366,7 @@ public:
|
|||
|
||||
bool hasFP16() const { return HasFP16; }
|
||||
bool hasD16() const { return HasD16; }
|
||||
bool hasFullFP16() const { return HasFullFP16; }
|
||||
|
||||
const Triple &getTargetTriple() const { return TargetTriple; }
|
||||
|
||||
|
|
Loading…
Reference in New Issue