x86上的SSE,堆栈对齐

我得到的SSE代码是为x64编写的,堆栈对齐。 现在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上不是16byte。 然而,堆栈中的一些__declspec(align(16))数组甚至没有发出警告,我确信它必须推动并弹出__m128(我记得在x64上需要12个寄存器,并且即使这样,无论如何,它并不需要这个堆栈,并且做了它自己的事情)。

我甚至在阵列内存地址上添加了一些断言(并关闭了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's,或多于3个参数)?

另外一个快速的外观建议不知怎么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
);
链接地址: http://www.djcxy.com/p/72733.html

上一篇: SSE on x86, stack alignment

下一篇: 64 bit inline assembly in Delphi XE3