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

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

Multiply (32x16)
将一个向量中的单词乘以另一个向量中的偶数或奇数半字。拿上半部分。此操作的某些版本执行特定移位以促进 32x32 乘法合成。

一个重要的运算是 32 x 32 的小数乘法,相当于 (OP1 * OP2)>>31。 fn(0x80000000, 0x80000000) 的情况必须饱和到 0x7fffffff。

舍入小数乘法:

vectorize( sat32(x * y + 0x40000000)>>31) ) equivalent to: { V2 = 
vmpye(V0.w, V1.uh) } { V2+= vmpyo(V0.w, V1.h):<<1:rnd:sat:shift }

和非舍入小数乘法版本:

vectorize( sat32(x * y)>>31) ) equivalent to: { V2 = vmpye(V0.w, 
V1.uh) } { V2+= vmpyo(V0.w, V1.h):<<1:sat:shift }z

还有一个关键函数是 32 位 x 32 位带符号乘法,其中保留 64 位结果。

vectorize( (int64) x * (int64) y ) equivalent to: { V3:2 = 
vmpye(V0.w, V1.uh) } { V3:2+= vmpyo(V0.w, V1.h) }

产品的低 32 位在 V2 中,高 32 位在 V3 中。如果仅执行 vmpye,则结果是 32 位有符号 x 16 位无符号的 48 位乘积,置为 Vdd 的高 48 位。如果只执行 vmpyo,假设 Vxx = #0,结果是一个 32 signed x 16 signed product asserted into the upper 48 bits of Vxx.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Multiply bytes with four-wide reduction - vector by scalar
在向量 Vu 中的元素与标量寄存器 Rt 中的相应元素之间执行乘法,然后在每个 32 位通道中进行四路归约为一个字。将结果累加到 Vx 或 Vxx 中。

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

该操作有两种形式:第一种是将四个元素进行简单的点积,得到一个结果。第二种形式采用一位立即数输入并生成向量寄存器对。对于#1 = 0,偶数目的地包含一个简单的点积,奇数目的地包含由两个元素和取自 Vuu 的偶数寄存器的上部两个数据元素旋转的系数的点积。对于#u = 1,偶数目的地从 Vuu 的奇数寄存器中获取旋转了 -1 的系数和数据元素 0。奇数目的地使用旋转-1 的系数,并从 Vuu 的偶数寄存器中获取数据元素三。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Multiply by byte with accumulate and four-wide reduction - vector by vector
vrmpy 在向量寄存器 Vu 中的四个字节元素和 Vv 中的四个字节元素之间执行点积函数。乘积之和可以选择性地累加到 Vx 中或作为每个 32 位通道中的字写入 Vd。

数据类型可以是无符号无符号、有符号有符号或无符号有符号。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Multiply with three-wide reduction
执行一个三元素滑动窗口模式运算,该运算由带有附加累加的两个乘法组成。数据元素存储在向量寄存器对 Vuu 中,系数存储在标量寄存器 Rt 中。
Vdd.h[+]=vtmpy(Vuu.b,Rt.b)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

绝对差半字的减少和
从向量寄存器源 Vuu 中取出一组 2 个无符号半字,从标量寄存器 Rt 中减去半字,并将绝对值作为无符号结果。这些被加在一起并可选择地添加到目标寄存器 Vxx,或直接写入 Vdd。偶数目标寄存器包含来自 Vuu[0] 和 Rt 的数据,Vdd[1] 包含来自 Vuu[0] 的一半数据和来自 Vuu[1] 的一半数据的绝对差值。

该操作用于实现滑动窗口。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Sum of absolute differences byte

从向量寄存器源 Vuu 中取出四个字节为一组,减去标量寄存器 Rt 中的字节,取绝对值作为无符号结果。这些被加在一起并可选择地添加到目标寄存器 Vxx,或直接写入 Vdd。如果#u1 为 0,则偶数目标寄存器包含来自 Vuu[0] 和 Rt 的数据,Vdd[1] 包含来自 Vuu[0] 的一半数据和来自 Vuu[1] 的一半数据的绝对差值。如果#u1 为 1,Vdd[0] 从 Vuu[1] 中获取 btye 0,从 Vuu[0] 中获取字节 1、2、3,而 Vdd[1] 从 Vuu[0] 中获取字节 3,其余从 Vuu[ 1].

该操作用于实现 Vuu 和 Rt 中数据之间的滑动窗口。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

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