微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决是否有同时执行“xadd”和“adc reg,0”的 x86 汇编指令?

我最近了解了 XADD,但我没能在 google 上查找。是否存在像 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 没有选择在它上面花费操作码。操作码的数量有限,每个操作码都需要解码器中的晶体管,至少需要微码来实现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。