2110dc5a6d
Thanks to Peter Hinch for contributing this.
1.4 KiB
1.4 KiB
Arithmetic instructions
Document conventions
Notation: Rd, Rm, Rn
denote ARM registers R0-R7.
immN
denotes an immediate value having a width of N bits
e.g. imm8
, imm3
. carry
denotes
the carry condition flag, not(carry)
denotes its
complement. In the case of instructions with more than one register
argument, it is permissible for some to be identical. For example the
following will add the contents of R0 to itself, placing the result in
R0:
- add(r0, r0, r0)
Arithmetic instructions affect the condition flags except where stated.
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
Subtraction
- 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)
Negation
- neg(Rd, Rn)
Rd = -Rn
Multiplication and division
- mul(Rd, Rn)
Rd = Rd * Rn
This produces a 32 bit result with overflow lost. The result may be treated as signed or unsigned according to the definition of the operands.
- sdiv(Rd, Rn, Rm)
Rd = Rn / Rm
- udiv(Rd, Rn, Rm)
Rd = Rn / Rm
These functions perform signed and unsigned division respectively. Condition flags are not affected.