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

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


5.9 HVX/MPY-RESOURCE

HVX/MPY-资源指令子类包括使用单个HVX乘法资源的指令。

按字节相乘,并进行双向缩小

将Vu中的元素乘以标量寄存器Rt中相应的元素。产品成对添加,产生2的还原。这些产品可以选择用Vx来积累。
支持无符号字节与字节相乘,半字与有符号字节相乘。双向量版本执行滑动窗口双向约简,其中奇数寄存器输出包含偏移量计算。

在这里插入图片描述

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

Class: COPROC_VX (slots 2,3)
注意:
■ 此指令使用了一个HVX乘法资源。

Intrinsics
在这里插入图片描述
Multiply half of the elements (16x16)

将Vu的偶数元素乘以Vv的奇数元素,将结果左移16位,并将结果放在Vd的每个车道中。此指令对32x32低半分乘法很有用。

Syntax Behavior
Vd.w=vmpyieo(Vu.h,Vv.h) for (i = 0; i < VELEM(32); i++) {Vd.w[i] = (Vu.w[i].h[0]*Vv.w[i].h[1]) << 16;}

Class: COPROC_VX (slots 2,3)

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

Vd.w=vmpyieo(Vu.h,Vv.h) HVX_Vector Q6_Vw_vmpyieo_VhVh(HVX_Vector Vu, HVX_Vector Vv)

Encoding

在这里插入图片描述

整数乘以字节
将向量寄存器Vu中的词组乘以Rt中的元素。较低的32位结果被放置在向量寄存器Vd中。

该操作有一种形式:Vu中的有符号字乘以Rt中的有符号字节。

可选地使用目标向量寄存器Vx来累积产品。

在这里插入图片描述

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

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

Intrinsics

Vd.h=vmpyi(Vu.h,Rt.b) HVX_Vector Q6_Vh_vmpyi_VhRb(HVX_Vector Vu, Word32 Rt)
Vd.w=vmpyi(Vu.w,Rt.b) HVX_Vector Q6_Vw_vmpyi_VwRb(HVX_Vector Vu, Word32 Rt)
Vd.w=vmpyi(Vu.w,Rt.ub) HVX_Vector Q6_Vw_vmpyi_VwRub(HVX_Vector Vu, Word32 Rt)
Vx.h+=vmpyi(Vu.h,Rt.b) HVX_Vector Q6_Vh_vmpyiacc_VhVhRb(HVX_Vector Vx, HVX_Vector Vu, Word32 Rt)
Vx.w+=vmpyi(Vu.w,Rt.b) HVX_Vector Q6_Vw_vmpyiacc_VwVwRb(HVX_Vector Vx, HVX_Vector Vu, Word32 Rt)
Vx.w+=vmpyi(Vu.w,Rt.ub) HVX_Vector Q6_Vw_vmpyiacc_VwVwRub(HVX_Vector Vx, HVX_Vector Vu, Word32 Rt)

Encoding

在这里插入图片描述
用标量(16 x 16)

将向量中每个字的下半字与32位标量的下半字的无符号16 x 16相乘。

语法 行为
Vd.uw=vmpye(Vu.uh,Rt.uh) for (i = 0; i < VELEM(32); i++) {Vd.uw[i] = (Vu.uw[i].uh[0] * Rt.uh[0]);}
Vx.uw+=vmpye(Vu.uh,Rt.uh) for (i = 0; i < VELEM(32); i++) {Vx.uw[i] += (Vu.uw[i].uh[0] * Rt.uh[0]);}

Class: COPROC_VX (slots 2,3)

注意:
■ 此指令使用了一个HVX乘法资源。
■ 此指令在Napali V1中可能不工作

Intrinsics

Vd.uw=vmpye(Vu.uh,Rt.uh) HVX_Vector Q6_Vuw_vmpye_VuhRuh(HVX_Vector Vu, Word32 Rt)
Vx.uw+=vmpye(Vu.uh,Rt.uh) HVX_Vector Q6_Vuw_vmpyeacc_VuwVuhRuh(HVX_Vector Vx, HVX_Vector Vu, Word32 Rt)

在这里插入图片描述
用标量用四次缩减向量乘以字节

在向量Vu中的元素与标量寄存器Rt中的相应元素之间执行乘法,然后在每个32位车道中进行四路缩减为一个字。

支持无符号字节数据与标量中的有符号或无符号字节的乘法。

该操作有两种形式:第一种是将四个元素的简单点积执行成一个结果。第二种形式接受一位直接输入并生成一个向量寄存器对。对于#1 = 0,偶数目的地包含一个简单的点积,奇数目的地包含由两个元素旋转的系数和从Vuu的偶数寄存器中获取的上两个数据元素的点积。对于#u = 1,偶数目的地从Vuu的奇数寄存器中取由-1旋转的系数和数据元素0。奇数目的地使用由-1旋转的系数,并从Vuu的偶数寄存器中获取数据元素3。

在这里插入图片描述

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

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

Intrinsics

Vd.uw=vrmpy(Vu.ub,Rt.ub) HVX_Vector Q6_Vuw_vrmpy_VubRub(HVX_Vector Vu, Word32 Rt)
Vd.w=vrmpy(Vu.ub,Rt.b) HVX_Vector Q6_Vw_vrmpy_VubRb(HVX_Vector Vu, Word32 Rt)
Vx.uw+=vrmpy(Vu.ub,Rt.ub) HVX_Vector Q6_Vuw_vrmpyacc_VuwVubRub(HVX_Vector Vx, HVX_Vector Vu, Word32 Rt)
Vx.w+=vrmpy(Vu.ub,Rt.b) HVX_Vector Q6_Vw_vrmpyacc_VwVubRb(HVX_Vector Vx, HVX_Vector Vu, Word32 Rt)

在这里插入图片描述

用字节乘以四宽缩减向量乘以向量

vrmpy在向量寄存器Vu中的四字节元素和Vv中的四字节元素之间执行点积函数。产品的总和以每个32位车道内的单词的形式写入Vd。

数据类型可以是无签名、无签名或无签名签名。

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

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

Intrinsics

Vd.uw=vrmpy(Vu.ub,Vv.ub) HVX_Vector Q6_Vuw_vrmpy_VubVub(HVX_Vector Vu, HVX_Vector Vv)
Vd.w=vrmpy(Vu.b,Vv.b) HVX_Vector Q6_Vw_vrmpy_VbVb(HVX_Vector Vu, HVX_Vector Vv)
Vd.w=vrmpy(Vu.ub,Vv.b) HVX_Vector Q6_Vw_vrmpy_VubVb(HVX_Vector Vu, HVX_Vector Vv)

Encoding

在这里插入图片描述
在这里插入图片描述
从标量中分离

将所有目标向量寄存器字设置为标量寄存器Rt的内容所指定的值。

在这里插入图片描述

Class: COPROC_VX (slots 2,3)

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

Intrinsics

Vd.b=vsplat(Rt) HVX_Vector Q6_Vb_vsplat_R(Word32 Rt)
Vd.h=vsplat(Rt) HVX_Vector Q6_Vh_vsplat_R(Word32 Rt)
Vd=vsplat(Rt) HVX_Vector Q6_V_vsplat_R(Word32 Rt)

在这里插入图片描述

预测转移的向量

在标量寄存器Rt和输入向量寄存器Vu的控制下,将位复制到目标向量谓词寄存器中。目的地也可以与结果进行排序,而不是直接写。如果Vu的相应字节i与Rt字节[i%4]中的任何一个位相匹配,则目标Qd将具有或设置为1或0。

如果Rt包含0x01010101,那么Qt可以有效地用Vu的lsb来填充,每字节一位。

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

注意:

  • 此指令使用了一个HVX乘法资源。

Intrinsics

Qd4=vand(Vu,Rt) HVX_VectorPred Q6_Q_vand_VR(HVX_Vector Vu, Word32 Rt)
Qx4 =vand(Vu,Rt)

Encoding

在这里插入图片描述

猜你喜欢

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