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

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU レジスタの上位ビットをどうするか

<<   作成日時 : 2011/02/18 01:56   >>

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

 スケーラビリティを考えると、32bitレジスタ幅のアーキテクチャで作ったプログラムがそのまま64bitや128bitレジスタ幅のマシンで動くことが望ましい。もちろん、32bitモード/64bitモード/128bitモード/256bitモードの切り替えは必要となる。
 32bitレジスタ幅で作ったライブラリが良く出来ていて、値が取りうる範囲も32bit以内だとすると、これを上位のアーキテクチャで実行する場合、レジスタに使わない上位ビットがあまってしまうことになる。64bitアーキテクチャで32bitアーキテクチャ用のプログラムを動かすと、上位32bitは見えなくしなければならない。演算命令に支障がでるからだ。
 64bitのモードから32bitのモードで実行させ、また64bitのモードに戻った場合、マスクして使われなかった上位32bitは保存すべきか?
 68000であった事例だが、32bit幅のレジスタでアドレス幅が24bitだったので、あまりの上位8ビットを何かのモード指定に使っていたそうだ。しかし68000の後続シリーズではアドレス幅が増えてしまい、そのソフトは使えなくなってしまった。アドレスだけを指定すべき所に他の情報を入れたためこのようなことになったのだ。

 いくつか方法はある。(1)使われない上位bitはモード切替時にゼロクリアする。実際にゼロを書かなければならないので大変。(2)単純にマスクして、元のアーキテクチャに戻ったらそのまま見える。実装はマスクする程度で簡単。
(1)の場合、レジスタの内容を消去するのが大変。下位アーキテクチャで書き込みがあった場合は、使われない上位bitを0にしないといけない。また、レジスタについては上位アーキテクチャで保持していた値が下位アーキテクチャに切り替わると上位bitの情報が失われる。
(2)の場合、結果が32bitで戻っても上位bitの情報がそのまま残る。下位アーキテクチャの結果を使う場合には明示的にクリアしないといけない。
32bitアーキも256bitアーキを考慮して実装したいので、先程の68000のような問題は起こらないようにしたい。

 そこで、下位アーキテクチャでレジスタへの書き込み動作(ライフフラグが立つ)については、参照できない上位のbitをゼロクリアする。すでにゼロなら何もしなくてよい。実装では隠し状態ビットを持っておけばいいだろう。参照されるだけのレジスタは、参照されない上位のbitはマスクされるだけで、元の上位アーキテクチャに戻っても保持する。こうすれば下位アーキテクチャのライブラリの結果はそのまま利用できることになり、実装はレジスタの書き込み時のみ監視することになるので、下位アーキテクチャの呼び出しが頻繁に起きても速度低下は起きない。

実際には32bitアーキテクチャのライブラリがあったとしたら実行できるアドレス空間は4GBに制限されることになるが、これは別途考える。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(3件)

内 容 ニックネーム/日時
SPARC の場合、加減乗算・ビット演算は mode をまったく意識せずに使えて (32bit のつもりで使っているのであれば上位はごみ演算をしていることになるけれども支障がない)、条件レジスタが 32bit 解釈用と 64bit 解釈用に分かれてます(これが分かれていないと別命令にする必要が出る)。シフト演算や除算は上位桁のごみの影響が出るので、32bit 演算と 64bit 演算で別命令になっています。
32bit ロードストアの時は指定アドレスの上位32bit は mode によって無視されるのでこれは mode が意識されています。

x86 は、実質、bit幅ごとに命令が独立にあるようなものですね。
m.ukai
2011/02/23 10:00
算術演算はそのままの命令で、シフト命令はsll,sllxとありましたね。条件レジスタもccとxccがありました。元が32bitのプロセッサを64bitに拡張するための策だと思いますが、これだとさらに拡張するときにだんだんと余計な物が増えていきます。今回は256bitまでの拡張を考慮して最初からうまくできないかと検討しています。ARMなどは大変でしょう、元が32bitで最適化されてるのに64bit化しようとしているのですから。(調べないと)
bit数が大きい演算については上位はゴミ演算結果を残すべきか考え中です。というのも、実装の話ですが余った必要のないbitまで書き込みを行うとレジスタ書き換えのコスト(消費電力)がかかること、32bit/64bit演算ならそれ用の演算器が用意できれば演算速度が向上する可能性があること(特に乗算)が考えられるからです。
ロードストアについては、バイト/ワード…幅で個別に用意しているので問題ありません。ただ指定ロードストア幅がアーキテクチャのレジスタ幅を越えた場合、例外にするか無視でいいのか考えなければなりません、ご指摘で気づきました。

houmei
2011/02/23 12:06
ついでながら私の経歴など。マイコン小僧を経て6809を使えるようになり、68000に憧れ、就職後はプロプライエタリなオフコンのRISCチップ開発(といっても仕様が固まった後)、SPARC V8を使ったシステム、UltraSPARCを使ったシステム、そしてSPARC64IV(SPARC 64GP)の開発、次期機種の開発に携わりました。主にシステムシミュレーションとデバッグに関わっていましたのでSPARC V9のコードは読み書き出来ます。
houmei
2011/02/23 12:13

コメントする help

ニックネーム
本 文




ぼくのかんがえたさいきょうCPU レジスタの上位ビットをどうするか 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる