ARMアーキテクチャ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/05/12 14:45 UTC 版)
ARMアーキテクチャを採用しているCPU/メーカ
ARMホールディングスの概要にあるように、ARMホールディングスはARMアーキテクチャの設計のみをしており、製造は行ってはいない。ARMはIPコアとして各社にライセンスされ、それぞれの会社において機能を追加するなどしてCPUとして製造される。製造されたCPUはそのまま、あるいはボード上に実装、もしくは製品に組み込まれた形で販売などされる。
以下に『CPUそのもの』『ボード上に実装したもの』などCPUやボードのシリーズ名やブランド名などが明確な主なメーカ名/CPU名/シリーズ名等を記する。
- NXPセミコンダクターズ
- LPC
- LPCXpresso
- mbed
- フリースケール・セミコンダクタ
- i.MX
- Kinetis
- DEC-インテル
- インテル - マーベル・テクノロジー・グループ
- STマイクロエレクトロニクス
- STM32
- サイプレス・マイクロシステムズ
- 東芝
- TX03,TX09シリーズ
- Panasonic
- MN2WS0220シリーズ(スマートテレビ用UniPhier)
- ルネサス エレクトロニクス
- RAファミリ
- RZファミリ
- REファミリ
- EMMA Mobile
- R-Mobile
- R-Car
- R-IN
- Renesas Synergy
- 富士通
32ビットARM
命令セット
ARM は RISC プロセッサであり、Thumb 命令ではなく ARM 命令の場合、その命令セットは
- 32ビット固定長命令
- ロード/ストアアーキテクチャ
- 3オペランドのレジスタ間演算
- 多くの命令が1サイクルで実行可能
といった、多くの32ビットRISCプロセッサに共通する特徴が見られる。
ARMプロセッサは、PC相対アドレッシングやプレ-/ポスト-インクリメント・アドレッシングモードなど、RISCとみなされる他のアーキテクチャと比べ、豊富なアドレッシングモードを持っている。
もう一つ留意すべきことは、ARMの命令セットが時間とともに増加しているということである。例えば、初期のARMプロセッサ(ARM7TDMIより以前のもの)は2バイトの値をロードする命令がなかった。
CPUモード
32ビット ARM アーキテクチャはいくつかのCPUモードを持つ。同時には1つのモードにしかなれない。命令や外部からの割込みなどでモードが切り替わる[35]。
- ユーザーモード
- 唯一の非特権モード。
- 高速割込みモード
- FIQ 割込みが発生したときに切り替わる特権モード。
- 割込みモード
- IRQ 割込みが発生したときに切り替わる特権モード。
- スーパーバイザーモード
- CPU がリセットされたときか SWI 命令が実行されたときに切り替わる特権モード。
- アボートモード
- プリフェッチアボートかデータアボート例外が発生したときに切り替わる特権モード。
- 未定義モード
- 未定義命令が実行されたときに切り替わる特権モード。
- システムモード (ARMv4以降)
- これが唯一例外が原因で切り替わるモードではない。CPSRレジスタにこのモードを書くことによりこのモードに切り替えることが出来る。
- MONモード (要セキュリティ拡張)
- TrustZone 拡張をサポートするために作られたモニターモード。
- HYP 別名 PL2 モード (ARMv7以降)
- 仮想化拡張、ハイパーバイザーモード。[36]
レジスタ
レジスタ R0 から R7 は全ての CPU モードで同一。これらは決してバンクされない。
R13 と R14 はシステムモード以外の全ての特権 CPU モードでバンクされる。独自の R13 と R14 を持つことにより例外からそれぞれのモードに切り替えられる。R13 はスタックポインタ、R14 は関数からの戻りアドレスを持つ。
usr | sys | svc | abt | und | irq | fiq |
---|---|---|---|---|---|---|
R0 | ||||||
R1 | ||||||
R2 | ||||||
R3 | ||||||
R4 | ||||||
R5 | ||||||
R6 | ||||||
R7 | ||||||
R8 | R8_fiq | |||||
R9 | R9_fiq | |||||
R10 | R10_fiq | |||||
R11 | R11_fiq | |||||
R12 | R12_fiq | |||||
R13 | R13_svc | R13_abt | R13_und | R13_irq | R13_fiq | |
R14 | R14_svc | R14_abt | R14_und | R14_irq | R14_fiq | |
R15 | ||||||
CPSR | ||||||
SPSR_svc | SPSR_abt | SPSR_und | SPSR_irq | SPSR_fiq |
別名:
- R13 は SP とも呼ばれ、スタックポインタ
- R14 は LR とも呼ばれ、リンクレジスタ
- R15 は PC とも呼ばれ、プログラムカウンタ
CPSR は下記32ビットを持つ[37]。
- M (ビット 0 - 4) はプロセッサモードビット
- T (ビット 5) は Thumb ステートビット
- F (ビット 6) は FIQ 無効ビット
- I (ビット 7) は IRQ 無効ビット
- A (ビット 8) は不正データアボート無効ビット
- E (ビット 9) はデータエンディアンビット
- IT (ビット 10 - 15 と 25 - 26) は if-then ステートビット
- GE (ビット 16 - 19) は greater-than-or-equal-to ビット
- DNM (ビット 20 - 23) は書き換え禁止ビット
- J (ビット 24) は Java ステートビット
- Q (ビット 27) は sticky overflow ビット
- V (ビット 28) はオーバーフロービット
- C (ビット 29) は carry/borrow/extend ビット
- Z (ビット 30) は零ビット
- N (ビット 31) は negative/less ビット
VFP/NEON用として、これらとは別に32ビット用はs0〜s31のレジスタがある。これらは、64ビットレジスタとしてd0〜d15として使える。s0〜s31とd0〜d15はオーバーラップしている。大半の ARMv7-A SoC はさらに、d16〜d31も使える。
VFP/NEON用のシステムレジスタとして、以下の3つがある。
- FPSCR - Floating-point status and control register (浮動小数点状態制御レジスタ)
- FPEXC - Floating-point exception register (浮動小数点例外レジスタ)
- FPSID - Floating-point system ID register (浮動小数点システムIDレジスタ)
条件実行
ARMの命令セットにおいてユニークなのは、マシン語の最上位4ビットを占める条件コードを使用した条件実行命令であり、これによってほぼ全ての命令を分岐命令無しに条件付きで実行することができる。
これにより、マシン語中の即値フィールドに割けるビット数が減ってしまう等の欠点もあるものの、小さなif文に対応するコードの生成時に分岐命令を避けることが可能になる。例として、ユークリッドの互除法を挙げる。
(この例はC言語による)
int gcd(int i, int j)
{
while (i != j) {
if (i > j)
i -= j;
else
j -= i;
}
return i;
}
ARMのアセンブリ言語では、whileループの部分は以下のようになる。
loop
CMP Ri, Rj ; i と j を比較
SUBGT Ri, Ri, Rj ; もし "GT" ならば i = i - j;
SUBLT Rj, Rj, Ri ; もし "LT" ならば j = j - i;
BNE loop ; もし "NE" ならば loop に戻る
通常分岐命令を使用しなければならないthenやelse節のところで分岐が省かれていることが分かる。
命令セットのもう一つのユニークな機能が、シフト演算を「データ処理」(算術演算、論理演算、レジスタ間の代入)命令の中に織り込むことができることである。例えば、C言語の
a += (j << 2);
のような文を1つのARM命令
ADD Ra, Ra, Rj, LSL #2
として表すことができる。
これにより、多くのARMプログラムは通常RISCプロセッサに期待されるようなプログラムよりも密度の高いものになる。このため、命令フェッチに伴うメモリへのアクセス頻度が少なくなり、分岐に伴うストールも回避しやすく、パイプライン処理を効率的に使うことができる。このことが、ARMがARMより複雑なCPUデザインと競合することを可能にした特徴的な一因のひとつである。
Thumb
ARMプロセッサはThumbと呼ばれるコード効率の向上を意図した16ビット長の命令モードを持っている(SuperHの命令16ビット/データ32ビットに倣い追加された)。条件実行のための4ビットプレディケートが削除されている。メモリポートやバスが32ビットよりも狭い状況において32ビットコードよりも性能が向上する。多くの場合、組み込みアプリケーションでは32ビットのデータパスを持っているのは一部のアドレス範囲のみであり(例: ゲームボーイアドバンス)、残りは16ビットかそれよりも狭くなっている。このような状況では、Thumbコードをコンパイルし、CPUに最も負荷のかかる部分だけを32ビット長の命令セットを使用して手作業で最適化するのが、通常は理にかなっている。Thumb命令とARM命令は単一の実行ファイル内で混在が可能であるが、Thumb命令を実行できるモードとARM命令を実行できるモードは独立しており、両者を使うにはその都度プロセッサの状態を切り替える必要がある。状態の切り替えは分岐命令 (BX, BLX) で行うことができるため、通常は関数単位でThumb命令とARM命令を使い分け、関数呼び出しの際に切り替えを行うのが一般的である。
Thumbテクノロジを搭載した最初のプロセッサはARM7TDMIである。ARM9とそれ以降のファミリは、XScaleも含めて全てThumbテクノロジを搭載している。
Thumb-2
Thumb-2テクノロジは2003年に発表されたARM1156コアで登場した。Thumb-2はThumbの制限された16ビット長の命令セットを追加の32ビット長命令で拡張し、命令セットの幅を広げるものである。公称されているThumb-2の目的は、Thumbと同様のコード密度と32ビットメモリ上でのARM命令セットと同様の性能を得ることであり、Thumb-2はビットフィールド操作、テーブル分岐や条件付き実行などを含んでいる。従来はThumbモードにおいて使用可能な汎用レジスタは8本のみであり自由度が低かったが、Thumb-2で導入された32ビット長命令では16本全てのレジスタが使用可能である。16ビット長命令と32ビット長命令はモードの切り替えなしで混在可能であるため、ThumbモードにおいてもARMモードに近い自由度が得られるようになった。
Jazelle
ARMは、Javaバイトコードをハードウェアでネイティブに実行できる技術を実装した。これはARMやThumbモードと並ぶもう一つの実行モードであり、ARM/Thumbの切り替えと同様にしてアクセスすることができる。後述のJazelle RCTに対してJazelle DBX (Direct Bytecode eXecution) とも言う。
Jazelleテクノロジを搭載した最初のプロセッサはARM926EJ-Sである。CPU名の'J'がJazelleを表している。
Thumb Execution Environment (ThumbEE)
ThumbEEはJazelle RCT (Runtime Compilation Target)とも呼ばれる第4のモードである。2005年にアナウンスされ、Cortex-A8プロセッサで最初に実装された。Thumb-2命令セットに小規模な変更を加えたもので、JITコンパイラのように実行時にコードを生成する場合に向いている。主な対象はJava、.NET MSIL(C#など)、Python、Perlなどの言語である。
DSP 拡張命令
デジタル信号処理とマルチメディアアプリケーション向けに ARMアーキテクチャを拡張するため、いくつかの命令が追加された[2]。ARMv5TE と ARMv5TEJ というアーキテクチャ名の "E" がこれを表していると思われる。
追加された命令は、デジタルシグナルプロセッサアーキテクチャで一般的なものである。例えば、符号付積和演算、飽和加算と飽和減算、「先行する0のカウント」のバリエーションである。
SIMD
ARMv6で導入された[38]。32ビット幅。
Advanced SIMD (NEON)
Advanced SIMD拡張はNEONとも呼ばれ、メディアおよびデジタル信号の処理に向いた64ビットと128ビットのSIMD命令セットである。8/16/32/64ビットの整数演算と、32ビット (単精度) 浮動小数点演算のためのSIMD命令が定義されており、ARMv7から利用可能。32ビットCPUでは倍精度浮動小数点数は利用不可で、倍精度にはVFPを使用。
ほとんどの ARMv7 SoC で NEON に対応しているが、NVIDIA Tegra 2 シリーズ、SPEAr1310、SPEAr1340 などで対応していない。
レジスタはVFPレジスタとして用意されている32本の64ビットレジスタを用いて、32本の64ビットSIMDレジスタ (D0-D31) 、もしくは16本の128ビットSIMDレジスタ (Q0-Q15) としてアクセスできる。例えば128ビットレジスタQ0はD0とD1の2つの64ビットレジスタの領域にマッピングされている。
Cortex-A15 などより、NEONv2 (version 2) が搭載され、Fused Multiply-Add ができる。これにより、単精度浮動小数点数で 8 FLOPS/cycle となった。
Wireless MMX
Wireless MMX (WMMX) はインテルがXScaleプロセッサ向けに開発したSIMD命令セットである。64ビット幅のレジスタが16本用意されており、8/16/32/64ビットのSIMD整数演算が可能。XScaleとその売却先であるマーベル・テクノロジー・グループ製のARM SoCに採用されている。命令セット自体はx86プロセッサのMMXとは全く異なるものの、GCCやVisual C++等のコンパイラで利用できる組み込み関数はMMXとの互換性がある程度確保されており、これを利用すればMMX向けに記述されたコードを比較的容易に移植することができる。
VFP
VFP (Vector Floating Point) はARMアーキテクチャのコプロセッサ拡張である。半精度(v3以降)・単精度・倍精度の浮動小数点演算機能を提供する。
- VFPv1 - 廃止
- VFPv2 - ARMv5TE、ARMv5TEJ、ARMv6 で利用可能
- VFPv3 - ARMv7 で利用可能。通常はレジスタ数32個であるが、NVIDIA Tegra 2 シリーズなどはレジスタ数が半分のVFPv3-D16を採用。Cortex-A8の実装はパイプライン化されておらず非常に低速 (VFP Lite)。
- VFPv4 - Cortex-A5, A7, A15, Apple A6, Snapdragon Krait などで利用可能。IEEE754準拠の(乗算結果の丸めを行わない)Fused multiply add 対応。VFPv4-D16 もあり。
"Vector" の名を冠する通り、いくつかの命令においてはベクタモードと呼ばれる1命令で複数のレジスタに対して演算を行うモードが用意されている。このモードを使えばSIMD演算が可能であるが、プログラミングモデルがやや煩雑[注釈 1]であったことや、当時のARM11プロセッサにおける実装はスカラ命令を要素数分だけシーケンシャルに実行するというSIMD演算のメリットを享受できないものであったため、あまり積極的には使われなかった。VFPv3を実装するARMv7世代以降ではモダンなSIMD命令セットであるAdvanced SIMD拡張命令 (NEON) が導入されたため、現在ではベクタモードの利用は推奨されていない。Cortex-A9やA15ではベクタモードに対応していない[注釈 2]ことから分かるように、現在のARMアーキテクチャにおけるVFPの位置づけはスカラ専用の浮動小数点演算コプロセッサであり、SIMD演算用途についてはNEONに道を譲っている。
単精度の浮動小数点演算はNEONでも実行可能であるが、倍精度の浮動小数点演算やIEEE754準拠の4つの丸めモード、非正規化数のサポート等はNEONには存在しないため、これらを利用したい場合はVFP命令を使う必要がある。
64ビットARM
この節の加筆が望まれています。 |
ARMv8-Aから採用。ARMの64ビットモードアーキテクチャAArch64では、汎用レジスタはすべて64ビットとなり、数も16個から31個に増やされる。サーバ用途も意識して仮想化支援命令および暗号支援命令が追加され、SIMD拡張命令であるNEONも大幅に強化される。
命令セットの特徴
汎用レジスタの増加と64ビット化に伴い、命令セットは完全に再定義されている。コード効率を重視して命令長は32ビットのままで、32ビットARMの特徴であった条件付き実行命令の大半が削除される。これによって一般的なRISC命令セットに近くなったが、依然としてコードサイズを小さくするための工夫が随所に織り込まれている。
AArch64モードにおける命令セットはA64と呼ばれ、以下にA64命令セットの特徴を示す。
- 即値シフト付きオペランド
- これは従来の32ビットARM命令セットにおいてフレキシブル第2オペランド (Flexible second operand) と呼ばれていたものに相当する。多くの基本的な演算命令においては、入力オペランドのうち1つに対する操作を即値左シフト、即値論理右シフト、即値算術右シフト、シフトなし、の4つから選択することができ、演算命令と即値シフト命令を一体化することができる。なお、従来とは異なりローテートは不可能となった。
- 条件付き実行命令
- 汎用レジスタ数が倍増したのに伴い、基本命令の多くからは条件付き実行機能が削除されたが、それでも比較的豊富な条件付き実行命令が定義されている。代表的なものを挙げるとCCMP(条件付き比較)、CINC(条件付きインクリメント)、CSEL(条件付き選択; いわゆるCMOV)等が存在する。
- Compare-and-Branch命令
- PC相対分岐においては、ゼロフラグを参照する場合のみであるが比較と条件分岐を1命令で行うことが可能になっている (CBZ/CBNZ)。これは従来Thumb-2命令セットでのみ定義されていたものであるが、A64モードでは基本命令として定義されている。
- 符号拡張/ゼロ拡張付き命令
- 算術演算/比較命令については、入力オペランドのうち1つを8,16,32ビットから32もしくは64ビットに符号/ゼロ拡張するバージョンが用意されている。
汎用レジスタは64ビット幅であるが、多くの演算命令にはレジスタの下位32ビットのみを参照する32ビット命令が用意されている。この場合、レジスタの部分書き換えが発生しないように、演算結果の32ビットの値は暗黙のゼロ拡張が行われた上で64ビットレジスタに格納される。
SIMD and Floating-point (NEON) 命令
A64命令セットにおいては従来のVFPとAdvanced SIMD (NEON) は統合され、一つの命令体系となった。これに伴い、名称については単にSIMD and Floating-point命令と呼ばれるようになった。
主な変更点は倍精度浮動小数点演算への対応、IEEE754への準拠、レジスタ本数の増加の3点である。レジスタについては128ビットのレジスタが32本に増加している。依然として64ビットレジスタとしてアクセスすることも可能であるが、32ビットモードとは異なり、64ビットレジスタは128ビットレジスタの下位64ビットにマッピングされている。
VFPとAdvanced SIMDの統合に伴い、従来はVFPが担っていたスカラの浮動小数点演算命令は、SIMDレジスタのうち下位の32/64ビットにのみ作用する命令として再定義されている。例えば浮動小数点加算命令については
fadd s2, s1, s0 ; s2 <= s0 + s1(単精度スカラ)
fadd d2, d1, d0 ; d2 <= d0 + d1(倍精度スカラ)
fadd v2.4s, v1.4s, v0.4s ; [v2] <= [v0] + [v1](単精度x4 SIMD)
fadd v2.2d, v1.2d, v0.2d ; [v2] <= [v0] + [v1](倍精度x2 SIMD)
のようなバリエーションが命令のニーモニックを保ちつつ、オペランドのプレフィックス (s, d, v) とサフィックスを変更することによって記述可能になっている(サフィックスについては、一部の環境向けのアセンブラではニーモニック側に付加する省略記法も許されるようである)。これはx86プロセッサのSSE命令セットがスカラ命令とSIMD命令の双方を備えているのとよく似ている。
Scalable Vector Extension 2
ARMv9策定で、富岳に使われたA64FXのScalable Vector Extension[39]を発展させて汎用化したベクトル拡張を中心とした追加命令[40]。SVE2[41]
SIMD and Floating-point命令と比較して、次の特徴がある[39]。
- スケーラブルなベクトル長(VL)
- ベクトル長に囚われない(VLA)プログラミング
- ギャザー・ロードとスキャッター・ストア
- レーン単位の条件付き実行制御
- 条件付き実行制御主導のループ制御と管理
- ベクトル・パーティショニングとSW管理の投機
- 拡張整数および浮動小数点演算の水平方向の縮小
- スカラー化内部ベクトル・サブループ
注釈
出典
- ^ Arm’s Solution to the Future Needs of AI, Security and Specialized Computing is v9
- ^ “Arm® (日本)|半導体IP|アーム公式サイト – Arm®”. arm.com. 2022年11月18日閲覧。
- ^ “世の中ARMだらけ!? 現代社会を支える「ARM」ってなんだろう?”. ドスパラ. 2022年11月18日閲覧。
- ^ “ARMとは”. コトバンク. 2022年11月18日閲覧。
- ^ “Armがマイコン向けハイエンドCPUコア、Cortex-M85発表”. 日経. 2022年11月18日閲覧。
- ^ http://www.arm.com/miscPDFs/3823.pdf
- ^ [1]
- ^ http://www.jp.arm.com/pressroom/08/080125.html
- ^ https://news.mynavi.jp/techplus/article/20100910-cortex-a15/
- ^ http://ascii.jp/elem/000/000/645/645995/
- ^ Smotherman, Mark. “Which Machines Do Computer Architects Admire?”. 2011年9月19日閲覧。
- ^ “スマートフォンを席巻するARMプロセッサーの歴史”. ASCII.jp (2010年12月20日). 2013年7月24日閲覧。
- ^ “ARMが初の64ビットCPU「Cortex-A50シリーズ」発表、サーバー向けに16コア以上に対応”. ITpro (2012年11月1日). 2014年11月27日閲覧。
- ^ 2005年、ARM社のセミナー資料による。
- ^ “Sony Japan | プレスリリース| クリエ用新アプリケーションCPU「Handheld EngineTM」の開発について”. www.sony.co.jp. 2019年4月8日閲覧。
- ^ News:米速報:次世代マイクロアーキテクチャ「ARM11」発表
- ^ Googleが新型「Chromebook」を発表、Samsung製で249ドル
- ^ 【PC Watch】 Samsung、初のARM Cortex-A15プロセッサ「Exynos 5250」
- ^ 日本TI、モバイルの概念を一変させる高性能、高機能のOMAP™5プラットフォームを発表
- ^ 【後藤弘茂のWeekly海外ニュース】 ARMが次世代CPU「Atlas」と「Apollo」の計画を発表
- ^ AMD’s K12 ARM CPU Now In 2017
- ^ 苦難の2013年を越え、輝かしい2014年に賭けるAMD (大きな期待が寄せられているサーバー向け64ビットARMプロセッサ)
- ^ ARM Sets New Standard for the Premium Mobile Experience - ARM
- ^ Qualcomm Introduces Next Generation Snapdragon 600 and 400 Tier Processors for High Performance, High-Volume Smartphones with Advanced LTE | Qualcomm
- ^ "ARM Cortex-M1", ARM product website. Accessed April 11, 2007.
- ^ "ARM Extends Cortex Family with First Processor Optimized for FPGA", ARM press release, March 19 2007. Accessed April 11, 2007.
- ^ ARM Cortex-M1
- ^ Actel: 製品とサービス: プロセッサ: ARM: Cortex-M1
- ^ AnandTech | Cortex-M7 Launches: Embedded, IoT and Wearables
- ^ Cortex-M7 Overview - ARM
- ^ Cortex-M23 Overview - ARM
- ^ Cortex-M33 Overview - ARM
- ^ “ARMv8-A Synchronization primitives”. p. 6. 2024年1月3日閲覧。
- ^ Ltd, Arm. “Cortex-A78C”. Arm | The Architecture for the Digital World. 2023年1月14日閲覧。
- ^ “Processor mode”. ARMホールディングス. 2013年3月26日閲覧。
- ^ “KVM/ARM”. 2013年4月3日閲覧。
- ^ 2.14. The program status registers - Cortex-A8 Technical Reference Manual
- ^ DSP & SIMD - ARM
- ^ a b “ARM、Hot ChipsでHPC用のスケーラブル・ベクトル拡張を公表”. HPCwire Japan (2016年8月28日). 2022年1月2日閲覧。
- ^ 株式会社インプレス (2021年3月31日). “Arm、10年ぶりの新アーキテクチャ「Armv9」。富岳のSVE改良版やコンフィデンシャルコンピューティング機能追加”. PC Watch. 2022年1月2日閲覧。
- ^ “Documentation – Arm Developer”. developer.arm.com. 2022年1月2日閲覧。
- 1 ARMアーキテクチャとは
- 2 ARMアーキテクチャの概要
- 3 概要
- 4 歴史
- 5 主な採用製品
- 6 コアの性能と採用実績
- 7 ARMアーキテクチャを採用しているCPU/メーカ
- 8 脚注
ARMアーキテクチャと同じ種類の言葉
固有名詞の分類
- ARMアーキテクチャのページへのリンク