CNTP (predicate as counter)

Set scalar to count from predicate-as-counter

Counts the number of true elements in the source predicate and places the scalar result in the destination general-purpose register.

Encoding: SVE2

Variants: FEAT_SME2 || FEAT_SVE2p1 (FEAT_SME2 || FEAT_SVE2p1)

313029282726252423222120191817161514131211109876543210
00100101100000100001
sizeopcvlPNnRd

CNTP <Xd>, <PNn>.<T>, <vl>

Decoding algorithm

if !IsFeatureImplemented(FEAT_SME2) && !IsFeatureImplemented(FEAT_SVE2p1) then
    EndOfDecode(Decode_UNDEF);
constant integer esize = 8 << UInt(size);
constant integer n = UInt(PNn);
constant integer d = UInt(Rd);
constant integer width = 2 << UInt(vl);

Operation

if IsFeatureImplemented(FEAT_SVE2p1) then CheckSVEEnabled(); else CheckStreamingSVEEnabled();
constant integer VL = CurrentVL;
constant integer PL = VL DIV 8;
constant integer elements = VL DIV esize;
constant bits(PL) pred = P[n, PL];
constant bits(PL*4) mask = CounterToPredicate(pred<15:0>, PL*4);
bits(64) sum = Zeros(64);
constant integer maxelements = elements * width;

for e = 0 to maxelements-1
    if ActivePredicateElement(mask, e, esize) then
        sum = sum + 1;
X[d, 64] = sum;

Explanations

<Xd>: Is the 64-bit name of the destination general-purpose register, encoded in the "Rd" field.
<PNn>: Is the name of the source scalable predicate register, with predicate-as-counter encoding, encoded in the "PNn" field.
<T>: <vl>: