# qt* comiliert mit -DQT_HAVE_3DNOW

## Christian99

hallo, mir ist da kürzlich was aufgefallen, was mich etwas verwundert hat: qt libs setzen beim kompilieren unter anderen diese Optionen:

-DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_HAVE_SSE3 -DQT_HAVE_SSSE3 -DQT_HAVE_SSE4_1 -DQT_HAVE_SSE4_2

ich find das ein bisschen seltsam, weil mein prozessor kann sachen davon gar nicht (Intel core2, der kann mmx, sse, sse2, ssse3 und sse4_1)

normalerweise werden doch solche sachen an den kompiler geschickt, -D sind doch präprozessor defines, oder?

weiß jemand, was da passiert, in qt?

also nicht, dass es nicht geht, ich hab mich nur gewundert....

----------

## sirro

 *Christian99 wrote:*   

> normalerweise werden doch solche sachen an den kompiler geschickt, -D sind doch präprozessor defines, oder?

 

Richtig. Die bewirken im Prinzip nur, dass bestimmte Bereiche des C-Quellcodes einkompiliert werden. Da Qt OpenSource ist kann man ja mal gucken was da passiert:

```
    const uint features = qDetectCPUFeatures();

[...]

#ifdef QT_HAVE_3DNOW

        if (features & MMX3DNOW) {

            qt_memfill32 = qt_memfill32_sse3dnow;

            qDrawHelper[QImage::Format_RGB16].bitmapBlit = qt_bitmapblit16_sse3dnow;

        }

#endif

```

Wenn QT_HAVE_3DNOW gesetzt ist, nimmt er also den speziellen Code für 3dnow mit in die kompilierte Datei auf. Welche Features deine CPU unterstützt wird ueber die "qDetectCPUFeatures"-Funktion zur Laufzeit abgefragt. Der eigentliche 3dnow-Code wird dann auf deinem System nie aufgerufen weil dein Prozessor kein 3dnow kann. Er wertet bei dir nur die eine Bedingung mehr aus als er ohne QT_HAVE_3DNOW machen würde.

Theoretisch wäre er also ohne QT_HAVE_3DNOW ein ganz kleines bisschen schneller, was du in der Praxis aber nicht merken wirst (naja, vielleicht auf einem ganz langsamen embedded-System).

Hab mir die anderen Sachen jetzt nicht alle angeguckt, aber das Prinzip wird das ähnlich sein.

Die Prozessor-Features werden also explizit vom Quellcode genutzt, da braucht es AFAIK(!) auch nicht zusätzlich die entsprechende Compiler-Option.

----------

## Josef.95

Jo, da war ich neulich auch schon mal drüber gestolpert....

Da qt-gui hier grad neu gebaut werden musste hab ich mal mit drauf geachtet :

```
i686-pc-linux-gnu-g++ -c -O2 -march=opteron-sse3 -pipe -fomit-frame-pointer -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -fvisibility=hidden -fvisibility-inlines-hidden -D_REENTRANT -Wall -W -fPIC -DQT_NO_DEBUG -DQT_PLUGIN -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_HAVE_SSE3 -DQT_HAVE_SSSE3 -DQT_HAVE_SSE4_1 -DQT_HAVE_SSE4_2 -DQT_HAVE_AVX -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_SHARED -I../../../../mkspecs/linux-g++ -I. -I../../../../include/QtCore -I../../../../include/QtGui -I../../../../include -I../../../gui/image -I.moc/release-shared -o .obj/release-shared/qgifhandler.o ../../../gui/image/qgifhandler.cpp
```

 und dass mit einer ca. fünf Jahre alten AMD CPU die ganz sicher kein 

SSSE3 SSE4_1 und SSE4_2

kann.

Dankeschön sirro für deine Erklärung.

----------

