是否有同时执行'xadd'和"adc reg,0"的 x86 汇编指令?



我最近了解了XADD,在谷歌上查找时运气不佳。是否存在类似XADD的同时添加进位标志的指令?(例如XADC(还是我被迫用两种不同的指令来做?

我在Ubuntu上,在64位模式下使用NASM。

否。xaddadc是加法的两个不同的小众版本,通常不会重叠,所以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) + CFfetch_add(&mem, reg+CF),可以按某种顺序使用adcxadd的组合手动执行。(如果这是一个问题的话,可能会有一些分支来处理+CF本身产生进位的情况(。

这是一个足够小众的需求,x86没有选择在上面花费操作码。操作码的数量有限,每个操作码都需要解码器中的晶体管,至少需要微码才能实现。

最新更新