ia32 / ia64上的ADC和ADCX指令有什么区别?

时间:2015-04-20 12:09:19

标签: assembly x86

当我遇到ADCX指令时,我正在浏览英特尔软件开发人员手册,这是我以前不知道的;其编码为66 0F 38 F6。它似乎与ADC指令几乎完全相同,那么为什么在以下情况下使用ADCX

  • 仅在现代CPU中支持
  • 指令编码占用更多空间(4个字节,而ADC为1)

是否有其他副作用或特殊情况,ADCX证明比ADC更有利?必须有一些很好的理由将其添加到教学指令中。

2 个答案:

答案 0 :(得分:17)

这些指令用于加速大整数运算。

在这些说明之前,添加大量数字通常会产生如下代码序列:

  add  
  adc  
  adc  
  adc  
  adc  

这里要注意的重要部分是,如果添加的结果不适合机器字,则进位标志被设置并被“转移”到下一个更高的机器字。所有这些指令都相互依赖,因为它们将先前的加法进位标志考虑在内,在执行后生成一个新的进位标志值。

由于x86处理器能够同时执行多个指令,因此成为一个巨大的瓶颈。依赖链使得处理器不可能并行执行任何算术。 (为了在实践中正确,你会在add / adc序列之间找到一个加载和存储,但性能仍然受到进位依赖性的限制。)

为了改进这一点,英特尔通过重新解释溢出标志添加了第二个进位链。

adc指令有两个新闻变体:adcxadox

adcxadc相同,只是它不再修改OF(溢出)标志。

adoxadc相同,但它将进位信息存储在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的主要优点是它们   支持两个独立的携带链。