我最近了解到XADD
,我没有运气在谷歌上查找。这样的指令是否XADD
还添加了进位标志?(例如。XADC
)或者我是否被迫用两个不同的指令来做?
我在 Ubuntu 上,我在 64 位模式下使用 NASM。
我最近了解到XADD
,我没有运气在谷歌上查找。这样的指令是否XADD
还添加了进位标志?(例如。XADC
)或者我是否被迫用两个不同的指令来做?
我在 Ubuntu 上,我在 64 位模式下使用 NASM。
不 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
or fetch_add(&mem, reg+CF)
,您可以使用adc
和xadd
以某种顺序手动执行此操作。(如果这是一个问题,也许还有一些分支来处理+CF
自身产生进位的情况)。
这是一个足够小众的需求,x86 没有选择在它上面花费一个操作码。只有有限数量的操作码,每一个都需要解码器中的晶体管,并且至少需要微码来实现它。