高通 Hexagon V65 HVX 编程参考手册(19)

高通 Hexagon V65 HVX 编程参考手册(19)

5.11 HVX/PERMUTE-SHIFT-RESOURCE

HVX/PERMUTE-SHIFT-RESOURCE 指令子类包括使用 HVX 置换和移位资源的指令。

Vector shuffle and deal cross-lane
Vshuff(以前称为 vtrans2x2)和 vdeal 在两个向量中的元素组之间执行多级转置操作。元素大小由标量寄存器 Rt 指定。 Rt=1表示一个字节的元素大小,Rt=2表示半字,Rt=4字,Rt=8 8字节,Rt=16 16字节,Rt=32 32字节。两个寄存器中的数据应视为两行,每行 64 字节。每个二乘二的组被转置。例如,Rt = 4 表示每个元素包含四个字节。其中四个元素组成的矩阵由偶数寄存器中的两个元素和奇数寄存器中的两个对应元素组成。然后将这个 2×2 数组转置,然后将生成的元素呈现在两个目标寄存器中。请注意,Rt = 0 的值会使输入保持不变。

下图显示了 Rt = 1、2、4、8、16、32 的示例。在这些情况下,vdeal 和 vshuff 执行相同的操作。该图对 vshuff 和 vdeal 有效。
在这里插入图片描述

当使用 1、2、4、8、16、32 以外的 Rt 值时,效果是复合层次转置。例如,如果使用值 23,则 23 = 1+2+4+16。这表明转换与执行 vshuff 指令相同,其中 Rt=1,然后 Rt=2 结果,然后 Rt = 4 结果,然后 Rt = 16 结果。请注意,顺序是增加元素大小。在 vdeal 的情况下,顺序是相反的,首先从最大的元素大小开始,然后向下处理到最小的。

当Rt值为2的负次方:-1,-2,-4,-8,-16,-32时,对vshuff进行完美洗牌,对vdeal进行最小元素大小的处理。例如,如果 Rt = -24 这是八的倍数,那么八是最小的元素大小。对于 Rt 的 -ve 值,值 Rt 的所有高位都被设置。例如,当 Rt=-8 时,这与 32+16+8 相同。下图显示了此转换对 vshuff 和 vdeal 的影响。
在这里插入图片描述
在这里插入图片描述

如果除了这一系列转换之外,块大小定义为 B,元素大小定义为 E,如果 Rt = B - E,则生成的转换是一组 B 个连续块,每个块包含完全混洗或处理的元素元素大小 E。在 64B 向量的情况下,每个块 B 包含 128/B 个元素。这代表了大多数常用的数据转换。当 B 设置为 0 时,结果是对整个向量寄存器对中的元素进行洗牌或处理。

在这里插入图片描述

注意事项

  • 该指令使用HVX 置换资源
  • 输入标量寄存器Rt 仅限于寄存器0 到7
  • 该指令使用HVX 移位资源
    在这里插入图片描述

Vector in-lane lookup table
VLUT指令用于实现快速的矢量查找表。查找表包含在VV寄存器中,而索引则保存在VU中。表元素可以是8位或16位。聚合功能用于在64B模式下实现大于64个字节的表和128B模式下的128个字节。该解释讨论了64B和128B操作模式。在64和128字节模式中,可访问的最大查找表的最大量为32个字节(vlut32)和Hwords查找中的16个半单词(VLUT16)。

8-bit elements
在64 Byte模式的情况下,具有8位元素的表支持32个输入查找表,使用VLUT32指令。通过将输入字节的较低五位用于各自的输出字节,有条件地选择所需的条目。控制输入​​寄存器RT包含匹配和选择位。 RT的下部三位必须匹配输入字节索引的上部三个位,以便将表格输入分别写入VD或VX中的目标矢量寄存器字节。 RT的LSB在VV中选择奇数甚至(32个条目)查找表。如果256B表自然存储在内存中,则看起来像以下示例:

127,126,.....66, 65, 64, 63, 62,.........2, 1, 0 
255,254,....194,193,192,191,190,.......130,129,128

为了在 64B 模式下与 vlut 指令一起使用,它必须以 32 字节为单位进行混洗。

63, 31, 62, 30,......36, 4, 35, 3, 34, 2, 33, 1, 32, 0 Rt=0, Rt=1 127, 95,126, 94,.....100, 68, 99, 67, 98, 66, 97, 65, 96, 64 Rt=2, Rt=3 same ordering for bytes 128-255 Rt=4, 5, 6, 7

在 128B 模式的情况下,数据必须以 64 字节为单位进行混洗。

127, 63,126, 62,........68, 4, 67, 3, 66, 2, 65, 1, 64, 0 Rt=0,1,2,3 same ordering for bytes 128-255 Rt=4,5,6,7 

如果数据以这种方式存储,则使用 64 或 128B 模式访问它会得到相同的结果。在 128B 模式下,Rt 的第 1 位选择是使用奇数还是偶数打包表,第 0 位选择高位或低位表的低 32 个元素中的高位。
在这里插入图片描述
在这里插入图片描述

16-bit elements
对于具有16位元素的表,基本单元是以64B模式和128B模式的16个输入查找表。由VLUT16说明支持。均匀的字节条目可以使用较低的四个位为偶数目标寄存器VDD0进行有条件选择。奇数字节条目选择“奇数矢量目标寄存器” VDD1的表条目。控制输入​​寄存器RT以与字节表案例相同的方式包含匹配和选择位。对于64B模式,RT的下部四位必须匹配输入字节的上部四个位,以便将表格输入分别写入VDD或VXX中的目标矢量寄存器字节。 RT的位0选择VV中的偶数或奇数16个条目。在128B情况下,只有四个输入字节的上位也必须与RT的下四个匹配。 Bit RT选择了奇数甚至hwords,并且位0选择VV寄存器中的下部或上部16个条目。

对于 hword 情况下大于 32 个元素的表(例如 256 个条目),用户必须访问 8 个不同的 32 hword 部分中的主查找表。如果将一个256H的表自然存储在内存中,它会是这样的:

63, 62,.........2, 1, 0 127,126,.......66, 65, 64 191,190,......130,129,128,255,254,......194,193,192

要准备与64B模式下的VLUT指令一起使用,必须在16个Hwords的块中改组,RT的LSB用于选择VV中的偶数或奇数16个输入Hword表。

31, 15, 30, 14,......20, 4, 19, 3, 18, 2, 17, 1, 16, 0 Rt=0, Rt=1 63, 47, 62, 46,..... 52, 36, 51, 35, 50, 34, 49, 33, 48, 32 Rt=2, Rt=3 same ordering for bytes 64-255 Rt=4, 5, 6, 7, 8, 9, 10,11,12,13,14,15

对于 128B 模式,数据必须以 32 hwords 为单位进行混洗。 Rt 的第 1 位用于在 Vv 中的偶数或奇数 32 hwords 之间进行选择。位 0 访问奇数或偶数组的高或低 16 个半字。

63, 31, 62, 30,........36, 4, 35, 3, 34, 2, 33, 1, 32, 0 Rt=0,1 Rt=2,3 same ordering for bytes 128-255 Rt=4,5, Rt=6,7, Rt=8,9, Rt=10,11, Rt=12,13, Rt=14,15

下图显示了使用偶数字节查找表值的 vlut16,结果写入偶数目标寄存器。显示进入奇数目的地、64B 和 128B 模式的奇数值。
在这里插入图片描述在这里插入图片描述

具有 nomatch 扩展名的 vluts 不查看高位并始终产生结果。这些用于小型查找表。
在这里插入图片描述
在这里插入图片描述

Class: COPROC_VX (slots 0,1,2,3)

注意

  • 此指令使用HVX置入资源
  • 输入标量寄存器RT仅限于寄存器0到7
  • 此指令使用HVX Shift资源
    在这里插入图片描述
    在这里插入图片描述

Unpack
解包操作有两种形式。第一种形式采用向量寄存器 Vu 中的每个元素,并且零或符号将其扩展到下一个最大元素大小。结果写入向量寄存器 Vdd。此操作支持将有符号或无符号字节解包为半字,将有符号或无符号半字解包为字,以及将无符号字解包为无符号双精度。

第二种形式将元素从VU插入VXX的奇数位置。 VXX的均匀元素没有更改。该操作支持签名或未签名字节的拆箱,并签名或无符号的半字。
在这里插入图片描述
在这里插入图片描述

注意事项

  • 该指令使用HVX 置换资源。
  • 本指令使用HVX 移位资源。
    在这里插入图片描述
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38498942/article/details/129852591
今日推荐