You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
230 lines
8.9 KiB
HTML
230 lines
8.9 KiB
HTML
<HTML>
|
|
<HEAD>
|
|
<TITLE>MMX Erweiterung -- Register, Datentypen und Befehle</TITLE>
|
|
<SCRIPT LANGUAGE="Javascript">
|
|
<!-- Test Browser Version
|
|
|
|
// Javascript written 1998 by Jens Hohmuth (Script-Version: 3.0)
|
|
// (c) Copyright 1998 by Jens Hohmuth@fh-zwickau.de. All rights reserved.
|
|
|
|
var browserok= 0;
|
|
var version= parseInt( navigator.appVersion );
|
|
|
|
if( version >= 3 ) browserok= 1;
|
|
if( document.images ) browserok= 1;
|
|
|
|
if( browserok )
|
|
{
|
|
var imgdata_touched = new Array();
|
|
var imgdata_released= new Array();
|
|
}
|
|
|
|
// load imagedata
|
|
function precache( name, pic1, pic2 )
|
|
{
|
|
if( browserok )
|
|
{
|
|
imgdata_touched [ name ]= new Image();
|
|
imgdata_touched [ name ].src= pic2;
|
|
imgdata_released[ name ]= new Image();
|
|
imgdata_released[ name ].src= pic1;
|
|
}
|
|
}
|
|
|
|
// "Release", called if mouse left button
|
|
function release( name )
|
|
{
|
|
if( browserok )
|
|
{
|
|
document.images[ name ].src= imgdata_released[ name ].src;
|
|
}
|
|
}
|
|
|
|
// "Touch", called if mouse over link-button
|
|
function touch( name )
|
|
{
|
|
if( browserok )
|
|
{
|
|
document.images[ name ].src= imgdata_touched[ name ].src;
|
|
}
|
|
}
|
|
|
|
// load (precache) Buttons
|
|
if( browserok )
|
|
{
|
|
precache( "left", "../images/arrowl.gif", "../images/arrowlp.gif" );
|
|
precache( "right", "../images/arrowr.gif", "../images/arrowrp.gif" );
|
|
precache( "index", "../images/index.gif", "../images/indexp.gif" );
|
|
}
|
|
//-->
|
|
</SCRIPT>
|
|
|
|
</HEAD>
|
|
|
|
<BODY BGCOLOR="#C0C0C0" BACKGROUND="../images/stone.jpg">
|
|
<H1><FONT COLOR="#800000">2 Register, Datentypen und Befehle der
|
|
MMX-Erweiterung</FONT></H1>
|
|
|
|
<A NAME="Neue Register"><H2><FONT COLOR="#000080">Neue (?) Register</FONT></H2></A>
|
|
|
|
<P>Ein MMX-Prozessor stellt 8 neue Register zur Verfügung. Diese
|
|
Register sind frei verfügbar und werden als MM0 bis MM7 angesprochen.
|
|
Die Register sind jeweils 64-Bit breit und können ausschließlich
|
|
zur Speicherung und Bearbeitung von Daten verwendet werden. Eine
|
|
Speicheradressierung mit Hilfe der MMX-Register ist nicht möglich. Die
|
|
MMX-Register sind in Abbildung 1 prinzipiell dargestellt.</P>
|
|
|
|
<CENTER>
|
|
<P>
|
|
<IMG SRC="../images/mmx_1.gif" ALT="MMX-Register" BORDER=3>
|
|
<BR>
|
|
<I><B>Abb. 1:</B> MMX-Register</I>
|
|
</P>
|
|
</CENTER>
|
|
|
|
<P>Dabei muß beachtet werden, daß die MMX-Register den Fließkomma-
|
|
Registern entsprechen ! Wird ein MMX-Register mit einem Wert beschrieben, so
|
|
wird der Inhalt im 64-Bit breiten Mantisse-Feld des entsprechenden
|
|
Fließkomma-Registers gespeichert. Alle Exponenten-Bits werden dabei auf
|
|
den Wert 1 gesetzt. Auf ähnliche Weise wirken sich Schreibzugriffe auf
|
|
Fließkomma-Register auf die MMX-Register aus. Jeder Zugriff auf ein
|
|
MMX-Register setzt zusätzlich den Wert TOS (Top of Stack) auf 0 zurück.</P>
|
|
|
|
<P>Eine Vermischung von Fließkomma- und MMX-Befehlen ist aus diesem Grund
|
|
nicht möglich bzw. setzt eine besondere Aufteilung von MMX- und
|
|
Fließkommabefehlen voraus. Weiterhin sollten MMX-Routinen mit dem Befehl EMMS
|
|
(Empty MMX State) beendet werden, wenn andere Module eventuell Fließkomma-
|
|
Operationen durchführen. Durch den EMMS-Befehl werden die Fließkomma-
|
|
Register als nicht belegt gekennzeichnet und können damit von
|
|
Fließkomma-Befehlen genutzt werden. Wird EMMS nicht benutzt, kann eine
|
|
Exception die Folge sein, wenn der Prozessor versucht, auf die
|
|
Fließkomma-Register zuzugreifen (diese wurden ja bereits mit MMX-Werten belegt).</P>
|
|
|
|
<P>Die Umschaltungen zwischen MMX- und Fließkomma-Befehlen sollten
|
|
jedoch möglichst gering gehalten werden, da eine solche Umschaltung bis
|
|
zu 50 Taktzyklen benötigen kann.</P>
|
|
|
|
<P>Der Vorteil der Alias-Bildung zwischen MMX- und Fließkommabefehlen
|
|
besteht darin, daß für die Nutzung von MMX-Befehlen kein neuer
|
|
Prozessorstatus eingeführt werden mußte. Dadurch ist es z.B.
|
|
möglich, Programme, die unter einem pre-emptiven Betriebsystem ablaufen,
|
|
ohne zusätzliche Änderungen mit MMX-Befehlen auszustatten. Die
|
|
"Rettung" der MMX-Registerinhalte kann dann, im Falle eines
|
|
Taskwechsels, von den gleichen Mechanismen übernommen werden, wie die
|
|
Sicherung von Fließkomma-Registerinhalten.</P>
|
|
|
|
<A NAME="Neue Datentypen"><H2><FONT COLOR="#000080">Neue Datentypen</FONT></H2></A>
|
|
|
|
<P>Die sogenannten "Gepackten-Daten" wurden mit der MMX-Erweiterung
|
|
eingeführt. Dabei können MMX-Befehle mit acht Byte, vier Word oder
|
|
zwei Doubleword operieren, die in einem 64-Bit breiten MMX-Register gespeichert
|
|
sind. Diese 64-Bit werden dann als "Gepackte-Daten" bezeichnet.
|
|
Abbildung 2 veranschaulicht die möglichen Aufteilungen eines 64 Bit-breiten
|
|
Wertes.</P>
|
|
|
|
<CENTER>
|
|
<P>
|
|
<IMG SRC="../images/mmx_2.gif" ALT="Gepackte Daten" BORDER=3>
|
|
<BR>
|
|
<I><B>Abb. 2:</B> Gepackte Daten</I>
|
|
</P>
|
|
</CENTER>
|
|
|
|
<P>Auf welche Daten (Byte, Word oder Doubleword) ein MMX-Befehl letztendlich
|
|
Operationen ausführt, wird durch den MMX-Befehlsnamen festgelegt. Ebenfalls
|
|
durch den Befehlsnamen wird festgelegt, wie das höchstwertigste Bit (MSB -
|
|
most significant bit) der einzelnen "gepackten" Daten interpretiert
|
|
werden soll. So kann zwischen vorzeichenbehafteten und vorzeichenlosen Daten
|
|
unterschieden werden.</P>
|
|
|
|
<P>Diese Unterscheidung ist auch für eine weitere Eigenschaft der MMX-
|
|
Befehle von Bedeutung, der sogenannten "Saturation". Dadurch kann,
|
|
wie weiter oben bereits festgestellt wurde, der Wertebereich der einzelnen
|
|
"gepackten" Daten im Falle eines Überlaufs auf das Maximum
|
|
(bzw. Minimum) beschränkt werden. Diese Eigenschaft wird ebenfalls durch
|
|
den Namen des Befehls festgelegt (durch ein Befehlsuffix). Das folgende Beispiel
|
|
soll die "Saturation"-Thematik verdeutlichen.</P>
|
|
|
|
<CENTER>
|
|
<TABLE BORDER="0" WIDTH="100%">
|
|
|
|
<TR ALIGN="CENTER" VALIGN="CENTER">
|
|
<TD ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#FF0000">
|
|
<IMG SRC="../images/bred.gif" ALT="Beispiel" BORDER=0>
|
|
</TD>
|
|
|
|
<TD ALIGN="LEFT" VALIGN="TOP" WIDTH="99%">
|
|
|
|
<P>Gegeben ist der folgende 64-Bit Wert.</P>
|
|
|
|
<FONT COLOR="#0000FF"><PRE> FDCE365310DDC3A2h</PRE></FONT>
|
|
|
|
<P>Wird dieser Wert als Byte-gepackter Datentyp interpretiert, so ergibt sich
|
|
folgende Bytefolge (alle Werte hexadezimal, 1 Quadword= 64 Bit= 8 Byte):</P>
|
|
|
|
<FONT COLOR="#0000FF"><PRE> FD CE 36 53 10 DD C3 A2</PRE></FONT>
|
|
|
|
<P>Die einzelnen Bytes sollen als vorzeichenlose Werte betrachtet werden. Zu
|
|
jedem Byte wird der Wert 20h addiert. Ohne "Saturation" ergibt sich
|
|
das folgende Ergebnis (alle Werte hexadezimal).</P>
|
|
|
|
<FONT COLOR="#0000FF"><PRE> FD CE 36 53 10 E4 C3 A2
|
|
+ 20 20 20 20 20 20 20 20
|
|
-----------------------
|
|
1D EE 56 73 30 04 E3 C2</PRE></FONT>
|
|
|
|
<P>In diesem Beispiel würden das 1. und 6. Byte den Wertebereich verlassen
|
|
und nicht das korrekte Ergebnis liefern. Der "Überlauf" der
|
|
Addition führt zu den falschen Werten 1Dh und 04h.</P>
|
|
|
|
<P>Mit "Saturation" wird die Addition wie folgt ausgeführt.</P>
|
|
|
|
<FONT COLOR="#0000FF"><PRE> FD CE 36 53 10 E4 C3 A2
|
|
+ 20 20 20 20 20 20 20 20
|
|
-----------------------
|
|
FF EE 56 73 30 FF E3 C2</PRE></FONT>
|
|
|
|
<P>Die Bytes 1. und 6. werden jetzt auf ihre maximalen Werte (= 0FFh)
|
|
beschränkt.</P>
|
|
|
|
<P>Natürlich ist eine solche Überprüfung des Wertebereiches auch
|
|
ohne die MMX-Erweiterung denkbar, nur kann sie ein Prozessor mit MMX gleichzeitig
|
|
mit allen gepackten Daten und noch dazu in nur einem einzigen Befehl ausführen.
|
|
Die MMX-Erweiterung kann deshalb in diesen Fällen effizienter arbeiten.</P>
|
|
|
|
</TD>
|
|
</TR>
|
|
</TABLE>
|
|
</CENTER>
|
|
|
|
<P>Wie zwischen den unterschiedlichen Befehlsarten (vorzeichenlos/vorzeichenbehaftet,
|
|
Saturation benutzen/nicht benutzen) unterschieden wird, soll als nächstes
|
|
betrachtet werden.</P>
|
|
|
|
<!-- wie gehts weiter ------------------------------------------------------>
|
|
<P><HR SIZE=2></P>
|
|
<A HREF="mmx_1.htm" onMouseOver="touch( 'left' );" onMouseOut="release( 'left' );">
|
|
<IMG SRC="../images/arrowl.gif" NAME="left" ALT="zurueck" BORDER=0 ALIGN=LEFT></A>
|
|
|
|
<A HREF="mmx_3.htm" onMouseOver="touch( 'right' );" onMouseOut="release( 'right' );">
|
|
<IMG SRC="../images/arrowr.gif" NAME="right" ALT="weiter" BORDER=0 ALIGN=RIGHT></A>
|
|
|
|
<CENTER>
|
|
<A HREF="index.htm#Register" onMouseOver="touch( 'index' );" onMouseOut="release( 'index' );">
|
|
<IMG SRC = "../images/index.gif" NAME="index" ALT="Zum Index" BORDER=0></A>
|
|
</CENTER>
|
|
<BR>
|
|
|
|
<!-- Adresse --------------------------------------------------------------->
|
|
<HR SIZE=2>
|
|
<ADDRESS>
|
|
Probleme oder Vorschläge zu dieser Webseite, bitte per email an:
|
|
<A HREF="mailto:hohmuth@t-online.de">
|
|
<B>hohmuth@t-online.de</B>
|
|
</A>
|
|
<BR>
|
|
Letzte Änderungen am: 02.01.1999, Jens Hohmuth.
|
|
</ADDRESS>
|
|
</BODY>
|
|
</HTML>
|