2016-05-10 1 views
1

私は必要なNEONの組み込み関数を見つけることができません。私はint64x2_tとして128ビットの値を持っています、そして、私は低い64ビットを高い64ビットにコピーする必要があります。私はまた、高64ビットを時折低64ビットにコピーする必要があります。int64x2_tベクトルを使用して64ビットから64ビットにローレベルをコピーしますか?

NEONはlane dupですが、int64x1_tを返し、int64x1_tを返します。

int64x1_t vdup_lane_s64(int64x1_t vec, __constrange(0,0) int lane); 

私は1または2を選択することができるはずのように、(たぶんこれは私の一部に誤解である)ようですので、範囲もオフに思えます。

int64x2_tの下位64ビットを上位64ビットにコピーするにはどうすればよいですか?


私は(high >> x) | (low << x)パターンを以下のように使用していません。まず、そのundefined behavior in C/C++ when x is 0。第二に、値がNEON SIMDレジスタになければならないので、私は誤ってそれを往復させたくありません。第三に、GCC is not generating the code I hoped forだから、私はGCCにもっと遅くなる機会を与えたくありません。

+1

どのような標準タイプを使用していますか? 32ビット整数の上位16ビットをスワップしたいとします。どのようにしますか?どのようなビット操作を使用しますか? 'int64x2_t'と' int64x1_t'にも同様の組み込み関数がありますか? –

+0

'int64x2_t vdupq_n_s64(int64_t値); // VMOV d0、r0、r0' – user3528438

+0

@JoachimPileborg - 'int64x2_t'(事実上のポインタ)と' vdup_lane_s64'のような関数を使ったCでのビットを使って、コンパイラエラーを押しつぶすためにキャストを実行します。その安全がここでできるかどうかは私には分かりません。それゆえ、私は物事を行う "ネオン"の方法を探しています。 – jww

答えて

1

少なくとも2つの方法で書くことができます。

int64x2_t f(int64x1_t v) 
{ 
    return vdupq_lane_s64(v, 0); 
    // or 
    // return vcombine_s64(v, v); // poor code with GCC 
} 

vdupq_laneの入力は64ビットのベクトルですが、結果は128ビットのベクトルです。

+0

*** "GCCのコードが悪い..." *** - 正確に! ClangはNEON組み込み関数ではるかに優れた仕事をします。 – jww

+0

これを簡単に再現し、コード生成が貧弱なような簡単な例があれば、GCCに対するバグ報告が参考になります。 –

関連する問題