ARM32 instructions (Thumb-2)

Instruction reference: i386 · x64 · ARM32 (Thumb-2) · ARM64 (AArch64)

154 instructions in 231 forms for .arch thumb: name, operands, the bit encoding (16 or 32 bits) and a short description with the operation in pseudo code. Included are the 16-bit instructions and the 32-bit instructions: arithmetic, logic, shifts, bitfields, multiplication and division, loads and stores (also unprivileged and exclusive), branches, system instructions, coprocessor access and floating point (VFP). Every instruction that Dismonite decodes is included. Not included yet are NEON, the DSP and saturating instructions and further variants. The classic ARM mode (A32) is missing because Windows on ARM uses only Thumb-2.

How to read the table

A Thumb instruction is 16 or 32 bits long; a 32-bit instruction consists of two half words that follow each other in memory (the upper half word first, here on the left, then the lower one, here on the right, with a gap between). The encoding shows the bits from left (highest bit number) to right: fixed bits as digits (the opcode), the names are fields. Hover a field to see its range of bits. Rd, Rn, Rm, Rt are registers: mostly 3 bits (r0 to r7) in 16-bit instructions, 4 bits (r0 to r15) in 32-bit ones. imm… is a constant, cond a condition (4 bits), S chooses the form that sets the flags. Below is the value of the fixed bits and the mask in hex: an instruction belongs to this form if (word & mask) == value.

Flags: The 16-bit arithmetic instructions set the flags (N Z C V) when they are not in an IT block, and otherwise not; hence the names adds, movs, lsls ... The 32-bit forms set the flags only if the bit S is set. Operation: Rd = Rn + Rm and the like is pseudo code; sext and zext extend with sign and with zeros, >>s shifts with sign, [x] is the memory at address x.

Every encoding in this table is checked against the decoder of Dismonite: with random values in the fields it gives this instruction (or its alias) again.

InstructionOperandsEncodingDescription
adcRd, Rn, #const11110 i 0 1010 S Rn 0 imm3 Rd imm80xF1400000 / mask 0xFBE08000Addition with carry: constant as the second operand (8 bit, rotated or repeated)Rd = Rn + const + C; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Arithmetic
Rd, Rn, Rm{, shift #imm}1110101 1010 S Rn 0 imm3 Rd imm2 type Rm0xEB400000 / mask 0xFFE08000Addition with carry: register as the second operand, shifted (lsl, lsr, asr, ror, rrx)Rd = Rn + shift(Rm) + CFlags: N Z C V (if S)Arithmetic
adcsRdn, Rmalso shown as: adc010000 0101 Rm Rdn0x4140 / mask 0xFFC0Addition with carry (C)Rdn = Rdn + Rm + CFlags: N Z C VArithmetic
addRdn, Rm010001 00 DN Rm Rdn0x4400 / mask 0xFF00Addition of two registers (also r8 to r15, sets no flags)Rdn = Rdn + RmArithmetic
Rd, sp, #imm8*41010 1 Rd imm80xA800 / mask 0xF800Addition of the stack pointer and a constantRd = sp + imm8 * 4Arithmetic
sp, sp, #imm7*41011 0000 0 imm70xB000 / mask 0xFF80Increase of the stack pointersp = sp + imm7 * 4Arithmetic
Rd, Rn, #constalso shown as: cmn11110 i 0 1000 S Rn 0 imm3 Rd imm80xF1000000 / mask 0xFBE08000Addition: constant as the second operand (8 bit, rotated or repeated)Rd = Rn + const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Arithmetic
Rd, Rn, Rm{, shift #imm}also shown as: cmn1110101 1000 S Rn 0 imm3 Rd imm2 type Rm0xEB000000 / mask 0xFFE08000Addition: register as the second operand, shifted (lsl, lsr, asr, ror, rrx)Rd = Rn + shift(Rm)Flags: N Z C V (if S)Arithmetic
addsRd, Rn, Rmalso shown as: add000 11 0 0 Rm Rn Rd0x1800 / mask 0xFE00Addition of two registersRd = Rn + RmFlags: N Z C VArithmetic
Rd, Rn, #imm3also shown as: add000 11 1 0 imm3 Rn Rd0x1C00 / mask 0xFE00Addition of a constant (3 bit)Rd = Rn + imm3Flags: N Z C VArithmetic
Rdn, #imm8also shown as: add001 10 Rdn imm80x3000 / mask 0xF800Addition of a constant (8 bit)Rdn = Rdn + imm8Flags: N Z C VArithmetic
addwRd, Rn, #imm12also shown as: add11110 i 100000 Rn 0 imm3 Rd imm80xF2000000 / mask 0xFBF08000Addition of a constant (12 bit)Rd = Rn + imm12 (i:imm3:imm8)Arithmetic
adrRd, labelalso shown as: add1010 0 Rd imm80xA000 / mask 0xF800Address relative to the program counterRd = align(pc, 4) + imm8 * 4Constants and addresses
andRd, Rn, #constalso shown as: tst11110 i 0 0000 S Rn 0 imm3 Rd imm80xF0000000 / mask 0xFBE08000Bitwise AND: constant as the second operand (8 bit, rotated or repeated)Rd = Rn & const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Logic and bits
Rd, Rn, Rm{, shift #imm}also shown as: tst1110101 0000 S Rn 0 imm3 Rd imm2 type Rm0xEA000000 / mask 0xFFE08000Bitwise AND: register as the second operand, shifted (lsl, lsr, asr, ror, rrx)Rd = Rn & shift(Rm)Flags: N Z C V (if S)Logic and bits
andsRdn, Rmalso shown as: and010000 0000 Rm Rdn0x4000 / mask 0xFFC0Bitwise ANDRdn = Rdn & RmFlags: N ZLogic and bits
asrRd, Rn, Rm11111010 0 10 S Rn 1111 Rd 0000 Rm0xFA40F000 / mask 0xFFE0F0F0Shift right signed by a register (32-bit form)Rd = Rn >>s Rm[7:0]Flags: N Z C (if S)Shift and rotate
asrsRd, Rm, #imm5also shown as: asr000 10 imm5 Rm Rd0x1000 / mask 0xF800Shift right signed by a constantRd = Rm >>s imm5 (imm5 = 0 means 32)Flags: N Z CShift and rotate
Rdn, Rmalso shown as: asr010000 0100 Rm Rdn0x4100 / mask 0xFFC0Shift right signed by a registerRdn = Rdn >>s Rm[7:0]Flags: N Z CShift and rotate
blabel11100 imm110xE000 / mask 0xF800Jump (relative, +-2 KB)pc = pc + (sext(imm11) << 1)Branches and calls
label11110 S imm10 10 J1 1 J2 imm110xF0009000 / mask 0xF800D000Jump (relative, +-16 MB)pc = pc + sext(S:J1:J2:imm10:imm11 << 1)Branches and calls
b.condlabel1101 cond imm80xD000 / mask 0xF000Conditional jump (relative, +-256 bytes)if cond then pc = pc + (sext(imm8) << 1)Branches and calls
label11110 S cond imm6 10 J1 0 J2 imm110xF0008000 / mask 0xF800D000Conditional jump (relative, +-1 MB)if cond then pc = pc + sext(S:J2:J1:imm6:imm11 << 1)Branches and calls
bfiRd, Rn, #lsb, #widthalso shown as: bfc11110 0 110110 Rn 0 imm3 Rd imm2 0 msb0xF3600000 / mask 0xFFF08020Insertion of a bitfield from Rn into Rd (bfc: zeros)Rd[msb : lsb] = Rn[msb - lsb : 0]Bitfields
bicRd, Rn, #const11110 i 0 0001 S Rn 0 imm3 Rd imm80xF0200000 / mask 0xFBE08000Bitwise AND with an inverted constant: constant as the second operand (8 bit, rotated or repeated)Rd = Rn & ~const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Logic and bits
Rd, Rn, Rm{, shift #imm}1110101 0001 S Rn 0 imm3 Rd imm2 type Rm0xEA200000 / mask 0xFFE08000Bitwise AND with an inverted operand: register as the second operand, shifted (lsl, lsr, asr, ror, rrx)Rd = Rn & ~shift(Rm)Flags: N Z C V (if S)Logic and bits
bicsRdn, Rmalso shown as: bic010000 1110 Rm Rdn0x4380 / mask 0xFFC0Bitwise AND with an inverted operand (bit clear)Rdn = Rdn & ~RmFlags: N ZLogic and bits
bkpt#imm81011 1110 imm80xBE00 / mask 0xFF00Breakpointraise a breakpoint exceptionSystem and privileged
bllabel11110 S imm10 11 J1 1 J2 imm110xF000D000 / mask 0xF800D000Call of a function (relative, +-16 MB, lr = return address)lr = (pc + 4) | 1; pc = pc + sext(S:J1:J2:imm10:imm11 << 1)Branches and calls
blxRm010001 11 1 Rm 0000x4780 / mask 0xFF87Call of the function at the address in the register (lr = return address)lr = (pc + 2) | 1; pc = Rm & ~1Branches and calls
label11110 S imm10 11 J1 0 J2 imm10 00xF000C000 / mask 0xF800D001Call of an ARM function (relative, switches to the ARM instruction set)lr = (pc + 4) | 1; pc = align(pc, 4) + sext(S:J1:J2:imm10H:imm10L << 2); instruction set = ARMBranches and calls
blxnsRm010001111 Rm 1000x4784 / mask 0xFF87Call of a register with a change to the non-secure state (TrustZone, ARMv8-M)lr = next; pc = Rm; state = non-secureBranches and calls
bxRm010001 11 0 Rm 0000x4700 / mask 0xFF87Jump to the address in the register (bit 0 selects Thumb, ARM if bit 0 = 0)pc = Rm & ~1; instruction set = Rm[0]Branches and calls
bxnsRm010001110 Rm 1000x4704 / mask 0xFF87Jump to a register with a change to the non-secure state (TrustZone, ARMv8-M)pc = Rm; state = non-secureBranches and calls
cbnzRn, label1011 10 i 1 imm5 Rn0xB900 / mask 0xFD00Jump forward if the register is not 0if Rn != 0 then pc = pc + (i:imm5 << 1)Branches and calls
cbzRn, label1011 00 i 1 imm5 Rn0xB100 / mask 0xFD00Jump forward if the register is 0if Rn == 0 then pc = pc + (i:imm5 << 1)Branches and calls
clzRd, Rm111110101011 Rm 1111 Rd 1000 Rm0xFAB0F080 / mask 0xFFF0F0F0Count of the leading zero bitsRd = count_leading_zeros(Rm)Logic and bits
cmnRn, Rm010000 1011 Rm Rn0x42C0 / mask 0xFFC0Comparison by addition (Rn plus Rm), only the flags changeflags = Rn + RmFlags: N Z C VCompare and exchange
cmpRn, #imm8001 01 Rn imm80x2800 / mask 0xF800Comparison with a constant (8 bit)flags = Rn - imm8Flags: N Z C VCompare and exchange
Rn, Rm010000 1010 Rm Rn0x4280 / mask 0xFFC0Comparison (Rn minus Rm), only the flags changeflags = Rn - RmFlags: N Z C VCompare and exchange
Rn, Rm010001 01 N Rm Rn0x4500 / mask 0xFF00Comparison of two registers (also r8 to r15)flags = Rn - RmFlags: N Z C VCompare and exchange
cpsidialso shown as: cpsie1011 0110 011 im 0 0 1 00xB662 / mask 0xFFEFDisabling (cpsid) or enabling (cpsie) of interrupts (privileged)PRIMASK = imSystem and privileged
dmboption111100111011 1111 1000 1111 0101 option0xF3BF8F50 / mask 0xFFFFFFF0Memory barrier for the order of the accessesearlier memory accesses are observed before later onesSystem and privileged
dsboption111100111011 1111 1000 1111 0100 option0xF3BF8F40 / mask 0xFFFFFFF0Memory barrier: waits until all accesses are completewait until all earlier memory accesses are completeSystem and privileged
eorRd, Rn, #constalso shown as: teq11110 i 0 0100 S Rn 0 imm3 Rd imm80xF0800000 / mask 0xFBE08000Bitwise exclusive OR: constant as the second operand (8 bit, rotated or repeated)Rd = Rn ^ const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Logic and bits
Rd, Rn, Rm{, shift #imm}also shown as: teq1110101 0100 S Rn 0 imm3 Rd imm2 type Rm0xEA800000 / mask 0xFFE08000Bitwise exclusive OR: register as the second operand, shifted (lsl, lsr, asr, ror, rrx)Rd = Rn ^ shift(Rm)Flags: N Z C V (if S)Logic and bits
eorsRdn, Rmalso shown as: eor010000 0001 Rm Rdn0x4040 / mask 0xFFC0Bitwise exclusive ORRdn = Rdn ^ RmFlags: N ZLogic and bits
hint#imm10111111 hint 00000xBF00 / mask 0xFF0FHint instruction with a number from 0 to 15 (nop, yield, wfe, wfi, sev have their own names; the others do nothing)no changeSystem and privileged
isboption111100111011 1111 1000 1111 0110 option0xF3BF8F60 / mask 0xFFFFFFF0Instruction barrier: flushes the pipelineall instructions after it are fetched anewSystem and privileged
it{x{y{z}}} condalso shown as: ite, itt, itee, itet, itte, ittt, iteee, iteet, itete, itett, ittee, ittet, ittte, itttt1011 1111 firstcond mask0xBF00 / mask 0xFF00IT block: makes the following 1 to 4 instructions conditionalthe next instructions run only if the condition holds (or its opposite for else)System and privileged
ldmRn{!}, {registers}also shown as: ldmia11001 Rn register_list0xC800 / mask 0xF800Load of several registers (increasing)for each register in the list: reg = [Rn]; Rn = Rn + 4Loads and stores
Rn{!}, {registers}also shown as: ldmia, pop1110100010 W 1 Rn register_list0xE8900000 / mask 0xFFD00000Load of several registers (increasing)for each register in the list: reg = [Rn]; Rn = Rn + 4Loads and stores
ldmdbRn{!}, {registers}1110100100 W 1 Rn register_list0xE9100000 / mask 0xFFD00000Load of several registers (decreasing)for each register in the list, last first: Rn = Rn - 4; reg = [Rn]Loads and stores
ldrRt, label01001 Rt imm80x4800 / mask 0xF800Load of a word relative to the program counter (literal pool, up to 1020 bytes)Rt = [align(pc, 4) + imm8 * 4]Loads and stores
Rt, [Rn, Rm]0101 100 Rm Rn Rt0x5800 / mask 0xFE00Load of a word (register address)Rt = [Rn + Rm]Loads and stores
Rt, [Rn{, #imm5*4}]011 01 imm5 Rn Rt0x6800 / mask 0xF800Load of a word (constant offset)Rt = [Rn + imm5 * 4]Loads and stores
Rt, [sp{, #imm8*4}]100 11 Rt imm80x9800 / mask 0xF800Load of a word relative to the stack pointerRt = [sp + imm8 * 4]Loads and stores
Rt, [Rn, #imm12]111110001101 Rn Rt imm120xF8D00000 / mask 0xFFF00000Load of a word (constant, 12 bit, forward only)Rt = [Rn + imm12]Loads and stores
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110000101 Rn Rt 1 P U W imm80xF8500800 / mask 0xFFF00800Load of a word (constant, 8 bit, with or without write-back)Rt = [Rn +/- imm8]Loads and stores
Rt, [Rn, Rm{, lsl #imm2}]111110000101 Rn Rt 000000 imm2 Rm0xF8500000 / mask 0xFFF00FC0Load of a word (register, optionally shifted left by 0 to 3)Rt = [Rn + (Rm << imm2)]Loads and stores
Rt, label11111000 U 1011111 Rt imm120xF85F0000 / mask 0xFF7F0000Load of a word relative to the program counter (+-4 KB)Rt = [align(pc, 4) +/- imm12]Loads and stores
ldrbRt, [Rn, Rm]0101 110 Rm Rn Rt0x5C00 / mask 0xFE00Load of a byte (register address)Rt = zext([Rn + Rm])Loads and stores
Rt, [Rn{, #imm5}]011 11 imm5 Rn Rt0x7800 / mask 0xF800Load of a byte (constant offset)Rt = zext([Rn + imm5])Loads and stores
Rt, [Rn, #imm12]111110001001 Rn Rt imm120xF8900000 / mask 0xFFF00000Load of a byte (constant, 12 bit, forward only)Rt = zext([Rn + imm12])Loads and stores
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110000001 Rn Rt 1 P U W imm80xF8100800 / mask 0xFFF00800Load of a byte (constant, 8 bit, with or without write-back)Rt = zext([Rn +/- imm8])Loads and stores
Rt, [Rn, Rm{, lsl #imm2}]111110000001 Rn Rt 000000 imm2 Rm0xF8100000 / mask 0xFFF00FC0Load of a byte (register, optionally shifted left by 0 to 3)Rt = zext([Rn + (Rm << imm2)])Loads and stores
ldrbtRt, [Rn{, #imm8}]111110000001 Rn Rt 1110 imm80xF8100E00 / mask 0xFFF00F00Load of a byte with the rights of user modeRt = zext([Rn + imm8])Loads and stores
ldrdRt, Rt2, [Rn, #+/-imm8*4]{!} / [Rn], #+/-imm8*41110100 P U 1 W 1 Rn Rt Rt2 imm80xE8500000 / mask 0xFE500000Load of a register pair (two words)Rt = [addr]; Rt2 = [addr + 4]Loads and stores
ldrexRt, [Rn{, #imm8*4}]111010000101 Rn Rt 1111 imm80xE8500F00 / mask 0xFFF00F00Load-exclusive: sets the exclusive monitorRt = [Rn + imm8 * 4]; set the exclusive monitorLoads and stores
ldrexbRt, [Rn]111010001101 Rn Rt 1111 0100 11110xE8D00F4F / mask 0xFFF00FFFLoad of a byte (exclusive)Rt = zext([Rn]); set the exclusive monitorLoads and stores
ldrexdRt, Rt2, [Rn]111010001101 Rn Rt Rt2 0111 11110xE8D0007F / mask 0xFFF000FFLoad of a double word (exclusive): sets the exclusive monitorRt:Rt2 = [Rn]; mark exclusiveLoads and stores
ldrexhRt, [Rn]111010001101 Rn Rt 1111 0101 11110xE8D00F5F / mask 0xFFF00FFFLoad of a half word (exclusive)Rt = zext([Rn]); set the exclusive monitorLoads and stores
ldrhRt, [Rn, Rm]0101 101 Rm Rn Rt0x5A00 / mask 0xFE00Load of a half word (register address)Rt = zext([Rn + Rm])Loads and stores
Rt, [Rn{, #imm5*2}]100 01 imm5 Rn Rt0x8800 / mask 0xF800Load of a half word (constant offset)Rt = zext([Rn + imm5 * 2])Loads and stores
Rt, [Rn, #imm12]111110001011 Rn Rt imm120xF8B00000 / mask 0xFFF00000Load of a half word (constant, 12 bit, forward only)Rt = zext([Rn + imm12])Loads and stores
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110000011 Rn Rt 1 P U W imm80xF8300800 / mask 0xFFF00800Load of a half word (constant, 8 bit, with or without write-back)Rt = zext([Rn +/- imm8])Loads and stores
Rt, [Rn, Rm{, lsl #imm2}]111110000011 Rn Rt 000000 imm2 Rm0xF8300000 / mask 0xFFF00FC0Load of a half word (register, optionally shifted left by 0 to 3)Rt = zext([Rn + (Rm << imm2)])Loads and stores
ldrhtRt, [Rn{, #imm8}]111110000011 Rn Rt 1110 imm80xF8300E00 / mask 0xFFF00F00Load of a half word with the rights of user modeRt = zext([Rn + imm8])Loads and stores
ldrsbRt, [Rn, Rm]0101 011 Rm Rn Rt0x5600 / mask 0xFE00Load of a signed byte (register address)Rt = sext([Rn + Rm])Loads and stores
Rt, [Rn, #imm12]111110011001 Rn Rt imm120xF9900000 / mask 0xFFF00000Load of a signed byte (constant, 12 bit, forward only)Rt = sext([Rn + imm12])Loads and stores
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110010001 Rn Rt 1 P U W imm80xF9100800 / mask 0xFFF00800Load of a signed byte (constant, 8 bit, with or without write-back)Rt = sext([Rn +/- imm8])Loads and stores
Rt, [Rn, Rm{, lsl #imm2}]111110010001 Rn Rt 000000 imm2 Rm0xF9100000 / mask 0xFFF00FC0Load of a signed byte (register, optionally shifted left by 0 to 3)Rt = sext([Rn + (Rm << imm2)])Loads and stores
ldrsbtRt, [Rn{, #imm8}]111110010001 Rn Rt 1110 imm80xF9100E00 / mask 0xFFF00F00Load of a byte with sign extension with the rights of user modeRt = sext([Rn + imm8])Loads and stores
ldrshRt, [Rn, Rm]0101 111 Rm Rn Rt0x5E00 / mask 0xFE00Load of a signed half word (register address)Rt = sext([Rn + Rm])Loads and stores
Rt, [Rn, #imm12]111110011011 Rn Rt imm120xF9B00000 / mask 0xFFF00000Load of a signed half word (constant, 12 bit, forward only)Rt = sext([Rn + imm12])Loads and stores
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110010011 Rn Rt 1 P U W imm80xF9300800 / mask 0xFFF00800Load of a signed half word (constant, 8 bit, with or without write-back)Rt = sext([Rn +/- imm8])Loads and stores
Rt, [Rn, Rm{, lsl #imm2}]111110010011 Rn Rt 000000 imm2 Rm0xF9300000 / mask 0xFFF00FC0Load of a signed half word (register, optionally shifted left by 0 to 3)Rt = sext([Rn + (Rm << imm2)])Loads and stores
ldrshtRt, [Rn{, #imm8}]111110010011 Rn Rt 1110 imm80xF9300E00 / mask 0xFFF00F00Load of a half word with sign extension with the rights of user modeRt = sext([Rn + imm8])Loads and stores
ldrtRt, [Rn{, #imm8}]111110000101 Rn Rt 1110 imm80xF8500E00 / mask 0xFFF00F00Load of a word with the rights of user modeRt = [Rn + imm8]Loads and stores
lslRd, Rn, Rm11111010 0 00 S Rn 1111 Rd 0000 Rm0xFA00F000 / mask 0xFFE0F0F0Shift left by a register (32-bit form)Rd = Rn << Rm[7:0]Flags: N Z C (if S)Shift and rotate
lslsRd, Rm, #imm5also shown as: lsl, movs000 00 imm5 Rm Rd0x0000 / mask 0xF800Shift left by a constantRd = Rm << imm5Flags: N Z CShift and rotate
Rdn, Rmalso shown as: lsl010000 0010 Rm Rdn0x4080 / mask 0xFFC0Shift left by a registerRdn = Rdn << Rm[7:0]Flags: N Z CShift and rotate
lsrRd, Rn, Rm11111010 0 01 S Rn 1111 Rd 0000 Rm0xFA20F000 / mask 0xFFE0F0F0Shift right unsigned by a register (32-bit form)Rd = Rn >> Rm[7:0]Flags: N Z C (if S)Shift and rotate
lsrsRd, Rm, #imm5also shown as: lsr000 01 imm5 Rm Rd0x0800 / mask 0xF800Shift right unsigned by a constantRd = Rm >> imm5 (imm5 = 0 means 32)Flags: N Z CShift and rotate
Rdn, Rmalso shown as: lsr010000 0011 Rm Rdn0x40C0 / mask 0xFFC0Shift right unsigned by a registerRdn = Rdn >> Rm[7:0]Flags: N Z CShift and rotate
mcrcoproc, #opc1, Rt, CRn, CRm{, #opc2}also shown as: mrc1110 1110 opc1 L CRn Rt coproc opc2 1 CRm0xEE000010 / mask 0xFF000010Coprocessor access: write of a register to a coprocessor (mcr) or read (mrc, L = 1)coprocessor register = Rt or Rt = coprocessor registerSystem and privileged
mlaRd, Rn, Rm, Ra111110110000 Rn Ra Rd 0000 Rm0xFB000000 / mask 0xFFF000F0Multiply and addRd = Ra + Rn * RmArithmetic
mlsRd, Rn, Rm, Ra111110110000 Rn Ra Rd 0001 Rm0xFB000010 / mask 0xFFF000F0Multiply and subtractRd = Ra - Rn * RmArithmetic
movRd, Rm010001 10 D Rm Rd0x4600 / mask 0xFF00Copy of a register (also r8 to r15, sets no flags)Rd = RmConstants and addresses
movsRd, #imm8also shown as: mov001 00 Rd imm80x2000 / mask 0xF800Load of a constant (8 bit)Rd = imm8Flags: N ZConstants and addresses
movtRd, #imm1611110 i 101100 imm4 0 imm3 Rd imm80xF2C00000 / mask 0xFBF08000Load of the upper half of a register (the lower half stays)Rd[31:16] = imm4:i:imm3:imm8Constants and addresses
movwRd, #imm16also shown as: mov11110 i 100100 imm4 0 imm3 Rd imm80xF2400000 / mask 0xFBF08000Load of a 16-bit constant (the upper half 0)Rd = zext(imm4:i:imm3:imm8)Constants and addresses
mrsRd, sysreg1111001111101111 1000 Rd SYSm0xF3EF8000 / mask 0xFFFFF000Read of a system register (apsr, ipsr, msp, psp, primask ...)Rd = sysregSystem and privileged
msrsysreg, Rn111100111000 Rn 1000 mask 00 SYSm0xF3808000 / mask 0xFFF0F300Write of a system registersysreg = RnSystem and privileged
mulRd, Rn, Rm111110110000 Rn 1111 Rd 0000 Rm0xFB00F000 / mask 0xFFF0F0F0Multiplication (low 32 bits)Rd = Rn * RmArithmetic
mulsRdm, Rn, Rdmalso shown as: mul010000 1101 Rn Rdm0x4340 / mask 0xFFC0Multiplication (low 32 bits)Rdm = Rn * RdmFlags: N ZArithmetic
mvnsRd, Rmalso shown as: mvn010000 1111 Rm Rd0x43C0 / mask 0xFFC0Bitwise inversionRd = ~RmFlags: N ZLogic and bits
nop1011 1111 0000 00000xBF00 / mask 0xFFFFNo operationno changeSystem and privileged
ornRd, Rn, #constalso shown as: mvn11110 i 0 0011 S Rn 0 imm3 Rd imm80xF0600000 / mask 0xFBE08000Bitwise OR with an inverted constant: constant as the second operand (8 bit, rotated or repeated)Rd = Rn OR ~const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Logic and bits
Rd, Rn, Rm{, shift #imm}also shown as: mvn1110101 0011 S Rn 0 imm3 Rd imm2 type Rm0xEA600000 / mask 0xFFE08000Bitwise OR with an inverted operand: register as the second operand, shifted (lsl, lsr, asr, ror, rrx)Rd = Rn OR ~shift(Rm)Flags: N Z C V (if S)Logic and bits
orrRd, Rn, #constalso shown as: mov11110 i 0 0010 S Rn 0 imm3 Rd imm80xF0400000 / mask 0xFBE08000Bitwise OR: constant as the second operand (8 bit, rotated or repeated)Rd = Rn OR const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Logic and bits
Rd, Rn, Rm{, shift #imm}also shown as: mov, lsl, lsr, asr, ror1110101 0010 S Rn 0 imm3 Rd imm2 type Rm0xEA400000 / mask 0xFFE08000Bitwise OR: register as the second operand, shifted (lsl, lsr, asr, ror, rrx)Rd = Rn OR shift(Rm)Flags: N Z C V (if S)Logic and bits
orrsRdn, Rmalso shown as: orr010000 1100 Rm Rdn0x4300 / mask 0xFFC0Bitwise ORRdn = Rdn OR RmFlags: N ZLogic and bits
pld[Rn, #imm12]111110001001 Rn 1111 imm120xF890F000 / mask 0xFFF0F000Prefetch of a cache line for reading (hint)prefetch the cache line at Rn + imm12 (a hint)Loads and stores
pldw[Rn, #imm12]111110001011 Rn 1111 imm120xF8B0F000 / mask 0xFFF0F000Prefetch of a cache line for writing (hint)prefetch the cache line at Rn + imm12 (a hint)Loads and stores
pli[Rn, #imm12]111110011001 Rn 1111 imm120xF990F000 / mask 0xFFF0F000Prefetch of a cache line for instructions (hint)prefetch the cache line at Rn + imm12 (a hint)Loads and stores
pop{registers{, pc}}1011 110 P register_list0xBC00 / mask 0xFE00Pop of registers (P: also pc, a return) from the stackload the registers upward from sp; sp = sp + 4 * countStack
push{registers{, lr}}1011 010 M register_list0xB400 / mask 0xFE00Push of registers (M: also lr) onto the stacksp = sp - 4 * count; store the registers upward from spStack
rbitRd, Rm111110101001 Rm 1111 Rd 1010 Rm0xFA90F0A0 / mask 0xFFF0F0F0Reversal of the bit orderRd = reverse_bits(Rm)Logic and bits
revRd, Rm1011 1010 00 Rm Rd0xBA00 / mask 0xFFC0Reversal of the bytes (little/big endian)Rd = reverse_bytes(Rm)Logic and bits
Rd, Rm111110101001 Rm 1111 Rd 1000 Rm0xFA90F080 / mask 0xFFF0F0F0Reversal of the bytes (little/big endian)Rd = reverse_bytes(Rm)Logic and bits
rev16Rd, Rm1011 1010 01 Rm Rd0xBA40 / mask 0xFFC0Reversal of the bytes in each half wordRd = reverse_bytes_in_each_16_bits(Rm)Logic and bits
Rd, Rm111110101001 Rm 1111 Rd 1001 Rm0xFA90F090 / mask 0xFFF0F0F0Reversal of the bytes in each half wordRd = reverse_bytes_in_each_16_bits(Rm)Logic and bits
revshRd, Rm1011 1010 11 Rm Rd0xBAC0 / mask 0xFFC0Reversal of the low two bytes, sign-extendedRd = sext(reverse_bytes(Rm[15:0]))Logic and bits
Rd, Rm111110101001 Rm 1111 Rd 1011 Rm0xFA90F0B0 / mask 0xFFF0F0F0Reversal of the low two bytes, sign-extendedRd = sext(reverse_bytes(Rm[15:0]))Logic and bits
rorRd, Rn, Rm11111010 0 11 S Rn 1111 Rd 0000 Rm0xFA60F000 / mask 0xFFE0F0F0Shift right (rotation) by a register (32-bit form)Rd = rotate_right(Rn, Rm[7:0])Flags: N Z C (if S)Shift and rotate
rorsRdn, Rmalso shown as: ror010000 0111 Rm Rdn0x41C0 / mask 0xFFC0Rotate right by a registerRdn = rotate_right(Rdn, Rm[7:0])Flags: N Z CShift and rotate
rsbRd, Rn, #const11110 i 0 1110 S Rn 0 imm3 Rd imm80xF1C00000 / mask 0xFBE08000Reverse subtraction: constant as the second operand (8 bit, rotated or repeated)Rd = const - Rn; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Arithmetic
Rd, Rn, Rm{, shift #imm}1110101 1110 S Rn 0 imm3 Rd imm2 type Rm0xEBC00000 / mask 0xFFE08000Reverse subtraction: register as the second operand, shifted (lsl, lsr, asr, ror, rrx)Rd = shift(Rm) - RnFlags: N Z C V (if S)Arithmetic
rsbsRd, Rn, #0also shown as: neg, rsb010000 1001 Rn Rd0x4240 / mask 0xFFC0Reverse subtraction from 0 (negation)Rd = 0 - RnFlags: N Z C VArithmetic
sbcRd, Rn, #const11110 i 0 1011 S Rn 0 imm3 Rd imm80xF1600000 / mask 0xFBE08000Subtraction with borrow: constant as the second operand (8 bit, rotated or repeated)Rd = Rn - const - (1 - C); the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Arithmetic
Rd, Rn, Rm{, shift #imm}1110101 1011 S Rn 0 imm3 Rd imm2 type Rm0xEB600000 / mask 0xFFE08000Subtraction with borrow: register as the second operand, shifted (lsl, lsr, asr, ror, rrx)Rd = Rn - shift(Rm) - (1 - C)Flags: N Z C V (if S)Arithmetic
sbcsRdn, Rmalso shown as: sbc010000 0110 Rm Rdn0x4180 / mask 0xFFC0Subtraction with borrow (C)Rdn = Rdn - Rm - (1 - C)Flags: N Z C VArithmetic
sbfxRd, Rn, #lsb, #width11110 0 110100 Rn 0 imm3 Rd imm2 0 widthm10xF3400000 / mask 0xFFF08020Extraction of a bitfield with sign extensionRd = sext(Rn[lsb + width - 1 : lsb])Bitfields
sdivRd, Rn, Rm111110111001 Rn 1111 Rd 1111 Rm0xFB90F0F0 / mask 0xFFF0F0F0Signed division (division by 0 gives 0)Rd = Rn / RmArithmetic
setendle|be10110110 010 E 1 0000xB648 / mask 0xFFEFSelection of the byte order for data accesses (E = 0: little endian, 1: big endian; deprecated in ARMv8)data endianness = ESystem and privileged
sev1011 1111 0100 00000xBF40 / mask 0xFFFFSend of an event to all processorsset the event register of all processorsSystem and privileged
smlalRdLo, RdHi, Rn, Rm111110111100 Rn RdLo RdHi 0000 Rm0xFBC00000 / mask 0xFFF000F0Signed multiplication to 64 bits with additionRdHi:RdLo = RdHi:RdLo + sext(Rn) * sext(Rm)Arithmetic
smullRdLo, RdHi, Rn, Rm111110111000 Rn RdLo RdHi 0000 Rm0xFB800000 / mask 0xFFF000F0Signed multiplication to 64 bitsRdHi:RdLo = sext(Rn) * sext(Rm)Arithmetic
stmRn!, {registers}also shown as: stmia11000 Rn register_list0xC000 / mask 0xF800Store of several registers (increasing, Rn is written back)for each register in the list: [Rn] = reg; Rn = Rn + 4Loads and stores
Rn{!}, {registers}also shown as: stmia1110100010 W 0 Rn register_list0xE8800000 / mask 0xFFD00000Store of several registers (increasing)for each register in the list: [Rn] = reg; Rn = Rn + 4Loads and stores
stmdbRn{!}, {registers}also shown as: push1110100100 W 0 Rn register_list0xE9000000 / mask 0xFFD00000Store of several registers (decreasing; push is stmdb sp!)for each register in the list, last first: Rn = Rn - 4; [Rn] = regLoads and stores
strRt, [Rn, Rm]0101 000 Rm Rn Rt0x5000 / mask 0xFE00Store of a word (register address)[Rn + Rm] = RtLoads and stores
Rt, [Rn{, #imm5*4}]011 00 imm5 Rn Rt0x6000 / mask 0xF800Store of a word (constant offset)[Rn + imm5 * 4] = RtLoads and stores
Rt, [sp{, #imm8*4}]100 10 Rt imm80x9000 / mask 0xF800Store of a word relative to the stack pointer[sp + imm8 * 4] = RtLoads and stores
Rt, [Rn, #imm12]111110001100 Rn Rt imm120xF8C00000 / mask 0xFFF00000Store of a word (constant, 12 bit, forward only)[Rn + imm12] = RtLoads and stores
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110000100 Rn Rt 1 P U W imm80xF8400800 / mask 0xFFF00800Store of a word (constant, 8 bit, with or without write-back)[Rn +/- imm8] = RtLoads and stores
Rt, [Rn, Rm{, lsl #imm2}]111110000100 Rn Rt 000000 imm2 Rm0xF8400000 / mask 0xFFF00FC0Store of a word (register, optionally shifted left by 0 to 3)[Rn + (Rm << imm2)] = RtLoads and stores
strbRt, [Rn, Rm]0101 010 Rm Rn Rt0x5400 / mask 0xFE00Store of a byte (register address)[Rn + Rm] = Rt[7:0]Loads and stores
Rt, [Rn{, #imm5}]011 10 imm5 Rn Rt0x7000 / mask 0xF800Store of a byte (constant offset)[Rn + imm5] = Rt[7:0]Loads and stores
Rt, [Rn, #imm12]111110001000 Rn Rt imm120xF8800000 / mask 0xFFF00000Store of a byte (constant, 12 bit, forward only)[Rn + imm12] = Rt[7:0]Loads and stores
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110000000 Rn Rt 1 P U W imm80xF8000800 / mask 0xFFF00800Store of a byte (constant, 8 bit, with or without write-back)[Rn +/- imm8] = Rt[7:0]Loads and stores
Rt, [Rn, Rm{, lsl #imm2}]111110000000 Rn Rt 000000 imm2 Rm0xF8000000 / mask 0xFFF00FC0Store of a byte (register, optionally shifted left by 0 to 3)[Rn + (Rm << imm2)] = Rt[7:0]Loads and stores
strbtRt, [Rn{, #imm8}]111110000000 Rn Rt 1110 imm80xF8000E00 / mask 0xFFF00F00Store of a byte with the rights of user mode[Rn + imm8] = Rt[7:0]Loads and stores
strdRt, Rt2, [Rn, #+/-imm8*4]{!} / [Rn], #+/-imm8*41110100 P U 1 W 0 Rn Rt Rt2 imm80xE8400000 / mask 0xFE500000Store of a register pair (two words)[addr] = Rt; [addr + 4] = Rt2Loads and stores
strexRd, Rt, [Rn{, #imm8*4}]111010000100 Rn Rt Rd imm80xE8400000 / mask 0xFFF00000Store-exclusive: Rd = 0 on successif the exclusive monitor is set then { [Rn + imm8 * 4] = Rt; Rd = 0 } else Rd = 1Loads and stores
strexbRd, Rt, [Rn]111010001100 Rn Rt 1111 0100 Rd0xE8C00F40 / mask 0xFFF00FF0Store-exclusive of a byteif the exclusive monitor is set then { [Rn] = Rt[7:0]; Rd = 0 } else Rd = 1Loads and stores
strexdRd, Rt, Rt2, [Rn]111010001100 Rn Rt Rt2 0111 Rd0xE8C00070 / mask 0xFFF000F0Store of a double word (exclusive): only if the monitor is still setif exclusive then [Rn] = Rt:Rt2; Rd = 0 else Rd = 1Loads and stores
strexhRd, Rt, [Rn]111010001100 Rn Rt 1111 0101 Rd0xE8C00F50 / mask 0xFFF00FF0Store-exclusive of a half wordif the exclusive monitor is set then { [Rn] = Rt[15:0]; Rd = 0 } else Rd = 1Loads and stores
strhRt, [Rn, Rm]0101 001 Rm Rn Rt0x5200 / mask 0xFE00Store of a half word (register address)[Rn + Rm] = Rt[15:0]Loads and stores
Rt, [Rn{, #imm5*2}]100 00 imm5 Rn Rt0x8000 / mask 0xF800Store of a half word (constant offset)[Rn + imm5 * 2] = Rt[15:0]Loads and stores
Rt, [Rn, #imm12]111110001010 Rn Rt imm120xF8A00000 / mask 0xFFF00000Store of a half word (constant, 12 bit, forward only)[Rn + imm12] = Rt[15:0]Loads and stores
Rt, [Rn, #+/-imm8]{!} / [Rn], #+/-imm8111110000010 Rn Rt 1 P U W imm80xF8200800 / mask 0xFFF00800Store of a half word (constant, 8 bit, with or without write-back)[Rn +/- imm8] = Rt[15:0]Loads and stores
Rt, [Rn, Rm{, lsl #imm2}]111110000010 Rn Rt 000000 imm2 Rm0xF8200000 / mask 0xFFF00FC0Store of a half word (register, optionally shifted left by 0 to 3)[Rn + (Rm << imm2)] = Rt[15:0]Loads and stores
strhtRt, [Rn{, #imm8}]111110000010 Rn Rt 1110 imm80xF8200E00 / mask 0xFFF00F00Store of a half word with the rights of user mode[Rn + imm8] = Rt[15:0]Loads and stores
strtRt, [Rn{, #imm8}]111110000100 Rn Rt 1110 imm80xF8400E00 / mask 0xFFF00F00Store of a word with the rights of user mode[Rn + imm8] = RtLoads and stores
subsp, sp, #imm7*41011 0000 1 imm70xB080 / mask 0xFF80Decrease of the stack pointersp = sp - imm7 * 4Arithmetic
Rd, Rn, #constalso shown as: cmp11110 i 0 1101 S Rn 0 imm3 Rd imm80xF1A00000 / mask 0xFBE08000Subtraction: constant as the second operand (8 bit, rotated or repeated)Rd = Rn - const; the constant is expanded from i:imm3:imm8Flags: N Z C V (if S)Arithmetic
Rd, Rn, Rm{, shift #imm}also shown as: cmp1110101 1101 S Rn 0 imm3 Rd imm2 type Rm0xEBA00000 / mask 0xFFE08000Subtraction: register as the second operand, shifted (lsl, lsr, asr, ror, rrx)Rd = Rn - shift(Rm)Flags: N Z C V (if S)Arithmetic
subsRd, Rn, Rmalso shown as: sub000 11 0 1 Rm Rn Rd0x1A00 / mask 0xFE00Subtraction of two registersRd = Rn - RmFlags: N Z C VArithmetic
Rd, Rn, #imm3also shown as: sub000 11 1 1 imm3 Rn Rd0x1E00 / mask 0xFE00Subtraction of a constant (3 bit)Rd = Rn - imm3Flags: N Z C VArithmetic
Rdn, #imm8also shown as: sub001 11 Rdn imm80x3800 / mask 0xF800Subtraction of a constant (8 bit)Rdn = Rdn - imm8Flags: N Z C VArithmetic
subwRd, Rn, #imm12also shown as: sub11110 i 101010 Rn 0 imm3 Rd imm80xF2A00000 / mask 0xFBF08000Subtraction of a constant (12 bit)Rd = Rn - imm12 (i:imm3:imm8)Arithmetic
svc#imm81101 1111 imm80xDF00 / mask 0xFF00Supervisor call to the operating systemraise a supervisor call exception with imm8System and privileged
sxtabRd, Rn, Rm{, ror #rot}also shown as: sxtah, sxtab16, uxtab, uxtah, uxtab1611111010 0 op Rn 1111 Rd 1 0 rotate Rm0xFA00F080 / mask 0xFF80F0C0Extension of a byte or half word (sxt: signed, uxt: zero) and addition of Rn; ...16: two half words from two bytes; Rm rotated by 0/8/16/24 firstRd = Rn + extend(ror(Rm, rot))Logic and bits
sxtbRd, Rm1011 0010 01 Rm Rd0xB240 / mask 0xFFC0Sign extension of a byteRd = sext(Rm[7:0])Logic and bits
Rd, Rm{, ror #rot}1111101 00100 1111 1111 Rd 10 rotate Rm0xFA4FF080 / mask 0xFFFFF0C0Sign extension of a byte (32-bit form, Rm rotated by 0/8/16/24 first)Rd = sext(rotate(Rm)[7:0])Logic and bits
sxtb16Rd, Rm{, ror #rot}also shown as: uxtb16111110100 01 U 1111 1111 Rd 1 0 rotate Rm0xFA2FF080 / mask 0xFFEFF0C0Extension of two bytes to two half words (sxt: signed, uxt: zero); Rm rotated by 0/8/16/24 firstRd = extend(ror(Rm, rot)) per half wordLogic and bits
sxthRd, Rm1011 0010 00 Rm Rd0xB200 / mask 0xFFC0Sign extension of a half wordRd = sext(Rm[15:0])Logic and bits
Rd, Rm{, ror #rot}1111101 00000 1111 1111 Rd 10 rotate Rm0xFA0FF080 / mask 0xFFFFF0C0Sign extension of a half word (32-bit form, Rm rotated by 0/8/16/24 first)Rd = sext(rotate(Rm)[15:0])Logic and bits
tbb[Rn, Rm]111010001101 Rn 1111 0000 000 0 Rm0xE8D0F000 / mask 0xFFF0FFF0Jump through a table of byte offsetspc = pc + 2 * zext([Rn + Rm])Branches and calls
tbh[Rn, Rm, lsl #1]111010001101 Rn 1111 0000 000 1 Rm0xE8D0F010 / mask 0xFFF0FFF0Jump through a table of half word offsetspc = pc + 2 * zext([Rn + 2 * Rm])Branches and calls
tstRn, Rm010000 1000 Rm Rn0x4200 / mask 0xFFC0Bitwise test (AND), only the flags changeflags = Rn & RmFlags: N ZLogic and bits
ttRd, Rnalso shown as: tta, ttt, ttat111010000100 Rn 1111 Rd A T 0000000xE840F000 / mask 0xFFF0F03FTest of the target of an address (TrustZone: security state and access rights; A: alternate, T: unprivileged)Rd = security attributes of the address RnSystem and privileged
ubfxRd, Rn, #lsb, #width11110 0 111100 Rn 0 imm3 Rd imm2 0 widthm10xF3C00000 / mask 0xFFF08020Extraction of a bitfield with zero extensionRd = zext(Rn[lsb + width - 1 : lsb])Bitfields
udf#imm8also shown as: trap1101 1110 imm80xDE00 / mask 0xFF00Deliberately undefined instruction (raises an exception)raise an undefined instruction exceptionSystem and privileged
#imm16111101111111 imm4 1010 imm120xF7F0A000 / mask 0xFFF0F000Deliberately undefined instruction (32-bit form)raise an undefined instruction exceptionSystem and privileged
udivRd, Rn, Rm111110111011 Rn 1111 Rd 1111 Rm0xFBB0F0F0 / mask 0xFFF0F0F0Unsigned division (division by 0 gives 0)Rd = Rn / RmArithmetic
umlalRdLo, RdHi, Rn, Rm111110111110 Rn RdLo RdHi 0000 Rm0xFBE00000 / mask 0xFFF000F0Unsigned multiplication to 64 bits with additionRdHi:RdLo = RdHi:RdLo + zext(Rn) * zext(Rm)Arithmetic
umullRdLo, RdHi, Rn, Rm111110111010 Rn RdLo RdHi 0000 Rm0xFBA00000 / mask 0xFFF000F0Unsigned multiplication to 64 bitsRdHi:RdLo = zext(Rn) * zext(Rm)Arithmetic
uxtbRd, Rm1011 0010 11 Rm Rd0xB2C0 / mask 0xFFC0Zero extension of a byteRd = zext(Rm[7:0])Logic and bits
Rd, Rm{, ror #rot}1111101 00101 1111 1111 Rd 10 rotate Rm0xFA5FF080 / mask 0xFFFFF0C0Zero extension of a byte (32-bit form, Rm rotated by 0/8/16/24 first)Rd = zext(rotate(Rm)[7:0])Logic and bits
uxthRd, Rm1011 0010 10 Rm Rd0xB280 / mask 0xFFC0Zero extension of a half wordRd = zext(Rm[15:0])Logic and bits
Rd, Rm{, ror #rot}1111101 00001 1111 1111 Rd 10 rotate Rm0xFA1FF080 / mask 0xFFFFF0C0Zero extension of a half word (32-bit form, Rm rotated by 0/8/16/24 first)Rd = zext(rotate(Rm)[15:0])Logic and bits
vabsVd, Vm11101110 1 D 11 0000 Vd 101 sz 1 1 M 0 Vm0xEEB00AC0 / mask 0xFFBF0ED0Floating point: absolute value (sz: 0 = single, 1 = double)Vd = abs(Vm)Floating point (VFP)
vaddVd, Vn, Vm11101110 0 D 11 Vn Vd 101 sz N 0 M 0 Vm0xEE300A00 / mask 0xFFB00E50Floating point: addition (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = Vn + VmFloating point (VFP)
vcmpVd, Vmalso shown as: vcmpe11101110 1 D 11 0100 Vd 101 sz E 1 M 0 Vm0xEEB40A40 / mask 0xFFBF0E50Floating point: comparison of two registers, sets the FPSCR flags (vcmpe: raises an exception on NaN; then vmrs apsr_nzcv, fpscr)fpscr flags = compare(Vd, Vm)Flags: N Z C V (FPSCR)Floating point (VFP)
Vd, #0.0also shown as: vcmpe11101110 1 D 11 0101 Vd 101 sz E 1 0 0 00000xEEB50A40 / mask 0xFFBF0E7FFloating point: comparison with zero, sets the FPSCR flagsfpscr flags = compare(Vd, 0.0)Flags: N Z C V (FPSCR)Floating point (VFP)
vcvtSd, Sm / Dd, Sm11101110 1 D 11 1000 Vd 101 sz op 1 M 0 Vm0xEEB80A40 / mask 0xFFBF0E50Floating point: conversion of an integer to floating point (op = 1: signed, 0: unsigned)Vd = (float) VmFloating point (VFP)
Sd, Sm / Sd, Dmalso shown as: vcvtr11101110 1 D 11 110 x Vd 101 sz op 1 M 0 Vm0xEEBC0A40 / mask 0xFFBE0E50Floating point: conversion to an integer (x = 1: signed; op = 1: vcvt, toward zero; op = 0: vcvtr, by the rounding mode)Vd = (int) VmFloating point (VFP)
Dd, Sm / Sd, Dm11101110 1 D 11 0111 Vd 101 sz 1 1 M 0 Vm0xEEB70AC0 / mask 0xFFBF0ED0Floating point: conversion between single and doubleVd = convert(Vm)Floating point (VFP)
vdivVd, Vn, Vm11101110 1 D 00 Vn Vd 101 sz N 0 M 0 Vm0xEE800A00 / mask 0xFFB00E50Floating point: division (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = Vn / VmFloating point (VFP)
vfmaVd, Vn, Vm11101110 1 D 10 Vn Vd 101 sz N 0 M 0 Vm0xEEA00A00 / mask 0xFFB00E50Floating point: fused multiplication with addition (no intermediate rounding) (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = Vd + Vn * VmFloating point (VFP)
vfmsVd, Vn, Vm11101110 1 D 10 Vn Vd 101 sz N 1 M 0 Vm0xEEA00A40 / mask 0xFFB00E50Floating point: fused multiplication with subtraction (no intermediate rounding) (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = Vd - Vn * VmFloating point (VFP)
vfnmaVd, Vn, Vm11101110 1 D 01 Vn Vd 101 sz N 1 M 0 Vm0xEE900A40 / mask 0xFFB00E50Floating point: negated fused multiplication with addition (no intermediate rounding) (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = -Vd - Vn * VmFloating point (VFP)
vfnmsVd, Vn, Vm11101110 1 D 01 Vn Vd 101 sz N 0 M 0 Vm0xEE900A00 / mask 0xFFB00E50Floating point: negated fused multiplication with subtraction (no intermediate rounding) (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = -Vd + Vn * VmFloating point (VFP)
vldmRn{!}, {Sd | Dd list}also shown as: vldmia, vpop, fldmiax1110110 0 1 D W 1 Rn Vd 101 sz imm80xEC900A00 / mask 0xFF900E00Floating point: load of several registers ascending from the address (vldmia; vpop = vldmia sp!; fldmx with an odd count)registers = [Rn ...]; optionally Rn = Rn + sizeFloating point (VFP)
vldmdbRn!, {Sd | Dd list}also shown as: fldmdbx1110110 1 0 D 1 1 Rn Vd 101 sz imm80xED300A00 / mask 0xFFB00E00Floating point: load of several registers descending below the address, Rn is decreased (vldmdb)Rn = Rn - size; registers = [Rn ...]Floating point (VFP)
vldrSd|Dd, [Rn{, #+/-imm8*4}]11101101 U D 0 1 Rn Vd 101 sz imm80xED100A00 / mask 0xFF300E00Floating point: load of a register from memory (sz: 0 = single, 1 = double)Vd = [Rn +/- imm8 * 4]Floating point (VFP)
vmlaVd, Vn, Vm11101110 0 D 00 Vn Vd 101 sz N 0 M 0 Vm0xEE000A00 / mask 0xFFB00E50Floating point: multiplication with addition to the destination (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = Vd + Vn * VmFloating point (VFP)
vmlsVd, Vn, Vm11101110 0 D 00 Vn Vd 101 sz N 1 M 0 Vm0xEE000A40 / mask 0xFFB00E50Floating point: multiplication with subtraction from the destination (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = Vd - Vn * VmFloating point (VFP)
vmovVd, Vm11101110 1 D 11 0000 Vd 101 sz 0 1 M 0 Vm0xEEB00A40 / mask 0xFFBF0ED0Floating point: copy of a floating point register (sz: 0 = single, 1 = double)Vd = VmFloating point (VFP)
Sd|Dd, #imm11101110 1 D 11 imm4H Vd 101 sz 0 0 0 0 imm4L0xEEB00A00 / mask 0xFFB00EF0Floating point: load of a constant (8-bit encoded, +-(16..31)/16 * 2^(-3..4))Vd = constantFloating point (VFP)
Sn, Rt / Rt, Sn11101110 000 op Vn Rt 1010 N 00 1 00000xEE000A10 / mask 0xFFE00F7FFloating point: copy between an integer register and a single register (bitwise)Rt = bits(Sn) or Sn = bits(Rt)Floating point (VFP)
Sm, Sm1, Rt, Rt2 / Dm, Rt, Rt211101100 010 op Rt2 Rt 101 sz 0 0 M 1 Vm0xEC400A10 / mask 0xFFE00ED0Floating point: copy between two integer registers and two single or one double registerDm = Rt2:Rt or Rt:Rt2 = DmFloating point (VFP)
Dd[x], Rt / Rt, Dn[x]11101110 0 0 x L Vn Rt 1011 N 00 1 00000xEE000B10 / mask 0xFFC00F7FFloating point: copy of a 32-bit word between an integer register and half of a double registerDd[x] = Rt or Rt = Dn[x]Floating point (VFP)
vmrsRt, FPSID|FPSCR111011101111 000 x Rt 1010 0001 00000xEEF00A10 / mask 0xFFFE0FFFCopy of a floating point system register to an integer register (with Rt = pc: to the APSR flags)Rt = system registerFloating point (VFP)
vmsrFPSID|FPSCR, Rt111011101110 000 x Rt 1010 0001 00000xEEE00A10 / mask 0xFFFE0FFFCopy of an integer register to a floating point system registersystem register = RtFloating point (VFP)
vmulVd, Vn, Vm11101110 0 D 10 Vn Vd 101 sz N 0 M 0 Vm0xEE200A00 / mask 0xFFB00E50Floating point: multiplication (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = Vn * VmFloating point (VFP)
vnegVd, Vm11101110 1 D 11 0001 Vd 101 sz 0 1 M 0 Vm0xEEB10A40 / mask 0xFFBF0ED0Floating point: sign change (sz: 0 = single, 1 = double)Vd = -VmFloating point (VFP)
vnmlaVd, Vn, Vm11101110 0 D 01 Vn Vd 101 sz N 1 M 0 Vm0xEE100A40 / mask 0xFFB00E50Floating point: negated multiplication with addition (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = -Vd - Vn * VmFloating point (VFP)
vnmlsVd, Vn, Vm11101110 0 D 01 Vn Vd 101 sz N 0 M 0 Vm0xEE100A00 / mask 0xFFB00E50Floating point: negated multiplication with subtraction (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = -Vd + Vn * VmFloating point (VFP)
vnmulVd, Vn, Vm11101110 0 D 10 Vn Vd 101 sz N 1 M 0 Vm0xEE200A40 / mask 0xFFB00E50Floating point: negated multiplication (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = -(Vn * Vm)Floating point (VFP)
vsqrtVd, Vm11101110 1 D 11 0001 Vd 101 sz 1 1 M 0 Vm0xEEB10AC0 / mask 0xFFBF0ED0Floating point: square root (sz: 0 = single, 1 = double)Vd = sqrt(Vm)Floating point (VFP)
vstmRn{!}, {Sd | Dd list}also shown as: vstmia, fstmiax1110110 0 1 D W 0 Rn Vd 101 sz imm80xEC800A00 / mask 0xFF900E00Floating point: store of several registers ascending from the address (vstmia; fstmx with an odd count)[Rn ...] = registers; optionally Rn = Rn + sizeFloating point (VFP)
vstmdbRn!, {Sd | Dd list}also shown as: vpush, fstmdbx1110110 1 0 D 1 0 Rn Vd 101 sz imm80xED200A00 / mask 0xFFB00E00Floating point: store of several registers descending below the address, Rn is decreased (vstmdb; vpush = vstmdb sp!)Rn = Rn - size; [Rn ...] = registersFloating point (VFP)
vstrSd|Dd, [Rn{, #+/-imm8*4}]11101101 U D 0 0 Rn Vd 101 sz imm80xED000A00 / mask 0xFF300E00Floating point: store of a register to memory (sz: 0 = single, 1 = double)[Rn +/- imm8 * 4] = VdFloating point (VFP)
vsubVd, Vn, Vm11101110 0 D 11 Vn Vd 101 sz N 1 M 0 Vm0xEE300A40 / mask 0xFFB00E50Floating point: subtraction (sz = 0: single, Sd/Sn/Sm; sz = 1: double, Dd/Dn/Dm)Vd = Vn - VmFloating point (VFP)
wfe1011 1111 0010 00000xBF20 / mask 0xFFFFWait for eventsleep until an eventSystem and privileged
wfi1011 1111 0011 00000xBF30 / mask 0xFFFFWait for interruptsleep until an interruptSystem and privileged
yield1011 1111 0001 00000xBF10 / mask 0xFFFFHint: spin loop, the processor may switch to another threadno change (a hint)System and privileged