9

对于 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.

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

(我无法访问 64 位 Windows 系统,否则我会自己尝试,而且广泛的 Google 搜索还没有找到任何确定的结果。)

4

1 回答 1

7

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

MSDN 文档

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

于 2013-04-28T17:40:59.663 回答