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

Pau*_*l R 9 windows 64-bit sse abi visual-c++

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

__m128i foo4(__m128i m0, __m128i m1, __m128i m2, __m128i m3) {}
Run Code Online (Sandbox Code Playgroud)

生成错误:

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

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

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

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

Dav*_*nan 7

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

MSDN文档:

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