MdePkg/BaseSynchronizationLib GCC: fix InternalSyncCompareExchange32()

(This patch is identical to the last one, except for the
InternalSyncCompareExchange16() -> InternalSyncCompareExchange32() and
"cmpxchgw" -> "cmpxchgl" replacements.)

The CMPXCHG instruction has the following operands:
- AX (implicit, CompareValue):    input and output
- destination operand (*Value):   input and output
- source operand (ExchangeValue): input

The IA32 version of InternalSyncCompareExchange32() correctly marks
CompareValue as input/output, but it marks (*Value) only as input.

The X64 version of InternalSyncCompareExchange32() attempts to mark both
CompareValue and (*Value) as input/output, but it doesn't use the
appropriate constraints for either operand.

Fix these issues. Furthermore, prefer the short "+" constraint for I/O
operands over the <output-operand-number> constraint that can be applied
to the input instances of I/O operands.

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>
This commit is contained in:
Laszlo Ersek 2018-09-29 21:22:57 +02:00
parent c6fedbd791
commit 7149d40938
2 changed files with 8 additions and 11 deletions

View File

@ -155,11 +155,10 @@ InternalSyncCompareExchange32 (
{ {
__asm__ __volatile__ ( __asm__ __volatile__ (
"lock \n\t" "lock \n\t"
"cmpxchgl %1, %2 \n\t" "cmpxchgl %2, %1 \n\t"
: "=a" (CompareValue) // %0 : "+a" (CompareValue), // %0
: "q" (ExchangeValue), // %1 "+m" (*Value) // %1
"m" (*Value), // %2 : "q" (ExchangeValue) // %2
"0" (CompareValue) // %3
: "memory", : "memory",
"cc" "cc"
); );

View File

@ -155,12 +155,10 @@ InternalSyncCompareExchange32 (
{ {
__asm__ __volatile__ ( __asm__ __volatile__ (
"lock \n\t" "lock \n\t"
"cmpxchgl %3, %1 \n\t" "cmpxchgl %2, %1 \n\t"
: "=a" (CompareValue), // %0 : "+a" (CompareValue), // %0
"=m" (*Value) // %1 "+m" (*Value) // %1
: "a" (CompareValue), // %2 : "r" (ExchangeValue) // %2
"r" (ExchangeValue), // %3
"m" (*Value) // %4
: "memory", : "memory",
"cc" "cc"
); );