mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 19:12:56 +02:00
[Support] Don't check XCR0 when detecting avx512 on Darwin.
Darwin lazily saves the AVX512 context on first use [1]: instead of checking that it already does to figure out if the OS supports AVX512, trust that the kernel will do the right thing and always assume the context save support is available. [1] https://github.com/apple/darwin-xnu/blob/xnu-4903.221.2/osfmk/i386/fpu.c#L174 Reviewers: ab, RKSimon, craig.topper Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D70453
This commit is contained in:
parent
ba35e653b7
commit
ee8bfe440e
@ -1027,7 +1027,15 @@ static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
|
||||
const unsigned AVXBits = (1 << 27) | (1 << 28);
|
||||
bool HasAVX = ((ECX & AVXBits) == AVXBits) && !getX86XCR0(&EAX, &EDX) &&
|
||||
((EAX & 0x6) == 0x6);
|
||||
#if defined(__APPLE__)
|
||||
// Darwin lazily saves the AVX512 context on first use: trust that the OS will
|
||||
// save the AVX512 context if we use AVX512 instructions, even the bit is not
|
||||
// set right now.
|
||||
bool HasAVX512Save = true;
|
||||
#else
|
||||
// AVX512 requires additional context to be saved by the OS.
|
||||
bool HasAVX512Save = HasAVX && ((EAX & 0xe0) == 0xe0);
|
||||
#endif
|
||||
|
||||
if (HasAVX)
|
||||
setFeature(X86::FEATURE_AVX);
|
||||
@ -1364,8 +1372,15 @@ bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
|
||||
// switch, then we have full AVX support.
|
||||
bool HasAVXSave = ((ECX >> 27) & 1) && ((ECX >> 28) & 1) &&
|
||||
!getX86XCR0(&EAX, &EDX) && ((EAX & 0x6) == 0x6);
|
||||
#if defined(__APPLE__)
|
||||
// Darwin lazily saves the AVX512 context on first use: trust that the OS will
|
||||
// save the AVX512 context if we use AVX512 instructions, even the bit is not
|
||||
// set right now.
|
||||
bool HasAVX512Save = true;
|
||||
#else
|
||||
// AVX512 requires additional context to be saved by the OS.
|
||||
bool HasAVX512Save = HasAVXSave && ((EAX & 0xe0) == 0xe0);
|
||||
#endif
|
||||
|
||||
Features["avx"] = HasAVXSave;
|
||||
Features["fma"] = ((ECX >> 12) & 1) && HasAVXSave;
|
||||
|
Loading…
Reference in New Issue
Block a user