ccmp
Conditional Compare (Register)
CCMP <Wn>, <Wm>, #<nzcv>, <cond>
Compares two registers if condition is true.
Details
Conditional Compare (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 ← NOT(BorrowFrom(Wn, Wm)); V ← SignedOverflow(Wn, -Wm) else N ← nzcv[3]; Z ← nzcv[2]; C ← nzcv[1]; V ← nzcv[0]
Example
CCMP w1, w2, #nzcv, cond
Encoding
Binary Layout
0
1
1
11010010
Rm
cond
0
0
Rn
0
nzcv
Operands
-
Wn
Reg 1 -
Wm
Reg 2 -
nzcv
Flags -
cond
Condition
Reference (Arm A64 ISA)
Instruction Forms
| Encoding | Instruction | ISA | Bit pattern | ||
|---|---|---|---|---|---|
| 0x7A400800 | CCMP <Wn>, #<imm>, #<nzcv>, <cond> | A64 | 0 | 1 | 1 | 11010010 | imm5 | cond | 1 | 0 | Rn | 0 | nzcv | ||
| 0xFA400800 | CCMP <Xn>, #<imm>, #<nzcv>, <cond> | A64 | 1 | 1 | 1 | 11010010 | imm5 | cond | 1 | 0 | Rn | 0 | nzcv | ||
| 0x7A400000 | CCMP <Wn>, <Wm>, #<nzcv>, <cond> | A64 | 0 | 1 | 1 | 11010010 | Rm | cond | 0 | 0 | Rn | 0 | nzcv | ||
| 0xFA400000 | CCMP <Xn>, <Xm>, #<nzcv>, <cond> | A64 | 1 | 1 | 1 | 11010010 | Rm | cond | 0 | 0 | Rn | 0 | nzcv |
Description
Conditional Compare (register) sets the value of the condition flags to the result of the comparison of two registers 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];
operand2 = NOT(operand2);
(-, flags) = AddWithCarry(operand1, operand2, '1');
PSTATE.<N,Z,C,V> = flags;