LUTI4
Lookup table read with 4-bit indices
This instruction copies indexed 8-bit or 16-bit elements from the one or two
table vectors to the destination vector using packed 4-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
0
1
0
0
0
0
1
0
LUTI4 <Vd>.16B, { <Vn>.16B }, <Vm>[<index>]
1
LUTI4 <Vd>.8H, { <Vn1>.8H, <Vn2>.8H }, <Vm>[<index>]
if !IsFeatureImplemented(FEAT_LUT) then UNDEFINED;
if len<0> == '0' && op == '0' then UNDEFINED;
constant integer d = UInt(Rd);
constant integer n = UInt(Rn);
constant integer m = UInt(Rm);
constant integer isize = 4;
constant integer esize = 8 << UInt(op);
constant integer ntblr = 1 << UInt(op);
constant integer part = if op == '0' then UInt(len<1>) else UInt(len);
<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 1, encoded in the "len<1>" field.
<index>
For the halfword variant: is the vector segment index, in the range 0 to 3, encoded in the "len" field.
<Vn1>
Is the name of the first SIMD&FP table register, encoded in the "Rn" field.
<Vn2>
Is the name of the second SIMD&FP table register, encoded as "Rn" plus 1 modulo 32.
CheckFPAdvSIMDEnabled64();
constant integer elements = 128 DIV esize;
constant integer ibase = elements * part;
constant bits(128) indices = V[m, 128];
constant bits(128) table1 = V[n+0, 128];
constant bits(128) table2 = if ntblr == 2 then V[(n+1) MOD 32, 128] else Zeros(128);
bits(128) result;
bits(esize) res;
for e = 0 to elements-1
constant integer index = UInt(Elem[indices, ibase + e, isize]);
if index < elements then
res = Elem[table1, index, esize];
else
assert ntblr == 2;
res = Elem[table2, index - elements, esize];
Elem[result, e, esize] = res;
V[d, 128] = result;