在Visual Studio C ++中,v4sf和__attribute__的等价物是什么?

时间:2011-11-28 00:08:10

标签: visual-studio visual-studio-2010 visual-c++ gcc sse

typedef float v4sf __attribute__ ((mode(V4SF)));

这是在GCC。任何人都知道等价语法?

VS 2010将显示__attribute__没有此类型的存储类,并且未定义模式。

我在互联网上搜索了它说

  

相当于GCC中的__attribute__( aligned( size ) )

     

很有帮助   对于前unix开发人员或编写可用的代码的人   在GCC中你可以使用多个平台获得相同的结果   属性(对齐(...))

     

有关更多信息,请参阅此处:   http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Type-Attributes.html#Type-Attributes

完整的GCC代码位于:http://pastebin.com/bKkTTmH1

2 个答案:

答案 0 :(得分:4)

如果你在VC ++中寻找对齐指令,它是__declspec(align(16))。 (或任何你想要的对齐方式)

示例用法是:

__declspec(align(16)) float x[] = {1.,2.,3.,4.};

http://msdn.microsoft.com/en-us/library/83ythb65.aspx

请注意,attribute(在GCC中)和__declspec(在VC ++中)都是特定于编译器的扩展。

编辑:

现在我再看一下代码,除了用VC ++等效替换__attribute__行以使其在VC ++中编译之外,还需要做更多的工作。

VC ++没有任何你正在使用的宏/函数:

  • __builtin_ia32_xorps
  • __builtin_ia32_loadups
  • __builtin_ia32_mulps
  • __builtin_ia32_addps
  • __builtin_ia32_storeups

你最好只用SSE intrinsics替换所有这些 - 这将适用于GCC和VC ++。


这是转换为内在函数的代码:

float *mv_mult(float mat[SIZE][SIZE], float vec[SIZE]) {
    static float ret[SIZE];
    float temp[4];
    int i, j;
    __m128 m, v, r;

    for (i = 0; i < SIZE; i++) {
        r = _mm_xor_ps(r, r);

        for (j = 0; j < SIZE; j += 4) {
            m = _mm_loadu_ps(&mat[i][j]);
            v = _mm_loadu_ps(&vec[j]);
            v = _mm_mul_ps(m, v);
            r = _mm_add_ps(r, v);
        }

        _mm_storeu_ps(temp, r);
        ret[i] = temp[0] + temp[1] + temp[2] + temp[3];
    }

    return ret;
}

答案 1 :(得分:1)