2016-04-05 18 views
1

msvc derleyicide aşağıdaki işlemleri verimli bir şekilde nasıl uygularım?msvc derleyici neon kayıtta 4 tamsayı değerleri nasıl yüklenir?

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

Performansı optimize etmek için çalışırken, neon kaydında 4 farklı değer yüklemem gerekiyor. Yukarıdaki ifadeler, android clang için çalışır ancak uint32x4_t __n128 için typedef'ed olduğu için msvc derleyicide başarısız olur. aşağıdaki gibi

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 bitlik bir sabit tanımlamak, onu açıkça yüklemekten daha hızlı bir şekilde NEON yazmaçlarına almayacaktır (temp = vld1q_u32 (...)). – BitBank

cevap

0

C99, bir başlatıcı listesi ile birlik başlatırken, sen başlatılır belirli üyelerini belirtebilirsiniz:

ardından __n128 yapısıdır

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

Ancak, bu C99 sözdizimi yalnızca Visual Studio 2013 ve daha ileri sürümlerde desteklenir. Visual Studio 2012 ve aşağısı bu özelliği desteklemez ve bu nedenle, yalnızca bir ilk başlatmaya (n128_u64) dayalı bir statik başlatıcı ile bir başlatmayı başlatabilirsiniz. Uint32 verilerinize uint64'e uyan bir başlatıcı ile gelebilirsiniz. Sabit olduklarından, herhangi bir ek yürütme süresi almayacaktır. gerçekten çirkin görünüyor: Bu kod derleyici arasındaki taşınabilir olması gerekiyor

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

Eğer daha iyi bir seçenek sabitler biçimlendirme işleyen bir önişlemci makro oluşturmak olacaktır.