Lenard Lindstrom wrote:
I believe I found the bug. And it was already fixed for SDL 1.3 (I cannot
confirm it is also fixed for 1.2.13 in SVN since the site is down.) There
should be a licensing requirement to do assembly level programming :-). The
optimized reverse blit uses an i386 string move instruction. The direction
of the copy is controlled by a register flag. A cleared flag causes a
forward copy, the data pointers are incremented. A set flag causes a reverse
copy, decrementing data pointers. The flag was set by the SDL copy code, but
not cleared afterwards. And the flag doesn't reset itself apparently. So the
set flag sat there like an armed bomb until the next string copy instruction
was executed.
This sounds related to the ABI "correction" in GCC 4.3 that broke a
lot more than SDL:
http://lwn.net/Articles/272048/
If it is, the SDL code would have worked with older compilers.