[fpc-devel] Stack alignment on i386
Jonas Maebe
jonas.maebe at elis.ugent.be
Thu Dec 22 15:57:38 CET 2011
On 22 Dec 2011, at 15:40, Sven Barth wrote:
> i386/Win32 should be adjusted then as well, because I suspect very
> much that this is the reason for my problems with OpenCV... (on
> Windows as well as on Linux)
From what I understand from http://msdn.microsoft.com/en-us/library/aa290049(v=vs.71).aspx
, a function is required to align the stack to 8 or 16 bytes itself if
it needs better alignment on win32. These links also all say the
required alignment for win32 is 4 bytes:
* http://msdn.microsoft.com/en-us/library/k1a8ss06.aspx : Some SSE
types require eight-byte stack alignment, forcing the compiler to emit
dynamic stack-alignment code.
* http://old.nabble.com/ATLAS-on-win32,-pthreads,-SSE-and-stack-alignment-p19828585.html
: in accordance win the Win32 ABI, only guarantees a 4-byte aligned
stack
* http://eigen.tuxfamily.org/dox/TopicWrongStackAlignment.html : this
assumption can be wrong on Windows, where the stack is only guaranteed
to have 4-byte alignment
You should probably add the flag -mpreferred-stack-boundary=2 when
compiling OpenCV for win32 using gcc: http://sourceforge.net/tracker/index.php?func=detail&aid=2170667&group_id=23725&atid=379483
Also keep in mind that switching to 16 byte aligned stacks for
existing targets
a) requires many assembler routines in the RTL to be disabled (or
rewritten, but that was not done for Darwin/i386, in part because in
many cases it can use faster libc equivalents anyway)
b) will probably break quite a bit assembler code from existing
programs, both written for FPC and for Delphi (unless "nostackframe;"
is added, the compiler will add stack alignment code to assembler
routines which may mess up hardcoded offsets or other assumptions)
Jonas
More information about the fpc-devel
mailing list