Re: い匹Δ召匹Δセ(^^;



[ このメッセージへの返事 ] [ 返事を書く ] [ 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クロックのオーバーヘッドが
ある、ということでしょうか。