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

投稿者:
movem.l d0-d7/a0-a5,-(sp) @ h003.p066.iij4u.or.jp on 97/9/21 08:43:44
In Reply to: Re: 追加質問
posted by 68user @ oryo.inforyoma.or.jp on 97/9/21 06:57:13
> int *base_addr = malloc( ( size_t ) 2000 );
>
> for ( int h=0 , int *p=base_addr+100 ; p < base_addr+1000 ; p++ ){
> ��h += *p;
> }
>
> は、
>
> # $19 = base_addr
>
> �晦晦�add $8,$0,$0 �晦晦晦�# h = 0
> �晦晦�addi $20,$19,1000*4 ��# $19 = base_addr + 1000 * sizeof(int)
> Loop:
> �晦晦�lw $9,0($19)�晦晦� # $9 = base_addr + $19
> �晦晦�add $8,$8,$9�晦晦� # h += $9
> �晦晦�addi $19,$19,4�晦� # $19 += sizeof(int)
> �晦晦�bne $19,$20,Loop
>
> こんな感じになるんでしょうか?
>
大体良いと思います。(←よくわかっていないくせに)
ただ、for文の"*p=base_addr+100"はどこ?(^^;)
�晦晦�add $8,$0,$0 �晦晦晦�# h = 0
�晦晦�addi $20,$19,1000*4 ��# $20 = base_addr + 1000 * sizeof(int)
�晦晦�addi $21,$19,100*4 ��# $21 = base_addr + 100 * sizeof(int)
Loop:
�晦晦�lw $9,0($21)�晦晦� # $9 = *p
nop # 遅延スロットの為、$9を使った命令が実行できない
�晦晦�add $8,$8,$9�晦晦� # h += $9
�晦晦�addi $21,$21,4�晦� # $21 += sizeof(int)
�晦晦�bne $21,$20,Loop
こんなところですか?
nopに関してはアセンブラで勝手に入れてくれましたが、とりあえず書いておきます。
まあ、最適化するとこうなると思います。
Loop:
�晦晦�lw $9,0($21)�晦晦� # $9 = *p
�晦晦�addi $21,$21,4�晦� # $21 += sizeof(int)
�晦晦�add $8,$8,$9�晦晦� # h += $9
�晦晦�bne $21,$20,Loop
ぐっ、さらにこうなるらしい...。(アセンブラを通したらこうなった)
Loop:
�晦晦�lw $9,0($21)�晦晦� # $9 = *p
�晦晦�addi $21,$21,4�晦� # $21 += sizeof(int)
�晦晦�bne $21,$20,Loop
�晦晦�add $8,$8,$9�晦晦� # h += $9 (分岐による遅延スロット)
でも、普通に書いたら
�晦晦�bne $21,$20,Loop
nop
�晦晦�add $8,$8,$9�晦晦� # h += $9
と、認識されてしまった。いやはや、奥が深い。(^^;)
やはり、素直にコンパイラを使うべきでしょうね。
> ところで、
>
> > movem.l d0-d7/a0-a5,-(sp)
>
> こんな高機能な命令ってRISCでは普通は存在しないんですかね?
> 68000系でも疑似命令だったのかもしれないけど(よく知らない)
これは指定したレジスタを順番にPUSHしていくわけですが、一命例で複数回のメモリアクセスを行うというのは好ましくないでしょう(パイプラインの妨げになる?)。
68系は、1命令で処理します。(^^;)MC68000の場合は、8+n(指定したレジスタの数)x4クロックかかります。

- Re: ん? - 68user 97/9/21 14:08:25
- Re: ん? - movem.l d0-d7/a0-a5,-(sp) 97/9/21 22:09:09
|