C语言 在使用 ARM Neon 内部函数实现 64 位变量乘法时面临问题



我想在我的代码中使用类似的内联函数,如下所示。

int32x2_t vmla_s32 (int32x2_t a, int32x2_t b, int32x2_t c)

唯一的变化是我的数据是 64 位的,即我需要64x2_t向量。我浏览了 ARM 参考中提到的所有相关内联函数,但没有找到合适的内在函数。我应该使用浮点数据类型,然后将它们转换(强制转换(为 int64(如下所示(吗?这是我唯一的选择吗?

float64x2_t vmlaq_f64 (float64x2_t a, float64x2_t b, float64x2_t c)

对于任何偶然发现这个问题(像我一样(并想知道如何使用C++内联函数为 neon 寄存器int64x2_t实现 2 通道 64 位乘法的人,这将是指令的多填充vmulq_s64,这在 Apple M1 上不可用,那么就是这样:

inline int64x2_t arm_vmulq_s64(const int64x2_t& a, const int64x2_t& b)
{
const auto ac = vmovn_s64(a);
const auto pr = vmovn_s64(b);
const auto hi = vmulq_s32(b, vrev64q_s32(a));
return vmlal_u32(vshlq_n_s64(vpaddlq_u32(hi), 32), ac, pr);
}

要达到vmlaq_s64需要将其与我认为是OP想要的额外添加相结合。

最新更新