From WikiChip
Difference between revisions of "x86/adx"
< x86

(Overview: Changed "an register" to "a register"; changed "effecting flags" to "affecting flags.")
 
Line 17: Line 17:
 
Note:
 
Note:
  
* To add a constant to an register without effecting flags, you can use the <code>LEA reg, [reg + n]</code> instruction
+
* To add a constant to a register without affecting flags, you can use the <code>LEA reg, [reg + n]</code> instruction
  
 
<source lang=asm>
 
<source lang=asm>

Latest revision as of 11:28, 10 August 2021

ADX is an x86 instruction set extension that introduced arbitrary-precision arithmetic operations.

Overview[edit]

ADX introduced two new instructions:

  • ADCX
  • ADOX

They are similar to the ADC instruction by doing a add with overflow, but

  • ADCX uses the Carry flag as source and destination of overflow and leaves the other flags untouched
  • ADOX uses the Overflow flag as source and destination of overflow and leaves the other flags untouched

This allows two parallel addition of multi-precision numbers because both have their separate carry flag.

Note:

  • To add a constant to a register without affecting flags, you can use the LEA reg, [reg + n] instruction
    xor  rax, rax
 lbl:
    mov  rbx, [r8 + r15]
    adcx rbx, [r9 + r15]
    mov  [r9 + r15], rbx
    mov  rbx, [r10 + r15]
    adox rbx, [r11 + r15]
    mov  [r11 + r15], rbx
    lea  r15, [r15 + 8]
    dec  r14
    jnz  lbl