Lookup table read with 6-bit indices (16-bit)
This instruction copies indexed 16-bit elements from the low 512 bits of the two table vectors to four destination vectors using packed 6-bit indices in the low or high one and a half vector segment of the two source vectors. The source vectors segment consumed in order to fill the destination vectors is selected by the source vector segment index. This instruction is unpredicated. This instruction requires that the Effective SVE vector length is at least 512 bits.
It has encodings from 2 classes: Consecutive and Strided
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | i1 | 1 | Zm | 1 | 1 | 1 | 1 | 0 | 1 | Zn | Zd | 0 | 0 | ||||||||||
if !IsFeatureImplemented(FEAT_SME2p3) then EndOfDecode(Decode_UNDEF); end; if MaxImplementedSVL() < 512 then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 16; let isize : integer{} = 6; let n : integer = UInt(Zn); let m : integer = UInt(Zm); let dstride : integer = 1; let d : integer = UInt(Zd::'00'); let select : integer = UInt(i1);
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | i1 | 1 | Zm | 1 | 1 | 1 | 1 | 1 | 1 | Zn | D | 0 | 0 | Zd | |||||||||
LUTI6 { <Zd1>.H, <Zd2>.H, <Zd3>.H, <Zd4>.H }, { <Zn1>.H, <Zn2>.H }, { <Zm1>-<Zm2> }[<index>]
if !IsFeatureImplemented(FEAT_SME2p3) then EndOfDecode(Decode_UNDEF); end; if MaxImplementedSVL() < 512 then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 16; let isize : integer{} = 6; let n : integer = UInt(Zn); let m : integer = UInt(Zm); let dstride : integer = 4; let d : integer = UInt(D::'00'::Zd); let select : integer = UInt(i1);
| <Zn1> |
Is the name of the first table vector register, encoded as "Zn". |
| <Zn2> |
Is the name of the second table vector register, encoded as "Zn" plus 1 modulo 32. |
| <Zm1> |
Is the name of the first scalable vector register of the source multi-vector group, encoded as "Zm". |
| <Zm2> |
Is the name of the second scalable vector register of the source multi-vector group, encoded as "Zm" plus 1 modulo 32. |
| <index> |
Is the vector segment index, in the range 0 to 1, encoded in the "i1" field. |
| <Zd2> |
Is the name of the second scalable vector register Z4-Z7 or Z20-Z23 of the destination multi-vector group, encoded as "D:'01':Zd". |
| <Zd3> |
Is the name of the third scalable vector register Z8-Z11 or Z24-Z27 of the destination multi-vector group, encoded as "D:'10':Zd". |
CheckStreamingSVEEnabled(); let VL : integer{} = CurrentVL(); if VL < 512 then EndOfDecode(Decode_UNDEF); end; let elements : integer = VL DIV esize; let operand : bits(2*VL) = Z{VL}((m+1) MOD 32) :: Z{VL}(m+0); let idxsize : integer{} = VL + (VL DIV 2); let idxpos : integer{} = if select == 1 then (VL DIV 2) else 0; let indexes : bits(idxsize) = operand[idxpos+:idxsize]; let table : bits(1024) = Z{VL}((n+1) MOD 32)[511:0] :: Z{VL}(n+0)[511:0]; var dst : integer = d; var result : bits(VL); for r = 0 to 3 do let base : integer = r * elements; for e = 0 to elements-1 do let index : integer = UInt(indexes[(base+e)*:isize]); result[e*:esize] = table[index*:esize]; end; Z{VL}(dst) = result; dst = dst + dstride; end;
This instruction is a data-independent-time instruction as described in About PSTATE.DIT.
2025-12_rel 2025-12-10 16:41:45
Copyright © 2010-2025 Arm Limited or its affiliates. All rights reserved. This document is Non-Confidential.