2016-04-05 11 views
1

以下の操作をmsvcコンパイラで効率的に実装するにはどうすればよいですか?msvcコンパイラのネオンレジスタに効率的に4つの整数値をロードするには?

uint32x4_t temp = { 1, 2, 3, 4 }; 

私はパフォーマンスを最適化するために働いているので、非常に効率的にネオンレジスタに4つの異なる値をロードする必要があります。上記のステートメントはandroid clangで動作しますが、uint32x4_tは__n128にtypedefされているため、msvcコンパイラでは失敗します。以下のように、

typedef union __declspec(intrin_type) _ADVSIMD_ALIGN(8) __n128 
{ 
    unsigned __int64 n128_u64[2]; 
    unsigned __int32 n128_u32[4]; 
    unsigned __int16 n128_u16[8]; 
    unsigned __int8 n128_u8[16]; 
    __int64   n128_i64[2]; 
    __int32   n128_i32[4]; 
    __int16   n128_i16[8]; 
    __int8    n128_i8[16]; 
    float    n128_f32[4]; 

    struct 
    { 
     __n64 low64; 
     __n64 high64; 
    } DUMMYNEONSTRUCT; 

} __n128; 
+0

128ビット定数を定義すると、明示的にロードするよりも速くNEONレジスタにロードされません(temp = vld1q_u32(...))。 – BitBank

答えて

0

C99では、初期化子リストで労働組合を初期化するとき、あなたが初期化され、特定のメンバーを指定することができます:

には、以下の__n128の構造である

uint32x4_t temp = { .n128_u32 = {1,2,3,4} }; 

ただし、このC99構文はVisual Studio 2013以降でのみサポートされています。 Visual Studio 2012以降ではこの機能がサポートされていないため、最初のエントリ(n128_u64)に基づいてスタティックイニシャライザでのみユニオンを初期化できます。あなたはあなたのuint32データをuint64に収めるイニシャライザを考え出すことができます。それらは定数なので、追加の実行時間は必要ありません。本当に醜い:

uint32x4_t temp = { { 1 << 32 | 2, 3 << 32, 4 } }; 

このコードは、コンパイラの間で移植可能にする必要がある場合は、より良いオプションは、定数のフォーマットを扱うプリプロセッサマクロを作成することです。

関連する問題