Question

With Visual C++ on WIN32 there's a long-standing problem with functions with 4 or more SSE parameters, e.g.

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

generates an error:

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

To compound the problem, Visual C++ still needlessly imposes the ABI restriction even if the function is __inline.

I'm wondering if this is still a problem on 64 bit Windows ? Does the ABI restriction still apply on x64 ?

(I don't have access to a 64 bit Windows system otherwise I'd try it myself, and an extensive Google search hasn't turned up anything definitive.)

Was it helpful?

Solution

You can pass as many 128 bit SSE intrinsic parameters as you like under x64. The x64 ABI was designed with these types in mind.

From the MSDN documentation:

__m128 types, arrays and strings are never passed by immediate value but rather a pointer is passed to memory allocated by the caller. Structs/unions of size 8, 16, 32, or 64 bits and __m64 are passed as if they were integers of the same size. Structs/unions other than these sizes are passed as a pointer to memory allocated by the caller. For these aggregate types passed as a pointer (including __m128), the caller-allocated temporary memory will be 16-byte aligned.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top