【问题标题】:Convert specific SSE intrinsics to NEON intrinsics将特定的 SSE 内在函数转换为 NEON 内在函数
【发布时间】:2013-10-25 03:41:15
【问题描述】:
> [EDIT: (edited to highlight the question in context)

以下是 SSE 内在函数,我需要 NEON 内在函数,因为我正在将一些 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 个 signedunsigned 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

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

【问题讨论】:

    标签: c++ ios sse neon


    【解决方案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

    【讨论】:

    • 嗨,你能解释一下 vmov.i32 吗?我真的在网上找不到任何有意义的文档?
    猜你喜欢
    • 2012-07-02
    • 2015-12-08
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2011-11-01
    • 1970-01-01
    相关资源
    最近更新 更多