ARMアーキテクチャ

**ARMアーキテクチャ**（アームアーキテクチャ） とは、ARMホールディングスの事業部門であるARM Ltd.により設計・ライセンスされているアーキテクチャである。組み込み機器や低電力アプリケーションからスーパーコンピューターまで様々な機器で用いられている。

## 概要
ARMアーキテクチャは消費電力を抑える特徴を持ち、低消費電力を目標に設計されるモバイル機器において支配的となっている。本アーキテクチャの命令セットは「（基本的に）固定長の命令」「簡素な命令セット」というRISC風の特徴を有しつつ、「条件実行、定数シフト/ローテート付きオペランド、比較的豊富なアドレッシングモード」といったCISC風の特徴を併せ持つのが特徴的だが、これは初期のARMがパソコン向けに設計された際、当時の同程度の性能のチップとしてはかなり少ないゲート数（約25,000トランジスタ）で実装されたチップの多くの部分を常に活用する設計として工夫されたもので、回路の複雑さを増さないという方向性だというように見れば、CISC風の特徴というよりむしろRISC風の特徴とも言える。このような設計が、初期の世代の実装において、（性能の割に）低消費電力、小さなコア、（RISCとしては）高いコード密度といった優れた特性に結びつき、広く普及する原動力となった。

2005年の時点で、ARMファミリーは32ビット組込みマイクロプロセッサ（乃至、特にマイクロコントローラ）のおよそ75%を占め、全世界で最も使用されている32ビットCPUアーキテクチャである。ARMアーキテクチャに基づくCPUコアは、PDA・携帯電話・メディアプレーヤー・携帯型ゲーム・電卓などの携帯機器から、ハードディスク・ルータなどのPC周辺機器まで、あらゆる電子機器に使用される。2015年現在、携帯電話では9割超のシェアがある。

携帯機器や電子機器の高性能化に伴いARMコアの出荷数は加速度的に伸びており、2008年1月の時点で100億個以上、2010年9月の時点で200億個以上が出荷されている。ARMアーキテクチャを使用したプロセッサの例としては、テキサス・インスツルメンツのOMAPシリーズやマーベル・テクノロジー・グループのXScale、NVIDIAのTegra、クアルコムのSnapdragon、フリースケールのi.MXシリーズ、ルネサス エレクトロニクスのRZファミリ、Synergyなどがある。

既存のARMプロセッサは組み込みとクライアントシステムに特化していたため全て32ビットであるが、顧客からは電力効率に優れるARMアーキテクチャのサーバへの応用を望む声が高まり、ARM社は2011年10月27日、ARMの64ビット拡張であるAArch64(ARM64)を実装したARMv8アーキテクチャを発表した。

## 歴史
ARMの起源は、1980年代初頭のイギリスのコンピュータ業界に見出すことができる。1983年、イギリスのエイコーン・コンピュータ(Acorn Computers、エイコーン)が画期的なプロジェクト、Acorn RISC Machine（ARM）を開始した。このプロジェクトは、BBC Microの成功を受けて、エイコーンが次世代マシンの開発を目指す中で生まれた。当時、エイコーンは既存の6502プロセッサの性能限界に直面しており、より効率的で低消費電力のプロセッサ、具体的には高性能な32ビットプロセッサの開発が急務となっていた。

プロジェクトの中心となったのは、ソフィー・ウィルソン(Sophie Wilson)とスティーブ・ファーバー(Steve Furber)を含む少数の技術者たちだった。ウィルソンは命令セットアーキテクチャの設計を担当し、ファーバーはハードウェア設計をリードした。彼女らは、とスタンフォード大学の研究に影響を受け、RISC（縮小命令セットコンピューティング）アーキテクチャを採用することを決定した。RISCアーキテクチャの単純な命令セットにより、高速で効率的な処理の実現が期待された。

開発プロセスは綿密に進められた。まず、既存の商用プロセッサの性能を詳細に分析し、次にシミュレータを使用して新しいアーキテクチャをテストした。

開発チームは社を「シリコンパートナー」として選び、エイコーンが設計を提供し、VLSIがレイアウトと製造を担当した。1985年4月26日に受け取った最初のARMシリコンチップは正常に動作し、これが「**ARM1**」と呼ばれるバージョンで、6MHzで動作していた。このARM1は、BBC Micro用のセカンドプロセッサとして初めて実用化され、サポートチップ(MEMC (MEMory Controller), VIDC (VIDeo and sound Controller), IOC (Input Output Controller))の開発を促進し、ARM2の開発にも使用された
。また、は後にアセンブリ言語で書き直され、これにより命令セットに精通した開発者たちは非常に高密度なコードを作成することができた。このARM版BBC BASICは、ARMエミュレータのテストにおいても非常に優れたベンチマークとなった。

このARM1でのシミュレーション結果を元に、1986年末に**ARM2**が8MHzで登場し、翌年には10〜12MHzで動作するバージョンがリリースされた。ARM2には大きなアーキテクチャの改良が施され、以前はソフトウェアで処理されていた乗算が、ブースの乗算アルゴリズムによりハードウェアで実装された。また、新たに追加された「FIQ（Fast Interrupt reQuest）モード」により、割り込み処理時にレジスタ8〜14が自動的に置き換えられるようになり、割り込み処理が高速化された。

ARM2は、1987年に発売されたAcorn Archimedesシリーズのパーソナルコンピュータ（A305、A310、A440）で初めて使用された。Dhrystoneベンチマークによれば、ARM2は7MHzで動作するMC68000ベースのシステム（AmigaやMacintosh SEなど）に比べ約7倍の性能を誇り、16MHzのIntel 80386とほぼ同等の速度を持っていた。高価なSun SPARCやMIPS R2000のRISCベースワークステーションに次ぐ性能を示しながらも、デスクトップパソコンと同程度の価格で提供された。ARM2は、高速I/Oに対応するよう設計され、他のシステムに見られるDMAコントローラのようなサポートチップを省略し、設計を大幅に簡略化したことで、ワークステーション並みの性能を手頃な価格で実現した。

ARM2は32ビットのデータバス、26ビットのアドレス空間、そして16個の32ビットレジスタ（プログラムカウンタを含む）を備えていた。ARM2のトランジスタ数はわずか30,000個で、Motorola 68000の68,000個と比べて非常に少なかった。この簡素化は、ARM2がマイクロコードを持たないことや、キャッシュを搭載していないことによるもので、その結果、低消費電力と簡単な熱処理が可能となった。それでも、ARM2は1987年のIBM PS/2シリーズに搭載されたIntel 80286やIntel 386に比べ、優れた性能を提供していた。

後継機である**ARM3**は、4KBのキャッシュを搭載し、さらなる性能向上を実現した。

1980年代後半、Apple Computer（現:Apple）はエイコーンと共同で新しいARMコアの開発に取り組んだ。この作業は非常に重要視されていたため、エイコーンは1990年に開発チームをスピンオフしてAdvanced RISC Machinesという新会社を設立した。このため、ARMは本来のAcorn RISC Machineではなく**Advanced RISC Machine**の略であるという説明をよく見かけることになる。Advanced RISC Machinesは、1998年にロンドン証券取引所とNASDAQに上場した際、ARM Limitedとなった。

この経緯により、**ARM6**が開発された。1991年に最初のモデルがリリースされ、AppleはARM6ベースのARM610をApple Newtonに採用した。

これらの変化を経てもコアは大体同じサイズに収まっている。ARM2は30000個のトランジスタを使用していたが、ARM6は35000個にしか増えていない。そこにあるアイデアは、エンドユーザーがARMコアと多くのオプションのパーツを組み合わせて完全なCPUとし、それによって古い設備でも製造でき、かつ安価に高性能を得られる、というものである。

このARM6の改良版である**ARM7**も、ARM6を採用した製品群に引き続き採用されたほか、普及期に入りつつあった携帯電話にも広く採用されたことから、今日のARMの礎ともなった。

さらに、新世代のARMv4アーキテクチャに基いてARM7を再設計したものが**[[:en:ARM7TDMI|ARM7TDMI]]**である。ARM7TDMIはThumb命令（後述）を実装し、低消費電力と高いコード効率を両立する利点を備えていたことから、ライセンスを受けた多くの企業によって製品化され、特に携帯電話やゲームボーイアドバンスといった民生機器に採用されたことから、莫大な数の製品に搭載された。なお、TDMIとはThumb命令、デバッグ (Debug) 回路、乗算器 (Multiplier)、ICE機能を搭載していることを意味している。しかし、これより後のコアには全てこれらの機能が標準的に搭載されるようになったため、この名称は省かれている。

DECはARMv4アーキテクチャの設計のライセンスを得てStrongARMを製造した。233MHzでStrongARMはほんの1Wの電力しか消費しない（最近のバージョンはさらに少ない）。この業績は後に訴訟の解決の一環としてインテルに移管され、インテルはこの機会を利用して古くなりつつあったi960をStrongARMで補強することにし、それ以降XScaleという名で知られる高性能の実装を開発した。

以後も、StrongARMの技術のフィードバックを受けた**ARM9**や**ARM10**を経て、NECとの提携などによって携帯電話向けプロセッサとしての地位を確固たるものにした**ARM11**をリリースする。

1990年代には、AMULETという、非同期の部分を持つことを大きな特徴とするシリーズも開発された（広く採用されるには至らずだったが）。

2005年には製品ラインナップを一新し、高機能携帯電話などのアプリケーションプロセッサ向けである**Cortex-A**、リアルタイム制御向けである**Cortex-R**、組み込みシステム向けである**Cortex-M**と、ターゲットごとにシリーズを分類した。なお、Cortexの末尾に付く文字は、社名であるARMの一文字ずつをそれぞれ割り当てたものである。また、2012年11月にはARM初となる64ビットアーキテクチャによるプロセッサコアである**Cortex-A50**シリーズを発表した。

ARMからIPコアのライセンス供与を受けている主な企業には、モトローラ、IBM、テキサス・インスツルメンツ、任天堂、フィリップス、Atmel、シャープ、サムスン電子、STマイクロエレクトロニクス、アナログ・デバイセズ、MediaTek、パナソニック、クアルコム、マーベル・テクノロジー・グループなどがある。

ARMチップは世界で最もよく使われているCPUデザインの一つとなっており、ハードディスク、携帯電話、ルータ、電卓から玩具に至るまであらゆる製品の中に見ることができる。32ビット組み込みCPUで圧倒的なシェアを占め、2004年の世界シェアは61%であった。

## 主な採用製品
### ARM6
*ARM60 3DOインタラクティブ マルチプレーヤー

IMAGE:VY86C06020FC-2 02.jpg|ARM60 CPU (VY86C06020FC-2)
IMAGE:P60ARM GC 01.jpg|ARM60 CPU (P60ARM)

*ARM610 Apple ニュートン・メッセージパッド、メッセージパッド100、メッセージパッド110、メッセージパッド120

### ARM7/7E
*携帯情報端末
** eMate 300
*携帯電話
** 一般的なGSM携帯電話
** cdmaOne携帯電話
** 初期の3G携帯電話（例：au CDMA 1X A1400番台の一部を除くA1000番台・A3000番台・A5500番台を除くA5000番台。一部例外除く）
*携帯ゲーム機
** ゲームボーイアドバンス
** ニンテンドー
***DS/DS Lite（サブCPU、GBAソフトの動作にも使われる）
*** DSi（サブCPU）
*携帯音楽プレーヤー
** iPodシリーズ（デュアルコア実装）
*電卓
** HP 20b / HP 30b
*その他
** レゴマインドストーム NXT（知能ブロックの一部）
** ルンバ（一部の機種）

### ARM9/9E
*携帯ゲーム機
** ニンテンドーDS/DS Lite/DSi（メインCPU、ARM7とのダブル実装）
** Tapwave Zodiac
*携帯電話
** Sun SPOT
** Qualcomm
***MSM6550（CDMA2000 1xEV-DO Rel.0対応携帯電話用チップセット）
*** MSM6800（CDMA2000 1xEV-DO Rev.A対応携帯電話用チップセット）
** 3Gおよび3.5G携帯電話（例：NTTドコモ FOMA 900i・901iシリーズ、au(KDDI、沖縄セルラー電話)のCDMA 1XシリーズおよびCDMA 1X WINシリーズ、ソフトバンクモバイルのSoftBank 3Gシリーズ等。一部例外除く）
** H11T（イー・モバイルの音声通話用3.5G端末）
** WS009KE "9 (nine)"（WILLCOM（ウィルコム）のPHS端末）
** Nokia N-Gage
*携帯情報端末
** Handheld Engine CXD2230GA （SONY CLIEに搭載）
*その他
** Sharp Brain
** レゴマインドストーム EV3

### ARM11/11E
*2007年頃から採用されるようになる。発表は2002年4月29日。
**7月17日、東芝がARM1176JZF-S搭載の携帯電話用プロセッサ、TC35711XBGを発表。2008年第2四半期より量産開始予定。
*NVIDIA Tegra
**Zune HD
*携帯音楽プレーヤー
**iPod touch
**Zune
*携帯電話
**T-Mobile G1
**Qualcomm
***MSM7500（EV-DO Rev.A対応携帯電話用チップセット。ARM9Eとのダブル実装）
****KDDI／沖縄セルラー電話（各auブランド）の
*****「KCP+」対応CDMA 1X WINシリーズの携帯電話（例・W56T、W54SA、W61S、W62T等。ARM9Eとのダブル実装）および
*****CDMA 1X WINシリーズのスマートフォン（例・E30HT等）
***MSM7600（EV-DO Rev.A対応携帯電話用チップセット。ARM9Eとのダブル実装）
****KYOCERA Zio M6000
****HTC Hero
**NTTドコモのFOMA902iシリーズ以降の携帯電話。905i以降のSymbian採用機はSH-4Aとダブル実装。
**WS018KE (WILLCOM 9)（WILLCOM（ウィルコム）のPHS端末）
**Samsung S3C6400（ARM 1176JZ(F)-S v1.0）
***iPhone 3G（412 MHzで駆動）
*タブレット・PDA
**ノキア Internet Tablet N800
**mylo COM-2
*ゲーム機
**Zeebo (新興国向けDL専用3Dゲーム機)
*シングルボードコンピュータ
**Raspberry Pi model 1A

### Cortex-M3
*2004年に発表されたマイクロコントローラ。
*同じARMv7-M/v7E-MシリーズのCortex-M3,M4,M7共にハーバード・アーキテクチャであることが最大の特徴である。
*自動車・工場・家電などの機器制御などに使われている。自動車では、モーター制御、パワーステアリング、横滑り防止装置などいろいろな場所で使われている。
*ワンボードマイコン
**mbed - NXPのLPC1768の評価ボード。ホビー用途としても広く流通している。

### Cortex-A8
*2009年頃から採用されるようになる。2010年発売のAndroidスマートフォンは大多数が採用。
*NetWalker
*Samsung S5PC100
**iPhone 3GS（600 MHzで駆動）
**iPod touch (第3世代)
*Apple A4（Cortex-A8をもとにAppleとサムスンが携帯機器向けに開発）
**iPhone 4（800MHz）
**iPad（1GHz）
**iPod touch（第4世代）
**Apple TV（2010年モデル）
*シングルボードコンピュータ
**BeagleBoard、BeagleBoard-xM、BeagleBone、BeagleBone Black
***テキサス・インスツルメンツが技術支援をしてオープンソースハードウェアによって開発されたボード。
**Cubieboard

### Cortex-A9
*タブレットは2010年頃から、スマートフォンは2011年から採用された。初期は2コアだったが、4コアのものがタブレットは2011年から、スマートフォンは2012年から登場した。
*NVIDIA Tegra 2
**Surface RT
*携帯ゲーム機
**PlayStation Vita
*Apple A5
**Apple TV (第3世代)
**iPod touch (第5世代)
**iPad 2, iPad mini
**iPhone 4S
*Apple A5X
**iPad (第3世代)
*シングルボードコンピュータ
**PandaBoard
***BeagleBoard同様、テキサス・インスツルメンツの技術支援によって開発されたボード。
**Wandboard

### Cortex-A15
* タブレットは2012年から、スマートフォンは2013年から採用された。

*サムスン電子は1.7GHzのデュアルコア Exynos 5250 を2012年10月から搭載商品を販売開始。メモリ帯域12.8GB/s。
*テキサス・インスルメンツは2GHzのデュアルコアで2012年第3四半期から商品を出荷予定。
*NVIDIA は Tegra 4 を2013年第1四半期から出荷予定。
*シングルボードコンピュータ
**ODROID-XU

### Cortex-A57
* 2012年10月に64ビット ARMのCortex-A57, A53（コードネーム「Atlas」と「Apollo」）が発表され、2014年に搭載商品（Samsung Galaxy Note 4 など）が販売開始された。
* AMD は2015年下半期にサーバー向け Opteron A1100 (Seattle) をリリース予定。
* A57やA53では、8コアや全てのコア同時稼働できる4+4コア（A57が4コア、A53が4コア）などが登場した。

### Cortex-A72
* 2015年2月3日に発表され、2015年に搭載商品が販売される予定。Cortex-A57の後継製品。

* Raspberry Pi 4　Model B に採用された。

### Cortex-A73
* 2016年 5月30日 に発表された。

### Cortex-A75
* 2017年 5月29日 に発表された。

### Cortex-A76
* 2018年 5月31日 に発表された。

### Cortex-A77
* 2019年 5月27日 に発表された。

### Cortex-A78
* 2020年 5月26日 に発表された。
### Cortex-X1
* 2020年 5月26日 にCortex-A78と共に発表された。
*Cortex-X Custom Programに基づき、Cortex-A78をベースに拡張されている。

## コアの性能と採用実績
### ARM社製

### サードパーティー

ARMv7-A, v8-A は以下の SoC で実装されている。
* Allwinner (全志科技)
* Amlogic (晶晨半导体) 
* Apple A4, A5, A5X, A6, A6X, A7, A8, A8X, A9, A9X, A10, A10X, A11, A12, A12X
* Freescale i.MX
* Fujitsu ARM based SoC Platform (FASP)
* HiSilicon (海思半导体)
*Marvell ARMADA
* MediaTek
* NVIDIA Tegra
*Qualcomm Snapdragon
* Renesas EV2, APE6
* Rockchip (瑞芯微电子)
*Samsung Hummingbird, Exynos
* ST-Ericsson NovaThor
* STMicroelectronics SPEAr
* Texas Instruments OMAP
* Trident PNX
* ZiiLABS ZMS

## ARMアーキテクチャを採用しているCPU/メーカ
ARMホールディングスの概要にあるように、ARMホールディングスはARMアーキテクチャの設計のみをしており、製造は行ってはいない。ARMはIPコアとして各社にライセンスされ、それぞれの会社において機能を追加するなどしてCPUとして製造される。製造されたCPUはそのまま、あるいはボード上に実装、もしくは製品に組み込まれた形で販売などされる。

以下に『CPUそのもの』『ボード上に実装したもの』などCPUやボードのシリーズ名やブランド名などが明確な主なメーカ名/CPU名/シリーズ名等を記する。

* NXPセミコンダクターズ
** LPC
** LPCXpresso
** mbed
* フリースケール・セミコンダクタ
** i.MX
** Kinetis
* DEC-インテル
** StrongARM
* インテル - マーベル・テクノロジー・グループ
** XScale
* STマイクロエレクトロニクス
** STM32
* サイプレス・マイクロシステムズ
** PSoC 5
* 東芝
** TX03,TX09シリーズ
* Panasonic
** MN2WS0220シリーズ(スマートテレビ用UniPhier)
* ルネサス エレクトロニクス
** RAファミリ
** RZファミリ
** REファミリ
** EMMA Mobile
** R-Mobile
** R-Car
** R-IN
** Renesas Synergy
* 富士通
** A64FX

## 32ビットARM
### 命令セット
ARM は RISC プロセッサであり、Thumb 命令ではなく ARM 命令の場合、その命令セットは
*32ビット固定長命令
*ロード/ストアアーキテクチャ
*3オペランドのレジスタ間演算
*多くの命令が1サイクルで実行可能
といった、多くの32ビットRISCプロセッサに共通する特徴が見られる。

ARMプロセッサは、PC相対アドレッシングやプレ-/ポスト-インクリメント・アドレッシングモードなど、RISCとみなされる他のアーキテクチャと比べ、豊富なアドレッシングモードを持っている。

もう一つ留意すべきことは、ARMの命令セットが時間とともに増加しているということである。例えば、初期のARMプロセッサ（ARM7TDMIより以前のもの）は2バイトの値をロードする命令がなかった。

### CPUモード
32ビット ARM アーキテクチャはいくつかのCPUモードを持つ。同時には1つのモードにしかなれない。命令や外部からの割込みなどでモードが切り替わる。

;ユーザーモード
:唯一の非特権モード。
;高速割込みモード
:FIQ 割込みが発生したときに切り替わる特権モード。
;割込みモード
:IRQ 割込みが発生したときに切り替わる特権モード。
;スーパーバイザーモード
:CPU がリセットされたときか SWI 命令が実行されたときに切り替わる特権モード。
;アボートモード
:プリフェッチアボートかデータアボート例外が発生したときに切り替わる特権モード。
;未定義モード
:未定義命令が実行されたときに切り替わる特権モード。
;システムモード (ARMv4以降)
:これが唯一例外が原因で切り替わるモードではない。CPSRレジスタにこのモードを書くことによりこのモードに切り替えることが出来る。
;MONモード (要セキュリティ拡張)
:TrustZone 拡張をサポートするために作られたモニターモード。
;HYP 別名 PL2 モード (ARMv7以降)
:仮想化拡張、ハイパーバイザーモード。

### レジスタ
レジスタ R0 から R7 は全ての CPU モードで同一。これらは決してバンクされない。

R13 と R14 はシステムモード以外の全ての特権 CPU モードでバンクされる。独自の R13 と R14 を持つことにより例外からそれぞれのモードに切り替えられる。R13 はスタックポインタ、R14 は関数からの戻りアドレスを持つ。

別名：
* R13 は SP とも呼ばれ、スタックポインタ
* R14 は LR とも呼ばれ、リンクレジスタ
* R15 は PC とも呼ばれ、プログラムカウンタ

CPSR は下記32ビットを持つ。
* 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言語による）

```c
int gcd(int i, int j)
{
    while (i != j) {
        if (i > j)
            i -= j;
        else
            j -= i;
    }
    return i;
}
```


ARMのアセンブリ言語では、whileループの部分は以下のようになる。

```nasm
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言語の

```c
a += (j << 2);
```


のような文を1つのARM命令

```nasm
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アーキテクチャを拡張するため、いくつかの命令が追加されたhttp://www.arm.com/products/CPUs/cpu-arch-DSP.html。**ARMv5TE** と **ARMv5TEJ** というアーキテクチャ名の "E" がこれを表していると思われる。

追加された命令は、デジタルシグナルプロセッサアーキテクチャで一般的なものである。例えば、符号付積和演算、飽和加算と飽和減算、「先行する0のカウント」のバリエーションである。

### SIMD
ARMv6で導入された。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演算が可能であるが、プログラミングモデルがやや煩雑であったことや、当時のARM11プロセッサにおける実装はスカラ命令を要素数分だけシーケンシャルに実行するというSIMD演算のメリットを享受できないものであったため、あまり積極的には使われなかった。VFPv3を実装するARMv7世代以降ではモダンなSIMD命令セットであるAdvanced SIMD拡張命令 (NEON) が導入されたため、現在ではベクタモードの利用は推奨されていない。Cortex-A9やA15ではベクタモードに対応していないことから分かるように、現在のARMアーキテクチャにおけるVFPの位置づけはスカラ専用の浮動小数点演算コプロセッサであり、SIMD演算用途についてはNEONに道を譲っている。

単精度の浮動小数点演算はNEONでも実行可能であるが、倍精度の浮動小数点演算やIEEE754準拠の4つの丸めモード、非正規化数のサポート等はNEONには存在しないため、これらを利用したい場合はVFP命令を使う必要がある。

## 64ビットARM

64ビット命令セットのAArch64やARM64に関してはAArch64を参照。

## 脚注

### 注釈

### 出典

## 関連項目
* μClinux
* ソフィー・ウィルソン

## 外部リンク
* ARM Ltd.
* Linux Zaurusでアセンブリプログラミング