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