何时使用 ADOX 而不是 ADCX?

Posted

技术标签:

【中文标题】何时使用 ADOX 而不是 ADCX?【英文标题】:When to use ADOX instead of ADCX? 【发布时间】:2017-07-11 11:33:30 【问题描述】:

Intel instruction set reference 中提到的唯一区别是使用溢出标志而不是进位标志。什么时候使用ADOX 而不是ADCX 来执行带进位的无符号加法?

【问题讨论】:

通常你应该使用adc,因为它更小(指令字节更少),并且写入所有标志(避免对所有 CPU 上的后续指令进行任何部分标志合并惩罚)。如果您特别想要他们的行为,请仅使用 adcxadox 【参考方案1】:

当您不想覆盖进位标志时,可以使用 ADOX,就像您已经存储了旋转输出之类的东西。

但是它们的主要用途是加速 big-int 算术,因为现在您可以结合 mulx 并行进位进行两次加法

来自英特尔的论文New Instructions Support Large Integer Arithmetic

ADCX/ADOX 指令

adcxadox 指令是adc 指令的扩展,旨在支持两个独立的进位链。它们被定义为:

adcx dest/src1, src2
adox dest/src1, src2

两条指令都计算src1src2 的总和加上一个进位,并生成一个输出总和 dest 和一个进位。这两条指令的区别在于adcx 使用 CF 标志进行进位和执行(保持 OF 标志不变),而 adox 指令使用 OF 标志进行进位和执行(保留CF 标志不变)。

相关:

What is the difference between the ADC and ADCX instructions on ia32/ia64?

【讨论】:

以上是关于何时使用 ADOX 而不是 ADCX?的主要内容,如果未能解决你的问题,请参考以下文章

为啥clang++更喜欢adcx而不是adc

如何使用 C# ADOX 访问 Access 数据库表的属性?

为啥使用片段,以及何时使用片段而不是活动?

C# 使用 DAO 或 ADOX 压缩和修复 .accdb 文件

何时使用 TestFixtureSetUp 属性而不是默认构造函数?

AngularJS:何时使用服务而不是工厂