This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: Proper use of x86/x86_64 CPUID instruction with extended assembler
- From: Jeffrey Walton <noloader at gmail dot com>
- To: Avi Kivity <avi at cloudius-systems dot com>
- Cc: "gcc-help at gcc dot gnu dot org" <gcc-help at gcc dot gnu dot org>
- Date: Wed, 19 Aug 2015 03:06:20 -0400
- Subject: Re: Proper use of x86/x86_64 CPUID instruction with extended assembler
- Authentication-results: sourceware.org; auth=none
- References: <CAH8yC8n9Vr3zeO0odOr3Jizv6vcO4o=s68OyPQwDa+ihaUMoNg at mail dot gmail dot com> <55D42400 dot 2060408 at cloudius-systems dot com>
- Reply-to: noloader at gmail dot com
>> My question is, will the extended assembly preserve the registers? Is
>> it sufficient to list "b" as a clobber? Or do I need to do something
>> special?
>
> It will not preserve the registers, except those that are required to by the
> ABI ("b"). The clobber tells gcc which registers are destroyed by the
> instruction, not which registers to preserve; it already knows the latter.
>
>> If I need to do something special, then what needs to be done?
>
> Nothing much; just drop that "b" clobber.
>
>> (I also looked at
>> https://gcc.gnu.org/ml/gcc-patches/2007-09/msg00324.html, which is a
>> GCC patch for cpuid.h. But its not clear to me if the above is correct
>> because the operands are 32-bit in size. Naively, if I use "a" and "b"
>> with a 32-bit operand, then I would expect code for EAX and EBX; and
>> not RAX and RBX).
>
> It is correct.
Thanks Avi. Regarding the GCC patch... if the output register and the
ABI tells GCC that EBX needs to be preserved, then why does the patch
take special steps to preserve it?
Jeff