1) if文の条件分岐へのコンパイル f, g, h, i, j は$s0, $s1, $s2, $s3, $s4
if ( i == j ) goto L1;
f = g + h ;
L1: f = f -i ;beq $s3, $s4, L1
add $s0, $s1, $s2
L1: sub $s0, $s0, $s3
2) if-then-else 文のコンパイル
if ( i == j ) f = g + h ; else f = g - h;
bne $s3, $s4, Else
add $ s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
Exit:
3)
変数の配列インデックスを伴うループのコンパイル
f, g, h, i, j は$s0, $s1, $s2, $s3, $s4
&A[0] は$s5と仮定する
Loop: g = g + A[i];
i = i + j ;
if ( i != h ) goto Loop;Loop: add $t1, $s3, $s3 # 2*i
add $t1, $t1, $t1 # 4*i
add $t1, $t1, $s5 # &A[i] => $t1
lw $t0, 0($t1) # A[i] => $t0
add $s1, $s1, $t0 # g = g + A[1]
add $s3, $s3, $s4 # i = i + j
bne $s3, $s2, Loop
4) While ループのコンパイル i, j, k は$s3, $s4, $s5、 &save[0] は$s6
While (save[i] == k)
i = i + j;Loop: add $t1, $s3, $s3 # 2*i
add $t1, $t1, $t1 # 4*i
add $t1, $t1, $s6 # &save[i]=> $t1
lw $t0, 0($t1)
bne $t0, $s5, Exit
add $s3, $s3, $s4 # i = i + j
j Loop #配布プリントでは抜けていたので追記した!
Exit:
宿題7 学籍番号 名前 日付 を書いて 提出すること!
上記アセンブラプログラム2)、4)に対するパイプライン処理を図示し、すべての命令が開始し実行を完了するまでのサイクル数はいくらか?ただし、教科書図4.14に示されている分岐予測を行う場合と行わない場合の2通りを検討せよ。分岐予測を用いる場合には分岐予測の2ビットレジスタの初期値を”11”と仮定せよ。
ただし、以下の条件を仮定する
1) データフォワーディングあり (したがって、データハザードは発生しない)
2) プログラム2)の bne 命令は not TAKEN
すなわち分岐せず、次の命令が実際には実行されるが、当然分岐予測回路などはそのようなことは知らない。
3) プログラム4)では whileループは4回のみ回るとする。
4) jによる制御ハザードは図4.11の改善状態を仮定する。
解答には 4枚の図面と、4つのサイクル数が必要。
以上