「ARM TechCon 2015」の基調講演では「ARMv8-M」について、専ら「Trust Zone」を中心に紹介したが、実際はもう少し広範にわたる変更があるので、順を追って説明したい。

現在のCortex-Mシリーズの場合、Cortex-M0/M0+/M1がARMv6-M、Cortex-M3/M4/M7がARMv7-Mということで2種類のアーキテクチャが混在している。もっともARMv6-Mは、ARMv7-Mから「不要なものを削ぎ落として簡潔にした」という方が正確で、その意味ではARMv6-MはARMv7-Mのサブセット的な位置づけにある。実際ARMv6-Mの命令は57個に留まっており、他に

  • 特権命令、SysTick Timer、Halt Debug Support、MPUはImprement Option
  • 外部割込みは32まで、Priotiry Levelは4つまで
  • メモリアクセスはAligmnetのみ(Unalignアクセスは未サポート)
  • 排他アクセスは未サポート

といった制約が付いている。逆に言えば違いはこれだけとも言える。Photo01で言えば、ARMv6-Mが利用できる命令は左下の緑の部分のみで、ARMv7-Mになると水色にまで命令が増え、さらにDSP/FPUを利用するとピンク/オレンジの命令が利用できる様になる訳だが、緑の部分に関しては完全に共通で下位互換性は保たれており、なのでCortex-M0/M0+とCortex-M4のコアを利用して製品ラインアップを展開しても「命令セットは共通」といった売り方が可能であった。

Photo01:出典はARM Community Site

ただやはりこれはわかりづらいと思ったのか、ARMv8-Mでは、新たにBaselineとMainlineという2種類の命令グループが定義された(Photo02)。少なくともこれで世代的には完全にARMv8-Mで統一されたことになる。ではこのARMv8-Mは後述するTrustZone以外になにが違うか? というのがPhoto03だ。

Photo02:要するにARMv6-Mに相当するのがARMv8-M Baseline、ARMv7-Mに相当するのがARMv8-M Mainlineとなる

Photo03:これはBaselineに対しての追加なので、ARMv6-MとARMv8-M Baselineの違いと解釈すれば良い。もちろんここにある機能はすべてARMv8-M Mainlineでも利用可能となる

ハードウェア除算や、Compare and branch、排他アクセスなど随分さまざまな命令が追加された。Wide immediate movesでは16bitの即値のハンドリング命令(MOVW/MOVBT)が追加されるとか、排他アクセスではC11 atomic変数のサポート命令が追加されるなど、命令数的にも結構増えている。ただし、Compare and branchとか排他制御、ハードウェア除算などに関してはARMv7-Mではすでにサポートされていた内容である。

ちなみにここに出ていない項目として、サポートされる外部割込み数が増えるとか、デバッグ機能が拡充されているなどの機能もあり、またこれとは別に後述のPMSA v8やTrustZoneなども利用できるので、先の命令セットとあわせて、全体的に性能の底上げが図られているのが特徴だ。

ではMainlineの方は? というと、こちらはBaselineの機能をすべてサポートした上で、最大で40%の性能改善に繋がる追加命令、それにDSP/FPUのサポートが追加されている(Photo04)。

Photo04:ちなみにFPUはCortex-M4で提供されたFPv4ベースの単精度のものではなく、Cortex-M7で提供されたFPv5ベースの倍精度のものがサポートされることになる

ちなみにBaseline/Mainlineとも、PMSA(Protected Memory System Architecture) v8に基づくMPU(Memory Protection Unit)がサポートされる。Baselineでもサポートが追加されるのは、後述するTrustZoneの絡みでMPU無しという訳にはいかなくなったからだ。PMSA v8では、ついに32バイト単位で任意の大きさの領域を指定できるようになっている(Photo05)。

Photo05:PSMA v7まではサイズ指定は2の倍数(1KB/2KB/4KB/8KB/16KB/…)に限られていたので例えば連続して274KBの領域を指定することはできなかった