ARM64 instructions (AArch64)

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

433 instructions in 635 forms: name, operands, the bit encoding of the 32-bit instruction word (fixed bits and fields) and a short description with the operation in pseudo code. Included are the integer instructions (arithmetic, logic, shifts, bitfields, branches, loads and stores, system instructions), floating point, the vector (SIMD) instructions, the atomic instructions (LSE), memory tagging (MTE), pointer authentication (PAC), CRC, memory copy and set (MOPS) and cryptography (AES, SHA, SM3, SM4). Every instruction that Dismonite decodes is included. Instructions with several names (byte and half word, acquire and release, Q = 1 with the suffix 2) share one row; the other names are listed under the operands after “also shown as”. Not included yet are the scalar forms of the vector instructions (registers B, H, S or D instead of Vn.T), the SVE and SME instructions and the half-precision floating point instructions.

How to read the table

Every ARM64 instruction is exactly 32 bits long. The encoding shows the bits from 31 (left) to 0 (right): 0101 are fixed bits (the opcode), the names are fields. Hover a field to see its range of bits. Rd, Rn, Rm, Ra are registers (number 0 to 31; 31 is sp or xzr/wzr, depending on the instruction), sf chooses 32 bits (0, W registers) or 64 bits (1, X registers), imm… is a constant, cond a condition (4 bits), shift and option choose a kind of shift or extension. Below is the value of the fixed bits and the mask in hex: an instruction word belongs to this form if (word & mask) == value, where the mask leaves the fields out.

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. Aliases: many instructions are usually written in another form (mov, cmp, lsl, cset ...); the disassembler then shows the alias name, the encoding is that of the base form. The names of the fields follow the Arm manual and are not in every case the same.

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
absVd.T, Vn.T0 Q 0 01110 size 10000 01011 10 Rn Rd0x0E20B800 / mask 0xBF3FFC00Absolute valuefor every element: Vd[i] = abs(Vn[i])Vector (SIMD)
adcRd, Rn, Rmsf 0 0 11010000 Rm 000000 Rn Rd0x1A000000 / mask 0x7FE0FC00Addition with carry (C)Rd = Rn + Rm + CArithmetic
adcsRd, Rn, Rmsf 0 1 11010000 Rm 000000 Rn Rd0x3A000000 / mask 0x7FE0FC00Addition with carry, sets the flagsRd = Rn + Rm + CFlags: N Z C VArithmetic
addRd, Rn, #imm12{, lsl #12}also shown as: mov, cmnsf 0 0 100010 sh imm12 Rn Rd0x11000000 / mask 0x7F800000Addition of a constant (12 bit, optionally shifted left by 12)Rd = Rn + (imm12 << (sh * 12)) (Rd and Rn may be SP)Arithmetic
Rd, Rn, Rm{, shift #imm6}sf 0 0 01011 shift 0 Rm imm6 Rn Rd0x0B000000 / mask 0x7F200000Addition with a shifted register (lsl, lsr, asr)Rd = Rn + shift(Rm, imm6)Arithmetic
Rd, Rn, Rm{, extend #imm3}sf 0 0 01011 00 1 Rm option imm3 Rn Rd0x0B200000 / mask 0x7FE00000Addition with an extended register (byte, half word, word)Rd = Rn + (extend(Rm) << imm3) (Rd and Rn may be SP)Arithmetic
Vd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 10000 1 Rn Rd0x0E208400 / mask 0xBF20FC00Addition of the elements (8, 16, 32 or 64 bit)for every element: Vd[i] = Vn[i] + Vm[i]Vector (SIMD)
addgXd|SP, Xn|SP, #uimm6, #uimm41 0 0 100011 0 imm6 00 imm4 Rn Rd0x91800000 / mask 0xFFC0C000Addition to an address with a change of the tagXd = Xn + uimm6 * 16, tag = (tag of Xn + uimm4) modulo 16Memory tagging (MTE)
addhnVd.Tb, Vn.Ta, Vm.Taalso shown as: addhn20 Q 0 01110 size 1 Rm 0100 00 Rn Rd0x0E204000 / mask 0xBF20FC00Addition with narrowing (high half; raddhn with rounding) (signed; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = high half of (Vn[i] + Vm[i])Vector (SIMD)
addpVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 10111 1 Rn Rd0x0E20BC00 / mask 0xBF20FC00Addition of adjacent element pairsfor every element: Vd[i] = sum of each pair of (Vn:Vm)Vector (SIMD)
addsRd, Rn, #imm12{, lsl #12}also shown as: cmnsf 0 1 100010 sh imm12 Rn Rd0x31000000 / mask 0x7F800000Addition of a constant, sets the flagsRd = Rn + (imm12 << (sh * 12))Flags: N Z C VArithmetic
Rd, Rn, Rm{, shift #imm6}also shown as: cmnsf 0 1 01011 shift 0 Rm imm6 Rn Rd0x2B000000 / mask 0x7F200000Addition with a shifted register, sets the flagsRd = Rn + shift(Rm, imm6)Flags: N Z C VArithmetic
Rd, Rn, Rm{, extend #imm3}also shown as: cmnsf 0 1 01011 00 1 Rm option imm3 Rn Rd0x2B200000 / mask 0x7FE00000Addition with an extended register, sets the flagsRd = Rn + (extend(Rm) << imm3)Flags: N Z C VArithmetic
addvVd, Vn.T0 Q 0 01110 size 11000 11011 10 Rn Rd0x0E31B800 / mask 0xBF3FFC00Sum of all elementsVd = sum of all elements of VnVector (SIMD)
adrXd, label0 immlo 10000 immhi Rd0x10000000 / mask 0x9F000000Address relative to the program counter (+-1 MB)Xd = pc + sext(immhi:immlo)Constants and addresses
adrpXd, label1 immlo 10000 immhi Rd0x90000000 / mask 0x9F000000Address of the 4 KB page relative to the program counter (+-4 GB)Xd = (pc & ~0xFFF) + (sext(immhi:immlo) << 12)Constants and addresses
aeseVd.16B, Vn.16Balso shown as: aesd, aesmc, aesimc01001110 00 10100 001 op 10 Rn Rd0x4E284800 / mask 0xFFFFCC00AES encryption: one round (aese, aesmc) or decryption (aesd, aesimc: the counterparts)aese: Vd = SubBytes(ShiftRows(Vd ^ Vn)); aesmc: Vd = MixColumns(Vn)Cryptography
andRd, Rn, #imm (bit pattern)sf 0 0 100100 N immr imms Rn Rd0x12000000 / mask 0x7F800000Bitwise AND with a bit pattern as constantRd = Rn & decode_bitmask(N, imms, immr) (Rd may be SP)Logic and bits
Rd, Rn, Rm{, shift #imm6}sf 0 0 01010 shift 0 Rm imm6 Rn Rd0x0A000000 / mask 0x7F200000Bitwise AND (register, shifted)Rd = Rn & shift(Rm, imm6)Logic and bits
Vd.T, Vn.T, Vm.T0 Q 0 01110 00 1 Rm 00011 1 Rn Rd0x0E201C00 / mask 0xBFE0FC00Bitwise AND of two vector registersVd = Vn & VmVector (SIMD)
andsRd, Rn, #imm (bit pattern)also shown as: tstsf 1 1 100100 N immr imms Rn Rd0x72000000 / mask 0x7F800000Bitwise AND with a bit pattern, sets the flagsRd = Rn & decode_bitmask(N, imms, immr); C = V = 0Flags: N Z C VLogic and bits
Rd, Rn, Rm{, shift #imm6}also shown as: tstsf 1 1 01010 shift 0 Rm imm6 Rn Rd0x6A000000 / mask 0x7F200000Bitwise AND, sets the flagsRd = Rn & shift(Rm, imm6); C = V = 0Flags: N Z C VLogic and bits
asrvRd, Rn, Rmalso shown as: asrsf 0 0 11010110 Rm 001010 Rn Rd0x1AC02800 / mask 0x7FE0FC00Shift right signed by a registerRd = Rn >>s (Rm mod width)Shift and rotate
blabel0 00101 imm260x14000000 / mask 0xFC000000Jump (relative, +-128 MB)pc = pc + sext(imm26 << 2)Branches and calls
b.condlabel0101010 0 imm19 0 cond0x54000000 / mask 0xFF000010Conditional jump (relative, +-1 MB)if cond then pc = pc + sext(imm19 << 2)Branches and calls
bclabelalso shown as: bc.eq, bc.ne, bc.hs, bc.lo, bc.mi, bc.pl, bc.vs, bc.vc, bc.hi, bc.ls, bc.ge, bc.lt, bc.gt, bc.le, bc.al, bc.nv0101010 0 imm19 1 cond0x54000010 / mask 0xFF000010Conditional branch with the hint that it is consistent (FEAT_HBC)if cond then pc = pc + imm19 * 4Jumps, calls and interrupts
bcaxVd.16B, Vn.16B, Vm.16B, Va.16B11001110 001 Rm 0 Ra Rn Rd0xCE200000 / mask 0xFFE08000Bit clear and exclusive OR (SHA-3)Vd = Vn ^ (Vm & ~Va)Cryptography
bfmRd, Rn, #immr, #immsalso shown as: bfc, bfi, bfxilsf 0 1 100110 N immr imms Rn Rd0x33000000 / mask 0x7F800000Bitfield move, the other bits of Rd stay (base form of bfi, bfxil)Rd = (Rd with the field replaced by the field of Rn)Bitfields
bicRd, Rn, Rm{, shift #imm6}sf 0 0 01010 shift 1 Rm imm6 Rn Rd0x0A200000 / mask 0x7F200000Bitwise AND with an inverted operand (bit clear)Rd = Rn & ~shift(Rm, imm6)Logic and bits
Vd.T, Vn.T, Vm.T0 Q 0 01110 01 1 Rm 00011 1 Rn Rd0x0E601C00 / mask 0xBFE0FC00Bitwise AND with an inverted operand (bit clear)Vd = Vn & ~VmVector (SIMD)
Vd.T, #imm8{, lsl #amount}0 Q 1 0111100000 abc 0 cm 1 01 defgh Rd0x2F001400 / mask 0xBFF89C00Bitwise clear with a 32-bit constant (one byte, shifted)Vd = Vd & ~(imm8 << (8 * cm))Vector (SIMD)
Vd.T, #imm8{, lsl #amount}0 Q 1 0111100000 abc 10 c 1 01 defgh Rd0x2F009400 / mask 0xBFF8DC00Bitwise clear with a 16-bit constant (one byte, shifted)Vd = Vd & ~(imm8 << (8 * c))Vector (SIMD)
bicsRd, Rn, Rm{, shift #imm6}sf 1 1 01010 shift 1 Rm imm6 Rn Rd0x6A200000 / mask 0x7F200000Bitwise AND with an inverted operand, sets the flagsRd = Rn & ~shift(Rm, imm6); C = V = 0Flags: N Z C VLogic and bits
bifVd.T, Vn.T, Vm.T0 Q 1 01110 11 1 Rm 00011 1 Rn Rd0x2EE01C00 / mask 0xBFE0FC00Bitwise insert if the bit in Vm is clearVd = (Vn & ~Vm) | (Vd & Vm)Vector (SIMD)
bitVd.T, Vn.T, Vm.T0 Q 1 01110 10 1 Rm 00011 1 Rn Rd0x2EA01C00 / mask 0xBFE0FC00Bitwise insert if the bit in Vm is setVd = (Vn & Vm) | (Vd & ~Vm)Vector (SIMD)
bllabel1 00101 imm260x94000000 / mask 0xFC000000Call of a function (relative, return address to x30)x30 = pc + 4; pc = pc + sext(imm26 << 2)Branches and calls
blrXn1101011 0 0 01 11111 000000 Rn 000000xD63F0000 / mask 0xFFFFFC1FCall of the function at the address in the registerx30 = pc + 4; pc = XnBranches and calls
blraaXn, Xm|SPalso shown as: blrab, blraaz, blrabz1101011 Z 0 01 11111 0000 1 M Rn Rm0xD63F0800 / mask 0xFEFFF800Call of an authenticated address (a = key A, b = key B, z = modifier 0)x30 = pc + 4; pc = aut(Xn, key, Xm)Pointer authentication (PAC)
brXn1101011 0 0 00 11111 000000 Rn 000000xD61F0000 / mask 0xFFFFFC1FJump to the address in the registerpc = XnBranches and calls
braaXn, Xm|SPalso shown as: brab, braaz, brabz1101011 Z 0 00 11111 0000 1 M Rn Rm0xD61F0800 / mask 0xFEFFF800Jump to an authenticated address (a = key A, b = key B, z = modifier 0)pc = aut(Xn, key, Xm); jumpPointer authentication (PAC)
brk#imm1611010100 001 imm16 000 000xD4200000 / mask 0xFFE0001FBreakpoint (debug exception)raise a breakpoint exception with imm16System and privileged
bslVd.T, Vn.T, Vm.T0 Q 1 01110 01 1 Rm 00011 1 Rn Rd0x2E601C00 / mask 0xBFE0FC00Bitwise select: the destination itself is the maskVd = (Vd & Vn) | (~Vd & Vm)Vector (SIMD)
casWs, Wt, [Xn|SP]also shown as: casa, casal, casl, casb, casab, casalb, caslb, cash, casah, casalh, caslhsize 001000 1 A 1 Rs R 11111 Rn Rt0x08A07C00 / mask 0x3FA07C00Atomic compare and swap: if the memory value equals Ws, Wt is stored; Ws receives the old value (variants: b, h, a, l)t = [Rn]; if t == Ws then [Rn] = Wt; Ws = tAtomic memory operations (LSE)
caspWs, Ws+1, Wt, Wt+1, [Xn|SP]also shown as: caspa, caspal, caspl0 sz 001000 0 A 1 Rs 0 R 11111 Rn Rt 00x08207C00 / mask 0xBFA17C01Atomic compare and swap of a register pair (variants: a = acquire, l = release)t = [Rn] (pair); if t == Ws:Ws+1 then [Rn] = Wt:Wt+1; Ws:Ws+1 = tAtomic memory operations (LSE)
cbnzRt, labelsf 011010 1 imm19 Rt0x35000000 / mask 0x7F000000Jump if the register is not 0if Rt != 0 then pc = pc + sext(imm19 << 2)Branches and calls
cbzRt, labelsf 011010 0 imm19 Rt0x34000000 / mask 0x7F000000Jump if the register is 0if Rt == 0 then pc = pc + sext(imm19 << 2)Branches and calls
ccmnRn, Rm, #nzcv, condsf 0 1 11010010 Rm cond 0 0 Rn 0 nzcv0x3A400000 / mask 0x7FE00C10Conditional compare (addition): flags from Rn + Rm, else from nzcvif cond then flags = compare(Rn + Rm) else flags = nzcvFlags: N Z C VCompare and exchange
Rn, #imm5, #nzcv, condsf 0 1 11010010 imm5 cond 1 0 Rn 0 nzcv0x3A400800 / mask 0x7FE00C10Conditional compare (addition) with a constantif cond then flags = compare(Rn + imm5) else flags = nzcvFlags: N Z C VCompare and exchange
ccmpRn, Rm, #nzcv, condsf 1 1 11010010 Rm cond 0 0 Rn 0 nzcv0x7A400000 / mask 0x7FE00C10Conditional compare (subtraction): flags from Rn - Rm, else from nzcvif cond then flags = compare(Rn - Rm) else flags = nzcvFlags: N Z C VCompare and exchange
Rn, #imm5, #nzcv, condsf 1 1 11010010 imm5 cond 1 0 Rn 0 nzcv0x7A400800 / mask 0x7FE00C10Conditional compare (subtraction) with a constantif cond then flags = compare(Rn - imm5) else flags = nzcvFlags: N Z C VCompare and exchange
clrex{#imm4}1101010100 0 00 011 0011 CRm 0 10 111110xD503305F / mask 0xFFFFF0FFClearing of the exclusive monitorclear the exclusive monitorLoads and stores
clsRd, Rnsf 1 0 11010110 00000 000101 Rn Rd0x5AC01400 / mask 0x7FFFFC00Count of the leading bits equal to the sign bitRd = count_leading_sign_bits(Rn)Logic and bits
Vd.T, Vn.T0 Q 0 01110 size 10000 00100 10 Rn Rd0x0E204800 / mask 0xBF3FFC00Count of the leading bits equal to the sign bitfor every element: Vd[i] = count_leading_sign_bits(Vn[i])Vector (SIMD)
clzRd, Rnsf 1 0 11010110 00000 000100 Rn Rd0x5AC01000 / mask 0x7FFFFC00Count of the leading zero bitsRd = count_leading_zeros(Rn)Logic and bits
Vd.T, Vn.T0 Q 1 01110 size 10000 00100 10 Rn Rd0x2E204800 / mask 0xBF3FFC00Count of the leading zerosfor every element: Vd[i] = count_leading_zeros(Vn[i])Vector (SIMD)
cmeqVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 10001 1 Rn Rd0x2E208C00 / mask 0xBF20FC00Comparison for equal, the result is a maskfor every element: Vd[i] = (Vn[i] == Vm[i]) ? all 1 bits : 0Vector (SIMD)
Vd.T, Vn.T, #00 Q 0 01110 size 10000 01001 10 Rn Rd0x0E209800 / mask 0xBF3FFC00Comparison for equal to zero, the result is a maskfor every element: Vd[i] = (Vn[i] == 0) ? all 1 bits : 0Vector (SIMD)
cmgeVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 00111 1 Rn Rd0x0E203C00 / mask 0xBF20FC00Comparison for greater or equal (signed), the result is a maskfor every element: Vd[i] = (Vn[i] >= Vm[i]) ? all 1 bits : 0Vector (SIMD)
Vd.T, Vn.T, #00 Q 1 01110 size 10000 01000 10 Rn Rd0x2E208800 / mask 0xBF3FFC00Comparison for greater than or equal to zero, the result is a maskfor every element: Vd[i] = (Vn[i] >= 0) ? all 1 bits : 0Vector (SIMD)
cmgtVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 00110 1 Rn Rd0x0E203400 / mask 0xBF20FC00Comparison for greater (signed), the result is a maskfor every element: Vd[i] = (Vn[i] > Vm[i]) ? all 1 bits : 0Vector (SIMD)
Vd.T, Vn.T, #00 Q 0 01110 size 10000 01000 10 Rn Rd0x0E208800 / mask 0xBF3FFC00Comparison for greater than zero, the result is a maskfor every element: Vd[i] = (Vn[i] > 0) ? all 1 bits : 0Vector (SIMD)
cmhiVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 00110 1 Rn Rd0x2E203400 / mask 0xBF20FC00Comparison for higher (unsigned), the result is a maskfor every element: Vd[i] = (Vn[i] > Vm[i]) ? all 1 bits : 0Vector (SIMD)
cmhsVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 00111 1 Rn Rd0x2E203C00 / mask 0xBF20FC00Comparison for higher or same (unsigned), the result is a maskfor every element: Vd[i] = (Vn[i] >= Vm[i]) ? all 1 bits : 0Vector (SIMD)
cmleVd.T, Vn.T, #00 Q 1 01110 size 10000 01001 10 Rn Rd0x2E209800 / mask 0xBF3FFC00Comparison for less than or equal to zero, the result is a maskfor every element: Vd[i] = (Vn[i] <= 0) ? all 1 bits : 0Vector (SIMD)
cmltVd.T, Vn.T, #00 Q 0 01110 size 10000 01010 10 Rn Rd0x0E20A800 / mask 0xBF3FFC00Comparison for less than zero, the result is a maskfor every element: Vd[i] = (Vn[i] < 0) ? all 1 bits : 0Vector (SIMD)
cmtstVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 10001 1 Rn Rd0x0E208C00 / mask 0xBF20FC00Test for common set bits, the result is a maskfor every element: Vd[i] = ((Vn[i] & Vm[i]) != 0) ? all 1 bits : 0Vector (SIMD)
cntVd.T, Vn.T0 Q 0 01110 00 10000 00101 10 Rn Rd0x0E205800 / mask 0xBFFFFC00Count of the set bits in every bytefor every element: Vd[i] = popcount(Vn[i])Vector (SIMD)
cpye[Xd]!, [Xs]!, Xn!also shown as: cpyewn, cpyern, cpyen, cpyewt, cpyewtwn, cpyewtrn, cpyewtn, cpyert, cpyertwn, cpyertrn, cpyertn, cpyet, cpyetwn, cpyetrn, cpyetn00 011 1 01 10 0 Rs op2 01 Rn Rd0x1D800400 / mask 0xFFE00C00Copy of a memory block, epilogue (the three instructions p, m, e are executed in sequence)copy Xn bytes from [Xs] to [Xd]; Xd, Xs, Xn are updatedMemory copy and set
cpyfe[Xd]!, [Xs]!, Xn!also shown as: cpyfewn, cpyfern, cpyfen, cpyfewt, cpyfewtwn, cpyfewtrn, cpyfewtn, cpyfert, cpyfertwn, cpyfertrn, cpyfertn, cpyfet, cpyfetwn, cpyfetrn, cpyfetn00 011 0 01 10 0 Rs op2 01 Rn Rd0x19800400 / mask 0xFFE00C00Copy of a memory block, epilogue, forward only (the three instructions p, m, e are executed in sequence)copy Xn bytes from [Xs] to [Xd]; Xd, Xs, Xn are updatedMemory copy and set
cpyfm[Xd]!, [Xs]!, Xn!also shown as: cpyfmwn, cpyfmrn, cpyfmn, cpyfmwt, cpyfmwtwn, cpyfmwtrn, cpyfmwtn, cpyfmrt, cpyfmrtwn, cpyfmrtrn, cpyfmrtn, cpyfmt, cpyfmtwn, cpyfmtrn, cpyfmtn00 011 0 01 01 0 Rs op2 01 Rn Rd0x19400400 / mask 0xFFE00C00Copy of a memory block, main part, forward only (the three instructions p, m, e are executed in sequence)copy Xn bytes from [Xs] to [Xd]; Xd, Xs, Xn are updatedMemory copy and set
cpyfp[Xd]!, [Xs]!, Xn!also shown as: cpyfpwn, cpyfprn, cpyfpn, cpyfpwt, cpyfpwtwn, cpyfpwtrn, cpyfpwtn, cpyfprt, cpyfprtwn, cpyfprtrn, cpyfprtn, cpyfpt, cpyfptwn, cpyfptrn, cpyfptn00 011 0 01 00 0 Rs op2 01 Rn Rd0x19000400 / mask 0xFFE00C00Copy of a memory block, prologue, forward only (the three instructions p, m, e are executed in sequence)copy Xn bytes from [Xs] to [Xd]; Xd, Xs, Xn are updatedMemory copy and set
cpym[Xd]!, [Xs]!, Xn!also shown as: cpymwn, cpymrn, cpymn, cpymwt, cpymwtwn, cpymwtrn, cpymwtn, cpymrt, cpymrtwn, cpymrtrn, cpymrtn, cpymt, cpymtwn, cpymtrn, cpymtn00 011 1 01 01 0 Rs op2 01 Rn Rd0x1D400400 / mask 0xFFE00C00Copy of a memory block, main part (the three instructions p, m, e are executed in sequence)copy Xn bytes from [Xs] to [Xd]; Xd, Xs, Xn are updatedMemory copy and set
cpyp[Xd]!, [Xs]!, Xn!also shown as: cpypwn, cpyprn, cpypn, cpypwt, cpypwtwn, cpypwtrn, cpypwtn, cpyprt, cpyprtwn, cpyprtrn, cpyprtn, cpypt, cpyptwn, cpyptrn, cpyptn00 011 1 01 00 0 Rs op2 01 Rn Rd0x1D000400 / mask 0xFFE00C00Copy of a memory block, prologue (the three instructions p, m, e are executed in sequence)copy Xn bytes from [Xs] to [Xd]; Xd, Xs, Xn are updatedMemory copy and set
crc32bWd, Wn, Wm0 0 0 11010110 Rm 010 0 00 Rn Rd0x1AC04000 / mask 0xFFE0FC00CRC-32 checksum (polynomial 0x04C11DB7) of a byteWd = crc32(Wn, Wm)CRC checksums
crc32cbWd, Wn, Wm0 0 0 11010110 Rm 010 1 00 Rn Rd0x1AC05000 / mask 0xFFE0FC00CRC-32C checksum (Castagnoli, polynomial 0x1EDC6F41) of a byteWd = crc32c(Wn, Wm)CRC checksums
crc32chWd, Wn, Wm0 0 0 11010110 Rm 010 1 01 Rn Rd0x1AC05400 / mask 0xFFE0FC00CRC-32C checksum (Castagnoli, polynomial 0x1EDC6F41) of a half wordWd = crc32c(Wn, Wm)CRC checksums
crc32cwWd, Wn, Wm0 0 0 11010110 Rm 010 1 10 Rn Rd0x1AC05800 / mask 0xFFE0FC00CRC-32C checksum (Castagnoli, polynomial 0x1EDC6F41) of a wordWd = crc32c(Wn, Wm)CRC checksums
crc32cxWd, Wn, Xm1 0 0 11010110 Rm 010 1 11 Rn Rd0x9AC05C00 / mask 0xFFE0FC00CRC-32C checksum (Castagnoli, polynomial 0x1EDC6F41) of a double wordWd = crc32c(Wn, Xm)CRC checksums
crc32hWd, Wn, Wm0 0 0 11010110 Rm 010 0 01 Rn Rd0x1AC04400 / mask 0xFFE0FC00CRC-32 checksum (polynomial 0x04C11DB7) of a half wordWd = crc32(Wn, Wm)CRC checksums
crc32wWd, Wn, Wm0 0 0 11010110 Rm 010 0 10 Rn Rd0x1AC04800 / mask 0xFFE0FC00CRC-32 checksum (polynomial 0x04C11DB7) of a wordWd = crc32(Wn, Wm)CRC checksums
crc32xWd, Wn, Xm1 0 0 11010110 Rm 010 0 11 Rn Rd0x9AC04C00 / mask 0xFFE0FC00CRC-32 checksum (polynomial 0x04C11DB7) of a double wordWd = crc32(Wn, Xm)CRC checksums
cselRd, Rn, Rm, condsf 0 0 11010100 Rm cond 0 0 Rn Rd0x1A800000 / mask 0x7FE00C00Conditional select (Rn if the condition holds, else Rm)Rd = cond ? Rn : RmConditional select
csincRd, Rn, Rm, condalso shown as: cinc, csetsf 0 0 11010100 Rm cond 0 1 Rn Rd0x1A800400 / mask 0x7FE00C00Conditional select, else Rm + 1 (cset, cinc)Rd = cond ? Rn : Rm + 1Conditional select
csinvRd, Rn, Rm, condalso shown as: cinv, csetmsf 1 0 11010100 Rm cond 0 0 Rn Rd0x5A800000 / mask 0x7FE00C00Conditional select, else the inverted RmRd = cond ? Rn : ~RmConditional select
csnegRd, Rn, Rm, condalso shown as: cnegsf 1 0 11010100 Rm cond 0 1 Rn Rd0x5A800400 / mask 0x7FE00C00Conditional select, else the negated RmRd = cond ? Rn : -RmConditional select
dcps1{#imm16}also shown as: dcps2, dcps311010100 101 imm16 000 opc0xD4A00000 / mask 0xFFE0001CSwitch to the debug state at exception level 1, 2 or 3 (only in debug state)enter debug state at EL1, EL2 or EL3System and privileged
dmboption1101010100 0 00 011 0011 CRm 1 01 111110xD50330BF / mask 0xFFFFF0FFMemory barrier for the order of the accessesearlier memory accesses are observed before later onesSystem and privileged
dsboptionalso shown as: ssbb, pssbb1101010100 0 00 011 0011 CRm 1 00 111110xD503309F / mask 0xFFFFF0FFMemory barrier: waits until all accesses are completewait until all earlier memory accesses are completeSystem and privileged
dupVd.T, Rnalso shown as: mov0 Q 0 01110000 imm5 0 0001 1 Rn Rd0x0E000C00 / mask 0xBFE0FC00Copy of an integer register into all elementsfor every element: Vd[i] = RnVector (SIMD)
Vd.T, Vn.Ts[index]also shown as: mov0 Q 0 01110000 imm5 0 0000 1 Rn Rd0x0E000400 / mask 0xBFE0FC00Copy of one element into all elementsfor every element: Vd[i] = Vn[index]Vector (SIMD)
eonRd, Rn, Rm{, shift #imm6}sf 1 0 01010 shift 1 Rm imm6 Rn Rd0x4A200000 / mask 0x7F200000Bitwise exclusive OR with an inverted operandRd = Rn ^ ~shift(Rm, imm6)Logic and bits
eorRd, Rn, #imm (bit pattern)sf 1 0 100100 N immr imms Rn Rd0x52000000 / mask 0x7F800000Bitwise exclusive OR with a bit pattern as constantRd = Rn ^ decode_bitmask(N, imms, immr) (Rd may be SP)Logic and bits
Rd, Rn, Rm{, shift #imm6}sf 1 0 01010 shift 0 Rm imm6 Rn Rd0x4A000000 / mask 0x7F200000Bitwise exclusive OR (register, shifted)Rd = Rn ^ shift(Rm, imm6)Logic and bits
Vd.T, Vn.T, Vm.T0 Q 1 01110 00 1 Rm 00011 1 Rn Rd0x2E201C00 / mask 0xBFE0FC00Bitwise exclusive ORVd = Vn ^ VmVector (SIMD)
eor3Vd.16B, Vn.16B, Vm.16B, Va.16B11001110 000 Rm 0 Ra Rn Rd0xCE000000 / mask 0xFFE08000Exclusive OR of three vectors (SHA-3)Vd = Vn ^ Vm ^ VaCryptography
eret1101011 0 100 11111 000000 11111 000000xD69F03E0 / mask 0xFFFFFFFFReturn from an exception (privileged)pc = ELR; PSTATE = SPSRBranches and calls
extVd.T, Vn.T, Vm.T, #index0 Q 101110 00 0 Rm 0 imm4 0 Rn Rd0x2E000000 / mask 0xBFE08400Extraction of a byte range from two concatenated vectorsVd = bytes index ... index + 15 of (Vm:Vn)Vector (SIMD)
extrRd, Rn, Rm, #lsbalso shown as: rorsf 0 0 100111 N 0 Rm imms Rn Rd0x13800000 / mask 0x7FA00000Extract from the register pair Rn:Rm from bit lsb (ror if Rn = Rm)Rd = (Rn:Rm >> imms) low halfShift and rotate
fabdVd.T, Vn.T, Vm.T0 Q 1 01110 1 sz 1 Rm 11010 1 Rn Rd0x2EA0D400 / mask 0xBFA0FC00Absolute difference of floating point elementsfor every element: Vd[i] = abs(Vn[i] - Vm[i])Vector (SIMD)
fabsFd, Fn0 0 0 11110 ftype 1 000001 10000 Rn Rd0x1E20C000 / mask 0xFF3FFC00Absolute valueFd = abs(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 0 01110 1 sz 10000 01111 10 Rn Rd0x0EA0F800 / mask 0xBFBFFC00Absolute value of floating point elementsfor every element: Vd[i] = abs(Vn[i])Vector (SIMD)
facgeVd.T, Vn.T, Vm.T0 Q 1 01110 0 sz 1 Rm 11101 1 Rn Rd0x2E20EC00 / mask 0xBFA0FC00Comparison of the absolute values for greater or equal, the result is a maskfor every element: Vd[i] = (abs(Vn[i]) >= abs(Vm[i])) ? all 1 bits : 0Vector (SIMD)
facgtVd.T, Vn.T, Vm.T0 Q 1 01110 1 sz 1 Rm 11101 1 Rn Rd0x2EA0EC00 / mask 0xBFA0FC00Comparison of the absolute values for greater, the result is a maskfor every element: Vd[i] = (abs(Vn[i]) > abs(Vm[i])) ? all 1 bits : 0Vector (SIMD)
faddFd, Fn, Fm0 0 0 11110 ftype 1 Rm 0010 10 Rn Rd0x1E202800 / mask 0xFF20FC00AdditionFd = Fn + FmFloating point (scalar)
Vd.T, Vn.T, Vm.T0 Q 0 01110 0 sz 1 Rm 11010 1 Rn Rd0x0E20D400 / mask 0xBFA0FC00Addition of floating point elements (sz: 0 = single, 1 = double)for every element: Vd[i] = Vn[i] + Vm[i]Vector (SIMD)
faddpVd.T, Vn.T, Vm.T0 Q 1 01110 0 sz 1 Rm 11010 1 Rn Rd0x2E20D400 / mask 0xBFA0FC00Addition of adjacent floating point pairsfor every element: Vd[i] = sum of each pair of (Vn:Vm)Vector (SIMD)
fcaddVd.T, Vn.T, Vm.T, #rot0 Q 1 01110 size 0 Rm 1 11 rot 0 1 Rn Rd0x2E00E400 / mask 0xBF20EC00Addition of complex numbers with a rotation by 90 or 270 degreesVd = Vn + rotate(Vm, rot)Vector (SIMD)
fccmpFn, Fm, #nzcv, cond0 0 0 11110 ftype 1 Rm cond 01 Rn 0 nzcv0x1E200400 / mask 0xFF200C10Conditional compare: flags from Fn, Fm, else from nzcvif cond then flags = compare(Fn, Fm) else flags = nzcvFlags: N Z C VFloating point (scalar)
fccmpeFn, Fm, #nzcv, cond0 0 0 11110 ftype 1 Rm cond 01 Rn 1 nzcv0x1E200410 / mask 0xFF200C10Conditional floating point comparison (with an exception on NaN)if cond then flags = compare(Fn, Fm) else flags = nzcvFlags: N Z C VFloating point (scalar)
fcmeqVd.T, Vn.T, Vm.T0 Q 0 01110 0 sz 1 Rm 11100 1 Rn Rd0x0E20E400 / mask 0xBFA0FC00Floating point comparison for equal, the result is a maskfor every element: Vd[i] = (Vn[i] == Vm[i]) ? all 1 bits : 0Vector (SIMD)
Vd.T, Vn.T, #00 Q 0 01110 1 sz 10000 01101 10 Rn Rd0x0EA0D800 / mask 0xBFBFFC00Floating point comparison with zero for equal, the result is a maskfor every element: Vd[i] = (Vn[i] == 0) ? all 1 bits : 0Vector (SIMD)
fcmgeVd.T, Vn.T, Vm.T0 Q 1 01110 0 sz 1 Rm 11100 1 Rn Rd0x2E20E400 / mask 0xBFA0FC00Floating point comparison for greater or equal, the result is a maskfor every element: Vd[i] = (Vn[i] >= Vm[i]) ? all 1 bits : 0Vector (SIMD)
Vd.T, Vn.T, #00 Q 1 01110 1 sz 10000 01100 10 Rn Rd0x2EA0C800 / mask 0xBFBFFC00Floating point comparison with zero for greater or equal, the result is a maskfor every element: Vd[i] = (Vn[i] >= 0) ? all 1 bits : 0Vector (SIMD)
fcmgtVd.T, Vn.T, Vm.T0 Q 1 01110 1 sz 1 Rm 11100 1 Rn Rd0x2EA0E400 / mask 0xBFA0FC00Floating point comparison for greater, the result is a maskfor every element: Vd[i] = (Vn[i] > Vm[i]) ? all 1 bits : 0Vector (SIMD)
Vd.T, Vn.T, #00 Q 0 01110 1 sz 10000 01100 10 Rn Rd0x0EA0C800 / mask 0xBFBFFC00Floating point comparison with zero for greater, the result is a maskfor every element: Vd[i] = (Vn[i] > 0) ? all 1 bits : 0Vector (SIMD)
fcmlaVd.T, Vn.T, Vm.T, #rot0 Q 1 01110 size 0 Rm 1 1 0 rot 1 Rn Rd0x2E00C400 / mask 0xBF20E400Multiplication of complex numbers (one partial step, rotation 0, 90, 180 or 270 degrees), added to the destinationVd = Vd + partial_product(Vn, Vm, rot)Vector (SIMD)
fcmleVd.T, Vn.T, #00 Q 1 01110 1 sz 10000 01101 10 Rn Rd0x2EA0D800 / mask 0xBFBFFC00Floating point comparison with zero for less or equal, the result is a maskfor every element: Vd[i] = (Vn[i] <= 0) ? all 1 bits : 0Vector (SIMD)
fcmltVd.T, Vn.T, #00 Q 0 01110 1 sz 10000 01110 10 Rn Rd0x0EA0E800 / mask 0xBFBFFC00Floating point comparison with zero for less, the result is a maskfor every element: Vd[i] = (Vn[i] < 0) ? all 1 bits : 0Vector (SIMD)
fcmpFn, Fm0 0 0 11110 ftype 1 Rm 001000 Rn 00 0000x1E202000 / mask 0xFF20FC1FComparison of two floating point values, sets the flagsflags = compare(Fn, Fm) (unordered: N Z C V = 0 0 1 1)Flags: N Z C VFloating point (scalar)
Fn, #0.00 0 0 11110 ftype 1 00000 001000 Rn 01 0000x1E202008 / mask 0xFF3FFC1FComparison with 0.0, sets the flagsflags = compare(Fn, 0.0)Flags: N Z C VFloating point (scalar)
fcmpeFn, Fm0 0 0 11110 ftype 1 Rm 001000 Rn 10 0000x1E202010 / mask 0xFF20FC1FComparison raising an exception on NaN (signalling), sets the flagsflags = compare(Fn, Fm)Flags: N Z C VFloating point (scalar)
fcselFd, Fn, Fm, cond0 0 0 11110 ftype 1 Rm cond 11 Rn Rd0x1E200C00 / mask 0xFF200C00Conditional select (Fn if the condition holds, else Fm)Fd = cond ? Fn : FmFloating point (scalar)
fcvtFd, Fn0 0 0 11110 ftype 1 0001 opc 10000 Rn Rd0x1E224000 / mask 0xFF3E7C00Conversion between precisions (half, single, double)Fd = convert(Fn) to the precision of FdFloating point (scalar)
fcvtasRd, Fnsf 0 0 11110 ftype 1 00 100 000000 Rn Rd0x1E240000 / mask 0x7F3FFC00Conversion to a signed integer (to nearest, ties away from zero)Rd = (int) round_half_away(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 0 01110 0 sz 10000 11100 10 Rn Rd0x0E21C800 / mask 0xBFBFFC00Conversion to a signed integer (to nearest, ties away from zero)for every element: Vd[i] = (int) round_half_away(Vn[i])Vector (SIMD)
fcvtauRd, Fnsf 0 0 11110 ftype 1 00 101 000000 Rn Rd0x1E250000 / mask 0x7F3FFC00Conversion to an unsigned integer (to nearest, ties away from zero)Rd = (uint) round_half_away(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 1 01110 0 sz 10000 11100 10 Rn Rd0x2E21C800 / mask 0xBFBFFC00Conversion to an unsigned integer (to nearest, ties away from zero)for every element: Vd[i] = (uint) round_half_away(Vn[i])Vector (SIMD)
fcvtlVd.Ta, Vn.Tbalso shown as: fcvtl20 Q 0 01110 0 sz 10000 10111 10 Rn Rd0x0E217800 / mask 0xBFBFFC00Conversion to twice the precisionfor every element: Vd[i] = convert(Vn[i]) widerVector (SIMD)
fcvtmsRd, Fnsf 0 0 11110 ftype 1 10 000 000000 Rn Rd0x1E300000 / mask 0x7F3FFC00Conversion to a signed integer (toward minus infinity)Rd = (int) floor(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 0 01110 0 sz 10000 11011 10 Rn Rd0x0E21B800 / mask 0xBFBFFC00Conversion to a signed integer (toward minus infinity)for every element: Vd[i] = (int) floor(Vn[i])Vector (SIMD)
fcvtmuRd, Fnsf 0 0 11110 ftype 1 10 001 000000 Rn Rd0x1E310000 / mask 0x7F3FFC00Conversion to an unsigned integer (toward minus infinity)Rd = (uint) floor(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 1 01110 0 sz 10000 11011 10 Rn Rd0x2E21B800 / mask 0xBFBFFC00Conversion to an unsigned integer (toward minus infinity)for every element: Vd[i] = (uint) floor(Vn[i])Vector (SIMD)
fcvtnVd.Tb, Vn.Taalso shown as: fcvtn20 Q 0 01110 0 sz 10000 10110 10 Rn Rd0x0E216800 / mask 0xBFBFFC00Conversion to half the precisionfor every element: Vd[i] = convert(Vn[i]) narrowerVector (SIMD)
fcvtnsRd, Fnsf 0 0 11110 ftype 1 00 000 000000 Rn Rd0x1E200000 / mask 0x7F3FFC00Conversion to a signed integer (to nearest, even on a tie)Rd = (int) round_to_nearest_even(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 0 01110 0 sz 10000 11010 10 Rn Rd0x0E21A800 / mask 0xBFBFFC00Conversion to a signed integer (to nearest, even on a tie)for every element: Vd[i] = (int) round_to_nearest_even(Vn[i])Vector (SIMD)
fcvtnuRd, Fnsf 0 0 11110 ftype 1 00 001 000000 Rn Rd0x1E210000 / mask 0x7F3FFC00Conversion to an unsigned integer (to nearest, even on a tie)Rd = (uint) round_to_nearest_even(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 1 01110 0 sz 10000 11010 10 Rn Rd0x2E21A800 / mask 0xBFBFFC00Conversion to an unsigned integer (to nearest, even on a tie)for every element: Vd[i] = (uint) round_to_nearest_even(Vn[i])Vector (SIMD)
fcvtpsRd, Fnsf 0 0 11110 ftype 1 01 000 000000 Rn Rd0x1E280000 / mask 0x7F3FFC00Conversion to a signed integer (toward plus infinity)Rd = (int) ceil(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 0 01110 1 sz 10000 11010 10 Rn Rd0x0EA1A800 / mask 0xBFBFFC00Conversion to a signed integer (toward plus infinity)for every element: Vd[i] = (int) ceil(Vn[i])Vector (SIMD)
fcvtpuRd, Fnsf 0 0 11110 ftype 1 01 001 000000 Rn Rd0x1E290000 / mask 0x7F3FFC00Conversion to an unsigned integer (toward plus infinity)Rd = (uint) ceil(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 1 01110 1 sz 10000 11010 10 Rn Rd0x2EA1A800 / mask 0xBFBFFC00Conversion to an unsigned integer (toward plus infinity)for every element: Vd[i] = (uint) ceil(Vn[i])Vector (SIMD)
fcvtxnVd.Tb, Vn.Taalso shown as: fcvtxn20 Q 1 01110 0 sz 10000 10110 10 Rn Rd0x2E216800 / mask 0xBFBFFC00Conversion to half the precision (round to odd)for every element: Vd[i] = convert_round_to_odd(Vn[i])Vector (SIMD)
fcvtzsRd, Fnsf 0 0 11110 ftype 1 11 000 000000 Rn Rd0x1E380000 / mask 0x7F3FFC00Conversion to a signed integer (truncated, toward zero)Rd = (int) trunc(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 0 01110 1 sz 10000 11011 10 Rn Rd0x0EA1B800 / mask 0xBFBFFC00Conversion to a signed integer (toward zero)for every element: Vd[i] = (int) trunc(Vn[i])Vector (SIMD)
fcvtzuRd, Fnsf 0 0 11110 ftype 1 11 001 000000 Rn Rd0x1E390000 / mask 0x7F3FFC00Conversion to an unsigned integer (truncated, toward zero)Rd = (uint) trunc(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 1 01110 1 sz 10000 11011 10 Rn Rd0x2EA1B800 / mask 0xBFBFFC00Conversion to an unsigned integer (toward zero)for every element: Vd[i] = (uint) trunc(Vn[i])Vector (SIMD)
fdivFd, Fn, Fm0 0 0 11110 ftype 1 Rm 0001 10 Rn Rd0x1E201800 / mask 0xFF20FC00DivisionFd = Fn / FmFloating point (scalar)
Vd.T, Vn.T, Vm.T0 Q 1 01110 0 sz 1 Rm 11111 1 Rn Rd0x2E20FC00 / mask 0xBFA0FC00Division of floating point elementsfor every element: Vd[i] = Vn[i] / Vm[i]Vector (SIMD)
fjcvtzsWd, Dn0 0 0 11110 01 1 11 110 000000 Rn Rd0x1E7E0000 / mask 0xFFFFFC00Conversion to an integer by JavaScript rules (result modulo 2^32)Wd = javascript_to_int32(Dn)Flags: N Z C VPointer authentication (PAC)
fmaddFd, Fn, Fm, Fa0 0 0 11111 ftype 0 Rm 0 Ra Rn Rd0x1F000000 / mask 0xFF208000Multiply and add (fused, Fa + Fn * Fm)Fd = Fa + Fn * FmFloating point (scalar)
fmaxFd, Fn, Fm0 0 0 11110 ftype 1 Rm 0100 10 Rn Rd0x1E204800 / mask 0xFF20FC00Maximum (NaN propagates)Fd = max(Fn, Fm)Floating point (scalar)
Vd.T, Vn.T, Vm.T0 Q 0 01110 0 sz 1 Rm 11110 1 Rn Rd0x0E20F400 / mask 0xBFA0FC00Maximum of floating point elementsfor every element: Vd[i] = max(Vn[i], Vm[i])Vector (SIMD)
fmaxnmFd, Fn, Fm0 0 0 11110 ftype 1 Rm 0110 10 Rn Rd0x1E206800 / mask 0xFF20FC00Maximum (a number wins against NaN)Fd = maxnum(Fn, Fm)Floating point (scalar)
Vd.T, Vn.T, Vm.T0 Q 0 01110 0 sz 1 Rm 11000 1 Rn Rd0x0E20C400 / mask 0xBFA0FC00Maximum of floating point elements (a number wins against NaN)for every element: Vd[i] = maxnum(Vn[i], Vm[i])Vector (SIMD)
fmaxnmpVd.T, Vn.T, Vm.T0 Q 1 01110 0 sz 1 Rm 11000 1 Rn Rd0x2E20C400 / mask 0xBFA0FC00Maximum of adjacent floating point pairs (a number wins against NaN)for every element: Vd[i] = maxnum of each pair of (Vn:Vm)Vector (SIMD)
fmaxnmvSd, Vn.4S0 1 1 01110 0 0 11000 01100 10 Rn Rd0x6E30C800 / mask 0xFFFFFC00Maximum of all floating point elements (a number wins against NaN)Sd = maxnum of all elements of VnVector (SIMD)
fmaxpVd.T, Vn.T, Vm.T0 Q 1 01110 0 sz 1 Rm 11110 1 Rn Rd0x2E20F400 / mask 0xBFA0FC00Maximum of adjacent floating point pairsfor every element: Vd[i] = max of each pair of (Vn:Vm)Vector (SIMD)
fmaxvSd, Vn.4S0 1 1 01110 0 0 11000 01111 10 Rn Rd0x6E30F800 / mask 0xFFFFFC00Maximum of all floating point elementsSd = max of all elements of VnVector (SIMD)
fminFd, Fn, Fm0 0 0 11110 ftype 1 Rm 0101 10 Rn Rd0x1E205800 / mask 0xFF20FC00Minimum (NaN propagates)Fd = min(Fn, Fm)Floating point (scalar)
Vd.T, Vn.T, Vm.T0 Q 0 01110 1 sz 1 Rm 11110 1 Rn Rd0x0EA0F400 / mask 0xBFA0FC00Minimum of floating point elementsfor every element: Vd[i] = min(Vn[i], Vm[i])Vector (SIMD)
fminnmFd, Fn, Fm0 0 0 11110 ftype 1 Rm 0111 10 Rn Rd0x1E207800 / mask 0xFF20FC00Minimum (a number wins against NaN)Fd = minnum(Fn, Fm)Floating point (scalar)
Vd.T, Vn.T, Vm.T0 Q 0 01110 1 sz 1 Rm 11000 1 Rn Rd0x0EA0C400 / mask 0xBFA0FC00Minimum of floating point elements (a number wins against NaN)for every element: Vd[i] = minnum(Vn[i], Vm[i])Vector (SIMD)
fminnmpVd.T, Vn.T, Vm.T0 Q 1 01110 1 sz 1 Rm 11000 1 Rn Rd0x2EA0C400 / mask 0xBFA0FC00Minimum of adjacent floating point pairs (a number wins against NaN)for every element: Vd[i] = minnum of each pair of (Vn:Vm)Vector (SIMD)
fminnmvSd, Vn.4S0 1 1 01110 1 0 11000 01100 10 Rn Rd0x6EB0C800 / mask 0xFFFFFC00Minimum of all floating point elements (a number wins against NaN)Sd = minnum of all elements of VnVector (SIMD)
fminpVd.T, Vn.T, Vm.T0 Q 1 01110 1 sz 1 Rm 11110 1 Rn Rd0x2EA0F400 / mask 0xBFA0FC00Minimum of adjacent floating point pairsfor every element: Vd[i] = min of each pair of (Vn:Vm)Vector (SIMD)
fminvSd, Vn.4S0 1 1 01110 1 0 11000 01111 10 Rn Rd0x6EB0F800 / mask 0xFFFFFC00Minimum of all floating point elementsSd = min of all elements of VnVector (SIMD)
fmlaVd.T, Vn.T, Vm.T0 Q 0 01110 0 sz 1 Rm 11001 1 Rn Rd0x0E20CC00 / mask 0xBFA0FC00Multiplication with addition to the destination (floating point)for every element: Vd[i] = Vd[i] + Vn[i] * Vm[i]Vector (SIMD)
Vd.T, Vn.T, Vm.Ts[index]0 Q 0 01111 1 sz L M Rm 0001 H 0 Rn Rd0x0F801000 / mask 0xBF80F400Floating point multiplication by an element, added to the destinationfor every element: Vd[i] = Vd[i] + Vn[i] * Vm[index]Vector (SIMD)
fmlalVd.2S, Vn.2H, Vm.2H0 Q 0 01110 0 0 1 Rm 11101 1 Rn Rd0x0E20EC00 / mask 0xBFE0FC00Multiplication of half-precision numbers with widening to single, added to the destination (low half)for every element: Vd[i] = Vd[i] + float(Vn[i]) * float(Vm[i])Vector (SIMD)
fmlal2Vd.2S, Vn.2H, Vm.2H0 Q 1 01110 0 0 1 Rm 11001 1 Rn Rd0x2E20CC00 / mask 0xBFE0FC00Like fmlal, but with the high half of the sourcesfor every element: Vd[i] = Vd[i] + float(Vn[i + n]) * float(Vm[i + n])Vector (SIMD)
fmlsVd.T, Vn.T, Vm.T0 Q 0 01110 1 sz 1 Rm 11001 1 Rn Rd0x0EA0CC00 / mask 0xBFA0FC00Multiplication with subtraction from the destination (floating point)for every element: Vd[i] = Vd[i] - Vn[i] * Vm[i]Vector (SIMD)
Vd.T, Vn.T, Vm.Ts[index]0 Q 0 01111 1 sz L M Rm 0101 H 0 Rn Rd0x0F805000 / mask 0xBF80F400Floating point multiplication by an element, subtracted from the destinationfor every element: Vd[i] = Vd[i] - Vn[i] * Vm[index]Vector (SIMD)
fmlslVd.2S, Vn.2H, Vm.2H0 Q 0 01110 1 0 1 Rm 11101 1 Rn Rd0x0EA0EC00 / mask 0xBFE0FC00Multiplication of half-precision numbers with widening to single, subtracted from the destination (low half)for every element: Vd[i] = Vd[i] - float(Vn[i]) * float(Vm[i])Vector (SIMD)
fmlsl2Vd.2S, Vn.2H, Vm.2H0 Q 1 01110 1 0 1 Rm 11001 1 Rn Rd0x2EA0CC00 / mask 0xBFE0FC00Like fmlsl, but with the high half of the sourcesfor every element: Vd[i] = Vd[i] - float(Vn[i + n]) * float(Vm[i + n])Vector (SIMD)
fmovFd, Fn0 0 0 11110 ftype 1 000000 10000 Rn Rd0x1E204000 / mask 0xFF3FFC00Copy of a floating point registerFd = FnFloating point (scalar)
Fd, #imm0 0 0 11110 ftype 1 imm8 100 00000 Rd0x1E201000 / mask 0xFF201FE0Load of a floating point constant (encoded in 8 bits: +-n/16 * 2^r)Fd = expand_imm(imm8)Floating point (scalar)
Wd, Sn0 0 0 11110 00 1 00 110 000000 Rn Rd0x1E260000 / mask 0xFFFFFC00Bitwise copy of a single register to an integer registerWd = bits(Sn)Floating point (scalar)
Sd, Wn0 0 0 11110 00 1 00 111 000000 Rn Rd0x1E270000 / mask 0xFFFFFC00Bitwise copy of an integer register to a single registerSd = bits(Wn)Floating point (scalar)
Xd, Dn1 0 0 11110 01 1 00 110 000000 Rn Rd0x9E660000 / mask 0xFFFFFC00Bitwise copy of a double register to an integer registerXd = bits(Dn)Floating point (scalar)
Dd, Xn1 0 0 11110 01 1 00 111 000000 Rn Rd0x9E670000 / mask 0xFFFFFC00Bitwise copy of an integer register to a double registerDd = bits(Xn)Floating point (scalar)
Vd.T, #imm8{, lsl #amount}0 Q 0 0111100000 abc 1111 01 defgh Rd0x0F00F400 / mask 0xBFF8FC00Load of a floating point constant (single) into all elementsVd = fp_const(imm8)Vector (SIMD)
Vd.T, #imm8{, lsl #amount}0 Q 1 0111100000 abc 1111 01 defgh Rd0x2F00F400 / mask 0xBFF8FC00Load of a floating point constant (double) into both halvesVd = fp_const(imm8)Vector (SIMD)
fmsubFd, Fn, Fm, Fa0 0 0 11111 ftype 0 Rm 1 Ra Rn Rd0x1F008000 / mask 0xFF208000Multiply and subtract (fused, Fa - Fn * Fm)Fd = Fa - Fn * FmFloating point (scalar)
fmulFd, Fn, Fm0 0 0 11110 ftype 1 Rm 0000 10 Rn Rd0x1E200800 / mask 0xFF20FC00MultiplicationFd = Fn * FmFloating point (scalar)
Vd.T, Vn.T, Vm.T0 Q 1 01110 0 sz 1 Rm 11011 1 Rn Rd0x2E20DC00 / mask 0xBFA0FC00Multiplication of floating point elementsfor every element: Vd[i] = Vn[i] * Vm[i]Vector (SIMD)
Vd.T, Vn.T, Vm.Ts[index]0 Q 0 01111 1 sz L M Rm 1001 H 0 Rn Rd0x0F809000 / mask 0xBF80F400Floating point multiplication by an elementfor every element: Vd[i] = Vn[i] * Vm[index]Vector (SIMD)
fmulxVd.T, Vn.T, Vm.T0 Q 0 01110 0 sz 1 Rm 11011 1 Rn Rd0x0E20DC00 / mask 0xBFA0FC00Multiplication of floating point elements (0 times infinity gives 2)for every element: Vd[i] = Vn[i] * Vm[i]Vector (SIMD)
Vd.T, Vn.T, Vm.Ts[index]0 Q 1 01111 1 sz L M Rm 1001 H 0 Rn Rd0x2F809000 / mask 0xBF80F400Floating point multiplication by an element (0 times infinity gives 2)for every element: Vd[i] = Vn[i] * Vm[index]Vector (SIMD)
fnegFd, Fn0 0 0 11110 ftype 1 000010 10000 Rn Rd0x1E214000 / mask 0xFF3FFC00Sign changeFd = -FnFloating point (scalar)
Vd.T, Vn.T0 Q 1 01110 1 sz 10000 01111 10 Rn Rd0x2EA0F800 / mask 0xBFBFFC00Sign change of floating point elementsfor every element: Vd[i] = -Vn[i]Vector (SIMD)
fnmaddFd, Fn, Fm, Fa0 0 0 11111 ftype 1 Rm 0 Ra Rn Rd0x1F200000 / mask 0xFF208000Negated multiply and add (fused)Fd = -Fa - Fn * FmFloating point (scalar)
fnmsubFd, Fn, Fm, Fa0 0 0 11111 ftype 1 Rm 1 Ra Rn Rd0x1F208000 / mask 0xFF208000Negated multiply and subtract (fused)Fd = -Fa + Fn * FmFloating point (scalar)
fnmulFd, Fn, Fm0 0 0 11110 ftype 1 Rm 1000 10 Rn Rd0x1E208800 / mask 0xFF20FC00Multiplication with sign changeFd = -(Fn * Fm)Floating point (scalar)
frecpeVd.T, Vn.T0 Q 0 01110 1 sz 10000 11101 10 Rn Rd0x0EA1D800 / mask 0xBFBFFC00Estimate of the reciprocalfor every element: Vd[i] = estimate(1 / Vn[i])Vector (SIMD)
frecpsVd.T, Vn.T, Vm.T0 Q 0 01110 0 sz 1 Rm 11111 1 Rn Rd0x0E20FC00 / mask 0xBFA0FC00Step of the Newton-Raphson iteration for the reciprocalfor every element: Vd[i] = 2 - Vn[i] * Vm[i]Vector (SIMD)
frecpxFd, Fn01 0 11110 1 sz 10000 11111 10 Rn Rd0x5EA1F800 / mask 0xFFBFFC00Estimate of the reciprocal of an exponent (scalar)Fd = reciprocal_exponent(Fn)Floating point (scalar)
frint32xVd.T, Vn.T0 Q 1 01110 0 sz 10000 11110 10 Rn Rd0x2E21E800 / mask 0xBFBFFC00Rounding to an integer value that fits 32 bits (by the current rounding mode)for every element: Vd[i] = round32(Vn[i])Vector (SIMD)
frint32zVd.T, Vn.T0 Q 0 01110 0 sz 10000 11110 10 Rn Rd0x0E21E800 / mask 0xBFBFFC00Rounding to an integer value that fits 32 bits (toward zero)for every element: Vd[i] = trunc32(Vn[i])Vector (SIMD)
frint64xVd.T, Vn.T0 Q 1 01110 0 sz 10000 11111 10 Rn Rd0x2E21F800 / mask 0xBFBFFC00Rounding to an integer value that fits 64 bits (by the current rounding mode)for every element: Vd[i] = round64(Vn[i])Vector (SIMD)
frint64zVd.T, Vn.T0 Q 0 01110 0 sz 10000 11111 10 Rn Rd0x0E21F800 / mask 0xBFBFFC00Rounding to an integer value that fits 64 bits (toward zero)for every element: Vd[i] = trunc64(Vn[i])Vector (SIMD)
frintaFd, Fn0 0 0 11110 ftype 1 001100 10000 Rn Rd0x1E264000 / mask 0xFF3FFC00Rounding to an integer value (to nearest, ties away from zero)Fd = round_half_away(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 1 01110 0 sz 10000 11000 10 Rn Rd0x2E218800 / mask 0xBFBFFC00Rounding to an integer value (to nearest, ties away from zero)for every element: Vd[i] = round_half_away(Vn[i])Vector (SIMD)
frintiFd, Fn0 0 0 11110 ftype 1 001111 10000 Rn Rd0x1E27C000 / mask 0xFF3FFC00Rounding to an integer value (mode of the control register)Fd = round(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 1 01110 1 sz 10000 11001 10 Rn Rd0x2EA19800 / mask 0xBFBFFC00Rounding to an integer value (by the current rounding mode)for every element: Vd[i] = round(Vn[i])Vector (SIMD)
frintmFd, Fn0 0 0 11110 ftype 1 001010 10000 Rn Rd0x1E254000 / mask 0xFF3FFC00Rounding to an integer value (toward minus infinity)Fd = floor(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 0 01110 0 sz 10000 11001 10 Rn Rd0x0E219800 / mask 0xBFBFFC00Rounding to an integer value (toward minus infinity)for every element: Vd[i] = floor(Vn[i])Vector (SIMD)
frintnFd, Fn0 0 0 11110 ftype 1 001000 10000 Rn Rd0x1E244000 / mask 0xFF3FFC00Rounding to an integer value (to nearest, even on a tie)Fd = round_to_nearest_even(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 0 01110 0 sz 10000 11000 10 Rn Rd0x0E218800 / mask 0xBFBFFC00Rounding to an integer value (to nearest, even on a tie)for every element: Vd[i] = round_to_nearest_even(Vn[i])Vector (SIMD)
frintpFd, Fn0 0 0 11110 ftype 1 001001 10000 Rn Rd0x1E24C000 / mask 0xFF3FFC00Rounding to an integer value (toward plus infinity)Fd = ceil(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 0 01110 1 sz 10000 11000 10 Rn Rd0x0EA18800 / mask 0xBFBFFC00Rounding to an integer value (toward plus infinity)for every element: Vd[i] = ceil(Vn[i])Vector (SIMD)
frintxFd, Fn0 0 0 11110 ftype 1 001110 10000 Rn Rd0x1E274000 / mask 0xFF3FFC00Rounding to an integer value (mode of the control register, signals inexact)Fd = round(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 1 01110 0 sz 10000 11001 10 Rn Rd0x2E219800 / mask 0xBFBFFC00Rounding to an integer value (by the current rounding mode, raising an inexact exception)for every element: Vd[i] = round(Vn[i])Vector (SIMD)
frintzFd, Fn0 0 0 11110 ftype 1 001011 10000 Rn Rd0x1E25C000 / mask 0xFF3FFC00Rounding to an integer value (toward zero)Fd = trunc(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 0 01110 1 sz 10000 11001 10 Rn Rd0x0EA19800 / mask 0xBFBFFC00Rounding to an integer value (toward zero)for every element: Vd[i] = trunc(Vn[i])Vector (SIMD)
frsqrteVd.T, Vn.T0 Q 1 01110 1 sz 10000 11101 10 Rn Rd0x2EA1D800 / mask 0xBFBFFC00Estimate of the reciprocal square rootfor every element: Vd[i] = estimate(1 / sqrt(Vn[i]))Vector (SIMD)
frsqrtsVd.T, Vn.T, Vm.T0 Q 0 01110 1 sz 1 Rm 11111 1 Rn Rd0x0EA0FC00 / mask 0xBFA0FC00Step of the Newton-Raphson iteration for the reciprocal square rootfor every element: Vd[i] = (3 - Vn[i] * Vm[i]) / 2Vector (SIMD)
fsqrtFd, Fn0 0 0 11110 ftype 1 000011 10000 Rn Rd0x1E21C000 / mask 0xFF3FFC00Square rootFd = sqrt(Fn)Floating point (scalar)
Vd.T, Vn.T0 Q 1 01110 1 sz 10000 11111 10 Rn Rd0x2EA1F800 / mask 0xBFBFFC00Square root of floating point elementsfor every element: Vd[i] = sqrt(Vn[i])Vector (SIMD)
fsubFd, Fn, Fm0 0 0 11110 ftype 1 Rm 0011 10 Rn Rd0x1E203800 / mask 0xFF20FC00SubtractionFd = Fn - FmFloating point (scalar)
Vd.T, Vn.T, Vm.T0 Q 0 01110 1 sz 1 Rm 11010 1 Rn Rd0x0EA0D400 / mask 0xBFA0FC00Subtraction of floating point elementsfor every element: Vd[i] = Vn[i] - Vm[i]Vector (SIMD)
gmiXd, Xn|SP, Xm1 0 0 11010110 Rm 000101 Rn Rd0x9AC01400 / mask 0xFFE0FC00Insertion of a tag into an exclude maskXd = Xm | (1 << tag of Xn)Memory tagging (MTE)
hint#imm7also shown as: nop, yield, wfe, wfi, sev, sevl, bti, csdb, esb, psb, tsb1101010100 0 00 011 0010 CRm op2 111110xD503201F / mask 0xFFFFF01FHint to the processor (nop, yield, wfe, wfi, sev, bti ...)no change of the program (a hint)System and privileged
hlt#imm1611010100 010 imm16 000 000xD4400000 / mask 0xFFE0001FHalt for a debuggerenter debug stateSystem and privileged
hvc#imm1611010100 000 imm16 000 100xD4000002 / mask 0xFFE0001FHypervisor call (exception level 2)raise a hypervisor call exceptionSystem and privileged
insVd.Ts[index], Rnalso shown as: mov0 1 0 01110000 imm5 0 0011 1 Rn Rd0x4E001C00 / mask 0xFFE0FC00Insertion of an integer register into one elementVd[index] = RnVector (SIMD)
irgXd|SP, Xn|SP{, Xm}1 0 0 11010110 Rm 000100 Rn Rd0x9AC01000 / mask 0xFFE0FC00Insertion of a random tag into an addressXd = Xn with a random tag (not in the exclude mask Xm)Memory tagging (MTE)
isb{#imm4}1101010100 0 00 011 0011 CRm 1 10 111110xD50330DF / mask 0xFFFFF0FFInstruction barrier: flushes the pipelineall instructions after it are fetched anewSystem and privileged
ld1{Vt.T}, [Xn|SP]0 Q 0011000 1 000000 0111 size Rn Rt0x0C407000 / mask 0xBFFFF000Load of one vector register from memoryVt = [Rn]Vector (SIMD)
{Vt.T, Vt2.T}, [Xn|SP]0 Q 0011000 1 000000 1010 size Rn Rt0x0C40A000 / mask 0xBFFFF000Load of 2 registers from memoryregisters = [Rn] (2 registers)Vector (SIMD)
{Vt.T, Vt2.T, Vt3.T}, [Xn|SP]0 Q 0011000 1 000000 0110 size Rn Rt0x0C406000 / mask 0xBFFFF000Load of 3 registers from memoryregisters = [Rn] (3 registers)Vector (SIMD)
{Vt.T, Vt2.T, Vt3.T, Vt4.T}, [Xn|SP]0 Q 0011000 1 000000 0010 size Rn Rt0x0C402000 / mask 0xBFFFF000Load of 4 registers from memoryregisters = [Rn] (4 registers)Vector (SIMD)
{Vt.Ts}[index], [Xn|SP]0 Q 0011010 1 0 00000 e 0 S size Rn Rt0x0D400000 / mask 0xBFFF2000Load of one element (lane) (one register)Vt[index] = [Rn]Vector (SIMD)
ld1r{Vt.T}, [Xn|SP]0 Q 0011010 1 0 00000 110 0 size Rn Rt0x0D40C000 / mask 0xBFFFF000Load of one element from memory into all elements of 1 registers (replicate)every element of every register = [Rn]Vector (SIMD)
ld2{Vt.T, Vt2.T}, [Xn|SP]0 Q 0011000 1 000000 1000 size Rn Rt0x0C408000 / mask 0xBFFFF000Load of 2 registers (elements interleaved) from memoryregisters = [Rn] (2 registers (elements interleaved))Vector (SIMD)
{Vt.T, Vt2.T}, [Xn|SP], Xm|#imm0 Q 0011001 1 0 Rm 1000 size Rn Rt0x0CC08000 / mask 0xBFE0F000Load of 2 registers (elements interleaved) with post-indexingregisters = [Rn]; Rn = Rn + Xm or the sizeVector (SIMD)
{Vt.Ts, Vt2.Ts}[index], [Xn|SP]0 Q 0011010 1 1 00000 e 0 S size Rn Rt0x0D600000 / mask 0xBFFF2000Load of one element (lane) of 2 registersVt[index] = [Rn]Vector (SIMD)
ld2r{Vt.T, Vt2.T}, [Xn|SP]0 Q 0011010 1 1 00000 110 0 size Rn Rt0x0D60C000 / mask 0xBFFFF000Load of one element from memory into all elements of 2 registers (replicate)every element of every register = [Rn]Vector (SIMD)
ld3{Vt.T, Vt2.T, Vt3.T}, [Xn|SP]0 Q 0011000 1 000000 0100 size Rn Rt0x0C404000 / mask 0xBFFFF000Load of 3 registers (elements interleaved) from memoryregisters = [Rn] (3 registers (elements interleaved))Vector (SIMD)
{Vt.T, Vt2.T, Vt3.T}, [Xn|SP], Xm|#imm0 Q 0011001 1 0 Rm 0100 size Rn Rt0x0CC04000 / mask 0xBFE0F000Load of 3 registers (elements interleaved) with post-indexingregisters = [Rn]; Rn = Rn + Xm or the sizeVector (SIMD)
{Vt.Ts, Vt2.Ts, Vt3.Ts}[index], [Xn|SP]0 Q 0011010 1 0 00000 e 1 S size Rn Rt0x0D402000 / mask 0xBFFF2000Load of one element (lane) of 3 registersVt[index] = [Rn]Vector (SIMD)
ld3r{Vt.T, Vt2.T, Vt3.T}, [Xn|SP]0 Q 0011010 1 0 00000 111 0 size Rn Rt0x0D40E000 / mask 0xBFFFF000Load of one element from memory into all elements of 3 registers (replicate)every element of every register = [Rn]Vector (SIMD)
ld4{Vt.T, Vt2.T, Vt3.T, Vt4.T}, [Xn|SP]0 Q 0011000 1 000000 0000 size Rn Rt0x0C400000 / mask 0xBFFFF000Load of 4 registers (elements interleaved) from memoryregisters = [Rn] (4 registers (elements interleaved))Vector (SIMD)
{Vt.T, Vt2.T, Vt3.T, Vt4.T}, [Xn|SP], Xm|#imm0 Q 0011001 1 0 Rm 0000 size Rn Rt0x0CC00000 / mask 0xBFE0F000Load of 4 registers (elements interleaved) with post-indexingregisters = [Rn]; Rn = Rn + Xm or the sizeVector (SIMD)
{Vt.Ts, Vt2.Ts, Vt3.Ts, Vt4.Ts}[index], [Xn|SP]0 Q 0011010 1 1 00000 e 1 S size Rn Rt0x0D602000 / mask 0xBFFF2000Load of one element (lane) of 4 registersVt[index] = [Rn]Vector (SIMD)
ld4r{Vt.T, Vt2.T, Vt3.T, Vt4.T}, [Xn|SP]0 Q 0011010 1 1 00000 111 0 size Rn Rt0x0D60E000 / mask 0xBFFFF000Load of one element from memory into all elements of 4 registers (replicate)every element of every register = [Rn]Vector (SIMD)
ldaddWs, Wt, [Xn|SP]also shown as: ldadda, ldaddal, ldaddl, ldaddb, ldaddab, ldaddalb, ldaddlb, ldaddh, ldaddah, ldaddalh, ldaddlh, staddb, staddh, stadd, staddl, staddlb, staddlhsize 111 0 00 A R 1 Rs 0 000 00 Rn Rt0x38200000 / mask 0x3F20FC00Atomic memory operation: Addition of the memory value and a register, the old value goes to the destination register (variants: b = byte, h = half word, a = acquire, l = release, st... without a destination register)t = [Rn]; [Rn] = t + Ws; Wt = tAtomic memory operations (LSE)
ldaprWt, [Xn|SP]also shown as: ldaprb, ldaprhsize 111 0 00 1 0 1 11111 1 100 00 Rn Rt0x38BFC000 / mask 0x3FFFFC00Load with release consistency (acquire for earlier accesses only, RCpc variant; b = byte, h = half word)Wt = [Rn]Loads and stores
ldapurWt, [Xn|SP{, #imm9}]also shown as: ldapurb, ldapurhsize 011 001 01 0 imm9 00 Rn Rt0x19400000 / mask 0x3FE00C00Load with acquire (RCpc, unscaled, address: Rn + imm9; b = byte, h = half word)Wt = [Rn + imm9]Loads and stores
ldapursbXt, [Xn|SP{, #imm9}]also shown as: ldapursh, ldapurswsize 011 001 10 0 imm9 00 Rn Rt0x19800000 / mask 0x3FE00C00Load with acquire (RCpc), sign-extended to 64 bit (b = byte, h = half word, w = word)Xt = sext([Rn + imm9])Loads and stores
ldarWt, [Xn|SP]10 001000 1 1 0 11111 1 11111 Rn Rt0x88DFFC00 / mask 0xFFFFFC00Load with acquire (word)Rt = [Rn]; acquireLoads and stores
Xt, [Xn|SP]11 001000 1 1 0 11111 1 11111 Rn Rt0xC8DFFC00 / mask 0xFFFFFC00Load with acquire (double word)Rt = [Rn]; acquireLoads and stores
ldarbWt, [Xn|SP]00 001000 1 1 0 11111 1 11111 Rn Rt0x08DFFC00 / mask 0xFFFFFC00Load with acquire (byte)Rt = [Rn]; acquireLoads and stores
ldarhWt, [Xn|SP]01 001000 1 1 0 11111 1 11111 Rn Rt0x48DFFC00 / mask 0xFFFFFC00Load with acquire (half word)Rt = [Rn]; acquireLoads and stores
ldaxpRt, Rt2, [Xn|SP]1 sz 001000 0 1 1 11111 1 Rt2 Rn Rt0x887F8000 / mask 0xBFFF8000Load of a register pair (exclusive) with acquireRt = [Rn]; Rt2 = [Rn + size]; acquire; set the exclusive monitorLoads and stores
ldaxrWt, [Xn|SP]10 001000 0 1 0 11111 1 11111 Rn Rt0x885FFC00 / mask 0xFFFFFC00Load-exclusive with acquire (word)Rt = [Rn]; acquire; set the exclusive monitorLoads and stores
Xt, [Xn|SP]11 001000 0 1 0 11111 1 11111 Rn Rt0xC85FFC00 / mask 0xFFFFFC00Load-exclusive with acquire (double word)Rt = [Rn]; acquire; set the exclusive monitorLoads and stores
ldaxrbWt, [Xn|SP]00 001000 0 1 0 11111 1 11111 Rn Rt0x085FFC00 / mask 0xFFFFFC00Load-exclusive with acquire (byte)Rt = [Rn]; acquire; set the exclusive monitorLoads and stores
ldaxrhWt, [Xn|SP]01 001000 0 1 0 11111 1 11111 Rn Rt0x485FFC00 / mask 0xFFFFFC00Load-exclusive with acquire (half word)Rt = [Rn]; acquire; set the exclusive monitorLoads and stores
ldclrWs, Wt, [Xn|SP]also shown as: ldclra, ldclral, ldclrl, ldclrb, ldclrab, ldclralb, ldclrlb, ldclrh, ldclrah, ldclralh, ldclrlh, stclrb, stclrh, stclr, stclrl, stclrlb, stclrlhsize 111 0 00 A R 1 Rs 0 001 00 Rn Rt0x38201000 / mask 0x3F20FC00Atomic memory operation: Clearing of bits (AND with the inverted operand) of the memory value and a register, the old value goes to the destination register (variants: b = byte, h = half word, a = acquire, l = release, st... without a destination register)t = [Rn]; [Rn] = t & ~Ws; Wt = tAtomic memory operations (LSE)
ldeorWs, Wt, [Xn|SP]also shown as: ldeora, ldeoral, ldeorl, ldeorb, ldeorab, ldeoralb, ldeorlb, ldeorh, ldeorah, ldeoralh, ldeorlh, steorb, steorh, steor, steorl, steorlb, steorlhsize 111 0 00 A R 1 Rs 0 010 00 Rn Rt0x38202000 / mask 0x3F20FC00Atomic memory operation: exclusive OR of the memory value and a register, the old value goes to the destination register (variants: b = byte, h = half word, a = acquire, l = release, st... without a destination register)t = [Rn]; [Rn] = t ^ Ws; Wt = tAtomic memory operations (LSE)
ldgXt, [Xn|SP{, #imm9}]11011001 011 imm9 00 Rn Rt0xD9600000 / mask 0xFFE00C00Load of the tag from memory into an addressXt = Xt with tag of [Rn + imm9 * 16]Memory tagging (MTE)
ldlarWt, [Xn|SP]also shown as: ldlarb, ldlarhsize 001000 1 1 0 11111 0 11111 Rn Rt0x08DF7C00 / mask 0x3FFFFC00Load with acquire for an ordered memory region (LORegion; b = byte, h = half word)Wt = [Rn]Loads and stores
ldnpRt, Rt2, [Xn|SP{, #imm7}]sf 0 101 0 000 1 imm7 Rt2 Rn Rt0x28400000 / mask 0x7FC00000Load of a register pair with a non-temporal hintRt = [addr]; Rt2 = [addr + size]Loads and stores
ldpRt, Rt2, [Xn|SP], #imm7sf 0 101 0 001 1 imm7 Rt2 Rn Rt0x28C00000 / mask 0x7FC00000Load of a register pair (post-indexed)Rt = [addr]; Rt2 = [addr + size]; addr = Rn; Rn = Rn + imm7 * sizeLoads and stores
Rt, Rt2, [Xn|SP{, #imm7}]sf 0 101 0 010 1 imm7 Rt2 Rn Rt0x29400000 / mask 0x7FC00000Load of a register pairRt = [addr]; Rt2 = [addr + size]; addr = Rn + imm7 * sizeLoads and stores
Rt, Rt2, [Xn|SP, #imm7]!sf 0 101 0 011 1 imm7 Rt2 Rn Rt0x29C00000 / mask 0x7FC00000Load of a register pair (pre-indexed)Rt = [addr]; Rt2 = [addr + size]; Rn = Rn + imm7 * size; addr = RnLoads and stores
Ft, Ft2, [Xn|SP{, #imm7}]opc 101 1 010 1 imm7 Rt2 Rn Rt0x2D400000 / mask 0x3FC00000Load of a pair of floating point / vector registers (opc 00 = S, 01 = D, 10 = Q)Ft = [addr]; Ft2 = [addr + size]Loads and stores
ldpswXt, Xt2, [Xn|SP], #imm701 101 0 001 1 imm7 Rt2 Rn Rt0x68C00000 / mask 0xFFC00000Load of a pair of signed words (post-indexed)Xt = sext([addr]); Xt2 = sext([addr + 4]); addr = Rn; Rn = Rn + imm7 * 4Loads and stores
Xt, Xt2, [Xn|SP{, #imm7}]01 101 0 010 1 imm7 Rt2 Rn Rt0x69400000 / mask 0xFFC00000Load of a pair of signed wordsXt = sext([addr]); Xt2 = sext([addr + 4]); addr = Rn + imm7 * 4Loads and stores
Xt, Xt2, [Xn|SP, #imm7]!01 101 0 011 1 imm7 Rt2 Rn Rt0x69C00000 / mask 0xFFC00000Load of a pair of signed words (pre-indexed)Xt = sext([addr]); Xt2 = sext([addr + 4]); Rn = Rn + imm7 * 4; addr = RnLoads and stores
ldrWt, [Xn|SP{, #imm12}]10 111 0 01 01 imm12 Rn Rt0xB9400000 / mask 0xFFC00000Load of a word (32 bit) (address: Rn + imm12 * size)Wt = [addr]; addr = Rn + imm12 * sizeLoads and stores
Wt, [Xn|SP, #imm9]!10 111 0 00 01 0 imm9 11 Rn Rt0xB8400C00 / mask 0xFFE00C00Load of a word (32 bit) (pre-indexed: Rn is changed first)Wt = [addr]; Rn = Rn + imm9; addr = RnLoads and stores
Wt, [Xn|SP], #imm910 111 0 00 01 0 imm9 01 Rn Rt0xB8400400 / mask 0xFFE00C00Load of a word (32 bit) (post-indexed: Rn is changed afterwards)Wt = [addr]; addr = Rn; Rn = Rn + imm9Loads and stores
Wt, [Xn|SP, Rm{, extend {#amount}}]10 111 0 00 01 1 Rm option S 10 Rn Rt0xB8600800 / mask 0xFFE00C00Load of a word (32 bit) (address: Rn + register, extended and shifted)Wt = [addr]; addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
Xt, [Xn|SP{, #imm12}]11 111 0 01 01 imm12 Rn Rt0xF9400000 / mask 0xFFC00000Load of a double word (64 bit) (address: Rn + imm12 * size)Xt = [addr]; addr = Rn + imm12 * sizeLoads and stores
Xt, [Xn|SP, #imm9]!11 111 0 00 01 0 imm9 11 Rn Rt0xF8400C00 / mask 0xFFE00C00Load of a double word (64 bit) (pre-indexed: Rn is changed first)Xt = [addr]; Rn = Rn + imm9; addr = RnLoads and stores
Xt, [Xn|SP], #imm911 111 0 00 01 0 imm9 01 Rn Rt0xF8400400 / mask 0xFFE00C00Load of a double word (64 bit) (post-indexed: Rn is changed afterwards)Xt = [addr]; addr = Rn; Rn = Rn + imm9Loads and stores
Xt, [Xn|SP, Rm{, extend {#amount}}]11 111 0 00 01 1 Rm option S 10 Rn Rt0xF8600800 / mask 0xFFE00C00Load of a double word (64 bit) (address: Rn + register, extended and shifted)Xt = [addr]; addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
Wt, label00 011 0 00 imm19 Rt0x18000000 / mask 0xFF000000Load of a word relative to the program counter (+-1 MB)Wt = [pc + sext(imm19 << 2)]Loads and stores
Xt, label01 011 0 00 imm19 Rt0x58000000 / mask 0xFF000000Load of a double word relative to the program counter (+-1 MB)Xt = [pc + sext(imm19 << 2)]Loads and stores
Ft, [Xn|SP{, #imm12}]1 x 111 1 01 01 imm12 Rn Rt0xBD400000 / mask 0xBFC00000Load of a single (x=0) or double (x=1) registerFt = [Rn + imm12 * size]Loads and stores
Qt, [Xn|SP{, #imm12}]00 111 1 01 11 imm12 Rn Rt0x3DC00000 / mask 0xFFC00000Load of a 128-bit vector registerQt = [Rn + imm12 * 16]Loads and stores
ldraaXt, [Xn|SP{, #simm10}]also shown as: ldrab11 111 0 00 M S 1 imm9 W 1 Rn Rt0xF8200400 / mask 0xFF200400Load with an authenticated base address (a = key A, b = key B; optionally pre-indexed)Xt = [aut(Xn, key, 0) + simm10 * 8]Pointer authentication (PAC)
ldrbWt, [Xn|SP{, #imm12}]00 111 0 01 01 imm12 Rn Rt0x39400000 / mask 0xFFC00000Load of a byte (zero-extended) (address: Rn + imm12 * size)Wt = zext([addr]); addr = Rn + imm12 * sizeLoads and stores
Wt, [Xn|SP, #imm9]!00 111 0 00 01 0 imm9 11 Rn Rt0x38400C00 / mask 0xFFE00C00Load of a byte (zero-extended) (pre-indexed: Rn is changed first)Wt = zext([addr]); Rn = Rn + imm9; addr = RnLoads and stores
Wt, [Xn|SP], #imm900 111 0 00 01 0 imm9 01 Rn Rt0x38400400 / mask 0xFFE00C00Load of a byte (zero-extended) (post-indexed: Rn is changed afterwards)Wt = zext([addr]); addr = Rn; Rn = Rn + imm9Loads and stores
Wt, [Xn|SP, Rm{, extend {#amount}}]00 111 0 00 01 1 Rm option S 10 Rn Rt0x38600800 / mask 0xFFE00C00Load of a byte (zero-extended) (address: Rn + register, extended and shifted)Wt = zext([addr]); addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
ldrhWt, [Xn|SP{, #imm12}]01 111 0 01 01 imm12 Rn Rt0x79400000 / mask 0xFFC00000Load of a half word (zero-extended) (address: Rn + imm12 * size)Wt = zext([addr]); addr = Rn + imm12 * sizeLoads and stores
Wt, [Xn|SP, #imm9]!01 111 0 00 01 0 imm9 11 Rn Rt0x78400C00 / mask 0xFFE00C00Load of a half word (zero-extended) (pre-indexed: Rn is changed first)Wt = zext([addr]); Rn = Rn + imm9; addr = RnLoads and stores
Wt, [Xn|SP], #imm901 111 0 00 01 0 imm9 01 Rn Rt0x78400400 / mask 0xFFE00C00Load of a half word (zero-extended) (post-indexed: Rn is changed afterwards)Wt = zext([addr]); addr = Rn; Rn = Rn + imm9Loads and stores
Wt, [Xn|SP, Rm{, extend {#amount}}]01 111 0 00 01 1 Rm option S 10 Rn Rt0x78600800 / mask 0xFFE00C00Load of a half word (zero-extended) (address: Rn + register, extended and shifted)Wt = zext([addr]); addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
ldrsbXt, [Xn|SP{, #imm12}]00 111 0 01 10 imm12 Rn Rt0x39800000 / mask 0xFFC00000Load of a byte (sign-extended to 64 bit) (address: Rn + imm12 * size)Xt = sext([addr]); addr = Rn + imm12 * sizeLoads and stores
Xt, [Xn|SP, #imm9]!00 111 0 00 10 0 imm9 11 Rn Rt0x38800C00 / mask 0xFFE00C00Load of a byte (sign-extended to 64 bit) (pre-indexed: Rn is changed first)Xt = sext([addr]); Rn = Rn + imm9; addr = RnLoads and stores
Xt, [Xn|SP], #imm900 111 0 00 10 0 imm9 01 Rn Rt0x38800400 / mask 0xFFE00C00Load of a byte (sign-extended to 64 bit) (post-indexed: Rn is changed afterwards)Xt = sext([addr]); addr = Rn; Rn = Rn + imm9Loads and stores
Xt, [Xn|SP, Rm{, extend {#amount}}]00 111 0 00 10 1 Rm option S 10 Rn Rt0x38A00800 / mask 0xFFE00C00Load of a byte (sign-extended to 64 bit) (address: Rn + register, extended and shifted)Xt = sext([addr]); addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
Wt, [Xn|SP{, #imm12}]00 111 0 01 11 imm12 Rn Rt0x39C00000 / mask 0xFFC00000Load of a byte (sign-extended to 32 bit) (address: Rn + imm12 * size)Wt = sext([addr]); addr = Rn + imm12 * sizeLoads and stores
Wt, [Xn|SP, #imm9]!00 111 0 00 11 0 imm9 11 Rn Rt0x38C00C00 / mask 0xFFE00C00Load of a byte (sign-extended to 32 bit) (pre-indexed: Rn is changed first)Wt = sext([addr]); Rn = Rn + imm9; addr = RnLoads and stores
Wt, [Xn|SP], #imm900 111 0 00 11 0 imm9 01 Rn Rt0x38C00400 / mask 0xFFE00C00Load of a byte (sign-extended to 32 bit) (post-indexed: Rn is changed afterwards)Wt = sext([addr]); addr = Rn; Rn = Rn + imm9Loads and stores
Wt, [Xn|SP, Rm{, extend {#amount}}]00 111 0 00 11 1 Rm option S 10 Rn Rt0x38E00800 / mask 0xFFE00C00Load of a byte (sign-extended to 32 bit) (address: Rn + register, extended and shifted)Wt = sext([addr]); addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
ldrshXt, [Xn|SP{, #imm12}]01 111 0 01 10 imm12 Rn Rt0x79800000 / mask 0xFFC00000Load of a half word (sign-extended to 64 bit) (address: Rn + imm12 * size)Xt = sext([addr]); addr = Rn + imm12 * sizeLoads and stores
Xt, [Xn|SP, #imm9]!01 111 0 00 10 0 imm9 11 Rn Rt0x78800C00 / mask 0xFFE00C00Load of a half word (sign-extended to 64 bit) (pre-indexed: Rn is changed first)Xt = sext([addr]); Rn = Rn + imm9; addr = RnLoads and stores
Xt, [Xn|SP], #imm901 111 0 00 10 0 imm9 01 Rn Rt0x78800400 / mask 0xFFE00C00Load of a half word (sign-extended to 64 bit) (post-indexed: Rn is changed afterwards)Xt = sext([addr]); addr = Rn; Rn = Rn + imm9Loads and stores
Xt, [Xn|SP, Rm{, extend {#amount}}]01 111 0 00 10 1 Rm option S 10 Rn Rt0x78A00800 / mask 0xFFE00C00Load of a half word (sign-extended to 64 bit) (address: Rn + register, extended and shifted)Xt = sext([addr]); addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
Wt, [Xn|SP{, #imm12}]01 111 0 01 11 imm12 Rn Rt0x79C00000 / mask 0xFFC00000Load of a half word (sign-extended to 32 bit) (address: Rn + imm12 * size)Wt = sext([addr]); addr = Rn + imm12 * sizeLoads and stores
Wt, [Xn|SP, #imm9]!01 111 0 00 11 0 imm9 11 Rn Rt0x78C00C00 / mask 0xFFE00C00Load of a half word (sign-extended to 32 bit) (pre-indexed: Rn is changed first)Wt = sext([addr]); Rn = Rn + imm9; addr = RnLoads and stores
Wt, [Xn|SP], #imm901 111 0 00 11 0 imm9 01 Rn Rt0x78C00400 / mask 0xFFE00C00Load of a half word (sign-extended to 32 bit) (post-indexed: Rn is changed afterwards)Wt = sext([addr]); addr = Rn; Rn = Rn + imm9Loads and stores
Wt, [Xn|SP, Rm{, extend {#amount}}]01 111 0 00 11 1 Rm option S 10 Rn Rt0x78E00800 / mask 0xFFE00C00Load of a half word (sign-extended to 32 bit) (address: Rn + register, extended and shifted)Wt = sext([addr]); addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
ldrswXt, [Xn|SP{, #imm12}]10 111 0 01 10 imm12 Rn Rt0xB9800000 / mask 0xFFC00000Load of a word (sign-extended to 64 bit) (address: Rn + imm12 * size)Xt = sext([addr]); addr = Rn + imm12 * sizeLoads and stores
Xt, [Xn|SP, #imm9]!10 111 0 00 10 0 imm9 11 Rn Rt0xB8800C00 / mask 0xFFE00C00Load of a word (sign-extended to 64 bit) (pre-indexed: Rn is changed first)Xt = sext([addr]); Rn = Rn + imm9; addr = RnLoads and stores
Xt, [Xn|SP], #imm910 111 0 00 10 0 imm9 01 Rn Rt0xB8800400 / mask 0xFFE00C00Load of a word (sign-extended to 64 bit) (post-indexed: Rn is changed afterwards)Xt = sext([addr]); addr = Rn; Rn = Rn + imm9Loads and stores
Xt, [Xn|SP, Rm{, extend {#amount}}]10 111 0 00 10 1 Rm option S 10 Rn Rt0xB8A00800 / mask 0xFFE00C00Load of a word (sign-extended to 64 bit) (address: Rn + register, extended and shifted)Xt = sext([addr]); addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
Xt, label10 011 0 00 imm19 Rt0x98000000 / mask 0xFF000000Load of a signed word relative to the program counter (+-1 MB)Xt = sext([pc + sext(imm19 << 2)])Loads and stores
ldsetWs, Wt, [Xn|SP]also shown as: ldseta, ldsetal, ldsetl, ldsetb, ldsetab, ldsetalb, ldsetlb, ldseth, ldsetah, ldsetalh, ldsetlh, stsetb, stseth, stset, stsetl, stsetlb, stsetlhsize 111 0 00 A R 1 Rs 0 011 00 Rn Rt0x38203000 / mask 0x3F20FC00Atomic memory operation: Setting of bits (OR) of the memory value and a register, the old value goes to the destination register (variants: b = byte, h = half word, a = acquire, l = release, st... without a destination register)t = [Rn]; [Rn] = t | Ws; Wt = tAtomic memory operations (LSE)
ldsmaxWs, Wt, [Xn|SP]also shown as: ldsmaxa, ldsmaxal, ldsmaxl, ldsmaxb, ldsmaxab, ldsmaxalb, ldsmaxlb, ldsmaxh, ldsmaxah, ldsmaxalh, ldsmaxlh, stsmaxb, stsmaxh, stsmax, stsmaxl, stsmaxlb, stsmaxlhsize 111 0 00 A R 1 Rs 0 100 00 Rn Rt0x38204000 / mask 0x3F20FC00Atomic memory operation: Maximum (signed) of the memory value and a register, the old value goes to the destination register (variants: b = byte, h = half word, a = acquire, l = release, st... without a destination register)t = [Rn]; [Rn] = max_signed(t, Ws); Wt = tAtomic memory operations (LSE)
ldsminWs, Wt, [Xn|SP]also shown as: ldsmina, ldsminal, ldsminl, ldsminb, ldsminab, ldsminalb, ldsminlb, ldsminh, ldsminah, ldsminalh, ldsminlh, stsminb, stsminh, stsmin, stsminl, stsminlb, stsminlhsize 111 0 00 A R 1 Rs 0 101 00 Rn Rt0x38205000 / mask 0x3F20FC00Atomic memory operation: Minimum (signed) of the memory value and a register, the old value goes to the destination register (variants: b = byte, h = half word, a = acquire, l = release, st... without a destination register)t = [Rn]; [Rn] = min_signed(t, Ws); Wt = tAtomic memory operations (LSE)
ldtrWt, [Xn|SP{, #imm9}]also shown as: ldtrb, ldtrhsize 111 0 00 01 0 imm9 10 Rn Rt0x38400800 / mask 0x3FE00C00Load with the rights of user mode (unprivileged; b = byte, h = half word)Wt = [Rn + imm9]Loads and stores
ldtrsbXt, [Xn|SP{, #imm9}]also shown as: ldtrsh, ldtrswsize 111 0 00 10 0 imm9 10 Rn Rt0x38800800 / mask 0x3FE00C00Load with the rights of user mode, sign-extended to 64 bit (b = byte, h = half word, w = word)Xt = sext([Rn + imm9])Loads and stores
ldumaxWs, Wt, [Xn|SP]also shown as: ldumaxa, ldumaxal, ldumaxl, ldumaxb, ldumaxab, ldumaxalb, ldumaxlb, ldumaxh, ldumaxah, ldumaxalh, ldumaxlh, stumaxb, stumaxh, stumax, stumaxl, stumaxlb, stumaxlhsize 111 0 00 A R 1 Rs 0 110 00 Rn Rt0x38206000 / mask 0x3F20FC00Atomic memory operation: Maximum (unsigned) of the memory value and a register, the old value goes to the destination register (variants: b = byte, h = half word, a = acquire, l = release, st... without a destination register)t = [Rn]; [Rn] = max_unsigned(t, Ws); Wt = tAtomic memory operations (LSE)
lduminWs, Wt, [Xn|SP]also shown as: ldumina, lduminal, lduminl, lduminb, lduminab, lduminalb, lduminlb, lduminh, lduminah, lduminalh, lduminlh, stuminb, stuminh, stumin, stuminl, stuminlb, stuminlhsize 111 0 00 A R 1 Rs 0 111 00 Rn Rt0x38207000 / mask 0x3F20FC00Atomic memory operation: Minimum (unsigned) of the memory value and a register, the old value goes to the destination register (variants: b = byte, h = half word, a = acquire, l = release, st... without a destination register)t = [Rn]; [Rn] = min_unsigned(t, Ws); Wt = tAtomic memory operations (LSE)
ldurWt, [Xn|SP{, #imm9}]10 111 0 00 01 0 imm9 00 Rn Rt0xB8400000 / mask 0xFFE00C00Load of a word (32 bit) (unscaled, address: Rn + imm9)Wt = [addr]; addr = Rn + imm9Loads and stores
Xt, [Xn|SP{, #imm9}]11 111 0 00 01 0 imm9 00 Rn Rt0xF8400000 / mask 0xFFE00C00Load of a double word (64 bit) (unscaled, address: Rn + imm9)Xt = [addr]; addr = Rn + imm9Loads and stores
ldurbWt, [Xn|SP{, #imm9}]00 111 0 00 01 0 imm9 00 Rn Rt0x38400000 / mask 0xFFE00C00Load of a byte (zero-extended) (unscaled, address: Rn + imm9)Wt = zext([addr]); addr = Rn + imm9Loads and stores
ldurhWt, [Xn|SP{, #imm9}]01 111 0 00 01 0 imm9 00 Rn Rt0x78400000 / mask 0xFFE00C00Load of a half word (zero-extended) (unscaled, address: Rn + imm9)Wt = zext([addr]); addr = Rn + imm9Loads and stores
ldursbXt, [Xn|SP{, #imm9}]00 111 0 00 10 0 imm9 00 Rn Rt0x38800000 / mask 0xFFE00C00Load of a byte (sign-extended to 64 bit) (unscaled, address: Rn + imm9)Xt = sext([addr]); addr = Rn + imm9Loads and stores
Wt, [Xn|SP{, #imm9}]00 111 0 00 11 0 imm9 00 Rn Rt0x38C00000 / mask 0xFFE00C00Load of a byte (sign-extended to 32 bit) (unscaled, address: Rn + imm9)Wt = sext([addr]); addr = Rn + imm9Loads and stores
ldurshXt, [Xn|SP{, #imm9}]01 111 0 00 10 0 imm9 00 Rn Rt0x78800000 / mask 0xFFE00C00Load of a half word (sign-extended to 64 bit) (unscaled, address: Rn + imm9)Xt = sext([addr]); addr = Rn + imm9Loads and stores
Wt, [Xn|SP{, #imm9}]01 111 0 00 11 0 imm9 00 Rn Rt0x78C00000 / mask 0xFFE00C00Load of a half word (sign-extended to 32 bit) (unscaled, address: Rn + imm9)Wt = sext([addr]); addr = Rn + imm9Loads and stores
ldurswXt, [Xn|SP{, #imm9}]10 111 0 00 10 0 imm9 00 Rn Rt0xB8800000 / mask 0xFFE00C00Load of a word (sign-extended to 64 bit) (unscaled, address: Rn + imm9)Xt = sext([addr]); addr = Rn + imm9Loads and stores
ldxpRt, Rt2, [Xn|SP]1 sz 001000 0 1 1 11111 0 Rt2 Rn Rt0x887F0000 / mask 0xBFFF8000Load of a register pair (exclusive)Rt = [Rn]; Rt2 = [Rn + size]; set the exclusive monitorLoads and stores
ldxrWt, [Xn|SP]10 001000 0 1 0 11111 0 11111 Rn Rt0x885F7C00 / mask 0xFFFFFC00Load-exclusive: sets the exclusive monitor (word)Rt = [Rn]; set the exclusive monitorLoads and stores
Xt, [Xn|SP]11 001000 0 1 0 11111 0 11111 Rn Rt0xC85F7C00 / mask 0xFFFFFC00Load-exclusive: sets the exclusive monitor (double word)Rt = [Rn]; set the exclusive monitorLoads and stores
ldxrbWt, [Xn|SP]00 001000 0 1 0 11111 0 11111 Rn Rt0x085F7C00 / mask 0xFFFFFC00Load-exclusive: sets the exclusive monitor (byte)Rt = [Rn]; set the exclusive monitorLoads and stores
ldxrhWt, [Xn|SP]01 001000 0 1 0 11111 0 11111 Rn Rt0x485F7C00 / mask 0xFFFFFC00Load-exclusive: sets the exclusive monitor (half word)Rt = [Rn]; set the exclusive monitorLoads and stores
lslvRd, Rn, Rmalso shown as: lslsf 0 0 11010110 Rm 001000 Rn Rd0x1AC02000 / mask 0x7FE0FC00Shift left by a register (amount modulo width)Rd = Rn << (Rm mod width)Shift and rotate
lsrvRd, Rn, Rmalso shown as: lsrsf 0 0 11010110 Rm 001001 Rn Rd0x1AC02400 / mask 0x7FE0FC00Shift right unsigned by a registerRd = Rn >> (Rm mod width)Shift and rotate
maddRd, Rn, Rm, Raalso shown as: mulsf 00 11011 000 Rm 0 Ra Rn Rd0x1B000000 / mask 0x7FE08000Multiply and add (Ra + Rn * Rm)Rd = Ra + Rn * RmArithmetic
mlaVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 10010 1 Rn Rd0x0E209400 / mask 0xBF20FC00Multiplication with addition to the destinationfor every element: Vd[i] = Vd[i] + Vn[i] * Vm[i]Vector (SIMD)
Vd.T, Vn.T, Vm.Ts[index]0 Q 1 01111 size L M Rm 0000 H 0 Rn Rd0x2F000000 / mask 0xBF00F400Multiplication by an element, added to the destinationfor every element: Vd[i] = Vd[i] + Vn[i] * Vm[index]Vector (SIMD)
mlsVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 10010 1 Rn Rd0x2E209400 / mask 0xBF20FC00Multiplication with subtraction from the destinationfor every element: Vd[i] = Vd[i] - Vn[i] * Vm[i]Vector (SIMD)
Vd.T, Vn.T, Vm.Ts[index]0 Q 1 01111 size L M Rm 0100 H 0 Rn Rd0x2F004000 / mask 0xBF00F400Multiplication by an element, subtracted from the destinationfor every element: Vd[i] = Vd[i] - Vn[i] * Vm[index]Vector (SIMD)
moviVd.T, #imm8{, lsl #amount}0 Q 0 0111100000 abc 0 cm 0 01 defgh Rd0x0F000400 / mask 0xBFF89C00Load of a 32-bit constant (one byte, shifted) into all elementsVd = imm8 << (8 * cm) in every 32 bitsVector (SIMD)
Vd.T, #imm8{, lsl #amount}0 Q 0 0111100000 abc 10 c 0 01 defgh Rd0x0F008400 / mask 0xBFF8DC00Load of a 16-bit constant (one byte, shifted) into all elementsVd = imm8 << (8 * c) in every 16 bitsVector (SIMD)
Vd.T, #imm8{, lsl #amount}0 Q 0 0111100000 abc 110 c 01 defgh Rd0x0F00C400 / mask 0xBFF8EC00Load of a 32-bit constant (one byte with ones shifted in) into all elementsVd = (imm8 << 8 * (c+1)) | onesVector (SIMD)
Vd.T, #imm8{, lsl #amount}0 Q 0 0111100000 abc 1110 01 defgh Rd0x0F00E400 / mask 0xBFF8FC00Load of a byte into all elementsVd = imm8 in every byteVector (SIMD)
Vd.T, #imm8{, lsl #amount}0 Q 1 0111100000 abc 1110 01 defgh Rd0x2F00E400 / mask 0xBFF8FC00Load of a 64-bit constant, every bit of the byte stands for a byteVd = each bit of imm8 expanded to a byteVector (SIMD)
movkRd, #imm16{, lsl #shift}sf 1 1 100101 hw imm16 Rd0x72800000 / mask 0x7F800000Insertion of 16 bits of a constant into a register, the other bits stayRd[hw*16 + 15 : hw*16] = imm16Constants and addresses
movnRd, #imm16{, lsl #shift}also shown as: movsf 0 0 100101 hw imm16 Rd0x12800000 / mask 0x7F800000Load of an inverted constant into a register (16 bit, shifted by 0/16/32/48)Rd = ~(imm16 << (hw * 16))Constants and addresses
movzRd, #imm16{, lsl #shift}also shown as: movsf 1 0 100101 hw imm16 Rd0x52800000 / mask 0x7F800000Load of a constant into a register (16 bit, shifted by 0/16/32/48, the rest 0)Rd = imm16 << (hw * 16)Constants and addresses
mrsXt, sysreg1101010100 1 1 o0 op1 CRn CRm op2 Rt0xD5300000 / mask 0xFFF00000Read of a system registerXt = sysregSystem and privileged
msrsysreg, Xt1101010100 0 1 o0 op1 CRn CRm op2 Rt0xD5100000 / mask 0xFFF00000Write of a system registersysreg = XtSystem and privileged
msubRd, Rn, Rm, Raalso shown as: mnegsf 00 11011 000 Rm 1 Ra Rn Rd0x1B008000 / mask 0x7FE08000Multiply and subtract (Ra - Rn * Rm)Rd = Ra - Rn * RmArithmetic
mulVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 10011 1 Rn Rd0x0E209C00 / mask 0xBF20FC00Multiplication of the elements (the low half of the result)for every element: Vd[i] = Vn[i] * Vm[i]Vector (SIMD)
Vd.T, Vn.T, Vm.Ts[index]0 Q 0 01111 size L M Rm 1000 H 0 Rn Rd0x0F008000 / mask 0xBF00F400Multiplication by an elementfor every element: Vd[i] = Vn[i] * Vm[index]Vector (SIMD)
mvniVd.T, #imm8{, lsl #amount}0 Q 1 0111100000 abc 0 cm 0 01 defgh Rd0x2F000400 / mask 0xBFF89C00Load of the negation of a 32-bit constant into all elementsVd = ~(imm8 << (8 * cm))Vector (SIMD)
Vd.T, #imm8{, lsl #amount}0 Q 1 0111100000 abc 10 c 0 01 defgh Rd0x2F008400 / mask 0xBFF8DC00Load of the negation of a 16-bit constant into all elementsVd = ~(imm8 << (8 * c))Vector (SIMD)
Vd.T, #imm8{, lsl #amount}0 Q 1 0111100000 abc 110 c 01 defgh Rd0x2F00C400 / mask 0xBFF8EC00Load of the negation of a 32-bit constant (with ones shifted in)Vd = ~((imm8 << 8 * (c+1)) | ones)Vector (SIMD)
negVd.T, Vn.T0 Q 1 01110 size 10000 01011 10 Rn Rd0x2E20B800 / mask 0xBF3FFC00Negationfor every element: Vd[i] = -Vn[i]Vector (SIMD)
notVd.T, Vn.Talso shown as: mvn0 Q 1 01110 00 10000 00101 10 Rn Rd0x2E205800 / mask 0xBFFFFC00Bitwise NOTVd = ~VnVector (SIMD)
ornRd, Rn, Rm{, shift #imm6}also shown as: mvnsf 0 1 01010 shift 1 Rm imm6 Rn Rd0x2A200000 / mask 0x7F200000Bitwise OR with an inverted operandRd = Rn OR ~shift(Rm, imm6)Logic and bits
Vd.T, Vn.T, Vm.T0 Q 0 01110 11 1 Rm 00011 1 Rn Rd0x0EE01C00 / mask 0xBFE0FC00Bitwise OR with an inverted operandVd = Vn OR ~VmVector (SIMD)
orrRd, Rn, #imm (bit pattern)also shown as: movsf 0 1 100100 N immr imms Rn Rd0x32000000 / mask 0x7F800000Bitwise OR with a bit pattern as constantRd = Rn OR decode_bitmask(N, imms, immr) (Rd may be SP)Logic and bits
Rd, Rn, Rm{, shift #imm6}also shown as: movsf 0 1 01010 shift 0 Rm imm6 Rn Rd0x2A000000 / mask 0x7F200000Bitwise OR (register, shifted); mov Rd, Rm is orr with xzrRd = Rn OR shift(Rm, imm6)Logic and bits
Vd.T, Vn.T, Vm.Talso shown as: mov0 Q 0 01110 10 1 Rm 00011 1 Rn Rd0x0EA01C00 / mask 0xBFE0FC00Bitwise OR (mov Vd, Vn is orr with Vn = Vm)Vd = Vn OR VmVector (SIMD)
Vd.T, #imm8{, lsl #amount}0 Q 0 0111100000 abc 0 cm 1 01 defgh Rd0x0F001400 / mask 0xBFF89C00Bitwise OR with a 32-bit constant (one byte, shifted)Vd = Vd | (imm8 << (8 * cm))Vector (SIMD)
Vd.T, #imm8{, lsl #amount}0 Q 0 0111100000 abc 10 c 1 01 defgh Rd0x0F009400 / mask 0xBFF8DC00Bitwise OR with a 16-bit constant (one byte, shifted)Vd = Vd | (imm8 << (8 * c))Vector (SIMD)
pacgaXd, Xn, Xm|SP1 0 0 11010110 Rm 001100 Rn Rd0x9AC03000 / mask 0xFFE0FC00Computation of a generic authentication codeXd[63:32] = pac_code(Xn, Xm); Xd[31:0] = 0Pointer authentication (PAC)
paciaXd, Xn|SPalso shown as: pacib, pacda, pacdb, autia, autib, autda, autdb1 1 0 11010110 00001 000 opc Rn Rd0xDAC10000 / mask 0xFFFFE000Signing (pac...) or authenticating (aut...) of a pointer with a key (ia, ib for instructions, da, db for data) and a modifier (Xn)Xd = pac(Xd, key, Xn) or Xd = aut(Xd, key, Xn)Pointer authentication (PAC)
pmulVd.T, Vn.T, Vm.T0 Q 1 01110 00 1 Rm 10011 1 Rn Rd0x2E209C00 / mask 0xBFE0FC00Polynomial multiplication of the elements (byte, carry-less)for every element: Vd[i] = Vn[i] * Vm[i] over GF(2)Vector (SIMD)
pmullVd.Tb, Vn.Ta, Vm.Taalso shown as: pmull20 Q 0 01110 size 1 Rm 1110 00 Rn Rd0x0E20E000 / mask 0xBF20FC00Polynomial multiplication with widening (carry-less; the 1Q form needs the crypto extension)for every element: Vd[i] = Vn[i] * Vm[i] over GF(2)Vector (SIMD)
prfmprfop, [Xn|SP{, #imm12}]11 111 0 01 10 imm12 Rn Rt0xF9800000 / mask 0xFFC00000Prefetch of a cache line (hint)prefetch the cache line at addr (a hint)Loads and stores
prfop, [Xn|SP, Rm{, extend {#amount}}]11 111 0 00 10 1 Rm option S 10 Rn Rt0xF8A00800 / mask 0xFFE00C00Prefetch of a cache line (hint) (register address)prefetch the cache line at addr (a hint)Loads and stores
prfop, label11 011 0 00 imm19 Rt0xD8000000 / mask 0xFF000000Prefetch relative to the program counter (hint)prefetch the cache line at pc + sext(imm19 << 2)Loads and stores
prfumprfop, [Xn|SP{, #imm9}]11 111 0 00 10 0 imm9 00 Rn Rt0xF8800000 / mask 0xFFE00C00Prefetch of a cache line (hint) (unscaled)prefetch the cache line at addr (a hint)Loads and stores
raddhnVd.Tb, Vn.Ta, Vm.Taalso shown as: raddhn20 Q 1 01110 size 1 Rm 0100 00 Rn Rd0x2E204000 / mask 0xBF20FC00Addition with narrowing (high half; raddhn with rounding) (unsigned; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = high half of (Vn[i] + Vm[i])Vector (SIMD)
rbitRd, Rnsf 1 0 11010110 00000 000000 Rn Rd0x5AC00000 / mask 0x7FFFFC00Reversal of the bit orderRd = reverse_bits(Rn)Logic and bits
Vd.T, Vn.T0 Q 1 01110 01 10000 00101 10 Rn Rd0x2E605800 / mask 0xBFFFFC00Reversal of the bit order in every bytefor every element: Vd[i] = reverse_bits(Vn[i])Vector (SIMD)
ret{Xn}1101011 0 0 10 11111 000000 Rn 000000xD65F0000 / mask 0xFFFFFC1FReturn from the function (address in x30 if no register is given)pc = Xn (default x30)Branches and calls
revWd, Wn0 1 0 11010110 00000 000010 Rn Rd0x5AC00800 / mask 0xFFFFFC00Reversal of the bytes of a 32-bit value (little/big endian)Wd = reverse_bytes(Wn)Logic and bits
Xd, Xn1 1 0 11010110 00000 000011 Rn Rd0xDAC00C00 / mask 0xFFFFFC00Reversal of the bytes of a 64-bit value (little/big endian)Xd = reverse_bytes(Xn)Logic and bits
rev16Rd, Rnsf 1 0 11010110 00000 000001 Rn Rd0x5AC00400 / mask 0x7FFFFC00Reversal of the bytes in each half wordRd = reverse_bytes_in_each_16_bits(Rn)Logic and bits
Vd.T, Vn.T0 Q 0 01110 00 10000 00001 10 Rn Rd0x0E201800 / mask 0xBFFFFC00Swap of the bytes in every 16-bit elementfor every element: Vd[i] = reverse(Vn) per 16 bitsVector (SIMD)
rev32Xd, Xn1 1 0 11010110 00000 000010 Rn Rd0xDAC00800 / mask 0xFFFFFC00Reversal of the bytes in each 32-bit half of a 64-bit registerXd = reverse_bytes_in_each_32_bits(Xn)Logic and bits
Vd.T, Vn.T0 Q 1 01110 size 10000 00000 10 Rn Rd0x2E200800 / mask 0xBF3FFC00Reversal of the order of the elements in every 32-bit blockfor every element: Vd[i] = reverse(Vn) per 32 bitsVector (SIMD)
rev64Vd.T, Vn.T0 Q 0 01110 size 10000 00000 10 Rn Rd0x0E200800 / mask 0xBF3FFC00Reversal of the order of the elements in every 64-bit blockfor every element: Vd[i] = reverse(Vn) per 64 bitsVector (SIMD)
rmifXn, #imm6, #nzcv1 0 1 11010000 imm6 00001 Rn 0 nzcv0xBA000400 / mask 0xFFE07C10Rotation of a register into the flags (masked)flags = bits of (Xn rotated right by imm6) where the mask nzcv is setFlags: N Z C VSystem and privileged
rorvRd, Rn, Rmalso shown as: rorsf 0 0 11010110 Rm 001011 Rn Rd0x1AC02C00 / mask 0x7FE0FC00Rotate right by a registerRd = rotate_right(Rn, Rm mod width)Shift and rotate
rshrnVd.Tb, Vn.Ta, #shiftalso shown as: rshrn20 Q 0 011110 0 immh immb 10001 1 Rn Rd0x0F008C00 / mask 0xBFC0FC00Shift right with narrowing and rounding (Q = 1: name with 2)for every element: Vd[i] = round(Vn[i] >> shift)Vector (SIMD)
rsubhnVd.Tb, Vn.Ta, Vm.Taalso shown as: rsubhn20 Q 1 01110 size 1 Rm 0110 00 Rn Rd0x2E206000 / mask 0xBF20FC00Subtraction with narrowing (high half; rsubhn with rounding) (unsigned; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = high half of (Vn[i] - Vm[i])Vector (SIMD)
sabaVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 01111 1 Rn Rd0x0E207C00 / mask 0xBF20FC00Addition of the absolute difference to the destination (signed)for every element: Vd[i] = Vd[i] + abs(Vn[i] - Vm[i])Vector (SIMD)
sabalVd.Tb, Vn.Ta, Vm.Taalso shown as: sabal20 Q 0 01110 size 1 Rm 0101 00 Rn Rd0x0E205000 / mask 0xBF20FC00Addition of the absolute difference with widening (signed; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vd[i] + abs(Vn[i] - Vm[i])Vector (SIMD)
sabdVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 01110 1 Rn Rd0x0E207400 / mask 0xBF20FC00Absolute difference (signed)for every element: Vd[i] = abs(Vn[i] - Vm[i])Vector (SIMD)
sabdlVd.Tb, Vn.Ta, Vm.Taalso shown as: sabdl20 Q 0 01110 size 1 Rm 0111 00 Rn Rd0x0E207000 / mask 0xBF20FC00Absolute difference with widening (signed; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = abs(Vn[i] - Vm[i]) (wide result)Vector (SIMD)
sadalpVd.T, Vn.T0 Q 0 01110 size 10000 00110 10 Rn Rd0x0E206800 / mask 0xBF3FFC00Pairwise addition with widening, added to the destination (signed)for every element: Vd[i] = Vd[i] + Vn[2i] + Vn[2i+1]Vector (SIMD)
saddlVd.Tb, Vn.Ta, Vm.Taalso shown as: saddl20 Q 0 01110 size 1 Rm 0000 00 Rn Rd0x0E200000 / mask 0xBF20FC00Addition with widening (both operands become twice as wide) (signed; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vn[i] + Vm[i] (wide result)Vector (SIMD)
saddlpVd.T, Vn.T0 Q 0 01110 size 10000 00010 10 Rn Rd0x0E202800 / mask 0xBF3FFC00Pairwise addition of adjacent elements with widening (signed)for every element: Vd[i] = Vn[2i] + Vn[2i+1]Vector (SIMD)
saddlvVd, Vn.T0 Q 0 01110 size 11000 00011 10 Rn Rd0x0E303800 / mask 0xBF3FFC00Sum of all elements with widening (signed)Vd = sum of all elements of VnVector (SIMD)
saddwVd.Tb, Vn.Ta, Vm.Taalso shown as: saddw20 Q 0 01110 size 1 Rm 0001 00 Rn Rd0x0E201000 / mask 0xBF20FC00Addition of a wide and a narrow operand (signed; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vn[i] + Vm[i] (Vn is wide)Vector (SIMD)
sbcRd, Rn, Rmalso shown as: ngcsf 1 0 11010000 Rm 000000 Rn Rd0x5A000000 / mask 0x7FE0FC00Subtraction with borrow (C)Rd = Rn - Rm - (1 - C)Arithmetic
sbcsRd, Rn, Rmalso shown as: ngcssf 1 1 11010000 Rm 000000 Rn Rd0x7A000000 / mask 0x7FE0FC00Subtraction with borrow, sets the flagsRd = Rn - Rm - (1 - C)Flags: N Z C VArithmetic
sbfmRd, Rn, #immr, #immsalso shown as: asr, sbfiz, sbfx, sxtb, sxth, sxtwsf 0 0 100110 N immr imms Rn Rd0x13000000 / mask 0x7F800000Bitfield move with sign extension (base form of asr, sbfx, sxtb ...)Rd = sign-extended field of Rn selected by immr, immsBitfields
scvtfFd, Rnsf 0 0 11110 ftype 1 00 010 000000 Rn Rd0x1E220000 / mask 0x7F3FFC00Conversion of a signed integer to floating pointFd = (float) sext(Rn)Floating point (scalar)
Vd.T, Vn.T0 Q 0 01110 0 sz 10000 11101 10 Rn Rd0x0E21D800 / mask 0xBFBFFC00Conversion of a signed integer to floating pointfor every element: Vd[i] = (float) Vn[i]Vector (SIMD)
sdivRd, Rn, Rmsf 0 0 11010110 Rm 000011 Rn Rd0x1AC00C00 / mask 0x7FE0FC00Signed division (division by 0 gives 0)Rd = Rn / RmArithmetic
sdotVd.4S, Vn.16B, Vm.16B0 Q 0 01110 10 0 Rm 10010 1 Rn Rd0x0E809400 / mask 0xBFE0FC00Dot product of four bytes each (signed), added to the 32-bit destinationfor every element: Vd[i] = Vd[i] + sum of Vn[4i+k] * Vm[4i+k]Vector (SIMD)
sete[Xd]!, Xn!, Xsalso shown as: seten, setet, setetn00 011 0 01 11 0 Rs 10 o 01 Rn Rd0x19C08400 / mask 0xFFE0CC00Fill of a memory block with a byte, epilogue (the three instructions p, m, e are executed in sequence)fill Xn bytes at [Xd] with Xs[7:0]; Xd and Xn are updatedMemory copy and set
setge[Xd]!, Xn!, Xsalso shown as: setgen, setget, setgetn00 011 1 01 11 0 Rs 10 o 01 Rn Rd0x1DC08400 / mask 0xFFE0CC00Fill of a memory block with a byte with tags, epilogue (the three instructions p, m, e are executed in sequence)fill Xn bytes at [Xd] with Xs[7:0]; Xd and Xn are updatedMemory copy and set
setgm[Xd]!, Xn!, Xsalso shown as: setgmn, setgmt, setgmtn00 011 1 01 11 0 Rs 01 o 01 Rn Rd0x1DC04400 / mask 0xFFE0CC00Fill of a memory block with a byte with tags, main part (the three instructions p, m, e are executed in sequence)fill Xn bytes at [Xd] with Xs[7:0]; Xd and Xn are updatedMemory copy and set
setgp[Xd]!, Xn!, Xsalso shown as: setgpn, setgpt, setgptn00 011 1 01 11 0 Rs 00 o 01 Rn Rd0x1DC00400 / mask 0xFFE0CC00Fill of a memory block with a byte with tags, prologue (the three instructions p, m, e are executed in sequence)fill Xn bytes at [Xd] with Xs[7:0]; Xd and Xn are updatedMemory copy and set
setm[Xd]!, Xn!, Xsalso shown as: setmn, setmt, setmtn00 011 0 01 11 0 Rs 01 o 01 Rn Rd0x19C04400 / mask 0xFFE0CC00Fill of a memory block with a byte, main part (the three instructions p, m, e are executed in sequence)fill Xn bytes at [Xd] with Xs[7:0]; Xd and Xn are updatedMemory copy and set
setp[Xd]!, Xn!, Xsalso shown as: setpn, setpt, setptn00 011 0 01 11 0 Rs 00 o 01 Rn Rd0x19C00400 / mask 0xFFE0CC00Fill of a memory block with a byte, prologue (the three instructions p, m, e are executed in sequence)fill Xn bytes at [Xd] with Xs[7:0]; Xd and Xn are updatedMemory copy and set
sha1cQd, Sn, Vm.4Salso shown as: sha1p, sha1m, sha1su0, sha256h, sha256h2, sha256su101011110 00 0 Rm 0 opc 00 Rn Rd0x5E000000 / mask 0xFFE08C00SHA-1 and SHA-256 hash update (sha1c: choose, sha1p: parity, sha1m: majority, sha256h, sha256h2: hash update, ...su: message schedule)Vd = hash_update(Vd, Vn, Vm)Cryptography
sha1hSd, Snalso shown as: sha1su1, sha256su001011110 00 10100 000 opc 10 Rn Rd0x5E280800 / mask 0xFFFFCC00SHA-1 rotation (sha1h) and message schedule (sha1su1, sha256su0)Sd = rotate_left(Sn, 30)Cryptography
sha512hQd, Qn, Vm.2Dalso shown as: sha512h2, sha512su1, rax111001110 011 Rm 1 000 opc Rn Rd0xCE608000 / mask 0xFFE0F000SHA-512 hash update (sha512h, sha512h2), message schedule (sha512su1) and rotation (rax1: rotate and exclusive OR, also for SHA-3)Vd = hash_update(Vd, Vn, Vm)Cryptography
sha512su0Vd.2D, Vn.2Dalso shown as: sm4e11001110 110 00000 1000 0 x Rn Rd0xCEC08000 / mask 0xFFFFF800SHA-512 message schedule (sha512su0) and SM4 encryption of four rounds (sm4e)Vd = message_schedule(Vd, Vn)Cryptography
shaddVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 00000 1 Rn Rd0x0E200400 / mask 0xBF20FC00Halving addition (signed)for every element: Vd[i] = (Vn[i] + Vm[i]) >> 1Vector (SIMD)
shlVd.T, Vn.T, #shift0 Q 0 011110 immh immb 01010 1 Rn Rd0x0F005400 / mask 0xBF80FC00Shift leftfor every element: Vd[i] = Vn[i] << shiftVector (SIMD)
shllVd.Ta, Vn.Tb, #shiftalso shown as: shll20 Q 1 01110 size 10000 10011 10 Rn Rd0x2E213800 / mask 0xBF3FFC00Widening with a left shift by the element sizefor every element: Vd[i] = Vn[i] << esizeVector (SIMD)
shrnVd.Tb, Vn.Ta, #shiftalso shown as: shrn20 Q 0 011110 0 immh immb 10000 1 Rn Rd0x0F008400 / mask 0xBFC0FC00Shift right with narrowing (Q = 1: name with 2)for every element: Vd[i] = Vn[i] >> shiftVector (SIMD)
shsubVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 00100 1 Rn Rd0x0E202400 / mask 0xBF20FC00Halving subtraction (signed)for every element: Vd[i] = (Vn[i] - Vm[i]) >> 1Vector (SIMD)
sliVd.T, Vn.T, #shift0 Q 1 011110 immh immb 01010 1 Rn Rd0x2F005400 / mask 0xBF80FC00Shift left and insert (the low bits of the destination stay)for every element: Vd[i] = (Vd[i] & low_mask) | (Vn[i] << shift)Vector (SIMD)
sm3partw1Vd.4S, Vn.4S, Vm.4Salso shown as: sm3partw2, sm4ekey11001110 011 Rm 1100 opc Rn Rd0xCE60C000 / mask 0xFFE0F000SM3 message expansion (sm3partw1, sm3partw2) and SM4 key schedule (sm4ekey)Vd = expand(Vn, Vm)Cryptography
sm3ss1Vd.4S, Vn.4S, Vm.4S, Va.4S11001110 010 Rm 0 Ra Rn Rd0xCE400000 / mask 0xFFE08000SM3 helper valueVd = SM3SS1(Vn, Vm, Va)Cryptography
sm3tt1aVd.4S, Vn.4S, Vm.S[imm2]also shown as: sm3tt1b, sm3tt2a, sm3tt2b11001110 010 Rm 10 imm2 opc Rn Rd0xCE408000 / mask 0xFFE0C000SM3 compression function (four variants)Vd = SM3TT(Vd, Vn, Vm[imm2])Cryptography
smaddlXd, Wn, Wm, Xaalso shown as: smull1 00 11011 001 Rm 0 Ra Rn Rd0x9B200000 / mask 0xFFE08000Signed multiply 32 x 32 bit, added to 64 bitXd = Xa + sext(Wn) * sext(Wm)Arithmetic
smaxVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 01100 1 Rn Rd0x0E206400 / mask 0xBF20FC00Maximum of the elements (signed)for every element: Vd[i] = max_signed(Vn[i], Vm[i])Vector (SIMD)
smaxpVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 10100 1 Rn Rd0x0E20A400 / mask 0xBF20FC00Maximum of adjacent element pairs (signed)for every element: Vd[i] = max_signed of each pair of (Vn:Vm)Vector (SIMD)
smaxvVd, Vn.T0 Q 0 01110 size 11000 01010 10 Rn Rd0x0E30A800 / mask 0xBF3FFC00Maximum of all elements (signed)Vd = max_signed of all elements of VnVector (SIMD)
smc#imm1611010100 000 imm16 000 110xD4000003 / mask 0xFFE0001FSecure monitor call (exception level 3)raise a secure monitor call exceptionSystem and privileged
sminVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 01101 1 Rn Rd0x0E206C00 / mask 0xBF20FC00Minimum of the elements (signed)for every element: Vd[i] = min_signed(Vn[i], Vm[i])Vector (SIMD)
sminpVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 10101 1 Rn Rd0x0E20AC00 / mask 0xBF20FC00Minimum of adjacent element pairs (signed)for every element: Vd[i] = min_signed of each pair of (Vn:Vm)Vector (SIMD)
sminvVd, Vn.T0 Q 0 01110 size 11000 11010 10 Rn Rd0x0E31A800 / mask 0xBF3FFC00Minimum of all elements (signed)Vd = min_signed of all elements of VnVector (SIMD)
smlalVd.Tb, Vn.Ta, Vm.Taalso shown as: smlal20 Q 0 01110 size 1 Rm 1000 00 Rn Rd0x0E208000 / mask 0xBF20FC00Multiplication with widening, added to the destination (signed; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vd[i] + Vn[i] * Vm[i]Vector (SIMD)
Vd.Ta, Vn.Tb, Vm.Ts[index]also shown as: smlal20 Q 0 01111 size L M Rm 0010 H 0 Rn Rd0x0F002000 / mask 0xBF00F400Multiplication by an element with widening, added to the destination (signed) (Q = 1: name with 2)for every element: Vd[i] = Vd[i] + Vn[i] * Vm[index]Vector (SIMD)
smlslVd.Tb, Vn.Ta, Vm.Taalso shown as: smlsl20 Q 0 01110 size 1 Rm 1010 00 Rn Rd0x0E20A000 / mask 0xBF20FC00Multiplication with widening, subtracted from the destination (signed; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vd[i] - Vn[i] * Vm[i]Vector (SIMD)
Vd.Ta, Vn.Tb, Vm.Ts[index]also shown as: smlsl20 Q 0 01111 size L M Rm 0110 H 0 Rn Rd0x0F006000 / mask 0xBF00F400Multiplication by an element with widening, subtracted from the destination (signed) (Q = 1: name with 2)for every element: Vd[i] = Vd[i] - Vn[i] * Vm[index]Vector (SIMD)
smmlaVd.4S, Vn.16B, Vm.16B0 1 0 01110 10 0 Rm 10100 1 Rn Rd0x4E80A400 / mask 0xFFE0FC00Matrix multiplication 2x8 times 8x2 (signed), added to the destinationVd(2x2) = Vd(2x2) + Vn(2x8) * Vm(8x2)Vector (SIMD)
smovRd, Vn.Ts[index]0 Q 0 01110000 imm5 0 0101 1 Rn Rd0x0E002C00 / mask 0xBFE0FC00Copy of an element into an integer register (signed)Rd = sext(Vn[index])Vector (SIMD)
smsublXd, Wn, Wm, Xaalso shown as: smnegl1 00 11011 001 Rm 1 Ra Rn Rd0x9B208000 / mask 0xFFE08000Signed multiply 32 x 32 bit, subtracted from 64 bitXd = Xa - sext(Wn) * sext(Wm)Arithmetic
smulhXd, Xn, Xm1 00 11011 010 Rm 0 11111 Rn Rd0x9B407C00 / mask 0xFFE0FC00Signed multiply, the high 64 bits of the resultXd = (sext(Xn) * sext(Xm)) >> 64Arithmetic
smullVd.Tb, Vn.Ta, Vm.Taalso shown as: smull20 Q 0 01110 size 1 Rm 1100 00 Rn Rd0x0E20C000 / mask 0xBF20FC00Multiplication with widening (signed; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vn[i] * Vm[i] (wide result)Vector (SIMD)
Vd.Ta, Vn.Tb, Vm.Ts[index]also shown as: smull20 Q 0 01111 size L M Rm 1010 H 0 Rn Rd0x0F00A000 / mask 0xBF00F400Multiplication by an element with widening (signed) (Q = 1: name with 2)for every element: Vd[i] = Vn[i] * Vm[index]Vector (SIMD)
sqabsVd.T, Vn.T0 Q 0 01110 size 10000 00111 10 Rn Rd0x0E207800 / mask 0xBF3FFC00Absolute value with saturationfor every element: Vd[i] = saturate(abs(Vn[i]))Vector (SIMD)
sqaddVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 00001 1 Rn Rd0x0E200C00 / mask 0xBF20FC00Addition with saturation (signed)for every element: Vd[i] = saturate_signed(Vn[i] + Vm[i])Vector (SIMD)
sqdmlalVd.Tb, Vn.Ta, Vm.Taalso shown as: sqdmlal20 Q 0 01110 size 1 Rm 1001 00 Rn Rd0x0E209000 / mask 0xBF20FC00Doubling multiplication with widening and saturation, added to the destinationfor every element: Vd[i] = saturate(Vd[i] + 2 * Vn[i] * Vm[i])Vector (SIMD)
Vd.Ta, Vn.Tb, Vm.Ts[index]also shown as: sqdmlal20 Q 0 01111 size L M Rm 0011 H 0 Rn Rd0x0F003000 / mask 0xBF00F400Doubling multiplication by an element with widening and saturation, added to the destination (Q = 1: name with 2)for every element: Vd[i] = saturate(Vd[i] + 2 * Vn[i] * Vm[index])Vector (SIMD)
sqdmlslVd.Tb, Vn.Ta, Vm.Taalso shown as: sqdmlsl20 Q 0 01110 size 1 Rm 1011 00 Rn Rd0x0E20B000 / mask 0xBF20FC00Doubling multiplication with widening and saturation, subtracted from the destinationfor every element: Vd[i] = saturate(Vd[i] - 2 * Vn[i] * Vm[i])Vector (SIMD)
Vd.Ta, Vn.Tb, Vm.Ts[index]also shown as: sqdmlsl20 Q 0 01111 size L M Rm 0111 H 0 Rn Rd0x0F007000 / mask 0xBF00F400Doubling multiplication by an element with widening and saturation, subtracted from the destination (Q = 1: name with 2)for every element: Vd[i] = saturate(Vd[i] - 2 * Vn[i] * Vm[index])Vector (SIMD)
sqdmulhVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 10110 1 Rn Rd0x0E20B400 / mask 0xBF20FC00Doubling multiplication, high half, with saturationfor every element: Vd[i] = saturate((2 * Vn[i] * Vm[i]) >> esize)Vector (SIMD)
Vd.T, Vn.T, Vm.Ts[index]0 Q 0 01111 size L M Rm 1100 H 0 Rn Rd0x0F00C000 / mask 0xBF00F400Doubling multiplication by an element, high half, with saturationfor every element: Vd[i] = saturate((2 * Vn[i] * Vm[index]) >> esize)Vector (SIMD)
sqdmullVd.Tb, Vn.Ta, Vm.Taalso shown as: sqdmull20 Q 0 01110 size 1 Rm 1101 00 Rn Rd0x0E20D000 / mask 0xBF20FC00Doubling multiplication with widening and saturationfor every element: Vd[i] = saturate(2 * Vn[i] * Vm[i])Vector (SIMD)
Vd.Ta, Vn.Tb, Vm.Ts[index]also shown as: sqdmull20 Q 0 01111 size L M Rm 1011 H 0 Rn Rd0x0F00B000 / mask 0xBF00F400Doubling multiplication by an element with widening and saturation (Q = 1: name with 2)for every element: Vd[i] = saturate(2 * Vn[i] * Vm[index])Vector (SIMD)
sqnegVd.T, Vn.T0 Q 1 01110 size 10000 00111 10 Rn Rd0x2E207800 / mask 0xBF3FFC00Negation with saturationfor every element: Vd[i] = saturate(-Vn[i])Vector (SIMD)
sqrdmlahVd.T, Vn.T, Vm.T0 Q 1 01110 size 0 Rm 10000 1 Rn Rd0x2E008400 / mask 0xBF20FC00Doubling multiplication, high half, with rounding and saturation, added to the destinationfor every element: Vd[i] = saturate(Vd[i] + round((2 * Vn[i] * Vm[i]) >> esize))Vector (SIMD)
sqrdmlshVd.T, Vn.T, Vm.T0 Q 1 01110 size 0 Rm 10001 1 Rn Rd0x2E008C00 / mask 0xBF20FC00Doubling multiplication, high half, with rounding and saturation, subtracted from the destinationfor every element: Vd[i] = saturate(Vd[i] - round((2 * Vn[i] * Vm[i]) >> esize))Vector (SIMD)
sqrdmulhVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 10110 1 Rn Rd0x2E20B400 / mask 0xBF20FC00Doubling multiplication, high half, with rounding and saturationfor every element: Vd[i] = saturate(round((2 * Vn[i] * Vm[i]) >> esize))Vector (SIMD)
Vd.T, Vn.T, Vm.Ts[index]0 Q 0 01111 size L M Rm 1101 H 0 Rn Rd0x0F00D000 / mask 0xBF00F400Doubling multiplication by an element, high half, with rounding and saturationfor every element: Vd[i] = saturate(round((2 * Vn[i] * Vm[index]) >> esize))Vector (SIMD)
sqrshlVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 01011 1 Rn Rd0x0E205C00 / mask 0xBF20FC00Shift per element with rounding and saturation (signed)for every element: Vd[i] = saturate_signed(round(Vn[i] << Vm[i]))Vector (SIMD)
sqrshrnVd.Tb, Vn.Ta, #shiftalso shown as: sqrshrn20 Q 0 011110 0 immh immb 10011 1 Rn Rd0x0F009C00 / mask 0xBFC0FC00Shift right with narrowing, rounding and saturation (signed) (Q = 1: name with 2)for every element: Vd[i] = saturate_signed(round(Vn[i] >> shift))Vector (SIMD)
sqrshrunVd.Tb, Vn.Ta, #shiftalso shown as: sqrshrun20 Q 1 011110 0 immh immb 10001 1 Rn Rd0x2F008C00 / mask 0xBFC0FC00Shift right with narrowing, rounding and saturation (signed source, unsigned result) (Q = 1: name with 2)for every element: Vd[i] = saturate_unsigned(round(Vn[i] >> shift))Vector (SIMD)
sqshlVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 01001 1 Rn Rd0x0E204C00 / mask 0xBF20FC00Shift per element with saturation (signed)for every element: Vd[i] = saturate_signed(Vn[i] << Vm[i])Vector (SIMD)
Vd.T, Vn.T, #shift0 Q 0 011110 immh immb 01110 1 Rn Rd0x0F007400 / mask 0xBF80FC00Shift left with saturation (signed)for every element: Vd[i] = saturate_signed(Vn[i] << shift)Vector (SIMD)
sqshluVd.T, Vn.T, #shift0 Q 1 011110 immh immb 01100 1 Rn Rd0x2F006400 / mask 0xBF80FC00Shift left with saturation (signed source, unsigned result)for every element: Vd[i] = saturate_unsigned(Vn[i] << shift)Vector (SIMD)
sqshrnVd.Tb, Vn.Ta, #shiftalso shown as: sqshrn20 Q 0 011110 0 immh immb 10010 1 Rn Rd0x0F009400 / mask 0xBFC0FC00Shift right with narrowing and saturation (signed) (Q = 1: name with 2)for every element: Vd[i] = saturate_signed(Vn[i] >> shift)Vector (SIMD)
sqshrunVd.Tb, Vn.Ta, #shiftalso shown as: sqshrun20 Q 1 011110 0 immh immb 10000 1 Rn Rd0x2F008400 / mask 0xBFC0FC00Shift right with narrowing and saturation (signed source, unsigned result) (Q = 1: name with 2)for every element: Vd[i] = saturate_unsigned(Vn[i] >> shift)Vector (SIMD)
sqsubVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 00101 1 Rn Rd0x0E202C00 / mask 0xBF20FC00Subtraction with saturation (signed)for every element: Vd[i] = saturate_signed(Vn[i] - Vm[i])Vector (SIMD)
sqxtnVd.T, Vn.Talso shown as: sqxtn20 Q 0 01110 size 10000 10100 10 Rn Rd0x0E214800 / mask 0xBF3FFC00Narrowing with saturation (signed)for every element: Vd[i] = saturate_signed(Vn[i])Vector (SIMD)
sqxtunVd.T, Vn.Talso shown as: sqxtun20 Q 1 01110 size 10000 10010 10 Rn Rd0x2E212800 / mask 0xBF3FFC00Narrowing with saturation (signed source, unsigned result)for every element: Vd[i] = saturate_unsigned(Vn[i])Vector (SIMD)
srhaddVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 00010 1 Rn Rd0x0E201400 / mask 0xBF20FC00Halving addition with rounding (signed)for every element: Vd[i] = (Vn[i] + Vm[i] + 1) >> 1Vector (SIMD)
sriVd.T, Vn.T, #shift0 Q 1 011110 immh immb 01000 1 Rn Rd0x2F004400 / mask 0xBF80FC00Shift right and insert (the high bits of the destination stay)for every element: Vd[i] = (Vd[i] & high_mask) | (Vn[i] >> shift)Vector (SIMD)
srshlVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 01010 1 Rn Rd0x0E205400 / mask 0xBF20FC00Shift per element with rounding (signed)for every element: Vd[i] = round(Vn[i] << Vm[i])Vector (SIMD)
srshrVd.T, Vn.T, #shift0 Q 0 011110 immh immb 00100 1 Rn Rd0x0F002400 / mask 0xBF80FC00Shift right with rounding (signed)for every element: Vd[i] = round(Vn[i] >> shift)Vector (SIMD)
srsraVd.T, Vn.T, #shift0 Q 0 011110 immh immb 00110 1 Rn Rd0x0F003400 / mask 0xBF80FC00Shift right with rounding and addition to the destination (signed)for every element: Vd[i] = Vd[i] + round(Vn[i] >> shift)Vector (SIMD)
sshlVd.T, Vn.T, Vm.T0 Q 0 01110 size 1 Rm 01000 1 Rn Rd0x0E204400 / mask 0xBF20FC00Shift left or right per element (signed)for every element: Vd[i] = Vn[i] << Vm[i] (a negative count shifts right)Vector (SIMD)
sshllVd.Ta, Vn.Tb, #shiftalso shown as: sshll2, sxtl, sxtl20 Q 0 011110 0 immh immb 10100 1 Rn Rd0x0F00A400 / mask 0xBFC0FC00Widening with a left shift (signed; sxtl is a shift by 0)for every element: Vd[i] = sext(Vn[i]) << shiftVector (SIMD)
sshrVd.T, Vn.T, #shift0 Q 0 011110 immh immb 00000 1 Rn Rd0x0F000400 / mask 0xBF80FC00Shift right, signed (arithmetic) (signed)for every element: Vd[i] = Vn[i] >> shiftVector (SIMD)
ssraVd.T, Vn.T, #shift0 Q 0 011110 immh immb 00010 1 Rn Rd0x0F001400 / mask 0xBF80FC00Shift right and addition to the destination (signed)for every element: Vd[i] = Vd[i] + (Vn[i] >> shift)Vector (SIMD)
ssublVd.Tb, Vn.Ta, Vm.Taalso shown as: ssubl20 Q 0 01110 size 1 Rm 0010 00 Rn Rd0x0E202000 / mask 0xBF20FC00Subtraction with widening (signed; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vn[i] - Vm[i] (wide result)Vector (SIMD)
ssubwVd.Tb, Vn.Ta, Vm.Taalso shown as: ssubw20 Q 0 01110 size 1 Rm 0011 00 Rn Rd0x0E203000 / mask 0xBF20FC00Subtraction of a narrow operand from a wide one (signed; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vn[i] - Vm[i] (Vn is wide)Vector (SIMD)
st1{Vt.T}, [Xn|SP]0 Q 0011000 0 000000 0111 size Rn Rt0x0C007000 / mask 0xBFFFF000Store of one vector register to memory[Rn] = VtVector (SIMD)
{Vt.T, Vt2.T}, [Xn|SP]0 Q 0011000 0 000000 1010 size Rn Rt0x0C00A000 / mask 0xBFFFF000Store of 2 registers to memory[Rn] = registers (2 registers)Vector (SIMD)
{Vt.T, Vt2.T, Vt3.T}, [Xn|SP]0 Q 0011000 0 000000 0110 size Rn Rt0x0C006000 / mask 0xBFFFF000Store of 3 registers to memory[Rn] = registers (3 registers)Vector (SIMD)
{Vt.T, Vt2.T, Vt3.T, Vt4.T}, [Xn|SP]0 Q 0011000 0 000000 0010 size Rn Rt0x0C002000 / mask 0xBFFFF000Store of 4 registers to memory[Rn] = registers (4 registers)Vector (SIMD)
{Vt.Ts}[index], [Xn|SP]0 Q 0011010 0 0 00000 e 0 S size Rn Rt0x0D000000 / mask 0xBFFF2000Store of one element (lane) (one register)[Rn] = Vt[index]Vector (SIMD)
st2{Vt.T, Vt2.T}, [Xn|SP]0 Q 0011000 0 000000 1000 size Rn Rt0x0C008000 / mask 0xBFFFF000Store of 2 registers (elements interleaved) to memory[Rn] = registers (2 registers (elements interleaved))Vector (SIMD)
{Vt.T, Vt2.T}, [Xn|SP], Xm|#imm0 Q 0011001 0 0 Rm 1000 size Rn Rt0x0C808000 / mask 0xBFE0F000Store of 2 registers (elements interleaved) with post-indexing[Rn] = registers; Rn = Rn + Xm or the sizeVector (SIMD)
{Vt.Ts, Vt2.Ts}[index], [Xn|SP]0 Q 0011010 0 1 00000 e 0 S size Rn Rt0x0D200000 / mask 0xBFFF2000Store of one element (lane) of 2 registers[Rn] = Vt[index]Vector (SIMD)
st2gXt|SP, [Xn|SP], #imm911011001 101 imm9 01 Rn Rt0xD9A00400 / mask 0xFFE00C00Store of the tag for 32 bytes (post-indexed)tag of [addr] = tag of Xt (imm9 * 16 added to the address)Memory tagging (MTE)
Xt|SP, [Xn|SP{, #imm9}]11011001 101 imm9 10 Rn Rt0xD9A00800 / mask 0xFFE00C00Store of the tag for 32 bytestag of [addr] = tag of Xt (imm9 * 16 added to the address)Memory tagging (MTE)
Xt|SP, [Xn|SP, #imm9]!11011001 101 imm9 11 Rn Rt0xD9A00C00 / mask 0xFFE00C00Store of the tag for 32 bytes (pre-indexed)tag of [addr] = tag of Xt (imm9 * 16 added to the address)Memory tagging (MTE)
st3{Vt.T, Vt2.T, Vt3.T}, [Xn|SP]0 Q 0011000 0 000000 0100 size Rn Rt0x0C004000 / mask 0xBFFFF000Store of 3 registers (elements interleaved) to memory[Rn] = registers (3 registers (elements interleaved))Vector (SIMD)
{Vt.T, Vt2.T, Vt3.T}, [Xn|SP], Xm|#imm0 Q 0011001 0 0 Rm 0100 size Rn Rt0x0C804000 / mask 0xBFE0F000Store of 3 registers (elements interleaved) with post-indexing[Rn] = registers; Rn = Rn + Xm or the sizeVector (SIMD)
{Vt.Ts, Vt2.Ts, Vt3.Ts}[index], [Xn|SP]0 Q 0011010 0 0 00000 e 1 S size Rn Rt0x0D002000 / mask 0xBFFF2000Store of one element (lane) of 3 registers[Rn] = Vt[index]Vector (SIMD)
st4{Vt.T, Vt2.T, Vt3.T, Vt4.T}, [Xn|SP]0 Q 0011000 0 000000 0000 size Rn Rt0x0C000000 / mask 0xBFFFF000Store of 4 registers (elements interleaved) to memory[Rn] = registers (4 registers (elements interleaved))Vector (SIMD)
{Vt.T, Vt2.T, Vt3.T, Vt4.T}, [Xn|SP], Xm|#imm0 Q 0011001 0 0 Rm 0000 size Rn Rt0x0C800000 / mask 0xBFE0F000Store of 4 registers (elements interleaved) with post-indexing[Rn] = registers; Rn = Rn + Xm or the sizeVector (SIMD)
{Vt.Ts, Vt2.Ts, Vt3.Ts, Vt4.Ts}[index], [Xn|SP]0 Q 0011010 0 1 00000 e 1 S size Rn Rt0x0D202000 / mask 0xBFFF2000Store of one element (lane) of 4 registers[Rn] = Vt[index]Vector (SIMD)
stgXt|SP, [Xn|SP], #imm911011001 001 imm9 01 Rn Rt0xD9200400 / mask 0xFFE00C00Store of the tag of an address for 16 bytes (post-indexed)tag of [addr] = tag of Xt (imm9 * 16 added to the address)Memory tagging (MTE)
Xt|SP, [Xn|SP{, #imm9}]11011001 001 imm9 10 Rn Rt0xD9200800 / mask 0xFFE00C00Store of the tag of an address for 16 bytestag of [addr] = tag of Xt (imm9 * 16 added to the address)Memory tagging (MTE)
Xt|SP, [Xn|SP, #imm9]!11011001 001 imm9 11 Rn Rt0xD9200C00 / mask 0xFFE00C00Store of the tag of an address for 16 bytes (pre-indexed)tag of [addr] = tag of Xt (imm9 * 16 added to the address)Memory tagging (MTE)
stgpXt, Xt2, [Xn|SP], #imm701 101 0 001 0 imm7 Rt2 Rn Rt0x68800000 / mask 0xFFC00000Store of a register pair and the tag (post-indexed)[addr] = Xt, Xt2; tag of [addr] = tag of RnMemory tagging (MTE)
Xt, Xt2, [Xn|SP{, #imm7}]01 101 0 010 0 imm7 Rt2 Rn Rt0x69000000 / mask 0xFFC00000Store of a register pair and the tag[addr] = Xt, Xt2; tag of [addr] = tag of RnMemory tagging (MTE)
Xt, Xt2, [Xn|SP, #imm7]!01 101 0 011 0 imm7 Rt2 Rn Rt0x69800000 / mask 0xFFC00000Store of a register pair and the tag (pre-indexed)[addr] = Xt, Xt2; tag of [addr] = tag of RnMemory tagging (MTE)
stllrWt, [Xn|SP]also shown as: stllrb, stllrhsize 001000 1 0 0 11111 0 11111 Rn Rt0x089F7C00 / mask 0x3FFFFC00Store with release for an ordered memory region (LORegion; b = byte, h = half word)[Rn] = WtLoads and stores
stlrWt, [Xn|SP]10 001000 1 0 0 11111 1 11111 Rn Rt0x889FFC00 / mask 0xFFFFFC00Store with release (word)release; [Rn] = RtLoads and stores
Xt, [Xn|SP]11 001000 1 0 0 11111 1 11111 Rn Rt0xC89FFC00 / mask 0xFFFFFC00Store with release (double word)release; [Rn] = RtLoads and stores
stlrbWt, [Xn|SP]00 001000 1 0 0 11111 1 11111 Rn Rt0x089FFC00 / mask 0xFFFFFC00Store with release (byte)release; [Rn] = RtLoads and stores
stlrhWt, [Xn|SP]01 001000 1 0 0 11111 1 11111 Rn Rt0x489FFC00 / mask 0xFFFFFC00Store with release (half word)release; [Rn] = RtLoads and stores
stlurWt, [Xn|SP{, #imm9}]also shown as: stlurb, stlurhsize 011 001 00 0 imm9 00 Rn Rt0x19000000 / mask 0x3FE00C00Store with release (unscaled, address: Rn + imm9; b = byte, h = half word)[Rn + imm9] = WtLoads and stores
stlxpWs, Rt, Rt2, [Xn|SP]1 sz 001000 0 0 1 Rs 1 Rt2 Rn Rt0x88208000 / mask 0xBFE08000Store-exclusive of a register pair with releaseif the exclusive monitor is set then { release; [Rn] = Rt; [Rn + size] = Rt2; Ws = 0 } else Ws = 1Loads and stores
stlxrWs, Wt, [Xn|SP]10 001000 0 0 0 Rs 1 11111 Rn Rt0x8800FC00 / mask 0xFFE0FC00Store-exclusive with release (word)if the exclusive monitor is set then { release; [Rn] = Rt; Ws = 0 } else Ws = 1Loads and stores
Ws, Xt, [Xn|SP]11 001000 0 0 0 Rs 1 11111 Rn Rt0xC800FC00 / mask 0xFFE0FC00Store-exclusive with release (double word)if the exclusive monitor is set then { release; [Rn] = Rt; Ws = 0 } else Ws = 1Loads and stores
stlxrbWs, Wt, [Xn|SP]00 001000 0 0 0 Rs 1 11111 Rn Rt0x0800FC00 / mask 0xFFE0FC00Store-exclusive with release (byte)if the exclusive monitor is set then { release; [Rn] = Rt; Ws = 0 } else Ws = 1Loads and stores
stlxrhWs, Wt, [Xn|SP]01 001000 0 0 0 Rs 1 11111 Rn Rt0x4800FC00 / mask 0xFFE0FC00Store-exclusive with release (half word)if the exclusive monitor is set then { release; [Rn] = Rt; Ws = 0 } else Ws = 1Loads and stores
stnpRt, Rt2, [Xn|SP{, #imm7}]sf 0 101 0 000 0 imm7 Rt2 Rn Rt0x28000000 / mask 0x7FC00000Store of a register pair with a non-temporal hint[addr] = Rt; [addr + size] = Rt2Loads and stores
stpRt, Rt2, [Xn|SP], #imm7sf 0 101 0 001 0 imm7 Rt2 Rn Rt0x28800000 / mask 0x7FC00000Store of a register pair (post-indexed)[addr] = Rt; [addr + size] = Rt2; addr = Rn; Rn = Rn + imm7 * sizeLoads and stores
Rt, Rt2, [Xn|SP{, #imm7}]sf 0 101 0 010 0 imm7 Rt2 Rn Rt0x29000000 / mask 0x7FC00000Store of a register pair[addr] = Rt; [addr + size] = Rt2; addr = Rn + imm7 * sizeLoads and stores
Rt, Rt2, [Xn|SP, #imm7]!sf 0 101 0 011 0 imm7 Rt2 Rn Rt0x29800000 / mask 0x7FC00000Store of a register pair (pre-indexed)[addr] = Rt; [addr + size] = Rt2; Rn = Rn + imm7 * size; addr = RnLoads and stores
Ft, Ft2, [Xn|SP{, #imm7}]opc 101 1 010 0 imm7 Rt2 Rn Rt0x2D000000 / mask 0x3FC00000Store of a pair of floating point / vector registers (opc 00 = S, 01 = D, 10 = Q)[addr] = Ft; [addr + size] = Ft2Loads and stores
strWt, [Xn|SP{, #imm12}]10 111 0 01 00 imm12 Rn Rt0xB9000000 / mask 0xFFC00000Store of a word (32 bit) (address: Rn + imm12 * size)[addr] = Wt; addr = Rn + imm12 * sizeLoads and stores
Wt, [Xn|SP, #imm9]!10 111 0 00 00 0 imm9 11 Rn Rt0xB8000C00 / mask 0xFFE00C00Store of a word (32 bit) (pre-indexed: Rn is changed first)[addr] = Wt; Rn = Rn + imm9; addr = RnLoads and stores
Wt, [Xn|SP], #imm910 111 0 00 00 0 imm9 01 Rn Rt0xB8000400 / mask 0xFFE00C00Store of a word (32 bit) (post-indexed: Rn is changed afterwards)[addr] = Wt; addr = Rn; Rn = Rn + imm9Loads and stores
Wt, [Xn|SP, Rm{, extend {#amount}}]10 111 0 00 00 1 Rm option S 10 Rn Rt0xB8200800 / mask 0xFFE00C00Store of a word (32 bit) (address: Rn + register, extended and shifted)[addr] = Wt; addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
Xt, [Xn|SP{, #imm12}]11 111 0 01 00 imm12 Rn Rt0xF9000000 / mask 0xFFC00000Store of a double word (64 bit) (address: Rn + imm12 * size)[addr] = Xt; addr = Rn + imm12 * sizeLoads and stores
Xt, [Xn|SP, #imm9]!11 111 0 00 00 0 imm9 11 Rn Rt0xF8000C00 / mask 0xFFE00C00Store of a double word (64 bit) (pre-indexed: Rn is changed first)[addr] = Xt; Rn = Rn + imm9; addr = RnLoads and stores
Xt, [Xn|SP], #imm911 111 0 00 00 0 imm9 01 Rn Rt0xF8000400 / mask 0xFFE00C00Store of a double word (64 bit) (post-indexed: Rn is changed afterwards)[addr] = Xt; addr = Rn; Rn = Rn + imm9Loads and stores
Xt, [Xn|SP, Rm{, extend {#amount}}]11 111 0 00 00 1 Rm option S 10 Rn Rt0xF8200800 / mask 0xFFE00C00Store of a double word (64 bit) (address: Rn + register, extended and shifted)[addr] = Xt; addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
Ft, [Xn|SP{, #imm12}]1 x 111 1 01 00 imm12 Rn Rt0xBD000000 / mask 0xBFC00000Store of a single (x=0) or double (x=1) register[Rn + imm12 * size] = FtLoads and stores
Qt, [Xn|SP{, #imm12}]00 111 1 01 10 imm12 Rn Rt0x3D800000 / mask 0xFFC00000Store of a 128-bit vector register[Rn + imm12 * 16] = QtLoads and stores
strbWt, [Xn|SP{, #imm12}]00 111 0 01 00 imm12 Rn Rt0x39000000 / mask 0xFFC00000Store of a byte (address: Rn + imm12 * size)[addr] = Wt[7:0]; addr = Rn + imm12 * sizeLoads and stores
Wt, [Xn|SP, #imm9]!00 111 0 00 00 0 imm9 11 Rn Rt0x38000C00 / mask 0xFFE00C00Store of a byte (pre-indexed: Rn is changed first)[addr] = Wt[7:0]; Rn = Rn + imm9; addr = RnLoads and stores
Wt, [Xn|SP], #imm900 111 0 00 00 0 imm9 01 Rn Rt0x38000400 / mask 0xFFE00C00Store of a byte (post-indexed: Rn is changed afterwards)[addr] = Wt[7:0]; addr = Rn; Rn = Rn + imm9Loads and stores
Wt, [Xn|SP, Rm{, extend {#amount}}]00 111 0 00 00 1 Rm option S 10 Rn Rt0x38200800 / mask 0xFFE00C00Store of a byte (address: Rn + register, extended and shifted)[addr] = Wt[7:0]; addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
strhWt, [Xn|SP{, #imm12}]01 111 0 01 00 imm12 Rn Rt0x79000000 / mask 0xFFC00000Store of a half word (16 bit) (address: Rn + imm12 * size)[addr] = Wt[15:0]; addr = Rn + imm12 * sizeLoads and stores
Wt, [Xn|SP, #imm9]!01 111 0 00 00 0 imm9 11 Rn Rt0x78000C00 / mask 0xFFE00C00Store of a half word (16 bit) (pre-indexed: Rn is changed first)[addr] = Wt[15:0]; Rn = Rn + imm9; addr = RnLoads and stores
Wt, [Xn|SP], #imm901 111 0 00 00 0 imm9 01 Rn Rt0x78000400 / mask 0xFFE00C00Store of a half word (16 bit) (post-indexed: Rn is changed afterwards)[addr] = Wt[15:0]; addr = Rn; Rn = Rn + imm9Loads and stores
Wt, [Xn|SP, Rm{, extend {#amount}}]01 111 0 00 00 1 Rm option S 10 Rn Rt0x78200800 / mask 0xFFE00C00Store of a half word (16 bit) (address: Rn + register, extended and shifted)[addr] = Wt[15:0]; addr = Rn + extend(Rm) << (S * log2(size))Loads and stores
sttrWt, [Xn|SP{, #imm9}]also shown as: sttrb, sttrhsize 111 0 00 00 0 imm9 10 Rn Rt0x38000800 / mask 0x3FE00C00Store with the rights of user mode (unprivileged; b = byte, h = half word)[Rn + imm9] = WtLoads and stores
sturWt, [Xn|SP{, #imm9}]10 111 0 00 00 0 imm9 00 Rn Rt0xB8000000 / mask 0xFFE00C00Store of a word (32 bit) (unscaled, address: Rn + imm9)[addr] = Wt; addr = Rn + imm9Loads and stores
Xt, [Xn|SP{, #imm9}]11 111 0 00 00 0 imm9 00 Rn Rt0xF8000000 / mask 0xFFE00C00Store of a double word (64 bit) (unscaled, address: Rn + imm9)[addr] = Xt; addr = Rn + imm9Loads and stores
sturbWt, [Xn|SP{, #imm9}]00 111 0 00 00 0 imm9 00 Rn Rt0x38000000 / mask 0xFFE00C00Store of a byte (unscaled, address: Rn + imm9)[addr] = Wt[7:0]; addr = Rn + imm9Loads and stores
sturhWt, [Xn|SP{, #imm9}]01 111 0 00 00 0 imm9 00 Rn Rt0x78000000 / mask 0xFFE00C00Store of a half word (16 bit) (unscaled, address: Rn + imm9)[addr] = Wt[15:0]; addr = Rn + imm9Loads and stores
stxpWs, Rt, Rt2, [Xn|SP]1 sz 001000 0 0 1 Rs 0 Rt2 Rn Rt0x88200000 / mask 0xBFE08000Store-exclusive of a register pairif the exclusive monitor is set then { [Rn] = Rt; [Rn + size] = Rt2; Ws = 0 } else Ws = 1Loads and stores
stxrWs, Wt, [Xn|SP]10 001000 0 0 0 Rs 0 11111 Rn Rt0x88007C00 / mask 0xFFE0FC00Store-exclusive: Ws = 0 on success (word)if the exclusive monitor is set then { [Rn] = Rt; Ws = 0 } else Ws = 1Loads and stores
Ws, Xt, [Xn|SP]11 001000 0 0 0 Rs 0 11111 Rn Rt0xC8007C00 / mask 0xFFE0FC00Store-exclusive: Ws = 0 on success (double word)if the exclusive monitor is set then { [Rn] = Rt; Ws = 0 } else Ws = 1Loads and stores
stxrbWs, Wt, [Xn|SP]00 001000 0 0 0 Rs 0 11111 Rn Rt0x08007C00 / mask 0xFFE0FC00Store-exclusive: Ws = 0 on success (byte)if the exclusive monitor is set then { [Rn] = Rt; Ws = 0 } else Ws = 1Loads and stores
stxrhWs, Wt, [Xn|SP]01 001000 0 0 0 Rs 0 11111 Rn Rt0x48007C00 / mask 0xFFE0FC00Store-exclusive: Ws = 0 on success (half word)if the exclusive monitor is set then { [Rn] = Rt; Ws = 0 } else Ws = 1Loads and stores
stz2gXt|SP, [Xn|SP], #imm911011001 111 imm9 01 Rn Rt0xD9E00400 / mask 0xFFE00C00Store of the tag and zeroing of 32 bytes (post-indexed)tag of [addr] = tag of Xt (imm9 * 16 added to the address)Memory tagging (MTE)
Xt|SP, [Xn|SP{, #imm9}]11011001 111 imm9 10 Rn Rt0xD9E00800 / mask 0xFFE00C00Store of the tag and zeroing of 32 bytestag of [addr] = tag of Xt (imm9 * 16 added to the address)Memory tagging (MTE)
Xt|SP, [Xn|SP, #imm9]!11011001 111 imm9 11 Rn Rt0xD9E00C00 / mask 0xFFE00C00Store of the tag and zeroing of 32 bytes (pre-indexed)tag of [addr] = tag of Xt (imm9 * 16 added to the address)Memory tagging (MTE)
stzgXt|SP, [Xn|SP], #imm911011001 011 imm9 01 Rn Rt0xD9600400 / mask 0xFFE00C00Store of the tag and zeroing of 16 bytes (post-indexed)tag of [addr] = tag of Xt (imm9 * 16 added to the address)Memory tagging (MTE)
Xt|SP, [Xn|SP{, #imm9}]11011001 011 imm9 10 Rn Rt0xD9600800 / mask 0xFFE00C00Store of the tag and zeroing of 16 bytestag of [addr] = tag of Xt (imm9 * 16 added to the address)Memory tagging (MTE)
Xt|SP, [Xn|SP, #imm9]!11011001 011 imm9 11 Rn Rt0xD9600C00 / mask 0xFFE00C00Store of the tag and zeroing of 16 bytes (pre-indexed)tag of [addr] = tag of Xt (imm9 * 16 added to the address)Memory tagging (MTE)
stzgmXt, [Xn|SP]11011001 001 000000000 00 Rn Rt0xD9200000 / mask 0xFFFFFC00Store of several tags and zeroing of the memory (size from the system)tags and memory of the block at Rn = XtMemory tagging (MTE)
subRd, Rn, #imm12{, lsl #12}sf 1 0 100010 sh imm12 Rn Rd0x51000000 / mask 0x7F800000Subtraction of a constant (12 bit, optionally shifted left by 12)Rd = Rn - (imm12 << (sh * 12)) (Rd and Rn may be SP)Arithmetic
Rd, Rn, Rm{, shift #imm6}also shown as: negsf 1 0 01011 shift 0 Rm imm6 Rn Rd0x4B000000 / mask 0x7F200000Subtraction with a shifted registerRd = Rn - shift(Rm, imm6)Arithmetic
Rd, Rn, Rm{, extend #imm3}sf 1 0 01011 00 1 Rm option imm3 Rn Rd0x4B200000 / mask 0x7FE00000Subtraction with an extended registerRd = Rn - (extend(Rm) << imm3) (Rd and Rn may be SP)Arithmetic
Vd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 10000 1 Rn Rd0x2E208400 / mask 0xBF20FC00Subtraction of the elementsfor every element: Vd[i] = Vn[i] - Vm[i]Vector (SIMD)
subgXd|SP, Xn|SP, #uimm6, #uimm41 1 0 100011 0 imm6 00 imm4 Rn Rd0xD1800000 / mask 0xFFC0C000Subtraction from an address with a change of the tagXd = Xn - uimm6 * 16, tag = (tag of Xn - uimm4) modulo 16Memory tagging (MTE)
subhnVd.Tb, Vn.Ta, Vm.Taalso shown as: subhn20 Q 0 01110 size 1 Rm 0110 00 Rn Rd0x0E206000 / mask 0xBF20FC00Subtraction with narrowing (high half; rsubhn with rounding) (signed; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = high half of (Vn[i] - Vm[i])Vector (SIMD)
subpXd, Xn|SP, Xm|SP1 0 0 11010110 Rm 000000 Rn Rd0x9AC00000 / mask 0xFFE0FC00Difference of two addresses without tags (56 bit, signed)Xd = sext(Xn[55:0]) - sext(Xm[55:0])Memory tagging (MTE)
subpsXd, Xn|SP, Xm|SP1 0 1 11010110 Rm 000000 Rn Rd0xBAC00000 / mask 0xFFE0FC00Difference of two addresses without tags, sets the flagsXd = sext(Xn[55:0]) - sext(Xm[55:0])Flags: N Z C VMemory tagging (MTE)
subsRd, Rn, #imm12{, lsl #12}also shown as: cmpsf 1 1 100010 sh imm12 Rn Rd0x71000000 / mask 0x7F800000Subtraction of a constant, sets the flagsRd = Rn - (imm12 << (sh * 12))Flags: N Z C VArithmetic
Rd, Rn, Rm{, shift #imm6}also shown as: cmp, negssf 1 1 01011 shift 0 Rm imm6 Rn Rd0x6B000000 / mask 0x7F200000Subtraction with a shifted register, sets the flagsRd = Rn - shift(Rm, imm6)Flags: N Z C VArithmetic
Rd, Rn, Rm{, extend #imm3}also shown as: cmpsf 1 1 01011 00 1 Rm option imm3 Rn Rd0x6B200000 / mask 0x7FE00000Subtraction with an extended register, sets the flagsRd = Rn - (extend(Rm) << imm3)Flags: N Z C VArithmetic
sudotVd.4S, Vn.16B, Vm.4B[index]0 Q 0 01111 00 L M Rm 1111 H 0 Rn Rd0x0F00F000 / mask 0xBFC0F400Dot product of four bytes each with an element (Vn signed, Vm unsigned), added to the 32-bit destinationfor every element: Vd[i] = Vd[i] + sum of Vn[4i+k] * Vm[index][k]Vector (SIMD)
suqaddVd.T, Vn.T0 Q 0 01110 size 10000 00011 10 Rn Rd0x0E203800 / mask 0xBF3FFC00Addition of an unsigned value to a signed one, with saturationfor every element: Vd[i] = saturate_signed(Vd[i] + Vn[i])Vector (SIMD)
svc#imm1611010100 000 imm16 000 010xD4000001 / mask 0xFFE0001FSupervisor call to the operating system (exception level 1)raise a supervisor call exception with imm16System and privileged
swpWs, Wt, [Xn|SP]also shown as: swpa, swpal, swpl, swpb, swpab, swpalb, swplb, swph, swpah, swpalh, swplhsize 111 0 00 A R 1 Rs 1 000 00 Rn Rt0x38208000 / mask 0x3F20FC00Atomic exchange of a register with memory (variants: b = byte, h = half word, a = acquire, l = release)t = [Rn]; [Rn] = Ws; Wt = tAtomic memory operations (LSE)
sys#op1, Cn, Cm, #op2{, Xt}also shown as: sysl, tlbi1101010100 L 01 op1 CRn CRm op2 Rt0xD5080000 / mask 0xFFD80000System instruction (cache, TLB and address translation operations, also written as dc, ic, at, tlbi; sysl reads a result)execute the system operation (op1, Cn, Cm, op2) with XtSystem and privileged
tblVd.T, {Vn.16B ...}, Vm.Talso shown as: tbx0 Q 001110 00 0 Rm 0 len op 00 Rn Rd0x0E000000 / mask 0xBFE08C00Lookup of bytes in a table of 1 to 4 vectors (tbx leaves bytes out of range unchanged, tbl sets them to 0)for every element: Vd[i] = table[Vm[i]]Vector (SIMD)
tbnzRt, #bit, labelb5 011011 1 b40 imm14 Rt0x37000000 / mask 0x7F000000Jump if one bit of the register is 1if bit(b5:b40) of Rt == 1 then pc = pc + sext(imm14 << 2)Branches and calls
tbzRt, #bit, labelb5 011011 0 b40 imm14 Rt0x36000000 / mask 0x7F000000Jump if one bit of the register is 0if bit(b5:b40) of Rt == 0 then pc = pc + sext(imm14 << 2)Branches and calls
tcancel#imm1611010100 011 imm16 000 000xD4600000 / mask 0xFFE0001FCancel of a transaction (TME)abort the transaction with the reason imm16System and privileged
trn1Vd.T, Vn.T, Vm.T0 Q 0 01110 size 0 Rm 0 010 10 Rn Rd0x0E002800 / mask 0xBF20FC00Transposition: even-numbered elements alternately from two vectorsVd = Vn[0], Vm[0], Vn[2], Vm[2] ...Vector (SIMD)
trn2Vd.T, Vn.T, Vm.T0 Q 0 01110 size 0 Rm 0 110 10 Rn Rd0x0E006800 / mask 0xBF20FC00Transposition: odd-numbered elements alternately from two vectorsVd = Vn[1], Vm[1], Vn[3], Vm[3] ...Vector (SIMD)
uabaVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 01111 1 Rn Rd0x2E207C00 / mask 0xBF20FC00Addition of the absolute difference to the destination (unsigned)for every element: Vd[i] = Vd[i] + abs(Vn[i] - Vm[i])Vector (SIMD)
uabalVd.Tb, Vn.Ta, Vm.Taalso shown as: uabal20 Q 1 01110 size 1 Rm 0101 00 Rn Rd0x2E205000 / mask 0xBF20FC00Addition of the absolute difference with widening (unsigned; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vd[i] + abs(Vn[i] - Vm[i])Vector (SIMD)
uabdVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 01110 1 Rn Rd0x2E207400 / mask 0xBF20FC00Absolute difference (unsigned)for every element: Vd[i] = abs(Vn[i] - Vm[i])Vector (SIMD)
uabdlVd.Tb, Vn.Ta, Vm.Taalso shown as: uabdl20 Q 1 01110 size 1 Rm 0111 00 Rn Rd0x2E207000 / mask 0xBF20FC00Absolute difference with widening (unsigned; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = abs(Vn[i] - Vm[i]) (wide result)Vector (SIMD)
uadalpVd.T, Vn.T0 Q 1 01110 size 10000 00110 10 Rn Rd0x2E206800 / mask 0xBF3FFC00Pairwise addition with widening, added to the destination (unsigned)for every element: Vd[i] = Vd[i] + Vn[2i] + Vn[2i+1]Vector (SIMD)
uaddlVd.Tb, Vn.Ta, Vm.Taalso shown as: uaddl20 Q 1 01110 size 1 Rm 0000 00 Rn Rd0x2E200000 / mask 0xBF20FC00Addition with widening (both operands become twice as wide) (unsigned; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vn[i] + Vm[i] (wide result)Vector (SIMD)
uaddlpVd.T, Vn.T0 Q 1 01110 size 10000 00010 10 Rn Rd0x2E202800 / mask 0xBF3FFC00Pairwise addition of adjacent elements with widening (unsigned)for every element: Vd[i] = Vn[2i] + Vn[2i+1]Vector (SIMD)
uaddlvVd, Vn.T0 Q 1 01110 size 11000 00011 10 Rn Rd0x2E303800 / mask 0xBF3FFC00Sum of all elements with widening (unsigned)Vd = sum of all elements of VnVector (SIMD)
uaddwVd.Tb, Vn.Ta, Vm.Taalso shown as: uaddw20 Q 1 01110 size 1 Rm 0001 00 Rn Rd0x2E201000 / mask 0xBF20FC00Addition of a wide and a narrow operand (unsigned; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vn[i] + Vm[i] (Vn is wide)Vector (SIMD)
ubfmRd, Rn, #immr, #immsalso shown as: lsl, lsr, ubfiz, ubfx, uxtb, uxthsf 1 0 100110 N immr imms Rn Rd0x53000000 / mask 0x7F800000Bitfield move with zeros (base form of lsl, lsr, ubfx, uxtb ...)Rd = zero-extended field of Rn selected by immr, immsBitfields
ucvtfFd, Rnsf 0 0 11110 ftype 1 00 011 000000 Rn Rd0x1E230000 / mask 0x7F3FFC00Conversion of an unsigned integer to floating pointFd = (float) zext(Rn)Floating point (scalar)
Vd.T, Vn.T0 Q 1 01110 0 sz 10000 11101 10 Rn Rd0x2E21D800 / mask 0xBFBFFC00Conversion of an unsigned integer to floating pointfor every element: Vd[i] = (float) Vn[i]Vector (SIMD)
udf#imm160000000000000000 imm160x00000000 / mask 0xFFFF0000Permanently undefined instruction (always raises an exception)raise undefined-instruction exceptionSystem and privileged
udivRd, Rn, Rmsf 0 0 11010110 Rm 000010 Rn Rd0x1AC00800 / mask 0x7FE0FC00Unsigned division (division by 0 gives 0)Rd = Rn / RmArithmetic
udotVd.4S, Vn.16B, Vm.16B0 Q 1 01110 10 0 Rm 10010 1 Rn Rd0x2E809400 / mask 0xBFE0FC00Dot product of four bytes each (unsigned), added to the 32-bit destinationfor every element: Vd[i] = Vd[i] + sum of Vn[4i+k] * Vm[4i+k]Vector (SIMD)
uhaddVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 00000 1 Rn Rd0x2E200400 / mask 0xBF20FC00Halving addition (unsigned)for every element: Vd[i] = (Vn[i] + Vm[i]) >> 1Vector (SIMD)
uhsubVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 00100 1 Rn Rd0x2E202400 / mask 0xBF20FC00Halving subtraction (unsigned)for every element: Vd[i] = (Vn[i] - Vm[i]) >> 1Vector (SIMD)
umaddlXd, Wn, Wm, Xaalso shown as: umull1 00 11011 101 Rm 0 Ra Rn Rd0x9BA00000 / mask 0xFFE08000Unsigned multiply 32 x 32 bit, added to 64 bitXd = Xa + zext(Wn) * zext(Wm)Arithmetic
umaxVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 01100 1 Rn Rd0x2E206400 / mask 0xBF20FC00Maximum of the elements (unsigned)for every element: Vd[i] = max_unsigned(Vn[i], Vm[i])Vector (SIMD)
umaxpVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 10100 1 Rn Rd0x2E20A400 / mask 0xBF20FC00Maximum of adjacent element pairs (unsigned)for every element: Vd[i] = max_unsigned of each pair of (Vn:Vm)Vector (SIMD)
umaxvVd, Vn.T0 Q 1 01110 size 11000 01010 10 Rn Rd0x2E30A800 / mask 0xBF3FFC00Maximum of all elements (unsigned)Vd = max_unsigned of all elements of VnVector (SIMD)
uminVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 01101 1 Rn Rd0x2E206C00 / mask 0xBF20FC00Minimum of the elements (unsigned)for every element: Vd[i] = min_unsigned(Vn[i], Vm[i])Vector (SIMD)
uminpVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 10101 1 Rn Rd0x2E20AC00 / mask 0xBF20FC00Minimum of adjacent element pairs (unsigned)for every element: Vd[i] = min_unsigned of each pair of (Vn:Vm)Vector (SIMD)
uminvVd, Vn.T0 Q 1 01110 size 11000 11010 10 Rn Rd0x2E31A800 / mask 0xBF3FFC00Minimum of all elements (unsigned)Vd = min_unsigned of all elements of VnVector (SIMD)
umlalVd.Tb, Vn.Ta, Vm.Taalso shown as: umlal20 Q 1 01110 size 1 Rm 1000 00 Rn Rd0x2E208000 / mask 0xBF20FC00Multiplication with widening, added to the destination (unsigned; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vd[i] + Vn[i] * Vm[i]Vector (SIMD)
Vd.Ta, Vn.Tb, Vm.Ts[index]also shown as: umlal20 Q 1 01111 size L M Rm 0010 H 0 Rn Rd0x2F002000 / mask 0xBF00F400Multiplication by an element with widening, added to the destination (unsigned) (Q = 1: name with 2)for every element: Vd[i] = Vd[i] + Vn[i] * Vm[index]Vector (SIMD)
umlslVd.Tb, Vn.Ta, Vm.Taalso shown as: umlsl20 Q 1 01110 size 1 Rm 1010 00 Rn Rd0x2E20A000 / mask 0xBF20FC00Multiplication with widening, subtracted from the destination (unsigned; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vd[i] - Vn[i] * Vm[i]Vector (SIMD)
Vd.Ta, Vn.Tb, Vm.Ts[index]also shown as: umlsl20 Q 1 01111 size L M Rm 0110 H 0 Rn Rd0x2F006000 / mask 0xBF00F400Multiplication by an element with widening, subtracted from the destination (unsigned) (Q = 1: name with 2)for every element: Vd[i] = Vd[i] - Vn[i] * Vm[index]Vector (SIMD)
ummlaVd.4S, Vn.16B, Vm.16B0 1 1 01110 10 0 Rm 10100 1 Rn Rd0x6E80A400 / mask 0xFFE0FC00Matrix multiplication 2x8 times 8x2 (unsigned), added to the destinationVd(2x2) = Vd(2x2) + Vn(2x8) * Vm(8x2)Vector (SIMD)
umovRd, Vn.Ts[index]also shown as: mov0 Q 0 01110000 imm5 0 0111 1 Rn Rd0x0E003C00 / mask 0xBFE0FC00Copy of an element into an integer register (unsigned)Rd = zext(Vn[index])Vector (SIMD)
umsublXd, Wn, Wm, Xaalso shown as: umnegl1 00 11011 101 Rm 1 Ra Rn Rd0x9BA08000 / mask 0xFFE08000Unsigned multiply 32 x 32 bit, subtracted from 64 bitXd = Xa - zext(Wn) * zext(Wm)Arithmetic
umulhXd, Xn, Xm1 00 11011 110 Rm 0 11111 Rn Rd0x9BC07C00 / mask 0xFFE0FC00Unsigned multiply, the high 64 bits of the resultXd = (zext(Xn) * zext(Xm)) >> 64Arithmetic
umullVd.Tb, Vn.Ta, Vm.Taalso shown as: umull20 Q 1 01110 size 1 Rm 1100 00 Rn Rd0x2E20C000 / mask 0xBF20FC00Multiplication with widening (unsigned; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vn[i] * Vm[i] (wide result)Vector (SIMD)
Vd.Ta, Vn.Tb, Vm.Ts[index]also shown as: umull20 Q 1 01111 size L M Rm 1010 H 0 Rn Rd0x2F00A000 / mask 0xBF00F400Multiplication by an element with widening (unsigned) (Q = 1: name with 2)for every element: Vd[i] = Vn[i] * Vm[index]Vector (SIMD)
uqaddVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 00001 1 Rn Rd0x2E200C00 / mask 0xBF20FC00Addition with saturation (unsigned)for every element: Vd[i] = saturate_unsigned(Vn[i] + Vm[i])Vector (SIMD)
uqrshlVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 01011 1 Rn Rd0x2E205C00 / mask 0xBF20FC00Shift per element with rounding and saturation (unsigned)for every element: Vd[i] = saturate_unsigned(round(Vn[i] << Vm[i]))Vector (SIMD)
uqrshrnVd.Tb, Vn.Ta, #shiftalso shown as: uqrshrn20 Q 1 011110 0 immh immb 10011 1 Rn Rd0x2F009C00 / mask 0xBFC0FC00Shift right with narrowing, rounding and saturation (unsigned) (Q = 1: name with 2)for every element: Vd[i] = saturate_unsigned(round(Vn[i] >> shift))Vector (SIMD)
uqshlVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 01001 1 Rn Rd0x2E204C00 / mask 0xBF20FC00Shift per element with saturation (unsigned)for every element: Vd[i] = saturate_unsigned(Vn[i] << Vm[i])Vector (SIMD)
Vd.T, Vn.T, #shift0 Q 1 011110 immh immb 01110 1 Rn Rd0x2F007400 / mask 0xBF80FC00Shift left with saturation (unsigned)for every element: Vd[i] = saturate_unsigned(Vn[i] << shift)Vector (SIMD)
uqshrnVd.Tb, Vn.Ta, #shiftalso shown as: uqshrn20 Q 1 011110 0 immh immb 10010 1 Rn Rd0x2F009400 / mask 0xBFC0FC00Shift right with narrowing and saturation (unsigned) (Q = 1: name with 2)for every element: Vd[i] = saturate_unsigned(Vn[i] >> shift)Vector (SIMD)
uqsubVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 00101 1 Rn Rd0x2E202C00 / mask 0xBF20FC00Subtraction with saturation (unsigned)for every element: Vd[i] = saturate_unsigned(Vn[i] - Vm[i])Vector (SIMD)
uqxtnVd.T, Vn.Talso shown as: uqxtn20 Q 1 01110 size 10000 10100 10 Rn Rd0x2E214800 / mask 0xBF3FFC00Narrowing with saturation (unsigned)for every element: Vd[i] = saturate_unsigned(Vn[i])Vector (SIMD)
urhaddVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 00010 1 Rn Rd0x2E201400 / mask 0xBF20FC00Halving addition with rounding (unsigned)for every element: Vd[i] = (Vn[i] + Vm[i] + 1) >> 1Vector (SIMD)
urshlVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 01010 1 Rn Rd0x2E205400 / mask 0xBF20FC00Shift per element with rounding (unsigned)for every element: Vd[i] = round(Vn[i] << Vm[i])Vector (SIMD)
urshrVd.T, Vn.T, #shift0 Q 1 011110 immh immb 00100 1 Rn Rd0x2F002400 / mask 0xBF80FC00Shift right with rounding (unsigned)for every element: Vd[i] = round(Vn[i] >> shift)Vector (SIMD)
ursraVd.T, Vn.T, #shift0 Q 1 011110 immh immb 00110 1 Rn Rd0x2F003400 / mask 0xBF80FC00Shift right with rounding and addition to the destination (unsigned)for every element: Vd[i] = Vd[i] + round(Vn[i] >> shift)Vector (SIMD)
usdotVd.4S, Vn.16B, Vm.16B0 Q 0 01110 10 0 Rm 10011 1 Rn Rd0x0E809C00 / mask 0xBFE0FC00Dot product of four bytes each (Vn unsigned, Vm signed), added to the 32-bit destinationfor every element: Vd[i] = Vd[i] + sum of Vn[4i+k] * Vm[4i+k]Vector (SIMD)
ushlVd.T, Vn.T, Vm.T0 Q 1 01110 size 1 Rm 01000 1 Rn Rd0x2E204400 / mask 0xBF20FC00Shift left or right per element (unsigned)for every element: Vd[i] = Vn[i] << Vm[i] (a negative count shifts right)Vector (SIMD)
ushllVd.Ta, Vn.Tb, #shiftalso shown as: ushll2, uxtl, uxtl20 Q 1 011110 0 immh immb 10100 1 Rn Rd0x2F00A400 / mask 0xBFC0FC00Widening with a left shift (unsigned; uxtl is a shift by 0)for every element: Vd[i] = zext(Vn[i]) << shiftVector (SIMD)
ushrVd.T, Vn.T, #shift0 Q 1 011110 immh immb 00000 1 Rn Rd0x2F000400 / mask 0xBF80FC00Shift right, signed (arithmetic) (unsigned)for every element: Vd[i] = Vn[i] >> shiftVector (SIMD)
usmmlaVd.4S, Vn.16B, Vm.16B0 1 0 01110 10 0 Rm 10101 1 Rn Rd0x4E80AC00 / mask 0xFFE0FC00Matrix multiplication 2x8 times 8x2 (Vn unsigned, Vm signed), added to the destinationVd(2x2) = Vd(2x2) + Vn(2x8) * Vm(8x2)Vector (SIMD)
usqaddVd.T, Vn.T0 Q 1 01110 size 10000 00011 10 Rn Rd0x2E203800 / mask 0xBF3FFC00Addition of a signed value to an unsigned one, with saturationfor every element: Vd[i] = saturate_unsigned(Vd[i] + Vn[i])Vector (SIMD)
usraVd.T, Vn.T, #shift0 Q 1 011110 immh immb 00010 1 Rn Rd0x2F001400 / mask 0xBF80FC00Shift right and addition to the destination (unsigned)for every element: Vd[i] = Vd[i] + (Vn[i] >> shift)Vector (SIMD)
usublVd.Tb, Vn.Ta, Vm.Taalso shown as: usubl20 Q 1 01110 size 1 Rm 0010 00 Rn Rd0x2E202000 / mask 0xBF20FC00Subtraction with widening (unsigned; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vn[i] - Vm[i] (wide result)Vector (SIMD)
usubwVd.Tb, Vn.Ta, Vm.Taalso shown as: usubw20 Q 1 01110 size 1 Rm 0011 00 Rn Rd0x2E203000 / mask 0xBF20FC00Subtraction of a narrow operand from a wide one (unsigned; Q = 1: high half of the sources, name with 2)for every element: Vd[i] = Vn[i] - Vm[i] (Vn is wide)Vector (SIMD)
uzp1Vd.T, Vn.T, Vm.T0 Q 0 01110 size 0 Rm 0 001 10 Rn Rd0x0E001800 / mask 0xBF20FC00Extraction of the even-numbered elements of two vectorsVd = even elements of (Vn:Vm)Vector (SIMD)
uzp2Vd.T, Vn.T, Vm.T0 Q 0 01110 size 0 Rm 0 101 10 Rn Rd0x0E005800 / mask 0xBF20FC00Extraction of the odd-numbered elements of two vectorsVd = odd elements of (Vn:Vm)Vector (SIMD)
xarVd.2D, Vn.2D, Vm.2D, #imm611001110 100 Rm imm6 Rn Rd0xCE800000 / mask 0xFFE00000Exclusive OR and rotation to the right (SHA-3)Vd = rotate_right(Vn ^ Vm, imm6)Cryptography
xtnVd.T, Vn.Talso shown as: xtn20 Q 0 01110 size 10000 10010 10 Rn Rd0x0E212800 / mask 0xBF3FFC00Narrowing of the elements (the high half is cut off)for every element: Vd[i] = low half of Vn[i]Vector (SIMD)
zip1Vd.T, Vn.T, Vm.T0 Q 0 01110 size 0 Rm 0 011 10 Rn Rd0x0E003800 / mask 0xBF20FC00Interleaving of the low halves of two vectors, alternatelyVd = Vn[0], Vm[0], Vn[1], Vm[1] ...Vector (SIMD)
zip2Vd.T, Vn.T, Vm.T0 Q 0 01110 size 0 Rm 0 111 10 Rn Rd0x0E007800 / mask 0xBF20FC00Interleaving of the high halves of two vectors, alternatelyVd = Vn[n/2], Vm[n/2], Vn[n/2+1] ...Vector (SIMD)