The IA32 variant of InternalSyncCompareExchange64() is correct, but we can
simplify it. We don't need to load the lower 32 bits of ExchangeValue into
EBX in two steps (first into a general register, then into EBX); we can
ask GCC to populate EBX like that itself.
Cc: Liming Gao <liming.gao@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1208
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Acked-by: Michael D Kinney <michael.d.kinney@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
)\r
{\r
__asm__ __volatile__ (\r
- "push %%ebx \n\t"\r
- "movl %2,%%ebx \n\t"\r
"lock \n\t"\r
"cmpxchg8b (%1) \n\t"\r
- "pop %%ebx \n\t"\r
: "+A" (CompareValue) // %0\r
: "S" (Value), // %1\r
- "r" ((UINT32) ExchangeValue), // %2\r
+ "b" ((UINT32) ExchangeValue), // %2\r
"c" ((UINT32) (ExchangeValue >> 32)) // %3\r
: "memory",\r
"cc"\r