4.3.6. CMP and CMN

Compare and Compare Negative.


CMP{cond} Rn, Operand2
CMN{cond} Rn, Operand2



is an optional condition code (see Conditional execution).


is the ARM register holding the first operand.


is a flexible second operand. See Flexible second operand for details of the options.


These instructions compare the value in a register with Operand2. They update the condition flags on the result, but do not place the result in any register.

The CMP instruction subtracts the value of Operand2 from the value in Rn. This is the same as a SUBS instruction, except that the result is discarded.

The CMN instruction adds the value of Operand2 to the value in Rn. This is the same as an ADDS instruction, except that the result is discarded.

In certain circumstances, the assembler can substitute CMN for CMP, or CMP for CMN. Be aware of this when reading disassembly listings. See Instruction substitution for details.

Use of pc in ARM instructions


Use of pc (r15) in these ARM instructions is deprecated.

If you use pc as Rn, the value used is the address of the instruction plus 8.

You cannot use pc for any operand in any data processing instruction that has a register-controlled shift (see Flexible second operand).

Use of pc in Thumb-2 instructions

You cannot use pc (r15) for any operand in these instructions.

Condition flags

These instructions update the N, Z, C and V flags according to the result.

16-bit instructions

The following forms of these instructions are available in pre-Thumb-2 Thumb code, and are 16-bit instructions when used in Thumb-2 code:

CMP Rn, Rm

CMN Rn, Rm

Rn and Rm must both be Lo registers.

CMP Rn, #imm

Rn must be a Lo register. imm range 0-255.


    CMP     r2, r9
    CMN     r0, #6400
    CMPGT   r13, r7, LSL #2

Incorrect example

    CMP     r2, pc, ASR r0 ; pc not permitted with register controlled shift
Copyright © 2002-2010 ARM. All rights reserved.ARM DUI 0204J