ぼくのかんがえたさいきょうCPU 2018命令フォーマットメモ

 1バイト単位の可変長命令についてドバッと思いついたのをメモ。Wikiサービスを探して整理する予定。


8bit可変長命令フォーマット
命令列 := {CO|CO OP}*
CO := 0_xxxxxxx オペコード
OP := 1_xxxxxxx オペランド

CO := {CO1|CO2|CO3}
CO1 := 00_xxxxxx
CO2 := 010_xxxxx 1xdddddd
CO3 := 011_xxxxx 1xdddddd 1yyyyyy

OP := {C|R|RR|RC|RRC|CR|CRR|CRC|CRRC}
C := {11_xxxxxx}*
R := 10_xxxxxx

CO1 := {J1|A1|L1|M1}
J1 := 00_00_cond[3:0]
A1 := 00_01_alu[3:0]
L1 := 00_10_log[3:0]
M1 := 00_11_mmmm

CO2 := {J2|A2|L2|S2|R2}
J2 := 010_0_cond[3:0] 10_dddddd
A2 := 010_0_alu[3:0] 11_dddddd
L2 := 010_1_log[3:0] 10_dddddd
M2 := 010_1_mmmm 11_dddddd

S2 := 011_0_xxxx 10_dddddd (レーン操作命令)
R2 := 011_0_xxxx 11_dddddd (予備2バイト命令)


CO3 := {L3|M3} (予備3バイト命令)
L3 := 011_1_xxxx 10_dddddd 1_yyyyyyy
M3 := 011_1_xxxx 11_dddddd 1_yyyyyyy


S2 レーン操作命令 16種 必ずRd指定が入るので2バイト命令
NEWREG Rd,width ロード時も暗黙のうちに定義される レジスタ幅
 オペランド指定なしでRdの設定値を得る
NEWLANE Rd,lane,type レーンサイズと型
 オペランド指定なしでRdの設定値を得る
DOUBLE Rd PdとPeを結合し二倍のサイズのRdを得る 整数のみ
HALF Rd Pdの精度を半分にし、半分のサイズのRdを得る 浮動小数点のみ
UNPACK 2つのレジスタのレーンをまぜる
LSHUFFLE Rd,value レーンのシャッフル エンディアンと同じやり方
Ra/Rbから交互に選択するSHUFFLEはMIMD命令で可

メモリ操作命令 M1/M2

M1 := 00_11_wwws
M2 := 010_1_wwws 11_dddddd
www=1/2/4/8/16/32/64バイト 0のときはddddddレジスタorPdの幅に従う
s=1 ストア s=0 ロード

アドレッシングモード
LD1 C
LD1 R+C
LD1 Ra+Rb
LD1 Ra+Rb+C

ストア命令 Pdの値またはRdの値をメモリに書く
ロード命令 メモリから読み込んだ値をRdにまたはPdで次に渡す
アライメントエラーなし

オペランドなしM1命令 バリア指示 バリア命令は滞留ロードストアの数を返す
M1フォーマットのオペランドなし 16パターン
0000 ノーバリア
0001 SFENCE(WMB)
0010 LFENCE
0011 MFENCE(MB)
0100 ATMIC
… TRAPB

修飾子フォーマット エンディアン入れ換え指定

論理演算命令 L1/L2

L1/L2 0000 オペランドなし POPC
L1/L2 0001 オペランドなし CLZ
L1/L2 0010 オペランドなし CTZ

L C / Rd = Pd ◎ C
L R / Rd = Pd ◎ C
L RC / Rd = Ra ◎ C
L RR / Rd = Ra ◎ Rb

三項演算
L0000 RRR / Rd = Ra (Rb) Rc log[3:0]=0000のときのみ
L0000 RRC / Rd = Ra (Rb) C log[3:0]=0000のときのみ
L0001 RRR REPLACE Ra Rb pos Rc size
L0001 RRC REPLACE Ra Rb pos C size
L0010 RRR INSERT Ra Rb pos Rc size
L0010 RRC INSERT Ra Rb pos C size
L0011 RRR DEPOSIT Ra Rb pos Rc size
L0011 RRC DEPOSIT Ra Rb pos C size


論理演算の種類 4bit 16種 log[3:0]
_0000 AND A and B
_0001 OR A or B
_0010 XOR A xor B
_0011 SELA A
_0100 ANDN ~A and B
_0101 ORN ~A or B
_0110 ALL0 0
_0111 SELB B
_1000 NAND ~(A and B)
_1001 NOR ~(A or B)
_1010 NXOR ~(A xor B)
_1011 NSELA ~A
_1100 NANDN ~(~A and B)
_1101 NORN ~(~A or B)
_1110 ALL1 1
_1111 NSELB ~B

分岐命令 J1/J2

Rdはスキップ成立で1、非成立で0
その他のRdは分岐先アドレス/次命令アドレス
相対分岐の基準は次命令アドレス

J オペランドなし / スキップ
J C / 相対分岐C
J R / Raが示す番地へ分岐
J RR / Rb-Raの結果を判定しスキップ
J RRC / Rb-Raの結果を判定しCへ相対分岐
J RRR / Rb-Raの結果を判定しRcが示す番地へ分岐

J mRC0 / 相対分岐=0 mがトラップ番号のトラップハンドラ
J mRRC0 / Rb-Raの結果を判定しトラップ

分岐条件
http://keisanki.at.webry.info/201705/article_8.html

演算命令 A1/A2

単項演算(INC/DEC/ABS/NEG/RDST/REXT/THRU/0)
A オペランドなし

REXTはPd/Peを入れ替える
RDSTはPd/Peをそのまま伝搬

二項演算(ADD/SUB/MAX/MIN/MUL/MULU/DIV/DIVU)
A C / Rd = Pd ◎ C
A R / Rd = Pd ◎ Ra
A RC / Rd = Ra ◎ C
A RR / Rd = Ra ◎ Rb
A RRR / Rd = Ra(Rb)Rc ALU=000のとき ADD/SUB/MAX/MIN/Ra/Rc/1/0
A RRC / Rd = Ra(Rb)c ALU=000のとき

修飾子
m[3:0] 丸めモード

三項演算(MUL/MULU) ALU=10xのとき

A mRC / Rd = Pd×Ra±C
A mRR / Rd = Pd×Ra±Rb
A mRRR / Rd = Ra×Rb±Rc
A mRRC / Rd = Ra×Rb±C
m[5:4]
00 Ra×Rb+c
01 Ra×Rb-c
10 -Ra×Rb+c
11 -Ra×Rb-c

飽和演算?

ビット演算命令 B1/B2
LSR/ASR/LSL/ROL
LSRB/ASRB/LSLB/ROLB 修飾子で1/2/4/8…バイトシフトのマルチプライヤ
ZEXT/SEXT/SHUFFLE/EVAL

B オペランドなし(reserved)
B C / Rd = Pd◎C
B R / Rd = Pd◎Ra
B RC / Rd = Ra◎C
B RR / Rd = Ra◎Rb





ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック