SSE到霓虹灯(_mm_movelh_ps)

McB*_*Bob 0 c sse neon

我将一些SSE代码移动到Neon,我找不到与_mm_movelh_ps相同的任何东西.我谷歌相当有点找不到任何东西......我错过了什么?有没有任何霓虹功能做同样的事情或我将不得不在CPU上实现它(不理想).

提前致谢!

EOF*_*EOF 5

SSE具有128位向量寄存器("xmmN")._mm_movelh_ps()从向量寄存器的低64位传输到向量寄存器的高64位.

ARM32 NEON具有64位向量寄存器("dN").两个连续的向量寄存器,第一个具有偶数,可以组合成128位向量寄存器("qN").

要获得_mm_movelh_psARM32 NEON 的功能,您可以使用普通的64位向量移动.

#include <immintrin.h>
__m128 foo(__m128 a, __m128 b)
{
  return _mm_movelh_ps(a, b);
}
Run Code Online (Sandbox Code Playgroud)

相当于以下gcc vector intrinsics

typedef float v4sf __attribute__((vector_size(16)));
typedef unsigned v4ui __attribute__((vector_size(16)));
v4sf bar(v4sf a, v4sf b)
{
  return __builtin_shuffle(a, b, (v4ui){0, 1, 4, 5});
}
Run Code Online (Sandbox Code Playgroud)

两者都在我的gcc 4.8.4上编译为相同的代码:

movlhps %xmm1, %xmm0
ret
Run Code Online (Sandbox Code Playgroud)

不幸的是,ARM32 NEON GCC 4.9.2生产可笑不好的代码如下:

    vldr    d16, .L2
    vldr    d17, .L2+8
    vtbl.8  d18, {d0, d1, d2, d3}, d16
    vtbl.8  d19, {d0, d1, d2, d3}, d17
    vmov    q0, q9  @ v16qi
    bx      lr
Run Code Online (Sandbox Code Playgroud)

所以你可能需要使用NEON-intrinsics:

#include <arm_neon.h>

float32x4_t foo(float32x4_t a, float32x4_t b)
{
  return vcombine_f32(vget_low_f32(a), vget_low_f32(b));
}
Run Code Online (Sandbox Code Playgroud)

编译到预期的简单移动指令:

    vmov    d1, d2  @ v2sf
    bx      lr
Run Code Online (Sandbox Code Playgroud)