2013-04-28 12 views
9

Con Visual C++ su WIN32 esiste un problema di vecchia data con funzioni con 4 o più parametri SSE, ad es.Restrizioni di allineamento dei parametri di Visual Studio e Windows x64 ABI

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

genera un errore:

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

Ad aggravare il problema, Visual C++ ancora impone inutilmente la restrizione ABI anche se la funzione è __inline.

Mi chiedo se questo è ancora un problema su Windows 64 bit? La restrizione ABI si applica ancora su x64?

(non ho accesso ad un sistema di Windows a 64 bit altrimenti mi piacerebbe provare io stesso, e una lunga ricerca Google non ha alzato nulla di definitivo.)

+1

Secondo [manuale Agner Fog di "convenzioni di chiamata" (paragrafo 7.2)] (http://www.agner.org/optimize/), Windows64 passa tutti i parametri per __m128 puntatore, quindi 4 o più parametri __m128 non dovrebbero essere un problema lì. (Impossibile controllare perché non ho accesso a un sistema Windows). –

risposta

7

si può passare come molti a 128 bit Parametri intrinseci SSE che ti piace sotto x64. L'ABI x64 è stato progettato pensando a questi tipi.

Dal 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

Grazie - sembra che sia giunto il momento di iniziare il targeting solo su Windows x64 - ti capita di conoscere la versione minima di Windows e di Visual Studio che mi servirebbe per creare ed eseguire eseguibili x64? –

+1

VS2008 Penso. C'è XP64 ma è praticamente inutilizzato. Vista 64 livello minimo probabilmente ragionevole. –

+0

Grazie - questo è un grande aiuto. –

Problemi correlati