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

时间:2013-03-19 12:15:30

标签: gcc initialization sse

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

代码是初始化__m128i的数组。每个__mi28i包含16个int8_t。它使用gcc编译,但结果不符合预期。

实际上,当gcc将__m128i定义为long long int时,代码会初始化一个数组,如:

long long int coeffs_ssse3[4] = {64, 83, 64, 36}

我用谷歌搜索并被告知“初始化向量的唯一可移植方法是使用_mm_set_XXX内在函数。”但是,我想知道有没有其他方法来初始化__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}
};

1 个答案:

答案 0 :(得分:7)

似乎gcc不会将__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支持这种语法(__attribute__((aligned(x)))),所以你需要一些#ifdef技巧来使用正确的指令来实现你想要的对齐在所有目标平台上。