CPU実験D班 ISA (公開用)
 Share
The version of the browser you are using is no longer supported. Please upgrade to a supported browser.Dismiss

 
View only
 
 
Still loading...
ABCDEFGHIJKLMNOPQRSTUVWXYZAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZCACBCCCDCECFCGCHCICJCKCLCMCNCOCP
1
1stアーキテクチャ
2
命令メモリ: 32bit×2^17個
3
データメモリ: 32bit×2^19個
4
整数(汎用)レジスタ: 32個
5
浮動小数点数レジスタ: 32個
6
浮動小数点数比較結果レジスタ: 8個
7
命令セット
8
MIPS命令セットを参考にした。
9
命令引数意味313029282726252423222120191817161514131211109876543210
備考
10
addrd, rs, rtrd = rs + rt;000000rsrtrd100000
11
addirt, rs, Crt = rs + (signed)C;001000rsrtC
12
subrd, rs, rtrd = rs - rt;000000rsrtrd100010
13
andrd, rs, rtrd = rs & rt;000000rsrtrd100100
14
andirt, rs, Crt = rs & C;001100rsrtC
15
orrd, rs, rtrd = rs | rt;000000rsrtrd100101
16
orirt, rs, Crt = rs | C;001101rsrtC
17
norrd, rs, rtrd = ~ (rs | rt);000000rsrtrd100111
18
sllrd, rt, Crd = rt << C;000000rtrdC000000
19
srlrd, rt, Crd = rt >> C;000000rtrdC000010
論理シフト
20
sltrd, rs, rtrd = (rs <= rt);000000rsrtrd101010
21
sltirt, rs, Crt = (rs <= (signed)C);001010rsrtC
22
beqrs, rt, Cif (rs == rt) PC += (signed)C;000100rsrtC
23
bners, rt, Cif (rs != rt) PC += (signed)C;000101rsrtC
24
jCPC = C;000010C
25
jalCr31 = PC + 1; PC = C;000011C
26
jrrsPC = rs;000000rs001000
27
jalrrsr31 = PC + 1; PC = rs;000000rs001001
28
lwrt, C(rs)rt = mem[rs + (signed)C];100011rsrtC
29
luirt, Crt = C << 16;001111rtC
30
swrt, C(rs)mem[rs + (signed)C] = rt;101011rsrtC
31
inrtrtの下位8bitに受信(上位bitは変化なし)011010rt
32
outrtrtの下位8bitを送信011011rt
33
bt.scc, Cif (FPConditionCode[cc] == 1) PC += (signed)C;01000101000cc01C
34
bf.scc, Cif (FPConditionCode[cc] == 0) PC += (signed)C;01000101000cc00C
35
add.sfd, fs, ftfd = fs + ft;01000110000ftfsfd000000
36
sub.sfd, fs, ftfd = fs - ft;01000110000ftfsfd000001
37
mul.sfd, fs, ftfd = fs * ft;01000110000ftfsfd000010
38
div.sfd, fs, ftfd = fs / ft;01000110000ftfsfd000011
39
mov.sfd, ftfd = ft;01000110000ftfd000110
40
neg.sfd, ftfd = -ft;01000110000ftfd000111
41
abs.sfd, ftfd = |ft|;01000110000ftfd000101
42
sqrt.sfd, ftfd = sqrt(ft);01000110000ftfd000100
43
c.[eq|lt|le].scc, fs, ftFPConditionCode[cc] = (fs op(cond) ft);01000110000ftfscc11cond
eq: 0010, lt: 1100, le: 1110 op(eq)="=", op(lt)="<", op(le)="<="
44
lw.sft, C(rs)ft = mem[rs + (signed)C];110001rsftC
45
sw.sft, C(rs)mem[rs + (signed)C] = ft;111001rsftC
46
ftoirt, fsrt = int_of_float(fs);111000fsrt
47
itofft, rsft = float_of_int(rs);110000rsft
48
擬似命令引数変換先の命令
49
lart, L(ラベル)lui rt, L[31:16]; ori rt, rt, L[15:0]
50
51
2ndアーキテクチャ
52
命令メモリ: 32bit×2^14個
53
データメモリ: 32bit×2^17個
54
整数(汎用)レジスタ: 32個
55
浮動小数点数レジスタ: 32個
56
リターンアドレススタック: 16エントリ
57
並列実行のための拡張について
58
積算を並列計算するものである。
59
追加のレジスタ:
60
gc: グローバルカウンタ
61
gd: グローバル差分
62
プロセッサには、1コアを使う単一モードと複数コアを使う並列モードがあり、プログラムの実行開始時は単一モードである。
63
以下、単一モードで使われるコアを親コア、それ以外のコアを子コアと呼ぶ。
64
並列実行のための命令として、fork, next, acc, endの4つを追加した。forkは単一モード、next, acc, endは並列モードで使われる。
65
fork命令により単一モードから並列モードへ移行する。
66
この際、gc, gdに、fork命令の引数で指定された親コアの整数レジスタの値を格納する。また、親コアの整数、浮動小数点数レジスタの値を全て子コアのレジスタにコピーする。
67
並列モードでは、end命令により自コアの実行を終了する。全コアの実行が終了すると、単一モードに戻り、fork命令の次の命令から親コアの実行を再開する。
68
並列モードでは、next命令によりgcの値を取得することができる。この際、next命令が来る度にgcの値にgdが足し込まれる。
69
これにより、インデックス変数を変化させる形のループを並列に実行することができる。
70
(例えば、(for i=118; i>0; i-=2) f(i); のようなループに対しては、fork命令でgcに118、gdに-2を格納し、
71
並列モードでは各コアがnext命令で取得した値が0より大きければ f(i) を実行し、そうでなければend命令を呼べばよい。)
72
並列モードでの計算結果を親コアにまとめるためにacc命令がある。
73
acc命令では、第1引数に浮動小数点数レジスタの29〜31番のいずれか(f29-f31)、第2引数に浮動小数点数レジスタの0〜28番のいずれか(f0-f28)を指定する。
74
ここで、f29-f31は親コアのレジスタであり、f0-f28は自コアのレジスタである。
75
この命令により、第1引数のレジスタに第2引数のレジスタの値が足し込まれ、親コアに計算結果を集約することができる。
76
実装を簡単にするため、共有メモリは存在せず、各コアは独立したメモリを持つ。
77
ただし、単一モードでのストア命令(sw, swi, fsw, fswi)は全コアのデータメモリにストアを行い、並列モードでのストア命令は自コアのデータメモリにのみストアを行う。
78
命令セット
79
即値は基本的に符号付きとして扱う。青背景の命令は並列実行のための拡張である。
80
命令引数意味313029282726252423222120191817161514131211109876543210
備考
81
addr0, r1, r2r0 = r1 + r2;000000r0r1r2
82
addir0, r1, Cr0 = r1 + C;000001r0r1C
83
subr0, r1, r2r0 = r1 - r2;000010r0r2r1
84
nextr0r0 = gc; gc += gd;000011r0
85
sl2addr0, r1, r2r0 = (r1 << 2) + r2;000100r0r1r2
86
sl2addir0, r1, Cr0 = (r1 << 2) + C;000101r0r1C
87
movr0, r1r0 = r1;000110r0r1
88
movir0, Cr0 = C;000111r0C
89
faddf0, f1, f2f0 = f1 + f2;001000f0f1f2
90
fsubf0, f1, f2f0 = f1 - f2;001001f0f1f2
91
fmulf0, f1, f2f0 = f1 * f2;001010f0f1f2
92
fdivf0, f1, f2f0 = f1 / f2;001011f0f1f2
93
fmovf0, f1f0 = f1;001100f0f1
94
fnegf0, f1f0 = - f1;001101f0f1
95
fabsf0, f1f0 = abs(f1);001110f0f1
96
fsqrtf0, f1f0 = sqrt(f1);001111f0f1
97
lwr0, C(r1)r0 = mem[r1 + C];010000r0r1C
98
lwir0, Cr0 = mem[C];010001r0C
99
flwf0, C(r1)f0 = mem[r1 + C];010010f0r1C
100
flwif0, Cf0 = mem[C];010011f0C
Loading...
 
 
 
シート1