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

問題を複雑にするために、Visual C++ は、関数が__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 に答える