我最近了解了XADD
,在谷歌上查找时运气不佳。是否存在类似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没有选择在上面花费操作码。操作码的数量有限,每个操作码都需要解码器中的晶体管,至少需要微码才能实现。