2013-04-28 37 views
9

Với Visual C++ trên WIN32 có một vấn đề lâu dài với các hàm có 4 hoặc nhiều tham số SSE, ví dụ:Hạn chế căn chỉnh tham số Visual Studio và Windows x64 ABI

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

tạo ra một lỗi:

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

trở nên phức tạp vấn đề, Visual C++ vẫn không cần thiết áp đặt những hạn chế ABI ngay cả khi chức năng là __inline.

Tôi tự hỏi nếu điều này vẫn còn là một vấn đề trên Windows 64 bit? Giới hạn ABI vẫn áp dụng trên x64?

(Tôi không có quyền truy cập vào một hệ thống Windows 64 bit nếu không tôi muốn thử nó bản thân mình, và tìm kiếm mở rộng Google đã không bật lên bất cứ điều gì dứt khoát.)

+1

Theo [Agner Sương mù của nhãn hiệu "ước Calling" (phần 7.2)] (http://www.agner.org/optimize/), Windows64 vượt qua tất cả các thông số __m128 bởi con trỏ, do đó, 4 hoặc nhiều tham số __m128 không phải là vấn đề ở đó. (Không thể kiểm tra điều này vì tôi cũng không có quyền truy cập vào hệ thống Windows). –

Trả lời

7

Bạn có thể vượt qua nhiều 128 bit Tham số nội tại SSE như bạn muốn theo x64. Các x64 ABI được thiết kế với những loại trong tâm trí.

Từ 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.

+0

Cảm ơn - có vẻ như đã đến lúc bắt đầu nhắm mục tiêu Windows x64 - bạn có biết phiên bản tối thiểu của Windows và Visual Studio mà tôi cần để xây dựng và chạy các tệp thi hành x64 không? –

+1

VS2008 Tôi nghĩ vậy. Có XP64 nhưng đó là khá nhiều không sử dụng. Vista 64 có thể là mức tối thiểu hợp lý. –

+0

Cảm ơn - đó là một trợ giúp lớn. –