This patch fixes comparison of 64-bit atomic with its expected value in CMP_SWAP_64 expansion.
Currently, the low words are compared with CMP, while the high words are compared with SBC. SBC expects the carry flag to be set if CMP detects a difference. CMP might leave the carry unset for unequal arguments though if the first one is >= than the second. This might cause the comparison logic to detect false equality.
Example of the broken C++ code:
std::atomic<long long> at(2); long long ll = 1; std::atomic_compare_exchange_strong(&at, &ll, 3);
Even though the atomic at and the expected value ll are not equal and atomic_compare_exchange_strong returns false, at is changed to 3.
The patch replaces SBC with CMPEQ.
You can probably drop the "MIB =" here. Otherwise everything looks fine though. Thanks for fixing this!