How to initialize __m128i array statically in gcc?

gcc, initialization, sse

Solution

It seems that `gcc` doesn't treat the `__m128*` types as being candidates for aggregate initialization. Since they aren't standard types, this behavior will vary from compiler to compiler. One approach would be to declare the array as an aligned array of 8-bit integers, then just cast a pointer to it:

static const int8_t coeffs[64] __attribute__((aligned(16))) =
{
     64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0,
     83, 0, 36, 0,-36,-1,-83,-1, 83, 0, 36, 0,-36,-1,-83, -1,
     64, 0,-64,-1,-64,-1, 64, 0, 64, 0,-64,-1,-64,-1, 64, 0,
     36, 0,-83,-1, 83, 0,-36,-1, 36, 0,-83,-1, 83, 0,-36,-1
};
static const __m128i *coeffs_ssse3 = (__m128i *) coeffs;

However, I don't think this syntax (`__attribute__((aligned(x)))`) is supported by Visual Studio, so you would need some `#ifdef` trickery in there to use the right directives to achieve the alignment that you want on all of your target platforms.

Problem

I am porting some SSE optimization code from Windows to Linux. And I found that the following code, which works well in MSVC, won't work in GCC. The code is to initialize an array of `__m128i`. Each `__mi28i` contains 16 `int8_t`. It does compile with gcc but the result is not as expected. Actually, as gcc defines `__m128i` as `long long int`, the code will initialize an array like: `long long int coeffs_ssse3[4] = {64, 83, 64, 36}`. I googled and was told that "The only portable way to initialize a vector is to use `_mm_set_XXX` intrinsics." However, I want to know is there any other way to initialize the `__m128i` array? Better statically, and don't need to modify the following code much (since I have tons of code in the following format). Any suggestion is appreciated. ``` static const __m128i coeffs_ssse3[4] = { { 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0}, { 83, 0, 36, 0,-36,-1,-83,-1, 83, 0, 36, 0,-36,-1,-83, -1}, { 64, 0,-64,-1,-64,-1, 64, 0, 64, 0,-64,-1,-64,-1, 64, 0}, { 36, 0,-83,-1, 83, 0,-36,-1, 36, 0,-83,-1, 83, 0,-36,-1} }; ```

Original source