命令セット (めいれいせっと、英 : instruction set )はプロセッサ命令 の集まりである。すなわちコンピュータ のハードウェア に対して命令を伝えるための言葉の語彙である[ 1] 。
概要
プロセッサ は命令 を実行することで処理をおこなう。プロセッサが受け入れ可能な命令はプロセッサごとに異なり、あるプロセッサが受け入れ可能な命令 の集合 を命令セット という。
命令はバイナリ形式であるため、命令セットは受け入れ可能なバイナリの単なる一覧である。しかし実際に命令セットを利用するには各命令の意味(セマンティクス)を理解する必要がある。命令セットはこのセマンティクスをバイナリ列で表現したものとも言えるため、「命令セット」という語はレジスタ 種別やアドレッシングモード などを含む「プロセッサモデルとその命令群」という意味で用いられる[ 2] 。
プロセッサ間で共通化された、インターフェースとしての論理的な命令セットは命令セットアーキテクチャ (英 : instruction set architecture, ISA )と呼ばれる。ISAに対してプログラミングをおこない、ISAに対してプロセッサ実装をおこなうことで、単一のISAに対して書かれたプログラムが様々なプロセッサで動作する。
要素
命令セットは複数の要素を組み合わせて設計されている。
これらの要素は最終的に「利用可能な命令の一覧」という形でインターフェースとなる。
レジスタ
ISAにおけるレジスタ (英 : register )はオペランドとして利用できる記憶領域である。論理レジスタ (英 : logical register )とも呼ばれる。レジスタの構成(用途・bit深度・数/本数)はISAによって異なる。例えばIA-32 は8本のGPレジスタを持つ[ 3] がX64 は16本のGPレジスタを持つ[ 4] 。
論理レジスタという名称はマイクロアーキテクチャ 上で定義されるレジスタ(物理レジスタ /physical registers)との区別を意図した名称である。ソフトウェアはインターフェースとしての論理レジスタに対してプログラミングされ、処理系であるCPUは論理レジスタを物理レジスタへマッピングして実処理をおこなう。この抽象化により並行計算などの最適化が可能になっている。
命令セットの設計
マイクロアーキテクチャを設計するとき、技術者はRegister Transfer Language(コンパイラの中間形式と同じ名前だが直接の関係はない)を使って ISAの各命令の処理を定義する。
ISAをプロセッサ として実装する方法が歴史的に大きく2つ存在している。この記事は実装についての記事ではないので深くは扱わない。詳細はCPU設計 などの記事を参照のこと。
この他、エミュレータ や仮想機械 などインタプリタ 型のソフトウェアによる実装や、ハードウェア記述言語 などでFPGA などのプログラマブルロジックデバイス のコンフィギュレーションとして記述されたソフトプロセッサ がある。
今日、新たなISA(あるいはマイクロアーキテクチャ)を開発しようとするベンダーはソフトウェアエミュレータを作って、ハードウェアが完成する前にソフトウェア開発者 が開発に取り掛かることができるようにするのが一般的である。
命令セットの設計では、一部のオペコードをソフトウェア割り込み に利用する。例えば、6502 では0x00、Z80 では0xFF[ 5] など、68000 では0xA000から0xAFFFがソフトウェア割り込みに使われた。
PopekとGoldbergの仮想化要件 に適合した命令セットでは、高速な仮想機械の実装が容易になる。
複数プロセッサを搭載するシステムでは、命令セットでフェッチ・アンド・アッド 、LL/SC 、コンペア・アンド・スワップ などの機能をサポートすることで排他制御 の実装が容易になる。
コード密度
初期のコンピュータでは、メモリは高価で容量が少なかったため、メモリ上のプログラムのサイズを削減することが重要な課題であった。そのため、ある作業をするのに要する命令列のサイズを「コード密度; code density」と呼び、命令セットの重要な特性の1つとしていた。コード密度の高い命令セットでは、1つの命令で一度にいくつもの機能を実行できるようになっている。そのような複雑な命令セットを持つコンピュータ (CISC ) では、基本的な操作(加算、乗算、サブルーチンへの分岐など)に加えて、メモリアクセス、レジスタのインクリメントといった操作を同時に行う。ソフトウェア実装の命令セットではさらに複雑な命令も存在する。
RISC は、メモリの低価格化に伴って登場した考え方であり、命令セットを単純化することでコード密度は低下する。RISCでは、各命令はレジスタ同士の加算などといった単純な操作しか行わない。
MISC (Minimal Instruction Set Computer) はスタックマシン の一種であり、命令数は非常に少なく(16から64種)、1ワードに複数の命令を格納可能となっている。MISCの実装にはチップ面積はごく小さくて済み、FPGA やマルチコア での実装に適している。コード密度はRISCと同程度である(メモリ当たりの命令密度は増加しているが、命令数が少ないため、より多くの命令実行を必要とする)。例えば、FORTH 言語を実装したチップがある[1] 。
命令セットの分類方法として、最も複雑な命令のオペランド数で分類する方法がある(以下で、a 、b 、c はメモリアドレス、reg1 などはレジスタを意味する)。
0オペランド(ゼロアドレスマシン) - スタックマシン とも呼ばれ、全てのオペランドをスタック から取り出して使用する。2つの数を加算する処理は4命令 (push a , push b , add , pop c ) で行われる。
1オペランド - 初期のコンピュータでよく使われたモデルで、1つのオペランドを使って処理をし、結果をアキュムレータに格納する。2つの数を加算する処理は3命令 (load a , add b , store c ) で行われる。
2オペランド - RISCマシンのほとんどはここに分類される。CISCマシンもここに分類されるものが多い。RISCの場合、2つの数を加算する処理は4命令 (load a,reg1 , load b,reg2 , add reg1,reg2 , store reg2,b ) で行われる。
3オペランド - 一部のCISCと、RISC の中ではごく一部に過ぎないがRISCの特徴を最も良く表すとされる、RISC I 、MIPS、RISC-Vがここに分類される。CISCの場合、2つの数を加算する処理は1命令 (add a,b,c ) で行われるか、より一般的には(3つのオペランドがあっても、メモリを指定できるのはそのうち2つであることが多いため)2命令 (move a,reg1 , add reg1,b,c ) で行われる。RISCの場合、オペランドが3つであってもメモリアクセスと加算は別命令となるため、さらにロード命令とストア命令が必要になる。レジスタが32本なら、3つのオペランドを指定するのに15ビット必要となり、必然的に命令サイズは32ビットかそれ以上でなければならない。
4以上 - 一部のCISCでは3つ以上のレジスタを指定してメモリアクセスを行う命令が存在する。
コード密度を改善する機構として実行ファイル圧縮 が研究されてきた。関連する数学上の概念としてコルモゴロフ複雑性 がある。
機械語
機械語は個々の命令から構成される。アーキテクチャにもよるが、命令は通常、以下のいずれか(あるいは複数)を指定する。
算術演算、アドレス指定、制御用途にレジスタ を指定する。
メモリ位置やオフセットを指定する。
オペランドを解釈するためのアドレッシングモード を指定する。
このような単純な命令を組み合わせてより複雑な操作を構築し、(ノイマン型 であれば)これを逐次的に実行したり、制御フロー 命令で順序を変えたりする。
多くの命令セットに共通な操作として、以下のものがある。
移動(コピー)
レジスタ に固定の定数値を格納する。
あるメモリ位置からレジスタにデータを移動する(または逆方向)。そのデータに対して後から何らかの計算を行い、結果をメモリに格納する。
ハードウェア機器からデータを読み込んだり、逆にデータを書き込んだりする。
計算
加算、減算、乗算、除算。2つのレジスタの内容についてそれら演算を行い、結果をレジスタに格納する。
ビット演算 。2つのレジスタのビット位置毎の論理和や論理積を計算したり、1つのレジスタのビット毎の否定を計算する。
2つのレジスタの値の比較(等しいかどうか、どちらが大きいかなど)
制御フローの変更
プログラム内の別の位置にジャンプし、そこの命令を実行する。
ある条件が成り立つときだけ別の位置にジャンプする。
別の位置にジャンプするが、その際にジャンプ元の次の命令の位置を記憶しておき、後でそこに戻る(サブルーチン )
コンピュータによっては命令セット内に複雑な命令を持っている。通常ならいくつもの命令を使わなければならないような操作を1つの命令で実現している。一般にそのような命令は内部で複数のステップに分解され、複数の実行ユニットを使って実現される。さもなくば、プロセッサの回路規模が大きくなりすぎることになる。そのような複雑な命令として以下のようなものがある。
最近普通に実装されるようになった複雑な命令として、SIMD (Single-Instruction Stream Multiple-Data Stream) 命令またはベクター命令 がある。これは、同じ演算操作を複数のデータに同時に行うものである。SIMD によって大きなベクトルや行列の操作を短時間で行うことが可能となる。また、音声、画像、動画などの並列化 されたアルゴリズムを高速に実行できる。SIMD の実装には様々なマーケティング上の名称がつけられている(MMX 、3DNow! 、AltiVec など)。
命令セットの設計は複雑な問題である。マイクロプロセッサの歴史は命令セットの設計で2つの段階に分けられる。当初、CISC すなわち複雑な命令セットが実装されていた。1970年代、IBMなどで研究が行われ、多くの命令が省略可能であることが判明した。その結果 RISC すなわち縮小された命令セットが登場した。命令セットが縮小されることで、クロックを高速化でき、プロセッサのサイズを小さくでき、電力消費を低減させることが可能となった。極端なRISCでなくとも、典型的な操作を最適化し、メモリやキャッシュ の効率を向上させ、プログラミングを単純化させることができる。
命令セットアーキテクチャ
命令セットアーキテクチャ (英 : instruction set architecture , ISA )はプロセッサ の論理的動作を定義づける、ハードウェア とソフトウェア のインタフェース である[ 6] [ 7] 。すなわち、インターフェースとして定義される論理的な命令セットである。
ISA登場前、各プロセッサは自身の動作を表現する独自の命令セットを有していた[ 8] 。ゆえにソフトウェア開発者は各プロセッサの命令セットを理解し、各プロセッサ向けに異なるプログラムを用意する必要があった。プロセッサ種が増えるにつれこの形は非効率になっていき、インタフェース の必要性が認識された[ 9] 。すなわち、論理的/仮想的なプロセッサの命令セットを先行して定義する方式である。この方式では、ハードウェア開発者は良いインタフェース実装を作れれば幅広いユーザを獲得でき、同時にソフトウェア開発者は単一の命令セットに対してプログラミングするだけで幅広いプロセッサで動作するプログラムを作成できる[ 10] 。こうして考案された、プロセッサの論理的動作を定義づける、ハードウェアとソフトウェアのインタフェースが命令セットアーキテクチャである[ 6] [ 7] 。
ISAはコンピュータ・アーキテクチャ の一部であり、レジスタ の構成、命令 、アドレッシングモード など[ 11] から構成される。ISAでは命令を二進数のコード(オペコード +オペランド)のセットで表現する。これは機械語 とも呼ばれる。
ISAの実装様式をマイクロアーキテクチャ という。マイクロアーキテクチャはマイクロコード 、パイプライン 、キャッシュ システムなどを含む。ISAに対する異なるマイクロアーキテクチャの例として、x86 ISA に対するインテル のPentium とAMD のAthlon が挙げられる。
この概念を拡大したユニークなISAとしてTIMI (Technology-Independent Machine Interface) があり、これはシステム/38 とAS/400 で使われている。TIMIは最近では仮想機械 として知られるソフトウェアで実現されている。これはプラットフォームとそこで動作するアプリケーションの寿命を延ばすために設計されたもので、プラットフォーム全体を全く異なるハードウェアに移行してもTIMI自身だけを移植すれば、その上のオペレーティングシステムもアプリケーションもそのまま動作する。このためIBM はAS/400のハードウェアを古いCISC からPOWER に移行させたが、オペレーティングシステム (OS) を含めたソフトウェアは全く変更せずに済んだ。
論理スイッチアーキテクチャの基本的な構成要素はフローテーブルである。スイッチに入る各パケットは、1つまたは複数のフローテーブルを通過する。各フローテーブルは、エントリと呼ばれるいくつかの行で構成され、7つのコンポーネントで構成される[ 12] 。
ISA一覧
この一覧は完全ではない。古いものは省かれていて、新しいものはこれからも出てくるだろう。
商用のマイクロプロセッサ やマイクロコントローラ は様々なISAを実装している。
ISAのカスタマイズも非常によく見られる。
ハードウェアで実装されたISA
ハードウェアでも実装されたが一般にはソフトウェアで実装されているISA
ハードウェアに実装されていないISA
関連項目
ISAのカテゴリー
特殊な命令セットの利用例
何らかのISAを実装しているハードウェア
その他
脚注
^ パターソン&ヘネシー(上) p.44
^ "プロセッサが実行できる命令の集合を命令セット ... と呼ぶ.実際には,プログラムから使用できるレジスタの種類,メモリアドレスの指定方法なども含めて命令セットと呼ぶのが通常である" 鏡. (2015). 計算機工学 - 5 命令セットアーキテクチャ . 東北大学.
^ "basic execution environment for an IA-32 processor ... The eight general-purpose registers" Intel. (2006). Intel® 64 and IA-32 Architectures Software Developer’s Manual . Vol.1. p.3-3
^ "The execution environment for 64-bit mode ... The number of general-purpose registers (GPRs) available is 16." Intel. (2006). Intel® 64 and IA-32 Architectures Software Developer’s Manual . Vol.1. p.3-6
^ Ganssle, Jack. "Proactive Debugging" . 2001年 2月26日
^ a b "命令セットアーキテクチャ ... ソフトウェアとハードウェアのインタフェース" 天野. マイクロプロセッサ特論 - 第5回 RISCの命令セットアーキテクチャ . 慶應義塾大学.
^ a b "命令セットアーキテクチャ ... コンピュータに何ができるかをユーザに示し、 どのようなハードウェア機能が必要かをハードウェア設計者に教えるものである。" 森. (2020). コンピュータアーキテクチャ . 福井大学.
^ "コンピュータの草創期、開発したマシン毎に命令セットを決め、 それに合わせてソフトウェアを作っていました。" 天野. マイクロプロセッサ特論 - 第5回 RISCの命令セットアーキテクチャ . 慶應義塾大学.
^ "命令セットアーキテクチャ ... この概念はIBM360開発時に明確になった ... IBMは一連の製品の命令セットを統一し、ソフトウェアとハードウェアのインタフェースとしてのISAを明確に定義しました。" 天野. マイクロプロセッサ特論 - 第5回 RISCの命令セットアーキテクチャ . 慶應義塾大学.
^ "プログラマは、ハードウェアの詳細を気にすること無しにISAを対象に ... 作り、ハードウェア設計者は、ISAの仕様を満足するように、要求性能、コストが違う様々な製品を作れば、全ての製品で同じソフトウェアが動作" 天野. マイクロプロセッサ特論 - 第5回 RISCの命令セットアーキテクチャ . 慶應義塾大学.
^ その他: メモリマネジメント 、割り込み と例外処理 、入出力
^ Stallings, William (2016). Foundations of modern networking : SDN, NFV, QoE, IoT, and Cloud . Florence Agboma, Sofiene Jelassi. Indianapolis, Indiana. ISBN 978-0-13-417547-8 . OCLC 927715441 . https://www.worldcat.org/oclc/927715441
参考文献
デイビッド・A・パターソン, ジョン・L・ヘネシー 著、成田光彰 訳『コンピュータの構成と設計 ハードウェアとソフトウェアのインターフェイス』 上(第三版)、日経BP、2006年。ISBN 4-8222-8266-X 。
外部リンク