3.1. Instruction set summary

The processor implements a version of the Thumb instruction set. Table 3.1 lists the supported instructions.

Note

In Table 3.1:

  • angle brackets, <>, enclose alternative forms of the operand

  • braces, {}, enclose optional operands

  • the Operands column is not exhaustive

  • Op2 is a flexible second operand that can be either a register or a constant

  • most instructions can use an optional condition code suffix.

For more information on the instructions and operands, see the instruction descriptions.

Table 3.1. Cortex-M4 instructions

MnemonicOperandsBrief descriptionFlagsPage
ADC, ADCS

{Rd,} Rn, Op2

Add with CarryN,Z,C,VADD, ADC, SUB, SBC, and RSB
ADD, ADDS

{Rd,} Rn, Op2

AddN,Z,C,VADD, ADC, SUB, SBC, and RSB
ADD, ADDW

{Rd,} Rn, #imm12

Add-ADD, ADC, SUB, SBC, and RSB
ADR

Rd, label

Load PC-relative Address-ADR
AND, ANDS

{Rd,} Rn, Op2

Logical ANDN,Z,CAND, ORR, EOR, BIC, and ORN
ASR, ASRS

Rd, Rm, <Rs|#n>

Arithmetic Shift RightN,Z,CASR, LSL, LSR, ROR, and RRX
B

label

Branch-B, BL, BX, and BLX
BFC

Rd, #lsb, #width

Bit Field Clear-BFC and BFI
BFI

Rd, Rn, #lsb, #width

Bit Field Insert-BFC and BFI
BIC, BICS

{Rd,} Rn, Op2

Bit ClearN,Z,CAND, ORR, EOR, BIC, and ORN
BKPT

#imm

Breakpoint-BKPT
BL

label

Branch with Link-B, BL, BX, and BLX
BLX

Rm

Branch indirect with Link-B, BL, BX, and BLX
BX

Rm

Branch indirect-B, BL, BX, and BLX
CBNZ

Rn, label

Compare and Branch if Non Zero-CBZ and CBNZ
CBZ

Rn, label

Compare and Branch if Zero-CBZ and CBNZ
CLREX-Clear Exclusive-CLREX
CLZ

Rd, Rm

Count Leading Zeros-CLZ
CMN

Rn, Op2

Compare NegativeN,Z,C,VCMP and CMN
CMP

Rn, Op2

CompareN,Z,C,VCMP and CMN
CPSID

i

Change Processor State, Disable Interrupts-CPS
CPSIE

i

Change Processor State, Enable Interrupts-CPS
DMB

-

Data Memory Barrier-DMB
DSB

-

Data Synchronization Barrier-DSB
EOR, EORS

{Rd,} Rn, Op2

Exclusive ORN,Z,CAND, ORR, EOR, BIC, and ORN
ISB

-

Instruction Synchronization Barrier-ISB
IT-If-Then condition block-IT
LDM

Rn{!}, reglist

Load Multiple registers, increment after-LDM and STM
LDMDB, LDMEA

Rn{!}, reglist

Load Multiple registers, decrement before-LDM and STM
LDMFD, LDMIA

Rn{!}, reglist

Load Multiple registers, increment after-LDM and STM
LDR

Rt, [Rn, #offset]

Load Register with word-Memory access instructions
LDRB, LDRBT

Rt, [Rn, #offset]

Load Register with byte-Memory access instructions
LDRD

Rt, Rt2, [Rn, #offset]

Load Register with two bytes-LDR and STR, immediate offset
LDREX

Rt, [Rn, #offset]

Load Register Exclusive-LDREX and STREX
LDREXB

Rt, [Rn]

Load Register Exclusive with Byte-LDREX and STREX
LDREXH

Rt, [Rn]

Load Register Exclusive with Halfword-LDREX and STREX
LDRH, LDRHT

Rt, [Rn, #offset]

Load Register with Halfword-Memory access instructions
LDRSB, LDRSBT

Rt, [Rn, #offset]

Load Register with Signed Byte-Memory access instructions
LDRSH, LDRSHT

Rt, [Rn, #offset]

Load Register with Signed Halfword-Memory access instructions
LDRT

Rt, [Rn, #offset]

Load Register with word-Memory access instructions
LSL, LSLS

Rd, Rm, <Rs|#n>

Logical Shift LeftN,Z,CASR, LSL, LSR, ROR, and RRX
LSR, LSRS

Rd, Rm, <Rs|#n>

Logical Shift RightN,Z,CASR, LSL, LSR, ROR, and RRX
MLA

Rd, Rn, Rm, Ra

Multiply with Accumulate, 32-bit result-MUL, MLA, and MLS
MLS

Rd, Rn, Rm, Ra

Multiply and Subtract, 32-bit result-MUL, MLA, and MLS
MOV, MOVS

Rd, Op2

MoveN,Z,CMOV and MVN
MOVT

Rd, #imm16

Move Top-MOVT
MOVW, MOV

Rd, #imm16

Move 16-bit constantN,Z,CMOV and MVN
MRS

Rd, spec_reg

Move from Special Register to general register-MRS
MSR

spec_reg, Rm

Move from general register to Special RegisterN,Z,C,VMSR
MUL, MULS

{Rd,} Rn, Rm

Multiply, 32-bit resultN,ZMUL, MLA, and MLS
MVN, MVNS

Rd, Op2

Move NOTN,Z,CMOV and MVN
NOP-No Operation-NOP
ORN, ORNS

{Rd,} Rn, Op2

Logical OR NOTN,Z,CAND, ORR, EOR, BIC, and ORN
ORR, ORRS

{Rd,} Rn, Op2

Logical ORN,Z,CAND, ORR, EOR, BIC, and ORN
PKHTB, PKHBT{Rd,} Rn, Rm, Op2Pack Halfword-PKHBT and PKHTB
POP

reglist

Pop registers from stack-PUSH and POP
PUSH

reglist

Push registers onto stack-PUSH and POP
QADD{Rd,} Rn, RmSaturating double and AddQQADD and QSUB
QADD16{Rd,} Rn, RmSaturating Add 16-QADD and QSUB
QADD8{Rd,} Rn, RmSaturating Add 8-QADD and QSUB
QASX{Rd,} Rn, RmSaturating Add and Subtract with Exchange-QASX and QSAX
QDADD{Rd,} Rn, RmSaturating AddQQDADD and QDSUB
QDSUB{Rd,} Rn, RmSaturating double and SubtractQQDADD and QDSUB
QSAX{Rd,} Rn, RmSaturating Subtract and Add with Exchange-QASX and QSAX
QSUB{Rd,} Rn, RmSaturating SubtractQQDADD and QDSUB
QSUB16{Rd,} Rn, RmSaturating Subtract 16-QDADD and QDSUB
QSUB8{Rd,} Rn, RmSaturating Subtract 8-QDADD and QDSUB
RBIT

Rd, Rn

Reverse Bits-REV, REV16, REVSH, and RBIT
REV

Rd, Rn

Reverse byte order in a word-REV, REV16, REVSH, and RBIT
REV16

Rd, Rn

Reverse byte order in each halfword-REV, REV16, REVSH, and RBIT
REVSH

Rd, Rn

Reverse byte order in bottom halfword and sign extend-REV, REV16, REVSH, and RBIT
ROR, RORS

Rd, Rm, <Rs|#n>

Rotate RightN,Z,CASR, LSL, LSR, ROR, and RRX
RRX, RRXS

Rd, Rm

Rotate Right with ExtendN,Z,CASR, LSL, LSR, ROR, and RRX
RSB, RSBS

{Rd,} Rn, Op2

Reverse SubtractN,Z,C,VADD, ADC, SUB, SBC, and RSB
SADD16{Rd,} Rn, RmSigned Add 16GESADD16 and SADD8
SADD8{Rd,} Rn, RmSigned Add 8GESADD16 and SADD8
SASX{Rd,} Rn, RmSigned Add and Subtract with ExchangeGESASX and SSAX
SBC, SBCS

{Rd,} Rn, Op2

Subtract with CarryN,Z,C,VADD, ADC, SUB, SBC, and RSB
SBFX

Rd, Rn, #lsb, #width

Signed Bit Field Extract-SBFX and UBFX
SDIV

{Rd,} Rn, Rm

Signed Divide-SDIV and UDIV
SEL

{Rd,} Rn, Rm

Select bytes-SEL
SEV-Send Event-SEV
SHADD16{Rd,} Rn, RmSigned Halving Add 16-SHADD16 and SHADD8
SHADD8{Rd,} Rn, RmSigned Halving Add 8-SHADD16 and SHADD8
SHASX{Rd,} Rn, RmSigned Halving Add and Subtract with Exchange-SHASX and SHSAX
SHSAX{Rd,} Rn, RmSigned Halving Subtract and Add with Exchange-SHASX and SHSAX
SHSUB16{Rd,} Rn, RmSigned Halving Subtract 16-SHSUB16 and SHSUB8
SHSUB8{Rd,} Rn, RmSigned Halving Subtract 8-SHSUB16 and SHSUB8
SMLABB, SMLABT, SMLATB, SMLATT

Rd, Rn, Rm, Ra

Signed Multiply Accumulate Long (halfwords)QSMLA and SMLAW
SMLAD, SMLADX

Rd, Rn, Rm, Ra

Signed Multiply Accumulate DualQSMLAD
SMLAL

RdLo, RdHi, Rn, Rm

Signed Multiply with Accumulate (32 x 32 + 64), 64-bit result-UMULL, UMLAL, SMULL, and SMLAL
SMLALBB, SMLALBT, SMLALTB, SMLALTT

RdLo, RdHi, Rn, Rm

Signed Multiply Accumulate Long, halfwords-SMLAL and SMLALD
SMLALD, SMLALDX

RdLo, RdHi, Rn, Rm

Signed Multiply Accumulate Long Dual-SMLAL and SMLALD
SMLAWB, SMLAWTRd, Rn, Rm, RaSigned Multiply Accumulate, word by halfwordQSMLA and SMLAW
SMLSDRd, Rn, Rm, RaSigned Multiply Subtract DualQ SMLSD and SMLSLD
SMLSLD

RdLo, RdHi, Rn, Rm

Signed Multiply Subtract Long Dual  SMLSD and SMLSLD
SMMLARd, Rn, Rm, RaSigned Most significant word Multiply Accumulate-SMMLA and SMMLS
SMMLS, SMMLR

Rd, Rn, Rm, Ra

Signed Most significant word Multiply Subtract-SMMLA and SMMLS
SMMUL, SMMULR{Rd,} Rn, RmSigned Most significant word Multiply-SMMUL
SMUAD{Rd,} Rn, RmSigned dual Multiply AddQSMUAD and SMUSD
SMULBB, SMULBT SMULTB, SMULTT{Rd,} Rn, RmSigned Multiply (halfwords)-SMUL and SMULW
SMULL

RdLo, RdHi, Rn, Rm

Signed Multiply (32 x 32), 64-bit result-UMULL, UMLAL, SMULL, and SMLAL
SMULWB, SMULWT{Rd,} Rn, RmSigned Multiply word by halfword-SMUL and SMULW
SMUSD, SMUSDX{Rd,} Rn, RmSigned dual Multiply Subtract-SMUAD and SMUSD
SSAT

Rd, #n, Rm {,shift #s}

Signed SaturateQSSAT and USAT
SSAT16Rd, #n, RmSigned Saturate 16QSSAT16 and USAT16
SSAX{Rd,} Rn, RmSigned Subtract and Add with ExchangeGESASX and SSAX
SSUB16

{Rd,} Rn, Rm

Signed Subtract 16-SSUB16 and SSUB8
SSUB8{Rd,} Rn, RmSigned Subtract 8-SSUB16 and SSUB8
STM

Rn{!}, reglist

Store Multiple registers, increment after-LDM and STM
STMDB, STMEA

Rn{!}, reglist

Store Multiple registers, decrement before-LDM and STM
STMFD, STMIA

Rn{!}, reglist

Store Multiple registers, increment after-LDM and STM
STR

Rt, [Rn, #offset]

Store Register word-Memory access instructions
STRB, STRBT

Rt, [Rn, #offset]

Store Register byte-Memory access instructions
STRD

Rt, Rt2, [Rn, #offset]

Store Register two words-LDR and STR, immediate offset
STREX

Rd, Rt, [Rn, #offset]

Store Register Exclusive-LDREX and STREX
STREXB

Rd, Rt, [Rn]

Store Register Exclusive Byte-LDREX and STREX
STREXH

Rd, Rt, [Rn]

Store Register Exclusive Halfword-LDREX and STREX
STRH, STRHT

Rt, [Rn, #offset]

Store Register Halfword-Memory access instructions
STRT

Rt, [Rn, #offset]

Store Register word-Memory access instructions
SUB, SUBS

{Rd,} Rn, Op2

SubtractN,Z,C,VADD, ADC, SUB, SBC, and RSB
SUB, SUBW

{Rd,} Rn, #imm12

Subtract-ADD, ADC, SUB, SBC, and RSB
SVC

#imm

Supervisor Call-SVC
SXTAB{Rd,} Rn, Rm,{,ROR #}Extend 8 bits to 32 and add-SXTA and UXTA
SXTAB16{Rd,} Rn, Rm,{,ROR #}Dual extend 8 bits to 16 and add-SXTA and UXTA
SXTAH{Rd,} Rn, Rm,{,ROR #}Extend 16 bits to 32 and add-SXTA and UXTA
SXTB16{Rd,} Rm {,ROR #n}Signed Extend Byte 16-SXT and UXT
SXTB

{Rd,} Rm {,ROR #n}

Sign extend a byte-SXT and UXT
SXTH

{Rd,} Rm {,ROR #n}

Sign extend a halfword-SXT and UXT
TBB

[Rn, Rm]

Table Branch Byte-TBB and TBH
TBH

[Rn, Rm, LSL #1]

Table Branch Halfword-TBB and TBH
TEQ

Rn, Op2

Test EquivalenceN,Z,CTST and TEQ
TST

Rn, Op2

TestN,Z,CTST and TEQ
UADD16{Rd,} Rn, RmUnsigned Add 16GEUADD16 and UADD8
UADD8{Rd,} Rn, RmUnsigned Add 8GEUADD16 and UADD8
USAX{Rd,} Rn, RmUnsigned Subtract and Add with ExchangeGEUASX and USAX
UHADD16{Rd,} Rn, RmUnsigned Halving Add 16-UHADD16 and UHADD8
UHADD8{Rd,} Rn, RmUnsigned Halving Add 8-UHADD16 and UHADD8
UHASX{Rd,} Rn, RmUnsigned Halving Add and Subtract with Exchange-UHASX and UHSAX
UHSAX{Rd,} Rn, RmUnsigned Halving Subtract and Add with Exchange-UHASX and UHSAX
UHSUB16{Rd,} Rn, RmUnsigned Halving Subtract 16-UHSUB16 and UHSUB8
UHSUB8{Rd,} Rn, RmUnsigned Halving Subtract 8-UHSUB16 and UHSUB8
UBFX

Rd, Rn, #lsb, #width

Unsigned Bit Field Extract-SBFX and UBFX
UDIV

{Rd,} Rn, Rm

Unsigned Divide-SDIV and UDIV
UMAAL

RdLo, RdHi, Rn, Rm

Unsigned Multiply Accumulate Accumulate Long (32 x 32 + 32 +32), 64-bit result-UMULL, UMAAL, UMLAL
UMLAL

RdLo, RdHi, Rn, Rm

Unsigned Multiply with Accumulate (32 x 32 + 64), 64-bit result-UMULL, UMLAL, SMULL, and SMLAL
UMULL

RdLo, RdHi, Rn, Rm

Unsigned Multiply (32 x 32), 64-bit result-UMULL, UMLAL, SMULL, and SMLAL
UQADD16{Rd,} Rn, RmUnsigned Saturating Add 16-UQADD and UQSUB
UQADD8{Rd,} Rn, RmUnsigned Saturating Add 8-UQADD and UQSUB
UQASX{Rd,} Rn, RmUnsigned Saturating Add and Subtract with Exchange-UQASX and UQSAX
UQSAX{Rd,} Rn, RmUnsigned Saturating Subtract and Add with Exchange-UQASX and UQSAX
UQSUB16{Rd,} Rn, RmUnsigned Saturating Subtract 16-UQADD and UQSUB
UQSUB8{Rd,} Rn, RmUnsigned Saturating Subtract 8-UQADD and UQSUB
USAD8{Rd,} Rn, RmUnsigned Sum of Absolute Differences-USAD8
USADA8{Rd,} Rn, Rm, RaUnsigned Sum of Absolute Differences and Accumulate-USADA8
USAT

Rd, #n, Rm {,shift #s}

Unsigned SaturateQSSAT and USAT
USAT16Rd, #n, RmUnsigned Saturate 16QSSAT16 and USAT16
UASX{Rd,} Rn, RmUnsigned Add and Subtract with ExchangeGEUASX and USAX
USUB16{Rd,} Rn, RmUnsigned Subtract 16GEUSUB16 and USUB8
USUB8{Rd,} Rn, RmUnsigned Subtract 8GEUSUB16 and USUB8
UXTAB{Rd,} Rn, Rm,{,ROR #}Rotate, extend 8 bits to 32 and Add-SXTA and UXTA
UXTAB16{Rd,} Rn, Rm,{,ROR #}Rotate, dual extend 8 bits to 16 and Add-SXTA and UXTA
UXTAH{Rd,} Rn, Rm,{,ROR #}Rotate, unsigned extend and Add Halfword-SXTA and UXTA
UXTB

{Rd,} Rm {,ROR #n}

Zero extend a Byte-SXT and UXT
UXTB16

{Rd,} Rm {,ROR #n}

Unsigned Extend Byte 16-SXT and UXT
UXTH

{Rd,} Rm {,ROR #n}

Zero extend a Halfword-SXT and UXT
VABS.F32Sd, SmFloating-point Absolute-VABS
VADD.F32{Sd,} Sn, SmFloating-point Add-VADD
VCMP.F32Sd, <Sm | #0.0>Compare two floating-point registers, or one floating-point register and zeroFPSCRVCMP, VCMPE
VCMPE.F32Sd, <Sm | #0.0>Compare two floating-point registers, or one floating-point register and zero with Invalid Operation checkFPSCRVCMP, VCMPE
VCVT.S32.F32Sd, SmConvert between floating-point and integer-VCVT, VCVTR between floating-point and integer
VCVT.S16.F32Sd, Sd, #fbitsConvert between floating-point and fixed point-VCVT between floating-point and fixed-point
VCVTR.S32.F32Sd, SmConvert between floating-point and integer with rounding-VCVT, VCVTR between floating-point and integer
VCVT<B|H>.F32.F16Sd, SmConverts half-precision value to single-precision-VCVTB, VCVTT
VCVTT<B|T>.F32.F16Sd, SmConverts single-precision register to half-precision-VCVTB, VCVTT
VDIV.F32{Sd,} Sn, SmFloating-point Divide-VDIV
VFMA.F32{Sd,} Sn, SmFloating-point Fused Multiply Accumulate-VFMA, VFMS
VFNMA.F32{Sd,} Sn, SmFloating-point Fused Negate Multiply Accumulate-VFNMA, VFNMS
VFMS.F32{Sd,} Sn, SmFloating-point Fused Multiply Subtract-VFMA, VFMS
VFNMS.F32{Sd,} Sn, SmFloating-point Fused Negate Multiply Subtract-VFNMA, VFNMS
VLDM.F<32|64>Rn{!}, listLoad Multiple extension registers-VLDM
VLDR.F<32|64><Dd|Sd>, [Rn]Load an extension register from memory-VLDR
VLMA.F32{Sd,} Sn, SmFloating-point Multiply Accumulate-VLMA, VLMS
VLMS.F32{Sd,} Sn, SmFloating-point Multiply Subtract-VLMA, VLMS
VMOV.F32Sd, #immFloating-point Move immediate-VMOV Immediate
VMOVSd, SmFloating-point Move register-VMOV Register
VMOVSn, RtCopy ARM core register to single precision-VMOV ARM Core register to single precision
VMOVSm, Sm1, Rt, Rt2Copy 2 ARM core registers to 2 single precision-VMOV Two ARM Core registers to two single precision
VMOVDd[x], RtCopy ARM core register to scalar-VMOV ARM Core register to scalar
VMOVRt, Dn[x]Copy scalar to ARM core register -VMOV Scalar to ARM Core register
VMRSRt, FPSCRMove FPSCR to ARM core register or APSRN,Z,C,VVMRS
VMSRFPSCR, RtMove to FPSCR from ARM Core registerFPSCRVMSR
VMUL.F32{Sd,} Sn, SmFloating-point Multiply-VMUL
VNEG.F32Sd, SmFloating-point Negate-VNEG
VNMLA.F32Sd, Sn, SmFloating-point Multiply and Add-VNMLA, VNMLS, VNMUL
VNMLS.F32Sd, Sn, SmFloating-point Multiply and Subtract-VNMLA, VNMLS, VNMUL
VNMUL{Sd,} Sn, SmFloating-point Multiply-VNMLA, VNMLS, VNMUL
VPOPlistPop extension registers-VPOP
VPUSHlistPush extension registers-VPUSH
VSQRT.F32Sd, SmCalculates floating-point Square Root-VSQRT
VSTMRn{!}, listFloating-point register Store Multiple-VSTM
VSTR.F<32|64>Sd, [Rn]Stores an extension register to memory-VSTR
VSUB.F<32|64>{Sd,} Sn, SmFloating-point Subtract-VSUB
WFE-Wait For Event-WFE
WFI-Wait For Interrupt-WFI

Copyright © 2010 ARM. All rights reserved.ARM DUI 0553A
Non-ConfidentialID121610