差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

wiki:mist32 [2014/12/20 20:42] (現在)
ライン 1: ライン 1:
 +======MIST32アーキテクチャ======
  
 +
 +
 +このページは現在更新していません。最新版は[[http://​open-arch.org/​hardware/​mist32|Open Design Computer Project - MIST32]]をご覧ください。
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +MIST32はアウトオブオーダ実行を行うことを前提としたプロセッサアーキテクチャです。命令セットレベルでアウトオブオーダ実行に必要となるハードウェアを極力小さくできるように配慮し、命令レベルの並列化を低消費電力で実現しようとするアーキテクチャです。主な特徴としてはwith Flag命令の廃止や、CC(Condition Code)の採用、独自のAFE(After Execution Expansion)を搭載します。
 +
 +
 +この命令セットは[[MIST1032SA]]の開発とともに拡張・変更しています。よって、ここに書かれた情報はまだほぼ決定事項ではありますが、変更する可能性があります。
 +
 +MIST32アーキテクチャについての構想や検討については[[MIST32開発履歴]]をご覧ください。
 +
 +======With Flag命令の廃止======
 +MIST32アーキテクチャでは基本的に従来のプロセッサで存在するADDCなどの、1つ前のフラグを参照する命令は廃止しています。これにより、アウトオブオーダー実行において使用する、リザベーションステーションの待ち受け数を最低限に減らすことが可能となります。待ち受けや依存性解析は非常に大きなハードウェアを必要とするため、低消費電力で動作させるためには待ち受けユニットを減らすことが必要です。なお、条件ブランチ命令などは、条件判定のために1つ前の命令のフラグを参照できるようになっています。
 +
 +
 +このような仕組みをとることにより、組み込みで使用する場合、若干の性能低下が起こる可能性があります。しかしながら、このMIST32はモバイル端末~コンピュータなどの、オペレーティングシステムが搭載されることを前提としているアーキテクチャなので、With Flag命令の仕様は極端に少ないという考えを元にしています。その根拠としては、CまたはC++言語において、通常変数がオーバーフローしたことは無視されるという点にあります。たとえばLinuxカーネル(x86)において、非With Flag命令であるADDと、With Flag命令であるADCの出現率は1/​180程であるため,With Flag命令を許しハードウェア規模を増大させるコストよりも、若干の性能は犠牲とし、他の命令に置き換えることで解決します。
 +
 +
 +
 +======AFE : After Execution Expansion======
 +条件がtrueな場合のみに実行を行い、falseの場合はnop命令として実行される仕組みです。MIST32アーキテクチャではこの方式を積極的に採用することによりBranch命令の使用率を極力下げようという考えです。
 +
 +通常、分岐予測ミスを含む例外に対応したアウトオブオーダ実行では、動的に実行順序が変更されるため、ある一定の数だけコミットすると、そこを例外の戻り先ポイントとし、プログラムカウンタ(以下PC)の戻り先としてそれを指定するようにします。しかし、コミットされたポイント以降にも実行が完了した命令が存在し、さらにパイプラインの段数が長くなるにつれて例外のペナルティは大きくなります。後者は通常のパイプラインプロセッサにも言えることですが、構造がより複雑になるアウトオブオーダ実行を搭載する場合より多くのペナルティが生まれてしまいます。
 +
 +CCを用いると、例外が発生する可能性がある分岐命令を使用せずとも、簡単な分岐命令はCCに置き換えられるため上記のような問題を極力減らすことが可能です。
 +
 +After Execution Expansion(以下AFE)は、通常の命令を実行した後その演算結果またはフラグを参照して条件が一致すれば固定長のシフト・インクリメントなどの単純な命令を追加実行できるようにした仕組みです。この仕組みはCCと似ていますが、追加実行機能を単純な命令に限定してすべてを1命令で行えるようにしたのが特徴となります。
 +
 +
 +======レジスタセット======
 +MIST32アーキテクチャは通常演算などで使用される汎用レジスタと、プロセッサの状態を示したり設定するためのシステムレジスタを持ちます。
 +
 +RISCでありながらもこのように明確に分けることにより、アウトオブオーダー実行時、必要な待ち合わせユニットの大幅な削減が可能となり、結果的に回路規模を小さくすることができ、低消費電力化も可能となります。
 +
 +=====汎用レジスタ=====
 +
 +|レジスタ名|
 +|GR0~GR31|
 +=====システムレジスタ=====
 +システムレジスタへのリード・ライトはそのレジスタ専用に設けられている命令を用いて実現が可能です。また、システムレジスタによっては、プログラムから一切アクセスが禁止されているものもあります。
 +この章はまだ未完成。
 +====CPUIDR(Processor ID Register)====
 +プロセッサバージョン固有のIDを示します。1つのプロセッサ内に複数のコアを持つ場合においてもすべてのコアでこのIDは共通となります。このレジスタは正確にはレジスタではなくROMであり、いかなる場合においても書き込みを許しません。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|×|○|×|☓|×|☓|
 +
 +^ビットフィールド|31~6|5~0|
 +^名称|PID|PREV|
 +^機能|MIST32に対応するプロセッサのID|プロセッサのリビジョン|
 +
 +====COREIDR(Core ID Register)====
 +コアごとにユニークな値を持ちます。このレジスタは正確にはレジスタではなくROMであり、いかなる場合においても書き込みを許しません。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|×|○|×|☓|×|☓|
 +
 +^ビットフィールド|31~0|
 +^名称|COREID|
 +
 +====TIDR(Task ID Register)====
 +現在実行中のタスクIDを示します。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|☓|☓|×|☓|☓|☓|
 +
 +^ビットフィールド|31~14|13~0|
 +^名称|フラグ類|予約|TID|
 +
 +
 +====FLAGR(Flag Register)====
 +ジャンプ命令のみリード可能でその他の命令では一切リード・ライト不可能となります。このレジスタを直接的にリード・ライトする専用命令も用意されていません。フラグ更新を行わない命令の直後、フラグレジスタはすべて0となります。
 +
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|×|×|×|×|☓|○|☓|
 +
 +^ビットフィールド|4|3|2|1|0|
 +^名称|SP|OF|CF|PF|ZF|
 +^機能|演算結果が負数の場合1|演算結果がオーバーフローした際1|演算結果に桁上げが生じた場合1|演算結果が偶数なら1|演算結果が0ならば1|
 +
 +====PCR(Program Counter Register)====
 +現在実行されている命令が格納されている、メモリのアドレスを挿します。すべての命令において、このレジスタを明示的に参照したり書き込みすることはできません。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|☓|×|×|×|☓|☓|○|
 +
 +^ビットフィールド|31~0|
 +^名称|PC|
 +
 +
 +
 +
 +
 +====SPR(Stack Point Register)====
 +PUSH/​POP系の命令にて2次的に操作されるレジスタです。SPRは次にPUSHされるべきメモリ上のアドレスを指します。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|☓|×|×|×|○|○|☓|
 +
 +^ビットフィールド|31~0|
 +^名称|SPR|
 +
 +
 +
 +====PSR(Program Status Register)====
 +現在実行中のプロセッサのシステムを設定または示すレジスタです。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|×|×|×|×|○|☓|
 +
 +^ビットフィールド|31~7|6:​5|4~3|2|1:​0|
 +^名称|予約|CMOD| ​ |IM|MMUMOD|
 +^機能|予約|00:​Kernel Mode 1~2:予約 : 3:User Mode|予約|0:​Interrupt Mask 1:Interrupt Non Mask|00:​Invalid Paging(Direct Access) 01:1Level Paging 10:2Level Paging 11:予約|
 +
 +
 +====IOSAR(IO Start Address Register)====
 +メモリマップドIOにおいて、I/​Oにマップされる開始アドレスを示します。このレジスタから0xFFFFFFFFまではIOにマップされることを示します。なお、リセット直後は0x00000000になり、この状態はIOユニットの初期化が完了していないことを示します。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|×|×|×|×|○|☓|
 +
 +^ビットフィールド|31~0|
 +^名称|IOSAR|
 +
 +
 +====PDTR(Page Directry Table Register)====
 +現在参照しているページテーブルが格納されている物理アドレスを示すレジスタです。タスク切り替えの際に使用するレジスタで、特定の割り込み時にCPUが自動的に値を書き込みます。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|×|○|×|☓|☓|○|
 +
 +^ビットフィールド|31~0|
 +^名称|PDTR|
 +
 +
 +====TISR(Task Information Stractor Register)====
 +カーネル空間にある現在実行中のタスクの、物理インデックスアドレスを示しています。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|○|☓|×|☓|☓|☓|
 +
 +^ビットフィールド|31~0|
 +^名称|TISPR|
 +
 +
 +
 +
 +====KPDTR(Kernel Page Directory Table Register)====
 +カーネル空間が存在しているページの、ページテーブルが保持されている物理アドレスを示すレジスタです。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|○|☓|×|☓|☓|☓|
 +
 +^ビットフィールド|31~0|
 +^名称|KPDTR|
 +
 +
 +====IDTR(Interrupt Discriptor Table Register)====
 +割り込みベクタの開始アドレスを物理アドレスで持っているレジスタ。このレジスタはバイトアドレスで割り込みベクタを示している。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|☓|☓|×|☓|☓|○|
 +
 +^ビットフィールド|31~0|
 +^名称|IIR|
 +
 +====FI0R(Fault Infomation 0 Register)====
 +フォールトが発生した際にプロセッサにより自動的に書き込まれるレジスタです。フォールトの種類により格納される内容は異なります。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|☓|☓|×|☓|☓|○|
 +
 +^ビットフィールド|31~0|
 +^名称|FI0R|
 +
 +
 +
 +====FI1R(Fault Infomation 1 Register)====
 +フォールトが発生した際にプロセッサにより自動的に書き込まれるレジスタです。フォールトの種類により格納される内容は異なります。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|☓|☓|×|☓|☓|○|
 +
 +^ビットフィールド|31~0|
 +^名称|FI1R|
 +
 +
 +====SRR0~n(System Reserved Register)====
 +プロセッサコアで予約されているレジスタ。このレジスタはMIST32アーキテクチャに定義されませんが、コアの構成上用意される可能性があるレジスタです。全ての権限においてどのような場合においても利用不可能なレジスタです。プロセッサコアによって複数個予約される可能性があります。このレジスタはたとえばプロセッサ内部においてマイクロコードを実行するときや、ハードウェアコンテキストスイッチを行う際に利用されます。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|☓|☓|☓|×|☓|☓|○|
 +
 +^ビットフィールド|31~0|
 +^名称|不定|
 +
 +
 +
 +====PPSR(Previous Program Status Register)====
 +割り込みが発生すると自動的にPSRからPPSRにコピーされます。このレジスタは1つ前のタスクが実行されていた状態を示しています。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|×|×|×|×|×|○|
 +
 +^ビットフィールド|31~7|6:​5|4~3|2|1:​0|
 +^名称|予約|CMOD| ​ |IM|MMUMOD|
 +^機能|予約|00:​Kernel Mode 1~2:予約 : 3:User Mode|予約|0:​Interrupt Mask 1:Interrupt Non Mask|00:​Invalid Paging(Direct Access) 01:1Level Paging 10:2Level Paging 11:予約|
 +
 +====PPCR(Previous Program Counter Register)====
 +割り込みが発生すると自動的にPCの値がPPCRにコピーされます。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|☓|×|×|×|☓|☓|○|
 +
 +^ビットフィールド|31~0|
 +^名称|PC|
 +
 +
 +====PPDTR(Previous Page Directry Table Register)====
 +割り込みが発生すると自動的にPDTRの値がコピーされます。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|×|×|×|☓|☓|○|
 +
 +^ビットフィールド|31~0|
 +^名称|PDTR|
 +
 +====PTIDR(Previous Task ID Register)====
 +割り込みが発生すると自動的にTIDRの値がコピーされます。
 +|Kernel Mode Read|Kernel Mode Write| User Mode Read|User Mode Write|命令にて2次的にRead|命令にて2次的にWrite|命令以外にてWrite|
 +|○|☓|☓|×|☓|☓|○|
 +
 +^ビットフィールド|31~14|13~0|
 +^名称|フラグ類|予約|TID|
 +
 +======メモリマップ======
 +none
 +
 +======割り込み======
 +MIST32では割り込みは2048のエントリを持っています。割り込みはハードウェア割り込み・トラップ(ソフトウェア割り込み)・フォールト・アボートに分類されています
 +
 +
 +=====FI0R/​FI1Rについて=====
 +この2つのレジスタはフォールトが発生した際に、その要因の詳細を記憶するレジスタです。フォールトの種類により役割が異なります。
 +
 +
 +=====割り込み一覧=====
 +|割り込み番号|割り込みタイプ|要因|FI0R|FI1R|
 +|0~3| |予約| | |
 +|4~35|Hardware|GCIデバイス0~31|none|none|
 +|36|Hardware|DPD UTIM64A~B|none|none|
 +|37|Hardware|DPD LSFLAGS|none|none|
 +|40|Fault|メモリアクセス特権違反(MMU)|アクセスしたアドレス|引き起こした命令が格納されているアドレス(これは未定)|
 +|41|Fault|無効命令(MMU)|引き起こした命令が格納されているアドレス|FI0Rと同様|
 +|42|Fault|ページフォルト(MMU)|アクセスしたアドレス|引き起こした命令が格納されているアドレス(これは未定)|
 +|43|Fault|割り込みベクタ無効|無効であった割り込み番号|FI0Rと同様| ​
 +|44~49|予約|予約|
 +|50|Fault|TSS無効| | |
 +|51|Fault|除算エラー| | |
 +|52~53| |予約| | |
 +|63|Abort|ダブルフォールト| | |
 +|64~127|SW|ソフトウェア割り込み用| | |
 +
 +割り込みベクタは割り込み番号ごとに存在し、各種フラグや割り込みハンドラ情報を持っています。
 +
 +|0|Valid bit|1:​割り込みベクタが有効|
 +|1|Mask bit|1:​割り込みハンドラが有効(無効の場合この割り込みは引き起こさない)|
 +|15~2|予約|予約|
 +|17~16|PRI|割り込みレベル|
 +|31~18|予約|予約|
 +|63~32|HDL|割り込みハンドラ|
 +
 +
 +=====割り込み制御について=====
 +リセット後のIDTをセットする手順は以下のようになります。割り込みフラグを操作する場合必ず以下の手順を必要とします。割り込みハンドラの変更を行う際にはメモリ上の割り込みハンドラを書き換えるだけで問題ありません。リセット時以に設定を行うにはSRIEIW命令にて割り込みマスクを割り込み禁止にセットしてから行います。
 +  - IDTをメモリ上の任意の位置に配置します。
 +  - SRIDTW命令にてIDTのIndexを設定します。
 +  - IDTS命令にてIDTをプロセッサに設定します。
 +  - SRIEIW命令にてプロセッサの割り込みマスクを割り込み許可にします。
 +
 +
 +
 +======I/​O======
 +MIST32ではメモリマップドI/​Oを採用しています。IO領域の開始アドレスはIOSRに示されます。IOSRの値は接続されるデバイス構成により変化し、このアドレスはリセット時に一度だけ書き換えられます。
 +
 +IOはすべてワードアドレッシングのみ採用しています。よってByteやハーフワードロードストア命令であるld8,​ ld16 / st8, st16命令などにより参照された場合はアライメント違反の割り込みが発生します。
 +
 +=====I/​O空間の構成=====
 +I/​O空間は標準タイマ、RTC、UARTなどを搭載しているDefault Peripheral System(DPS)と汎用的なデバイスを自由に接続可能なGeneration Device Connection Interface(GCI)から構成されます。
 +
 +====DPS====
 +[[http://​open-arch.org/​hardware/​dps|Open Design Computer Project DPSのページ参照]]
 +====GCI====
 +[[http://​open-arch.org/​hardware/​gci|Open Design Computer Project GCIのページ参照]]
 +
 +
 +======TST : Task Structure Table======
 +TISPRが指すアドレスにTSTが存在します。TSTにはプロセッサが切り替えるべきタスクのキューと、タスク構造体が格納されています。
 +
 + - TST全体の構成
 +|0x00000000~0x000003FF|Queue entry0~127|
 +|0x00000400~0x00260190|Task Structure0~16383|
 +
 +
 + - Queue entryの構成
 +^ビットフィールド|31|30|29~14|15~14|13~0|
 +^名称|V|E|予約|予約?​|TID|
 +^機能|0:​このQueueエントリは無効 1:​このQueueエントリは有効|0:​タスクはすでに実行済み 1:​タスクの実行待ち|予約|未使用:​0で埋める|このQueueエントリが示すタスクID|
 +
 +
 + - タスク構造体の内容
 +|0x00000000~0x00000003|TASK_INF|
 +|0x00000004~0x00000007|GR0|
 +|...|...|
 +|0x00000080~0x00000083|GR31|
 +|0x00000084~0x00000087|PCR|
 +|0x00000088~0x0000008B|SPR(User mode)|
 +|0x0000008C~0x0000008F|SPR(Kernel mode)|
 +|0x00000090~0x00000093|PDT|
 +|0x00000094~0x00000097|PSR|
 +|0x00000098~0x0000009B|FLAGR|
 +|0x00000098~0x000000FF|予約|
 +
 +
 + - TASK_INFの構成
 +^ビットフィールド|31|30~29|28~0|
 +^名称|V|P|予約|
 +^機能|0:​このTASKは無効 1:​このTASKは有効|タスクの優先度、0~3で0が最も優先度が低い|予約|
 +
 +
 +
 +
 +
 +======CC : Condition Code======
 +条件分岐を行う際の分岐条件をCondition Code(以下CC)で指定します。通常のプロセッサにおける条件付き実行で使用されるCCとは異なります。MIST32ではBranchの条件を指定するコードとなります。ビットフィールドはAFEと共通となり、ジャンプ命令系においてAFEが無効となり、CCとして扱われます。なお、アセンブリ言語記述の際はCC1および、CC2どちらも対象とされるCodeに変換されます。
 +
 +CCは1つ前の命令の発生させるフラグを参照します。1つ前の命令はCMP、TEST等の比較命令や、フラグを発生させる命令を用意する必要があります。1つ前の命令がフラグを発生させる名デイではない場合、プロセッサは正常に動作を続けることができず、暴走を起こしたり、停止する可能性があります(これ、いつか修正)。 #​ALで無条件ジャンプの場合はこの限りではありません。
 +
 +CMP命令を使用した際のフラグは、第1オペランド-第2オペランドのフラグがCCと比較されます。
 +cmp   ​r0, ​  ​1, ​ #seo
 +
 +
 +^Code^Operate^条件^CC1^CC2^CC3(GCC)^フラグ条件^
 +|0x0|Always|Always|AL| | |Always|
 +|0x1|Equal|==|EQ|Z| EQ|ZF|
 +|0x2|Not Equal|!=|NEQ|NZ|NE|!ZF|
 +|0x3|Minus|-| |MI| ​ |SF|
 +|0x4|Plus|+| |PL| ​ |!SF|
 +|0x5|Even Number|2%| |EN| ​ |PS|
 +|0x6|Odd Number|!%2| |ON| ​ |!PS|
 +|0x7|Overflow| | |OVF| ​ |OF|
 +|0x8|Unsigned >=(Cary Set)|>​=|UEO|C|GEU|CF|
 +|0x9|Unsigned <(Not Cary Set)|<​|UU|NC|LTU|!CF|
 +|0xA|Unsigned >​|>​|UO| |GTU|CF and !ZF|
 +|0xB|Unsigned <​=|<​=|UEU| |LEU|!CF or ZF|
 +|0xC|Signed >​=|>​=|SEO| |GE|(SF and OF) or (!SF and !OF)|
 +|0xD|Signed <​|<​|SU| |LT|(SF and !OF) or (!SF and OF)|
 +|0xE|Signed >​|>​|SO| |GT|!((SF xor OF) or ZF)|
 +|0xF|Signed <​=|<​=|SEU| ​ |LE|(SF xor OF) or ZF|
 +
 +
 +======自動タスクスイッチについて======
 +
 +後日
 +
 +=====インテリジェントタスクキャッシュ=====
 +MIST32では32本物汎用レジスタを持っていて、タスクスイッチのコストが大きいという問題点があります。そのため、自動タスクスイッチ使用する際に、比較的使用頻度の高いタスクを自動的にキャッシュして、それを設定された保護レベルでそのキャッシュが追い出されないように保護する機能を持ちます。使用されるキャッシュは通常のLoad/​Storeパイプに接続された1Lまたはそれより下位のキャッシュが使用され、使用者はタスクストラクチャでレベルを設定するだけでプロセッサの昨日により実現されます。最大に使用できる領域は実装依存となり、キャッシュなので非実装もアーキテクチャとして許可されます。もしもその領域を使い果たした場合、プロセッサは自動的に保護レベルにのっとったLRUアルゴリズムに基づき自動的にメモリに退避します。
 +
 +======アライメント======
 +=====メモリアライメント=====
 +メモリアクセスはByte,​ Half Word, Wordアクセスが可能です。アクセス可能なアライメントは以下のようになります。
 +|---|Addr:​0|Addr:​1|Addr:​2|Addr:​3|
 +|ld8/​st8|OK(1Byte)|OK(1Byte)|OK(1Byte)|OK(1Byte)|
 +|ld16/​st16|OK(2Byte)|不定|OK(2Byte)|不定|
 +|ld32/​st32/​ppush/​push/​pop/​|OK(4Byte)|不定|不定|不定|
 +
 +不定なアドレスでアクセスした場合はアライメント違反の割り込みが発生します。
 +
 +=====I/​Oアライメント=====
 +I/​OにはWordアクセスが可能のみ。アクセス可能なアライメントは以下のようになります。
 +|---|Addr:​0|Addr:​1|Addr:​2|Addr:​3|
 +|ld8/​st8|不定|不定|不定|不定|
 +|ld16/​st16|不定|不定|不定|不定|
 +|ld32/​st32/​ppush/​push/​pop/​|OK(4Byte)|不定|不定|不定|
 +
 +
 +=====レジスタアライメント=====
 +全てWord単位でのアクセスになります。任意Byteを取得したい場合は命令を組み合わせる必要があります。
 +
 +======関数呼び出し規約======
 +=====呼び出し側(caller)=====
 +後日
 +=====呼び出される側(callee)=====
 +後日
 +
 +======MMU======
 +MMUは最大2段階のページングをサポートします。MMUのコントロールはPSR[1:​0]によって、無変換から2段階まで行うことが可能です。しかし、当分無変換と2段階のみサポートをします。
 +
 +====アクセスフラグについて====
 +ページ内オフセットにあたる[13:​0]はフラグを格納しています。フラグは以下のようにアサインされています。
 +|13:​6|Reserved|予約|
 +|5:​4|PP|(Page Privilege Flag)[00 K:RW U:**][01 K:R* U:R*][10 K:RW U:R*][11 K:RW U:RW]|
 +|3|EX|(Execution Flag)このページが実行可能である場合1|
 +|2|D|(Dirty Flag)このページが書き込みを行っている場合1(1の場合スワップアウトの必要あり)|
 +|1|R|(Read Flag)リードしているページである場合1(ページアウトのLRU制御用)|
 +|0|V|(Valid Flag)このページが有効である場合1|
 +
 +
 +====2段階変換について====
 +プロセッサによりアクセスされた論理アドレスは1,​2段目ページオフセットと、ページ内オフセットに分けられます。
 +
 +|31:​23|22:​14|13:​0|
 +|1段目ページオフセット|2段目ページオフセット|ページ内オフセット|
 +
 +  - 1段目はPDTRとページオフセットが加算されたアドレスから2段目のディレクトリアドレスを求めます。
 +  - 2段目は1段目より求めた2段目のディレクトリアドレスと、2段目ページオフセットを加算し、そのアドレスからページインデックスが求められます。
 +  - 上位18ビットをページインデックス、下位14bitのページ内オフセットとし、物理アドレスに変換されたアドレスとなります。
 +
 +
 +
 +
 +
 +======Call/​Returnについて======
 +MIST32ではCall、Return命令を持っていません。しかし、CALLの一部を実現する命令を備えていて、ユーザは以下で同等の機能を実現することが可能となります。
 +
 +=====CALL命令=====
 +
 +<code asm>
 +
 +main:
 + PPUSH ;​PC+4 Push
 + SPJMP function,​ #​AL ;​Function Call
 +
 +function:
 +...
 +
 +</​code>​
 +
 +=====CALL命令=====
 +
 +<code asm>
 +main:
 +...
 +
 +function:
 + POP GR0 ;​Pop Return Address
 + SPJMP GR0,​ #​AL ;​Return ​
 +
 +</​code>​
 +
 +======命令リスト======
 +命令リストはCGENが吐き出したやつを参照
 +[[http://​open-arch.org/​_media/​software/​mist32-insn.html|命令リスト]]
 +======アセンブリ記述例======
 +  * [[https://​gist.github.com/​668821|MIST32アーキテクチャによりフィボナッチ関数のサンプル]] [hktechno氏提供]
 +  * MIST32アーキテクチャによるコラッツの問題関数
 +    * AFE未使用
 +<code asm>
 +
 + CLW R1 //​ループ回数 : レジスタをクリアする命令
 +loop:
 + CMP R0,​ 0x1
 + SPJMP end,​ #​EQ //​R0が1ならばend
 + ADD R1,​ 0x1
 + CMP R0,​ 0x0
 + SPJMP odd,​ #​ON //​R0が奇数ならodd : 符号付PC相対ジャンプ
 +even:
 + SHR R0,​ 0x1
 + SPJMP loop //​goto loop
 +odd:
 + SHL R0,​ 0x1
 + ADD R0, R0
 + SPJMP loop //​goto loop
 +end:
 + RET
 +
 +</​code>​
 +
 +    * AFE使用
 +<code asm>
 +
 +main:
 + CLW R1 //​ループ回数 : レジスタをクリアする命令
 +loop:
 + CMP R0,​ 0x1 ​       ​
 + SPJMP end,​ #​EQ //​R0が1ならばend : 符号付PC相対ジャンプ
 + SHL R0,​ 0x1,​ &​1_EVEN_NONE //​第1operandが偶数ならR0/​2、それ以外のときこの命令はNOP
 + MUL R0,​ 0x3,​ &​1_ODD_INC //​第1operandが奇数なら(R0*3)+1、それ以外のときはNOP ​       ​
 + ADD R1,​ 0x1
 + UPJMP loop ​                       ​
 +end:
 + RET
 +
 +</​code>​