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

前端 未结 2 864
走了就别回头了
走了就别回头了 2020-12-06 10:05

I was looking through the Intel software developer manual when I encountered the ADCX instruction, which was previously unknown to me; its encoding is 66

相关标签:
2条回答
  • 2020-12-06 10:33

    These instructions are used to speed up large integer arithmetic.

    Before these instructions adding large numbers often resulted in a code-sequence that looked like this:

      add  
      adc  
      adc  
      adc  
      adc  
    

    The important part here to note is, that if the result of an addition would not fit into a machine word, the carry flag gets set and is 'carried over' to the next higher machine word. All these instructions depend on each other because they take the previous addition carry flag into account and generate a new carry flag value after execution.

    Since x86 processors are capable to execute several instructions at once this became a huge bottleneck. The dependency chain just made it impossible for the processor to execute any of the arithmetic in parallel. (to be correct in practice you'll find a loads and stores between the add/adc sequences, but the performance was still limited by the carry dependency).

    To improve upon this Intel added a second carry chain by reinterpreting the overflow flag.

    The adc instruction got two news variants: adcx and adox

    adcx is the same as adc, except that it does not modify the OF (overflow) flag anymore.

    adox is the same as adc, but it stores the carry information in the OF flag. It also does not modify the carry-flag anymore.

    As you can see the two new adc variants don't influence each other with regards to the flag usage. This allows you to run two long integer additions in parallel by interleaving the instructions and use adcx for one sequence and adox for the other sequence.

    0 讨论(0)
  • 2020-12-06 10:42

    To quote from the paper New Instructions Support Large Integer Arithmetic by Intel:

    The adcx and adox instructions are extensions of the adc instruction, designed to support two separate carry chains. They are defined as:

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

    Both instructions compute the sum of src1 and src2 plus a carry-in and generate an output sum dest and a carry-out. The difference between these two instructions is that adcx uses the CF flag for the carry in and carry out (leaving the OF flag unchanged), whereas the adox instruction uses the OF flag for the carry in and carry out (leaving the CF flag unchanged).

    The primary advantage of these instructions over adc is that they support two independent carry chains.

    0 讨论(0)
提交回复
热议问题