LUTI2
Lookup table read with 2-bit indices
This instruction copies indexed 8-bit or 16-bit elements from 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.
If PSTATE.DIT is 1:
The execution time of this instruction is independent of:
The values of the data supplied in any of its registers.
The values of the NZCV flags.
The response of this instruction to asynchronous exceptions does not vary based on:
The values of the data supplied in any of its registers.
The values of the NZCV flags.
0
1
0
0
1
1
1
0
1
x
0
0
0
0
0
1
LUTI2 <Vd>.16B, { <Vn>.16B }, <Vm>[<index>]
1
LUTI2 <Vd>.8H, { <Vn>.8H }, <Vm>[<index>]
if !IsFeatureImplemented(FEAT_LUT) then UNDEFINED;
if op2 == '10' && op == '0' then UNDEFINED;
constant integer d = UInt(Rd);
constant integer n = UInt(Rn);
constant integer m = UInt(Rm);
constant integer isize = 2;
constant integer esize = if op2 == '10' then 8 else 16;
constant integer part = if op2 == '10' then UInt(len) else UInt(len:op);
<Vd>
Is the name of the SIMD&FP destination register, encoded in the "Rd" field.
<Vn>
Is the name of the SIMD&FP table register, encoded in the "Rn" field.
<Vm>
Is the name of the SIMD&FP source register, encoded in the "Rm" field.
<index>
For the byte variant: is the vector segment index, in the range 0 to 3, encoded in the "len" field.
<index>
For the halfword variant: is the vector segment index, in the range 0 to 7, encoded in the "len:op" fields.
CheckFPAdvSIMDEnabled64();
constant integer elements = 128 DIV esize;
constant integer ibase = elements * part;
constant bits(128) indices = V[m, 128];
constant bits(128) table = V[n, 128];
bits(128) result;
for e = 0 to elements-1
constant integer index = UInt(Elem[indices, ibase + e, isize]);
Elem[result, e, esize] = Elem[table, index, esize];
V[d, 128] = result;