使用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系统的访问权限,否则我会自己尝试一下,而广泛的Googlesearch没有任何确定性。)
您可以在x64下传递尽可能多的128位SSE内部参数。 x64 ABI的设计考虑了这些类型。
从MSDN文档 :
数组和字符串永远不会被立即值传递,而是一个指针被传递给调用者分配的内存。 大小为8,16,32或64位和__m64的结构体/联合体被传递,就好像它们是相同大小的整数一样。 不同于这些大小的结构/联合会作为指针传递给调用者分配的内存。 对于作为指针传递的这些聚集类型(包括__m128),调用方分配的临时内存将以16字节对齐。