0
私たちのMIPS実装をFPGA上でテストするために、私はいくつかのアセンブラテストコードを書いています。私はコンパイル時にmips-linux-gnuを使っています。divu MIPS命令でのGNU ASの動作のばらつき
次のコードは、コードから条件beq $ t2、$ t1、label1が予想され、3が$ t1にロードされていることをテストすることです。
.set noreorder
.text
__start:
li $t1, 10
li $t2, 2
divu $t1, $t2
mflo $t2
li $t1, 5
beq $t2, $t1, label1
j label2
label1:
li $t1, 3
label2:
nop
私の問題は、GNU-として実行の異なる振る舞いで終わる上記のコードのための奇妙な出力を生成し、3は$ T1にロードされることはありません。
00000000 <__start>:
0: 2409000a addiu t1,zero,10
4: 240a0002 addiu t2,zero,2
8: 15400002 bnez t2,14 <__start+0x14>
c: 012a001b divu zero,t1,t2
10: 0007000d break 0x7
14: 00004812 mflo t1
18: 00005012 mflo t2
1c: 24090005 addiu t1,zero,5
20: 11490001 beq t2,t1,28 <label1>
24: 0800000b j 2c <label2>
00000028 <label1>:
28: 24090003 addiu t1,zero,3
0000002c <label2>:
2c: 00000000 sll zero,zero,0x0
.textセクションのdiassembly任意の助けを大幅に高く評価されています。
私の問題は、gccがdivu命令のために生成したコードを理解できないということです。 RISCのパイプラインの私の理解から、その人は常に実行されることです。しかし、なぜ生成されたコードがt1(mflo t1)のloの値をロードしていますか?私はt1が10として値を保持する必要があることを意味する... –
@AliAbdallah私は余分なmfloがそこで何をしているかわからない。コンパイラーがCPUバグを回避するために(例えば、除算のための時間を挿入するために遅延を挿入するために)、それを生成する可能性があります。あなたの文脈では、この余分な命令は、少なくとも現代のMIPS CPUでは役に立たず、無害です。しかし、これは実際の問題とは何の関係もありません。ブランチ遅延スロットをどのように処理しているかです。 –