公開日:2022/04/02
title.png

20th Season


#20-4 32ビットに拡張するゾ(付録)

 このページは、本HPで作成したオリジナル32ビットCPUコアNihoniumの命令セットマニュアルです。
 詳細については、以下リンクから本文を参照してください。

 本文へ戻る


Nihonium Instruction Set Manual

Nihonium CPUコア概要

 Nihoniumは、シンプルな32ビットCPUコアです。ハーバードアーキテクチャを採用しており、命令コードを16ビットフェッチバスから読み込んで実行します。同じく16ビットのメモリバスを通して、CPU外部のRAMやI/Oユニット(メモリマップドI/O)などのリソースにアクセスすることが出来ます。
 フェッチバスは16ビットアドレスバスを持っており、従ってプログラムメモリ空間は最大64Kバイトです。
 メモリバスは32ビットアドレスバスを持っているため、データメモリ空間は最大4Gバイトです。
 命令コードは基本的に16ビット固定長で、フェッチバス上の16ビットワード境界に乗っていることを前提とします。言い換えると、常に偶数バイトアドレスから16ビット命令コードが配置されています。一部、16/32ビット即値を取る命令などに2〜3ワードの多ワード長命令が存在します。
 プログラムカウンタpcはリセット信号で0x0000に初期化されるので、Nihoniumリセット解除後、常に0x0000番地の命令から実行を開始します。

 Nihoniumは、状態レジスタsrのNHビットによって、汎用レジスタと演算器(ALU)のビット幅を16/32ビットから選択して使用することができます。
 リセット解除後のデフォルトではNH=0となっており、Nihoniumは16ビットモードで動作しています。NH=0の16ビットモードでは、オリジナル16ビットCPUコアMoscoviumとオブジェクトコードレベルの後方互換性を保っています。
 SrレジスタのNH=1にセットすることで、32ビットモードで実行することができます。32ビットに拡張された汎用レジスタと演算器(ALU)を使って高速処理が可能です。

Moscoviumシリーズ

 Moscoviumシリーズは、オリジナル16ビットCPUコアであるMoscoviumを起点とする、スケーラブルなCPUコアシリーズです。詳しくは、こちらをご参照ください。

プログラマモデル

 Nihonium(NH=1)のプログラマモデルは以下図の通りです。

a205_prgmdl.png

※SrレジスタのNHビット=0設定時のプログラマモデルはMoscoviumと同じです。

 汎用レジスタ8本(r0〜r7)と、状態レジスタsr、プログラムカウンタpc、スタックポインタsp、割り込みベクタiv、一時レジスタtrの構成です。すべてのレジスタはリセット解除後、0x0000に初期化されています。汎用レジスタ8本には2組の汎用レジスタバンクが有って、Srレジスタの設定ビット(B0)にて、切り替えて使用することが可能です。

制御レジスタ

 Srは状態レジスタです。演算結果を示すフラグビット(N,C,V,Z)等、CPUの状態を示すビットを備えています。以下、Moscoviumと異なるビットに関して説明します。その他のビットはMoscoviumと同じなので、こちらの説明をご覧ください。

  状態ビット:


 Pcはプログラムカウンタです。Moscoviumと同じなので、こちらの説明をご覧ください。

 Spはスタックポインタです。Nihoniumでは、Spは32ビットに拡張されています。それ以外はMoscoviumと同じなので、こちらの説明をご覧ください。

 Ivは割り込みベクタです。Moscoviumと同じなので、こちらの説明をご覧ください。

 Trは一時レジスタです。Nihoniumでは、Trは32ビットに拡張されています。Nihoniumの一時レジスタtrは、基本的にCPUリソースとして、ユーザ使用を制限します。

ベクタ割り込み方式

 Moscoviumと同じなので、こちらの説明をご覧ください。

単精度浮動小数演算ユニット(Single precision FPU)

 コンパイルオプション単精度浮動小数演算ユニット(Single precision FPU、以下S-FPUと記す)を選択すると、単精度浮動小数演算を実行する命令が使用可能となります。
 単精度浮動小数(IEEE 754 binary32)は、C言語で一般的に適用されているfloat型(32ビット)の浮動小数表現です。

 float型のバイナリデータは以下図のような形式となっています。

244_float.png

 符号(Sx)1ビット、指数(Ex’)8ビット、仮数(Fx’)23ビットの計32ビットです(↓)。

  float型X=(−1)Sx×0x1.<Fx’>×2Ex’−127

 32ビットCPUであるNihoniumにとって、非常に扱い易いサイズの浮動小数値です。Nihoniumの汎用レジスタ(32ビット)をそのまま浮動小数レジスタに転用して、レジスタ間の演算を実行するコプロセッサがSingle precision FPU(S-FPU)であり、コンパイルオプションで有り/無しを選択できるようになっています。

 float型で表現可能な数値は、−3.4028235e+38〜+3.4028235e+38、±INF(無限大)、±0、NaN(非数)となっていて、IEEE754に規定されている非正規化数は、全て0と見なして演算します。

 仮数Fxの有効ビット数が23ビットなので、10進数換算ではlog10(223)≒6.924と、有効数字7桁弱ほどです。

※尚、複数パタンの表現が可能なNaNや、未対応の非正規化数が入力された場合、各々NaN(0xffc0_0000)とゼロへ縮退して処理します。


 その他の有益な情報を以下にまとめておきます。

  非有限値との演算:


  大小比較:

  FPUのコンパイルオプション:

命令コード

 Moscoviumと同じなので、こちらの説明をご覧ください。

命令セット一覧

 以下に命令セットの形式順で命令セット一覧表を示します。
 リンク先では、NH=1設定時の動作について記載しています。NH=0の動作はMoscoviumと同じですので、「Moscovium命令セットマニュアル」をご覧ください。

No. Inst Opr1 Opr2 Type Memo O15
(1b)
RiBr
(4b)
RR
(5b)
R
(3b)
NO
(11b)
1 nop NO no operation 0 0 0
2 pause NO pause until interrupt request coming 0 0 1
3 rtnw NO return from jalw 0 0 2
4 rti NO return from interrupt 0 0 3
5 link imm16 NO link and allocate 0 0 8
6 unlk NO unlink and free 0 0 9
7 brn NO branch never 0 0 10
8 rtnl NO return from jall 0 0 11
9 bra dsp11 (always) BR branch always 0 1
10 bne dsp11 (Z=0) BR branch if not equal 0 2
11 beq dsp11 (Z=1) BR branch if equal 0 3
12 bcc dsp11 (C=0) BR branch if carry clear 0 4
13 blo dsp11 (C=0) BR branch if lower (unsigned) 0 4
14 bcs dsp11 (C=1) BR branch if carry set 0 5
15 bhs dsp11 (C=1) BR branch if higher or same (unsigned) 0 5
16 bpl dsp11 (N=0) BR branch if plus or zero 0 6
17 bmi dsp11 (N=1) BR branch if minus 0 7
18 bvc dsp11 (V=0) BR branch if overflow clear 0 8
19 bvs dsp11 (V=1) BR branch if overflow set 0 9
20 bge dsp11 (N^V=0) BR branch if greater or equal (signed) 0 10
21 blt dsp11 (N^V=1) BR branch if less than (signed) 0 11
22 fadd Rd Rs RR float add 0 14 0
23 fsub Rd Rs RR float subtract 0 14 1
24 fmul Rd Rs RR float multiply 0 14 2
25 fdiv Rd Rs RR float divide 0 14 3
26 fneg Rd Rs RR float negate sign 0 14 4
27 fsngl Rd Rs RR cast uint32 to float 0 14 5
28 fuint Rd Rs RR cast float to uint32 0 14 6
29 ffrac Rd Rs RR float obtain fraction 0 14 7
30 fmvsg Rd Rs RR float move sign bit 0 14 8
31 fsat Rd Rs RR float saturate infinite number 0 14 9
32 fcmp Rd Rs RR float compare 0 14 10
33 fdown Rd Rs RR float round down to zero 0 14 11
34 hadd Rd Rs RR half add 0 14 0
35 hsub Rd Rs RR half subtract 0 14 1
36 hmul Rd Rs RR half multiply 0 14 2
37 hdiv Rd Rs RR half divide 0 14 3
38 hneg Rd Rs RR half negate sign 0 14 4
39 hhalf Rd Rs RR cast uint16 to half 0 14 5
40 huint Rd Rs RR cast half to uint16 0 14 6
41 hfrac Rd Rs RR half obtain fraction 0 14 7
42 hmvsg Rd Rs RR half move sign bit 0 14 8
43 hsat Rd Rs RR half saturate infinite number 0 14 9
44 hcmp Rd Rs RR half compare 0 14 10
45 hdown Rd Rs RR half round down to zero 0 14 11
46 mulur Rd Rs RR multiply unsigned reversal 0 14 16
47 mulsr Rd Rs RR multiply signed reversal 0 14 17
48 divur Rd Rs RR divide unsigned reversal 0 14 18
49 divsr Rd Rs RR divide signed reversal 0 14 19
50 csft Rd Rs RR rotate shift with c flag 0 14 23
51 ldl Rd Rs RR load data long word 0 14 24
52 stl Rd Rs RR store data long word 0 14 25
53 ldlsp Rd Rs RR load data long word sp relative 0 14 26
54 stlsp Rd Rs RR store data long word sp relative 0 14 27
55 ldbx Rd Rs RR load data byte extended address 0 14 28 - -
56 stbx Rd Rs RR store data byte extended address 0 14 29 - -
57 ldwx Rd Rs RR load data word extended address 0 14 30 - -
58 stwx Rd Rs RR store data word extended address 0 14 31 - -
59 or Rd Rs RR bitwise or 0 15 0
60 and Rd Rs RR bitwise and 0 15 1
61 eor Rd Rs RR bitwise exclusive or 0 15 2
62 mov Rd Rs RR move 0 15 3
63 movtc Rc Rs RR move to control register 0 15 4
64 movfc Rd Rc RR move from control register 0 15 5
65 add Rd Rs RR add 0 15 6
66 adc Rd Rs RR add with carry 0 15 7
67 sub Rd Rs RR subtract 0 15 8
68 sbb Rd Rs RR subtract with borrow 0 15 9
69 cmp Rd Rs RR compare 0 15 10
70 cmb Rd Rs RR compare with borrow 0 15 11
71 ldb Rd Rs RR load data byte 0 15 12
72 stb Rd Rs RR store data byte 0 15 13
73 ldw Rd Rs RR load data word 0 15 14
74 stw Rd Rs RR store data word 0 15 15
75 lsft Rd Rn RR logical shift 0 15 16
76 asft Rd Rn RR arithmetical shift 0 15 17
77 ldwsp Rd Rn RR load data word sp relative 0 15 18
78 stwsp Rn Rd RR store data word sp relative 0 15 19
79 mulu Rd Rs RR multiply unsigned 0 15 20
80 muls Rd Rs RR multiply signed 0 15 21
81 divu Rd Rs RR divide unsigned 0 15 22
82 divs Rd Rs RR divide signed 0 15 23
83 sbbz Rd R subtract zero with borrow 0 15 28 0
84 cmbz Rd R compare zero with borrow 0 15 28 1
85 ldli Rd imm32 R load data long word immediate 0 15 29 0
86 cendl Rd R convert endian long word 0 15 29 1
87 pushl Rs R push register long word on stack 0 15 29 2
88 popl Rd R pop register long word from stack 0 15 29 3
89 pushcl Rc R push control register long word on stack 0 15 29 4
90 popcl Rc R pop control register long word from stack 0 15 29 5
91 adcz Rd R add zero with carry 0 15 29 6
92 jall Rn R jump and link long word stack 0 15 29 7
93 jmp Rn R jump 0 15 30 0
94 jalw Rn R jump and link word stack 0 15 30 1
95 sesrl imm3 R set sr low byte 0 15 30 2
96 sesrh imm3 R set sr high byte 0 15 30 3
97 clsrl imm3 R clear sr low byte 0 15 30 4
98 clsrh imm3 R clear sr high byte 0 15 30 5
99 exsgl Rd R extend sign bit long word 0 15 30 6
100 exzrl Rd R extend zero bit long word 0 15 30 7
101 neg Rd R negate sign 0 15 31 0
102 not Rd R bitwise not 0 15 31 1
103 cendw Rd R convert endian word 0 15 31 2
104 exsgw Rd R extend sign bit word 0 15 31 3
105 pushw Rs R push register word on stack 0 15 31 4
106 popw Rd R pop register word from stack 0 15 31 5
107 pushcw Rc R push control register word on stack 0 15 31 6
108 popcw Rc R pop control register word from stack 0 15 31 7
109 ori Rd imm8 RI bitwise or immediate 1 0
110 andi Rd imm8 RI bitwise and immediate 1 1
111 eori Rd imm8 RI bitwise exclusive or immediate 1 2
112 addi Rd imm8 RI add immediate 1 3
113 subi Rd imm8 RI subtract immediate 1 4
114 cmpi Rd imm8 RI compare immediate 1 5
115 ldbiu Rd imm8 RI load data immediate unsigned byte 1 6
116 ldbil Rd imm8 RI load data immediate low byte 1 7
117 ldbih Rd imm8 RI load data immediate high byte 1 8
118 ldcl Rc imm8 RI load data immediate control register low byte 1 9
119 ldch Rc imm8 RI load data immediate control register high byte 1 10
120 lsfti Rd imm8 RI logical shift immediate 1 11
121 asfti Rd imm8 RI arithmetical shift immediate 1 12
122 csfti Rd imm8 RI rotate shift with c flag immediate 1 13

命令セット

 各命令をアルファベット昇順で説明します。
 以下すべて、NH=1設定時の動作について記載しています。NH=0の動作はMoscoviumと同じですので、「Moscovium命令セットマニュアル」をご覧ください。

 Moscoviumで定義されていてNihoniumでは未定義な命令を、以下にまとめておきます。

adc (add with carry)

adcz (add zero with carry)

add (add)

addi (add immediate)

and (bitwise and)

andi (bitwise and immediate)

asft (arithmetical shift)

asfti (arithmetical shift immediate)

bcc (branch if carry clear)

bcs (branch if carry set)

beq (branch if equal)

bge (branch if greater or equal;signed)

bhs (branch if higher or same;unsigned)

blo (branch if lower;unsigned)

blt (branch if less than;signed)

bmi (branch if minus)

bne (branch if not equal)

bpl (branch if plus or zero)

bra (branch always)

brn (branch never)

bvc (branch if overflow clear)

bvs (branch if overflow set)

cendl (convert endian long word)

cendw (convert endian word)

clsrh (clear sr high byte's bit)

clsrl (clear sr low byte's bit)

cmb (compare with borrow)

cmbz (compare zero with borrow)

cmp (compare)

cmpi (compare immediate)

csft (rotate shift with c flag)

csfti (rotate shift with c flag immediate)

divs (divide signed)

divsr (divide signed reversal)

divu (divide unsigned)

divur (divide unsigned reversal)

eor (bitwise exclusive or)

eori (bitwise exclusive or immediate)

exsgl (extend sign bit long word)

exsgw (extend sign bit word)

exzrl (extend zero bit long word)

fadd (float add)

fcmp (float compare)

fdiv (float divide)

fdown (float round down to zero)

ffrac (float obtain fraction)

fsngl (cast uint32 to float)

fmul (float multiply)

fmvsg (float move sign bit)

fneg (float negate sign)

fsat (float saturate infinite number)

fsub (float subtract)

fuint (cast float to uint32)

hadd (half add)

hcmp (half compare)

hdiv (half divide)

hdown (half round down to zero)new

hfrac (half obtain fraction)

hhalf (cast uint16 to half)

hmul (half multiply)

hmvsg (half move sign bit)

hneg (half negate sign)

hsat (half saturate infinite number)

hsub (half subtract)

huint (cast half to uint16)

jall (jump and link long word stack)

jalw (jump and link word stack)

jmp (jump)

ldb (load data byte)

ldbx (load data byte extended address)

ldbih (load data immediate high byte)

ldbil (load data immediate low byte)

ldbiu (load data immediate unsigned byte)

ldch (load data immediate control register high byte)

ldcl (load data immediate control register low byte)

ldl (load data long word)

ldli (load data long word immediate)

ldlsp (load data long word sp relative)

ldw (load data word)

ldwsp (load data word sp relative)

ldwx (load data word extended address)

link (link and allocate)

lsft (logical shift)

lsfti (logical shift immediate)

mov (move)

movfc (move from control register)

movtc (move to control register)

muls (multiply signed)

mulsr (multiply signed reversal)

mulu (multiply unsigned)

mulur (multiply unsigned reversal)

neg (negate sign)

nop (no operation)

not (bitwise not)

or (bitwise or)

ori (bitwise or immediate)

pause (pause until interrupt request coming)

popcl (pop control register long word from stack)

popcw (pop control register word from stack)

popl (pop register long word from stack)

popw (pop register word from stack)

pushcl (push control register long word on stack)

pushcw (push control register word on stack)

pushl (push register long word on stack)

pushw (push register word on stack)

rti (return from interrupt)

rtnl (return from jall)

rtnw (return from jalw)

sbb (subtract with borrow)

sbbz (subtract zero with borrow)

sesrh (set sr high byte's bit)

sesrl (set sr low byte's bit)

stb (store data byte)

stbx (store data byte extended address)

stl (store data long word)

stlsp (store data long word sp relative)

stw (store data word)

stwsp (store data word sp relative)

stwx (store data word extended address)

sub (subtract)

subi (subtract immediate)

unlk (unlink and free)

アセンブラ

 アセンブラの入手方法、文法などについて記載されたマニュアルはこちらをご参照ください。

改訂履歴

日付 項目 備考
2024/08/31 新規命令 hdown命令を追加した。
2023/07/01 新規命令 adcz命令sbbz命令cmbz命令を追加した。
2023/05/20 新規命令 divur命令divsr命令mulur命令mulsr命令を追加した。
2023/03/18 新規命令 ロングワードスタック命令を追加した。
 jall命令rtnl命令pushcl命令popcl命令
2023/03/11 32ビットバス対応 メモリバスを32ビットに拡張した。
2023/02/11 S-FPU命令 Single precision FPU命令を追加した。
2022/10/22 割り込み機能の強化 割り込み許可レベルSr[IE1,IE0]を拡張した。
割り込みベクタivのVEビットを追加した。
2022/06/04 新規命令 回転シフト演算命令(csft命令csfti命令)を追加した。
2022/05/21 スーパスケイラ版Nihonium-SS 追記。
2022/04/02 Nihonium命令セットマニュアル 作成。

btn_arduino.png btn_moscovium.png

home