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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…