Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
256 6 MMIX-Prozessor
Nachfolgende Tabelle übersetzt MMIX-Opcodes in diejenigen Zahlen, die im Befehlswort
in den Bits 31...24 abgelegt werden müssen.
! "#$%
!"#"$% &'()*+,-.%(*/%012'(*/%!&'(!)*+*,-(#.*-/!01234/*5!67*8434/*9!:;</!=*8>((!7'3,+4-=*7/*<!?'@*--*!A@*<(*BCBD!!
0x..0 0x..1 0x..2 0x..3 0x..4 0x..5 0x..6 0x..7
TRAP 5ν FCMP ν FUN ν FEQL ν FADD 4ν FIX 4ν FSUB 4ν FIXU 4ν
FMUL 4ν FCMPE 4ν FUNE ν FEQLE 4ν FDIV 40ν FSQRT 40ν FREM 4ν FINT 4ν
SETH ν SETMH ν SETML ν SETL ν INCH ν INCHM ν INCML ν INCL νORH ν ORMH ν ORML ν ORL ν ANDNH ν ANDNMH ν ANDNML ν ANDNL ν
POP 3ν RESUME 5ν SYNC ν SWYM ν GET ν TRIP 5ν0x..8 0x..9 0x..A 0x..B 0x..C 0x..D 0x..E 0x..F
SUB[I] ν
CSNP[I] νZSP[I] ν
SUBU[I] ν16ADDU[I] νNEGU[I] νSRU[I]ν
BOD[B] ν+πBEV[B] ν+πPBOD[B] 3ν-π
CMPU[I] νSLU[I] νBZ[B] ν+πBNZ[B] ν+πPBZ[B] 3ν-π
CSNZ[I] νZSZ[I] ν
ADD[I] ν
CSNN[I] νZSN[I] ν
ADDU[I] ν4ADDU[I] ν
PBNZ[B] 3ν-πCSZ[I] ν
0x0.. 0x0..FLOT[I] 4ν FLOTU[I] 4ν SFLOT[I] 4ν SFLOTU[I] 4ν
PUSHJ[B] ν GETA[B] ν PUT[I] ν[UN]SAVE 20µ+ν
XOR[I] νNXOR[I] νODIF[I] νMXOR[I] ν
STWU[I] µ+νSTOU[I] µ+νSTUNC[I] µ+νPUSHGO[I] 3ν
LDWU[I] µ+νLDOU[I] µ+νLDUNC[I] µ+νGO[I] 3ν
CSOD[I] νPBEV[B] 3ν-π
ZSEV[I] ν
CSEV[I] νZSOD[I] ν
NAND[I] νTDIF[I] νMOR[I] ν
STO[I] µ+νSTCO[I] µ+νSYNCID[I] νNOR[I] ν
LDO[I] µ+νCSWAP[I] 2µ+2νPREGO[I] νSTW[I] µ+ν
PBNP[B] 3ν-πCSP[I] ν
ZSNP[I] νLDW[I] µ+ν
BNP[B] ν+πPBP[B] 3ν-π
8ADDU[I] νNEG[I] νSR[I] νBP[B] ν+π
ORN[I] νANDN[I] νWDIF[I] νSADD[I] ν
STBU[I] µ+νSTTU[I] µ+νSTHT[I] µ+νPREST[I] ν
LDBU[I] µ+νLDTU[I] µ+νLDHT[I] µ+νPRELD[I] ν
ZSNZ[I] ν
BDIF[I] νMUX[I] ν
JMP[B] ν
STSF[I] µ+νSYNCD[I] νOR[I] νAND[I] ν
LDSF[I] µ+νLDVTS[I] νSTB[I] µ+νSTT[I] µ+ν
BNN[B] ν+πPBN[B] 3ν-πPBNN[B] 3ν-πCSN[I] ν
ZSNN[I] νLDB[I] µ+νLDT[I] µ+ν
2ADDU[I] νCMP[I] νSL[I] νBN[B] ν+π
0xC..
0xD..
0xE..
0xF..
0x8..
0x9..
0xA..
0xB..
0xD..
0xE..
0xF..
0x1..
0x2..
0x3..
0x4..
0x5..
0x6..
0x7..
0x9..
0xA..
0xB..
0xC..
0x5..
0x6..
0x7..
0x8..
0x1..
0x2..
0x3..
0x4..
MUL[I] 10ν MULU[I] 10ν DIV[I] 60ν DIVU[I] 60ν
!!!&'(!*<(B*!E;@@-*!0F!);B#G*<B9!/*(!1234/*(!*7B(2<;3,B!/*<!&422*-C*;-*!0H!@;(!IJ95! ;7!/*<!(;3,!/*<!)*#+*,-(34/*!@*+;7/*BD!!!&'(!C:*;B*!E;@@-*!/*(!1234/*(!*<=;@B!(;3,!:;*!+4-=BK!!
−! 6L)!0);B!E<D!"9!/*(!C:*;B*7!E;@@-*(!+! H5!:*77!(;3,!/*<!)*+*,-!;8!4@*<*7!?*;-!/*<!&422*-!"#$"!@*+;7/*B!+! I5!:*77!(;3,!/*<!)*+*,-!;8!M7B*<*7!?*;-!/*<!&422*-!"#$"!@*+;7/*B!!
!−! );B(!$5!I!M7/!H!/*(!C:*;B*7!E;@@-*(!*7B(2<*3,*7!/*<!%&'$("!0H!@;(!%95!;7!/*8!(;3,!/*<!)*+*,-(#34/*!@*+;7/*B!
![I]!@*/*MB*BK!N88*/;'B*#O'<;'7B*!/*(!)*+*,-(!
−! ;88*/;'B*!⇔!&;<*PB42*<'7/!−! ADD $1,$2,$3K!7;3,B!;88*/;'B*5!/'!/*<!"D!12*<'7/!*;7!Q*=;(B*<!;(B!M7/!P*;7*!R',-!−! ADD $1,$2,3K!;88*/;'B*5!/'!'-(!"D!12*<'7/!*;7*!R',-!'7=*=*@*7!;(B!M7/!P*;7!Q*=;(B*<!−! /*<! 1234/*! /*<! ;88*/;'B*#O'<;'7B*! *;7*(! )*+*,-(! ;(B! ;88*<! M8! I! ,S,*<! '-(! /;*! 7;3,B#;88*/;'B*#O'<;'7B*!/*(!)*+*,-(!0(B*,B!;7!/*<!&422*-)&'$("!'-(4!<*3,B(9!
−! *;7*! ;88*/;'B*#O'<;'7B*!/*(!)*+*,-(!:;</!T48!U((*8@-*<!'MB48'B;(3,!'7,'7/!/*(! +*,-*7/*7!&4--'<#R*;3,*7(! 0$9! *<P'77B5! :*(,'-@! ;8! V<4=<'88! 7;3,B! *W2-;C;B!ADDI! =*(3,<;*@*7! :*</*7!8M((!!!
Die Übersetzung erfolgt folgendermaßen:
• Befehl suchen
• Doppelzeile ermitteln, in der der Befehl steht
• An der Seite der Tabelle das obere Nibble (= die oberen 4 Bits) des Opcodes
ablesen, z.B. ADD) 0x2
• Prüfen, ob der Befehl im oberen oder im unteren Teil der Doppelzeile steht
• Steht der Befehl im oberen Teil der Doppelzeile, kann man das untere
Nibble (= die unteren 4 Bits) des Opcodes an der ersten Tabellenzeile
ablesen, z.B. ADD) 0x..0 oder 0x..1
• Steht der Befehl im unteren Teil der Doppelzeile, kann man das
6.4 MMIX-Programme 259
h) Wieviele Takte benötigt der BZ-Befehl, wenn nicht gesprungen wird?
i) Wieviele Takte benötigt der PBZ-Befehl, wenn gesprungen wird?
j) Wieviele Takte benötigt der PBZ-Befehl, wenn nicht gesprungen wird?
k) Geben Sie das 32 Bit breite Befehlswort des Befehls ‘‘SL $1,$2,3’’ an.
T l) Geben Sie das 32 Bit breite Befehlswort des Befehls ‘‘SUB $5,$6,7’’ an.X-
-0×25050607
6.5 MMIX Befehle 273
T c) Geben Sie MMIX-Befehle an, die e = 2,718281828 in Register b ablegen.- -
-
SETL 9,27
SET buf 7,70000
MUL a , a ,buf7 E 270000
DETL buf 217828
ADD 9,9 , bufz F 277828
MUL 9,9,
buf 7 I 2778280000ADD alhcbufz ← 2778287828F LOT bnf7ibhf7
F LOT orca
F DIV a ,aibuf7 ← 2177828,7828F DIV 9,9 , but F 27,78287828
FDIV
1019,70
← 2,778287828
6.5 MMIX Befehle 277
Bits löschen
a) Welche Befehle verwendet man typischerweise um einzelne Bits zu löschen?
b) Geben Sie an, wie Sie mit dem Befehl ANDNML Bit 21 in Register a löschen.
T c) Geben Sie an, wie Sie mit dem Befehl ANDN Bit 21 in Register a löschen.
d) Geben Sie an, wie Sie mit einem NAND und einem AND-Befehl Bit Nr. 21 löschen.
Bits setzen
a) Welche Befehle verwendet man typischerweise um Bits zu setzen?
→-
-
SETL $7,7Elron 2- - Heret
SLU $71517,27← 0+00 .. . ⑨ 7 - nee
ANON 919,87
288 6 MMIX-Prozessor
T r) Nehmen Sie die gezeigte Speicherbelegung an und geben Sie hexadezimal alle 64
Bit des Registers 0 nach Ausführung der folgenden Befehle an:
LDB $0,$254,3:
LDB $0,$254,14:
LDBU $0,$254,15:
LDT $0,$254,14:
LDTU $0,$254,15:
-
0×000 -- - 034
or FF - . . FSA 9 oey FIT - m
-
0×00 -- a BC
@too . . 5678 SABC 5 I£707
-
Oreo - 56789A BC-
76 Steller
Oooo oooo 56789 ABC
6.5 MMIX Befehle 291
In folgendem Programmcode wird XXX XXXXXXXX als Platzhalter für einen einzelnen
Befehl verwendet:
LOC Data_SegmentGREG @
A OCTA #FFFF FFFF FFFF FFFFB TETRA #8765 4321
LOC #100Main LDTU $0,B
XXX XXXXXXXXTRAP 0,Halt,0
c) Geben Sie für das oben gezeigte Programm den Inhalt des 64 Bit breiten Wortes
an, welches durch die Marke A adressiert wird, wenn XXX XXXXXXXX durch folgende
Befehle ersetzt wird:
STB $0,A:
STTU $0,A:
STT $0,$254,6:
T d) Geben Sie für das oben gezeigte Programm den Inhalt des 64 Bit breiten Wortes
an, welches durch die Marke A adressiert wird, wenn XXX XXXXXXXX durch folgende
Befehle ersetzt wird:
STW $0,A:
STWU $0,A:
STT $0,A:
STO $0,A:
STB $0,$254,5:
STW $0,$254,1:
ST0 $0,$254,5:
→
#$254 A Hay-
→
÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷f:÷÷
:÷÷:::::*.
a t 4327 F F F F ..
. F
O x ooo a a a o o 8 7 65 4 I 27
$0 i ex e ooo ooo a 8765
4322g
6.5 MMIX Befehle 301
T e) Geben Sie den MMIX-Code an, der nachfolgenden C-Code implementiert:
C-Code: int a, b;
...
if(a > 0 && b < 0){
a = 1;}else if(a > 0 || b == 0){
a = 2;}else{
a = 3;}
MMIX-Code:€÷.
" " m
Bz , BP →
END
I' BNP a ,
LT
B NN B ,LT
SETL a ,7
Trip END↳ Bp a ,
L2
B Za ,
L2
IETL a,
3
s m p ENDL2 S ETL 912
END . . . -
u-
324 6 MMIX-Prozessor
T o) Geben Sie den Befehl an mit dem Sie für den Stack-Pointer ein globales Register
reservieren und dieses mit 0x4000 00000000 0000 initialisieren.
T p) Warum initialisieren wir den Stack-Pointer mit 0x4000 00000000 0000, d.h. mit
dem Beginn des Poolsegments, und nicht mit dem Ende des Datensegments?
T q) Geben Sie die MMIX-Befehle an, mit denen Sie Register $1 und $2 auf den Stack
schreiben und dann die Funktion fkt aufrufen. Nehmen Sie an, dass Ihr Code im
Namensraum Main: steht und fkt im Namensraum Fkt: unter dem Namen :fktangelegt wurde. Sichern Sie die Rücksprungadresse in Register 0.
→ - -
=⇒ so
SUB : SP, :S 10,2*8
STO $7 , :S PieSte $4 ISP , 7*8
Go $0 , ifkt
7.2 Pipelining-Konflikte 347
Nehmen Sie die folgenden Registerwerte an: $1 = 0x11, $2 = 0x22, $3 = 0x33, $254 =
0x2000000000000000
T f) Tragen Sie in nachfolgende Abbildung den Inhalt der Pipeline-Register für die unter
den Pipeline-Registern angegebenen Befehle ein. Geben Sie für alle irrelevanten
Einträge ‘‘X’’ an. Nehmen Sie an, dass von der ALU-benötigte und noch nicht in
den Registerblock geschriebene Ergebnisse über Forwarding-Pfade an das der
BD-Phase folgende Pipeline-Register geleitet werden.
Reg. Schr.:
Erg. Ausw.:
Sp. Schr.:
Zugr.-Art:
ALU:
Dir. Op.:
$X:
Dir. Op.:
$Y:
$Z:
X:
Reg. Schr.:
Erg. Ausw.:
Sp. Schr.:
Zugr.-Art:
$X:
Erg. ALU:
X:
Reg. Schr.:
Erg. Ausw.:
Lese-Daten:
X:
Erg. ALU:
0x05
SUB $1,$3,$2ADD $3,$254,0 OR $2,$2,36 AND $3,$2,28
1
1
0
X
1
1
0
X
1
1
ADD $3,$254,0
-
Code : AND -
:::÷. A0×770×22 Otoe
cxoe T
0×26 0×26 .
0×02
Direct -y oxen exoz 0×03
- - - - -
#
je5h13 :
Erg
AL
care een .
Ers Alu :
OR eero once 0×22 one 0070
co - a ennoIexzco
¥728"
0777 @ e
a ecooeee