`vaddhn_high_s16` 实际上做了什么?

What doest `vaddhn_high_s16` actually do?

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

A​​RMv8 体系结构参考手册中底层 addhn2 指令的文档有助于澄清问题。这通常是解决内在函数问题的好资源。

主要目的当然是将16位的值相加,只保留每个结果的高8位。 addhn2 形式将结果写入 SIMD 寄存器的高 8 字节,低 8 字节保持不变。由于 C 是按值传递的,并且“就地修改”在 C 函数中不容易表示,因此内在函数让您将所需的低字节作为参数传递,它传递到 [=19 的低字节=] 值; return 值的高字节包含加法的结果。

所以你可以表达为:

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