1

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

   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)
4

1 回答 1

0

对于任何偶然发现这个问题的人(就像我所做的那样)并想知道如何int64x2_t使用 C++ 内在函数为霓虹灯寄存器实现 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 想要的额外添加相结合。

于 2021-06-27T12:11:06.197 回答