Hax*_*raZ 4 c++ simd intrinsics neon arm64
vaddhn_high_s16arm64有内在的。
此内在函数的官方 ARM 文档在此处。但是,给出的描述和伪代码都让我感到困惑。
任何人都可以使用实用的 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;
}
Run Code Online (Sandbox Code Playgroud)
addhn2ARMv8 架构参考手册中底层指令的文档有助于澄清事情。对于有关内在函数的问题,这通常是一个很好的资源。
当然,主要目的是将 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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |