PMULLB

Polynomial multiply long (bottom)

Polynomial multiply over [0, 1] the corresponding even-numbered elements of the first and second source vectors, and place the results in the overlapping double-width elements of the destination vector. This instruction is unpredicated.

ID_AA64ZFR0_EL1.AES indicates whether the 128-bit element variant is implemented. The 128-bit element variant is legal when executed in Streaming SVE mode if one of the following is true:

  • Both FEAT_SSVE_AES and FEAT_SVE_PMULL128 are implemented.
  • FEAT_SME_FA64 is implemented and enabled.
  • Encoding: 16-bit or 64-bit elements

    Variants: FEAT_SVE2 || FEAT_SME (FEAT_SVE2 || FEAT_SME)

    313029282726252423222120191817161514131211109876543210
    01000101!= 000011010
    sizeZmopUTZnZd

    PMULLB <Zd>.<T>, <Zn>.<Tb>, <Zm>.<Tb>

    Decoding algorithm

    if !IsFeatureImplemented(FEAT_SVE2) && !IsFeatureImplemented(FEAT_SME) then
        EndOfDecode(Decode_UNDEF);
    if size<0> == '0' then EndOfDecode(Decode_UNDEF);
    constant integer esize = 8 << UInt(size);
    constant integer n = UInt(Zn);
    constant integer m = UInt(Zm);
    constant integer d = UInt(Zd);

    Encoding: 128-bit element

    Variants: FEAT_SVE_PMULL128 (ARMv9.0)

    313029282726252423222120191817161514131211109876543210
    01000101000011010
    sizeZmopUTZnZd

    PMULLB <Zd>.Q, <Zn>.D, <Zm>.D

    Decoding algorithm

    if !IsFeatureImplemented(FEAT_SVE_PMULL128) then EndOfDecode(Decode_UNDEF);
    constant integer esize = 128;
    constant integer n = UInt(Zn);
    constant integer m = UInt(Zm);
    constant integer d = UInt(Zd);

    Operation

    if esize == 128 then
        if IsFeatureImplemented(FEAT_SSVE_AES) then
            CheckSVEEnabled();
        else
            CheckNonStreamingSVEEnabled();
    else
        CheckSVEEnabled();
    constant integer VL = CurrentVL;
    constant integer elements = VL DIV esize;
    constant bits(VL) operand1 = Z[n, VL];
    constant bits(VL) operand2 = Z[m, VL];
    bits(VL) result;
    
    for e = 0 to elements-1
        constant bits(esize DIV 2) element1 = Elem[operand1, 2*e + 0, esize DIV 2];
        constant bits(esize DIV 2) element2 = Elem[operand2, 2*e + 0, esize DIV 2];
        Elem[result, e, esize] = PolynomialMult(element1, element2);
    
    Z[d, VL] = result;

    Explanations

    <Zd>: Is the name of the destination scalable vector register, encoded in the "Zd" field.
    <T>: <Zn>: Is the name of the first source scalable vector register, encoded in the "Zn" field.
    <Tb>: <Zm>: Is the name of the second source scalable vector register, encoded in the "Zm" field.

    Operational Notes

    If PSTATE.DIT is 1: