1.12 ARM アーキテクチャ v6

ARM アーキテクチャの ARMv6-A および ARMv6-R の各バリアントでは、元の ARM 命令セットが拡張されて、マルチプロセッサのサポートに加えて、追加のメモリモデル機能が追加されます。これらは、ARM と Thumb の両方の命令セットをサポートします。

以下の表に、便利なコマンドラインオプションを示します。

表 1-4 ARMv6 の便利なコマンドラインオプション

オプション 説明
--cpu=6 16 ビットでエンコードされた Thumb 命令、インターワーク、DSP 乗算、ダブルワード命令、非境界整列、混合エンディアン、Jazelle 拡張、およびメディア拡張をサポートしている ARMv6
--cpu=6Z セキュリティ拡張機能をサポートしている ARMv6
--cpu=6T2 16 ビットでエンコードされた Thumb 命令および 32 ビットでエンコードされた Thumb 命令をサポートしている ARMv6
--cpu=name

name は特定の ARM プロセッサです以下に例を示します。

  • ARM1136J-S を指定すると、ソフトウェア VFP をサポートする ARM1136J-S 用のコードが生成されます。

  • ARM1136JF-S を指定すると、ハードウェア VFP をサポートする ARM1136J-S 用のコードが生成されます。

主な機能

ARMv6 用のコードをコンパイルする場合、コンパイラは、ARMv5TE の機能に加え、以下を行います。

  • 指定されたプロセッサに命令スケジューリングを実行します。命令は、インターロックを最小化してパフォーマンスを向上させるために再度順序付けられます。

  • 必要に応じて、明示的な SXTBSXTHUXTB、および UXTH バイトまたはハーフワード拡張命令を生成します。

  • C の式によってエンディアンの反転が実行されると判断した場合は、エンディアン反転命令 REVREV16、および REVSH を生成します。

  • ARMv6 で使用可能な追加の Thumb 命令(CPSCPYREVREV16REVSHSETENDSXTBSXTHUXTBUXTH など)を生成します。

  • ARMv6 用に特に最適化された関数(memcpy() など)を使用します。

SIMD 命令は C コードの式に適切にマップできないので、コンパイラは、通常の C コードまたは C++ コードから自動的に SIMD 命令を生成しません。SIMD コード生成には、アセンブリ言語または組み込み関数を使用する必要があります。

以下の強化された命令を使用して、例外処理を向上させることができます。

  • リンクレジスタ(LR)およびセーブドプログラムステータスレジスタ(SPSR)を保存および復元する SRS および RFE 命令

  • カレントプログラムステータスレジスタ(CPSR)の状態切り替え、I および F ビットの変更を簡略化する CPS

  • ベクタ割り込みコントローラをサポートするベクタ割り込みのアーキテクチャサポート

  • 低レイテンシ割り込みモード

  • Thumb ステートに例外を入力できる ARM1156T2-S

境界整列のサポート

コンパイラは、ARMv6 の非境界整列アクセスサポートをデフォルトで使用して、パック構造体へのアクセスを高速化します。この際、LDR 命令と STR 命令を使用して、データ自身と同じサイズの自然なワード境界上にないワードをロードおよびストアできるようになります。__packed で明示的に修飾されていない構造体はパックされません。ARMv6 およびそれ以前のアーキテクチャ用のコンパイルを行う際の 1 バイト境界整列の影響を以下の表に示します。

表 1-5 1 バイト境界整列

__packed struct {     int i;     char ch;     short sh; } foo;

ARMv6 より前のアーキテクチャ用のコンパイル

MOV R4,R0 BL __aeabi_uread4  LDRB R1, [R4,#4] LDRSB R2,[R4,#5] LDRB R12,[R4,#6] ORR R2,R12,R2 LSL#8

ARMv6 およびそれ以降のアーキテクチャ用のコンパイル

LDR R0, [R4,#0] LDRB  R1,[R4,#4] LDRSH R2,[R4,#5]

ARMv6 用にコンパイルされたコードは、プロセッサで非境界整列データアクセスを有効にしている場合にのみ実行します。整列は、CP15 レジスタ c1 の U および A ビットを使用するか、 UBITINIT 入力をプロセッサ HIGH に入力することにより制御できます。

ARMv6 より前の非境界整列データアクセスの動作を使用するコードは、コンパイラオプション --no_unaligned_access を使用して生成できます。

非境界整列データアクセスは、BE-32 エンディアンモードでは使用できません。

LDRDSTRD はワード境界で整列させる必要があります。

エンディアンのサポート

コンパイラのコマンドラインオプション --littleend および --bigend を使用すると、それぞれリトルエンディアンコードまたはビッグエンディアンコードを生成できます。

ARMv6 は、以下のエンディアンモードをサポートします。

LE

リトルエンディアン形式

BE-8

ビッグエンディアン形式

BE-32

従来のビッグエンディアン形式

SETEND および REV 命令を使用することにより、混合エンディアンシステムも可能です。

ARMv6 エンディアンモード BE-8 用のコンパイル

コンパイラでは、ARMv6 およびビッグエンディアン用のコンパイル時に、BE-8 ビッグエンディアンコードがデフォルトで生成されます。また、BE-8 のコードであることを示すフラグがコードに設定されます。そのため、ARM プロセッサで BE-8 サポートを有効にするには、通常は E ビットを CPSR で設定する必要があります。

従来のコードを ARMv6 コードにリンクして、ARMv6 ベースのプロセッサ上で実行することができます。ただし、この場合は、リンカによって従来のコードのバイト順序が BE-8 モードに切り替えられます。生成されるイメージは BE-8 モードになります。

ARMv6 レガシーエンディアンモード BE-32 用のコンパイル

ARMv6 より前またはレガシーの BE-32 モードを使用するには、BIGENDINIT 入力をプロセッサ HIGH に関連付けるか、CP15 レジスタ c1 の B ビットを設定する必要があります。

BE-32 と互換性のあるコードは、--be32 リンカオプションを使用してリンクする必要があります。このオプションを指定しないと、ARMv6 属性によって BE-8 のイメージが生成されます。

関連情報
--cpu=name アセンブラオプション
--bigend アセンブラオプション
--littleend アセンブラオプション
--littleend コンパイラオプション
--unaligned_access、--no_unaligned_access コンパイラオプション
--be8 リンカオプション
--be32 リンカオプション
非機密扱いPDF file icon PDF 版ARM DUI0471JJ
Copyright © 2010-2013 ARM.All rights reserved.