Commit 8c365be6 by Uros Bizjak Committed by Uros Bizjak

cpuid.h (__cpuid): For 32bit targets...

	* config/i386/cpuid.h (__cpuid): For 32bit targets, zero
	%ebx and %ecx bafore calling cpuid with leaf 1 or
	non-constant leaf argument.

From-SVN: r271469
parent 1a815b18
2019-05-21 Uroš Bizjak <ubizjak@gmail.com>
* config/i386/cpuid.h (__cpuid): For 32bit targets, zero
%ebx and %ecx bafore calling cpuid with leaf 1 or
non-constant leaf argument.
2019-05-21 Alan Modra <amodra@gmail.com> 2019-05-21 Alan Modra <amodra@gmail.com>
PR target/90545 PR target/90545
......
...@@ -187,10 +187,27 @@ ...@@ -187,10 +187,27 @@
#define signature_VORTEX_ecx 0x436f5320 #define signature_VORTEX_ecx 0x436f5320
#define signature_VORTEX_edx 0x36387865 #define signature_VORTEX_edx 0x36387865
#ifndef __x86_64__
/* At least one cpu (Winchip 2) does not set %ebx and %ecx
for cpuid leaf 1. Forcibly zero the two registers before
calling cpuid as a precaution. */
#define __cpuid(level, a, b, c, d) \
do { \
if (__builtin_constant_p (level) && (level) != 1) \
__asm__ ("cpuid\n\t" \
: "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
: "0" (level)); \
else \
__asm__ ("cpuid\n\t" \
: "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
: "0" (level), "1" (0), "2" (0)); \
} while (0)
#else
#define __cpuid(level, a, b, c, d) \ #define __cpuid(level, a, b, c, d) \
__asm__ ("cpuid\n\t" \ __asm__ ("cpuid\n\t" \
: "=a" (a), "=b" (b), "=c" (c), "=d" (d) \ : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
: "0" (level)) : "0" (level))
#endif
#define __cpuid_count(level, count, a, b, c, d) \ #define __cpuid_count(level, count, a, b, c, d) \
__asm__ ("cpuid\n\t" \ __asm__ ("cpuid\n\t" \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment