将特定的SSE内在函数转换为NEON内在函数

时间:2013-10-25 03:41:15

标签: c++ ios sse neon

> [EDIT: (edited to highlight the question in context)

以下是我需要NEON内在函数的SSE内在函数,因为我正在转换某些SSE代码以在iOS上运行。

  • _mm_set_ps

将四个单精度浮点值设置为四个输入。

(__m128 _mm_set_ps(float z , float y , float x , float w );)

Return Value:
r0 := w
r1 := x
r2 := y
r3 := z
  • _mm_loadu_ps

加载四个单精度浮点值。地址需要16字节对齐。

__m128 _mm_loadu_ps(float * p);

Return Value:
r0 := p[0]
r1 := p[1]
r2 := p[2]
r3 := p[3]
  • _mm_storeu_ps

存储四个单精度浮点值。地址需要16字节对齐。

void _mm_storeu_ps(float *p, __m128 a);

Return Value:
p[0] := a0
p[1] := a1
p[2] := a2
p[3] := a3
  • _mm_add_epi32

将a中的4个带符号无符号 32位整数添加到b中的4个有符号或无符号32位整数。

__m128i _mm_add_epi32 (__m128i a, __m128i b);

Return Value:
r0 := a0 + b0
r1 := a1 + b1
r2 := a2 + b2
r3 := a3 + b3

注意:尽可能避免未对齐的内存访问。所以,我需要一种方法来将未对齐访问转换为对齐访问(可能使用填充)。

1 个答案:

答案 0 :(得分:1)

我对NEON内在函数不是很熟悉,但我可以为你命名相同的NEON指令。您可以轻松找到合适的宏。

_mm_set_ps

如果值已经存在于S寄存器中,则只需将它们重新解释为D寄存器即可 否则,您可以使用vmov指令填充D寄存器: vmov.i32 d0,r0,r1

_mm_loadu_ps

vld1.32 q0,[r0]

_mm_storeu_ps

vst1.32 q0,[r0]

_mm_add_epi32

vadd.u32 q0,q1,q2