ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

PowerPC

In More DepthにPowerPCの特徴が書いてあったのでまとめました。PowerPCMIPSに近いアーキテクチャを持っています。一番の違い(The primary difference)は、2つの追加のアドレッシングモードと、いくつかの命令です。

Indexed Addressing と Update Addressing

PowerPCは、2つのレジスタの和をオペランドにすることができます。片方を配列の先頭(base)にし、もう片方をオフセット(index)として使います。これが indexed addressingと呼ばれます。

add $t0, $a0,$s3
lw $t1,0($t0)

MIPSの2命令が、PowerPCではこのような一命令で記述できます。

lw $t1,$a0+$s3

どちらも、$a0と$s3を足したアドレスにある値を、$t1に入れています。

配列にアクセスする場合、配列の順番にアクセス事が多いので、indexの部分を自動的にインクリメントする命令もあります。これが、update addressing と呼ばれます。

lwu $t1,$a0+$s3

この一命令で、$a0と$s3を足したアドレスにある値を$t1に入れ、$3を4増やしています。もう一度同じ命令をすると、配列の次のデータを取りに行きます。Cで言うところの、 x = *p++; に近い動きをします。Cでもポインタの型によって、増える値が違うように、PowerPCでもインクリメントする量によってlbzu、lhzu等の命令が用意されています。

特徴的な命令

load multiple and store multiple

32 wordまでのデータを、一命令でロード、ストア出来ます。レジスタの待避と復元を行うときに、コードサイズを小さくできます。

loops

デクリメントと条件分岐を1命令で記述できます。ループのパフォーマンスを上げます。

Loop:. . .
  addi $t0,$t0,.1 # $t0 = $t0 . 1
  bne $t0,$zero, Loop # if $t0 != 0 go to Loop

MIPSの2命令が、PowerPCではこのような一命令で記述できます。

  bc Loop,$ctr!=0 # $ctr = $ctr . 1;
          # if $ctr != 0 go to Loop