如何在gcc中静态初始化_m128i数组?

如何在gcc中静态初始化_m128i数组?,gcc,initialization,sse,Gcc,Initialization,Sse,我正在将一些SSE优化代码从Windows移植到Linux。我发现下面的代码在MSVC中运行良好,但在GCC中不起作用 该代码用于初始化\uuu m128i的数组。每个\uu mi28i包含16个int8\u t。它确实使用gcc编译,但结果不符合预期 实际上,由于gcc将\uuu m128i定义为long-long-int,因此代码将初始化一个数组,如下所示: long-long-int系数[4]={64,83,64,36} 我在谷歌上搜索,得知“初始化向量的唯一可移植方法是使用\u mm\u

我正在将一些SSE优化代码从Windows移植到Linux。我发现下面的代码在MSVC中运行良好,但在GCC中不起作用

该代码用于初始化
\uuu m128i
的数组。每个
\uu mi28i
包含16个
int8\u t
。它确实使用gcc编译,但结果不符合预期

实际上,由于gcc将
\uuu m128i
定义为
long-long-int
,因此代码将初始化一个数组,如下所示:

long-long-int系数[4]={64,83,64,36}

我在谷歌上搜索,得知“初始化向量的唯一可移植方法是使用
\u mm\u set\u XXX
内部函数。”然而,我想知道是否还有其他方法可以初始化
\u m128i
数组?静态上更好,并且不需要对下面的代码进行太多修改(因为我有大量以下格式的代码)。如有任何建议,我们将不胜感激

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}
};

似乎,
gcc
没有将
\uuuu m128*
类型视为聚合初始化的候选类型。因为它们不是标准类型,所以这种行为会因编译器而异。一种方法是将数组声明为8位整数的对齐数组,然后只需向其投射指针:

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;

但是,我认为Visual Studio不支持这种语法(
\uuuu属性(aligned(x))
),因此您需要一些
\ifdef
技巧,才能使用正确的指令在所有目标平台上实现所需的对齐。

谢谢@Jason!我试过你的方法,效果很好。(在您的答案中,uint8应该是int8,因为数组包含负值。这可能是一个输入错误,您可以编辑答案以使其完美:)