-
Bug
-
Resolution: Done
-
P1: Critical
-
4.7.1
-
None
-
Windows XP Embedded running on AMD Geode LX CPU
-
e0aa9897bc2d04054cc65dbe3452bee2ed2eacd8
Qt crashes when run on an AMD Geode LX CPU. This CPU has MMX and 3DNOW instructions, but does NOT have SSE instructions.
qdrawhelper.cpp contains incorrect logic that assumes that any CPU with 3dnow instuctions can use the qt_memfill32_sse3dnow function, but since that generates the movss instruction, this is clearly wrong.
I wrote a simple program to check the output of qDetectCPUFeatures. This is 0x4F (MMX | MMXEXT | MMX3DNOW | MMX3DNOWEXT | CMOV)... ie no SSE support. So this portion of the code is correct. The error seems to come later on in this snipped of code from qdrawhelper.cpp:7763
#if defined(QT_HAVE_MMXEXT) && defined(QT_HAVE_SSE)
} else if (features & MMXEXT) {
qt_memfill32 = qt_memfill32_sse;
qDrawHelper[QImage::Format_RGB16].bitmapBlit = qt_bitmapblit16_sse;
- ifdef QT_HAVE_3DNOW
if (features & MMX3DNOW) { qt_memfill32 = qt_memfill32_sse3dnow; <- when we have MMX & 3dnow, we are introducing SSE dependancy qDrawHelper[QImage::Format_RGB16].bitmapBlit = qt_bitmapblit16_sse3dnow; } - endif // 3DNOW
#endif // MMXEXT