当我遇到ADCX
指令时,我正在浏览英特尔软件开发人员手册,这是我以前不知道的;其编码为66 0F 38 F6
。它似乎与ADC
指令几乎完全相同,那么为什么在以下情况下使用ADCX
:
ADC
为1)是否有其他副作用或特殊情况,ADCX
证明比ADC
更有利?必须有一些很好的理由将其添加到教学指令中。
答案 0 :(得分:17)
这些指令用于加速大整数运算。
在这些说明之前,添加大量数字通常会产生如下代码序列:
add
adc
adc
adc
adc
这里要注意的重要部分是,如果添加的结果不适合机器字,则进位标志被设置并被“转移”到下一个更高的机器字。所有这些指令都相互依赖,因为它们将先前的加法进位标志考虑在内,和在执行后生成一个新的进位标志值。
由于x86处理器能够同时执行多个指令,因此成为一个巨大的瓶颈。依赖链使得处理器不可能并行执行任何算术。 (为了在实践中正确,你会在add / adc序列之间找到一个加载和存储,但性能仍然受到进位依赖性的限制。)
为了改进这一点,英特尔通过重新解释溢出标志添加了第二个进位链。
adc
指令有两个新闻变体:adcx
和adox
adcx
与adc
相同,只是它不再修改OF(溢出)标志。
adox
与adc
相同,但它将进位信息存储在OF标志中。它也不再修改进位标志。
正如您所看到的,两个新的adc
变体在标志使用方面不会相互影响。这允许您通过交错指令并行运行两个长整数加法,并对一个序列使用adcx
,为另一个序列使用adox
。
答案 1 :(得分:8)
引用英特尔的论文New Instructions Support Large Integer Arithmetic:
adcx和adox指令是adc指令的扩展, 旨在支持两个独立的携带链。它们被定义为:
adcx dest/src1, src2 adox dest/src1, src2
两个指令计算src1和src2的总和加上进位并生成一个 输出和目标和进位。这两者之间的区别 说明是adcx使用CF标志进位和进位 out(保持OF标志不变),而adox指令使用 进位和执行的OF标志(留下CF标志 不变)。
这些说明相对于adc的主要优点是它们 支持两个独立的携带链。