Intels Pentium 4 Prescott im Detail

SSE3-Befehlssatz-Erweiterungen

Mit dem Prescott erweitert Intel den IA-32-Befehlssatz um 13 zusätzliche Instruktionen. Die neuen Befehle betreffen vor allem die FPU mit neuen SIMD-Befehlen und Erweiterungen für die Arithmetik mit komplexen Zahlen. Intel bezeichnet die Erweiterungen unspektakulär als SSE3.

Die meisten der neuen Befehle sind recht exotisch und dürften lediglich in Spezialfällen zum Tragen kommen. Optimierungspotenzial bieten sie aber etwa für mathematische Libraries, die viel mit komplexen Zahlen rechnen oder den Butterfly-Algorithmus für die Fast Fourier Transformation nutzen. Vor allem wissenschaftliche Anwendungen und Audio/Video-Codecs dürften davon profitieren.

SIMD: Intel erweitert wieder einmal den SSE-Befehlssatz. (Quelle: Intel)
SIMD: Intel erweitert wieder einmal den SSE-Befehlssatz. (Quelle: Intel)

Die neuen Befehle im Überblick:

  • FISTTP wandelt einen Floatingpoint-Wert mit Truncation und nicht wie das bisher vorhandene FISTP durch Runden in einen Integer-Wert um. Dies erspart das sonst nötige manuelle Umschalten auf das gewünschte Umwandlungsverhalten.

  • MOVSHDUP liefert bei einem SIMD-Operanden mit je vier Single-Floatingpoints zwei Mal den ersten Wert und zwei Mal den dritten Wert zurück. Aus dem Vektor (A3,A2,A1,A0) erzeugt MOVSHDUP somit (A3,A3,A1,A1). Ähnlich verhält sich MOVSLDUP, das (A2,A2,A0,A0) zurückliefert. Nützlich sind diese Befehle beim Laden von komplexen Zahlen aus dem Speicher, wo Real- und Imaginärteil in benachbarten Variablen (A3,A2) und (A1,A0) gespeichert sind.

  • ADDSUBPS liefert bei zwei Operanden mit je vier Single-Floatingpoints je-weils die Summe der geraden Datenelemente sowie die Differenz der ungeraden Datenelemente. Aus den Vektoren (A3,A2,A1,A0) und (B3,B2,B1,B0) erzeugt ADDSUBPS (A3+B3, A2-B2, A1+B1, A0-B0). Damit lassen sich Produkte und Quotienten von komplexen Zahlen besonders schnell und elegant berechnen. ADDSUBPD liefert das gleiche Ergebnis für zwei Double-Precision-Floatingpoint-Variablen. Beide Rechenoperationen kommen bei der Fast Fourier Transformation häufig zum Einsatz.

  • MOVDDUP kopiert einen 64-Bit-Double-Floatingpoint in den oberen und unteren Teil einer 128-Bit-SIMD-Variablen.

  • LDDQU kann einen 128-Bit-Wert schnell aus dem Speicher in ein Register laden, auch wenn er nicht auf eine 16-Byte-Grenze aligned ist. In diesem Fall lädt LDDQU automatisch die zwei betroffenen Cache-Lines komplett ein und extrahiert die gewünschten 16 Byte. Dieser Fall tritt sehr häufig bei der Motion Estimation von MPEG-Encodern auf. Hierbei werden Bildteile in zwei benachbarten Bildern auf eine Verschiebung verglichen. Typischerweise kann man dabei nur auf einen Block sauber alligned zugreifen.

  • Die meisten SIMD-Befehle verarbeiten Werte aus zwei verschiedenen Operanden. Die neuen horizontalen Befehle HADDPS, HSUBPS, HADDPD und HSUBPD arbeiten dagegen innerhalb eines Operanden. Aus (A3,A2,A1,A0) und (B3,B2,B1,B0) berechnet etwa HADDPS (B3+B2,B1+B0,A3+A2,A1+A0). Diese Funktionen sind bei der Berechnung von Skalarprodukten und Determinanten von Matrizen nützlich. Auch erlauben sie, das Grafikdaten im Format X1,Y1,X2,Y2,..Xn,Yn und nicht nur im Format X1,X2,..Xn,Y1,Y2,..Yn abgespeichert sind.