5. Instructions arithmétiques

5.1. Conventions du document

Notation : Rd, Rm, Rn désignent les registres ARM R0-R7. immN désigne une valeur immédiate d’une largeur de N bits, par exemple imm8, imm3. carry désigne l’indicateur de condition de retenue, not(carry) désigne son complément. Dans le cas des instructions comportant plusieurs arguments de registre, il est permis que certains soient identiques. Par exemple, ce qui suit additionne le contenu de R0 à lui-même, en plaçant le résultat dans R0 :

  • add(r0, r0, r0)

Les instructions arithmétiques affectent les indicateurs de condition sauf indication contraire.

5.2. Addition

  • add(Rdn, imm8) Rdn = Rdn + imm8

  • add(Rd, Rn, imm3) Rd = Rn + imm3

  • add(Rd, Rn, Rm) Rd = Rn + Rm

  • adc(Rd, Rn) Rd = Rd + Rn + carry

5.3. Soustraction

  • sub(Rdn, imm8) Rdn = Rdn - imm8

  • sub(Rd, Rn, imm3) Rd = Rn - imm3

  • sub(Rd, Rn, Rm) Rd = Rn - Rm

  • sbc(Rd, Rn) Rd = Rd - Rn - not(carry)

5.4. Négation

  • neg(Rd, Rn) Rd = -Rn

5.5. Multiplication et division

  • mul(Rd, Rn) Rd = Rd * Rn

Cela produit un résultat sur 32 bits, le dépassement étant perdu. Le résultat peut être traité comme signé ou non signé selon la définition des opérandes.

  • sdiv(Rd, Rn, Rm) Rd = Rn / Rm

  • udiv(Rd, Rn, Rm) Rd = Rn / Rm

Ces fonctions effectuent respectivement une division signée et non signée. Les indicateurs de condition ne sont pas affectés.