问题描述
我最近了解了 XADD
,但我没能在 google 上查找。是否存在像 XADD
这样也添加进位标志的指令? (例如XADC
)还是我被迫用两个不同的指令来做?
我在 Ubuntu 上,我在 64 位模式下使用 NASM。
解决方法
没有。 xadd
和 adc
是两个不同的小众版本,通常不会重叠,因此 x86 没有相关说明也就不足为奇了。
-
xadd
通常与 atomic_fetch_add 的内存目标(通常是lock
前缀)一起使用 -
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 没有选择在它上面花费操作码。操作码的数量有限,每个操作码都需要解码器中的晶体管,至少需要微码来实现。