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
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100101size0imm5100PgZn0Pd
opo2ne

Encoding

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

Decode for this encoding

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
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100101size0imm5000PgZn1Pd
opltne

Encoding

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

Decode for this encoding

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
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100101size0imm5000PgZn0Pd
opltne

Encoding

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

Decode for this encoding

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
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size1imm70PgZn1Pd
ltne

Encoding

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

Decode for this encoding

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
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size1imm70PgZn0Pd
ltne

Encoding

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

Decode for this encoding

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
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100101size0imm5001PgZn0Pd
opltne

Encoding

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

Decode for this encoding

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
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100101size0imm5001PgZn1Pd
opltne

Encoding

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

Decode for this encoding

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
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size1imm71PgZn0Pd
ltne

Encoding

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

Decode for this encoding

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
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size1imm71PgZn1Pd
ltne

Encoding

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

Decode for this encoding

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
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100101size0imm5100PgZn1Pd
opo2ne

Encoding

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

Decode for this encoding

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 which is dependent on the predicate register or NZCV condition flags written by this instruction might be significantly delayed.


2026-03_rel 2026-03-26 20:48:11

Copyright © 2010-2026 Arm Limited or its affiliates. All rights reserved. This document is Non-Confidential.