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

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


Predicate to vector transfer

在向量谓词寄存器的控制下,将标量寄存器Rt的字节元素复制到目标向量寄存器Vd中。目的地也可以与结果进行排序,而不是直接写。如果设置了Qu的对应位i,则将字节[i%4]的内容写入或写入Vd或Vx。

如果Rt包含0x01010101,那么Qt可以有效地扩展到Vd或Vx,每字节1位。

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

注意:
■此指令使用了一个HVX乘法资源。

Intrinsics

Vd=vand(!Qu4,Rt) HVX_Vector Q6_V_vand_QnR(HVX_VectorPred Qu, Word32 Rt)
Vd=vand(Qu4,Rt) HVX_Vector Q6_V_vand_QR(HVX_VectorPred Qu, Word32 Rt)
Vx =vand(!Qu4,Rt)
Vx =vand(Qu4,Rt)

Encoding

在这里插入图片描述

在这里插入图片描述

差值绝对值

返回向量寄存器Vu和Vv中对应元素之间的差值的绝对值,并将结果放在Vd中。支持无符号字节、有符号和无符号半字,以及有符号字。

在这里插入图片描述

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

注意:
■此指令使用了一个HVX乘法资源。

Intrinsics

Vd.ub=vabsdiff(Vu.ub,Vv.ub) HVX_Vector Q6_Vub_vabsdiff_VubVub(HVX_Vector Vu, HVX_Vector Vv)
Vd.uh=vabsdiff(Vu.h,Vv.h) HVX_Vector Q6_Vuh_vabsdiff_VhVh(HVX_Vector Vu, HVX_Vector Vv)
Vd.uh=vabsdiff(Vu.uh,Vv.uh) HVX_Vector Q6_Vuh_vabsdiff_VuhVuh(HVX_Vector Vu, HVX_Vector Vv)
Vd.uw=vabsdiff(Vu.w,Vv.w) HVX_Vector Q6_Vuw_vabsdiff_VwVw(HVX_Vector Vu, HVX_Vector Vv)

Encoding

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

插入元素

在Rt中的一个32位元素插入到目标向量寄存器Vx中。

Syntax Behavior
Vx.w=vinsert(Rt) Vx.uw[0] = Rt;

Class: COPROC_VX (slots 2,3)

**注意:**■此指令使用了一个HVX乘法资源。

Intrinsics

Syntax Behavior
Vx.w=vinsert(Rt) HVX_Vector Q6_Vw_vinsert_VwR(HVX_Vector Vx, Word32 Rt)

Encoding

在这里插入图片描述

5.10 hvx/永久资源

HVX/置换资源指令子类包括使用
HVX排列资源的指令。

字节对齐

从向量寄存器Vu和Vv中选择与向量寄存器大小相同的连续字节组。起始位置由Rt的下限(调制矢量长度)或3位直接值提供。

该操作有两种形式,第一种,验证操作,直接使用Rt或直接输入来指定块的开始。第二个,vlalign,使用输入值的向量长度减去输入值的倒数。

该操作可用于实现一个非对齐的矢量加载,使用两个对齐的加载(在指针的上方和下方)和一个验证,其中指针被用作控制输入。

在这里插入图片描述
通过Rt的下限指定的字节数,对向量寄存器Vu执行右旋转向量操作。结果被写入到Vd中。字节[i]移动到字节[(i+N-R)%N],其中R是以字节为单位的右旋转量,N是以字节为单位的矢量寄存器大小。

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

Notes

  • 此指令使用HVX排列资源。
  • 输入标量寄存器Rt限制限于寄存器0到7

Intrinsics

Vd=valign(Vu,Vv,#u3) HVX_Vector Q6_V_valign_VVI(HVX_Vector Vu, HVX_Vector Vv, Word32 Iu3)
Vd=valign(Vu,Vv,Rt) HVX_Vector Q6_V_valign_VVR(HVX_Vector Vu, HVX_Vector Vv, Word32 Rt)
Vd=vlalign(Vu,Vv,#u3) HVX_Vector Q6_V_vlalign_VVI(HVX_Vector Vu, HVX_Vector Vv, Word32 Iu3)
Vd=vlalign(Vu,Vv,Rt) HVX_Vector Q6_V_vlalign_VVR(HVX_Vector Vu, HVX_Vector Vv, Word32 Rt)
Vd=vror(Vu,Rt) HVX_Vector Q6_V_vror_VR(HVX_Vector Vu, Word32 Rt)

Encoding

在这里插入图片描述

常规权限网络

对64个输入字节进行排列和重排,这是一个数据片的宽度。输入数据通过一个由交换机箱组成的网络来传递。这些开关箱能够接受两个输入,并基于这两个控件,可以通过、交换、复制第一个输入,或复制第二个输入。虽然功能很强大,但计算控件的算法是复杂的

字节的输入向量通过六个级别的开关,在最后一个阶段的步幅从1到32。下图显示了vrdelta网络,vdelta网络是镜像,最大步幅先走,步幅小到1。每个阶段的输出都由矢量寄存器Vv中的控制输入来控制。对于每个阶段(例如,第三阶段),位于该位置的位将查看控制字节中的相应的位(第三位)。这一点如图中的开关箱所示。

数据重排主要有两种形式。一个使用一个简单的反向蝴蝶网络显示为vrdelta,和一个蝴蝶网络vdelta显示如下。这些被称为阻塞网络,因为不是所有可能的路径都可以同时从输入到输出。数据不一定是一个排列,定义为每个输入到其自己的输出位置的一对一映射。可以容纳数据重排的一个子集,如数据复制。它可以处理一系列具有对称特性的模式。

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

上面的图中显示了一个有效的模式,使用了一个八元vrdelta网络:0、2、4、6、7、5、3、1。

然而,期望的模式0、2、4、6、1、3、5、7是不可能的,因为这过度使用了网格中的可用路径。特定输入的输出位置通过使用目标位置D产生的位序列来确定。通过格的路径的位向量是该目标位序列的函数。在示例D = 7、S = 1中,位置1中的元件将被移动到位置7。位置1处的第一开关箱控制位为0,位置3处的下一个控制位为1,最后位置7处的位为1,产生序列0、1、1。此外,元素6被移动到位置3,具有控制向量1、0、1。位必须放置在控制字节中的适当位置,以引导输入到所需的位置。每个输入都可以放到任何输出中,但某些组合与资源发生冲突,因此不可能重新排列。单个vr增量或vr增量切片总共需要512个控制位。

一个允许的arrangement:0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,5 2,54,56,58,60,62,63,61,59,57,55,53,51,49,47,45,43,41,39,37,35,33,31,29,27,25,23,21,19,17、15、13、11、9、7、5、3、1的例子

controls = {0x00,0x02,0x05,0x07,0x0A,0x08,0x0F,0x0D,0x14,0x16,0x11,0x13,0x1E,0x1C,0x1B,0 x19,0x28,0x2A,0x2D,0x2F,0x22,0x20,0x27,0x25,0x3C,0x3E,0x39,0x3B,0x36,0x34,0x3 3,0x31,0x10,0x12,0x15,0x17,0x1A,0x18,0x1F,0x1D,0x04,0x06,0x01,0x03,0x0E,0x0C,0 x0B,0x09,0x38,0x3A,0x3D,0x3F,0x32,0x30,0x37,0x35,0x2C,0x2E,0x29,0x2B,0x26,0x2 4,0x23,0x21}

类似地,这里有一个复制每4个元素的函数: 0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12,16,16,16,16,20,20,20,20,24,24,24,24,28,28,28,28,32,3 2,32,32,36,36,36,36,40,40,40,40,44,44,44,44,48,48,48,48,52,52,52,52,56,56,56,56,60,60,60,60

Valid controls =
{0x00,0x01,0x02,0x03,0x00,0x01,0x02,0x03,0x00,0x01,0x02,0x03,0x00,0x01,0x02,0x0
3,0x00,0x01,0x02,0x03,0x00,0x01,0x02,0x03,0x00,0x01,0x02,0x03,0x00,0x01,0x02,0x0
3,0x00,0x01,0x02,0x03,0x00,0x01,0x02,0x03,0x00,0x01,0x02,0x03,0x00,0x01,0x02,0x0
3,0x00,0x01,0x02,0x03,0x00,0x01,0x02,0x03,0x00,0x01,0x02,0x03,0x00,0x01,0x02,0x0
3}

另一种一般的排列形式是贝内斯网络,它需要一个vrdelta,紧接着是一个vdelta操作。这种形式是非阻塞的:任何可能的排列,无论它是随机的,都可以容纳,尽管它必须是一个排列,但每个输入必须在输出中有一个位置。复制可以通过使用前或后条件反射vrdelta传递来执行排列之前或之后的复制。

大于一个字节的元素大小可以通过将字节分组在一起并将它们移动到输出中的一个组来实现。一般排列的一个例子是以下随机混合,其中64个输入被放置在以下输出位置:33、42、40、61、28、6,17,16,12,38,57,21,58,63,37,13,26,51,50,23,46,5、52、53、0、25、39、7,10,19,18,56,44,41,11,14,43,45,3,35,32,60,15,55,22,24,48,9、4、31、27、8、2,62,30,34,54,20,49,59,29,47,36

vrdelta controls ={0x00, 0x00, 0x21, 0x21, 0x20, 0x02, 0x00, 0x02, 0x20, 0x22, 0x00,
0x06, 0x23, 0x23, 0x02, 0x26, 0x06, 0x04, 0x2A, 0x0C, 0x2D, 0x2F, 0x20, 0x2E, 0x04,
0x00, 0x09, 0x29, 0x0C, 0x0A, 0x20, 0x0A, 0x05, 0x0F, 0x29, 0x2B, 0x2C, 0x0E, 0x11,
0x13, 0x31, 0x2F, 0x08, 0x0A, 0x2A, 0x3E, 0x02, 0x32, 0x0B, 0x07, 0x26, 0x0E, 0x2A,
0x2E, 0x36, 0x36, 0x1D, 0x07, 0x01, 0x2B, 0x0C, 0x1E, 0x21, 0x13}

vdelta controls={ 0x1D, 0x01, 0x00, 0x00, 0x1D, 0x1B, 0x00, 0x1A, 0x1E, 0x02, 0x13,
0x03, 0x0C, 0x18, 0x10, 0x08, 0x1A, 0x06, 0x07, 0x03, 0x11, 0x1D, 0x0D, 0x11, 0x19,
0x03, 0x15, 0x03, 0x03, 0x19, 0x1F, 0x01, 0x1B, 0x1B, 0x06, 0x12, 0x18, 0x00, 0x1D,
0x09, 0x1A, 0x0E, 0x02, 0x02, 0x0B, 0x05, 0x0A, 0x18, 0x1D, 0x1F, 0x01, 0x17, 0x14,
0x06, 0x19, 0x0F, 0x1D, 0x0D, 0x05, 0x01, 0x06, 0x06, 0x0F, 0x1B}

使用这些应用程序可以查找基本类型网络的vdeltea/vrdelte控件,或仅查找简单增量网络的vrdelta控件。

对于贝边控制,必须使用所有输出。Delta网络X是一个不小心的输出,并且允许进行复制。

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

注意:

  • 此指令使用HVX排列资源

Intrinsics

Vd=vdelta(Vu,Vv) HVX_Vector Q6_V_vdelta_VV(HVX_Vector Vu, HVX_Vector Vv)
Vd=vrdelta(Vu,Vv) HVX_Vector Q6_V_vrdelta_VV(HVX_Vector Vu, HVX_Vector Vv)

Encoding

在这里插入图片描述

猜你喜欢

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