0
我將一些SSE代碼移動到Neon,Im無法找到與_mm_movelh_ps等價的任何內容。我谷歌相當多找不到任何東西...我錯過了什麼?是否有任何霓虹燈功能可以做同樣的事情,否則我將不得不在CPU上執行它(不理想)。SSE到霓虹燈(_mm_movelh_ps)
在此先感謝!
我將一些SSE代碼移動到Neon,Im無法找到與_mm_movelh_ps等價的任何內容。我谷歌相當多找不到任何東西...我錯過了什麼?是否有任何霓虹燈功能可以做同樣的事情,否則我將不得不在CPU上執行它(不理想)。SSE到霓虹燈(_mm_movelh_ps)
在此先感謝!
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
你打我吧。在發佈之前,我正在啓動我的Raspberry Pi進行驗證! :) – Vallentin
@Vallentin:這就是爲什麼我總是在運行;-) – EOF
這是一個非常古老的編譯器,你已經到了那裏。你有沒有辦法升級?你建立在哪個主機上?也許我可以找到你的鏈接。我不能放棄發佈鏈接到更好編譯器的機會。 – sh1