Набор команд x86_64
содержит инструкцию cmpxchgq
(q
для четырех слов) для 8-байтового (64-битного) сравнения и замены.
Существует также инструкция cmpxchg8b
, которая будет работать с 8-байтовыми величинами, но ее сложнее настроить, требуя, чтобы вы использовали edx:eax
и ecx:ebx
, а не более естественные 64-битные rax
. Причина, по которой это существует, почти наверняка связана с тем фактом, что Intel потребовались 64-битные операции сравнения и замены задолго до появления x86_64
. Он все еще существует в 64-битном режиме, но больше не является единственным вариантом.
Но, как уже говорилось, cmpxchgq
, вероятно, является лучшим вариантом для 64-битного кода.
Если вам необходимо cmpxchg 16-байтового объекта, 64-битная версия cmpxchg8b
будет cmpxchg16b
. Он отсутствовал в самых ранних процессорах AMD64, поэтому компиляторы не сгенерируют его для std :: atomic :: compare_exchange на объектах 16B, если вы не включите -mcx16
(для gcc). Однако ассемблеры будут его собирать, но имейте в виду, что ваш двоичный файл не будет работать на самых ранних процессорах K8. (Это относится только к cmpxchg16b
, а не к cmpxchg8b
в 64-битном режиме или к cmpxchgq
).