ARMアーキテクチャ

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

1. 概要
-----

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

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

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

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

2. 歴史
-----

ARMの設計は、1983年にエイコーン・コンピュータによって開始された。当時エイコーンはモステクノロジーのMOS 6502を搭載したコンピューターを製造・販売しており、小さなハードウェア規模でシンプルな命令セットを持つ、より高速なプロセッサを開発することによって、6502を置き換えることが目的であった。

ただし、ARMはMC6800の影響を受けてはいるがよりRISCに近く、命令セットアーキテクチャや内部アーキテクチャに類似点は少ない。命令セットを設計したソフィー・ウィルソンも、6502とARMにはほとんど共通点は無いと述べている。

開発チームは1985年までにARM1と呼ばれる開発サンプルを完成させ、最初の製品となるARM2は次の年に完成した。ARM2は32ビットのデータバス、26ビットのアドレス空間と16個の32ビットレジスタを備えていた。レジスタの1つは、上位6ビットが状態フラグを保持するプログラムカウンタである。ARM2のトランジスタ数は30000個しかなく、おそらく世界で最もシンプルな実用32ビットマイクロプロセッサであった。これは、マイクロコードを持たないことと、現在のほとんどのCPUと違ってキャッシュを含まないことによるものである。このシンプルさのために消費電力は極めて低かった。後継となるARM3は、4KBのキャッシュを含みさらに性能を高めた。

1980年代後半、Apple Computerはエイコーンと共同で新しい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を再設計したものがARM7TDMIである。ARM7TDMIはThumb命令を実装し、低消費電力と高いコード効率を両立する利点を備えていたことから、ライセンスを受けた多くの企業によって製品化され、特に携帯電話やゲームボーイアドバンスといった民生機器に採用されたことから、莫大な数の製品に搭載された。なお、TDMIとはThumb命令、デバッグ  回路、乗算器 、ICE機能を搭載していることを意味している。しかし、これより後のコアには全てこれらの機能が標準的に搭載されるようになったため、この名称は省かれている。

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

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

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%であった。

3. 主な採用製品
---------

3.1. ARM6
---------

ARM60 3DOインタラクティブ マルチプレーヤー
ARM610 Apple ニュートン・メッセージパッド、メッセージパッド100、メッセージパッド110、メッセージパッド120

3.2. ARM7/7E
------------

携帯情報端末
eMate 300
携帯電話
一般的なGSM携帯電話
cdmaOne携帯電話
初期の3G携帯電話
携帯ゲーム機
ゲームボーイアドバンス
ニンテンドー
DS/DS Lite
DSi
携帯音楽プレーヤー
iPodシリーズ
電卓
HP 20b / HP 30b
その他
レゴマインドストーム NXT
ルンバ

3.3. ARM9/9E
------------

携帯ゲーム機
ニンテンドーDS/DS Lite/DSi
Tapwave Zodiac
携帯電話
Sun SPOT
Qualcomm
MSM6550
MSM6800
3Gおよび3.5G携帯電話
H11T
WS009KE "9 "
Nokia N-Gage
携帯情報端末
Handheld Engine CXD2230GA
その他
Sharp Brain
レゴマインドストーム EV3

3.4. 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
KDDI／沖縄セルラー電話の
「KCP+」対応CDMA 1X WINシリーズの携帯電話および
CDMA 1X WINシリーズのスマートフォン
MSM7600
KYOCERA Zio M6000
HTC Hero
NTTドコモのFOMA902iシリーズ以降の携帯電話。905i以降のSymbian採用機はSH-4Aとダブル実装。
WS018KE 
Samsung S3C6400
iPhone 3G
タブレット・PDA
ノキア Internet Tablet N800
mylo COM-2
ゲーム機
Zeebo 
シングルボードコンピュータ
Raspberry Pi model 1A

3.5. Cortex-M3
--------------

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

3.6. Cortex-A8
--------------

2009年頃から採用されるようになる。2010年発売のAndroidスマートフォンは大多数が採用。
NetWalker
Samsung S5PC100
iPhone 3GS
iPod touch 
Apple A4
iPhone 4
iPad
iPod touch
Apple TV
シングルボードコンピュータ
BeagleBoard、BeagleBoard-xM、BeagleBone、BeagleBone Black
テキサス・インスツルメンツが技術支援をしてオープンソースハードウェアによって開発されたボード。
Cubieboard

3.7. Cortex-A9
--------------

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

3.8. Cortex-A15
---------------

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

3.9. Cortex-A57
---------------

2012年10月に64ビット ARMのCortex-A57, A53が発表され、2014年に搭載商品が販売開始された。
AMD は2015年下半期にサーバー向け Opteron A1100  をリリース予定。
A57やA53では、8コアや全てのコア同時稼働できる4+4コアなどが登場した。

3.10. Cortex-A72
----------------

2015年2月3日に発表され、2015年に搭載商品が販売される予定。Cortex-A57の後継製品。
Raspberry Pi 4　Model B に採用された。

3.11. Cortex-A73
----------------

2016年 5月30日 に発表された。

3.12. Cortex-A75
----------------

2017年 5月29日 に発表された。

3.13. Cortex-A76
----------------

2018年 5月31日 に発表された。

3.14. Cortex-A77
----------------

2019年 5月27日 に発表された。

3.15. Cortex-A78
----------------

2020年 5月26日 に発表された。

3.16. Cortex-X1
---------------

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

4. コアの性能と採用実績
-------------

4.1. ARM社製
----------



4.2. サードパーティー
-------------

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 
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

5. 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シリーズ
ルネサス エレクトロニクス
RAファミリ
RZファミリ
REファミリ
EMMA Mobile
R-Mobile
R-Car
R-IN
Renesas Synergy
富士通
A64FX

6. 32ビットARM
-----------

6.1. 命令セット
----------

ARM は RISC プロセッサであり、Thumb 命令ではなく ARM 命令の場合、その命令セットは

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

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

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

6.2. CPUモード
-----------

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

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

6.3. レジスタ
---------

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

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

別名：

R13 は SP とも呼ばれ、スタックポインタ
R14 は LR とも呼ばれ、リンクレジスタ
R15 は PC とも呼ばれ、プログラムカウンタCPSR は下記32ビットを持つ。

M  はプロセッサモードビット
T  は Thumb ステートビット
F  は FIQ 無効ビット
I  は IRQ 無効ビット
A  は不正データアボート無効ビット
E  はデータエンディアンビット
IT  は if-then ステートビット
GE  は greater-than-or-equal-to ビット
DNM  は書き換え禁止ビット
J  は Java ステートビット
Q  は sticky overflow ビット
V  はオーバーフロービット
C  は carry/borrow/extend ビット
Z  は零ビット
N  は 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 

6.4. 条件実行
---------

ARMの命令セットにおいてユニークなのは、マシン語の最上位4ビットを占める//条件コード//を使用した条件実行命令であり、これによってほぼ全ての命令を分岐命令無しに条件付きで実行することができる。

これにより、マシン語中の即値フィールドに割けるビット数が減ってしまう等の欠点もあるものの、小さなif文に対応するコードの生成時に分岐命令を避けることが可能になる。例として、ユークリッドの互除法を挙げる。

int gcd { while  { if  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 += ;

のような文を1つのARM命令 ADD Ra, Ra, Rj, LSL #2 として表すことができる。

これにより、多くのARMプログラムは通常RISCプロセッサに期待されるようなプログラムよりも密度の高いものになる。このため、命令フェッチに伴うメモリへのアクセス頻度が少なくなり、分岐に伴うストールも回避しやすく、パイプライン処理を効率的に使うことができる。このことが、ARMがARMより複雑なCPUデザインと競合することを可能にした特徴的な一因のひとつである。

6.5. Thumb
----------

ARMプロセッサはThumbと呼ばれるコード効率の向上を意図した16ビット長の命令モードを持っている。条件実行のための4ビットプレディケートが削除されている。メモリポートやバスが32ビットよりも狭い状況において32ビットコードよりも性能が向上する。多くの場合、組み込みアプリケーションでは32ビットのデータパスを持っているのは一部のアドレス範囲のみであり、残りは16ビットかそれよりも狭くなっている。このような状況では、Thumbコードをコンパイルし、CPUに最も負荷のかかる部分だけを32ビット長の命令セットを使用して手作業で最適化するのが、通常は理にかなっている。Thumb命令とARM命令は単一の実行ファイル内で混在が可能であるが、Thumb命令を実行できるモードとARM命令を実行できるモードは独立しており、両者を使うにはその都度プロセッサの状態を切り替える必要がある。状態の切り替えは分岐命令  で行うことができるため、通常は関数単位でThumb命令とARM命令を使い分け、関数呼び出しの際に切り替えを行うのが一般的である。

Thumbテクノロジを搭載した最初のプロセッサはARM7TDMIである。ARM9とそれ以降のファミリは、XScaleも含めて全てThumbテクノロジを搭載している。

6.6. 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モードに近い自由度が得られるようになった。

6.7. Jazelle
------------

ARMは、Javaバイトコードをハードウェアでネイティブに実行できる技術を実装した。これはARMやThumbモードと並ぶもう一つの実行モードであり、ARM/Thumbの切り替えと同様にしてアクセスすることができる。後述のJazelle RCTに対してJazelle DBX  とも言う。

Jazelleテクノロジを搭載した最初のプロセッサはARM926EJ-Sである。CPU名の'J'がJazelleを表している。

6.8. Thumb Execution Environment 
------------------------------------------

ThumbEEはJazelle RCT とも呼ばれる第4のモードである。2005年にアナウンスされ、Cortex-A8プロセッサで最初に実装された。Thumb-2命令セットに小規模な変更を加えたもので、JITコンパイラのように実行時にコードを生成する場合に向いている。主な対象はJava、.NET MSIL、Python、Perlなどの言語である。

6.9. DSP 拡張命令
-------------

デジタル信号処理とマルチメディアアプリケーション向けに ARMアーキテクチャを拡張するため、いくつかの命令が追加された[2]。ARMv5TE と ARMv5TEJ というアーキテクチャ名の "E" がこれを表していると思われる。

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

6.10. SIMD
----------

ARMv6で導入された。32ビット幅。

6.11. Advanced SIMD 
--------------------------

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レジスタ  、もしくは16本の128ビットSIMDレジスタ  としてアクセスできる。例えば128ビットレジスタQ0はD0とD1の2つの64ビットレジスタの領域にマッピングされている。

Cortex-A15 などより、NEONv2  が搭載され、Fused Multiply-Add ができる。これにより、単精度浮動小数点数で 8 FLOPS/cycle となった。

6.12. Wireless MMX
------------------

Wireless MMX  はインテルがXScaleプロセッサ向けに開発したSIMD命令セットである。64ビット幅のレジスタが16本用意されており、8/16/32/64ビットのSIMD整数演算が可能。XScaleとその売却先であるマーベル・テクノロジー・グループ製のARM SoCに採用されている。命令セット自体はx86プロセッサのMMXとは全く異なるものの、GCCやVisual C++等のコンパイラで利用できる組み込み関数はMMXとの互換性がある程度確保されており、これを利用すればMMX向けに記述されたコードを比較的容易に移植することができる。

6.13. VFP
---------

VFP  はARMアーキテクチャのコプロセッサ拡張である。半精度・単精度・倍精度の浮動小数点演算機能を提供する。

VFPv1 - 廃止
VFPv2 - ARMv5TE、ARMv5TEJ、ARMv6 で利用可能
VFPv3 - ARMv7 で利用可能。通常はレジスタ数32個であるが、NVIDIA Tegra 2 シリーズなどはレジスタ数が半分のVFPv3-D16を採用。Cortex-A8の実装はパイプライン化されておらず非常に低速 。
VFPv4 - Cortex-A5, A7, A15, Apple A6, Snapdragon Krait などで利用可能。IEEE754準拠のFused multiply add 対応。VFPv4-D16 もあり。"Vector" の名を冠する通り、いくつかの命令においてはベクタモードと呼ばれる1命令で複数のレジスタに対して演算を行うモードが用意されている。このモードを使えばSIMD演算が可能であるが、プログラミングモデルがやや煩雑ベクトルレジスタが明示的に用意されておらず、複数のスカラレジスタに対して演算を行う。ベクタ長は固定されておらず、FPSCRという特殊なレジスタで最大8要素までのベクタ長を指定可能。また、レジスタがスカラモードのみで使えるバンクとベクタモードで使えるバンクに分けられており、レジスタの組み合わせに制約がある。}}であったことや、当時のARM11プロセッサにおける実装はスカラ命令を要素数分だけシーケンシャルに実行するというSIMD演算のメリットを享受できないものであったため、あまり積極的には使われなかった。VFPv3を実装するARMv7世代以降ではモダンなSIMD命令セットであるAdvanced SIMD拡張命令  が導入されたため、現在ではベクタモードの利用は推奨されていない。Cortex-A9やA15ではベクタモードに対応していないARMプロセッサのベクタモードへの対応はMVFR0レジスタの24-27ビット目を参照することで確認できる。}}ことから分かるように、現在のARMアーキテクチャにおけるVFPの位置づけはスカラ専用の浮動小数点演算コプロセッサであり、SIMD演算用途についてはNEONに道を譲っている。

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

7. 64ビットARM
-----------

ARMv8-Aから採用。ARMの64ビットモードアーキテクチャAArch64では、汎用レジスタはすべて64ビットとなり、数も16個から31個に増やされる。サーバ用途も意識して仮想化支援命令および暗号支援命令が追加され、SIMD拡張命令であるNEONも大幅に強化される。

7.1. 命令セットの特徴
-------------

汎用レジスタの増加と64ビット化に伴い、命令セットは完全に再定義されている。コード効率を重視して命令長は32ビットのままで、32ビットARMの特徴であった条件付き実行命令の大半が削除される。これによって一般的なRISC命令セットに近くなったが、依然としてコードサイズを小さくするための工夫が随所に織り込まれている。

AArch64モードにおける命令セットはA64と呼ばれ、以下にA64命令セットの特徴を示す。

即値シフト付きオペランドこれは従来の32ビットARM命令セットにおいて//フレキシブル第2オペランド // と呼ばれていたものに相当する。多くの基本的な演算命令においては、入力オペランドのうち1つに対する操作を即値左シフト、即値論理右シフト、即値算術右シフト、シフトなし、の4つから選択することができ、演算命令と即値シフト命令を一体化することができる。なお、従来とは異なりローテートは不可能となった。条件付き実行命令汎用レジスタ数が倍増したのに伴い、基本命令の多くからは条件付き実行機能が削除されたが、それでも比較的豊富な条件付き実行命令が定義されている。代表的なものを挙げるとCCMP、CINC、CSEL等が存在する。Compare-and-Branch命令PC相対分岐においては、ゼロフラグを参照する場合のみであるが比較と条件分岐を1命令で行うことが可能になっている 。これは従来Thumb-2命令セットでのみ定義されていたものであるが、A64モードでは基本命令として定義されている。符号拡張/ゼロ拡張付き命令算術演算/比較命令については、入力オペランドのうち1つを8,16,32ビットから32もしくは64ビットに符号/ゼロ拡張するバージョンが用意されている。汎用レジスタは64ビット幅であるが、多くの演算命令にはレジスタの下位32ビットのみを参照する32ビット命令が用意されている。この場合、レジスタの部分書き換えが発生しないように、演算結果の32ビットの値は暗黙のゼロ拡張が行われた上で64ビットレジスタに格納される。

7.2. SIMD and Floating-point  命令
--------------------------------------

A64命令セットにおいては従来のVFPとAdvanced SIMD  は統合され、一つの命令体系となった。これに伴い、名称については単に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] fadd v2.2d, v1.2d, v0.2d ; [v2] <= [v0] + [v1]

のようなバリエーションが命令のニーモニックを保ちつつ、オペランドのプレフィックス  とサフィックスを変更することによって記述可能になっている。これはx86プロセッサのSSE命令セットがスカラ命令とSIMD命令の双方を備えているのとよく似ている。

7.3. Scalable Vector Extension 2
--------------------------------

ARMv9策定で、富岳に使われたA64FXのScalable Vector Extensionを発展させて汎用化したベクトル拡張を中心とした追加命令。SVE2

SIMD and Floating-point命令と比較して、次の特徴がある。

スケーラブルなベクトル長
ベクトル長に囚われないプログラミング
ギャザー・ロードとスキャッター・ストア
レーン単位の条件付き実行制御
条件付き実行制御主導のループ制御と管理
ベクトル・パーティショニングとSW管理の投機
拡張整数および浮動小数点演算の水平方向の縮小
スカラー化内部ベクトル・サブループ

8. 脚注
-----

8.1. 注釈
-------

8.2. 出典
-------

9. 関連項目
-------

μClinux
ソフィー・ウィルソン

10. 外部リンク
---------

[3]
[4]