如何解决`vaddhn_high_s16` 实际上有什么作用?
arm64 有 vaddhn_high_s16
内在函数。
此内在函数的官方 ARM 文档是 here。但是,给出的描述和伪代码都让我感到困惑。
谁能使用实用的 C/C++ 代码来解释 vaddhn_high_s16
的作用?
例如,假设所有数据类型都已定义,并且 vmulq_f32
内在可以用这个实现来解释:
float32x4_t vmulq_f32(float32x4_t a,float32x4_t b)
{
float32x4_t r;
for (int i=0; i<4; i++)
{
r[i] = a[i] * b[i];
}
return r;
}
解决方法
ARMv8 架构参考手册中底层 addhn2
指令的文档有助于澄清问题。对于有关内在函数的问题,这通常是一个很好的资源。
当然,主要目的是将 16 位值相加并仅保留每个结果的高 8 位。 addhn2
形式将结果写入 SIMD 寄存器的高 8 字节,低 8 字节保持不变。由于 C 是按值传递并且“就地修改”在 C 函数中不容易表示,因此内部函数将所需的低字节作为参数传递,然后传递到返回值的低字节;返回值的高字节包含加法的结果。
所以你可以表达为:
int8x16_t vaddhn_high_s16(int8x8_t r,int16x8_t a,int16x8_t b) {
int8x16_t ret;
for (int i = 0; i < 8; i++)
ret[i] = r[i];
for (int i = 0; i < 8; i++)
ret[i+8] = (int8_t)((a[i] + b[i]) >> 8);
return ret;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。