2017-03-07 9 views
0

ImはいくつかのSSEコードをNeonに移動し、Imは_mm_movelh_psに相当するものを見つけることができません。私はかなり何かを見つけることができないGoogle ...私は何かが欠けている?同じことをするネオン関数があるか、それともCPU上で実装する必要があります(理想的ではありません)。SSE to Neon(_mm_movelh_ps)

ありがとうございます!

答えて

5

SSEには128ビットのベクトルレジスタ("xmmN")があります。 _mm_movelh_ps()は、ベクタ・レジスタの下位64ビットからベクタ・レジスタの上位64ビットに転送されます。

ARM32 NEONには、64ビットのベクトルレジスタ("dN")があります。 2つの連続したベクトルレジスタ(最初は偶数)は、128ビットのベクトルレジスタ("qN")に結合することができます。

ARM32 NEONで_mm_movelh_psの機能を使用するには、通常の64ビットベータ移動を使用できます。

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

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ベクトル組み込み関数と同等の両方私の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 

だから、おそらくNEON-組み込み関数を使用する必要があります:

#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

。私は掲示する前に確認するために自分のラズベリーパイを起動していた! :) – Vallentin

+0

@Vallentin:だからこそ私はいつも走っています;-) – EOF

+0

これはあなたが持っている非常に古いコンパイラです。アップグレードする方法はありませんか?あなたはどんなホストを構築していますか?たぶん私はあなたにリンクを見つけることができます。より良いコンパイラへのリンクを投稿する機会を逃すことはできません。 – sh1