NEON内在的,编译错误"参数必须是常数"使用vshr_n_u32时

时间:2016-07-06 08:27:30

标签: c arm simd neon

我遇到编译错误"参数必须是常量"使用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 个答案:

答案 0 :(得分:3)

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