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

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU タグ付き演算命令

<<   作成日時 : 2010/01/21 23:06   >>

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

 SPARC V8(V9も)にはTAG付き演算命令がある。タグが一致すると計算し、タグが不一致の場合はトラップが発生する。よくLISPなどに使われるなどと解説してあったが実例は見たことがなく、現在は非推奨命令となっている。
SPARCのTAG付き命令の問題点:
(1)TAGが2bitしかないこと。4パターンしか扱えない。
(2)演算が加算と減算しかなかったこと。
これではだれも使ってくれなかった。設計部隊がいやいや実装し、テストプログラム開発部隊がテストコードを書いたっきりでおしまいだったろう。

 今回はTAG付き演算命令を提案する。ただし全体に関わる修正が必要となるので(といっても命令フォーマットを1bit消費)提案のみである。
まず、TAG領域としてレジスタのMSB側8bitを使用する。残りのビットはこれまでと同様、演算に使われる。64bitレジスタならTAG部はR[63:56]で、データ部はR[55:0]だ。
TAGは8bitで256パターン(実際は254パターン)のデータタイプが扱える。演算はソース1,ソース2のTAG部の値が比較され、一致すればデスティネーションレジスタのTAG部には元のTAGの値がそのまま入る。異なっていればall'1'となる。TAG部が不一致であることを検出する命令が必要になる。また、SR.tagtrapの設定によりトラップを発生させることもできる。なおall'0'はnilだ。
各演算命令のニーモニックの先頭に"T"を付けるとタグ付き演算となる。ADDはTADDといった具合。このときレジスタ幅はTAGの幅8bitを引いた分になり、キャリーやオーバーフローなども判定する位置が8bit分右にずれる。TAG部はどの演算でも変化しない。こうすることにより、すべてのALU命令でTAGが使える。命令フォーマットではTAG演算の有無を示す1bitが必要となる。
しかも、前回説明した双方向キューと共存できる。キューは下位16bitを使用するからだ。そしてゼロレジスタは根源のnilとなる。

 とまあ検討の結果、実装はそう難しくなさそうなのだが、このアーキはどの方向に向かうのかわからなくなってしまいそうだ。LISPマシンか?オブジェクト指向か?そのあたりに詳しくないのでどう使ったらいいのかよくわからない。

 どなたか教えてください。お願いします。この問題には有効ッ!というのがあればきちんと定義したいと思います。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(1件)

タイトル (本文) ブログ名/日時
ぼくのかんがえたさいきょうCPU エンディアンとタグ付きデータの扱い
 高級言語サポートではタグによる属性を付けたデータを標準で扱えれば便利そうだ。ちょっと整理。 ...続きを見る
竹下世界塔の計算機よもやま話
2012/02/09 22:36

トラックバック用URL help


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

タイトル
本 文

コメント(3件)

内 容 ニックネーム/日時
tag付き演算は、(Lisp もそうですが) garbage collection を持つ処理系での管理フラグ(pointer か即値かの区別) になっています。
http://www.rubyist.net/~matz/20070711.html#p05

SPARC の tag-add が使いにくいのは、
* tag が 2bit 「も」ある
ruby などは 1bit tag 方式なので、使えない。事実上、CLISP 専用。
* tag 不一致が「例外」になる
処理系が trap を hook することが必須になりますが、OS-depend なことをしたくない(コンパイル済バイナリを添付するのに、trap を hook するドライバを別途付けないといけないナンセンスさ)

加算と減算しかないのは、当時は mul もなかったから (mulscc もあったかどうか) という時代背景のせいでしょう。
m.ukai
2010/01/25 11:40
解説ありがとうございます。
> * tag 不一致が「例外」になる
当時LISPマシンがあったので、SPARCによるLISPマシンの検討があったのかもしれません。LISPマシンにするなら自分でTAGトラップをハンドリングしても問題ないですから。

TAGですが上位8bitでなくレジスタ外に8bit付けるようにしようかと思いました。TAGはセットと比較しかないし、外部にすれば汎用レジスタの幅に影響を与えなくなるからです。当然リソースは増えるのでオプション扱いですが。
TAGについては「TAOのデータ型」を参考にしています。
http://www.nue.org/nue/tao/bitao/s002.html
houmei
2010/01/25 17:28
やっぱりTAGをレジスタ外につけるのはまずいですね。メモリに保存する時にTAG情報が失われてしまう。
houmei
2010/01/26 11:05

コメントする help

ニックネーム
本 文




ぼくのかんがえたさいきょうCPU タグ付き演算命令 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる