MIPSアーキテクチャ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/12/09 06:21 UTC 版)
MIPS I の命令形式
命令は R、I、Jの3種類に分類される。どの命令も先頭に6ビットのオペコードがある。Rタイプではオペコードの次に3本のレジスタを指定するフィールドがあり、シフト量を指定するフィールド、機能を指定するフィールドが続く。Iタイプでは2つのレジスタを指定するフィールドと16ビットの即値のフィールドがある。 Jタイプでは、オペコードに続いて26ビットで分岐先アドレスを指定する[24][25]。
次表は主要な命令セットの3種類の形式を示したものである。
タイプ | -31- フォーマット (ビット数) -0- | |||||
---|---|---|---|---|---|---|
R | オペコード (6) | rs (5) | rt (5) | rd (5) | シフト量 (5) | 機能 (6) |
I | オペコード (6) | rs (5) | rt (5) | 即値 (16) | ||
J | オペコード (6) | アドレス (26) |
MIPS アセンブリ言語
アセンブリ言語には、直接ハードウェア実装に対応した命令以外に複数命令の列に変換される「擬似命令」が存在する。
- 以下の表で、d、t、s といった文字はレジスタの番号や名前のためのプレースホルダーとなっている。
- C は定数(即値)を示す。
- オペコード及び機能のコードは16進数である。
- MIPS32命令セットでは Add や Subtract 命令で使われる unsigned という用語が誤解を生みやすいとしている。それらの命令の signed と unsigned の違いはオペランドを符号拡張をするかしないかではなく、オーバーフロー発生時にトラップを起こすか (e.g. Add) 無視するか (Add unsigned) である。それらの命令の即値オペランド CONST は常に符号拡張される。
整数
MIPSアーキテクチャは32本の整数レジスタを持つ。算術処理を行うにはデータがレジスタ上になければならない。レジスタ$0は常に0であり、レジスタ$1はアセンブラが一時的に使用する(擬似命令や大きな定数を扱う場合)。
エンコーディングは命令語の各ビットが命令のどの部分と対応しているかを示している。ハイフン (-) はそのビットが無視されることを意味する。
種類 | 名称 | 構文 | 意味 | 形式/オペコード/機能コード | 注記/エンコーディング | ||
---|---|---|---|---|---|---|---|
算術 | Add | add $d,$s,$t | $d = $s + $t | R | 0 | 2016 | 2つのレジスタを加算。オーバーフロー時にはトラップ発生000000ss sssttttt ddddd--- --100000 |
Add unsigned | addu $d,$s,$t | $d = $s + $t | R | 0 | 2116 | 上と同様だが、オーバフローを無視000000ss sssttttt ddddd--- --100001 | |
Subtract | sub $d,$s,$t | $d = $s - $t | R | 0 | 2216 | 2つのレジスタで減算。オーバーフロー時にはトラップ発生000000ss sssttttt ddddd--- --100010 | |
Subtract unsigned | subu $d,$s,$t | $d = $s - $t | R | 0 | 2316 | 上と同様だが、オーバーフローを無視000000ss sssttttt ddddd000 00100011 | |
Add immediate | addi $t,$s,C | $t = $s + C (signed) | I | 816 | - | 符号拡張した即値とレジスタを加算。addi $1, $2, 0 のようにレジスタ間転送にも使える。オーバフロー時にはトラップ発生001000ss sssttttt CCCCCCCC CCCCCCCC | |
Add immediate unsigned | addiu $t,$s,C | $t = $s + C (signed) | I | 916 | - | 上と同様だが、オーバフローを無視(即値は符号拡張される)001001ss sssttttt CCCCCCCC CCCCCCCC | |
Multiply | mult $s,$t | LO = (($s * $t) << 32) >> 32; HI = ($s * $t) >> 32; |
R | 0 | 1816 | 2つのレジスタで乗算。64ビットの積は専用レジスタ HI と LO に格納。(int HI,int LO) = (64-bit) $s * $t と表すこともできる。HIとLOには mfhi および mflo でアクセスする。 | |
Divide | div $s, $t | LO = $s / $t HI = $s % $t | R | 0 | 1A16 | 2つのレジスタで除算。32ビットの商をLO、余りをHIに格納。[24] | |
Divide unsigned | divu $s, $t | LO = $s / $t HI = $s % $t | R | 0 | 1B16 | 2つのレジスタの内容を符号なし整数と解釈して除算。商はLO、余りはHIに格納。 | |
データ転送 | Load double word | ld $t,C($s) | $t = Memory[$s + C] | I | 2316 | - | $s+C というアドレスから8バイトの連続する位置にあるデータをロードし、$tとその次のレジスタに格納する。 |
Load word | lw $t,C($s) | $t = Memory[$s + C] | I | 2316 | - | $s+C というアドレスから4バイトの連続する位置にあるデータをロードする。 | |
Load halfword | lh $t,C($s) | $t = Memory[$s + C] (signed) | I | 2116 | - | $s+C というアドレスから2バイトの連続する位置にあるデータをロードし、符号拡張してレジスタに格納 | |
Load halfword unsigned | lhu $t,C($s) | $t = Memory[$s + C] (unsigned) | I | 2516 | - | 上と同様だが、符号拡張しない。 | |
Load byte | lb $t,C($s) | $t = Memory[$s + C] (signed) | I | 2016 | - | $s+C というアドレスの1バイトのデータをロードし、符号拡張する。 | |
Load byte unsigned | lbu $t,C($s) | $t = Memory[$s + C] (unsigned) | I | 2416 | - | 上と同様だが、符号拡張しない。 | |
Store double word | sd $t,C($s) | Memory[$s + C] = $t | I | - | $t とその次のレジスタの内容を $s+C という位置から8バイト連続でストアする。オペランドの順序に注意が必要。 | ||
Store word | sw $t,C($s) | Memory[$s + C] = $t | I | 2B16 | - | $s+C という位置から4バイト連続でストアする。 | |
Store half | sh $t,C($s) | Memory[$s + C] = $t | I | 2916 | - | レジスタの下位16ビットを $s+C という位置から2バイト連続でストアする。 | |
Store byte | sb $t,C($s) | Memory[$s + C] = $t | I | 2816 | - | レジスタの下位8ビットを $s+C という位置にストアする。 | |
Load upper immediate | lui $t,C | $t = C << 16 | I | F16 | - | 16ビットの即値をレジスタの上位16ビットにロードする。ロードできる最大値は216-1。 | |
Move from high | mfhi $d | $d = HI | R | 0 | 1016 | HIレジスタの値を汎用レジスタに転送。この命令から2命令以内に multiply または divide 命令を使ってはならない(その場合の動作は未定義) | |
Move from low | mflo $d | $d = LO | R | 0 | 1216 | LOレジスタの値を汎用レジスタに転送。この命令から2命令以内に multiply または divide 命令を使ってはならない(その場合の動作は未定義) | |
Move from Control Register | mfcZ $t, $s | $t = Coprocessor[Z].ControlRegister[$s] | R | 0 | コプロセッサZのコントロールレジスタの内容を汎用レジスタに転送。符号拡張する。 | ||
Move to Control Register | mtcZ $t, $s | Coprocessor[Z].ControlRegister[$s] = $t | R | 0 | 汎用レジスタの4バイトの内容をコプロセッサZのコントロールレジスタに転送。符号拡張する。 | ||
論理 | And | and $d,$s,$t | $d = $s & $t | R | 0 | 2416 | ビット毎のAND000000ss sssttttt ddddd--- --100100 |
And immediate | andi $t,$s,C | $t = $s & C | I | C16 | - | 即値とのビット毎のAND001100ss sssttttt CCCCCCCC CCCCCCCC | |
Or | or $d,$s,$t | $d = $s | $t | R | 0 | 2516 | ビット毎のOR | |
Or immediate | ori $t,$s,C | $t = $s | C | I | D16 | - | 符号拡張した即値とのビット毎のOR | |
Exclusive or | xor $d,$s,$t | $d = $s ^ $t | R | 0 | 2616 | ビット毎のXOR | |
Nor | nor $d,$s,$t | $d = ~ ($s | $t) | R | 0 | 2716 | ビット毎のNOR | |
Set on less than | slt $d,$s,$t | $d = ($s < $t) | R | 0 | 2A16 | $sと$tの値を符号付き整数として比較し、$s が小さければ $d に1を、そうでなければ0を格納 | |
Set on less than immediate | slti $t,$s,C | $t = ($s < C) | I | A16 | - | 符号拡張した即値と$sの値を比較し、$sが小さければ $d に1を、そうでなければ0を格納。 | |
シフト | Shift left logical | sll $d,$t,C | $d = $t << C | R | 0 | 0 | $sの内容をCビット左にシフト。 をかけるのと同等 |
Shift right logical | srl $d,$t,C | $d = $t >> C | R | 0 | 216 | $sの内容をCビットだけ右にシフト。シフトされて空いた上位ビットには0を格納。正の整数を で割ったのと同等。 | |
Shift right arithmetic | sra $d,$t,C | R | 0 | 316 | $sの内容をCビットだけ右にシフト。シフトされた空いた上位ビットは元の値を符号付整数と解釈して符号拡張する。2の補数で表された符号付整数を で割ったのと同等。 | ||
条件分岐 | Branch on equal | beq $s,$t,C | if ($s == $t) go to PC+4+4*C | I | 416 | - | 2つのレジスタの値が等しい場合、指定されたアドレスに分岐000100ss sssttttt CCCCCCCC CCCCCCCC |
Branch on not equal | bne $s,$t,C | if ($s != $t) go to PC+4+4*C | I | 516 | - | 2つのレジスタの値が等しくない場合、指定されたアドレスに分岐 | |
無条件ジャンプ | Jump | j C | PC = PC+4[31:28] . C*4 | J | 216 | - | 指定されたアドレスに無条件ジャンプ |
Jump register | jr $s | goto address $s | R | 0 | 816 | 指定したレジスタが示すアドレスに無条件ジャンプ | |
Jump and link | jal C | $31 = PC + 8; PC = PC+4[31:28] . C*4 | J | 316 | - | プロシージャコール用。$31にリターンアドレスを格納してジャンプする。プロシージャからの復帰は jr $31 とする。リターンアドレスが PC+8 なのは、遅延スロットがあるため。 |
注: MIPSのアセンブリ言語のコード上、分岐命令での分岐先アドレスはラベルで表現される。
注: "load lower immediate" 命令は存在しない。これは addi 命令や ori 命令でレジスタ $0 を使うことで実現される。例えば、addi $1, $0, 100
も ori $1, $0, 100
もレジスタ$1に100という値が格納される。
注: 即値を減算するには、その値の否定を即値として加算すればよい。
浮動小数点数
MIPSアーキテクチャには32本の浮動小数点レジスタがある。2本のレジスタで倍精度の数値を表す。奇数番目のレジスタで倍精度の数値を指定することはできない。
種類 | 名称 | 構文 | 意味 | 形式/オペコード/機能 | 注記/エンコーディング | ||
---|---|---|---|---|---|---|---|
算術 | FP add single | add.s $x,$y,$z | $x = $y + $z | 単精度加算 | |||
FP subtract single | sub.s $x,$y,$z | $x = $y - $z | 単精度減算 | ||||
FP multiply single | mul.s $x,$y,$z | $x = $y * $z | 単精度乗算 | ||||
FP divide single | div.s $x,$y,$z | $x = $y / $z | 単精度除算 | ||||
FP add double | add.d $x,$y,$z | $x = $y + $z | 倍精度加算 | ||||
FP subtract double | sub.d $x,$y,$z | $x = $y - $z | 倍精度減算 | ||||
FP multiply double | mul.d $x,$y,$z | $x = $y * $z | 倍精度乗算 | ||||
FP divide double | div.d $x,$y,$z | $x = $y / $z | 倍精度除算 | ||||
データ転送 | Load word coprocessor | lwcZ $x,CONST ($y) | Coprocessor[Z].DataRegister[$x] = Memory[$y + CONST] | I | $2+CONST の位置から4バイトをコプロセッサのデータレジスタにロード。符号拡張する。 | ||
Store word coprocessor | swcZ $x,CONST ($y) | Memory[$y + CONST] = Coprocessor[Z].DataRegister[$x] | I | コプロセッサのデータレジスタの内容を $2+CONST から4バイト連続でストアする。符号拡張する。 | |||
論理(比較) | FP compare single (eq,ne,lt,le,gt,ge) | c.lt.s $f2,$f4 | if ($f2 < $f4) cond=1; else cond=0 | 2つのレジスタの内容を単精度浮動小数点数として大小比較し、$f2の方が小さければFPUのステータスレジスタの条件ビットを1に、そうでなければ0にセットする。 | |||
FP compare double (eq,ne,lt,le,gt,ge) | c.lt.d $f2,$f4 | if ($f2 < $f4) cond=1; else cond=0 | 2つ(正確には4つ)のレジスタの内容を倍精度浮動小数点数として大小比較し、$f2の方が小さければFPUのステータスレジスタの条件ビットを1に、そうでなければ0にセットする。 | ||||
分岐 | branch on FP true | bc1t 100 | if (cond == 1) go to PC+4+100 | 浮動小数点条件ビットが1ならPC相対(即値)で分岐 | |||
branch on FP false | bc1f 100 | if (cond == 0) go to PC+4+100 | 浮動小数点条件ビットが0ならPC相対(即値)で分岐 |
擬似命令
MIPSアセンブラは以下の命令を受け付けるが、これらは実際にはMIPSの命令セットに存在しない。アセンブラが同等の命令列に変換し、その際に $1 ($at) レジスタを一時的に使用することがある。
名称 | 構文 | 実際の命令列 | 意味 |
---|---|---|---|
Move | move $rt,$rs | addi $rt,$rs,0 | R[rt]=R[rs] |
Load Address | la $at, LabelAddr | lui $at, LabelAddr[31:16]; ori $at,$at, LabelAddr[15:0] | $at = Label Address リンカがアドレスを決定した際に命令を書き換える。 |
Load Immediate | li $at, IMMED[31:0] | lui $at, IMMED[31:16]; ori $at,$at, IMMED[15:0] | $at = 32ビット即値 |
Branch if greater than | bgt $rs,$rt,Label | slt $at,$rt,$rs; bne $at,$zero,Label | if(R[rs]>R[rt]) PC=Label |
Branch if less than | blt $rs,$rt,Label | slt $at,$rs,$rt; bne $at,$zero,Label | if(R[rs]<R[rt]) PC=Label |
Branch if greater than or equal | bge $rs,$rt,Label | slt $at,$rs,$rt; beq $at,$zero,Label | if(R[rs]>=R[rt]) PC=Label |
Branch if less than or equal | ble $rs,$rt,Label | slt $at,$rt,$rs; beq $at,$zero,Label | if(R[rs]<=R[rt]) PC=Label |
Branch if greater than unsigned | bgtu $rs,$rt,Label | if(R[rs]=>R[rt]) PC=Label | |
Branch if greater than zero | bgtz $rs,$rt,Label | if(R[rs]>0) PC=Label | |
Multiplies and returns only first 32 bits | mul $1, $2, $3 | mult $2, $3; mflo $1 | $1 = $2 * $3 |
その他の命令
- NOP命令。通常
sll $0,$0,0
という命令を使い、その機械語コードは 0x00000000 となる。 - break命令。デバッガでのブレークポイント設定で使用する。
- syscall命令。オペレーティングシステムのシステムコールに使われ、ユーザーモードからカーネルモードに移行する。
コンパイラのレジスタ使用規則
ハードウェアのアーキテクチャにより、以下のことが定められている。
- 汎用レジスタ $0 は常に 0 という値を返す。このレジスタに値を書いても変化はしないし、書いた値は消失する。
- 汎用レジスタ $31 は jal (jump and link) 命令でリンクレジスタとして使われる。
- HIおよびLOレジスタは乗除算の結果へのアクセスに使われ、mfhi (move from high) 命令と mflo 命令がそのためにある。
汎用レジスタを使う際のハードウェア上の制限はこれだけである。
各種MIPSツールチェーンでは、レジスタをどのように使うかについて呼出規約を定めている。これはツールチェーンのソフトウェアが定めているもので、ハードウェアにそのような制限があるわけではない。
名称 | 番号 | 用途 | 呼び出された側が内容を保存する必要があるか? |
---|---|---|---|
$zero | $0 | 常に 0 | N/A |
$at | $1 | アセンブラが一時的に使用 | No |
$v0–$v1 | $2–$3 | 関数の戻り値や式を評価した結果 | No |
$a0–$a3 | $4–$7 | 関数の引数 | No |
$t0–$t7 | $8–$15 | 一時変数 | No |
$s0–$s7 | $16–$23 | 一時変数だがセーブされる | Yes |
$t8–$t9 | $24–$25 | 一時変数 | No |
$k0–$k1 | $26–$27 | OSのカーネル用に予約 | No |
$gp | $28 | 広域(グローバル)ポインタ | Yes |
$sp | $29 | スタックポインタ | Yes |
$fp($s8) | $30 | フレームポインタ | Yes |
$ra | $31 | リターンアドレス | N/A |
呼び出された側が保存すると定められているレジスタは、サブルーチンや関数の呼び出しやシステムコールでも保持される。例えば、$s-レジスタをルーチン内で使うときは、その内容をスタックに一時的に退避させなければならない。$sp と $fp はルーチンに入ってきたときにセーブされ、それぞれルーチン固有の固定値でインクリメントされる。そして、そのルーチンから戻るときに元の値に戻す。一方 $ra は jal 命令でルーチンに飛び込むときに自動的に変更される。$t-レジスタはサブルーチンを呼び出すと内容が破壊されるので、必要なら呼び出す側がセーブしておかなければならない。
注釈
出典
- ^ “MIPS32 Architecture”. ミップス・テクノロジーズ. 2009年5月27日閲覧。
- ^ “MIPS64 Architecture”. ミップス・テクノロジーズ. 2009年5月27日閲覧。
- ^ “MIPS-3D ASE”. ミップス・テクノロジーズ. 2009年5月27日閲覧。
- ^ “MIPS16e”. ミップス・テクノロジーズ. 2021年1月14日閲覧。
- ^ “MIPS MT ASE”. ミップス・テクノロジーズ. 2009年5月27日閲覧。
- ^ University of California, Davis. “ECS 142 (Compilers) References & Tools page”. 2009年5月28日閲覧。
- ^ Rubio, Victor P. “A FPGA Implementation of a MIPS RISC Processor for Computer Architecture Education”. New Mexico State University. 2011年12月22日閲覧。
- ^ a b 神保進一著、『マイクロプロセッサ テクノロジ』、日経BP社、1999年12月6日第1版第1刷発行、ISBN 4822209261
- ^ Morgan Kaufmann Publishers, Computer Organization and Design, David A. Patterson & John L. Hennessy, Edition 3, ISBN 1-55860-604-1, page 63
- ^ “Earl Killian”. Paravirtual. (2010年11月26日) 2010年11月26日閲覧。
- ^ “S-1 Supercomputer Alumni: Earl Killian”. Clemson University. (2005年6月28日) 2010年11月26日閲覧. "Earl Killian's early work w... As MIPS's Director of Architecture, he designed the MIPS III 64-bit instruction-set extension, and led the work on the R4000 microarchitecture. He was a cofounder of QED, which created the R4600 and R5000 MIPS processors. Most recently he was chief architect at Tensilica working on configurable/extensible processors."
- ^ Jochen Liedtke(1995). On micro kernel construction. 15th Symposium on Operating Systems Principles, Copper Mountain Resort, Colorado.
- ^ “MIPS® Architecture For Programmers Volume II-A: The MIPS32® Instruction Set Document Number: MD00086 Revision 5.04 December 11, 2013”. p. 41. 2023年12月9日閲覧。
- ^ SGI announcing the end of MIPS - ウェイバックマシン(2008年3月7日アーカイブ分)
- ^ CPUコアベンダからの脱却 - 変貌するMIPS Technologiesの実像を探る
- ^ http://www.mdronline.com/mpr/h/2006/0626/202602.html China's Microprocessor Dilemma
- ^ China’s Institute of Computing Technology Licenses Industry-Standard MIPS Architectures
- ^ “LinuxDevices article about the Municator”. 2012年12月16日時点のオリジナルよりアーカイブ。2010年12月12日閲覧。
- ^ “Yeelong Specs”. 2012年12月10日時点のオリジナルよりアーカイブ。2010年12月12日閲覧。 (LinuxDevices, Oct. 22, 2008)
- ^ “Silicon Graphics Introduces Enhanced MIPS Architecture to Lead the Interactive Digital Revolution”. Silicon Graphics, Inc. (1996年10月21日). 2011年2月25日閲覧。
- ^ a b Gwennap, Linley (18 November 1996). "Digital, MIPS Add Multimedia Extensions". Microprocessor Report. pp. 24–28.
- ^ NEC Offers Two High Cost Performance 64-bit RISC Microprocessors
- ^ 編集人 山形孝雄「PMC-Sierra RMシリーズの概要とRM7900&RM900x2Gの詳細」『Interface2004年7月号』CQ出版社、2004年7月1日、77-88頁。ISSN 0387-9569。
- ^ a b MIPS R3000 Instruction Set Summary
- ^ MIPS Instruction Reference
- ^ Welcome Page | Open Virtual Platforms
- ^ Welcome to Imperas | Imperas
- ^ James Larus. “SPIM MIPS Simulator”. 2007年3月4日閲覧。
- ^ EduMIPS64
- ^ MARS MIPS simulator - Missouri State University
MIPSアーキテクチャと同じ種類の言葉
固有名詞の分類
マイクロプロセッサ |
Weitek PowerPC 970 MIPSアーキテクチャ Intel 8088 Intel486 |
- MIPSアーキテクチャのページへのリンク