testsuite run-time test for sse2 support

Uros Bizjak ubizjak@gmail.com
Thu Mar 13 15:45:00 GMT 2008


Joel Sherrill wrote:

>>>  I hacked on that test program to get the attached
>>>  program.  I ran it multiple times on qemu.
>>>
>>>  ext=0x0 sig=0x756e6547
>>>  0x781abfd YES on SSE2
>>>
>>>     
> I am now printing the return value from __get_cpuid_max()
>
>
> ext=0x0 sig=0x756e6547 returned=0x2
> 0x781abfd YES on SSE2
>
> Isn't the "sig" supposed to be >= 0x80000000?

No, it says "uneG" in Intel speak, as in "_Genu_ine Intel"

>>>  I ran the same program natively and got this:
>>>
>>>  ext=0x0 sig=0x756e6547
>>>  0xbfebfbff YES on SSE2
>>>
>>>  I wonder if qemu is just reporting things wrong. :(
>>>  I searched the qemu manual and googled some but
>>>  didn't see anything that jumped out.
>>>
>>>  Does this look like qemu reporting a bogus cpuid or
>>>  gcc not parsing it correctly?
>>>     
>>
>> This all depends on the return value of __get_cpuid_max(). It returns
>> max value of base cpuid level (5 in my case), and shoould return 0 if
>> cpuid is not supported. This follows the procedure outlined in
>> http://download.intel.com/design/processor/applnots/24161832.pdf,
>> section 2: "Detecting the CPUID Instruction".
>>
>>   
> I added a print before the return on !__get_cpuid and it is returning 
> non zero.

So, this is qemu bug. It advertises CPUID support with %eax=2, and when 
queried with cpuid, it returns SSE2 support. Either SSE2 should be fully 
fixed in quemu, or it should stop advertising SSE2 (and other levels) 
support.

>> It is true, that this is not the most maintained code on the planet,
>> so some bitrot is possible. The return value of __get_cpuid_max() on
>> your target will tell...
>>
>>   
> The call to __get_cpuid is checking against level 1 and this is a level 2.

This is cpuid level, not SSE level. We want cpuid information indexed 
with %eax=1.

Uros.



More information about the Gcc mailing list