NEON中的vshr vshl vext中的位移参数必须为编译时字面常量

NEON中的vshr指令中位移数量参数必须为compile time literal constant,因为该参数是被encoded as part pf ARM instruction itself. 同时像vshl; vext指令也是一样。对于某些运行时时的位移参数变化不多的情况,可以考虑使用switch语句来达到目标。
注意,必须是compiile time literal constant,而不是使用个const关键字就可以了。比如下面两种情况:

void func(int arg)
{
    const int value = 2;
    const int value2 = arg & 0x3;
    uint16x8_t q0 = {1,2,3,4,5,6,7,8};
    uint16x8_t q1 = {1,2,3,4,5,6,7,8};
    uint16x8_t veq0 = vextq_u16(q0, q1, value);		//ok
    uint16x8_t veq1 = vextq_u16(q0, q1, value2);	//error: argument to '__builtin_neon_vext_v' must be a constant integer
}	

https://stackoverflow.com/questions/38219436/neon-intrinsic-compile-error-argument-must-be-a-constant-when-using-vshr-n-u3

posted @ 2020-03-17 14:50  willhua  阅读(894)  评论(0编辑  收藏  举报