使用 vshr_n_u32 时,NEON 内在,编译错误“参数必须是常量”

Posted

技术标签:

【中文标题】使用 vshr_n_u32 时,NEON 内在,编译错误“参数必须是常量”【英文标题】:NEON intrinsic, compile error "argument must be a constant" when using vshr_n_u32 【发布时间】:2016-07-06 08:27:29 【问题描述】:

使用 NEON 内在 vshr_n_u32 时出现编译错误“参数必须是常量”。函数原型为:

__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
vshr_n_u32 (uint32x2_t __a, const int __b)

  return (uint32x2_t)__builtin_neon_vshr_nv2si ((int32x2_t) __a, __b, 0);

这是我的功能:

uint32x2_t shift_func(int index)

    int shift_bit[] = 2, 4, 5, 6, 7, 8, 9, 10;
    int n_val = shift_bit[index];

    uint32x2_t src_reg = 16, 32;
    return vshr_n_u32(src_reg, n_val);

n_val 的值只能在运行时知道。但是根据编译错误,似乎n_val 的值应该在编译时就知道了。虽然__b的类型是const int,但我觉得输入一个int变量应该是对的。

如何消除编译错误?或者如何在这个函数中使用vshr_n_u32

【问题讨论】:

【参考方案1】:

vshr_n_u32 中的移位必须是编译时文字常量,因为移位值被编码为 ARM 指令本身的一部分。由于您只有几个可能的移位值,因此您可能希望使用switch 语句来处理每种情况。或者您可以只使用带有负移位的vshl_u32(您传递第二个包含移位值的int32x2_t 参数)。

【讨论】:

以上是关于使用 vshr_n_u32 时,NEON 内在,编译错误“参数必须是常量”的主要内容,如果未能解决你的问题,请参考以下文章

使用NEON内在函数除以浮点数

vreinterpret NEON 内在问题

如何使用 ARM NEON 内在函数将 u8 掩码转换为 u32 掩码?

使用内在函数测试 128 位 NEON 寄存器的值为 0 的最快方法?

用于 C++/SSE 代码的高效 NEON 内在函数

使用 ARM neon 内部函数进行深度转换