]> git.proxmox.com Git - mirror_edk2.git/commit - MdePkg/Library/BaseSynchronizationLib/Ia32/GccInline.c
MdePkg/BaseSynchronizationLib GCC: fix InternalSyncCompareExchange32()
authorLaszlo Ersek <lersek@redhat.com>
Sat, 29 Sep 2018 19:22:57 +0000 (21:22 +0200)
committerLaszlo Ersek <lersek@redhat.com>
Wed, 17 Oct 2018 16:44:46 +0000 (18:44 +0200)
commit7149d40938f85cfe4c29a57c7c1126247ab55b49
tree09897792e7bb3182a3b8e9f1f3071b901195586d
parentc6fedbd7911c7645d2c93a865b1616ca1a2c1e63
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>
MdePkg/Library/BaseSynchronizationLib/Ia32/GccInline.c
MdePkg/Library/BaseSynchronizationLib/X64/GccInline.c