mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-20 19:20:23 +00:00
Add support for modeling whether or not the processor has support for
conditional moves as a subtarget feature. This is the easy part of PR4841. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80763 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f19f9347b8
commit
700841617a
@ -19,12 +19,17 @@ include "llvm/Target/Target.td"
|
||||
//===----------------------------------------------------------------------===//
|
||||
// X86 Subtarget features.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
|
||||
def FeatureCMOV : SubtargetFeature<"cmov","HasCMov", "true",
|
||||
"Enable conditional move instructions">;
|
||||
|
||||
def FeatureMMX : SubtargetFeature<"mmx","X86SSELevel", "MMX",
|
||||
"Enable MMX instructions">;
|
||||
def FeatureSSE1 : SubtargetFeature<"sse", "X86SSELevel", "SSE1",
|
||||
"Enable SSE instructions",
|
||||
[FeatureMMX]>;
|
||||
// SSE codegen depends on cmovs, and all
|
||||
// SSE1+ processors support them.
|
||||
[FeatureMMX, FeatureCMOV]>;
|
||||
def FeatureSSE2 : SubtargetFeature<"sse2", "X86SSELevel", "SSE2",
|
||||
"Enable SSE2 instructions",
|
||||
[FeatureSSE1]>;
|
||||
@ -76,8 +81,8 @@ def : Proc<"i586", []>;
|
||||
def : Proc<"pentium", []>;
|
||||
def : Proc<"pentium-mmx", [FeatureMMX]>;
|
||||
def : Proc<"i686", []>;
|
||||
def : Proc<"pentiumpro", []>;
|
||||
def : Proc<"pentium2", [FeatureMMX]>;
|
||||
def : Proc<"pentiumpro", [FeatureCMOV]>;
|
||||
def : Proc<"pentium2", [FeatureMMX, FeatureCMOV]>;
|
||||
def : Proc<"pentium3", [FeatureSSE1]>;
|
||||
def : Proc<"pentium-m", [FeatureSSE2, FeatureSlowBTMem]>;
|
||||
def : Proc<"pentium4", [FeatureSSE2]>;
|
||||
|
@ -235,13 +235,14 @@ void X86Subtarget::AutoDetectSubtargetFeatures() {
|
||||
|
||||
X86::GetCpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX);
|
||||
|
||||
if ((EDX >> 23) & 0x1) X86SSELevel = MMX;
|
||||
if ((EDX >> 25) & 0x1) X86SSELevel = SSE1;
|
||||
if ((EDX >> 26) & 0x1) X86SSELevel = SSE2;
|
||||
if ((EDX >> 15) & 1) HasCMov = true;
|
||||
if ((EDX >> 23) & 1) X86SSELevel = MMX;
|
||||
if ((EDX >> 25) & 1) X86SSELevel = SSE1;
|
||||
if ((EDX >> 26) & 1) X86SSELevel = SSE2;
|
||||
if (ECX & 0x1) X86SSELevel = SSE3;
|
||||
if ((ECX >> 9) & 0x1) X86SSELevel = SSSE3;
|
||||
if ((ECX >> 19) & 0x1) X86SSELevel = SSE41;
|
||||
if ((ECX >> 20) & 0x1) X86SSELevel = SSE42;
|
||||
if ((ECX >> 9) & 1) X86SSELevel = SSSE3;
|
||||
if ((ECX >> 19) & 1) X86SSELevel = SSE41;
|
||||
if ((ECX >> 20) & 1) X86SSELevel = SSE42;
|
||||
|
||||
bool IsIntel = memcmp(text.c, "GenuineIntel", 12) == 0;
|
||||
bool IsAMD = !IsIntel && memcmp(text.c, "AuthenticAMD", 12) == 0;
|
||||
@ -380,6 +381,7 @@ X86Subtarget::X86Subtarget(const std::string &TT, const std::string &FS,
|
||||
: PICStyle(PICStyles::None)
|
||||
, X86SSELevel(NoMMXSSE)
|
||||
, X863DNowLevel(NoThreeDNow)
|
||||
, HasCMov(false)
|
||||
, HasX86_64(false)
|
||||
, HasSSE4A(false)
|
||||
, HasAVX(false)
|
||||
|
@ -55,6 +55,10 @@ protected:
|
||||
///
|
||||
X863DNowEnum X863DNowLevel;
|
||||
|
||||
/// HasCMov - True if this processor has conditional move instructions
|
||||
/// (generally pentium pro+).
|
||||
bool HasCMov;
|
||||
|
||||
/// HasX86_64 - True if the processor supports X86-64 instructions.
|
||||
///
|
||||
bool HasX86_64;
|
||||
|
Loading…
Reference in New Issue
Block a user