« 命令セットアーキテクチャを考える3 (特殊レジスタ) | トップページ | 命令セットアーキテクチャを考える5 (load/store系命令) »

2014/06/10

命令セットアーキテクチャを考える4 (命令コード)

だいぶん本題に近づいてきました。

[命令体系の基本構想]

・命令フォーマットは3オペランドフォーマット
 ・第1オペランドはレジスタ指定、ソース
 ・第2オペランドはレジスタまたは即値(10bit)、ソース
 ・第3オペランドはレジスタ指定、ディストネーション

・基本命令数は少ない(50命令程度)が、モード(データ長/SIMD/即値等)でバリエーションを持たせられるようにする
 ←ニーモニックコードが読みやすいはず

・多くのレジスタ本数とマルチデータ操作モードでベクトル演算に代える
 ・専用のベクトル演算命令/ベクトルレジスタは備えない

・積和演算命令は備えない(4オペランド必要になるので)

・条件付き命令は備えない(条件付き分岐のみ)

[アセンブラ命令ニーモニック]

opcode [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd : integer/bit演算系
opcode [v] [sp|dp|qp] Rs,{Rt|=imm},Rd : floting演算系
opcode [1|2|4|8|16] Rs[+],{Rt|=offset},Rd : load系
opcode [1|2|4|8|16] [-]Rs,{Rt|=offset},Rd : store系
opcode [pc] Rs,{Rt|=imm|=offset},Rd : branch/jump系


[v]
・SIMD命令の場合に指定(vector)
・省略するとscalar命令(単一データ処理)となる

[b|hw|w|dw]
・整数データのデータ長を指定(byte/half-word/word/double-word)
・省略するとwordとなる

[sp|dp|qp]
・浮動小数点データのデータ長を指定(single-precision/double-precision/quad-precision)
・省略するとsingle-precision

[1|2|4|8|16]
・レジスタ本数を指定(1/2/4/8 か 2/4/8/16 のどちらか)
・擬似命令でのみ指定可能

[pc]
・branch/jump系命令時、PC相対モード指定
・pcが指定されると、アドレス計算にPCの値が加算される

Rs[+] / [-]Rs
・ソースレジスタを指定(R0~R63,FR0~FR63)
・store系命令ではディストネーション
・load/store系命令では、+がつくとincrementモード、-がつくとdecrementモード
・decrementモードではアドレス計算前に減算される
・decrementモードはない

Rt
・ソースレジスタを指定(tはsの次という意味)
・increment/decrementはしない

=imm
・即値を指定(即値は第二オペランドでのみ(Rtの代わりに)可能)
・10進数はそのまま(-512~+511または0~1023)
・16進数は#000~#3ff
・2進数は%0000000000~%1111111111
・<<,>>で算術シフト/論理シフトも指定可能(算術シフトか論理シフトかは、命令によって異なる)

=offset
・load/store系命令で扱うアドレスのオフセット値を指定(第二オペランドでのみ(Rtの代わりに)可能)
・オフセット値は4の倍数である必要がある(4の倍数でない場合は、アセンブラエラーとなる)
・命令コードフォーマット中のimm領域に1/4した値がセットされる
・符号付き10進数(-2048~+2044)
・16進数は#000~#ffc
・<<,>>で算術シフトも指定可能

Rd
・ディストネーションレジスタを指定
・store系命令ではソース


ソースオペランドとディストネーションオペランドをどの順番で書くかということについては、いろいろと流儀があると思います。3オペランド形式だと、例えば加算命令の場合、
add R1,R2,R3 が、
R1 ← R2 + R3 の演算を指示するのか、それとも
R1 + R2 → R3 の演算を指示するのか、が代表的な書き方だと思います。

いま定義している命令セットアーキテクチャでは後者の方式をとりました。理由は、データの流れに沿っているような感じがするのと、日本語で「R1の内容とR2の内容を足してR3に格納する」という説明に合っていると思うからです。


[命令コードフォーマット]

bit[31:28] : Mode(1+1+2) :vector/PC相対/increment,imm/offset,データ長
bit[27:22] : OPcode(6)
bit[21:16] : Rs(6)
bit[15:6] : imm/offset(10) : imm/offsetとRtはどちらか一方
bit[11:6] : Rt(6)
bit[5:0] : Rd(6)

|

« 命令セットアーキテクチャを考える3 (特殊レジスタ) | トップページ | 命令セットアーキテクチャを考える5 (load/store系命令) »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 命令セットアーキテクチャを考える4 (命令コード):

« 命令セットアーキテクチャを考える3 (特殊レジスタ) | トップページ | 命令セットアーキテクチャを考える5 (load/store系命令) »