CMP<cc> (wide elements)

Compare vector to 64-bit wide elements

This instruction compares active integer elements in the first source vector with overlapping 64-bit doubleword elements in the second source vector, 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
00100100size0Zm001PgZn0Pd
opo2ne

Encoding

CMPEQ <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.D

Decode for this encoding

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

Greater than
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size0Zm010PgZn1Pd
Ultne

Encoding

CMPGT <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.D

Decode for this encoding

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

Greater than or equal
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size0Zm010PgZn0Pd
Ultne

Encoding

CMPGE <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.D

Decode for this encoding

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

Higher
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size0Zm110PgZn1Pd
Ultne

Encoding

CMPHI <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.D

Decode for this encoding

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

Higher or same
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size0Zm110PgZn0Pd
Ultne

Encoding

CMPHS <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.D

Decode for this encoding

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

Less than
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size0Zm011PgZn0Pd
Ultne

Encoding

CMPLT <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.D

Decode for this encoding

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

Less than or equal
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size0Zm011PgZn1Pd
Ultne

Encoding

CMPLE <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.D

Decode for this encoding

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

Lower
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size0Zm111PgZn0Pd
Ultne

Encoding

CMPLO <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.D

Decode for this encoding

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

Lower or same
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size0Zm111PgZn1Pd
Ultne

Encoding

CMPLS <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.D

Decode for this encoding

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

Not equal
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00100100size0Zm001PgZn1Pd
opo2ne

Encoding

CMPNE <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.D

Decode for this encoding

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; if size == '11' then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 8 << UInt(size); let g : integer = UInt(Pg); let n : integer = UInt(Zn); let m : integer = UInt(Zm); let d : integer = UInt(Pd); let cmp_op : CmpOp = Cmp_NE; 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 RESERVED
<Pg>

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

<Zn>

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

<Zm>

Is the name of the second source scalable vector register, encoded in the "Zm" 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}; let operand2 : bits(VL) = if AnyActiveElement{PL}(mask, esize) then Z{VL}(m) 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; let op2elt : bits(64) = operand2[((e * esize) DIVRM 64)*:64]; let element2 : integer = if unsigned then UInt(op2elt) else SInt(op2elt); case cmp_op of when Cmp_EQ => cond = element1 == element2; when Cmp_NE => cond = element1 != element2; when Cmp_GE => cond = element1 >= element2; when Cmp_LT => cond = element1 < element2; when Cmp_GT => cond = element1 > element2; when Cmp_LE => cond = element1 <= element2; 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.