2017-03-07 97 views
0

我將一些SSE代碼移動到Neon,Im無法找到與_mm_movelh_ps等價的任何內容。我谷歌相當多找不到任何東西...我錯過了什麼?是否有任何霓虹燈功能可以做同樣的事情,否則我將不得不在CPU上執行它(不理想)。SSE到霓虹燈(_mm_movelh_ps)

在此先感謝!

回答

5

SSE具有128位向量寄存器("xmmN")。 _mm_movelh_ps()從矢量寄存器的低64位傳輸到矢量寄存器的高64位。

ARM32 NEON具有64位向量寄存器("dN")。兩個連續的向量寄存器,其中第一個具有偶數,可以組合成一個128位向量寄存器("qN")。

要在ARM32 NEON中獲得_mm_movelh_ps的功能,可以使用普通的64位向量移動。

#include <immintrin.h> 
__m128 foo(__m128 a, __m128 b) 
{ 
    return _mm_movelh_ps(a, b); 
} 

等同於以下gcc的矢量內在

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}); 
} 

兩個編譯相同的代碼在我的gcc 4.8.4:

movlhps %xmm1, %xmm0 
ret 

不幸的是,ARM32 GCC 4.9.2 NEON生產可笑這個不好的代碼:

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 

所以你可能需要使用霓虹燈內部函數:

#include <arm_neon.h> 

float32x4_t foo(float32x4_t a, float32x4_t b) 
{ 
    return vcombine_f32(vget_low_f32(a), vget_low_f32(b)); 
} 

其編譯成預期的簡單移動指令:

vmov d1, d2 @ v2sf 
    bx  lr 
+0

你打我吧。在發佈之前,我正在啓動我的Raspberry Pi進行驗證! :) – Vallentin

+0

@Vallentin:這就是爲什麼我總是在運行;-) – EOF

+0

這是一個非常古老的編譯器,你已經到了那裏。你有沒有辦法升級?你建立在哪個主機上?也許我可以找到你的鏈接。我不能放棄發佈鏈接到更好編譯器的機會。 – sh1