ccmn

Conditional Compare Negative (Register)

CCMN <Wn>, <Wm>, #<nzcv>, <cond>

Compares two registers (negated) if condition is true.

Details

Conditional Compare Negative (Register), 32-bit. If the condition is true, performs an arithmetic compare of Wn + Wm, otherwise loads the NZCV flags with the immediate value nzcv. The comparison sets or clears N, Z, C, V flags accordingly. AArch64-only instruction.

Pseudocode Operation

if ConditionHolds(cond) then temp ← Wn + Wm; N ← temp[31]; Z ← (temp == 0); C ← UnsignedOverflow(Wn, Wm); V ← SignedOverflow(Wn, Wm) else N ← nzcv[3]; Z ← nzcv[2]; C ← nzcv[1]; V ← nzcv[0]

Example

CCMN w1, w2, #nzcv, cond

Encoding

Binary Layout
0
0
1
11010010
Rm
cond
0
0
Rn
0
nzcv
 
Format Cond Comp
Opcode 0x3A400000
Extension Base

Operands

  • Wn
    Reg 1
  • Wm
    Reg 2
  • nzcv
    Flags
  • cond
    Condition

Reference (Arm A64 ISA)

Instruction Forms

Encoding Instruction ISA Bit pattern
0x3A400800 CCMN <Wn>, #<imm>, #<nzcv>, <cond> A64 0 | 0 | 1 | 11010010 | imm5 | cond | 1 | 0 | Rn | 0 | nzcv
0xBA400800 CCMN <Xn>, #<imm>, #<nzcv>, <cond> A64 1 | 0 | 1 | 11010010 | imm5 | cond | 1 | 0 | Rn | 0 | nzcv
0x3A400000 CCMN <Wn>, <Wm>, #<nzcv>, <cond> A64 0 | 0 | 1 | 11010010 | Rm | cond | 0 | 0 | Rn | 0 | nzcv
0xBA400000 CCMN <Xn>, <Xm>, #<nzcv>, <cond> A64 1 | 0 | 1 | 11010010 | Rm | cond | 0 | 0 | Rn | 0 | nzcv

Description

Conditional Compare Negative (register) sets the value of the condition flags to the result of the comparison of a register value and the inverse of another register value if the condition is TRUE, and an immediate value otherwise.

Operation

if ConditionHolds(cond) then
    bits(datasize) operand1 = X[n, datasize];
    bits(datasize) operand2 = X[m, datasize];
    (-, flags) = AddWithCarry(operand1, operand2, '0');
PSTATE.<N,Z,C,V> = flags;