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

アクセスカウンタ

zoom RSS ゼロレジスタは必須か?

<<   作成日時 : 2010/10/14 06:46   >>

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

 PowerPCを調べていたら、あれ、ゼロレジスタがない。r0〜r31まで汎用レジスタとして使える。ただし例外があって、特定の命令ではr0を指定した時にその値をゼロとみなすことがある。なぜそうするかなあ。また、IA-64はゼロレジスタを持っているが読み出しのみ可で書き込むとトラップが発生する。書き込み時無視にしておけば特定番地(I/O)のダミーリードに便利なのになぜそうするかなあ。
 初期のRISCであるMIPS,SPARCではゼロレジスタがあり、RISCの特徴のひとつでもあった。レジスタ同士の演算で片方のオペランドが常にゼロだと便利な場合があり、事前に内容がゼロのレジスタを準備する必要もなく、依存関係も発生しない。これによりただでさえ長くなりがちな命令列の長さも短くでき、効率よく実行できる。よけいな作業用レジスタも消費しない。当時32bit幅のレジスタに1つの命令で即値を設定できなかったこともあるだろう。(例:SPARCはsethi命令とor命令を組み合わせて使う。64bit即値はさらに面倒)
 さてゼロレジスタをどうしようか?プログラムの冒頭で xor GRx,GRx,GR0 とか即値設定の命令でゼロクリアしておき、汎用なのにゼロレジスタ扱いを推奨する。ダミーリードなど値が不要な場合は最低で64本もある汎用レジスタのどれかを使う。こうすれば汎用レジスタの対称性が保たれる。実装を考えるとほんのわずかばかり楽になる。ゼロレジスタのための回路を扱わなくていいからだ。
ということで、ゼロレジスタは実装しないことにする。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(5件)

内 容 ニックネーム/日時
ソースオペランドとしては、概ねあらかじめ準備するかどうかだけの問題ですが、

ディスティネーションとしてのゼロレジスタがない場合は、命令セットに対する考慮、少なくとも別途 compare 命令が必要になるでしょう(== cond レジスタだけを更新する命令)。SPARCの場合、subcc %r1, %r2, %g0 で比較命令を実現していますが、%g0 がない場合、何か破壊可能なレジスタを用意しないといけません。(なお、IA-64 も POWER も cmp 命令があります)。SPARC の場合は NOP が SETHI 0,%g0 の alias とか、ほかにも %g0 の存在を前提とした命令セットになっていますね。

ディスティネーション %g0 方式の場合、ld [addr],%g0 みたいな事実上使われない命令ワードがいっぱいあって非効率、というのがあるので、淘汰されてきているんでしょうねぇ。
m.ukai
2010/10/14 11:56
m.ukai様、お久しぶりです。
コンペア命令までは考慮していませんでした。ゼロレジスタの結果を捨てるのに好都合な例ですね。
コンペア命令は分岐命令の改変時に追加することにしたので(偶然)大丈夫です。
houmei
2010/10/14 12:46
はじめまして nminoru といいます。

IA-64 で r0 が書き込めないのは、NaT ビットがあることが理由の一つだと思います。
IA-64 の汎用レジスタ幅は 64 ビットですが、実際はそれに 1 ビットおまけの NaT ビットがついており実質 65 ビットになっています。
投機ロード命令(ld?.s)に読み込んだレジスタの内容は投機チェック命令(chk.s)でチェックを受けるまで 1 が立っています。そのため r0 が書き込みを無視できるとしても、r0 の NaT ビットも書き込みを無視できるるようにするかは悩ましいと思います。

ld8.s r0 = [addr]

で NaT ビットが無視されるとチェック上困りますし、逆に NaT ビットだけ読み書き可能という仕様も変です。


もう一つ EPIC の IA-64 は、命令グループ内のレジスタ関係に WAW(Write After Write) や RAW (Read After Write) の依存を認めず、もしそのようなレジスタ依存関係の違反があった場合動作は「未定義」となっています。もし r0 を書き込み可能にすると、以下のような後続の r0 レジスタとの間に RAW の依存ができます。

ld8 r0=[address1]
cmp.eq p9,p8=r0,r9

r0 は頻繁に参照するので特別に RAW は認めたいところですが、Itanium2 チップの場合はレジスタ依存関係違反はフロントエンドで検出して例外をあげる実装になっています。r0 の特例を認めるとロジックが複雑になりそうです。


いろいろ書きましたが、IA-64 はそもそも 127 本も汎用レジスタがありますので、r0 を使わなくてもダミーレジスタに不足はないですね (^_^;
nminoru
2010/10/14 23:43
PowerPC が r0 を特別扱いするのは、汎用機(System/360)からの由来だと思います。
# 私が直接知っているのは Sysmte/370 以降で、S/360 の仕様書は未見ですが。

S/360 やその後継機もゼロレジスタはないのですが、メモリオペランドの指定に R0 を指定するとそれを 0 と解釈するはずです。これは論理アドレスの 0 ページ目に容易にアクセスするためでした。S/360 は元々物理メモリの先頭 512 バイトにプロセッサの割り込み情報などが存在します。R0 を使うとこの領域に簡単にアクセスできます。

またオフセット値を指定することで 0〜4095 までアクセス可能なので、プロセッサ固有域に続くメモリ領域が、アドレスをレジスタにプリセットしなくてもアクセス可能な便利なデータ置き場」として使われたそうです。
nminoru
2010/10/15 00:48
nminoru様、はじめまして。IA-64とPowerPCに関する情報、ありがとうございました。
後になってしまったと思ったのですが、SPARCでいうASI空間はアドレスによって機能が決まっています。だいたい下位アドレスにかたまっているので
sta %ra,[%r0+imm],%rb
とやりたい、しかしゼロレジスタがなければ%r0を事前にクリアしなければならないということになります。これはちょっと困った。考えてみます。
houmei
2010/10/15 03:00

コメントする help

ニックネーム
本 文




ゼロレジスタは必須か? 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる