Fix the 64-bit i386 atomic according to assembly output
authorThiago Macieira <thiago.macieira@intel.com>
Sun, 8 Jan 2012 22:45:11 +0000 (20:45 -0200)
committerQt by Nokia <qt-info@nokia.com>
Mon, 26 Mar 2012 12:54:08 +0000 (14:54 +0200)
commit99802f0c1498b0630949e75f69afe1cc0c89c4d4
tree2b3f0b1b8a9cb316c01e309a3a6b8eeda396d8c4
parentfe778b94bd58c12949d763f428d214e8c16d144e
Fix the 64-bit i386 atomic according to assembly output

The assembly output showed that GCC was generating some wrong code in
some conditions, so update the constraints so it will do the right
thing: the expectedValue constraint needs to be in/out with early
clobber. In/out because cmpxchg8b really does produce output and, even
if we don't care about it, GCC needs to be told that the registers
used (EAX:EDX) were modified. The early clobber is necessary so it
won't schedule EAX or EDX to be the same as the EBX_reg (the register
we'll xchg EBX with).

Since EAX and EDX are in/out and EBX can't be used, the only remaining
low register for the "sete" instruction is CL. So use it directly and
set ECX to be in/out too.

For whatever reason, it can't find enough registers in debug mode and
this expansion doesn't work. It looks like a bug though, since this
requires 4 registers and one memory operand and in debug mode it must
have EAX, ECX, EDX, ESI and EDI free for use. One of ESI or EDI is
used to xchg EBX with, which means there must be at least one more
free general register.

Change-Id: I1f11e68d776bf9ad216b34ca316a53129122fabe
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
src/corelib/arch/qatomic_i386.h