Add early-clobbers to the output variables in CPUID
Without those early-clobbers, the compiler might decide to schedule a register that is also used as output. The existing early clobber in the tmp variable was there so the compiler wouldn't use a register scheduled as input (especially EAX). To be honest, I'm not convinced that the compiler should be allowed to do this. That means that two output variables are scheduled to the same register... still, this fixes a problem found with GCC 4.2 (at least the Mac one). Change-Id: I6cd4676284e9a83d6aac4b439c6e58e347c40106 Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
This commit is contained in:
parent
e6a1675da5
commit
81d1f79a7f
@ -168,7 +168,7 @@ static inline uint detectProcessorFeatures()
|
|||||||
asm ("xchg %%ebx, %2\n"
|
asm ("xchg %%ebx, %2\n"
|
||||||
"cpuid\n"
|
"cpuid\n"
|
||||||
"xchg %%ebx, %2\n"
|
"xchg %%ebx, %2\n"
|
||||||
: "=c" (feature_result), "=d" (result), "=&r" (tmp1)
|
: "=&c" (feature_result), "=d" (result), "=&r" (tmp1)
|
||||||
: "a" (1));
|
: "a" (1));
|
||||||
|
|
||||||
asm ("xchg %%ebx, %1\n"
|
asm ("xchg %%ebx, %1\n"
|
||||||
@ -182,7 +182,7 @@ static inline uint detectProcessorFeatures()
|
|||||||
"cpuid\n"
|
"cpuid\n"
|
||||||
"2:\n"
|
"2:\n"
|
||||||
"xchg %%ebx, %1\n"
|
"xchg %%ebx, %1\n"
|
||||||
: "=d" (extended_result), "=&r" (tmp1)
|
: "=&d" (extended_result), "=&r" (tmp1)
|
||||||
: "a" (0x80000000)
|
: "a" (0x80000000)
|
||||||
: "%ecx"
|
: "%ecx"
|
||||||
);
|
);
|
||||||
@ -284,7 +284,7 @@ static inline uint detectProcessorFeatures()
|
|||||||
asm ("xchg %%rbx, %1\n"
|
asm ("xchg %%rbx, %1\n"
|
||||||
"cpuid\n"
|
"cpuid\n"
|
||||||
"xchg %%rbx, %1\n"
|
"xchg %%rbx, %1\n"
|
||||||
: "=c" (feature_result), "=&r" (tmp)
|
: "=&c" (feature_result), "=&r" (tmp)
|
||||||
: "a" (1)
|
: "a" (1)
|
||||||
: "%edx"
|
: "%edx"
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user