竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU アドレッシング・モード

<<   作成日時 : 2009/07/30 23:28   >>

ブログ気持玉 0 / トラックバック 0 / コメント 4

 アドレスを指定する方法は色々あるが、ここでは代表的なRISCの単純なアドレッシング・モードを参考にまとめる。
複雑な間接アドレッシング(レジスタで参照したメモリの内容を使ってアドレスを指定、等)はやらない。
アドレスの参照は[]でくくって表現する。PCは現在のプログラムカウンタ、GRは汎用レジスタ、immは符号付き即値である。immの長さは決めていない。プリフィックス命令の追加で拡張することも考える。
プロセッサの下方展開(32ビット化など)をした場合は、MMUを持たない組み込み系への実装が考えられるので、コードがポジション・インディペンデントにできるよう定義したい。

・ベースレジスタ指定 [GRb+imm] , [GRb+GRx] GRbはベースレジスタ。GRxは変位レジスタ。2本のレジスタの和でアドレスを指定する。
例:
ST GR1,[GR15+GR2]

・ポストインクリメント、プリデクリメント [GRb+GRx]+ , -[GRb+GRx] 即値指定は出来ない。ポストインクリメントではロード/ストア完了後にGRxの値がロード/ストア命令で扱うレジスタのバイト数分増える。プリデクリメントではロード/ストア実行前にGRxの値がロード/ストア命令で扱うレジスタのバイト数分減る。メモリ上にスタックを作るときに便利。
例:
PUSH:
ST GR1,[GR15+GR2]+
...
POP:
LD -[GR15+GR2],GR1
...
GRbの値は変わらない。GRxにゼロレジスタGR0を指定した場合は例外か、別の命令に割り当てる。GRxは値が変わるので、レジスタのライフフラグが立つ。というより、元々立ってないといけないのだが。

・PC相対 [PC+imm] 分岐命令で使用。アセンブラでの省略表現はラベル名のみ記述。分岐命令で使用。
例:
BEQ NEXT
...
NEXT: ←分岐先

・PC相対+レジスタ [PC+GRx] PCに変位レジスタの値を加えたアドレス。
・PC相対+ポストインクリメント、プリデクリメント [PC+GRx]+ , -[PC+GRx] GRxが変化。
PC相対のフォーマットは、ベースレジスタGRbにゼロレジスタGR0を指定したもの。

・レジスタ直接 [GRb] サブルーチンから戻るジャンプ命令で指定。アセンブラでの省略表現はレジスタ名のみ記述。実際のフォーマットはGRx部分がゼロレジスタもしくは即値0。
例:
JMP GR16

意味のないフォーマットについては、別の命令を割り当てる(JMP PCなどは無限ループになる)。例えばフラッシュ命令やプリフェッチ、メモリバリアなど、ロード/ストアに関連する特殊な命令を押し込める。
絶対番地の即値での指定はなくした。いったんレジスタに即値セットかメモリからロードし、値を入れてから使用する。
命令フォーマットで使用するビット数を数えてみる。汎用レジスタは64本。
 GRb指定に6bit
 GRxのポストインクリメント/プリデクリメント/変化なし/即値指定に2ビット
 GRxの指定に6bitまたは即値の指定に6bit以上
 ロード/ストアのデスティネーション/ソース指定に6bit
 合計 20bit

 分岐命令は、PCを変えてしまう命令である。アドレッシングモードではGRbとGRxまたは即値との計算を行うが、これはロードストアユニットに実装される。分岐ユニットはこれらを使用しないようPC相対とレジスタ直接のみにする。
分岐命令はPCしか参照しないし、JMP命令はJump&Link命令の組み合わせでジャンプ元を保存するので、どのみちレジスタファイルにはアクセスすることになる。このとき参照のみで演算はしない。これがアドレッシングモードを分ける理由。

 例外発生について。以下が考えられる。
・アライメントエラー アドレス指定が4バイト境界にそろっていない。
・物理アドレス範囲オーバー 実装していないメモリ(I/O)領域にアクセスしようとした。
・論理アドレス範囲オーバー 論理アドレス空間の範囲を越えた。
・データTLBミス

 悩ましいのはプリフィックスを持った命令の途中にジャンプできること。トリッキーだが不可能ではない。検出も難しい。分岐先から1命令さかのぼってプリフィックスだったら例外にするか、
というのも、通常の命令キャッシュでは問題ないのだが、トレースキャッシュを実装した場合は命令をデコードした後にあるかたまりで保存して参照するので、命令の途中に分岐させるとうまくいかなさそうだ。
考えすぎかな。Pentium4ではどう対処してたのだろう。直前の命令がプリフィックス命令かどうかを調べたせいで命令TLBミスやアドレス範囲オーバーを発生させてもなんだし。動作未保証にしておくか。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(4件)

内 容 ニックネーム/日時
>意味のないフォーマットについては、別の命令を割り当てる(JMP PCなどは無限ループになる)

デコーダが複雑になりませんように。

jmp pc のような自己分岐もmulti-CPU環境では有用に使われたこともあります。他CPUとの待ち合わせのために無限ループにはまっておいて、待ち合わせ相手である他CPUから命令をnopに書き換えてループを抜け出す、という。今なら haltしてCPU間割込で再開でしょうが。


>分岐命令はPCしか参照しないし、JMP命令はJump&Link命令の組み合わせでジャンプ元を保存するので、どのみちレジスタファイルにはアクセスすることになる。このとき参照のみで演算はしない

call/jmpl命令で保存するPCは、サブルーチンリターン時の戻り先を確保のためなのはご承知の通りで、call/jmpl 実行もしくは ret 実行のいずれかで [PC+(call/jmplの)命令長] の計算をする必要があります。

CISCでは命令長が一定しないので call/jmpl 実行時に PC ではなく PC+命令長 を保存するのが普通ですが、RISCは命令長が固定なので例えばSPARCではサブルーチンリターン時に計算します(ret == jmpl %o7+8,%g0)。

ここはどう制御されるのでしょう?

m.ukai
2009/07/31 09:45
>悩ましいのはプリフィックスを持った命令の途中にジャンプできること。

CISC では普通にありえますが、そこで解釈できる通りに解釈実行するだけです。メモリが少なかったころは1バイトでも稼ぐために命令の途中への分岐はわりと使われていたと思います。

>Pentium4ではどう対処してたのだろう。

元のトレースキャッシュパケットは使わず(参照ミスになるだけ)、命令途中部分を始点として解釈する別のトレースキャッシュパケットが生成されるだけだと思います(キャッシュ効率が悪くなるだけ)。
m.ukai
2009/07/31 09:45
m.ukai様、参考になる意見ありがとうございます。

>>意味のないフォーマットについては、別の命令を割り当てる(JMP PCなどは無限ループになる)

> デコーダが複雑になりませんように。

マイコンでよくあるWAIT命令にしようと思っています。ご指摘のとおり他のプロセッサの割り込み待ちにしますが、マルチコアの場合ここで省電力待機指示をしてもいいかなと思っています。

デコーダは私の知っている例では論理合成で手修正が出来ないような組み合わせ回路を生成して使用していましたので楽観視しています。

>CISCでは命令長が一定しないので call/jmpl 実行時に PC >ではなく PC+命令長 を保存するのが普通ですが、RISCは>命令長が固定なので例えばSPARCではサブルーチンリター>ン時に計算します(ret == jmpl %o7+8,%g0)。

>ここはどう制御されるのでしょう?

 すっかり忘れてました。nPCを保存しなければなりません。割り込みでは次命令であるnPCの場合と、TLBミスのように例外発生命令をリトライするためPCに戻る場合がありますので、Jump&Linkの項目を考えるときに再検討させていただきます。

>SPARCではサブルーチンリターン時に計算します(ret == >jmpl %o7+8,%g0)。

これはディレイドスロットをスキップするために+8なわけですね。
houmei
2009/07/31 18:22
>CISC では普通にありえますが、そこで解釈できる通り解
>釈実行するだけです。メモリが少なかったころは1バイト>でも稼ぐために命令の途中への分岐はわりと使われていた
>と思います。

 余計な心配かもしれませんが、セキュリティホールにならないだろうかと思いました。心配しすぎですかね。「可能だけれども非推奨」でいきたいと思います。

>別のトレースキャッシュパケットが生成されるだけだと
>思います(キャッシュ効率が悪くなるだけ)。

ありがとうございます。勉強になりました。
houmei
2009/07/31 18:37

コメントする help

ニックネーム
URL(任意)
本 文




ぼくのかんがえたさいきょうCPU アドレッシング・モード 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる