SLAU723A October 2017 ā October 2018 MSP432E401Y , MSP432E411Y
The processor implements a version of the Thumb instruction set. Table 1-23 lists the supported instructions.
NOTE
The following conventions apply in Table 1-23:
For more information on the instructions and operands, see the instruction descriptions in the Arm Cortex-M4 Technical Reference Manual.
| Mnemonic | Operands | Brief Description | Flags |
|---|---|---|---|
| ADC, ADCS | {Rd,} Rn, Op2 | Add with carry | N,Z,C,V |
| ADD, ADDS | {Rd,} Rn, Op2 | Add | N,Z,C,V |
| ADD, ADDW | {Rd,} Rn, #imm12 | Add | – |
| ADR | Rd, label | Load PC-relative address | – |
| AND, ANDS | {Rd,} Rn, Op2 | Logical AND | N,Z,C |
| ASR, ASRS | Rd, Rm, <Rs|#n> | Arithmetic shift right | N,Z,C |
| B | label | Branch | – |
| BFC | Rd, #lsb, #width | Bit field clear | – |
| BFI | Rd, Rn, #lsb, #width | Bit field insert | – |
| BIC, BICS | {Rd,} Rn, Op2 | Bit clear | N,Z,C |
| BKPT | #imm | Breakpoint | – |
| BL | label | Branch with link | – |
| BLX | Rm | Branch indirect with link | – |
| BX | Rm | Branch indirect | – |
| CBNZ | Rn, label | Compare and branch if nonzero | – |
| CBZ | Rn, label | Compare and branch if zero | – |
| CLREX | – | Clear exclusive | – |
| CLZ | Rd, Rm | Count leading zeros | – |
| CMN | Rn, Op2 | Compare negative | N,Z,C,V |
| CMP | Rn, Op2 | Compare | N,Z,C,V |
| CPSID | i | Change processor state, disable interrupts | – |
| CPSIE | i | Change processor state, enable interrupts | – |
| DMB | – | Data memory barrier | – |
| DSB | – | Data synchronization barrier | – |
| EOR, EORS | {Rd,} Rn, Op2 | Exclusive OR | N,Z,C |
| ISB | – | Instruction synchronization barrier | – |
| IT | – | If-Then condition block | – |
| LDM | Rn{!}, reglist | Load multiple registers, increment after | – |
| LDMDB, LDMEA | Rn{!}, reglist | Load multiple registers, decrement before | – |
| LDMFD, LDMIA | Rn{!}, reglist | Load multiple registers, increment after | – |
| LDR | Rt, [Rn, #offset] | Load register with word | – |
| LDRB, LDRBT | Rt, [Rn, #offset] | Load register with byte | – |
| LDRD | Rt, Rt2, [Rn, #offset] | Load register with 2 bytes | – |
| LDREX | Rt, [Rn, #offset] | Load register exclusive | – |
| LDREXB | Rt, [Rn] | Load register exclusive with byte | – |
| LDREXH | Rt, [Rn] | Load register exclusive with halfword | – |
| LDRH, LDRHT | Rt, [Rn, #offset] | Load register with halfword | – |
| LDRSB, LDRSBT | Rt, [Rn, #offset] | Load register with signed byte | – |
| LDRSH, LDRSHT | Rt, [Rn, #offset] | Load register with signed halfword | – |
| LDRT | Rt, [Rn, #offset] | Load register with word | – |
| LSL, LSLS | Rd, Rm, <Rs|#n> | Logical shift left | N,Z,C |
| LSR, LSRS | Rd, Rm, <Rs|#n> | Logical shift right | N,Z,C |
| MLA | Rd, Rn, Rm, Ra | Multiply with accumulate, 32-bit result | – |
| MLS | Rd, Rn, Rm, Ra | Multiply and subtract, 32-bit result | – |
| MOV, MOVS | Rd, Op2 | Move | N,Z,C |
| MOV, MOVW | Rd, #imm16 | Move 16-bit constant | N,Z,C |
| MOVT | Rd, #imm16 | Move top | – |
| MRS | Rd, spec_reg | Move from special register to general register | – |
| MSR | spec_reg, Rm | Move from general register to special register | N,Z,C,V |
| MUL, MULS | {Rd,} Rn, Rm | Multiply, 32-bit result | N,Z |
| MVN, MVNS | Rd, Op2 | Move NOT | N,Z,C |
| NOP | – | No operation | – |
| ORN, ORNS | {Rd,} Rn, Op2 | Logical OR NOT | N,Z,C |
| ORR, ORRS | {Rd,} Rn, Op2 | Logical OR | N,Z,C |
| PKHTB, PKHBT | {Rd,} Rn, Rm, Op2 | Pack halfword | – |
| POP | reglist | Pop registers from stack | – |
| PUSH | reglist | Push registers onto stack | – |
| QADD | {Rd,} Rn, Rm | Saturating add | Q |
| QADD16 | {Rd,} Rn, Rm | Saturating add 16 | – |
| QADD8 | {Rd,} Rn, Rm | Saturating add 8 | – |
| QASX | {Rd,} Rn, Rm | Saturating add and subtract with exchange | – |
| QDADD | {Rd,} Rn, Rm | Saturating double and add | Q |
| QDSUB | {Rd,} Rn, Rm | Saturating double and subtract | Q |
| QSAX | {Rd,} Rn, Rm | Saturating subtract and add with exchange | – |
| QSUB | {Rd,} Rn, Rm | Saturating subtract | Q |
| QSUB16 | {Rd,} Rn, Rm | Saturating subtract 16 | – |
| QSUB8 | {Rd,} Rn, Rm | Saturating subtract 8 | – |
| RBIT | Rd, Rn | Reverse bits | – |
| REV | Rd, Rn | Reverse byte order in a word | – |
| REV16 | Rd, Rn | Reverse byte order in each halfword | – |
| REVSH | Rd, Rn | Reverse byte order in bottom halfword and sign extend | – |
| ROR, RORS | Rd, Rm, <Rs|#n> | Rotate right | N,Z,C |
| RRX, RRXS | Rd, Rm | Rotate right with extend | N,Z,C |
| RSB, RSBS | {Rd,} Rn, Op2 | Reverse subtract | N,Z,C,V |
| SADD16 | {Rd,} Rn, Rm | Signed add 16 | GE |
| SADD8 | {Rd,} Rn, Rm | Signed add 8 | GE |
| SASX | {Rd,} Rn, Rm | Signed add and subtract with exchange | GE |
| SBC, SBCS | {Rd,} Rn, Op2 | Subtract with carry | N,Z,C,V |
| SBFX | Rd, Rn, #lsb, #width | Signed bit field extract | – |
| SDIV | {Rd,} Rn, Rm | Signed divide | – |
| SEL | {Rd,} Rn, Rm | Select bytes | – |
| SEV | – | Send event | – |
| SHADD16 | {Rd,} Rn, Rm | Signed halving add 16 | – |
| SHADD8 | {Rd,} Rn, Rm | Signed halving add 8 | – |
| SHASX | {Rd,} Rn, Rm | Signed halving add and subtract with exchange | – |
| SHSAX | {Rd,} Rn, Rm | Signed halving add and subtract with exchange | – |
| SHSUB16 | {Rd,} Rn, Rm | Signed halving subtract 16 | – |
| SHSUB8 | {Rd,} Rn, Rm | Signed halving subtract 8 | – |
| SMLABB, SMLABT, SMLATB, SMLATT | Rd, Rn, Rm, Ra | Signed multiply accumulate long (halfwords) | Q |
| SMLAD, SMLADX | Rd, Rn, Rm, Ra | Signed multiply accumulate dual | Q |
| SMLAL | RdLo, RdHi, Rn, Rm | Signed multiply with accumulate (32×32+64), 64-bit result | – |
| SMLALBB, SMLALBT, SMLALTB, SMLALTT | RdLo, RdHi, Rn, Rm | Signed multiply accumulate long (halfwords) | – |
| SMLALD, SMLALDX | RdLo, RdHi, Rn, Rm | Signed multiply accumulate long dual | – |
| SMLAWB, SMLAWT | Rd, Rn, Rm, Ra | Signed multiply accumulate, word by halfword | Q |
| SMLSD SMLSDX | Rd, Rn, Rm, Ra | Signed multiply subtract dual | Q |
| SMLSLD SMLSLDX | RdLo, RdHi, Rn, Rm | Signed multiply subtract long dual | |
| SMMLA | Rd, Rn, Rm, Ra | Signed most significant word multiply accumulate | – |
| SMMLS, SMMLR | Rd, Rn, Rm, Ra | Signed most significant word multiply subtract | – |
| SMMUL, SMMULR | {Rd,} Rn, Rm | Signed most significant word multiply | – |
| SMUAD SMUADX | {Rd,} Rn, Rm | Signed dual multiply add | Q |
| SMULBB, SMULBT, SMULTB, SMULTT | {Rd,} Rn, Rm | Signed multiply halfwords | – |
| SMULL | RdLo, RdHi, Rn, Rm | Signed multiply (32×32), 64-bit result | – |
| SMULWB, SMULWT | {Rd,} Rn, Rm | Signed multiply by halfword | – |
| SMUSD, SMUSDX | {Rd,} Rn, Rm | Signed dual multiply subtract | – |
| SSAT | Rd, #n, Rm {,shift #s} | Signed saturate | Q |
| SSAT16 | Rd, #n, Rm | Signed saturate 16 | Q |
| SSAX | {Rd,} Rn, Rm | Saturating subtract and add with exchange | GE |
| SSUB16 | {Rd,} Rn, Rm | Signed subtract 16 | – |
| SSUB8 | {Rd,} Rn, Rm | Signed subtract 8 | – |
| STM | Rn{!}, reglist | Store multiple registers, increment after | – |
| STMDB, STMEA | Rn{!}, reglist | Store multiple registers, decrement before | – |
| STMFD, STMIA | Rn{!}, reglist | Store multiple registers, increment after | – |
| STR | Rt, [Rn {, #offset}] | Store register word | – |
| STRB, STRBT | Rt, [Rn {, #offset}] | Store register byte | – |
| STRD | Rt, Rt2, [Rn {, #offset}] | Store register two words | – |
| STREX | Rt, Rt, [Rn {, #offset}] | Store register exclusive | – |
| STREXB | Rd, Rt, [Rn] | Store register exclusive byte | – |
| STREXH | Rd, Rt, [Rn] | Store register exclusive halfword | – |
| STRH, STRHT | Rt, [Rn {, #offset}] | Store register halfword | – |
| STRSB, STRSBT | Rt, [Rn {, #offset}] | Store register signed byte | – |
| STRSH, STRSHT | Rt, [Rn {, #offset}] | Store register signed halfword | – |
| STRT | Rt, [Rn {, #offset}] | Store register word | – |
| SUB, SUBS | {Rd,} Rn, Op2 | Subtract | N,Z,C,V |
| SUB, SUBW | {Rd,} Rn, #imm12 | Subtract 12-bit constant | N,Z,C,V |
| SVC | #imm | Supervisor call | – |
| SXTAB | {Rd,} Rn, Rm, {,ROR #} | Extend 8 bits to 32 and add | – |
| SXTAB16 | {Rd,} Rn, Rm,{,ROR #} | Dual extend 8 bits to 16 and add | – |
| SXTAH | {Rd,} Rn, Rm,{,ROR #} | Extend 16 bits to 32 and add | – |
| SXTB16 | {Rd,} Rm {,ROR #n} | Signed extend byte 16 | – |
| SXTB | {Rd,} Rm {,ROR #n} | Sign extend a byte | – |
| SXTH | {Rd,} Rm {,ROR #n} | Sign extend a halfword | – |
| TBB | [Rn, Rm] | Table branch byte | – |
| TBH | [Rn, Rm, LSL #1] | Table branch halfword | – |
| TEQ | Rn, Op2 | Test equivalence | N,Z,C |
| TST | Rn, Op2 | Test | N,Z,C |
| UADD16 | {Rd,} Rn, Rm | Unsigned add 16 | GE |
| UADD8 | {Rd,} Rn, Rm | Unsigned add 8 | GE |
| UASX | {Rd,} Rn, Rm | Unsigned add and subtract with exchange | GE |
| UHADD16 | {Rd,} Rn, Rm | Unsigned halving add 16 | – |
| UHADD8 | {Rd,} Rn, Rm | Unsigned halving add 8 | – |
| UHASX | {Rd,} Rn, Rm | Unsigned halving add and subtract with exchange | – |
| UHSAX | {Rd,} Rn, Rm | Unsigned halving subtract and add with exchange | – |
| UHSUB16 | {Rd,} Rn, Rm | Unsigned halving subtract 16 | – |
| UHSUB8 | {Rd,} Rn, Rm | Unsigned halving subtract 8 | – |
| UBFX | Rd, Rn, #lsb, #width | Unsigned bit field extract | – |
| UDIV | {Rd,} Rn, Rm | Unsigned divide | – |
| UMAAL | RdLo, RdHi, Rn, Rm | Unsigned multiply accumulate accumulate long (32×32+64), 64-bit result | – |
| UMLAL | RdLo, RdHi, Rn, Rm | Unsigned multiply with accumulate (32×32+32+32), 64-bit result | – |
| UMULL | RdLo, RdHi, Rn, Rm | Unsigned multiply (32×32), 64-bit result | – |
| UQADD16 | {Rd,} Rn, Rm | Unsigned saturating add 16 | – |
| UQADD8 | {Rd,} Rn, Rm | Unsigned saturating add 8 | – |
| UQASX | {Rd,} Rn, Rm | Unsigned saturating add and subtract with exchange | – |
| UQSAX | {Rd,} Rn, Rm | Unsigned saturating subtract and add with exchange | – |
| UQSUB16 | {Rd,} Rn, Rm | Unsigned saturating subtract 16 | – |
| UQSUB8 | {Rd,} Rn, Rm | Unsigned saturating subtract 8 | – |
| USAD8 | {Rd,} Rn, Rm | Unsigned sum of absolute differences | – |
| USADA8 | {Rd,} Rn, Rm, Ra | Unsigned sum of absolute differences and accumulate | – |
| USAT | Rd, #n, Rm {,shift #s} | Unsigned saturate | Q |
| USAT16 | Rd, #n, Rm | Unsigned saturate 16 | Q |
| USAX | {Rd,} Rn, Rm | Unsigned subtract and add with exchange | GE |
| USUB16 | {Rd,} Rn, Rm | Unsigned subtract 16 | GE |
| USUB8 | {Rd,} Rn, Rm | Unsigned subtract 8 | GE |
| UXTAB | {Rd,} Rn, Rm, {,ROR #} | Rotate, extend 8 bits to 32 and add | – |
| UXTAB16 | {Rd,} Rn, Rm, {,ROR #} | Rotate, dual extend 8 bits to 16 and add | – |
| UXTAH | {Rd,} Rn, Rm, {,ROR #} | Rotate, unsigned extend and add halfword | – |
| UXTB | {Rd,} Rm, {,ROR #n} | Zero extend a Byte | – |
| UXTB16 | {Rd,} Rm, {,ROR #n} | Unsigned extend byte 16 | – |
| UXTH | {Rd,} Rm, {,ROR #n} | Zero extend a halfword | – |
| VABS.F32 | Sd, Sm | Floating-point absolute | – |
| VADD.F32 | {Sd,} Sn, Sm | Floating-point add | – |
| VCMP.F32 | Sd, <Sm | #0.0> | Compare two floating-point registers, or one floating-point register and zero | FPSCR |
| VCMPE.F32 | Sd, <Sm | #0.0> | Compare two floating-point registers, or one floating-point register and zero with Invalid Operation check | FPSCR |
| VCVT.S32.F32 | Sd, Sm | Convert between floating-point and integer | – |
| VCVT.S16.F32 | Sd, Sd, #fbits | Convert between floating-point and fixed point | – |
| VCVTR.S32.F32 | Sd, Sm | Convert between floating-point and integer with rounding | – |
| VCVT<B|H>.F32.F16 | Sd, Sm | Converts half-precision value to single-precision | – |
| VCVTT<B|T>.F32.F16 | Sd, Sm | Converts single-precision register to half-precision | – |
| VDIV.F32 | {Sd,} Sn, Sm | Floating-point divide | – |
| VFMA.F32 | {Sd,} Sn, Sm | Floating-point fused multiply accumulate | – |
| VFNMA.F32 | {Sd,} Sn, Sm | Floating-point fused negate multiply accumulate | – |
| VFMS.F32 | {Sd,} Sn, Sm | Floating-point fused multiply subtract | – |
| VFNMS.F32 | {Sd,} Sn, Sm | Floating-point fused negate multiply subtract | – |
| VLDM.F<32|64> | Rn{!}, list | Load multiple extension registers | – |
| VLDR.F<32|64> | <Dd|Sd>, [Rn] | Load an extension register from memory | – |
| VLMA.F32 | {Sd,} Sn, Sm | Floating-point multiply accumulate | – |
| VLMS.F32 | {Sd,} Sn, Sm | Floating-point multiply subtract | – |
| VMOV.F32 | Sd, #imm | Floating-point move immediate | – |
| VMOV | Sd, Sm | Floating-point move register | – |
| VMOV | Sn, Rt | Copy Arm core register to single precision | – |
| VMOV | Sm, Sm1, Rt, Rt2 | Copy two Arm core registers to two single precision | – |
| VMOV | Dd[x], Rt | Copy Arm core register to scalar | – |
| VMOV | Rt, Dn[x] | Copy scalar to Arm core register | – |
| VMRS | Rt, FPSCR | Move FPSCR to Arm core register or APSR | N,Z,C,V |
| VMSR | FPSCR, Rt | Move to FPSCR from Arm Core register | FPSCR |
| VMUL.F32 | {Sd,} Sn, Sm | Floating-point multiply | – |
| VNEG.F32 | Sd, Sm | Floating-point negate | – |
| VNMLA.F32 | {Sd,} Sn, Sm | Floating-point multiply and add | – |
| VNMLS.F32 | {Sd,} Sn, Sm | Floating-point multiply and subtract | – |
| VNMUL | {Sd,} Sn, Sm | Floating-point multiply | – |
| VPOP | list | Pop extension registers | – |
| VPUSH | list | Push extension registers | – |
| VSQRT.F32 | Sd, Sm | Calculates floating-point square root | – |
| VSTM | Rn{!}, list | Floating-point register store multiple | – |
| VSTR.F3<32|64> | Sd, [Rn] | Stores an extension register to memory | – |
| VSUB.F<32|64> | {Sd,} Sn, Sm | Floating-point subtract | – |
| WFE | – | Wait for event | – |
| WFI | – | Wait for interrupt | – |