NEON向量数据类型的别名

时间:2011-08-26 13:02:50

标签: c++ c sse simd neon

NEON是否支持使用标量组件对矢量数据类型进行别名处理?

例如(英特尔SSE)

typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));

以上将允许我这样做:

__m128i* somePtr;
somePtr++;//advance to the next block

别名英特尔它将允许我的指针前进到我想要处理的下一个块 无需管理额外的计数和索引。

3 个答案:

答案 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