私が入手した SSE コードは、x64 用に作成されたもので、スタックは 16 で整列されています。最適化されたコード パスは、32 ビット x86 (MSVC/Windows および GCC/Linux 用) 用に要求されています。最初にMSVCでこれを機能させます。
コンパイルを拒否した3 つ以上の__m128
パラメーターを使用する一部のインライン (const ref を作成し、コンパイラーがそれを最適化することを期待することで修正) を除いて、すべてがそのまま機能するようです。
//error C2719: 'd': formal parameter with __declspec(align('16')) won't be aligned
inline __m128i foo(__m128i a, __m128i b, __m128i c, __m128i d) {...}
ただし、x86 Windows ではスタックが 16 バイトに整列されていないという印象を受けました。それでも__declspec(align(16))
、スタック上のいくつかの配列は警告すら出ませんでした.sをプッシュしてポップしているに違いないと確信して__m128
います.少し必要で、とにかく独自のことをしました)。
配列メモリ アドレスにいくつかのアサートを追加し (そして NDEBUG をオフにしました)、それらはすべて合格したようです。
__declspec(align(16)) uint32_t blocks[64];
assert(((uintptr_t)blocks) % 16 == 0);
__m128i a = ...;
__m128i b = ...;
__m128i c = ...;
__m128i d = ...;
__m128i e = ...;
__m128i f = ...;
__m128i g = ...;
//do other stuff, which surely means there is not enough registers on x86
私は本当に幸運だったのでしょうか、それともスタックを再調整する魔法がここで起こっているのでしょうか? そして、これはポータブルですか?VS2008 で D3D9 を実行していたときに、いくつかの D3DX を x86 で調整する際に問題が発生したことを思い出すと確信しています。
ただし、多くの警告が表示されたのは、__m128
->__m128&
変換が非標準であることです。これは、SSE をサポートする一部のコンパイラでは本当にサポートされていないのでしょうか? また、それを回避するにはどうすれば__m128
よいでしょうか?
また、ざっと見てみると、何らかの形で MS 自身がこれらのルールを破っていることがわかります (たとえば、XMMatrixTransformation http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.matrix.xmmatrixtransformation%28v=vs.85%29. aspxは 6 つの SSE オブジェクトを使用しますが、唯一の違いは構造体にラップされていることです)
XMMATRIX XMMatrixTransformation(
[in] XMVECTOR ScalingOrigin,
[in] XMVECTOR ScalingOrientationQuaternion,
[in] XMVECTOR Scaling,
[in] XMVECTOR RotationOrigin,
[in] XMVECTOR RotationQuaternion,
[in] XMVECTOR Translation
);