c++ - How can I set __m128i without using of any SSE instruction? -


i have many function use same constant __m128i values. example:

const __m128i k8 = _mm_setr_epi8(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); const __m128i k16 = _mm_setr_epi16(1, 2, 3, 4, 5, 6, 7, 8); const __m128i k32 = _mm_setr_epi32(1, 2, 3, 4); 

so want store these constants in 1 place. there problem: perform checking of existed cpu extension in run time. if cpu doesn't support example sse (or avx) program crash during constants initialization.

so possible initialize these constants without using of sse?

initialization of __m128i vector without using sse instructions possible depends on how compiler defines __m128i.

for microsoft visual studio can define next macros (it defines __m128i char[16]):

template <class t> inline char getchar(t value, size_t index) {     return ((char*)&value)[index]; }  #define as_char(a) char(a)  #define as_2chars(a) \     getchar(int16_t(a), 0), getchar(int16_t(a), 1)  #define as_4chars(a) \     getchar(int32_t(a), 0), getchar(int32_t(a), 1), \     getchar(int32_t(a), 2), getchar(int32_t(a), 3)  #define _mm_setr_epi8(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af) \     {as_char(a0), as_char(a1), as_char(a2), as_char(a3), \      as_char(a4), as_char(a5), as_char(a6), as_char(a7), \      as_char(a8), as_char(a9), as_char(aa), as_char(ab), \      as_char(ac), as_char(ad), as_char(ae), as_char(af)}  #define _mm_setr_epi16(a0, a1, a2, a3, a4, a5, a6, a7) \     {as_2chars(a0), as_2chars(a1), as_2chars(a2), as_2chars(a3), \      as_2chars(a4), as_2chars(a5), as_2chars(a6), as_2chars(a7)}  #define _mm_setr_epi32(a0, a1, a2, a3) \     {as_4chars(a0), as_4chars(a1), as_4chars(a2), as_4chars(a3)}        

for gcc (it defines __m128i long long[2]):

#define char_as_longlong(a) (((long long)a) & 0xff)  #define short_as_longlong(a) (((long long)a) & 0xffff)  #define int_as_longlong(a) (((long long)a) & 0xffffffff)  #define ll_setr_epi8(a, b, c, d, e, f, g, h) \     char_as_longlong(a) | (char_as_longlong(b) << 8) | \     (char_as_longlong(c) << 16) | (char_as_longlong(d) << 24) | \     (char_as_longlong(e) << 32) | (char_as_longlong(f) << 40) | \     (char_as_longlong(g) << 48) | (char_as_longlong(h) << 56)  #define ll_setr_epi16(a, b, c, d) \     short_as_longlong(a) | (short_as_longlong(b) << 16) | \     (short_as_longlong(c) << 32) | (short_as_longlong(d) << 48)  #define ll_setr_epi32(a, b) \     int_as_longlong(a) | (int_as_longlong(b) << 32)          #define _mm_setr_epi8(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af) \     {ll_setr_epi8(a0, a1, a2, a3, a4, a5, a6, a7), ll_setr_epi8(a8, a9, aa, ab, ac, ad, ae, af)}  #define _mm_setr_epi16(a0, a1, a2, a3, a4, a5, a6, a7) \     {ll_setr_epi16(a0, a1, a2, a3), ll_setr_epi16(a4, a5, a6, a7)}  #define _mm_setr_epi32(a0, a1, a2, a3) \     {ll_setr_epi32(a0, a1), ll_setr_epi32(a2, a3)}         

so in code initialization of __m128i constant like:

const __m128i k8 = _mm_setr_epi8(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); const __m128i k16 = _mm_setr_epi16(1, 2, 3, 4, 5, 6, 7, 8); const __m128i k32 = _mm_setr_epi32(1, 2, 3, 4); 

Comments

Popular posts from this blog

javascript - jQuery: Add class depending on URL in the best way -

caching - How to check if a url path exists in the service worker cache -

Redirect to a HTTPS version using .htaccess -