Visual Studio参数对齐限制和Windows x64 ABI

时间:2013-04-28 16:06:36

标签: windows visual-c++ 64-bit sse abi

使用WIN32上的Visual C ++,对于具有4个或更多SSE参数的函数存在长期存在的问题,例如

__m128i foo4(__m128i m0, __m128i m1, __m128i m2, __m128i m3) {}

生成错误:

align.c(8) : error C2719: 'm3': formal parameter with __declspec(align('16')) won't be aligned

为了解决这个问题,即使函数是__inline,Visual C ++仍然会不必要地强加ABI限制。

我想知道这在64位Windows上是否仍然存在问题? ABI限制是否仍适用于x64?

(我无法访问64位Windows系统,否则我会亲自尝试,并且广泛的Google搜索没有找到任何明确的内容。)

1 个答案:

答案 0 :(得分:7)

您可以在x64下传递任意数量的128位SSE内部参数。 x64 ABI的设计考虑了这些类型。

来自MSDN documentation

  

__ m128类型,数组和字符串永远不会通过立即值传递,而是将指针传递给调用者分配的内存。传递大小为8,16,32或64位和__m64的结构/联合,就好像它们是相同大小的整数一样。除这些大小之外的结构/联合作为指针传递给调用者分配的内存。对于作为指针传递的这些聚合类型(包括__m128),调用者分配的临时内存将是16字节对齐的。