MIPSアーキテクチャ MIPS I の命令形式

MIPSアーキテクチャ

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/01/02 21:03 UTC 版)

MIPS I の命令形式

命令は R、I、Jの3種類に分類される。どの命令も先頭に6ビットのオペコードがある。Rタイプではオペコードの次に3本のレジスタを指定するフィールドがあり、シフト量を指定するフィールド、機能を指定するフィールドが続く。Iタイプでは2つのレジスタを指定するフィールドと16ビットの即値のフィールドがある。 Jタイプでは、オペコードに続いて26ビットで分岐先アドレスを指定する[22][23]

次表は主要な命令セットの3種類の形式を示したものである。

タイプ -31-                                 フォーマット (ビット数)                                 -0-
R オペコード (6) rs (5) rt (5) rd (5) シフト量 (5) 機能 (6)
I オペコード (6) rs (5) rt (5) 即値 (16)
J オペコード (6) アドレス (26)

MIPS アセンブリ言語

アセンブリ言語には、直接ハードウェア実装に対応した命令以外に複数命令の列に変換される「擬似命令」が存在する。

  • 以下の表で、dts といった文字はレジスタの番号や名前のためのプレースホルダーとなっている。
  • C は定数(即値)を示す。
  • オペコード及び機能のコードは16進数である。
  • MIPS32命令セットでは Add や Subtract 命令で使われる unsigned という用語が誤解を生みやすいとしている。それらの命令の signedunsigned の違いはオペランドを符号拡張をするかしないかではなく、オーバーフロー発生時にトラップを起こすか (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に格納。[22]
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 ビット毎のAND
000000ss sssttttt ddddd--- --100100
And immediate andi $t,$s,C $t = $s & C I C16 - 即値とのビット毎のAND
001100ss 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, 100ori $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

その他の命令

コンパイラのレジスタ使用規則

ハードウェアのアーキテクチャにより、以下のことが定められている。

  • 汎用レジスタ $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 $30 フレームポインタ Yes
$ra $31 リターンアドレス N/A

呼び出された側が保存すると定められているレジスタは、サブルーチンや関数の呼び出しやシステムコールでも保持される。例えば、$s-レジスタをルーチン内で使うときは、その内容をスタックに一時的に退避させなければならない。$sp と $fp はルーチンに入ってきたときにセーブされ、それぞれルーチン固有の固定値でインクリメントされる。そして、そのルーチンから戻るときに元の値に戻す。一方 $ra は jal 命令でルーチンに飛び込むときに自動的に変更される。$t-レジスタはサブルーチンを呼び出すと内容が破壊されるので、必要なら呼び出す側がセーブしておかなければならない。




注釈

  1. ^ MIPS社のR4000が登場する頃には、DEC社は自社製RISCマイクロプロセッサAlphaを完成させてこれに切り替えた。
  2. ^ R4000は、スーパーパイプラインを世界で最初に導入した市販のマイクロプロセッサである。しかし、これによって、"Microprocessor with Interlocked Pipeline Stages" パイプライン・ステージがインターロックされるマイクロプロセッサと揶揄されることになった。

出典

  1. ^ MIPS32 Architecture”. ミップス・テクノロジーズ. 2009年5月27日閲覧。
  2. ^ MIPS64 Architecture”. ミップス・テクノロジーズ. 2009年5月27日閲覧。
  3. ^ MIPS-3D ASE”. ミップス・テクノロジーズ. 2009年5月27日閲覧。
  4. ^ MIPS16e”. ミップス・テクノロジーズ. 2009年5月27日閲覧。
  5. ^ MIPS MT ASE”. ミップス・テクノロジーズ. 2009年5月27日閲覧。
  6. ^ University of California, Davis. “ECS 142 (Compilers) References & Tools page”. 2009年5月28日閲覧。
  7. ^ Rubio, Victor P. “A FPGA Implementation of a MIPS RISC Processor for Computer Architecture Education”. New Mexico State University. 2011年12月22日閲覧。
  8. ^ a b 神保進一著、『マイクロプロセッサ テクノロジ』、日経BP社、1999年12月6日第1版第1刷発行、ISBN 4822209261
  9. ^ Morgan Kaufmann Publishers, Computer Organization and Design, David A. Patterson & John L. Hennessy, Edition 3, ISBN 1-55860-604-1, page 63
  10. ^ “Earl Killian”. Paravirtual. (2010年11月26日). http://www.paravirtual.com/content/company/advisory_board.htm 2010年11月26日閲覧。 
  11. ^ “S-1 Supercomputer Alumni: Earl Killian”. Clemson University. (2005年6月28日). http://www.cs.clemson.edu/~mark/s1_alumni.html 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." 
  12. ^ Jochen Liedtke(1995). On micro kernel construction. 15th Symposium on Operating Systems Principles, Copper Mountain Resort, Colorado.
  13. ^ SGI announcing the end of MIPS - ウェイバックマシン(2008年3月7日アーカイブ分)
  14. ^ CPUコアベンダからの脱却 - 変貌するMIPS Technologiesの実像を探る
  15. ^ http://www.mdronline.com/mpr/h/2006/0626/202602.html China's Microprocessor Dilemma
  16. ^ China’s Institute of Computing Technology Licenses Industry-Standard MIPS Architectures
  17. ^ LinuxDevices article about the Municator”. 2012年12月16日時点のオリジナルよりアーカイブ。2010年12月12日閲覧。
  18. ^ Yeelong Specs”. 2012年12月10日時点のオリジナルよりアーカイブ。2010年12月12日閲覧。 (LinuxDevices, Oct. 22, 2008)
  19. ^ Silicon Graphics Introduces Enhanced MIPS Architecture to Lead the Interactive Digital Revolution”. Silicon Graphics, Inc. (1996年10月21日). 2011年2月25日閲覧。
  20. ^ a b Gwennap, Linley (18 November 1996). "Digital, MIPS Add Multimedia Extensions". Microprocessor Report. pp. 24–28.
  21. ^ NEC Offers Two High Cost Performance 64-bit RISC Microprocessors
  22. ^ a b MIPS R3000 Instruction Set Summary
  23. ^ MIPS Instruction Reference
  24. ^ http://www.OVPworld.org
  25. ^ http://www.imperas.com
  26. ^ James Larus. “SPIM MIPS Simulator”. 2007年3月4日閲覧。
  27. ^ http://www.edumips.org
  28. ^ http://courses.missouristate.edu/KenVollmar/MARS/





MIPSアーキテクチャと同じ種類の言葉


固有名詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「MIPSアーキテクチャ」の関連用語



3
30% |||||

4
16% |||||

5
16% |||||

6
16% |||||

7
16% |||||

8
14% |||||

9
14% |||||

10
12% |||||

MIPSアーキテクチャのお隣キーワード

   

英語⇒日本語
日本語⇒英語
   
検索ランキング



MIPSアーキテクチャのページの著作権
Weblio 辞書情報提供元は参加元一覧にて確認できます。

  
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのMIPSアーキテクチャ (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2019 Weblio RSS