
[ このメッセージへの返事 ]
[ 返事を書く ]
[ home.html ]

投稿者:
68user @ oryo.inforyoma.or.jp on 97/9/22 03:08:41
In Reply to: つっこんでいいですか??
posted by BOK @ kyt007.osk.threewebnet.or.jp on 97/9/22 02:45:51
>> add ...
>> bne ...
>> とあると、bneの演算が終るまでaddのフェッチができない。これでは
>> パイプラインがストップしてしまう。そこで
> これ、違ってるような気がします。
あ、そうですね。
bneの演算が終るまでbneのジャンプ先の命令のフェッチができない、でした。
>> はどういうことでしょう。これはaddが実行されないような…
> おそらく、
> *手動で最適化して遅延スロットに命令が書いてあるのか
> *ただ単に、遅延を考慮するのを忘れて次の命令をつめて書いちゃったのか
> アセンブラが、判断できないためではないでしょうか。
> 命令の入れ替えを抑制する事ができればいいのですが。
ということは
>>> でも、普通に書いたら
>>> (snip!)
>>> と、認識されてしまった。いやはや、奥が深い。(^^;)
は、誤った(というか正常動作しない)コードが生成されてしまった、
ということですかね。
再確認をさせてください。
add ...
bne ...
と書くとアセンブラが自動的に遅延スロットを考慮して
bne ...
add ...
というコードを生成するのでしょうか。それとも最初から
bne ...
add ...
と書かなくてはならないのでしょうか?
あと、
>> GNU Assemblerは遅延分岐を考慮した記述が出来ないようです。
>> (アセンブラが分岐直前の命令を遅延スロットに入れてくれる)
> 最適化だめでした。遅延分岐関係では、
> 「分岐の後に有無を言わさず nop を突っ込む。」
> というオプションがあるだけです。
これは gas では、遅延スロットに関する最適化がうまくいかない。
Loop:
�晦晦�lw $9,0($21)�晦晦� # $9 = *p
�晦晦�addi $21,$21,4�晦� # $21 += sizeof(int)
�晦晦�bne $21,$20,Loop
�晦晦�add $8,$8,$9�晦晦� # h += $9
が最も最適化されたコードであるが gas は
Loop:
�晦晦�lw $9,0($21)�晦晦� # $9 = *p
�晦晦�addi $21,$21,4�晦� # $21 += sizeof(int)
�晦晦�add $8,$8,$9�晦晦� # h += $9 (分岐による遅延スロット)
�晦晦�bne $21,$20,Loop
nop
を生成するので1ループごとに1クロックのオーバーヘッドが
ある、ということでしょうか。

|