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

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


Shuffle - deal

处理或删除元素到目标寄存器Vd。Vu的偶数元素放置在Vd的下半部分,奇数元素放置在上半部分。

在vdeale的情况下,Vv的偶数元素被处理到目标向量寄存器Vd的下半部分,而Vu的偶数元素被处理到Vd的上半部分。交易操作采用Vv的偶偶元素,并将它们放在Vd的较低季度,而Vv的奇偶元素放在Vd的第二季度。同样,Vu的偶偶元素放置在Vd的第三季度,而Vu的奇偶元素放置在Vd的第四季度。

在这里插入图片描述

在一个向量中打乱元素。来自相同位置的元素——但在向量寄存器的上半部分——被以偶数和奇数元素对打包在一起,然后放置在目标向量寄存器Vd中。

支持字节和半字。以类似于语音混合器的方式在单个寄存器输入上进行操作。

在这里插入图片描述

在这里插入图片描述
Class: COPROC_VX (slots 0,1,2,3)

**注意:**■此指令使用HVX排列资源

Intrinsics

Vd.b=vdeal(Vu.b) HVX_Vector Q6_Vb_vdeal_Vb(HVX_Vector Vu)
Vd.b=vdeale(Vu.b,Vv.b) HVX_Vector Q6_Vb_vdeale_VbVb(HVX_Vector Vu, HVX_Vector Vv)
Vd.b=vshuff(Vu.b) HVX_Vector Q6_Vb_vshuff_Vb(HVX_Vector Vu)
Vd.h=vdeal(Vu.h) HVX_Vector Q6_Vh_vdeal_Vh(HVX_Vector Vu)
Vd.h=vshuff(Vu.h) HVX_Vector Q6_Vh_vshuff_Vh(HVX_Vector Vu)

Encoding

在这里插入图片描述
在这里插入图片描述
Pack

vpack操作有三种形式。它们都将向量寄存器Vu和VV中的元素打包到目标向量寄存器Vd中。

vpacke甚至将来自Vv和Vu的元素分别写入Vd的下半部分和上半部分。

vpacko分别将来自Vv和Vu的奇数元素写入Vd的下半部分和上半部分。

vpack从Vv和Vu中获取所有元素,将它们饱和到下一个最小的元素大小,并将它们写入Vd。

在这里插入图片描述
在这里插入图片描述
Class: COPROC_VX (slots 0,1,2,3)

注意:
■ 此指令使用HVX排列资源。

Intrinsics

Vd.b=vpack(Vu.h,Vv.h):sat HVX_Vector Q6_Vb_vpack_VhVh_sat(HVX_Vector Vu, HVX_Vector Vv)
Vd.b=vpacke(Vu.h,Vv.h) HVX_Vector Q6_Vb_vpacke_VhVh(HVX_Vector Vu, HVX_Vector Vv)
Vd.b=vpacko(Vu.h,Vv.h) HVX_Vector Q6_Vb_vpacko_VhVh(HVX_Vector Vu, HVX_Vector Vv)
Vd.h=vpack(Vu.w,Vv.w):sat HVX_Vector Q6_Vh_vpack_VwVw_sat(HVX_Vector Vu, HVX_Vector Vv)
Vd.h=vpacke(Vu.w,Vv.w) HVX_Vector Q6_Vh_vpacke_VwVw(HVX_Vector Vu, HVX_Vector Vv)
Vd.h=vpacko(Vu.w,Vv.w) HVX_Vector Q6_Vh_vpacko_VwVw(HVX_Vector Vu, HVX_Vector Vv)
Vd.ub=vpack(Vu.h,Vv.h):sat HVX_Vector Q6_Vub_vpack_VhVh_sat(HVX_Vector Vu, HVX_Vector Vv)
Vd.uh=vpack(Vu.w,Vv.w):sat HVX_Vector Q6_Vuh_vpack_VwVw_sat(HVX_Vector Vu, HVX_Vector Vv)

Encoding

在这里插入图片描述

设置谓词

根据标量寄存器Rt的下一位设置一个序列为1的向量谓词寄存器。

Rt = 0x11 : Qd4 = 0-----0011111111111111111b
Rt = 0x07 : Qd4 = 0-----0000000000001111111b

该操作与元素大小无关,如果操作不跨越整个向量寄存器宽度,则通常用于创建一个掩码来谓词。

在这里插入图片描述
Class: COPROC_VX (slots 0,1,2,3)

注意:
■ 此指令使用HVX排列资源。
Intrinsics

Qd4=vsetq(Rt) HVX_VectorPred Q6_Q_vsetq_R(Word32 Rt)
Qd4=vsetq2(Rt) HVX_VectorPred Q6_Q_vsetq2_R(Word32 Rt)

Encoding

在这里插入图片描述
向量车道内查找表

vlut指令实现了快速矢量化的查找表。查找表包含在Vv寄存器中,而索引包含在Vu中。表元素可以是8位或16位。聚合特性用于在64B模式下实现大于64字节的表,在128B模式下实现大于128字节的表。这个解释讨论了64B和128B的操作模式。在64和128B模式下,字节查找的最大查找表容量为32字节(vlut32),h字节查找为16个半字(vlut16)

8位元素

在64B模式的情况下,具有8位元素的表使用vlut32指令支持32个条目查找表。通过使用相应输出字节的输入字节的下五位,有条件地选择所需的条目。控制输入寄存器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、0Rt=0、1、2、3的字节顺序相同:128-255Rt=4、5、6、7

如果数据以这种方式存储,那么使用64或128B模式访问它会得到相同的结果。在128B模式的情况下,Rt中的第1位选择是否使用奇数或偶数填充表,而第0位选择该高或低表的低32个元素的高。

Vd.b = vlut32(Vu.b, Vv.b, Rt) and Vx.b |= vlut32(Vu.b, Vv.b, Rt)

在这里插入图片描述
在这里插入图片描述
16位元素

对于带有16位元素的表,基本单元是在64B模式和128B模式下的16条目查找表。由vlut16指令支持。偶数字节条目有条件地选择使用偶数目标寄存器的下四位为偶数目标寄存器Vdd0,奇数字节条目选择表项进入奇数向量目标寄存器Vdd1。控制输入寄存器Rt以与字节表情况相同的方式包含匹配和选择位。在64B模式的情况下,Rt的下四位必须与输入字节的上四位匹配,以便将表条目分别写入或使用Vdd或Vxx中的目标向量寄存器字节。Rt的第0位选择Vv中的偶数或奇数16个条目。在128B的情况下,只有输入字节的上4位也必须与Rt的下4位相匹配。Rt中的一个位选择奇数或偶数单字,第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个单字块,Rt的LSB用于在Vv中选择偶数或奇数16个单字表。

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相同的字节64-255 Rt=4、5、6、7、7、8、9、10、11、12、12、13、14、15

在128B模式的情况下,数据必须打乱32个字块。Rt中的一个位用于在Vv中的偶数或奇数32个单字之间进行选择。位0访问奇数或偶数集的高或低16个半字。

63、31、62、30,…36、4、35、3、3、34、2、33、1、32,0=0,1Rt=2,3相同顺序字节128-255=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

Intrinsics

Vd.b=vlut32(Vu.b,Vv.b,#u3) HVX_Vector Q6_Vb_vlut32_VbVbI(HVX_Vector Vu, HVX_Vector Vv, Word32 Iu3)
Vd.b=vlut32(Vu.b,Vv.b,Rt) HVX_Vector Q6_Vb_vlut32_VbVbR(HVX_Vector Vu, HVX_Vector Vv, Word32 Rt)
Vd.b=vlut32(Vu.b,Vv.b,Rt):nomat ch HVX_Vector Q6_Vb_vlut32_VbVbR_nomatch(HVX_Vector Vu, HVX_Vector Vv, Word32 Rt)

Encoding

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38498942/article/details/129851573