← Home

CMP<cc> (immediate)

Compare vector to immediate

This instruction compares active integer elements in the source vector with an immediate, and places the boolean results of the specified comparison in the corresponding elements of the destination predicate. Inactive elements in the destination predicate register are set to zero. This instruction sets the First (N), None (Z), and !Last (C) condition flags based on the predicate result, and sets the V flag to zero.

<cc> Comparison
EQ equal
GE signed greater than or equal
GT signed greater than
HI unsigned higher than
HS unsigned higher than or same
LE signed less than or equal
LO unsigned lower than
LS unsigned lower than or same
LT signed less than
NE not equal

It has encodings from 10 classes: Equal , Greater than , Greater than or equal , Higher , Higher or same , Less than , Less than or equal , Lower , Lower or same and Not equal

Equal class

(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100101size0imm5100PgZn0Pd
opo2ne

Encoding

CMPEQ <Pd>.<T>, <Pg>/Z, <Zn>.<T>, #<imm>

Decode

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 8 << UInt(size); let g : integer = UInt(Pg); let n : integer = UInt(Zn); let d : integer = UInt(Pd); let cmp_op : CmpOp = Cmp_EQ; let imm : integer = SInt(imm5); let unsigned : boolean = FALSE;

Greater than class

(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100101size0imm5000PgZn1Pd
opltne

Encoding

CMPGT <Pd>.<T>, <Pg>/Z, <Zn>.<T>, #<imm>

Decode

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 8 << UInt(size); let g : integer = UInt(Pg); let n : integer = UInt(Zn); let d : integer = UInt(Pd); let cmp_op : CmpOp = Cmp_GT; let imm : integer = SInt(imm5); let unsigned : boolean = FALSE;

Greater than or equal class

(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100101size0imm5000PgZn0Pd
opltne

Encoding

CMPGE <Pd>.<T>, <Pg>/Z, <Zn>.<T>, #<imm>

Decode

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 8 << UInt(size); let g : integer = UInt(Pg); let n : integer = UInt(Zn); let d : integer = UInt(Pd); let cmp_op : CmpOp = Cmp_GE; let imm : integer = SInt(imm5); let unsigned : boolean = FALSE;

Higher class

(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size1imm70PgZn1Pd
ltne

Encoding

CMPHI <Pd>.<T>, <Pg>/Z, <Zn>.<T>, #<imm>

Decode

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 8 << UInt(size); let g : integer = UInt(Pg); let n : integer = UInt(Zn); let d : integer = UInt(Pd); let cmp_op : CmpOp = Cmp_GT; let imm : integer = UInt(imm7); let unsigned : boolean = TRUE;

Higher or same class

(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size1imm70PgZn0Pd
ltne

Encoding

CMPHS <Pd>.<T>, <Pg>/Z, <Zn>.<T>, #<imm>

Decode

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 8 << UInt(size); let g : integer = UInt(Pg); let n : integer = UInt(Zn); let d : integer = UInt(Pd); let cmp_op : CmpOp = Cmp_GE; let imm : integer = UInt(imm7); let unsigned : boolean = TRUE;

Less than class

(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100101size0imm5001PgZn0Pd
opltne

Encoding

CMPLT <Pd>.<T>, <Pg>/Z, <Zn>.<T>, #<imm>

Decode

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 8 << UInt(size); let g : integer = UInt(Pg); let n : integer = UInt(Zn); let d : integer = UInt(Pd); let cmp_op : CmpOp = Cmp_LT; let imm : integer = SInt(imm5); let unsigned : boolean = FALSE;

Less than or equal class

(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100101size0imm5001PgZn1Pd
opltne

Encoding

CMPLE <Pd>.<T>, <Pg>/Z, <Zn>.<T>, #<imm>

Decode

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 8 << UInt(size); let g : integer = UInt(Pg); let n : integer = UInt(Zn); let d : integer = UInt(Pd); let cmp_op : CmpOp = Cmp_LE; let imm : integer = SInt(imm5); let unsigned : boolean = FALSE;

Lower class

(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size1imm71PgZn0Pd
ltne

Encoding

CMPLO <Pd>.<T>, <Pg>/Z, <Zn>.<T>, #<imm>

Decode

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 8 << UInt(size); let g : integer = UInt(Pg); let n : integer = UInt(Zn); let d : integer = UInt(Pd); let cmp_op : CmpOp = Cmp_LT; let imm : integer = UInt(imm7); let unsigned : boolean = TRUE;

Lower or same class

(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size1imm71PgZn1Pd
ltne

Encoding

CMPLS <Pd>.<T>, <Pg>/Z, <Zn>.<T>, #<imm>

Decode

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 8 << UInt(size); let g : integer = UInt(Pg); let n : integer = UInt(Zn); let d : integer = UInt(Pd); let cmp_op : CmpOp = Cmp_LE; let imm : integer = UInt(imm7); let unsigned : boolean = TRUE;

Not equal class

(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100101size0imm5100PgZn1Pd
opo2ne

Encoding

CMPNE <Pd>.<T>, <Pg>/Z, <Zn>.<T>, #<imm>

Decode

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 8 << UInt(size); let g : integer = UInt(Pg); let n : integer = UInt(Zn); let d : integer = UInt(Pd); let cmp_op : CmpOp = Cmp_NE; let imm : integer = SInt(imm5); let unsigned : boolean = FALSE;

Assembler Symbols

<Pd>

Is the name of the destination scalable predicate register, encoded in the "Pd" field.

<T>

Is the size specifier, encoded in size:

size <T>
00 B
01 H
10 S
11 D
<Pg>

Is the name of the governing scalable predicate register P0-P7, encoded in the "Pg" field.

<Zn>

Is the name of the source scalable vector register, encoded in the "Zn" field.

<imm>

For the "Equal", "Greater than or equal", "Greater than", "Less than or equal", "Less than", and "Not equal" variants: is the signed immediate operand, in the range -16 to 15, encoded in the "imm5" field.

For the "Higher or same", "Higher", "Lower or same", and "Lower" variants: is the unsigned immediate operand, in the range 0 to 127, encoded in the "imm7" field.

Operation

CheckSVEEnabled(); let VL : integer{} = CurrentVL(); let PL : integer{} = VL DIV 8; let elements : integer = VL DIV esize; let mask : bits(PL) = P{}(g); let operand1 : bits(VL) = if AnyActiveElement{PL}(mask, esize) then Z{VL}(n) else Zeros{VL}; var result : bits(PL); let psize : integer{} = esize DIV 8; for e = 0 to elements-1 do let op1elt : bits(esize) = operand1[e*:esize]; let element1 : integer = if unsigned then UInt(op1elt) else SInt(op1elt); if ActivePredicateElement{PL}(mask, e, esize) then var cond : boolean; case cmp_op of when Cmp_EQ => cond = element1 == imm; when Cmp_NE => cond = element1 != imm; when Cmp_GE => cond = element1 >= imm; when Cmp_LT => cond = element1 < imm; when Cmp_GT => cond = element1 > imm; when Cmp_LE => cond = element1 <= imm; end; let pbit : bit = if cond then '1' else '0'; result[e*:psize] = ZeroExtend{psize}(pbit); else result[e*:psize] = ZeroExtend{psize}('0'); end; end; PSTATE.[N,Z,C,V] = PredTest{PL}(mask, result, esize); P{PL}(d) = result;

Operational information

This instruction is a data-independent-time instruction as described in About PSTATE.DIT.

If FEAT_SME is implemented and the PE is in Streaming SVE mode, then any subsequent instruction that is dependent on the predicate register or NZCV condition flags written by this instruction might be significantly delayed.


Version 2026.06 — Copyright © 2010-2026 Arm Limited or its affiliates.

This site is provided as a community resource and is NOT affiliated with nor endorsed by Arm Limited.