NEON是否支持使用标量组件对矢量数据类型进行别名处理?
例如(英特尔SSE)
typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
以上将允许我这样做:
__m128i* somePtr;
somePtr++;//advance to the next block
别名英特尔它将允许我的指针前进到我想要处理的下一个块 无需管理额外的计数和索引。
答案 0 :(得分:2)
__may_alias__
上的__m128i
属性应被视为一种解决方法,即使英特尔完全搞砸了,也可以编写严格别名正确的代码一些SEE加载/存储内在函数的签名。 (8字节加载_mm_loadl_epi64(const __m128i*)
是最热闹的例子,但还有其他一些)。 ARM的内在函数是正确的,因此不需要__may_alias__
。
只需使用指向元素类型的指针,并使用显式加载和存储。根据我的经验,可以生成更好的代码,并且可能也更具可移植性。 (ARM C语言规范是否允许指向NEON类型?如果不这样做,我不会感到惊讶。)
答案 1 :(得分:1)
NEON内在函数实现不支持使用标量组件对矢量数据类型进行别名处理。
答案 2 :(得分:0)
当您指定-mfpu_neon时,GCC支持一堆内在函数。我猜测,你感兴趣的其中一个是int32x4_t。有关所有可用类型的更多信息,请访问ARM site。