CTERMEQ, CTERMNE

Compare and terminate loop

Detect termination conditions in serialized vector loops. Tests whether the comparison between the scalar source operands holds true and if not tests the state of the !Last condition flag (C) which indicates whether the previous flag-setting predicate instruction selected the last element of the vector partition.

The Z and C condition flags are preserved by this instruction. The N and V condition flags are set as a pair to generate one of the following conditions for a subsequent conditional instruction:

Condition N V Meaning GE 0 0 Continue loop (compare failed and last element not selected) LT 0 1 Terminate loop (last element selected) LT 1 0 Terminate loop (compare succeeded) GE 1 1 Never generated

The scalar source operands are 32-bit or 64-bit general-purpose registers of the same size.

Encoding: Equal

Variants: FEAT_SVE || FEAT_SME (FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
001001011100100000000
opszRmRnne

CTERMEQ <R><n>, <R><m>

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 32 << UInt(sz);
constant integer n = UInt(Rn);
constant integer m = UInt(Rm);
constant CmpOp cmp_op = Cmp_EQ;

Encoding: Not equal

Variants: FEAT_SVE || FEAT_SME (FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
001001011100100010000
opszRmRnne

CTERMNE <R><n>, <R><m>

Decoding algorithm

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 32 << UInt(sz);
constant integer n = UInt(Rn);
constant integer m = UInt(Rm);
constant CmpOp cmp_op = Cmp_NE;

Operation

CheckSVEEnabled();
constant bits(esize) operand1 = X[n, esize];
constant bits(esize) operand2 = X[m, esize];
constant integer element1 = UInt(operand1);
constant integer element2 = UInt(operand2);
boolean term;

case cmp_op of
    when Cmp_EQ term = element1 == element2;
    when Cmp_NE term = element1 != element2;
if term then
    PSTATE.N = '1';
    PSTATE.V = '0';
else
    PSTATE.N = '0';
    PSTATE.V = (NOT PSTATE.C);

Explanations

<R>: <n>: Is the number [0-30] of the source general-purpose register or the name ZR (31), encoded in the "Rn" field.
<m>: Is the number [0-30] of the source general-purpose register or the name ZR (31), encoded in the "Rm" field.

Operational Notes

If PSTATE.DIT is 1: