LUTI2 (8-bit and 16-bit)

Lookup table read with 2-bit indices (8-bit and 16-bit)

This instruction copies indexed 8-bit or 16-bit elements from the low 128 bits of the table vector to the destination vector using packed 2-bit indices from a segment of the source vector. A segment corresponds to a portion of the source vector that is consumed in order to fill the destination vector. The segment is selected by the vector segment index. This instruction is unpredicated.

Encoding: Byte

Variants: (FEAT_SVE2 || FEAT_SME2) && FEAT_LUT ((FEAT_SVE2 || FEAT_SME2) && FEAT_LUT)

313029282726252423222120191817161514131211109876543210
010001011101100
i2ZmZnZd

LUTI2 <Zd>.B, { <Zn>.B }, <Zm>[<index>]

Decoding algorithm

if ((!IsFeatureImplemented(FEAT_SVE2) && !IsFeatureImplemented(FEAT_SME2)) ||
      !IsFeatureImplemented(FEAT_LUT)) then EndOfDecode(Decode_UNDEF);
constant integer isize = 2;
constant integer esize = 8;
constant integer m = UInt(Zm);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer part = UInt(i2);

Encoding: Halfword

Variants: (FEAT_SVE2 || FEAT_SME2) && FEAT_LUT ((FEAT_SVE2 || FEAT_SME2) && FEAT_LUT)

313029282726252423222120191817161514131211109876543210
01000101110110
i3hZmi3lZnZd

LUTI2 <Zd>.H, { <Zn>.H }, <Zm>[<index>]

Decoding algorithm

if ((!IsFeatureImplemented(FEAT_SVE2) && !IsFeatureImplemented(FEAT_SME2)) ||
      !IsFeatureImplemented(FEAT_LUT)) then EndOfDecode(Decode_UNDEF);
constant integer isize = 2;
constant integer esize = 16;
constant integer m = UInt(Zm);
constant integer n = UInt(Zn);
constant integer d = UInt(Zd);
constant integer part = UInt(i3h:i3l);

Operation

if IsFeatureImplemented(FEAT_SME2) then CheckSVEEnabled(); else CheckNonStreamingSVEEnabled();
constant integer VL = CurrentVL;
constant integer elements = VL DIV esize;
constant integer ibase = elements * part;
constant bits(VL) indices = Z[m, VL];
constant bits(VL) table   = Z[n, VL];
bits(VL) result;

for e = 0 to elements-1
    constant integer index = UInt(Elem[indices, ibase + e, isize]);
    Elem[result, e, esize] = Elem[table, index, esize];

Z[d, VL] = result;

Explanations

<Zd>: Is the name of the destination scalable vector register, encoded in the "Zd" field.
<Zn>: Is the name of the table vector register, encoded in the "Zn" field.
<Zm>: Is the name of the source scalable vector register, encoded in the "Zm" field.
<index>: For the "Byte" variant: is the vector segment index, in the range 0 to 3, encoded in the "i2" field.
<index>: For the "Halfword" variant: is the vector segment index, in the range 0 to 7, encoded in the "i3h:i3l" fields.

Operational Notes

If PSTATE.DIT is 1: