cmn

Compare Negative (A32)

CMN<c> <Rn>, <Rm> {, <shift>}

Adds two values and updates flags (discarding result). Same as ADDS with no destination.

Details

Computes Rn + (shifted Rm) and updates the N, Z, C, V flags based on the result, but discards the calculated value. Equivalent to an ADDS instruction with no destination register. Restricted to A32 instruction set.

Pseudocode Operation

if ConditionPassed() then
  (result, carry, overflow) ← AddWithCarry(Rn, shifted_Rm, '0')
  N ← result[31]
  Z ← (result == 0)
  C ← carry
  V ← overflow

Example

CMN r1, r2

Encoding

Binary Layout
cond
00010
11
1
Rn
0
0
0
0
imm5
stype
0
Rm
 
Format Data Proc
Opcode 0x01700000
Extension A32 (Base)

Operands

  • Rn
    First source / base general-purpose register
  • Rm
    Second source / offset general-purpose register

Reference (Arm AArch32 ISA)

Instruction Forms

Encoding Instruction ISA Bit pattern
0x03700000 CMN{<c>}{<q>} <Rn>, #<const> A32 cond | 00110 | 11 | 1 | Rn | 0 | 0 | 0 | 0 | imm12
0xF1100F00 CMN{<c>}{<q>} <Rn>, #<const> T32 11110 | i | 0 | 1000 | 1 | Rn | 0 | imm3 | 1111 | imm8
0x01700060 CMN{<c>}{<q>} <Rn>, <Rm>, RRX A32 cond | 00010 | 11 | 1 | Rn | 0 | 0 | 0 | 0 | 00000 | 11 | 0 | Rm
0x01700000 CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount>} A32 cond | 00010 | 11 | 1 | Rn | 0 | 0 | 0 | 0 | imm5 | stype | 0 | Rm
0x42C0 CMN{<c>}{<q>} <Rn>, <Rm> T32 010000 | 1011 | Rm | Rn
0xEB100F30 CMN{<c>}{<q>} <Rn>, <Rm>, RRX T32 1110101 | 1000 | 1 | Rn | 0 | 000 | 1111 | 00 | 11 | Rm
0xEB100F00 CMN{<c>}.W <Rn>, <Rm> T32 1110101 | 1000 | 1 | Rn | 0 | imm3 | 1111 | imm2 | stype | Rm
0x01700010 CMN{<c>}{<q>} <Rn>, <Rm>, <type> <Rs> A32 cond | 00010 | 11 | 1 | Rn | 0 | 0 | 0 | 0 | Rs | 0 | stype | 1 | Rm

Description

Compare Negative (register) adds a register value and an optionally-shifted register value. It updates the condition flags based on the result, and discards the result.

Operation

if ConditionPassed() then
    EncodingSpecificOperations();
    shifted = Shift(R[m], shift_t, shift_n, PSTATE.C);
    (result, nzcv) = AddWithCarry(R[n], shifted, '0');
    PSTATE.<N,Z,C,V> = nzcv;