[llvm] r178636 - Second pass at addressing PR15351 by explicitly checking for AVX support
Aaron Ballman
aaron at aaronballman.com
Wed Apr 3 09:23:16 PDT 2013
The documentation was unclear on this, but I think you're right that
it's only in SP1. I'll update the code to reflect that, good catch!
~Aaron
On Wed, Apr 3, 2013 at 12:14 PM, Craig Topper <craig.topper at gmail.com> wrote:
> Isn't _xgetbv only supported by MSVC 2010 SP1? Shouldn't this be checking
> that you're using at least that MSVC version?
>
>
> On Wed, Apr 3, 2013 at 5:25 AM, Aaron Ballman <aaron at aaronballman.com>
> wrote:
>>
>> Author: aaronballman
>> Date: Wed Apr 3 07:25:06 2013
>> New Revision: 178636
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=178636&view=rev
>> Log:
>> Second pass at addressing PR15351 by explicitly checking for AVX support
>> when getting the host processor information. It emits a .byte sequence on
>> GNUC compilers to work around lack of xgetbv support with older assemblers,
>> and resolves a comment typo found in the previous patch.
>>
>> Modified:
>> llvm/trunk/lib/Support/Host.cpp
>>
>> Modified: llvm/trunk/lib/Support/Host.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Host.cpp?rev=178636&r1=178635&r2=178636&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Support/Host.cpp (original)
>> +++ llvm/trunk/lib/Support/Host.cpp Wed Apr 3 07:25:06 2013
>> @@ -112,6 +112,21 @@ static bool GetX86CpuIDAndInfo(unsigned
>> #endif
>> }
>>
>> +static bool OSHasAVXSupport() {
>> +#if defined( __GNUC__ )
>> + // Check xgetbv; this uses a .byte sequence instead of the instruction
>> + // directly because older assemblers do not include support for xgetbv
>> and
>> + // there is no easy way to conditionally compile based on the assembler
>> used.
>> + int rEAX, rEDX;
>> + __asm__ (".byte 0x0f, 0x01, 0xd0" : "=a" (rEAX), "=d" (rEDX) : "c"
>> (0));
>> +#elif defined(_MSC_VER)
>> + unsigned long long rEAX = _xgetbv(_XCR_XFEATURE_ENABLED_MASK);
>> +#else
>> + int rEAX = 0; // Ensures we return false
>> +#endif
>> + return (rEAX & 6) == 6;
>> +}
>> +
>> static void DetectX86FamilyModel(unsigned EAX, unsigned &Family,
>> unsigned &Model) {
>> Family = (EAX >> 8) & 0xf; // Bits 8 - 11
>> @@ -134,6 +149,10 @@ std::string sys::getHostCPUName() {
>> DetectX86FamilyModel(EAX, Family, Model);
>>
>> bool HasSSE3 = (ECX & 0x1);
>> + // If CPUID indicates support for XSAVE, XRESTORE and AVX, and XGETBV
>> + // indicates that the AVX registers will be saved and restored on
>> context
>> + // switch, then we have full AVX support.
>> + bool HasAVX = (ECX & ((1 << 28) | (1 << 27))) != 0 &&
>> OSHasAVXSupport();
>> GetX86CpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
>> bool Em64T = (EDX >> 29) & 0x1;
>>
>> @@ -243,11 +262,15 @@ std::string sys::getHostCPUName() {
>> case 42: // Intel Core i7 processor. All processors are
>> manufactured
>> // using the 32 nm process.
>> case 45:
>> - return "corei7-avx";
>> + // Not all Sandy Bridge processors support AVX (such as the
>> Pentium
>> + // versions instead of the i7 versions).
>> + return HasAVX ? "corei7-avx" : "corei7";
>>
>> // Ivy Bridge:
>> case 58:
>> - return "core-avx-i";
>> + // Not all Ivy Bridge processors support AVX (such as the Pentium
>> + // versions instead of the i7 versions).
>> + return HasAVX ? "core-avx-i" : "corei7";
>>
>> case 28: // Most 45 nm Intel Atom processors
>> case 38: // 45 nm Atom Lincroft
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
>
> --
> ~Craig
More information about the llvm-commits
mailing list