mirror of https://github.com/acidanthera/audk.git
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:
parent
c6fedbd791
commit
7149d40938
|
@ -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"
|
||||||
);
|
);
|
||||||
|
|
|
@ -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"
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue