2013-04-28 13 views
9

Z Visual C++ na WIN32 istnieje długotrwały problem z funkcjami z 4 lub więcej parametrami SSE, np.Ograniczenia wyrównywania parametrów Visual Studio i Windows x64 ABI

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

generuje błąd:

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

Aby związek ten problem, Visual C++ nadal niepotrzebnie nakłada ograniczenie ABI nawet jeśli funkcja jest __inline.

Zastanawiam się, czy to nadal problem w 64-bitowym systemie Windows? Czy ograniczenie ABI nadal obowiązuje na x64?

(nie mam dostępu do 64 bitowym systemie Windows inaczej bym go wypróbować siebie i rozbudowana wyszukiwarka Google nie pojawiło się nic ostateczne.)

+1

Zgodnie [Agner mgła w "konwencji dzwonienia" instrukcji (sekcja 7.2)] (http://www.agner.org/optimize/) Windows64 przechodzi przez wszystkie parametry __m128 wskaźnik, więc 4 lub więcej parametrów __m128 nie powinno stanowić problemu. (Nie można tego sprawdzić, ponieważ nie mam również dostępu do systemu Windows). –

Odpowiedz

7

można przekazać jak najwięcej 128 bit Parametry wewnętrzne SSE, jak chcesz pod x64. X64 ABI zostało zaprojektowane z myślą o tych typach.

Z 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

Dzięki - wydaje się, że nadszedł czas, aby rozpocząć kierowanie tylko na system Windows x64 - czy znasz minimalną wersję systemu Windows i programu Visual Studio, których potrzebowałbym do budowania i uruchamiania plików wykonywalnych x64? –

+1

VS2008 Myślę. Jest XP64, ale to prawie nieużywane. Vista 64 prawdopodobnie rozsądny minimalny poziom. –

+0

Dzięki - to wielka pomoc. –

Powiązane problemy