是否有同时执行 'xadd' 和 'adc reg,0' 的 x86 汇编指令?
Is there an x86 assembly instruction that does both 'xadd' and 'adc reg,0'?
我最近了解了 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 没有选择在其上花费操作码。只有有限数量的操作码,每个操作码都需要解码器中的晶体管,并且至少需要微码来实现它。
我最近了解了 XADD
,但我没有运气在 google 上查找。是否存在像 XADD
这样也添加了进位标志的指令? (例如 XADC
)还是我必须按照两条不同的指令执行此操作?
我在 Ubuntu 并且我在 64 位模式下使用 NASM。
没有。 xadd
和 adc
是加法的两个不同的小众版本,它们通常不会重叠,因此 x86 没有针对它的指令也就不足为奇了。
xadd
通常与 atomic_fetch_add 的内存目的地(通常是 adc
通常用于扩展精度的东西,用于比寄存器宽的整数的高位部分
lock
前缀)一起使用
如果你做了 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 没有选择在其上花费操作码。只有有限数量的操作码,每个操作码都需要解码器中的晶体管,并且至少需要微码来实现它。