Нет. xadd
и adc
- это две разные нишевые версии сложения, которые обычно не пересекаются, поэтому неудивительно, что для x86 нет инструкции для них.
xadd
обычно используется с назначением памяти (и часто с префиксом lock
) для atomic_fetch_add.
adc
обычно используется для расширенной точности, для старших частей целого числа, более широкого, чем регистр.
Если бы вы сделали lock xadd
/ lock xadc
(гипотетически), вы бы не выполняли одно атомарное fetch_add двойной ширины, вы бы выполняли два отдельных атомарных сложения для двух половин более широкого числа. Так что это не очень полезно; если вы хотите atomic_fetch_add __int128
, вам нужен цикл повтора lock cmpxchg16b
, а не xadd/xadc.
Если вы хотите сделать fetch_add(&mem, reg) + CF
или fetch_add(&mem, reg+CF)
, вы можете сделать это вручную, комбинируя adc
и xadd
в определенном порядке. (И, возможно, некоторое ветвление для обработки случая, когда сам +CF
создает перенос, если это вас беспокоит).
Это достаточная ниша, чтобы x86 не стал тратить на нее код операции. Существует лишь ограниченное количество кодов операций, и для каждого из них потребуются транзисторы в декодерах и как минимум микрокод для его реализации.
person
Peter Cordes
schedule
30.04.2021