`vaddhn_high_s16` 实际上是做什么的?

3

arm64有vaddhn_high_s16内置函数。

官方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;
}
1个回答

4

在 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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接