Comments
Description
Transcript
RealView Compilation Tools アセンブラガイド
RealView Compilation Tools ® バージ ョ ン 4.0 アセ ン ブ ラ ガ イ ド Copyright © 2002-2008 ARM Limited. All rights reserved. ARM DUI 0204IJ RealView Compilation Tools アセ ン ブ ラ ガ イ ド Copyright © 2002-2008 ARM Limited. All rights reserved. リ リ ース情報 本書には以下の変更が加え ら れてい ます。 変更履歴 日付 発行 機密保持ス テー タ ス 変更 2002 年 8 月 A 非機密扱い 第 1.2 版 2003 年 1 月 B 非機密扱い 第 2.0 版 2003 年 9 月 C 非機密扱い RealView Development Suite v2.0 向け リ リ ース 2.0.1 2004 年 1 月 D 非機密扱い RealView Development Suite v2.1 向け リ リ ー ス 2.1 2004 年 12 月 E 非機密扱い RealView Development Suite v2.2 向け リ リ ー ス 2.2 2005 年 5 月 F 非機密扱い RealView Development Suite v2.2 SP1 向け リ リ ース 2.2 2006 年 3 月 G 非機密扱い RealView Development Suite v3.0 向け リ リ ー ス 3.0 2007 年 3 月 H 非機密扱い RealView Development Suite v3.1 向け リ リ ー ス 3.1 2008 年 9 月 I 非機密扱い RealView Development Suite v4.0 向け リ リ ー ス 4.0 著作権 ま たは ™ のマー ク が付いた言葉お よ び ロ ゴは、 こ の著作権情報で別段に規定 さ れてい る 場合を 除 き 、ARM Limited の EU ま たはその他の国におけ る 登録商標お よ び商標です。 本書に記載 さ れて い る 他の製品名は、 各社の所有す る 商標です。 ® 本書に記載 さ れてい る 情報の全部ま たは一部、 な ら びに本書で紹介す る 製品は、 著作権所有者の 文書に よ る 事前の許可を得ない限 り 、 転用 ・ 複製す る こ と を禁 じ ます。 本書に記載 さ れてい る 製品は、 今後 も 継続的に開発 ・ 改良の対象 と な り ます。 本書に含ま れ る 製 品お よ びその利用方法についての情報は、 ARM が利用者の利益のために提供す る も のです。 し た が っ て当社では、 製品の市販性ま たは利用の適切性を含め、 暗示的 ・ 明示的に関係な く 一切の責 任を負い ません。 本書は、 本製品の利用者をサポー ト す る こ と だけ を目的 と し てい ます。 本書に記載 さ れてい る 情 報の使用、 情報の誤 り ま たは省略、 あ る いは本製品の誤使用に よ っ て発生 し たいかな る 損失 ・ 損 傷について も 、 ARM Limited は一切責任を負い ません。 ARM と い う 用語が使用 さ れてい る 場合は、 “ARM ま たは必要に応 じ てその子会社” を指 し ます。 ii Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 機密保持ス テー タ ス 本書は非機密扱いであ り 、 本書を使用、 複製、 お よ び開示す る 権利は、 ARM お よ び ARM が本書 を提供 し た当事者 と の間で締結 し た契約の条項に基づいた ラ イ セ ン ス の制限に よ り 異な り ます。 ア ク セ ス制限は、 ARM 社内に よ る 分類です。 製品ス テー タ ス 本書の情報は最終版であ り 、 開発済み製品に対応 し てい ます。 Web ア ド レ ス http://www.arm.com ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential iii iv Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 目次 RealView Compilation Tools アセ ン ブ ラ ガ イ ド 序章 本書について ................................................................................................. x フ ィ ー ド バ ッ ク ............................................................................................ xiv 第1章 は じ めに 1.1 第2章 ARM アセ ン ブ リ 言語の記述 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 ARM DUI 0204IJ RealView Compilation Tools アセ ン ブ ラ について ...................................... 1-2 は じ めに ...................................................................................................... 2-2 ARM アーキテ ク チ ャ の概要 ....................................................................... 2-4 アセ ン ブ リ 言語モ ジ ュ ールの構造 ............................................................ 2-13 条件実行 .................................................................................................... 2-20 レ ジス タ への定数のロー ド ....................................................................... 2-27 レ ジス タ へのア ド レ スのロー ド ................................................................ 2-36 多重レ ジス タ ロー ド / ス ト ア命令 ............................................................. 2-43 マ ク ロの使用 ............................................................................................ 2-50 シ ンボルバージ ョ ンの追加 ....................................................................... 2-54 フ レームデ ィ レ ク テ ィ ブの使用 ................................................................ 2-55 アセ ン ブ リ 言語に関する変更 ................................................................... 2-56 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential v 目次 第3章 アセ ン ブ ラ に関する参考情報 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 第4章 ARM 命令 と Thumb 命令 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 第5章 命令の概要 .................................................................................................. 4-3 メ モ リ ア ク セス命令 ................................................................................. 4-10 汎用デー タ 処理命令 ................................................................................. 4-46 乗算命令 ................................................................................................... 4-77 サチ ュ レー ト 命令 ................................................................................... 4-100 並列命令 ................................................................................................. 4-105 パ ッ ク命令 と 展開命令 ............................................................................ 4-113 分岐命令 と 制御命令 ............................................................................... 4-122 コ プ ロ セ ッ サ命令 ................................................................................... 4-132 その他の命令 .......................................................................................... 4-140 Thumb での命令の幅の選択 ................................................................... 4-159 ThumbEE 命令 ....................................................................................... 4-161 疑似命令 ................................................................................................. 4-165 NEON と VFP プ ログ ラ ミ ング 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15 5.16 5.17 vi コ マ ン ド 構文 .............................................................................................. 3-2 ソ ース行の形式 ........................................................................................ 3-23 定義済みのレ ジ ス タ および コ プ ロ セ ッ サ名 ............................................. 3-24 組み込み変数および定数 .......................................................................... 3-26 シ ンボル ................................................................................................... 3-29 式、 リ テ ラル、 演算子 .............................................................................. 3-35 診断 メ ッ セージ ........................................................................................ 3-49 C プ リ プ ロ セ ッ サを使用する ................................................................... 3-51 命令の概要 .................................................................................................. 5-3 NEON と VFP 向けのアーキテ ク チ ャサポー ト ......................................... 5-9 拡張レ ジ ス タ バン ク ................................................................................. 5-10 条件 コ ー ド ................................................................................................ 5-13 一般的な情報 ............................................................................................ 5-15 NEON と VFP に共通の命令 .................................................................... 5-24 NEON 論理演算 と 比較演算 ...................................................................... 5-33 NEON 汎用デー タ 処理命令 ...................................................................... 5-43 NEON シ フ ト 命令 .................................................................................... 5-57 NEON 汎用算術命令 ................................................................................. 5-65 NEON 乗算命令 ........................................................................................ 5-81 NEON 要素 と 構造体のロー ド / ス ト ア命令 ............................................. 5-87 NEON 疑似命令および VFP 疑似命令 ...................................................... 5-95 NEON / VFP シス テムレ ジス タ ............................................................. 5-104 ゼロ ク リ ア モー ド ................................................................................... 5-109 VFP 命令 ................................................................................................ 5-111 VFP ベ ク タ モー ド .................................................................................. 5-123 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 目次 第6章 ワ イヤレ ス MMX テ ク ノ ロ ジの命令 6.1 6.2 6.3 第7章 デ ィ レ ク テ ィ ブ リ フ ァ レンス 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 ARM DUI 0204IJ は じ めに ...................................................................................................... 6-2 ワ イ ヤレ ス MMX テ ク ノ ロ ジに対する ARM のサポー ト ........................... 6-3 ワ イ ヤレ ス MMX の命令 ............................................................................. 6-9 デ ィ レ ク テ ィ ブの一覧 (アルフ ァ ベ ッ ト 順) .............................................. 7-2 シ ンボル定義デ ィ レ ク テ ィ ブ ..................................................................... 7-4 デー タ 定義デ ィ レ ク テ ィ ブ ....................................................................... 7-18 アセ ン ブ リ 制御デ ィ レ ク テ ィ ブ ................................................................ 7-36 Frame デ ィ レ ク テ ィ ブ ............................................................................. 7-46 通知デ ィ レ ク テ ィ ブ .................................................................................. 7-65 命令セ ッ ト と 構文選択のデ ィ レ ク テ ィ ブ ................................................. 7-73 その他のデ ィ レ ク テ ィ ブ .......................................................................... 7-77 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential vii 目次 viii Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 序章 本章では、 『RealView Compilation Tools アセ ンブ ラ ガ イ ド 』 (本書) について概 説 し ます。 以下のセ ク シ ョ ン か ら 構成 さ れてい ます。 • • ARM DUI 0204IJ 「本書について」 (ページ x) 「フ ィ ー ド バ ッ ク 」 (ページ xiv) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ix 序章 本書について 本書では、 RealView® Compilation Tools アセ ンブ ラ (ARM アセ ン ブ ラ ) に関す る チ ュ ー ト リ アル情報お よ び参考情報を提供 し てい ます。 独立型アセ ン ブ ラ armasm お よ び C コ ンパ イ ラ や C++ コ ンパ イ ラ の イ ン ラ イ ン アセ ン ブ ラ につい て説明 し てい ます。 ま た、 アセ ン ブ ラ に指定で き る コ マ ン ド ラ イ ン オプシ ョ ン、 アセ ン ブ リ 言語プ ロ グ ラ ミ ン グに使用で き る アセ ン ブ リ 言語ニーモニ ッ ク 、 疑似命令、 マ ク ロ 、 お よ びデ ィ レ ク テ ィ ブについて も 説明 し ます。 対象読者 本書は、 RealView Compilation Tools を使用 し て アプ リ ケーシ ョ ン を作成 し て い る 開発者を対象 と し てい ます。 本書の内容は、 『RealView Compilation Tools エ ッ セ ン シ ャ ルガ イ ド 』 で説明 さ れてい る ARM 開発ツールを熟知 し た経験 豊富な ソ フ ト ウ ェ ア開発者を対象に書かれてい ます。 本書の構成 本書は以下の章か ら 構成 さ れてい ます。 第 1 章 は じ めに ARM アセ ンブ ラ お よ びアセ ン ブ リ 言語の概要を説明 し ます。 第 2 章 ARM アセ ンブ リ 言語の記述 ARM アセ ンブ ラ お よ びアセ ン ブ リ 言語を使用す る 際のチ ュ ー ト リ アル情報です。 第 3 章 アセ ンブ ラ に関す る 参考情報 ARM アセ ンブ ラ で使用で き る 言語の構文 と 体系について詳 し く 説明 し ます。 第 4 章 ARM 命令 と Thumb 命令 ARM 命令セ ッ ト と Thumb 命令セ ッ ト (Thumb-2 と Thumb-2 以前 の Thumb、 お よ び Thumb-2EE を含む) について詳 し く 説明 し ま す。 第 5 章 NEON と VFP プ ロ グ ラ ミ ン グ ARM NEON™ Technology と VFP 命令セ ッ ト について詳 し く 説明 し ます。 ま た、 VFP 固有のアセ ンブ リ 言語に関す る 情報 も 提供 し てい ます。 x Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 序章 第 6 章 ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令 ARM の ワ イ ヤ レ ス MMX™ テ ク ノ ロ ジのサポー ト について詳 し く 説明 し ます。 第 7 章 ディ レ クテ ィブ リ フ ァ レンス ARM アセ ン ブ ラ armasm で利用で き る アセ ン ブ ラ デ ィ レ ク テ ィ ブ について詳 し く 説明 し ます。 本書では、 ARM ソ フ ト ウ ェ アがデフ ォ ル ト の場所に イ ン ス ト ール さ れてい る こ と を前提 と し てい ます。 例えば、 Windows 環境では、 標準設定の場所は volume:\Program Files\ARM にな り ます。 パ ス名を参照す る 際、 install_directory の 部分を こ の場所に読み替え て下 さ い。 例えば、 本書では、 install_directory\Documentation\... の よ う なパ ス名が使用 さ れます。 ARM ソ フ ト ウ ェ ア を別の場所に イ ン ス ト ール し た場合は、 フ ァ イ ルパ ス の見方を変え る 必要があ り ます。 表記規則 本書では以下の表記規則を使用 し てい ます。 monospace コ マ ン ド 、 フ ァ イ ル名、 プ ロ グ ラ ム名、 ソ ース コ ー ド な ど、 キーボー ド か ら 入力可能な テ キ ス ト を示 し てい ます。 monospace コ マ ン ド ま たはオプシ ョ ン に使用可能な略語を示 し ます。 コ マ ン ド 名ま たはオプシ ョ ン名をすべて入力す る 代わ り に、 下線部分 の文字だけ を入力す る こ と がで き ます。 monospace italic コ マ ン ド ま たは関数の引数で、 特定の値に置 き 換え る こ と が可 能な も のを示 し てい ます。 monospace bold サン プル コ ー ド 以外に使用 さ れ る 言語キー ワ ー ド を示 し てい ま す。 ARM DUI 0204IJ italic 重要事項、 重要用語、 相互参照、 引用箇所を斜体で記載 し てい ます。 bold メ ニ ュ ー名な ど のユーザ イ ン タ フ ェース要素を太字で記載 し て い ます。 ま た、 適宜記述 リ ス ト 内の重要箇所 と ARM プ ロ セ ッ サ の信号名に も 太字を用いてい ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential xi 序章 参考資料 こ こ では、 ARM プ ロ セ ッ サ フ ァ ミ リ の コ ー ド 開発に関す る 補足情報を記載 し た ARM Limited お よ び各社の出版物を紹介 し ます。 ARM Limited は自社出版物の定期的な更新 ・ 修正を行っ てい ます。 最新の正誤 表、 追補表、 ARM に関す る FAQ については、 http://infocenter.arm.com/help/index.jsp を ご覧下 さ い。 ARM の出版物 本書では、 RealView Compilation Tools 付属の開発ツールの参考情報を提供 し てい ます。 こ のほか、 本製品には以下のマニ ュ アルが同梱 さ れてい ます。 • 『RVCT エ ッ セ ン シ ャ ルガ イ ド 』 (ARM DUI 0202J) • 『RVCT コ ンパ イ ラ ユーザガ イ ド 』 (ARM DUI 0205J) • 『RVCT コ ンパ イ ラ リ フ ァ レ ン ス ガ イ ド 』 (ARM DUI 0348J) • 『RVCT ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 (ARM DUI 0349J) • 『RVCT リ ン カユーザガ イ ド 』 (ARM DUI 0206J) • 『RVCT リ ン カ リ フ ァ レ ン ス ガ イ ド 』 (ARM DUI 0381J) • 『RVCT ユーテ ィ リ テ ィ ガ イ ド 』 (ARM DUI 0382J) • 『RVCT デベ ロ ッ パガ イ ド 』 (ARM DUI 0203J) 基本標準、 ソ フ ト ウ ェ ア イ ン タ フ ェ ース、 お よ び ARM でサポー ト さ れてい る 標準に関す る 詳細については、 install_directory\Documentation\Specifications\... を参照 し て下 さ い。 特定の ARM 製品に関す る 情報については、 以下のマニ ュ アルを参照 し て下 さ い。 xii • 『ARM アーキ テ ク チ ャ リ フ ァ レ ン ス マニ ュ アル』 (ARMv7-A お よ び ARMv7-R エデ ィ シ ョ ン) (ARM DDI 0406) • 『ARMv7-M アーキ テ ク チ ャ リ フ ァ レ ン ス マニ ュ アル』 (ARM DDI 0403) • 『ARMv6-M アーキ テ ク チ ャ リ フ ァ レ ン ス マニ ュ アル』 (ARM DDI 0419) • 『ARM Reference Peripheral Specification』 (ARM DDI 0062) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 序章 • お使いのハー ド ウ ェ アデバ イ ス の ARM デー タ シー ト ま たはテ ク ニ カル リ フ ァ レ ン ス マニ ュ アル 他の出版物 ARM アーキ テ ク チ ャ に関す る 一般的な情報については、 以下の出版物を参照 し て下 さ い。 Steve Furber, 『ARM System-on-Chip Architecture』 (2nd edition, 2000), Addison Wesley, ISBN 0-201-67519-6。 Intel® ワ イ ヤ レ ス MMX™ テ ク ノ ロ ジの詳細については、 『Wireless MMX Technology Developer Guide』 (August, 2000、 Order Number: 251793-001) を参照 し て下 さ い。 こ のマニ ュ アルは http://www.intel.com か ら 入手で き ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential xiii 序章 フ ィ ードバッ ク ARM Limited では RealView Compilation Tools お よ び本書に関す る フ ィ ー ド バ ッ ク をお待ち し てお り ます。 RealView Compilation Tools に関する フ ィ ー ド バ ッ ク RealView Compilation Tools に関 し て問題があ る 場合は、 購入元にお問い合わ せ下 さ い。 こ の と き 、 迅速かつ適切な対応を さ せて頂 く ために、 以下の情報 を ご用意下 さ い。 • お名前 と 会社名 • 製品のシ リ アル番号 • 製品の リ リ ース情報 • プ ラ ッ ト フ ォ ームの詳細 (ハー ド ウ ェ アプ ラ ッ ト フ ォ ーム、 オペレー テ ィ ン グ シ ス テ ムの種類 と バージ ョ ン な ど) • 問題を再現す る サ イ ズの小 さ な独立 し たサン プル コ ー ド • 操作の目的 と 実際の動作に関す る 詳 し い説明 • 使用 し た コ マ ン ド ( コ マ ン ド ラ イ ン オプシ ョ ン を含む) • 問題を例示す る サ ンプル出力 • ツールのバージ ョ ン情報 (バージ ョ ン番号、 ビル ド 番号を含む) 本書に関する フ ィ ー ド バ ッ ク 本書に関す る ご意見につ き ま し ては、 以下の内容を記載 し た電子 メ ールを [email protected] ま でお送 り 下 さ い。 • • • • マニ ュ アル名 文書番号 問題のあ る ページ番号 問題点の簡潔な説明 補足すべ き 点や改善すべ き 点についてのご提案 も お待ち し てお り ます。 xiv Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 第1章 は じ めに 本章では、 RealView® Compilation Tools 付属のアセ ン ブ ラ について概説 し ます。 以下のセ ク シ ョ ンか ら 構成 さ れてい ます。 • 「RealView Compilation Tools アセ ンブ ラ について」 (ページ 1-2) ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 1-1 は じ めに 1.1 RealView Compilation Tools アセ ン ブ ラ について RealView Compilation Tools (RVCT) には、 以下の も のが用意 さ れてい ます。 • 独立型アセ ンブ ラ armasm ( こ のアセ ン ブ ラ については本書で説明 し ま す)。 • C コ ンパ イ ラ お よ び C++ コ ンパ イ ラ に組み込ま れてい る 最適化 イ ン ラ イ ン アセ ン ブ ラ と 非最適化組み込みアセ ンブ ラ 。 こ れ ら はアセ ンブ リ 命令 に同 じ 構文を使用 し ますが、 それ以外の点については本書では説明 し ま せん。 イ ン ラ イ ン アセ ン ブ ラ と 組み込みアセ ン ブ ラ の詳細については、 『デベ ロ ッ パガ イ ド 』 の 「C、 C++、 お よ びアセ ンブ リ 言語の混用」 を参 照 し て下 さ い。 以前の リ リ ース の RVCT か ら ア ッ プグ レー ド す る 場合は、 『エ ッ セ ン シ ャ ルガ イ ド 』 を読んで、 こ の リ リ ース の新機能 と 拡張機能について確認 し て下 さ い。 1.1.1 ARM アセ ン ブ リ 言語 現在の ARM と Thumb のアセ ン ブ ラ 言語は、以前のバージ ョ ン の ARM アセ ン ブ ラ 言語お よ び Thumb アセ ン ブ ラ 言語 よ り 優先 さ れ ます。 こ の言語は、 統合 アセ ンブ ラ 言語 (UAL) と 呼ばれ る こ と があ り ます。 UAL を使用 し て書かれた コ ー ド は、 ARM、 Thumb-2、 ま たは Thumb-2 以前の Thumb のためにアセ ン ブルす る こ と がで き ます。 アセ ン ブ ラ は、 使用で き な い命令に対 し てはエ ラ ーを発生 さ せます。 1.1.2 ワ イ ヤレ ス MMX テ ク ノ ロ ジの命令 アセ ン ブ ラ では、 イ ン テル ® ワ イ ヤ レ ス MMX™ テ ク ノ ロ ジ命令を アセ ン ブル し 、 PXA270 プ ロ セ ッ サ用の コ ー ド を開発す る こ と がで き ます。 こ のプ ロ セ ッ サは、 MMX 拡張を採用 し た ARMv5TE アーキ テ ク チ ャ を実装 し てい ます。 RVCT は、 ワ イ ヤ レ ス MMX テ ク ノ ロ ジ制御 と 単一命令複数デー タ 処理 (SIMD) デー タ レ ジ ス タ を サポー ト し てお り 、 ワ イ ヤ レ ス MMX テ ク ノ ロ ジ に よ る 開発のための新 し いデ ィ レ ク テ ィ ブが導入 さ れてい ます。 ま た、 ロ ー ド 命令 と ス ト ア命令のサポー ト も 強化 さ れ ま し た。 ワ イ ヤ レ ス MMX テ ク ノ ロ ジのサポー ト に関す る 詳細については、 第 6 章 ワ イ ヤ レ ス MMX テ ク ノ ロ ジ の命令 を参照 し て下 さ い。 1-2 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ は じ めに 1.1.3 NEON Technology ARM NEON™ Technology は、 ア ド バン ス ト SIMD アーキ テ ク チ ャ 拡張を実装 し た も のです。 高性能の メ デ ィ ア アプ リ ケーシ ョ ン、 信号処理アプ リ ケー シ ョ ン、 お よ び組み込みプ ロ セ ッ サ を対象に し た、 64 ビ ッ ト と 128 ビ ッ ト の ハ イ ブ リ ッ ド SIMD テ ク ノ ロ ジです。 ARM コ アの一部 と し て実装 さ れ ますが、 独自の実行パ イ プ ラ イ ン と 、 ARM コ アの レ ジ ス タ バン ク と は別の レ ジ ス タ バ ン ク があ り ます。 NEON 命令は、 ARM と Thumb-2 コ ー ド の両方で使用で き ます。 NEON の詳細 については、 第 5 章 NEON と VFP プ ロ グ ラ ミ ン グ を参照 し て下 さ い。 1.1.4 サン プルの使用方法 本書では、 RealView Development Suite に収録 さ れてい る サ ンプルを参照 し ま す。 こ れ ら は、 メ イ ンサン プルデ ィ レ ク ト リ の install_directory\RVDS\Examples にあ り ます。 収録 さ れてい る サ ンプルの概要については、 『RealView Development Suite ス タ ー ト ガ イ ド 』 を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 1-3 は じ めに 1-4 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 第2章 ARM アセ ン ブ リ 言語の記述 本章では、 ARM® アセ ンブ リ 言語 を記述す る 際の一般原則を説明 し ます。 以下 のセ ク シ ョ ン か ら 構成 さ れてい ます。 • • • • • • • • • • • ARM DUI 0204IJ 「は じ めに」 (ページ 2-2) 「ARM アーキ テ ク チ ャ の概要」 (ページ 2-4) 「アセ ンブ リ 言語モジ ュ ールの構造」 (ページ 2-13) 「条件実行」 (ページ 2-20) 「レ ジ ス タ への定数の ロ ー ド 」 (ページ 2-27) 「レ ジ ス タ へのア ド レ ス の ロ ー ド 」 (ページ 2-36) 「多重レ ジ ス タ ロ ー ド / ス ト ア命令」 (ページ 2-43) 「マ ク ロ の使用」 (ページ 2-50) 「シ ン ボルバージ ョ ンの追加」 (ページ 2-54) 「フ レームデ ィ レ ク テ ィ ブの使用」 (ページ 2-55) 「アセ ンブ リ 言語に関す る変更」 (ページ 2-56) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-1 ARM アセ ン ブ リ 言語の記述 2.1 は じ めに 本章では、 ARM アセ ン ブ リ 言語モジ ュ ールの基本的かつ実践的な記述方法を 説明 し ます。 ま た、 ARM アセ ンブ ラ (armasm) の機能について も 説明 し ます。 本章では、 ARM、 Thumb®、 Thumb-2、 NEON™、 VFP お よ び ワ イ ヤ レ ス MMX の各命令セ ッ ト については詳 し く 説明 し ません。 こ れ ら の命令セ ッ ト につい ては、 以下を参照 し て下 さ い。 • 第 4 章 ARM 命令 と Thumb 命令 • 第 5 章 NEON と VFP プ ロ グ ラ ミ ン グ • 第 6 章 ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令 詳細については、 『ARM アーキ テ ク チ ャ リ フ ァ レ ン ス マニ ュ アル』 を参照 し て下 さ い。 既に RVCT v2.1 以前で使用 さ れてい る ARM お よ び Thumb アセ ン ブ リ 言語に ついて理解 し てい る プ ロ グ ラ マのために、 本章には、 ARM アセ ンブ リ 言語の 最新バージ ョ ン と RVCT2.1 以前のバージ ョ ン と の違いについて説明 し てい る セ ク シ ョ ンが含まれてい ます。 詳細については、 「アセ ンブ リ 言語に関す る 変 更」 (ページ 2-56) を参照 し て下 さ い。 2.1.1 サン プル コ ー ド 本章では、 い く つかのサ ンプル コ ー ド を紹介 し てい ます。 こ れ ら の多 く は、 install_directory\RVDS\Examples\...\asm デ ィ レ ク ト リ に収録 さ れてい ます。 アセ ン ブ リ 言語フ ァ イ ルの ビル ド と リ ン ク を行 う には、 以下の手順を実行 し ます。 1. コ マ ン ド プ ロ ン プ ト で 「armasm --debug filename.s」 と 入力 し 、 フ ァ イ ル のアセ ン ブル と デバ ッ グ テーブルの生成を実行 し ます。 2. 「armlink filename.o -o filename」 と 入力 し 、 オブジ ェ ク ト フ ァ イ ルを リ ン ク し て、 ELF 実行可能 イ メ ージ を生成 し ます。 こ の イ メ ージの実行 と デバ ッ グ を行 う には、 RealView 命令セ ッ ト シ ミ ュ レー タ (RealView ISS) な ど の適切なデバ ッ グ タ ーゲ ッ ト を使用 し て、 RealView Debugger な ど の互換性のあ る デバ ッ ガに こ の イ メ ージ を ロ ー ド し ます。 アセ ン ブ ラ に よ る ソ ース コ ー ド の変換動作を確認す る には、 以下の よ う に入 力 し ます。 fromelf -c filename.o 2-2 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 『 リ ン カユーザガ イ ド 』、 fromelf の詳細については 『ユーテ ィ リ テ ィ ガ イ ド 』 を参照 し て下 さ い。 armlink の詳細については ELF と DWARF の詳細については、 www.infocenter.arm.com か ら 入手で き る ド キ ュ メ ン ト の 『Application Binary Interface』 (ABI) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-3 ARM アセ ン ブ リ 言語の記述 2.2 ARM アーキテ ク チ ャ の概要 こ のセ ク シ ョ ン では、 ARM アーキ テ ク チ ャ について簡単に説明 し ます。 ARM プ ロ セ ッ サは、 ロ ー ド と ス ト アのアーキ テ ク チ ャ を実装す る 典型的な RISC プ ロ セ ッ サです。 メ モ リ にア ク セ ス で き る のは、 ロ ー ド 命令 と ス ト ア命 令だけです。 デー タ 処理命令は、 レ ジ ス タ の内容に対 し てのみ演算を行い ま す。 こ のセ ク シ ョ ン では、 以下の内容について説明 し ます。 「アーキ テ ク チ ャ のバージ ョ ン」 • • 「ARM、 Thumb、 Thumb-2、 お よ び Thumb-2EE の命令セ ッ ト 」 • • • • • 2.2.1 「ARM、 Thumb、 お よ び ThumbEE 状態」 (ページ 2-5) 「プ ロ セ ッ サモー ド 」 (ページ 2-6) 「レ ジ ス タ 」 (ページ 2-7) 「命令セ ッ ト の概要」 (ページ 2-9) 「命令の機能」 (ページ 2-11) アーキテ ク チ ャ のバージ ョ ン 本書に掲載 さ れてい る 情報 と サ ンプルは、 ARMv4 以上のアーキ テ ク チ ャ を実 装 し たプ ロ セ ッ サが使用 さ れてい る こ と を前提 と し てい ます。 上記のプ ロ セ ッ サでは、 32 ビ ッ ト のア ド レ ス範囲を使用 し ます。 各アーキ テ ク チ ャ バー ジ ョ ン の詳細については、 『ARM アーキ テ ク チ ャ リ フ ァ レ ン ス マニ ュ アル』 を参照 し て下 さ い。 2.2.2 ARM、 Thumb、 Thumb-2、 お よび Thumb-2EE の命令セ ッ ト ARM 命令セ ッ ト は、 広範な演算の実行を可能にす る 32 ビ ッ ト 命令のセ ッ ト です。 ARMv4T 以上のアーキ テ ク チ ャ では、 Thumb 命令セ ッ ト と 呼ばれ る 16 ビ ッ ト の命令セ ッ ト が定義 さ れてい ます。 こ の命令セ ッ ト では、 32 ビ ッ ト ARM 命令 セ ッ ト のほ と ん ど の機能を使用で き ますが、 一部の処理には他の命令が必要 にな り ます。 Thumb 命令セ ッ ト では、 パフ ォーマ ン ス と 引 き 換えに優れた コ ー ド 密度を実現 し てい ます。 ARMv6T2 には、 Thumb 命令セ ッ ト の メ ジ ャ ーア ッ プデー ト であ る Thumb-2 が定義 さ れてい ます。 ARM 命令セ ッ ト と ほぼ同一の機能が提供 さ れ ます。 16 ビ ッ ト 命令 と 32 ビ ッ ト 命令を備え、 ARM に類似 し たパフ ォ ーマ ン ス と Thumb に類似 し た コ ー ド 密度を両立 し てい ます。 2-4 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 ARMv7 には、 Thumb-2 Execution Environment (Thumb-2EE) が定義 さ れてい ます。 Thumb-2EE 命令セ ッ ト は、 Thumb-2 をベース に、 動的に生成 さ れ る コ ー ド (つま り 、 実行直前か実行中にデバ イ ス で コ ンパ イ ル さ れ る コ ー ド ) に合わせた変更や追加が行われてい ます。 詳細については、 「命令セ ッ ト の概要」 (ページ 2-9) を参照 し て下 さ い。 2.2.3 ARM、 Thumb、 お よび ThumbEE 状態 ARM 命令を実行中のプ ロ セ ッ サは、 ARM 状態 で動作 し てい ます。 ま た、 Thumb 命令を実行中のプ ロ セ ッ サは、 Thumb 状態 で動作 し てい ます。 ThumbEE 命令を実行中のプ ロ セ ッ サは、 ThumbEE 状態 で動作 し てい ます。 プ ロ セ ッ サは、 Jazelle 状態 と 呼ばれ る 別の状態で も 動作で き ます。 一方の状態のプ ロ セ ッ サで他方の命令セ ッ ト の命令を実行す る こ と はで き ま せん。 例えば、 ARM 状態のプ ロ セ ッ サでは Thumb 命令を実行で き ません。 ま た、 Thumb 状態のプ ロ セ ッ サでは ARM 命令を実行で き ません。 こ のため、 現 在の状態 と は異な る 命令セ ッ ト の命令を プ ロ セ ッ サが受け取 ら ない よ う にす る 必要があ り ます。 大部分の ARM プ ロ セ ッ サでは、 必ず ARM 状態で コ ー ド の実行を開始 し ま す。 ただ し 、 Thumb コ ー ド し か実行で き ないプ ロ セ ッ サや、 Thumb 状態で開 始す る よ う に設定で き る プ ロ セ ッ サ も あ り ます。 状態の切 り 替え 各命令セ ッ ト には、 プ ロ セ ッ サ状態を変更す る 命令があ り ます。 ARM 状態 と Thumb 状態 と の切 り 替え を行 う には、 ARM ま たは THUMB デ ィ レ ク テ ィ ブ を使用 し て、 正 し いオペ コ ー ド を生成す る アセ ン ブ ラ モー ド に切 り 替 え る 必要があ り ます。 Thumb-2EE コ ー ド を生成す る には、 THUMBX デ ィ レ ク テ ィ ブ を使用 し ます (CODE32 お よ び CODE16 を使用す る アセ ン ブ ラ コ ー ド はアセ ン ブ ラ に よ っ て アセ ン ブルで き ますが、 新 し い コ ー ド には ARM お よ び THUMB を使 用す る こ と をお勧め し ます)。 詳細については、 「命令セ ッ ト と 構文選択のデ ィ レ ク テ ィ ブ」 (ページ 7-73) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-5 ARM アセ ン ブ リ 言語の記述 2.2.4 プ ロ セ ッ サモー ド ARM プ ロ セ ッ サは、 アーキ テ ク チ ャ のバージ ョ ン に応 じ て、 さ ま ざ ま なプ ロ セ ッ サモー ド をサポー ト し ます (表 2-1 を参照)。 注 ARMv6-M と ARMv7-M では、 他の ARM プ ロ セ ッ サ と 同 じ モー ド を サポー ト し てい ません。 こ のセ ク シ ョ ン の内容は、 ARMv6-M お よ び ARMv7-M には適 用 さ れ ません。 表 2-1 ARM プ ロ セ ッ サモー ド プ ロ セ ッ サモー ド アーキテ ク チ ャ モー ド 番号 ユーザ すべて 0b10000 FIQ - 高速割 り 込み要求 すべて 0b10001 IRQ - 割 り 込み要求 すべて 0b10010 スーパーバ イ ザ すべて 0b10011 アボー ト すべて 0b10111 未定義 すべて 0b11011 システム ARMv4 以上 0b11111 監視 Security Extensions のみ 0b10110 ユーザモー ド 以外のモー ド はすべて 特権 モー ド と 呼ばれます。 特権モー ド で は、 シ ス テ ム リ ソ ース に フルア ク セ スす る こ と がで き 、 モー ド を自由に変更 す る こ と がで き ます。 通常、 タ ス ク 保護が必要な アプ リ ケーシ ョ ンはユーザモー ド で実行 さ れます。 組み込みアプ リ ケーシ ョ ンの中には、 スーパーバ イ ザモー ド ま たはシ ス テ ム モー ド だけで実行 さ れ る も の も あ り ます。 ユーザモー ド 以外のモー ド は、 例外を処理 し た り 、 特権 リ ソ ース にア ク セ ス し た り す る 目的で使用 さ れ ます。 詳細については、 『デベ ロ ッ パガ イ ド 』 の 第 6 章 プ ロ セ ッ サ例外処理 を参照 し て下 さ い。 2-6 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 2.2.5 レジス タ ARM プ ロ セ ッ サには 37 本の レ ジ ス タ があ り ます。 こ れ ら の レ ジ ス タ は、 部分 的に重複 し たバン ク に配置 さ れます。 プ ロ セ ッ サモー ド ご と に異な る レ ジ ス タ バン ク が使用 さ れ ます。 プ ロ セ ッ サ例外 と 特権命令を処理す る 際、 バン ク レ ジ ス タ に よ っ て高速な コ ン テ キ ス ト ス イ ッ チが可能にな り ます。 レ ジ ス タ バン ク の構成については、 『ARM アーキ テ ク チ ャ リ フ ァ レ ン ス マニ ュ アル』 を参照 し て下 さ い。 以下の レ ジ ス タ を使用で き ます。 • 「30 本の汎用 32 ビ ッ ト レ ジ ス タ 」 • • • 「プ ロ グ ラ ム カ ウ ン タ (PC)」 「アプ リ ケーシ ョ ンプ ロ グ ラ ム状態レ ジ ス タ (APSR)」 (ページ 2-8) 「セーブ ド プ ロ グ ラ ム状態レ ジ ス タ (SPSR)」 (ページ 2-9) 30 本の汎用 32 ビ ッ ト レ ジ ス タ 現在のプ ロ セ ッ サモー ド に応 じ て、 一度に 15 本ま での汎用レ ジ ス タ が認識 さ れ ます。 こ れ ら は r0 ~ -r12、 sp、 お よ び lr です。 sp (r13) は ス タ ッ ク ポ イ ン タ です。 C コ ンパ イ ラ と C++ コ ンパ イ ラ では、 必 ず sp が ス タ ッ ク ポ イ ン タ と し て使用 さ れます。 Thumb-2 では、 sp は ス タ ッ ク ポ イ ン タ と し て厳密に定義 さ れてい る ため、 ス タ ッ ク 操作を行わない多 く の 命令で sp が使用 さ れてい る 場合、 その動作は予測不能です。 汎用レ ジ ス タ と し て sp を使用す る こ と は推奨 さ れてい ません。 ユーザモー ド では、 lr (r14) が リ ン ク レ ジ ス タ と し て使用 さ れ、 サブルーチ ン呼び出 し が実行 さ れた と き に復帰ア ド レ ス が r14 に ス ト ア さ れ ます。 復帰ア ド レ ス が ス タ ッ ク に ス ト ア さ れ る 場合は、 r14 を汎用レ ジ ス タ と し て使用す る こ と も で き ます。 例外処理モー ド では、 lr に例外の復帰ア ド レ ス (例外内でサブルーチン呼び 出 し が実行 さ れ る 場合はサブルーチンの復帰ア ド レ ス) が ス ト ア さ れ ます。 復帰ア ド レ ス が ス タ ッ ク に ス ト ア さ れ る 場合は、 lr を汎用レ ジ ス タ と し て使 用で き ます。 プ ロ グ ラ ムカ ウン タ (PC) プ ロ グ ラ ム カ ウ ン タ は、 pc (r15) と し て ア ク セ ス さ れ ます。 プ ロ グ ラ ム カ ウ ン タ は、 ARM 状態では 1 命令ご と に 1 ワー ド (4 バ イ ト ) ずつ イ ン ク リ メ ン ト さ れ、 Thumb 状態では実行 さ れ る 命令のサ イ ズの分だけ イ ン ク リ メ ン ト さ ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-7 ARM アセ ン ブ リ 言語の記述 れます。 分岐命令は、 デス テ ィ ネーシ ョ ン ア ド レ ス を プ ロ グ ラ ム カ ウ ン タ に ロ ー ド し ます。 プ ロ グ ラ ム カ ウ ン タ は、 デー タ 処理命令を使用 し て直接 ロ ー ド す る こ と も で き ます。 例えば、 サブルーチン か ら 戻 る 場合には、 以下の コ マ ン ド を使用 し て、 リ ン ク レ ジ ス タ を プ ロ グ ラ ム カ ウ ン タ に コ ピーで き ます。 MOV pc,lr 現在実行中の命令のア ド レ ス は、 pc には ス ト ア さ れ ません。 通常、 実行中の 命令のア ド レ ス は、 ARM 命令では pc-8、 Thumb 命令では pc-4 にな り ます。 ア プ リ ケーシ ョ ン プ ログ ラ ム状態レ ジス タ (APSR) APSR は、 論理演算装置 (ALU) ス テー タ ス フ ラ グの コ ピーを ス ト ア し ます。 ALU ス テー タ ス フ ラ グ よ っ て、 条件命令を実行す る か ど う かが決ま り ます。 詳細については、 「条件実行」 (ページ 2-20) を参照 し て下 さ い。 ARMv5TE と ARMv6 以上のアーキ テ ク チ ャ では、 Q フ ラ グ も APSR に保持 さ れます (「ALU ス テー タ ス フ ラ グ」 (ページ 2-21) を参照)。 ARMv6 以上のアーキ テ ク チ ャ では、 GE フ ラ グ も APSR に保持 さ れ ます (「並 列加算 と 並列減算」 (ページ 4-106) を参照)。 こ れ ら の フ ラ グには、 MSR お よ び MRS 命令を使用 し てすべてのモー ド でア ク セ ス で き ます。 詳細については、 「MRS」 (ページ 4-143) お よ び 「MSR」 (ペー ジ 4-145) を参照 し て下 さ い。 カ レ ン ト プ ロ グ ラ ム状態レ ジ ス タ (CPSR) CPSR には以下の情報が保持 さ れ ます。 • APSR フ ラ グ • • • 現在のプ ロ セ ッ サモー ド 割 り 込みデ ィ セーブルフ ラ グ 現在のプ ロ セ ッ サ状態 (ARM、 Thumb、 ThumbEE、 ま たは Jazelle) • IT ブ ロ ッ ク の実行状態ビ ッ ト 実行状態ビ ッ ト は、 IT ブ ロ ッ ク での条件実行を制御 し (「IT」 (ページ 4-127) を参照)、 ARMv6T2 以降でのみ使用で き ます。 APSR フ ラ グのみがすべてのモー ド でア ク セ ス可能です。 CPSR の残 り の ビ ッ ト には、 MSR お よ び MRS 命令を使用 し て特権モー ド でのみア ク セ ス で き ます。 詳細については、 「MRS」 (ページ 4-143) お よ び 「MSR」 (ページ 4-145) を 参照 し て下 さ い。 2-8 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 セーブ ド プ ログ ラ ム状態レ ジス タ (SPSR) SPSR は、 例外発生時に CPSR を保持す る 目的で使用 さ れます。 各例外処理 モー ド では、 1 つの SPSR にア ク セ ス で き ます。 ユーザモー ド と シ ス テ ム モー ド は例外処理モー ド ではないため、 SPSR を利用で き ません。 詳細について は、 『デベ ロ ッ パガ イ ド 』 の第 6 章 プ ロ セ ッ サ例外処理 を参照 し て下 さ い。 2.2.6 命令セ ッ ト の概要 すべての ARM 命令の長 さ は 32 ビ ッ ト です。 こ れ ら の命令は ワ ー ド 境界で整 列 さ れて保持 さ れ る ため、 ARM 状態では命令ア ド レ ス の最下位 2 ビ ッ ト が常 にゼ ロ にな り ます。 Thumb、 Thumb-2、 お よ び Thumb-2EE 命令の長 さ は 16 ビ ッ ト ま たは 32 ビ ッ ト のいずれかです。 Thumb 命令はハーフ ワー ド 境界で ス ト ア さ れます。 命令の 中には、 ア ド レ ス の最下位ビ ッ ト を使用 し て、 分岐先の コ ー ド が Thumb コ ー ド か ARM コ ー ド か を決定す る も の も あ り ます。 Thumb-2 が導入 さ れ る ま で、 Thumb 命令セ ッ ト は、 ARM 命令セ ッ ト の機能の 一部のサブセ ッ ト に し か対応 し てい ませんで し た。 こ れは、 ほぼすべての Thumb 命令が 16 ビ ッ ト であ っ たためです。 Thumb-2 命令セ ッ ト の機能は、 ARM 命令セ ッ ト の機能 と ほぼ同等です。 ARMv6 以上のアーキ テ ク チ ャ では、 すべての ARM 命令お よ び Thumb 命令は リ ト ルエ ンデ ィ ア ン です。 ARM 命令 と Thumb 命令の構文の詳細については、 第 4 章 ARM 命令 と Thumb 命令 を参照 し て下 さ い。 ARM 命令 と Thumb 命令は、 以下の機能グループに分類で き ます。 • • • • • • 「分岐命令 と 制御命令」 「デー タ 処理命令」 (ページ 2-10) 「単一レ ジ ス タ ロ ー ド / ス ト ア命令」 (ページ 2-10) 「多重レ ジ ス タ ロ ー ド / ス ト ア命令」 (ページ 2-10) 「ス テー タ ス レ ジ ス タ ア ク セ ス命令」 (ページ 2-10) 「コ プ ロ セ ッ サ命令」 (ページ 2-10) 分岐命令 と 制御命令 こ れ ら の命令は以下の目的に使用 さ れ ます。 • ARM DUI 0204IJ サブルーチン に分岐す る 。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-9 ARM アセ ン ブ リ 言語の記述 • • • • 逆方向に分岐 し てループ を形成す る 。 条件付 き 構造内で順方向に分岐す る 。 後続の命令を分岐のない条件命令にす る 。 プ ロ セ ッ サの ARM 状態 と Thumb 状態を切 り 替え る 。 デー タ 処理命令 デー タ 処理命令は汎用レ ジ ス タ に対 し て演算を実行 し ます。 こ のグループの 命令は、 2 本の レ ジ ス タ の内容に対 し て加算、 減算、 ビ ッ ト ご と の論理演算 な ど を実行 し 、 3 本目の レ ジ ス タ にその結果を返す こ と がで き ます。 こ れ ら の 命令は、 単一レ ジ ス タ の値や、 レ ジ ス タ の値 と 命令内で渡 さ れ る 定数 ( イ ミ デ ィ エー ト 値) に対 し て演算を実行す る こ と も で き ます。 Long 乗算命令は、 64 ビ ッ ト の結果を 2 本の レ ジ ス タ に分けて返 し ます。 単一レ ジ ス タ ロー ド / ス ト ア命令 単一レ ジ ス タ ロ ー ド / ス ト ア命令は、 単一レ ジ ス タ と メ モ リ と の間で値の ロ ー ド ま たは ス ト ア を行い ます。 こ れ ら の命令を使用 し て、 32 ビ ッ ト ワー ド 、 16 ビ ッ ト ハーフ ワ ー ド 、 ま たは 8 ビ ッ ト 符号な し バ イ ト の ロ ー ド ま たは ス ト ア を行 う こ と がで き ます。 ま た、 バ イ ト と ハーフ ワ ー ド の ロ ー ド を符号拡張 ま たはゼ ロ 拡張にす る こ と に よ り 、 32 ビ ッ ト レ ジ ス タ を充填で き ます。 ま た、 い く つかの命令は、 64 ビ ッ ト ダブル ワー ド の値を 2 本の 32 ビ ッ ト レ ジ ス タ に分けて ロ ー ド ま たは ス ト アで き る よ う に定義 さ れてい ます。 多重レ ジ ス タ ロー ド / ス ト ア命令 多重レ ジ ス タ ロ ー ド / ス ト ア命令は、 汎用レ ジ ス タ のサブセ ッ ト を メ モ リ か ら ロ ー ド す る か、 メ モ リ に ス ト ア し ます。 こ れ ら の命令の詳細については、 「多重レ ジ ス タ ロ ー ド / ス ト ア命令」 (ページ 2-43) を参照 し て下 さ い。 ス テー タ ス レ ジ ス タ ア ク セス命令 ス テー タ ス レ ジ ス タ ア ク セ ス命令は、 ス テー タ ス レ ジ ス タ の内容を汎用レ ジ ス タ と の間で転送 し ます。 コ プ ロ セ ッ サ命令 コ プ ロ セ ッ サ命令は、 ARM アーキ テ ク チ ャ の一般的な拡張方法を サポー ト し ます。 2-10 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 2.2.7 命令の機能 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 「条件実行」 • • 「レ ジ ス タ へのア ク セ ス」 • 「 イ ン ラ イ ンバレルシ フ タ へのア ク セ ス」 (ページ 2-12) 条件実行 ほぼすべての ARM 命令は、 APSR 内の ALU ス テー タ ス フ ラ グの値に基づい て条件実行で き ます。 分岐を使用 し て条件命令を ス キ ッ プす る 必要はあ り ま せんが、 一連の命令が同 じ 条件に依存す る 場合はその よ う に し た方が よ い こ と も あ り ます。 Thumb-2 以前のプ ロ セ ッ サの Thumb 状態では、 条件分岐が条件実行用の唯一 の メ カ ニズ ム です。 ほ と ん ど のデー タ 処理命令は、 ALU フ ラ グ を更新 し ます。 通常、 命令が ALU フ ラ グ を更新す る か ど う か を指定す る こ と はで き ません。 Thumb-2 では、 同 じ ALU フ ラ グ と IT (If-Then) 命令を使用 し て、 条件実行 に代わ る メ カ ニズ ム を提供 し ます。 IT は 16 ビ ッ ト 命令で、 こ の命令を使用す る と 最大 4 つの条件実行を行 う こ と がで き ます。 条件実行の メ カ ニズ ム を提供 す る 命令は、 他に も い く つかあ り ます。 ARM お よ び Thumb-2 コ ー ド では、 デー タ 処理命令が ALU フ ラ グ を更新す る か ど う か を指定で き ます。 あ る 2 つの命令の間に多数の非フ ラ グ設定命令が存 在す る 場合で も 、 一方の命令で設定 さ れた ALU フ ラ グ を使用 し て他方の命令 の実行を制御で き ます。 詳細については、 「条件実行」 (ページ 2-20) を参照 し て下 さ い。 レ ジ ス タ へのア ク セス ARM 状態では、 すべての命令が r0 ~ r14 にア ク セ ス で き ます。 ま た、 ほ と ん ど の命令が pc (r15) に も ア ク セ ス で き ます。 MRS 命令 と MSR 命令を使用 し て ス テー タ ス レ ジ ス タ の内容を汎用レ ジ ス タ に移動 し 、 通常のデー タ 処理命令に よ っ てその内容を操作す る こ と がで き ます。 詳細については、 「MRS」 (ペー ジ 4-143) お よ び 「MSR」 (ページ 4-145) を参照 し て下 さ い。 Thumb-2 プ ロ セ ッ サの Thumb 状態で も 同様の機能が提供 さ れますが、 重要度 が低い sp お よ び pc へのア ク セ ス は許可 さ れない場合があ り ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-11 ARM アセ ン ブ リ 言語の記述 Thumb-2 以前のプ ロ セ ッ サの Thumb 命令は、 その大半が r0 ~ r7 以外の レ ジ ス タ にア ク セ ス で き ません。 少数の命令のみが r8 ~ r15 にア ク セ ス で き ます。 レ ジ ス タ r0 ~ r7 は Lo レ ジ ス タ と 呼ばれ、 レ ジ ス タ r8 ~ r15 は Hi レ ジ ス タ と 呼ばれ ます。 イ ン ラ イ ンバレルシ フ タ へのア ク セス ARM 論理演算装置には、 シ フ ト 演算 と ロ テー ト 演算を可能にす る 32 ビ ッ ト のバ レルシ フ タ があ り ます。 多 く の ARM お よ び Thumb-2 デー タ 処理命令 と 単 一レ ジ ス タ デー タ 転送命令の第 2 オペ ラ ン ド は、 デー タ 処理ま たはデー タ 転 送の実行前に、 それぞれの命令の中でシ フ ト で き ます。 こ れに よ り 、 以下の よ う な こ と が可能にな り ます。 • • • 位取 り ア ド レ シ ン グ 定数に よ る 乗算 定数の構成 バレ ルシ フ タ を使用 し た定数の生成については、 「レ ジ ス タ への定数の ロ ー ド 」 (ページ 2-27) を参照 し て下 さ い。 Thumb-2 命令は、 ARM 命令 と 同様のバ レルシ フ タ へのア ク セ ス を提供 し ま す。 Thumb2 以前の Thumb 命令セ ッ ト は、 他の命令を使用 し ない限 り バ レルシ フ タ にア ク セ ス で き ません。 2-12 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 2.3 アセ ン ブ リ 言語モ ジ ュ ールの構造 アセ ン ブ リ 言語 と は、 オブジ ェ ク ト コ ー ド を生成す る ために、 ARM アセ ンブ ラ (armasm) が解析お よ びアセ ン ブルす る 言語です。 デフ ォ ル ト では、 アセ ン ブ ラ は ソ ース コ ー ド が ARM アセ ン ブ リ 言語で記述 さ れてい る こ と を前提 と し てい ます。 armasm は、 以前のバージ ョ ンの ARM アセ ンブ リ 言語で記述 さ れた ソ ース コ ー ド も 認識 し ます。 こ の場合、 以前のバージ ョ ン で記述 さ れてい る こ と を示す 必要はあ り ません。 ま た、 armasm は、 UAL 以前の Thumb アセ ン ブ リ 言語で記述 さ れた ソ ース コ ー ド も 認識 し ます。 こ の場合は、--16 コ マ ン ド ラ イ ン オプシ ョ ン を使用す る か、 ソ ース コ ー ド で CODE16 デ ィ レ ク テ ィ ブ を使用 し て、 armasm に示す必要があ り ます。 UAL 以前の Thumb アセ ン ブ リ 言語は、 Thumb-2 命令をサポー ト し ませ ん。 こ のセ ク シ ョ ン では、 以下の内容について説明 し ます。 • 「アセ ンブ リ 言語 ソ ース フ ァ イ ルの レ イ ア ウ ト 」 • 「ARM アセ ンブ リ 言語モジ ュールのサンプル」 (ページ 2-16) • 2.3.1 「サブルーチンの呼び出 し 」 (ページ 2-18) アセ ン ブ リ 言語 ソ ース フ ァ イルのレ イ アウ ト 以下はアセ ン ブ リ 言語で記述す る ソ ース行の汎用形式です。 {label} {instruction|directive|pseudo-instruction} {;comment} 注 ラ ベルが指定 さ れていない場合で も 、 命令、 疑似命令、 お よ びデ ィ レ ク テ ィ ブの前には、 スペースや タ ブな ど のホ ワ イ ト スペース を挿入す る 必要があ り ます。 デ ィ レ ク テ ィ ブの中には、 ラ ベルの使用を禁止 し てい る も の も あ り ます。 こ の ソ ース行の 3 つのセ ク シ ョ ンはすべてオプシ ョ ン です。 コ ー ド を読みやす く す る ために空白行を使用す る こ と も で き ます。 大文字 と 小文字の規則 命令ニーモニ ッ ク 、 デ ィ レ ク テ ィ ブ、 お よ びシ ン ボルレ ジ ス タ 名は、 大文字 と 小文字の ど ち ら で記述す る こ と も で き ますが、 大文字 と 小文字を混ぜ る こ と はで き ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-13 ARM アセ ン ブ リ 言語の記述 行の長 さ ソ ース フ ァ イ ルを読みやす く す る には、 行末にバ ッ ク ス ラ ッ シ ュ (\) を挿入 し て長い ソ ース行を複数行に分割 し ます。 バ ッ ク ス ラ ッ シ ュ の後には文字 (スペースや タ ブ も 含む) を挿入 し ないで下 さ い。 アセ ンブ ラ は、 バ ッ ク ス ラ ッ シ ュ と それに続 く 行末シーケ ン ス を ホ ワ イ ト スペース と し て処理 し ます。 注 引用符で囲まれた文字列内でバ ッ ク ス ラ ッ シ ュ と それに続 く 行末シーケ ン ス を使用 し ないで下 さ い。 バ ッ ク ス ラ ッ シ ュ を使用 し た拡張 も 含め、 行の長 さ は 4095 文字ま でに制限 さ れてい ます。 ラ ベル ラ ベルは、 ア ド レ ス を表すシ ン ボルです。 ラ ベルで指定 さ れた ア ド レ ス はア セ ン ブ リ 時に計算 さ れます。 アセ ン ブ ラ は、 ラ ベルが定義 さ れてい る セ ク シ ョ ンの起点を基準 と し て ラ ベ ルのア ド レ ス を計算 し ます。 同 じ セ ク シ ョ ン内の ラ ベルへの参照には、 プ ロ グ ラ ム カ ウ ン タ にオ フ セ ッ ト を加算 し た値、 ま たはプ ロ グ ラ ム カ ウ ン タ か ら オ フ セ ッ ト を減算 し た値を使用で き ます。 こ れを プ ロ グ ラ ム相対ア ド レ シ ン グ と 呼びます。 他のセ ク シ ョ ン に含ま れ る ラ ベルのア ド レ ス は リ ン ク 時 ( リ ン カに よ っ て各 セ ク シ ョ ンに メ モ リ 内の特定の位置が割 り 当て ら れた と き ) に計算 さ れます。 ロー カルラ ベル ロ ーカル ラ ベルは、 ラ ベルのサブ ク ラ ス です。 ロ ーカル ラ ベルは 0 ~ 99 の範 囲の数で始ま り ます。 他の ラ ベル と は異な り 、 ロ ーカル ラ ベルは複数回定義 で き ます。 ロ ーカル ラ ベルはマ ク ロ を使用 し て ラ ベルを生成す る と き に便利 です。 アセ ン ブ ラ は ロ ーカル ラ ベルへの参照を検出す る と 、 その ロ ーカル ラ ベルに近い イ ン ス タ ン ス に参照を リ ン ク し ます。 ロ ーカル ラ ベルの有効範囲は、 AREA デ ィ レ ク テ ィ ブに よ っ て制限 さ れます。 ROUT デ ィ レ ク テ ィ ブ を使用す る と 、 こ の有効範囲を さ ら に厳密に制限で き ま す。 以下に関す る 詳細については、 「 ロ ーカル ラ ベル」 (ページ 3-33) を参照 し て 下 さ い。 • ロ ーカル ラ ベル宣言の構文 2-14 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 • アセ ン ブ ラ が ロ ーカル ラ ベルへの参照 と ラ ベルを関連付け る 方法 コメント 行内の最初のセ ミ コ ロ ンは、 文字列定数の中に出現す る 場合を除 き 、 コ メ ン ト の開始を意味 し ます。 その行の終わ り が コ メ ン ト の終わ り にな り ます。 コ メ ン ト のみの行 も 有効です。 すべての コ メ ン ト はアセ ンブ ラ に よ っ て無視 さ れ ます。 定数 定数には、 以下のいずれか を使用で き ます。 数値 数値定数には以下の形式を使用で き ます。 • 10 進数 (123 な ど) • 16 進数 (0x7B な ど) • n_xxx • : n 2 ~ 9 の基数 xxx その基数の数値 浮動小数点 (0.02、 123.0、 3.14159 な ど) シ ス テ ムに浮動小数点の VFP ま たは NEON が存在す る 場合のみ、 浮動小数点の数値を使用で き ます。 ARM DUI 0204IJ ブール ブール定数 TRUE と FALSE は、{TRUE} お よ び {FALSE} と 記述す る 必要 があ り ます。 文字 文字定数は、 引用符で囲ま れた 1 つの文字ま たは 1 つのエ ス ケー プ文字 (標準 C エ ス ケープ文字を使用) で構成 さ れ ます。 文字列 文字列は、 二重引用符に囲まれた文字 と スペース で構成 さ れま す。 文字列内で二重引用符ま たは ド ル記号を リ テ ラ ルテ キ ス ト 文 字 と し て使用す る 場合、 該当す る 文字を 2 つ続けて記述す る こ と に よ り 1 つの文字を表す必要があ り ます。 例えば、 文字列内で 1 つの $ を使用す る 場合は、 $$ と 記述す る 必要があ り ます。 文字列 定数内では標準 C エ ス ケープシーケ ン ス を使用で き ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-15 ARM アセ ン ブ リ 言語の記述 2.3.2 ARM アセ ン ブ リ 言語モ ジ ュ ールのサン プル 例 2-1 は、 アセ ン ブ リ 言語モジ ュ ールのい く つかの主要構成要素を示 し てい ます。 こ のサン プルは ARM アセ ン ブ リ 言語で記述 さ れてい ます。 こ のサン プ ルは、 メ イ ンサン プルデ ィ レ ク ト リ の install_directory\RVDS\Examples に armex.s と い う 名前で収録 さ れてい ます。 こ のサン プルを アセ ン ブル、 リ ン ク 、 お よ び実行す る 方法については、 「サンプル コ ー ド 」 (ページ 2-2) を参照 し て下 さ い。 以下のセ ク シ ョ ン では、 こ のサ ンプルの構成要素について詳 し く 説明 し ます。 例 2-1 AREA ENTRY ARMex, CODE, READONLY ; Name this block of code ARMex ; Mark first instruction to execute MOV MOV ADD r0, #10 r1, #3 r0, r0, r1 ; Set up parameters MOV LDR SVC END r0, #0x18 r1, =0x20026 #0x123456 ; ; ; ; start ; r0 = r0 + r1 stop angel_SWIreason_ReportException ADP_Stopped_ApplicationExit ARM semihosting (formerly SWI) Mark end of file ELF セ ク シ ョ ン と AREA デ ィ レ ク テ ィ ブ ELF セ ク シ ョ ン は、 名前の付いた、 分割不可能な独立 し た コ ー ド シーケ ン ス ま たはデー タ シーケ ン ス です。 アプ リ ケーシ ョ ン を作成す る には少な く と も 1 つの コ ー ド セ ク シ ョ ン が必要です。 アセ ン ブ リ ま たは コ ンパ イ ルか ら の出力には、 以下を含め る こ と がで き ます。 2-16 • 1 つ以上の コ ー ド セ ク シ ョ ン。 通常、 こ れ ら は読み出 し 専用セ ク シ ョ ン です。 • 1 つ以上のデー タ セ ク シ ョ ン。 通常、 こ れ ら は読み出 し お よ び書 き 込み 用セ ク シ ョ ン です。 ゼ ロ で初期化 (ZI) さ れ る 場合があ り ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 リ ン カはセ ク シ ョ ン配置規則に基づいて各セ ク シ ョ ン を プ ロ グ ラ ム イ メ ージ 内に配置 し ます。 ソ ース フ ァ イ ル内で隣接す る セ ク シ ョ ン が、 アプ リ ケー シ ョ ン イ メ ージ内で も 隣接 し てい る と は限 り ません。 リ ン カに よ る セ ク シ ョ ンの配置方法の詳細については、 『 リ ン カユーザガ イ ド 』 の第 5 章 ス キ ャ ッ タ ロ ー ド 記述フ ァ イ ルの使用 を参照 し て下 さ い。 ソ ース フ ァ イ ルでは、 セ ク シ ョ ン の開始位置を AREA デ ィ レ ク テ ィ ブに よ っ て マー ク し ます。 こ のデ ィ レ ク テ ィ ブでセ ク シ ョ ン に名前を付け、 属性を設定 し ます。 属性は、 名前の後に コ ン マで区切っ て配置 し ます。 AREA デ ィ レ ク テ ィ ブの構文の詳細については、 「AREA」 (ページ 7-81) を参照 し て下 さ い。 セ ク シ ョ ンには任意の名前を指定で き ます。 ただ し 、 アルフ ァ ベ ッ ト 以外の 文字で始ま る 名前は縦棒で囲む必要があ り ます。 縦棒で囲ま ない と 、 AREA name missing エ ラ ーが生成 さ れ ます。 例えば、 |1_DataArea| の よ う に記述 し ま す。 例 2-1 (ページ 2-16) では、 READONLY と し てマー ク さ れた コ ー ド を含む ARMex と い う 名前の単一セ ク シ ョ ン を定義 し てい ます。 ENTRY デ ィ レ ク テ ィ ブ ENTRY デ ィ レ ク テ ィ ブは、 最初に実行 さ れ る 命令を マー ク し ます。 C コ ー ド を 含むアプ リ ケーシ ョ ン では、 エ ン ト リ ポ イ ン ト が C ラ イ ブ ラ リ 初期化 コ ー ド 内に も 含まれ ます。 初期化 コ ー ド と 例外ハン ド ラ に も エ ン ト リ ポ イ ン ト が含 まれます。 ア プ リ ケーシ ョ ンの実行 例 2-1 (ページ 2-16) のアプ リ ケーシ ョ ン コ ー ド は、 ラ ベル start で実行を開 始 し 、 10 進数の 10 と 3 を レ ジ ス タ r0 と r1 に ロ ー ド し ます。 次に、 こ れ ら の レ ジ ス タ を加算 し 、 結果を r0 に返 し ます。 ア プ リ ケーシ ョ ンの終了 メ イ ン コ ー ド の実行後、 こ のアプ リ ケーシ ョ ンは制御をデバ ッ ガに戻す こ と に よ っ て終了 し ます。 こ の動作は、 以下のパ ラ メ ー タ を設定 し た ARM セ ミ ホ ス テ ィ ン グ SVC (デフ ォ ル ト では 0x123456) を使用 し て行われ ます。 • r0 = angel_SWIreason_ReportException (0x18) • r1 = ADP_Stopped_ApplicationExit (0x20026) 『RVCT デベ ロ ッ パガ イ ド 』 の第 8 章 セ ミ ホ ス テ ィ ン グ を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-17 ARM アセ ン ブ リ 言語の記述 END デ ィ レ ク テ ィ ブ こ のデ ィ レ ク テ ィ ブは、 ソ ース フ ァ イ ルの処理を停止す る よ う アセ ン ブ ラ に 指示 し ます。 すべてのアセ ンブ リ 言語 ソ ース モジ ュ ールは、 END デ ィ レ ク テ ィ ブが単独で記述 さ れた行で終了す る 必要があ り ます。 2.3.3 サブルーチ ンの呼び出 し サブルーチン を呼び出すには、 リ ン ク 付 き 分岐命令を使用 し ます。 構文は以 下の と お り です。 BL destination destination にはサブルーチン の最初の命令に付けた ラ ベルを指定す る のが一 般的です。 ま た、 destination には、 プ ロ グ ラ ム相対式を指定す る こ と も で き ます。 詳細に ついては、 「B、 BL、 BX、 BLX、 BXJ」 (ページ 4-123) を参照 し て下 さ い。 BL 命令は以下を実行 し ます。 • • リ ン ク レ ジ ス タ に復帰ア ド レ ス を配置す る 。 プ ロ グ ラ ム カ ウ ン タ にサブルーチン のア ド レ ス を設定す る 。 サブルーチン コ ー ド の実行後、 BX lr 命令を使用 し て復帰で き ます。 原則 と し て、 レ ジ ス タ r0 ~ r3 を使用 し てパ ラ メ ー タ をサブルーチン に渡 し 、 r0 を使用 し て結果を呼び出 し 側に返 し ます。 注 別々にアセ ンブル ま たは コ ンパ イ ル さ れたモジ ュ ール間の呼び出 し は、 プ ロ シージ ャ コ ール標準で定義 さ れてい る 制約条件や規則に準拠す る 必要があ り ます。 詳細については、 install_directory\Documentation\Specifications\... にあ る 『Procedure Call Standard for the ARM Architecture』 (aapcs.pdf) を参照 し て下 さ い。 例 2-2 (ページ 2-19) は、 2 つのパ ラ メ ー タ 値を加算 し て、 その結果を r0 に返 すサブルーチン を示 し てい ます。 こ のサ ンプルは、 メ イ ンサ ンプルデ ィ レ ク ト リ の install_directory\RVDS\Examples に subrout.s と い う 名前で収録 さ れてい ます。 こ のサン プルを アセ ンブル、 リ ン ク 、 お よ び実行す る 方法については、 「サンプル コー ド 」 (ページ 2-2) を参照 し て下 さ い。 2-18 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 例 2-2 start stop doadd ARM DUI 0204IJ AREA ENTRY MOV MOV BL MOV LDR SVC ADD BX END subrout, CODE, READONLY ; Name this block of code ; Mark first instruction to execute r0, #10 ; Set up parameters r1, #3 doadd ; Call subroutine r0, #0x18 ; angel_SWIreason_ReportException r1, =0x20026 ; ADP_Stopped_ApplicationExit #0x123456 ; ARM semihosting (formerly SWI) r0, r0, r1 ; Subroutine code lr ; Return from subroutine ; Mark end of file Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-19 ARM アセ ン ブ リ 言語の記述 2.4 条件実行 ARM 状態 と 、 Thumb-2 を サポー ト す る プ ロ セ ッ サの Thumb 状態では、 ほ と ん ど のデー タ 処理命令で、 演算結果に従っ て アプ リ ケーシ ョ ンプ ロ グ ラ ム状 態レ ジ ス タ (APSR) 内の ALU ス テー タ ス フ ラ グ を更新す る か ど う か を選択 で き ます。 すべての フ ラ グ を更新す る 命令 も 、 サブセ ッ ト のみを更新す る 命 令 も あ り ます。 フ ラ グが更新 さ れない場合は、 元の値が維持 さ れ ます。 各命令 の記述にはフ ラ グへの影響が詳細に示 さ れてい ます。 実行 さ れない条件付 き 命令は、 フ ラ グの状態に影響を与え ません。 Thumb-2 以前のプ ロ セ ッ サの Thumb 状態では、 ほ と ん ど のデー タ 処理命令が ALU ス テー タ ス フ ラ グ を自動的に更新 し ます。 フ ラ グ を変更 し た り 更新 し た り し ない よ う に指定す る オプシ ョ ンはあ り ません。 その他の命令では、 フ ラ グ を更新で き ません。 ARM 状態 と 、 Thumb-2 を サポー ト す る プ ロ セ ッ サの Thumb 状態では、 以下 のいずれかの時点で別の命令に よ っ てセ ッ ト さ れた ALU ス テー タ ス フ ラ グに 基づいて、 命令を条件実行で き ます。 • フ ラ グ を更新 し た命令の直後 • フ ラ グ を更新 し ていない任意の数の命令の後 ほぼすべての ARM 命令は、 APSR 内の ALU ス テー タ ス フ ラ グの状態に基づ いて条件実行で き ます。 命令を条件実行す る ために追加す る 接尾文字の一覧 については、 表 2-2 (ページ 2-21) を参照 し て下 さ い。 Thumb 状態では、 条件実行の メ カ ニ ズ ムは条件分岐に よ り 使用で き ます。 Thumb-2 に対応す る プ ロ セ ッ サの Thumb 状態では、 特殊な IT (If-Then) 命令 を使用す る こ と に よ っ て条件命令を作成す る こ と も で き ます。 ま た、 CBZ 命令 (ゼ ロ の条件分岐) お よ び CBNZ 命令を使用 し て、 レ ジ ス タ の値を ゼ ロ と 比較 し 、 その結果に基づいて分岐す る こ と も で き ます。 こ のセ ク シ ョ ン では、 以下の内容について説明 し ます。 • 「ALU ス テー タ ス フ ラ グ」 (ページ 2-21) • • • • 2-20 「条件実行」 (ページ 2-21) 「条件実行の使用」 (ページ 2-22) 「条件実行の使用例」 (ページ 2-23) 「Q フ ラ グ」 (ページ 2-26) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 2.4.1 ALU ス テー タ ス フ ラ グ APSR は以下の ALU ス テー タ ス フ ラ グ を保持 し ます。 演算結果が負の場合にセ ッ ト さ れ ます。 演算結果がゼ ロ の場合にセ ッ ト さ れます。 演算の結果 と し て キ ャ リ ーが発生 し た場合にセ ッ ト さ れます。 演算の結果 と し てオーバーフ ロ ーが発生 し た場合にセ ッ ト さ れ ます。 N Z C V キ ャ リ ーは以下の場合に発生 し ます。 • 加算の結果が 232 以上の場合 減算の結果が正ま たはゼ ロ の場合 移動命令ま たは論理命令に よ る イ ン ラ イ ンバ レルシ フ タ 演算の結果 と し て • • オーバーフ ロ ーは、 加算、 減算、 ま たは比較の結果が 231 以上ま たは -231 未満 の場合に発生 し ます。 2.4.2 条件実行 条件付 き にで き る 命令には、 任意で条件 コ ー ド を指定で き ます。 構文の説明 では、 条件 コ ー ド を {cond} と 表記 し てい ます。 こ の条件は、 ARM 命令にエ ン コ ー ド さ れ、 Thumb-2 命令の先行す る IT 命令にエ ン コ ー ド さ れ ます。 条件 コ ー ド が指定 さ れてい る 命令は、 APSR の条件 コ ー ド フ ラ グが、 指定 し た条 件を満た し てい る 場合にのみ実行 さ れます。 表 2-2 に、 使用可能な条件 コ ー ド を示 し ます。 Thumb-2 以前のプ ロ セ ッ サの Thumb 状態では、 {cond} フ ィ ール ド は特定の分 岐命令でのみ使用で き ます。 ま た、 表 2-2 は、 条件 コ ー ド の接尾文字 と 、 N、 Z、 C、 お よ び V フ ラ グ と の関係 も 示 し てい ます。 表 2-2 条件 コ ー ド の接尾文字 ARM DUI 0204IJ 接尾文字 フ ラグ 意味 EQ Z セッ ト 等しい NE Z クリア 等 し く ない CS or HS C セッ ト 以上 (符号な し >=) CC or LO C クリア 未満 (符号な し <) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-21 ARM アセ ン ブ リ 言語の記述 表 2-2 条件コ ー ド の接尾文字 (続き) 接尾文字 フ ラグ 意味 MI N セッ ト 負 PL N クリア 正ま たは 0 VS V セッ ト オーバーフ ロ ー VC V クリア オーバーフ ロ ーな し HI C セ ッ ト かつ Z ク リ ア よ り 大き い (符号な し >) LS C ク リ ア ま たは Z セ ッ ト 以下 (符号な し <=) GE N=V 符号付き >= LT N≠V 符号付き < GT Z ク リ ア、 N = V 符号付き > LE Z セッ ト、N ≠ V 符号付き <= AL すべて 無条件 (通常は省略 し ます) 例 2-3 は、 条件実行の例を示 し てい ます。 例 2-3 ADD ADDS ADDSCS CMP 2.4.3 r0, r0, r0, r0, r1, r2 r1, r2 r1, r2 r1 ; ; ; ; r0 = r1 + r2, don't update flags r0 = r1 + r2, and update flags If C flag set then r0 = r1 + r2, and update flags update flags based on r0-r1. 条件実行の使用 ARM 命令の条件実行を使用す る と 、 コ ー ド 内の分岐命令の数を減 ら す こ と が で き ます。 こ れに よ り コ ー ド 密度が向上 し ます。 Thumb-2 の IT 命令を使用 し た 場合に も 同様の効果が得 ら れ ます。 分岐命令に よ り 、 プ ロ セ ッ ササ イ ク ルが増加 し ます。 通常、 分岐予測ハー ド ウ ェ ア を搭載 し ていない ARM プ ロ セ ッ サは、 分岐が発生す る たびに、 プ ロ セ ッ サパ イ プ ラ イ ン を再充填す る のに 3 プ ロ セ ッ ササ イ ク ルを必要 と し ます。 2-22 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 ARM10™ や StrongARM® な ど の一部の ARM プ ロ セ ッ サには、 分岐予測ハー ド ウ ェ アが搭載 さ れてい ます。 こ れ ら のプ ロ セ ッ サ を使用す る シ ス テ ム では、 予測を誤っ た場合で も パ イ プ ラ イ ン を フ ラ ッ シ ュ し て再充填す る だけで済み ます。 2.4.4 条件実行の使用例 こ の例は、 ユー ク リ ッ ド の 最大公約数 (gcd) アルゴ リ ズ ムの 2 つの実装を使 用 し 、 条件実行に よ っ て コ ー ド 密度 と 実行速度を向上 さ せ る 方法を示 し てい ます。 実行速度の詳細分析は、 ARM7™ プ ロ セ ッ サでのみ実行で き ます。 コ ー ド 密度の計算は、 すべての ARM プ ロ セ ッ サで実行で き ます。 C では、 こ のアルゴ リ ズ ム を以下の よ う に表す こ と がで き ます。 int gcd(int a, int b) { while (a != b) { if (a > b) a = a - b; else b = b - a; } return a; } 以下の よ う に、 分岐の条件付 き 実行のみを使用 し て gcd 関数を実装で き ます。 gcd CMP BEQ BLT SUBS B r0, r1 end less r0, r0, r1 gcd SUBS B r1, r1, r0 gcd ; could be SUB r0, r0, r1 for ARM less ; could be SUB r1, r1, r0 for ARM end 分岐を使用す る ため、 こ の コ ー ド では 7 つの命令を実行 し ます。 分岐が発生す る たびに、 プ ロ セ ッ サはパ イ プ ラ イ ン を再充填 し て新 し い位置か ら 実行を継 続す る 必要があ り ます。他の命令 と 未実行分岐にはそれぞれ 1 サ イ ク ルが使用 さ れ ます。 ARM 命令セ ッ ト の条件実行機能を使用す る と 、 以下の よ う にわずか 4 つの命 令で gcd 関数を実装で き ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-23 ARM アセ ン ブ リ 言語の記述 gcd CMP SUBGT SUBLE BNE r0, r1 r0, r0, r1 r1, r1, r0 gcd コ ー ド サ イ ズが小 さ く な る だけでな く 、 ほ と ん ど の場合、 コ ー ド の実行速度 が向上 し ます。 表 2-3 と 表 2-4 は、 r0 = 1 かつ r1 = 2 の場合に、 各実装に よ っ て使用 さ れ る サ イ ク ル数を示 し てい ます。 こ の場合、 分岐を使用せずに、 す べての命令を条件実行にす る こ と に よ り 、 3 サ イ ク ルを省 く こ と がで き ます。 条件実行を使用す る コ ー ド は、 r0 = r1 であ る 限 り 常に同 じ サ イ ク ル数で実行 さ れ ます。 それ以外の場合は、 条件実行を使用す る コ ー ド の方が少ないサ イ ク ル数で実行 さ れ ます。 表 2-3 条件分岐のみの場合 r0: a r1: b 命令 サイ クル (ARM7) 1 2 CMP r0, r1 1 1 2 BEQ end 1 (実行 さ れません) 1 2 BLT less 3 1 2 SUB r1, r1, r0 1 1 2 B gcd 3 1 1 CMP r0, r1 1 1 1 BEQ end 3 合計 13 表 2-4 すべての命令を条件実行する場合 2-24 r0: a r1: b 命令 サイ クル (ARM7) 1 2 CMP r0, r1 1 1 2 SUBGT r0,r0,r1 1 (実行 さ れません) 1 1 SUBLT r1,r1,r0 1 1 1 BNE gcd 3 1 1 CMP r0,r1 1 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 表 2-4 すべての命令を条件実行する場合 (続き) r0: a r1: b 命令 サイ ク ル (ARM7) 1 1 SUBGT r0,r0,r1 1 (実行 さ れません) 1 1 SUBLT r1,r1,r0 1 (実行 さ れません) 1 1 BNE gcd 1 (実行 さ れません) 合計 10 Thumb-2 以前の Thumb バージ ョ ンの gcd 条件実行が可能な Thumb-2 以前の Thumb 命令は B だけなので、 条件分岐を使 用 し て gcd アルゴ リ ズ ム を記述す る 必要があ り ます。 ARM コ ー ド の条件分岐の実装 と 同様に、 Thumb-2 以前の Thumb コ ー ド の場 合に も 7 個の命令が必要です。 全体の コ ー ド サ イ ズは 14 バ イ ト と な り 、 小 さ な ARM の実装 (16 バ イ ト ) と 比較 し て も 小 さ く な り ます。 さ ら に、 16 ビ ッ ト メ モ リ を使用 し てい る シ ス テ ム では、 こ のバージ ョ ン の実 行速度が 2 番目の ARM の実装を 上回 り ます。 こ れは、 1 つの 32 ビ ッ ト ARM 命令には 2 回の フ ェ ッ チが必要であ る のに対 し て、 1 つの 16 ビ ッ ト Thumb 命 令では 1 回の メ モ リ ア ク セ ス で済むか ら です。 Thumb-2 バージ ョ ンの gcd 以下の よ う に IT 命令を使用 し て SUB 命令を条件実行 し 、 ARM バージ ョ ンの こ の コ ー ド を Thumb-2 コ ー ド に変換で き ます。 gcd CMP ITE SUBGT SUBLE BNE r0, r1 GT r0, r0, r1 r1, r1, r0 gcd こ れを アセ ン ブルす る と ARM ま たは Thumb-2 コ ー ド に等 し く な り ます。 アセ ン ブ ラ は IT 命令をチ ェ ッ ク し ますが、 ARM コ ー ド へのアセ ン ブ リ で省略 し ます (IT 命令は省略で き ます。 アセ ンブ ラ は Thumb-2 コ ー ド にアセ ン ブルす る と き にそれ ら を挿入 し ます)。 Thumb-2 コ ー ド では ARM コ ー ド よ り も 命令が 1 つ多 く 必要ですが、 全体の コ ー ド サ イ ズは Thumb-2 コ ー ド は 10 バ イ ト 、 ARM コ ー ド は 16 バ イ ト です。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-25 ARM アセ ン ブ リ 言語の記述 実行速度 実行速度を上げ る ために コ ー ド を最適化す る には、 命令の タ イ ミ ン グ、 分岐 予測 ロ ジ ッ ク 、 お よ び タ ーゲ ッ ト シ ス テ ム のキ ャ ッ シ ュ 動作を よ く 理解 し て お く 必要があ り ます。 詳細については、 『ARM アーキ テ ク チ ャ リ フ ァ レ ン ス マ ニ ュ アル』 と 、 各プ ロ セ ッ サのテ ク ニ カル リ フ ァ レ ン ス マニ ュ アルを参照 し て下 さ い。 2.4.5 Q フ ラグ Q フ ラ グは、 ARMv5TE、 お よ び ARMv6 以上のアーキ テ ク チ ャ において、 サ チ ュ レー ト 算術命令 (「QADD、 QSUB、 QDADD、 QDSUB」 (ページ 4-101) を参照) でいつサチ ュ レーシ ョ ンが発生 し たか、 ま たは特定の乗算命令 (「SMULxy、 SMLAxy」 (ページ 4-83) と 「SMULWy、 SMLAWy」 (ページ 4-85) を参照) でいつオーバーフ ロ ーが発生 し たか を記録す る ために使用 さ れます。 Q フ ラ グは ス テ ィ ッ キー フ ラ グです。 上記の命令で Q フ ラ グ を セ ッ ト す る こ と はで き ますが、 ク リ アす る こ と はで き ません。 こ う し た一連の命令を実行 し た後で フ ラ グ を テ ス ト す る と 、 それ ら の命令の実行中に発生 し たサチ ュ レーシ ョ ンやオーバーフ ロ ーを検出で き る ため、 1 つの命令を実行す る たび に フ ラ グ をチ ェ ッ ク し な く て も 済みます。 Q フ ラ グ を ク リ アす る には、 MSR 命令を使用 し ます (「MSR」 (ページ 4-145) を参照)。 Q フ ラ グの状態を条件 コ ー ド で直接テ ス ト す る こ と はで き ません。 Q フ ラ グの 状態を読み出すには、 MRS 命令を使用 し ます (「MRS」 (ページ 4-143) を参 照)。 2-26 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 2.5 レ ジス タ への定数のロー ド メ モ リ か ら デー タ を ロ ー ド せずに、 1 つの命令で任意の 32 ビ ッ ト 即値を レ ジ ス タ に ロ ー ド す る こ と はで き ません。 こ れは ARM 命令お よ び Thumb-2 命令の 長 さ が 32 ビ ッ ト し かないためです。 デー タ ロ ー ド 命令を使用 し て 32 ビ ッ ト 値を レ ジ ス タ に ロ ー ド す る こ と はで き ますが、 多 く の汎用定数は、 よ り 直接的かつ効率的な方法で ロ ー ド で き ます。 多 く の汎用定数は、 別の ロ ー ド 命令を使用 し な く て も デー タ 処理命令内にオ ペ ラ ン ド と し て直接含め る こ と がで き ます。 16 ビ ッ ト の Thumb 命令にオペ ラ ン ド と し て含め る こ と がで き る 定数の範囲は、 は る かに狭 く な り ます。 ARMv6T2 以上のアーキ テ ク チ ャ では、 MOV 命令を実行 し てか ら MOVT を実行す る こ と に よ っ て、 任意の 32 ビ ッ ト 値を レ ジ ス タ に ロ ー ド す る こ と がで き ま す。 ま た、 疑似命令の MOV32 を使用 し て、 命令シーケ ン ス を作成で き ます。 以下のセ ク シ ョ ン では、 い く つかの ロ ー ド 方法について説明 し ます。 • MOV 命令 と MVN 命令を使用 し て特定範囲の イ ミ デ ィ エー ト 値を ロ ー ド す る 方法 詳細については、 「MOV と MVN を使用 し た直接 ロ ー ド 」 (ページ 2-28) を参照 し て下 さ い。 • MOV32 疑似命令を使用 し て任意の 32 ビ ッ ト 定数を ロ ー ド す る 方法 詳細については、 「MOV32 を使用 し た ロ ー ド 」 (ページ 2-32) を参照 し て下 さ い。 • LDR 疑似命令を使用 し て任意の 32 ビ ッ ト 定数を ロ ー ド す る 方法 詳細については、 「LDR Rd, =const を使用 し た ロ ー ド 」 (ページ 2-32) を 参照 し て下 さ い。 • 浮動小数点定数を ロ ー ド す る 方法 詳細については、 「浮動小数点定数の ロ ー ド 」 (ページ 2-35) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-27 ARM アセ ン ブ リ 言語の記述 2.5.1 MOV と MVN を使用 し た直接ロー ド ARM と Thumb-2 では、 32 ビ ッ ト の MOV 命令 と MVN 命令を使用 し て、 広範囲の 定数値を レ ジ ス タ に直接 ロ ー ド で き ます。 16 ビ ッ ト の Thumb MOV 命令を使用す る と 、0 ~ 255 の範囲内にあ る 任意の定数 を ロ ー ド で き ます。 16 ビ ッ ト の MVN 命令を使用 し て定数を ロ ー ド す る こ と は で き ません。 「「ARM 状態の即値」」 は、 1 つの ARM 命令で ロ ー ド で き る 値の範囲を示 し て い ます。 「Thumb-2 イ ミ デ ィ エー ト 定数」 (ページ 2-30) は、 1 つの Thumb-2 命令で ロ ー ド で き る 値の範囲を示 し てい ます。 MOV と MVN の ど ち ら を使用す る か を決め る 必要はあ り ません。 アセ ンブ ラ が ど ち ら か適切な方を使用 し ます。 こ の機能は値がアセ ン ブ リ 時変数であ る 場合 に便利です。 使用で き ない定数を使用 し て命令を記述 し た場合、 アセ ン ブ ラ は "" と い う エ ラ ーを通知 し ます。 Immediate n out of range for this operation. ARM 状態の即値 ARM 状態での MOV 命令 と MVN 命令を使用 し た ロ ー ド について以下に示 し ます。 • MOV 命令は、 0x0 ~ 0xFF (0 ~ 255) の範囲内にあ る 任意の 8 ビ ッ ト 定数値 を ロ ー ド で き ます。 こ れ ら の値は任意の偶数ビ ッ ト 分 ロ テー ト す る こ と も で き ます。 多 く のデー タ 処理命令では、 こ れ ら の値を別の命令で ロ ー ド せずに、 イ ミ デ ィ エー ト オペ ラ ン ド と し て使用す る こ と も で き ます。 • MVN 命令は、 こ れ ら の値の ビ ッ ト 単位の補数を ロ ー ド で き ます。 その数値 は -(n+1) です。 n は MOV で使用で き る 値です。 • ARMv6T2 以上のアーキ テ ク チ ャ では、 MOV は 0x0-0xFFFF (0 ~ 65535) 範 囲内にあ る 任意の 16 ビ ッ ト の数値を ロ ー ド で き ます。 表 2-5 (ページ 2-29) は、 ARM 状態で提供 さ れ る (デー タ 処理命令に使用で き る ) 8 ビ ッ ト 値の範囲を示 し てい ます。 表 2-6 (ページ 2-29) は、 ARM 状態で提供 さ れ る (MOV 命令にのみ使用で き る ) 16 ビ ッ ト 値の範囲を示 し てい ます。 2-28 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 表 2-5 ARM 状態のイ ミ デ ィ エー ト 定数 (8 ビ ッ ト ) バイ ナ リ 10 進数 ス テッ プ 16 進数 MVN の値 a 注釈 000000000000000000000000abcdefgh 0 ~ 255 1 0-0xFF –1 ~ –256 - 0000000000000000000000abcdefgh00 0 ~ 1020 4 0-0x3FC –4 ~ –1024 - 00000000000000000000abcdefgh0000 0 ~ 4080 16 0-0xFF0 –16 ~ –4096 - 000000000000000000abcdefgh000000 0 ~ 16320 64 0-0x3FC0 –64 ~ –16384 - ... ... ... ... - abcdefgh000000000000000000000000 0 ~ 255 x 224 224 0-0xFF000000 1 ~ 256 x -224 - cdefgh000000000000000000000000ab (ビ ッ ト パ タ ーン) - - (ビ ッ ト パ タ ーン) 「注釈」 の b (ビ ッ ト パ タ ーン) - (ビ ッ ト パ タ ーン) 「注釈」 の b (ビ ッ ト パ タ ーン) - (ビ ッ ト パ タ ーン) 「注釈」 の b efgh000000000000000000000000abcd gh000000000000000000000000abcdef - を参照 を参照 を参照 表 2-6 MOV 命令に使用で き る ARM 状態のイ ミ デ ィ エー ト 定数 バイ ナ リ 10 進数 ス テッ プ 16 進数 MVN の値 注釈 0000000000000000abcdefghijklmnop 0 ~ 65535 1 0-0xFFFF - 「注釈」 の c を参照 注釈 以下は、 表 2-5 と 表 2-6 に関す る 追加説明です。 a MVN の値は、 MVN 命令でオペ ラ ン ド と し て直接使用す る こ と し かで き ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-29 ARM アセ ン ブ リ 言語の記述 b こ れ ら の値は、 ARM 状態でのみ使用で き ます。 こ の表に記載 し た他の値はいずれ も 、 Thumb-2 で も 使用で き ます。 c こ れ ら の値は、 ARMv6T2 以上のアーキ テ ク チ ャ でのみ使用で き ます。 こ れ ら の値は、 他の命令ではオペ ラ ン ド と し て直接使用す る こ と はで き ません。 Thumb-2 イ ミ デ ィ エー ト 定数 ARMv6T2 以上のアーキ テ ク チ ャ の Thumb 状態での、 MOV 命令 と MVN 命令 を使用 し た ロ ー ド について以下に示 し ます。 • 32 ビ ッ ト の MOV 命令では、 以下を ロ ー ド で き ます。 — 0x0 ~ 0xFF (0 ~ 255) の範囲内にあ る 任意の 8 ビ ッ ト 定数値 — 任意の ビ ッ ト 数分左シ フ ト し た任意の 8 ビ ッ ト 定数値 — レ ジ ス タ のすべての 4 バ イ ト で重複 し てい る 任意の 8 ビ ッ ト の ビ ッ ト パ タ ーン バ イ ト 1 と 3 がゼ ロ に設定 さ れてい る と き に、 バ イ ト 0 と 2 で重複 し てい る 任意の 8 ビ ッ ト の ビ ッ ト パ タ ーン — — バ イ ト 0 と 2 がゼ ロ に設定 さ れてい る と き に、 バ イ ト 1 と 3 で重複 し てい る 任意の 8 ビ ッ ト の ビ ッ ト パ タ ーン 多 く のデー タ 処理命令では、 こ れ ら の値を別の命令で ロ ー ド せずに、 イ ミ デ ィ エー ト オペ ラ ン ド と し て使用す る こ と も で き ます。 • 32 ビ ッ ト の MVN 命令は、 こ れ ら の値の ビ ッ ト 単位の補数を ロ ー ド で き ま す。 その数値は -(n+1) です。 n は MOV で使用で き る 値です。 • 32 ビ ッ ト の MOV 命令は、 0x0-0xFFFF (0 ~ 65535) の範囲内にあ る 任意の 16 ビ ッ ト の数値を ロ ー ド で き ます。 こ れ ら の値は、 デー タ 処理命令で は イ ミ デ ィ エー ト オペ ラ ン ド と し て使用す る こ と はで き ません。 表 2-7 (ページ 2-31) は、 ARMv6T2 以上のアーキ テ ク チ ャ の Thumb 状態で 提供 さ れ る (デー タ 処理命令に使用で き る ) 値の範囲を示 し てい ます。 表 2-8 (ページ 2-31) は、 ARMv6T2 以上のアーキ テ ク チ ャ の Thumb 状態で 提供 さ れ る (MOV 命令にのみ使用で き る ) 16 ビ ッ ト 値の範囲を示 し てい ます。 2-30 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 表 2-7 Thumb-2 即値 バイ ナ リ 10 進数 ス テッ プ 16 進数 MVN の値 a 注釈 000000000000000000000000abcdefgh 0 ~ 255 1 0-0xFF –1 ~ –256 - 00000000000000000000000abcdefgh0 0 ~ 510 2 0-0x1FE –2 ~ –512 - 0000000000000000000000abcdefgh00 0 ~ 1020 4 0-0x3FC –4 ~ –1024 - ... ... ... ... - 0abcdefgh00000000000000000000000 0 ~ 255 x 223 223 0-0x7F800000 1 ~ 256 x 223 - abcdefgh000000000000000000000000 0 ~ 255 x 224 224 0-0xFF000000 1 ~ 256 x 224 - abcdefghabcdefghabcdefghabcdefgh (ビ ッ ト パ タ ーン) - 0xXYXYXYXY 0xXYXYXYXY - 00000000abcdefgh00000000abcdefgh (ビ ッ ト パ タ ーン) - 0x00XY00XY 0xFFXYFFXY - abcdefgh00000000abcdefgh00000000 (ビ ッ ト パ タ ーン) - 0xXY00XY00 0xXYFFXYFF - 00000000000000000000abcdefghijkl 0 ~ 4095 1 0-0xFFF - 「注釈」 (ページ 2-32) の b を 参照 表 2-8 MOV 命令に使用で き る Thumb-2 状態の即値 バイ ナ リ 10 進数 ス テッ プ 16 進数 MVN の値 注釈 0000000000000000abcdefghijklmnop 0 ~ 65535 1 0-0xFFFF - 「注釈」 (ページ 2-32) の c を 参照 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-31 ARM アセ ン ブ リ 言語の記述 注釈 以下は、 表 2-7 (ページ 2-31) と 表 2-8 (ページ 2-31) に関す る 追加説明です。 MVN の値は、 MVN 命令でオペ ラ ン ド と し て直接使用す る こ と し かで a き ません。 2.5.2 b こ れ ら の値は、 ADD、 SUB、 お よ び MOV 命令では直接オペ ラ ン ド と し て使用で き ますが、 MVN や他のデー タ 処理命令では直接オペ ラ ン ド と し て使用で き ません。 c こ れ ら の値は、 MOV 命令でのみ使用で き ます。 MOV32 を使用 し た ロー ド ARMv6T2 以降では、 ARM 命令セ ッ ト と Thumb-2 命令セ ッ ト の両方に、 以下 の命令が含まれてい ます。 • 0x00000000 ~ 0x0000FFFF の範囲内にあ る 任意の値を レ ジ ス タ に ロ ー ド で き る MOV 命令 • レ ジ ス タ の下位半分の内容を変更す る こ と な く 、 0x0000 ~ 0xFFFF の範囲 内にあ る 任意の値を レ ジ ス タ の上位半分に ロ ー ド で き る MOVT 命令 こ れ ら 2 つの命令を使用 し て、 レ ジ ス タ に任意の 32 ビ ッ ト 定数を構成で き ま す。 ま た、 MOV32 疑似命令を使用す る こ と も で き ます。 アセ ンブ ラ か ら は、 MOV 命令 と MOVT 命令のペアが生成 さ れ ます。 MOV32 疑似命令の構文については、 「MOV32 疑似命令」 (ページ 4-168) を参照 し て下 さ い。 2.5.3 LDR Rd, =const を使用 し た ロー ド LDR Rd,=const 疑似命令を使用す る と 、 1 つの命令で任意の 32 ビ ッ ト 数値定数 を構成で き ます。 MOV 命令 と MVN 命令の範囲外の定数を生成す る には、 こ の疑 似命令を使用 し ます。 LDR 疑似命令は、 特定の定数に対 し て最 も 効率的な命令を生成 し ます。 • こ の定数を 1 つの MOV 命令ま たは MVN 命令を使用 し て構成で き る 場合、 アセ ンブ ラ に よ っ て ど ち ら か適切な命令が生成 さ れ ます。 • こ の定数を 1 つの MOV 命令ま たは MVN 命令を使用 し て構成で き ない場合、 アセ ンブ ラ に よ っ て以下の処理が行われます。 — 2-32 リ テ ラ ルプール ( コ ー ド に組み込まれた、 定数値を保持す る ため の メ モ リ の一部) に値を配置す る 。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 — リ テ ラ ルプールか ら 定数を読み出す、 プ ロ グ ラ ム相対ア ド レ ス を 使用す る LDR 命令を生成す る 。 以下に例を示 し ます。 LDR rn, [pc, #offset to literal pool] ; load register n with one word ; from the address [pc + offset] アセ ン ブ ラ が生成 し た LDR 命令の範囲内に リ テ ラ ルプールがあ る こ と を 確認す る 必要があ り ます。 詳細については、 「 リ テ ラ ルプールの配置」 を参照 し て下 さ い。 LDR 疑似命令の構文については、 「LDR 疑似命令」 (ページ 4-170) を参照 し て 下 さ い。 リ テ ラルプールの配置 アセ ン ブ ラ は、 各セ ク シ ョ ンの終了位置に リ テ ラ ルプールを配置 し ます。 各 セ ク シ ョ ンの終了位置は、 次のセ ク シ ョ ンの開始位置にあ る AREA デ ィ レ ク テ ィ ブか、 アセ ンブ リ の終了位置にあ る END デ ィ レ ク テ ィ ブに よ っ て定義 さ れます。 イ ン ク ルー ド さ れた フ ァ イ ルの最後にあ る END デ ィ レ ク テ ィ ブは、 セ ク シ ョ ンの終了位置を示 し てい る わけではあ り ません。 大 き なセ ク シ ョ ン では、 デフ ォ ル ト の リ テ ラ ルプールが 1 つ以上の LDR 命令の 範囲内に収ま ら ない可能性があ り ます。 プ ロ グ ラ ム カ ウ ン タ か ら 定数ま での オ フ セ ッ ト は、 以下の規則に従 う 必要があ り ます。 • ARM ま たは Thumb-2 コ ー ド の場合 : 順方向ま たは逆方向に 4KB 未満 • Thumb-2 以前の Thumb コ ー ド 、 ま たは Thumb-2 コ ー ド で 16 ビ ッ ト 命令 を使用す る 場合 : 順方向に 1KB 未満 LDR Rd,=const 疑似命令が定数を リ テ ラ ルプールに配置す る よ う に要求 し てい る 場合、 アセ ン ブ ラ は以下を行い ます。 • その定数が既存の リ テ ラ ルプール内に存在 し 、 かつそ こ か ら ア ド レ ス指 定が可能であ る か ど う か をチ ェ ッ ク し ます。 可能であれば、 既存の定数 でア ド レ ス指定 し ます。 • 定数が既存の リ テ ラ ルプールに存在 し ない場合は、 次の リ テ ラ ルプール への定数の配置を試みます。 次の リ テ ラ ルプールが範囲外の場合、 アセ ンブ ラ はエ ラ ー メ ッ セージ を生成 し ます。 こ の場合は LTORG デ ィ レ ク テ ィ ブ を使用 し て、 コ ー ド 内に別の リ テ ラ ルプールを配置す る 必要があ り ます。 LTORG デ ィ レ ク テ ィ ブ を失敗 し た LDR 疑 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-33 ARM アセ ン ブ リ 言語の記述 似命令の後、 かつ -4 ~ 4KB (ARM、 32 ビ ッ ト Thumb-2 の場合) ま たは 0 ~ 1KB (Thumb-2 以前の Thumb、 16 ビ ッ ト Thumb-2 の場合) の範囲内の位置に 配置 し ます。 詳細については、 「LTORG」 (ページ 7-20) を参照 し て下 さ い。 リ テ ラ ルプールは、 プ ロ セ ッ サに よ っ て命令 と し て実行 さ れない位置に配置 す る 必要があ り ます。 つま り 、 無条件分岐命令の後ま たはサブルーチン の最 後にあ る 復帰命令の後に配置 し て下 さ い。 例 2-4 は こ れを実装す る コ ー ド を示 し てい ます。 こ のサン プルは、 メ イ ンサン プルデ ィ レ ク ト リ の install_directory\RVDS\Examples に loadcon.s と い う 名前で 収録 さ れてい ます。 こ のサ ンプルを アセ ンブル、 リ ン ク 、 お よ び実行す る 方 法については、 「サンプル コー ド 」 (ページ 2-2) を参照 し て下 さ い。 コ メ ン ト と し て リ ス ト さ れてい る 命令は、 アセ ン ブ ラ に よ っ て生成 さ れ る ARM 命令です。 例 2-4 AREA ENTRY Loadcon, CODE, READONLY BL BL func1 func2 ; Branch to first subroutine ; Branch to second subroutine MOV LDR SVC r0, #0x18 r1, =0x20026 #0x123456 ; angel_SWIreason_ReportException ; ADP_Stopped_ApplicationExit ; ARM semihosting (formerly SWI) LDR LDR r0, =42 r1, =0x55555555 LDR BX LTORG r2, =0xFFFFFFFF lr ; ; ; ; LDR r3, =0x55555555 ; Mark first instruction to execute start stop func1 => MOV R0, #42 => LDR R1, [PC, #offset to Literal Pool 1] => MVN R2, #0 ; Literal Pool 1 contains ; literal Ox55555555 func2 ; LDR r4, =0x66666666 BX LargeTable SPACE 2-34 ; ; ; ; ; => LDR R3, [PC, #offset to Literal Pool 1] If this is uncommented it fails, because Literal Pool 2 is out of reach lr 4200 ; Starting at the current location, Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 END 2.5.4 ; clears a 4200 byte area of memory ; to zero ; Literal Pool 2 is empty 浮動小数点定数のロー ド NEON 命令セ ッ ト お よ び VFPv3 命令セ ッ ト には、 範囲の制限 さ れた浮動小数 点定数を イ ミ デ ィ エー ト 定数 と し て ロ ー ド す る 命令があ り ます。 詳細につい ては、 以下を参照 し て下 さ い。 • NEON 命令の詳細については、 「VMOV、 VMVN ( イ ミ デ ィ エー ト )」 (ページ 5-49) を参照 し て下 さ い。 • VFPv3 命令の詳細については、 「VMOV」 (ページ 5-122) を参照 し て下 さ い。 VLDR 疑似命令を使用す る と 、 単精度ま たは倍精度の浮動小数点定数を リ テ ラ ルプールか ら 1 つの命令で ロ ー ド で き ます。 詳細については、 「VLDR 疑似命令」 (ページ 5-96) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-35 ARM アセ ン ブ リ 言語の記述 2.6 レ ジ ス タ へのア ド レ スのロー ド レ ジ ス タ にア ド レ ス を ロ ー ド し なければな ら ない場合が よ く あ り ます。 例え ば、 変数、 文字列定数、 ま たはジ ャ ン プテーブルの開始位置のア ド レ ス を ロ ー ド す る 必要のあ る 場合があ り ます。 一般的に、 ア ド レ ス は、 現在のプ ロ グ ラ ム カ ウ ン タ ま たは他の レ ジ ス タ か ら のオ フ セ ッ ト で表現 し ます。 こ のセ ク シ ョ ン では、 ア ド レ ス を レ ジ ス タ に ロ ー ド す る 以下の 2 つの方法に ついて説明 し ます。 • レ ジ ス タ への直接 ロ ー ド (「「ADR と ADRL を使用 し た直接 ロ ー ド 」」 を 参照) • リ テ ラ ルプールか ら のア ド レ ス の ロ ー ド (「LDR Rd, =label を使用 し た ア ド レ ス の ロ ー ド 」 (ページ 2-40) を参照) 2.6.1 ADR と ADRL を使用 し た直接ロー ド ADR 命令 と ADRL 疑似命令を使用す る と 、 デー タ ロ ー ド 命令を使用 し な く て も 特定の範囲内のア ド レ ス を生成す る こ と がで き ます。 ADR 命令 と ADRL 命令で は、 プ ロ グ ラ ム相対式を使用で き ます。 プ ロ グ ラ ム相対式 と は、 任意のオ フ セ ッ ト に付け る ラ ベルで、 こ の ラ ベルのア ド レ ス が現在のプ ロ グ ラ ム カ ウ ン タ の相対ア ド レ ス と な り ます。 注 ADR 命令ま たは ADRL 命令で使用す る ラ ベルは、 同 じ コ ー ド セ ク シ ョ ン内に存 在 し てい る 必要があ り ます。 同 じ コ ー ド セ ク シ ョ ン内にない ラ ベルを参照す る と 、 アセ ンブ ラ に よ り エ ラ ーが返 さ れます。 Thumb 状態では、 16 ビ ッ ト の ADR 命令で生成で き る のは ワー ド 境界で整列 さ せた ア ド レ ス のみです。 Thumb-2 以前のプ ロ セ ッ サでは、 Thumb 状態で ADRL 命令を使用す る こ と はで き ません。 ADR 利用で き る 範囲は、 使用す る 命令セ ッ ト に よ っ て異な り ます。 ARM 2-36 バ イ ト ま たはハーフ ワ ー ド 境界で整列 さ れてい る ア ド レ ス か ら 255 バ イ ト の範囲 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 ワー ド 境界で整列 さ れてい る ア ド レ ス か ら 1020 バ イ ト の 範囲 32 ビ ッ ト の Thumb-2 バ イ ト 、 ハーフ ワー ド 、 ま たは ワ ー ド 境界で整列 さ れてい る ア ド レ ス か ら 4095 バ イ ト の範囲 16 ビ ッ ト の Thumb 0 ~ 1020 バ イ ト 。 label は ワ ー ド 境界で整列 さ せ る 必要が あ り ます ALIGN デ ィ レ ク テ ィ ブ を使用 し て、 label を ワー ド 境界で整列 さ せ る こ と がで き ます。 詳細については、 「ADR」 (ページ 4-24) を参照 し て下 さ い。 ADRL アセ ン ブ ラ は、 以下を生成す る こ と に よ り 、 ADRL rn,label 疑似命令を変換 し ま す。 • ア ド レ ス が範囲内にあ る 場合は、 そのア ド レ ス を ロ ー ド す る 2 つのデー タ 処理命令を生成 し ます。 • 2 つの命令でア ド レ ス を構成で き ない場合は、 エ ラ ー メ ッ セージ を生成 し ます。 利用で き る 範囲は、 使用す る 命令セ ッ ト に よ っ て異な り ます。 ARM バ イ ト 境界ま たはハーフ ワ ー ド 境界で整列 さ れてい る ア ド レ ス か ら 64KB の範囲 ワー ド 境界で整列 さ れてい る ア ド レ ス か ら 256KB の範囲 32 ビ ッ ト の Thumb-2 バ イ ト 、 ハーフ ワー ド 、 ま たは ワ ー ド 境界で整列 さ れてい る ア ド レ ス か ら 1MB の範囲 16 ビ ッ ト の Thumb ADRL 命令は使用で き ません。 ADRL 疑似命令の範囲外にあ る ア ド レ ス の ロ ー ド については、 「LDR Rd, =label を使用 し た ア ド レ ス の ロ ー ド 」 (ページ 2-40) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-37 ARM アセ ン ブ リ 言語の記述 ADR を使用 し たジ ャ ン プ テーブルの実装 例 2-5 は、 ジ ャ ン プテーブルを実装す る ARM コ ー ド を示 し てい ます。 ADR 命 令では、 ジ ャ ン プテーブルのア ド レ ス を ロ ー ド し ます。 こ の コ ー ド は、 メ イ ンサン プルデ ィ レ ク ト リ の install_directory\RVDS\Examples に jump.s と い う 名 前で収録 さ れてい ます。 こ のサン プルを アセ ン ブル、 リ ン ク 、 お よ び実行す る 方法については、 「サンプル コー ド 」 (ページ 2-2) を参照 し て下 さ い。 例 2-5 ARM コ ー ド によ る ジ ャ ン プ テーブルの実装 num AREA ARM EQU ENTRY Jump, CODE, READONLY MOV MOV MOV BL r0, #0 r1, #3 r2, #2 arithfunc 2 start ; ; ; ; ; ; Name this block of code Following code is ARM code Number of entries in jump table Mark first instruction to execute First instruction to call Set up the three parameters ; Call the function stop MOV LDR SVC arithfunc CMP integer BXHS ADR LDR JumpTable DCD DCD DoAdd ADD BX DoSub SUB BX END r0, #0x18 r1, =0x20026 #0x123456 r0, #num ; ; ; ; ; angel_SWIreason_ReportException ADP_Stopped_ApplicationExit ARM semihosting (formerly SWI) Label the function Treat function code as unsigned lr r3, JumpTable pc, [r3,r0,LSL#2] ; If code is >= num then simply return ; Load address of jump table ; Jump to the appropriate routine DoAdd DoSub r0, r1, r2 lr ; Operation 0 ; Return r0, r1, r2 lr ; Operation 1 ; Return ; Mark the end of this file 例 2-5 では、 関数 arithfunc が 3 つの引数を取 り 、r0 に結果を返 し ます。 最初の 引数に よ っ て、 2 番目 と 3 番目の引数に対 し て実行 さ れ る 演算が決ま り ます。 引数 1 = 0 2-38 結果 = 引数 2 + 引数 3 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 引数 1 = 1 結果 = 引数 2 – 引数 3 ジ ャ ンプテーブルは、 以下の命令 と アセ ンブ ラ デ ィ レ ク テ ィ ブ を使用 し て実 装 さ れ ます。 EQU アセ ンブ ラ デ ィ レ ク テ ィ ブです。 こ のデ ィ レ ク テ ィ ブ を使用 し て シ ン ボルに値を指定 し ます。 例 2-5 (ページ 2-38) では、 num に値 2 を割 り 当て ます。 コ ー ド 内で num を使用す る と 、 値 2 に置 き 換 え ら れ ます。 EQU の こ の よ う な使用法は、 C 言語で #define を使用 し て定数を定義す る 方法 と 似てい ます。 DCD ス ト アす る 1 つ以上の ワ ー ド を宣言 し ます。 例 2-5 (ページ 2-38) では、 各 DCD が、 ジ ャ ン プテーブルの特定の節を処理す る ルーチ ンのア ド レ ス を ス ト ア し ます。 LDR LDR pc,[r3,r0,LSL#2] 命令は、 ジ ャ ンプテーブルか ら 必要な節のア ド レ ス を プ ロ グ ラ ム カ ウ ン タ に ロ ー ド し ます。 こ の命令は以下を 実行 し ます。 • r0 が保持す る 節の数を 4 で乗算 し て ワ ー ド オ フ セ ッ ト を求 める。 ARM DUI 0204IJ • 結果を ジ ャ ン プテーブルのア ド レ ス に加算す る 。 • 加算 し た ア ド レ ス の内容を プ ロ グ ラ ム カ ウ ン タ に ロ ー ド す る。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-39 ARM アセ ン ブ リ 言語の記述 2.6.2 LDR Rd, =label を使用 し たア ド レ スのロー ド LDR Rd,= 疑似命令を使用す る こ と に よ り 、 ど の よ う な 32 ビ ッ ト 数値定数で も レ ジ ス タ に ロ ー ド で き ます (「LDR Rd, =const を使用 し た ロ ー ド 」 (ページ 2-32) を参照)。 ま た、 こ の命令には、 ラ ベルやオ フ セ ッ ト 付 き ラ ベルな ど の プ ロ グ ラ ム相対式 も 使用で き ます。 構文の詳細については、 「LDR 疑似命令」 (ページ 4-170) を参照 し て下 さ い。 アセ ン ブ ラ は、 以下を行 う こ と に よ り LDR r0, =label 疑似命令を変換 し ます。 • label のア ド レ ス を リ テ ラ ルプール ( コ ー ド に組み込まれた、 定数値を 保持す る ための メ モ リ の一部) に配置す る 。 • リ テ ラ ルプールか ら ア ド レ ス を読み出すプ ロ グ ラ ム相対 LDR 命令を生成 す る 。 以下に例を示 し ます。 LDR rn [pc, #offset to literal pool] ; load register n with one word ; from the address [pc + offset] リ テ ラ ルプールが範囲内にあ る こ と を確認す る 必要があ り ます。 詳細に ついては、 「 リ テ ラ ルプールの配置」 (ページ 2-33) を参照 し て下 さ い。 ADR 疑似命令や ADRL 疑似命令 と は異な り 、 LDR 命令は現在のセ ク シ ョ ンに含ま れない ラ ベルに使用で き ます。 ラ ベルが現在のセ ク シ ョ ン の範囲外にあ る 場 合には、 アセ ン ブ ラ が ソ ース フ ァ イ ルのアセ ンブ リ 時に再配置デ ィ レ ク テ ィ ブ を オブジ ェ ク ト コ ー ド 内に配置 し ます。 こ の再配置デ ィ レ ク テ ィ ブは、 リ ン ク 時にア ド レ ス を解決す る よ う に リ ン カに指示 し ます。 こ のア ド レ ス は、 リ ン カが LDR と リ テ ラ ルプールを含むセ ク シ ョ ン を ど こ に配置 し て も 有効で す。 例 2-6 は こ れを実装す る コ ー ド を示 し てい ます。 こ のサン プルは、 メ イ ンサン プルデ ィ レ ク ト リ の install_directory\RVDS\Examples に ldrlabel.s と い う 名前で 収録 さ れてい ます。 こ のサ ンプルを アセ ンブル、 リ ン ク 、 お よ び実行す る 方 法については、 「サンプル コー ド 」 (ページ 2-2) を参照 し て下 さ い。 コ メ ン ト と し て記載 さ れてい る 命令は、 アセ ン ブ ラ に よ っ て生成 さ れ る ARM 命令です。 例 2-6 AREA ENTRY LDRlabel, CODE,READONLY BL func1 ; Mark first instruction to execute start 2-40 ; Branch to first subroutine Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 BL func2 ; Branch to second subroutine MOV LDR SVC r0, #0x18 r1, =0x20026 #0x123456 ; angel_SWIreason_ReportException ; ADP_Stopped_ApplicationExit ; ARM semihosting (formerly SWI) LDR r0, =start LDR r1, =Darea + 12 LDR r2, =Darea + 6000 BX LTORG lr ; ; ; ; ; ; ; ; => LDR R0,[PC, #offset into Literal Pool 1] => LDR R1,[PC, #offset into Literal Pool 1] => LDR R2, [PC, #offset into Literal Pool 1] Return Literal Pool 1 LDR r3, =Darea + 6000 ; LDR r4, =Darea + 6004 BX SPACE lr 8000 ; ; ; ; ; ; ; ; ; ; ; => LDR r3, [PC, #offset into Literal Pool 1] (sharing with previous literal) If uncommented produces an error as Literal Pool 2 is out of range Return Starting at the current location, clears a 8000 byte area of memory to zero Literal Pool 2 is out of range of the LDR instructions above stop func1 func2 Darea END ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-41 ARM アセ ン ブ リ 言語の記述 LDR Rd, =label の使用例 : 文字列の コ ピー 例 2-7 は、 あ る 1 つの文字列を別の文字列で上書 き す る ARM コ ー ド ルーチン を示 し てい ます。 こ こ では、 LDR 疑似命令を使用 し てデー タ セ ク シ ョ ン か ら 2 つの文字列のア ド レ ス を ロ ー ド し ます。 以下は特に重要です。 DCB デ ィ レ ク テ ィ ブは、 ス ト アす る 1 バ イ ト 以上の値を定義 し ま DCB す。 DCB には整数値だけでな く 、 引用符で囲んだ文字列 も 使用で き ます。 文字列の各文字は、 連続 し たバ イ ト に配置 さ れ ます。 詳 細については、 「DCB」 (ページ 7-26) を参照 し て下 さ い。 LDR, STR LDR 命令 と STR 命令は、 ポ ス ト イ ンデ ク ス ア ド レ シ ン グ を使用 し て、 ア ド レ ス レ ジ ス タ を更新 し ます。 例えば、 以下の命令 LDRB r2,[r1],#1 は、 r1 が指すア ド レ ス の内容を r2 に ロ ー ド し 、 r1 を 1 ずつ イ ン ク リ メ ン ト し ます。 例 2-7 文字列のコ ピー AREA ENTRY StrCopy, CODE, READONLY LDR LDR BL r1, =srcstr r0, =dststr strcopy ; Pointer to first string ; Pointer to second string ; Call subroutine to do copy MOV LDR SVC r0, #0x18 r1, =0x20026 #0x123456 ; angel_SWIreason_ReportException ; ADP_Stopped_ApplicationExit ; ARM semihosting (formerly SWI) LDRB STRB CMP BNE MOV AREA DCB DCB END r2, [r1],#1 ; Load byte and update address r2, [r0],#1 ; Store byte and update address r2, #0 ; Check for zero terminator strcopy ; Keep going if not pc,lr ; Return Strings, DATA, READWRITE "First string - source",0 "Second string - destination",0 ; Mark first instruction to execute start stop strcopy srcstr dststr 2-42 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 2.7 多重レ ジス タ ロー ド / ス ト ア命令 ARM、 Thumb-2、 お よ び Thumb-2 以前の Thumb の命令セ ッ ト には、 メ モ リ と の間で複数レ ジ ス タ の ロ ー ド と ス ト ア を実行す る 命令があ り ます。 多重レ ジ ス タ 転送命令を使用す る と 、 複数レ ジ ス タ の内容を メ モ リ と の間で 効率的に移動で き ます。 こ れ ら の命令は、 サブルーチン のエ ン ト リ と 終了時 におけ る ブ ロ ッ ク コ ピーやス タ ッ ク 操作に よ く 使用 さ れ ます。 複数の単一 デー タ 転送命令の代わ り に多重レ ジ ス タ 転送命令を使用す る と 、 以下の よ う な利点があ り ます。 • コ ー ド サ イ ズが小 さ く な る 。 • 何度 も 命令フ ェ ッ チす る のではな く 1 回の命令フ ェ ッ チで済むため、 オーバヘ ッ ド が小 さ い。 • キ ャ ッ シ ュ な し ARM プ ロ セ ッ サでは、 多重 ロ ー ド / ス ト ア命令に よ っ て転送 さ れ る デー タ の先頭 ワー ド は必ず非シーケ ン シ ャ ル メ モ リ サ イ ク ルで処理 さ れ る が、 その後に転送 さ れ る すべての ワー ド はシーケ ン シ ャ ルサ イ ク ルで処理す る こ と が可能。 ほ と ん ど のシ ス テ ム では、 シーケ ン シ ャ ル メ モ リ サ イ ク ルの方が実行速度が速 く な り ます。 注 最 も 小 さ な番号の レ ジ ス タ がア ク セ ス先の最下位ア ド レ ス と の間で転送 さ れ、 最 も 大 き な番号の レ ジ ス タ がア ク セ ス先の最上位ア ド レ ス と の間で転送 さ れ ます。 命令の レ ジ ス タ リ ス ト 内での レ ジ ス タ の順序は関係あ り ません。 レ ジ ス タ リ ス ト 内の レ ジ ス タ が昇順に指定 さ れてい る こ と を確認す る に は、--diag_warning 1206 アセ ン ブ ラ コ マ ン ド ラ イ ン オプシ ョ ン を使用 し ます。 こ のセ ク シ ョ ン では、 以下の内容について説明 し ます。 • 「ARM と Thumb で利用で き る 多重 ロ ー ド / ス ト ア命令」 (ページ 2-44) • • ARM DUI 0204IJ 「LDM と STM に よ る ス タ ッ ク の実装」 (ページ 2-45) 「LDM お よ び STM に よ る ブ ロ ッ ク コ ピー」 (ページ 2-48) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-43 ARM アセ ン ブ リ 言語の記述 2.7.1 ARM と Thumb で利用で き る多重ロー ド / ス ト ア命令 ARM 命令セ ッ ト と Thumb 命令セ ッ ト では、 以下の命令が利用で き ます。 複数の レ ジ ス タ を ロ ー ド す る 。 複数の レ ジ ス タ を ス ト アす る 。 複数の レ ジ ス タ を ス タ ッ ク に ス ト ア し て、 ス タ ッ ク ポ イ ン タ を 更新す る 。 複数の レ ジ ス タ を ス タ ッ ク か ら ロ ー ド し て、 ス タ ッ ク ポ イ ン タ を更新す る 。 LDM STM PUSH POP LDM 命令 と STM 命令を使用 し て以下を行え ます。 • • • ロ ー ド ま たは ス ト アす る レ ジ ス タ の リ ス ト には以下を含め る こ と がで き ます。 — ARM 命令では、 任意ま たはすべての r0 ~ r15 を含め る こ と がで き ます。 — 32 ビ ッ ト の Thumb-2 命令では、 任意ま たはすべての r0 ~ r12 を含 め る こ と がで き ます。 ま た、 制限はあ り ますが、 オプシ ョ ン で r14 ま たは r15 を含め る こ と がで き ます。 — 16 ビ ッ ト の Thumb 命令 と Thumb-2 命令では、任意ま たはすべての r0 ~ r7 を含め る こ と がで き ます。 ア ド レ ス は、 以下の よ う に操作で き ます。 — 転送単位でポ ス ト イ ン ク リ メ ン ト — 転送単位でプ レ イ ン ク リ メ ン ト (ARM 命令のみ) — 転送単位でポ ス ト デ ク リ メ ン ト (ARM 命令のみ) — 転送単位でプ レデ ク リ メ ン ト (16 ビ ッ ト の Thumb ではサポー ト さ れません) ベース レ ジ ス タ に対 し ては以下のいずれかの操作を実行で き ます。 — メ モ リ 内の次のブ ロ ッ ク を指す よ う に更新す る 。 — 命令前の状態を維持す る 。 メ モ リ 内の次のブ ロ ッ ク を指す よ う にベース レ ジ ス タ を更新す る こ と は、 ラ イ ト バ ッ ク と 呼ばれます。 つま り 、 調整 さ れた ア ド レ ス がベース レ ジ ス タ に 書 き 込ま れ ます。 PUSH 命令 と POP 命令を使用 し て以下を行え ます。 • 2-44 ス タ ッ ク ポ イ ン タ (sp) がベース レ ジ ス タ と し て使用 さ れ、 常に更新 さ れ ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 • POP 命令では、 ア ド レ ス は転送単位でポ ス ト イ ン ク リ メ ン ト さ れ ます。 ま た、 PUSH 命令では、 ア ド レ ス は転送単位でプ レデ ク リ メ ン ト さ れま す。 • 2.7.2 ロ ー ド ま たは ス ト アす る レ ジ ス タ の リ ス ト には以下を含め る こ と がで き ます。 — ARM 命令では、 任意ま たはすべての r0 ~ r15 を含め る こ と がで き ます。 — 32 ビ ッ ト の Thumb-2 命令では、 任意ま たはすべての r0 ~ r12 を含 め る こ と がで き ます。 ま た、 制限はあ り ますが、 オプシ ョ ン で r14 ま たは r15 を含め る こ と がで き ます。 — 16 ビ ッ ト の Thumb-2 命令 と Thumb 命令では、任意ま たはすべての r7 ~ r15 を含め る こ と がで き ます。 ま た、 オプシ ョ ン で r14 (PUSH 命令の場合のみ) ま たは r15 (POP 命令の場合のみ) を含め る こ と がで き ます。 LDM と STM に よ る ス タ ッ クの実装 多重 ロ ー ド / ス ト ア命令に よ っ て、 ベース レ ジ ス タ を更新で き ます。 通常、 ス タ ッ ク 操作では、 ベース レ ジ ス タ には ス タ ッ ク ポ イ ン タ sp が使用 さ れます。 つま り 、 こ れ ら の命令を使用す る と 、 1 つの命令で任意の数の レ ジ ス タ に対 し てプ ッ シ ュ 操作 と ポ ッ プ操作を実装す る こ と がで き ます。 多重 ロ ー ド / ス ト ア命令は、 以下の タ イ プの ス タ ッ ク に使用で き ます。 下降ま たは上昇 ス タ ッ ク には、 上位ア ド レ ス か ら 下位ア ド レ ス に下に向か っ て 展開 さ れ る 下降 ス タ ッ ク と 、 下位ア ド レ ス か ら 上位ア ド レ ス に 向か っ て展開 さ れ る 上昇 ス タ ッ ク があ り ます。 フルま たは空 ス タ ッ ク ポ イ ン タ は、 ス タ ッ ク 内の最後の項目 ( フル ス タ ッ ク ) ま たは ス タ ッ ク の次の空 き 領域 (空 ス タ ッ ク ) の ど ち ら か を指 す こ と がで き ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-45 ARM アセ ン ブ リ 言語の記述 プ レ / ポ ス ト イ ン ク リ メ ン ト やプ レ / ポ ス ト デ ク リ メ ン ト 接尾文字を使用す る 代わ り に、 ス タ ッ ク 指向の接尾文字を使用す る こ と で、 プ ロ グ ラ ミ ン グが さ ら に容易にな り ます。 表 2-9 に ロ ー ド / ス ト ア命令の ス タ ッ ク 指向接尾文字お よ びそれ ら と 同等のア ド レ ッ シ ン グモー ド 接尾文字を示 し ます。 表 2-9 ス タ ッ ク 指向接尾文字および同等のア ド レ ッ シ ングモー ド 接尾文字 ス ト ア またはプ ッ シ ュ 命令 ロー ド またはポ ッ プ命 令 FD (完全降順ス タ ッ ク ) DB (プ レデ ク リ メ ン ト) IA (ポ ス ト イ ン ク リ メ ン ト) FA (完全昇順ス タ ッ ク ) IB (プ レ イ ン ク リ メ ン ト) DA (ポ ス ト デ ク リ メ ン ト) ED (空 き 降順ス タ ッ ク ) DA (ポ ス ト デ ク リ メ ン ト) IB (プ レ イ ン ク リ メ ン ト) EA (空 き 昇順ス タ ッ ク ) IA (ポ ス ト イ ン ク リ メ ン ト) DB (プ レデ ク リ メ ン ト) ス タ ッ ク 指向接尾文字 表 2-10 に各種ス タ ッ ク タ イ プに対す る ス タ ッ ク 指向接尾文字が付いた多重 ロ ー ド / ス ト ア命令を示 し ます。 表 2-10 多重ロー ド / ス ト ア命令の接尾文字 ス タ ッ クのタ イ プ ストア ロー ド フル下降 STMFD (STMDB、 プ レデ ク リ メ LDMFD (LDM、 ポ ス ト イ ン ク リ ント) メン ト) STMFA (STMIB、 プ レ イ ン ク リ LDMFA (LDMDA、 ポ ス ト デ ク リ メント) メン ト) STMED (STMDA、 ポ ス ト デ ク リ LDMED (LDMIB、 プ レ イ ン ク リ メント) メン ト) STMEA (STM、 ポ ス ト イ ン ク リ LDMEA (LDMDB、 プ レデ ク リ メ メント) ン ト) フル上昇 空下降 空上昇 例: STMFD LDMFD 2-46 sp!, {r0-r5} sp!, {r0-r5} ; Push onto a Full Descending Stack ; Pop from a Full Descending Stack Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 注 ARM アーキ テ ク チ ャ 向けプ ロ シージ ャ コール標準 (AAPCS)、 お よ び ARM と Thumb の C/C++ コ ンパ イ ラ では、 常に フル下降ス タ ッ ク を使用 し ます。 PUSH 命令 と POP 命令では、 フル下降ス タ ッ ク が使用 さ れ る こ と が想定 さ れま す。 こ れ ら は、 ラ イ ト バ ッ ク を使用す る STMDB 命令 と LDM に適 し た同義語です。 ネス ト さ れたサブルーチ ンのレ ジ ス タ のス タ ッ ク ス タ ッ ク 操作は、 サブルーチンのエ ン ト リ と 終了時で行 う と 効果的です。 サ ブルーチンのエ ン ト リ で必要なすべての作業レ ジ ス タ を ス タ ッ ク に ス ト ア し 、 終了時に ス タ ッ ク か ら ポ ッ プす る こ と がで き ます。 ま た、 サブルーチン のエ ン ト リ で リ ン ク レ ジ ス タ を ス タ ッ ク にプ ッ シ ュ し て おけば、 復帰ア ド レ ス を失わずに別のサブルーチン コ ールを安全に実行で き ます。 こ の場合は、 lr を ポ ッ プ し て、 その値を pc に移動す る 代わ り に、 サブ ルーチンの終了時に ス タ ッ ク か ら pc を ポ ッ プす る こ と に よ っ てサブルーチン か ら 戻 る こ と がで き ます。 例 : subroutine PUSH ; code BL ; code POP {r5-r7,lr} ; Push work registers and lr somewhere_else {r5-r7,pc} ; Pop work registers and pc 注 ARM/Thumb 混合シ ス テ ム で こ の方法を使用す る 場合は注意す る 必要があ り ます。 ARMv4T シ ス テ ム では、 プ ロ グ ラ ム カ ウ ン タ を直接ポ ッ プ し て も 状態 を変更す る こ と はで き ません。 こ の よ う な場合は、 ア ド レ ス を一時レ ジ ス タ にポ ッ プ し て、 BX 命令を使用す る 必要があ り ます。 ARMv5T 以上では、 こ の方法で状態を変更で き ます。 ARM と Thumb の混合の詳細については、 『デベ ロ ッ パガ イ ド 』 の第 5 章 ARM と Thumb の イ ン タ ーワー ク を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-47 ARM アセ ン ブ リ 言語の記述 2.7.3 LDM および STM に よ る ブ ロ ッ ク コ ピー 例 2-8 は、 一度に 1 ワ ー ド ずつ コ ピーす る こ と に よ り 、 ソ ース位置の一連の ワー ド をデス テ ィ ネーシ ョ ン に コ ピーす る ARM コ ー ド ルーチン を示 し てい ます。 こ のサン プルは、 メ イ ンサ ンプルデ ィ レ ク ト リ の install_directory\RVDS\Examples に word.s と い う 名前で収録 さ れてい ます。 こ の サン プルを アセ ン ブル、 リ ン ク 、 お よ び実行す る 方法については、 「サンプル コー ド 」 (ページ 2-2) を参照 し て下 さ い。 例 2-8 LDM および STM によ る ブ ロ ッ ク コ ピー num AREA EQU ENTRY Word, CODE, READONLY 20 ; name this block of code ; set number of words to be copied ; mark the first instruction called LDR LDR MOV r0, =src r1, =dst r2, #num ; r0 = pointer to source block ; r1 = pointer to destination block ; r2 = number of words to copy LDR STR SUBS BNE r3, [r0], #4 r3, [r1], #4 r2, r2, #1 wordcopy ; ; ; ; MOV LDR SVC AREA DCD DCD END r0, #0x18 ; angel_SWIreason_ReportException r1, =0x20026 ; ADP_Stopped_ApplicationExit #0x123456 ; ARM semihosting (formerly SWI) BlockData, DATA, READWRITE 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 start wordcopy load a word from the source and store it to the destination decrement the counter ... copy more stop src dst こ のモジ ュ ールは、 で き る だけ多 く の コ ピーで き る 部分に LDM 命令 と STM 命令 を使用す る こ と で、 効率化で き ます。 こ の ARM コ ー ド で指定 さ れてい る レ ジ ス タ の数か ら 、 一度に転送す る ワー ド 数は 8 ワー ド が妥当です。 コ ピーす る ブ ロ ッ ク に 8 ワ ー ド 単位のブ ロ ッ ク がい く つあ る かは、 以下を使用 し て検出で き ます (r2 = コ ピーす る ワ ー ド 数の場合)。 MOVS r3, r2, LSR #3 ; number of eight word multiples こ の値を使用 し て、 一度に 8 ワー ド ずつ コ ピーす る ループ内の繰 り 返 し の回 数を制御で き ます。 残 り の ワ ー ド 数が 8 ワ ー ド に満たない場合は、 以下を使用 し て残 り の ワ ー ド 数を検出で き ます (r2 が破損 し ていない こ と を前提 と し た 場合)。 2-48 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 ANDS r2, r2, #7 例 2-9 は、 LDM 命令 と STM 命令を使用 し て コ ピーす る よ う に書 き 直 し たブ ロ ッ ク コ ピーモジ ュ ールを示 し てい ます。 例 2-9 LDM および STM によ る ブ ロ ッ ク コ ピー num AREA EQU ENTRY Block, CODE, READONLY 20 ; name this block of code ; set number of words to be copied ; mark the first instruction called LDR LDR MOV MOV r0, r1, r2, sp, ; ; ; ; MOVS BEQ PUSH r3,r2, LSR #3 copywords {r4-r11} ; Number of eight word multiples ; Less than eight words to move? ; Save some working registers LDM STM SUBS BNE POP r0!, {r4-r11} r1!, {r4-r11} r3, r3, #1 octcopy {r4-r11} ; ; ; ; ; ; ANDS BEQ r2, r2, #7 stop ; Number of odd words to copy ; No words left to copy? LDR STR SUBS BNE r3, [r0], #4 r3, [r1], #4 r2, r2, #1 wordcopy ; ; ; ; MOV LDR SVC AREA DCD DCD END r0, #0x18 ; angel_SWIreason_ReportException r1, =0x20026 ; ADP_Stopped_ApplicationExit #0x123456 ; ARM semihosting (formerly SWI) BlockData, DATA, READWRITE 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 start =src =dst #num #0x400 r0 = pointer to source block r1 = pointer to destination block r2 = number of words to copy Set up stack pointer (sp) blockcopy octcopy Load 8 words from the source and put them at the destination Decrement the counter ... copy more Don't need these now - restore originals copywords wordcopy Load a word from the source and store it to the destination Decrement the counter ... copy more stop src dst ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-49 ARM アセ ン ブ リ 言語の記述 2.8 マ ク ロの使用 マ ク ロ 定義は、 MACRO デ ィ レ ク テ ィ ブ と MEND デ ィ レ ク テ ィ ブの間にあ る コ ー ド ブ ロ ッ ク です。 こ れに よ っ て コ ー ド ブ ロ ッ ク 全体を繰 り 返す代わ り に使用で き る 名前が定義 さ れます。 マ ク ロ を使用す る 主な用途は以下の と お り です。 • コ ー ド ブ ロ ッ ク を 1 つの分か り やすい名前に置 き 換え る こ と に よ り 、 ソ ース コ ー ド の ロ ジ ッ ク を追いやす く す る 。 • コ ー ド ブ ロ ッ ク の繰 り 返 し を防ぐ 。 詳細については、 「MACRO、 MEND」 (ページ 7-37) を参照 し て下 さ い。 こ のセ ク シ ョ ン では、 以下の内容について説明 し ます。 「Test-and-Branch (テ ス ト - 分岐) マ ク ロ のサンプル」 (ページ 2-51) • • 2-50 「符号な し 整数除算マ ク ロ のサンプル」 (ページ 2-51) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 2.8.1 Test-and-Branch (テ ス ト - 分岐) マ ク ロのサン プル Thumb-2 以前のプ ロ セ ッ サで実行す る ARM コ ー ド と Thumb コ ー ド で、 Test-and-Branch (テ ス ト - 分岐) 操作を行 う には 2 つの ARM 命令を実装す る 必要があ り ます。 以下の よ う なマ ク ロ を定義で き ます。 $label $label MACRO TestAndBranch $dest, $reg, $cc CMP $reg, #0 B$cc $dest MEND MACRO デ ィ レ ク テ ィ ブの後の行は マ ク ロ プ ロ ト タ イ プ ス テー ト メ ン ト です。 マ ク ロ プ ロ ト タ イ プ ス テー ト メ ン ト は、 マ ク ロ の呼び出 し に使用す る 名前 (TestAndBranch) を定義 し ます。 ま た、 パ ラ メ ー タ ($label、 $dest、 $reg、 お よ び $cc) も 定義 し てい ます。 指定 さ れていないパ ラ メ ー タ は空の文字列に置 き 換え ら れます。 こ のマ ク ロ では、 構文エ ラ ーを防 ぐ ために $dest、 $reg、 お よ び $cc に値を指定す る 必要があ り ます。 アセ ン ブ ラ は、 コ ー ド 内で指定 さ れた 値でパ ラ メ ー タ を置 き 換え ます。 こ のマ ク ロ は、 以下の よ う に呼び出す こ と がで き ます。 test TestAndBranch ... ... NonZero, r0, NE NonZero 代入後には以下の よ う にな り ます。 test CMP BNE ... ... r0, #0 NonZero NonZero 2.8.2 符号な し 整数除算マ ク ロのサン プル 例 2-10 (ページ 2-52) は、 符号な し 整数を除算す る マ ク ロ を示 し てい ます。 こ のマ ク ロ は、 以下の 4 つのパ ラ メ ー タ を取 り ます。 ARM DUI 0204IJ $Bot 除数を保持す る レ ジ ス タ 。 $Top 命令の実行前に被除数を保持 し 、 命令の実行後に除余を保持す る レジス タ。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-51 ARM アセ ン ブ リ 言語の記述 $Div 除算の商が返 さ れ る レ ジ ス タ 。 除余のみが必要な場合は、 NULL ("") を指定で き ます。 $Temp 計算中に使用 さ れ る 一時レ ジ ス タ 。 例 2-10 $Lab MACRO DivMod $Div,$Top,$Bot,$Temp ASSERT $Top <> $Bot ASSERT $Top <> $Temp ASSERT $Bot <> $Temp IF "$Div" <> "" ASSERT $Div <> $Top ASSERT $Div <> $Bot ASSERT $Div <> $Temp ENDIF ; Produce an error message if the ; registers supplied are ; not all different ; These three only matter if $Div ; is not null ("") ; $Lab 90 91 MOV CMP MOVLS CMP BLS IF MOV ENDIF CMP SUBCS IF ADC ENDIF MOV CMP BHS MEND $Temp, $Bot $Temp, $Top, LSR #1 $Temp, $Temp, LSL #1 $Temp, $Top, LSR #1 %b90 "$Div" <> "" $Div, #0 ; Put divisor in $Temp ; double it until ; 2 * $Temp > $Top $Top, $Temp $Top, $Top,$Temp "$Div" <> "" $Div, $Div, $Div ; ; ; ; $Temp, $Temp, LSR #1 $Temp, $Bot %b91 ; Halve $Temp, ; and loop until ; less than divisor ; The b means search backwards ; Omit next instruction if $Div is null ; Initialize quotient Can we subtract $Temp? If we can, do so Omit next instruction if $Div is null Double $Div こ のマ ク ロ は、 複数のパ ラ メ ー タ が同一レ ジ ス タ を使用 し ていないか ど う か をチ ェ ッ ク し ます。 ま た、 除余だけが要求 さ れてい る 場合には、 生成 さ れ る コ ー ド を最適化 し ます。 アセ ン ブ ラ ソ ース で複数の DivMod を使用 し てい る 場合に ラ ベルの多重定義を 防 ぐ ために、 こ のマ ク ロ では ロ ーカル ラ ベル (90、 91) を使用 し ます。 詳細 については、 「 ロ ーカル ラ ベル」 (ページ 2-14) を参照 し て下 さ い。 2-52 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 例 2-11 は、 上記のマ ク ロ を以下の よ う に呼び出 し た と き に生成 さ れ る コ ー ド を示 し てい ます。 ratio DivMod r0,r5,r4,r2 例 2-11 ASSERT ASSERT ASSERT ASSERT ASSERT ASSERT r5 r5 r4 r0 r0 r0 <> <> <> <> <> <> r4 r2 r2 r5 r4 r2 MOV CMP MOVLS CMP BLS MOV CMP SUBCS ADC MOV CMP BHS r2, r4 r2, r5, r2, r2, r2, r5, %b90 r0, #0 r5, r2 r5, r5, r0, r0, r2, r2, r2, r4 %b91 ; ; ; ; ; ; Produce an error if the registers supplied are not all different These three only matter if $Div is not null ("") ratio 90 91 ARM DUI 0204IJ LSR #1 LSL #1 LSR #1 r2 r0 LSR #1 ; Put divisor in $Temp ; double it until ; 2 * r2 > r5 ; ; ; ; ; ; ; ; The b means search backwards Initialize quotient Can we subtract r2? If we can, do so Double r0 Halve r2, and loop until less than divisor Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-53 ARM アセ ン ブ リ 言語の記述 2.9 シ ンボルバージ ョ ンの追加 ARM リ ン カは 「Base Platform ABI for the ARM Architecture」 (BPABI) に準拠 し 、 GNU 拡張シ ン ボルバージ ョ ン管理モデルを サポー ト し ます。 既存のシ ン ボルにシ ン ボルのバージ ョ ン を追加す る には、 同 じ ア ド レ ス で バージ ョ ン シ ン ボルを定義す る 必要があ り ます。 シ ン ボルのバージ ョ ンは以 下の よ う な形式にな り ます。 • デフ ォ ル ト 以外のバージ ョ ン の場合 : name@ver • デフ ォ ル ト のバージ ョ ンの場合 : name@@ver シ ン ボルのバージ ョ ンは縦棒で囲む必要があ り ます。 例えば、 デフ ォ ル ト のバージ ョ ンは以下の よ う に定義 し ます。 |my_versioned_symbol@@ver2| my_asm_function PROC ... BX lr ENDP ; Default version デフ ォ ル ト 以外のバージ ョ ンは以下の よ う に定義 し ます。 |my_versioned_symbol@ver1| ; Non default version my_old_asm_function PROC ... BX lr ENDP RVCT のシ ン ボルバージ ョ ン管理の詳細については、 『 リ ン カユーザガ イ ド 』 の第 4 章 イ メ ージのシ ン ボルへのア ク セ ス を参照 し て下 さ い。 2-54 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 2.10 フ レームデ ィ レ ク テ ィ ブの使用 以下のいずれか を実行す る 場合、 フ レームデ ィ レ ク テ ィ ブ を使用 し て、 コ ー ド が ス タ ッ ク を使用す る 方法を記述す る 必要があ り ます。 • ス タ ッ ク 展開を使用 し て アプ リ ケーシ ョ ン をデバ ッ グす る 。 • フ ラ ッ ト プ ロ フ ァ イ リ ン グ ま たは コ ールグ ラ フ プ ロ フ ァ イ リ ン グ を使用 する。 こ れ ら のデ ィ レ ク テ ィ ブの詳細については、 「Frame デ ィ レ ク テ ィ ブ」 (ペー ジ 7-46) を参照 し て下 さ い。 アセ ン ブ ラ は、 フ レームデ ィ レ ク テ ィ ブ を使用 し て、 生成す る ELF 形式のオ ブジ ェ ク ト フ ァ イ ルに DWARF デバ ッ グ フ レーム情報を挿入 し ます。 こ の情報 は、 デバ ッ ガが ス タ ッ ク 展開 と プ ロ フ ァ イ リ ン グ を行 う と き に必要です。 ス タ ッ ク チ ェ ッ ク 修飾子の詳細については、 install_directory\Documentation\Specifications\... にあ る 『Procedure Call Standard for the ARM Architecture』 (aapcs.pdf) を参照 し て下 さ い。 以下の点に注意 し て下 さ い。 ARM DUI 0204IJ • フ レームデ ィ レ ク テ ィ ブに よ っ て、 アセ ン ブ ラ が生成 し た コ ー ド に影響 が及ぶ こ と はあ り ません。 • アセ ン ブ ラ では、 フ レームデ ィ レ ク テ ィ ブの情報を実行 さ れた命令に対 し て検証 し ません。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 2-55 ARM アセ ン ブ リ 言語の記述 2.11 アセ ン ブ リ 言語に関する変更 表 2-11 は、 UAL アセ ンブ ラ 言語 と 以前の独立 し た ARM アセ ン ブ ラ 言語お よ び Thumb アセ ン ブ ラ 言語 と の違い を示 し てい ます。 UAL 以前の ARM 構文は、 アセ ン ブ ラ で も 認識 さ れ ます。 表 2-11 以前の ARM アセ ン ブ リ 言語から の変更点 変更点 UAL 以前の ARM 構文 適切な構文 LDM お よ び STM のデフ ォ ル ト のア ド レ ッ シ ン グモー LDMIA, STMIA LDM, STM ARM と Thumb では、 フル下降ス タ ッ ク の操作に PUSH ニーモニ ッ ク と POP ニーモニ ッ ク を使用で き ま す。 STMFD sp!, {reglist} LDMFD sp!, {reglist} PUSH {reglist} POP {reglist} ARM と Thumb では、 ロ テー ト のみを伴 う (他の 操作は伴わない) 命令の LSL、 LSR、 ASR、 ROR、 お よ び RRX 命令ニーモニ ッ ク を使用で き ます。 MOV MOV MOV MOV MOV LSL LSR ASR ROR RRX プ ロ グ ラ ム カ ウ ン タ 相対ア ド レ シ ン グには、 label 形式を使用 し ます。 新 し い コ ー ド では offset 形式は 使用 し ないで下 さ い。 LDR Rd, [pc, #offset] LDR Rd, label ダブル ワ ー ド メ モ リ ア ク セ ス に両方の レ ジ ス タ を 指定 し ます。 使用で き る レ ジ ス タ の組み合わせに ついては、 規則に従 う 必要があ り ます。 LDRD Rd, addr_mode LDRD Rd, Rd2, addr_mode {cond}?????????????????????????????? ADD{cond}S LDR{cond}SB ADDS{cond} LDRSB{cond} ARM コ ー ド と Thumb-2 コ ー ド では、 ARM の条件 付 き 形式 {cond} と Thumb-2 の IT 命令の両方を使用 す る こ と がで き ます。 アセ ンブ ラ は両者の整合性 をチ ェ ッ ク し て、 現在の命令セ ッ ト に応 じ て適切 な コ ー ド を アセ ンブル し ます。 IT 命令を省略 し た 場合、 アセ ンブ ラ が Thumb-2 コ ー ド に挿入 し ます。 ADDEQ r1, r2, r3 LDRNE r1, [r2, r3] ITEQ E ; optional ADDEQ r1, r2, r3 LDRNE r1, [r2, r3] ド は IA です。 2-56 Rd, Rd, Rd, Rd, Rd, Rn, Rn, Rn, Rn, Rn, LSL LSR ASR ROR RRX shift shift shift shift Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential Rd, Rd, Rd, Rd, Rd, Rn, Rn, Rn, Rn, Rn shift shift shift shift ARM DUI 0204IJ ARM アセ ン ブ リ 言語の記述 ま た、 それ以前のアセ ンブ ラ と 比較 し て柔軟性が向上 し ま し た (表 2-12 を参 照)。 表 2-12 要件の緩和 変更点 適切な構文 使用可能な構文 デス テ ィ ネーシ ョ ン レ ジ ス タ が最初のオペ ラ ン ド と 同 じ 場合、 2 レ ジ ス タ 形式の命令を使用で き ます。 ADD r1, r1, r3 ADD r1, r3 UAL を使用 し て Thumb-2 以前の Thumb プ ロ セ ッ サ用の ソ ース コ ー ド を記述で き ます。 Thumb-2 プ ロ セ ッ サ以前のプ ロ セ ッ サ用の Thumb コ ー ド を記述 し てい る 場 合、 そのプ ロ セ ッ サで使用で き る 命令のみを使用す る よ う に注意す る 必要が あ り ます。 使用で き ない命令を使用す る と 、 アセ ン ブ ラ か ら エ ラ ー メ ッ セー ジが返 さ れます。 Thumb-2 プ ロ セ ッ サ用の Thumb コ ー ド を記述 し てい る 場合は、可能な限 り 16 ビ ッ ト 命令を使用 し て コ ー ド サ イ ズ を小 さ く す る こ と がで き ます。 表 2-13 は、 UAL 以前の Thumb アセ ンブ リ 言語 と UAL と の主な相違点を示 し てい ます。 アセ ンブ ラ は、 構文の前に CODE16 デ ィ レ ク テ ィ ブが使用 さ れてい る か、 ま たは ソ ース フ ァ イ ルが --16 コ マ ン ド ラ イ ン オプシ ョ ン でアセ ンブル さ れてい る 場合にのみ UAL 以前の Thumb 構文を認識 し ます。 表 2-13 UAL 以前の Thumb 構文 と UAL 構文の相違点 変更点 UAL 以前の Thumb 構文 UAL の構文 LDM お よ び STM のデフ ォ ル ト のア ド レ ッ シ ン グモー LDMIA, STMIA LDM, STM フ ラ グ を更新す る 命令では後置の S を使用する 必要 があ り ます。 こ れは、 32 ビ ッ ト の Thumb-2 命令 と の競合を防止す る ために必要な変更で し た。 ADD SUB MOV LSR ADDS SUBS MOVS LSRS ALU 命令では、 3 本の レ ジ ス タ を指定する のが適 切な形式です ( こ れには、 デス テ ィ ネーシ ョ ン レ ジ ス タ が最初のオペ ラ ン ド と 同 じ 場合 も 含まれま す)。 ADD r7, r8 SUB r1, #80 ド は IA です。 ARM DUI 0204IJ r1, r4, r0, r1, r2, r3 r5, #6 #1 r2, #1 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential r1, r4, r0, r1, r2, r3 r5, #6 #1 r2, #1 ADD r7, r7, r8 SUBS r1, r1, #80 2-57 ARM アセ ン ブ リ 言語の記述 表 2-13 UAL 以前の Thumb 構文 と UAL 構文の相違点 (続き) 変更点 UAL 以前の Thumb 構文 UAL の構文 Rd と Rn が ど ち ら も Lo レ ジ ス タ の場合、 MOV Rd, Rn は ADDS Rd, Rn, #0 と し て逆アセ ンブル さ れます。 MOV MOV CPY LSL ADDS r2, r3, #0 MOV r8, r9 MOV r0, r1 MOVS r2, r3 NEG Rd, Rm は RSBS Rd, Rm, #0 と し て逆アセ ンブル さ NEG Rd, Rm RSBS Rd, Rm, #0 - NOP NOP MOV r8, r8 r2, r8, r0, r2, r3 r9 r1 r3, #0 れます。 NOP 命令は、 MOV r8, r8 を置 き 換え ます (可能な場 合)。 2-58 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 第3章 アセ ン ブ ラ に関する参考情報 本章には、 ARM® アセ ン ブ ラ に関す る 一般的な参考情報が記載 さ れてい ます。 以下のセ ク シ ョ ンか ら 構成 さ れてい ます。 • 「コ マ ン ド 構文」 (ページ 3-2) • • • • • • • 「 ソ ース行の形式」 (ページ 3-23) 「定義済みの レ ジ ス タ お よ び コ プ ロ セ ッ サ名」 (ページ 3-24) 「組み込み変数お よ び定数」 (ページ 3-26) 「シ ン ボル」 (ページ 3-29) 「式、 リ テ ラ ル、 演算子」 (ページ 3-35) 「診断 メ ッ セージ」 (ページ 3-49) 「C プ リ プ ロ セ ッ サを使用す る 」 (ページ 3-51) 本章では、 ARM アセ ン ブ リ 言語の記述方法についての説明は割愛いた し ま す。 チ ュ ー ト リ アル情報については、 第 2 章 ARM アセ ンブ リ 言語の記述 を参 照 し て下 さ い。 本章では、 命令、 デ ィ レ ク テ ィ ブ、 お よ び疑似命令についての説明 も 割愛い た し ます。 こ れ ら の参照情報については、 該当す る 各章を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-1 アセ ン ブ ラ に関する参考情報 3.1 コ マ ン ド 構文 こ のセ ク シ ョ ン では、 armasm についてのみ説明 し ます。 イ ン ラ イ ン アセ ン ブ ラ と 組み込みアセ ン ブ ラ は C お よ び C++ コ ンパ イ ラ の一部であ り 、 独自の コ マ ン ド 構文は持ち ません。 armasm コ マ ン ド ラ イ ン では、 フ ァ イ ル名や指定 さ れてい る 場合を除 き 、 大文 字 と 小文字の区別があ り ます。 ARM アセ ン ブ ラ では、 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「コ マン ド ラ イ ンオプシ ョ ンの順序」 (ページ 2-12) で説明 し て あ る と お り 、 通常の コ マ ン ド ラ イ ン順序付け規則が使用 さ れます。 し たが っ て、 コ マ ン ド ラ イ ン に互いに競合す る オプシ ョ ンが含ま れてい る 場合、 最後に見 つか っ たオプシ ョ ンが常に優先 さ れ ます。 ARM アセ ンブ ラ は、 次の コ マ ン ド を使用 し て起動 し ます。 armasm {options} {inputfile} こ こ で、 options は、 以下のオプシ ョ ン を任意に組み合わせて指定 し ます。 各 オプシ ョ ンは スペース で区切っ て下 さ い。 --16 UAL 以前の Thumb 構文を使用 し て、 命令を Thumb® 命令 と し て 解釈す る よ う にアセ ン ブ ラ に指示 し ます。 こ のオプシ ョ ンは、 ソ ース フ ァ イ ルの冒頭の CODE16 デ ィ レ ク テ ィ ブに相当 し ます。 UAL 構文を使用 し て Thumb 命令ま たは Thumb-2 命令を指定す る には、--thumb オプシ ョ ン を使用 し ます。 --32 --arm と 同 じ 意味です。 --apcs qualifier ARM アーキ テ ク チ ャ のプ ロ シージ ャ コ ール標準 (AAPCS) を使 用す る か ど う か を指定 し ます。 コ ー ド セ ク シ ョ ンの属性を一部指 定す る こ と も で き ます。 詳細については、 「AAPCS」 (ページ 3-11) を参照 し て下 さ い。 3-2 --arm ARM 命令 と し て命令を解釈す る よ う にアセ ンブ ラ に指示 し ま す。 ただ し 、 オブジ ェ ク ト フ ァ イ ル中の コ ー ド が、 必ず し も ARM コ ー ド だけ と な る わけではあ り ません。 こ れがデフ ォ ル ト です。 --arm_only ARM コ ー ド だけ を生成す る よ う にアセ ン ブ ラ に指示 し ます。 得 ら れ る オブジ ェ ク ト フ ァ イ ルには、 Thumb コ ー ド は存在 し ませ ん し 、 存在す る こ と はで き ません。 --bi --bigend と 同 じ 意味です。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 --bigend ビ ッ グエ ンデ ィ ア ン ARM プ ロ セ ッ サに適 し た コ ー ド を アセ ン ブ ルす る よ う にアセ ン ブ ラ に指示 し ます。 デフ ォ ル ト は --littleend です。 --brief_diagnostics 詳細については、 「診断 メ ッ セージの出力の制御」 (ページ 3-19) を参照 し て下 さ い。 --checkreglist RLIST、 LDM、 お よ び STM レ ジ ス タ リ ス ト をチ ェ ッ ク し て、 すべて の レ ジ ス タ が昇順の レ ジ ス タ 番号順に指定 さ れてい る こ と を確 認す る よ う にアセ ン ブ ラ に指示 し ます。 レ ジ ス タ が昇順で指定 さ れていない場合は警告が表示 さ れ ます。 こ のオプシ ョ ンの使用は廃止 さ れ る 予定です。 代わ り に ----diag_warning 1206 を使用 し て下 さ い (「診断 メ ッ セージの出力 の制御」 (ページ 3-19) を参照)。 --cpreproc 入力フ ァ イ ルを前処理 し てか ら アセ ンブルす る ために armcc を呼 び出す よ う アセ ン ブ ラ に指示 し ます。 詳細については、 「C プ リ プ ロ セ ッ サを使用す る」 (ページ 3-51) を参照 し て下 さ い。 --cpreproc_opts=options C プ リ プ ロ セ ッ サ使用時にアセ ンブ ラ が コ ンパ イ ラ オプシ ョ ン を armcc に渡せ る よ う に し ます。 詳細については、 「C プ リ プ ロ セ ッ サを使用す る」 (ページ 3-51) を参照 し て下 さ い。 options はオプシ ョ ン と その値の コ ン マ区切 り リ ス ト です。 --cpu name タ ーゲ ッ ト の CPU を設定 し ます。 詳細については、 「CPU 名」 (ページ 3-13) を参照 し て下 さ い。 --debug DWARF デバ ッ グ テーブルを生成す る よ う にアセ ン ブ ラ に指示 し ます。--debug は -g と 同 じ 意味です。 デフ ォ ル ト は DWARF 3 です。 注 ロ ーカルシ ン ボルは --debug では保持 さ れ ません。 デバ ッ グのた めに ロ ーカルシ ン ボルを保持す る 場合は、--keep を指定す る 必要 があ り ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-3 アセ ン ブ ラ に関する参考情報 --depend dependfile ソ ース フ ァ イ ルの依存関係 リ ス ト を dependfile に保存す る よ う ア セ ン ブ ラ に指示 し ます。 こ れ ら のオプシ ョ ンは、 make ユーテ ィ リ テ ィ と の使用に適 し てい ます。 --depend_format=string こ れに よ り 、 UNIX の一部の make プ ロ グ ラ ム と の互換性を確保 す る ために、 出力に依存す る フ ァ イ ルの形式が UNIX 形式の フ ォ ーマ ッ ト に変更 さ れ ます。 string の値には、 以下のいずれか を指定で き ます。 unix UNIX 形式のパ ス区切 り 文字を使用 し て依存関係フ ァ イ ルを生成 し ます。 unix_escaped 動作は unix と 同 じ ですが、 スペース をバ ッ ク ス ラ ッ シ ュ でエ ス ケープ し ます。 unix_quoted 動作は unix と 同 じ ですが、 パ ス名を二重引用符で囲み ます。 --device=list --device=name オプシ ョ ン で使用可能なサポー ト さ れてい る デバ イ ス名を指定 し ます。 --device=name 特定のデバ イ ス を選択 し 、 関連す る プ ロ セ ッ サ設定を設定 し ま す。 『 コ ンパ イ ラ リ フ ァ レ ン ス ガ イ ド 』 の 「--device=name」 (ページ 2-49) を参照 し て下 さ い。 --diag_[error | remark | warning | suppress | style] 詳細については、 「診断 メ ッ セージの出力の制御」 (ページ 3-19) を参照 し て下 さ い。 --dllexport_all ソ ースデ ィ レ ク テ ィ ブに よ っ てオーバー ラ イ ド さ れない限 り 、 エ ク ス ポー ト さ れたすべてのグ ロ ーバルシ ン ボルに STV_HIDDEN で はな く ELF におけ る STV_PROTECTED 可視性を付与 し ます (「EXPORT、 GLOBAL」 (ページ 7-92) を参照)。 3-4 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 --dwarf2 --debug オプシ ョ ン と と も に使用 し て、 DWARF 2 デバ ッ グ テーブ ルを生成す る よ う にアセ ン ブ ラ に指示 し ます。 --dwarf3 --debug と と も に使用 し て、 DWARF 3 デバ ッ グ テーブルを生成す る よ う にアセ ン ブ ラ に指示 し ます。 --debug が指定 さ れてい る 場 合、 こ れがデフ ォ ル ト にな り ます。 --errors errorfile エ ラ ー メ ッ セージ を errorfile に出力す る よ う にアセ ン ブ ラ に指 示 し ます。 --exceptions 詳細については、 「例外テーブル生成を制御す る 」 (ページ 3-21) を参照 し て下 さ い。 --exceptions_unwind 詳細については、 「例外テーブル生成を制御す る 」 (ページ 3-21) を参照 し て下 さ い。 --fpmode model 浮動小数点適合性を指定 し 、 ラ イ ブ ラ リ の属性 と 浮動小数点の 最適化を設定 し ます。 詳細については、 「浮動小数点モデル」 (ページ 3-12) を参照 し て下 さ い。 --fpu name タ ーゲ ッ ト の浮動小数点ユニ ッ ト (FPU) アーキ テ ク チ ャ を選択 し ます。 詳細については、 「FPU 名」 (ページ 3-14) を参照 し て 下 さ い。 -g --debug と 同 じ 意味です。 -idir{,dir,…} ソ ース フ ァ イ ルにデ ィ レ ク ト リ を追加 し て完全修飾名を付け ま す (「GET、 INCLUDE」 (ページ 7-95) を参照)。 --keep デバ ッ ガで使用で き る よ う に、 オブジ ェ ク ト フ ァ イ ルのシ ン ボ ルテーブル内に ロ ーカル ラ ベルを保持す る よ う にアセ ン ブ ラ に 指示 し ます (「KEEP」 (ページ 7-101) を参照)。 --length 「 リ ス ト を フ ァ イ ルに出力す る」 (ページ 3-18) を参照 し て下 さ い。 --li --littleend と 同 じ 意味です。 --library_type=lib リ ン ク 時に使用す る 関連 ラ イ ブ ラ リ の選択を有効に し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-5 アセ ン ブ ラ に関する参考情報 lib は以下のいずれか を指定で き ます。 standardlib リ ン ク 時に フル ARM ラ ン タ イ ム ラ イ ブ ラ リ を選択す る よ う に指定 し ます。 こ れがデフ ォ ル ト です。 microlib リ ン ク 時に C マ イ ク ロ ラ イ ブ ラ リ (microlib) を選択す る よ う に指定 し ます。 注 こ のオプシ ョ ンは、 ラ イ ブ ラ リ を使用す る 際に、 よ り 特化 し た 最適化を必要 と す る と き に、 コ ンパ イ ラ 、 アセ ン ブ ラ 、 ま たは リ ン カで使用で き ます。 こ のオプシ ョ ン で リ ン カ を使用す る と 、 他のすべての --library_type オプシ ョ ン を オーバー ラ イ ド し ます。 詳細については、 以下を参照 し て下 さ い。 • 『 ラ イ ブ ラ リ ガ イ ド 』 の 「microlib を使用 し た アプ リ ケー シ ョ ンの作成」 (ページ 3-4) • 『コ ンパ イ ラ リ フ ァ レ ン ス ガ イ ド 』 の 「--library_type=lib」 (ページ 2-90) --licretry 特定の FLEXnet エ ラ ー コ ー ド に遭遇 し た ら す ぐ に、 ラ イ セ ン ス の確認を約 10 秒間隔で最大 10 回再試行す る よ う にアセ ン ブ ラ に 指示 し ます。 --list file こ のオプシ ョ ンは、 アセ ン ブ ラ に よ っ て生成 さ れた アセ ン ブ リ 言語の詳細な リ ス ト を file に出力す る よ う にアセ ン ブ ラ に指示 し ます。 詳細については、 「 リ ス ト を フ ァ イ ルに出力す る」 (ペー ジ 3-18) を参照 し て下 さ い。 --littleend リ ト ルエ ンデ ィ ア ン ARM プ ロ セ ッ サに適 し た コ ー ド を アセ ン ブ ルす る よ う にアセ ン ブ ラ に指示 し ます。 -m ソ ース フ ァ イ ルの依存関係 リ ス ト を stdout に書 き 込む よ う にア セ ン ブ ラ に指示 し ます。 --maxcache n 最大 ソ ース キ ャ ッ シ ュ サ イ ズ を n バ イ ト に設定 し ます。 デフ ォ ル ト は 8MB です。 armasm では、 サ イ ズが 8MB を下回 る と 警告が表 示 さ れます。 --md 3-6 ソ ース フ ァ イ ルの依存関係 リ ス ト を inputfile.d に書 き 込む よ う にアセ ン ブ ラ に指示 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 --memaccess attributes タ ーゲ ッ ト メ モ リ シ ス テ ム の メ モ リ ア ク セ ス属性を指定 し ます。 詳細については、 「 メ モ リ ア ク セ ス属性」 (ページ 3-16) を参照 し て下 さ い。 注 ----memaccess オプシ ョ ンの使用は廃止 さ れ る 予定です。 --no_code_gen パ ス 1 の後に終了す る よ う にアセ ン ブ ラ に指示 し ます。 オブジ ェ ク ト フ ァ イ ルは生成 さ れ ません。 --no_esc \n や \t な ど、 C 形式のエ ス ケープ処理 し た特殊文字を無視す る よ う にアセ ン ブ ラ に指示 し ます。 --no_exceptions 詳細については、 「例外テーブル生成を制御す る 」 (ページ 3-21) を参照 し て下 さ い。 --no_exceptions_unwind 詳細については、 「例外テーブル生成を制御す る 」 (ページ 3-21) を参照 し て下 さ い。 --no_hide_all ソ ースデ ィ レ ク テ ィ ブに よ っ てオーバー ラ イ ド さ れない限 り 、 エ ク ス ポー ト お よ び イ ン ポー ト さ れたすべてのグ ロ ーバルシ ン ボルに STV_HIDDEN ではな く ELF におけ る STV_DEFAULT 可視性を付 与 し ます (「EXPORT、 GLOBAL」 (ページ 7-92) と 「IMPORT、 EXTERN」 (ページ 7-97) を参照)。 --no_regs レ ジ ス タ 名を事前定義 し ない よ う にアセ ン ブ ラ が設定 さ れます。 定義済みの レ ジ ス タ 名の リ ス ト については、 「定義済みの レ ジ ス タ お よ び コ プ ロ セ ッ サ名」 (ページ 3-24) を参照 し て下 さ い。 こ のオプシ ョ ンは使用が制限 さ れてい ます。 代わ り に --regnames=none を使用 し て下 さ い。 --no_terse 「 リ ス ト を フ ァ イ ルに出力す る」 (ページ 3-18) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-7 アセ ン ブ ラ に関する参考情報 --no_unaligned_access オブジ ェ ク ト フ ァ イ ルにおいて、 非境界整列ア ク セ ス を使用 し ない よ う に指示す る 属性を設定す る よ う にアセ ン ブ ラ に指示 し ます。 --no_warn 警告 メ ッ セージ を オ フ に し ます。 -o filename 出力オブジ ェ ク ト フ ァ イ ルに名前を付け ます。 こ のオプシ ョ ンが 指定 さ れていない場合、 アセ ン ブ ラ は、 inputfilename.o と い う 形 式でオブジ ェ ク ト の フ ァ イ ル名を作成 し ます。 こ のオプシ ョ ン で は大文字 と 小文字が区別 さ れ ます。 --pd --predefine と 同 じ 意味です。 --predefine "directive" いずれかの SET デ ィ レ ク テ ィ ブ を事前実行す る よ う にアセ ン ブ ラ に指示 し ます。 詳細については、 「SET デ ィ レ ク テ ィ ブ を事前に 実行す る」 (ページ 3-16) を参照 し て下 さ い。 こ れは条件付 き ア セ ン ブ リ に便利です (「定義 さ れ る変数に基づ く 条件付 き アセ ン ブ リ 」 (ページ 7-44) を参照)。 --[no_]project=filename 詳細については、 「プ ロ ジ ェ ク ト テ ンプ レー ト オプシ ョ ン」 (ページ 3-19) を参照 し て下 さ い。 --[no_]reduce_paths フ ァ イ ルパ ス の冗長なパ ス名情報の除外を有効にす る か ま たは 無効に し ます。 こ のオプシ ョ ンは Windows シ ス テ ム でのみ使用で き ます。 Windows シ ス テ ム には、 フ ァ イ ルパ ス が 260 文字ま で と い う 制限 があ り ます。 絶対パ ス名が 260 文字を超え る 相対パ ス名が存在す る 場合、 --reduce_paths オプシ ョ ン を使用 し て、 デ ィ レ ク ト リ を .. の対応す る イ ン ス タ ン ス と マ ッ チア ッ プ し 、 デ ィ レ ク ト リ /.. シーケ ン ス をペアで削除す る こ と に よ り 、 絶対パ ス名の長 さ を 短縮で き ます。 注 --reduce_paths オプシ ョ ン を使用 し てパ ス の長 さ を短縮す る ので はな く 、 長い フ ァ イ ルパ スや深いネ ス ト 構造の フ ァ イ ルパ ス を 使用 し ない よ う にす る こ と をお勧め し ます。 3-8 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 詳細については、 『コ ンパ イ ラ リ フ ァ レ ン ス ガ イ ド 』 の 「--reduce_paths, --no_reduce_paths」 (ページ 2-122) を 参照 し て下 さ い。 --regnames=none レ ジ ス タ 名を事前定義 し ない よ う にアセ ン ブ ラ が設定 さ れます。 定義済みの レ ジ ス タ 名の リ ス ト については、 「定義済みの レ ジ ス タ お よ び コ プ ロ セ ッ サ名」 (ページ 3-24) を参照 し て下 さ い。 --regnames=callstd --apcs オプシ ョ ン で指定 さ れた、 使用中の AAPCS バ リ ア ン ト に 基づいて追加の レ ジ ス タ 名を定義 し ます (詳細については、 「AAPCS」 (ページ 3-11) を参照)。 --regnames=all --apcs の値に関係な く すべての AAPCS レ ジ ス タ を定義 し ます (詳細については、 「AAPCS」 (ページ 3-11) を参照)。 --reinitialize_workdir 詳細については、 「プ ロ ジ ェ ク ト テ ンプ レー ト オプシ ョ ン」 (ページ 3-19) を参照 し て下 さ い。 --show_cmdline アセ ンブ ラ が コ マ ン ド ラ イ ン を ど の よ う に処理 し たのか を表示 し ます。 コ マ ン ド は正規化 さ れて表示 さ れ ます。 ま た、 via フ ァ イ ルの内容は展開 さ れます。 --split_ldm 長い LDM お よ び STM 命令を エ ラ ーにす る よ う にアセ ン ブ ラ に指示 し ます。 詳細については、 「長い LDM と STM を分割す る」 (ペー ジ 3-17) を参照 し て下 さ い。 こ のオプシ ョ ンは使用が制限 さ れて い ます。 --thumb UAL 構文を使用 し て、 Thumb 命令 と し て命令を解釈す る よ う に アセ ン ブ ラ に指示 し ます。 こ のオプシ ョ ンは、 ソ ース フ ァ イ ルの 冒頭の THUMB デ ィ レ ク テ ィ ブに相当 し ます。 --unaligned_access オブジ ェ ク ト フ ァ イ ルにおいて、 非境界整列ア ク セ ス の使用を 指示す る 属性を設定す る よ う にアセ ンブ ラ に指示 し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-9 アセ ン ブ ラ に関する参考情報 --unsafe 異な る アーキ テ ク チ ャ の命令を エ ラ ーな し でアセ ン ブル し ます。 詳細については、 「診断 メ ッ セージの出力の制御」 (ページ 3-19) を参照 し て下 さ い。 --untyped_local_labels Thumb コ ー ド 内の ラ ベルへの参照時に Thumb ビ ッ ト を設定 し な い よ う にアセ ン ブ ラ に指示 し ます。 詳細については、 「LDR 疑似 命令」 (ページ 4-170) を参照 し て下 さ い。 --via file file を開 き 、 コ マ ン ド ラ イ ン引数を読み込む よ う にアセ ン ブ ラ に指示 し ます。 詳細については、 『 コ ンパ イ ラ リ フ ァ レ ン ス ガ イ ド 』 の付録 A via フ ァ イ ルの構文 を参照 し て下 さ い。 --width 詳細については、 「 リ ス ト を フ ァ イ ルに出力す る」 (ページ 3-18) を参照 し て下 さ い。 --workdir=directory 詳細については、 「プ ロ ジ ェ ク ト テ ンプ レー ト オプシ ョ ン」 (ページ 3-19) を参照 し て下 さ い。 3.1.1 --xref 詳細については、 「 リ ス ト を フ ァ イ ルに出力す る」 (ページ 3-18) を参照 し て下 さ い。 inputfile アセ ン ブ ラ の入力フ ァ イ ルを指定 し ます。 入力フ ァ イ ルは、 UAL アセ ン ブ リ 言語 ソ ース フ ァ イ ル、 ま たは UAL 以前の Thumb アセ ン ブ リ 言語 ソ ース フ ァ イ ルを指定す る 必要があ り ます。 利用可能なオプ シ ョ ンの リ ス ト を取得する 利用可能な アセ ン ブ ラ コ マ ン ド ラ イ ン オプシ ョ ン の リ ス ト を取得す る には、 次の コ マ ン ド を入力 し ます。 armasm --help 3.1.2 環境変数を使用 し て コ マ ン ド ラ イ ン オプ シ ョ ン を指定する コ マ ン ド ラ イ ン オプシ ョ ンは、 RVCT40_ASMOPT 環境変数の値を設定す る こ と に よ っ て指定で き ます。 こ の構文は、 コ マ ン ド ラ イ ン構文 と 同 じ です。 アセ ンブ ラ は、 RVCT40_ASMOPT の値を読み込み、 コ マ ン ド 文字列の前に挿入 し ます。 こ れ に よ り 、 RVCT40_ASMOPT で指定 さ れたオプシ ョ ンは、 コ マ ン ド ラ イ ン の引数に よ っ てオーバー ラ イ ド 可能にな り ます。 3-10 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 3.1.3 AAPCS ARM アーキ テ ク チ ャ のプ ロ シージ ャ コ ール標準 (AAPCS) を使用す る か ど う か を指定す る オプシ ョ ンがあ り ます。 --apcs qualifier AAPCS は Base Standard Application Binary Interface for the ARM Architecture (BSABI) 仕様の一部です。 AAPCS に準拠 し た コ ー ド を記述す る と 、 別々に コ ンパ イ ルお よ びアセ ン ブル し たモジ ュ ールを連動 さ せ る こ と がで き ます。 --apcs オプシ ョ ンは コ ー ド セ ク シ ョ ン の属性を一部指定す る こ と も で き ます。 詳細については、 install_directory\Documentation\Specifications\... にあ る 『ARM アーキ テ ク チ ャ 向けプ ロ シージ ャ コ ール標準』 (aapcs.pdf) を参照 し て 下 さ い。 注 アセ ン ブ ラ に よ り 生成 さ れた コ ー ド は、 AAPCS 修飾子の影響を受け ません。 AAPCS 修飾子は、 inputfile 内の コ ー ド が AAPCS の特定のバ リ ア ン ト に準拠 し てい る こ と を プ ロ グ ラ マが確認す る ためのアサー ト です。 AAPCS 修飾子に よ り 、 アセ ン ブ ラ に よ っ て生成 さ れたオブジ ェ ク ト フ ァ イ ル内で属性が設定 さ れ ます。 リ ン カは こ れ ら の属性を使用 し て フ ァ イ ルの互換性をチ ェ ッ ク し 、 適切な ラ イ ブ ラ リ バ リ ア ン ト を選択 し ます。 qualifier の値は以下の と お り です。 inputfile で AAPCS が使用 さ れない よ う に指定 し ます。 ?? AAPCS レ ジ ス タ は設定 さ れ ません。 none を使用す る 場合、 他の修飾子は使用で き ません。 /interwork inputfile の コ ー ド を ARM と Thumb の イ ン タ ー ワ ー ク に適 し た コ ー ド にアセ ンブルす る よ う に指定 し ます。 詳細につ いては、 『デベ ロ ッ パガ イ ド 』 の第 5 章 ARM と Thumb の イ ン タ ーワー ク を参照 し て下 さ い。 /nointerwork inputfile の コ ー ド を ARM と Thumb の イ ン タ ー ワ ー ク に適 し た コ ー ド にアセ ンブルす る よ う に指定 し ます。 こ れがデ フ ォ ル ト です。 ARM DUI 0204IJ /inter /interwork と 同 じ 意味です。 /nointer /nointerwork と 同 じ 意味です。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-11 アセ ン ブ ラ に関する参考情報 inputfile の内容を、 読み出 し 専用の位置非依存 と す る よ う /ropi に指定 し ます。 inputfile の内容を、 読み出 し 専用の位置非依存 と し ない よ /noropi う に指定 し ます。 こ れがデフ ォ ル ト です。 /pic /ropi と 同 じ 意味です。 /nopic /noropi と 同 じ 意味です。 /rwpi inputfile の内容を、 読み出 し - 書 き 込み可能な位置非依存 と す る よ う に指定 し ます。 inputfile の内容を、 読み出 し - 書 き 込み可能な位置非依存 /norwpi と し ない よ う に指定 し ます。 こ れがデフ ォ ル ト です。 /pid /rwpi と 同 じ 意味です。 /nopid /norwpi と 同 じ 意味です。 /fpic inputfile の内容を、 FPIC ア ド レ ス指定を必要 と す る 読み 出 し 専用の位置非依存 コ ー ド と す る よ う に指定 し ます。 注 qualifier を複数指定す る 場合、 リ ス ト 内の個々の修飾子間に スペース も コ ン マ も 挿入 さ れていない こ と を確認 し て下 さ い。 3.1.4 浮動小数点モデル ARM アセ ンブ ラ には、 浮動小数点モデルを指定す る オプシ ョ ン があ り ます。 --fpmode model タ ーゲ ッ ト の浮動小数点モデルを選択 し 、 リ ン ク 時に最適な ラ イ ブ ラ リ を選択す る よ う に属性を設定 し ます。 注 こ のオプシ ョ ン に よ っ て、 記述 し た コ ー ド を変更す る 必要はあ り ません。 3-12 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 model 以下のいずれか を指定で き ます。 ieee_full IEEE 標準で保証 さ れてい る すべての機能、 演算、 お よ び表現を、 単精度お よ び倍精度で使用で き ます。 演算モー ド は、 実行時に動 的に選択で き ます。 ieee_fixed 最近接値への丸め、 不正確な例外な し の IEEE 標準。 ieee_no_fenv 最 も 近い値に丸め、 例外を発生 さ せない IEEE 標準。 こ のモー ド は、 Java 浮動小数点算術モデル と 互換性があ り ます。 0 に フ ラ ッ シ ュ さ れ る 非正規化数があ り 、 最 も 近い値に丸め、 例 外の発生を報告 し ない IEEE 有限値。 こ のモー ド は C お よ び C++ と 互換性があ り ます。 こ れはデフ ォ ル ト オプシ ョ ン です。 std 有限値は、 IEEE 標準に よ っ て予測 さ れ ます。 NaN (非数) お よ び無限値は、 IEEE モデルに よ っ て定義 さ れてい る 一部の状況で 生成 さ れない場合があ り ます。 ま た、 生成 さ れた と し て も 、 記 号が同 じ にな る と は限 り ません。 さ ら に、 ゼ ロ の記号が、 IEEE モデルに よ っ て予測 さ れた記号でない場合 も あ り ます。 あ る 数値が最適化を変え る 。 こ の場合、 高速実行の代わ り に精 度が犠牲にな り ます。 こ のモー ド は IEEE 互換で も 、 標準 C 形式 で も あ り ません。 fast 3.1.5 CPU 名 CPU 名を指定す る オプシ ョ ン があ り ます。 --cpuname タ ーゲ ッ ト の CPU を設定 し ます。 命令に よ っ ては、 間違っ た タ ーゲ ッ ト CPU にアセ ン ブル さ れ る と 、 エ ラ ーま たは警告が表 示 さ れ る 場合があ り ます (「診断 メ ッ セージの出力の制御」 (ページ 3-19) も 参照)。 name に指定で き る 有効値は、 4T、 5TE、 6T2 な ど のアーキ テ ク チ ャ の名前か、 ARM7TDMI な ど の部品番号です。 アーキ テ ク チ ャ の詳細 については、 『ARM アーキ テ ク チ ャ リ フ ァ レ ン ス マニ ュ アル』 を 参照 し て下 さ い。 デフ ォ ル ト は ARM7TDMI® です。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-13 アセ ン ブ ラ に関する参考情報 注 --cpu=7 を使用す る と 、 ARMv7-A、 ARMv7-R、 お よ び ARMv7-M の各アーキ テ ク チ ャ に よ っ てサポー ト さ れ る コ ー ド が生成 さ れ ます。 つま り 、 アセ ン ブ ラ は ARMv7-A、 ARMv7-R、 お よ び ARMv7-M の各アーキ テ ク チ ャ で使用で き る Thumb 命令だけ を 生成す る よ う 制限 さ れてい る こ と にな り ます。 リ ン ク 時の ソ フ ト ウ ェ ア ラ イ ブ ラ リ の選択に対す る 影響については、 『 リ ン カ ユーザガ イ ド 』 を参照 し て下 さ い。 有効な CPU 名の リ ス ト を取得する 次の コ マ ン ド を使用 し て アセ ン ブ ラ を起動す る と 、 有効な CPU 名お よ びアー キ テ ク チ ャ 名の リ ス ト を取得で き ます。 armasm --cpu list 3.1.6 FPU 名 ARM アセ ンブ ラ には、 FPU 名を指定す る ためのオプシ ョ ンがあ り ます。 --fpu name タ ーゲ ッ ト の 浮動小数点ユニ ッ ト (FPU) アーキ テ ク チ ャ を選択 し ます。 こ のオプシ ョ ン を指定す る と 、--cpu オプシ ョ ン に よ っ て 設定 さ れた任意の暗示的 FPU がオーバ ラ イ ド さ れ ます。 明示的に 指定 し た FPU に CPU と の互換性がない場合、 エ ラ ーが生成 さ れ ます。 浮動小数点命令が間違っ た タ ーゲ ッ ト FPU にアセ ン ブル さ れた と き に も 、 エ ラ ーま たは警告が表示 さ れ る 場合があ り ます。 アセ ン ブ ラ に よ っ て、 オブジ ェ ク ト フ ァ イ ル内の name に対応す る ビル ド 属性が設定 さ れます。 オブジ ェ ク ト フ ァ イ ル間の互換性 と 、 選択 さ れ る ラ イ ブ ラ リ は リ ン カに よ っ て決定 さ れ ます。 name の有効値は以下の と お り です。 3-14 none 浮動小数点アーキ テ ク チ ャ を選択 し ません。 こ れに よ り 、 アセ ンブル さ れたオブジ ェ ク ト フ ァ イ ル と 任意の FPU で ビル ド さ れたオブジ ェ ク ト フ ァ イ ル と の互換性を確保で き ます。 vfpv3 アーキ テ ク チ ャ VFPv3 に適合す る 、 ハー ド ウ ェ アのベ ク タ 浮動小数点ユニ ッ ト を選択 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 vfpv3_fp16 半精度浮動小数点拡張を備え た アーキ テ ク チ ャ VFPv3 に 適合す る 、 ハー ド ウ ェ アのベ ク タ 浮動小数点ユニ ッ ト を選 択 し ます。 vfpv3_d16 アーキ テ ク チ ャ VFPv3-D16 に適合す る 、 ハー ド ウ ェ アの ベ ク タ 浮動小数点ユニ ッ ト を選択 し ます。 vfpv3_d16_fp16 半精度浮動小数点拡張を備え た アーキ テ ク チ ャ VFPv3-D16 に適合す る 、 ハー ド ウ ェ アのベ ク タ 浮動小数点ユニ ッ ト を 選択 し ます。 vfpv2 アーキ テ ク チ ャ VFPv2 に適合す る 、 ハー ド ウ ェ アのベ ク タ 浮動小数点ユニ ッ ト を選択 し ます。 softvfp ソ フ ト ウ ェ ア浮動小数点 リ ン ケージ を選択 し ます。 --fpu オ プシ ョ ン を指定せず、 選択 さ れた --cpu オプシ ョ ン で特定 の FPU を示唆 し ていない場合は、 こ れがデフ ォ ル ト にな り ます。 softvfp+vfpv2 VFP 命令を使用す る ソ フ ト ウ ェ ア浮動小数点 リ ン ケージが あ る 浮動小数点 ラ イ ブ ラ リ を選択 し ます。 それ以外の点は、--fpu vfpv2 を使用す る 場合 と 同等です。 softvfp+vfpv3 VFP 命令を使用す る ソ フ ト ウ ェ ア浮動小数点 リ ン ケージが あ る 浮動小数点 ラ イ ブ ラ リ を選択 し ます。 それ以外の点は、--fpu vfpv3 を使用す る 場合 と 同等です。 softvfp+vfpv3_fp16 VFP 命令を使用す る ソ フ ト ウ ェ ア浮動小数点 リ ン ケージが あ る 浮動小数点 ラ イ ブ ラ リ を選択 し ます。 それ以外の点は、--fpu vfpv3_fp16 を使用す る 場合 と 同等で す。 softvfp+vfpv3_d16 VFP 命令を使用す る ソ フ ト ウ ェ ア浮動小数点 リ ン ケージが あ る 浮動小数点 ラ イ ブ ラ リ を選択 し ます。 それ以外の点は、--fpu vfpv3_d16 を使用す る 場合 と 同等で す。 softvfp+vfpv3_d16_fp16 VFP 命令を使用す る ソ フ ト ウ ェ ア浮動小数点 リ ン ケージが あ る 浮動小数点 ラ イ ブ ラ リ を選択 し ます。 それ以外の点は、--fpu vfpv3_d16_fp16 を使用す る 場合 と 同 等です。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-15 アセ ン ブ ラ に関する参考情報 リ ン ク 時の ソ フ ト ウ ェ ア ラ イ ブ ラ リ の選択に対す る こ れ ら の値の影響につい ては、 『 リ ン カユーザガ イ ド 』 を参照 し て下 さ い。 有効な FPU 名の リ ス ト を取得する 次の コ マ ン ド を使用 し て アセ ン ブ ラ を起動す る と 、 有効な FPU 名の リ ス ト を 取得で き ます。 armasm --fpu list 3.1.7 メ モ リ ア ク セス属性 タ ーゲ ッ ト メ モ リ シ ス テ ムの メ モ リ ア ク セ ス属性を指定す る には、 次の コ マ ン ド を使用 し ます。 --memaccess attributes デフ ォ ル ト は、 バ イ ト 、 ハーフ ワ ー ド 、 ワ ー ド の境界整列 ロ ー ド お よ びス ト アの有効化です。 デフ ォ ル ト を変更す る には、 attributes を指定 し ます。 以下 のいずれかの値を設定で き ます。 +L41 非境界整列 LDR を有効に し ます。 -L22 ハーフ ワー ド ロ ー ド を有効に し ません。 -S22 ハーフ ワー ド ス ト ア を有効に し ません。 -L22-S22 ハーフ ワー ド ロ ー ド お よ びス ト ア を有効に し ません。 注 ----memaccess オプシ ョ ンは使用が制限 さ れてい ます。 3.1.8 SET デ ィ レ ク テ ィ ブ を事前に実行する 次のオプシ ョ ン を使用す る と 、 いずれかの SET デ ィ レ ク テ ィ ブ を事前実行す る よ う にアセ ン ブ ラ に指示で き ます。 --predefine "directive" directive は二重引用符で囲む必要があ り ます。 詳細については、 「SETA、 SETL、 SETS」 (ページ 7-8) を参照 し て下 さ い。 ま た、 アセ ン ブ ラ は、 変数の 値を設定す る 前に、 対応す る GBLL、 GBLS、 ま たは GBLA デ ィ レ ク テ ィ ブ を実行 し て変数を定義 し ます。 変数名では、 大文字 と 小文字が区別 さ れます。 3-16 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 注 使用 し てい る シ ス テ ムの コ マ ン ド ラ イ ン イ ン タ フ ェ ース に よ っ ては、 \” な ど、 特殊文字を組み合わせた も のを入力 し て、 directive に文字列を含め る 必要が あ り ます。 あ る いは、--via file を使用 し て --predefine 引数を含め る こ と も で き ます。 コ マ ン ド ラ イ ン イ ン タ フ ェ ース では --via フ ァ イ ルか ら の引数を変更 す る こ と はで き ません。 3.1.9 長い LDM と STM を分割する 多数の レ ジ ス タ が含ま れてい る LDM お よ び STM 命令を エ ラ ーにす る よ う にアセ ン ブ ラ に指示す る には、 次のオプシ ョ ン を使用 し ます。 --split_ldm こ のオプシ ョ ン を指定す る と 、 転送 さ れた レ ジ ス タ の最大数が次の数を超え た場合、 LDM お よ び STM 命令はエ ラ ーにな り ます。 • 5 つ (すべての STM 命令の場合 と PC を ロ ー ド し ない LDM 命令の場合) • 4 つ (PC を ロ ー ド す る LDM 命令の場合) 多数レ ジ ス タ の転送を回避す る と 、 次の よ う な ARM シ ス テ ムに対す る 割 り 込み遅延を減 ら す こ と がで き ます。 • キ ャ ッ シ ュ や書 き 込みバ ッ フ ァ のない ARM シ ス テ ム (キ ャ ッ シ ュ レ ス ARM7TDMI な ど) • ゼ ロ ウ ェ イ ト 状態モー ド 、 32 ビ ッ ト メ モ リ を使用す る ARM シ ス テ ム ま た、 多数レ ジ ス タ の転送を回避す る と 、 次の影響があ り ます。 ARM DUI 0204IJ • コ ー ド サ イ ズが増え ます。 • キ ャ ッ シ ュ 付 き シ ス テ ムや、 書 き 込みバ ッ フ ァ 付 き プ ロ セ ッ サには大 き な メ リ ッ ト はあ り ません。 • ゼ ロ ウ ェ イ ト 状態 メ モ リ を使用 し ていないシ ス テ ムや、 低速なペ リ フ ェ ラ ルデバ イ ス のあ る シ ス テ ムについて メ リ ッ ト はあ り ません。 こ の よ う なシ ス テ ムの割 り 込みレ イ テ ン シは、 最 も 速度の遅い メ モ リ ま たはペ リ フ ェ ラ ルデバ イ スへのア ク セ ス に必要なサ イ ク ル数に よ っ て決ま り ま す。 こ の割 り 込みレ イ テ ン シは通常、 複数レ ジ ス タ の転送に よ っ て誘発 さ れ る レ イ テ ン シ よ り も 大 き く な り ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-17 アセ ン ブ ラ に関する参考情報 3.1.10 リ ス ト を フ ァ イルに出力する リ ス ト を フ ァ イ ルに出力す る には、 次のオプシ ョ ン を使用 し ます。 --list file こ のオプシ ョ ンは、 アセ ンブ ラ に よ っ て生成 さ れた アセ ン ブ リ 言語の詳細な リ ス ト を file に出力す る よ う にアセ ン ブ ラ に指示 し ます。 file と し て - を指定す る と 、 リ ス ト が stdout に送 ら れます。 file が指定 さ れていない場合は、--list= を使用 し て、 出力を inputfile.lst に 送信 し ます。 注 フ ァ イ ル名な し で --list を使用す る と 、出力を inputfile.lst に送信で き ます。 ただ し 、 こ の構文は現在使用が制限 さ れてい る ため、 こ の構文を使用す る と アセ ン ブ ラ に よ っ て警告 メ ッ セージが表示 さ れ ます。 こ の構文は今後の リ リ ース で廃止 さ れ る 予定です。 代わ り に、--list= を使用 し て下 さ い。 --list の動作を制御す る には、 次の コ マ ン ド ラ イ ン オプシ ョ ン を使用 し ます。 --no_terse terse フ ラ グ を オ フ に し ます。 こ のオプシ ョ ン を オ ン にす る と 、 条件アセ ン ブ リ に よ り ス キ ッ プ さ れた行は リ ス ト には表示 さ れ ません。 terse オプシ ョ ン を オ フ にす る と 、 こ れ ら の行が リ ス ト に表示 さ れ ます。 デフ ォ ル ト はオ ン です。 3-18 --width リ ス ト す る ページの幅を設定 し ます。 デフ ォ ル ト は 79 文字です。 --length リ ス ト す る ページの長 さ を設定 し ます。 ゼ ロ を指定 し た場合、 ページ番号な し で リ ス ト さ れます。 デフ ォ ル ト は 66 行です。 --xref マ ク ロ の内部 と 外部でシ ン ボルが定義 さ れてい る 場所 と 使用 さ れてい る 場所な ど の相互参照情報を リ ス ト す る よ う にアセ ンブ ラ が設定 さ れ ます。 デフ ォ ル ト はオ フ です。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 3.1.11 プ ロ ジ ェ ク ト テ ン プ レ ー ト オプ シ ョ ン プ ロ ジ ェ ク ト テ ンプ レー ト は、 特定の設定の コ マ ン ド ラ イ ン オプシ ョ ン な ど のプ ロ ジ ェ ク ト 情報が含まれてい る フ ァ イ ルです。 こ れ ら の フ ァ イ ルは、 プ ロ ジ ェ ク ト テ ン プ レー ト の作業デ ィ レ ク ト リ に保存 さ れてい ます。 以下のオ プシ ョ ンは、 プ ロ ジ ェ ク ト テ ンプ レー ト の使用を制御 し ます。 --[no_]project=filename プ ロ ジ ェ ク ト テ ン プ レー ト フ ァ イ ルの使用を許可す る か ど う か を指定で き ます。 --reinitialize_workdir プ ロ ジ ェ ク ト テ ン プ レー ト の作業デ ィ レ ク ト リ を再初期化す る か ど う か を指定で き ます。 --workdir=directory プ ロ ジ ェ ク ト テ ン プ レー ト の作業デ ィ レ ク ト リ を指定で き ます。 以下の各オプシ ョ ン の詳細については、 『コ ンパ イ ラ リ フ ァ レ ン ス ガ イ ド 』 を 参照 し て下 さ い。 • 「--project=filename, --no_project=filename」 (ページ 2-120) • • 3.1.12 「--reinitialize_workdir」 (ページ 2-123) 「--workdir=directory」 (ページ 2-153) 診断 メ ッ セージの出力の制御 診断 メ ッ セージの出力を制御す る ためのオプシ ョ ンがい く つかあ り ます。 --brief_diagnostics 簡単な診断出力形式を使用す る モー ド を有効ま たは無効に し ま す。 有効にす る と 、 元の ソ ース行は表示 さ れず、 1 行に収ま ら な いエ ラ ー メ ッ セージは折 り 返 さ れ ません。 デフ ォ ル ト は --no_brief_diagnostics です。 --diag_style {arm|ide|gnu} 診断 メ ッ セージ を表示す る ための形式を指定 し ます。 ARM DUI 0204IJ arm ARM アセ ン ブ ラ の形式を使用 し て メ ッ セージ を表示 し ます。 --diag_style が指定 さ れていない場合は、 こ れが デフ ォ ル ト にな り ます。 ide エ ラ ーのあ る 行の行番号 と 文字数を表示 し ます。 こ れ ら の値は括弧に囲まれて表示 さ れます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-19 アセ ン ブ ラ に関する参考情報 gnu GNU 形式で メ ッ セージ を表示 し ます。 オプシ ョ ン --diag_style=ide を選択す る と 、 オプシ ョ ン --brief_diagnostics が暗黙的に選択 さ れ ます。 コ マ ン ド ラ イ ン で --no_brief_diagnostics を明確に選択す る と 、 --diag_style=ide に よ っ て暗示 さ れ る --brief_diagnostics の選択は無効にな り ます。 オプシ ョ ン --diag_style=arm ま たはオプシ ョ ン --diag_style=gnu の いずれか を選択 し て も 、 --brief_diagnostics を選択 し た こ と には な り ません。 --diag_error tag{,tag,…} 指定 さ れた タ グ を持つ診断 メ ッ セージにエ ラ ーの重大度を設定 し ます (表 3-1 (ページ 3-21) を参照)。 --diag_remark tag{,tag,…} 指定 さ れた タ グ を持つ診断 メ ッ セージに注釈の重大度を設定 し ます (表 3-1 (ページ 3-21) を参照)。 --diag_warning tag{,tag,…} 指定 さ れた タ グ を持つ診断 メ ッ セージに警告の重大度を設定 し ます (表 3-1 (ページ 3-21) を参照)。 --diag_suppress tag{,tag,…} 指定 さ れた タ グ を持つすべての診断 メ ッ セージ を無効に し ます。 --unsafe さ ま ざ ま な アーキ テ ク チ ャ か ら の命令を エ ラ ーな し でアセ ンブ ル し ます。 対応す る エ ラ ー メ ッ セージは警告 メ ッ セージに変更 さ れます。 演算子の優先順位に関す る 警告 も 非表示に さ れます (「2 項演算子」 (ページ 3-43) を参照)。 以上の --diag_ オプシ ョ ンの う ち、 4 つに、 非表示にす る メ ッ セージの番号を 表す tag を指定す る 必要があ り ます。 こ の場合、 複数の タ グ を指定で き ます。 例えば、 番号 1293 と 187 の警告 メ ッ セージ を非表示にす る には、 以下の コ マ ン ド を使用 し ます。 armasm --diag_suppress 1293,187 ... --diag_error、--diag_remark、 お よ び --diag_warning を指定 し た り 、 メ ッ セージ を非表示に し た り す る 場合は、 次の よ う に し て アセ ンブ ラ 接頭文字 A を使用 で き ます。 armasm --diag_suppress A1293,A187 ... 3-20 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 診断 メ ッ セージは切 り 取 り 、 コ マ ン ド ラ イ ンに直接貼 り 付け る こ と がで き ま す。 接頭文字の使用は省略で き ます。 ただ し 、 接頭文字を含め る 場合は、 armasm 識別文字 と 一致す る 必要があ り ます。 別の接頭文字が見つか る と 、 アセ ン ブ ラ はその メ ッ セージ番号を無視 し ます。 表 3-1 で、 オプシ ョ ン の説明で使用 さ れ る 重大度 と い う 用語のそれぞれの意 味を説明 し ます。 表 3-1 診断 メ ッ セージの重大度 3.1.13 重大度 説明 致命的エ ラ ー アセ ンブ リ を停止 し なければな ら ない よ う な問題を示 し ます。 こ れ ら のエ ラ ーには、 コ マ ン ド ラ イ ンエ ラ ー、 内部エ ラ ー、 イ ン ク ルー ド フ ァ イ ルの欠落な ど があ り ます。 エラー アセ ンブ リ 言語の構文ルールま たはセマ ン テ ィ ッ ク ルールの違 反を示 し ます。 アセ ンブ リ は引 き 続 き 実行 さ れますが、 オブ ジ ェ ク ト コ ー ド は生成 さ れません。 警告 コ ー ド に問題を引き 起 こ す可能性のあ る 例外的な状況を示す警 告です。 重大度のエ ラ ーが検出 さ れない限 り 、 アセ ンブ ラ は引 き 続 き 実行 さ れ、 オブジ ェ ク ト コ ー ド が生成 さ れます。 注釈 一般的であ る が、 推奨 さ れないアセ ンブ リ 言語の慣用を示 し ま す。 こ れ ら の診断情報はデフ ォ ル ト では表示 さ れません。 重大度 のエ ラ ーが検出 さ れない限 り 、 アセ ンブ ラ は引き 続き 実行 さ れ、 オブジ ェ ク ト コ ー ド が生成 さ れます。 例外テーブル生成を制御する 例外テーブル生成を制御す る オプシ ョ ン には以下の 4 つがあ り ます。 --exceptions 遭遇 し たすべての関数について、 例外テーブル生成を オ ンにす る よ う にアセ ン ブ ラ に指示 し ます。 --no_exceptions 例外テーブル生成を オ フ にす る よ う にアセ ンブ ラ に指示 し ます。 テーブルは生成 さ れません。 こ れがデフ ォ ル ト です。 --exceptions_unwind 可能な場合は、 関数について unwind テーブルを生成す る よ う に アセ ン ブ ラ に指示 し ます。 こ れがデフ ォ ル ト です。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-21 アセ ン ブ ラ に関する参考情報 --no_exceptions_unwind すべての関数について nounwind テーブルを生成す る よ う にアセ ン ブ ラ に指示 し ます。 さ ら に細か く 制御す る には、 FRAME UNWIND ON お よ び FRAME UNWIND OFF デ ィ レ ク テ ィ ブ を使用 し ます。 詳細については、 「FRAME UNWIND ON」 (ページ 7-61) と 「FRAME UNWIND OFF」 (ページ 7-61) を参照 し て下 さ い。 Unwind テーブル 関数は、 PROC/ENDP ま たは FUNC/ENDFUNC デ ィ レ ク テ ィ ブで囲ま れた コ ー ド です。 例外は、 unwind テーブルを持つ関数内を伝播で き ます。 アセ ンブ ラ は、 デ バ ッ グ フ レーム情報か ら ア ン ワ イ ン ド 情報を生成 し ます。 例外は、 nounwind テーブルを持つ関数内を伝播で き ません。 例外処理時に nounwind テーブルに遭遇 し た場合、 例外処理 ラ イ ン タ イ ム環境に よ っ てプ ロ グ ラ ム が終了 し ます。 アセ ン ブ ラ では、 すべての関数お よ び非関数について nounwind テーブルエ ン ト リ を生成で き ます。 関数内部で ス タ ッ ク の使用を記述す る 十分な FRAME デ ィ レ ク テ ィ ブが関数に含まれてい る 場合にのみ、 その関数の unwind テーブルを アセ ン ブ ラ で生成で き ます。 関数は、 「Exception Handling ABI for the ARM Architecture」 (EHABI)、 セ ク シ ョ ン 9.1 「Constraints on Use」 で規定 さ れてい る 条件に準拠す る 必要があ り ます。 アセ ンブ ラ が unwind テーブルを生成で き ない場合、 nounwind テーブルを生成 し ます。 3-22 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 3.2 ソ ース行の形式 以下は、 ARM アセ ン ブ リ 言語モジ ュ ールで記述す る ソ ース行の汎用形式で す。 {symbol} {instruction|directive|pseudo-instruction} {;comment} こ の ソ ース行の 3 つのセ ク シ ョ ンはすべてオプシ ョ ン です。 冒頭か ら い き な り 命令を開始す る こ と はで き ません。 命令の前にシ ン ボルが ない場合で も 、 命令の先頭に空白を空け る 必要があ り ます。 命令、 疑似命令、 デ ィ レ ク テ ィ ブは、 本書に記載 し てい る よ う にすべて大文 字で記述 し た り 、 すべて小文字で記述 し た り で き ます。 大文字 と 小文字を混在 さ せて命令、 疑似命令、 ま たはデ ィ レ ク テ ィ ブ を記述す る こ と はで き ません。 コ ー ド を読みやす く す る ために空白行を使用す る こ と も で き ます。 symbol には通常、 ラ ベルを指定 し ます (「 ラ ベル」 (ページ 3-32) お よ び 「 ロ ーカル ラ ベル」 (ページ 3-33) を参照)。 命令お よ び疑似命令内では こ れが 必ず ラ ベルです。 一部のデ ィ レ ク テ ィ ブでは、 こ れが変数ま たは定数のシ ン ボルです。 詳細については、 デ ィ レ ク テ ィ ブの説明を参照 し て下 さ い。 symbol は必ず最初の列か ら 開始す る 必要があ り ます。 スペースや タ ブな ど の 空白文字を含め る こ と はで き ません (「シ ン ボルの命名ルール」 (ページ 3-29) を参照)。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-23 アセ ン ブ ラ に関する参考情報 3.3 定義済みのレ ジ ス タ および コ プ ロ セ ッ サ名 すべての レ ジ ス タ お よ び コ プ ロ セ ッ サ名では、 大文字 と 小文字が区別 さ れま す。 3.3.1 事前宣言 さ れてい る レ ジ ス タ 名 以下の レ ジ ス タ 名は事前宣言 さ れてい ます。 • r0-r15 お よ び R0-R15 3.3.2 • a1-a4 (引数、 結果、 ス ク ラ ッ チ レ ジ ス タ 、 r0 ~ r3 の同義語) • v1-v8 (変数レ ジ ス タ 、 r4 ~ r11) • sb お よ び SB (ス タ テ ィ ッ ク ベース、 r9) • ip お よ び IP (内部プ ロ シージ ャ コ ール ス ク ラ ッ チ レ ジ ス タ 、 r12) • sp お よ び SP (ス タ ッ ク ポ イ ン タ 、 r13) • lr お よ び LR ( リ ン ク レ ジ ス タ 、 r14) • pc お よ び PC (プ ロ グ ラ ム カ ウ ン タ 、 r15) 事前宣言 さ れてい る拡張レ ジ ス タ 名 以下の拡張レ ジ ス タ 名は事前宣言 さ れてい ます。 • q0-q15 お よ び Q0-Q15 (NEON™ ク ワ ッ ド ワー ド レ ジ ス タ ) • d0-d31 お よ び D0-D31 (NEON ダ ウ ン ロ ー ド レ ジ ス タ 、 VFP ダブルプ レ シ • s0-s31 お よ び S0-S31 (VFP 単精度レ ジ ス タ )。 ジ ョ ン レジ ス タ) 3-24 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 3.3.3 事前宣言 さ れている XScale レ ジ ス タ 名 以下の レ ジ ス タ 名は、 Intel XScale CPU 向けにアセ ン ブルす る 際に事前宣言 さ れてい ます。 acc0-acc7 お よ び ACC0-ACC7 (XScale ア キ ュ ム レー タ )。 • 以下の レ ジ ス タ 名、 ワ イ ヤ レ ス MMX 付 き Intel XScale CPU 向けにアセ ン ブル す る 際に事前宣言 さ れてい ます。 wR0-wR15、 wr0-wr15、 お よ び WR0-WR15 • 3.3.4 • wC0-wC15、 wc0-wc15、 お よ び WC0-WC15 • wCID、 wcid、 お よ び WCID • wCon、 wcon、 お よ び WCON • wCSSF、 wcssf、 お よ び WCSSF • wCASF、 wcasf、 お よ び WCASF。 事前宣言 さ れている コ プ ロ セ ッ サ名 以下の コ プ ロ セ ッ サ名お よ び コ プ ロ セ ッ サ レ ジ ス タ 名は事前宣言 さ れてい ま す。 • p0-p15 ( コ プ ロ セ ッ サ 0 ~ 15) • ARM DUI 0204IJ c0-c15 ( コ プ ロ セ ッ サ レ ジ ス タ 0 ~ 15) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-25 アセ ン ブ ラ に関する参考情報 3.4 組み込み変数および定数 表 3-2 に、 ARM アセ ン ブ ラ に よ っ て定義 さ れてい る 組み込み変数を記載 し ま す。 表 3-2 組み込み変数 {ARCHITECTURE} 選択 さ れた ARM アーキ テ ク チ ャ の名前を保持 し ます。 {AREANAME} 現在の AREA の名前を保持 し ます。 {ARMASM_VERSION} armasm のバージ ョ ン ご と に増加す る 整数を保持 し ます。 |ads$version| {ARMASM_VERSION} と 同 じ 値を保持 し ます。 {CODESIZE} {CONFIG} と 同 じ 意味です。 {COMMANDLINE} コ マ ン ド ラ イ ンの内容を保持 し ます。 {CONFIG} アセ ンブ ラ が ARM コー ド を アセ ンブル し てい る場合は、 値 32 を保持 し 、 Thumb コ ー ド を アセ ンブル し てい る 場合は値 16 を保持 し ます。 {CPU} 選択 さ れてい る cpu の名前を保持 し ます。 デフ ォ ル ト は “ARM7TDMI” です。 アーキ テ ク チ ャ が コ マ ン ド ラ イ ンの --cpu オプシ ョ ンで指定 さ れてい る 場合、 {CPU} は、 値 "Generic ARM" を保持 し ます。 {ENDIAN} アセ ンブ ラ がビ ッ グエンデ ィ ア ンモー ド の場合は値 “big” を保持 し 、 リ ト ルエンデ ィ ア ン モー ド の場合は “little” を保持 し ます。 {FPIC} /fpic が設定 さ れてい る 場合はブール値 True を保持 し ます。 デフ ォ ル ト は False です。 {FPU} 選択 さ れてい る fpu の名前を保持 し ます。 デフ ォ ル ト は “SoftVFP” です。 {INPUTFILE} 現在の ソ ース フ ァ イ ルの名前を保持 し ます。 {INTER} /inter が設定 さ れてい る 場合はブール値 True を保持 し ます。 デフ ォ ル ト は False です。 {LINENUM} 現在の ソ ース フ ァ イ ル内の行番号を示す整数を保持 し ます。 {OPT} 現在設定 さ れてい る リ ス ト オプシ ョ ンの値。 OPT デ ィ レ ク テ ィ ブを使用する と 、 現在の リ ス ト オプシ ョ ン を保存 し た り 、 リ ス ト オプシ ョ ン を変更 し た り 、 元の値を復元 し た り で き ます。 {PC} ま たは . 現在の命令のア ド レ ス。 {PCSTOREOFFSET} STR pc,[...] 命令ま たは STM Rb,{..., pc} 命令のア ド レ ス と 、 ス ト ア さ れた pc 値の間のオ フ セ ッ ト です。 " こ の変数に保持 さ れ る 値は、 指定 さ れた CPU ま たはアーキ テ ク チ ャ に よ っ て変わ り ます。 3-26 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 表 3-2 組み込み変数 (続き) {ROPI} /ropi が設定 さ れてい る 場合はブール値 True を保持 し ます。 デフ ォ ル ト は False です。 {RWPI} /rwpi が設定 さ れてい る 場合はブール値 True を保持 し ます。 デフ ォ ル ト は False です。 {VAR} ま たは @ ス ト レージ領域の位置カ ウ ン タ の現在の値。 SETA、 SETL、 ま たは SETS デ ィ レ ク テ ィ ブ を使用 し て組み込み変数を設定す る こ と はで き ません。 組み込み変数は、 次の よ う に数式や条件式で使用で き ます。 IF {ARCHITECTURE} = "4T" 組み込み変数 |ads$version| はすべて小文字にす る 必要があ り ます。 その他の 組み込み変数の名前には大文字のみ、 小文字のみ、 ま たは大文字 と 小文字を 使用で き ます。 例 : IF {CpU} = "Generic ARM" 注 組み込み変数が文字列の場合にはいずれ も 、 大文字 と 小文字を区別 し た値が 格納 さ れ ます。 {CPU} と {ARCHITECTURE} の有効値については、 「CPU 名」 (ペー ジ 3-13) を参照 し て下 さ い。 {FPU} の有効値については、 「FPU 名」 (ページ 3-14) を参照 し て下 さ い。 こ れ ら の組み込み変数に関す る 関係演算は、 大文字 小文字の区別が間違っ てい る 文字列には一致 し ません。 表 3-3 に、 ARM アセ ン ブ ラ で定義 さ れてい る 組み込みブール定数を記載 し ま す。 表 3-3 組み込みブール定数 ARM DUI 0204IJ {FALSE} 論理定数 False {TRUE} 論理定数 True Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-27 アセ ン ブ ラ に関する参考情報 3.4.1 armasm のバージ ョ ンの検出 組み込み変数 {ARMASM_VERSION} を使用す る と 、 armasm のバージ ョ ン を区別で き ます。 バージ ョ ン番号の形式は PVtbbb です。 各項目には以下の意味があ り ま す。 P メ ジ ャ ーバージ ョ ン を示 し ます。 V マ イ ナーバージ ョ ン を示 し ます。 t パ ッ チ リ リ ース を示 し ます。 bbb ビル ド 番号を示 し ます。 ADS と RVCT 以前は、 ARM アセ ン ブ ラ には、 組み込み変数 |ads$version| が 用意 さ れてい ませんで し た。 古い開発ツールを使用 し て コ ー ド のバージ ョ ン を設定す る 場合は、 組み込み変数 |ads$version| を使用 し て テ ス ト を実施で き ます。 次の コ ー ド を使用 し ます。 IF :DEF: |ads$version| ; code for RealView or ADS ELSE ; code for SDT ENDIF 3-28 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 3.5 シ ンボル シ ン ボルを使用 し て、 変数、 ア ド レ ス、 数値定数を表現で き ます。 ア ド レ ス を表すシ ン ボルは ラ ベル と も 呼ばれ ます。 詳細については、 以下を参照 し て 下 さ い。 • • • • • • 3.5.1 「シ ン ボルの命名ルール」 「変数」 (ページ 3-30) 「数値定数」 (ページ 3-30) 「アセ ンブ リ 時の変数代入」 (ページ 3-31) 「 ラ ベル」 (ページ 3-32) 「 ロ ーカル ラ ベル」 (ページ 3-33) シ ンボルの命名ルール シ ン ボル名には、 以下の一般規則が適用 さ れ ます。 • シ ン ボル名は、 その有効範囲内で唯一であ る 必要があ り ます。 • シ ン ボル名には大文字、 小文字、 数値、 ア ン ダース コ ア文字を使用で き ます。 シ ン ボル名は大文字 と 小文字が区別 さ れ、 シ ン ボル名に使用す る 文字はすべて有意です。 • ロ ーカル ラ ベルを除 き 、 シ ン ボル名の最初の文字に数値を使用 し ないで 下 さ い (「 ロ ーカル ラ ベル」 (ページ 3-33) を参照)。 • 組み込み変数名ま たは定義済みのシ ン ボル名 と 同 じ 名前のシ ン ボルを使 用す る こ と はで き ません (「定義済みの レ ジ ス タ お よ び コ プ ロ セ ッ サ名」 (ページ 3-24) お よ び 「組み込み変数お よ び定数」 (ページ 3-26) を参 照)。 • 命令ニーモニ ッ ク ま たはデ ィ レ ク テ ィ ブ と 同 じ 名前を使用す る 場合は、 複縦線を使用 し て シ ン ボル名を区切っ て下 さ い。 例 : ||ASSERT|| 縦線はシ ン ボル名 と し て解釈 さ れ る こ と はあ り ません。 • プ ロ グ ラ ム ラ ベル と し て シ ン ボル |$a|, |$t|, |$t.x| ま たは |$d| は使用で き ません。 こ れ ら は、 ARM、 Thumb、 ThumbEE、 お よ びオブジ ェ ク ト フ ァ イ ル内のデー タ のマー ク に使用す る マ ッ ピ ン グ シ ン ボルです。 コ ンパ イ ラ を操作す る と き な ど、 通常はシ ン ボル名 と し て使用で き ない文字 を使用す る 場合は、 単縦線を使用 し て シ ン ボル名を区切 り ます。 例 : |.text| ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-29 アセ ン ブ ラ に関する参考情報 縦線はシ ン ボル名 と し て解釈 さ れ る こ と はあ り ません。 縦線内部で さ ら に縦 線、 セ ミ コ ロ ン、 改行を使用す る こ と はで き ません。 3.5.2 変数 変数の値は、 アセ ン ブ リ の実行中に変更で き ます。 変数には以下の 3 つの型が あ り ます。 • • • 数値 論理 文字列 変数の型は変更で き ません。 数値変数の値の範囲は、 数値定数ま たは数値式の値の範囲 と 同 じ です (「数値 定数」 お よ び 「数値式」 (ページ 3-36) を参照)。 論理変数の値は、 {TRUE} ま たは {FALSE} です (「論理式」 (ページ 3-39) を参 照)。 文字列変数の値の範囲は、 文字列式の値の範囲 と 同 じ です (「文字列式」 (ページ 3-35) を参照)。 変数を表すシ ン ボルを宣言す る には、 GBLA、 GBLL、 GBLS、 LCLA、 LCLL、 お よ び LCLS デ ィ レ ク テ ィ ブ を使用 し ます。 こ れ ら の変数に値を割 り 当て る には、 SETA、 SETL、 お よ び SETS デ ィ レ ク テ ィ ブ を使用 し ます。 詳細については、 以下 を参照 し て下 さ い。 • 「GBLA、 GBLL、 GBLS」 (ページ 7-5) • • 3.5.3 「LCLA、 LCLL、 LCLS」 (ページ 7-7) 「SETA、 SETL、 SETS」 (ページ 7-8) 数値定数 数値定数は 32 ビ ッ ト の整数です。 数値定数は、 0 ~ 232–1 の範囲の符号な し 数 値を使用 し て、 ま たは –231 ~ 23 –1 の範囲の符号あ り 数値を使用 し て設定で き ます。 し か し 、 アセ ンブ ラ は –n と 232–n を区別 し ません。 > = な ど の関係演算 子は、 符号な し と し て解釈 さ れ ます。 その結果、 0 > –1 は {FALSE} と し て処理 さ れ ます。 定数を定義す る には、 EQU デ ィ レ ク テ ィ ブ を使用 し ます (「EQU」 (ページ 7-90) を参照)。 定義後に数値定数の値を変更す る こ と はで き ません。 数値定 数 と バ イ ナ リ 演算子を組み合わせて、 数値定数式を作成す る こ と がで き ます。 3-30 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 「数値式」 (ページ 3-36) お よ び 「数値 リ テ ラ ル」 (ページ 3-37) も 参照 し て 下 さ い。 3.5.4 アセ ン ブ リ 時の変数代入 アセ ン ブ リ 言語で記述 さ れた コ ー ド の行全体、 ま たは コ ー ド 行の一部に、 文 字列変数を代入す る こ と がで き ます。 変数の値が代入 さ れ る 場所に、 $ 接頭文 字を付けた変数を挿入 し ます。 ド ル記号を使用す る と 、 アセ ン ブ ラ は、 行構 文をチ ェ ッ ク す る 前に、 文字列を ソ ース コ ー ド 行に代入 し ます。 数値変数や論理変数 も 代入可能です。 変数の現在の値は、 代入前に 16 進数文 字列に変換 さ れ ます (論理変数の場合は T ま たは F に変換 さ れます)。 次の文字がシ ン ボル名に使用で き る 場合は、 変数名の末尾に ド ッ ト を付け ま す (「シ ン ボルの命名ルール」 (ページ 3-29) を参照)。 変数を使用す る には、 変数の内容を設定す る 必要があ り ます。 $ と い う 文字に値を代入 し ない よ う にす る には、 $$ と 指定 し ます。 こ れは、 1 つの $ に変換 さ れます。 文字列には、 変数 と $ 接頭文字を一緒に含め る こ と がで き ます。 代入は、 他の 場所 と 同 じ よ う に行われ ます。 代入が二重引用符内部の縦線の影響を受けない場合を除 き 、 縦線内で代入は 行われ ません。 サン プル ; straightforward substitution GBLS add4ff ; add4ff SETS "ADD r4,r4,#0xFF" ; set up add4ff $add4ff.00 ; invoke add4ff ; this produces ADD r4,r4,#0xFF00 ; elaborate substitution GBLS s1 GBLS s2 GBLS fixup GBLA count ; count SETA 14 s1 SETS "a$$b$count" ; s1 now has value a$b0000000E s2 SETS "abc" fixup SETS "|xy$s2.z|" ; fixup now has value |xyabcz| |C$$code| MOV r4,#16 ; but the label here is C$$code ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-31 アセ ン ブ ラ に関する参考情報 3.5.5 ラ ベル ラ ベルは、 命令ま たはデー タ の メ モ リ 内のア ド レ ス を表すシ ン ボルです。 ラ ベルには、 プ ロ グ ラ ム相対 ラ ベル、 レ ジ ス タ 相対 ラ ベル、 ま たは絶対ア ド レ ス があ り ます。 プ ロ グ ラ ム相対ラ ベル プ ロ グ ラ ム相対 ラ ベルは、 PC に対 し て数値定数を加算ま たは減算 し た値を表 し ます。 プ ロ グ ラ ム相対 ラ ベルは、 分岐命令の タ ーゲ ッ ト と し て使用す る か、 ま たは コ ー ド セ ク シ ョ ンに組み込ま れてい る デー タ の細目にア ク セ スす る た めに使用 し ます。 プ ロ グ ラ ム相対 ラ ベルは、 命令で ラ ベルを使用す る か、 ま たはいずれかのデー タ 定義デ ィ レ ク テ ィ ブで ラ ベルを使用す る こ と に よ っ て 定義で き ます。 詳細については、 以下を参照 し て下 さ い。 • • • • • • • 「DCB」 (ページ 7-26) 「DCD、 DCDU」 (ページ 7-27) 「DCFD、 DCFDU」 (ページ 7-29) 「DCFS、 DCFSU」 (ページ 7-30) 「DCI」 (ページ 7-31) 「DCQ、 DCQU」 (ページ 7-33) 「DCW、 DCWU」 (ページ 7-34) レ ジ ス タ 相対 ラ ベル レ ジ ス タ 相対 ラ ベルは、 名前付 き レ ジ ス タ に数値定数を加算 し た値を表 し ま す。 レ ジ ス タ 相対 ラ ベルは、 デー タ セ ク シ ョ ン内のデー タ にア ク セ スす る た めに頻繁に使用 さ れ ます。 レ ジ ス タ 相対 ラ ベルは、 記憶域マ ッ プ を使用 し て 定義で き ます。 EQU デ ィ レ ク テ ィ ブ を使用す る と 、 記憶域マ ッ プで定義 さ れて い る ラ ベルに基づいて追加の レ ジ ス タ 相対 ラ ベルを定義で き ます。 詳細につ いては、 以下を参照 し て下 さ い。 • • • • 「MAP」 (ページ 7-21) 「SPACE ま たは FILL」 (ページ 7-24) 「DCDO」 (ページ 7-28) 「EQU」 (ページ 7-90) 絶対ア ド レ ス 絶対ア ド レ ス は数値定数です。 値の範囲は 0 ~ 232–1 の整数です。 絶対ア ド レ ス は、 メ モ リ を直接ア ド レ ス指定 し ます。 3-32 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 3.5.6 ロー カルラ ベル ロ ーカル ラ ベルは範囲 0 ~ 99 の数値で、 その後に名前を付け る こ と も で き ま す。 1 つの領域で複数の ロ ーカル ラ ベルに同 じ 番号を使用で き ます。 ロ ーカル ラ ベルは、 以下の方法で、 アセ ン ブ リ 言語モジ ュ ールの ソ ース行内 で symbol の代わ り に使用で き ます (「 ソ ース行の形式」 (ページ 3-23) を参 照)。 • 命令やデ ィ レ ク テ ィ ブ と 一緒に使用せずに単独で使用す る 。 • 命令を含む行の中で使用す る 。 • コ ー ド 生成デ ィ レ ク テ ィ ブ ま たはデー タ 生成デ ィ レ ク テ ィ ブ を含む行の 中で使用す る 。 プ ロ グ ラ ム相対 ラ ベルを使用す る 場所では通常、 ロ ーカル ラ ベルが使用 さ れ ます (「 ラ ベル」 (ページ 3-32) を参照)。 ロ ーカル ラ ベルは一般に、 ルーチン内部のループお よ び条件 コ ー ド や、 ロ ー カルのみで使用 さ れ る 小 さ いサブルーチンに対 し て使用 さ れます。 ロ ーカル ラ ベルは、 特にマ ク ロ で使用す る と 便利です (「MACRO、 MEND」 (ページ 7-37) を参照)。 ロ ーカル ラ ベルの有効範囲を制限す る には、 ROUT デ ィ レ ク テ ィ ブ を使用 し ま す (「ROUT」 (ページ 7-104) を参照)。 ロ ーカル ラ ベルに対す る 参照では、 同 じ 有効範囲内で一致す る ラ ベルが参照 さ れ ます。 有効範囲内で一致す る ラ ベ ルがいずれの方向に も 存在 し ない場合、 アセ ン ブ ラ は、 エ ラ ー メ ッ セージ を 生成 し 、 アセ ン ブ リ は失敗 し ます。 同 じ 有効範囲内の複数の ロ ーカル ラ ベルについて同 じ 数字を使用で き ます。 アセ ン ブ リ はデフ ォ ル ト で、 以下の よ う に ロ ーカル ラ ベル参照を リ ン ク し ま す。 • 有効範囲内に ラ ベルが 1 つあ る 場合は、 同 じ 番号の最新の ロ ーカル ラ ベ ルに リ ン ク し ます。 • 有効範囲内に先行 ラ ベルが存在 し ない場合は、 同 じ 番号の次の ロ ーカル ラ ベルに リ ン ク し ます。 こ の検索パ タ ーン を必要に応 じ て変更す る には、 オプシ ョ ンパ ラ メ ー タ を使 用 し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-33 アセ ン ブ ラ に関する参考情報 構文 ロ ーカル ラ ベルの構文は次の と お り です。 n{routname} ロ ーカル ラ ベルの参照の構文は次の と お り です。 %{F|B}{A|T}n{routname} 各パ ラ メ ー タ には以下の意味があ り ます。 n ロ ーカル ラ ベルの番号です。 routname 現在の有効範囲の名前です。 % 参照を導入 し ます。 F 順方向検索だけ を実行す る よ う にアセ ンブ ラ に指示 し ます。 B 逆方向検索だけ を実行す る よ う にアセ ンブ ラ に指示 し ます。 A すべてのマ ク ロ レベルを検索す る よ う にアセ ンブ ラ に指示 し ま す。 T アセ ン ブ ラ に現在のマ ク ロ レベルのみの検索を指示 し ます。 F も B も 指定 さ れていない場合、 アセ ンブ ラ は まず逆方向に検索 し た後、 順方 向に検索 し ます。 A も T も 指定 さ れていない場合、 アセ ンブ ラ は、 現在の レベルか ら 最上位レベ ル ま でのすべてのマ ク ロ を検索 し ます。 現在の レベル よ り も 下位のマ ク ロ は 検索 し ません。 routname が ラ ベルま たは ラ ベルへの参照で指定 さ れてい る 場合、 アセ ンブ ラ は、 こ れを、 直前の ROUT デ ィ レ ク テ ィ ブの名前 と 照合 し ます。 一致 し ない場 合、 アセ ンブ ラ は、 エ ラ ー メ ッ セージ を生成 し 、 アセ ンブ リ は失敗 し ます。 3-34 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 3.6 式、 リ テ ラル、 演算子 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「文字列式」 • 「文字列 リ テ ラ ル」 (ページ 3-36) • • • • • • • • • 3.6.1 「数値式」 (ページ 3-36) 「数値 リ テ ラ ル」 (ページ 3-37) 「浮動小数点 リ テ ラ ル」 (ページ 3-38) 「レ ジ ス タ 相対式 と プ ロ グ ラ ム相対式」 (ページ 3-39) 「論理式」 (ページ 3-39) 「論理 リ テ ラ ル」 (ページ 3-40) 「演算子の優先順位」 (ページ 3-40) 「単項演算子」 (ページ 3-42) 「2 項演算子」 (ページ 3-43) 文字列式 文字列式は、 文字列 リ テ ラ ル、 文字列変数、 文字列操作演算子、 お よ び括弧 で構成 さ れ ます。 詳細については、 以下を参照 し て下 さ い。 • • • • • 「変数」 (ページ 3-30) 「文字列 リ テ ラ ル」 (ページ 3-36) 「単項演算子」 (ページ 3-42) 「文字列操作演算子」 (ページ 3-44) 「SETA、 SETL、 SETS」 (ページ 7-8) 文字列 リ テ ラ ル内に配置で き ない文字は、 :CHR: 単項演算子を使用す る こ と に よ っ て文字列式内に配置で き ます。 0 ~ 255 の ASCII 文字を使用で き ます。 文字列式の値の長 さ は 512 文字を超え ない よ う に し て下 さ い。 長 さ は 0 で も か ま い ません。 例 improb ARM DUI 0204IJ SETS "literal":CC:(strvar2:LEFT:4) ; sets the variable improb to the value "literal" ; with the left-most four characters of the ; contents of string variable strvar2 appended Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-35 アセ ン ブ ラ に関する参考情報 3.6.2 文字列 リ テ ラ ル 文字列 リ テ ラ ルは、 一連の文字列を二重引用符で囲んで構成 し ます。 文字列 リ テ ラ ルの長 さ は入力行の長 さ に よ っ て制限 さ れ ます (「 ソ ース行の形式」 (ページ 3-23) を参照)。 文字列内に二重引用符ま たは ド ル記号を含め る には、 二重引用符ま たは ド ル 記号を 2 文字使用 し ます。 C 言語形式の文字列エ ス ケープシーケ ン ス は、--no_esc が指定 さ れない限 り イ ネーブルにな り ます (「コ マ ン ド 構文」 (ページ 3-2) を参照)。 サン プル abc def 3.6.3 SETS SETS "this string contains only one "" double quote" "this string contains only one $$ dollar symbol" 数値式 数値式は、 数値定数、 数値変数、 通常の数値 リ テ ラ ル、 二項演算子、 括弧の 組み合わせで構成 さ れます。 詳細については、 以下を参照 し て下 さ い。 • • • • • 「数値定数」 (ページ 3-30) 「変数」 (ページ 3-30) 「数値 リ テ ラ ル」 (ページ 3-37) 「2 項演算子」 (ページ 3-43) 「SETA、 SETL、 SETS」 (ページ 7-8) 式全体が、 レ ジ ス タ ま たは PC を含ま ない値に評価 さ れ る 場合、 数値式には レ ジ ス タ 相対式ま たはプ ロ グ ラ ム相対式を含め る こ と がで き ます。 数値式は 32 ビ ッ ト 整数に評価 さ れ ます。 こ れ ら は、 0 ~ 232–1 の範囲の符号な し 数値 と し て、 ま たは –231 ~ 231–1 の範囲の符号あ り 数値 と し て解釈で き ま す。 し か し 、 アセ ン ブ ラ は –n と 232–n を区別 し ません。 > = な ど の関係演算子 は、 符号な し と し て解釈 さ れ ます。 その結果、 0 > –1 is {FALSE} と し て処理 さ れ ます。 例 a 3-36 SETA MOV 256*256 r1,#(a*22) ; 256*256 is a numeric expression ; (a*22) is a numeric expression Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 3.6.4 数値 リ テ ラ ル 数値 リ テ ラ ルには、 以下のいずれかの形式を使用で き ます。 decimal-digits 0xhexadecimal-digits &hexadecimal-digits n_base-n-digits 'character' 各項目には以下の意味があ り ます。 decimal-digits 0 ~ 9 の数値だけ を使用 し た文字列です。 hexadecimal-digits 0 ~ 9 の数字 と A ~ F ま たは a ~ f だけ を使用 し た文字列 です。 n_ 2 ~ 9 のいずれかの数字に下線付 き 文字を続けた文字列で す。 base-n-digits 0 ~ (n –1) の数字のみを使用 し た文字列です。 character 単一引用符を除 く 任意の 1 文字です。 単一引用符を表示す る 場合は、 \' を使用 し ます。 こ の場合、 数値 リ テ ラ ルの値 は文字の数値 コ ー ド です。 上記以外の文字は使用で き ません。 文字列は、 0 ~ 232–1 の整数に評価 さ れ る 必要があ り ます (範囲が 0 ~ 264–1 であ る DCQ お よ び DCQU デ ィ レ ク テ ィ ブ を除 く )。 サン プル a addr c3 ARM DUI 0204IJ SETA DCD LDR DCD SETA DCQ LDR ADD 34906 0xA10E r4,=&1000000F 2_11001010 8_74007 0x0123456789abcdef r1,='A' r3,r2,#'\'' ; pseudo-instruction loading 65 into r1 ; add 39 to contents of r2, result to r3 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-37 アセ ン ブ ラ に関する参考情報 3.6.5 浮動小数点 リ テ ラ ル 浮動小数点 リ テ ラ ルには、 以下のいずれかの形式を使用で き ます。 {-}digits E{-}digits {-}{digits}.digits {-}{digits}.digitsE{-}digits 0xhexdigits &hexdigits 0f_hexdigits 0d_hexdigits 各項目には以下の意味があ り ます。 digits 0 ~ 9 の数字のみを使用 し た文字列です。 E は大文字ま たは小文 字で記述で き ます。 こ れ ら の形式は通常の浮動小数点表記に対応 し ます。 hexdigits 0 ~ 9 の数字 と A ~ F ま たは a ~ f の文字のみを使用 し た文字列 です。 こ れ ら の形式は、 コ ン ピ ュ ー タ におけ る 数値の内部表現 に対応 し ます。 無限値お よ び NaN を入力す る 場合、 ま たは使用 す る 正 し い ビ ッ ト パ タ ーン が不明な場合は、 こ れ ら の形式を使 用 し ます。 0x お よ び & では、 浮動小数点ビ ッ ト パ タ ーン を 16 進数で指定で き ます。 0f_ 形式では、 浮動小数点ビ ッ ト パ タ ーン を 8 桁の 8 進数で指定す る 必要があ り ます。 0d_ 形式では、 浮動小数点ビ ッ ト パ タ ーン を 16 桁の 16 進数で指定す る 必要が あ り ます。 単精度浮動小数点数値の範囲は以下の と お り です。 • 最大 : 3.40282347e+38 • 最小 : 1.17549435e–38 倍精度浮動小数点数値の範囲は以下の と お り です。 • 最大 : 1.79769313486231571e+308 • 3-38 最小 : 2.22507385850720138e–308 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 サン プル DCFD DCFS DCFD DCFS DCFD 3.6.6 1E308,-4E-100 1.0 3.725e15 0x7FC00000 &FFF0000000000000 ; Quiet NaN ; Minus infinity レ ジ ス タ 相対式 と プ ロ グ ラ ム相対式 レ ジ ス タ 相対式は、 名前付 き レ ジ ス タ に数値定数を加算ま たは減算 し た値に 評価 さ れ ます (「MAP」 (ページ 7-21) を参照)。 プ ロ グ ラ ム相対ア ド レ ス は、 現在の プ ロ グ ラ ム カ ウ ン タ (PC) か ら のオ フ セ ッ ト と し て表現 さ れ ます。 通常、 数値式 と 組み合わせた ラ ベル と な り ます。 以下の手順は、 プ ロ グ ラ ム相対ア ド レ ス の評価結果を示 し た も のです。 1. 現在実行中の命令に続 く 命令のア ド レ ス 2. 0xFFFFFFFC でのビ ッ ト 単位論理和 (ARM コ ー ド では違いがあ り ません) 3. 数値定数の加算ま たは減算 例 data 3.6.7 LDR r4,=data+4*n ; code MOV pc,lr DCD value_0 ; n-1 DCD directives DCD value_n ; more DCD directives ; n is an assembly-time variable ; data+4*n points here 論理式 論理式は、 論理 リ テ ラ ル ({TRUE} ま たは {FALSE})、 論理変数、 ブール演算子、 関係、 お よ び括弧を組み合わせた も ので構成 さ れ ます (「ブール演算子」 (ページ 3-48) を参照)。 関係は、 変数、 リ テ ラ ル、 定数、 ま たは適切な関係演算子が含まれ る 式を組 み合わせた も ので構成 さ れ ます (「関係演算子」 (ページ 3-47) を参照)。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-39 アセ ン ブ ラ に関する参考情報 3.6.8 論理 リ テ ラ ル 論理 リ テ ラ ルは次の と お り です。 {TRUE} • • {FALSE} 3.6.9 演算子の優先順位 ARM アセ ンブ ラ には、 式で使用で き る 広範な演算子セ ッ ト が含まれてい ま す。 ARM アセ ン ブ ラ に用意 さ れてい る 演算子の多 く には、 C 言語な ど の高級 言語で使用 さ れ る 演算子 と 同様の機能があ り ます (「単項演算子」 (ページ 3-42) お よ び 「2 項演算子」 (ページ 3-43) を参照)。 評価す る 際、 厳密な優先順位があ り ます。 1. 2. 最初に、 括弧内の式が評価 さ れ ます。 演算子は優先順位に従っ て適用 さ れ ます。 3. 4. 隣接す る 単項演算子は、 右か ら 左に評価 さ れ ます。 優先順位が同 じ 2 項演算子は、 左か ら 右に評価 さ れ ます。 armasm と C 言語における演算子の優先順位 ARM アセ ンブ ラ におけ る 優先順位は、 C 言語 と は異な り ます。 例えば、(1 + 2 :SHR: 3) は armasm では (1 + (2 :SHR: 3)) = 1 と 評価 さ れます。 等 価の式が C では ((1 + 2) >> 3) = 0 と 評価 さ れます。 括弧を使 う こ と に よ っ て優先順位を明示的に示す こ と をお勧め し ます。 C 言語でアセ ン ブ ラ と 違っ た解析を さ れ る 式が コ ー ド に含まれていて、 --unsafe オプシ ョ ン を使用 し ていない場合は通常、 armasm に よ っ て次の よ う な 警告が表示 さ れ ます。 A1466W: Operator precedence means that expression would evaluate differently in C 表 3-4 (ページ 3-41) に、 armasm での演算子の優先順位 と 、 C におけ る 優先順 位 と の比較を記載 し ます (表 3-5 (ページ 3-41) を参照)。 次の表か ら 以下の点を確認で き ます。 • 最 も 優先順位の高い演算子は リ ス ト の最上位にあ り ます。 • 最 も 優先順位の高い演算子は最初に評価 さ れ ます。 3-40 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 • 優先順位が同 じ 演算子は、 左か ら 右に評価 さ れ ます。 表 3-4 armasm におけ る演算子の優先順位 armasm の優先順位 C における同等の演算子 単項演算子 単項演算子 * / :MOD: * / % 文字列操作 n/a :SHL: :SHR: :ROR: :ROL: << >> + - :AND: :OR: :EOR: + - & | ^ = > >= < <= /= <> == > >= < <= != :LAND: :LOR: :LEOR: & || 表 3-5 C におけ る演算子の優先順位 C での優先順位 単項演算子 * / % + - (二項演算子 と し て) << >> < <= > >= == != & ^ | & || ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-41 アセ ン ブ ラ に関する参考情報 3.6.10 単項演算子 単項演算子は最 も 優先順位が高 く 、 最初に評価 さ れ ます。 単項演算子はその オペ ラ ン ド よ り も 優先順位が高 く な り ます。 隣接す る 演算子は右か ら 左に評 価 さ れます。 表 3-6 に、 文字列を返す単項演算子を示 し ます。 表 3-6 文字列を返す単項演算子 演算子 使用法 説明 :CHR: :CHR:A ASCII コ ー ド A が含まれてい る 文字を返 し ます。 :LOWERCASE: :LOWERCASE:string すべての大文字を小文字に変換 し て所定の文字列を返 し ま す。 :REVERSE_CC: :REVERSE_CC:cond_code cond_code が有効な条件コ ー ド を含ま ない場合、 cond_code での 条件 コ ー ド の逆数ま たはエ ラ ーを返 し ます。 :STR: :STR:A 数値式に対応す る 8 桁の 16 進数文字列、 ま たは、 論理式で使 用 さ れてい る 場合は文字列 "T" ま たは "F" を返 し ます。 :UPPERCASE: :UPPERCASE:string すべての小文字を大文字に変換 し て所定の文字列を返 し ま す。 表 3-7 に、 数値を返す単項演算子を示 し ます。 表 3-7 数値または論理値を返す単項演算子 演算子 使用法 説明 ? ?A シ ン ボル A を定義する 行に よ っ て生成 さ れた実行可能 コ ー ド の バ イ ト 数。 + および - +A 単項プ ラ ス。 単項マ イ ナ ス。 + 記号 と – 記号で、 数値相対式 と プ ロ グ ラ ム相対式に対 し て影響を与え る こ と がで き ます。 -A :BASE: :BASE:A A が PC 相対式ま たはレ ジ ス タ 相対式の場合、 :BASE: は、 その レ ジ ス タ コ ン ポーネ ン ト の番号を返 し ます。 :BASE: はマ ク ロ で非 常に便利です。 :CC_ENCODING: :CC_ENCODING:cond_code cond_code が有効な条件 コ ー ド を含ま ない場合、 cond_code での条 件 コ ー ド の数値ま たはエ ラ ーを返 し ます。 :DEF: 3-42 :DEF:A A が定義 さ れてい る 場合は {TRUE}、 そ う でない場合は {FALSE} で す。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 表 3-7 数値または論理値を返す単項演算子 (続き) 演算子 使用法 説明 :INDEX: :INDEX:A A が レ ジ ス タ 相対式の場合、 :INDEX: はそのベース レ ジ ス タ か ら のオ フ セ ッ ト を返 し ます。 :INDEX: はマ ク ロ で非常に便利です。 :LEN: :LEN:A 文字列 A の長 さ 。 :LNOT: :LNOT:A A の論理補数。 :NOT: :NOT:A A のビ ッ ト 単位補数 (~ はエ イ リ ア ス です。 例 : ~A)。 :RCONST: :RCONST:Rn r0 ~ r15 に対応す る レ ジ ス タ の番号 0 ~ 15。 3.6.11 2 項演算子 2 項演算子は、 演算対象の一対の部分式の間に記述 し ます。 2 項演算子は単項演算子 よ り も 優先順位は低 く な り ます。 こ のセ ク シ ョ ン で は、 こ の優先順位に従っ て 2 項演算子を取 り 上げてい ます。 注 優先順位は C と 異な り ます。 「armasm と C 言語におけ る 演算子の優先順位」 (ページ 3-40) を参照 し て下 さ い。 乗算演算子 乗算演算子は、 すべての 2 項演算子の中で最 も 優先順位が高 く な り ます。 乗算 演算子は数値式にのみ作用 し ます。 表 3-8 に乗算演算子を示 し ます。 表 3-8 乗算演算子 演算子 使用法 説明 * A*B 乗算 / A/B 除算 A:MOD:B A と B のモジ ュ ロ 演算 (A を B で 割っ て余 り を求め る) :MOD: ARM DUI 0204IJ エ イ リ アス % Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-43 アセ ン ブ ラ に関する参考情報 文字列操作演算子 表 3-9 に文字列操作演算子を示 し ます。 CC では、 A と B はいずれ も 文字列でな ければな り ません。 ス ラ イ ス演算子 LEFT お よ び RIGHT の場合 • A は文字列でなければな り ません。 • B は数値式でなけれな り ません。 表 3-9 文字列操作演算子 3-44 演算子 使用法 説明 :CC: A:CC:B B は A の末尾に連結 さ れます。 :LEFT: A:LEFT:B A の左か ら B 文字 :RIGHT: A:RIGHT:B A の右か ら B 文字 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 シ フ ト 演算子 シ フ ト 演算子は数値式に作用 し 、 最初のオペ ラ ン ド を、 2 番目のオペ ラ ン ド で指定 さ れてい る 量だけシ フ ト ま たは回転 さ せます。 表 3-10 にシ フ ト 演算子を示 し ます。 表 3-10 シ フ ト 演算子 演算子 エイ リ ア ス 使用法 説明 :ROL: A:ROL:B A を B ビ ッ ト 分左に回転 さ せます。 :ROR: A:ROR:B A を B ビ ッ ト 分右に回転 さ せます。 :SHL: << A:SHL:B A を B ビ ッ ト 分左にシ フ ト さ せます。 :SHR: >> A:SHR:B A を B ビ ッ ト 分右にシ フ ト さ せます。 注 SHR は論理シ フ ト であ り 、 符号ビ ッ ト ま で波及 し ません。 加算、 減算、 および論理演算子 加算お よ び減算演算子は数値式に作用 し ます。 論理演算子は数値式に作用 し ます。 処理は、 ビ ッ ト 単位 で実行 さ れます。 つ ま り 、 オペ ラ ン ド の各ビ ッ ト に関係な く 結果が生成 さ れます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-45 アセ ン ブ ラ に関する参考情報 表 3-11 に加算、 減算、 お よ び論理演算子を示 し ます。 表 3-11 加算、 減算、 および論理演算子 演算子 3-46 エイ リ アス 使用法 説明 + A+B A を B に加算 - A-B A か ら B を減算 :AND: & A:AND:B A と B の ビ ッ ト 単位論理積 :EOR: ^ A:EOR:B A と B の ビ ッ ト 単位排他的論理 和 (XOR) :OR: | A:OR:B A と B の ビ ッ ト 単位論理和 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 関係演算子 表 3-12 に関係演算子を示 し ます。 関係演算子は、 同 じ タ イ プの 2 つのオペ ラ ン ド に作用 し て論理値を生成 し ます。 オペ ラ ン ド には以下の タ イ プ を指定で き ます。 • 数値 • プ ロ グ ラ ム相対 • レ ジ ス タ 相対 • 文字列 文字列は ASCII 順序を使用 し て ソ ー ト さ れ ます。 文字列 A は、 文字列 B の先頭 にあ る 部分文字列であ る 場合、 文字列 B よ り も 小 さ く な り ます。 ま た、 2 つの 文字列で異な る 左端の文字が、 文字列 B よ り も 文字列 A で小 さ く な る 場合 も 、 文字列 A は文字列 B よ り も 小 さ く な り ます。 数値は符号な し なので、 0>-1 の値は {FALSE} と な り ます。 表 3-12 関係演算子 演算子 エ イ リ アス 使用法 説明 = == A=B A は B と 同等です。 > A>B A は B よ り も大き く な り ま す。 >= A>=B A は B 以上です。 < A<B A は B よ り 小 さ く な り ます。 <= A<=B A は B 以下です。 A/=B A は B と 同等ではあ り ませ ん。 /= ARM DUI 0204IJ <> != Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-47 アセ ン ブ ラ に関する参考情報 ブール演算子 ブール演算子は、 最 も 優先順位の低い演算子です。 ブール演算子は、 そのオ ペ ラ ン ド に対 し て標準論理演算を実行 し ます。 3 つのケース で も 、 A と B の両方の式は、 {TRUE} ま たは {FALSE} のいずれかに 評価 さ れなければな り ません。 表 3-13 にブール演算子を示 し ます。 表 3-13 ブール演算子 演算子 エ イ リ アス 使用法 説明 :LAND: & A:LAND:B A と B の論理積 A:LEOR:B A と B の排他的論理和 (XOR) A:LOR:B A と B の論理和 :LEOR: :LOR: 3-48 || Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 3.7 診断 メ ッ セージ ARM アセ ン ブ ラ では、 追加の診断 メ ッ セージの範囲を指定で き ます。 デフ ォ ル ト では、 こ ら れの診断 メ ッ セージは表示 さ れ ません。 ただ し 、 コ マ ン ド ラ イ ン オプシ ョ ン を使用 し て、 ど の メ ッ セージ を アセ ン ブ ラ で表示す る か を制 御で き ます。 詳細については、 「診断 メ ッ セージの出力の制御」 (ページ 3-19) を参照 し て下 さ い。 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「イ ン ターロ ッ ク」 • 「IT ブ ロ ッ ク 生成」 (ページ 3-50) • 3.7.1 「Thumb 分岐 タ ーゲ ッ ト の ワー ド 境界整列」 (ページ 3-50) イ ン タ ーロ ッ ク --cpu オプシ ョ ンに よ っ て選択 さ れたプ ロ セ ッ サのパ イ プ ラ イ ン が原因で コ ー ド 内で発生可能な イ ン タ ー ロ ッ ク に関す る 警告 メ ッ セージ を表示で き ます。 こ れには、 アセ ンブ ラ の起動時に次の コ マ ン ド ラ イ ン オプシ ョ ン を使用 し ま す。 armasm --diag_warning 1563 注 こ こ で、--cpu オプシ ョ ンは、 Cortex-A8 な ど のマルチ イ ッ シ ュ ープ ロ セ ッ サを 指定 し ます。 アセ ン ブ ラ 警告は予測不可能にな り ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-49 アセ ン ブ ラ に関する参考情報 3.7.2 IT ブ ロ ッ ク生成 次の よ う に記述 し ます。 AREA x,CODE THUMB MOVNE r0,r1 ; (1) NOP IT NE MOVNE r0,r1 ; (2) END アセ ン ブ ラ に よ り 、 最初の MOVNE 命令の前に、 IT 命令が生成 さ れ ます。 Thumb コ ー ド を アセ ン ブルす る 際に こ の IT ブ ロ ッ ク の自動生成に関す る 警告 メ ッ セージ を表示で き ます。 こ れには、 アセ ン ブ ラ の起動時に次の コ マ ン ド ラ イ ン オプシ ョ ン を使用 し ます。 armasm --diag_warning 1763 3.7.3 Thumb 分岐 タ ーゲ ッ ト のワー ド 境界整列 一部のプ ロ セ ッ サでは、 非 ワー ド 境界整列の Thumb 命令をループで実行す る と 、 1 つ以上の余分なサ イ ク ルが発生 し ます。 そのため、 分岐 タ ーゲ ッ ト が ワー ド 境界整列 さ れ る よ う にす る と 有利です。 Thumb コ ー ド の分岐 タ ーゲ ッ ト が ワ ー ド 境界整列 さ れない と き にアセ ン ブ ラ は警告を表示す る こ と がで き ます。 こ れには、 アセ ン ブ ラ の起動時に次の コ マ ン ド ラ イ ン オプシ ョ ン を使 用 し ます。 armasm --diag_warning 1604 3-50 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ アセ ン ブ ラ に関する参考情報 3.8 C プ リ プ ロ セ ッ サを使用する C プ リ プ ロ セ ッ サ コ マ ン ド を、 アセ ン ブ リ 言語の ソ ース フ ァ イ ルに使用で き ます。 こ れを行 う 場合には、 アセ ン ブ ラ の起動時に --cpreproc コ マ ン ド ラ イ ン オプシ ョ ン を指定す る 必要があ り ます。 そ う す る と 、 armasm が armcc を呼び出 し て、 フ ァ イ ルを前処理 し てか ら アセ ン ブルす る よ う にな り ます。 armasm は、 armasm バ イ ナ リ と 同 じ デ ィ レ ク ト リ で armcc バ イ ナ リ を探 し ます。 バ イ ナ リ を見つけ ら れない場合、 PATH 上にあ る も の と 判断 し ます。 特定のオプシ ョ ンが コ マ ン ド ラ イ ン で指定 さ れてい る 場合、 armasm は armcc に そのオプシ ョ ン を渡 し ます。 表 3-14 に、 それを示 し ます。 こ れ ら のオプシ ョ ンの一部は、 armcc におけ る 等価のオプシ ョ ン に変換 さ れてか ら 、 armcc に渡 さ れ ます。 表 3-15 に、 それを示 し ます。 表 3-14 コ マ ン ド ラ イ ンオプ シ ョ ン --16 --arm_only --diag_error --diag_warning --li --32 --bi --diag_remark --fpu --library_type --apcs --cpu --diag_style --fpumode --thumb --arm --device --diag_suppress --i --[no_]unaligned_access 表 3-15 armcc におけ る等価の コ マ ン ド ラ イ ンオプ シ ョ ン armasm armcc --16 --thumb --32 --arm --i --I 他の単純な コ ンパ イ ラ オプシ ョ ン (プ リ プ ロ セ ッ サオプシ ョ ン -D な ど) を渡 すには、 --cpreproc_opts コ マ ン ド ラ イ ン オプシ ョ ン を使用す る 必要があ り ま す。 詳細については、 『 コ ンパ イ ラ ユーザガ イ ド 』 を参照 し て下 さ い。 armasm は、 前処理 さ れた #line コ マ ン ド を正確に解釈 し ます。 #line コ マ ン ド の情報を 使用 し てエ ラ ー メ ッ セージお よ び debug_line テーブルが生成 さ れます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 3-51 アセ ン ブ ラ に関する参考情報 例 3-1 に、 フ ァ イ ル source.s を前処理 し て アセ ン ブルす る ための コ マ ン ド を 示 し ます。 こ の例では ま た、 コ ンパ イ ラ オプシ ョ ン を渡 し て RELEASE と い う 名前のマ ク ロ を定義 し 、 ALPHA と い う 名前のマ ク ロ の定義を解除 し てい ま す。 例 3-1 アセ ン ブ リ 言語のソ ース フ ァ イルの前処理 armasm --cpreproc --cpreproc_opts=-D,RELEASE,-U,ALPHA source.s 複雑なプ リ プ ロ セ ッ サオプシ ョ ン を使用す る には、 armcc を手動で呼び出 し て フ ァ イ ルを前処理 し てか ら armasm を呼び出す必要があ り ます。 例 3-2 に、 フ ァ イ ル source.s を手動で前処理 し て アセ ン ブルす る ための コ マ ン ド を示 し ます。 こ の例では、 プ リ プ ロ セ ッ サに よ っ て preprocessed.s と い う 名前の フ ァ イ ルが出力 さ れ、 armasm に よ っ て preprocessed.s がアセ ン ブル さ れ ます。 例 3-2 アセ ン ブ リ 言語のソ ース フ ァ イルの手動によ る前処理 armcc -E source.s > preprocessed.s armasm preprocessed.s 3-52 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 第4章 ARM 命令 と Thumb 命令 本章では、 ARM アセ ン ブ ラ でサポー ト さ れてい る ARM®、 Thumb® (すべて のバージ ョ ン)、 お よ び ThumbEE 命令について説明 し ます。 以下のセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「命令の概要」 (ページ 4-3) • • • • • • • • • • • • ARM DUI 0204IJ 「 メ モ リ ア ク セ ス命令」 (ページ 4-10) 「汎用デー タ 処理命令」 (ページ 4-46) 「乗算命令」 (ページ 4-77) 「サチ ュ レー ト 命令」 (ページ 4-100) 「並列命令」 (ページ 4-105) 「パ ッ ク 命令 と 展開命令」 (ページ 4-113) 「分岐命令 と 制御命令」 (ページ 4-122) 「コ プ ロ セ ッ サ命令」 (ページ 4-132) 「その他の命令」 (ページ 4-140) 「Thumb での命令の幅の選択」 (ページ 4-159) 「ThumbEE 命令」 (ページ 4-161) 「疑似命令」 (ページ 4-165) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-1 ARM 命令 と Thumb 命令 命令セ ク シ ョ ン の中にはアーキ テ ク チ ャ サブセ ク シ ョ ン を含む も のがあ り ま す。 アーキ テ ク チ ャ サブセ ク シ ョ ン を持たない命令は、 すべてのバージ ョ ン の ARM 命令セ ッ ト お よ びすべてのバージ ョ ン の Thumb 命令セ ッ ト で使用で き る も のです。 4-2 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.1 命令の概要 表 4-1 は、 ARM、 Thumb、 お よ び ThumbEE 命令セ ッ ト で使用で き る 命令の概 要を示 し てい ます。 こ の表を使用 し て、 本章の残 り の部分に記載 さ れてい る 各命令お よ び疑似命令の説明に移動で き ます。 注 特に明記 し ていない限 り 、 ThumbEE 命令は Thumb 命令 と 同一です。 表 4-1 命令の参照ページ ニーモニ ッ ク 概要 ページ アーキテ クチャ a ADC、 ADD キ ャ リ ー付 き 加算、 加算 (ページ 4-51) すべて ADR プ ロ グ ラ ム相対ア ド レ ス ま たはレ ジ ス タ 相対ア ド レ ス の ロ ー ド (狭範囲) (ページ 4-24) すべて ADRL 疑似命令 プ ロ グ ラ ム相対ア ド レ ス ま たはレ ジ ス タ 相対ア ド レ ス の ロ ー ド (中範囲) (ページ 4-166) x6M AND 論理積 (ページ 4-58) すべて ASR 算術右シ フ ト (ページ 4-73) すべて B 分岐 (ページ 4-123) すべて BFC、 BFI ビ ッ ト フ ィ ール ド の ク リ ア命令 と 挿入命令 (ページ 4-114) T2 BIC ビッ ト ク リア (ページ 4-58) すべて BKPT ブ レー ク ポ イ ン ト (ページ 4-141) 5 BL リ ン ク 付 き 分岐命令 (ページ 4-123) すべて BLX リ ン ク 付 き 分岐、 命令セ ッ ト の変更 (ページ 4-123) T BX 分岐、 命令セ ッ ト の変更 (ページ 4-123) T BXJ 分岐、 Jazelle へ変更 (ページ 4-123) J、 x7M CBZ, CBNZ 0 と 比較 し 、 0 の (ま たは 0 でない) 場合に分岐す る 命 令 (ページ 4-130) T2 CDP コ プ ロ セ ッ サデー タ 処理命令 (ページ 4-133) x6M ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-3 ARM 命令 と Thumb 命令 表 4-1 命令の参照ページ (続き) ニーモニ ッ ク 概要 ページ アーキテ クチャ a CDP2 コ プ ロ セ ッ サデー タ 処理命令 (ページ 4-133) 5、 x6M CHKA 配列をチ ェ ッ ク す る 命令 (ページ 4-163) EE CLREX 排他の ク リ ア命令 (ページ 4-43) K、 x6M CLZ 先行ゼ ロ カ ウ ン ト (ページ 4-61) 5、 x6M CMN、 CMP 否定値の比較、 比較命令 (ページ 4-62) すべて CPS プ ロ セ ッ サ状態の変更命令 (ページ 4-148) 6 DBG デバ ッ グ (ページ 4-154) 7 DMB、 DSB デー タ メ モ リ バ リ ア、 デー タ 同期バ リ ア (ページ 4-154) 7、 6M ENTERX、 LEAVEX ThumbEE と の間の状態切 り 替え命令 (ページ 4-162) EE EOR 排他的論理和 (XOR) (ページ 4-58) すべて HB、 HBL、 HBLP、 HBP ハン ド ラ の分岐、 指定 さ れたハン ド ラ への分岐 (ページ 4-164) EE ISB 命令同期バ リ ア (ページ 4-154) 7、 6M IT If-Then (ページ 4-127) T2 LDC コプロ セ ッ サロー ド (ページ 4-138) x6M LDC2 コプロ セ ッ サロー ド (ページ 4-138) 5、 x6M LDM 多重レ ジ ス タ ロ ー ド (ページ 4-29) すべて LDR レ ジ ス タ ロ ー ド 命令 (ページ 4-10) すべて LDR 疑似命令 レ ジ ス タ ロ ー ド 疑似命令 (ページ 4-170) すべて LDREX 排他的レ ジ ス タ ロ ー ド (ページ 4-40) 6、 x6M LDREXB、 LDREXH 排他的レ ジ ス タ ロ ー ド (バ イ ト 、 ハーフ ワ ー ド ) (ページ 4-40) K、 x6M LDREXD 排他的レ ジ ス タ ロ ー ド (ダブル ワ ー ド ) (ページ 4-40) K、 x7M LSL、 LSR 論理左シ フ ト 、 論理右シ フ ト (ページ 4-73) すべて MAR レ ジ ス タ か ら 40 ビ ッ ト 累算器への移動命令 (ページ 4-157) XScale 4-4 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 表 4-1 命令の参照ページ (続き) ニーモニ ッ ク 概要 ページ アーキテ クチャ a MCR レ ジ ス タ か ら コ プ ロ セ ッ サへの移動命令 (ページ 4-134) x6M MCR2 レ ジ ス タ か ら コ プ ロ セ ッ サへの移動命令 (ページ 4-134) 5、 x6M MCRR レ ジ ス タ か ら コ プ ロ セ ッ サへの移動命令 (ページ 4-134) 5E、 x6M MCRR2 レ ジ ス タ か ら コ プ ロ セ ッ サへの移動命令 (ページ 4-134) 6、 x6M MIA、 MIAPH、 MIAxy 乗算お よ び内部 40 ビ ッ ト 加算 (ページ 4-98) XScale MLA 積和 (ページ 4-79) x6M MLS 積差 (ページ 4-79) T2 MOV 移動命令 (ページ 4-64) すべて MOVT 上位ハーフ ワー ド にデー タ を代入す る 命令 (ページ 4-67) T2 MOV32 疑似命令 レ ジ ス タ への 32 ビ ッ ト 定数の移動命令 (ページ 4-168) T2 MRA 40 ビ ッ ト 累算器か ら レ ジ ス タ への移動 (ページ 4-157) XScale MRC コ プ ロ セ ッ サか ら レ ジ ス タ への移動命令 (ページ 4-136) すべて MRC2 コ プ ロ セ ッ サか ら レ ジ ス タ への移動命令 (ページ 4-136) 5、 x6M MRS PSR か ら レ ジ ス タ への移動命令 (ページ 4-143) すべて MSR レ ジ ス タ か ら PSR への移動命令 (ページ 4-145) すべて MUL 乗算 (ページ 4-79) すべて MVN デー タ の各ビ ッ ト を反転 さ せてか ら 代入す る 命令 (ページ 4-64) すべて NOP 操作な し (ページ 4-152) すべて ORN 論理和否定 (ページ 4-58) T2 ORR 論理和 (ページ 4-58) すべて PKHBT、 PKHTB ハーフ ワー ド のパ ッ ク 命令 (ページ 4-120) 6、 x7M PLD デー タ をプ リ ロ ー ド (ページ 4-26) 5E、 x6M PLDW 書 き 込むためにデー タ を プ リ ロ ー ド (ページ 4-26) 7MP ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-5 ARM 命令 と Thumb 命令 表 4-1 命令の参照ページ (続き) ニーモニ ッ ク 概要 ページ アーキテ クチャ a PLI 命令を プ リ ロ ー ド (ページ 4-26) 7 PUSH、 POP レ ジ ス タ を ス タ ッ ク に PUSH、 ス タ ッ ク か ら レ ジ ス タ を POP (ページ 4-33) すべて QADD、 QDADD、 QDSUB、 サチ ュ レー ト 算術演算 (ページ 4-101) 5E、 x7M 並列符号付 き サチ ュ レー ト 算術演算 (ページ 4-106) 6、 x7M RBIT ビ ッ ト 順序を反転 (ページ 4-72) T2 REV、 REV16、 REVSH バ イ ト 順序を反転 (ページ 4-72) 6 RFE 例外か ら の復帰 (ページ 4-35) T2、 x7M ROR レ ジ ス タ の右 ロ テー ト (ページ 4-73) すべて RSB 逆減算 (ページ 4-51) すべて RSC キ ャ リ ー付 き 逆減算 (ページ 4-51) x6M SADD8、 SADD16、 SASX 並列符号付 き 算術演算 (ページ 4-106) 6、 x7M SBC キ ャ リ ー付 き 減算 (ページ 4-51) すべて SBFX、 UBFX 符号付 き / 符号な し ビ ッ ト フ ィ ール ド の抽出命令 (ページ 4-116) T2 SDIV 符号付 き 除算 (ページ 4-76) 7M、 7R SEL APSR の GE フ ラ グに基づ く バ イ ト の選択 (ページ 4-70) 6、 x7M SETEND メ モ リ ア ク セ ス時のエンデ ィ ア ン形式を設定する 命令 (ページ 4-151) 6、 x7M SEV イ ベン ト を設定す る 命令 (ページ 4-152) K、 6M SHADD8、 SHADD16、 符号付 き でバ イ ト 、 ハーフ ワ ー ド 並列演算 (ページ 4-106) 6、 x7M セキ ュ アモニ タ ー コ ール (ページ 4-150) Z QSUB QADD8、 QADD16、 QASX、 QSUB8、 QSUB16、 QSAX SHASX、 SHSUB8、 SHSUB16、 SHSAX SMC 4-6 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 表 4-1 命令の参照ページ (続き) ニーモニ ッ ク 概要 ページ アーキテ クチャ a SMLAD デ ュ アル符号付 き 積和 (ページ 4-93) 6、 x7M (32 <= 32 + 16 x 16 + 16 x 16) SMLAL 符号付 き 積和 (64 <= 64 + 32 x 32) (ページ 4-81) x6M SMLALxy 符号付 き 積和 (64 <= 64 + 16 x 16) (ページ 4-87) 5E、 x7M SMLALD デ ュ アル符号付 き 積和 long (ページ 4-95) 6、 x7M (ページ 4-93) 6、 x7M (ページ 4-95) 6、 x7M (64 <= 64 + 16 x 16 + 16 x 16) SMLSD デ ュ アル符号付 き 乗減累算 (32 <= 32 + 16 x 16 – 16 x 16) SMLSLD デ ュ アル符号付 き 乗減累算 long (64 <= 64 + 16 x 16 – 16 x 16) SMMUL 符号付 き 上位 ワー ド 乗算 (32 <= TopWord (32 x 32)) (ページ 4-91) 6、 x7M SMUAD、 SMUSD デ ュ アル符号付 き 乗算、 お よ び積の加算ま たは減算 (ページ 4-89) 6、 x7M SMULxy 符号付 き 乗算 (32 <= 16 x 16) (ページ 4-83) 5E、 x7M SMULL 符号付 き 乗算 (64 <= 32 x 32) (ページ 4-81) x6M SMULWy 符号付 き 乗算 (32 <= 32 x 16) (ページ 4-85) 5E、 x7M SRS 復帰状態の ス ト ア命令 (ページ 4-38) T2、 x7M SSAT 符号付 き サチ ュ レー ト 演算 (ページ 4-103) 6、 x6M SSAT16 符号付 き 並列ハーフ ワー ド サチ ュ レー ト 演算 (ページ 4-111) 6、 x7M SSUB8、 SSUB16、 SSAX 並列符号付 き 算術演算 (ページ 4-106) 6、 x7M STC コ プ ロ セ ッ サ ス ト ア命令 (ページ 4-138) x6M STC2 コ プ ロ セ ッ サ ス ト ア命令 (ページ 4-138) 5、 x6M STM 多重レ ジ ス タ ス ト ア (ページ 4-29) すべて STR レジス タ ス ト ア (ページ 4-10) すべて ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-7 ARM 命令 と Thumb 命令 表 4-1 命令の参照ページ (続き) ニーモニ ッ ク 概要 ページ アーキテ クチャ a STREX 排他的レ ジ ス タ ス ト ア (ページ 4-40) 6、 x6M STREXB、 STREXH 排他的レ ジ ス タ ス ト ア (バ イ ト 、 ハーフ ワ ー ド ) (ページ 4-40) K、 x6M STREXD 排他的レ ジ ス タ ス ト ア (ダブル ワ ー ド ) (ページ 4-40) K、 x7M SUB 減算 (ページ 4-51) すべて SUBS pc, lr ス タ ッ ク を行わない例外か ら の復帰命令 (ページ 4-56) T2、 x7M SVC (以前は SWI) スーパーバ イ ザ コ ール (ページ 4-142) すべて SWP、 SWPB レ ジ ス タ と メ モ リ 間の ス ワ ッ プ (ARM のみ) (ページ 4-44) すべて、 x7M SXTB, SXTB16, SXTH 符号付 き 拡張 (ページ 4-117) 6 SXTAB, SXTAB16, SXTAH 加算オプシ ョ ン付 き の符号拡張 (ページ 4-117) 6、 x7M TBB、 TBH テーブル分岐バ イ ト 、 ハーフ ワ ー ド (ページ 4-131) T2 TEQ、 TST 等価テ ス ト 、 テ ス ト (ページ 4-68) すべて UADD8、 UADD16、 UASX 並列符号な し 算術演算 (ページ 4-106) 6、 x7M UDIV 符号な し 除算 (ページ 4-76) 7M、 7R UHADD8、 UHADD16、 並列符号な し 半演算 (ページ 4-106) 6、 x7M 符号な し 積和累算 long (ページ 4-97) 6、 x7M (ページ 4-81) x6M 並列符号な し サチ ュ レー ト 算術演算 (ページ 4-106) 6、 x7M 符号な し 絶対差の和 (ページ 4-109) 6、 x7M UHASX、 UHSUB8、 UHSUB16、 UHSAX UMAAL (64 <= 32 + 32 + 32 x 32) UMLAL、 UMULL 符号な し 積和、 乗算 (64 <= 32 x 32 + 64)、 (64 <= 32 x 32) UQADD8、 UQADD16、 UQASX、 UQSUB8、 UQSUB16、 UQSAX USAD8 4-8 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 表 4-1 命令の参照ページ (続き) ニーモニ ッ ク 概要 ページ アーキテ クチャ a USADA8 符号な し 絶対差の和の累算 (ページ 4-109) 6、 x7M USAT 符号な し サチ ュ レー ト 演算 (ページ 4-103) 6、 x6M USAT16 符号な し 並列ハーフ ワー ド サチ ュ レー ト 演算 (ページ 4-111) 6、 x7M USUB8、 USUB16、 USAX 並列符号な し 算術演算 (ページ 4-106) 6、 x7M UXTB, UXTB16, UXTH 符号な し 拡張 (ページ 4-117) 6 UXTAB, UXTAB16, UXTAH 任意で加算を伴 う 符号な し 拡張 (ページ 4-117) 6、 x7M V* 第 5 章 NEON と VFP プ ロ グ ラ ミ ン グ を参照 し て下 さ い。 WFE、 WFI、 YIELD イ ベン ト 待機、 割 り 込み待機、 明け渡 し (ページ 4-152) T2、 6M a. アーキ テ ク チ ャ 欄のエン ト リ は次の意味を持ち ます。 すべて ARM アーキ テ ク チ ャ のすべてのバージ ョ ンで使用で き る 命令です。 5 ARMv5T*、 ARMv6*、 お よ び ARMv7 アーキ テ ク チ ャ で使用で き る 命令です。 5E ARMv5TE、 ARMv6*、 お よ び ARMv7 アーキ テ ク チ ャ で使用で き る 命令です。 6 ARMv6* お よ び ARMv7 アーキ テ ク チ ャ で使用で き る 命令です。 6M ARMv6-M お よ び ARMv7 アーキ テ ク チ ャ で使用で き る 命令です。 x6M ARMv6-M プ ロ フ ァ イ ルでは使用で き ない命令です。 7 ARMv7 アーキ テ ク チ ャ で使用で き る 命令です。 7M ARMv7-M プ ロ フ ァ イ ルで使用で き る 命令です。 x7M ARMv6-M と ARMv7-M プ ロ フ ァ イ ルでは使用で き ない命令です。 7R ARMv7-R プ ロ フ ァ イ ルで使用で き る 命令です。 7MP マルチプ ロ セ ス拡張を実装 し た ARMv7 アーキ テ ク チ ャ で使用で き る 命令です。 EE ARM アーキ テ ク チ ャ の ThumbEE バ リ ア ン ト で使用で き る 命令です。 J ARMv5TEJ、 ARMv6*、 お よ び ARMv7 アーキ テ ク チ ャ で使用で き る 命令です。 K ARMv6K お よ び ARMv7 アーキ テ ク チ ャ で使用で き る 命令です。 T ARMv4T、 ARMv5T*、 ARMv6*、 お よ び ARMv7 アーキ テ ク チ ャ で使用で き る 命令です。 T2 ARMv6T2 以上のアーキ テ ク チ ャ で使用で き る 命令です。 XScale ARM アーキ テ ク チ ャ の XScale バージ ョ ンで使用で き る 命令です。 Z Security Extensions が実装 さ れてい る 場合に使用で き る 命令です。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-9 ARM 命令 と Thumb 命令 4.2 メ モ リ ア ク セス命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ンか ら 構成 さ れてい ます。 • 「ア ド レ ス境界調整」 (ページ 4-11) すべての メ モ リ ア ク セ ス命令に該当す る 、 境界調整の考慮事項です。 • 「LDR と STR ( イ ミ デ ィ エー ト オ フ セ ッ ト )」 (ページ 4-12) イ ミ デ ィ エー ト オ フ セ ッ ト 、 プ レ イ ンデ ク ス イ ミ デ ィ エー ト オ フ セ ッ ト 、 ま たはポ ス ト イ ンデ ク ス イ ミ デ ィ エー ト オ フ セ ッ ト を使っ た ロ ー ド と ス ト ア。 • 「LDR と STR (レ ジ ス タ オ フ セ ッ ト )」 (ページ 4-16) レ ジ ス タ オ フ セ ッ ト 、 プ レ イ ンデ ク ス レ ジ ス タ オ フ セ ッ ト 、 ま たはポ ス ト イ ンデ ク ス レ ジ ス タ オ フ セ ッ ト を使っ た ロ ー ド と ス ト ア。 • 「LDR と STR (ユーザモー ド )」 (ページ 4-18) ユーザモー ド での ロ ー ド と ス ト ア。 • 「LDR (pc 相対)」 (ページ 4-21) レ ジ ス タ ロ ー ド 命令です。 ア ド レ ス は、 プ ロ グ ラ ム カ ウ ン タ か ら のオ フ セ ッ ト です。 • 「ADR」 (ページ 4-24) プ ロ グ ラ ム相対ア ド レ ス ま たは レ ジ ス タ 相対ア ド レ ス を ロ ー ド を実行す る 命令です。 • 「PLD、 PLDW、 PLI」 (ページ 4-26) ア ド レ ス のプ リ ロ ー ド を実行す る 命令です。 • 「LDM、 STM」 (ページ 4-29) 多重レ ジ ス タ ロ ー ド / ス ト ア命令です。 • 「PUSH お よ び POP」 (ページ 4-33) Lo レ ジ ス タ と lr (オプシ ョ ン) を ス タ ッ ク にプ ッ シ ュ す る 命令です。 Lo レ ジ ス タ と pc (オプシ ョ ン) を ス タ ッ ク か ら ポ ッ プす る 命令です。 • 「RFE」 (ページ 4-35) 例外か ら 復帰す る 命令です。 • 4-10 「SRS」 (ページ 4-38) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 復帰状態を ス ト アす る 命令です。 • 「LDREX と STREX」 (ページ 4-40) 排他的レ ジ ス タ ロ ー ド / ス ト ア命令です。 • 「CLREX」 (ページ 4-43) 排他を ク リ アす る 命令です。 • 「SWP と SWPB」 (ページ 4-44) レ ジ ス タ と メ モ リ 間のデー タ ス ワ ッ プ命令です。 注 LDR 疑似命令 も あ り ます (「LDR 疑似命令」 (ページ 4-170) を参照)。 こ の疑似 命令を アセ ン ブルす る こ と に よ っ て、 LDR 命令、 MOV 命令、 ま たは MVN 命令が生 成 さ れ ます。 4.2.1 ア ド レ ス境界調整 ほ と ん ど の場合、 4 バ イ ト 転送のア ド レ ス は 4 バ イ ト 境界で、 2 バ イ ト 転送の ア ド レ ス は 2 バ イ ト 境界で整列 さ れてい る 必要があ り ます。 ARMv6T2 以降で は、 非境界整列ア ク セ ス が許可 さ れます。 ARMv7 以降では、 非境界整列ア ク セ ス が義務付け ら れてい ます (デフ ォ ル ト )。 ARMv6 以前では、 シ ス テ ムにシ ス テ ム コ プ ロ セ ッ サ (cp15) が存在す る 場合 に境界調整チ ェ ッ ク を イ ネーブルにで き ます。 境界調整チ ェ ッ ク が イ ネーブ ル さ れてい る 場合、 ワー ド 境界で整列 さ れていない 32 ビ ッ ト 転送が行われ る と 、 境界調整例外が発生 し ます。 すべてのア ク セ ス が境界調整 さ れてい る 場合、 コ マ ン ド ラ イ ン オプシ ョ ン --no_unaligned_access を使っ て境界調整 さ れていない ラ イ ブ ラ リ 関数への リ ン ク を避け る こ と がで き ます。 シ ス テ ムにシ ス テ ム コ プ ロ セ ッ サ (cp15) が存在 し ないか、 境界調整チ ェ ッ ク がデ ィ セーブル さ れてい る 場合、 以下の よ う にな り ます。 ARM DUI 0204IJ • STR では、 指定 さ れたア ド レ ス が 4 の倍数に切 り 捨て ら れ ます。 • LDR の場合 : 1. 指定 さ れた ア ド レ ス が 4 の倍数に切 り 捨て ら れ ます。 2. 切 り 捨て後のア ド レ ス か ら 4 バ イ ト のデー タ が ロ ー ド さ れ ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-11 ARM 命令 と Thumb 命令 3. ロ ー ド さ れたデー タ が、 ア ド レ ス のビ ッ ト [1:0] に応 じ て 1 バ イ ト 、 2 バ イ ト 、 ま たは 3 バ イ ト 分右に ロ テー ト さ れ ます。 こ の場合、 リ ト ルエ ンデ ィ ア ン メ モ リ シ ス テ ム では、 指定 さ れたバ イ ト が レ ジ ス タ の最下位バ イ ト に入れ ら れ ます。 ビ ッ グエ ンデ ィ ア ン メ モ リ シ ス テ ム では、 指定 さ れたバ イ ト が以下の よ う に レ ジ ス タ に入れ ら れ ます。 4.2.2 — ア ド レ ス のビ ッ ト 0 が 0 の場合、 レ ジ ス タ のビ ッ ト [31:24] に入れ ら れます。 — ア ド レ ス のビ ッ ト 0 が 1 の場合、 レ ジ ス タ の ビ ッ ト [15:8] に入れ ら れます。 LDR と STR (イ ミ デ ィ エー ト オ フ セ ッ ト ) イ ミ デ ィ エー ト オ フ セ ッ ト 、 プ レ イ ンデ ク ス イ ミ デ ィ エー ト オ フ セ ッ ト 、 ま たはポ ス ト イ ンデ ク ス イ ミ デ ィ エー ト オ フ セ ッ ト を使っ た ロ ー ド と ス ト ア。 構文 op{type}{cond} Rt, [Rn {, #offset}] ; immediate offset op{type}{cond} Rt, [Rn, #offset]! ; pre-indexed op{type}{cond} Rt, [Rn], #offset ; post-indexed opD{cond} Rt, Rt2, [Rn {, #offset}] ; immediate offset, doubleword opD{cond} Rt, Rt2, [Rn, #offset]! ; pre-indexed, doubleword opD{cond} Rt, Rt2, [Rn], #offset ; post-indexed, doubleword 各項目には以下の意味があ り ます。 op 次のいずれか を指定で き ます。 LDR レジス タ ロー ド STR レジス タ ス ト ア type 次のいずれか を指定で き ます。 B 符号な し バ イ ト ( ロ ー ド 時に 32 ビ ッ ト にゼ ロ 拡張) SB 符号付 き バ イ ト (LDR のみ。 32 ビ ッ ト に符号拡張) H 符号な し ハーフ ワ ー ド ( ロ ー ド 時に 32 ビ ッ ト にゼ ロ 拡 張) 符号付 き ハーフ ワ ー ド (LDR のみ。 32 ビ ッ ト に符号拡 張) SH 4-12 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 - 省略 (ワ ー ド ) cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rt ロ ー ド ま たは ス ト アす る レ ジ ス タ を指定 し ます。 Rn メ モ リ ア ド レ ス のベース と な る レ ジ ス タ を指定 し ます。 offset オ フ セ ッ ト を指定 し ます。 offset が省略 さ れ る と 、 ア ド レ ス は Rn の内容 と な り ます。 Rt2 ダブル ワー ド の ロ ー ド / ス ト アで使用す る 追加の レ ジ ス タ を指定 し ます。 命令セ ッ ト やアーキ テ ク チ ャ に よ っ ては、 一部のオプシ ョ ン を使用で き ない 場合があ り ます。 詳細については、 「オ フ セ ッ ト の範囲 と アーキ テ ク チ ャ 」 (ページ 4-14) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-13 ARM 命令 と Thumb 命令 オ フ セ ッ ト の範囲 と アーキテ ク チ ャ 表 4-2 はオ フ セ ッ ト の範囲 と こ れ ら の命令の使用可否を示 し ます。 表 4-2 オ フ セ ッ ト と アーキテ ク チ ャ 、 LDR/STR、 ワー ド 、 ハー フ ワー ド 、 バイ ト イ ミ デ ィ エー ト オフセ ッ ト プ レ イ ンデ ク ス ポス ト イ ンデ クス アーキテ クチャ –4095 ~ 4095 –4095 ~ 4095 –4095 ~ 4095 すべて ARM、 符号付 き バ イ ト 、 ハーフ ワー ド 、 符号付 き ハーフ ワー ド –255 ~ 255 –255 ~ 255 –255 ~ 255 すべて ARM、 ダブル ワー ド –255 ~ 255 –255 ~ 255 –255 ~ 255 v5TE + 32 ビ ッ ト Thumb、 ワ ー ド 、 ハーフ ワ ー ド 、 符号付 き ハーフ ワー ド 、 バ イ ト 、 符号付 き バ イ ト a –255 ~ 4095 –255 ~ 255 –255 ~ 255 v6T2、 v7 32 ビ ッ ト Thumb、 ダブル ワ ー ド –1020 ~ 1020 c –1020 ~ 1020 c –1020 ~ 1020 c v6T2、 v7 16 ビ ッ ト Thumb、 ワ ー ド b 0 ~ 124 c 該当な し 該当な し すべての T 16 ビ ッ ト Thumb、 符号な し ハーフ ワ ー ドb 0 ~ 62 d 該当な し 該当な し すべての T 16 ビ ッ ト Thumb、 符号な し バ イ ト 0 ~ 31 該当な し 該当な し すべての T 16 ビ ッ ト Thumb、 ワ ー ド 、 Rn は r13 e 0 ~ 1020 c 該当な し 該当な し すべての T 16 ビ ッ ト ThumbEE、 ワ ー ド –28 ~ 124 c 該当な し 該当な し T-2EE 16 ビ ッ ト ThumbEE、 ワ ー ド 、 Rn は r9 e 0 ~ 252 c 該当な し 該当な し T-2EE 16 ビ ッ ト ThumbEE、 ワー ド 、 Rn は r10 e 0 ~ 124 c 該当な し 該当な し T-2EE 命令 ARM、 ワー ド ま たはバ イ ト a b b a. ワー ド の ロ ー ド では Rt に pc を指定で き ます。 pc (プ ロ グ ラ ム カ ウ ン タ ) への ロ ー ド を実行す る と 、 ロ ー ド さ れた ア ド レ ス にあ る 命令への分岐が発生 し ます。 ARMv4 では、 ロ ー ド さ れた ア ド レ ス の ビ ッ ト [1:0] は 0b00 にな っ て い る 必要があ り ます。 ARMv5 以降のバージ ョ ンでは、 ビ ッ ト [1:0] が 0b10 であ っ てはな り ません。 ビ ッ ト [0] が 1 にな っ てい る 場合、 Thumb 状態で実行が継続 さ れます。 そ う でなければ、 ARM 状態で継続 さ れます。 b. Rt と Rn には r0 ~ r7 の範囲の レ ジ ス タ を指定す る 必要があ り ます。 c. 4 の倍数 d. 必ず 2 の倍数 e. Rt には、 r0 ~ r7 の範囲の レ ジ ス タ を指定す る 必要があ り ます。 4-14 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 ダ ブルワー ド レ ジ ス タ の制約条件 Thumb-2 命令の場合、 Rt ま たは Rt2 に sp ま たは pc は指定で き ません。 ARM 命令には、 以下の制約条件が適用 さ れ ます。 • Rt には偶数番号の レ ジ ス タ を指定す る 必要があ り ます。 • Rt に lr は指定で き ません。 • r12 を Rt に使用 し ない こ と を強 く お勧め し ます。 • Rt2 は R(t + 1). でなければな り ません。 サン プル LDR LDRNE STR ARM DUI 0204IJ r8,[r10] r2,[r5,#960]! ; ; ; ; r2,[r9,#consta-struc] loads r8 from the address in r10. (conditionally) loads r2 from a word 960 bytes above the address in r5, and increments r5 by 960. ; consta-struc is an expression evaluating ; to a constant in the range 0-4095. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-15 ARM 命令 と Thumb 命令 4.2.3 LDR と STR (レ ジ ス タ オ フ セ ッ ト ) レ ジ ス タ オ フ セ ッ ト 、 プ レ イ ンデ ク ス レ ジ ス タ オ フ セ ッ ト 、 ま たはポ ス ト イ ンデ ク ス レ ジ ス タ オ フ セ ッ ト を使っ た ロ ー ド と ス ト ア。 構文 op{type}{cond} Rt, [Rn, +/-Rm {, shift}] ; register offset op{type}{cond} Rt, [Rn, +/-Rm {, shift}]! ; pre-indexed op{type}{cond} Rt, [Rn], +/-Rm {, shift} ; post-indexed opD{cond} Rt, Rt2, [Rn, +/-Rm {, shift}] ; register offset, doubleword opD{cond} Rt, Rt2, [Rn, +/-Rm {, shift}]! ; pre-indexed, doubleword opD{cond} Rt, Rt2, [Rn], +/-Rm {, shift} ; post-indexed, doubleword 各項目には以下の意味があ り ます。 op 次のいずれか を指定で き ます。 LDR レジス タ ロー ド STR レジス タ ス ト ア type 次のいずれか を指定で き ます。 B 符号な し バ イ ト ( ロ ー ド 時に 32 ビ ッ ト にゼ ロ 拡張) SB 符号付 き バ イ ト (LDR のみ。 32 ビ ッ ト に符号拡張) H 符号な し ハーフ ワ ー ド ( ロ ー ド 時に 32 ビ ッ ト にゼ ロ 拡 張) 符号付 き ハーフ ワ ー ド (LDR のみ。 32 ビ ッ ト に符号拡 張) 省略 ( ワー ド ) SH - 4-16 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rt ロ ー ド ま たは ス ト アす る レ ジ ス タ を指定 し ます。 Rn メ モ リ ア ド レ ス のベース と な る レ ジ ス タ を指定 し ます。 Rm オ フ セ ッ ト と し て使用 さ れ る 値を保持す る レ ジ ス タ を指定 し ま す。 Rm に r15 は指定で き ません。–Rm は Thumb コ ー ド では使用で き ません。 shift 任意に指定で き る シ フ ト です。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 ダブル ワー ド の ロ ー ド / ス ト アで使用す る 追加の レ ジ ス タ を指定 し ます。 Rt2 命令セ ッ ト やアーキ テ ク チ ャ に よ っ ては、 一部のオプシ ョ ン を使用で き ない 場合があ り ます。 詳細については、 「オ フ セ ッ ト レ ジ ス タ と シ フ ト オプシ ョ ン」 を参照 し て下 さ い。 オ フ セ ッ ト レ ジ ス タ と シ フ ト オプ シ ョ ン 表 4-3 はオ フ セ ッ ト の範囲 と こ れ ら の命令の使用可否を示 し ます。 表 4-3 オプ シ ョ ン と アーキテ ク チ ャ 、 LDR/STR (レ ジ ス タ オ フ セ ッ ト ) 命令 ARM、 ワー ド ま たはバ イ ト b アーキテ クチャ +/–Rm a シフ ト +/–Rm LSL #0-31 LSR #1-32 ASR #1-32 ROR #1-31 すべて RRX ARM、 符号付 き バ イ ト 、 ハーフ ワー ド 、 符号付 き ハーフ ワ ー ド +/–Rm 該当な し すべて ARM、 ダブル ワー ド +/–Rm 該当な し v5TE + 32 ビ ッ ト Thumb、 ワー ド 、 ハーフ ワー ド 、 符号 付 き ハーフ ワ ー ド 、 バ イ ト 、 符号付 き バ イ ト b +Rm LSL #0-3 v6T2、 v7 32 ビ ッ ト Thumb、 ダブル ワー ド +Rm 該当な し v6T2、 v7 16 ビ ッ ト Thumb、 すべて c +Rm 該当な し すべての T +Rm LSL #2 (必須) T-2EE +Rm LSL #1 (必須) T-2EE +Rm 該当な し T-2EE 16 ビ ッ ト ThumbEE、 ワー ド b 16 ビ ッ ト ThumbEE、 ハーフ ワー ド 、 符号付 き ハーフ ワ ー ド b 16 ビ ッ ト ThumbEE、 バ イ ト 、 符号付 き バ イ ト b a. +/–Rm と な っ てい る と こ ろでは、 –Rm、 +Rm、 ま たは Rm を使用で き ます。 +Rm と な っ てい る と こ ろ では、 –Rm を使用で き ません。 b. ワー ド の ロ ー ド では Rt に pc を指定で き ます。 pc (プ ロ グ ラ ム カ ウ ン タ ) への ロ ー ド を実行す る と 、 ロ ー ド さ れた ア ド レ ス にあ る 命令への分岐が発生 し ます。 ARMv4 では、 ロ ー ド さ れた ア ド レ ス の ビ ッ ト [1:0] は 0b00 にな っ て い る 必要があ り ます。 ARMv5 以降のバージ ョ ンでは、 ビ ッ ト [1:0] が 0b10 であ っ てはな り ません。 ビ ッ ト [0] が 1 にな っ てい る 場合、 Thumb 状態で実行が継続 さ れます。 そ う でなければ、 ARM 状態で継続 さ れます。 c. Rt、 Rn、 お よ び Rm はどれ も r0-r7 の範囲に し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-17 ARM 命令 と Thumb 命令 ダ ブルワー ド レ ジ ス タ の制約条件 Thumb-2 命令の場合、 Rt ま たは Rt2 に sp ま たは pc は指定で き ません。 ARM 命令には、 以下の制約条件が適用 さ れ ます。 4.2.4 • Rt には偶数番号の レ ジ ス タ を指定す る 必要があ り ます。 • Rt に lr は指定で き ません。 • r12 を に使用 し ない こ と を強 く お勧め し ます。 Rt • Rt2 は でなければな り ません。 R(t + 1). LDR と STR (ユーザモー ド ) ユーザモー ド のア ク セ ス権でバ イ ト 、 ハーフ ワ ー ド 、 ま たは ワ ー ド を ロ ー ド / ス ト ア し ます。 こ れ ら の命令が特権モー ド で実行 さ れ る と 、 ユーザモー ド で実行 し た と き と 同 じ 制約条件で メ モ リ にア ク セ ス し ます。 こ れ ら の命令は、 ユーザモー ド で も 通常の メ モ リ ア ク セ ス と ま っ た く 同様に 動作 し ます。 構文 op{type}T{cond} Rt, [Rn {, #offset}] ; immediate offset (Thumb-2 only) op{type}T{cond} Rt, [Rn] {, #offset} ; post-indexed (ARM only) op{type}T{cond} Rt, [Rn], +/-Rm {, shift} ; post-indexed (register) (ARM only) 各項目には以下の意味があ り ます。 op 次のいずれか を指定で き ます。 LDR レジス タ ロー ド STR レジス タ ス ト ア type 次のいずれか を指定で き ます。 B 符号な し バ イ ト ( ロ ー ド 時に 32 ビ ッ ト にゼ ロ 拡張) SB 符号付 き バ イ ト (LDR のみ。 32 ビ ッ ト に符号拡張) H 符号な し ハーフ ワ ー ド ( ロ ー ド 時に 32 ビ ッ ト にゼ ロ 拡 張) 符号付 き ハーフ ワ ー ド (LDR のみ。 32 ビ ッ ト に符号拡 張) 省略 ( ワー ド ) SH - 4-18 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 ARM DUI 0204IJ cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rt ロ ー ド ま たは ス ト アす る レ ジ ス タ を指定 し ます。 Rn メ モ リ ア ド レ ス のベース と な る レ ジ ス タ を指定 し ます。 offset オ フ セ ッ ト を指定 し ます。 オ フ セ ッ ト を指定 し なか っ た場合、 ア ド レ ス は Rn 内の値にな り ます。 Rm オ フ セ ッ ト と し て使用 さ れ る 値を保持す る レ ジ ス タ を指定 し ま す。 Rm に r15 は指定で き ません。 shift 任意に指定で き る シ フ ト です。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-19 ARM 命令 と Thumb 命令 オ フ セ ッ ト の範囲 と アーキテ ク チ ャ 表 4-2 (ページ 4-14) はオ フ セ ッ ト の範囲 と こ れ ら の命令の使用可否を示 し ま す。 表 4-4 オ フ セ ッ ト と アーキテ ク チ ャ、 LDR/STR (ユーザモー ド ) 命令 イ ミ デ ィ エー ト オフセッ ト ポス ト イ ンデ ク ス +/–Rm a シフ ト アーキ テク チャ ARM、 ワ ー ド 、 バ イ ト 該当な し –4095 ~ 4095 +/–Rm LSL #0-31 すべて LSR #1-32 ASR #1-32 ROR #1-31 RRX ARM、 符号付 き バ イ ト 、 ハーフ ワ ー ド 、 符号付 き ハーフ ワ ー ド 該当な し –255 ~ 255 +/–Rm 32 ビ ッ ト Thumb、 ワー ド 、 ハー フ ワ ー ド 、 符号付 き ハーフ ワ ー ド 、 バ イ ト 、 符号付 き バ イ ト 0 ~ 255 該当な し 該当な し 該当な し すべて v6T2、 v7 a. –Rm、 +Rm、 ま たは Rm を使用で き ます。 4-20 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.2.5 LDR (pc 相対) レ ジ ス タ ロ ー ド 命令です。 ア ド レ ス は、 プ ロ グ ラ ム カ ウ ン タ か ら のオ フ セ ッ ト です。 注 「疑似命令」 (ページ 4-165) も 参照 し て下 さ い。 構文 LDR{type}{cond}{.W} Rt, label LDRD{cond} Rt, Rt2, label ; Doubleword 各項目には以下の意味があ り ます。 type 次のいずれか を指定で き ます。 B 符号な し バ イ ト ( ロ ー ド 時に 32 ビ ッ ト にゼ ロ 拡張) SB 符号付 き バ イ ト (LDR のみ。 32 ビ ッ ト に符号拡張) H 符号な し ハーフ ワー ド ( ロ ー ド 時に 32 ビ ッ ト にゼ ロ 拡 張) 符号付 き ハーフ ワー ド (LDR のみ。 32 ビ ッ ト に符号拡 張) 省略 (ワ ー ド ) SH cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 .W 任意に指定で き る 幅指定子を指定 し ます。 詳細については、 「Thumb-2 での LDR (pc 相対)」 (ページ 4-22) を参照 し て下 さ い。 Rt ロ ー ド ま たは ス ト アす る レ ジ ス タ を指定 し ます。 Rt2 2 番目に ロ ー ド ま たは ス ト アす る レ ジ ス タ を指定 し ます。 label プ ロ グ ラ ム相対式を指定 し ます。 詳細については、 「レ ジ ス タ 相 対式 と プ ロ グ ラ ム相対式」 (ページ 3-39) を参照 し て下 さ い。 label は現在の命令か ら 限定 さ れた距離にあ る 必要があ り ます。 詳細については、 「オ フ セ ッ ト の範囲 と アーキ テ ク チ ャ 」 (ペー ジ 4-22) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-21 ARM 命令 と Thumb 命令 オ フ セ ッ ト の範囲 と アーキテ ク チ ャ アセ ン ブ ラ は、 プ ロ グ ラ ム カ ウ ン タ か ら オ フ セ ッ ト を算出 し ます。 label が範 囲外であ る 場合、 アセ ン ブ ラ はエ ラ ーを生成 し ます。 表 4-5 は ラ ベル と 現在の命令 と の間の可能なオ フ セ ッ ト を示 し ます。 表 4-5 pc 相対オ フ セ ッ ト 命令 オフセッ ト範 囲 アーキテ ク チ ャ ARM LDR、 LDRB、 LDRSB、 LDRH、 LDRSH a +/– 4095 すべて ARM LDRD +/– 255 v5TE + 32 ビ ッ ト Thumb LDR、 LDRB、 LDRSB、 LDRH、 +/– 4095 v6T2、 v7 32 ビ ッ ト Thumb LDRD +/– 1020 b v6T2、 v7 16 ビ ッ ト Thumb LDR c 0-1020 b すべての T LDRSH a a. ワー ド の ロ ー ド では Rt に pc を指定で き ます。 pc (プ ロ グ ラ ム カ ウ ン タ ) への ロ ー ド を実行す る と 、 ロ ー ド さ れた ア ド レ ス にあ る 命令への分岐が発生 し ます。 ARMv4 では、 ロ ー ド さ れた ア ド レ ス の ビ ッ ト [1:0] は 0b00 にな っ てい る 必要があ り ます。 ARMv5 以降のバージ ョ ンでは、 ビ ッ ト [1:0] が 0b10 であ っ てはな り ません。 ビ ッ ト [0] が 1 にな っ てい る 場合、 Thumb 状態で実行が継続 さ れます。 そ う でなければ、 ARM 状態で継続 さ れます。 b. (4 の倍数で指定 し て下 さ い) c. Rt には、 r0 ~ r7 の範囲の レ ジ ス タ を指定す る 必要があ り ます。 バ イ ト 、 ハーフ ワー ド 、 ダブル ワー ド の 16 ビ ッ ト 命令はあ り ません。 Thumb-2 での LDR (pc 相対) .W 幅指定子を使用 し て、 LDR で Thumb-2 コ ー ド の 32 ビ ッ ト 命令を生成す る こ と がで き ます。 LDR.W が、 16 ビ ッ ト LDR 命令を使用で き る タ ーゲ ッ ト の場合で も 、 常に 32 ビ ッ ト 命令を生成 し ます。 参考 と し て、 32 ビ ッ ト Thumb-2 の LDR 命令が使用で き る タ ーゲ ッ ト で失敗が 発生 し て も 、 .W 指定な し の LDR が常に 16 ビ ッ ト Thumb コ ー ド の命令を生成 し ます。。 ダ ブルワー ド レ ジ ス タ の制約条件 Thumb-2 命令の場合、 Rt ま たは Rt2 に sp ま たは pc は指定で き ません。 4-22 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 ARM 命令には、 以下の制約条件が適用 さ れ ます。 ARM DUI 0204IJ • Rt には偶数番号の レ ジ ス タ を指定す る 必要があ り ます。 • Rt に lr は指定で き ません。 • r12 を に使用 し ない こ と を強 く お勧め し ます。 Rt • Rt2 は でなければな り ません。 R(t + 1). Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-23 ARM 命令 と Thumb 命令 4.2.6 ADR ADR は即値を pc 値に加算 し 、 その結果をデス テ ィ ネーシ ョ ン レ ジ ス タ に書 き 込みます。 構文 ADR{cond}{.W} Rd,label 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 .W 任意に指定で き る 幅指定子を指定 し ます。 詳細については、 「Thumb-2 の ADR」 (ページ 4-25) を参照 し て下 さ い。 Rd ロ ー ド す る レ ジ ス タ を指定 し ます。 label プ ロ グ ラ ム相対式を指定 し ます。 詳細については、 「レ ジ ス タ 相 対式 と プ ロ グ ラ ム相対式」 (ページ 3-39) を参照 し て下 さ い。 label は現在の命令か ら 限定 さ れた距離にあ る 必要があ り ます。 詳細については、 「オ フ セ ッ ト の範囲 と アーキ テ ク チ ャ 」 (ペー ジ 4-25) を参照 し て下 さ い。 使用法 ADR は、 ア ド レ ス がプ ロ グ ラ ム相対ま たは レ ジ ス タ 相対であ る ため、 位置非依 存 コ ー ド を生成 し ます。 よ り 広範囲の有効な ア ド レ ス を アセ ン ブルす る には、 ADRL 疑似命令を使用 し ます (「ADRL 疑似命令」 (ページ 4-166) を参照)。 label がプ ロ グ ラ ム相対であ る 場合は、 ADR 命令 と 同 じ アセ ン ブ ラ 領域内のア ド レ ス を指定す る 必要があ り ます (「AREA」 (ページ 7-81) を参照)。 BX ま たは BLX 命令の タ ーゲ ッ ト を生成す る ために ADR を使用す る と き は、 タ ー ゲ ッ ト に Thumb 命令が含ま れてい る 場合、 そのア ド レ ス の Thumb ビ ッ ト (ビ ッ ト 0) を設定す る 必要があ り ます。 4-24 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 オ フ セ ッ ト の範囲 と アーキテ ク チ ャ アセ ン ブ ラ は、 プ ロ グ ラ ム カ ウ ン タ か ら オ フ セ ッ ト を算出 し ます。 label が範 囲外であ る 場合、 アセ ンブ ラ はエ ラ ーを生成 し ます。 表 4-5 (ページ 4-22) は ラ ベル と 現在の命令 と の間の可能なオ フ セ ッ ト を示 し ます。 表 4-6 pc 相対オ フ セ ッ ト 命令 オ フ セ ッ ト 範囲 アーキテ ク チ ャ ARM ADR 「Operand2 の定数」 (ページ 4-48) を参照 すべて し て下 さ い。 32 ビ ッ ト Thumb +/– 4095 v6T2、 v7 0-1020 b すべての T ADR 16 ビ ッ ト Thumb ADR a a. Rd には、 r0 ~ r7 の範囲の レ ジ ス タ を指定す る 必要があ り ます。 b. (4 の倍数で指定 し て下 さ い) Thumb-2 の ADR .W 幅指定子を使用 し て、 ADR で Thumb-2 コ ー ド の 32 ビ ッ ト 命令を生成す る こ と がで き ます。 .W を指定 し て ADR 命令を使用す る 場合、 16 ビ ッ ト 命令でア ド レ ス を生成で き る 場合で も 、 常に 32 ビ ッ ト 命令が生成 さ れ ます。 参考 と し て、 .W 指定な し の ADR には、 常に 16 ビ ッ ト の Thumb コ ー ド が生成 さ れ ます。 ただ し 、 生成 さ れた 16 ビ ッ ト 命令では、 32 ビ ッ ト Thumb-2 ADD 命令 で生成で き る ア ド レ ス を生成で き ない場合があ り ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-25 ARM 命令 と Thumb 命令 4.2.7 PLD、 PLDW、 PLI デー タ と 命令を プ リ ロ ー ド す る 命令です。 プ ロ セ ッ サは、 ア ド レ ス か ら デー タ ま たは命令の ロ ー ド が実行 さ れ る こ と を メ モ リ シ ス テ ムに事前に通知す る こ と がで き ます。 構文 PLtype{cond} [Rn {, #offset}] PLtype{cond} [Rn, +/-Rm {, shift}] PLtype{cond} label 各パ ラ メ ー タ には以下の意味があ り ます。 以下のいずれか を指定で き ます。 D デー タ ア ド レ ス DW 書 き 込むためのデー タ ア ド レ ス I 命令ア ド レ ス type 構文で label が指定 さ れてい る 場合、 type を DW にす る こ と はで き ません。 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 cond 注 cond を指定で き る のは、 Thumb-2 コ ー ド で、 前に IT 命令を使用 し た場合のみです。 こ の命令は、 ARM では無条件命令なので、 cond を使用 し ないで下 さ い。 4-26 Rn メ モ リ ア ド レ ス のベース と な る レ ジ ス タ を指定 し ます。 offset イ ミ デ ィ エー ト オ フ セ ッ ト を指定 し ます。 オ フ セ ッ ト を指定 し な か っ た場合、 ア ド レ ス は Rn 内の値にな り ます。 Rm オ フ セ ッ ト と し て使用 さ れ る 値を保持す る レ ジ ス タ を指定 し ま す。 Rm に r15 は指定で き ません。 Thumb 命令の場合、 Rm に r13 も 指定で き ません。 shift 任意に指定で き る シ フ ト です。 label プ ロ グ ラ ム相対式を指定 し ます。 詳細については、 「レ ジ ス タ 相 対式 と プ ロ グ ラ ム相対式」 (ページ 3-39) を参照 し て下 さ い。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 オ フ セ ッ ト の範囲 こ のオ フ セ ッ ト は、 プ リ ロ ー ド が発生す る 前に Rn の値に適用 さ れ ます。 その 結果は、 プ リ ロ ー ド 用の メ モ リ ア ド レ ス と し て使用 さ れ ます。 使用で き る オ フ セ ッ ト の範囲を以下に示 し ます。 • ARM 命令 : –4095 ~ +4095 • Thumb-2 命令 : -255 ~ +4095 (Rn が r15 でない場合) • Thumb-2 命令 : -4095 ~ +4095 (Rn が r15 であ る 場合) アセ ン ブ ラ は、 プ ロ グ ラ ム カ ウ ン タ か ら オ フ セ ッ ト を算出 し ます。 label が範 囲外であ る 場合、 アセ ンブ ラ はエ ラ ーを生成 し ます。 レ ジ ス タ オ フ セ ッ ト ま たはシ フ ト レ ジ ス タ オ フ セ ッ ト ARM では、 Rm の値は Rn の値に対 し て加算ま たは減算 さ れます。 Thumb-2 で は、 Rm の値は Rn の値に加算で き ますが、 減算はで き ません。 こ の結果は、 プ リ ロ ー ド 用の メ モ リ ア ド レ ス と し て使用 さ れます。 可能な シ フ ト の範囲を以下に示 し ます。 • Thumb-2 命令 : LSL #0 ~ #3 • ARM 命令 : 以下のいずれかの範囲 — LSL #0 ~ #31 — LSR #1 ~ #32 — ASR #1 ~ #32 — ROR #1 ~ #31 — RRX プ リ ロー ド 用のア ド レ ス境界調整 プ リ ロ ー ド 命令では、 境界調整チ ェ ッ ク は実行 さ れ ません。 アーキテ ク チ ャ ARM PLD は ARMv5TE 以降で使用で き ます。 32 ビ ッ ト Thumb PLD は ARMv6T2 以降で使用で き ます。 PLDW を使用で き る のは、 マルチプ ロ セ ス拡張を実装 し た ARMv7 以降だけで す。 PLI を使用で き る のは ARMv7 以降だけです。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-27 ARM 命令 と Thumb 命令 16 ビ ッ ト の Thumb PLD、 PLDW、 お よ び PLI 命令はあ り ません。 こ れ ら は ヒ ン ト 命令であ り 、 その実装はオプシ ョ ン です。 実装 さ れていない 場合、 NOP と し て実行 さ れ ます。 4-28 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.2.8 LDM、 STM 多重レ ジ ス タ ロ ー ド / ス ト ア命令です。 ARM 状態では レ ジ ス タ r0 ~ r15 の任 意の組み合わせを転送で き ますが、 Thumb 状態では制限がい く つかあ り ます。 「PUSH お よ び POP」 (ページ 4-33) も 参照 し て下 さ い。 構文 op{addr_mode}{cond} Rn{!}, reglist{^} 各項目には以下の意味があ り ます。 op 次のいずれか を指定で き ます。 LDM 複数の レ ジ ス タ を ロ ー ド し ます。 STM 複数の レ ジ ス タ を ス ト ア し ます。 addr_mode 以下のいずれか を指定 し ます。 IA 転送単位でア ド レ ス を ポ ス ト イ ン ク リ メ ン ト し ます。 こ れはデフ ォ ル ト 値なので、 省略で き ます。 IB 転送単位でア ド レ ス を プ レ イ ン ク リ メ ン ト し ます (ARM のみ)。 DA 転送単位でア ド レ ス を ポ ス ト デ ク リ メ ン ト し ます (ARM のみ)。 DB 転送単位でア ド レ ス を プ レデ ク リ メ ン ト し ます。 ス タ ッ ク 指向のア ド レ ッ シ ン グモー ド 接尾文字については、 表 2-9 (ページ 2-46) を参照 し て下 さ い。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rn ベース レ ジ ス タ です。 つま り 、 転送に使用す る 初期ア ド レ ス が 保持 さ れ る ARM レ ジ ス タ です。 Rn に r15 は指定で き ません。 ! 任意に指定で き る 接尾文字です。 ! を指定す る と 、 最終ア ド レ ス が Rn に ラ イ ト バ ッ ク さ れます。 reglist ロ ー ド ま たは ス ト アす る レ ジ ス タ の リ ス ト を中括弧で囲んで指 定 し ます。 レ ジ ス タ 範囲 も 指定で き ます。 複数の レ ジ ス タ ま たは レ ジ ス タ 範囲を指定す る 場合は、 コ ン マで区切 る 必要があ り ま す (「サンプル」 (ページ 4-32) を参照)。 詳細については、 「32 ビ ッ ト Thumb-2 命令の reglist に関す る制約 条件」 (ページ 4-31) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-29 ARM 命令 と Thumb 命令 ^ 4-30 任意に指定で き る 接尾文字です。 ARM 状態のみで使用で き ま す。 ユーザモー ド やシ ス テ ム モー ド では使用で き ません。 こ の接 尾文字には以下の目的があ り ます。 • 命令に (任意のア ド レ ッ シ ン グモー ド で) LDM を指定 し 、 reglist にプ ロ グ ラ ム カ ウ ン タ (r15) が含ま れてい る 場合、 通常の多重レ ジ ス タ 転送が行われ る だけでな く 、 SPSR が CPSR に コ ピー さ れます。 こ れは、 例外ハン ド ラ か ら の復帰 に必要です。 し たがっ て、 こ の接尾文字は必ず例外モー ド か ら 使用 し て下 さ い。 • 例外モー ド で使用 さ れない場合には、 現在のモー ド の レ ジ ス タ ではな く 、 ユーザモー ド の レ ジ ス タ と の間でデー タ 転 送が実行 さ れ ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 32 ビ ッ ト Thumb-2 命令の reglist に関する制約条件 32 ビ ッ ト Thumb-2 命令では、 以下の制約条件が適用 さ れ ます。 • SP を リ ス ト に含め る こ と はで き ません。 • STM 命令では、 プ ロ グ ラ ム カ ウ ン タ を リ ス ト に含め る こ と はで き ません。 • LDM 命令では、 プ ロ グ ラ ム カ ウ ン タ と lr を両方 と も リ ス ト に含め る こ と • はで き ません。 リ ス ト には複数の レ ジ ス タ を指定す る 必要があ り ます。 reglist に レ ジ ス タ が 1 つ し か指定 さ れていない STM ま たは LDM 命令を書いた場 合は、 自動的に同等の STR ま たは LDR 命令に書 き 換え ら れます。 逆アセ ン ブル リ ス ト と ソ ース コ ー ド を比較す る 場合は、 こ の点に注意 し て下 さ い。 アセ ン ブ ラ の --diag_warning 1645 コ マ ン ド ラ イ ン オプシ ョ ン を使用 し て、 命令 置換が発生 し たか確認で き ます。 16 ビ ッ ト 命令 Thumb-2 コ ー ド 、 お よ び Thumb-2 以前のプ ロ セ ッ サ上の Thumb コ ー ド では、 こ れ ら の命令のサブセ ッ ト の 16 ビ ッ ト バージ ョ ン を使用で き ます。 16 ビ ッ ト 命令には、 以下の制約条件が適用 さ れ ます。 • reglist に指定す る レ ジ ス タ はすべて Lo レ ジ ス タ であ る 必要があ り ま • Rn は Lo レ ジ ス タ であ る 必要があ り ます。 • addr_mode は省略す る (ま たは IA を指定す る ) 必要があ り ます。 つま り 、 • STM 命令に対 し て ラ イ ト バ ッ ク を指定す る 必要があ り ます。 • Rn が reglist にない場合、 LDM 命令に対 し て ラ イ ト バ ッ ク を指定す る 必要 す。 転送単位でア ド レ ス を ポ ス ト イ ン ク リ メ ン ト す る 必要があ り ます。 があ り ます。 ま た、 PUSH お よ び POP 命令を こ の形式で記述で き ます。 PUSH と POP の一部の形 式は、 16 ビ ッ ト 命令で も あ り ます。 詳細については、 「PUSH お よ び POP」 (ページ 4-33) を参照 し て下 さ い。 注 こ れ ら の 16 ビ ッ ト 命令は、 Thumb-2EE では使用で き ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-31 ARM 命令 と Thumb 命令 pc へのロー ド pc (プ ロ グ ラ ム カ ウ ン タ ) への ロ ー ド を実行す る と 、 ロ ー ド さ れた ア ド レ ス にあ る 命令への分岐が発生 し ます。 ARMv4 では、 ロ ー ド さ れた ア ド レ ス の ビ ッ ト [1:0] は 0b00 にな っ てい る 必要 があ り ます。 ARMv5T 以降には以下の よ う な特徴があ り ます • ビ ッ ト [1:0] は 0b10 にで き ません。 • ビ ッ ト [0] が 1 な ら 、 Thumb 状態で実行が継続 し ます。 • ビ ッ ト [0] が 0 な ら 、 ARM 状態で実行が継続 し ます。 ベース レ ジ ス タ のロー ド またはス ト ア と ラ イ ト バ ッ ク の使用 ARM コ ー ド ま たは Thumb-2 以前の Thumb コ ー ド では、 Rn が reglist に含まれ ていて、 ラ イ ト バ ッ ク が ! 接尾文字で指定 さ れてい る と 、 以下の よ う にな り ます。 • 命令に STM ま たは STMIA が指定 さ れ、 Rn が reglist 内で最 も 番号の小 さ い レ ジ ス タ であ る 場合は、 Rn の初期値が ス ト ア さ れます。 • 上記以外の場合は、 ロ ー ド ま たは ス ト ア さ れ る Rn の値を信頼で き ませ ん。 Thumb-2 コ ー ド では、 Rn が reglist に含ま れていて、 ラ イ ト バ ッ ク が ! 接尾文 字で指定 さ れてい る と 、 • すべての 32 ビ ッ ト 命令が予測不可能にな り ます。 • 16 ビ ッ ト 命令は Thumb-2 以前の Thumb コ ー ド の場合 と 同様に動作 し ま すが、 その使用は非推奨です。 サン プル LDM STMDB r8,{r0,r2,r9} ; LDMIA is a synonym for LDM r1!,{r3-r6,r11,r12} 誤用例 STM LDMDA 4-32 r5!,{r5,r4,r9} ; value stored for r5 unpredictable r2, {} ; must be at least one register in list Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.2.9 PUSH お よび POP 完全降順ス タ ッ ク に対 し て レ ジ ス タ のプ ッ シ ュ と ポ ッ プ を実行 し ます。 構文 PUSH{cond} reglist POP{cond} reglist 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 reglist は レ ジ ス タ の非空 リ ス ト で、 中括弧で囲まれ ます。 レ ジ ス タ 範 囲 も 中に含ま れます。 複数の レ ジ ス タ ま たは レ ジ ス タ 範囲を指定 す る 場合は、 コ ン マで区切 る 必要があ り ます。 使用法 PUSH と POP は、 ベース レ ジ ス タ が sp (r13) で、 調整 さ れた ア ド レ ス がベース レ ジ ス タ に ラ イ ト バ ッ ク さ れ る STMDB と LDM (ま たは LDMIA) の同 じ 意味です。 こ の よ う な場合は、 PUSH と POP ニーモニ ッ ク を使用す る のが適切です。 レ ジ ス タ は、 番号順に ス タ ッ ク に ス ト ア さ れ ます。 最 も 小 さ な番号の レ ジ ス タ が最下位ア ド レ ス に ス ト ア さ れ ます。 reglist にプ ロ グ ラ ム カ ウ ン タ を含む POP こ の命令は、 ス タ ッ ク か ら pc にポ ッ プ さ れた ア ド レ スへの分岐を発生 さ せま す。 一般的には、 サブルーチン か ら の復帰に使用 し ます。 サブルーチン では lr がサブルーチン開始位置で ス タ ッ ク にプ ッ シ ュ さ れ ます。 ARMv5T 以降には以下の よ う な特徴があ り ます • ビ ッ ト [1:0] は 0b10 にで き ません。 • ビ ッ ト [0] が 1 な ら 、 Thumb 状態で実行が継続 し ます。 • ビ ッ ト [0] が 0 な ら 、 ARM 状態で実行が継続 し ます。 ARMv4 では、 ロ ー ド さ れた ア ド レ ス の ビ ッ ト [1:0] は 0b00 にな っ てい る 必要 があ り ます。 POP を状態の変更に使用す る こ と はで き ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-33 ARM 命令 と Thumb 命令 Thumb 命令 こ れ ら の命令のサブセ ッ ト は、 Thumb 命令セ ッ ト で使用で き ます。 16 ビ ッ ト 命令には、 以下の制約条件が適用 さ れ ます。 • PUSH の場合、 reglist が格納で き る のは、 Lo レ ジ ス タ と lr だけです。 • POP の場合、 reglist が格納で き る のは、 Lo レ ジ ス タ と pc だけです。 32 ビ ッ ト 命令には、 以下の制約条件が適用 さ れ ます。 • reglist に sp を格納で き ません。 • PUSH の場合、 reglist に pc を格納で き ません。 • POP の場合、 reglist に lr か pc のいずれか を格納で き ますが、 両方は格納 で き ません。 サン プル PUSH PUSH POP 4-34 {r0,r4-r7} {r2,lr} {r0,r10,pc} ; no 16-bit version available Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.2.10 RFE 例外か ら 復帰す る 命令です。 構文 RFE{addr_mode}{cond} Rn{!} 各項目には以下の意味があ り ます。 addr_mode 以下のいずれか を指定 し ます。 IA 転送単位でア ド レ ス を ポ ス ト イ ン ク リ メ ン ト し ます (フル下降ス タ ッ ク )。 IB 転送単位でア ド レ ス を プ レ イ ン ク リ メ ン ト し ます (ARM のみ)。 DA 転送単位でア ド レ ス を ポ ス ト デ ク リ メ ン ト し ます (ARM のみ)。 DB 転送単位でア ド レ ス を プ レデ ク リ メ ン ト し ます。 addr_mode を省略す る と 、 IA (ポ ス ト イ ン ク リ メ ン ト ) が使用 さ れます。 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 cond 注 cond を指定で き る のは、 Thumb-2 コ ー ド で、 前に IT 命令を使用 し た場合のみです。 こ の命令は、 ARM では無条件命令です。 Rn ベース レ ジ ス タ を指定 し ます。 Rn に r15 は使用で き ません。 ! 任意に指定で き る 接尾文字です。 ! を指定す る と 、 最終ア ド レ ス が Rn に ラ イ ト バ ッ ク さ れます。 使用法 SRS 命令を使用 し て復帰状態を ス ト ア し た場合は、 RFE を使用 し て例外か ら 復 帰で き ます (「SRS」 (ページ 4-38) を参照)。 Rn は通常は sp であ り 、 復帰状態 情報は保存 さ れ ます。 Thumb-2EE では、 ベース レ ジ ス タ の値が 0 の場合、 HandlerBase - 4 にあ る NullCheck ハン ド ラ への分岐が実行 さ れ ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-35 ARM 命令 と Thumb 命令 演算 Rn に保持 さ れてい る ア ド レ ス と 、 その次のア ド レ ス か ら 、 プ ロ グ ラ ム カ ウ ン タ と CPSR を ロ ー ド し ます。 ま た、 オプシ ョ ン を指定 し て Rn を更新で き ます。 注釈 RFE は、 プ ロ グ ラ ム カ ウ ン タ に よ っ て、 ア ド レ ス が書 き 込まれ ます。 例外復帰 後に使用 さ れ る 命令セ ッ ト に合わせて、 こ のア ド レ ス の境界整列を調整す る 必要があ り ます。 • ARM 命令セ ッ ト に復帰す る には、 プ ロ グ ラ ム カ ウ ン タ に書 き 込むア ド レ ス を ワー ド 境界で整列す る 必要があ り ます。 • Thumb-2 命令セ ッ ト に復帰す る には、 プ ロ グ ラ ム カ ウ ン タ に書 き 込むア ド レ ス をハーフ ワー ド 境界で整列す る 必要があ り ます。 • Jazelle® 命令セ ッ ト に復帰す る 場合、 プ ロ グ ラ ム カ ウ ン タ に書 き 込むア ド レ ス の境界調整について、 制限はあ り ません。 上記の規則に従わない結果は予測不可能です。 ただ し 、 適切な例外開始 メ カ ニ ズ ム の後で復帰す る ために命令を使用す る 場合、 ソ フ ト ウ ェ ア側に特別な 予防策は必要あ り ません。 ア ド レ ス が ワ ー ド 境界で整列 さ れていない場合、RFE は Rn の最下位 2 ビ ッ ト を 無視 し ます。 アーキ テ ク チ ャ 上では、 RFE に よ っ て生成 さ れ る 、 メ モ リ の各 ワー ド へのア ク セ ス の時間的順序が定義 さ れてい ません。 ア ク セ ス順序の影響を受け る メ モ リ マ ッ プ さ れた I/O 位置では、 こ の命令を使用 し ないで下 さ い。 mode でユーザモー ド を指定 し た場合、 CPSR への書 き 込みについては通常の規 則が適用 さ れます。 詳細については、 『ARM アーキ テ ク チ ャ リ フ ァ レ ン ス マ ニ ュ アル』 を参照 し て下 さ い。 mode で監視モー ド を指定 し た場合、 結果は予測不可能です (「SMC」 (ページ 4-150) を参照)。 アーキテ ク チ ャ こ の ARM 命令は、 ARMv6 以降で使用で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 4-36 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 こ の命令の 16 ビ ッ ト バージ ョ ンはあ り ません。 例 RFE sp! ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-37 ARM 命令 と Thumb 命令 4.2.11 SRS ス タ ッ ク に復帰状態を ス ト アす る 命令です。 構文 SRS{addr_mode}{cond} sp{!}, #modenum SRS{addr_mode}{cond} #modenum{!} ; This is a pre-UAL syntax 各項目には以下の意味があ り ます。 addr_mode 以下のいずれか を指定 し ます。 IA 転送単位でア ド レ ス を ポ ス ト イ ン ク リ メ ン ト し ます。 IB 転送単位でア ド レ ス を プ レ イ ン ク リ メ ン ト し ます (ARM のみ)。 DA 転送単位でア ド レ ス を ポ ス ト デ ク リ メ ン ト し ます (ARM のみ)。 DB 転送単位でア ド レ ス を プ レデ ク リ メ ン ト し ます (完全 降順ス タ ッ ク )。 addr_mode を省略す る と 、 IA (ポ ス ト イ ン ク リ メ ン ト ) が使用 さ れ ます。 ス タ ッ ク 指向のア ド レ ッ シ ン グモー ド 接尾文字について は、 表 2-9 (ページ 2-46) を参照 し て下 さ い。 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 cond 注 cond を指定で き る のは、 Thumb-2 コ ー ド で、 前に IT 命令を使用 し た場合のみです。 こ の命令は、 ARM では無条件命令です。 4-38 ! 任意に指定で き る 接尾文字です。 ! を指定す る と 、 modenum に よ っ て指定 さ れたモー ド の sp に最終ア ド レ ス が ラ イ ト バ ッ ク さ れ ま す。 modenum バン ク 付 き sp がベース レ ジ ス タ と し て使用 さ れ る モー ド の番号 を指定 し ます。 詳細については、 「プ ロ セ ッ サモー ド 」 (ページ 2-6) を参照 し て下 さ い。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 演算 SRS は、 modenum に よ っ て指定 さ れたモー ド の sp が保持す る ア ド レ ス と その次 の ワ ー ド に、 現在のモー ド の lr と SPSR を それぞれ ス ト ア し ます。 ま たオプ シ ョ ン を指定 し て modenum に よ っ て指定 さ れたモー ド の sp を更新で き ます。 こ の命令は、 一般的に ス タ ッ ク へのア ク セ ス に使用 さ れ る STM 命令 と 互換性が あ り ます (「LDM、 STM」 (ページ 4-29) を参照)。 注 完全降順ス タ ッ ク に対 し ては、 SRSFD ま たは SRSDB を使用す る 必要があ り ます。 使用法 SRS 命令を使用 し て、 自動的に選択 さ れた別の ス タ ッ ク に、 例外ハン ド ラ の復 帰状態を ス ト アで き ます。 Thumb-2EE では、 ベース レ ジ ス タ の値が 0 の場合、 HandlerBase - 4 にあ る NullCheck ハン ド ラ への分岐が実行 さ れ ます。 注釈 ア ド レ ス が ワー ド 境界で整列 さ れていない と こ ろ では、 SRS は、 指定 さ れた ア ド レ ス の最下位 2 ビ ッ ト を無視 し ます。 アーキ テ ク チ ャ 上では、 SRS に よ っ て生成 さ れ る 、 メ モ リ の各 ワ ー ド へのア ク セ ス の時間的順序が定義 さ れてい ません。 ア ク セ ス順序の影響を受け る メ モ リ マ ッ プ さ れた I/O 位置では、 こ の命令を使用 し ないで下 さ い。 ユーザモー ド と シ ス テ ム モー ド には SPSR がないため、 SRS の結果は予測不可 能です。 アーキテ ク チ ャ こ の ARM 命令は、 ARMv6 以降で使用で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ の命令の 16 ビ ッ ト バージ ョ ンはあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-39 ARM 命令 と Thumb 命令 例 R13_usr 4.2.12 EQU SRSFD 16 sp,#R13_usr LDREX と STREX 排他的レ ジ ス タ ロ ー ド / ス ト ア命令です。 構文 LDREX{cond} Rt, [Rn {, #offset}] STREX{cond} Rd, Rt, [Rn {, #offset}] LDREXB{cond} Rt, [Rn] STREXB{cond} Rd, Rt, [Rn] LDREXH{cond} Rt, [Rn] STREXH{cond} Rd, Rt, [Rn] LDREXD{cond} Rt, Rt2, [Rn] STREXD{cond} Rd, Rt, Rt2, [Rn] 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd 復帰ス テー タ ス のデス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rt ロ ー ド ま たは ス ト アす る レ ジ ス タ を指定 し ます。 Rt2 ダブル ワー ド の ロ ー ド と ス ト アに使用す る 2 番目の レ ジ ス タ を指 定 し ます。 Rn メ モ リ ア ド レ ス のベース と な る レ ジ ス タ を指定 し ます。 offset Rn の値に適用 さ れ る 任意のオ フ セ ッ ト を指定 し ます。 offset は Thumb-2 命令でのみ使用可能です。 offset を省略 し た場合、 オ フ セ ッ ト は 0 と し て処理 さ れ ます。 4-40 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 LDREX LDREX は、 メ モ リ か ら デー タ を ロ ー ド し ます。 • 物理ア ド レ ス に共有 TLB 属性が設定 さ れてい る 場合、 LDREX は、 その物 理ア ド レ ス に現在のプ ロ セ ッ サの排他的ア ク セ ス を示す タ グ を付け、 他 の物理ア ド レ ス に対す る こ のプ ロ セ ッ サの排他的ア ク セ ス タ グ を ク リ ア し ます。 • 共有 TLB 属性が設定 さ れていない場合、 LDREX は、 実行中のプ ロ セ ッ サが ま だア ク セ ス し ていない タ グ付 き の物理ア ド レ ス があ る こ と を示す タ グ を付け ます。 STREX STREX は、 メ モ リ への条件付 き ス ト ア を実行 し ます。 条件を以下に示 し ます。 • 物理ア ド レ ス に共有 TLB 属性が設定 さ れてお ら ず、 実行中のプ ロ セ ッ サに よ っ て ま だア ク セ ス さ れていない タ グ付 き の物理ア ド レ ス が存在す る 場合は、 こ の命令に よ る ス ト アが実行 さ れ、 タ グが ク リ ア さ れて、 Rd に 0 が戻 り ます。 • 物理ア ド レ ス に共有 TLB 属性が設定 さ れてお ら ず、 実行中のプ ロ セ ッ サに よ っ て ア ク セ ス さ れていない タ グ付 き の物理ア ド レ ス が存在 し ない 場合は、 ス ト アは発生せず、 Rd に 1 が戻 り ます。 • 物理ア ド レ ス に共有 TLB 属性が設定 さ れてお り 、 その物理ア ド レ ス に 実行中のプ ロ セ ッ サに よ る 排他的ア ク セ ス の タ グが付け ら れてい る 場合 は、 ス ト アが発生 し て タ グが ク リ ア さ れ、 Rd に 0 が戻 り ます。 • 物理ア ド レ ス に共有 TLB 属性が設定 さ れてお り 、 その物理ア ド レ ス に 実行中のプ ロ セ ッ サに よ る 排他的ア ク セ ス の タ グが付け ら れていない場 合は、 ス ト アは発生せず、 Rd に 1 が戻 り ます。 制約条件 Rd、 Rt、 Rt2、 Rn のいずれのパ ラ メ ー タ に も r15 は指定で き ません。 STREX では、 Rd に Rt、 Rt2、 ま たは Rn と 同 じ レ ジ ス タ は指定で き ません。 ARM 命令には、 以下の制約条件が適用 さ れ ます。 ARM DUI 0204IJ • Rt には偶数番号の レ ジ ス タ (r14 以外) を指定す る 必要があ り ます。 • Rt2 は R(t+1) でなければな り ません。 • offset は使用で き ません。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-41 ARM 命令 と Thumb 命令 Thumb 命令の場合 : • Rd、 Rt、 お よ び Rt2 のいずれのパ ラ メ ー タ に も r13 は指定で き ません。 • LDREXD では、 Rt と Rt2 に同 じ レ ジ ス タ は指定で き ません。 • offset には、 0 ~ 1020 の範囲内にあ る 4 の倍数を指定で き ます。 使用法 LDREX 命令 と STREX 命令を使用 し て、 マルチプ ロ セ ッ サの共有 メ モ リ シ ス テ ム でプ ロ セ ス間通信を実装で き ます。 パフ ォ ーマ ン ス上の理由か ら 、 対応す る LDREX 命令 と STREX 命令の間に記述す る 命令の数は最小限に抑え て下 さ い。 注 STREX 命令で使用 さ れ る ア ド レ ス は、 直前に実行 さ れた LDREX 命令で使用 さ れ たア ド レ ス と 同一であ る 必要があ り ます。 異な る ア ド レ ス に対 し て STREX 命令 を実行す る と 、 その結果は予測不可能にな り ます。 アーキテ ク チ ャ ARM LDREX と STREX は ARMv6 以降で使用で き ます。 ARM LDREXB、 LDREXH、 LDREXD、 STREXB、 STREXD、 お よ び STREXH は ARMv6K 以降で 使用で き ます。 こ れ ら の 32 ビ ッ ト Thumb 命令はどれ も ARMv6T2 以降で使用で き ます。 ただ し 、 LDREXD と STREXD は ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ れ ら の命令の 16 ビ ッ ト バージ ョ ンはあ り ません。 サン プル MOV r1, #0x1 ; load the ‘lock taken’ value LDREX r0, [LockAddr] CMP r0, #0 STREXEQ r0, r1, [LockAddr] CMPEQ r0, #0 BNE try .... ; ; ; ; ; ; try 4-42 load the lock value is the lock free? try and claim the lock did this succeed? no – try again yes – we have the lock Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.2.13 CLREX 排他を ク リ アす る 命令です。 排他ア ク セ ス を要求 し てい る ア ド レ ス が存在す る こ と を示す、 実行中のプ ロ セ ッ サの ロ ーカルレ コ ー ド を ク リ ア し ます。 構文 CLREX{cond} 各項目には以下の意味があ り ます。 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 cond 注 cond を指定で き る のは、 Thumb-2 コ ー ド で、 前に IT 命令を使用 し た場合のみです。 こ の命令は、 ARM では無条件命令です。 使用法 CLREX 命令を使用 し て、 密に結合 さ れてい る 排他ア ク セ ス モニ タ を オープン ア ク セ ス状態に戻す こ と がで き ます。 こ れに よ り 、 メ モ リ へのダ ミ ース ト ア を 行 う 必要がな く な り ます。 同期のプ リ ミ テ ィ ブサポー ト の詳細については、 『ARM アーキ テ ク チ ャ リ フ ァ レ ン ス マニ ュ アル』 を参照 し て下 さ い。 CLREX が、 ア ド レ ス か ら 排他ア ク セ ス の要求があ る 実行中のプ ロ セ ッ サのグ ロ ーバルレ コ ー ド も ク リ アす る か ど う かは、 実装に よ っ て定義 さ れ ます。 アーキテ ク チ ャ こ の ARM 命令は、 ARMv6K 以降で使用で き ます。 こ の 32 ビ ッ ト Thumb-2 命令は ARMv7 以降で使用で き ます。 16 ビ ッ ト の Thumb CLREX 命令はあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-43 ARM 命令 と Thumb 命令 4.2.14 SWP と SWPB レ ジ ス タ と メ モ リ 間のデー タ ス ワ ッ プ命令です。 構文 SWP{B}{cond} Rt, Rt2, [Rn] 各パ ラ メ ー タ には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 B 任意に指定で き る 接尾文字です。 B を指定 し た場合は、 バ イ ト が ス ワ ッ プ さ れます。 指定 し なか っ た場合は、 32 ビ ッ ト ワー ド が ス ワ ッ プ さ れ ます。 Rt デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rt2 ソ ース レ ジ ス タ を指定 し ます。 Rt2 に Rt と 同 じ レ ジ ス タ を指定で き ます。 Rn メ モ リ 内のア ド レ ス を保持 し ます。 Rn には、 Rt お よ び Rt2 と は異 な る レ ジ ス タ を指定す る 必要があ り ます。 使用法 SWP と SWPB を使用 し て、 セマ フ ォ を実装で き ます。 • メ モ リ か ら のデー タ が Rt に ロ ー ド さ れます。 • Rt2 の内容が メ モ リ に保存 さ れます。 • Rt2 が Rt と 同 じ レ ジ ス タ にな っ てい る 場合、 レ ジ ス タ の内容がその メ モ リ の場所にあ る 内容 と ス ワ ッ プ さ れ ます。 注 ARMv6 以降では、 SWP お よ び SWPB の使用はお勧めで き ません。 ARMv6 以降に おけ る 洗練 さ れたセマ フ ォ の実装で使用す る 命令については、 「LDREX と STREX」 (ページ 4-40) を参照 し て下 さ い。 4-44 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARM アーキ テ ク チ ャ のすべてのバージ ョ ン で使用で き ます。 Thumb では SWP ま たは SWPB 命令はあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-45 ARM 命令 と Thumb 命令 4.3 汎用デー タ 処理命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ンか ら 構成 さ れてい ます。 • 「フ レ キ シブル第 2 オペ ラ ン ド 」 (ページ 4-47) • 「ADD、 SUB、 RSB、 ADC、 SBC、 RSC」 (ページ 4-51) キ ャ リ ー付 き ま たはキ ャ リ ーな し の加算、 減算、 お よ び逆減算です。 • 「SUBS PC、 lr」 (ページ 4-56) ス タ ッ ク を ポ ッ プ し ない例外か ら の復帰です。 • 「AND、 ORR、 EOR、 BIC、 ORN」 (ページ 4-58) 論理積、 論理和、 排他的論理和 (XOR)、 論理和否定、 お よ びビ ッ ト ク リ アです。 • 「CLZ」 (ページ 4-61) 先行ゼ ロ カ ウ ン ト 命令です。 • 「CMP、 CMN」 (ページ 4-62) 比較命令 と 比較否定命令です。 • 「MOV、 MVN」 (ページ 4-64) デー タ 代入命令 と デー タ を代入 し て ビ ッ ト 反転 さ せ る 命令です。 • 「MOVT」 (ページ 4-67) 上位にデー タ を代入す る 命令です。 • 「TST、 TEQ」 (ページ 4-68) テ ス ト 命令 と 等価テ ス ト 命令です。 • 「SEL」 (ページ 4-70) APSR の GE フ ラ グの状態に基づいて、 各オペ ラ ン ド か ら バ イ ト を選択 す る 命令です。 • 「REV、 REV16、 REVSH、 RBIT」 (ページ 4-72) バ イ ト ま たはビ ッ ト を反転す る 命令です。 • 「ASR、 LSL、 LSR、 ROR、 RRX」 (ページ 4-73) 算術右シ フ ト 命令です。 • 4-46 「SDIV、 UDIV」 (ページ 4-76) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 符号付 き 除算 と 符号な し 除算です。 4.3.1 フ レキシ ブル第 2 オペ ラ ン ド ARM お よ び Thumb-2 の汎用デー タ 処理命令のほ と ん ど に、 フ レ キ シブル第 2 オペ ラ ン ド を使用で き ます。 こ のオペ ラ ン ド は、 各命令の構文の記述におい て Operand2 と 表記 さ れてい ます。 ARM 命令 と Thumb-2 命令では、Operand2 で使 用で き る オプシ ョ ン が異な り ます。 構文 Operand2 には以下の 2 つの形式を使用で き ます。 #constant Rm{, shift} 各項目には以下の意味があ り ます。 ARM DUI 0204IJ constant 数値定数を求め る 式を指定 し ます。 使用で き る 定数の範囲は、 ARM と Thumb-2 で若干異な り ます。 詳細については、「Operand2 の定数」 (ページ 4-48) を参照 し て下 さ い。 Rm 第 2 オペ ラ ン ド のデー タ を保持す る ARM レ ジ ス タ です。 こ の レ ジ ス タ のビ ッ ト パ タ ーンは、 さ ま ざ ま な方法でシ フ ト ま たは ロ テー ト で き ます。 shift 任意に指定で き る 、 Rm に適用 さ れ る シ フ ト 量です。 以下の値を指 定で き ます。 ASR #n n ビ ッ ト 算術右シ フ ト 。 1 ≤ n ≤ 32。 LSL #n n ビ ッ ト 論理左シ フ ト 。 0 ≤ n ≤ 31。 LSR #n n ビ ッ ト 論理右シ フ ト 。 1 ≤ n ≤ 32。 ROR #n n ビ ッ ト 右 ロ テー ト 。 1 ≤ n ≤ 31。 RRX 拡張付 き 1 ビ ッ ト 右 ロ テー ト 。 type Rs ARM のみで使用可能です。 各パ ラ メ ー タ には以下の意 味があ り ます。 type ASR、 LSL、 LSR、 ROR のいずれか を指定 し ます。 Rs シ フ ト 量を渡す ARM レ ジ ス タ を指定 し ます。 最下位バ イ ト のみが使用 さ れます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-47 ARM 命令 と Thumb 命令 注 シ フ ト 演算の結果は命令の Operand2 と し て使用 さ れますが、 Rm 自 体は変更 さ れ ません。 Operand2 の定数 ARM 命令において、 constant には、 32 ビ ッ ト の ワー ド 内で 8 ビ ッ ト の値を右 に任意の偶数ビ ッ ト 分 ロ テー ト し て得 ら れ る 任意の値を指定で き ます。 32 ビ ッ ト の Thumb-2 命令において、 constant には以下の値を指定で き ます。 • 32 ビ ッ ト の ワ ー ド 内で 8 ビ ッ ト の値を左に任意のビ ッ ト 数シ フ ト し て得 ら れ る 定数 • 0x00XY00XY 形式の任意の定数 • 0xXY00XY00 形式の任意の定数 • 0xXYXYXYXY 形式の任意の定数 ま た、 少数の命令では、 constant に よ り 広い範囲の値を指定す る こ と がで き ま す。 詳細については、 各命令の説明を参照 し て下 さ い。 8 ビ ッ ト の値を右に 2 ビ ッ ト 、 4 ビ ッ ト 、 ま たは 6 ビ ッ ト 分 ロ テー ト し て得 ら れ る 定数は、 ARM デー タ 処理命令で使用す る こ と はで き ますが、 Thumb-2 で は使用で き ません。 その他すべての ARM 定数は、 Thumb-2 で も 使用で き ま す。 ASR Rm の内容が 2 の補数の符号付 き 整数 と 見な さ れ る 場合、 n ビ ッ ト 分の算術右シ フ ト は その値が 2n で除算 さ れ る の と 同 じ です。 元の ビ ッ ト [31] は レ ジ ス タ の 左 n ビ ッ ト に コ ピー さ れ ます。 LSR と LSL Rm の内容が符号な し 整数 と 見な さ れ る 場合、 n ビ ッ ト 分の論理右シ フ ト はその 値が 2n で除算 さ れ る の と 同 じ です。 レ ジ ス タ の左 n ビ ッ ト は、 0 に設定 さ れ ま す。 4-48 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 Rm の内容が符号な し 整数 と 見な さ れ る 場合、 n ビ ッ ト 分の論理左シ フ ト はその 値を 2n で乗算 さ れ る の と 同 じ です。 こ の と き 警告な し でオーバーフ ロ ーが発 生す る 場合があ り ます。 レ ジ ス タ の右 n ビ ッ ト は、 0 に設定 さ れ ます。 ROR n ビ ッ ト の右 ロ テー ト に よ り 、 レ ジ ス タ の右 n ビ ッ ト が結果の左 n ビ ッ ト に移 動 し ます。 同時に、 他のすべての ビ ッ ト が n ビ ッ ト 分右に移動 し ます (図 4-1 を参照)。 Carry Flag 31 1 0 ... 図 4-1 ROR RRX 拡張付 き 右 ロ テー ト では、 Rm の内容が 1 ビ ッ ト 分右にシ フ ト さ れます。 キ ャ リ ーフ ラ グは Rm の ビ ッ ト [31] に コ ピー さ れます (図 4-2 を参照)。 接尾文字 S が指定 さ れてい る 場合は、 Rm の ビ ッ ト [0] の古い値がキ ャ リ ーフ ラ グにシ フ ト ア ウ ト さ れ ます (「「キ ャ リ ーフ ラ グ」」 を参照)。 31 30 1 0 ... Carry Flag ... 図 4-2 RRX キャ リーフ ラグ 以下の命令の場合、 キ ャ リ ーフ ラ グが、 Rm か ら シ フ ト ア ウ ト さ れた最後の ビ ッ ト に更新 さ れ ます。 • 接尾文字 S を使用す る 場合は、 MOV、 MVN、 AND、 ORR、 ORN、 EOR、 ま たは BIC • ARM DUI 0204IJ 接尾文字 S を使用す る 必要がない場合は、 TEQ ま たは TST Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-49 ARM 命令 と Thumb 命令 命令置換 constant を否定ま たは論理反転す る 場合を除 き 、 特定の命令対 (ADD と SUB、 ADC と SBC、 AND と BIC、 MOV と MVN、 お よ び CMP と CMN) は等価です。 constant の値を使用で き な く て も 、 論理反転ま たは否定にで き る 可能性があ る 場合は、 アセ ン ブ ラ は命令対の も う 一方の命令に置 き 換え、 constant を反転 ま たは否定 し ます。 逆アセ ン ブル リ ス ト と ソ ース コ ー ド を比較す る 場合は、 こ の点に注意 し て下 さ い。 アセ ン ブ ラ の --diag_warning 1645 コ マ ン ド ラ イ ン オプシ ョ ン を使用 し て、 命令 置換が発生 し たか確認で き ます。 4-50 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.3.2 ADD、 SUB、 RSB、 ADC、 SBC、 RSC キ ャ リ ー付 き ま たはキ ャ リ ーな し の加算、 減算、 お よ び逆減算です。 「並列加算 と 並列減算」 (ページ 4-106) も 参照 し て下 さ い。 構文 op{S}{cond} {Rd}, Rn, Operand2 op{cond} {Rd}, Rn, #imm12 ; Thumb-2 ADD and SUB only 各項目には以下の意味があ り ます。 op 次のいずれか を指定 し ます。 ADD 加算 ADC キ ャ リ ー付 き 加算 SUB 減算 RSB 逆減算 SBC キ ャ リ ー付 き 減算 RSC キ ャ リ ー付 き 逆減算 (ARM のみ) S 任意に指定で き る 接尾文字です。 S が指定 さ れてい る 場合は、 演 算結果に基づいて条件 コ ー ド フ ラ グが更新 さ れ ます (「条件実 行」 (ページ 2-20) を参照)。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn 第 1 オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Operand2 フ レ キ シブル第 2 オペ ラ ン ド を指定 し ます。 こ のオプシ ョ ン の詳 細については、 「フ レ キ シブル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照 し て下 さ い。 imm12 0 ~ 4095 の範囲の値を指定 し ます。 使用法 ADD 命令は Rn と Operand2 の値を加算 し ます。 SUB 命令は、 Rn の値か ら Operand2 の値を減算 し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-51 ARM 命令 と Thumb 命令 RSB (逆減算) 命令は、 Operand2 の値か ら Rn の値を減算 し ます。 Operand2 には さ ま ざ ま なオプシ ョ ンがあ る ので、 こ の命令は便利です。 ADC、 SBC、 お よ び RSC を使用 し て、 マルチ ワー ド 算術演算を合成で き ます (「マルチ ワー ド 演算の例」 (ページ 4-55) を参照)。 ADC (キ ャ リ ー付 き 加算) 命令は、 Rn の値 と Operand2 の値、 そ し て キ ャ リ ーフ ラ グ も 含めて加算 し ます。 SBC (キ ャ リ ー付 き 減算) 命令は、 Rn の値か ら Operand2 の値を減算 し ます。 キ ャ リ ーフ ラ グが ク リ ア さ れてい る 場合は、 結果か ら 1 が引かれ ます。 RSC (キ ャ リ ー付 き 逆減算) 命令は、 Operand2 の値か ら Rn の減算 し ます。 キ ャ リ ーフ ラ グが ク リ ア さ れてい る 場合は、 結果か ら 1 が引かれます。 状況に よ っ ては、 あ る 命令を アセ ン ブ ラ に よ っ て別の命令に置換で き る 場合 があ り ます。 逆アセ ンブル リ ス ト を参照す る と き は、 こ の点に注意 し て下 さ い。 詳細については、 「命令置換」 (ページ 4-50) を参照 し て下 さ い。 Thumb-2 命令での pc の使用 ほ と ん ど の命令では、 Rd、 ま たはオペ ラ ン ド に pc (r15) は使用で き ません。 ただ し 、 ADD 命令ま たは SUB 命令で、 定数 Operand2 の値が 0 ~ 4095 の範囲にあ り 、 接尾文字 S が指定 さ れていない場合は、 Rn に pc を使用で き ます。 こ れ ら の命令は PC 相対ア ド レ ス を生成す る のに役立ち ます。 こ の と き 、 プ ロ グ ラ ム カ ウ ン タ のビ ッ ト [1] の値が 0 と し て読み出 さ れ る ので、 計算に使用す る ベー ス ア ド レ ス が常に ワ ー ド 境界で整列 さ れ ます。 「SUBS PC、 lr」 (ページ 4-56) も 参照 し て下 さ い。 「ADR」 (ページ 4-24) も 参照 し て下 さ い。 ARM 命令での pc の使用 Rn に pc (r15) を指定 し てい る 場合、 使用 さ れ る 値は 「命令のア ド レ ス + 8」 と な り ます。 Rd に pc を指定 し た場合、 以下の よ う にな り ます。 • • 4-52 演算結果に対応す る ア ド レ スへの分岐が実行 さ れ ます。 接尾文字 S を指定 し てい る 場合は、 現在のモー ド の SPSR が CPSR に コ ピー さ れます。 こ の動作を利用 し て、 例外か ら 復帰す る こ と がで き ます (『デベ ロ ッ パガ イ ド 』 の第 6 章 プ ロ セ ッ サ例外処理 を参照)。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 「ADR」 (ページ 4-24) も 参照 し て下 さ い。 注意 ユーザモー ド ま たはシ ス テ ム モー ド で Rd に pc を使用す る 場合は、 接尾文字 S を使用 し ないで下 さ い。 こ の よ う な命令に よ る 影響は予測不可能な う え、 ア セ ンブル時にアセ ン ブ ラ に よ る 警告が生成 さ れません。 レ ジ ス タ 制御シ フ ト を行 う デー タ 処理命令の場合は、 Rd やオペ ラ ン ド に pc は 使用で き ません (「フ レ キ シブル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照)。 条件 フ ラ グ S が指定 さ れてい る 場合、 こ れ ら の命令は演算結果に基づいて N、 Z、 C、 お よ び V の各フ ラ グ を更新 し ます。 16 ビ ッ ト 命令 こ れ ら の命令は、 Thumb-2 以前の Thumb コ ー ド 内では次の形式で使用で き ま す。 ま た、 Thumb-2 コ ー ド 内で使用す る と き は 16 ビ ッ ト 命令にな り ます。 ADDS Rd, Rn, #imm imm の範囲は 0 ~ 7 です。 Rd と Rn は共に Lo レ ジ ス タ であ る 必要があ り ます。 ADDS Rd, Rn, Rm Rd、 Rn お よ び Rm はすべて Lo レ ジ ス タ であ る 必要があ り ま す。 ADD Rd, Rd, Rm ARMv6 以前: Rd と Rm の少な く と も 一方が Hi レ ジ ス タ であ る 必要があ り ます。 ARMv6T2 以降 : こ の制約は適用 さ れ ません。 ADDS Rd, Rd, #imm imm の範囲は 0 ~ 255 です。 Rd は Lo レ ジ ス タ であ る 必要が あ り ます。 ADCS Rd, Rd, Rm Rd、 Rn お よ び Rm はすべて Lo レ ジ ス タ であ る 必要があ り ま す。 ADD SP, SP, #imm imm の範囲は 0 ~ 508 です ( ワー ド 境界で整列 し ます)。 ADD Rd, SP, #imm imm の範囲は 0 ~ 1020 です (ワ ー ド 境界で整列 し ます)。 Rd は Lo レ ジ ス タ であ る 必要があ り ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-53 ARM 命令 と Thumb 命令 ADD Rd, pc, #imm imm の範囲は 0 ~ 1020 です ( ワー ド 境界で整列 し ます)。 Rd は Lo レ ジ ス タ であ る 必要があ り ます。 こ の命令では、 プ ロ グ ラ ム カ ウ ン タ の ビ ッ ト [1:0] を 0 と し て読み出 し ます。 SUBS Rd, Rn, Rm Rd、 Rn お よ び Rm はすべて Lo レ ジ ス タ であ る 必要があ り ま す。 SUBS Rd, Rn, #imm imm の範囲は 0 ~ 7 です。Rd と Rn は共に Lo レ ジ ス タ であ る 必要があ り ます。 SUBS Rd, Rd, #imm imm の範囲は 0 ~ 255 です。 Rd は Lo レ ジ ス タ であ る 必要が あ り ます。 SBCS Rd, Rd, Rm Rd、 Rn お よ び Rm はすべて Lo レ ジ ス タ であ る 必要があ り ま す。 4-54 SUB SP, SP, #imm imm の範囲は 0 ~ 508 です ( ワー ド 境界で整列 し ます)。 RSBS Rd, Rn, #0 Rd と Rn は共に Lo レ ジ ス タ であ る 必要があ り ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 サン プル ADD SUBS RSB ADCHI r2, r1, r3 r8, r6, #240 r4, r4, #1280 r11, r0, r3 RSCSLE r0,r5,r0,LSL r4 ; ; ; ; ; sets the flags on the result subtracts contents of r4 from 1280 only executed if C flag set and Z flag clear conditional, flags set 誤用例 RSCSLE r0,pc,r0,LSL r4 ; pc not permitted with register ; controlled shift マルチワー ド 演算の例 以下の 2 つの命令は、r2 と r3 に保持 さ れ る 1 つの 64 ビ ッ ト 整数を、r0 と r1 に 保持 さ れ る 別の 64 ビ ッ ト 整数に加算 し 、 その結果を r4 と r5 に返 し ます。 ADDS ADC r4, r0, r2 r5, r1, r3 ; adding the least significant words ; adding the most significant words 以下の命令は、 一方の 96 ビ ッ ト 整数を他方の値か ら 減算 し ます。 SUBS SBCS SBC r3, r6, r9 r4, r7, r10 r5, r8, r11 上記の例では分か り やす く す る ために、 マルチ ワー ド の値に使用す る レ ジ ス タ を連続 さ せてい ますが、 必ず し も そ う す る 必要はあ り ません。 例えば、 以下 の よ う にす る こ と も で き ます。 SUBS SBCS SBC ARM DUI 0204IJ r6, r6, r9 r9, r2, r1 r2, r8, r11 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-55 ARM 命令 と Thumb 命令 4.3.3 SUBS PC、 lr ス タ ッ ク を ポ ッ プ し ない例外か ら の復帰です。 注 こ れは Thumb-2 では特殊な ケース の命令です。 同 じ 命令が ARM コ ー ド では通 常の形式の SUB 命令 と し て使用で き ます。 こ れは 「ADD、 SUB、 RSB、 ADC、 SBC、 RSC」 (ページ 4-51) で説明 さ れてい ます。 構文 SUBS{cond} pc, lr, #imm 各パ ラ メ ー タ には以下の意味があ り ます。 imm 即定値を指定 し ます。 Thumb-2 コ ー ド では、 範囲は 0 ~ 255 に制 限 さ れます。 ARM コ ー ド では、 フ レ キ シブル第 2 オペ ラ ン ド で す。 詳細については、 「フ レ キ シブル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照 し て下 さ い。 cond 任意に指定で き る 条件 コ ー ド です (「条件実行」 (ページ 2-20) を参照)。 使用法 ス タ ッ ク に復帰状態がない場合、 SUBS pc, lr を使用 し て例外か ら 復帰で き ま す。 SUBS pc, lr では、 リ ン ク レ ジ ス タ か ら 値を減算 し 、 結果を プ ロ グ ラ ム カ ウ ン タ に ロ ー ド し て、 SPSR を CPSR に コ ピー し ます。 注釈 SUBS pc, lr に よ っ て、 プ ロ グ ラ ム カ ウ ン タ にア ド レ ス が書 き 込まれます。 例 外復帰後に使用 さ れ る 命令セ ッ ト に合わせて、 こ のア ド レ ス の境界整列を調 整す る 必要があ り ます。 4-56 • ARM 命令セ ッ ト に復帰す る には、 プ ロ グ ラ ム カ ウ ン タ に書 き 込むア ド レ ス を ワー ド 境界で整列す る 必要があ り ます。 • Thumb-2 命令セ ッ ト に復帰す る には、 プ ロ グ ラ ム カ ウ ン タ に書 き 込むア ド レ ス をハーフ ワー ド 境界で整列す る 必要があ り ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 • Jazelle 命令セ ッ ト に復帰す る 場合、 プ ロ グ ラ ム カ ウ ン タ に書 き 込むア ド レ ス の境界整列について、 制限はあ り ません。 上記の規則に従わない結果は予測不可能です。 ただ し 、 適切な例外開始 メ カ ニズ ム の後で復帰す る ために命令を使用す る 場合、 ソ フ ト ウ ェ ア側に特別な 予防策は必要あ り ません。 MOVS pc, lr は Thumb-2 では SUBS pc, lr, #0 と 同 じ 意味です。 アーキテ ク チ ャ こ の ARM 命令は、 ARM アーキ テ ク チ ャ のすべてのバージ ョ ン で使用で き ま す。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-57 ARM 命令 と Thumb 命令 4.3.4 AND、 ORR、 EOR、 BIC、 ORN 論理積、 論理和、 排他的論理和 (XOR)、 ビ ッ ト ク リ ア、 お よ び論理和否定 です。 構文 op{S}{cond} Rd, Rn, Operand2 各項目には以下の意味があ り ます。 次のいずれか を指定 し ます。 AND 論理積 ORR 論理和 EOR 排他的論理和 (XOR) op BIC ORN 論理積否定 論理和否定 (Thumb-2 のみ)。 S 任意に指定で き る 接尾文字です。 S が指定 さ れてい る 場合は、 演 算結果に基づいて条件 コ ー ド フ ラ グが更新 さ れ ます (「条件実 行」 (ページ 2-20) を参照)。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn 第 1 オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Operand2 フ レ キ シブル第 2 オペ ラ ン ド を指定 し ます。 こ のオプシ ョ ンの詳 細については、 「フ レ キ シブル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照 し て下 さ い。 使用法 AND、 EOR、 お よ び ORR の各命令は、 Rn と Operand2 の値に対 し 、 それぞれビ ッ ト ご と の論理積、 排他的論理和 (XOR)、 お よ び論理和を取 り ます。 BIC (ビ ッ ト ク リ ア) 命令は、 Rn 内の ビ ッ ト と 、 Operand2 の値に含ま れ る 、 対 応す る 各ビ ッ ト の補数 と の論理積を取 り ます。 ORN Thumb-2 命令は、 Rn 内のビ ッ ト と 、 Operand2 の値に含まれ る 、 対応す る 各 ビ ッ ト の補数 と の論理和を取 り ます。 4-58 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 状況に よ っ ては、 アセ ンブ ラ が BIC を AND に、 AND を BIC に、 ORN を ORR に、 ORR を ORN に置 き 換え る 場合があ り ます。 逆アセ ン ブル リ ス ト を参照す る と き は、 こ の点に注意 し て下 さ い。 詳細については、 「命令置換」 (ページ 4-50) を参 照 し て下 さ い。 Thumb-2 命令での pc の使用 すべての命令で、 Rd、 ま たは任意のオペ ラ ン ド に pc (r15) は使用で き ませ ん。 ARM 命令での pc の使用 注 ARM 命令では pc の使用は非推奨です。 Rn に pc を指定 し てい る 場合、 使用 さ れ る 値は 「命令のア ド レ ス + 8」 と な り ます。 Rd に pc を指定 し た場合、 以下の よ う にな り ます。 • 演算結果に対応す る ア ド レ スへの分岐が実行 さ れ ます。 • 接尾文字 S を指定 し てい る 場合は、 現在のモー ド の SPSR が CPSR に コ ピー さ れます。 こ の動作を利用 し て、 例外か ら 復帰す る こ と がで き ます (『デベ ロ ッ パガ イ ド 』 の第 6 章 プ ロ セ ッ サ例外処理 を参照)。 注意 ユーザモー ド ま たはシ ス テ ム モー ド で Rd に pc を使用す る 場合は、 接尾文字 S を使用 し ないで下 さ い。 こ の よ う な命令に よ る 影響は予測不可能な う え、 ア セ ンブル時にアセ ン ブ ラ に よ る 警告が生成 さ れません。 レ ジ ス タ 制御シ フ ト を行 う デー タ 処理命令の場合は、 オペ ラ ン ド に pc は使用 で き ません (「フ レ キ シブル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照)。 条件 フ ラ グ S が指定 さ れてい る 場合、 こ れ ら の命令では、 以下の よ う にな り ます。 • ARM DUI 0204IJ 結果に応 じ て N フ ラ グお よ び Z フ ラ グ を更新 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-59 ARM 命令 と Thumb 命令 • Operand2 の計算中に C フ ラ グ を更新す る こ と が可能です (「フ レ キ シブ ル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照)。 • V フ ラ グは更新 し ません。 16 ビ ッ ト 命令 こ れ ら の命令は、 Thumb-2 以前の Thumb コ ー ド 内では次の形式で使用で き ま す。 ま た、 Thumb-2 コ ー ド 内で使用す る と き は 16 ビ ッ ト 命令にな り ます。 ANDS Rd, Rd, Rm Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 EORS Rd, Rd, Rm Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 ORRS Rd, Rd, Rm Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 BICS Rd, Rd, Rm Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 最初の 3 つの例は、OPS Rd, Rm, Rd を指定 し て も 問題はあ り ません。 命令は変わ り ません。 サン プル AND ORREQ EORS ANDS EORS BIC ORN ORNS r9,r2,#0xFF00 r2,r0,r5 r0,r0,r3,ROR r6 r9, r8, #0x19 r7, r11, #0x18181818 r0, r1, #0xab r7, r11, r14, ROR #4 r7, r11, r14, ASR #32 誤用例 EORS 4-60 r0,pc,r3,ROR r6 ; pc not permitted with register ; controlled shift Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.3.5 CLZ 先行ゼ ロ カ ウ ン ト 命令です。 構文 CLZ{cond} Rd, Rm 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rd に r15 は指定で き ません。 Rm オペ ラ ン ド レ ジ ス タ を指定 し ます。 Rm に r15 は指定で き ません。 使用法 CLZ 命令は Rm の値に含まれ る 先行ゼ ロ の数を カ ウ ン ト し 、 結果を Rd に返 し ま す。 ソ ース レ ジ ス タ に設定 さ れてい る ビ ッ ト がない場合の結果は 32 と な り 、 ビ ッ ト 31 が設定 さ れてい る 場合の結果はゼ ロ にな り ます。 条件 フ ラ グ こ の命令に よ る フ ラ グへの影響はあ り ません。 アーキテ ク チ ャ こ の ARM 命令は、 ARMv5 以降で使用で き ます。 こ の 32 ビ ッ ト Thumb 命令は ARMv6T2 以降で使用で き ます。 こ の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル CLZ CLZNE r4,r9 r2,r3 レ ジ ス タ Rm の値を正規化す る には、 CLZ Thumb-2 命令を使用 し 、 結果 と し て返 さ れた Rm 値の分、 Rm を左シ フ ト し ます。 Rm が 0 の場合に フ ラ グ を設定す る に は、 MOV ではな く MOVS を使用 し ます。 CLZ r5, r9 MOVS r9, r9, LSL r5 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-61 ARM 命令 と Thumb 命令 4.3.6 CMP、 CMN 比較命令 と 比較否定命令です。 構文 CMP{cond} Rn, Operand2 CMN{cond} Rn, Operand2 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rn 第 1 オペ ラ ン ド を保持す る ARM レ ジ ス タ を指定 し ます。 Operand2 フ レ キ シブル第 2 オペ ラ ン ド を指定 し ます。 こ のオプシ ョ ンの詳 細については、 「フ レ キ シブル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照 し て下 さ い。 使用法 こ れ ら の命令は、 レ ジ ス タ 内の値 と Operand2 を比較 し ます。 結果に基づいて条 件フ ラ グ を更新 し ますが、 結果はど の レ ジ ス タ に も 入れません。 CMP 命令は、 Rn の値か ら Operand2 の値を減算 し ます。 結果が破棄 さ れ る こ と を 除けば、 SUBS 命令 と 同 じ です。 CMN 命令は Operand2 の値を Rn の値に加算 し ます。 結果が破棄 さ れ る こ と を除け ば、 ADDS 命令 と 同 じ です。 状況に よ っ ては、 アセ ン ブ ラ に よ っ て CMN を CMP に、 CMP を CMN に置換で き る 場 合があ り ます。 逆アセ ン ブル リ ス ト を参照す る と き は、 こ の点に注意 し て下 さ い。 詳細については、 「命令置換」 (ページ 4-50) を参照 し て下 さ い。 ARM 命令での pc の使用 注 こ れ ら の ARM 命令では pc (r15) の使用は非推奨です。 Rn に pc を指定 し てい る 場合、 使用 さ れ る 値は 「命令のア ド レ ス + 8」 と な り ます。 4-62 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 レ ジ ス タ 制御シ フ ト を行 う デー タ 処理命令の場合は、 オペ ラ ン ド に pc は使用 で き ません (「フ レ キ シブル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照)。 Thumb-2 命令での pc の使用 こ れ ら の命令では、 オペ ラ ン ド に pc (r15) は使用で き ません。 条件 フ ラ グ こ れ ら の命令は、 演算結果に基づいて N、 Z、 C、 お よ び V の各フ ラ グ を更新 し ます。 16 ビ ッ ト 命令 こ れ ら の命令は、 Thumb-2 以前の Thumb コ ー ド 内では次の形式で使用で き ま す。 ま た、 Thumb-2 コ ー ド 内で使用す る と き は 16 ビ ッ ト 命令にな り ます。 CMP Rn, Rm CMN Rn, Rm Rn お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 CMP Rn, #imm Rn は Lo レ ジ ス タ であ る 必要があ り ます。 imm 範囲 0 ~ 255。 サン プル CMP CMN CMPGT r2, r9 r0, #6400 r13, r7, LSL #2 誤用例 CMP ARM DUI 0204IJ r2, pc, ASR r0 ; pc not permitted with register controlled shift Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-63 ARM 命令 と Thumb 命令 4.3.7 MOV、 MVN デー タ 代入命令 と デー タ を代入 し て ビ ッ ト 反転 さ せ る 命令です。 構文 MOV{S}{cond} Rd, Operand2 MOV{cond} Rd, #imm16 MVN{S}{cond} Rd, Operand2 各項目には以下の意味があ り ます。 S 任意に指定で き る 接尾文字です。 S が指定 さ れてい る 場合は、 演 算結果に基づいて条件 コ ー ド フ ラ グが更新 さ れ ます (「条件実 行」 (ページ 2-20) を参照)。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Operand2 フ レ キ シブル第 2 オペ ラ ン ド を指定 し ます。 こ のオプシ ョ ンの詳 細については、 「フ レ キ シブル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照 し て下 さ い。 imm16 0 ~ 65535 の範囲の値を指定 し ます。 使用法 MOV 命令は Operand2 の値を Rd に コ ピー し ます。 MVN 命令は Operand2 の値を取得 し 、 その値に ビ ッ ト ご と の論理 NOT 演算を実 行 し て、 結果を Rd に返 し ます。 状況に よ っ ては、 アセ ン ブ ラ に よ っ て MVN を MOV に、 MOV を MVN に置換で き る 場 合があ り ます。 逆アセ ン ブル リ ス ト を参照す る と き は、 こ の点に注意 し て下 さ い。 詳細については、 「命令置換」 (ページ 4-50) を参照 し て下 さ い。 Thumb-2 の MOV と MVN での pc の使用 pc (r15) は Thumb-2 の MOV と MVN 命令では Rd ま たは Operand2 に使用で き ませ ん。 4-64 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 ARM MOV と MVN での pc の使用 注 MOV Rd,Rm 構文は Rd ま たは Rn が pc の場合に使用で き ますが、 両方を pc にす る こ と はで き ません。 その他のケース では非推奨です。 Rd に pc を指定 し てい る 場合、 使用 さ れ る 値は 「命令のア ド レ ス + 8」 と な り ます。 Rd に pc を指定 し た場合、 以下の よ う にな り ます。 • 演算結果に対応す る ア ド レ スへの分岐が実行 さ れ ます。 • 接尾文字 S を指定 し てい る 場合は、 現在のモー ド の SPSR が CPSR に コ ピー さ れます。 こ の動作を利用 し て、 例外か ら 復帰す る こ と がで き ます (『デベ ロ ッ パガ イ ド 』 の第 6 章 プ ロ セ ッ サ例外処理 を参照)。 注意 ユーザモー ド ま たはシ ス テ ム モー ド で Rd に pc を使用す る 場合は、 接尾文字 S を使用 し ないで下 さ い。 こ の よ う な命令に よ る 影響は予測不可能な う え、 ア セ ンブル時にアセ ン ブ ラ に よ る 警告が生成 さ れません。 レ ジ ス タ 制御シ フ ト を行 う デー タ 処理命令の場合は、 Rd やオペ ラ ン ド に pc は 使用で き ません (「フ レ キ シブル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照)。 条件 フ ラ グ S が指定 さ れてい る 場合、 こ れ ら の命令では、 以下の よ う にな り ます。 • 結果に応 じ て N フ ラ グお よ び Z フ ラ グ を更新 し ます。 • Operand2 の計算中に C フ ラ グ を更新す る こ と が可能です (「フ レ キ シブ ル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照)。 • V フ ラ グは更新 し ません。 16 ビ ッ ト 命令 こ れ ら の命令は、 Thumb-2 以前の Thumb コ ー ド 内では次の形式で使用で き ま す。 ま た、 Thumb-2 コ ー ド 内で使用す る と き は 16 ビ ッ ト 命令にな り ます。 MOVS Rd, #imm ARM DUI 0204IJ Rd は Lo レ ジ ス タ であ る 必要があ り ます。 imm 範囲 0 ~ 255。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-65 ARM 命令 と Thumb 命令 MOVS Rd, Rm Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 MOV Rd, Rm ARMv5 以前のバージ ョ ン では、 Rd ま たは Rm の一方、 ま た は両方が Hi レ ジ ス タ であ る 必要があ り ます。 ARMv6 以降 のバージ ョ ンに、 こ の制限は適用 さ れ ません。 アーキテ ク チ ャ #imm16 形式の ARM 命令は、 ARMv6T2 以降で使用で き ます。 その他の形式の ARM 命令は ARM アーキ テ ク チ ャ のすべてのバージ ョ ン で使用で き ます。 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の 16 ビ ッ ト Thumb 命令は、 ARM アーキ テ ク チ ャ のすべての T バ リ ア ン ト で使用で き ます。 例 MVNNE r11, #0xF000000B ; ARM only. This constant is not available in T2. 誤用例 MVN 4-66 pc,r3,ASR r0 ; pc not permitted with register controlled shift Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.3.8 MOVT 上位にデー タ を代入す る 命令です。 レ ジ ス タ の下位ハーフ ワー ド に影響を及 ぼ さ ずに、 上位ハーフ ワ ー ド に 16 ビ ッ ト の イ ミ デ ィ エー ト 値を書 き 込みま す。 構文 MOVT{cond} Rd, #immed_16 各項目には以下の意味があ り ます。 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rd を pc にす る こ と はで き ません。 immed_16 16 ビ ッ ト の即定値を指定 し ます。 cond 使用法 MOVT は、immed_16 を Rd [31:16] に書 き 込みます。 こ の書 き 込みが Rd [15:0] に影響 す る こ と はあ り ません。 MOV と MOVT の命令対で、 任意の 32 ビ ッ ト 定数を生成で き ます。 「MOV32 疑似命令」 (ページ 4-168) も 参照 し て下 さ い。 条件 フ ラ グ こ の命令に よ る フ ラ グへの影響はあ り ません。 アーキテ ク チ ャ こ の ARM 命令は、 ARMv6T2 以降で使用で き ます。 こ の 32 ビ ッ ト Thumb 命令は ARMv6T2 以降で使用で き ます。 こ の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-67 ARM 命令 と Thumb 命令 4.3.9 TST、 TEQ ビ ッ ト テ ス ト と 等価テ ス ト です。 構文 TST{cond} Rn, Operand2 TEQ{cond} Rn, Operand2 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rn 第 1 オペ ラ ン ド を保持す る ARM レ ジ ス タ を指定 し ます。 Operand2 フ レ キ シブル第 2 オペ ラ ン ド を指定 し ます。 こ のオプシ ョ ンの詳 細については、 「フ レ キ シブル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照 し て下 さ い。 使用法 こ れ ら の命令は、 レ ジ ス タ 内の値を Operand2 に対 し てテ ス ト し ます。 結果に基 づいて条件フ ラ グ を更新 し ますが、 結果は ど の レ ジ ス タ に も 入れません。 TST 命令は Rn の値 と Operand2 の値を使用 し て ビ ッ ト ご と の論理積を取 り ます。 結果が破棄 さ れ る こ と を除けば、 ANDS 命令 と 同 じ です。 TEQ 命令は Rn の値 と Operand2 の値を使用 し て ビ ッ ト ご と の排他的論理和 (XOR) を取 り ます。 結果が破棄 さ れ る こ と を除けば、 EORS 命令 と 同 じ です。 2 つの値が等 し いか ど う か を テ ス ト す る には TEQ 命令を使用 し ます。 その際、 CMP と は異な り 、 V フ ラ グ ま たは C フ ラ グに影響す る こ と はあ り ません。 TEQ は値の符号を テ ス ト す る のに も 役立ち ます。 比較後の N フ ラ グは、 2 つの オペ ラ ン ド の符号ビ ッ ト の排他的論理和 (XOR) にな り ます。 pc の使用 ARM 命令には、 以下の制約条件が適用 さ れ ます。 • 4-68 Rn に pc (r15) を指定 し てい る 場合、 使用 さ れ る 値は 「命令のア ド レ ス + 8」 と な り ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 • レ ジ ス タ 制御シ フ ト を行 う デー タ 処理命令の場合は、 オペ ラ ン ド に pc は使用で き ません (「フ レ キ シブル第 2 オペ ラ ン ド 」 (ページ 4-47) を参 照)。 Thumb-2 命令では Rn お よ び Operand2. に使用で き ません。 条件 フ ラ グ こ れ ら の命令では、 以下の よ う にな り ます。 • 結果に応 じ て N フ ラ グお よ び Z フ ラ グ を更新 し ます。 • Operand2 の計算中に C フ ラ グ を更新す る こ と が可能です (「フ レ キ シブ ル第 2 オペ ラ ン ド 」 (ページ 4-47) を参照)。 • V フ ラ グは更新 し ません。 16 ビ ッ ト 命令 TST 命令は、 Thumb-2 以前の Thumb コ ー ド 内では次の形式で使用で き ます。 ま た、 Thumb-2 コ ー ド 内で使用す る と き は 16 ビ ッ ト 命令にな り ます。 TST Rn, Rm Rn お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 サン プル TST TEQEQ TSTNE r0, #0x3F8 r10, r9 r1, r5, ASR r1 誤用例 TEQ ARM DUI 0204IJ pc, r1, ROR r0 ; pc not permitted with register ; controlled shift Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-69 ARM 命令 と Thumb 命令 4.3.10 SEL APSR の GE フ ラ グの状態に基づいて、 各オペ ラ ン ド か ら バ イ ト を選択す る 命 令です。 構文 SEL{cond} {Rd}, Rn, Rm 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn 第 1 オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 第 2 オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Rm 演算 SEL 命令は、 APSR の GE フ ラ グに基づいて、 Rn ま たは Rm か ら バ イ ト を選択 し ます。 • GE[0] が設定 さ れてい る 場合は、 Rd[7:0] が Rn[7:0] か ら 取得 さ れ、 それ以 外の場合は Rm[7:0] か ら 取得 さ れ ます。 • GE[1] が設定 さ れてい る 場合は、 Rd[15:8] が Rn[15:8] か ら 取得 さ れ、 それ 以外の場合は Rm[15:8] か ら 取得 さ れます。 • GE[2] が設定 さ れてい る 場合は、 Rd[23:16] が Rn[23:16] か ら 取得 さ れ、 そ れ以外の場合は Rm[23:16] か ら 取得 さ れます。 • GE[3] が設定 さ れてい る 場合は、 Rd[31:24] が Rn[31:24] か ら 取得 さ れ、 そ れ以外の場合は Rm[31:24] か ら 取得 さ れます。 使用法 Rd、 Rn、 ま たは Rm に r15 を使用 し ないで下 さ い。 SEL 命令は、 符号付 き 並列命令の後に使用 し ます (「並列加算 と 並列減算」 (ページ 4-106) を参照)。 こ の命令を使用 し て、 複数バ イ ト デー タ ま たはハー フ ワー ド デー タ の最大値や最小値を選択で き ます。 条件 フ ラ グ こ の命令に よ る フ ラ グへの影響はあ り ません。 4-70 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 アーキテ ク チ ャ こ の ARM 命令は、 ARMv6 以降で使用で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル SEL SELLT r0, r4, r5 r4, r0, r4 以下の命令シーケ ン ス は、 r1 と r2 の各バ イ ト の符号な し 最小値 と 等 し く な る よ う に r4 の対応す る バ イ ト を設定 し ます。 USUB8 SEL ARM DUI 0204IJ r4, r1, r2 r4, r2, r1 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-71 ARM 命令 と Thumb 命令 4.3.11 REV、 REV16、 REVSH、 RBIT ワー ド 内ま たはハーフ ワー ド 内で、 バ イ ト ま たはビ ッ ト を反転す る 命令です。 構文 op{cond} Rd, Rn 各項目には以下の意味があ り ます。 以下のいずれか を指定 し ます。 op REV ワー ド 内のバ イ ト 順序を反転 さ せます。 REV16 各ハーフ ワ ー ド 内のバ イ ト 順序を独自に反転 さ せます。 REVSH 下位ハーフ ワー ド 内のバ イ ト 順序を反転 さ せ、 それを 32 ビ ッ ト に符号拡張 し ます。 RBIT 32 ビ ッ ト ワー ド 内のビ ッ ト 順序を反転 さ せます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rd に r15 は指定で き ません。 Rn オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Rn に r15 は指定で き ません。 使用法 以下の命令を使用 し て、 エ ンデ ィ ア ン方式を変更で き ます。 4-72 REV 32 ビ ッ ト の ビ ッ グエ ンデ ィ ア ンデー タ を リ ト ルエ ンデ ィ ア ン デー タ に変換、 ま たは 32 ビ ッ ト の リ ト ルエ ンデ ィ ア ンデー タ を ビ ッ グエ ンデ ィ ア ンデー タ に変換 し ます。 REV16 16 ビ ッ ト の ビ ッ グエ ンデ ィ ア ンデー タ を リ ト ルエ ンデ ィ ア ン デー タ に変換、 ま たは 16 ビ ッ ト の リ ト ルエ ンデ ィ ア ンデー タ を ビ ッ グエ ンデ ィ ア ンデー タ に変換 し ます。 REVSH 次のいずれかの変換を行い ます。 • 16 ビ ッ ト の符号付 き ビ ッ グエ ンデ ィ ア ンデー タ を 32 ビ ッ ト の符号付 き リ ト ルエ ンデ ィ ア ンデー タ に変換 し ます。 • 16 ビ ッ ト の符号付 き リ ト ルエ ンデ ィ ア ンデー タ を 32 ビ ッ ト の符号付 き ビ ッ グエ ンデ ィ ア ンデー タ に変換 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 条件 フ ラ グ こ れ ら の命令に よ る フ ラ グへの影響はあ り ません。 16 ビ ッ ト 命令 こ れ ら の命令は、 Thumb-2 以前の Thumb コ ー ド 内では次の形式で使用で き ま す。 ま た、 Thumb-2 コ ー ド 内で使用す る と き は 16 ビ ッ ト 命令にな り ます。 REV Rd, Rm Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 REV16 Rd, Rm Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 REVSH Rd, Rm Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 アーキテ ク チ ャ RBIT を除 く 上記の ARM 命令は、 ARMv6 以降で使用で き ます。 ARM 命令の RBIT は、 ARMv6T2 以降で使用で き ます。 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の 16 ビ ッ ト Thumb 命令は、 ARMv6 以降のすべての T バ リ ア ン ト で使 用で き ます。 サン プル REV REV16 REVSH REVHS RBIT 4.3.12 r3, r0, r0, r3, r7, r7 r0 r5 r7 r8 ; Reverse Signed Halfword ; Reverse with Higher or Same condition ASR、 LSL、 LSR、 ROR、 RRX 算術右シ フ ト 、 論理左シ フ ト 、 論理右シ フ ト 、 右 ロ テー ト 、 お よ び拡張付 き 右 ロ テー ト です。 こ れ ら の命令は、 第 2 オペ ラ ン ド レ ジ ス タ がシ フ ト さ れ る MOV 命令 と 同 じ 意味 です。 構文 op{S}{cond} Rd, Rm, Rs ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-73 ARM 命令 と Thumb 命令 op{S}{cond} Rd, Rm, #sh RRX{S}{cond} Rd, Rm 各パ ラ メ ー タ には以下の意味があ り ます。 op ASR、 LSL、 LSR、 ROR のいずれか を指定 し ます。 S 任意に指定で き る 接尾文字です。 S が指定 さ れてい る 場合は、 演 算結果に基づいて条件 コ ー ド フ ラ グが更新 さ れ ます (「条件実 行」 (ページ 2-20) を参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rm 第 1 オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 こ のオペ ラ ン ド は右にシ フ ト さ れ ます。 Rs Rm の値に適用す る シ フ ト 値を保持す る レ ジ ス タ を指定 し ます。 最 下位バ イ ト のみが使用 さ れます。 sh シ フ ト 定数を指定 し ます。 指定可能な値の範囲は、 命令に よ っ て 異な り ます。 ASR 1 ~ 32 のシ フ ト が可能です LSL 0 ~ 31 のシ フ ト が可能です LSR 1 ~ 32 のシ フ ト が可能です ROR 1 ~ 31 のシ フ ト が可能です 使用法 ASR は、 レ ジ ス タ の内容を 2 のべ き 乗で除算 し た、 符号付 き の値を求め ます。 空の左の ビ ッ ト 位置には、 符号ビ ッ ト が コ ピー さ れ ます。 LSL は、 レ ジ ス タ を 2 のべ き 乗で乗算 し た値を求め ます。 LSR は、 レ ジ ス タ を 2 の可変乗で除算 し た、 符号な し の値を求め ます。 いずれの命令で も 、 空の ビ ッ ト 位置には 0 が挿入 さ れます。 ROR は、 レ ジ ス タ の内容を任意の値で ロ テー ト し た値を求め ます。 ロ テー ト の 結果右端か ら 溢れた ビ ッ ト は、 空の左の ビ ッ ト 位置に挿入 さ れ ます。 RRX は、 レ ジ ス タ の内容を右に 1 ビ ッ ト シ フ ト し た値を求め ます。 古いキ ャ リ ーフ ラ グはビ ッ ト [31] にシ フ ト さ れ ます。 接尾文字 S を指定 し た場合、古い ビ ッ ト [0] がキ ャ リ ーフ ラ グに配置 さ れます。 4-74 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 制約条件 Rs を使用す る ARM 命令では、r15 を使用で き ません。 Thumb 命令では、r15 も r13 も 使用で き ません。 条件 フ ラ グ S が指定 さ れてい る 場合、 こ れ ら の命令は演算結果に基づいて N と Z の各フ ラ グ を更新 し ます。 シ フ ト 値が 0 の場合、 C フ ラ グは影響を受け ません。 0 以外の場合、 シ フ ト ア ウ ト さ れた最後の ビ ッ ト で更新 さ れます。 16 ビ ッ ト 命令 こ れ ら の命令は、 Thumb-2 以前の Thumb コ ー ド 内では次の形式で使用で き ま す。 ま た、 Thumb-2 コ ー ド 内で使用す る と き は 16 ビ ッ ト 命令にな り ます。 ASRS Rd, Rm, #sh Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 ASRS Rd, Rd, Rs Rd お よ び Rs は共に Lo レ ジ ス タ であ る 必要があ り ます。 LSLS Rd, Rm, #sh Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 LSLS Rd, Rd, Rs Rd お よ び Rs は共に Lo レ ジ ス タ であ る 必要があ り ます。 LSRS Rd, Rm, #sh Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 LSRS Rd, Rd, Rs Rd お よ び Rs は共に Lo レ ジ ス タ であ る 必要があ り ます。 RORS Rd, Rd, Rs Rd お よ び Rs は共に Lo レ ジ ス タ であ る 必要があ り ます。 サン プル ASR LSLS LSR ROR ARM DUI 0204IJ r7, r1, r4, r4, r8, r2, r5, r5, r9 r3 r6 r6 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-75 ARM 命令 と Thumb 命令 4.3.13 SDIV、 UDIV 符号付 き 除算 と 符号な し 除算です。 構文 SDIV{cond} {Rd}, Rn, Rm UDIV{cond} {Rd}, Rn, Rm 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn 被除数を保持す る レ ジ ス タ を指定 し ます。 Rm 除数を保持す る レ ジ ス タ を指定 し ます。 レ ジ ス タ の制約条件 pc と sp は Rd、 Rn ま たは Rm に使用で き ません。 アーキテ ク チ ャ こ れ ら の 32 ビ ッ ト Thumb 命令は ARMv7-R と ARMv7-M のみで使用で き ま す。 SDIV と UDIV 命令には ARM バージ ョ ン も 16 ビ ッ ト Thumb バージ ョ ン も あ り ま せん。 4-76 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.4 乗算命令 本章は以下のセ ク シ ョ ンか ら 構成 さ れてい ます。 • 「MUL、 MLA、 MLS」 (ページ 4-79) 乗算命令、 積和命令、 お よ び積差命令です (32 ビ ッ ト × 32 ビ ッ ト を計 算 し 、 結果の下位 32 ビ ッ ト を返 し ます)。 • 「UMULL、 UMLAL、 SMULL、 SMLAL」 (ページ 4-81) 符号な し / 符号付 き long 乗算命令 と long 積和命令です (32 ビ ッ ト × 32 ビ ッ ト を実行 し 、 64 ビ ッ ト の結果ま たは 64 ビ ッ ト の累積値を返 し ま す)。 • 「SMULxy、 SMLAxy」 (ページ 4-83) 符号付 き 乗算命令 と 符号付 き 積和命令です (16 ビ ッ ト × 16 ビ ッ ト を実 行 し 、 32 ビ ッ ト の結果を返 し ます)。 • 「SMULWy、 SMLAWy」 (ページ 4-85) 符号付 き 乗算命令 と 符号付 き 積和命令です (32 ビ ッ ト × 16 ビ ッ ト を実 行 し 、 結果の上位 32 ビ ッ ト を返 し ます。 • 「SMLALxy」 (ページ 4-87) 符号付 き 積和命令です (16 ビ ッ ト × 16 ビ ッ ト を実行 し 、 64 ビ ッ ト の累 算値を返 し ます)。 • 「SMUAD{X}、 SMUSD{X}」 (ページ 4-89) 積の加算ま たは減算を伴 う デ ュ アル 16 ビ ッ ト 符号付 き 乗算命令です。 • 「SMMUL、 SMMLA、 SMMLS」 (ページ 4-91) 乗算命令、 積和命令、 お よ び積差命令です (32 ビ ッ ト × 32 ビ ッ ト を実 行 し 、 結果の上位 32 ビ ッ ト を返 し ます)。 • 「SMLAD、 SMLSD」 (ページ 4-93) デ ュ アル 16 ビ ッ ト 符号付 き 乗算を実行 し 、 積の加算ま たは減算 と 、 32 ビ ッ ト の累算を行 う 命令です。 • 「SMLALD、 SMLSLD」 (ページ 4-95) デ ュ アル 16 ビ ッ ト 符号付 き 乗算を実行 し 、 32 ビ ッ ト の積の加算ま たは 減算 と 、 64 ビ ッ ト の累算を行 う 命令です。 • ARM DUI 0204IJ 「UMAAL」 (ページ 4-97) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-77 ARM 命令 と Thumb 命令 符号な し 積和累算 long 命令です。 • 「MIA、 MIAPH、 MIAxy」 (ページ 4-98) 内部積算を伴 う 乗算 (XScale コ プ ロ セ ッ サ 0 命令) です。 4-78 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.4.1 MUL、 MLA、 MLS 符号付 き ま たは符号な し の 32 ビ ッ ト オペ ラ ン ド を使用 し て乗算、 積和、 お よ び積差を実行 し 、 結果の下位 32 ビ ッ ト を返 し ます。 構文 MUL{S}{cond} {Rd}, Rn, Rm MLA{S}{cond} Rd, Rn, Rm, Ra MLS{cond} Rd, Rn, Rm, Ra 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 S 任意に指定で き る 接尾文字です。 S が指定 さ れてい る 場合は、 演 算結果に基づいて条件 コ ー ド フ ラ グが更新 さ れ ます (「条件実 行」 (ページ 2-20) を参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn?Rm 乗算す る 値を保持す る レ ジ ス タ を指定 し ます。 Ra 加算す る 値ま たは引かれ る 値を保持す る レ ジ ス タ を指定 し ます。 使用法 MUL 命令は Rn と Rm の値を乗算 し 、 演算結果の下位 32 ビ ッ ト を Rd に返 し ます。 MLA 命令は Rn と Rm の値を乗算 し 、 Ra の値を加算 し て、 演算結果の下位 32 ビ ッ ト を Rd に返 し ます。 MLS 命令は Rn と Rm の値を乗算 し 、 その結果を Ra の値か ら 減算 し て、 最終的な 演算結果の下位 32 ビ ッ ト を Rd に返 し ます。 Rd、 Rn、 Rm、 お よ び Ra に r15 を使用 し ないで下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-79 ARM 命令 と Thumb 命令 条件 フ ラ グ S が指定 さ れてい る 場合、 MUL と MLA では、 以下の よ う にな り ます。 • 結果に応 じ て N フ ラ グお よ び Z フ ラ グ を更新 し ます。 • ARMv4 以前のプ ロ セ ッ サでは、 C フ ラ グお よ び V フ ラ グ を破棄 し ます。 • ARMv5 以降のプ ロ セ ッ サでは、 C フ ラ グ ま たは V フ ラ グへの影響はあ り ません。 Thumb 命令 MUL 命令は、 Thumb-2 以前の Thumb コ ー ド 内では次の形式で使用で き ます。 ま た、 Thumb-2 コ ー ド 内で使用す る と き は 16 ビ ッ ト 命令にな り ます。 MULS Rd, Rn, Rd Rd お よ び Rn は共に Lo レ ジ ス タ であ る 必要があ り ます。 条件 コ ー ド の フ ラ グ を更新で き る Thumb 乗算命令は他にはあ り ません。 アーキテ ク チ ャ ARM 命令 MUL お よ び MLA は、 ARM アーキ テ ク チ ャ のすべてのバージ ョ ン で使 用で き ます。 MLS 命令の ARM は、 ARMv6T2 以降で使用で き ます。 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 16 ビ ッ ト Thumb の MULS 命令は、 ARM アーキ テ ク チ ャ のすべての T バ リ ア ン ト で使用で き ます。 サン プル MUL MLA MULS MULLT MLS 4-80 r10, r2, r5 r10, r2, r1, r5 r0, r2, r2 r2, r3, r2 r4, r5, r6, r7 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.4.2 UMULL、 UMLAL、 SMULL、 SMLAL 符号付 き / 符号な し long 乗算命令 と 任意に指定で き る 積算命令です (32 ビ ッ ト × 32 ビ ッ ト を実行 し 、 64 ビ ッ ト の積算値 と 結果を返 し ます)。 構文 Op{S}{cond} RdLo, RdHi, Rn, Rm 各項目には以下の意味があ り ます。 Op UMULL、 UMLAL、 SMULL、 SMLAL のいずれか を指定 し ます。 S 任意に指定で き る 接尾文字です。 ARM 状態でのみ使用で き ま す。 S が指定 さ れてい る 場合は、 演算結果に基づいて条件 コ ー ド フ ラ グが更新 さ れます (「条件実行」 (ページ 2-20) を参照)。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 RdLo?RdHi デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 UMLAL お よ び SMLAL で は、 こ れ ら の レ ジ ス タ に累算値 も 保存 さ れ ます。 RdLo と RdHi に は、 それぞれ異な る レ ジ ス タ を指定す る 必要があ り ます。 Rn?Rm オペ ラ ン ド を保持す る ARM レ ジ ス タ を指定 し ます。 RdHi、 RdLo、 Rn、 ま たは Rm に r15 を使用 し ないで下 さ い。 使用法 UMULL 命令は Rn と Rm の値を符号な し 整数 と 解釈 し ます。 こ れ ら の整数を乗算 し て、 演算結果の下位 32 ビ ッ ト を RdLo に返 し 、 上位 32 ビ ッ ト を RdHi に返 し ま す。 UMLAL 命令は Rn と Rm の値を符号な し 整数 と 解釈 し ます。 こ れ ら の整数を乗算 し て得 ら れた 64 ビ ッ ト の演算結果を、 RdHi と RdLo が保持 し てい る 64 ビ ッ ト の 符号な し 整数に加算 し ます。 SMULL 命令は、 Rn と Rm の値を、 2 の補数 と な る 符号付 き 整数 と 解釈 し ます。 こ れ ら の整数を乗算 し て、 演算結果の下位 32 ビ ッ ト を RdLo に返 し 、 上位 32 ビ ッ ト を RdHi に返 し ます。 SMLAL 命令は、 Rn と Rm の値を、 2 の補数 と な る 符号付 き 整数 と 解釈 し ます。 こ れ ら の整数を乗算 し て得 ら れた 64 ビ ッ ト の演算結果を、 RdHi と RdLo が保持 し てい る 64 ビ ッ ト の符号付 き 整数に加算 し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-81 ARM 命令 と Thumb 命令 条件 フ ラ グ S が指定 さ れてい る 場合、 こ れ ら の命令では、 以下の よ う にな り ます。 • 結果に応 じ て N フ ラ グお よ び Z フ ラ グ を更新 し ます。 • C フ ラ グ ま たは V フ ラ グは更新 し ません。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARM アーキ テ ク チ ャ のすべてのバージ ョ ン で使用で き ます。 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル UMULL UMLALS 4-82 r0, r4, r5, r6 r4, r5, r3, r8 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.4.3 SMULxy、 SMLAxy 符号付 き 乗算命令 と 積和命令です (16 ビ ッ ト × 16 ビ ッ ト を実行 し 、 32 ビ ッ ト の積算値 と 結果を返 し ます)。 構文 SMUL<x><y>{cond} {Rd}, Rn, Rm SMLA<x><y>{cond} Rd, Rn, Rm, Ra 各項目には以下の意味があ り ます。 <x> B ま たは T を指定 し ます。 Rn の下位ビ ッ ト (ビ ッ ト [15:0]) を使用 す る 場合は B を、 Rn の上位ビ ッ ト (ビ ッ ト [31:16]) を使用す る 場 合は T を指定 し ます。 <y> B ま たは T を指定 し ます。 Rm の下位ビ ッ ト (ビ ッ ト [15:0]) を使用 す る 場合は B を、 Rm の上位ビ ッ ト (ビ ッ ト [31:16]) を使用す る 場 合は T を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn?Rm 乗算す る 値を保持す る レ ジ ス タ を指定 し ます。 Ra 加算す る 値を保持す る レ ジ ス タ を指定 し ます。 使用法 Rd、 Rn、 Rm、 お よ び Ra に r15 を使用 し ないで下 さ い。 SMULxy 命令は、 Rn と Rm の指定 さ れた上位半分ま たは下位半分の 16 ビ ッ ト 符号 付 き 整数を乗算 し 、 32 ビ ッ ト の演算結果を Rd に返 し ます。 SMLAxy 命令は、 Rn と Rm の指定 さ れた上位半分ま たは下位半分の 16 ビ ッ ト 符号 付 き 整数を乗算 し 、 32 ビ ッ ト の演算結果を Ra の 32 ビ ッ ト 値に加算 し 、 その 結果を Rd に返 し ます。 条件 フ ラ グ こ れ ら の命令に よ る N、 Z、 C、 ま たは V フ ラ グへの影響はあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-83 ARM 命令 と Thumb 命令 積算中にオーバーフ ロ ーが発生 し た場合、 SMLAxy に よ っ て Q フ ラ グが設定 さ れ ます。 Q フ ラ グの状態を読み出すには、 MRS 命令を使用 し ます (「MRS」 (ページ 4-143) を参照)。 注 SMLAxy に よ っ て Q フ ラ グが ク リ ア さ れ る こ と はあ り ません。 Q フ ラ グ を ク リ ア す る には、 MSR 命令を使用 し ます (「MSR」 (ページ 4-145) を参照)。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降、 お よ び ARMv5 の E バ リ ア ン ト で使用 で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル SMULTBEQ SMLABBNE SMLABT 4-84 r8, r7, r9 r0, r2, r1, r10 r0, r0, r3, r5 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.4.4 SMULWy、 SMLAWy 符号付 き ワ イ ド 乗算 と 符号付 き ワ イ ド 積和を実行 し ます (32 ビ ッ ト × 16 ビ ッ ト を実行 し 、 演算結果の上位 32 ビ ッ ト を返 し ます)。 構文 SMULW<y>{cond} {Rd}, Rn, Rm SMLAW<y>{cond} Rd, Rn, Rm, Ra 各項目には以下の意味があ り ます。 B ま たは T を指定 し ます。 Rm の下位ビ ッ ト (ビ ッ ト [15:0]) を使用 <y> す る 場合は B を、 Rm の上位ビ ッ ト (ビ ッ ト [31:16]) を使用す る 場 合は T を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn?Rm 乗算す る 値を保持す る レ ジ ス タ を指定 し ます。 Ra 加算す る 値を保持す る レ ジ ス タ を指定 し ます。 使用法 Rd、 Rn、 Rm、 お よ び Ra に r15 を使用 し ないで下 さ い。 SMULWy 命令は、 Rm の指定 さ れた上位半分ま たは下位半分の符号付 き 整数 と 、 Rn の符号付 き 整数を乗算 し 、 48 ビ ッ ト の演算結果の上位 32 ビ ッ ト を Rd に返 し ます。 SMLAWy 命令は、 Rm の選択 さ れた上位半分ま たは下位半分の符号付 き 整数 と Rn の符号付 き 整数を乗算 し 、 32 ビ ッ ト の演算結果を Ra 32 ビ ッ ト 値に加算 し 、 その結果を Rd に返 し ます。 条件 フ ラ グ こ れ ら の命令に よ る N、 Z、 C、 ま たは V フ ラ グへの影響はあ り ません。 累算中にオーバーフ ロ ーが発生 し た場合、 SMLAWy に よ っ て Q フ ラ グが設定 さ れます (「MRS」 (ページ 4-143) を参照)。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-85 ARM 命令 と Thumb 命令 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降、 お よ び ARMv5 の E バ リ ア ン ト で使用 で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 4-86 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.4.5 SMLALxy 16 ビ ッ ト オペ ラ ン ド と 64 ビ ッ ト のア キ ュ ム レー タ を使っ た符号付 き 積和命令 構文 SMLAL<x><y>{cond} RdLo, RdHi, Rn, Rm 各項目には以下の意味があ り ます。 B ま たは T を指定 し ます。 Rn の下位ビ ッ ト (ビ ッ ト [15:0]) を使用 <x> す る 場合は B を、 Rn の上位ビ ッ ト (ビ ッ ト [31:16]) を使用す る 場 合は T を指定 し ます。 B ま たは T を指定 し ます。 Rm の下位ビ ッ ト (ビ ッ ト [15:0]) を使用 <y> す る 場合は B を、 Rm の上位ビ ッ ト (ビ ッ ト [31:16]) を使用す る 場 合は T を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 RdHi?RdLo デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 こ れ ら の レ ジ ス タ は 累算値 も 保持 し ます。 RdHi と RdLo には、 それぞれ異な る レ ジ ス タ を指定す る 必要があ り ます。 Rn?Rm 乗算す る 値を保持す る レ ジ ス タ を指定 し ます。 RdHi、 RdLo、 Rn、 ま たは Rm に r15 を使用 し ないで下 さ い。 使用法 SMLALxy 命令は、 Rm の指定 さ れた上位半分ま たは下位半分の符号付 き 整数を、 Rn の指定 さ れた上位半分ま たは下位半分の符号付 き 整数 と 乗算 し 、 32 ビ ッ ト の演算結果を RdHi と RdLo が保持す る 64 ビ ッ ト 値に加算 し ます。 条件 フ ラ グ こ の命令に よ る フ ラ グへの影響はあ り ません。 注 SMLALxy 命令に よ っ て例外が発生す る こ と はあ り ません。 こ の命令でオーバー フ ロ ーが発生す る と 、 警告がない ま ま演算結果の一部が溢れた桁に よ っ て上 書 き さ れます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-87 ARM 命令 と Thumb 命令 アーキテ ク チ ャ こ の ARM 命令は、 ARMv6 以降、 お よ び ARMv5 の E バ リ ア ン ト で使用で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル SMLALTB SMLALBTVS 4-88 r2, r3, r7, r1 r0, r1, r9, r2 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.4.6 SMUAD{X}、 SMUSD{X} 任意でオペ ラ ン ド の半分を交換で き る 、 デ ュ アル 16 ビ ッ ト 符号付 き 積和命令 と 積差命令です。 構文 op{X}{cond} {Rd}, Rn, Rm 各項目には以下の意味があ り ます。 次のいずれか を指定 し ます。 op SMUAD デ ュ アル乗算後に積を加算 し ます。 SMUSD デ ュ アル乗算後に積を減算 し ます。 X 任意に指定で き る パ ラ メ ー タ です。 X が指定 さ れてい る 場合は、 乗算が行われ る 前に、 第 2 オペ ラ ン ド の上位ハーフ ワー ド と 下位 ハーフ ワー ド が入れ替わ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn?Rm オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Rd、 Rn、 Rm のいずれに も r15 を使用 し ないで下 さ い。 使用法 SMUAD は、 Rn の下位ハーフ ワ ー ド と Rm の下位ハーフ ワ ー ド を乗算 し 、 Rn の上位 ハーフ ワー ド と Rm の上位ハーフ ワー ド を乗算 し ます。 次に、 得 ら れた 2 つの 積を加算 し 、 その合計を Rd に ス ト ア し ます。 SMUSD は、 Rn の下位ハーフ ワ ー ド と Rm の下位ハーフ ワ ー ド を乗算 し 、 Rn の上位 ハーフ ワー ド と Rm の上位ハーフ ワー ド を乗算 し ます。 次に、 最初の積か ら 2 番目の積を減算 し 、 その差を Rd に ス ト ア し ます。 条件 フ ラ グ 加算がオーバーフ ロ ー し た場合、 SMUAD 命令に よ っ て Q フ ラ グが設定 さ れま す。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-89 ARM 命令 と Thumb 命令 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降、 お よ び ARMv5 の E バ リ ア ン ト で使用 で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル SMUAD SMUSDXNE 4-90 r2, r3, r2 r0, r1, r2 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.4.7 SMMUL、 SMMLA、 SMMLS 符号付 き 上位 ワー ド 乗算命令、 符号付 き 上位 ワ ー ド 乗算命令の累算、 符号付 き 上位 ワー ド 乗算命令の減算です。 こ れ ら の命令は 32 ビ ッ ト オペ ラ ン ド 間で の演算結果か ら 上位 32 ビ ッ ト のみを使用 し ます。 構文 SMMUL{R}{cond} {Rd}, Rn, Rm SMMLA{R}{cond} Rd, Rn, Rm, Ra SMMLS{R}{cond} Rd, Rn, Rm, Ra 各項目には以下の意味があ り ます。 R 任意に指定で き る パ ラ メ ー タ です。 R が指定 さ れてい る 場合は演 算結果の丸めが行われ、 指定 さ れていない場合は切 り 捨て ら れ ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn?Rm オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Ra 加算す る 値ま たは引かれ る 値を保持す る レ ジ ス タ を指定 し ます。 Rd、 Rn、 Rm、 Ra のいずれに も r15 を使用 し ないで下 さ い。 演算 SMMUL は Rn と Rm の値を乗算 し 、 64 ビ ッ ト 結果の上位 32 ビ ッ ト を Rd に ス ト ア し ます。 SMMLA は Rn と Rm の値を乗算 し 、 得 ら れた積の上位 32 ビ ッ ト に Ra の値を加算 し 、 その結果を Rd に ス ト ア し ます。 SMMLS は、 Rn と Rm の値を乗算 し て得 ら れた積を、 32 ビ ッ ト 左シ フ ト し た Ra の 値か ら 減算 し 、 結果の上位 32 ビ ッ ト を Rd に ス ト ア し ます。 オプシ ョ ンの R パ ラ メ ー タ が指定 さ れてい る 場合は、 上位 32 ビ ッ ト を取 り 出 す前に 0x80000000 が加算 さ れ ます。 こ の処理に よ っ て結果の丸めが行われま す。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-91 ARM 命令 と Thumb 命令 条件 フ ラ グ こ れ ら の命令に よ る フ ラ グへの影響はあ り ません。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降、 お よ び ARMv5 の E バ リ ア ン ト で使用 で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル SMMULGE SMMULR 4-92 r6, r4, r3 r2, r2, r2 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.4.8 SMLAD、 SMLSD デ ュ アル 16 ビ ッ ト 符号付 き 乗算を実行 し 、 積の加算ま たは減算 と 、 32 ビ ッ ト の積算を行 う 命令です。 構文 op{X}{cond} Rd, Rn, Rm, Ra 各項目には以下の意味があ り ます。 op 次のいずれか を指定 し ます。 SMLAD デ ュ アル乗算を行い、 積の和を累算 し ます。 SMLSD デ ュ アル乗算を行い、 積の差を累算 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 X 任意に指定で き る パ ラ メ ー タ です。 X が指定 さ れてい る 場合は、 乗算が行われ る 前に、 第 2 オペ ラ ン ド の上位ハーフ ワー ド と 下位 ハーフ ワー ド が入れ替わ り ます。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn?Rm オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Ra 累算オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Rd、 Rn、 Rm、 Ra のいずれに も r15 を使用 し ないで下 さ い。 演算 SMLAD は Rn の下位ハーフ ワー ド と Rm の下位ハーフ ワー ド を乗算 し 、 Rn の上位 ハーフ ワー ド と Rm の上位ハーフ ワー ド を乗算 し ます。 次に、 得 ら れた 2 つの 積を Ra の値に加算 し 、 その結果を Rd に ス ト ア し ます。 SMLSD は Rn の下位ハーフ ワー ド と Rm の下位ハーフ ワー ド を乗算 し 、 Rn の上位 ハーフ ワー ド と Rm の上位ハーフ ワー ド を乗算 し ます。 次に、 最初の積か ら 2 番目の積を減算 し 、 その差を Ra の値に加算 し て、 結果を Rd に ス ト ア し ます。 条件 フ ラ グ こ れ ら の命令に よ る フ ラ グへの影響はあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-93 ARM 命令 と Thumb 命令 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降、 お よ び ARMv5 の E バ リ ア ン ト で使用 で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル SMLSD SMLSDX SMLADLT 4-94 r1, r2, r0, r7 r11, r10, r2, r3 r1, r2, r4, r1 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.4.9 SMLALD、 SMLSLD デ ュ アル 16 ビ ッ ト 符号付 き 乗算を実行 し 、 積の加算ま たは減算 と 、 64 ビ ッ ト の累算を行 う 命令です。 構文 op{X}{cond} RdLo, RdHi, Rn, Rm 各項目には以下の意味があ り ます。 次のいずれか を指定 し ます。 op SMLALD デ ュ アル乗算を行い、 積の和を累算 し ます。 SMLSLD デ ュ アル乗算を行い、 積の差を累算 し ます。 X 任意に指定で き る パ ラ メ ー タ です。 X が指定 さ れてい る 場合は、 乗算が行われ る 前に、 第 2 オペ ラ ン ド の上位ハーフ ワー ド と 下位 ハーフ ワー ド が入れ替わ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 RdLo?RdHi 64 ビ ッ ト の結果を保持す る デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 こ れ ら の レ ジ ス タ には、 64 ビ ッ ト の累算オペ ラ ン ド も 保 持 さ れます。 RdHi と RdLo には、 それぞれ異な る レ ジ ス タ を指定す る 必要があ り ます。 Rn?Rm オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 RdLo、 RdHi、 Rn、 Rm のいずれに も r15 を使用 し ないで下 さ い。 演算 SMLALD は Rn の下位ハーフ ワー ド と Rm の下位ハーフ ワー ド を乗算 し 、 Rn の上位 ハーフ ワー ド と Rm の上位ハーフ ワー ド を乗算 し ます。 次に、 得 ら れた 2 つの 積を RdLo、 RdHi の値に加算 し 、 その合計を RdLo?RdHi に ス ト ア し ます。 SMLSLD は Rn の下位ハーフ ワー ド と Rm の下位ハーフ ワー ド を乗算 し 、 Rn の上位 ハーフ ワー ド と Rm の上位ハーフ ワー ド を乗算 し ます。 次に、 最初の積か ら 2 番目の積を減算 し 、 その差を RdLo?RdHi の値に加算 し て、 結果を RdLo?RdHi に ス ト ア し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-95 ARM 命令 と Thumb 命令 条件 フ ラ グ こ れ ら の命令に よ る フ ラ グへの影響はあ り ません。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降、 お よ び ARMv5 の E バ リ ア ン ト で使用 で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル SMLALD SMLSLD 4-96 r10, r11, r5, r1 r3, r0, r5, r1 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.4.10 UMAAL 符号な し 積和累算 long 命令です。 構文 UMAAL{cond} RdLo, RdHi, Rn, Rm 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 RdLo?RdHi 64 ビ ッ ト の結果を保持す る デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 こ れ ら の レ ジ ス タ には、 32 ビ ッ ト の 2 つの累算オペ ラ ン ド も 保持 さ れます。 RdLo と RdHi には、 それぞれ異な る レ ジ ス タ を 指定す る 必要があ り ます。 Rn?Rm 乗算オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 RdLo、 RdHi、 Rn、 Rm のいずれに も r15 は使用 し ないで下 さ い。 演算 UMAAL は Rn と Rm の 32 ビ ッ ト 値を乗算 し 、 RdHi と RdLo の 2 つの 32 ビ ッ ト 値を 加算 し 、 その 64 ビ ッ ト の結果を RdLo, RdHi に ス ト ア し ます。 条件 フ ラ グ こ の命令に よ る フ ラ グへの影響はあ り ません。 アーキテ ク チ ャ こ の ARM 命令は、 ARMv6 以降、 お よ び ARMv5 の E バ リ ア ン ト で使用で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル UMAAL UMAALGE ARM DUI 0204IJ r8, r9, r2, r3 r2, r0, r5, r3 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-97 ARM 命令 と Thumb 命令 4.4.11 MIA、 MIAPH、 MIAxy 内部積和命令です (32 ビ ッ ト × 32 ビ ッ ト を実行 し 、 40 ビ ッ ト の累算値を返 し ます)。 パ ッ ク ハーフ ワー ド の内部積和命令です (16 ビ ッ ト × 16 ビ ッ ト × 2 を実行 し 、 40 ビ ッ ト の累算値を返 し ます)。 内部積和命令です (16 ビ ッ ト × 16 ビ ッ ト を実行 し 、 40 ビ ッ ト の累算値を返 し ます)。 構文 MIA{cond} Acc, Rn, Rm MIAPH{cond} Acc, Rn, Rm MIA<x><y>{cond} Acc, Rn, Rm 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Acc 内部ア キ ュ ム レー タ を指定 し ます。 標準名は accx で、 x は 0 ~ n の整数です。 n の値はプ ロ セ ッ サに よ っ て異な り ます。 現在のプ ロ セ ッ サでは 0 が使用 さ れてい ます。 Rn?Rm 乗算す る 値を保持す る ARM レ ジ ス タ を指定 し ます。 Rn ま たは Rm に r15 を使用 し ないで下 さ い。 <x><y> 次のいずれか を指定 し ます。 BB, BT, TB, TT 使用法 MIA は Rn と Rm の符号付 き 整数を乗算 し 、 演算結果を Acc の 40 ビ ッ ト 値に加算 し ます。 MIAPH は Rn と Rm の下位半分の符号付 き 整数の乗算、お よ び Rn と Rm の上位半分 の符号付 き 整数の乗算を行い、 32 ビ ッ ト の 2 つの結果を Acc の 40 ビ ッ ト 値に 加算 し ます。 MIAxy 命令は Rs の指定 さ れた上位半分ま たは下位半分の符号付 き 整数 と Rm の 指定 さ れた上位半分ま たは下位半分の符号付 き 整数を乗算 し 、 32 ビ ッ ト の結 果を Acc の 40 ビ ッ ト 値に加算 し ます。 Rn の下位ビ ッ ト (ビ ッ ト [15:0]) を使用 4-98 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 す る 場合は <x> == B を、 Rn の上位ビ ッ ト (ビ ッ ト [31:16]) を使用す る 場合は <x> == T を指定 し ます。 Rm の下位ビ ッ ト (ビ ッ ト [15:0]) を使用す る 場合は <y> == B を、 Rm の上位ビ ッ ト (ビ ッ ト [31:16]) を使用す る 場合は <y> == T を指定 し ます。 条件 フ ラ グ こ れ ら の命令に よ る フ ラ グへの影響はあ り ません。 注 こ れ ら の命令に よ っ て例外が発生す る こ と はあ り ません。 こ れ ら の命令で オーバーフ ロ ーが発生す る と 、 警告がない ま ま演算結果の一部が溢れた桁に よ っ て上書 き さ れます。 アーキテ ク チ ャ こ れ ら の ARM コ プ ロ セ ッ サ 0 命令は、 XScale プ ロ セ ッ サでのみ使用で き ま す。 こ れ ら の命令の Thumb バージ ョ ンはあ り ません。 サン プル MIA MIALE MIAPH MIAPHNE MIABB MIABT MIATB MIATT MIABTGT ARM DUI 0204IJ acc0,r5,r0 acc0,r1,r9 acc0,r0,r7 acc0,r11,r10 acc0,r8,r9 acc0,r8,r8 acc0,r5,r3 acc0,r0,r6 acc0,r2,r5 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-99 ARM 命令 と Thumb 命令 4.5 サチ ュ レー ト 命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ンか ら 構成 さ れてい ます。 • 「サチ ュ レー ト 算術演算」 • 「QADD、 QSUB、 QDADD、 QDSUB」 (ページ 4-101) • 「SSAT、 USAT」 (ページ 4-103) 一部の並列命令 も サチ ュ レー ト 命令です。 詳細については、 「並列命令」 (ページ 4-105) を参照 し て下 さ い。 4.5.1 サチ ュ レ ー ト 算術演算 以下の演算が サチ ュ レー ト (SAT) 演算です。 つま り 、 サチ ュ レー ト 命令に応 じ て、 2n の値は以下の よ う にな り ます。 • 符号付 き サチ ュ レー ト 演算では、 結果が -2n 未満の場合には、 返 さ れ る 結果は -2n にな り ます。 • 符号な し サチ ュ レー ト 演算では、 結果が負 と な る 場合には、 返 さ れ る 結 果はゼ ロ と な り ます。 • 結果が 2n - 1 よ り も 大 き い場合には、 返 さ れ る 結果は 2n - 1 と な り ます。 上記のいずれかに当ては ま る 演算を サチ ュ レーシ ョ ン と 呼びます。 一部の命 令では、 サチ ュ レーシ ョ ンが発生す る と Q フ ラ グ を設定 し ます。 注 サチ ュ レーシ ョ ンが発生 し ない場合に、 サチ ュ レー ト 命令に よ っ て Q フ ラ グ が ク リ ア さ れ る こ と はあ り ません。 Q フ ラ グ を ク リ アす る には、 MSR 命令を使 用 し ます (「MSR」 (ページ 4-145) を参照)。 Q フ ラ グは、 他の 2 つの命令に よ っ て も 設定で き ますが (「SMULxy、 SMLAxy」 (ページ 4-83) と 「SMULWy、 SMLAWy」 (ページ 4-85) を参照)、 それ ら の命令はサチ ュ レー ト し ません。 4-100 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.5.2 QADD、 QSUB、 QDADD、 QDSUB –231 ≤ x ≤ 231–1 の符号付 き 範囲で演算結果をサチ ュ レー ト さ せ る 、 符号付 き 加 算、 減算、 倍演算 と 加算、 お よ び倍演算 と 減算です。 「並列加算 と 並列減算」 (ページ 4-106) も 参照 し て下 さ い。 構文 op{cond} {Rd}, Rm, Rn 各項目には以下の意味があ り ます。 op QADD、 QSUB、 QDADD、 QDSUB のいずれか を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rm?Rn オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Rd、 Rm、 ま たは Rn に r15 を使用 し ないで下 さ い。 使用法 QADD 命令は Rm と Rn の値を加算 し ます。 QSUB 命令は Rn の値か ら Rm の値を減算 し ます。 QDADD 命令は SAT(Rm + SAT(Rn * 2)) を計算 し ます。 倍演算、 加算、 あ る いはその 両方で、 サチ ュ レーシ ョ ン が発生す る 可能性があ り ます。 倍演算でサチ ュ レーシ ョ ンが発生 し 、 かつ加算では発生 し ない場合、 Q フ ラ グは設定 さ れま すが、 最終結果はサチ ュ レー ト し てい ません。 QDSUB 命令は SAT(Rm - SAT(Rn * 2)) を計算 し ます。 倍演算、 減算、 あ る いはその 両方で、 サチ ュ レーシ ョ ン が発生す る 可能性があ り ます。 倍演算でサチ ュ レーシ ョ ンが発生 し 、 かつ減算では発生 し ない場合、 Q フ ラ グは設定 さ れま すが、 最終結果はサチ ュ レー ト し てい ません。 注 こ れ ら の命令では、 すべての値が 2 の補数の符号付 き 整数 と し て処理 さ れま す。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-101 ARM 命令 と Thumb 命令 同様の、 ARMv6 以降でのみ使用可能な並列命令については、 「並列加算 と 並 列減算」 (ページ 4-106) を参照 し て下 さ い。 条件 フ ラ グ サチ ュ レーシ ョ ンが発生す る と 、 こ れ ら の命令に よ っ て Q フ ラ グが設定 さ れ ます。 Q フ ラ グの状態を読み出すには、 MRS 命令を使用 し ます (「MRS」 (ペー ジ 4-143) を参照)。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降、 お よ び ARMv5 の E バ リ ア ン ト で使用 で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル QADD r0, r1, r9 QDSUBLT r9, r0, r1 4-102 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.5.3 SSAT、 USAT 任意の ビ ッ ト 位置に対す る 符号付 き サチ ュ レー ト 命令 と 符号な し サチ ュ レー ト 命令です。 オプシ ョ ン と し て、 サチ ュ レー ト 前にシ フ ト を実行で き ます。 SSAT 符号付 き の値を符号付 き 範囲内でサチ ュ レー ト し ます。 USAT 符号付 き の値を符号な し 範囲内でサチ ュ レー ト し ます。 「SSAT16、 USAT16」 (ページ 4-111) も 参照 し て下 さ い。 構文 op{cond} Rd, #sat, Rm{, shift} 各パ ラ メ ー タ には以下の意味があ り ます。 op SSAT ま たは USAT を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rd に r15 は指定で き ません。 sat サチ ュ レー ト さ せ る ビ ッ ト 位置を指定 し ます。SSAT の場合は 1 ~ 32、 USAT の場合は 0 ~ 31 の値 と な り ます。 Rm オペ ラ ン ド を格納す る レ ジ ス タ を指定 し ます。 Rm に r15 は指定で き ません。 shift 任意に指定で き る シ フ ト です。 以下のいずれか を指定す る 必要が あ り ます。 ASR #n ただ し 、 n の範囲は 1 ~ 32 (ARM) ま たは 1 ~ 31 (Thumb-2) を指定 し ます。 LSL #n ただ し 、 n の範囲は 0 ~ 31 を指定 し ます。 演算 SSAT 命令は指定 さ れたシ フ ト を行い、 その後に符号付 き 範囲 –2sat–1 ≤ x ≤ 2sat–1 –1 でサチ ュ レー ト し ます。 USAT 命令は指定 さ れたシ フ ト を行い、 その後に符号な し 範囲 0 ≤ x ≤ 2sat – 1 で サチ ュ レー ト し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-103 ARM 命令 と Thumb 命令 条件 フ ラ グ サチ ュ レーシ ョ ンが発生す る と 、 こ れ ら の命令に よ っ て Q フ ラ グが設定 さ れ ます。 Q フ ラ グの状態を読み出すには、 MRS 命令を使用 し ます (「MRS」 (ペー ジ 4-143) を参照)。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降で使用で き ます。 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル SSAT USATNE 4-104 r7, #16, r7, LSL #4 r0, #7, r5 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.6 並列命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「並列加算 と 並列減算」 (ページ 4-106) バ イ ト 単位お よ びハーフ ワ ー ド 単位の さ ま ざ ま な加算 と 減算です。 • 「USAD8、 USADA8」 (ページ 4-109) 符号な し 絶対差の和 と 符号な し 絶対差の和の累算です。 • 「SSAT16、 USAT16」 (ページ 4-111) 並列ハーフ ワー ド サチ ュ レー ト 命令です。 こ の他に、 並列展開命令 も あ り ます。 詳細については、 「SXT、 SXTA、 UXT、 UXTA」 (ページ 4-117) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-105 ARM 命令 と Thumb 命令 4.6.1 並列加算 と 並列減算 バ イ ト 単位お よ びハーフ ワ ー ド 単位の さ ま ざ ま な加算 と 減算です。 構文 <prefix>op{cond} {Rd}, Rn, Rm 各項目には以下の意味があ り ます。 <prefix> 次のいずれか を指定 し ます。 S 符号付 き 余 り 算術演算 28 ま たは 216 です。 APSR の GE フ ラ グが設定 さ れます。 Q 符号付 き サチ ュ レー ト 算術演算です。 SH 符号付 き 算術演算を行い、 結果を半分に し ます。 U 符号な し 余 り 算術演算 28 ま たは 216 です。 APSR の GE フ ラ グが設定 さ れます。 UQ 符号な し サチ ュ レー ト 算術演算です。 UH 符号な し 算術演算を行い、 結果を半分に し ます。 op 次のいずれか を指定 し ます。 ADD8 バ イ ト 単位の加算を行い ます。 ADD16 ハーフ ワー ド 単位の加算を行い ます。 SUB8 バ イ ト 単位の減算を行い ます。 SUB16 ハーフ ワー ド 単位の減算を行い ます。 ASX Rm のハーフ ワー ド を交換 し 、 上位ハーフ ワー ド の加算 と 下位ハーフ ワー ド の減算を行い ます。 SAX Rm のハーフ ワー ド を交換 し 、 上位ハーフ ワー ド の減算 と 下位ハーフ ワー ド の加算を行い ます。 4-106 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rd に r15 を使用 し な いで下 さ い。 Rm?Rn オペ ラ ン ド を保持す る ARM レ ジ ス タ を指定 し ます。 Rm ま たは Rn に r15 を使用 し ないで下 さ い。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 演算 こ れ ら の命令は、 オペ ラ ン ド のバ イ ト ま たはハーフ ワ ー ド に対 し 、 個別に算 術演算を実行 し ます。 2 つか 4 つの加算ま たは減算、 あ る いは 1 つの加算 と 1 つの減算を実行 し ます。 以下の よ う な さ ま ざ ま な種類の演算を選択で き ます。 • 28 ま たは 216 の符号付 き / 符号な し 余 り の算術演算。 こ れに よ り APSR の GE フ ラ グが設定 さ れ ます (「「条件フ ラ グ」」 を参照)。 • 符号付 き 範囲 –215 ≤ x ≤ 215 –1 ま たは –27 ≤ x ≤ 27 –1 のいずれかに対す る 符号付 き サチ ュ レー ト 算術演算。 こ れ ら の演算がサチ ュ レー ト す る 場合 で も Q フ ラ グへの影響はあ り ません。 • 符号な し 範囲 0 ≤ x ≤ 216 –1 ま たは 0 ≤ x ≤ 28 –1 のいずれかに対す る 符号 な し サチ ュ レー ト 算術演算。 こ れ ら の演算がサチ ュ レー ト す る 場合で も Q フ ラ グへの影響はあ り ません。 • 符号付 き / 符号な し 算術演算。 結果は二分 さ れ ます。 こ れに よ っ てオー バーフ ロ ーが発生す る こ と はあ り ません。 条件 フ ラ グ こ れ ら の命令に よ る N、 Z、 C、 V、 ま たは Q フ ラ グへの影響はあ り ません。 こ れ ら の命令に接頭文字 Q、 SH、 UQ お よ び UH を使用 し た場合で も 、 フ ラ グへの 影響はあ り ません。 こ れ ら の命令に接頭文字 S と U を使用 し た場合は、 APSR の GE フ ラ グが以下 の よ う に設定 さ れます。 • • ARM DUI 0204IJ バ イ ト 単位の演算では、 GE フ ラ グは 32 ビ ッ ト の SUB と ADD 命令におけ る C (キ ャ リ ー) フ ラ グ と 同様の方法で使用 さ れ ます。 GE[0] 結果のビ ッ ト [7:0] に対応 し ます。 GE[1] 結果のビ ッ ト [15:8] に対応 し ます。 GE[2] 結果のビ ッ ト [23:16] に対応 し ます。 GE[3] 結果のビ ッ ト [31:24] に対応 し ます。 ハーフ ワー ド 単位の演算では、 GE フ ラ グは通常の ワー ド 単位の -SUB命令お よ び SUB と ADD 命令におけ る C (キ ャ リ ー) フ ラ グ と 同様の方法 で使用 さ れます。 GE[1:0] 結果のビ ッ ト [15:0] に対応 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-107 ARM 命令 と Thumb 命令 GE[3:2] 結果の ビ ッ ト [31:16] に対応 し ます。 こ れ ら の フ ラ グ を使用 し て、 次に続 く SEL 命令を制御で き ます (「SEL」 (ペー ジ 4-70) を参照)。 注 ハーフ ワー ド 単位の演算では、 GE[1:0] が同時にセ ッ ト ま たは ク リ ア さ れ、 GE[3:2] が同時にセ ッ ト ま たは ク リ ア さ れ ます。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降で使用で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル SHADD8 USAXNE r4, r3, r9 r0, r0, r2 誤用例 QHADD SAX 4-108 r2, r9, r3 r10, r8, r5 ; No such instruction, should be QHADD8 or QHADD16 ; Must have a prefix. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.6.2 USAD8、 USADA8 符号な し 絶対差の和 と 符号な し 絶対差の和の累算です。 構文 USAD8{cond} {Rd}, Rn, Rm USADA8{cond} Rd, Rn, Rm, Ra 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn 第 1 オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Rm 第 2 オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Ra 累算オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Rd、 Rn、 Rn、 ま たは Ra に r15 を使用 し ないで下 さ い。 演算 USAD8 命令は、 Rn と Rm のそれぞれ対応す る バ イ ト の符号な し 値に基づいて、 4 つのバ イ ト の差分を取 り ます。 こ の命令は、 4 つの差分の絶対値を加算 し 、 そ の結果を Rd に ス ト ア し ます。 USADA8 命令は、 4 つの差分の絶対値を Ra の値に加算 し 、 その結果を Rd に保存 し ます。 条件 フ ラ グ こ れ ら の命令に よ る フ ラ グへの影響はあ り ません。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降で使用で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-109 ARM 命令 と Thumb 命令 サン プル USAD8 USADA8 USADA8VS r2, r4, r6 r0, r3, r5, r2 r0, r4, r0, r1 誤用例 USADA8 USADA16 4-110 r2, r4, r6 r0, r4, r0, r1 ; USADA8 requires four registers ; no such instruction Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.6.3 SSAT16、 USAT16 並列ハーフ ワー ド サチ ュ レー ト 命令です。 SSAT16 符号付 き の値を符号付 き 範囲内でサチ ュ レー ト し ます。 USAT16 符号付 き の値を符号な し 範囲内でサチ ュ レー ト し ます。 構文 op{cond} Rd, #sat, Rn 各パ ラ メ ー タ には以下の意味があ り ます。 次のいずれか を指定 し ます。 op SSAT16 符号付 き サチ ュ レーシ ョ ン を実行 し ます。 USAT16 符号な し サチ ュ レーシ ョ ン を実行 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 sat サチ ュ レー ト さ せ る ビ ッ ト 位置を指定 し ます。 SSAT16 の場合は 1 ~ 16、 USAT16 の場合は 0 ~ 15 の値 と な り ます。 Rn オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Rd ま たは Rn に r15 を使用 し ないで下 さ い。 演算 任意の ビ ッ ト 位置に対 し てハーフ ワー ド 単位の符号付 き / 符号な し サチ ュ レーシ ョ ン を実行 し ます。 SSAT16 命令は、 符号付 き 範囲 –2sat–1 ≤ x ≤ 2sat–1 –1 で、 各ハーフ ワー ド をサ チ ュ レー ト し ます。 USAT16 命令は、 符号な し 範囲 0 ≤ x ≤ 2sat –1 で、 各ハーフ ワ ー ド を サチ ュ レー ト し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-111 ARM 命令 と Thumb 命令 条件 フ ラ グ いずれかのハーフ ワ ー ド に対す る サチ ュ レーシ ョ ンが発生す る と 、 こ れ ら の 命令に よ っ て Q フ ラ グが設定 さ れます。 Q フ ラ グの状態を読み出すには、 MRS 命令を使用 し ます (「MRS」 (ページ 4-143) を参照)。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降で使用で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル SSAT16 USAT16 r7, #12, r7 r0, #7, r5 誤用例 SSAT16 4-112 r1, #16, r2, LSL #4 ; shifts not permitted with halfword saturations Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.7 パ ッ ク 命令 と 展開命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「BFC、 BFI」 (ページ 4-114) ビ ッ ト フ ィ ール ド の ク リ ア命令 と 挿入命令です。 • 「SBFX、 UBFX」 (ページ 4-116) 符号付 き / 符号な し ビ ッ ト フ ィ ール ド の抽出命令です。 • 「SXT、 SXTA、 UXT、 UXTA」 (ページ 4-117) 必要に応 じ て加算命令を伴 う 、 符号拡張命令ま たはゼ ロ 拡張命令です。 • 「PKHBT、 PKHTB」 (ページ 4-120) ハーフ ワー ド パ ッ ク 命令です。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-113 ARM 命令 と Thumb 命令 4.7.1 BFC、 BFI ビ ッ ト フ ィ ール ド の ク リ ア命令 と 挿入命令です。 レ ジ ス タ 内の一連の ビ ッ ト を ク リ アす る か、 ま たは 1 つの レ ジ ス タ か ら 別の レ ジ ス タ に一連の ビ ッ ト を 挿入 し ます。 構文 BFC{cond} Rd, #lsb, #width BFI{cond} Rd, Rn, #lsb, #width 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rd に r15 は指定で き ません。 Rn ソ ース レ ジ ス タ を指定 し ます。 Rn に r15 は指定で き ません。 lsb ク リ ア ま たは コ ピーす る 最下位ビ ッ ト を指定 し ます。 width ク リ ア ま たは コ ピーす る ビ ッ ト 数を指定 し ます。width を 0 にはで き ません。 ま た、 (width+lsb) は 32 未満にな る 必要があ り ます。 BFC Rd の lsb か ら width ビ ッ ト 分のビ ッ ト が ク リ ア さ れ ます。 Rd 内の他の ビ ッ ト は 変更 さ れ ません。 BFI width 分の ビ ッ ト が Rd の lsb か ら ク リ ア さ れ、Rn の ビ ッ ト [0] か ら 始ま る width 分のビ ッ ト に よ っ て置 き 換え ら れ ます。 Rd 内の他の ビ ッ ト は変更 さ れ ません。 条件 フ ラ グ こ れ ら の命令に よ る フ ラ グへの影響はあ り ません。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6T2 以降で使用で き ます。 4-114 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-115 ARM 命令 と Thumb 命令 4.7.2 SBFX、 UBFX 符号付 き / 符号な し ビ ッ ト フ ィ ール ド の抽出命令です。 隣接す る ビ ッ ト を あ る レ ジ ス タ か ら 別の レ ジ ス タ の最下位ビ ッ ト に コ ピー し 、 32 ビ ッ ト に符号拡張 ま たはゼ ロ 拡張 し ます。 構文 op{cond} Rd, Rn, #lsb, #width 各項目には以下の意味があ り ます。 op SBFX ま たは UBFX を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn ソ ース レ ジ ス タ を指定 し ます。 lsb ビ ッ ト フ ィ ール ド の最下位ビ ッ ト の ビ ッ ト 番号を 0 ~ 31 の範囲 内で指定 し ます。 ビ ッ ト フ ィ ール ド の幅を 1 ~ (32–lsb) の範囲内で指定 し ます。 width Rd ま たは Rn に r15 を使用 し ないで下 さ い。 条件 フ ラ グ こ れ ら の命令に よ る フ ラ グへの影響はあ り ません。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 4-116 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.7.3 SXT、 SXTA、 UXT、 UXTA 符号拡張、 符号拡張 と 加算、 ゼ ロ 拡張、 ゼ ロ 拡張 と 加算。 構文 SXT<extend>{cond} {Rd}, Rm {,rotation} SXTA<extend>{cond} {Rd}, Rn, Rm {,rotation} UXT<extend>{cond} {Rd}, Rm {,rotation} UXTA<extend>{cond} {Rd}, Rn, Rm {,rotation} 各項目には以下の意味があ り ます。 <extend> 次のいずれか を指定 し ます。 B16 2 つの 8 ビ ッ ト 値を 2 つの 16 ビ ッ ト 値に拡張 し ます。 B 8 ビ ッ ト 値を 32 ビ ッ ト 値に拡張 し ます。 H 16 ビ ッ ト 値を 32 ビ ッ ト 値に拡張 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn 加算す る 数を保持す る レ ジ ス タ を指定 し ます (SXTA と UXTA の場 合のみ)。 Rm 拡張す る 値を保持す る レ ジ ス タ を指定 し ます。 rotation 次のいずれか を指定 し ます。 ROR #8 Rm の値が右に 8 ビ ッ ト ロ テー ト さ れ ます。 ROR #16 Rm の値が右に 16 ビ ッ ト ロ テー ト さ れ ます。 ROR #24 Rm の値が右に 24 ビ ッ ト ロ テー ト さ れ ます。 rotation を省略 し た場合、 ロ テー ト は実行 さ れません。 Rd、 Rn、 ま たは Rm に r15 を使用 し ないで下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-117 ARM 命令 と Thumb 命令 演算 こ れ ら の命令は以下の処理を行い ます。 1. Rm の値を右に 0 ビ ッ ト 、 8 ビ ッ ト 、 16 ビ ッ ト 、 ま たは 24 ビ ッ ト ロ テー ト し ます。 2. 取得 し た値に対 し て以下のいずれかの処理を行い ます。 • ビ ッ ト [7:0] を抽出 し 、 32 ビ ッ ト に符号拡張ま たはゼ ロ 拡張 し ま す。 命令で拡張 と 加算を行 う 場合は、 Rn の値を加算 し ます。 • ビ ッ ト [15:0] を抽出 し 、 32 ビ ッ ト に符号拡張ま たはゼ ロ 拡張 し ま す。 命令で拡張 と 加算を行 う 場合は、 Rn の値を加算 し ます。 • ビ ッ ト [23:16] と ビ ッ ト [7:0] を抽出 し 、 こ れ ら の ビ ッ ト を 16 ビ ッ ト に符号拡張ま たはゼ ロ 拡張 し ます。 命令で拡張 と 加算を行 う 場合 は、 こ れ ら の ビ ッ ト を それぞれ Rn のビ ッ ト [31:16] と ビ ッ ト [15:0] に加算 し て、 結果の ビ ッ ト [31:16] と ビ ッ ト [15:0] を作成 し ます。 条件 フ ラ グ こ れ ら の命令に よ る フ ラ グへの影響はあ り ません。 16 ビ ッ ト 命令 Thumb コ ー ド 内で使用す る と き は、 次の形式だけが 16 ビ ッ ト 命令にな り ま す。 ま た、 Thumb-2 以前の Thumb コ ー ド 内で使用で き る のは、 こ れ ら の命令 だけです。 SXTB Rd, Rm Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 SXTH Rd, Rm Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 UXTB Rd, Rm Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 UXTH Rd, Rm Rd お よ び Rm は共に Lo レ ジ ス タ であ る 必要があ り ます。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降で使用で き ます。 SXTA と UXTA Thumb 命令は ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 SXT と UXT の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 4-118 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 SXT と UXT の 16 ビ ッ ト Thumb 命令は、 ARMv6 以降で使用で き ます。 サン プル SXTH UXTAB16EQ r3, r9, r4 r0, r0, r4, ROR #16 誤用例 SXTH ARM DUI 0204IJ r9, r3, r2, ROR #12 ; rotation must be by 0, 8, 16, or 24. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-119 ARM 命令 と Thumb 命令 4.7.4 PKHBT、 PKHTB ハーフ ワー ド パ ッ ク 命令です。 あ る レ ジ ス タ に保持 さ れてい る ハーフ ワ ー ド と 別の レ ジ ス タ に保持 さ れてい る ハーフ ワー ド を結合 し ます。 オペ ラ ン ド の 1 つは、 ハーフ ワー ド を抽出す る 前にシ フ ト で き ます。 構文 PKHBT{cond} {Rd}, Rn, Rm{, LSL #leftshift} PKHTB{cond} {Rd}, Rn, Rm{, ASR #rightshift} 各パ ラ メ ー タ には以下の意味があ り ます。 Rn の ビ ッ ト [15:0] と シ フ ト さ れた Rm の値の ビ ッ ト [31:16] を結合 PKHBT し ます。 Rn の ビ ッ ト [31:16] と シ フ ト さ れた Rm の値の ビ ッ ト [15:0] を結合 PKHTB し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rn 第 1 オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 Rm 第 1 オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 leftshift 0 ~ 31 の範囲内にあ る 値を指定 し ます。 rightshift 1 ~ 32 の範囲内にあ る 値を指定 し ます。 Rd、 Rn、 ま たは Rm に r15 を使用 し ないで下 さ い。 条件 フ ラ グ こ れ ら の命令に よ る フ ラ グへの影響はあ り ません。 4-120 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6 以降で使用で き ます。 こ の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 ただ し 、 ARMv7-M プ ロ フ ァ イ ルでは使用で き ません。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 サン プル PKHBT PKHBT PKHTB r0, r3, r5 ; ; r0, r3, r5, LSL #16 ; ; r0, r3, r5, ASR #16 ; ; combine the bottom halfword of r3 with the top halfword of r5 combine the bottom halfword of r3 with the bottom halfword of r5 combine the top halfword of r3 with the top halfword of r5 ま た、 異な る シ フ ト 値を使用 し て、 第 2 オペ ラ ン ド を位取 り す る こ と も で き ます。 誤用例 PKHBTEQ r4, r5, r1, ASR #8 ARM DUI 0204IJ ; ASR not permitted with PKHBT Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-121 ARM 命令 と Thumb 命令 4.8 分岐命令 と 制御命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ンか ら 構成 さ れてい ます。 • 「B、 BL、 BX、 BLX、 BXJ」 (ページ 4-123) 分岐、 リ ン ク 付 き 分岐、 分岐 と 命令セ ッ ト の切 り 替え、 リ ン ク 付 き 分岐 と 命令セ ッ ト の切 り 替え、 お よ び分岐 と 命令セ ッ ト の Jazelle への変更を 行 う 命令です。 • 「IT」 (ページ 4-127) If-Then 命令です。 IT 命令は、 後続す る 最大 4 個の命令を条件付 き 命令に し ます。 その際に、 条件はすべて同 じ にす る こ と も 、 一部の命令に対 し ては条件を 1 つ設定 し 、 残 り の命令に対 し ては逆条件を設定す る こ と も 可能です。 IT を使用で き る のは、 Thumb-2 だけです。 • 「CBZ、 CBNZ」 (ページ 4-130) ゼ ロ と の比較 と 分岐を行 う 命令です。 こ れ ら の命令は、 Thumb-2 でのみ 使用で き ます。 • 「TBB、 TBH」 (ページ 4-131) テーブル分岐バ イ ト と テーブル分岐ハーフ ワー ド です。 こ れ ら の命令 は、 Thumb-2 でのみ使用で き ます。 4-122 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.8.1 B、 BL、 BX、 BLX、 BXJ 分岐、 リ ン ク 付 き 分岐、 分岐 と 命令セ ッ ト の切 り 替え、 リ ン ク 付 き 分岐 と 命 令セ ッ ト の切 り 替え、 分岐 と Jazelle 状態への変更を行 う 命令です。 構文 op1{cond}{.W} label op2{cond} Rm 各項目には以下の意味があ り ます。 ARM DUI 0204IJ op1 次のいずれか を指定 し ます。 B 分岐命令です。 BL リ ン ク 付 き 分岐命令です。 BLX リ ン ク 付 き 分岐 と 命令セ ッ ト の切 り 替え を行 う 命令で す。 op2 次のいずれか を指定 し ます。 BX 分岐 と 命令セ ッ ト の切 り 替え を行 う 命令です。 BLX リ ン ク 付 き 分岐 と 命令セ ッ ト の切 り 替え を行 う 命令で す。 BXJ 分岐 と Jazelle 実行状態への変更を行 う 命令です。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 cond は、 こ れ ら の命令のすべての形式で使用で き る わけ ではあ り ません。 「命令の使用可否 と 分岐の範囲」 (ページ 4-124) を参照 し て下 さ い。 .W Thumb-2 の 32 ビ ッ ト B 命令を使用 さ せ る ために命令の幅の指定 子を指定 し ます (省略可)。 詳細については、 「Thumb-2 の B」 (ページ 4-125) を参照 し て下 さ い。 label プ ロ グ ラ ム相対式を指定 し ます。 詳細については、 「レ ジ ス タ 相 対式 と プ ロ グ ラ ム相対式」 (ページ 3-39) を参照 し て下 さ い。 Rm 分岐先ア ド レ ス を保持す る レ ジ ス タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-123 ARM 命令 と Thumb 命令 演算 こ れ ら のすべての命令は、 label への分岐ま たは Rm に保持 さ れてい る ア ド レ ス への分岐を発生 さ せます。 さ ら に、 以下の処理を行い ます。 • BL と BLX 命令は、 次の命令のア ド レ ス を lr (r14 : リ ン ク レ ジ ス タ ) に コ ピー し ます。 • BX と BLX 命令は、 プ ロ セ ッ サ状態を ARM か ら Thumb に変更 し た り 、 Thumb か ら ARM に変更 し た り で き ます。 BLX label を使用す る と 、 状態が必ず変更 さ れ ます。 BX Rm と BLX Rm を使用す る と Rm の ビ ッ ト [0] か ら タ ーゲ ッ ト の状態を得 る こ と がで き ます。 — Rm のビ ッ ト [0] が 0 の場合、 プ ロ セ ッ サは ARM 状態に切 り 替わ る か、 ARM 状態が維持 さ れ ます。 — Rm のビ ッ ト [0] が 1 の場合、プ ロ セ ッ サは Thumb 状態に切 り 替わ る か、 Thumb 状態が維持 さ れ ます。 • BXJ 命令はプ ロ セ ッ サの状態を Jazelle に変更 し ます。 命令の使用可否 と 分岐の範囲 表 4-7 は、 ARM 状態 と Thumb 状態で使用で き る 命令を示 し てい ます。 こ の表 に記載 さ れていない命令は使用で き ません。 括弧内は、 命令を使用で き る アーキ テ ク チ ャ の最初のバージ ョ ン を示 し てい ます。 表 4-7 分岐命令の使用可否 と 分岐の範囲 32 ビ ッ ト の Thumb 32 ビ ッ ト の Thumb (すべ て) ±2KB (すべて の T) ±16MBa (すべての T2) ±32MB (すべ て) -252 ~ +258 (すべて の T) ±1MBa (すべての T2) BL label ±32MB (すべ て) ±4MBb (すべて の T) ±16MB (すべての T2) BL{cond} label ±32MB (すべ て) - - - BX Rm 使用可能 (4T、 5) 使用可能 16 ビ ッ ト を使用 (すべての T2) 命令 ARM B label ±32MB B{cond} label 4-124 (すべて の T) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 表 4-7 分岐命令の使用可否 と 分岐の範囲 (続き) 32 ビ ッ ト の Thumb 32 ビ ッ ト の Thumb (4T、 5) - - - ±32MB (5) ±4MB b (5T) ±16MB (ARMv7-M を 除 く すべての T2) BLX Rm 使用可能 (5) 使用可能 (5T) 16 ビ ッ ト を使用 (すべての T2) BLX{cond} Rm 使用可能 (5) - - - BXJ Rm 使用可能 (5J、 6) - 使用可能 (ARMv7-M を 除 く すべての T2) BXJ{cond} Rm 使用可能 (5J、 6) - - - 命令 ARM BX{cond} Rm 使用可能 BLX label a. こ の 32 ビ ッ ト 命令を使用す る よ う アセ ンブ ラ に指定す る 場合は .W を使用 し ます。 b. こ れは命令対です。 分岐の範囲の拡張 マシ ン レベルの B 命令 と BL 命令では、 現在の命令のア ド レ ス か ら 分岐で き る 範囲が制限 さ れてい ます。 ただ し 、 label が範囲外の場合で も こ れ ら の命令を 使用で き ます。 ほ と ん ど の場合、 リ ン カが label を配置す る 場所は分か り ませ ん。 必要な場合には、 リ ン カは コ ー ド を追加 し て よ り 長い分岐を可能に し ま す。 『 リ ン カユーザガ イ ド 』 の第 3 章 基本 リ ン カ機能の使用 を参照 し て下 さ い。 追加 さ れた コ ー ド は veneer (ベニア) と 呼ばれます。 Thumb-2 の B .W 幅指定子を使用 し て、 B で Thumb-2 コ ー ド の 32 ビ ッ ト 命令を生成す る こ と がで き ます。 B.W は、 16 ビ ッ ト 命令を使用 し て タ ーゲ ッ ト に到達で き る 場合で も 、 常に 32 ビ ッ ト 命令を生成 し ます。 参考 と し て、 32 ビ ッ ト Thumb 命令が使用で き る タ ーゲ ッ ト で失敗が発生 し て も 、 .W 指定な し の B が常に 16 ビ ッ ト Thumb コ ー ド の命令を生成 し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-125 ARM 命令 と Thumb 命令 Thumb-2EE での BX、 BLX、 および BXJ こ れ ら の命令は、 Thumb-2EE コ ー ド 内で分岐 と し て使用で き ますが、 状態の 変更には使用で き ません。 こ の命令は op{cond} label 形式では Thumb-2EE で使 用で き ません。 レ ジ ス タ 形式では Rm の ビ ッ ト [0] が 1 にな っ てい る 必要があ り 、 タ ーゲ ッ ト ア ド レ ス での実行は ThumbEE 状態で継続 し ます。 条件 フ ラ グ こ れ ら の命令に よ る フ ラ グへの影響はあ り ません。 アーキテ ク チ ャ 各アーキ テ ク チ ャ での こ れ ら の命令の使用可否の詳細については、 「命令の使 用可否 と 分岐の範囲」 (ページ 4-124) を参照 し て下 さ い。 サン プル B BLE BL BLLT BEQ 4-126 loopA ng+8 subC rtX {pc}+4 ; #0x8004 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.8.2 IT IT (If-Then) 命令は、 後続す る 最大 4 個の命令 (IT ブ ロ ッ ク ) を条件付 き 命 令に し ます。 条件はすべて同 じ にす る こ と も 、 論理的に逆の条件を混在 さ せ る こ と も 可能です。 IT ブ ロ ッ ク 内の命令 (分岐 も 含む) は、 構文の {cond} の部分の条件 も 指定す る 必要があ り ます。 コ ー ド 内に IT 命令を記述す る 必要はあ り ません。 後続の命令に指定 さ れた条 件に従っ て、 アセ ン ブ ラ に よ り 自動的に生成 さ れ る か ら です。 ただ し 、 IT 命 令を記述す る と 、 アセ ンブ ラ は IT 命令に指定 さ れた条件を、 後続の命令に指 定 さ れた条件 と 突 き 合わせて検証 し ます。 IT 命令を記述す る と 、 コ ー ド 設計におけ る 条件付 き 命令の配置お よ び条件の 選択を確実に検討す る こ と がで き る よ う にな り ます。 ARM コ ー ド にアセ ンブルす る と き に も 、 アセ ンブ ラ は同 じ チ ェ ッ ク を行い ま すが、 IT 命令は生成 し ません。 構文 IT{x{y{z}}} {cond} 各項目には以下の意味があ り ます。 x IT ブ ロ ッ ク で 2 番目の命令の条件ス イ ッ チを指定 し ます。 y IT ブ ロ ッ ク で 3 番目の命令の条件ス イ ッ チを指定 し ます。 z IT ブ ロ ッ ク で 4 番目の命令の条件ス イ ッ チを指定 し ます。 cond IT ブ ロ ッ ク で最初の命令の条件を指定 し ます。 IT ブ ロ ッ ク で 2 ~ 4 番目の命令の条件ス イ ッ チは、 以下のいずれかにす る こ と がで き ます。 T Then。 条件 cond を命令に適用 し ます。 Else。 cond の逆条件を命令に適用 し ます。 E 使用法 16 ビ ッ ト 命令は通常は条件 コ ー ド フ ラ グに影響を及ぼ し ますが、 IT ブ ロ ッ ク 内で使用 さ れ る と き には影響を及ぼ し ません。 ただ し 、 CMP、 CMN、 お よ び TST は例外です。 IT ブ ロ ッ ク 内の BKPT 命令は、 条件が偽の場合で も 必ず実行 さ れ ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-127 ARM 命令 と Thumb 命令 注 AL 条件を使用す る こ と に よ っ て、 無条件命令に対 し て も IT ブ ロ ッ ク を使用す る こ と がで き ます。 条件分岐の分岐の範囲は、 IT ブ ロ ッ ク 内の方が IT ブ ロ ッ ク 外 よ り 長 く な り ま す。 制約条件 IT ブ ロ ッ ク 内では、 以下の命令を使用で き ません。 • • IT • TBB お よ び TBH • CPS、 CPSID、 お よ び CPSIE • SETEND CBZ お よ び CBNZ IT ブ ロ ッ ク 使用時のその他の制約条件は、 以下の と お り です。 • 分岐ま たは pc を変更す る 命令が、 ブ ロ ッ ク 内で最後の命令であ る 場合、 使用で き る のは IT ブ ロ ッ ク 内に限 ら れ ます。 • 例外ハン ド ラ か ら 復帰す る 場合でない限 り 、 IT ブ ロ ッ ク 内ではど の命令 に も 分岐で き ません。 • IT ブ ロ ッ ク 内でアセ ン ブ ラ デ ィ レ ク テ ィ ブ を使用す る こ と はで き ませ ん。 条件 フ ラ グ こ の命令に よ る フ ラ グへの影響はあ り ません。 例外 IT 命令 と それに対応す る IT ブ ロ ッ ク の間、 ま たは IT ブ ロ ッ ク の内部で例外 が発生す る 場合があ り ます。 例外が発生す る と 、 適切な例外ハン ド ラ が開始 さ れ、 適切な復帰情報が lr と SPSR に格納 さ れます。 例外か ら の復帰に使用す る 目的で設計 さ れた命令は、 例外か ら 復帰す る ため に通常どお り 使用可能であ り 、 IT ブ ロ ッ ク の実行は正常に再開 さ れ ます。 こ れは、 プ ロ グ ラ ム カ ウ ン タ を変更す る 命令が、 IT ブ ロ ッ ク 内の命令に分岐す る 唯一の方法です。 4-128 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 アーキテ ク チ ャ こ の 16 ビ ッ ト Thumb 命令は ARMv6T2 以降で使用で き ます。 例 ITTE ANDNE ADDSNE MOVEQ ITT ADDAL SUBAL ADD IT ADD ITT MOVEQ BEQ NE r0,r0,r1 r2,r2,#1 r2,r3 AL r0,r0,r1 r2,r2,#1 r0,r0,r1 NE r0,r0,r1 EQ r0,r1 dloop ; ; ; ; ; ; ; ; IT can be omitted 16-bit AND, not ANDS 32-bit ADDS (16-bit ADDS does not set flags in IT block) 16-bit MOV emit 2 non-flag setting 16-bit instructions 16-bit ADD, not ADDS 16-bit SUB, not SUB expands into 32-bit ADD ; syntax error: no condition code used in IT block 注釈 IT ブ ロ ッ ク 内の予測不可能な命令 B、 BL、 CPS IT ブ ロ ッ ク 内で予測不可能な命令を使用す る と 、 こ れ ら の命令の結果が信頼で き ないため、 警告が表示 さ れます。 ま た、 BX、 CBZ、 RFE な ど、 プ ロ グ ラ ム カ ウ ン タ を変更す る 命令につ いて も 警告が表示 さ れ ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-129 ARM 命令 と Thumb 命令 4.8.3 CBZ、 CBNZ ゼロ と の比較 と 分岐を行 う 命令です (ゼロ またはゼロでない場合に分岐し ます)。 構文 CBZ Rn, label CBNZ Rn, label 各項目には以下の意味があ り ます。 Rn オペ ラ ン ド を保持す る レ ジ ス タ を指定 し ます。 label 分岐先を指定 し ます。 使用法 CBZ 命令ま たは CBNZ 命令を使用 し て、 条件 コ ー ド フ ラ グの変更を防止 し 、 命 令数を削減す る こ と がで き ます。 条件 コ ー ド フ ラ グが変更 さ れない点を除 き 、 CBZ Rn, label は以下の コ マ ン ド と 同 じ 意味です。 CMP BEQ Rn, #0 label 条件 コ ー ド フ ラ グが変更 さ れない点を除 き 、 CBNZ Rn, label は以下の コ マ ン ド と 同 じ 意味です。 CMP BNE Rn, #0 label 制約条件 分岐先は、 命令の後に 4 ~ 130 バ イ ト 以内に指定す る 必要があ り ます。 こ れ ら の命令は IT ブ ロ ッ ク 内では使用で き ません。 条件 フ ラ グ こ れ ら の命令に よ る フ ラ グへの影響はあ り ません。 アーキテ ク チ ャ こ れ ら の 16 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 これらの命令の ARM バージ ョ ンおよび 32 ビ ッ ト Thumb バージ ョ ンはあ り ません。 4-130 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.8.4 TBB、 TBH テーブル分岐 (バ イ ト ) と テーブル分岐 (ハーフ ワ ー ド )。 構文 TBB [Rn, Rm] TBH [Rn, Rm, LSL #1] 各項目には以下の意味があ り ます。 Rn ベース レ ジ ス タ を指定 し ます。 こ の レ ジ ス タ には、 分岐の長 さ テーブルのア ド レ ス が保持 さ れます。 Rn に r13 は指定で き ませ ん。 Rn に r15 を指定 し てい る 場合、 使用 さ れ る 値は 「命令のア ド レ ス + 4」 と な り ます。 Rm イ ンデ ク ス レ ジ ス タ を指定 し ます。 テーブル内の場所を指定す る イ ンデ ク ス を保持 し ます。 Rm に r15 と r13 は指定で き ません。 演算 こ れ ら の命令に よ り 、 シ ン グルバ イ ト オ フ セ ッ ト (TBB) ま たはハーフ ワー ド オ フ セ ッ ト (TBH) のテーブルを使用 し た PC 相対の順方向の分岐が発生 し ま す。 Rn はテーブルへのポ イ ン タ を提供 し 、 Rm はテーブル内の イ ンデ ク ス を提 供 し ます。 分岐の長 さ は、 テーブルか ら 返 さ れたバ イ ト (TBB) ま たはハーフ ワー ド (TBH) の値の 2 倍にな り ます。 注釈 Thumb-2EE では、 ベース レ ジ ス タ の値が 0 の場合、 HandlerBase - 4 にあ る NullCheck ハン ド ラ への分岐が実行 さ れ ます。 アーキテ ク チ ャ こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の命令の ARM バージ ョ ンお よ び 16 ビ ッ ト Thumb バージ ョ ンはあ り ま せん。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-131 ARM 命令 と Thumb 命令 4.9 コ プ ロ セ ッ サ命令 こ のセ ク シ ョ ン では、 ベ ク タ 浮動小数点 (第 5 章 NEON と VFP プ ロ グ ラ ミ ン グ を参照) お よ び ワ イ ヤ レ ス MMX™ テ ク ノ ロ ジの命令 (第 6 章 ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令 を参照) について説明 し ません。 XScale 固有の命令に ついては こ の章の後半で説明 し ます (「その他の命令」 (ページ 4-140) を参 照)。 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ンか ら 構成 さ れてい ます。 • 「CDP、 CDP2」 (ページ 4-133) コ プ ロ セ ッ サデー タ 演算です。 • 「MCR、 MCR2、 MCRR、 MCRR2」 (ページ 4-134) コ プ ロ セ ッ サ命令を使用 し た ARM レ ジ ス タ か ら コ プ ロ セ ッ サへの移動 命令です。 • 「MRC、 MRC2、 MRRC、 MRRC2」 (ページ 4-136) コ プ ロ セ ッ サ命令を使用 し た コ プ ロ セ ッ サか ら ARM レ ジ ス タ への移動 命令です。 • 「LDC、 LDC2、 STC、 STC2」 (ページ 4-138) メ モ リ と コ プ ロ セ ッ サ間のデー タ 転送命令です。 注 コ プ ロ セ ッ サ命令は、 コ プ ロ セ ッ サが存在 し ない と き や イ ネーブルに さ れて ない と き に実行 さ れ る と 、 未定義命令 と い う 例外が発生 し ます。 4-132 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.9.1 CDP、 CDP2 コ プ ロ セ ッ サデー タ 演算です。 構文 op{cond} coproc, #opcode1, CRd, CRn, CRm{, #opcode2} 各項目には以下の意味があ り ます。 op CDP ま たは CDP2 を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を参照)。 ARM コ ー ド では、 cond を CDP2 では使用で き ません。 coproc 命令が実行 さ れ る コ プ ロ セ ッ サの名前を指定 し ます。 標準 名は pn で、 n は 0 ~ 15 の整数です。 opcode1 4 ビ ッ ト コ プ ロ セ ッ サ固有のオペ コ ー ド を指定 し ます。 opcode2 オプシ ョ ン と し ての 3 ビ ッ ト コ プ ロ セ ッ サ固有のオペ コ ー ド を指定 し ます。 CRd?CRn?CRm コ プ ロ セ ッ サ レ ジ ス タ を指定 し ます。 使用法 こ れ ら の命令の使用方法は コ プ ロ セ ッ サに よ っ て異な り ます。 詳細について は、 コ プ ロ セ ッ サのマニ ュ アルを参照 し て下 さ い。 アーキテ ク チ ャ ARM 命令 CDP は、 ARM アーキ テ ク チ ャ のすべてのバージ ョ ン で使用で き ま す。 ARM 命令 CDP2 は、 ARMv5 以降で使用で き ます。 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-133 ARM 命令 と Thumb 命令 4.9.2 MCR、 MCR2、 MCRR、 MCRR2 ARM レ ジ ス タ か ら コ プ ロ セ ッ サへの移動命令です。 コ プ ロ セ ッ サに よ っ て は、 さ ま ざ ま な演算を追加で指定で き る 場合があ り ます。 構文 op1{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2} op2{cond} coproc, #opcode3, Rt, Rt2, CRm 各項目には以下の意味があ り ます。 op1 MCR ま たは MCR2 を指定 し ます。 op2 MCRR ま たは MCRR2 を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 ARM コ ー ド では、 cond を MCR2 ま たは MCRR2 では使用で き ません。 coproc 命令が実行 さ れ る コ プ ロ セ ッ サの名前を指定 し ます。標準名は pn で、 n は 0 ~ 15 の整数です。 opcode1 3 ビ ッ ト コ プ ロ セ ッ サ固有のオペ コ ー ド を指定 し ます。 opcode2 オプシ ョ ン と し ての 3 ビ ッ ト コ プ ロ セ ッ サ固有のオペ コ ー ド を指 定 し ます。 opcode3 4 ビ ッ ト コ プ ロ セ ッ サ固有のオペ コ ー ド を指定 し ます。 Rt?Rt2 ARM ソ ース レ ジ ス タ を指定 し ます。 MCRR と MCRR2 に r15 は指定で き ません。 CRn?CRm コ プ ロ セ ッ サ レ ジ ス タ を指定 し ます。 使用法 こ れ ら の命令の使用方法は コ プ ロ セ ッ サに よ っ て異な り ます。 詳細について は、 コ プ ロ セ ッ サのマニ ュ アルを参照 し て下 さ い。 4-134 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 アーキテ ク チ ャ ARM 命令 MCR は、 ARM アーキ テ ク チ ャ のすべてのバージ ョ ン で使用で き ま す。 ARM 命令 MCR2 は、 ARMv5 以降で使用で き ます。 ARM 命令 MCRR は、 ARMv6 以降、 お よ び ARMv5 の E バ リ ア ン ト で使用で き ます。 ARM 命令 MCRR2 は、 ARMv6 以降で使用で き ます。 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-135 ARM 命令 と Thumb 命令 4.9.3 MRC、 MRC2、 MRRC、 MRRC2 コ プ ロ セ ッ サか ら ARM レ ジ ス タ への移動命令です。 コ プ ロ セ ッ サに よ っ ては、 さ ま ざ ま な演算を追加で指定で き る 場合があ り ま す。 構文 op1{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2} op2{cond} coproc, #opcode3, Rt, Rt2, CRm 各項目には以下の意味があ り ます。 op1 MRC ま たは MRC2 を指定 し ます。 op2 MRRC ま たは MRRC2 を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 ARM コ ー ド では、 cond を MRC2 ま たは MRRC2 では使用で き ません。 coproc 命令が実行 さ れ る コ プ ロ セ ッ サの名前を指定 し ます。標準名は pn で、 n は 0 ~ 15 の整数です。 opcode1 3 ビ ッ ト コ プ ロ セ ッ サ固有のオペ コ ー ド を指定 し ます。 opcode2 オプシ ョ ン と し ての 3 ビ ッ ト コ プ ロ セ ッ サ固有のオペ コ ー ド を指 定 し ます。 opcode3 4 ビ ッ ト コ プ ロ セ ッ サ固有のオペ コ ー ド を指定 し ます。 Rt?Rt2 ARM ソ ース レ ジ ス タ を指定 し ます。 r15 は使用 し ないで下 さ い。 MRC と MRC2 では Rt に APSR_nzcv も 使用で き ます。 CRn?CRm コ プ ロ セ ッ サ レ ジ ス タ を指定 し ます。 使用法 こ れ ら の命令の使用方法は コ プ ロ セ ッ サに よ っ て異な り ます。 詳細について は、 コ プ ロ セ ッ サのマニ ュ アルを参照 し て下 さ い。 4-136 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 アーキテ ク チ ャ ARM 命令 MRC は、 ARM アーキ テ ク チ ャ のすべてのバージ ョ ン で使用で き ま す。 ARM 命令 MRC2 は、 ARMv5 以降で使用で き ます。 ARM 命令 MRRC は、 ARMv6 以降、 お よ び ARMv5 の E バ リ ア ン ト で使用で き ます。 ARM 命令 MRRC2 は、 ARMv6 以降で使用で き ます。 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-137 ARM 命令 と Thumb 命令 4.9.4 LDC、 LDC2、 STC、 STC2 メ モ リ と コ プ ロ セ ッ サ間のデー タ 転送命令です。 構文 op{L}{cond} coproc, CRd, [Rn] op{L}{cond} coproc, CRd, [Rn, #{-}offset]{!} op{L}{cond} coproc, CRd, [Rn], #{-}offset op{L}{cond} coproc, CRd, label 各項目には以下の意味があ り ます。 op LDC、 LDC2、 STC、 STC2 のいずれか を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 ARM コ ー ド では、 cond を LDC2 ま たは STC2 では使用で き ません。 4-138 L 長い転送を指定す る オプシ ョ ンの接尾文字を指定 し ます。 coproc 命令が実行 さ れ る コ プ ロ セ ッ サの名前を指定 し ます。標準名は pn で、 n は 0 ~ 15 の整数です。 CRd ロ ー ド ま たは ス ト アに使用す る コ プ ロ セ ッ サ レ ジ ス タ を指定 し ます。 Rn メ モ リ ア ド レ ス のベース と な る レ ジ ス タ を指定 し ます。 r15 が指 定 さ れてい る 場合、 使用 さ れ る 値は 「現在の命令のア ド レ ス + 8」 と な り ます。 - 任意に指定で き る マ イ ナ ス符号です。 - が指定 さ れてい る 場合、 オ フ セ ッ ト が Rn か ら 減算 さ れます。 指定 さ れていない場合は、 オ フ セ ッ ト が Rn に加算 さ れます。 offset 0 ~ 1020 の範囲で 4 の倍数 と な る 式を指定 し ます。 ! 任意に指定で き る 接尾文字です。 ! を指定す る と 、 オ フ セ ッ ト を 含むア ド レ ス が Rn に ラ イ ト バ ッ ク さ れます。 label ワー ド 境界で整列す る プ ロ グ ラ ム相対式を指定 し ます。 詳細につ いては、 「レ ジ ス タ 相対式 と プ ロ グ ラ ム相対式」 (ページ 3-39) を参照 し て下 さ い。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 label は現在の命令か ら 1020 バ イ ト 以内に配置す る 必要があ り ま す。 使用法 こ れ ら の命令の使用方法は コ プ ロ セ ッ サに よ っ て異な り ます。 詳細について は、 コ プ ロ セ ッ サのマニ ュ アルを参照 し て下 さ い。 Thumb-2EE では、 ベース レ ジ ス タ の値が 0 の場合、 HandlerBase - 4 にあ る NullCheck ハン ド ラ への分岐が実行 さ れ ます。 アーキテ ク チ ャ LDC と STC は、 ARM アーキ テ ク チ ャ のすべてのバージ ョ ン で使用で き ます。 LDC2 と STC2 は ARMv5 以降で使用で き ます。 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 注釈 STC と STC2 命令でのプ ロ グ ラ ム相対ア ド レ ス の使用は、 非推奨です。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-139 ARM 命令 と Thumb 命令 4.10 その他の命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ンか ら 構成 さ れてい ます。 • 「BKPT」 (ページ 4-141) ブ レー ク ポ イ ン ト 命令です。 • 「SVC」 (ページ 4-142) スーパーバ イ ザ コ ール (以前の SWI) です。 • 「MRS」 (ページ 4-143) CPSR ま たは SPSR の内容の汎用レ ジ ス タ への移動命令です。 • 「MSR」 (ページ 4-145) CPSR ま たは SPSR の指定フ ィ ール ド への、 即定値ま たは汎用レ ジ ス タ の内容の ロ ー ド 命令です。 • 「CPS」 (ページ 4-148) プ ロ セ ッ サ状態を変更す る 命令です。 • 「SMC」 (ページ 4-150) セキ ュ アモニ タ ー コ ール (以前の SMI) です。 • 「SETEND」 (ページ 4-151) CPSR 内のエ ンデ ィ ア ン ビ ッ ト を設定 し ます。 • 「NOP、 SEV、 WFE、 WFI、 YIELD」 (ページ 4-152) 演算な し 、 イ ベン ト の設定、 イ ベン ト 待機、 割 り 込み待機、 明け渡 し を 行 う ヒ ン ト 命令です。 • 「DBG、 DMB、 DSB、 ISB」 (ページ 4-154) デバ ッ グ、 デー タ メ モ リ バ リ ア、 デー タ 同期バ リ ア、 お よ び命令同期バ リ アの各 ヒ ン ト 命令です。 • 「MAR、 MRA」 (ページ 4-157) 2 本の汎用レ ジ ス タ と 40 ビ ッ ト 内部ア キ ュ ム レー タ の間で転送を実行 し ます (XScale コ プ ロ セ ッ サ 0 の命令です)。 4-140 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.10.1 BKPT ブ レー ク ポ イ ン ト 命令です。 構文 BKPT #immed 各項目には以下の意味があ り ます。 以下の範囲の整数にな る 式を指定 し ます。 immed • ARM 命令の場合は 0 ~ 65535 (16 ビ ッ ト 値) • 16 ビ ッ ト Thumb 命令の場合は 0 ~ 255 (8 ビ ッ ト 値) 使用法 BKPT 命令に よ っ て、 プ ロ セ ッ サはデバ ッ グ状態に入 り ます。 デバ ッ グ ツール は、 こ の動作を使用 し て、 特定のア ド レ ス にあ る 命令に到達 し た時点でシ ス テ ム状態を調査す る こ と がで き ます。 ARM 状態 と Thumb 状態の ど ち ら の場合 も 、 immed は ARM ハー ド ウ ェ アに よ っ て無視 さ れます。 ただ し 、 デバ ッ ガは こ の値を使用 し て、 ブ レー ク ポ イ ン ト に関す る 情報を ス ト アで き ます。 アーキテ ク チ ャ こ の ARM 命令は、 ARMv5 以降で使用で き ます。 こ の 16 ビ ッ ト Thumb 命令は、 ARMv5 以降の T バ リ ア ン ト で使用で き ます。 こ の命令の 32 ビ ッ ト Thumb バージ ョ ンはあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-141 ARM 命令 と Thumb 命令 4.10.2 SVC スーパーバ イ ザ コ ールです。 構文 SVC{cond} #immed 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 immed 以下の範囲の整数にな る 式を指定 し ます。 • ARM 命令の場合は 0 ~ 224–1 (24 ビ ッ ト 値) • 16 ビ ッ ト Thumb 命令の場合は 0 ~ 255 (8 ビ ッ ト 値) 使用法 SVC 命令に よ っ て例外が発生 し ます。 つま り 、 プ ロ セ ッ サモー ド が スーパーバ イ ザモー ド に変更 さ れ、 CPSR が スーパーバ イ ザモー ド の SPSR に保存 さ れ、 実行は SVC ベ ク タ へ分岐 さ れます (『デベ ロ ッ パガ イ ド 』 の第 6 章 プ ロ セ ッ サ例外処理 を参照)。 immed はプ ロ セ ッ サに よ っ て無視 さ れます。 ただ し 、 こ の値は、 例外ハン ド ラ で取得 し て、 要求 さ れてい る サービ ス を特定す る こ と がで き ます。 注 ARM アセ ンブ リ 言語を開発す る 一環 と し て、 SWI 命令の名前が SVC に変更 さ れ ま し た。 RVCT の本 リ リ ース では、 SWI 命令は、 以前は SWI だっ た (formerly SWI) と い う コ メ ン ト 付 き で SVC に逆アセ ン ブル さ れ ます。 条件 フ ラ グ こ の命令に よ る フ ラ グへの影響はあ り ません。 アーキテ ク チ ャ こ の ARM 命令は、 ARM アーキテ ク チャのすべてのバージ ョ ンで使用でき ます。 16 ビ ッ ト Thumb 命令は、 ARM アーキ テ ク チ ャ のすべての T バ リ ア ン ト で使 用で き ます。 4-142 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.10.3 MRS PSR の内容の汎用レ ジ ス タ への移動命令です。 構文 MRS{cond} Rd, psr 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Rd に r15 は指定で き ません。 psr 次のいずれか を指定 し ます。 APSR 任意のプ ロ セ ッ サ、 任意のモー ド で使用 し ます。 CPSR ARMv7-M と ARMv6-M 以外の任意のプ ロ セ ッ サで、 代 わ り に同義の APSR を使用 し 、 デバ ッ グ状態で使用 し ます。 SPSR ARMv7-M と ARMv6-M 以外の任意のプ ロ セ ッ サ、 特権 モー ド のみで使用 し ます。 Mpsr ARMv7-M と ARMv6-M プ ロ セ ッ サのみで使用 し ます。 次のいずれか を指定で き ます。 IPSR、 EPSR、 IEPSR、 IAPSR、 EAPSR、 MSP、 PSP、 XPSR、 PRIMASK、 BASEPRI、 BASEPRI_MAX、 FAULTMASK、 CONTROL、 ま たは です。 Mpsr 使用法 MRS は MSR と 組み合わせ、 PSR を更新す る ための読み出 し - 修正- 書 き 込みシー ケ ン ス で使用す る こ と に よ り 、 プ ロ セ ッ サモー ド の変更や Q フ ラ グの ク リ ア な ど を行 う こ と がで き ます。 プ ロ セ ス ス ワ ッ プ コ ー ド では、 関連す る PSR の内容を含め、 ス ワ ッ プア ウ ト さ れてい る プ ロ セ ス のプ ロ グ ラ マのモデルの状態を保存す る 必要があ り ます。 同様に、 ス ワ ッ プ イ ン さ れてい る プ ロ セ ス の状態 も 復元す る 必要があ り ます。 こ れ ら の操作には、 MRS/store お よ び load/MSR 命令シーケ ン ス を使用 し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-143 ARM 命令 と Thumb 命令 SPSR プ ロ セ ッ サがユーザモー ド やシ ス テ ム モー ド の場合は、 SPSR へア ク セ ス し な いで下 さ い。 こ れはユーザ自身が注意す る 必要があ り ます。 アセ ン ブ ラ は、 コ ー ド が ど のプ ロ セ ッ サモー ド で実行 さ れ る かについての情報を持た ないた め、 警告 メ ッ セージ を生成で き ません。 ユーザモー ド ま たはシ ス テ ム モー ド の場合に SPSR にア ク セ ス し よ う と し た 場合の結果は予測不可能です。 CPSR プ ロ セ ッ サがデバ ッ グ状態でデバ ッ グモー ド を完全停止 し てい る と き にのみ、 CPSR 実行状態ビ ッ ト を読み出す こ と がで き ます。 それ以外の場合、 CPSR の 実行状態ビ ッ ト はゼ ロ と し て読み出 さ れ ます。 条件フ ラ グはど のプ ロ セ ッ サの ど のモー ド で も 読み取れ ます。 こ の場合は、 CPSR ではな く APSR を使用 し て下 さ い。 条件 フ ラ グ こ の命令に よ る フ ラ グへの影響はあ り ません。 アーキテ ク チ ャ こ の ARM 命令は、 ARM アーキ テ ク チ ャ のすべてのバージ ョ ン で使用で き ま す。 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 4-144 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.10.4 MSR 即定値ま たは汎用レ ジ ス タ の内容を プ ロ グ ラ ム状態レ ジ ス タ (PSR) の指定 さ れた フ ィ ール ド に ロ ー ド し ます。 構文 (ARMv7-M と ARMv6-M を除 く ) MSR{cond} APSR_flags, #constant MSR{cond} APSR_flags, Rm MSR{cond} psr_fields, #constant MSR{cond} psr_fields, Rm 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 ??? 移動す る APSR フ ラ グ (複数可) を指定 し ます。 flags には以下 の 1 つ以上を指定で き ます。 nzcvq g ARM DUI 0204IJ ALU フ ラ グ フ ィ ール ド マ ス ク 、 PSR[31:27] (ユーザ モー ド ) SIMD GE フ ラ グ フ ィ ール ド マ ス ク 、 PSR[19:16] (ユー ザモー ド ) constant 数値定数を求め る 式を指定 し ます。 こ の定数は、 32 ビ ッ ト の ワ ー ド 内で ビ ッ ト を偶数 ロ テー ト し て得 ら れ る 8 ビ ッ ト パ タ ーンに対 応 し てい る 必要があ り ます。 Thumb では使用で き ません。 Rm ソ ース レ ジ ス タ を指定 し ます。 psr 次のいずれか を指定 し ます。 CPSR デバ ッ グ状態で使用、 代わ り に同義の APSR を使用 し ます。 SPSR 任意のプ ロ セ ッ サ、 特権モー ド のみで使用 し ます。 fields 移動す る SPSR ま たは CPSR フ ィ ール ド (複数可) を指定 し ま す。 fields には次の も の を指定で き ます。 c 制御フ ィ ール ド マ ス ク バ イ ト 、 PSR[7:0] (特権モー ド ) x 拡張フ ィ ール ド マ ス ク バ イ ト 、 PSR[15:8] (特権モー ド) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-145 ARM 命令 と Thumb 命令 s f ス テー タ ス フ ィ ール ド マ ス ク バ イ ト 、 PSR[23:16] (特 権モー ド ) フ ラ グ フ ィ ール ド マ ス ク バ イ ト 、 PSR[31:24] (特権 モー ド ) 構文 (ARMv7-M と ARMv6-M のみ) MSR{cond} psr, Rm 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rm ソ ース レ ジ ス タ を指定 し ます。 psr 次のいずれか を指定で き ます。 APSR、 IPSR、 EPSR、 IEPSR、 IAPSR、 EAPSR、 XPSR、 MSP、 PSP、 PRIMASK、 BASEPRI、 BASEPRI_MAX、 FAULTMASK、 ま たは CONTROL です。 使用法 詳細については、 「MRS」 (ページ 4-143) を参照 し て下 さ い。 ユーザモー ド では、 以下の よ う にな り ます。 • APSR は条件フ ラ グ、 Q、 ま たは GE ビ ッ ト にア ク セ スす る ために使用 し ます。 • CPSR の未割 り 当て ビ ッ ト 、 特権付 き ビ ッ ト 、 ま たは実行状態ビ ッ ト へ の書 き 込みが無視 さ れます。 そのため、 ユーザモー ド のプ ロ グ ラ ム が特 権モー ド に変更 さ れ る こ と はあ り ません。 ユーザモー ド ま たはシ ス テ ム モー ド の場合に SPSR にア ク セ ス し た場合の結 果は予測不可能です。 条件 フ ラ グ こ の命令は、 APSR_nzcvq ま たは CPSR_f フ ィ ール ド が指定 さ れてい る 場合に フ ラ グ を明示的に更新 し ます。 4-146 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 アーキテ ク チ ャ こ の ARM 命令は、 ARM アーキ テ ク チ ャ のすべてのバージ ョ ン で使用で き ま す。 こ の 32 ビ ッ ト Thumb 命令は ARMv6T2 以降で使用で き ます。 こ の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-147 ARM 命令 と Thumb 命令 4.10.5 CPS CPS (プ ロ セ ッ サ状態の変更命令) は、 他の CPSR ビ ッ ト を変更す る こ と な く 、 CPSR のモー ド 、 A、 I、 お よ び F の ビ ッ ト の 1 つ以上を変更 し ます。 CPS は、 特権モー ド のみで使用で き 、 ユーザモー ド では作用 し ません。 CPS は、 条件付 き にす る こ と はで き ないため、 IT ブ ロ ッ ク では使用で き ませ ん。 構文 CPSeffect iflags{, #mode} CPS #mode 各パ ラ メ ー タ には以下の意味があ り ます。 effect 次のいずれか を指定 し ます。 IE 割 り 込みま たはアボー ト を イ ネーブルに し ます。 ID 割 り 込みま たはアボー ト をデ ィ セーブルに し ます。 iflags 以下の項目のシーケ ン ス を指定 し ます。 a 不正確な アボー ト を イ ネーブルま たはデ ィ セーブル し ます。 i IRQ 割 り 込みを イ ネーブルま たはデ ィ セーブル し ます。 f FIQ 割 り 込みを イ ネーブル ま たはデ ィ セーブル し ます。 変更先のモー ド の番号を指定 し ます。 mode 条件 フ ラ グ こ の命令に よ る フ ラ グへの影響はあ り ません。 16 ビ ッ ト 命令 こ れ ら の命令は、 Thumb-2 以前の Thumb コ ー ド 内では次の形式で使用で き ま す。 ま た、 Thumb-2 コ ー ド 内で使用す る と き は 16 ビ ッ ト 命令にな り ます。 CPSIE iflags CPSID iflags 16 ビ ッ ト Thumb 命令ではモー ド の変更を指定で き ません。 4-148 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 アーキテ ク チ ャ こ の ARM 命令は、 ARMv6 以降で使用で き ます。 こ の 32 ビ ッ ト Thumb 命令は ARMv6T2 以降で使用で き ます。 こ の 16 ビ ッ ト Thumb 命令は、 ARMv6 以降の T バ リ ア ン ト で使用で き ます。 サン プル CPSIE if ; CPSID A ; CPSID ai, #17 ; CPS #16 ; ARM DUI 0204IJ enable interrupts and fast interrupts disable imprecise aborts disable imprecise aborts and interrupts, and enter FIQ mode enter User mode Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-149 ARM 命令 と Thumb 命令 4.10.6 SMC セキ ュ アモニ タ ー コ ールです。 詳細については、 『ARM Architecture Reference Manual Security Extensions Supplement』 を参照 し て下 さ い。 構文 SMC{cond} #immed_4 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 immed_4 4 ビ ッ ト の即値を指定 し ます。 こ の値は、 ARM プ ロ セ ッ サでは無 視 さ れますが、 SMC 例外ハン ド ラ で使用 し て、 要求 さ れてい る サービ ス を特定す る こ と がで き ます。 注 ARM アセ ンブ リ 言語開発の一環 と し て、 SMI 命令の名前が SMC に変更 さ れま し た。 RVCT の本 リ リ ース では、 SMI 命令は、 以前は SMI だ っ た (formerly SMI) と い う コ メ ン ト 付 き で SMC に逆アセ ン ブル さ れ ます。 アーキテ ク チ ャ こ の ARM 命令は ARMv6 以降の実装で使用で き ます。 ただ し 、 Security Extensions が必要です。 こ の 32 ビ ッ ト Thumb 命令は ARMv6T2 以降の実装で使用可能です。 ただ し 、 Security Extensions が必要です。 こ の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 4-150 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.10.7 SETEND CPSR 内のエ ンデ ィ ア ン ビ ッ ト を、 他の ビ ッ ト に影響を与え る こ と な く 設定 し ます。 SETEND は、 条件付 き にす る こ と はで き ないため、 IT ブ ロ ッ ク では使用で き ま せん。 構文 SETEND specifier 各項目には以下の意味があ り ます。 specifier 次のいずれか を指定 し ます。 BE ビ ッ グエ ンデ ィ ア ン形式 LE リ ト ルエ ンデ ィ ア ン形式 使用法 SETEND を使用す る と 、 異な る エ ンデ ィ ア ン形式のデー タ にア ク セ ス で き ます。 例えば、 リ ト ルエ ンデ ィ ア ン形式のアプ リ ケーシ ョ ン か ら 、 ビ ッ グエ ンデ ィ ア ン形式で DMA フ ォ ーマ ッ ト さ れた複数のデー タ フ ィ ール ド にア ク セ ス で き ます。 アーキテ ク チ ャ こ の ARM 命令は、 ARMv6 以降で使用で き ます。 こ の 16 ビ ッ ト Thumb 命令は、 ARMv7-M プ ロ フ ァ イ ルを除 く ARMv6 以降の T バ リ ア ン ト で使用で き ます。 こ の命令の 32 ビ ッ ト Thumb バージ ョ ンはあ り ません。 例 SETEND LDR LDR SETEND ARM DUI 0204IJ BE ; Set the CPSR E bit for big-endian accesses r0, [r2, #header] r1, [r2, #CRC32] le ; Set the CPSR E bit for little-endian accesses for the ; rest of the application Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-151 ARM 命令 と Thumb 命令 4.10.8 NOP、 SEV、 WFE、 WFI、 YIELD 操作な し 、 イ ベン ト の設定、 イ ベン ト 待機、 割 り 込み待機、 お よ び明け渡 し を行 う ヒ ン ト 命令です。 構文 NOP{cond} SEV{cond} WFE{cond} WFI{cond} YIELD{cond} 各項目には以下の意味があ り ます。 任意に指定で き る 条件 コ ー ド です (「条件実行」 (ページ 2-20) を参照)。 cond 使用法 こ れ ら は ヒ ン ト 命令です。 こ れ ら の命令は任意に実装す る こ と がで き ます。 い ずれの命令 も 実装 さ れていない場合は、 NOP と し て動作 し ます。 NOP NOP 何 も 行い ません。 NOP が タ ーゲ ッ ト アーキ テ ク チ ャ で特定の命令 と し て実 装 さ れていない場合、 アセ ン ブ ラ は、 擬似命令 と し て扱い、 MOV r0, r0 (ARM) や MOV r8, r8 (Thumb) な ど、 何 も 行わない別の命令を生成 し ます。 NOP は、 必ず し も 時間のかか る NOP ではあ り ません。 プ ロ セ ッ サに よ り 、 こ の 命令は、 実行ス テージに到達す る 前にパ イ プ ラ イ ン か ら 削除 さ れ る 場合があ り ます。 例えば、 NOP をパデ ィ ン グに使用す る こ と で、 次に続 く 命令を 64 ビ ッ ト 境界 に配置す る こ と がで き ます。 SEV SEV に よ り 、 マルチプ ロ セ ッ サシ ス テ ム内のすべての コ アに対 し て イ ベン ト を 発生 さ せます。 SEV を実装す る 場合は、 WFE も 実装す る 必要があ り ます。 4-152 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 WFE イ ベン ト レ ジ ス タ が設定 さ れていない場合、 WFE は、 以下のいずれかの イ ベン ト が発生す る ま で実行を保留 し ます。 • IRQ 割 り 込み (CPSR の I ビ ッ ト でマ ス ク さ れてい る 場合を除 く ) • FIQ 割 り 込み (CPSR の F ビ ッ ト でマ ス ク さ れてい る 場合を除 く ) • 不正確なデー タ アボー ト (CPSR の A ビ ッ ト でマ ス ク さ れてい る 場合を 除く) デバ ッ グエ ン ト リ 要求 (デバ ッ グが イ ネーブルの場合) 別のプ ロ セ ッ サが SEV 命令を使用 し て発生 し た イ ベン ト • • イ ベン ト レ ジ ス タ が設定 さ れてい る 場合、 WFE は、 その レ ジ ス タ を ク リ ア し て す ぐ に戻 り ます。 WFE を実装す る 場合は、 SEV も 実装す る 必要があ り ます。 WFI WFI は、 以下のいずれかの イ ベン ト が発生す る ま で実行を保留 し ます。 • IRQ 割 り 込み (CPSR の I ビ ッ ト の設定 と は無関係) • FIQ 割 り 込み (CPSR の F ビ ッ ト の設定 と は無関係) • 不正確なデー タ アボー ト (CPSR の A ビ ッ ト でマ ス ク さ れてい る 場合を 除く) デバ ッ グエ ン ト リ 要求 (デバ ッ グが イ ネーブル さ れてい る か ど う かは無 関係) • YIELD YIELD は、 現在の ス レ ッ ド が、 ス ワ ッ プア ウ ト で き る タ ス ク (ス ピ ン ロ ッ ク な ど) を実行 し てい る こ と をハー ド ウ ェ アに示 し ます。 ハー ド ウ ェ アは、 こ の ヒ ン ト を使用 し て、 マルチ ス レ ッ ド シ ス テ ム で ス レ ッ ド を中断お よ び再開で き ます。 アーキテ ク チ ャ こ れ ら の ARM 命令は、 ARMv6K 以降で使用で き ます。 こ れ ら の 32 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 こ れ ら の 16 ビ ッ ト Thumb 命令は、 ARMv6T2 以降で使用で き ます。 NOP はすべての ARM お よ び Thumb アーキ テ ク チ ャ で疑似命令 と し て使用で き ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-153 ARM 命令 と Thumb 命令 4.10.9 DBG、 DMB、 DSB、 ISB デバ ッ グ、 デー タ メ モ リ バ リ ア、 デー タ 同期バ リ ア、 お よ び命令同期バ リ ア です。 構文 DBG{cond} {#option} DMB{cond} {#option} DSB{cond} {#option} ISB{cond} {#option} 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 option ヒ ン ト の演算に任意に指定で き る 制限です。 使用法 こ れ ら は ヒ ン ト 命令です。 こ れ ら の命令は任意に実装す る こ と がで き ます。 い ずれの命令 も 実装 さ れていない場合は、 NOP と し て動作 し ます。 DBG デバ ッ グ ヒ ン ト は、 デバ ッ グ シ ス テ ムお よ び関連す る シ ス テ ム に ヒ ン ト を提 供 し ます。 こ の命令が ど の よ う に使用 さ れてい る かについては、 各シ ス テ ム のマニ ュ アルを参照 し て下 さ い。 DMB デー タ メ モ リ バ リ アは メ モ リ バ リ ア と し て機能 し ます。 こ れに よ り 、 DMB 命令 よ り 前にプ ロ グ ラ ム順で発生す る 明示的なすべての メ モ リ ア ク セ ス は、 DMB 命 令 よ り 後にプ ロ グ ラ ム順で出て く る 明示的なデー タ ア ク セ ス よ り も 先に観察 さ れ ます。 こ れは、 プ ロ セ ッ サで実行 さ れてい る 他の命令の順序に影響す る こ と はあ り ません。 option に使用で き る 値は以下の と お り です。 4-154 SY シ ス テ ム全体の DMB 演算。 こ れはデフ ォ ル ト 値なので、 省略で き ます。 ST ス ト アの完了のみを待機す る DMB 演算。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 ISH 内部共有可能 ド メ イ ンのみを対象 と し た DMB 演算。 ISHST ス ト アの完了のみを待機 し 、 内部共有可能 ド メ イ ン を対象 と し た DMB 演算。 NSH 統合ポ イ ン ト のみを対象 と し た DMB 演算。 NSHST ス ト アの完了のみを待機 し 、 統合ポ イ ン ト のみを対象 と し た DMB 演算。 OSH 外部共有可能 ド メ イ ンのみを対象 と し た DMB 演算。 OSHST ス ト アの完了のみを待機 し 、 外部共有可能 ド メ イ ン を対象 と し た DMB 演算。 DSB デー タ 同期バ リ アは、 特殊な メ モ リ バ リ ア と し て機能 し ます。 こ の命令が完 了す る ま で、 こ の命令 よ り 後にあ る プ ロ グ ラ ム順の命令は実行 さ れ ません。 こ の命令は以下の場合に完了 し ます。 • こ の命令が完了す る 前のすべての明示的な メ モ リ ア ク セ ス • こ の命令が完了す る 前のキ ャ ッ シ ュ 、 分岐予測子、 お よ び TLB メ ン テ ナン ス のすべての処理 option に使用で き る 値は以下の と お り です。 ARM DUI 0204IJ SY シ ス テ ム全体の DSB 演算。 こ れはデフ ォ ル ト 値なので、 省略で き ます。 ST ス ト アの完了のみを待機す る DSB 演算。 ISH 内部共有可能 ド メ イ ンのみを対象 と し た DSB 演算。 ISHST ス ト アの完了のみを待機 し 、 内部共有可能 ド メ イ ン を対象 と し た DSB 演算。 NSH 統合ポ イ ン ト のみを対象 と し た DSB 演算。 NSHST ス ト アの完了のみを待機 し 、 統合ポ イ ン ト のみを対象 と し た DSB 演算。 OSH 外部共有可能 ド メ イ ンのみを対象 と し た DSB 演算。 OSHST ス ト アの完了のみを待機 し 、 外部共有可能 ド メ イ ン を対象 と し た DSB 演算。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-155 ARM 命令 と Thumb 命令 ISB 命令同期バ リ アはプ ロ セ ッ サのパ イ プ ラ イ ン を フ ラ ッ シ ュ す る ため、 ISB に続 く すべての命令は、 ISB 命令が完了 し た後、 キ ャ ッ シ ュ ま たは メ モ リ か ら フ ェ ッ チ さ れ ます。 こ れに よ り 、 ISB 命令 よ り 前に実行 さ れた コ ン テ キ ス ト 変 更処理 (ASID の変更な ど)、 完了 し た TLB メ ン テナン ス処理、 分岐予測子 メ ン テナン ス処理、 お よ び CP15 レ ジ ス タ へのすべての変更は、 ISB よ り 後に フ ェ ッ チ さ れた命令で認識 さ れ ます。 ま た、 ISB 命令に よ り 、 こ の命令 よ り 後にプ ロ グ ラ ム順で出て く る すべての分 岐は、 必ず ISB 命令 よ り 後で認識 さ れ る コ ン テ キ ス ト と 共に分岐予測 ロ ジ ッ ク に書 き 込まれ ます。 こ れは、 命令ス ト リ ーム を正 し く 実行す る ために必要 な こ と です。 option に使用で き る 値は以下の と お り です。 シ ス テ ム全体の ISB 演算。 こ れはデフ ォ ル ト 値なので、 省略で き ます。 SY エ イ リ アス DMB と DSB でサポー ト さ れてい る option の代替値は以下の と お り ですが、 使用は非推奨です。 SH は ISH のエ イ リ ア ス です。 • • SHST は ISHST のエ イ リ ア ス です。 • UN は NSH のエ イ リ ア ス です。 • UNST は NSHST のエ イ リ ア ス です。 アーキテ ク チ ャ こ れ ら の ARM お よ び 32 ビ ッ ト Thumb 命令は、 ARMv7 で使用で き ます。 こ れ ら の命令の 16 ビ ッ ト Thumb バージ ョ ンはあ り ません。 4-156 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.10.10 MAR、 MRA 2 本の汎用レ ジ ス タ と 40 ビ ッ ト 内部ア キ ュ ム レー タ の間で転送を実行 し ます。 構文 MAR{cond} Acc, RdLo, RdHi MRA{cond} RdLo, RdHi, Acc 各パ ラ メ ー タ には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Acc 内部ア キ ュ ム レー タ を指定 し ます。 標準名は accx で、 x は 0 ~ n の整数です。 n の値はプ ロ セ ッ サに よ っ て異な り ます。 現在のプ ロ セ ッ サでは 0 が使用 さ れてい ます。 RdLo?RdHi 汎用レ ジ ス タ を指定 し ます。 RdLo と RdHi を pc にす る こ と はで き ません。 ま た、 MRA では異な っ た レ ジ ス タ でなければな り ません。 使用法 MAR 命令は、RdLo の内容を Acc の ビ ッ ト [31:0] に コ ピー し 、RdHi の最下位バ イ ト を Acc のビ ッ ト [39:32] に コ ピー し ます。 MRA 命令は以下を実行 し ます。 • Acc の ビ ッ ト [31:0] を RdLo に コ ピー し ます。 • Acc の ビ ッ ト [39:32] を RdHi の ビ ッ ト [7:0] に コ ピー し ます。 • Acc の ビ ッ ト [39] を RdHi のビ ッ ト [31:8] に コ ピー し て値を符号拡張 し ま す。 アーキテ ク チ ャ こ れ ら の ARM コ プ ロ セ ッ サ 0 命令は、 XScale プ ロ セ ッ サでのみ使用で き ま す。 こ れ ら の命令の Thumb バージ ョ ンはあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-157 ARM 命令 と Thumb 命令 サン プル MAR MRA MARNE MRAGT 4-158 acc0, r0, r1 r4, r5, acc0 acc0, r9, r2 r4, r8, acc0 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.11 Thumb での命令の幅の選択 ARMv6T2 以降のプ ロ セ ッ サの Thumb コ ー ド を書 く と き 、 命令の中には 16 ビ ッ ト エ ン コ ーデ ィ ン グ と 32 ビ ッ ト エ ン コ ーデ ィ ン グの ど ち ら で も 使用で き る も のがあ り ます。 ど ち ら も 可能な場合、 アセ ン ブ ラ は通常 16 ビ ッ ト エ ン コ ーデ ィ ン グ を生成 し ます (例外については、 「「異な る 動作を持つ命令」」 を参照)。 4.11.1 命令の幅の指定子 : .W と .N アセ ン ブ ラ の こ の動作を制御す る には .W 幅指定子を使用 し ます。 こ れは 16 ビ ッ ト エ ン コ ーデ ィ ン グが使用で き る 場合で も 32 ビ ッ ト エ ン コ ーデ ィ ン グが 使用 さ れ る よ う に し ます。 .W 指定子は ARM ま たは Thumb (ARMv6T2 以降) コ ー ド にアセ ン ブルす る 可 能性のあ る コ ー ド で使用で き ます。 .W 指定子は ARM コ ー ド と し て アセ ン ブル す る と き には無視 さ れ ます。 確実に 16 ビ ッ ト でエ ン コ ー ド さ れ る よ う にす る には、 .N 幅指定子を使用で き ます。 こ の場合、 16 ビ ッ ト でエ ン コ ー ド で き ない命令に対 し て使用 さ れた場 合や ARM コ ー ド と し て アセ ン ブルす る と き 、 エ ラ ーが出ます。 命令の幅指定子は、 命令ニーモニ ッ ク と 条件 コ ー ド (存在す る 場合) の直後 に置 き ます。 次に例を示 し ます。 BCS.W B.N 4.11.2 label label ; forces 32-bit instruction even for a short branch : faults if label out of range for 16-bit instruction 異な る動作を持つ命令 参考 と し て、 32 ビ ッ ト 命令が使用で き る タ ーゲ ッ ト で失敗が発生 し て も 、 .W 指定な し の LDR、 ADR、 お よ び B が常に 16 ビ ッ ト 命令を生成 し ます。 外部参照では、 LDR お よ び B に .W が指定 さ れていな く て も 常に 32 ビ ッ ト 命令 が生成 さ れ ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-159 ARM 命令 と Thumb 命令 4.11.3 診断警告 診断警告を使用 し て、 .W を指定 し たため、 分岐命令が 16 ビ ッ ト でエ ン コ ー ド で き る に も かかわ ら ず 32 ビ ッ ト でエ ン コ ー ド さ れた と き 検出 さ れ る よ う にで き ます。 --diag_warning 1607 こ の警告はデフ ォ ル ト ではオ フ にな っ てい ます。 注 こ の診断 コ ー ド は再配置 さ れた分岐命令には警告が表示 さ れ ません。 こ れは 最終的な ア ド レ ス が未知のためです。 分岐が 32 ビ ッ ト 命令で も 範囲外にな る 場合、 リ ン カがベニ ア を挿入す る こ と さ え あ り ます。 4-160 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.12 ThumbEE 命令 ENTERX と LEAVEX を除 き 、 こ れ ら の ThumbEE 命令はアセ ン ブ ラ が ThumbEE 状 態に切 り 替わ っ た と き にのみ受け入れ ら れ ます。 切 り 替えは --thumbx コ マ ン ド ラ イ ン オプシ ョ ン ま たは THUMBX デ ィ レ ク テ ィ ブ を使用 し ます。 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「ENTERX、 LEAVEX」 (ページ 4-162) Thumb 状態 と ThumbEE 状態の間で切 り 替え を行 う 命令です。 • 「CHKA」 (ページ 4-163) 配列をチ ェ ッ ク す る 命令です。 • 「HB、 HBL、 HBLP、 HBP」 (ページ 4-164) ハン ド ラ の分岐命令です。 指定 さ れたハン ド ラ に分岐 し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-161 ARM 命令 と Thumb 命令 4.12.1 ENTERX、 LEAVEX Thumb 状態 と ThumbEE 状態の間で切 り 替え を行 う 命令です。 構文 ENTERX LEAVEX 使用法 ENTERX を使用す る と 、 Thumb 状態か ら ThumbEE 状態に切 り 替わ る か、 ま たは ThumbEE 状態が維持 さ れ ます。 LEAVEX を使用す る と 、 ThumbEE 状態か ら Thumb 状態に切 り 替わ る か、 ま たは Thumb 状態が維持 さ れます。 IT ブ ロ ッ ク 内では、 ENTERX ま たは LEAVEX を使用 し ないで下 さ い。 アーキテ ク チ ャ こ れ ら の命令は、 ARM 命令セ ッ ト では使用で き ません。 こ れ ら の 32 ビ ッ ト Thumb 命令お よ び Thumb-2EE 命令は、 Thumb-2EE を サ ポー ト す る ARMv7 で使用で き ます。 こ れ ら の命令の 16 ビ ッ ト Thumb-2 バージ ョ ンはあ り ません。 詳細については、 『ARM Architecture Reference Manual Thumb-2 Execution Environment Supplement』 を参照 し て下 さ い。 4-162 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.12.2 CHKA CHKA (配列のチ ェ ッ ク ) は、 2 つの レ ジ ス タ にあ る 符号な し の値を比較 し ま す。 最初の レ ジ ス タ の値が 2 番目の レ ジ ス タ の値以下か等 し い場合、 こ の命令に よ り 、 プ ロ グ ラ ム カ ウ ン タ が lr に コ ピー さ れ、 IndexCheck ハン ド ラ への分岐 が発生 し ます。 構文 CHKA Rn, Rm 各項目には以下の意味があ り ます。 Rn 配列のサ イ ズ を指定 し ます。 r15 は使用 し ないで下 さ い。 Rm 配列の イ ンデ ク ス を指定 し ます。 r13 と r15 を使用 し ないで下 さ い。 アーキテ ク チ ャ ARM 状態では使用で き ません。 こ の 16 ビ ッ ト ThumbEE 命令は Thumb-2EE をサポー ト す る ARMv7 のみで使 用で き ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-163 ARM 命令 と Thumb 命令 4.12.3 HB、 HBL、 HBLP、 HBP ハン ド ラ の分岐命令です。 指定 さ れたハン ド ラ に分岐 し ます。 こ の命令は、 必要に応 じ て、 復帰ア ド レ ス を lr に ス ト ア し た り 、 パ ラ メ ー タ をハン ド ラ に渡 し た り す る こ と がで き ます。 ま た、 その両方を行 う こ と も で き ます。 構文 HB{L} #HandlerID HB{L}P #immed, #HandlerID 各パ ラ メ ー タ には以下の意味があ り ます。 L 任意に指定で き る 接尾文字です。 L を指定す る と 、 復帰ア ド レ ス が lr に保存 さ れ ます。 P 任意に指定で き る 接尾文字です。 P を指定す る と 、 immed の値が r8 のハン ド ラ に渡 さ れます。 immed イ ミ デ ィ エー ト 値を指定 し ます。 L を指定 し た場合、 immed に 0 ~ 31 の範囲の値を指定す る 必要があ り ます。 こ の接尾文字を指定 し ない場合、 immed には 0 ~ 7 の範囲の値を指定す る 必要があ り ます。 HandlerID 呼び出すハン ド ラ の イ ンデ ク ス番号を指定 し ます。 P を指定 し た 場合、 HandlerID に 0 ~ 31 の範囲の値を指定す る 必要があ り ます。 こ の接尾文字を指定 し ない場合、 HandlerID には 0 ~ 255 の範囲の 値を指定す る 必要があ り ます。 アーキテ ク チ ャ こ れ ら の命令は ARM 状態では使用で き ません。 こ れ ら の 16 ビ ッ ト 命令は、 Thumb-2EE を サポー ト す る ARMv7 の ThumbEE 状態でのみ使用で き ます。 4-164 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.13 疑似命令 ARM アセ ン ブ ラ は、 多 く の疑似命令を サポー ト し てい ます。 こ れ ら の疑似命 令は、 アセ ン ブ リ 時に適切な ARM 命令、 Thumb-2 命令、 ま たは Thumb-2 以 前の Thumb 命令の組み合わせに変換 さ れ ます。 疑似命令については、 以下のサブセ ク シ ョ ン を参照 し て下 さ い。 • 「ADRL 疑似命令」 (ページ 4-166) プ ロ グ ラ ム相対ア ド レ ス ま たは レ ジ ス タ 相対ア ド レ ス (中範囲、 位置非 依存) を レ ジ ス タ に ロ ー ド し ます。 • 「MOV32 疑似命令」 (ページ 4-168) 32 ビ ッ ト 定数値ま たはア ド レ ス (範囲無制限、 位置依存) を レ ジ ス タ に ロ ー ド し ます。 ARMv6T2 以降でのみ使用で き ます。 • 「LDR 疑似命令」 (ページ 4-170) 32 ビ ッ ト 定数値ま たはア ド レ ス (範囲無制限、 位置依存) を レ ジ ス タ に ロ ー ド し ます。 すべての ARM アーキ テ ク チ ャ で使用で き ます。 • 「UND 疑似命令」 (ページ 4-173) アーキ テ ク チ ャ 上で定義 さ れていない命令を生成 し ます。すべての ARM アーキ テ ク チ ャ で使用で き ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-165 ARM 命令 と Thumb 命令 4.13.1 ADRL 疑似命令 プ ロ グ ラ ム相対ア ド レ ス ま たは レ ジ ス タ 相対ア ド レ ス を レ ジ ス タ に ロ ー ド し ます。 ADR 疑似命令 と 似てい ますが、 ADRL では 2 つのデー タ 処理命令が生成 さ れ る ため、 ADR よ り 広範囲のア ド レ ス を ロ ー ド で き ます。 注 ADRL は Thumb-2 以前の プ ロ セ ッ サの Thumb 命令を アセ ン ブルす る と き には使 用で き ません。 構文 ADRL{cond} Rd,label 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd ロ ー ド す る レ ジ ス タ を指定 し ます。 label レ ジ ス タ 相対式ま たはプ ロ グ ラ ム相対式を指定 し ます。 詳細につ いては、 「レ ジ ス タ 相対式 と プ ロ グ ラ ム相対式」 (ページ 3-39) を参照 し て下 さ い。 使用法 ADRL は常に 2 つの 32 ビ ッ ト 命令にアセ ン ブル さ れ ます。 1 つの命令でア ド レ ス に到達で き る 場合で も 、 2 番目の冗余命令が生成 さ れ ます。 アセ ン ブ ラ が 2 つの命令でア ド レ ス を作成で き ない場合は、 エ ラ ー メ ッ セー ジが生成 さ れ、 アセ ン ブルに失敗 し ます。 よ り 広い範囲のア ド レ ス を ロ ー ド す る 方法については、 「LDR 疑似命令」 (ページ 4-170) を参照 し て下 さ い。 「レ ジ ス タ への定数の ロ ー ド 」 (ページ 2-27) も 参照 し て下 さ い。 ADRL は、 ア ド レ ス がプ ロ グ ラ ム相対ま たは レ ジ ス タ 相対であ る ため、 位置非 依存 コ ー ド を生成 し ます。 label にプ ロ グ ラ ム相対式を指定す る 場合は、 ADRL 疑似命令 と 同 じ アセ ン ブ ラ 領域内のア ド レ ス を指定す る 必要があ り ます (「AREA」 (ページ 7-81) を参 照)。 4-166 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 BX ま たは BLX 命令の タ ーゲ ッ ト を生成す る ために ADRL を使用す る と き は、 タ ーゲ ッ ト に Thumb 命令が含ま れてい る 場合、 そのア ド レ ス の Thumb ビ ッ ト (ビ ッ ト 0) を設定す る 必要があ り ます。 アーキテ ク チ ャ と 範囲 利用で き る 範囲は、 使用す る 命令セ ッ ト に よ っ て異な り ます。 ARM バ イ ト 境界ま たはハーフ ワ ー ド 境界で整列 さ れてい る ア ド レ ス か ら ±64KB の範囲 ワー ド 境界で整列 さ れてい る ア ド レ ス か ら ±256KB バ イ ト の範囲 32 ビ ッ ト の Thumb バ イ ト 、 ハーフ ワ ー ド 、 ま たは ワー ド 境界で整列 さ れて い る ア ド レ ス か ら ±1MB の範囲 16 ビ ッ ト の Thumb ADRL 命令は使用で き ません。 与え ら れてい る 範囲は、 Thumb コ ー ド では現在の命令のア ド レ ス か ら 4 バ イ ト 、 ARM コ ー ド では現在の命令のア ド レ ス か ら 2 ワ ー ド の地点か ら の範囲で す。 境界調整が こ の位置か ら 16 バ イ ト 以上の相対位置にあ る 場合、 よ り 広範 囲のア ド レ ス を利用で き ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-167 ARM 命令 と Thumb 命令 4.13.2 MOV32 疑似命令 以下のいずれかの値を レ ジ ス タ に ロ ー ド し ます。 • 32 ビ ッ ト 定数値 • 任意のア ド レ ス MOV32 は常に 2 つの 32 ビ ッ ト 命令、 MOV と MOVT の対を生成 し ます。 こ の命令対 を使用 し て、 32 ビ ッ ト 定数を ロ ー ド し た り 、 32 ビ ッ ト ア ド レ ス空間全体にア ク セ ス し た り す る こ と がで き ます。 構文 MOV32{cond} Rd, expr 各項目には以下の意味があ り ます。 4-168 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Rd ロ ー ド 先の レ ジ ス タ を指定 し ます。 Rd に sp と pc は指定で き ませ ん。 expr 以下のいずれか を指定で き ます。 symbol こ のプ ロ グ ラ ム領域ま たは別のプ ロ グ ラ ム領 域内の ラ ベルです。 constant 任意の 32 ビ ッ ト 定数です。 symbol + constant ラ ベル と 32 ビ ッ ト 定数を組み合わせた も ので す。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 使用法 MOV32 疑似命令の主な目的は以下の と お り です。 • 1 つの命令で イ ミ デ ィ エー ト 値を生成で き ない場合に リ テ ラ ル定数を生 成す る こ と 。 • プ ロ グ ラ ム相対ア ド レ ス ま たは外部ア ド レ ス を レ ジ ス タ に ロ ー ド す る こ と 。 こ のア ド レ ス は、 リ ン カが MOV32 を保持す る ELF セ ク シ ョ ン を ど こ に配置 し て も 有効です。 注 こ の方法で ロ ー ド さ れた ア ド レ ス は リ ン ク 時に固定 さ れ る ため、 こ の コ ー ド は位置依存 コ ー ド にな り ます。 ロ ーカル ラ ベルが Thumb コ ー ド を参照す る 場合、 MOV32 はア ド レ ス の Thumb ビ ッ ト (ビ ッ ト 0) が設定 さ れ ます。 アーキテ ク チ ャ こ の疑似命令は、 ARM、 Thumb 共に ARMv6T2 以降で使用で き ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-169 ARM 命令 と Thumb 命令 4.13.3 LDR 疑似命令 以下のいずれかの値を レ ジ ス タ に ロ ー ド し ます。 • 32 ビ ッ ト 定数値 • アドレス 注 こ のセ ク シ ョ ン では、 LDR 疑似命令についてのみ説明 し ます。 LDR 命令 について は、 「 メ モ リ ア ク セ ス命令」 (ページ 4-10) を参照 し て下 さ い。 構文 LDR{cond}{.W} Rt, =expr LDR{cond}{.W} Rt, =label_expr 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 .W 任意に指定で き る 幅指定子を指定 し ます。 Rt ロ ー ド 先の レ ジ ス タ を指定 し ます。 expr 数値定数を求め る 式を指定 し ます (「数値定数」 (ページ 3-30) を参照)。 • expr の値が範囲内の場合、 アセ ン ブ ラ は MOV 命令ま たは MVN 命令を生成 し ます。 • expr の値が MOV ま たは MVN 命令の 範囲外 の場合、 アセ ン ブ ラ はその定数を リ テ ラ ルプールに配置 し 、 リ テ ラ ルプールか ら 定数を読み出すプ ロ グ ラ ム相対 LDR 命令を生成 し ます。 定数の ロ ー ド については、 「LDR Rd, =const を使用 し た ロ ー ド 」 (ページ 2-32) を参照 し て下 さ い。 label_expr 4-170 ア ド レ ス のプ ロ グ ラ ム相対式ま たは外部式を ラ ベルか ら 数値定 数を加減算す る 形式で指定 し ます (詳細については、 「レ ジ ス タ 相対式 と プ ロ グ ラ ム相対式」 (ページ 3-39) を参照)。 アセ ンブ ラ は、 label_expr の値を リ テ ラ ルプールに配置 し 、 リ テ ラ ルプール か ら こ の値を ロ ー ド す る プ ロ グ ラ ム相対 LDR 命令を生成 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 label_expr が外部式であ る か、 ま たは現在のセ ク シ ョ ンに含まれ ていない場合、 アセ ン ブ ラ は リ ン カ再配置デ ィ レ ク テ ィ ブ を そ のオブジ ェ ク ト フ ァ イ ル内に入れ ます。 リ ン カは リ ン ク 時にア ド レ ス を生成 し ます。 label_expr が ロ ーカル ラ ベル (「 ロ ーカル ラ ベル」 (ページ 3-33) を参照) の場合、 アセ ンブ ラ は リ ン カ再配置デ ィ レ ク テ ィ ブ を オブジ ェ ク ト フ ァ イ ル内に入れ、 その ロ ーカル ラ ベルのシ ン ボ ルを生成 し ます。 ア ド レ ス は リ ン ク 時に生成 さ れます。 ロ ーカル ラ ベルが Thumb コ ー ド を参照す る 場合、 ア ド レ ス の Thumb ビ ッ ト (ビ ッ ト 0) が設定 さ れ ます。 注 RVCT v2.2 では、 ア ド レ ス の Thumb ビ ッ ト が設定 さ れ ませんで し た。 こ の動作に依存す る コ ー ド では、 コ マ ン ド ラ イ ン オプシ ョ ン --untyped_local_labels を使用 し て、 アセ ン ブ ラ が Thumb コ ー ド 内の ラ ベルを参照す る 際に Thumb ビ ッ ト を設定 し ない よ う に し ます。 使用法 LDR 疑似命令の主な目的は以下の と お り です。 • イ ミ デ ィ エー ト 値が MOV 命令お よ び MVN 命令の範囲外にあ る ため、 レ ジ ス タ に移動で き ない場合に、 リ テ ラ ル定数を生成す る こ と 。 • プ ロ グ ラ ム相対ア ド レ ス ま たは外部ア ド レ ス を レ ジ ス タ に ロ ー ド す る こ と 。 こ のア ド レ ス は、 リ ン カが LDR を保持す る ELF セ ク シ ョ ン を ど こ に 配置 し て も 有効です。 注 こ の方法で ロ ー ド さ れた ア ド レ ス は リ ン ク 時に固定 さ れ る ため、 こ の コ ー ド は位置依存 コ ー ド にな り ます。 pc か ら リ テ ラ ルプール内の値ま でのオ フ セ ッ ト は ±4KB (ARM、 32 ビ ッ ト Thumb-2) よ り 小 さ いか、 0 ~ +1KB (16 ビ ッ ト Thumb-2、 Thumb-2 以前の Thumb) の範囲内にな っ てい る 必要があ り ます。 こ の と き 範囲内に リ テ ラ ル プールがあ る こ と を必ず確認 し て下 さ い。 詳細については、 「LTORG」 (ペー ジ 7-20) を参照 し て下 さ い。 参照 さ れてい る ラ ベルが Thumb コ ー ド 内にあ る 場合、 LDR 疑似命令は label_expr の Thumb ビ ッ ト (ビ ッ ト 0) を設定 し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-171 ARM 命令 と Thumb 命令 LDR の使用方法、 お よ び MOV と MVN の詳細については、 「レ ジ ス タ への定数の ロ ー ド 」 (ページ 2-27) を参照 し て下 さ い。 Thumb コ ー ド 内の LDR ARMv6T2 以降のプ ロ セ ッ サでは、 .W 幅指定子を使っ て LDR が 32 ビ ッ ト の Thumb コ ー ド 命令を生成す る よ う にで き ます。 LDR.W は、 定数を 16 ビ ッ ト の MOV に ロ ー ド で き る と き で も 、 リ テ ラ ルプールが 16 ビ ッ ト pc 相対 ロ ー ド の範 囲内にあ る と き で も 、 常に 32 ビ ッ ト 命令を生成 し ます。 定数の値がアセ ン ブ ラ の初回パ ス で未知の場合、 .W な し の LDR は 16 ビ ッ ト Thumb コ ー ド 命令を生成 し ます。 その結果 32 ビ ッ ト の MOV ま たは MVN 命令で 生成で き る 定数で も 16 ビ ッ ト pc 相対 ロ ー ド にな り ます。 定数が初回パ ス で既 知で、 32 ビ ッ ト の MOV ま たは MVN 命令を使っ て生成で き る 場合は、 MOV ま たは MVN 命令が使用 さ れ ます。 LDR 疑似命令は 16 ビ ッ ト フ ラ グ を設定す る MOV 命令を生成す る こ と はあ り ませ ん。 アセ ンブ ラ の --diag_warning 1727 コ マ ン ド ラ イ ン オプシ ョ ン を使用 し て、 16 ビ ッ ト 命令の使用を確認で き ます。 リ テ ラ ルプールか ら ロ ー ド せずに定数やア ド レ ス を生成す る 方法については、 「MOV32 疑似命令」 (ページ 4-168) を参照 し て下 さ い。 サン プル 4-172 LDR r3,=0xff0 LDR r1,=0xfff LDR r2,=place ; ; ; ; ; ; ; ; ; ; ; loads 0xff0 into r3 => MOV.W r3,#0xff0 loads 0xfff into r1 => LDR r1,[pc,offset_to_litpool] ... litpool DCD 0xfff loads the address of place into r2 => LDR r2,[pc,offset_to_litpool] ... litpool DCD place Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ARM 命令 と Thumb 命令 4.13.4 UND 疑似命令 アーキ テ ク チ ャ 上で定義 さ れていない命令を生成 し ます。 定義 さ れていない 命令を実行 し よ う と す る と 未定義命令の例外が発生 し ます。 アーキ テ ク チ ャ 上で定義 さ れていない命令は未定義の ま ま にな り ます。 構文 UND{cond}{.W} {#expr} 各パ ラ メ ー タ には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 Thumb-2 以前の Thumb コ ー ド の こ の疑似命令では、 cond は使用で き ません。 .W 任意に指定で き る 幅指定子を指定 し ます。 expr 数値定数を求め る 式を指定 し ます。 表 4-8 は命令におけ る expr の 範囲 と エ ン コ ーデ ィ ン グ を示 し た も のです。 こ こ で、 Y は expr を エ ン コ ー ド す る ビ ッ ト 位置を示 し 、 V は条件 コ ー ド を エ ン コ ー ド す る 4 ビ ッ ト を示 し ます。 expr が省略 さ れた場合、 0 が使用 さ れます。 表 4-8 expr の範囲 と エ ン コ ーデ ィ ング 命令 エ ン コ ーデ ィ ング expr のビ ッ ト 数 範囲 ARM 0xV7FYYYFY 16 0-65535 32 ビ ッ ト Thumb 0xF7FYAYFY 12 0-4095 16 ビ ッ ト Thumb 0xDEYY 8 0-255 Thumb コ ー ド 内の UND ARMv6T2 以降のプ ロ セ ッ サでは、 .W 幅指定子を使っ て UND が 32 ビ ッ ト の Thumb コ ー ド 命令を生成す る よ う にで き ます。 expr が 0 ~ 255 の範囲で も UND.W は常に 32 ビ ッ ト 命令を生成 し ます。 逆アセ ン ブ リ こ の疑似命令か ら のエ ン コ ーデ ィ ン グは DCI に逆アセ ン ブル し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 4-173 ARM 命令 と Thumb 命令 4-174 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 第5章 NEON と VFP プ ログ ラ ミ ン グ 本章では、 NEON™ と VFP コ プ ロ セ ッ サのアセ ン ブ リ プ ロ グ ラ ミ ン グについ て説明 し ます。 • 「命令の概要」 (ページ 5-3) • • • • • • • • • • • • • ARM DUI 0204IJ 「NEON と VFP 向けのアーキ テ ク チ ャ サポー ト 」 (ページ 5-9) 「拡張レ ジ ス タ バン ク 」 (ページ 5-10) 「条件 コ ー ド 」 (ページ 5-13) 「一般的な情報」 (ページ 5-15) 「NEON と VFP に共通の命令」 (ページ 5-24) 「NEON 論理演算 と 比較演算」 (ページ 5-33) 「NEON 汎用デー タ 処理命令」 (ページ 5-43) 「NEON シ フ ト 命令」 (ページ 5-57) 「NEON 汎用算術命令」 (ページ 5-65) 「NEON 乗算命令」 (ページ 5-81) 「NEON 要素 と 構造体の ロ ー ド / ス ト ア命令」 (ページ 5-87) 「NEON 疑似命令お よ び VFP 疑似命令」 (ページ 5-95) 「NEON / VFP シ ス テ ム レ ジ ス タ 」 (ページ 5-104) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-1 NEON と VFP プ ログ ラ ミ ング • • • 5-2 「ゼ ロ ク リ アモー ド 」 (ページ 5-109) 「VFP 命令」 (ページ 5-111) 「VFP ベ ク タ モー ド 」 (ページ 5-123) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.1 命令の概要 こ のセ ク シ ョ ン では、 NEON 命令 と VFP 命令の概要を説明 し ます。 こ のセ ク シ ョ ン を使用 し て、 本章の残 り の部分に記載 さ れてい る 各命令お よ び疑似命 令の説明に移動で き ます。 説明す る 内容は以下の と お り です。 • • • 5.1.1 「NEON 命令」 「共通の NEON 命令 と VFP 命令」 (ページ 5-6) 「VFP 命令」 (ページ 5-8) NEON 命令 表 5-1 に NEON 命令の概要を示 し ます。 こ れ ら の命令は VFP では使用で き ま せん。 表 5-1 NEON 命令の参照ページ ニーモニ ッ ク 概要 ページ VABA, VABD 絶対差、 絶対差 と 累積 (ページ 5-66) VABS 絶対値 (ページ 5-67) VACGE, VACGT 以上 (絶対値比較)、 超 (ページ 5-39) VACLE, VACLT 以下 (絶対値比較)、 未満 (疑似命令) (ページ 5-102) VADD 加算 (ページ 5-68) VADDHN 加算、 上位半分の選択 (ページ 5-70) VAND ビ ッ ト 単位論理積 (ページ 5-34) VAND ビ ッ ト 単位論理積 (疑似命令) (ページ 5-100) VBIC ビ ッ ト 単位ビ ッ ト ク リ ア (レ ジ ス タ ) (ページ 5-34) VBIC ビ ッ ト 単位ビ ッ ト ク リ ア ( イ ミ デ ィ エー ト ) (ページ 5-35) VBIF, VBIT, VBSL False の場合はビ ッ ト 単位挿入、 True の場合はビ ッ ト 単位を挿入、 お よ び 選択 (ページ 5-37) VCEQ, VCLE, VCLT 等 し い (比較)、 以下 (比較)、 未満 (比較) (ページ 5-40) VCLE, VCLT 以下 (比較)、 未満 (比較、 疑似命令) (ページ 5-103) VCLS, VCLZ, VCNT 先行符号ビ ッ ト カ ウ ン ト 、 先行ゼ ロ カ ウ ン ト 、 お よ びセ ッ ト ビ ッ ト カ ウ ント (ページ 5-76) ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-3 NEON と VFP プ ログ ラ ミ ング 表 5-1 NEON 命令の参照ページ (続き) ニーモニ ッ ク 概要 ページ VCVT 固定小数点ま たは整数か ら 浮動小数点へ、 浮動小数点か ら 整数ま たは固 定小数点への変換 (ページ 5-44) VCVT 半精度浮動小数点数 と 単精度浮動小数点数間の変換 (ページ 5-46) VDUP ベ ク タ の全レーンへの ス カ ラ の複製 (ページ 5-47) VEXT 抽出 (ページ 5-48) VCGE, VCGT 以上 (比較)、 超 (比較) (ページ 5-40) VEOR ビ ッ ト 単位排他的論理和 (XOR) (ページ 5-34) VHADD, VHSUB 二分加算、 二分減算 (ページ 5-71) VMAX, VMIN 最大値、 最小値 (ページ 5-74) VLD ベク タ ロード (ページ 5-87) VMLA, VMLS 積和、 積差 (ベ ク タ ) (ページ 5-82) VMLA, VMLS 積和、 積差 (ス カ ラ に よ る ) (ページ 5-84) VMOV 移動 ( イ ミ デ ィ エー ト ) (ページ 5-49) VMOV 移動 (レ ジ ス タ ) (ページ 5-38) VMOVL, VMOV{U}N Long 移動、 Narrow 移動 (レ ジ ス タ ) (ページ 5-50) VMUL 乗算 (ベ ク タ ) (ページ 5-82) VMUL 乗算 (ス カ ラ に よ る ) (ページ 5-84) VMVN 負の移動 ( イ ミ デ ィ エー ト ) (ページ 5-49) VNEG 否定 (ページ 5-67) VORN ビ ッ ト 単位否定論理和 (ページ 5-34) VORN ビ ッ ト 単位否定論理和 (疑似命令) (ページ 5-100) VORR ビ ッ ト 単位論理和 (レ ジ ス タ ) (ページ 5-34) VORR ビ ッ ト 単位論理和 ( イ ミ デ ィ エー ト ) (ページ 5-35) VPADD, VPADAL ペア ワ イ ズ加算、 ペア ワ イ ズ加算累積 (ページ 5-72) 5-4 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 表 5-1 NEON 命令の参照ページ (続き) ニーモニ ッ ク 概要 ページ VPMAX, VPMIN ペア ワ イ ズ最大値、 ペア ワ イ ズ最小値 (ページ 5-74) VQABS 絶対値、 サチ ュ レー ト (ページ 5-67) VQADD 加算、 サチ ュ レー ト (ページ 5-68) VQDMLAL, VQDMLSL サチ ュ レー ト ダブル積和、 積差 (ページ 5-85) VQMOV{U}N サチ ュ レー ト 移動 (レ ジ ス タ ) (ページ 5-50) VQDMUL サチ ュ レー ト ダブル乗算 (ページ 5-85) VQDMULH 上位半分を返すサチ ュ レー ト ダブル乗算 (ページ 5-86) VQNEG 否定、 サチ ュ レー ト (ページ 5-67) VQRDMULH 上位半分を返すサチ ュ レー ト ダブル乗算 (ページ 5-86) VQRSHL 左シ フ ト 、 丸め、 サチ ュ レー ト (符号付 き 変数に よ る ) (ページ 5-60) VQRSHR 右シ フ ト 、 丸め、 サチ ュ レー ト ( イ ミ デ ィ エー ト に よ る ) (ページ 5-63) VQSHL 左シ フ ト 、 サチ ュ レー ト ( イ ミ デ ィ エー ト に よ る ) (ページ 5-58) VQSHL 右シ フ ト 、 サチ ュ レー ト (符号付 き 変数に よ る ) (ページ 5-60) VQSHR 右シ フ ト 、 サチ ュ レー ト ( イ ミ デ ィ エー ト に よ る ) (ページ 5-63) VQSUB 減算、 サチ ュ レー ト (ページ 5-68) VRADDH 加算、 上位半分の選択、 丸め (ページ 5-70) VRECPE 逆数の推定 (ページ 5-77) VRECPS 逆数の ス テ ッ プ (ページ 5-79) VREV 要素の順番の反転 (ページ 5-52) VRHADD 二分加算、 丸め (ページ 5-71) VRSHR, VRSRA 右シ フ ト し て丸め、 右シ フ ト 、 丸め、 累積 ( イ ミ デ ィ エー ト に よ る ) (ページ 5-61) VRSUBH 減算、 上位半分の選択、 丸め (ページ 5-70) VRSQRTE 逆平方根の推定 (ページ 5-77) ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-5 NEON と VFP プ ログ ラ ミ ング 表 5-1 NEON 命令の参照ページ (続き) ニーモニ ッ ク 概要 ページ VRSQRTS 逆平方根の ス テ ッ プ (ページ 5-79) VSHL 左シ フ ト ( イ ミ デ ィ エー ト に よ る ) (ページ 5-58) VSHR 右シ フ ト ( イ ミ デ ィ エー ト に よ る ) (ページ 5-61) VSLI 左シ フ ト し て挿入 (ページ 5-64) VSRA 右シ フ ト 、 累積 ( イ ミ デ ィ エー ト に よ る ) (ページ 5-61) VSRI 右シ フ ト し て挿入 (ページ 5-64) VST ベク タ ス ト ア (ページ 5-87) VSUB 減算 (ページ 5-68) VSUBH 減算、 上位半分の選択 (ページ 5-70) VSWP ベク タのス ワ ッ プ (ページ 5-53) VTBL, VTBX ベ ク タ テーブルの検索 (ページ 5-54) VTST テス ト ビ ッ ト (ページ 5-42) VTRN ベ ク タ 置換 (ページ 5-55) VUZP, VZIP ベ ク タ の イ ン タ ー リ ーブ と イ ン タ ー リ ーブの解除 (ページ 5-56) 5.1.2 共通の NEON 命令 と VFP 命令 表 5-2 に NEON と VFP に共通す る 命令の概要を示 し ます。 表 5-2 NEON と VFP に共通の命令の参照ページ ニーモニ ッ ク 概要 ページ 演算 アーキテ クチャ VLDM 多重 ロ ー ド (ページ 5-27) - すべて VLDR ロ ー ド (「VLDR 疑似命令」 (ページ 5-96) も 参照) (ページ 5-25) スカラ すべて ロ ー ド (ポ ス ト イ ン ク リ メ ン ト と プ レデ ク リ メ ン ト) (ページ 5-97) スカラ すべて 5-6 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 表 5-2 NEON と VFP に共通の命令の参照ページ (続き) ニーモニ ッ ク 概要 ページ 演算 アーキテ クチャ VMOV 1 本の ARM® レ ジ ス タ か ら 半本分のダブル ワー ド レ ジ ス タ への転送 (ページ 5-30) スカラ すべて 2 本の ARM レ ジ ス タ か ら 1 本のダブル ワー ド レ ジ ス タ への転送 (ページ 5-29) スカラ VFPv2 半本分のダブル ワー ド レ ジ ス タ か ら 1 本の ARM レ ジ ス タ への転送 (ページ 5-30) スカラ すべて 1 本のダブル ワ ー ド レ ジ ス タ か ら 2 本の ARM レ ジ ス タ への転送 (ページ 5-29) スカラ VFPv2 単精度か ら ARM レ ジ ス タ への転送 (ページ 5-31) スカラ すべて ARM レ ジ ス タ か ら 単精度への転送 (ページ 5-31) スカラ すべて VMRS NEON / VFP シ ス テ ム レ ジ ス タ か ら ARM レ ジ ス タ への転送 (ページ 5-32) - すべて VMSR ARM レ ジ ス タ か ら NEON/VFP シ ス テ ム レ ジ ス タ へ の転送 (ページ 5-32) - すべて VSTM 多重ス ト ア (ページ 5-27) - すべて VSTR ストア (ページ 5-25) スカラ すべて ス ト ア (ポ ス ト イ ン ク リ メ ン ト と プ レデ ク リ メ ン ト) (ページ 5-97) スカラ すべて ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-7 NEON と VFP プ ログ ラ ミ ング 5.1.3 VFP 命令 表 5-3 に NEON で使用で き ない VFP 命令の概要を示 し ます。 表 5-3 VFP 命令の参照ページ ニーモニ ッ ク 概要 ページ 演算 アーキテ クチャ VABS 絶対値 (ページ 5-112) ベク タ すべて VADD 加算 (ページ 5-113) ベク タ すべて VCMP 比較 (ページ 5-116) スカラ すべて VCVT 単精度 と 倍精度間の変換 (ページ 5-117) スカラ すべて 浮動小数点 と 整数間の変換 (ページ 5-118) スカラ すべて 浮動小数点 と 固定小数点間の変換 (ページ 5-119) スカラ VFPv3 VCVTB, VCVTT 半精度浮動小数点数 と 単精度浮動小数点数間の変 換 (ページ 5-121) スカラ 半精度 VDIV 除算 (ページ 5-113) ベク タ すべて VMLA 積和 (ページ 5-114) ベク タ すべて VMLS 乗減算 (ページ 5-114) ベク タ すべて VMOV 単精度ま たは倍精度レ ジ ス タ への浮動小数点定数 の挿入 (表 5-2 (ページ 5-6) も 参照) (ページ 5-122) スカラ VFPv3 VMUL 乗算 (ページ 5-114) ベク タ すべて VNEG 否定 (ページ 5-112) ベク タ すべて VNMLA 否定乗累積 (ページ 5-114) ベク タ すべて VNMLS 否定乗減算 (ページ 5-114) ベク タ すべて VNMUL 否定乗算 (ページ 5-114) ベク タ すべて VSQRT 平方根 (ページ 5-112) ベク タ すべて VSUB 減算 (ページ 5-113) ベク タ すべて 5-8 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.2 NEON と VFP 向けのアーキテ ク チ ャ サポー ト NEON 拡張は、 ARMv7-A と ARMv7-R のアーキ テ ク チ ャ でのみオプシ ョ ン と し て使用で き ます。 NEON を サポー ト し てい る シ ス テ ム では、 半精度命令を 除 く すべての NEON 命令を使用で き ます。 命令の中には、 NEON な し の VFP 拡張を実装 し たシ ス テ ム で使用で き る も の も あ り ます。 こ れ ら は 「共通の命 令」 と 呼ばれ ます。 半精度命令を使用で き る のは、 半精度拡張を実装 し た NEON シ ス テ ム ま たは VFPv3 シ ス テ ムだけです (「半精度拡張」 を参照)。 大半の VFP 命令お よ び 共通の命令は、 VFP アーキ テ ク チ ャ のすべてのバー ジ ョ ン で使用で き ます。 こ れが当ては ま ら ない場合には、 該当す る VFP アー キ テ ク チ ャ のバージ ョ ン を命令の説明文中に記述 し て あ り ます。 ARMv7-M は、 VFP を サポー ト し てい ません。 その他の ARMv7 アーキ テ ク チ ャ はすべて、 VFPv3 アーキ テ ク チ ャ をサポー ト し てい ます。 VFPv3 には、 VFPv3 レ ジ ス タ と 浮動小数点デー タ 型を必ず し も すべてサポー ト し てい る わけではないバ リ ア ン ト がい く つかあ り ます。 実装済みの VFP アーキ テ ク チ ャ と バ リ ア ン ト の詳細については、 該当す る 製品のマニ ュ アル を必ず参照 し て下 さ い。 NEON 命令 と VFP 命令は、 半精度命令 も 含めて、 必要な アーキ テ ク チ ャ 拡張 をサポー ト し ていないシ ス テ ム上では 「未定義命令」 と し て扱われ ます。 NEON 命令 と VFP 命令をサポー ト し てい る シ ス テ ム上で も 、 必要な コ プ ロ セ ッ サが コ プ ロ セ ッ サア ク セ ス コ ン ト ロ ールレ ジ ス タ (CP15 CPACR) で有効 に さ れていない場合には、 こ れ ら の命令は、 未定義 と な り ます。 詳細につい ては、 お使いのプ ロ セ ッ サのテ ク ニ カル リ フ ァ レ ン ス マニ ュ アルを参照 し て 下 さ い。 5.2.1 半精度拡張 半精度拡張はオプシ ョ ンのアーキ テ ク チ ャ であ り 、 VFPv3 と NEON の両アー キ テ ク チ ャ を拡張 し ます。 単精度 (32 ビ ッ ト ) 浮動小数点数 と 半精度 (16 ビ ッ ト ) 浮動小数点数 と の間で変換を行 う VFP 命令 と NEON 命令を使用で き ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-9 NEON と VFP プ ログ ラ ミ ング 5.3 拡張レ ジ ス タ バン ク NEON と VFP は同 じ 拡張レ ジ ス タ バン ク を使用 し ます。 こ の点が、 ARM レ ジ ス タ バン ク と は対照的です。 VFP コ プ ロ セ ッ サには 32 本の単精度レ ジ ス タ があ り 、 各レ ジ ス タ は単精度浮 動小数点値ま たは 32 ビ ッ ト 整数のいずれか を保持で き ます。 こ れ ら 32 本の レ ジ ス タ は、 16 本の倍精度レ ジ ス タ と し て も 使用 さ れます。 た だ し 、 VFPv3 バ リ ア ン ト の中には、 さ ら に 16 本の倍精度レ ジ ス タ を VFP レ ジ ス タ セ ッ ト に追加す る も の も あ り ます。 こ れ ら の レ ジ ス タ は、 いずれの単 精度 VFP レ ジ ス タ と も 重複 し ません。 以下のセ ク シ ョ ン で説明す る よ う に、 拡張レ ジ ス タ バン ク は、 明示的にエ イ リ ア ス さ れた 3 つの ビ ュ ーを使用 し て参照で き ます。 図 5-1 (ページ 5-12) は、 拡張レ ジ ス タ バン ク の 3 つの ビ ュ ーであ る ワー ド 、 ダブル ワー ド 、 お よ び ク ワ ッ ド ワ ー ド の各レ ジ ス タ を示 し 、 それ ら が重複す る 様子を示 し てい ます。 注 使用す る プ ロ セ ッ サに NEON と VFP の両方があ る 場合、すべての NEON レ ジ ス タ が VFP レ ジ ス タ と 重複 し ます。 以下の よ う に使用で き ます。 • 一部の レ ジ ス タ を単精度値用に使用 し なが ら 、 同時に他の レ ジ ス タ を倍 精度値用お よ び、 NEON ベ ク タ 用に使用す る 。 • 別々の タ イ ミ ン グで、 単精度値 と 倍精度値に同 じ レ ジ ス タ を使用す る 。 対応す る 単精度レ ジ ス タ と 倍精度レ ジ ス タ を同時に使用 し ないで下 さ い。 レ ジ ス タ が破損す る こ と はあ り ませんが、 有意な結果が得 ら れな く な り ます。 5.3.1 レ ジ ス タ バン ク の NEON ビ ュ ー NEON で表示 さ れ る 拡張レ ジ ス タ バン ク は以下の と お り です。 5-10 • 16 本の 128 ビ ッ ト ク ワ ッ ド ワ ー ド レ ジ ス タ 、 Q0-Q15。 • 32 本の 64 ビ ッ ト ダブル ワ ー ド レ ジ ス タ 、 D0-D31。 • 上記の ビ ュ ーの レ ジ ス タ を組み合わせた も の。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング NEON ビ ュ ーには、 それぞれの レ ジ ス タ にサ イ ズ と タ イ プがすべて同 じ 1、 2、 4、 8、 ま たは 16 要素の ベ ク タ が含まれてい ます。 各要素は ス カ ラ と し て も ア ク セ ス で き ます。 5.3.2 拡張レ ジ ス タ バン ク の VFP ビ ュ ー VFPv3 と VFPv3_fp16 におけ る 拡張レ ジ ス タ バン ク のビ ュ ーは以下の と お り で す。 • 32 本の 64 ビ ッ ト ダブル ワ ー ド レ ジ ス タ 、 D0-D31。 • 32 本の 32 ビ ッ ト シ ン グル ワー ド レ ジ ス タ 、 S0-S31。 こ の ビ ュ ーでは レ ジ ス タ バン ク の半分のみにア ク セ ス で き ます。 • 上記の ビ ュ ーの レ ジ ス タ を組み合わせた も の。 VFPv2、 VFPv3-D16、 お よ び VFPv3-D16_fp16 におけ る 拡張レ ジ ス タ バン ク の ビ ュ ーは以下の と お り です。 ARM DUI 0204IJ • 16 本の 64 ビ ッ ト ダブル ワ ー ド レ ジ ス タ 、 D0-D15。 • 32 本の 32 ビ ッ ト シ ン グル ワー ド レ ジ ス タ 、 S0-S31。 • 上記の ビ ュ ーの レ ジ ス タ を組み合わせた も の。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-11 NEON と VFP プ ログ ラ ミ ング S0 D0 S1 Q0 S2 D1 S3 S4 D2 S5 Q1 S6 D3 S7 ... ... ... S28 D14 S29 Q7 S30 D15 S31 D16 Q8 D17 ... ... D30 Q15 D31 図 5-1 拡張レ ジ ス タ バン ク レ ジ ス タ 間のマ ッ ピ ン グは以下の と お り です。 • S<2n> は D<n> の最下位ハーフ にマ ッ プ さ れ ます。 • S<2n+1> は D<n> の最上位ハーフ にマ ッ プ さ れ ます。 • D<2n> は Q<n> の最下位ハーフ にマ ッ プ さ れ ます。 • D<2n+1> は Q<n> の最上位ハーフ にマ ッ プ さ れ ます。 例えば、 Q6 のベ ク タ の要素の最下位ハーフ にア ク セ スす る には D12 を参照 し 、 要素の最上位ハーフ にア ク セ スす る には D13 を参照 し ます。 5-12 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.4 条件コ ー ド ARM 状態では、 条件 コ ー ド を使用 し て VFP 命令の実行を制御で き ます。 こ の 命令は、 他のほぼすべての ARM 命令 と 全 く 同 じ 方法で、 APSR 内の ス テー タ ス フ ラ グの値に基づいて条件実行 さ れます。 ARM 状態では、 VFP と NEON の両方に共通の命令を除 き 、 条件 コ ー ド を使 用 し て NEON 命令の実行を制御す る こ と はで き ません。 Thumb-2 プ ロ セ ッ サの Thumb® 状態では、 IT 命令を使用 し て次の NEON ま た は VFP 命令の最大 4 つま で条件 コ ー ド を設定で き ます。 詳細については、 「IT」 (ページ 4-127) を参照 し て下 さ い。 ス テー タ ス フ ラ グ を更新す る と き に使用で き る VFP 命令は VCMP のみです。 APSR の フ ラ グ を直接更新す る のではな く 、 FPSCR の別の フ ラ グセ ッ ト を更 新 し ます (「FPSCR : 浮動小数点ス テー タ ス / 制御レ ジ ス タ 」 (ページ 5-104) を参照)。 注 こ れ ら の フ ラ グ を使用 し て、 条件付 き VFP 命令な ど の条件命令を制御す る に は、 まず VMRS 命令を使用 し て APSR に こ れ ら の フ ラ グ を コ ピーす る 必要があ り ます (「VMRS お よ び VMSR」 (ページ 5-32) を参照)。 VCMP 命令実行後の フ ラ グは、 ARM デー タ 処理命令実行後の フ ラ グ と 意味が厳 密には異な り ます。 その理由は以下の と お り です。 • 浮動小数点値が符号な し にな る こ と はないので、 符号な し 条件は不要で す。 • Not-a-Number (NaN) 値には数値間ま たは相互の順位関係がないので、 不規則な順位の結果を説明す る ための条件を追加す る 必要があ り ます。 条件 コ ー ド ニーモニ ッ ク の意味については、 表 5-4 (ページ 5-14) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-13 NEON と VFP プ ログ ラ ミ ング 表 5-4 条件コ ー ド ニーモニ ッ ク ARM デー タ 処理命令後の意味 VFP VCMP 命令後の意味 EQ 等しい 等しい NE 等 し く ない 等 し く ない、 ま たは順番がない CS or HS キ ャ リ ー設定ま たは大 き いか等 し い (符号な し ) 大 き いか等 し い、 ま たは順番がない CC or LO キ ャ リ ー ク リ ア ま たは小 さ い (符号な し ) 小さい MI 否定 小さい PL 正ま たは 0 大 き いか等 し い、 ま たは順番がない VS オーバーフ ロ ー 順番がない (NaN オペ ラ ン ド が含まれ てい る ) VC オーバーフ ロ ーな し 順番があ る HI 大 き い (符号な し ) 大 き い、 ま たは順番がない LS 小 さ いか等 し い (符号な し ) 小 さ いか等 し い GE 大 き いか等 し い (符号付 き ) 大 き いか等 し い LT 小 さ い (符号付 き ) 小 さ い、 ま たは順番がない GT 大 き い (符号付 き ) 大きい LE 小 さ いか等 し い (符号付 き ) 小 さ いか等 し い、 ま たは順番がない AL 常時 (通常省略) 常時 (通常省略) 注 APSR の フ ラ グ を最後に更新 し た命令の タ イ プに よ っ て条件 コ ー ド の意味が 決ま り ます。 5-14 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.5 一般的な情報 こ のセ ク シ ョ ン では、 説明が重複す る の を避け る ため、 多 く の命令に共通す る 情報を示 し ます。 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れて い ます。 • 「浮動小数点の例外」 • 「NEON デー タ 型お よ び VFP デー タ 型」 (ページ 5-16) • 「NEON の Normal、 Long、 Wide、 Narrow、 お よ びサチ ュ レー ト 命令」 (ページ 5-17) • • • • 5.5.1 「NEON ス カ ラ 」 (ページ 5-20) 「拡張表記」 (ページ 5-20) 「{0,1} を超え る 多項式算術演算」 (ページ 5-22) 「VFP コ プ ロ セ ッ サ」 (ページ 5-23) 浮動小数点の例外 浮動小数点の例外が発生す る 命令の説明には、 例外 と い う サブセ ク シ ョ ン が あ り ます。 命令の説明に 「浮動小数点例外」 サブセ ク シ ョ ンがない場合は、 その命令に よ っ て浮動小数点例外が発生す る こ と はあ り ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-15 NEON と VFP プ ログ ラ ミ ング 5.5.2 NEON デー タ 型および VFP デー タ 型 NEON 命令 と VFP 命令のデー タ 型指定子は、 デー タ 型を示す文字の後に、 一 般に幅を示す数値が続 き ます。 指定子 と 命令ニーモニ ッ ク はポ イ ン ト で区切 ら れます。 表 5-5 は NEON 命令で使用で き る デー タ 型を示 し てい ます。 表 5-6 は VFP 命令で使用で き る デー タ 型を示 し てい ます。 表 5-5 NEON デー タ 型 8 ビッ ト 16 ビ ッ ト 32 ビ ッ ト 64 ビ ッ ト 符号な し 整数 U8 U16 U32 U64 符号付 き 整数 S8 S16 S32 S64 型が指定 さ れていない整 数 I8 I16 I32 I64 浮動小数点数 使用不可 F16 F32 (ま た 使用不可 は F) {0,1} を超え る 多項式 P8 P16 使用不可 使用不可 表 5-6 VFP デー タ 型 16 ビ ッ ト 32 ビ ッ ト 64 ビ ッ ト 符号な し 整数 U16 U32 使用不可 符号付 き 整数 S16 S32 使用不可 浮動小数点数 F16 F32 (ま た F64 (ま た は F) は D) {0,1} を超え る 多項式演算に関す る 詳細については、 「{0,1} を超え る 多項式算 術演算」 (ページ 5-22) を参照 し て下 さ い。 2 番目 (ま たは唯一) のオペ ラ ン ド のデー タ 型は命令で指定 さ れます。 注 • 5-16 ほ と ん ど の命令では使用可能なデー タ 型の範囲が制限 さ れてい ます。 詳 細については、 命令のページ を参照 し て下 さ い。 ただ し 、 デー タ 型につ いては以下の よ う に柔軟に記述 し て あ り ます。 — 記述で I が指定 さ れてい る 場合、デー タ 型 と し て S ま たは U も 使用 で き ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング • — デー タ サ イ ズだけが指定 さ れてい る 場合には、 型 (I、 S、 U、 P、 ま たは F) を指定で き ます。 — デー タ 型が指定 さ れていない場合、 デー タ 型を指定で き ます。 F16 デー タ 型を使用で き る のは、 半精度アーキ テ ク チ ャ 拡張を実装 し た シ ス テ ムだけです。 5.5.3 NEON の Normal、 Long、 Wide、 Narrow、 お よびサチ ュ レ ー ト 命令 多 く の NEON デー タ 処理命令は、 Normal、 Long、 Wide、 Narrow、 お よ びサ チ ュ レー ト バ リ ア ン ト で使用で き ます。 NEON 命令を実行で き る 対象は以下の と お り です。 • ダブル ワー ド ベ ク タ の構成要素 — 8 つの 8 ビ ッ ト 要素 — • 4 つの 16 ビ ッ ト 要素 — 2 つの 32 ビ ッ ト 要素 — 1 つの 64 ビ ッ ト 要素 ク ワ ッ ド ワ ー ド ベ ク タ の構成要素 — 16 の 8 ビ ッ ト 要素 — 8 つの 16 ビ ッ ト 要素 — 4 つの 32 ビ ッ ト 要素 — 2 つの 64 ビ ッ ト 要素 Normal 命令 Normal 命令は こ れ ら のベ ク タ 型に対 し て演算を実行 し 、 オペ ラ ン ド ベ ク タ と 同 じ サ イ ズで、 通常は型 も 同 じ 結果ベ ク タ を生成 し ます。 命令ニーモニ ッ ク に Q を追加す る こ と に よ り 、 オペ ラ ン ド 、 お よ び Normal 命 令の結果をすべて ク ワ ッ ド ワー ド にす る よ う に指定で き ます。 こ れに よ り 、 オペ ラ ン ド ま たは結果が ク ワ ッ ド ワー ド でない場合は、 アセ ン ブ ラ でエ ラ ー が生成 さ れ ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-17 NEON と VFP プ ログ ラ ミ ング Long 命令 Long 命令は、 ダブル ワー ド ベ ク タ オペ ラ ン ド に対 し て演算を実行 し 、 ク ワ ッ ド ワー ド ベ ク タ 結果を生成 し ます。 結果の要素の幅は、 通常、 オペ ラ ン ド の 要素の幅の 2 倍にな り 、 型は同 じ です。 Long 命令は、 命令ニーモニ ッ ク に L を追加 し て指定 し ます。 Wide 命令 Wide 命令は、 それぞれ 1 つのダブル ワ ー ド ベ ク タ オペ ラ ン ド と ク ワ ッ ド ワー ド ベ ク タ オペ ラ ン ド に対 し て演算を実行 し ます。 ク ワ ッ ド ワー ド ベ ク タ 結果 が生成 さ れます。 結果の要素 と 第 1 オペ ラ ン ド の幅は第 2 オペ ラ ン ド の要素の 幅の 2 倍です。 Wide 命令は、 命令ニーモニ ッ ク に W を追加 し て指定 し ます。 Narrow 命令 Narrow 命令は、 ク ワ ッ ド ワー ド ベ ク タ オペ ラ ン ド に対 し て演算を実行 し 、 ダ ブル ワ ー ド ベ ク タ 結果を生成 し ます。 結果の要素の幅は、 通常、 オペ ラ ン ド の要素の幅の半分です。 Narrow 命令は、 命令ニーモニ ッ ク に N を追加 し て指定 し ます。 5-18 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング サチ ュ レー ト 命令 サチ ュ レー ト 命令の機能の概要については、 「サチ ュ レー ト 命令」 (ページ 4-100) を参照 し て下 さ い。 NEON サチ ュ レー ト 命令がサチ ュ レー ト す る 範囲 については、 表 5-7 を参照 し て下 さ い。 サチ ュ レー ト 命令は、 Q と 命令ニーモニ ッ ク の間に接頭文字 V を使用 し て指定 し ます。 表 5-7 NEON サチ ュ レーシ ョ ンの範囲 ARM DUI 0204IJ デー タ 型 x のサチ ュ レーシ ョ ン 範囲 S8 –27 <= x < 27 S16 –215 <= x < 215 S32 –231 <= x < 231 S64 –263 <= x < 263 U8 0 <= x < 28 U16 0 <= x < 216 U32 0 <= x < 232 U64 0 <= x < 264 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-19 NEON と VFP プ ログ ラ ミ ング 5.5.4 NEON ス カ ラ 一部の NEON 命令はベ ク タ と 組み合わせて ス カ ラ に対 し て実行 さ れ ます。 NEON ス カ ラ は 8 ビ ッ ト 、 16 ビ ッ ト 、 32 ビ ッ ト 、 ま たは 64 ビ ッ ト です。 乗算 命令 と は違っ て、 ス カ ラ にア ク セ スす る 命令は レ ジ ス タ バン ク 内の要素にア ク セ ス で き ます。 命令構文はダブル ワー ド ベ ク タ に イ ンデ ク ス を使用 し て ス カ ラ を参照す る ので、 Dm[x] は Dm の x 番目の要素にな り ます。 乗算命令では 16 ビ ッ ト ま たは 32 ビ ッ ト ス カ ラ のみを使用で き 、 レ ジ ス タ バ ン ク でア ク セ ス で き る のは最初の 32 ビ ッ ト ス カ ラ だけです。 つま り 、 乗算命 令では以下の よ う にな り ます。 5.5.5 • 16 ビ ッ ト ス カ ラ は レ ジ ス タ D0 ~ D7 に制限 さ れ ます (x の範囲は 0 ~ 3)。 • 32 ビ ッ ト ス カ ラ は レ ジ ス タ D0 ~ D15 に制限 さ れます(x は 0 ま たは 1)。 拡張表記 アセ ン ブ ラ は、 アーキ テ ク チ ャ 上の NEON / VFP アセ ン ブ リ 構文に 拡張表記 と い う 拡張を実装 し ます。 こ の拡張に よ り 、 レ ジ ス タ 名にデー タ 型情報ま た は ス カ ラ イ ンデ ク ス を含め る こ と がで き る よ う にな り ます。 こ れを行 う と 、 すべての命令にデー タ 型情報やス カ ラ イ ンデ ク ス を含め る 必要がな く な り ま す。 レ ジ ス タ 名は以下のいずれかにな り ます。 型な し レ ジ ス タ 名では レ ジ ス タ は指定 さ れ ますが、 それに含ま れ る デー タ 型、 レ ジ ス タ 内の特定の ス カ ラ の イ ンデ ク ス は指定 さ れ ません。 型な し 、 ス カ ラ イ ンデ ク ス付 き レ ジ ス タ 名では レ ジ ス タ は指定 さ れ ますが、 それに含ま れ る デー タ 型は指定 さ れません。 さ ら に、 レ ジ ス タ 内の特定の ス カ ラ の イ ンデ ク ス が指定 さ れ ます。 型付 き レ ジ ス タ 名では レ ジ ス タ 、 お よ びそれに含まれ る デー タ 型は指 定 さ れ ますが、 レ ジ ス タ 内の特定の ス カ ラ の イ ンデ ク ス は指定 さ れ ません。 型付 き 、 ス カ ラ イ ンデ ク ス付 き レ ジ ス タ 名では レ ジ ス タ 、 お よ びそれに含まれ る デー タ 型は指 定 さ れ ますが、 レ ジ ス タ 内の特定の ス カ ラ の イ ンデ ク ス は指定 さ れ ません。 5-20 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 型付 き レ ジ ス タ お よ びス カ ラ レ ジ ス タ を作成す る には、 SN デ ィ レ ク テ ィ ブ、 DN デ ィ レ ク テ ィ ブ、 お よ び QN デ ィ レ ク テ ィ ブ を使用す る 必要があ り ます。 詳 細については、 「QN、 DN、 お よ び SN」 (ページ 7-16) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-21 NEON と VFP プ ログ ラ ミ ング 5.5.6 {0,1} を超え る多項式算術演算 係数 0 と 1 は以下のブール算術演算規則を使用 し て操作 し ます。 • 0+0=1+1=0 • 0+1=1+0=1 • 0*0=0*1=1*0=0 • 1*1=1 つま り 、 {0,1} を超え る 2 つの多項式を加算す る と ビ ッ ト 単位排他的論理和 (XOR) と 同 じ にな り 、 {0,1} を超え る 2 つの多項式を乗算す る と 、 整数の乗 算 と 同 じ にな り ます。 ただ し 一部の積は加算ではな く 排他的論理和の結果で す。 5-22 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.5.7 VFP コ プ ロ セ ッ サ VFP コ プ ロ セ ッ サ と 、 そのサポー ト コ ー ド を使用す る こ と に よ り 、 ANSI/IEEE 規格 754-1985 「IEEE Standard for Binary Floating-Point Arithmetic (二進浮動小 数点演算に関す る IEEE 規格)」 で定義 さ れてい る よ う に、 単精度お よ び倍精 度の浮動小数点演算を実行で き ます。 本章では、 こ れを 「IEEE 754 標準」 と 呼びます。 詳細については、 『 ラ イ ブ ラ リ ガ イ ド 』 の第 4 章 浮動小数点サポー ト を参照 し て下 さ い。 最大 8 個の単精度数値ま たは最大 4 個の倍精度数値か ら な る シ ョ ー ト ベ ク タ を使用で き ますが、 こ れは廃止 さ れてい ます。 詳細については、 「VFP ベ ク タ モー ド 」 (ページ 5-123) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-23 NEON と VFP プ ログ ラ ミ ング 5.6 NEON と VFP に共通の命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ンか ら 構成 さ れてい ます。 • 「VLDR お よ び VSTR」 (ページ 5-25) 拡張レ ジ ス タ ロ ー ド と ス ト ア。 • 「VLDM、 VSTM、 VPOP、 VPUSH」 (ページ 5-27) 拡張レ ジ ス タ 多重 ロ ー ド と ス ト ア。 • 「VMOV (2 本の ARM レ ジ ス タ と 拡張レ ジ ス タ 間)」 (ページ 5-29) 2 本の ARM レ ジ ス タ と 64 ビ ッ ト 拡張レ ジ ス タ と の間で内容を転送 し ま す。 • 「VMOV (ARM レ ジ ス タ と NEON ス カ ラ の間)」 (ページ 5-30) ARM レ ジ ス タ と 半分の 64 ビ ッ ト 拡張レ ジ ス タ と の間で内容を転送 し ま す。 • 「VMOV (1 本の ARM レ ジ ス タ と 単精度 VFP の間)」 (ページ 5-31) 32 ビ ッ ト 拡張レ ジ ス タ と ARM レ ジ ス タ と の間で内容を転送 し ます。 • 「VMRS お よ び VMSR」 (ページ 5-32) ARM レ ジ ス タ と NEON/VFP シ ス テ ム レ ジ ス タ と の間で内容を転送 し ま す。 5-24 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.6.1 VLDR および VSTR 拡張レ ジ ス タ ロ ー ド と ス ト ア。 構文 VLDR{cond}{.size} Fd, [Rn{, #offset}] VSTR{cond}{.size} Fd, [Rn{, #offset}] VLDR{cond}{.size} Fd, label VSTR{cond}{.size} Fd, label 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 size 任意に指定で き る デー タ サ イ ズ指定子です。 Fd が単精度 VFP レ ジ ス タ の場合は 32、 それ以外の場合は 64 に し ます。 Fd ロ ー ド ま たは保存す る 拡張レ ジ ス タ を指定 し ます。 NEON 命令の 場合は、 D レ ジ ス タ であ る 必要があ り ます。 VFP 命令の場合は、 D ま たは S レ ジ ス タ を指定で き ます。 Rn 転送用のベース ア ド レ ス を保持す る ARM レ ジ ス タ を指定 し ま す。 offset 任意の数値式を指定 し ます。 アセ ン ブ リ 時に数値定数が求め ら れ る 必要があ り ます。 値は 4 の倍数で、範囲は –1020 ~ +1020 です。 値はベース ア ド レ ス に加算 さ れ、 転送に使用す る ア ド レ ス を形 成 し ます。 label プ ロ グ ラ ム相対式を指定 し ます。 詳細については、 「レ ジ ス タ 相 対式 と プ ロ グ ラ ム相対式」 (ページ 3-39) を参照 し て下 さ い。 label は現在の命令か ら 1KB 以内に配置す る 必要があ り ます。 使用法 VLDR 命令は、 メ モ リ か ら 拡張レ ジ ス タ を ロ ー ド し ます。 VSTR 命令は、 拡張レ ジ ス タ の内容を メ モ リ に保存 し ます。 Fd が単精度レ ジ ス タ の場合は、 1 ワー ド が転送 さ れ ます (VFP のみ)。 それ以 外の場合は 2 ワー ド が転送 さ れ ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-25 NEON と VFP プ ログ ラ ミ ング VLDR 疑似命令 も あ り ます (「VLDR 疑似命令」 (ページ 5-96) を参照)。 5-26 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.6.2 VLDM、 VSTM、 VPOP、 VPUSH 拡張レ ジ ス タ 多重 ロ ー ド 、 多重ス ト ア、 ス タ ッ ク か ら のポ ッ プ、 ス タ ッ ク へ のプ ッ シ ュ 。 構文 VLDMmode{cond} Rn{!}, Registers VSTMmode{cond} Rn{!}, Registers VPOP{cond} Registers VPUSH{cond} Registers 各項目には以下の意味があ り ます。 以下のいずれか を指定 し ます。 mode IA 各転送後にア ド レ ス を イ ン ク リ メ ン ト し ます。 IA がデ フ ォ ル ト で、 省略で き ます。 DB 各転送前にア ド レ ス をデ ク リ メ ン ト し ます。 EA 空上昇ス タ ッ ク 演算を意味 し ます。 ロ ー ド の場合には DB、 保存の場合には IA と 同 じ です。 FD フル下降ス タ ッ ク 演算を意味 し ます。 ロ ー ド の場合に は IA、 保存の場合には DB と 同 じ です。 同等のア ド レ ッ シ ン グモー ド 接尾文字については、 表 2-9 (ペー ジ 2-46) を参照 し て下 さ い。 ARM DUI 0204IJ cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 Rn 転送用のベース ア ド レ ス を保持す る ARM レ ジ ス タ を指定 し ま す。 ! こ れはオプシ ョ ン です。 ! は、 更新 さ れたベース ア ド レ ス を Rn に ラ イ ト バ ッ ク す る 必要があ る こ と を示 し ます。 ! が指定 さ れてい ない場合、 mode は IA にな り ます。 Registers 連続す る 拡張レ ジ ス タ の リ ス ト を中括弧 { お よ び } で囲んで指定 し ます。 リ ス ト はカ ン マで区切っ て指定す る こ と も 、 範囲を指定 す る こ と も で き ます。 リ ス ト には少な く と も 1 本の レ ジ ス タ を指 定す る 必要があ り ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-27 NEON と VFP プ ログ ラ ミ ング S、 D、 ま たは Q レ ジ ス タ を指定で き ますが、 混在 さ せないで下 さ い。 レ ジ ス タ の数は D レ ジ ス タ は 16 本、 Q レ ジ ス タ は 8 本を超え ない よ う に し て下 さ い。 Q レ ジ ス タ が指定 さ れてい る 場合は、 逆 アセ ン ブ リ で D レ ジ ス タ と し て表示 さ れ ます。 注 VPOP Registers は、 VLDM sp!, Registers と 同 じ 意味です。 VPUSH Registers は、 VSTMDB sp!, Registers と 同 じ 意味です。 ど ち ら の形式 も 使用で き ます。 VPOP お よ び VPUSH に逆アセ ン ブル さ れます。 5-28 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.6.3 VMOV (2 本の ARM レ ジ ス タ と 拡張レ ジ ス タ 間) 2 本の ARM レ ジ ス タ と 64 ビ ッ ト 拡張レ ジ ス タ 間、 ま たは 2 本の連続す る 32 ビ ッ ト VFP レ ジ ス タ 間で内容を転送 し ます。 構文 VMOV{cond} Dm, Rd, Rn VMOV{cond} Rd, Rn, Dm VMOV{cond} Sm, Sm1, Rd, Rn VMOV{cond} Rd, Rn, Sm, Sm1 各項目には以下の意味があ り ます。 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 Dm 64 ビ ッ ト 拡張レ ジ ス タ を指定 し ます。 cond Sm VFP 32 ビ ッ ト レ ジ ス タ を指定 し ます。 Sm1 Sm の後続の VFP 32 ビ ッ ト レ ジ ス タ を指定 し ます。 Rd, Rn ARM レ ジ ス タ です。 r15 は使用 し ないで下 さ い。 使用法 VMOV Dm, Rd, Rn は Rd の内容を Dm の下位半分に転送 し 、Rn の内容を Dm の上位半 分に転送 し ます。 VMOV Rd, Rn, Dm は Dm の下位半分の内容を Rd に転送 し 、 Dm の上位半分の内容を Rn に転送 し ます。 VMOV Rd, Rn, Sm, Sm1 は、 Sm の内容を Rd に、 Sm1 の内容を Rn に転送 し ます。 VMOV Sm, Sm1, Rd, Rn は、 Rd の内容を Sm に、 Rn の内容を Sm1 に転送 し ます。 アーキテ ク チ ャ 64 ビ ッ ト 命令は以下の も ので使用で き ます。 • NEON • VFPv2 以上。 2 x 32 ビ ッ ト 命令は、 VFPv2 お よ び上記で使用で き ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-29 NEON と VFP プ ログ ラ ミ ング 5.6.4 VMOV (ARM レ ジ ス タ と NEON ス カ ラ の間) ARM レ ジ ス タ と NEON ス カ ラ 間で内容を転送 し ます。 構文 VMOV{cond}{.size} Dn[x], Rd VMOV{cond}{.datatype} Rd, Dn[x] 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 size デー タ サ イ ズ。 8、 16、 ま たは 32 を指定で き ます。 省略 し た場合、 size は 32 にな り ます。 VFP 命令の場合は、size は 32 であ る か省略 す る 必要があ り ます。 datatype デー タ 型。 U8、 S8、 U16、 S16、 ま たは 32 を指定で き ます。 省略 し た 場合、 datatype は 32 にな り ます。 VFP 命令の場合は、 datatype は 32 であ る か省略す る 必要があ り ます。 Dn[x] NEON ス カ ラ を指定 し ます (「NEON ス カ ラ 」 (ページ 5-20) を 参照)。 Rd ARM レ ジ ス タ を指定 し ます。 Rd に r15 は指定で き ません。 使用法 VMOV Rd, Dn[x] は Dn[x] の内容を Rd の最下位バ イ ト 、 ハーフ ワ ー ド 、 ま たは ワー ド に転送 し ます。 Rd の残 り の ビ ッ ト は、 ゼ ロ 拡張か符号拡張のいずれか です。 VMOV Dn[x], Rd は Rd の最下位バ イ ト 、 ハーフ ワー ド 、 ま たは ワー ド を Sn に転送 し ます。 5-30 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.6.5 VMOV (1 本の ARM レ ジ ス タ と 単精度 VFP の間) 単精度浮動小数点レ ジ ス タ と ARM レ ジ ス タ 間で内容を転送 し ます。 構文 VMOV{cond} Rd, Sn VMOV{cond} Sn, Rd 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 Sn VFP 単精度レ ジ ス タ を指定 し ます。 ARM レ ジ ス タ を指定 し ます。 Rd に r15 は指定で き ません。 Rd 使用法 VMOV Rd, Sn は Sn の内容を Rd に転送 し ます。 VMOV Sn, Rd は Rd の内容を Sn に転送 し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-31 NEON と VFP プ ログ ラ ミ ング 5.6.6 VMRS お よび VMSR ARM レ ジ ス タ と NEON/VFP シ ス テ ム レ ジ ス タ と の間で内容を転送 し ます。 構文 VMRS{cond} Rd, extsysreg VMSR{cond} extsysreg, Rd 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 extsysreg NEON / VFP シ ス テ ム レ ジ ス タ を指定 し ます。 通常 FPSCR、 FPSID、 ま たは FPEXC です (「NEON / VFP シ ス テ ム レ ジ ス タ 」 (ページ 5-104) を参照)。 Rd ARM レ ジ ス タ を指定 し ます。 Rd に r15 は指定で き ません。 extsysreg が FPSCR であ る 場合は、 APSR_nzcv を指定で き ます。 こ の 場合、 浮動小数点ス テー タ ス フ ラ グが ARM APSR の対応す る フ ラ グに転送 さ れ ます。 使用法 VMRS 命令は extsysreg の内容を Rd に転送 し ます。 VMSR 命令は Rd の内容を extsysreg に転送 し ます。 注 こ れ ら の命令は、 現在の NEON 演算ま たは VFP 演算がすべて完了す る ま で ARM を停止 さ せます。 サン プル VMRS VMRS VMSR 5-32 r2,FPCID APSR_nzcv, FPSCR FPSCR, r4 ; transfer FP status register to ARM APSR Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.7 NEON 論理演算 と 比較演算 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「VAND、 VBIC、 VEOR、 VORN、 お よ び VORR (レ ジ ス タ )」 (ページ 5-34) ビ ッ ト 単位論理積、 ビ ッ ト ク リ ア、 排他的論理和 (XOR)、 否定論理和、 お よ び論理和 (レ ジ ス タ ) • 「VBIC お よ び VORR ( イ ミ デ ィ エー ト )」 (ページ 5-35) ビ ッ ト 単位ビ ッ ト ク リ ア と 論理和 ( イ ミ デ ィ エー ト ) • 「VBIF、 VBIT、 VBSL」 (ページ 5-37) False の場合はビ ッ ト 単位挿入、 True の場合はビ ッ ト 単位を挿入、 お よ び選択 • 「VMOV、 VMVN (レ ジ ス タ )」 (ページ 5-38) デー タ 代入命令、 お よ びデー タ の各ビ ッ ト を反転 さ せてか ら 代入す る 命 令 • 「VACGE お よ び VACGT」 (ページ 5-39) 絶対値の比較 • 「VCEQ、 VCGE、 VCGT、 VCLE、 お よ び VCLT」 (ページ 5-40) 比較 • 「VTST」 (ページ 5-42) テス ト ビ ッ ト ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-33 NEON と VFP プ ログ ラ ミ ング 5.7.1 VAND、 VBIC、 VEOR、 VORN、 および VORR (レ ジ ス タ ) VAND (ビ ッ ト 単位論理積)、 VBIC (ビ ッ ト ク リ ア)、 VEOR (ビ ッ ト 単位排他的論 理和)、 VORN (ビ ッ ト 単位否定論理和)、 お よ び VORR (ビ ッ ト 単位論理和) の 各命令は、 2 本の レ ジ ス タ 間で ビ ッ ト 単位論理演算を実行 し て、 デス テ ィ ネーシ ョ ン レ ジ ス タ に結果を返 し ます。 構文 Vop{cond}.{datatype} {Qd}, Qn, Qm Vop{cond}.{datatype} {Dd}, Dn, Dm 各引数には以下の意味があ り ます。 以下のいずれか を指定 し ます。 AND 論理積 ORR 論理和 EOR 排他的論理和 (XOR) op BIC ORN 論理積補数 論理和補数 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype 任意に指定で き る デー タ 型です。 アセ ンブ ラ は datatype を無視 し ます。 Qd, Qn, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ 、 第 1 オペ ラ ン ド レ ジ ス タ 、 第 2 オペ ラ ン ド レ ジ ス タ を指定 し ま す。 Dd, Dn, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ 、 第 1 オペ ラ ン ド レ ジ ス タ 、 第 2 オペ ラ ン ド レ ジ ス タ を指定 し ます。 注 両方のオペ ラ ン ド に同 じ レ ジ ス タ を使用す る VORR は VMOV 命令です。 VORR は こ の よ う に使用で き ますが、 結果 と し て生 じ た コ ー ド を逆アセ ン ブルす る と 、 VMOV 構文が生成 さ れます。 詳細については、 「VMOV、 VMVN (レ ジ ス タ )」 (ページ 5-38) を参照 し て下 さ い。 5-34 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.7.2 VBIC お よび VORR (イ ミ デ ィ エー ト ) VBIC (ビ ッ ト ク リ ア イ ミ デ ィ エー ト ) はデス テ ィ ネーシ ョ ンベ ク タ の各要素 を取得 し 、 即値を使用 し て ビ ッ ト 単位論理積補数を求め、 デス テ ィ ネーシ ョ ンベ ク タ に結果を返 し ます。 VORR (ビ ッ ト 単位論理和 イ ミ デ ィ エー ト ) は、 デス テ ィ ネーシ ョ ンベ ク タ の 各要素を取得 し 、 即値を使用 し て ビ ッ ト 単位論理和を実行 し 、 デス テ ィ ネー シ ョ ンベ ク タ に結果を返 し ます。 疑似命令 「VAND お よ び VORN ( イ ミ デ ィ エー ト )」 (ページ 5-100) も 参照 し て下 さ い。 構文 Vop{cond}.datatype Qd, #imm Vop{cond}.datatype Dd, #imm 各引数には以下の意味があ り ます。 op BIC ま たは ORR を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype I8、 I16、 I32、 ま たは I64 のいずれか を指定 し ます。 Qd ??? Dd ソ ース と 結果の NEON レ ジ ス タ を指定 し ます。 imm イ ミ デ ィ エー ト 定数です。 イ ミ デ ィ エー ト 定数 imm をデス テ ィ ネーシ ョ ン レ ジ ス タ を満たすためにアセ ン ブ ラ が繰 り 返すパ タ ーン と し て指定で き る か、 ま たは (パ タ ーン に準拠す る ) 即値を省略せず に直接指定で き る かのいずれかです。 imm のパ タ ーンは、 datatype で決ま り ま す (表 5-8 を参照)。 表 5-8 即値のパ タ ーン ARM DUI 0204IJ I16 I32 0x00XY 0x000000XY Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-35 NEON と VFP プ ログ ラ ミ ング 表 5-8 即値のパ タ ーン (続き) I16 I32 0xXY00 0x0000XY00 0x00XY0000 0xXY000000 I8 デー タ 型ま たは I64 デー タ 型を使用す る 場合、 アセ ン ブ ラ は I16 命令か I32 命令のいずれかに変換 し て、 imm のパ タ ーンに一致 さ せます。 即値が表 5-8 (ページ 5-35) に示 し たパ タ ーン のいずれに も 一致 し ない場合、 アセ ンブ ラ は エ ラ ーを生成 し ます。 5-36 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.7.3 VBIF、 VBIT、 VBSL VBIT (True の場合はビ ッ ト 単位を挿入) は、 第 2 オペ ラ ン ド の対応す る ビ ッ ト が 1 の場合は第 1 オペ ラ ン ド か ら デス テ ィ ネーシ ョ ンに各ビ ッ ト を挿入 し ます。 それ以外の場合は、 デス テ ィ ネーシ ョ ン ビ ッ ト を変更 し ません。 VBIF (False の場合はビ ッ ト 単位を挿入) は、 第 2 オペ ラ ン ド の対応す る ビ ッ ト が 0 の場合は第 1 オペ ラ ン ド か ら デス テ ィ ネーシ ョ ンに各ビ ッ ト を挿入 し ます。 それ以外の場合は、 デス テ ィ ネーシ ョ ン ビ ッ ト を変更 し ません。 VBSL (ビ ッ ト 単位を選択) は、 デス テ ィ ネーシ ョ ンの対応す る ビ ッ ト が 1 の 場合は第 1 オペ ラ ン ド か ら 、 0 の場合は第 2 オペ ラ ン ド か ら デス テ ィ ネーシ ョ ンの各ビ ッ ト を選択 し ます。 構文 Vop{cond}{.datatype} {Qd}, Qn, Qm Vop{cond}{.datatype} {Dd}, Dn, Dm 各引数には以下の意味があ り ます。 ARM DUI 0204IJ op BIT、 BIF、 ま たは BSL のいずれかに し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype 任意に指定で き る デー タ 型です。 アセ ンブ ラ は datatype を無視 し ます。 Qd, Qn, Qm ク ワ ッ ド ワ ー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ 、 第 1 オペ ラ ン ド レ ジ ス タ 、 第 2 オペ ラ ン ド レ ジ ス タ を指定 し ま す。 Dd, Dn, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ 、 第 1 オペ ラ ン ド レ ジ ス タ 、 第 2 オペ ラ ン ド レ ジ ス タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-37 NEON と VFP プ ログ ラ ミ ング 5.7.4 VMOV、 VMVN (レ ジ ス タ ) ベ ク タ 移動 (レ ジ ス タ ) は、 ソ ース レ ジ ス タ か ら デス テ ィ ネーシ ョ ン レ ジ ス タ に値を コ ピー し ます。 ベ ク タ のデー タ の各ビ ッ ト を反転 さ せてか ら 代入す る 命令 (レ ジ ス タ ) は ソ ース レ ジ ス タ の各ビ ッ ト の値を反転 し て、 結果をデス テ ィ ネーシ ョ ン レ ジ ス タ に返 し ます。 構文 VMOV{cond}{.datatype} Qd, Qm VMOV{cond}{.datatype} Dd, Dm VMVN{cond}{.datatype} Qd, Qm VMVN{cond}{.datatype} Dd, Dm 各項目には以下の意味があ り ます。 5-38 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype 任意に指定で き る デー タ 型です。 アセ ンブ ラ は datatype を無視 し ます。 Qd, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と ソ ースベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と ソ ー スベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.7.5 VACGE および VACGT ベ ク タ 絶対値比較は、 ベ ク タ の各要素の絶対値を取得 し 、 2 番目のベ ク タ の 対応す る 要素の絶対値 と 比較 し ます。 条件が True の場合、 デス テ ィ ネーシ ョ ンベ ク タ の対応す る 要素はすべて 1 に設定 さ れます。 それ以外の場合は、 すべ て 0 に設定 さ れ ます。 疑似命令 「VACLE お よ び VACLT」 (ページ 5-102) も 参照 し て下 さ い。 構文 VACop{cond}.F32 {Qd}, Qn, Qm VACop{cond}.F32 {Dd}, Dn, Dm 各引数には以下の意味があ り ます。 op 以下のいずれか を指定 し ます。 GE 以上 (絶対値) GT 超 (絶対値比較) cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 Qd, Qn, Qm ク ワ ッ ド ワ ー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ 、 第 1 オペ ラ ン ド レ ジ ス タ 、 第 2 オペ ラ ン ド レ ジ ス タ を指定 し ま す。 Dd, Dn, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ 、 第 1 オペ ラ ン ド レ ジ ス タ 、 第 2 オペ ラ ン ド レ ジ ス タ を指定 し ます。 結果の datatype は I32 です。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-39 NEON と VFP プ ログ ラ ミ ング 5.7.6 VCEQ、 VCGE、 VCGT、 VCLE、 お よび VCLT ベ ク タ 比較はベ ク タ の各要素の値を取得 し 、 2 番目のベ ク タ の対応す る 要素 の値ま たは 0 と 比較 し ます。 条件が True の場合、 デス テ ィ ネーシ ョ ンベ ク タ の対応す る 要素はすべて 1 に設定 さ れ ます。 それ以外の場合は、 すべて 0 に設 定 さ れます。 疑似命令 「VCLE お よ び VCLT」 (ページ 5-103) も 参照 し て下 さ い。 構文 VCop{cond}.datatype {Qd}, Qn, Qm VCop{cond}.datatype {Dd}, Dn, Dm VCop{cond}.datatype {Qd}, Qn, #0 VCop{cond}.datatype {Dd}, Dn, #0 各項目には以下の意味があ り ます。 以下のいずれか を指定 し ます。 EQ 等しい GE 以上 GT 超 LE 以下 (第 2 オペ ラ ン ド が #0 の場合のみ) op 未満 (第 2 オペ ラ ン ド が #0 の場合のみ) LT cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype 以下のいずれか を指定 し ます。 • EQ の場合、 I8、 I16、 I32、 ま たは F32 • GE、 GT、 LE、 ま たは LT には S8、 S16、 S32、 U8、 U16、 U32、 ま た は F32 (#0 形式を除 く ) • GE、 GT、 LE、 ま たは LT には S8、 S16、 S32、 ま たは F32 (#0 形 式) 結果の datatype は次の よ う にな り ます。 • オペ ラ ン ド のデー タ 型が I32、 S32、 U32、 ま たは F32 の場合は I32 5-40 • オペ ラ ン ド のデー タ 型が I16、 S16、 ま たは U16 の場合は I16 • オペ ラ ン ド のデー タ 型が I8、 S8、 ま たは U8. の場合は I8 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング ARM DUI 0204IJ Qd, Qn, Qm ク ワ ッ ド ワ ー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ 、 第 1 オペ ラ ン ド レ ジ ス タ 、 第 2 オペ ラ ン ド レ ジ ス タ を指定 し ま す。 Dd, Dn, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ 、 第 1 オペ ラ ン ド レ ジ ス タ 、 第 2 オペ ラ ン ド レ ジ ス タ を指定 し ます。 #0 比較のために Qm ま たは Dm を ゼ ロ と 置 き 換え ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-41 NEON と VFP プ ログ ラ ミ ング 5.7.7 VTST VTST (ベ ク タ テ ス ト ビ ッ ト ) は、 ベ ク タ の各要素を取得 し 、 2 番目のベ ク タ の対応す る 要素を使用 し て ビ ッ ト 単位論理積を求め ます。 結果がゼ ロ でない 場合は、 デス テ ィ ネーシ ョ ンベ ク タ の対応す る 要素はすべて 1 に設定 さ れ ま す。 それ以外の場合は、 すべて 0 に設定 さ れます。 構文 VTST{cond}.size {Qd}, Qn, Qm VTST{cond}.size {Dd}, Dn, Dm 各引数には以下の意味があ り ます。 5-42 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 size 8、 16、 ま たは 32 のいずれかに し ます。 Qd, Qn, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ 、 第 1 オペ ラ ン ド レ ジ ス タ 、 第 2 オペ ラ ン ド レ ジ ス タ を指定 し ま す。 Dd, Dn, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ 、 第 1 オペ ラ ン ド レ ジ ス タ 、 第 2 オペ ラ ン ド レ ジ ス タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.8 NEON 汎用デー タ 処理命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「VCVT (固定小数点ま たは整数 と 浮動小数点 と の間)」 (ページ 5-44) 固定小数点ま たは整数 と 浮動小数点間のベ ク タ 変換 • 「VCVT (半精度浮動小数点数 と 単精度浮動小数点数間の変換)」 (ペー ジ 5-46) 半精度浮動小数点数 と 単精度浮動小数点数間のベ ク タ 変換 • 「VDUP」 (ページ 5-47) ベ ク タ の全レーンへの ス カ ラ の複製 • 「VEXT」 (ページ 5-48) 抽出 • 「VMOV、 VMVN ( イ ミ デ ィ エー ト )」 (ページ 5-49) 移動 と 負の移動 ( イ ミ デ ィ エー ト ) • 「VMOVL, V{Q}MOVN, VQMOVUN」 (ページ 5-50) 移動 (レ ジ ス タ ) • 「VREV」 (ページ 5-52) ベ ク タ 内の要素の反転 • 「VSWP」 (ページ 5-53) ベク タのス ワ ッ プ • 「VTBL, VTBX」 (ページ 5-54) ベ ク タ テーブルの検索 • 「VTRN」 (ページ 5-55) ベ ク タ 置換 • 「VUZP、 VZIP」 (ページ 5-56) ベ ク タ の イ ン タ ー リ ーブ と イ ン タ ー リ ーブの解除 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-43 NEON と VFP プ ログ ラ ミ ング 5.8.1 VCVT (固定小数点または整数 と 浮動小数点 と の間) VCVT (ベ ク タ 変換) はベ ク タ の各要素を以下のいずれかの方法で変換 し 、 結 果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 • 浮動小数点か ら 整数への変換 • 整数か ら 浮動小数点への変換 • 浮動小数点か ら 固定小数点への変換 • 固定小数点か ら 浮動小数点への変換 構文 VCVT{cond}.type Qd, Qm {, #fbits} VCVT{cond}.type Dd, Dm {, #fbits} 各引数には以下の意味があ り ます。 5-44 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 type ベ ク タ の要素のデー タ 型を指定 し ます。 以下のいずれかにな り ま す。 S32.F32 浮動小数点か ら 符号付 き 整数ま たは固定小数点への変 換 U32.F32 浮動小数点か ら 符号な し 整数ま たは固定小数点への変 換 F32.S32 符号付 き 整数ま たは固定小数点か ら 浮動小数点への変 換 F32.U32 符号な し 整数ま たは固定小数点か ら 浮動小数点への変 換 Qd, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オ ペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 fbits こ のパ ラ メ ー タ が指定 さ れてい る 場合は、 固定小数点数の小数 部ビ ッ ト を指定 し ます。 それ以外の場合は、 浮動小数点 と 整数間 の変換にな り ます。 fbits は 0 ~ 32 の範囲で指定す る 必要があ り ます。 fbits を省略 し た場合、 小数部ビ ッ ト は 0 にな り ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 丸め 整数ま たは固定小数点か ら 浮動小数点への変換では、 近似値への丸めを使用 し ます。 浮動小数点か ら 整数ま たは固定小数点への変換では、 ゼ ロ 方向への丸め を使 用 し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-45 NEON と VFP プ ログ ラ ミ ング 5.8.2 VCVT (半精度浮動小数点数 と 単精度浮動小数点数間の変換) VCVT (ベ ク タ 変換) は、 半精度拡張をサポー ト し てお り 、 ベ ク タ の各要素を 以下のいずれかの方法で変換 し て、 結果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 • 半精度浮動小数点数か ら 単精度浮動小数点数ま で (F32.F16) • 単精度浮動小数点数か ら 半精度浮動小数点数ま で (F16.F32) 構文 VCVT{cond}.F32.F16 Qd, Dm VCVT{cond}.F16.F32 Dd, Qm 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 Qd, Dm 単精度の結果 と 半精度オペ ラ ン ド ベ ク タ のデス テ ィ ネーシ ョ ン ベ ク タ を指定 し ます。 Dd, Qm 半精度の結果 と 単精度オペ ラ ン ド ベ ク タ のデス テ ィ ネーシ ョ ン ベ ク タ を指定 し ます。 アーキテ ク チ ャ こ の命令を使用で き る のは、 半精度拡張をサポー ト し てい る NEON シ ス テ ム だけです。 5-46 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.8.3 VDUP VDUP (ベ ク タ 複製) は、 デス テ ィ ネーシ ョ ンベ ク タ のすべての要素に ス カ ラ を複製 し ます。 ソ ース は NEON ス カ ラ ま たは ARM レ ジ ス タ です。 構文 VDUP{cond}.size Qd, Dm[x] VDUP{cond}.size Dd, Dm[x] VDUP{cond}.size Qd, Rm VDUP{cond}.size Dd, Rm 各項目には以下の意味があ り ます。 ARM DUI 0204IJ cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 size 8、 16、 ま たは 32 を指定 し ます。 Qd ク ワ ッ ド ワ ー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ を 指定 し ます。 Dd ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ を指 定 し ます。 Dm[x] NEON ス カ ラ を指定 し ます。 Rm ARM レ ジ ス タ を指定 し ます。 Rm に pc は指定で き ません。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-47 NEON と VFP プ ログ ラ ミ ング 5.8.4 VEXT VEXT (ベ ク タ 抽出) は、 第 2 オペ ラ ン ド ベ ク タ の下位 と 第 1 オペ ラ ン ド ベ ク タ の上位か ら 8 ビ ッ ト 要素を抽出 し 、 連結 し て、 デス テ ィ ネーシ ョ ンベ ク タ に結果を返 し ます。 こ の例については、 図 5-2 を参照 し て下 さ い。 7 6 5 4 3 2 1 0 Vm 7 6 5 4 3 2 1 0 Vn Vd 図 5-2 imm = 3 の場合のダブルワー ド VEXT 演算 構文 VEXT{cond}.8 {Qd}, Qn, Qm, #imm VEXT{cond}.8 {Dd}, Dn, Dm, #imm 各引数には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 Qd, Qn, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ 、 第 1 オペ ラ ン ド レ ジ ス タ 、 第 2 オペ ラ ン ド レ ジ ス タ を指定 し ま す。 Dd, Dn, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ン レ ジ ス タ 、 第 1 オペ ラ ン ド レ ジ ス タ 、 第 2 オペ ラ ン ド レ ジ ス タ を指定 し ます。 imm 第 2 オペ ラ ン ド ベ ク タ の下位か ら 抽出す る 8 ビ ッ ト 要素の数を指 定 し ます。 ダブル ワ ー ド 演算では 0 ~ 7 の範囲、 ク ワ ッ ド ワー ド 演算では 0 ~ 15 の範囲です。 VEXT 疑似命令 8 の代わ り に 16、 32、 ま たは 64 のデー タ 型を指定で き ます。 こ の場合、 #imm にバ イ ト の代わ り にハーフ ワー ド 、 ワー ド 、 ま たはダブル ワ ー ド を使用す る と 、 それに応 じ て許容範囲が小 さ く な り ます。 5-48 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.8.5 VMOV、 VMVN (イ ミ デ ィ エー ト ) VMOV (ベ ク タ の移動) と VMVN (ベ ク タ の負の移動) イ ミ デ ィ エー ト では、 即 値がデス テ ィ ネーシ ョ ン レ ジ ス タ に生成 さ れます。 構文 Vop{cond}.datatype Qd, #imm Vop{cond}.datatype Dd, #imm 各引数には以下の意味があ り ます。 op MOV ま たは MVN を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype I8、 I16、 I32、 I64、 ま たは F32 のいずれか を指定 し ます。 Qd ??? Dd 結果を保持す る NEON レ ジ ス タ です。 imm datatype に よ っ て指定 さ れ る 型の定数です。 複製 さ れてデス テ ィ ネーシ ョ ン レ ジ ス タ に配置 さ れます。 表 5-9 使用可能な定数 datatype VMOV VMVN I8 0xXY - I16 0x00XY, 0xXY00 0xFFXY, 0xXYFF I32 0x000000XY, 0x0000XY00, 0x00XY0000, 0xXY000000 0xFFFFFFXY, 0xFFFFXYFF, 0xFFXYFFFF, 0xXYFFFFFF 0x0000XYFF, 0x00XYFFFF 0xFFFFXY00, 0xFFXY0000 I64 バ イ ト マ ス ク 、 0xGGHHJJKKLLMMNNPP a - F32 浮動小数点数b - a. 0xGG、 0xHH、 0xJJ、 0xKK、 0xLL、 0xMM、 0xNN、 お よ び 0xPP のそれぞれを 0x00 ま たは 0xFF に し ます。 b. +/–n * 2–r と 表す こ と がで き る 任意の数値。 こ こ で、 n と r は整数、 16 <= n <= 31、 0 <= r <= 7 です。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-49 NEON と VFP プ ログ ラ ミ ング 5.8.6 VMOVL, V{Q}MOVN, VQMOVUN VMOVL (ベ ク タ Long 移動) はダブル ワー ド ベ ク タ の各要素を取得 し 、 符号拡 張ま たはゼ ロ 拡張を行っ て元の長 さ の 2 倍に し て、 ク ワ ッ ド ワー ド ベ ク タ に 結果を返 し ます。 VMOVN (ベ ク タ 移動お よ び Narrow) は、 ク ワ ッ ド ワ ー ド ベ ク タ の各要素の下位 半分を ダブル ワー ド ベ ク タ の対応す る 要素に コ ピー し ます。 VQMOVN (ベ ク タ サチ ュ レー ト 移動お よ び Narrow) は、 オペ ラ ン ド ベ ク タ の各 要素をデス テ ィ ネーシ ョ ンベ ク タ の対応す る 要素に コ ピー し ます。 結果の要 素の幅はオペ ラ ン ド 要素の半分で、 値は結果の幅にサチ ュ レー ト さ れ ます。 VQMOVUN (ベ ク タ サチ ュ レー ト 移動お よ び Narrow、 符号付 き オペ ラ ン ド と 符号 のない結果) は、 オペ ラ ン ド ベ ク タ の各要素をデス テ ィ ネーシ ョ ンベ ク タ の 対応す る 要素に コ ピー し ます。 結果の要素の幅はオペ ラ ン ド 要素の半分で、 値は結果の幅にサチ ュ レー ト さ れ ます。 構文 VMOVL{cond}.datatype Qd, Dm V{Q}MOVN{cond}.datatype Dd, Qm VQMOVUN{cond}.datatype Dd, Qm 各引数には以下の意味があ り ます。 Q こ のパ ラ メ ー タ が指定 さ れてい る 場合は、 結果がサチ ュ レー ト さ れ ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype 以下のいずれか を指定 し ます。 Qd, Dm S8, S16, S32 VMOVL の場合 U8, U16, U62 VMOVL の場合 I16, I32, I64 VMOVN の場合 S16, S32, S64 VQMOVN ま たは VQMOVUN の場合 U16, U32, U64 VQMOVN では、 以下の よ う にな り ます。 VMOVL のデス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 5-50 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング Dd, Qm ARM DUI 0204IJ V{Q}MOV{U}N のデス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を 指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-51 NEON と VFP プ ログ ラ ミ ング 5.8.7 VREV VREV16 (ハーフ ワー ド 内のベ ク タ 反転) は、 ベ ク タ の各ハーフ ワ ー ド 内の 8 ビ ッ ト 要素の順序を逆に し て、 対応す る デス テ ィ ネーシ ョ ンベ ク タ に結果を 返 し ます。 VREV32 ( ワ ー ド 内のベ ク タ 反転) は、 ベ ク タ の各 ワ ー ド 内の 8 ビ ッ ト ま たは 16 ビ ッ ト 要素の順序を逆に し て、 対応す る デス テ ィ ネーシ ョ ンベ ク タ に結果 を返 し ます。 VREV64 (ダブル ワー ド 内のベ ク タ 反転) は、 ベ ク タ の各ダブル ワ ー ド 内の 8 ビ ッ ト 、 16 ビ ッ ト 、 ま たは 32 ビ ッ ト 要素の順序を逆に し て、 対応す る デス テ ィ ネーシ ョ ンベ ク タ に結果を返 し ます。 構文 VREVn{cond}.size Qd, Qm VREVn{cond}.size Dd, Dm 各引数には以下の意味があ り ます。 5-52 n 16、 32、 ま たは 64 のいずれかに し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 size 8、 16、 32 のいずれかであ り 、 n 未満であ る 必要があ り ます。 Qd, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オ ペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.8.8 VSWP VSWP (ベ ク タ ス ワ ッ プ) は 2 つのベ ク タ の内容を交換 し ます。 ベ ク タ はダブル ワー ド ま たは ク ワ ッ ド ワ ー ド のいずれかです。 デー タ 型は区別 さ れ ません。 構文 VSWP{cond}{.datatype} Qd, Qm VSWP{cond}{.datatype} Dd, Dm 各引数には以下の意味があ り ます。 ARM DUI 0204IJ cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype 任意に指定で き る デー タ 型です。 アセ ンブ ラ は datatype を無視 し ます。 Qd, Qm ク ワ ッ ド ワ ー ド 演算で使用す る ベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド 演算で使用す る ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-53 NEON と VFP プ ログ ラ ミ ング 5.8.9 VTBL, VTBX VTBL (ベ ク タ テーブル検索) は、 コ ン ト ロ ールベ ク タ のバ イ ト イ ンデ ク ス を 使用 し 、 テーブル内のバ イ ト 値を検索 し て新 し いベ ク タ を生成 し ます。 範囲 外の イ ンデ ク ス は 0 を返 し ます。 VTBX (ベ ク タ テーブル拡張) は、 同様に動作 し ますが、 範囲外の イ ンデ ク ス がデス テ ィ ネーシ ョ ン要素を変更す る こ と はあ り ません。 構文 Vop{cond}.8 Dd, list, Dm 各引数には以下の意味があ り ます。 op TBL ま たは TBX を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 Dd デス テ ィ ネーシ ョ ンベ ク タ を指定 し ます。 list テーブルを含むベ ク タ を指定 し ます。 以下のいずれかにな り ま す。 • {Dn} • {Dn,D(n+1)} • {Dn,D(n+1),D(n+2)} • {Dn,D(n+1),D(n+2),D(n+3)} list のすべての レ ジ ス タ は D0 ~ D31 の範囲です。 Dm 5-54 イ ンデ ク スベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.8.10 VTRN VTRN (ベ ク タ 置換) は、 オペ ラ ン ド ベ ク タ の要素を 2 x 2 マ ト リ ク ス の要素 と し て処理 し 、 マ ト リ ク ス を置換 し ます。 図 5-3 と 図 5-4 は VTRN の演算の例を 示 し ます。 7 6 5 4 3 2 1 0 Dm Dd 図 5-3 ダブルワー ド VTRN.8 演算 1 0 Dm Dd 図 5-4 ダブルワー ド VTRN.32 演算 構文 VTRN{cond}.size Qd, Qm VTRN{cond}.size Dd, Dm 各引数には以下の意味があ り ます。 ARM DUI 0204IJ cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 size 8、 16、 ま たは 32 のいずれかに し ます。 Qd, Qm ク ワ ッ ド ワ ー ド 演算で使用す る ベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド 演算で使用す る ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-55 NEON と VFP プ ログ ラ ミ ング 5.8.11 VUZP、 VZIP VZIP (ベ ク タ 圧縮) は 2 つのベ ク タ の要素を イ ン タ ー リ ーブ し ます。 VUZP (ベ ク タ 解凍) は 2 つのベ ク タ の要素の イ ン タ ー リ ーブ を解除 し ます。 イ ン タ ー リ ーブ解除の例については、 「3 要素構造体か ら な る 配列の イ ン タ ー リ ーブの解除」 (ページ 5-87) を参照 し て下 さ い。 イ ン タ ー リ ーブは こ の逆の プ ロ セ ス です。 構文 Vop{cond}.size Qd, Qm Vop{cond}.size Dd, Dm 各引数には以下の意味があ り ます。 op UZP ま たは ZIP を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 size 8、 16、 ま たは 32 のいずれかに し ます。 Qd, Qm ク ワ ッ ド ワー ド 演算で使用す る ベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド 演算で使用す る ベ ク タ を指定 し ます。 注 以下はすべて同 じ 命令です。 • VZIP.32 Dd, Dm • VUZP.32 Dd, Dm • VTRN.32 Dd, Dm 命令は VTRN.32 Dd, Dm と し て逆アセ ン ブル さ れます。 「VTRN」 (ページ 5-55) も 参照 し て下 さ い。 5-56 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.9 NEON シ フ ト 命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「VSHL、 VQSHL、 VQSHLU、 お よ び VSHLL ( イ ミ デ ィ エー ト に よ る )」 (ページ 5-58) イ ミ デ ィ エー ト 値に よ る 左シ フ ト • 「V{Q}{R}SHL (符号付 き 変数に よ る)」 (ページ 5-60) 符号付 き 変数に よ る 左シ フ ト • 「V{R}SHR{N}, V{R}SRA ( イ ミ デ ィ エー ト に よ る )」 (ページ 5-61) イ ミ デ ィ エー ト 値に よ る 右シ フ ト • 「VQ{R}SHR{U}N ( イ ミ デ ィ エー ト に よ る)」 (ページ 5-63) イ ミ デ ィ エー ト 値に よ る 右シ フ ト と サチ ュ レー ト • 「VSLI お よ び VSRI」 (ページ 5-64) 左シ フ ト と 挿入お よ び右シ フ ト と 挿入 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-57 NEON と VFP プ ログ ラ ミ ング 5.9.1 VSHL、 VQSHL、 VQSHLU、 および VSHLL (イ ミ デ ィ エー ト に よ る) ベ ク タ 左シ フ ト ( イ ミ デ ィ エー ト に よ る ) 命令は、 整数ベ ク タ の各要素を取 得 し 、 即値で左にシ フ ト し て、 デス テ ィ ネーシ ョ ンベ ク タ に結果を返 し ます。 VSHL (ベ ク タ 左シ フ ト ) では、 各要素の左の範囲外にシ フ ト さ れた ビ ッ ト は 失われ ます。 VQSHL (ベ ク タ サチ ュ レー ト 左シ フ ト ) と VQSHLU (ベ ク タ サチ ュ レー ト 左シ フ ト 符号な し ) では、 サチ ュ レーシ ョ ンが発生す る と ス テ ィ ッ キー QC フ ラ グ (FPSCR ビ ッ ト [27]) が設定 さ れ ます。 VSHLL (ベ ク タ 左シ フ ト Long) では、 値は符号拡張ま たはゼ ロ 拡張 さ れ ます。 構文 V{Q}SHL{U}{cond}.datatype {Qd}, Qm, #imm V{Q}SHL{U}{cond}.datatype {Dd}, Dm, #imm VSHLL{cond}.datatype Qd, Dm, #imm 各項目には以下の意味があ り ます。 5-58 Q こ のパ ラ メ ー タ が指定 さ れてい る 場合、 オーバーフ ロ ー し た結 果はサチ ュ レー ト さ れます。 U Q も 指定 さ れてい る 場合にのみ使用で き ます。 オペ ラ ン ド に符号 が付いて も 結果には符合が付 き ません。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype 以下のいずれか を指定 し ます。 I8, I16, I32, I64 VSHL の場合 S8, S16, S32 VSHLL、 VQSHL、 ま たは VQSHLU の場合 U8, U16, U32 VSHLL ま たは VQSHL の場合 S64 VQSHL ま たは VQSHLU の場合 U64 VQSHL の場合 Qd, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オ ペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング Qd, Dm long 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 imm 以下の範囲でシ フ ト のサ イ ズ を指定す る イ ミ デ ィ エー ト 定数で す。 VSHLL では、 1 ~ size(datatype) • • VSHL、 VQSHL、 ま たは VQSHLU では 1 ~ (size(datatype) – 1) 0 を使用で き ますが、 生成 さ れ る コ ー ド は VMOV ま たは VMOVL に逆 アセ ンブル さ れます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-59 NEON と VFP プ ログ ラ ミ ング 5.9.2 V{Q}{R}SHL (符号付き変数に よ る) VSHL (符号付 き 変数に よ る ベ ク タ 左シ フ ト ) は、 ベ ク タ の各要素を取得 し 、 2 番目のベ ク タ の対応す る 要素の最下位バ イ ト の値でシ フ ト し 、 デス テ ィ ネー シ ョ ンベ ク タ に結果を返 し ます。 シ フ ト 値が正の場合は、 左シ フ ト にな り ま す。 それ以外の場合は、 右シ フ ト にな り ます。 結果はオプシ ョ ン でサチ ュ レー ト 、 丸め、 ま たはその両方を実行で き ます。 サチ ュ レーシ ョ ンが発生 し た場合は、 ス テ ィ ッ キー QC フ ラ グ (FPSCR ビ ッ ト [27]) が設定 さ れます。 構文 V{Q}{R}SHL{cond}.datatype {Qd}, Qm, Qn V{Q}{R}SHL{cond}.datatype {Dd}, Dm, Dn 各引数には以下の意味があ り ます。 5-60 Q こ のパ ラ メ ー タ が指定 さ れてい る 場合、 オーバーフ ロ ー し た結 果はサチ ュ レー ト さ れます。 R こ のパ ラ メ ー タ が指定 さ れてい る 場合、 結果は丸め ら れ ます。 指 定 さ れていない場合、 結果は切 り 捨て ら れ ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype S8、 S16、 S32、 S64、 U8、 U16、 U32、 ま たは U64 を指定 し ます。 Qd, Qm, Qn ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dm, Dn ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オ ペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.9.3 V{R}SHR{N}, V{R}SRA (イ ミ デ ィ エー ト に よ る) V{R}SHR{N} ( イ ミ デ ィ エー ト 値に よ る ベ ク タ 右シ フ ト ) は、 ベ ク タ の各要素を 取得 し 、 イ ミ デ ィ エー ト 値で右シ フ ト し て、 デス テ ィ ネーシ ョ ンベ ク タ に結 果を返 し ます。 結果はオプシ ョ ン で丸め、 切 り 捨て、 ま たはその両方を実行 で き ます。 V{R}SRA ( イ ミ デ ィ エー ト 値に よ る ベ ク タ 右シ フ ト と 累積) は、 ベ ク タ の各要 素を取得 し 、 イ ミ デ ィ エー ト 値で右シ フ ト し て、 デス テ ィ ネーシ ョ ンベ ク タ に結果を累積 し ます。 結果はオプシ ョ ン で丸め る こ と がで き ます。 構文 V{R}SHR{cond}.datatype {Qd}, Qm, #imm V{R}SHR{cond}.datatype {Dd}, Dm, #imm V{R}SRA{cond}.datatype {Qd}, Qm, #imm V{R}SRA{cond}.datatype {Dd}, Dm, #imm V{R}SHRN{cond}.datatype Dd, Qm, #imm 各項目には以下の意味があ り ます。 ARM DUI 0204IJ R こ のパ ラ メ ー タ が指定 さ れてい る 場合は、 結果が丸め ら れます。 それ以外の場合、 結果は切 り 捨て ら れます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype 以下のいずれか を指定 し ます。 S8?S16?S32?S64 V{R}SHR ま たは V{R}SRA の場合 U8?U16?U32?U64 V{R}SHR ま たは V{R}SRA の場合 I16?I32?I64 V{R}SHRN の場合 Qd, Qm ク ワ ッ ド ワ ー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オ ペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Qm Narrow 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-61 NEON と VFP プ ログ ラ ミ ング imm 5-62 0 ~ (size(datatype) – 1) の範囲でシ フ ト のサ イ ズ を指定す る イ ミ デ ィ エー ト 定数です。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.9.4 VQ{R}SHR{U}N (イ ミ デ ィ エー ト に よ る) VQ{R}SHR{U}N (ベ ク タ サチ ュ レー ト 右シ フ ト 、 Narrow、 イ ミ デ ィ エー ト 値に よ る 、 オプシ ョ ンの丸め) は、 整数の ク ワ ッ ド ワ ー ド ベ ク タ の各要素を取得 し 、 イ ミ デ ィ エー ト 値で右シ フ ト し 、 ダブル ワー ド ベ ク タ に結果を返 し ます。 サチ ュ レーシ ョ ンが発生 し た場合は、 ス テ ィ ッ キー QC フ ラ グ (FPSCR ビ ッ ト [27]) が設定 さ れます。 構文 VQ{R}SHR{U}N{cond}.datatype Dd, Qm, #imm 各引数には以下の意味があ り ます。 ARM DUI 0204IJ R こ のパ ラ メ ー タ が指定 さ れてい る 場合は、 結果が丸め ら れます。 それ以外の場合、 結果は切 り 捨て ら れます。 U こ のパ ラ メ ー タ が指定 さ れてい る 場合は、 オペ ラ ン ド に符号が 付いていて も 結果には符合が付 き ません。 それ以外の場合は、 結 果はオペ ラ ン ド と 同 じ 型にな り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype 以下のいずれか を指定 し ます。 S16?S32?S64 VQ{R}SHRN ま たは VQ{R}SHRUN の場合 U16?U32?U64 VQ{R}SHRN の場合のみ Dd, Qm デス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 imm 0 ~ (size(datatype) – 1) の範囲でシ フ ト のサ イ ズ を指定す る イ ミ デ ィ エー ト 定数です。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-63 NEON と VFP プ ログ ラ ミ ング 5.9.5 VSLI お よび VSRI VSLI (ベ ク タ 左シ フ ト と 挿入) は、 ベ ク タ の各要素を取得 し 、 イ ミ デ ィ エー ト 値で左シ フ ト し て、 デス テ ィ ネーシ ョ ンベ ク タ に結果を挿入 し ます。 各要 素の左の範囲外にシ フ ト さ れた ビ ッ ト は失われ ます。 VSRI (ベ ク タ 右シ フ ト と 挿入) は、 ベ ク タ の各要素を取得 し 、 イ ミ デ ィ エー ト 値で右シ フ ト し て、 デス テ ィ ネーシ ョ ンベ ク タ に結果を挿入 し ます。 各要 素の右の範囲外にシ フ ト さ れた ビ ッ ト は失われ ます。 構文 Vop{cond}.size {Qd}, Qm, #imm Vop{cond}.size {Dd}, Dm, #imm 各引数には以下の意味があ り ます。 5-64 op SLI ま たは SRI を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 size 8、 16、 32、 ま たは 64 のいずれか を指定 し ます。 Qd, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オ ペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 imm 以下の範囲でシ フ ト のサ イ ズ を指定す る イ ミ デ ィ エー ト 定数で す。 • VSLI の場合、 0 ~ (size – 1) • VSRI の場合、 1 ~ size Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.10 NEON 汎用算術命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「VABA{L} お よ び VABD{L}」 (ページ 5-66) ベ ク タ 絶対差 と 累積、 絶対差 • 「V{Q}ABS お よ び V{Q}NEG」 (ページ 5-67) ベ ク タ 絶対値お よ び否定 • 「V{Q}ADD、 VADDL、 VADDW、 V{Q}SUB、 VSUBL、 VSUBW」 (ページ 5-68) ベ ク タ 加算お よ び減算 • 「V{R}ADDHN お よ び V{R}SUBHN」 (ページ 5-70) 上位半分を選択す る ベ ク タ 加算お よ び減算 • 「V{R}HADD お よ び VHSUB」 (ページ 5-71) ベ ク タ 二分加算お よ び減算 • 「VPADD{L}、 VPADAL」 (ページ 5-72) ベ ク タ ペア ワ イ ズ加算お よ び加算累積 • 「VMAX、 VMIN、 VPMAX、 VPMIN」 (ページ 5-74) ベ ク タ 最大値、 最小値、 ペア ワ イ ズ最大値、 お よ びペア ワ イ ズ最小値 • 「VCLS、 VCLZ、 VCNT」 (ページ 5-76) ベ ク タ 先行符号ビ ッ ト カ ウ ン ト 、 先行ゼ ロ カ ウ ン ト 、 お よ びセ ッ ト ビ ッ ト カウン ト • 「VRECPE お よ び VRSQRTE」 (ページ 5-77) ベ ク タ 逆数の推定お よ び逆平方根の推定 • 「VRECPS お よ び VRSQRTS」 (ページ 5-79) ベ ク タ 逆数の ス テ ッ プお よ び逆平方根の ス テ ッ プ ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-65 NEON と VFP プ ログ ラ ミ ング 5.10.1 VABA{L} および VABD{L} VABA (ベ ク タ 絶対差 と 累積) は、 あ る ベ ク タ の要素を対応す る 別のベ ク タ の 要素か ら 減算 し 、 その結果の絶対値をデス テ ィ ネーシ ョ ンベ ク タ の要素に累 積 し ます。 VABD (ベ ク タ 絶対差) は、 あ る ベ ク タ の要素を対応す る 別のベ ク タ の要素か ら 減算 し 、 その結果の絶対値をデス テ ィ ネーシ ョ ンベ ク タ の要素に返 し ます。 いずれの命令に も Long バージ ョ ン があ り ます。 構文 Vop{cond}.datatype {Qd}, Qn, Qm Vop{cond}.datatype {Dd}, Dn, Dm VopL{cond}.datatype Qd, Dn, Dm 各項目には以下の意味があ り ます。 op ABA ま たは ABD を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype 以下のいずれか を指定 し ます。 • VABA、 VABAL、 ま たは VABDL の場合、 S8、 S16、 S32、 U8、 U16、 ま たは U32 • 5-66 VABD の場合、 S8、 S16、 S32、 U8、 U16、 U32、 ま たは F32 Qd, Qn, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dn, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オ ペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Qd, Dn, Dm Long 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.10.2 V{Q}ABS お よび V{Q}NEG VABS (ベ ク タ 絶対値) は、 ベ ク タ の各要素の絶対値を取得 し て、 その結果を 2 番目のベ ク タ に返 し ます (浮動小数点バージ ョ ンは、 符号ビ ッ ト を ク リ ア す る だけです)。 VNEG (ベ ク タ 否定) は、 ベ ク タ の各要素を否定 し て、 その結果を 2 番目のベ ク タ に返 し ます (浮動小数点バージ ョ ンは、 符号ビ ッ ト を反転す る だけで す)。 いずれの命令に も サチ ュ レー ト バージ ョ ンがあ り ます。 サチ ュ レーシ ョ ンが 発生 し た場合は、 ス テ ィ ッ キー QC フ ラ グ (FPSCR ビ ッ ト [27]) が設定 さ れ ます。 構文 V{Q}op{cond}.datatype Qd, Qm V{Q}op{cond}.datatype Dd, Dm 各引数には以下の意味があ り ます。 ARM DUI 0204IJ Q こ のパ ラ メ ー タ が指定 さ れてい る 場合、 オーバーフ ロ ー し た結 果はサチ ュ レー ト さ れ ます。 op ABS ま たは NEG を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype 以下のいずれか を指定 し ます。 S8, S16, S32 VABS、 VNEG、 VQABS、 ま たは VQNEG の場合 F32 VABS お よ び VNEG の場合のみ Qd, Qm ク ワ ッ ド ワ ー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オ ペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-67 NEON と VFP プ ログ ラ ミ ング 5.10.3 V{Q}ADD、 VADDL、 VADDW、 V{Q}SUB、 VSUBL、 VSUBW VADD (ベ ク タ 加算) は、 2 つのベ ク タ のそれぞれ対応す る 要素を加算 し 、 そ の結果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 VSUB (ベ ク タ 減算) は、 あ る ベ ク タ の要素を対応す る 別のベ ク タ の要素か ら 減算 し 、 その結果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 いずれの命令に も サチ ュ レー ト バージ ョ ン、 Long バージ ョ ン、 お よ び Wide バージ ョ ンがあ り ます。 サチ ュ レーシ ョ ンが発生 し た場合は、 ス テ ィ ッ キー QC フ ラ グ (FPSCR ビ ッ ト [27]) が設定 さ れます。 構文 V{Q}op{cond}.datatype {Qd}, Qn, Qm V{Q}op{cond}.datatype {Dd}, Dn, Dm VopL{cond}.datatype Qd, Dn, Dm VopW{cond}.datatype {Qd}, Qn, Dm 各項目には以下の意味があ り ます。 Q こ のパ ラ メ ー タ が指定 さ れてい る 場合、 オーバーフ ロ ー し た結 果はサチ ュ レー ト さ れます。 op ADD ま たは SUB を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype 以下のいずれか を指定 し ます。 I8, I16, I32, I64, F32 VADD ま たは VSUB の場合 S8, S16, S32 VQADD、 VQSUB、 VADDL、 VADDW、 VSUBL、 or VSUBW の 場合 U8, U16, U32 VQADD、 VQSUB、 VADDL、 VADDW、 VSUBL、 or VSUBW の 場合 S64, U64 5-68 VQADD ま たは VQSUB の場合 Qd, Qn, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dn, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オ ペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング ARM DUI 0204IJ Qd, Dn, Dm Long 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Qd, Qn, Dm Wide 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-69 NEON と VFP プ ログ ラ ミ ング 5.10.4 V{R}ADDHN お よび V{R}SUBHN V{R}ADDH (上位半分を選択 し てベ ク タ 加算 し 、 幅を狭め る ) は、 2 つのベ ク タ のそれぞれ対応す る 要素を加算 し 、 その結果の上位半分を選択 し て、 最終的 な結果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 結果は丸め る か、 切 り 捨て る こ と がで き ます。 V{R}SUBH (上位半分を選択す る ベ ク タ 減算お よ び Narrow) は、 あ る ベ ク タ の 要素を対応す る 別のベ ク タ の要素か ら 減算 し 、 その結果の上位半分を選択 し て、 最終的な結果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 結果は丸め る か、 切 り 捨て る こ と がで き ます。 構文 V{R}opHN{cond}.datatype Dd, Qn, Qm 各引数には以下の意味があ り ます。 5-70 R こ のパ ラ メ ー タ が指定 さ れてい る 場合、 結果は丸め ら れ ます。 指 定 さ れていない場合、 結果は切 り 捨て ら れ ます。 op ADD ま たは SUB を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype I16、 I32、 ま たは I64 のいずれかに し ます。 Dd, Qn, Qm デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.10.5 V{R}HADD および VHSUB VHADD (ベ ク タ 二分加算) は、 2 つのベ ク タ のそれぞれ対応す る 要素を加算 し 、 結果を 1 ビ ッ ト 右にシ フ ト し て、 その結果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 結果は丸め る か、 切 り 捨て る こ と がで き ます。 VHSUB (ベ ク タ 二分減算) は、 あ る ベ ク タ の要素を対応す る 別のベ ク タ の要素 か ら 減算 し 、 結果を 1 ビ ッ ト 右にシ フ ト し て、 その結果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 結果は常に切 り 捨て ら れ ます。 構文 V{R}HADD{cond}.datatype {Qd}, Qn, Qm V{R}HADD{cond}.datatype {Dd}, Dn, Dm VHSUB{cond}.datatype {Qd}, Qn, Qm VHSUB{cond}.datatype {Dd}, Dn, Dm 各項目には以下の意味があ り ます。 ARM DUI 0204IJ R こ のパ ラ メ ー タ が指定 さ れてい る 場合、 結果は丸め ら れ ます。 指 定 さ れていない場合、 結果は切 り 捨て ら れます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype S8、 S16、 S32、 U8、 U16、 ま たは U32 のいずれかに し ます。 Qd, Qn, Qm ク ワ ッ ド ワ ー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dn, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オ ペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-71 NEON と VFP プ ログ ラ ミ ング 5.10.6 VPADD{L}、 VPADAL VPADD (ベ ク タ ペア ワ イ ズ加算) は、 2 つのベ ク タ の隣接す る 要素のペア を加 算 し 、 その結果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 Dm Dn + + + + Dd 図 5-5 VPADD 演算の例 (デー タ 型 I16 の場合) VPADDL (ベ ク タ ペア ワ イ ズ加算 Long) は、 あ る ベ ク タ の隣接す る 要素のペア を加算 し 、 結果を符号拡張ま たはゼ ロ 拡張 し 元の幅の 2 倍に し て、 最終的な 結果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 Dm + + Dd 図 5-6 ダブルワー ド VPADDL 演算の例 (デー タ 型 S16 の場合) VPADAL (ベ ク タ ペア ワ イ ズ加算累積 Long) は、 あ る ベ ク タ の隣接す る 要素の ペア を加算 し 、 その結果の絶対値をデス テ ィ ネーシ ョ ンベ ク タ の要素に累積 し ます。 Dm + + Dd 図 5-7 VPADAL 演算の例 (デー タ 型 S16 の場合) 5-72 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 構文 VPADD{cond}.datatype {Dd}, Dn, Dm VPopL{cond}.datatype Qd, Qm VPopL{cond}.datatype Dd, Dm 各項目には以下の意味があ り ます。 op ADD ま たは ADA を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype 以下のいずれか を指定 し ます。 Dd, Dn, Dm I8, I16, I32, F32 VPADD の場合 S8, S16, S32 VPADDL ま たは VPADAL の場合 U8, U16, U32 VPADDL ま たは VPADAL の場合 VPADD 命令で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 ARM DUI 0204IJ Qd, Qm ク ワ ッ ド ワ ー ド の VPADDL ま たは VPADAL で使用す る デス テ ィ ネー シ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド の VPADDL ま たは VPADAL で使用す る デス テ ィ ネー シ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-73 NEON と VFP プ ログ ラ ミ ング 5.10.7 VMAX、 VMIN、 VPMAX、 VPMIN VMAX (ベ ク タ 最大値) は、 2 つのベ ク タ のそれぞれ対応す る 要素を比較 し 、 各ペアの大 き い方の要素をデス テ ィ ネーシ ョ ンベ ク タ の対応す る 要素に コ ピー し ます。 VMIN (ベ ク タ 最小値) は、 2 つのベ ク タ のそれぞれ対応す る 要素を比較 し 、 各ペアの小 さ い方の要素をデス テ ィ ネーシ ョ ンベ ク タ の対応す る 要素に コ ピー し ます。 VPMAX (ベ ク タ ペア ワ イ ズ最大値) は、 2 つのベ ク タ の隣接す る 要素のペア を 比較 し 、 各ペアの大 き い方の要素をデス テ ィ ネーシ ョ ンベ ク タ の対応す る 要 素に コ ピー し ます。 オペ ラ ン ド と 結果はダブル ワ ー ド ベ ク タ であ る 必要があ り ます。 VPMIN (ベ ク タ ペア ワ イ ズ最小値) は、 2 つのベ ク タ の隣接す る 要素のペア を 比較 し 、 各ペアの小 さ い方の要素をデス テ ィ ネーシ ョ ンベ ク タ の対応す る 要 素に コ ピー し ます。 オペ ラ ン ド と 結果はダブル ワ ー ド ベ ク タ であ る 必要があ り ます。 ペア ワ イ ズ演算の図については、 図 5-5 (ページ 5-72) を参照 し て下 さ い。 構文 Vop{cond}.datatype Qd, Qn, Qm Vop{cond}.datatype Dd, Dn, Dm VPop{cond}.datatype Dd, Dn, Dm 各項目には以下の意味があ り ます。 5-74 op MAX ま たは MIN を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype S8、 S16、 S32、 U8、 U16、 U32、 ま たは F32 のいずれかに し ます。 Qd, Qn, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dn, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オ ペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 浮動小数点の最大値 と 最小値 max(+0.0, –0.0) = +0.0 min(+0.0, –0.0) = –0.0 いずれかの入力が NaN の場合、 対応す る 結果要素はデフ ォ ル ト の NaN にな り ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-75 NEON と VFP プ ログ ラ ミ ング 5.10.8 VCLS、 VCLZ、 VCNT VCLS (ベ ク タ 先行符号ビ ッ ト カ ウ ン ト ) は、 あ る ベ ク タ の各要素に含ま れ る 最上位ビ ッ ト に続 く 連続ビ ッ ト (最上位ビ ッ ト と 同 じ ) の数を カ ウ ン ト し 、 その結果を 2 番目のベ ク タ に返 し ます。 VCLZ (ベ ク タ 先行ゼ ロ カ ウ ン ト ) は、 あ る ベ ク タ の各要素に含ま れ る 連続す る ゼ ロ の数を カ ウ ン ト し (最上位ビ ッ ト か ら 開始)、 その結果を 2 番目のベ ク タ に返 し ます。 VCNT (ベ ク タ セ ッ ト ビ ッ ト カ ウ ン ト ) は、 あ る ベ ク タ の各要素に含まれ る ビ ッ ト の数を カ ウ ン ト し 、 その結果を 2 番目のベ ク タ に返 し ます。 構文 Vop{cond}.datatype Qd, Qm Vop{cond}.datatype Dd, Dm 各引数には以下の意味があ り ます。 5-76 op CLS、 CLZ、 ま たは CNT のいずれかに し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype 以下のいずれか を指定 し ます。 • CLS の場合、 S8、 S16、 ま たは S32 • CLZ の場合、 I8、 I16、 ま たは I32 • CNT の場合、 I8 Qd, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オ ペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.10.9 VRECPE お よび VRSQRTE VRECPE (ベ ク タ 逆数の推定) は、 あ る ベ ク タ に含ま れ る 各要素の逆数の近似 値を見つけ、 その結果を 2 番目のベ ク タ に返 し ます。 VRSQRTE (ベ ク タ 逆平方根の推定) は、 あ る ベ ク タ に含まれ る 各要素の逆平方 根の近似値を見つけ、 その結果を 2 番目のベ ク タ に返 し ます。 構文 Vop{cond}.datatype Qd, Qm Vop{cond}.datatype Dd, Dm 各引数には以下の意味があ り ます。 op RECPE ま たは RSQRTE を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype U32 ま たは F32 を指定 し ます。 Qd, Qm ク ワ ッ ド ワ ー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オ ペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と オペ ラ ン ド ベ ク タ を指定 し ます。 有効範囲外の入力を指定 し た場合の結果 表 5-10 に、 有効範囲外の入力値を指定 し た場合の結果を示 し ます。 表 5-10 有効範囲外の入力を指定 し た場合の結果 整数 ARM DUI 0204IJ オペ ラ ン ド 要素 (VRECPE) オペ ラ ン ド 要素 (VRSQRTE) 結果要素 <= 0x7FFFFFFF <= 0x3FFFFFFF 0xFFFFFFFF Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-77 NEON と VFP プ ログ ラ ミ ング 表 5-10 有効範囲外の入力を指定 し た場合の結果 (続き) 浮動小数点 オペ ラ ン ド 要素 (VRECPE) オペ ラ ン ド 要素 (VRSQRTE) 結果要素 NaN NaN、 負の正規、 負の無限大 デフ ォ ル ト の NaN 負の 0、 負の非正規 負の 0、 負の非正規 負の無限大a 正の 0、 正の非正規 正の 0、 正の非正規 正の無限大 a 正の無限大 正の無限大 正の 0 負の無限大 負の 0 a. FPSCR (FPSCR[1]) では、 ゼ ロ に よ る 除算の例外ビ ッ ト が設定 さ れます。 5-78 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.10.10 VRECPS お よび VRSQRTS VRECPS (ベ ク タ 逆数の ス テ ッ プ) は、 あ る ベ ク タ の要素を対応す る 別のベ ク タ の要素で乗算 し 、 その結果を 2 か ら 減算 し て、 最終的な結果をデス テ ィ ネーシ ョ ンベ ク タ の要素に返 し ます。 VRSQRTS (ベ ク タ 逆平方根の ス テ ッ プ) は、 あ る ベ ク タ の要素を対応す る 別の ベ ク タ の要素で乗算 し 、 その結果を 3 か ら 減算 し て 2 で除算 し 、 最終的な結 果をデス テ ィ ネーシ ョ ンベ ク タ の要素に返 し ます。 構文 Vop{cond}.F32 {Qd}, Qn, Qm Vop{cond}.F32 {Dd}, Dn, Dm 各引数には以下の意味があ り ます。 op RECPS ま たは RSQRTS を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 Qd, Qn, Qm ク ワ ッ ド ワ ー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dn, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オ ペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 有効範囲外の入力を指定 し た場合の結果 表 5-11 に、 有効範囲外の入力値を指定 し た場合の結果を示 し ます。 表 5-11 有効範囲外の入力を指定 し た場合の結果 第 1 オペ ラ ン ド 要素 第 2 オペ ラ ン ド 要素 結果要素 (VRECPS) 結果要素 (VRSQRTS) NaN - デフ ォ ル ト の NaN デフ ォ ル ト の NaN - NaN デフ ォ ル ト の NaN デフ ォ ル ト の NaN +/– 0.0 ま たは非正規 +/– 無限大 2.0 1.5 +/– 無限大 +/– 0.0 ま たは非正規 2.0 1.5 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-79 NEON と VFP プ ログ ラ ミ ング 使用法 ニ ュ ー ト ン ラ プ ソ ン法に よ る 反復計算 : xn+1 = xn(2-dxn) VRECPE を d に適用 し た結果が x0 であ る 場合に (1/d) に収束 し ます。 ニ ュ ー ト ン ラ プ ソ ン法に よ る 反復計算 : xn+1 = xn(3-dxn2)/2 VRSQRTE を d に適用 し た結果が x0 であ る 場合に (1/√d) に収束 し ます。 5-80 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.11 NEON 乗算命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「VMUL{L}、 VMLA{L}、 VMLS{L}」 (ページ 5-82) ベ ク タ 乗算、 積和、 お よ び積差 • 「VMUL{L}、 VMLA{L}、 VMLS{L} (ス カ ラ に よ る)」 (ページ 5-84) ベ ク タ 乗算、 積和、 お よ び積差 (ス カ ラ に よ る ) • 「VQDMULL、 VQDMLAL、 VQDMLSL (ベ ク タ ま たは ス カ ラ に よ る)」 (ページ 5-85) ベ ク タ サチ ュ レー ト ダブル乗算、 積和、 お よ び積差 (ベ ク タ ま たは ス カ ラ に よ る) • 「VQ{R}DMULH (ベ ク タ ま たは ス カ ラ に よ る )」 (ページ 5-86) 上位半分を返すベ ク タ サチ ュ レー ト ダブル乗算 (ベ ク タ ま たは ス カ ラ に よ る) ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-81 NEON と VFP プ ログ ラ ミ ング 5.11.1 VMUL{L}、 VMLA{L}、 VMLS{L} VMUL (ベ ク タ 乗算) は、 2 つのベ ク タ のそれぞれ対応す る 要素を乗算 し 、 そ の結果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 VMLA (ベ ク タ 積和) は、 2 つのベ ク タ のそれぞれ対応す る 要素を乗算 し 、 そ の結果をデス テ ィ ネーシ ョ ンベ ク タ の要素に累積 し ます。 VMLS (ベ ク タ 積差) は、 2 つのベ ク タ のそれぞれ対応す る 要素を乗算 し 、 そ の結果をデス テ ィ ネーシ ョ ンベ ク タ の対応す る 要素か ら 減算 し て、 最終的な 結果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 構文 Vop{cond}.datatype {Qd}, Qn, Qm Vop{cond}.datatype {Dd}, Dn, Dm VopL{cond}.datatype Qd, Dn, Dm 各項目には以下の意味があ り ます。 op 以下のいずれか を指定 し ます。 MUL 乗算 MLA 積和 MLS 積差 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype 以下のいずれか を指定 し ます。 I8, I16, I32, F32 MUL、 MLA、 ま たは MLS の場合 S8, S16, S32 MULL、 MLAL、 ま たは MLSL の場合 U8, U16, U32 MULL、 MLAL、 ま たは MLSL の場合 P8 MUL ま たは MULL の場合 デー タ 型 P8 については、 「{0,1} を超え る 多項式算術演算」 (ペー ジ 5-22) を参照 し て下 さ い。 5-82 Qd, Qn, Qm ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dn, Dm ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オ ペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング Qd, Dn, Dm ARM DUI 0204IJ Long 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ 、 第 1 オペ ラ ン ド ベ ク タ 、 お よ び第 2 オペ ラ ン ド ベ ク タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-83 NEON と VFP プ ログ ラ ミ ング 5.11.2 VMUL{L}、 VMLA{L}、 VMLS{L} (ス カ ラ に よ る) VMUL (ス カ ラ に よ る ベ ク タ 乗算) は、 あ る ベ ク タ の各要素を ス カ ラ で乗算 し 、 その結果をデス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 VMLA (ベ ク タ 積和) は、 あ る ベ ク タ の各要素を ス カ ラ で乗算 し 、 その結果を デス テ ィ ネーシ ョ ンベ ク タ の対応す る 要素に累積 し ます。 VMLS (ベ ク タ 積差) は、 あ る ベ ク タ の各要素を ス カ ラ で乗算 し 、 その結果を デス テ ィ ネーシ ョ ンベ ク タ の対応す る 要素か ら 減算 し て、 最終的な結果をデ ス テ ィ ネーシ ョ ンベ ク タ に返 し ます。 構文 Vop{cond}.datatype {Qd}, Qn, Dm[x] Vop{cond}.datatype {Dd}, Dn, Dm[x] VopL{cond}.datatype Qd, Dn, Dm[x] 各項目には以下の意味があ り ます。 5-84 op 以下のいずれか を指定 し ます。 MUL 乗算 MLA 積和 MLS 積差 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype 以下のいずれか を指定 し ます。 I16, I32, F32 MUL、 MLA、 ま たは MLS の場合 S16, S32 MULL、 MLAL、 ま たは MLSL の場合 U16, U32 MULL, MLAL、 ま たは MLSL の場合 Qd, Qn ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と 第 1 オペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dn ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と 第 1 オ ペ ラ ン ド ベ ク タ を指定 し ます。 Qd, Dn Long 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と 第 1 オペ ラ ン ド ベ ク タ を指定 し ます。 Dm[x] 第 2 オペ ラ ン ド を保持す る ス カ ラ です。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.11.3 VQDMULL、 VQDMLAL、 VQDMLSL (ベ ク タ またはス カ ラ に よ る) ベ ク タ サチ ュ レー ト ダブル乗算命令は、 オペ ラ ン ド を乗算 し 、 その結果を 2 倍に し ます。 VQDMULL は、 結果をデス テ ィ ネーシ ョ ン レ ジ ス タ に返 し ます。 VQDMLAL は、 結果をデス テ ィ ネーシ ョ ン レ ジ ス タ の値に加算 し ます。 VQDMLSL は、 結果をデス テ ィ ネーシ ョ ン レ ジ ス タ の値か ら 減算 し ます。 オーバーフ ロ ー し た結果はサチ ュ レー ト さ れます。 サチ ュ レーシ ョ ン が発生 し た場合は、 ス テ ィ ッ キー QC フ ラ グ (FPSCR ビ ッ ト [27]) が設定 さ れます。 構文 VQDopL{cond}.datatype Qd, Dn, Dm VQDopL{cond}.datatype Qd, Dn, Dm[x] 各引数には以下の意味があ り ます。 ARM DUI 0204IJ op 以下のいずれか を指定 し ます。 MUL 乗算 MLA 積和 MLS 積差 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype S16 ま たは S32 を指定 し ます。 Qd, Dn デス テ ィ ネーシ ョ ンベ ク タ と 第 1 オペ ラ ン ド ベ ク タ を指定 し ま す。 Dm ベ ク タ に よ る 演算の第 2 オペ ラ ン ド を保持す る ベ ク タ です。 Dm[x] ス カ ラ に よ る 演算の第 2 オペ ラ ン ド を保持す る ス カ ラ です。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-85 NEON と VFP プ ログ ラ ミ ング 5.11.4 VQ{R}DMULH (ベ ク タ またはス カ ラ に よ る) ベ ク タ サチ ュ レー ト ダブル乗算命令は、 オペ ラ ン ド を乗算 し 、 その結果を 2 倍に し ます。 結果の上位半分 し か返 さ れ ません。 オーバーフ ロ ー し た結果はサチ ュ レー ト さ れ ます。 サチ ュ レーシ ョ ンが発生 し た場合は、 ス テ ィ ッ キー QC フ ラ グ (FPSCR ビ ッ ト [27]) が設定 さ れ ます。 構文 VQ{R}DMULH{cond}.datatype {Qd}, Qn, Qm VQ{R}DMULH{cond}.datatype {Dd}, Dn, Dm VQ{R}DMULH{cond}.datatype {Qd}, Qn, Dm[x] VQ{R}DMULH{cond}.datatype {Dd}, Dn, Dm[x] 各項目には以下の意味があ り ます。 5-86 R こ のパ ラ メ ー タ が指定 さ れてい る 場合、 結果は丸め ら れ ます。 指 定 さ れていない場合、 結果は切 り 捨て ら れ ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype S16 ま たは S32 を指定 し ます。 Qd, Qn ク ワ ッ ド ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と 第 1 オペ ラ ン ド ベ ク タ を指定 し ます。 Dd, Dn ダブル ワー ド 演算で使用す る デス テ ィ ネーシ ョ ンベ ク タ と 第 1 オ ペ ラ ン ド ベ ク タ を指定 し ます。 Qm ??? Dm ベ ク タ に よ る 演算の第 2 オペ ラ ン ド を保持す る ベ ク タ です。 Dm[x] ス カ ラ に よ る 演算の第 2 オペ ラ ン ド を保持す る ス カ ラ です。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.12 NEON 要素 と 構造体のロー ド / ス ト ア命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • • 「 イ ン タ ー リ ーブ」 「 ロ ー ド と ス ト ア命令、 要素 と 構造体の命令におけ る境界調整の制約」 (ページ 5-88) • 「VLDn お よ び VSTn (1 レーンへの 1 つの n 要素構造体)」 (ページ 5-89) こ れは、 ほ と ん どすべてのデー タ ア ク セ ス で使用 さ れ ます。 正規ベ ク タ を ロ ー ド で き ます (n = 1)。 5.12.1 • 「VLDn (全レーンへの 1 つの n 要素構造体)」 (ページ 5-91) • 「VLDn お よ び VSTn (複数の n 要素構造体)」 (ページ 5-93) イ ン タ ー リ ーブ こ のグループの命令の多 く は、 構造体を メ モ リ に保存す る と き に イ ン タ ー リ ーブ を可能に し 、 構造体を メ モ リ か ら ロ ー ド す る と き に イ ン タ ー リ ーブの 解除を可能に し ます。 図 5-8 に、 イ ン タ ー リ ーブの解除の例を示 し ます。 イ ン タ ー リ ーブは こ の逆のプ ロ セ ス です。 A[0].x A[0].y A[0].z A[1].x A[1].y A[1].z A[2].x A[2].y A[2].z A[3].x A[3].y X3 X2 X1 X0 D0 A[3].z Y3 Y2 Y1 Y0 D1 Z3 Z2 Z1 Z0 D2 図 5-8 3 要素構造体から な る配列のイ ン タ ー リ ーブの解除 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-87 NEON と VFP プ ログ ラ ミ ング 5.12.2 ロー ド と ス ト ア命令、 要素 と 構造体の命令における境界調整の制約 通常、 こ れ ら の命令を使用す る と 、 メ モ リ 整列の境界調整を指定で き ます。 命令で境界調整が指定 さ れていない場合、 境界調整の制約は、 次の よ う に A ビ ッ ト (CP15 レ ジ ス タ 1 ビ ッ ト [1]) に よ っ て制御 さ れます。 • A ビ ッ ト が 0 の場合、 境界調整の制約はあ り ません (ただ し 、 厳密に順 序を指定 さ れた メ モ リ やデバ イ ス メ モ リ な ど、 ア ク セ ス が整列要素であ る 場合を除 き ます。 こ の場合は予測 し ない結果が返 さ れ ます)。 • A ビ ッ ト が 1 の場合、 ア ク セ ス は整列要素であ る 必要があ り ます。 ア ド レ ス が正 し く 整列 さ れていない と 、 境界調整エ ラ ーが発生 し ます。 5-88 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.12.3 VLDn お よび VSTn (1 レ ーンへの 1 つの n 要素構造体) 1 レーンへの 1 つの n 要素構造体をベ ク タ ロ ー ド 。 1 つの n 要素構造体を メ モ リ か ら 1 つま たは複数の NEON レ ジ ス タ に ロ ー ド し ます。 ロ ー ド さ れなか っ た レ ジ ス タ の要素は変更 さ れません。 1 レーンへの 1 つの n 要素構造体をベ ク タ ス ト ア。 1 つの n 要素構造体を 1 つ ま たは複数の NEON レ ジ ス タ か ら メ モ リ に ス ト ア し ます。 構文 Vopn{cond}.datatype list, [Rn{@align}]{!} Vopn{cond}.datatype list, [Rn{@align}], Rm 各項目には以下の意味があ り ます。 ARM DUI 0204IJ op LD ま たは ST を指定 し ます。 n 1、 2、 3、 ま たは 4 のいずれかに し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype 表 5-12 (ページ 5-90) を参照 し て下 さ い。 list NEON レ ジ ス タ リ ス ト を指定 し ます。 オプシ ョ ン については、 表 5-12 (ページ 5-90) を参照 し て下 さ い。 Rn ベース ア ド レ ス を保持す る ARM レ ジ ス タ です。 Rn を r15 にす る こ と はで き ません。 align オプシ ョ ン の境界調整を指定 し ます。 オプシ ョ ン については、 表 5-12 (ページ 5-90) を参照 し て下 さ い。 ! ! が指定 さ れてい る 場合、 Rn は (Rn + 命令に よ っ て転送 さ れ る バ イ ト 数) に更新 さ れ ます。 更新は、 すべての ロ ー ド ま たは ス ト ア が実行 さ れた後に行われ ます。 Rm ベース ア ド レ ス か ら のオ フ セ ッ ト を保持す る ARM レ ジ ス タ で す。 Rm が指定 さ れてい る 場合、 メ モ リ にア ク セ スす る ためにア ド レ ス が使用 さ れた 後 で、 Rn は (Rn + Rm) に更新 さ れ ます。 Rm に r13 と r15 は指定で き ません。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-89 NEON と VFP プ ログ ラ ミ ング 表 5-12 パラ メ ー タ の有効な組み合わせ n datatype list a align b 境界調整 1 8 {Dd[x]} - 標準のみ 16 {Dd[x]} @16 2 バイ ト 32 {Dd[x]} @32 4 バイ ト 8 {Dd[x], D(d+1)[x]} @16 2 バイ ト 16 {Dd[x], D(d+1)[x]} @32 4 バイ ト {Dd[x], D(d+2)[x]} @32 4 バイ ト {Dd[x], D(d+1)[x]} @64 8 バイ ト {Dd[x], D(d+2)[x]} @64 8 バイ ト 8 {Dd[x], D(d+1)[x], D(d+2)[x]} - 標準のみ 16 ま たは {Dd[x], D(d+1)[x], D(d+2)[x]} - 標準のみ {Dd[x], D(d+2)[x], D(d+4)[x]} - 標準のみ 8 {Dd[x], D(d+1)[x], D(d+2)[x], D(d+3)[x]} @32 4 バイ ト 16 {Dd[x], D(d+1)[x], D(d+2)[x], D(d+3)[x]} @64 8 バイ ト {Dd[x], D(d+2)[x], D(d+4)[x], D(d+6)[x]} @64 8 バイ ト {Dd[x], D(d+1)[x], D(d+2)[x], D(d+3)[x]} @64 ま たは 8 バ イ ト ま たは 16 バ イ ト 2 32 3 32 4 32 @128 {Dd[x], D(d+2)[x], D(d+4)[x], D(d+6)[x]} @64 ま たは @128 8 バ イ ト ま たは 16 バ イ ト a. 表内のすべての レ ジ ス タ は D0 ~ D31 の範囲内にあ る 必要があ り ます。 b. Align は省略で き ます。 省略 し た場合は、 標準の境界調整ルールが適用 さ れます。 「 ロ ー ド と ス ト ア命令、 要素 と 構造体の命令におけ る 境界調整の制約」 (ページ 5-88) を参照 し て下 さ い。 5-90 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.12.4 VLDn (全レ ーンへの 1 つの n 要素構造体) 全レーンへの 1 つの n 要素構造体をベ ク タ ロ ー ド 。 1 つの n 要素構造体の複数 の コ ピーを メ モ リ か ら 1 つま たは複数の NEON レ ジ ス タ に ロ ー ド し ます。 構文 VLDn{cond}.datatype list, [Rn{@align}]{!} VLDn{cond}.datatype list, [Rn{@align}], Rm 各引数には以下の意味があ り ます。 ARM DUI 0204IJ n 1、 2、 3、 ま たは 4 のいずれかに し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype 表 5-13 (ページ 5-92) を参照 し て下 さ い。 list NEON レ ジ ス タ リ ス ト を指定 し ます。 オプシ ョ ン については、 表 5-13 (ページ 5-92) を参照 し て下 さ い。 Rn ベース ア ド レ ス を保持す る ARM レ ジ ス タ です。 Rn を r15 にす る こ と はで き ません。 align オプシ ョ ン の境界調整を指定 し ます。 オプシ ョ ン については、 表 5-13 (ページ 5-92) を参照 し て下 さ い。 ! ! が指定 さ れてい る 場合、 Rn は (Rn + 命令に よ っ て転送 さ れ る バ イ ト 数) に更新 さ れ ます。 更新は、 すべての ロ ー ド ま たは ス ト ア が実行 さ れた後に行われ ます。 Rm ベース ア ド レ ス か ら のオ フ セ ッ ト を保持す る ARM レ ジ ス タ で す。 Rm が指定 さ れてい る 場合、 メ モ リ にア ク セ スす る ためにア ド レ ス が使用 さ れた 後 で、 Rn は (Rn + Rm) に更新 さ れ ます。 Rm に r13 と r15 は指定で き ません。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-91 NEON と VFP プ ログ ラ ミ ング 表 5-13 パラ メ ー タ の有効な組み合わせ n datatype list a align b 境界調整 1 8 {Dd[]} - 標準のみ {Dd[],D(d+1)[]} - 標準のみ {Dd[]} @16 2 バイ ト {Dd[],D(d+1)[]} @16 2 バイ ト {Dd[]} @32 4 バイ ト {Dd[],D(d+1)[]} @32 4 バイ ト {Dd[], D(d+1)[]} @8 バイ ト {Dd[], D(d+2)[]} @8 バイ ト {Dd[], D(d+1)[]} @16 2 バイ ト {Dd[], D(d+2)[]} @16 2 バイ ト {Dd[], D(d+1)[]} @32 4 バイ ト {Dd[], D(d+2)[]} @32 4 バイ ト {Dd[], D(d+1)[], D(d+2)[]} - 標準のみ {Dd[], D(d+2)[], D(d+4)[]} - 標準のみ {Dd[], D(d+1)[], D(d+2)[], D(d+3)[]} @32 4 バイ ト {Dd[], D(d+2)[], D(d+4)[], D(d+6)[]} @32 4 バイ ト {Dd[], D(d+1)[], D(d+2)[], D(d+3)[]} @64 8 バイ ト {Dd[], D(d+2)[], D(d+4)[], D(d+6)[]} @64 8 バイ ト {Dd[], D(d+1)[], D(d+2)[], D(d+3)[]} @64 ま たは 8 バ イ ト ま たは 16 バ イ ト 16 32 2 8 16 32 3 8、 16、 ま たは 32 4 8 16 32 @128 {Dd[], D(d+2)[], D(d+4)[], D(d+6)[]} @64 ま たは @128 8 バ イ ト ま たは 16 バ イ ト a. 表内のすべての レ ジ ス タ は D0 ~ D31 の範囲内にあ る 必要があ り ます。 b. Align は省略で き ます。 省略 し た場合は、 標準の境界調整ルールが適用 さ れます。 「 ロ ー ド と ス ト ア命令、 要素 と 構造体の命令におけ る 境界調整の制約」 (ページ 5-88) を参照 し て下 さ い。 5-92 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.12.5 VLDn お よび VSTn (複数の n 要素構造体) 複数の n 要素構造体をベ ク タ ロ ー ド 。 複数の n 要素構造体を メ モ リ か ら 1 つま たは複数の NEON レ ジ ス タ に ロ ー ド し 、 イ ン タ ー リ ーブ を解除 し ます (n == 1 の場合を除 き ます)。 各レ ジ ス タ のすべての要素が ロ ー ド さ れます。 複数の n 要素構造体をベ ク タ ス ト ア。 複数の n 要素構造体を メ モ リ か ら 1 つま たは複数の NEON レ ジ ス タ に ス ト ア し 、 イ ン タ ー リ ーブ し ます (n == 1 の場 合を除 き ます)。 各レ ジ ス タ のすべての要素が ス ト ア さ れ ます。 構文 Vopn{cond}.datatype list, [Rn{@align}]{!} Vopn{cond}.datatype list, [Rn{@align}], Rm 各引数には以下の意味があ り ます。 ARM DUI 0204IJ op LD ま たは ST を指定 し ます。 n 1、 2、 3、 ま たは 4 のいずれかに し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype オプシ ョ ン については、 表 5-14 (ページ 5-94) を参照 し て下 さ い。 list NEON レ ジ ス タ リ ス ト を指定 し ます。 オプシ ョ ン については、 表 5-14 (ページ 5-94) を参照 し て下 さ い。 Rn ベース ア ド レ ス を保持す る ARM レ ジ ス タ です。 Rn を r15 にす る こ と はで き ません。 align オプシ ョ ン の境界調整を指定 し ます。 オプシ ョ ン については、 表 5-14 (ページ 5-94) を参照 し て下 さ い。 ! ! が指定 さ れてい る 場合、 Rn は (Rn + 命令に よ っ て転送 さ れ る バ イ ト 数) に更新 さ れ ます。 更新は、 すべての ロ ー ド ま たは ス ト ア が実行 さ れた後に行われ ます。 Rm ベース ア ド レ ス か ら のオ フ セ ッ ト を保持す る ARM レ ジ ス タ で す。 Rm が指定 さ れてい る 場合、 メ モ リ にア ク セ スす る ためにア ド レ ス が使用 さ れた 後 で、 Rn は (Rn + Rm) に更新 さ れ ます。 Rm に r13 と r15 は指定で き ません。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-93 NEON と VFP プ ログ ラ ミ ング 表 5-14 パラ メ ー タ の有効な組み合わせ n datatype list a align b 境界調整 1 8、 16、 32、 {Dd} @64 8 バイ ト {Dd, D(d+1)} @64 ま たは @128 8 バ イ ト ま たは 16 バ イ ト {Dd, D(d+1), D(d+2)} @64 8 バイ ト {Dd, D(d+1), D(d+2), D(d+3)} @64、 @128、 ま た 8 バ イ ト 、 16 バ イ ト 、 ま たは 32 バ イ ト ま たは 64 は @256 2 8、 16、 ま た {Dd, D(d+1)} @64, @128 8 バ イ ト ま たは 16 バ イ ト {Dd, D(d+2)} @64, @128 8 バ イ ト ま たは 16 バ イ ト {Dd, D(d+1), D(d+2), D(d+3)} @64、 @128、 ま た は @256 8 バ イ ト 、 16 バ イ ト 、 ま たは 32 バ イ ト {Dd, D(d+1), D(d+2)} @64 8 バイ ト {Dd, D(d+2), D(d+4)} @64 8 バイ ト {Dd, D(d+1), D(d+2), D(d+3)} @64、 @128、 ま た 8 バ イ ト 、 16 バ イ ト 、 ま たは 32 バ イ ト は 32 3 8、 16、 ま た は 32 4 8、 16、 ま た は 32 は @256 {Dd, D(d+2), D(d+4), D(d+6)} @64、 @128、 ま た は @256 8 バ イ ト 、 16 バ イ ト 、 ま たは 32 バ イ ト a. 表内のすべての レ ジ ス タ は D0 ~ D31 の範囲内にあ る 必要があ り ます。 b. Align は省略で き ます。 省略 し た場合は、 標準の境界調整ルールが適用 さ れます。 「 ロ ー ド と ス ト ア命令、 要素 と 構造体の命令におけ る 境界調整の制約」 (ページ 5-88) を参照 し て下 さ い。 5-94 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.13 NEON 疑似命令および VFP 疑似命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「VLDR 疑似命令」 (ページ 5-96) (NEON お よ び VFP) • 「VLDR と VSTR (ポ ス ト イ ン ク リ メ ン ト と プ レデ ク リ メ ン ト )」 (ページ 5-97) (NEON お よ び VFP) ARM DUI 0204IJ • 「VMOV2」 (ページ 5-99) (NEON のみ) • 「VAND お よ び VORN ( イ ミ デ ィ エー ト )」 (ページ 5-100) (NEON のみ) • 「VACLE お よ び VACLT」 (ページ 5-102) (NEON のみ) • 「VCLE お よ び VCLT」 (ページ 5-103) (NEON のみ) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-95 NEON と VFP プ ログ ラ ミ ング 5.13.1 VLDR 疑似命令 VLDR 疑似命令は、 定数値を 64 ビ ッ ト の NEON ベ ク タ のすべての要素、 ま たは VFP 単精度 / 倍精度レ ジ ス タ に ロ ー ド し ます。 注 こ のセ ク シ ョ ン では、 VLDR 疑似命令についてのみ説明 し ます。 VLDR 命令につい ては、 「VLDR お よ び VSTR」 (ページ 5-25) を参照 し て下 さ い。 構文 VLDR{cond}.datatype Dd,=constant VLDR{cond}.datatype Sd,=constant 各引数には以下の意味があ り ます。 datatype 以下のいずれか を指定 し ます。 In NEON のみ Sn NEON のみ Un NEON のみ F32 NEON、 VFP F64 VFP のみ n 8、 16、 32、 ま たは 64 のいずれかに し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 Dd ??? Sd ロ ー ド 先の拡張レ ジ ス タ を指定 し ます。 constant datatype に対 し て適切な型の定数を指定 し ます。 使用法 レ ジ ス タ に定数を直接生成で き る 命令 (例えば VMOV) が使用可能な場合は、 アセ ン ブ ラ はそれを使用 し ます。 それ以外の場合は、 定数を含むダブル ワー ド の リ テ ラ ルプールエ ン ト リ を生成 し 、 VLDR 命令を使用 し て定数を ロ ー ド し ます。 5-96 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.13.2 VLDR と VSTR (ポス ト イ ン ク リ メ ン ト と プ レ デ ク リ メ ン ト ) ポ ス ト イ ン ク リ メ ン ト と プ レデ ク リ メ ン ト を行 う 拡張レ ジ ス タ を ロ ー ド ま た は ス ト アす る 擬似命令。 注 ポ ス ト イ ン ク リ メ ン ト と プ レデ ク リ メ ン ト のない VLDR 命令 と VSTR 命令につい ては、 「VLDR お よ び VSTR」 (ページ 5-25) を参照 し て下 さ い。 構文 op{cond}{.size} Fd, [Rn], #offset ; post-increment op{cond}{.size} Fd, [Rn, #-offset]! ; pre-decrement 各項目には以下の意味があ り ます。 以下を指定 し ます。 • VLDR - メ モ リ か ら 拡張レ ジ ス タ を ロ ー ド し ます。 op • ARM DUI 0204IJ VSTR - 拡張レ ジ ス タ の内容を メ モ リ に ス ト ア し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 size 任意に指定で き る デー タ サ イ ズ指定子です。 Fd が単精度 VFP レ ジ ス タ の場合は 32、 Fd が倍精度レ ジ ス タ の場合は 64 に し ます。 Fd ロ ー ド ま たは保存す る 拡張レ ジ ス タ を指定 し ます。 NEON 命令の 場合は、 倍精度 (Dd) レ ジ ス タ であ る 必要があ り ます。 VFP 命令 の場合は、 倍精度 (Dd) レ ジ ス タ か単精度 (Sd) レ ジ ス タ のいず れかであ る 必要があ り ます。 Rn 転送用のベース ア ド レ ス を保持す る ARM レ ジ ス タ を指定 し ま す。 offset アセ ン ブ リ 時に数値定数が求め ら れ る 数値式であ る 必要があ り ます。 値は Fd が単精度 VFP レ ジ ス タ の場合は 4、Fd が倍精度レ ジ ス タ の場合は 8 に し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-97 NEON と VFP プ ログ ラ ミ ング 使用法 ポ ス ト イ ン ク リ メ ン ト 命令は、 転送後に レ ジ ス タ 内のベース ア ド レ ス を オ フ セ ッ ト 値の分だけ イ ン ク リ メ ン ト し ます。 プ レデ ク リ メ ン ト 命令は、 レ ジ ス タ 内のベース ア ド レ ス を オ フ セ ッ ト 値の分だけデ ク リ メ ン ト し てか ら 、 レ ジ ス タ 内の新 し いア ド レ ス を使用 し て転送を実行 し ます。 こ れ ら の擬似命令は、 VLDM 命令ま たは VSTM 命令にアセ ン ブル さ れます (「VLDM、 VSTM、 VPOP、 VPUSH」 (ページ 5-27) を参照)。 5-98 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.13.3 VMOV2 VMOV2 疑似命令は、 リ テ ラ ルプールか ら 値を ロ ー ド せずに、 定数を生成 し 、 NEON ベ ク タ のすべての要素に配置 し ます。 こ の疑似命令は、 常に 2 つの命令 にアセ ン ブル さ れ ます。 VMOV2 は、 16 ビ ッ ト の任意の定数、 お よ び範囲が制限 さ れてい る 32 ビ ッ ト と 64 ビ ッ ト の定数を生成で き ます。 構文 VMOV2{cond}.datatype Qd, #constant VMOV2{cond}.datatype Dd, #constant 各引数には以下の意味があ り ます。 datatype 以下のいずれか を指定 し ます。 • I8、 I16、 I32、 ま たは I64 • S8、 S16、 S32、 ま たは S64 • U8、 U16、 U32、 ま たは U64 • F32 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 Qd ??? Dd ロ ー ド 先の拡張レ ジ ス タ を指定 し ます。 constant datatype に対 し て適切な型の定数を指定 し ます。 使用法 VMOV2 は通常、 VMOV 命令、 ま たは VMVN 命令にアセ ン ブル さ れてか ら 、 VBIC 命令、 ま たは VORR 命令が続 き ます。 詳細については、 「VMOV、 VMVN ( イ ミ デ ィ エー ト )」 (ページ 5-49) お よ び 「VBIC お よ び VORR ( イ ミ デ ィ エー ト )」 (ページ 5-35) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-99 NEON と VFP プ ログ ラ ミ ング 5.13.4 VAND お よび VORN (イ ミ デ ィ エー ト ) VAND (ビ ッ ト 単位論理積 イ ミ デ ィ エー ト ) は、 デス テ ィ ネーシ ョ ンベ ク タ の 各要素を取得 し 、 即値を使用 し て ビ ッ ト 単位論理積を実行 し 、 デス テ ィ ネー シ ョ ンベ ク タ に結果を返 し ます。 VORN (ビ ッ ト 単位否定論理和 イ ミ デ ィ エー ト ) は、 デス テ ィ ネーシ ョ ンベ ク タ の各要素を取得 し 、 イ ミ デ ィ エー ト 定数を使用 し て ビ ッ ト 単位論理和補数 を求め、 デス テ ィ ネーシ ョ ンベ ク タ に結果を返 し ます。 注 逆アセ ン ブル時に、 こ れ ら の疑似命令は、 相補 イ ミ デ ィ エー ト 定数を使用 し て対応す る VBIC 命令 と VORR 命令に逆アセ ン ブル さ れ ます。 構文 Vop{cond}.datatype Qd, #imm Vop{cond}.datatype Dd, #imm 各引数には以下の意味があ り ます。 op VAND ま たは VORN を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype I8、 I16、 I32、 ま たは I64 のいずれか を指定 し ます。 Qd ??? Dd 結果を保持す る NEON レ ジ ス タ です。 imm イ ミ デ ィ エー ト 定数です。 イ ミ デ ィ エー ト 定数 datatype が I16 の場合、 即値は以下のいずれかの形式を取 る 必要があ り ます。 • • 0xFFXY 0xXYFF datatype が I32 の場合、 イ ミ デ ィ エー ト 定数は以下のいずれかの形式を取 る 必 要があ り ます。 • 0xFFFFFFXY • 0xFFFFXYFF 5-100 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング • • 0xFFXYFFFF 0xXYFFFFFF 詳細については、 「VBIC お よ び VORR ( イ ミ デ ィ エー ト )」 (ページ 5-35) を 参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-101 NEON と VFP プ ログ ラ ミ ング 5.13.5 VACLE お よび VACLT ベ ク タ 絶対値比較は、 ベ ク タ の各要素の絶対値を取得 し 、 2 番目のベ ク タ の 対応す る 要素の絶対値 と 比較 し ます。 条件が True の場合、 デス テ ィ ネーシ ョ ンベ ク タ の対応す る 要素はすべて 1 に設定 さ れ ます。 それ以外の場合は、 すべ て 0 に設定 さ れ ます。 注 逆アセ ン ブル時に、 こ れ ら の疑似命令は、 反転 し たオペ ラ ン ド を使用 し て対 応す る VACGE 命令 と VACGT 命令に逆アセ ン ブル さ れ ます。 構文 VACop{cond}.datatype {Qd}, Qn, Qm VACop{cond}.datatype {Dd}, Dn, Dm 各引数には以下の意味があ り ます。 op 以下のいずれか を指定 し ます。 LE 以下 (絶対値) LT 未満 (絶対値) cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 datatype F32 にす る 必要があ り ます。 Qd ??? Dd 結果を保持す る NEON レ ジ ス タ です。 結果の datatype は I32 です。 5-102 Qn ??? Dn 第 1 オペ ラ ン ド を保持す る NEON レ ジ ス タ です。 Qm ??? Dm 第 2 オペ ラ ン ド を保持す る NEON レ ジ ス タ です。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.13.6 VCLE および VCLT ベ ク タ 比較はベ ク タ の各要素の値を取得 し 、 2 番目のベ ク タ の対応す る 要素 の値ま たは 0 と 比較 し ます。 条件が True の場合、 デス テ ィ ネーシ ョ ンベ ク タ の対応す る 要素はすべて 1 に設定 さ れ ます。 それ以外の場合は、 すべて 0 に設 定 さ れ ます。 注 逆アセ ン ブル時に、 こ れ ら の疑似命令は、 反転 し たオペ ラ ン ド を使用 し て対 応す る VCGE 命令 と VCGT 命令に逆アセ ン ブル さ れます。 構文 VCop{cond}.datatype {Qd}, Qn, Qm VCop{cond}.datatype {Dd}, Dn, Dm 各引数には以下の意味があ り ます。 op 以下のいずれか を指定 し ます。 LE 小 さ いか等 し い LT 未満 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 datatype S8、 S16、 S32、 U8、 U16、 U32、 ま たは F32 のいずれかに し ます。 Qd ??? Dd 結果を保持す る NEON レ ジ ス タ です。 結果の datatype は次の よ う にな り ます。 • オペ ラ ン ド のデー タ 型が I32、 S32、 U32、 ま たは F32 の場合は I32 ARM DUI 0204IJ • オペ ラ ン ド のデー タ 型が I16、 S16、 ま たは U16 の場合は I16 • オペ ラ ン ド のデー タ 型が I8、 S8、 ま たは U8. の場合は I8 Qn ??? Dn 第 1 オペ ラ ン ド を保持す る NEON レ ジ ス タ です。 Qm ??? Dm 第 2 オペ ラ ン ド を保持す る NEON レ ジ ス タ です。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-103 NEON と VFP プ ログ ラ ミ ング 5.14 NEON / VFP シス テムレ ジス タ NEON と VFP のあ ら ゆ る 実装で、 以下の 3 つの NEON/VFP シ ス テ ム レ ジ ス タ にア ク セ ス で き ます。 「FPSCR : 浮動小数点ス テー タ ス / 制御レ ジ ス タ 」 • • • • 「FPEXC : 浮動小数点例外レ ジ ス タ 」 (ページ 5-107) 「FPSID : 浮動小数点シ ス テ ム ID レ ジ ス タ 」 (ページ 5-107) 「NEON / VFP シ ス テ ム レ ジ ス タ の各ビ ッ ト の変更」 (ページ 5-108) NEON ま たは VFP の一部の実装では、 追加の レ ジ ス タ を指定す る こ と がで き ます (使用す る VFP コ プ ロ セ ッ サのテ ク ニ カル リ フ ァ レ ン ス マニ ュ アルを参 照 し て下 さ い)。 5.14.1 FPSCR : 浮動小数点ス テー タ ス / 制御レ ジ ス タ FPSCR には、 ユーザ レベルの NEON/VFP ス テー タ ス / 制御ビ ッ ト がすべて保持 さ れてい ます。 NEON はビ ッ ト [31:27] のみを使用 し ます。 ビ ッ ト は以下の よ う に使用 さ れ ます。 ビ ッ ト [31:28] N、 Z、 C、 お よ び V の各フ ラ グです。 こ れ ら は NEON / VFP ス テー タ ス フ ラ グです。 こ れ ら の フ ラ グ を CPSR の ス テー タ ス フ ラ グに コ ピーす る ま では、 こ れ ら を使用 し て条件実行を制御す る こ と はで き ません (「条件 コー ド 」 (ページ 5-13) を参照)。 ビ ッ ト [27] QC (累積サチ ュ レー ト ) フ ラ グです。 NEON サチ ュ レー ト 命令 でサチ ュ レーシ ョ ン が発生 し た場合に設定 さ れ ます。 ビ ッ ト [25] デフ ォ ル ト の NaN (DN) モー ド 制御ビ ッ ト です。 0 1 無効。 NaN オペ ラ ン ド は浮動小数点演算の出力に ま で 伝播 し ます。 有効。 NaN が関係す る 演算がデフ ォ ル ト の NaN を返 し ます。 注 NEON は、 こ の ビ ッ ト に関係な く デフ ォ ル ト の NaN が有効に さ れた設定を常に使用 し ます。 ビ ッ ト [24] ゼ ロ ク リ アモー ド 制御ビ ッ ト です。 0 ゼ ロ ク リ アモー ド は無効にな り ます。 1 ゼ ロ ク リ アモー ド は有効にな り ます。 5-104 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 使用す る ハー ド ウ ェ ア と ソ フ ト ウ ェ アに よ っ ては、 ゼ ロ ク リ ア モー ド を使用す る と 、 範囲情報が失われ る 代わ り にパフ ォ ーマ ン ス が向上 し ます (「ゼ ロ ク リ アモー ド 」 (ページ 5-109) を参 照)。 注 NEON は、 こ の ビ ッ ト に関係な く ゼ ロ ク リ アモー ド を常に使用 し ます。 IEEE 754 と の互換性が必要な場合、 ゼ ロ ク リ アモー ド を使用 し ないで下 さ い。 ビ ッ ト [23:22] 丸めモー ド を以下の よ う に制御 し ます。 0b00 近似値への丸め (RN) モー ド 0b01 0b10 0b11 正の無限大方向への丸め (RP) モー ド 負の無限大方向への丸め (RM) モー ド ゼ ロ 方向への丸め (RZ) モー ド 注 NEON は、 こ の ビ ッ ト に関係な く 近似値への丸めモー ド を常に 使用 し ます。 ビ ッ ト [21:20] STRIDE は、 ベ ク タ 内で連続す る 値の間の距離です (「ベ ク タ 」 (ページ 5-125) を参照)。 ス ト ラ イ ド は以下の よ う に制御 さ れま す。 STRIDE = 1 0b00 0b11 STRIDE = 2 ビ ッ ト [18:16] LEN は、 各ベ ク タ に よ っ て使用 さ れ る レ ジ ス タ の数です (「ベ ク タ 」 (ページ 5-125) を参照)。 1 + ビ ッ ト [18:16] の値にな り ます。 0b000 LEN = 1 ... 0b111 LEN = 8 ビ ッ ト [15, 12:8] 例外の ト ラ ッ プ イ ネーブルビ ッ ト です。 IDE 入力非正規例外 イ ネーブル IXE 不正確例外 イ ネーブル UFE ア ン ダーフ ロ ー例外 イ ネーブル OFE オーバーフ ロ ー例外 イ ネーブル DZE ゼ ロ 除算例外 イ ネーブル ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-105 NEON と VFP プ ログ ラ ミ ング IOE 無効演算例外 イ ネーブル 本書では、 浮動小数点例外 ト ラ ッ プの使用について説明 し ませ ん。 詳細については、 使用 し てい る VFP コ プ ロ セ ッ サのテ ク ニ カ ル リ フ ァ レ ン ス マニ ュ アルを参照 し て下 さ い。 ビ ッ ト [7, 4:0] 累積例外ビ ッ ト です。 IDC 入力非正規例外 IXC 不正確例外 UFC ア ン ダーフ ロ ー例外 OFC オーバーフ ロ ー例外 DZC ゼ ロ 除算例外 IOC 無効演算例外 累積例外ビ ッ ト は、 対応す る 例外が発生す る と 設定 さ れ ます。 こ れ ら の例外ビ ッ ト は、 FPSCR への直接の書 き 込みに よ っ て ク リ ア さ れ る ま で、 設定 さ れた ま ま と な り ます。 その他すべての ビ ッ ト 基本的な NEON / VFP 仕様では使用 さ れ ません。 こ れ ら の ビ ッ ト は特定の実装で使用で き ます (使用 し てい る VFP コ プ ロ セ ッ サのテ ク ニ カル リ フ ァ レ ン ス マニ ュ アルを参照 し て下 さ い)。 特定の実装で使用 さ れてい る 場合を除 き 、 こ れ ら のビ ッ ト を変更 し ないで下 さ い。 他のビ ッ ト に影響を及ぼす こ と な く 一部の ビ ッ ト だけ を変更す る には、 読み 出 し - 変更 - 書 き 込みプ ロ シージ ャ を使用 し ます (「NEON / VFP シ ス テ ム レ ジ ス タ の各ビ ッ ト の変更」 (ページ 5-108) を参照)。 注 ベ ク タ モー ド の使用は廃止 さ れ る 予定です。 LEN と STRIDE を 1 に設定 し ます。 5-106 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.14.2 FPEXC : 浮動小数点例外レ ジ ス タ FPEXC には、 特権モー ド でのみア ク セ ス で き ます。 FPEXC には以下のビ ッ ト が 保持 さ れ ます。 ビ ッ ト [31] EX ビ ッ ト です。 NEON / VFP のあ ら ゆ る 実装で読み出す こ と がで き ます。 一部の実装では、 こ のビ ッ ト への書 き 込みが可能な場合 も あ り ます。 値が 0 の場合、 NEON/VFP シ ス テ ムは、 汎用レ ジ ス タ の内容に FPSCR お よ び FPEXC を加え た状態にな り ます。 値が 1 の場合は、 状態を保存す る には実装固有の情報が必要 と な り ます (使用 し てい る VFP コ プ ロ セ ッ サのテ ク ニ カル リ フ ァ レ ン ス マニ ュ アルを参照 し て下 さ い)。 ビ ッ ト [30] EN ビ ッ ト です。 NEON / VFP のあ ら ゆ る 実装で読み出 し と 書 き 込 みが可能です。 値が 1 で、 NEON と VFP が存在す る 場合、 こ れ ら は有効にな り 、 正常に動作 し ます。 値が 0 の場合、 NEON と VFP は無効にな り ます。 無効にな っ てい る 場合、 FPSID レ ジ ス タ ま たは FPEXC レ ジ ス タ の読み出 し や書 き 込 みを行 う こ と はで き ますが、 他の NEON / VFP 命令は未定義命令 と し て処理 さ れます。 ビ ッ ト [29:0] VFP の特定の実装で使用 さ れ る 場合があ り ます。 本章で説明す る すべての VFP 機能は、 こ れ ら の ビ ッ ト にア ク セ ス し な く て も 使用で き ます。 特定の実装で使用 さ れてい る 場合を除 き 、 こ れ ら の ビ ッ ト を変 更 し ないで下 さ い (使用 し てい る VFP コ プ ロ セ ッ サのテ ク ニ カ ル リ フ ァ レ ン ス マニ ュ アルを参照 し て下 さ い)。 他の ビ ッ ト に影響を及ぼす こ と な く 一部の ビ ッ ト だけ を変更す る には、 読み 出 し - 変更 - 書 き 込みプ ロ シージ ャ を使用 し ます (「NEON / VFP シ ス テ ム レ ジ ス タ の各ビ ッ ト の変更」 (ページ 5-108) を参照)。 5.14.3 FPSID : 浮動小数点シ ス テム ID レ ジ ス タ FPSID は、 読み出 し 専用の レ ジ ス タ です。 こ の レ ジ ス タ を読み出す と 、 使用 し てい る プ ロ グ ラ ムが動作中の NEON / VFP アーキ テ ク チ ャ の実装を確認で き ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-107 NEON と VFP プ ログ ラ ミ ング 5.14.4 NEON / VFP シ ス テムレ ジ ス タ の各ビ ッ ト の変更 他のビ ッ ト に影響を及ぼす こ と な く NEON / VFP シ ス テ ム レ ジ ス タ の一部の ビ ッ ト だけ を変更す る には、 以下の例に示す よ う な読み出 し - 変更 - 書 き 込み プ ロ シージ ャ を使用 し ます。 VMRS BIC ORR VMSR r10,FPSCR r10,r10,#0x00370000 r10,r10,#0x00030000 FPSCR,r10 ; ; ; ; copy FPSCR into r10 clears STRIDE and LEN sets STRIDE = 1, LEN = 4 copy r10 back into FPSCR 詳細については、 「VMRS お よ び VMSR」 (ページ 5-32) を参照 し て下 さ い。 5-108 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.15 ゼロ ク リ ア モー ド VFP の一部の実装では、 非正規化数を処理す る ためのサポー ト コ ー ド が使用 さ れ ます。 こ れ ら のシ ス テ ム では、 非正規化数を計算す る 際のパフ ォ ーマ ン ス は、 正規計算を行 う 場合 よ り 大 き く 低下 し ます。 ゼ ロ フ ラ ッ シ ュ モー ド では、 非正規化数が 0 に置換 さ れます。 こ の処理は IEEE 754 で定義 さ れてい る 演算に準拠 し てい ませんが、 状況に よ っ てはパ フ ォ ーマ ン ス を著 し く 向上 さ せ る こ と がで き ます。 NEON と VFPv3 のゼ ロ ク リ アでは符号ビ ッ ト が維持 さ れ、 VFPv2 のゼ ロ ク リ アでは +0 に ク リ ア さ れ ます。 NEON では、 ゼ ロ ク リ アモー ド を常に使用 し ます。 5.15.1 ゼロ ク リ ア モー ド を いつ使用すべきか 以下の条件がすべて該当す る 場合は、 ゼ ロ ク リ アモー ド を選択 し て下 さ い。 • IEEE 754 への準拠がシ ス テ ム要件ではない。 • 使用 し てい る アルゴ リ ズ ム に よ っ て非正規化数が生成 さ れ る 場合があ る。 • 使用 し てい る シ ス テ ム で非正規化数を処理す る サポー ト コ ー ド が使用 さ れてい る 。 • 使用 し てい る アルゴ リ ズ ム が保存 さ れ る 非正規化数の正確 さ に依存 し な い。 • 非正規化数を 0 に置換 し た結果、 使用 し てい る アルゴ リ ズ ム で例外が頻 繁に生成 さ れない コ ー ド の各部で要件が異な る 場合は、 ゼ ロ ク リ アモー ド と 標準モー ド を いつ で も 切 り 替え る こ と がで き ます。 モー ド を切 り 替え て も 、 レ ジ ス タ に既に格 納 さ れてい る 数値は影響を受け ません。 5.15.2 ゼロ ク リ ア モー ド の使用に よ る影響 一部の例外を除 き (「ゼ ロ ク リ アモー ド の影響を受けない演算」 (ページ 5-110) を参照)、 ゼ ロ ク リ アモー ド を使用す る と 、 浮動小数点演算に以下の よ う な影響があ り ます。 • ARM DUI 0204IJ 非正規化数が浮動小数点演算への入力 と し て使用 さ れ る と き 、 こ の非正 規化数は 0 と し て処理 さ れます。 ソ ース レ ジ ス タ は変更 さ れません。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-109 NEON と VFP プ ログ ラ ミ ング • 単精度浮動小数点演算の丸め前の結果が –2–126 ~ +2–126 の範囲にあ る 場 合、 こ の結果は 0 に置換 さ れます。 • 倍精度浮動小数点演算の丸め前の結果が –2–1022 ~ +2–1022 の範囲にあ る 場合、 こ の結果は 0 に置換 さ れ ます。 非正規化数がオペ ラ ン ド と し て使用 さ れ る と 不正確例外が発生す る か、 結果 がゼ ロ に ク リ ア さ れます。 ア ン ダーフ ロ ー例外はゼ ロ ク リ アモー ド では発生 し ません。 5.15.3 ゼロ ク リ ア モー ド の影響を受けない演算 以下の NEON 演算 と VFP 演算は、 ゼ ロ ク リ アモー ド において も 結果を ゼ ロ に ク リ アす る こ と な く 非正規化数に対 し て実行で き ます。 5-110 • コ ピー、 絶対値、 お よ び否定 (「VMOV、 VMVN (レ ジ ス タ )」 (ページ 5-38) , 「VABS、 VNEG、 VSQRT」 (ページ 5-112) お よ び 「V{Q}ABS お よ び V{Q}NEG」 (ページ 5-67) を参照)。 • 複製 (「VDUP」 (ページ 5-47) を参照)。 • ス ワ ッ プ (「VSWP」 (ページ 5-53) を参照)。 • ロ ー ド お よ びス ト ア (「VLDR お よ び VSTR」 (ページ 5-25) を参照)。 • 多重 ロ ー ド お よ び多重ス ト ア (「VLDM、 VSTM、 VPOP、 VPUSH」 (ペー ジ 5-27) を参照)。 • 拡張レ ジ ス タ と ARM 汎用レ ジ ス タ 間の転送 (「VMOV (2 本の ARM レ ジ ス タ と 拡張レ ジ ス タ 間)」 (ページ 5-29)、 「VMOV (ARM レ ジ ス タ と NEON ス カ ラ の間)」 (ページ 5-30)、 お よ び 「VMOV (1 本の ARM レ ジ ス タ と 単精度 VFP の間)」 (ページ 5-31) を参照)。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.16 VFP 命令 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「VABS、 VNEG、 VSQRT」 (ページ 5-112) 浮動小数点絶対値、 否定、 お よ び平方根 • 「VADD、 VSUB、 VDIV」 (ページ 5-113) 浮動小数点加算、 減算お よ び除算 • 「VMUL、 VMLA、 VMLS、 VNMUL、 VNMLA、 VNMLS」 (ページ 5-114) 必要に応 じ て否定を伴 う 浮動小数点乗算お よ び積和 • 「VCMP」 (ページ 5-116) 浮動小数点比較 • 「VCVT (単精度 と 倍精度の間)」 (ページ 5-117) 単精度 と 倍精度間の変換 • 「VCVT (浮動小数点 と 整数間の変換)」 (ページ 5-118) 浮動小数点 と 整数間の変換 • 「VCVT (浮動小数点 と 固定小数点間)」 (ページ 5-119) 浮動小数点 と 固定小数点間の変換 • 「VCVTB、 VCVTT (半精度拡張)」 (ページ 5-121) 半精度浮動小数点数 と 単精度浮動小数点数間の変換 • 「VMOV」 (ページ 5-122) 単精度ま たは倍精度レ ジ ス タ への浮動小数点定数の挿入 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-111 NEON と VFP プ ログ ラ ミ ング 5.16.1 VABS、 VNEG、 VSQRT 浮動小数点絶対値、 否定、 お よ び平方根 こ れ ら の命令では、 ス カ ラ 、 ベ ク タ 、 ま たは混合演算を実行で き ます (「VFP ベ ク タ 演算 と ス カ ラ 演算」 (ページ 5-126) を参照)。 構文 Vop{cond}.F32 Sd, Sm Vop{cond}.F64 Dd, Dm 各引数には以下の意味があ り ます。 op ABS、 NEG、 ま たは SQRT のいずれか を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 Sd, Sm 結果 と オペ ラ ン ド を保持す る 単精度レ ジ ス タ です。 Dd, Dm 結果 と オペ ラ ン ド を保持す る 倍精度レ ジ ス タ です。 使用法 VABS 命令は、 Sm ま たは Dm の内容を取得 し 、 符号ビ ッ ト を ク リ ア し て、 その結 果を Sd ま たは Dd に返 し ます。 こ れに よ り 、 絶対値が得 ら れ ます。 VNEG 命令は、 Sm ま たは Dm の内容を取得 し 、 符号ビ ッ ト を変更 し て、 その結果 を Sd ま たは Dd に返 し ます。 こ れに よ り 、 値の否定が得 ら れます。 VSQRT 命令は、 Sm ま たは Dm の内容の値の平方根を計算 し 、 その結果を Sd ま た は Dd に返 し ます。 VABS 命令 と VNEG 命令では、 オペ ラ ン ド が NaN の場合、 符号ビ ッ ト は上記の各 ケース で決定 さ れ ますが、 例外は生成 さ れません。 浮動小数点の例外 VABS 命令 と VNEG 命令に よ っ て、 例外が生成 さ れ る こ と はあ り ません。 VSQRT 命令は、 無効演算例外ま たは不正確例外を生成す る 場合があ り ます。 5-112 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.16.2 VADD、 VSUB、 VDIV 浮動小数点加算、 減算お よ び除算 こ れ ら の命令では、 ス カ ラ 、 ベ ク タ 、 ま たは混合演算を実行で き ます (「VFP ベ ク タ 演算 と ス カ ラ 演算」 (ページ 5-126) を参照)。 構文 Vop{cond}.F32 {Sd}, Sn, Sm Vop{cond}.F64 {Dd}, Dn, Dm 各引数には以下の意味があ り ます。 op ADD、 SUB、 ま たは DIV のいずれか を指定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 Sd, Sn, Sm 結果 と オペ ラ ン ド を保持す る 単精度レ ジ ス タ です。 Dd, Dn, Dm 結果 と オペ ラ ン ド を保持す る 倍精度レ ジ ス タ です。 使用法 VADD 命令は、 オペ ラ ン ド レ ジ ス タ の値を加算 し て、 その結果をデス テ ィ ネー シ ョ ン レ ジ ス タ に返 し ます。 VSUB 命令は、 第 2 オペ ラ ン ド レ ジ ス タ の値を第 1 オペ ラ ン ド レ ジ ス タ の値か ら 減算 し 、 その結果をデス テ ィ ネーシ ョ ン レ ジ ス タ に返 し ます。 VDIV 命令は、 第 1 オペ ラ ン ド レ ジ ス タ の値を第 2 オペ ラ ン ド レ ジ ス タ の値で 除算 し 、 その結果をデス テ ィ ネーシ ョ ン レ ジ ス タ に返 し ます。 浮動小数点の例外 VADD 命令 と VSUB 命令は、 無効演算例外、 オーバーフ ロ ー例外、 ま たは不正確 例外を生成す る 場合があ り ます。 VDIV 演算は、 ゼ ロ 除算例外、 無効演算例外、 オーバーフ ロ ー例外、 ア ン ダー フ ロ ー例外、 ま たは不正確例外を生成す る 場合があ り ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-113 NEON と VFP プ ログ ラ ミ ング 5.16.3 VMUL、 VMLA、 VMLS、 VNMUL、 VNMLA、 VNMLS 必要に応 じ て否定を伴 う 浮動小数点乗算お よ び積和 こ れ ら の命令では、 ス カ ラ 、 ベ ク タ 、 ま たは混合演算を実行で き ます (「VFP ベ ク タ 演算 と ス カ ラ 演算」 (ページ 5-126) を参照)。 構文 V{N}MUL{cond}.F32 {Sd,} Sn, Sm V{N}MUL{cond}.F64 {Dd,} Dn, Dm V{N}MLA{cond}.F32 Sd, Sn, Sm V{N}MLA{cond}.F64 Dd, Dn, Dm V{N}MLS{cond}.F32 Sd, Sn, Sm V{N}MLS{cond}.F64 Dd, Dn, Dm 各項目には以下の意味があ り ます。 N 最終結果を否定 し ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 Sd, Sn, Sm 結果 と オペ ラ ン ド を保持す る 単精度レ ジ ス タ です。 Dd, Dn, Dm 結果 と オペ ラ ン ド を保持す る 倍精度レ ジ ス タ です。 使用法 MUL 演算は、 オペ ラ ン ド レ ジ ス タ の値を乗算 し 、 その結果をデス テ ィ ネーシ ョ ン レ ジ ス タ に返 し ます。 MLA 演算は、 オペ ラ ン ド レ ジ ス タ の値を乗算 し 、 デス テ ィ ネーシ ョ ン レ ジ ス タ の値を加算 し 、 その最終結果をデス テ ィ ネーシ ョ ン レ ジ ス タ に返 し ます。 MLS 演算は、 オペ ラ ン ド レ ジ ス タ の値を乗算 し 、 その結果値をデス テ ィ ネー シ ョ ン レ ジ ス タ の値か ら 減算 し 、 最終結果をデス テ ィ ネーシ ョ ン レ ジ ス タ に 返 し ます。 いずれの場合 も 、 N オプシ ョ ン を使用す る と 最終結果は否定 さ れ ます。 5-114 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 浮動小数点の例外 命令は、 無効演算例外、 オーバーフ ロ ー例外、 ア ン ダーフ ロ ー例外、 不正確 例外、 入力非正規例外を生成す る 場合があ り ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-115 NEON と VFP プ ログ ラ ミ ング 5.16.4 VCMP 浮動小数点比較 VCMP では常に ス カ ラ 演算が実行 さ れ ます。 構文 VCMP{cond}.F32 Sd, Sm VCMP{cond}.F32 Sd, #0 VCMP{cond}.F64 Dd, Dm VCMP{cond}.F64 Dd, #0 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 Sd, Sm オペ ラ ン ド を保持す る 単精度レ ジ ス タ です。 Dd, Dm オペ ラ ン ド を保持す る 倍精度レ ジ ス タ を指定 し ます。 使用法 VCMP 命令は、 第 2 オペ ラ ン ド レ ジ ス タ の値 (第 2 オペ ラ ン ド が #0 の場合は 0) を第 1 オペ ラ ン ド レ ジ ス タ の値か ら 減算 し 、 その結果に VFP 条件フ ラ グ を設 定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 浮動小数点の例外 VCMP 命令は、 無効演算例外を生成す る こ と があ り ます。 5-116 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.16.5 VCVT (単精度 と 倍精度の間) 単精度数値 と 倍精度数値間の変換を実行 し ます。 VCVT では常に ス カ ラ 演算が実行 さ れ ます。 構文 VCVT{cond}.F64.F32 Dd, Sm VCVT{cond}.F32.F64 Sd, Dm 各引数には以下の意味があ り ます。 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 Dd 結果を保持す る 倍精度レ ジ ス タ です。 Sm オペ ラ ン ド を保持す る 単精度レ ジ ス タ です。 Sd 結果を保持す る 単精度レ ジ ス タ です。 Dm オペ ラ ン ド を保持す る 倍精度レ ジ ス タ です。 cond 使用法 こ れ ら の命令は Sm の単精度値を倍精度に変換 し 、 その結果を Dd に返すか、 Dm の倍精度値を単制度に変換 し 、 その結果を Sd に返 し ます。 浮動小数点の例外 命令は、 無効演算例外、 入力非正規例外、 オーバーフ ロ ー例外、 ア ン ダーフ ロ ー例外、 ま たは不正確例外を生成す る 場合があ り ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-117 NEON と VFP プ ログ ラ ミ ング 5.16.6 VCVT (浮動小数点 と 整数間の変換) 浮動小数点数 と 整数間の変換を実行 し ます。 VCVT では常に ス カ ラ 演算が実行 さ れ ます。 構文 VCVT{R}{cond}.type.F64 Sd, Dm VCVT{R}{cond}.type.F32 Sd, Sm VCVT{cond}.F64.type Dd, Sm VCVT{cond}.F32.type Sd, Sm 各項目には以下の意味があ り ます。 R FPSCR で指定 さ れてい る 丸めモー ド を演算で使用す る こ と を指 定 し ます。 それ以外の場合は、 0 に丸め ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 type U32 (符号な し 32 ビ ッ ト 整数) ま たは S32 (符号付 き 32 ビ ッ ト 整 数) を指定で き ます。 Sd 結果を保持す る 単精度レ ジ ス タ です。 Dd 結果を保持す る 倍精度レ ジ ス タ です。 Sm オペ ラ ン ド を保持す る 単精度レ ジ ス タ です。 Dm オペ ラ ン ド を保持す る 倍精度レ ジ ス タ です。 使用法 こ の命令の最初の 2 つの形式は浮動小数点か ら 整数への変換を実行 し ます。 3 番目 と 4 番目の形式は整数か ら 浮動小数点への変換を実行 し ます。 浮動小数点の例外 こ れ ら の命令は、 入力非正規例外、 無効演算例外、 ま たは不正確例外を生成 す る 場合があ り ます。 5-118 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.16.7 VCVT (浮動小数点 と 固定小数点間) 浮動小数点値 と 固定小数点値間の変換を実行 し ます。 VCVT では常に ス カ ラ 演算が実行 さ れ ます。 構文 VCVT{cond}.type.F64 Dd, Dd, #fbits VCVT{cond}.type.F32 Sd, Sd, #fbits VCVT{cond}.F64.type Dd, Dd, #fbits VCVT{cond}.F32.type Sd, Sd, #fbits 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 type 次のいずれか を指定で き ます。 S16 16 ビ ッ ト の符号付 き 固定小数点値 U16 16 ビ ッ ト の符号な し 固定小数点値 S32 32 ビ ッ ト の符号付 き 固定小数点値 U32 32 ビ ッ ト の符号な し 固定小数点値 Sd オペ ラ ン ド と 結果を保持す る 単精度レ ジ ス タ です。 Dd オペ ラ ン ド と 結果を保持す る 倍精度レ ジ ス タ です。 fbits 固定小数点数の小数部ビ ッ ト を指定 し ます。 type が S16 ま たは U16 の場合は 0 ~ 16 の範囲、 type が S32 ま たは U32 の場合は 1 ~ 32 の範囲です。 使用法 こ の命令の最初の 2 つの形式は浮動小数点か ら 固定小数点への変換を実行 し ます。 3 番目 と 4 番目の形式は固定小数点か ら 浮動小数点への変換を実行 し ます。 いずれの場合 も 、 固定小数点値は、 レ ジ ス タ の最下位の 16 ま たは 32 ビ ッ ト に含ま れ ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-119 NEON と VFP プ ログ ラ ミ ング 浮動小数点の例外 こ れ ら の命令は、 入力非正規例外、 無効演算例外、 ま たは不正確例外を生成 す る 場合があ り ます。 5-120 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.16.8 VCVTB、 VCVTT (半精度拡張) 半精度浮動小数点数 と 単精度浮動小数点数を以下の方法で相互変換 し ます。 • VCVTB はシ ン グル ワー ド レ ジ ス タ の下位ビ ッ ト (ビ ッ ト [15:0]) を使用 し て、 半精度値の取得ま たは ス ト ア を行い ます。 • VCVTT はシ ン グル ワー ド レ ジ ス タ の上位ビ ッ ト (ビ ッ ト [31:16]) を使用 し て、 半精度値の取得ま たは ス ト ア を行い ます。 VCVTB と VCVTT では、 常に ス カ ラ 演算が実行 さ れ ます。 構文 VCVTB{cond}.type Sd, Sm VCVTT{cond}.type Sd, Sm 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コ ー ド 」 (ページ 5-13) を参照)。 type 次のいずれか を指定で き ます。 F32.F16 半精度か ら 単精度への変換 F16.F32 単精度か ら 半精度への変換 Sd 結果を保持す る シ ン グル ワー ド レ ジ ス タ です。 Sm オペ ラ ン ド を保持す る シ ン グル ワー ド レ ジ ス タ です。 アーキテ ク チ ャ こ れ ら の命令を使用で き る のは、 半精度拡張をサポー ト し てい る VFPv3 シ ス テ ムだけです。 浮動小数点の例外 命令は、 入力非正規例外、 無効演算例外、 オーバーフ ロ ー例外、 ア ン ダーフ ロ ー例外、 ま たは不正確例外を生成す る 場合があ り ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-121 NEON と VFP プ ログ ラ ミ ング 5.16.9 VMOV 単精度ま たは倍精度レ ジ ス タ に浮動小数点定数を挿入す る か、 1 つの レ ジ ス タ を別の レ ジ ス タ に コ ピー し ます。 こ の命令では常に ス カ ラ 演算が実行 さ れ ます。 構文 VMOV{cond}.F32 Sd, #imm VMOV{cond}.F64 Dd, #imm VMOV{cond}.F32 Sd, Sm VMOV{cond}.F64 Dd, Dm 各項目には以下の意味があ り ます。 cond 任意の条件 コ ー ド を指定 し ます (「条件 コー ド 」 (ページ 5-13) を参照)。 Sd 単精度デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 Dd 倍精度デス テ ィ ネーシ ョ ン レ ジ ス タ を指定 し ます。 imm 浮動小数点定数です。 Sm 単精度 ソ ース レ ジ ス タ を指定 し ます。 Dm 倍精度 ソ ース レ ジ ス タ を指定 し ます。 定数値 +/–n * 2–r と 表す こ と がで き る 任意の数値。 こ こ で、 n と r は整数、 16 <= n <= 31、 0 <= r <= 7 です。 アーキテ ク チ ャ こ の命令は、 VFPv3 で使用で き ます。 5-122 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.17 VFP ベ ク タ モー ド ベ ク タ では大半の算術命令を使用で き 、 単一命令複数デー タ 処理 (SIMD) に よ る 並列処理が可能にな り ます。 ま た、 浮動小数点 ロ ー ド / ス ト ア命令には複 数の レ ジ ス タ 形式があ り 、 ベ ク タ を メ モ リ と の間で転送で き ます。 VFP コ プ ロ セ ッ サの詳細については、 『ARM アーキ テ ク チ ャ リ フ ァ レ ン ス マ ニ ュ アル』 を参照 し て下 さ い。 注 VFP ベ ク タ モー ド の使用は廃止 さ れ る 予定です 5.17.1 レ ジ ス タ バン ク VFP レ ジ ス タ は次の よ う に並んでい ます。 • 8 本の単精度レ ジ ス タ か ら な る 4 つのバン ク (s0 ~ s7、 s8 ~ s15、 s16 ~ s23、 お よ び s24 ~ s31) • 4 本の倍精度レ ジ ス タ か ら な る 8 つ (VFPv2 では 4 つ) のバン ク (d0 ~ d3、 d4 ~ d7、 d8 ~ d11、 d12 ~ d15、 d16 ~ d19、 d20 ~ d23、 d24 ~ d27、 お よ び d28 ~ d31) • 単精度レ ジ ス タ と 倍精度レ ジ ス タ の任意の組み合わせ 詳細については、 図 5-9 お よ び図 5-10 (ページ 5-124) を参照 し て下 さ い。 s0 s1 s2 s3 s4 s5 s6 s7 s8 d0 d1 d2 Bank 0 d3 d4 ... s15 s16 ... ... d7 ... Bank 1 d8 Bank 2 s23 s24 d11 d12 ... ... s31 d15 Bank 3 図 5-9 VFPv2 レ ジ ス タ バン ク ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-123 NEON と VFP プ ログ ラ ミ ング s0 s1 s2 s3 s4 s5 s6 s7 s8 s31 ... d0 d1 d2 Bank 0 d3 d4 Bank 1 ... d15 d16 d27 d28 Bank 3 Bank 4 Bank 6 ... d31 Bank 7 図 5-10 VFPv3 レ ジ ス タ バン ク 5-124 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング 5.17.2 ベク タ ベ ク タ には、 同 じ バン ク か ら 、 最大 8 本の単精度レ ジ ス タ ま たは最大 4 本の 倍精度レ ジ ス タ を使用で き ます。 ベ ク タ に よ っ て使用 さ れ る レ ジ ス タ の数は、 FPSCR の LEN ビ ッ ト に よ っ て制御 さ れ ます (「FPSCR : 浮動小数点ス テー タ ス / 制御レ ジ ス タ 」 (ページ 5-104) を参照)。 ベ ク タ はど の レ ジ ス タ か ら で も 開始で き ます。 ベ ク タ に よ っ て使用 さ れ る 最 初の レ ジ ス タ は、 各命令の レ ジ ス タ フ ィ ール ド で指定 さ れ ます。 ベク タのラ ッ プア ラウン ド ベ ク タ がバン ク の最終位置か ら はみ出す と 、 以下の よ う に同 じ バン ク の開始 位置に ラ ッ プア ラ ウ ン ド さ れ ます。 • s5 で始ま る 長 さ 6 のベ ク タ は {s5, s6, s7, s0, s1, s2} と な り ます。 • s15 で始ま る 長 さ 3 のベ ク タ は {s15, s8, s9} と な り ます。 • s22 で始ま る 長 さ 4 のベ ク タ は {s22, s23, s16, s17} と な り ます。 • d7 で始ま る 長 さ 2 のベ ク タ は {d7, d4} と な り ます。 • d10 で始ま る 長 さ 3 のベ ク タ は {d10, d11, d8} と な り ます。 1 つのベ ク タ が複数のバン ク の レ ジ ス タ を保持す る こ と はで き ません。 ベ ク タ のス ト ラ イ ド 上記の例が示す よ う に、 ベ ク タ には連続す る レ ジ ス タ を使用で き ますが、 1 つお き の レ ジ ス タ を使用す る こ と も で き ます。 こ れは、 FPSCR の STRIDE ビ ッ ト に よ っ て制御 さ れます (「FPSCR : 浮動小数点ス テー タ ス / 制御レ ジ ス タ 」 (ページ 5-104) を参照)。 以下に例を示 し ます。 • s1 で始ま る 、 長 さ 3、 ス ト ラ イ ド 2 のベ ク タ は {s1, s3, s5} と な り ます。 • s6 で始ま る 、 長 さ 4、 ス ト ラ イ ド 2 のベ ク タ は {s6, s0, s2, s4} と な り ま す。 d1 で始ま る 、 長 さ 2、 ス ト ラ イ ド 2 のベ ク タ は {d1, d3} と な り ます。 • ベ ク タ の長 さ に関する制限 1 つのベ ク タ に同 じ レ ジ ス タ を 2 回使用す る こ と はで き ません。 ベ ク タ の ラ ッ プア ラ ウ ン ド を可能にす る には、 以下の よ う なベ ク タ は使用で き ません。 • 長 さ > 4、 ス ト ラ イ ド = 2 の単精度ベ ク タ ARM DUI 0204IJ • 長 さ > 4、 ス ト ラ イ ド = 1 の倍精度ベ ク タ • 長 さ > 2、 ス ト ラ イ ド = 2 の倍精度ベ ク タ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-125 NEON と VFP プ ログ ラ ミ ング 5.17.3 VFP ベ ク タ 演算 と ス カ ラ 演算 VFP 算術命令を使用す る と 、 以下を演算の対象にす る こ と がで き ます。 • • • スカラ ベク タ スカ ラ とベク タ ベ ク タ の長 さ は、 FPSCR の LEN ビ ッ ト を使用 し て制御 し ます (「FPSCR : 浮動小 数点ス テー タ ス / 制御レ ジ ス タ 」 (ページ 5-104) を参照)。 LEN が 1 の場合、 すべての演算は ス カ ラ にな り ます。 ベ ク タ では、 FPSCR の STRIDE ビ ッ ト に よ っ て制御 さ れ る ス ト ラ イ ド を 1 ま たは 2 に指定で き ます。 STRIDE が 1 の場合、 ベ ク タ の要素はバン ク 内で連続 し た レ ジ ス タ を使用 し ます。 STRIDE が 2 の場合、 ベ ク タ の要素はバン ク 内で 1 つお き の レ ジ ス タ を使用 し ます。 5-126 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング ス カ ラ演算、 ベ ク タ 演算、 お よび混合演算の制御 LEN が 1 よ り 大 き い場合、 算術演算の動作は、 デス テ ィ ネーシ ョ ン レ ジ ス タ と オペ ラ ン ド レ ジ ス タ が配置 さ れてい る レ ジ ス タ バン ク に よ っ て異な り ます (「レ ジ ス タ バン ク 」 (ページ 5-123) を参照)。 以下の汎用形式の命令を指定す る と し ます。 Op Op Fd,Fn,Fm Fd,Fm こ の場合、 動作は以下の と お り です。 • Fd が最初ま たは 5 番目の レ ジ ス タ バン ク (s0 ~ s7、 d0 ~ d3、 ま たは d16 ~ d19) にあ る 場合、 ス カ ラ 演算にな り ます。 • Fm が最初ま たは 5 番目の レ ジ ス タ バン ク にあ る が、 Fd はない場合、 混合 • Fd と Fm のいずれ も 最初ま たは 5 番目の レ ジ ス タ バン ク にない場合、ベ ク 演算にな り ます。 タ 演算にな り ます。 ス カ ラ演算 Op は、 Fm の値 と 、 Fn が指定 さ れてい る 場合はその値に対す る 演算を行い ます。 演算結果は Fd に返 さ れます。 ベ ク タ 演算 Op は、 Fm で始ま る ベ ク タ 内の値 と 、 Fn が指定 さ れてい る 場合はその値で始ま る ベ ク タ 内の値に対す る 演算を行い ます。 演算結果は、 Fd で始ま る ベ ク タ に 返 さ れ ます。 ス カ ラ / ベ ク タ 混合演算 単一のオペ ラ ン ド の命令の場合、 Op は、 Fm の単一の値に対 し て演算を行い ま す。 結果の LEN 個の コ ピーは、 Fd で始ま る ベ ク タ に返 さ れます。 オペ ラ ン ド が複数あ る 命令の場合、 Op は、 Fm の 1 つの値 と Fn で始ま る ベ ク タ の値に対 し て演算を行い ます。 演算結果は、 Fd で始ま る ベ ク タ に返 さ れます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-127 NEON と VFP プ ログ ラ ミ ング 5.17.4 VFP デ ィ レ ク テ ィ ブ と ベ ク タ 表記 こ のセ ク シ ョ ン の説明は、 armasm にのみ該当 し ます。 C コ ンパ イ ラ お よ び C++ コ ンパ イ ラ の イ ン ラ イ ン アセ ン ブ ラ では、 こ のセ ク シ ョ ン で説明す る デ ィ レ ク テ ィ ブやベ ク タ 表記を使用で き ません。 VFP ベ ク タ モー ド の使用は制限 さ れ、 ベ ク タ 表記は UAL ではサポー ト さ れて い ません。 ベ ク タ 表記を使用す る には、 UAL 以前の VFP ニーモニ ッ ク を使用 す る 必要があ り ます。 詳細については、 「UAL 以前の VFP ニーモニ ッ ク 」 (ページ 5-129) を参照 し て下 さ い。 UAL 以前の VFP ニーモニ ッ ク と UAL VFP ニーモニ ッ ク を混用で き ます。 コ ー ド 内で VFP ベ ク タ の長 さ と ス ト ラ イ ド に関す る 情報を アサー ト し 、 アセ ン ブ ラ で自動的にチ ェ ッ ク す る こ と がで き ます。 詳細については、 以下を参 照 し て下 さ い。 • 「VFPASSERT SCALAR」 (ページ 5-132) • 「VFPASSERT VECTOR」 (ページ 5-133) VFPASSERT デ ィ レ ク テ ィ ブ を使用す る 場合は、 UAL 以前のニーモニ ッ ク を使用 し て作成 さ れたすべての VFP デー タ 処理命令でベ ク タ 情報を指定す る 必要が あ り ます。 ベ ク タ 表記については、 「ベ ク タ 表記」 (ページ 5-131) で説明 し ま す。 VFPASSERT デ ィ レ ク テ ィ ブ を使用 し ない場合は、 こ の表記を使用 し ないで 下 さ い。 5-128 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング UAL 以前の VFP ニーモ ニ ッ ク UAL ニーモニ ッ ク では単精度デー タ の指定に .F32 を使用 し ますが、 UAL 以前 のニーモニ ッ ク では、命令ニーモニ ッ ク に S を追加 し ます。 例えば、VABS.32 は FABSS で し た。 UAL ニーモニ ッ ク では倍精度デー タ の指定に .F64 を使用 し ますが、 UAL 以前 のニーモニ ッ ク では、 命令ニーモニ ッ ク に D を追加 し ます。 例えば、 VCMPE.64 は FCMPED で し た。 表 5-15 は VFP ベ ク タ モー ド の影響を受け る 命令の UAL 以前のニーモニ ッ ク を示 し てい ます。 その他のすべての VFP 命令では、 LEN お よ び STRIDE の設定に かかわ ら ず、 常に ス カ ラ 演算が実行 さ れ ます。 表 5-15 UAL 以前の VFP ニーモニ ッ ク UAL ニーモニ ッ ク 対応する UAL 以前のニーモニ ッ ク VABS FABS VADD FADD VDIV FDIV VMLA FMAC VMLS FNMAC VMOV ( イ ミ デ ィ エー ト ) FCONST a VMOV (レ ジ ス タ ) FCPY VMUL FMUL VNEG FNEG VNMLA FNMSC VNMLS FMSC VNMUL FNMUL VSQRT FSQRT VSUB FSUB a. VMOV ( イ ミ デ ィ エー ト ) の イ ミ デ ィ エー ト は、 ロ ー ド す る 浮動小数点値です。 FCONST の イ ミ デ ィ エー ト は、 ロ ー ド す る 浮動小数点値を生成す る 命令でエ ン コ ー ド さ れ る 数値です。 詳細については、 「FCONST の イ ミ デ ィ エー ト 値」 を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-129 NEON と VFP プ ログ ラ ミ ング FCONST のイ ミ デ ィ エー ト 値 表 5-16 は、 FCONST を使用 し て ロ ー ド で き る 浮動小数点定数を示 し てい ます。 最後に く る ゼ ロ はわか り やすい よ う に省略 し て あ り ます。 FCONST 命令に含め る 必要のあ る イ ミ デ ィ エー ト 値は、 2 進数の 10 進数表記 abcdefgh です。 各部分 には以下の意味があ り ます。 a 正の数値の場合は 0、 負の数値の場合は 1 です。 列見出 し に表示 さ れます。 行見出 し に表示 さ れます。 bcd efgh ま た、 0x の後に 16 進数表記法を使用す る こ と も で き ます。 表 5-16 浮動小数点定数値 bcd 000 001 010 011 100 101 110 111 0000 2.0 4.0 8.0 16.0 0.125 0.25 0.5 1.0 0001 2.125 4.25 8.5 17.0 0.1328125 0.265625 0.53125 1.0625 0010 2.25 4.5 9.0 18.0 0.140625 0.28125 0.5625 1.125 0011 2.375 4.75 9.5 19.0 0.1484375 0.296875 0.59375 1.1875 0100 2.5 5.0 10.0 20.0 0.15625 0.3125 0.625 1.25 0101 2.625 5.25 10.5 21.0 0.1640625 0.328125 0.65625 1.3125 0110 2.75 5.5 11.0 22.0 0.171875 0.34375 0.6875 1.375 0111 2.875 5.75 11.5 23.0 0.1796875 0.359375 0.71875 1.4375 1000 3.0 6.0 12.0 24.0 0.1875 0.375 0.75 1.5 1001 3.125 6.25 12.5 25.0 0.1953125 0.390625 0.78125 1.5625 1010 3.25 6.5 13.0 26.0 0.203125 0.40625 0.8125 1.625 1011 3.375 6.75 13.5 27.0 0.2109375 0.421875 0.84375 1.6875 1100 3.5 7.0 14.0 28.0 0.21875 0.4375 0.875 1.75 1101 3.625 7.25 14.5 29.0 0.2265625 0.453125 0.90625 1.8125 1110 3.75 7.5 15.0 30.0 0.234375 0.46875 0.9375 1.875 1111 3.875 7.75 15.5 31.0 0.2421875 0.484375 0.96875 1.9375 efgh 5-130 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング ベ ク タ 表記 UAL 以前の VFP デー タ 処理命令では、以下の よ う にかぎ括弧を使用 し て VFP レ ジ ス タ のベ ク タ を指定 し ます。 • sn は、 単精度ス カ ラ レ ジ ス タ n です。 • sn <> は、 長 さ と ス ト ラ イ ド が現在のベ ク タ の長 さ と ス ト ラ イ ド に よ っ て 指定 さ れ る 、 レ ジ ス タ n で始ま る 単精度ベ ク タ です。 • sn <L> は、 レ ジ ス タ n で始ま る 、 長 さ L、 ス ト ラ イ ド 1 の単精度ベ ク タ で す。 • sn <L:S> は、 レ ジ ス タ n で始ま る 、 長 さ L、 ス ト ラ イ ド S の単精度ベ ク タ です。 • dn は、 倍精度ス カ ラ レ ジ ス タ n です。 • dn <> は、 長 さ と ス ト ラ イ ド が現在のベ ク タ の長 さ と ス ト ラ イ ド に よ っ て 指定 さ れ る 、 レ ジ ス タ n で始ま る 倍精度ベ ク タ です。 • dn <L> は、 レ ジ ス タ n で始ま る 、 長 さ L、 ス ト ラ イ ド 1 の倍精度ベ ク タ で す。 • dn <L:S> は、 レ ジ ス タ n で始ま る 、 長 さ L、 ス ト ラ イ ド S の倍精度ベ ク タ です。 こ のベ ク タ 表記には、 DN デ ィ レ ク テ ィ ブ と SN デ ィ レ ク テ ィ ブ を使用 し て定義 さ れた名前を使用で き ます (「QN、 DN、 お よ び SN」 (ページ 7-16) を参照)。 こ のベ ク タ 表記を DN デ ィ レ ク テ ィ ブや SN デ ィ レ ク テ ィ ブの中で使用 し ないで 下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-131 NEON と VFP プ ログ ラ ミ ング VFPASSERT SCALAR VFPASSERT SCALAR デ ィ レ ク テ ィ ブは、 後続の VFP 命令が ス カ ラ モー ド であ る こ と を アセ ン ブ ラ に通知 し ます。 構文 VFPASSERT SCALAR 使用法 VFPASSERT SCALAR デ ィ レ ク テ ィ ブ を使用 し て、 VFP モー ド が VECTOR であ る 任意 の コ ー ド ブ ロ ッ ク の終わ り を マー ク で き ます。 VFPASSERT SCALAR デ ィ レ ク テ ィ ブは、 モー ド 変更が発生す る 命令の直後に配置 し ます。 こ れは一般に FMXR 命令ですが、 BL 命令の場合 も あ り ます。 関数の終了時に VFP がベ ク タ モー ド にな る こ と が予測 さ れ る 場合は、 VFPASSERT SCALAR デ ィ レ ク テ ィ ブ を最後の命令の直後に配置 し ます。 こ の よ う な関数は AAPCS に準拠 し ません。 詳細については、 install_directory\Documentation\Specifications\... にあ る 『ARM アーキ テ ク チ ャ 向けプ ロ シージ ャ コール標準』 (aapcs.pdf) を参照 し て下 さ い。 以下 も 参照 し て下 さ い。 • 「ベ ク タ 表記」 (ページ 5-131) • 「VFPASSERT VECTOR」 (ページ 5-133) 注 こ のデ ィ レ ク テ ィ ブか ら は コ ー ド は生成 さ れ ません。 プ ロ グ ラ マに よ る ア サー ト にすぎ ません。 こ れ ら のアサー ト が互いに一致 し ない場合や、 VFP デー タ 処理命令のベ ク タ 表記 と 一致 し ない場合は、 アセ ン ブ ラ に よ っ てエ ラ ー メ ッ セージが生成 さ れ ます。 ベ ク タ の長 さ が 1 であ る 場合で も 、 VFPASSERT SCALAR デ ィ レ ク テ ィ ブに続 く VFP デー タ 処理命令のベ ク タ 表記が検出 さ れ る と 、 アセ ン ブ ラ に よ っ てエ ラ ーが生成 さ れます。 例 VFPASSERT faddd fadds fabss 5-132 SCALAR d4, d4, d0 s4<3>, s0, s8<3> s24<1>, s28<1> ; ; ; ; ; scalar mode okay ERROR, vector in scalar mode ERROR, vector in scalar mode (even though length==1) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ NEON と VFP プ ログ ラ ミ ング VFPASSERT VECTOR VFPASSERT VECTOR デ ィ レ ク テ ィ ブは、 後続の VFP 命令がベ ク タ モー ド であ る こ と を アセ ンブ ラ に通知 し ます。 ベ ク タ の長 さ と ス ト ラ イ ド を指定す る こ と も で き ます。 構文 VFPASSERT VECTOR[<[n[:s]]>] 各項目には以下の意味があ り ます。 1 ~ 8 でベ ク タ の長 さ を指定 し ます。 n 1 ~ 2 でベ ク タ の ス ト ラ イ ド を指定 し ます。 s 使用法 VFPASSERT VECTOR デ ィ レ ク テ ィ ブ を使用 し て、 VFP モー ド が VECTOR と な る 命令 ブ ロ ッ ク の開始位置 と 、 ベ ク タ の長 さ ま たは ス ト ラ イ ド の変更を マー ク で き ます。 VFPASSERT VECTOR デ ィ レ ク テ ィ ブは、変更が発生す る 命令の直後に配置 し ます。 こ れは一般に FMXR 命令ですが、 BL 命令の場合 も あ り ます。 関数のエ ン ト リ 処理で VFP がベ ク タ モー ド にな る こ と が予測 さ れ る 場合は、 VFPASSERT VECTOR デ ィ レ ク テ ィ ブ を最初の命令の直前に配置 し ます。 こ の よ う な関数は AAPCS に準拠 し ません。 詳細については、 『ARM アーキ テ ク チ ャ 向けプ ロ シージ ャ コ ール標準』 (aapcs.pdf) を参照 し て下 さ い。 install_directory\Documentation\Specifications\... にあ る 参照先 : 「ベ ク タ 表記」 (ページ 5-131) • • 「VFPASSERT SCALAR」 (ページ 5-132) 注 こ のデ ィ レ ク テ ィ ブか ら は コ ー ド は生成 さ れ ません。 プ ロ グ ラ マに よ る ア サー ト にすぎ ません。 こ れ ら のアサー ト が互いに一致 し ない場合や、 VFP デー タ 処理命令のベ ク タ 表記 と 一致 し ない場合は、 アセ ン ブ ラ に よ っ てエ ラ ー メ ッ セージが生成 さ れ ます。 例 VMRS BIC ORR ARM DUI 0204IJ r10,FPSCR ; UAL mnemonic - could be FMRX instead. r10,r10,#0x00370000 r10,r10,#0x00020000 ; set length = 3, stride = 1 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 5-133 NEON と VFP プ ログ ラ ミ ング VMSR FPSCR,r10 VFPASSERT VECTOR ; faddd d4, d4, d0 ; fadds s16<3>, s0, s8<3> ; fabss s24<1>, s28<1> ; VMRS r10,FPSCR BIC r10,r10,#0x00370000 ORR r10,r10,#0x00030000 VMSR FPSCR,r10 VFPASSERT VECTOR<4> ; fadds s24<4>, s0, s8<4> ; fabss s24<2>, s24<2> ; VMRS r10,FPSCR BIC r10,r10,#0x00370000 ORR r10,r10,#0x00130000 VMSR FPSCR,r10 VFPASSERT VECTOR<4:2> ; fadds s8<4>, s0, s16<4> ; fabss s16<4:2>, s28<4:2> ; fadds s8<>, s2, s16<> ; ; ; 5-134 assert vector mode, unspecified length & stride ERROR, scalar in vector mode okay wrong length, but not faulted (unspecified) ; set length = 4, stride = 1 assert vector mode, length 4, stride 1 okay ERROR, wrong length ; set length = 4, stride = 2 assert vector mode, length 4, stride 2 ERROR, wrong stride okay okay (s8 and s16 both have length 4 and stride 2. s2 is scalar.) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 第6章 ワ イヤレ ス MMX テ ク ノ ロ ジの命令 本章では、 ワ イ ヤ レ ス MMX™ テ ク ノ ロ ジの命令のサポー ト について説明 し ま す。 以下のセ ク シ ョ ン か ら 構成 さ れてい ます。 • • • ARM DUI 0204IJ 「は じ めに」 (ページ 6-2) 「ワ イ ヤ レ ス MMX テ ク ノ ロ ジに対す る ARM のサポー ト 」 (ページ 6-3) 「ワ イ ヤ レ ス MMX の命令」 (ページ 6-9) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 6-1 ワ イヤレ ス MMX テ ク ノ ロ ジの命令 6.1 は じ めに ワ イ ヤ レ ス MMX テ ク ノ ロ ジは SIMD (1 つの命令で複数のデー タ を並列に処 理す る ) 命令のセ ッ ト で、 マルチ メ デ ィ ア アプ リ ケーシ ョ ンのパフ ォ ーマ ン ス を向上 さ せ る 一部の XScale プ ロ セ ッ サで使用で き ます。 ワ イ ヤ レ ス MMX テ ク ノ ロ ジでは 64 ビ ッ ト レ ジ ス タ を使用 し て、 パ ッ ク 形式の複数のデー タ 要 素で演算で き る よ う に し ます。 ワ イ ヤ レ ス MMX テ ク ノ ロ ジでは ARM コ プ ロ セ ッ サ 0 お よ び 1 を使用 し て、 その命令セ ッ ト と デー タ 型をサポー ト し てい ます。 ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令を使用す る ソ ース コ ー ド を アセ ン ブル し て、 PXA270 プ ロ セ ッ サで 実行で き ます。 ワ イ ヤ レ ス MMX 2 テ ク ノ ロ ジは、 ワ イ ヤ レ ス MMX テ ク ノ ロ ジのア ッ プグ レー ド バージ ョ ン です。 ARM アセ ンブ ラ を使用す る と き は、 以下の点に注意 し て下 さ い。 • ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令は、 サポー ト さ れてい る プ ロ セ ッ サ (armasm --cpu PXA270) を指定 し た場合にのみアセ ン ブル さ れます。 • PXA270 プ ロ セ ッ サでは、 ARM ま たは Thumb® で記述 さ れた コ ー ド のみ をサポー ト し ます。 • ARM フ ラ グの状態に よ っ ては、 ほ と ん ど の ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令は条件実行で き ます。 ワ イ ヤ レ ス MMX テ ク ノ ロ ジの条件 コ ー ド は、 ARM の条件 コ ー ド と 同 じ です。 本章では、 RealView Compilation Tools におけ る ARM アセ ンブ ラ に よ る ワ イ ヤ レ ス MMX テ ク ノ ロ ジのサポー ト について説明 し ます。 ワ イ ヤ レ ス MMX テ ク ノ ロ ジ自体については詳 し く 説明 し てい ません。 プ ロ グ ラ マモデル、 お よ び ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令セ ッ ト の詳細な説明については、 『Wireless MMX Technology Developer Guide』 を参照 し て下 さ い。 6-2 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ワ イヤレ ス MMX テ ク ノ ロ ジの命令 6.2 ワ イ ヤレ ス MMX テ ク ノ ロ ジに対する ARM のサポー ト こ のセ ク シ ョ ン では、 ワ イ ヤ レ ス MMX テ ク ノ ロ ジ、 お よ び MMX 2 テ ク ノ ロ ジに対す る アセ ンブ ラ のサポー ト について説明 し ます。 こ のセ ク シ ョ ンは、 以下のサブセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「レ ジ ス タ 」 • 「デ ィ レ ク テ ィ ブ、 WRN と WCN」 (ページ 6-4) • • • 6.2.1 「Frame デ ィ レ ク テ ィ ブ」 (ページ 6-5) 「ワ イ ヤ レ ス MMX ロ ー ド / ス ト ア命令」 (ページ 6-6) 「ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令 と XScale の命令」 (ページ 6-7) レジス タ ワ イ ヤ レ ス MMX テ ク ノ ロ ジでは、 次の 2 つの タ イ プの レ ジ ス タ をサポー ト し てい ます。 ス テー タ ス レ ジ ス タ お よ び制御レ ジ ス タ 制御レ ジ ス タ は コ プ ロ セ ッ サ 1 にマ ッ プ さ れ、 汎用レ ジ ス タ wCGR0 ~ wCGR3 お よ び SIMD フ ラ グ を含んでい ます。 こ れ ら の レ ジ ス タ の詳細については、 表 6-1 を参照 し て下 さ い。 こ れ ら の レ ジ ス タ に対す る 読み出 し お よ び書 き 込みには、 ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令 TMCR お よ び TMRC を使用 し ます。 表 6-1 ス テー タ ス レ ジ ス タ および制御レ ジ ス タ ARM DUI 0204IJ タ イプ ワ イヤレ ス MMX テ ク ノ ロ ジのレ ジ ス タ CP1 レ ジ ス タ コ プ ロ セ ッ サ ID wCID c0 制御 wCon c1 サチ ュ レーシ ョ ン SIMD フ ラ グ wCSSF c2 算術 SIMD フ ラ グ wCASF c3 予約 - c4 - c7 汎用 wCGR0 - wCGR3 c8 - c11 予約 - c12 - c15 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 6-3 ワ イヤレ ス MMX テ ク ノ ロ ジの命令 SIMD デー タ レ ジ ス タ デー タ レ ジ ス タ (wR0 ~ wR15) は コ プ ロ セ ッ サ 0 にマ ッ プ さ れ、 16 ビ ッ ト × 64 ビ ッ ト のパ ッ ク 化デー タ を保持 し ます。 こ れ ら の レ ジ ス タ と ARM レ ジ ス タ 間でデー タ を移動す る には、 ワ イ ヤ レ ス MMX テ ク ノ ロ ジの疑似命令であ る TMRRC お よ び TMCRR を使用 し ます。 レ ジ ス タ の詳細については、 『Wireless MMX Technology Developer Guide』 を参 照 し て下 さ い。 ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令を アセ ン ブルす る 場合、 アセ ン ブ ラ は次 の よ う な レ ジ ス タ の仕様を受け入れ ます。 • ワ イ ヤ レ ス MMX テ ク ノ ロ ジの仕様 と 完全に一致す る 、 大文字 と 小文字 の混在。 wR0、 wCID、 wCon な ど。 • すべて小文字。 wr0、 wcid、 wcon な ど。 • すべて大文字。 WR0、 WCID、 WCON な ど。 レ ジ ス タ 名を指定す る と き は、 WRN デ ィ レ ク テ ィ ブお よ び WCN デ ィ レ ク テ ィ ブ をサポー ト し ます (「「デ ィ レ ク テ ィ ブ、 WRN と WCN」」 を参照)。 6.2.2 デ ィ レ ク テ ィ ブ、 WRN と WCN 次のデ ィ レ ク テ ィ ブ を使用 し て、 ワ イ ヤ レ ス MMX テ ク ノ ロ ジ を サポー ト で き ます。 WCN 指定 さ れた制御レ ジ ス タ 名を定義 し ます。 例は以下の通 り です。 speed WCN WRN wcgr0 ; defines speed as a symbol for control reg 0 指定 さ れた SIMD デー タ レ ジ ス タ 名を定義 し ます。 例は以下の通 り です。 rate WRN wr6 ; defines rate as a symbol for data reg 6 同一レ ジ ス タ に複数の名前を付けて矛盾を生 じ さ せ る よ う な使用方法は避け て下 さ い。 「定義済みの レ ジ ス タ お よ び コ プ ロ セ ッ サ名」 (ページ 3-24) に記 載 さ れてい る 事前定義 さ れた名前や、 「レ ジ ス タ 」 (ページ 6-3) に記載 さ れ てい る レ ジ ス タ 名を使用 し ないで下 さ い。 6-4 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ワ イヤレ ス MMX テ ク ノ ロ ジの命令 6.2.3 Frame デ ィ レ ク テ ィ ブ ワ イ ヤ レ ス MMX テ ク ノ ロ ジの レ ジ ス タ を通常の方法で FRAME デ ィ レ ク テ ィ ブ と と も に使用 し て、 オブジ ェ ク ト フ ァ イ ルにデバ ッ グ情報を追加で き ます (詳細については、 「Frame デ ィ レ ク テ ィ ブ」 (ページ 7-46) を参照)。 次の制 限に注意 し て下 さ い。 • ワ イ ヤ レ ス MMX テ ク ノ ロ ジの レ ジ ス タ であ る wR0 ~ wR9 ま たは wCGR0 ~ wCGR3 を ス タ ッ ク にプ ッ シ ュ し よ う と す る と 、 警告が表示 さ れ ます (「FRAME PUSH」 (ページ 7-52) を参照)。 • ARM DUI 0204IJ ワ イ ヤ レ ス MMX テ ク ノ ロ ジの レ ジ ス タ は、 ア ド レ ス オ フ セ ッ ト と し て 使用で き ません (「FRAME ADDRESS」 (ページ 7-48) お よ び 「FRAME RETURN ADDRESS」 (ページ 7-57) を参照)。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 6-5 ワ イヤレ ス MMX テ ク ノ ロ ジの命令 6.2.4 ワ イ ヤレ ス MMX ロー ド / ス ト ア命令 ワ イ ヤ レ ス MMX コ プ ロ セ ッ サ レ ジ ス タ に対 し てバ イ ト 、 ハーフ ワ ー ド 、 ワー ド 、 ま たはダブル ワー ド の ロ ー ド / ス ト ア を実行 し ます。 構文 op<type>{cond} wRd, [Rn, #{-}offset]{!} op<type>{cond} wRd, [Rn] {, #{-}offset} opW{cond} wRd, label opW wCd, [Rn, #{-}offset]{!} opW wCd, [Rn] {, #{-}offset} opD{cond} wRd, label opD wRd, [Rn, {-}Rm {, LSL #imm4}]{!} ; MMX2 only opD wRd, [Rn], {-}Rm {, LSL #imm4} ; MMX2 only 各項目には以下の意味があ り ます。 次のいずれか を指定で き ます。 WLDR ワ イ ヤ レ ス MMX レ ジ ス タ を ロ ー ド し ます。 op WSTR 6-6 ワ イ ヤ レ ス MMX レ ジ ス タ を ス ト ア し ます。 <type> 次のいずれか を指定で き ます。 B バイ ト H ハーフ ワー ド W ワー ド D ダブル ワー ド cond 任意の条件 コ ー ド を指定 し ます (「条件実行」 (ページ 2-20) を 参照)。 wRd ロ ー ド ま たは ス ト ア を実行す る ワ イ ヤ レ ス MMX SIMD デー タ レ ジ ス タ を指定 し ます。 wCd ロ ー ド ま たは ス ト ア を実行す る ワ イ ヤ レ ス MMX ス テー タ ス レ ジ ス タ お よ び制御レ ジ ス タ を指定 し ます。 Rn メ モ リ ア ド レ ス のベース と な る レ ジ ス タ を指定 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ワ イヤレ ス MMX テ ク ノ ロ ジの命令 offset イ ミ デ ィ エー ト オ フ セ ッ ト を指定 し ます。 オ フ セ ッ ト を指定 し な か っ た場合、 その命令はゼ ロ オ フ セ ッ ト 命令にな り ます。 ! 任意に指定で き る 接尾文字です。 ! が存在す る 場合、 命令はプ レ イ ンデ ク ス命令にな り ます。 label プ ロ グ ラ ム相対式を指定 し ます。 詳細については、 「レ ジ ス タ 相 対式 と プ ロ グ ラ ム相対式」 (ページ 3-39) を参照 し て下 さ い。 label は現在の命令か ら +/- 1020 以内に配置す る 必要があ り ます。 Rm オ フ セ ッ ト と し て使用 さ れ る 値を保持す る レ ジ ス タ を指定 し ま す。 Rm に r15 は指定で き ません。 imm4 Rm を左にシ フ ト す る ビ ッ ト 数を 0 ~ 15 の範囲で保持 し ます。 SIMD レ ジ ス タ への定数のロー ド アセ ン ブ ラ では、 WLDRW お よ び WLDRD リ テ ラ ル ロ ー ド 疑似命令 も サポー ト し ま す。 以下に例を示 し ます。 WLDRW wr0, =0x114 以下の点に注意 し て下 さ い。 6.2.5 • アセ ン ブ ラ では、 バ イ ト お よ びハーフ ワ ー ド リ テ ラ ルを ロ ー ド で き ませ ん。 こ れ ら を ロ ー ド す る と 降格エ ラ ーが生成 さ れ ます。 ダ ウ ン グ レー ド さ れ る と 、 命令は WLDRW に変換 さ れ、 32 ビ ッ ト リ テ ラ ルが生成 さ れま す。 こ れはバ イ ト リ テ ラ ルの ロ ー ド と 同様ですが、 32 ビ ッ ト ワー ド を使 用す る 点が異な り ます。 • ロ ー ド す る リ テ ラ ルがゼ ロ で、 デス テ ィ ネーシ ョ ンが SIMD デー タ レ ジ ス タ であ る 場合、 命令は WZERO に変換 さ れます。 • 8 バ イ ト 整列ではないダブル ワー ド ロ ー ド は予測不能です。 ワ イ ヤレ ス MMX テ ク ノ ロ ジの命令 と XScale の命令 ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令は XScale の命令 と 重複 し ます。 競合を避 け る ために、 アセ ン ブ ラ には次の制約があ り ます。 • ARM DUI 0204IJ XScale の命令 と ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令を同 じ アセ ン ブ リ に 混在 さ せ る こ と はで き ません。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 6-7 ワ イヤレ ス MMX テ ク ノ ロ ジの命令 • ワ イ ヤ レ ス MMX テ ク ノ ロ ジの TMIA 命令には、 XScale の MIA 命令 と 重複 す る MIA ニーモニ ッ ク があ り ます。 次の点に注意 し て下 さ い。 — MIA acc0, Rm, Rs は XScale では使用で き ますが、 ワ イ ヤ レ ス MMX テ ク ノ ロ ジではエ ラ ーにな り ます。 — MIA wR0, Rm, Rs お よ び TMIA wR0, Rm, Rs は、ワ イ ヤ レ ス MMX テ ク ノ ロ ジで使用で き ます。 — TMIA acc0, Rm, Rs は XScale ではエ ラ ーにな り ます(XScale には TMIA 命令はあ り ません)。 XScale 命令の詳細については、 「MIA、 MIAPH、 MIAxy」 (ページ 4-98) と 「MAR、 MRA」 (ページ 4-157) を参照 し て下 さ い。 6-8 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ ワ イヤレ ス MMX テ ク ノ ロ ジの命令 6.3 ワ イ ヤレ ス MMX の命令 表 6-2 に、 ワ イ ヤ レ ス MMX テ ク ノ ロ ジの命令セ ッ ト の一覧を示 し ます。 こ の 表を使用 し て、 『Wireless MMX Technology Developer Guide』 で説明 さ れてい る 各命令を探 し て下 さ い。 「疑似命令」 (表 6-3 (ページ 6-11)) も 参照 し て下 さ い。 こ のセ ク シ ョ ン では、 ワ イ ヤ レ ス MMX テ ク ノ ロ ジの レ ジ ス タ は wRn、 wRd、 ARM の レ ジ ス タ は Rn、 Rd と 示 さ れます。 表 6-2 ワ イヤレ ス MMX テ ク ノ ロ ジの命令 ARM DUI 0204IJ ニーモニ ッ ク 例 TANDC TANDCB r15 TBCST TBCSTB wr15, r1 TEXTRC TEXTRCB r15, #0 TEXTRM TEXTRMUBCS r3, wr7, #7 TINSR TINSRB wr6, r11, #0 TMIA, TMIAPH, TMIAxy TMIANE TMIAPH TMIABB MIAPHNE TMOVMSK TMOVMSKBNE r14, wr15 TORC TORCB WACC WACCBGE wr1, wr2 WADD WADDBGE wr1, wr2, wr13 WALIGNI, WALIGNR WALIGNI wr7, wr6, wr5,#3 WALIGNR0 wr4, wr8, wr12 WAND, WANDN WAND wr1, wr2, wr3 WANDN wr5, wr5, wr9 WAVG2 WAVG2B wr3, wr6, wr9 WAVG2BR wr4, wr7, wr10 WCMPEQ WCMPEQB wr0, wr4, wr2 WCMPGT WCMPGTUB wr0, wr4, wr2 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential wr1, wr4, wr4, wr4, r2, r5, r5, r5, r3 r6 r6 r6 r15 6-9 ワ イヤレ ス MMX テ ク ノ ロ ジの命令 表 6-2 ワ イ ヤレ ス MMX テ ク ノ ロ ジの命令 (続き) 6-10 ニーモニ ッ ク 例 WLDR WLDRB wr1, [r2, #0] WMAC WMACU wr3, wr4, wr5 WMADD WMADDU wr3, wr4, wr5 WMAX, WMIN WMAXUB wr0, wr4, wr2 WMINSB wr0, wr4, wr2 WMUL WMULUL wr4, wr2, wr3 WOR WOR wr3, wr1, wr4 WPACK WPACKHUS wr2, wr7, wr1 WROR WRORH wr3, wr1, wr4 WSAD WSADB wr3, wr5, wr8 WSHUFH WSHUFH wr8, wr15, #17 WSLL, WSRL WSLLH WSRLHG wr3, wr1, wr4 wr3, wr1, wcgr0 WSRA WSRAH WSRAHG wr3, wr1, wr4 wr3, wr1, wcgr0 WSTR WSTRB wr1, [r2, #0] WSTRW wc1, [r2, #0] WSUB WSUBBGE wr1, wr2, wr13 WUNPCKEH, WUNPCKEL WUNPCKEHUB wr0, wr4 WUNPCKELSB wr0, wr4 WUNPCKIH, WUNPCKIL WUNPCKIHB wr0, wr4, wr2 WUNPCKILH wr1, wr5, wr3 WXOR WXOR Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential wr3, wr1, wr4 ARM DUI 0204IJ ワ イヤレ ス MMX テ ク ノ ロ ジの命令 6.3.1 疑似命令 表 6-3 では、 ワ イ ヤ レ ス MMX テ ク ノ ロ ジの疑似命令の概要を説明 し ます。 こ の表を使用 し て、 『Wireless MMX Technology Developer Guide』 お よ び 「第 4 章 ARM 命令 と Thumb 命令」 で説明 さ れてい る 命令を探 し て下 さ い。 表 6-3 ワ イヤレ ス MMX テ ク ノ ロ ジの疑似命令 ニーモ ニッ ク TMCR 概要 例 ソ ース レ ジ ス タ Rn の内容を制御レ ジ ス タ wCn に移動 し ます。 ARM TMCR wc1, r10 MCR コ プ ロ セ ッ サ命令にマ ッ プ し ます ((ページ 4-134))。 TMCRR 2 つの ソ ース レ ジ ス タ RnLo お よ び RnHi の内容をデス テ ィ ネーシ ョ ン レ ジ ス タ wRd に移動 し ます。 RnLo ま たは RnHi に r15 を使用 し ないで下 さ い。 ARM MCRR コ プ ロ セ ッ サ命令にマ ッ プ し ます ((ページ 4-134))。 TMCRR wr4, r5, r6 TMRC 制御レ ジ ス タ wCn の内容をデス テ ィ ネーシ ョ ン レ ジ ス タ Rd に移動 し ます。 Rd に r15 を使用 し ないで下 さ い。 ARM MRC コ プ ロ セ ッ サ命令に マ ッ プ し ます ((ページ 4-136))。 TMRC r1, wc2 TMRRC ソ ース レ ジ ス タ wRn の内容を 2 つのデス テ ィ ネーシ ョ ン レ ジ ス タ RdLo お よ び RdHi に移動 し ます。 デス テ ィ ネーシ ョ ン レ ジ ス タ に r15 を使用 し ないで下 さ い。 RdLo お よ び RdHi は別の レ ジ ス タ であ る 必要 があ り ます。 それ以外の場合は結果が予測で き ない も のにな り ま す。 ARM MRRC コ プ ロ セ ッ サ命令にマ ッ プ し ます ((ページ 4-136))。 TMRRC WMOV ソ ース レ ジ ス タ wRn の内容をデス テ ィ ネーシ ョ ン レ ジ ス タ wRd に移 動 し ます。 こ の命令は、 WOR の形式です (表 6-2 (ページ 6-9) を参 照)。 WMOV wr1, wr8 WZERO デス テ ィ ネーシ ョ ン レ ジ ス タ wRd をゼ ロ に し ます。 こ の命令は、 WANDN の形式です (表 6-2 (ページ 6-9) を参照)。 WZERO wr1 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential r1, r0, wr2 6-11 ワ イヤレ ス MMX テ ク ノ ロ ジの命令 6-12 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ 第7章 デ ィ レ クテ ィ ブ リ フ ァ レンス 本章では、 ARM® アセ ンブ ラ armasm に使用で き る デ ィ レ ク テ ィ ブについて説 明 し ます。 以下のセ ク シ ョ ン か ら 構成 さ れてい ます。 • • • • • • • • 「デ ィ レ ク テ ィ ブの一覧 (アルフ ァ ベ ッ ト 順)」 (ページ 7-2) 「シ ン ボル定義デ ィ レ ク テ ィ ブ」 (ページ 7-4) 「デー タ 定義デ ィ レ ク テ ィ ブ」 (ページ 7-18) 「アセ ンブ リ 制御デ ィ レ ク テ ィ ブ」 (ページ 7-36) 「Frame デ ィ レ ク テ ィ ブ」 (ページ 7-46) 「通知デ ィ レ ク テ ィ ブ」 (ページ 7-65) 「命令セ ッ ト と 構文選択のデ ィ レ ク テ ィ ブ」 (ページ 7-73) 「その他のデ ィ レ ク テ ィ ブ」 (ページ 7-77) 注 本章で説明す る デ ィ レ ク テ ィ ブは、 ARM C コ ンパ イ ラ お よ び C++ コ ンパ イ ラ の イ ン ラ イ ン アセ ン ブ ラ には使用で き ません。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-1 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.1 デ ィ レ ク テ ィ ブの一覧 (アルフ ァ ベ ッ ト 順) 表 7-1 は、 デ ィ レ ク テ ィ ブの一覧を示 し てい ます。 こ こ か ら 個々のデ ィ レ ク テ ィ ブの説明を見つけて下 さ い。 表 7-1 各デ ィ レ ク テ ィ ブの参照先 ディ レクテ ィ ブ ページ ディ レクテ ィ ブ ページ ディ レクテ ィ ブ ページ ALIGN (ページ 7-78) EXPORT、 GLOBAL (ページ 7-92) MACRO、 MEND (ページ 7-37) ARM、 CODE32 (ページ 7-74) EXPORTAS (ページ 7-94) MAP (ページ 7-21) AREA (ページ 7-81) EXTERN (ページ 7-97) MEND (「MACRO」 ASSERT (ページ 7-65) FIELD (ページ 7-23) MEXIT (ページ 7-41) ATTR (ページ 7-86) FRAME ADDRESS (ページ 7-48) NOFP (ページ 7-102) CN (ページ 7-14) FRAME POP (ページ 7-50) OPT (ページ 7-68) CODE16 (ページ 7-74) FRAME PUSH (ページ 7-52) PRESERVE8 (ページ 7-103) (ページ 7-35) FRAME REGISTER CP (ページ 7-15) FRAME RESTORE (ページ 7-56) QN (ページ 7-16) DATA (ページ 7-35) FRAME SAVE (ページ 7-58) RELOC (ページ 7-10) DCB (ページ 7-26) FRAME STATE REMEMBER (ページ 7-59) REQUIRE (ページ 7-102) DCD、 DCDU (ページ 7-27) FRAME STATE RESTORE (ページ 7-60) REQUIRE8、 PRESERVE8 (ページ 7-103) DCDO (ページ 7-28) FRAME UNWIND ON、 FRAME UNWIND OFF (ページ 7-61) RLIST (ページ 7-13) COMMON 7-2 を参 (ページ 7-37) 照) (「REQUIRE8」 を参照) (ページ 7-55) PROC (「FUNCTION」 を 参照) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential (ページ 7-62) ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 表 7-1 各デ ィ レ ク テ ィ ブの参照先 (続き) ディ レクテ ィ ブ ページ ディ レクテ ィ ブ ページ ディ レクテ ィ ブ ページ DCFD、 DCFDU (ページ 7-29) FUNCTION、 PROC (ページ 7-62) RN (ページ 7-12) DCFS、 DCFSU (ページ 7-30) GBLA、 GBLL、 GBLS (ページ 7-5) ROUT (ページ 7-104) DCI (ページ 7-31) GET、 INCLUDE (ページ 7-95) SETA、 SETL、 SETS (ページ 7-8) DCQ、 DCQU (ページ 7-33) GLOBAL (「EXPORT」 を (ページ 7-92) SN (ページ 7-16) DCW、 DCWU (ページ 7-34) IF、 ELSE、 ENDIF、 ELIF (ページ 7-42) SPACE ま たは FILL (ページ 7-24) DN (ページ 7-16) IMPORT (ページ 7-97) SUBT (ページ 7-71) ELIF、 ELSE (ページ 7-42) INCBIN (ページ 7-100) THUMB (ページ 7-74) (ページ 7-88) INCLUDE (「GET」 (ページ 7-95) THUMBX (ページ 7-74) ENDFUNC、 ENDP (ページ 7-64) INFO (ページ 7-67) TTL (ページ 7-71) ENDIF (「IF」 (ページ 7-42) KEEP (ページ 7-101) WHILE、 WEND (ページ 7-45) ENTRY (ページ 7-88) LCLA、 LCLL、 LCLS (ページ 7-7) EQU (ページ 7-90) LTORG (ページ 7-20) (「IF」 を参照) END を参照) ARM DUI 0204IJ 参照) を参 照) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-3 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.2 シ ンボル定義デ ィ レ ク テ ィ ブ こ のセ ク シ ョ ン では、 以下のデ ィ レ ク テ ィ ブについて説明 し ます。 • 「GBLA、 GBLL、 GBLS」 (ページ 7-5) グ ロ ーバル算術変数、 論理変数、 ま たは文字列変数を宣言 し ます。 • 「LCLA、 LCLL、 LCLS」 (ページ 7-7) ロ ーカル算術変数、 論理変数、 ま たは文字列変数を宣言 し ます。 • 「SETA、 SETL、 SETS」 (ページ 7-8) 算術変数、 論理変数、 ま たは文字列変数の値を設定 し ます。 • 「RELOC」 (ページ 7-10) オブジ ェ ク ト フ ァ イ ルで ELF の再配置を エ ン コ ー ド し ます。 • 「RN」 (ページ 7-12) 指定 さ れた レ ジ ス タ の名前を定義 し ます。 • 「RLIST」 (ページ 7-13) 汎用レ ジ ス タ セ ッ ト の名前を定義 し ます。 • 「CN」 (ページ 7-14) コ プ ロ セ ッ サ レ ジ ス タ 名を定義 し ます。 • 「CP」 (ページ 7-15) コ プ ロ セ ッ サ名を定義 し ます。 • 「QN、 DN、 お よ び SN」 (ページ 7-16) 倍精度ま たは単精度の VFP レ ジ ス タ 名を定義 し ます。 7-4 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.2.1 GBLA、 GBLL、 GBLS GBLA デ ィ レ ク テ ィ ブは、 グ ロ ーバル算術変数を宣言 し 、 その値をゼ ロ に初期 化 し ます。 GBLL デ ィ レ ク テ ィ ブは、 グ ロ ーバル論理変数を宣言 し 、 その値を {FALSE} に初 期化 し ます。 GBLS デ ィ レ ク テ ィ ブは、 グ ロ ーバル文字列変数を宣言 し 、 その値を NULL 文 字列 "" に初期化 し ます。 構文 <gblx> variable 各項目には以下の意味があ り ます。 <gblx> GBLA、 GBLL、 ま たは GBLS のいずれか を指定 し ます。 variable 変数の名前を指定 し ます。 variable は、 ソ ース フ ァ イ ル内のシ ン ボルの中で一意であ る 必要があ り ます。 使用法 定義済みの変数に対 し て上記のデ ィ レ ク テ ィ ブのいずれか を使用す る と 、 そ の変数は上記 と 同 じ 値に再初期化 さ れます。 変数の有効範囲は、 その変数を含む ソ ース フ ァ イ ル内に制限 さ れてい ます。 変数の値は、 SETA、 SETL、 ま たは SETS のいずれかのデ ィ レ ク テ ィ ブ を使用 し て 設定 し ます (「SETA、 SETL、 SETS」 (ページ 7-8) を参照)。 ロ ーカル変数の宣言については、 「LCLA、 LCLL、 LCLS」 (ページ 7-7) を参 照 し て下 さ い。 グ ロ ーバル変数は、--predefine アセ ンブ ラ コ マ ン ド ラ イ ン オプシ ョ ン を使用 し て設定す る こ と も で き ます。 詳細については、 「 コ マ ン ド 構文」 (ページ 3-2) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-5 デ ィ レ クテ ィ ブ リ フ ァ レンス 例 例 7-1 では、 変数 objectsize が宣言 さ れ、 objectsize の値が 0xFF に設定 さ れま す。 その後、 その値が SPACE デ ィ レ ク テ ィ ブで使用 さ れます。 例 7-1 objectsize GBLA SETA . . . SPACE objectsize 0xFF ; declare the variable name ; set its value ; other code objectsize ; quote the variable 例 7-2 は、 armasm を呼び出す場合の変数の宣言方法 と 設定方法を示 し てい ま す。 アセ ン ブ リ 時に変数の値を設定す る 場合は、 こ の方法を使用 し て下 さ い。--pd は、--predefine と 同 じ 意味です。 例 7-2 armasm --predefine "objectsize SETA 0xFF" sourcefile -o objectfile 7-6 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.2.2 LCLA、 LCLL、 LCLS LCLA デ ィ レ ク テ ィ ブは、 ロ ーカル算術変数を宣言 し 、 その値を ゼ ロ に初期化 し ます。 LCLL デ ィ レ ク テ ィ ブは、 ロ ーカル論理変数を宣言 し 、 その値を {FALSE} に初期 化 し ます。 LCLS デ ィ レ ク テ ィ ブは、 ロ ーカル文字列変数を宣言 し 、 その値を NULL 文字 列 "" に初期化 し ます。 構文 <lclx> variable 各引数には以下の意味があ り ます。 <lclx> LCLA、 LCLL、 ま たは LCLS のいずれか を指定 し ます。 variable 変数の名前を指定 し ます。 variable は、 マ ク ロ 内で一意であ る 必 要があ り ます。 使用法 定義済みの変数に対 し て上記のデ ィ レ ク テ ィ ブのいずれか を使用す る と 、 そ の変数は上記 と 同 じ 値に再初期化 さ れます。 変数の有効範囲は、 その変数を含むマ ク ロ の特定の イ ン ス タ ン ス に制限 さ れ てい ます (「MACRO、 MEND」 (ページ 7-37) を参照)。 変数の値は、 SETA、 SETL、 ま たは SETS のいずれかのデ ィ レ ク テ ィ ブ を使用 し て 設定 し ます (「SETA、 SETL、 SETS」 (ページ 7-8) を参照)。 グ ロ ーバル変数の宣言については、 「GBLA、 GBLL、 GBLS」 (ページ 7-5) を 参照 し て下 さ い。 例 $label err $label ARM DUI 0204IJ MACRO message $a LCLS err SETS ; code INFO MEND "error no: " ; ; ; ; ; Declare a macro Macro prototype line Declare local string variable err. Set value of err 0, "err":CC::STR:$a ; Use string Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-7 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.2.3 SETA、 SETL、 SETS SETA デ ィ レ ク テ ィ ブは、 ロ ーカル算術変数ま たはグ ロ ーバル算術変数の値を 設定 し ます。 SETL デ ィ レ ク テ ィ ブは、 ロ ーカル論理変数ま たはグ ロ ーバル論理変数の値を 設定 し ます。 SETS デ ィ レ ク テ ィ ブは、 ロ ーカル文字列変数ま たはグ ロ ーバル文字列変数の 値を設定 し ます。 構文 variable <setx> expr 各項目には以下の意味があ り ます。 <setx> SETA、 SETL、 ま たは SETS のいずれか を指定 し ます。 variable GBLA、 GBLL、 GBLS、 LCLA、 LCLL、 ま たは LCLS のいずれかのデ ィ レ ク テ ィ ブで宣言 さ れ る 変数の名前を指定 し ます。 以下の式を指定 し ます。 expr • SETA の場合は、 数値式 (「数値式」 (ページ 3-36) を参照) • SETL の場合は、 論理式 (「論理式」 (ページ 3-39) を参照) • SETS の場合は、 文字列式 (「文字列式」 (ページ 3-35) を参 照) 使用法 いずれかのデ ィ レ ク テ ィ ブ を使用す る 前に、 グ ロ ーバル宣言デ ィ レ ク テ ィ ブ ま たは ロ ーカル宣言デ ィ レ ク テ ィ ブ を使用 し て variable を宣言す る 必要があ り ます。 詳細については、 「GBLA、 GBLL、 GBLS」 (ページ 7-5) お よ び 「LCLA、 LCLL、 LCLS」 (ページ 7-7) を参照 し て下 さ い。 ま た、 変数名は コ マ ン ド ラ イ ン で事前に定義す る こ と も で き ます。 詳細につ いては、 「コ マ ン ド 構文」 (ページ 3-2) を参照 し て下 さ い。 例 VersionNumber 7-8 GBLA SETA GBLL VersionNumber 21 Debug Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス Debug VersionString ARM DUI 0204IJ SETL GBLS SETS {TRUE} VersionString "Version 1.0" Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-9 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.2.4 RELOC RELOC デ ィ レ ク テ ィ ブは、 オブジ ェ ク ト フ ァ イ ルで ELF の再配置を明示的にエ ン コ ー ド し ます。 構文 RELOC n, symbol RELOC n 各項目には以下の意味があ り ます。 n 0 ~ 255 の範囲内の値を指定す る 必要があ り ます。 symbol 任意のプ ロ グ ラ ム相対 ラ ベルを指定で き ます。 使用法 RELOC n, symbol を使用 し 、 symbol と い う ラ ベルの付いた ア ド レ ス を基準に し て 再配置を行い ます。 RELOC デ ィ レ ク テ ィ ブ を ARM 命令ま たは Thumb 命令の直後に使用す る と 、 そ の命令で再配置が行われ ます。 RELOC デ ィ レ ク テ ィ ブ を DCB、 DCW、 DCD、 ま たは その他のデー タ 生成デ ィ レ ク テ ィ ブの直後に使用す る と 、 デー タ の開始位置 で再配置が行われ ます。 適用 さ れ る 加数は、 命令ま たは DCI か DCD でエ ン コ ー ド す る 必要があ り ます。 アセ ン ブ ラ に よ っ て同 じ 場所で既に再配置が行われてい る 場合、 RELOC デ ィ レ ク テ ィ ブの設定内容で再配置が更新 さ れ ます。 以下に例を示 し ます。 DCD RELOC sym2 ; R_ARM_ABS32 to sym32 55 ; ... makes it R_ARM_ABS32_NOI RELOC は、 デー タ 生成デ ィ レ ク テ ィ ブ以外のデ ィ レ ク テ ィ ブ、 LTORG、 ALIGN の後 に使用 し た り 、 AREA の最初の項目 と し て使用 し た り し た場合な ど、 その他す べての場合に失敗 し ます。 RELOC n を使用 し 、 匿名のシ ン ボル (シ ン ボルテーブルのシ ン ボル 0) を基準 に再配置を行い ます。 以前にアセ ンブ ラ に よ っ て再配置が行われていない場 合に RELOC n を使用す る と 、 匿名のシ ン ボルを基準に再配置が行われ ます。 詳 細については、 『Application Binary Interface for the ARM Architecture』 を参照 し て下 さ い。 7-10 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 例 IMPORT LDR RELOC DCD RELOC DCD RELOC ARM DUI 0204IJ impsym r0,[pc,#-8] 4, impsym 0 2, sym 0,1,2,3,4 ; the final word is relocated 38,sym2 ; R_ARM_TARGET1 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-11 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.2.5 RN RN デ ィ レ ク テ ィ ブは、 指定 さ れた レ ジ ス タ の レ ジ ス タ 名を定義 し ます。 構文 name RN expr 各項目には以下の意味があ り ます。 レ ジ ス タ に割 り 当て る 名前を指定 し ます。 name には、 「定義済み の レ ジ ス タ お よ び コ プ ロ セ ッ サ名」 (ページ 3-24) に記載 さ れた name 定義済みの名前 と 同 じ 名前を指定で き ません。 0 ~ 15 の レ ジ ス タ 番号を求め る 式を指定 し ます。 expr 使用法 RN を使用 し て適切な名前を レ ジ ス タ に割 り 当て る こ と に よ り 、 各レ ジ ス タ の 使用目的を明確にす る こ と がで き ます。 同一レ ジ ス タ に複数の名前を付けて 矛盾を生 じ さ せ る よ う な使用方法は避けて下 さ い。 例 regname sqr4 7-12 RN RN 11 r6 ; defines regname for register 11 ; defines sqr4 for register 6 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.2.6 RLIST RLIST (レ ジ ス タ リ ス ト ) デ ィ レ ク テ ィ ブは、 汎用レ ジ ス タ セ ッ ト の名前を指 定 し ます。 構文 name RLIST {list-of-registers} 各項目には以下の意味があ り ます。 レ ジ ス タ セ ッ ト に割 り 当て る 名前を指定 し ます。 name には、 「定 義済みの レ ジ ス タ お よ び コ プ ロ セ ッ サ名」 (ページ 3-24) に記載 name さ れた定義済みの名前 と 同 じ 名前を指定で き ません。 list-of-registers レ ジ ス タ 名 と レ ジ ス タ 範囲を コ ン マで区切っ て並べた リ ス ト を 指定 し ます。 レ ジ ス タ リ ス ト は括弧で囲む必要があ り ます。 使用法 RLIST を使用 し て、 LDM 命令ま たは STM 命令に よ っ て転送 さ れ る レ ジ ス タ セ ッ ト に名前を付け ます。 LDM お よ び STM は、 LDM 命令ま たは STM 命令に指定 さ れた順序に関係な く 、 最 も 小 さ い物理レ ジ ス タ 番号の内容を、 メ モ リ 内の最下位ア ド レ ス に格納 し ます。 シ ン ボルレ ジ ス タ 名を既に定義 し てい る 場合は、 レ ジ ス タ リ ス ト が昇順で指 定 さ れてい る か ど う かが分か り に く い こ と があ り ます。 アセ ン ブ ラ オプシ ョ ン --diag_warning 1206 を使用 し て、 レ ジ ス タ リ ス ト 内の レ ジ ス タ が昇順で指定 さ れてい る こ と を確認 し て下 さ い。 レ ジ ス タ が昇順で指 定 さ れていない場合には、 警告が生成 さ れます。 例 Context RLIST ARM DUI 0204IJ {r0-r6,r8,r10-r12,r15} Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-13 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.2.7 CN CN デ ィ レ ク テ ィ ブは、 コ プ ロ セ ッ サ レ ジ ス タ の名前を定義 し ます。 構文 name CN expr 各項目には以下の意味があ り ます。 コ プ ロ セ ッ サ レ ジ ス タ に定義す る 名前を指定 し ます。 name には、 name 「定義済みの レ ジ ス タ お よ び コ プ ロ セ ッ サ名」 (ページ 3-24) に 記載 さ れた定義済みの名前 と 同 じ 名前を指定で き ません。 0 ~ 15 の コ プ ロ セ ッ サ レ ジ ス タ 番号を求め る 式を指定 し ます。 expr 使用法 CN を使用 し て適切な名前を レ ジ ス タ に割 り 当て る こ と に よ り 、 各レ ジ ス タ の 使用目的を明確にす る こ と がで き ます。 注 同一レ ジ ス タ に複数の名前を付けて矛盾を生 じ さ せ る よ う な使用方法は避け て下 さ い。 c0 ~ c15 と い う 名前が事前に定義 さ れてい ます。 例 power 7-14 CN 6 ; defines power as a symbol for ; coprocessor register 6 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.2.8 CP CP デ ィ レ ク テ ィ ブは、 指定 さ れた コ プ ロ セ ッ サの名前を定義 し ます。 コ プ ロ セ ッ サ番号には、 0 ~ 15 の番号を指定す る 必要があ り ます。 構文 name CP expr 各項目には以下の意味があ り ます。 コ プ ロ セ ッ サに割 り 当て る 名前を指定 し ます。 name には、 「定義 済みの レ ジ ス タ お よ び コ プ ロ セ ッ サ名」 (ページ 3-24) に記載 さ name れた定義済みの名前 と 同 じ 名前を指定で き ません。 0 ~ 15 の コ プ ロ セ ッ サ番号を求め る 式を指定 し ます。 expr 使用法 CP を使用 し て適切な名前を コ プ ロ セ ッ サに割 り 当て る こ と に よ り 、 各 コ プ ロ セ ッ サの使用目的を明確にす る こ と がで き ます。 注 同一 コ プ ロ セ ッ サに複数の名前を付けて矛盾を生 じ さ せ る よ う な使用方法は 避けて下 さ い。 コ プ ロ セ ッ サ 0 ~ 15 には、 p0 ~ p15 と い う 名前が事前に定義 さ れてい ます。 例 dmu ARM DUI 0204IJ CP 6 ; defines dmu as a symbol for ; coprocessor 6 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-15 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.2.9 QN、 DN、 お よび SN QN デ ィ レ ク テ ィ ブは、 指定 さ れた 128 ビ ッ ト 拡張レ ジ ス タ の名前を定義 し ま す。 DN デ ィ レ ク テ ィ ブは、 指定 さ れた 64 ビ ッ ト 拡張レ ジ ス タ の名前を定義 し ま す。 SN デ ィ レ ク テ ィ ブは、 指定 さ れた単精度 VFP レ ジ ス タ の名前を定義 し ます。 構文 name directive expr{.type}{[x]} 各項目には以下の意味があ り ます。 directive QN、 DN、 ま たは SN を指定 し ます。 name 拡張レ ジ ス タ に割 り 当て る 名前を指定 し ます。 name には、 「定義 済みの レ ジ ス タ お よ び コ プ ロ セ ッ サ名」 (ページ 3-24) に記載 さ れた定義済みの名前 と 同 じ 名前を指定で き ません。 以下を指定 し ます。 expr • 倍精度 VFPv2 レ ジ ス タ ま たは NEON 128 ビ ッ ト レ ジ ス タ の 場合は 0 ~ 15、 それ以外の場合は 0 ~ 31 の範囲の値を求め る 式。 • 定義済みレ ジ ス タ 名、 ま たは以前のデ ィ レ ク テ ィ ブで定義 済みの レ ジ ス タ 名。 「NEON デー タ 型お よ び VFP デー タ 型」 (ページ 5-16) で説明 さ type れてい る デー タ 型を指定 し ます。 NEON コ ー ド でのみ使用 さ れ ます。 [x] は、 レ ジ ス タ への ス カ ラ イ ンデ ク ス を指定 し ます。 [x] type お よ び [x] は拡張表記 です。 詳細については、 「拡張表記」 (ページ 5-20) を、 使用例については、 「拡張表記の例」 (ページ 7-17) を参照 し て下 さ い。 使用法 QN、 DN、 ま たは SN を使用 し て適切な名前を拡張レ ジ ス タ に割 り 当て る こ と に よ り 、 各レ ジ ス タ の使用目的を明確にす る こ と がで き ます。 7-16 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 注 同一レ ジ ス タ に複数の名前を付けて矛盾を生 じ さ せ る よ う な使用方法は避け て下 さ い。 DN デ ィ レ ク テ ィ ブ ま たは SN デ ィ レ ク テ ィ ブではベ ク タ 長を指定で き ません (「VFP デ ィ レ ク テ ィ ブ と ベ ク タ 表記」 (ページ 5-128) を参照)。 例 energy DN 6 mass SN 16 ; ; ; ; defines energy as a symbol for VFP double-precision register 6 defines mass as a symbol for VFP single-precision register 16 拡張表記の例 varA varB varC index result ARM DUI 0204IJ DN DN DN VADD DN QN VMULL d1.U16 d2.U16 d3.U16 varA,varB,varC d4.U16[0] q5.I32 result,varA,index ; VADD.U16 d1,d2,d3 ; VMULL.U16 q5,d1,d3[2] Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-17 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3 デー タ 定義デ ィ レ ク テ ィ ブ こ のセ ク シ ョ ン では、 メ モ リ の割 り 当て、 デー タ 構造の定義、 お よ び メ モ リ の初期内容の設定を行 う 以下のデ ィ レ ク テ ィ ブについて説明 し ます。 • 「LTORG」 (ページ 7-20) リ テ ラ ルプールの起点を設定 し ます。 • 「MAP」 (ページ 7-21) 記憶域マ ッ プの起点を設定 し ます。 • 「FIELD」 (ページ 7-23) 記憶域マ ッ プ内の フ ィ ール ド を定義 し ます。 • 「SPACE ま たは FILL」 (ページ 7-24) ゼ ロ 初期化 さ れ る メ モ リ ブ ロ ッ ク を割 り 当て ます。 • 「DCB」 (ページ 7-26) バ イ ト 単位で メ モ リ を割 り 当てて、 初期内容を指定 し ます。 • 「DCD、 DCDU」 (ページ 7-27) ワー ド 単位で メ モ リ を割 り 当てて、 初期内容を指定 し ます。 • 「DCDO」 (ページ 7-28) ワー ド 単位で メ モ リ を割 り 当てて、 ス タ テ ィ ッ ク ベース レ ジ ス タ か ら の オ フ セ ッ ト と し て初期内容を指定 し ます。 • 「DCFD、 DCFDU」 (ページ 7-29) ダブル ワー ド 単位で メ モ リ を割 り 当てて、 倍精度浮動小数点数 と し て初 期内容を指定 し ます。 • 「DCFS、 DCFSU」 (ページ 7-30) ワー ド 単位で メ モ リ を割 り 当てて、 単精度浮動小数点数 と し て初期内容 を指定 し ます。 • 「DCI」 (ページ 7-31) ワー ド 単位で メ モ リ を割 り 当てて、 初期内容を指定 し ます。 メ モ リ 位置 をデー タ ではな く コ ー ド と し てマー ク し ます。 • 「DCQ、 DCQU」 (ページ 7-33) ダブル ワー ド 単位で メ モ リ を割 り 当てて、 64 ビ ッ ト 整数 と し て初期内 容を指定 し ます。 7-18 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス • 「DCW、 DCWU」 (ページ 7-34) ハーフ ワー ド 単位で メ モ リ を割 り 当て て、 初期内容を指定 し ます。 • 「COMMON」 (ページ 7-35) ブ ロ ッ ク 単位で メ モ リ を シ ン ボルに割 り 当て て、 境界調整を指定 し ま す。 • 「DATA」 (ページ 7-35) コ ー ド セ ク シ ョ ン内のデー タ を マー ク し ます。 こ のデ ィ レ ク テ ィ ブは、 下位互換性を維持す る 目的だけでサポー ト さ れてい ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-19 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.1 LTORG LTORG デ ィ レ ク テ ィ ブは、 現在の リ テ ラ ルプールをす ぐ にアセ ン ブルす る よ う アセ ン ブ ラ に指示 し ます。 構文 LTORG 使用法 アセ ン ブ ラ は、 各 コ ー ド セ ク シ ョ ン の終了位置で現在の リ テ ラ ルプールを ア セ ン ブル し ます。 コ ー ド セ ク シ ョ ンの終了位置は、 次のセ ク シ ョ ンの先頭に あ る AREA デ ィ レ ク テ ィ ブに よ っ て決ま る か、 ま たはアセ ン ブ リ の終了位置 と な り ます。 こ の よ う なデフ ォ ル ト の リ テ ラ ルプールは、 LDR、 VLDR、 お よ び WLDR 疑似命令 の範囲外にな る 場合があ り ます。 リ テ ラ ルプールが範囲内でアセ ン ブル さ れ てい る こ と を確認す る には、 LTORG を使用 し ます。 擬似命令の詳細については、 以下を参照 し て下 さ い。 • 「LDR 疑似命令」 (ページ 4-170) • • 「VLDR 疑似命令」 (ページ 5-96) 「ワ イ ヤ レ ス MMX ロ ー ド / ス ト ア命令」 (ページ 6-6) 大 き なプ ロ グ ラ ム では、 複数の リ テ ラ ルプールが必要にな る 場合があ り ます。 定数がプ ロ セ ッ サに よ っ て命令 と し て実行 さ れない よ う に、 LTORG デ ィ レ ク テ ィ ブは、 無条件分岐ま たはサブルーチン復帰命令の後に配置 し て下 さ い。 リ テ ラ ルプール内のデー タ は、 アセ ン ブ ラ に よ っ て ワ ー ド 境界で整列 さ れま す。 例 start func1 data AREA BL ; code LDR ; code MOV LTORG SPACE END 7-20 Example, CODE, READONLY func1 ; function body r1,=0x55555555 ; => LDR R1, [pc, #offset to Literal Pool 1] pc,lr ; ; ; ; ; 4200 end function Literal Pool 1 contains literal &55555555. Clears 4200 bytes of memory, starting at current location. Default literal pool is empty. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.2 MAP MAP デ ィ レ ク テ ィ ブは、 指定 さ れたア ド レ ス を記憶域マ ッ プの起点 と し て設定 し ます。 記憶域マ ッ プの位置カ ウ ン タ {VAR} には、 同 じ ア ド レ ス が設定 さ れま す。 ^ は MAP と 同 じ 意味です。 構文 MAP expr{,base-register} 各項目には以下の意味があ り ます。 数値式ま たはプ ロ グ ラ ム相対式を指定 し ます。 expr • base-register が指定 さ れていない場合は、 expr に よ っ て記 憶域マ ッ プの開始ア ド レ ス が求め ら れ ます。 記憶域マ ッ プ の位置カ ウ ン タ には、 同 じ ア ド レ ス が設定 さ れ ます。 • expr にプ ロ グ ラ ム相対式が指定 さ れてい る 場合、 マ ッ プ内 で ラ ベルを使用す る には、 ラ ベルを事前に定義 し てお く 必 要があ り ます。 マ ッ プでは、 アセ ン ブ ラ の最初のパ ス で ラ ベルを定義す る 必要があ り ます。 base-register レ ジ ス タ を指定 し ます。 base-register が指定 さ れてい る 場合、 記 憶域マ ッ プの開始ア ド レ ス は、 expr と 、 ラ ン タ イ ム の base-register の値の合計にな り ます。 使用法 記憶域マ ッ プ を記述す る には、 MAP デ ィ レ ク テ ィ ブ を FIELD デ ィ レ ク テ ィ ブ と 組み合わせて使用 し ます。 base-register を指定 し て レ ジ ス タ 相対 ラ ベルを定義 し ます。 次の MAP デ ィ レ ク テ ィ ブが出現す る ま で、 こ のベース レ ジ ス タ が、 後続の FIELD デ ィ レ ク テ ィ ブ で定義 さ れ る すべての ラ ベル内で暗黙的に使用 さ れます。 レ ジ ス タ 相対 ラ ベ ルは、 ロ ー ド 命令 と ス ト ア命令で使用で き ます。 こ の例については、 「FIELD」 (ページ 7-23) を参照 し て下 さ い。 MAP デ ィ レ ク テ ィ ブ を複数回使用す る こ と に よ り 、 複数の記憶域マ ッ プ を定義 で き ます。 最初の MAP デ ィ レ ク テ ィ ブが使用 さ れ る ま で、 {VAR} カ ウ ン タ にはゼ ロ が設定 さ れ ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-21 デ ィ レ クテ ィ ブ リ フ ァ レンス 例 MAP MAP 7-22 0,r9 0xff,r9 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.3 FIELD FIELD デ ィ レ ク テ ィ ブは、 MAP デ ィ レ ク テ ィ ブ を使用 し て定義 さ れた記憶域 マ ッ プ内の空間を定義 し ます。 # は FIELD と 同 じ 意味です。 構文 {label} FIELD expr 各項目には以下の意味があ り ます。 label ラ ベルを指定 し ます (省略可)。 指定 さ れてい る 場合は、 label に 記憶域マ ッ プの位置カ ウ ン タ {VAR} の値が割 り 当て ら れます。 そ の後、 記憶域マ ッ プの位置カ ウ ン タ は、 expr の値で イ ン ク リ メ ン ト さ れ ます。 expr 記憶域マ ッ プの位置カ ウ ン タ を イ ン ク リ メ ン ト す る バ イ ト 数を 求め る 式を指定 し ます。 使用法 記憶域マ ッ プが base-register を指定す る MAP デ ィ レ ク テ ィ ブに よ っ て設定 さ れ てい る 場合は、 次の MAP デ ィ レ ク テ ィ ブが出現す る ま で、 こ のベース レ ジ ス タ が、 後続の FIELD デ ィ レ ク テ ィ ブで定義 さ れ る すべての ラ ベル内で暗黙的に 使用 さ れ ます。 こ れ ら の レ ジ ス タ 相対 ラ ベルは、 ロ ー ド 命令 と ス ト ア命令で 使用で き ます (「MAP」 (ページ 7-21) を参照)。 例 以下の例は、 MAP デ ィ レ ク テ ィ ブ と FIELD デ ィ レ ク テ ィ ブ を使用 し て レ ジ ス タ 相対 ラ ベルを定義す る 方法を示 し てい ます。 MAP FIELD Lab FIELD LDR ARM DUI 0204IJ 0,r9 4 4 r0,Lab ; ; ; ; ; set {VAR} to the address stored in r9 increment {VAR} by 4 bytes set Lab to the address [r9 + 4] and then increment {VAR} by 4 bytes equivalent to LDR r0,[r9,#4] Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-23 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.4 SPACE または FILL SPACE デ ィ レ ク テ ィ ブは、 ゼ ロ 初期化 さ れ る メ モ リ ブ ロ ッ ク を予約 し ます。 % は SPACE と 同 じ 意味です。 FILL デ ィ レ ク テ ィ ブは、 所定の値で埋め る メ モ リ ブ ロ ッ ク を予約 し ます。 構文 {label} SPACE expr {label} FILL expr{,value{,valuesize}} 各項目には以下の意味があ り ます。 label ラ ベルを指定 し ます (省略可)。 expr 埋め る かゼ ロ 初期化す る バ イ ト の数を求め る 式を指定 し ます (「数値式」 (ページ 3-36) を参照)。 value 確保 し たバ イ ト を埋め る 値に評価 さ れます。 value はオプシ ョ ン であ り 、 省略 さ れた場合には、 0 にな り ます。 NOINIT 領域では value であ る 必要があ り ます。 valuesize value のサ イ ズ (バ イ ト 数単位)。 1、 2、 お よ び 4 のいずれかの値 を取 り ます。 valuesize はオプシ ョ ン であ り 、 省略 さ れた場合に は、 1 にな り ます。 使用法 SPACE ま たは FILL デ ィ レ ク テ ィ ブの後の コ ー ド の境界を整列す る には、 ALIGN デ ィ レ ク テ ィ ブ を使用 し ます。 詳細については、 「ALIGN」 (ページ 7-78) を 参照 し て下 さ い。 以下 も 参照 し て下 さ い。 • 「DCB」 (ページ 7-26) • • • 7-24 「DCD、 DCDU」 (ページ 7-27) 「DCDO」 (ページ 7-28) 「DCW、 DCWU」 (ページ 7-34) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 例 data1 data2 ARM DUI 0204IJ AREA SPACE FILL MyData, DATA, READWRITE 255 ; defines 255 bytes of zeroed store 50,0xAB,1 ; defines 50 bytes containing 0xAB Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-25 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.5 DCB DCB デ ィ レ ク テ ィ ブは、 バ イ ト 単位で メ モ リ を割 り 当て て、 実行時の メ モ リ の 初期内容を定義 し ます。 = は DCB と 同 じ 意味です。 構文 {label} DCB expr{,expr}... 各項目には以下の意味があ り ます。 以下のいずれか を指定 し ます。 expr • -128 ~ 255 の範囲の整数を求め る 数値式 (「数値式」 (ペー ジ 3-36) を参照)。 • 引用符で囲まれた文字列。 文字列中の文字は ス ト アの連続 し たバ イ ト に ロ ー ド さ れます。 使用法 DCB の後に命令が続 く 場合、 ALIGN デ ィ レ ク テ ィ ブ を使用 し て命令を整列 さ せ て下 さ い。 詳細については、 「ALIGN」 (ページ 7-78) を参照 し て下 さ い。 以下 も 参照 し て下 さ い。 「DCD、 DCDU」 (ページ 7-27) • • • • 「DCQ、 DCQU」 (ページ 7-33) 「DCW、 DCWU」 (ページ 7-34) 「SPACE ま たは FILL」 (ページ 7-24) 例 C 言語の文字列 と は異な り 、 ARM アセ ン ブ ラ の文字列の終端は NULL ではあ り ません。 終端が NULL の C 言語の文字列は、 DCB を以下の よ う に使用 し て作 成で き ます。 C_string 7-26 DCB "C_string",0 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.6 DCD、 DCDU DCD デ ィ レ ク テ ィ ブは、 ワ ー ド 単位で メ モ リ を割 り 当て て 4 バ イ ト 境界で整列 さ せ、 実行時の メ モ リ の初期内容を定義 し ます。 & は DCD と 同 じ 意味です。 メ モ リ の境界調整が任意であ る 点を除 き 、 DCDU も 同 じ です。 構文 {label} DCD{U} expr{,expr} 各引数には以下の意味があ り ます。 以下のいずれか を指定 し ます。 • 数値式 (「数値式」 (ページ 3-36) を参照) expr • プ ロ グ ラ ム相対式 使用法 DCD は、 必要に応 じ て、 最初に定義 さ れた ワー ド の前に最大 3 バ イ ト のパデ ィ ン グ を挿入 し て、 境界調整を 4 バ イ ト に し ます。 境界調整が不要な場合は、 DCDU を使用 し て下 さ い。 以下 も 参照 し て下 さ い。 「DCB」 (ページ 7-26) • • • • • 「DCI」 (ページ 7-31) 「DCW、 DCWU」 (ページ 7-34) 「DCQ、 DCQU」 (ページ 7-33) 「SPACE ま たは FILL」 (ページ 7-24) 例 ARM DUI 0204IJ data1 DCD data2 DCD data3 AREA DCB DCDU 1,5,20 ; ; mem06 + 4 ; ; MyData, DATA, 255 ; 1,5,20 ; ; Defines 3 words containing decimal values 1, 5, and 20 Defines 1 word containing 4 + the address of the label mem06 READWRITE Now misaligned ... Defines 3 words containing 1, 5 and 20, not word aligned Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-27 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.7 DCDO DCDO デ ィ レ ク テ ィ ブは、 ワー ド 単位で メ モ リ を割 り 当て て、 4 バ イ ト 境界で 整列 さ せ、 実行時の メ モ リ の初期内容を ス タ テ ィ ッ ク ベース レ ジ ス タ sb (r9) か ら のオ フ セ ッ ト と し て定義 し ます。 構文 {label} DCDO expr{,expr}... 各項目には以下の意味があ り ます。 レ ジ ス タ 相対式ま たは ラ ベルを指定 し ます。 ベース レ ジ ス タ には sb を指定す る 必要があ り ます。 expr 使用法 DCDO を使用 し て、 ス タ テ ィ ッ ク ベース レ ジ ス タ と 相対的な再配置可能ア ド レ ス のために メ モ リ 内の空間を割 り 当て ます。 例 IMPORT DCDO 7-28 externsym externsym ; 32-bit word relocated by offset of ; externsym from base of SB section. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.8 DCFD、 DCFDU DCFD デ ィ レ ク テ ィ ブは、 ワ ー ド 境界で整列 さ れた倍精度浮動小数点数に メ モ リ を割 り 当て、 実行時の メ モ リ の初期内容を定義 し ます。 倍精度浮動小数点 数には 2 ワ ー ド が使用 さ れます。 こ の 2 ワー ド を算術演算で使用す る には、 ワー ド 境界で整列 さ せ る 必要があ り ます。 メ モ リ の境界調整が任意であ る 点を除 き 、 DCFDU も 同 じ です。 構文 {label} DCFD{U} fpliteral{,fpliteral}... 各引数には以下の意味があ り ます。 fpliteral 倍精度浮動小数点 リ テ ラ ルを指定 し ます (「浮動小数点 リ テ ラ ル」 (ページ 3-38) を参照)。 使用法 アセ ン ブ ラ は、 必要に応 じ て、 最初に定義 さ れた数値の前に最大 3 バ イ ト の パデ ィ ン グ を挿入 し て、 境界調整を 4 バ イ ト に し ます。 境界調整が不要な場合は、 DCFDU を使用 し て下 さ い。 fpliteral を内部形式に変換す る 場合に使用 さ れ る ワ ー ド の順序は、 選択 さ れ た浮動小数点アーキ テ ク チ ャ に よ っ て制御 さ れ ます。 --fpu none オプシ ョ ン を 選択す る と 、 DCFD お よ び DCFDU は使用で き ません。 倍精度数値の範囲は以下の と お り です。 • 最大 : 1.79769313486231571e+308 • 最小 : 2.22507385850720138e–308 「DCFS、 DCFSU」 (ページ 7-30) も 参照 し て下 さ い。 例 DCFD DCFDU ARM DUI 0204IJ 1E308,-4E-100 10000,-.1,3.1E26 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-29 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.9 DCFS、 DCFSU DCFS デ ィ レ ク テ ィ ブは、 ワー ド 境界で整列 さ れた単精度浮動小数点数に メ モ リ を割 り 当て て、 実行時の メ モ リ の初期内容を定義 し ます。 単精度浮動小数 点数には 1 ワ ー ド が使用 さ れます。 こ の 1 ワー ド を算術演算で使用す る には、 ワー ド 境界で整列 さ せ る 必要があ り ます。 メ モ リ の境界調整が任意であ る 点を除 き 、 DCFSU も 同 じ です。 構文 {label} DCFS{U} fpliteral{,fpliteral}... 各引数には以下の意味があ り ます。 fpliteral 単精度浮動小数点 リ テ ラ ルを指定 し ます (「浮動小数点 リ テ ラ ル」 (ページ 3-38) を参照)。 使用法 DCFS は、 必要に応 じ て、 最初に定義 さ れた数値の前に最大 3 バ イ ト のパデ ィ ン グ を挿入 し て、 境界調整を 4 バ イ ト に し ます。 境界調整が不要な場合は、 DCFSU を使用 し て下 さ い。 単精度数値の範囲は以下の と お り です。 • 最大 : 3.40282347e+38 • 最小 : 1.17549435e–38 「DCFD、 DCFDU」 (ページ 7-29) も 参照 し て下 さ い。 例 DCFS DCFSU 7-30 1E3,-4E-9 1.0,-.1,3.1E6 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.10 DCI ARM コ ー ド では、 DCI デ ィ レ ク テ ィ ブは、 ワー ド 単位で メ モ リ を割 り 当てて、 4 バ イ ト 境界で整列 さ せ、 実行時の メ モ リ の初期内容を定義 し ます。 Thumb コ ー ド では、 DCI デ ィ レ ク テ ィ ブは、 ハーフ ワー ド 単位で メ モ リ を割 り 当て て、 2 バ イ ト 境界で整列 さ せ、 実行時の メ モ リ の初期内容を定義 し ます。 構文 {label} DCI{.W} expr{,expr} 各引数には以下の意味があ り ます。 expr 数値式を指定 し ます (「数値式」 (ページ 3-36) を参照)。 .W 指定 さ れてい る 場合は、 Thumb コ ー ド に 4 バ イ ト を挿入す る 必 要があ る こ と を示 し ます。 使用法 DCI デ ィ レ ク テ ィ ブは、 DCD デ ィ レ ク テ ィ ブや DCW デ ィ レ ク テ ィ ブ と よ く 似てい ますが、 メ モ リ 位置はデー タ ではな く コ ー ド と し てマー ク さ れます。 使用 し てい る アセ ン ブ ラ のバージ ョ ン でサポー ト さ れていない新 し い命令のマ ク ロ を記述す る 場合は、 DCI を使用 し て下 さ い。 ARM コ ー ド では、 DCI は、 必要に応 じ て、 最初に定義 さ れた ワ ー ド の前に最 大 3 バ イ ト のパデ ィ ン グ を挿入 し て、 境界調整を 4 バ イ ト に し ます。 Thumb コ ー ド では、 DCI は、 必要に応 じ て、 先頭バ イ ト のパデ ィ ン グ を挿入 し て、 境 界調整を 2 バ イ ト に し ます。 DCI を使用 し て、 ビ ッ ト パ タ ーン を命令ス ト リ ームに挿入で き ます。 例えば、 以下を使用 し ます。 DCI 0x46c0 Thumb 演算 MOV r8,r8 が挿入 さ れ ます。 「DCD、 DCDU」 (ページ 7-27) お よ び 「DCW、 DCWU」 (ページ 7-34) も 参 照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-31 デ ィ レ クテ ィ ブ リ フ ァ レンス 例 MACRO ; this macro translates newinstr Rd,Rm ; to the appropriate machine code $Rd,$Rm 0xe16f0f10 :OR: ($Rd:SHL:12) :OR: $Rm newinst DCI MEND Thumb-2 の例 DCI.W 7-32 0xf3af8000 ; inserts 32-bit NOP, 2-byte aligned. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.11 DCQ、 DCQU DCQ デ ィ レ ク テ ィ ブは、 8 バ イ ト 単位で メ モ リ ブ ロ ッ ク を割 り 当てて、 4 バ イ ト 境界で整列 さ せ、 実行時の メ モ リ の初期内容を定義 し ます。 メ モ リ の境界調整が任意であ る 点を除 き 、 DCQU も 同 じ です。 構文 {label} DCQ{U} {-}literal{,{-}literal}... 各引数には以下の意味があ り ます。 64 ビ ッ ト の数値 リ テ ラ ルを指定 し ます (「数値 リ テ ラ ル」 (ペー ジ 3-37) を参照)。 literal こ の値の有効範囲は 0 ~ 264-1 です。 数値 リ テ ラ ルで通常使用で き る 文字に加え、 literal の先頭にマ イ ナ ス符号を付け る こ と がで き ます。 こ の場合の値の有効範囲は -263 ~ -1 と な り ます。 -n を指定 し た場合は、 264–n を指定 し た場合 と 同 じ 結果が得 ら れ ます。 使用法 DCQ は、 必要に応 じ て、 最初に定義 さ れた 8 バ イ ト のブ ロ ッ ク の前に最大 3 バ イ ト のパデ ィ ン グ を挿入 し て、 境界調整を 4 バ イ ト に し ます。 境界調整が不要な場合は、 DCQU を使用 し て下 さ い。 以下 も 参照 し て下 さ い。 「DCB」 (ページ 7-26) • • • • 「DCD、 DCDU」 (ページ 7-27) 「DCW、 DCWU」 (ページ 7-34) 「SPACE ま たは FILL」 (ページ 7-24) 例 data ARM DUI 0204IJ AREA DCQ DCQU MiscData, DATA, READWRITE -225,2_101 ; 2_101 means binary 101. number+4 ; number must already be defined. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-33 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.12 DCW、 DCWU DCW デ ィ レ ク テ ィ ブは、 ハーフ ワー ド 単位で メ モ リ を割 り 当て て、 2 バ イ ト 境 界で整列 さ せ、 実行時の メ モ リ の初期内容を定義 し ます。 メ モ リ の境界調整が任意であ る 点を除 き 、 DCWU も 同 じ です。 構文 {label} DCW{U} expr{,expr}... 各引数には以下の意味があ り ます。 -32768 ~ 65535 の範囲の整数を求め る 数値式を指定 し ます (「数 expr 値式」 (ページ 3-36) を参照)。 使用法 DCW は、 必要に応 じ て、 最初に定義 さ れたハーフ ワー ド の前に 1 バ イ ト のパ デ ィ ン グ を挿入 し て、 境界調整を 2 バ イ ト に し ます。 境界調整が不要な場合は、 DCWU を使用 し て下 さ い。 以下 も 参照 し て下 さ い。 「DCB」 (ページ 7-26) • • • • 「DCD、 DCDU」 (ページ 7-27) 「DCQ、 DCQU」 (ページ 7-33) 「SPACE ま たは FILL」 (ページ 7-24) 例 data 7-34 DCW DCWU -225,2*number number+4 ; number must already be defined Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.3.13 COMMON COMMON デ ィ レ ク テ ィ ブは、 定義 さ れたサ イ ズの メ モ リ ブ ロ ッ ク を、 指定 し た シ ン ボルで割 り 当て ます。 メ モ リ の整列方法を指定 し ます。 境界調整を省略 し た場合、 デフ ォ ル ト の境界調整は 4 にな り ます。 ま た、 サ イ ズ を省略 し た場 合、 デフ ォ ル ト のサ イ ズは 0 にな り ます。 こ の メ モ リ には他の メ モ リ と 同様にア ク セ ス で き ますが、 オブジ ェ ク ト フ ァ イ ルに領域は割 り 当て ら れ ません。 構文 COMMON symbol{,size{,alignment}} 各引数には以下の意味があ り ます。 symbol シ ン ボル名を指定 し ます。 シ ン ボル名では大文字 と 小文字が区別 さ れ ます。 size 予約す る バ イ ト 数を指定 し ます。 alignment 境界調整を指定 し ます。 使用法 リ ン カは、 リ ン ク 段階で、 必要な領域を ゼ ロ で初期化 さ れた メ モ リ と し て割 り 当て ます。 例 COMMON 7.3.14 xyz,255,4 ; defines 255 bytes of ZI store, word-aligned DATA DATA デ ィ レ ク テ ィ ブは必要な く な り ま し た。 こ のデ ィ レ ク テ ィ ブはアセ ン ブ ラ に よ っ て無視 さ れます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-35 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.4 アセ ン ブ リ 制御デ ィ レ ク テ ィ ブ こ のセ ク シ ョ ン では、 条件付 き アセ ン ブ リ 、 ループ、 イ ン ク ルー ド 、 お よ び マ ク ロ を制御す る 以下のデ ィ レ ク テ ィ ブについて説明 し ます。 • 「MACRO、 MEND」 (ページ 7-37) • • • 7.4.1 「MEXIT」 (ページ 7-41) 「IF、 ELSE、 ENDIF、 ELIF」 (ページ 7-42) 「WHILE、 WEND」 (ページ 7-45) ネス テ ィ ン グデ ィ レ ク テ ィ ブ 以下の構造は合計で 256 の深 さ ま でネ ス ト で き ます。 • MACRO 定義 • WHILE...WEND ループ • IF...ELSE...ENDIF 条件構造 • INCLUDE フ ァ イ ル イ ン ク ルー ド こ れ ら の構造が ど の よ う にネ ス ト さ れてい る かに関係な く 、 上記の制限はネ ス ト さ れた構造全体に適用 さ れます。 各構造の制限が 256 ではあ り ません。 7-36 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.4.2 MACRO、 MEND MACRO デ ィ レ ク テ ィ ブは、 マ ク ロ 定義の開始位置を マー ク し ます。 マ ク ロ 定義 は、 MEND デ ィ レ ク テ ィ ブで終了 し ます。 詳細については、 「マ ク ロ の使用」 (ページ 2-50) を参照 し て下 さ い。 構文 マ ク ロ の定義には 2 つのデ ィ レ ク テ ィ ブ を使用 し ます。 構文は以下の と お り で す。 MACRO macroname{$cond} {$parameter{,$parameter}...} ; code MEND {$label} 各項目には以下の意味があ り ます。 $label マ ク ロ が呼び出 さ れた と き に、 指定 さ れたシ ン ボルが代入 さ れ る パ ラ メ ー タ を指定 し ます。 通常、 こ のシ ン ボルは ラ ベルです。 macroname マ ク ロ の名前を指定 し ます。 命令ま たはデ ィ レ ク テ ィ ブの名前で 始ま る 名前は付け ら れ ません。 $cond 条件 コ ー ド を含んでい る よ う に設計 さ れた特別なパ ラ メ ー タ で す。 有効な条件 コ ー ド 以外の値 も 許可 さ れ ます。 $parameter マ ク ロ が呼び出 さ れた と き に値が代入 さ れ る パ ラ メ ー タ を指定 し ます。 パ ラ メ ー タ のデフ ォ ル ト 値は、 以下の形式を使用 し て設 定で き ます。 $parameter="default value" デフ ォ ル ト 値に スペース が含まれてい る か、 ま たは値の前後の いずれかに スペース があ る 場合は、 二重引用符を使用す る 必要 があ り ます。 使用法 マ ク ロ 内で WHILE...WEND ループ ま たは IF...ENDIF 条件を始め る 場合は、 MEND デ ィ レ ク テ ィ ブに到達す る 前に こ のループ ま たは条件を閉 じ る 必要があ り ま す。 ループ内か ら の終了時な ど、 マ ク ロ か ら の早期終了を可能にす る 必要が あ る 場合は、 「MEXIT」 (ページ 7-41) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-37 デ ィ レ クテ ィ ブ リ フ ァ レンス マ ク ロ ボデ ィ 内では、 $label、 $parameter ま たは $cond な ど のパ ラ メ ー タ は他の 変数 と 同 じ よ う に使用で き ます (「アセ ンブ リ 時の変数代入」 (ページ 3-31) を参照)。 こ れ ら のパ ラ メ ー タ には、 マ ク ロ が呼び出 さ れ る たびに新 し い値が 渡 さ れます。 パ ラ メ ー タ を通常のシ ン ボル と 区別す る には、 先頭に $ を付け る 必要があ り ます。 パ ラ メ ー タ はい く つで も 使用で き ます。 $label は省略可能ですが、 マ ク ロ に よ っ て内部 ラ ベルが定義 さ れ る 場合に役立 ち ます。 こ の ラ ベルは、 マ ク ロ へのパ ラ メ ー タ と し て処理 さ れますが、 必ず し も 、 マ ク ロ 拡張の最初の命令を表す必要はあ り ません。 マ ク ロ では、 すべて の ラ ベルの位置が定義 さ れ ます。 パ ラ メ ー タ のデフ ォ ル ト 値を使用す る には、 | を引数 と し て使用 し ます。 こ の 引数が省略 さ れてい る 場合は、 空の文字列が使用 さ れます。 複数の内部 ラ ベルを使用す る マ ク ロ では、 各内部 ラ ベルを、 異な る 接尾文字 の付いたベース ラ ベル と し て定義す る と 役立ち ます。 拡張に スペース が不要な場合には、 パ ラ メ ー タ と それに続 く テ キ ス ト の間、 ま たはパ ラ メ ー タ と パ ラ メ ー タ の間には ド ッ ト (.) を使用 し ます。 ただ し 、 パ ラ メ ー タ と その前のテ キ ス ト の間には ド ッ ト は使用 し ないで下 さ い。 条件 コ ー ド には、 $cond パ ラ メ ー タ を使用で き ます。 単項演算子 :REVERSE_CC: を 使用 し て、 条件 コ ー ド の逆数を検索 し 、 :CC_ENCODING: を使用 し て、 条件 コ ー ド の 4 ビ ッ ト エ ン コ ーデ ィ ン グ を検索 し ます。 マ ク ロ では、 ロ ーカル変数の有効範囲を定義 し ます (「LCLA、 LCLL、 LCLS」 (ページ 7-7) を参照)。 マ ク ロ はネ ス ト で き ます (「ネ ス テ ィ ン グデ ィ レ ク テ ィ ブ」 (ページ 7-36) を 参照)。 例 ; macro definition MACRO $label xmac ; code $label.loop1 ; code ; code BGE $label.loop2 ; code BL BGT ; code ADR 7-38 ; start macro definition $p1,$p2 $label.loop1 $p1 $label.loop2 $p2 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス ; code MEND ; macro invocation abc xmac ; code abcloop1 ; code ; code BGE abcloop2 ; code BL BGT ; code ADR ; code ; end macro definition subr1,de ; ; ; ; ; abcloop1 invoke macro this is what is is produced when the xmac macro is expanded subr1 abcloop2 de マ ク ロ を使用 し た アセ ンブ リ 時の診断を以下に示 し ます。 MACRO diagnose $param1="default" INFO 0,"$param1" MEND ; macro expansion diagnose ; Prints diagnose "hello" ; Prints diagnose | ; Prints ; ; ; ; Macro definition This macro produces assembly-time diagnostics (on second assembly pass) blank line at assembly-time "hello" at assembly-time "default" at assembly-time 条件付き マ ク ロの例 AREA codx, CODE, READONLY ; macro definition MACRO Return$cond [ {ARCHITECTURE} <> "4" BX$cond lr | MOV$cond pc,lr ] MEND ; macro invocation fun ARM DUI 0204IJ PROC CMP r0,#0 MOVEQ r0,#1 ReturnEQ MOV r0,#0 Return Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-39 デ ィ レ クテ ィ ブ リ フ ァ レンス ENDP END 7-40 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.4.3 MEXIT MEXIT デ ィ レ ク テ ィ ブは、 マ ク ロ 定義の終了位置に到達す る 前にマ ク ロ を終了 す る 場合に使用 し ます。 使用法 MEXIT は、 マ ク ロ 本体の中か ら 終了す る 必要があ る 場合に使用 し ます。 マ ク ロ 本体の中で閉 じ ら れていない WHILE...WEND ループ ま たは IF...ENDIF 条件は、 マ ク ロ が終了す る 前にアセ ン ブ ラ に よ っ て閉 じ ら れ ます。 「MACRO、 MEND」 (ページ 7-37) も 参照 し て下 さ い。 例 $abc ARM DUI 0204IJ MACRO example abc $param1,$param2 ; code WHILE condition1 ; code IF condition2 ; code MEXIT ELSE ; code ENDIF WEND ; code MEND Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-41 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.4.4 IF、 ELSE、 ENDIF、 ELIF IF デ ィ レ ク テ ィ ブは、 命令 と デ ィ レ ク テ ィ ブのシーケ ン ス を アセ ンブルす る か ど う か を決め る 条件を定義 し ます。 [ は IF と 同 じ 意味です。 ELSE デ ィ レ ク テ ィ ブは、 前の条件が満た さ れなか っ た場合にアセ ン ブル さ れ る 命令 と デ ィ レ ク テ ィ ブのシーケ ン ス の開始位置を マー ク し ます。 | は ELSE と 同 じ 意味です。 ENDIF デ ィ レ ク テ ィ ブは、 条件付 き でアセ ン ブル さ れ る 命令 と デ ィ レ ク テ ィ ブ のシーケ ン ス の終了位置を マー ク し ます。 ] は ENDIF と 同 じ 意味です。 ELIF デ ィ レ ク テ ィ ブは、 条件を ネ ス ト ま たは反復す る こ と な く 、 ELSE IF と 同 じ 構造を作成 し ます。 詳細については、 「ELIF の使用」 (ページ 7-43) を参照 し て下 さ い。 構文 IF logical-expression …;code {ELSE …;code} ENDIF 各項目には以下の意味があ り ます。 logical-expression {TRUE} ま たは {FALSE} を求め る 式を指定 し ます。 詳細については、 「関係演算子」 (ページ 3-47) を参照 し て下 さ い。 使用法 指定 さ れた条件下においてのみアセ ン ブルや実行 さ れ る 命令 と デ ィ レ ク テ ィ ブのシーケ ン ス には、 IF と ENDIF に加え、 必要に応 じ て ELSE を組み合わせて使 用 し ます。 IF...ENDIF 条件はネ ス ト で き ます (「ネ ス テ ィ ン グデ ィ レ ク テ ィ ブ」 (ページ 7-36) を参照)。 7-42 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス ELIF の使用 ELIF を使用せずに、 以下の よ う なネ ス ト さ れた条件付 き 命令セ ッ ト を作成で き ます。 IF logical-expression instructions ELSE IF logical-expression2 instructions ELSE IF logical-expression3 instructions ENDIF ENDIF ENDIF こ の よ う なネ ス ト 構造は、 256 の深 さ ま でネ ス ト で き ます。 ELIF を使用す る と 、 同 じ 構造を よ り 簡単に記述で き ます。 IF logical-expression instructions ELIF logical-expression2 instructions ELIF logical-expression3 instructions ENDIF こ の構造では、 現在のネ ス ト の深 さ に IF...ENDIF の 1 レベルだけが追加 さ れた 深 さ にな り ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-43 デ ィ レ クテ ィ ブ リ フ ァ レンス 例 例 7-3 では、 NEWVERSION が定義 さ れてい る 場合は最初の命令群がアセ ンブル さ れ、 定義 さ れていない場合は 2 番目の命令群がアセ ンブル さ れます。 例 7-3 定義 さ れる変数に基づ く 条件付き アセ ン ブ リ IF :DEF:NEWVERSION ; first set of instructions or directives ELSE ; alternative set of instructions or directives ENDIF armasm を以下の よ う に呼び出 し た場合には NEWVERSION が定義 さ れ る ため、 最初 の命令群 と デ ィ レ ク テ ィ ブ群がアセ ン ブル さ れ ます。 armasm --predefine "NEWVERSION SETL {TRUE}" test.s armasm を以下の よ う に呼び出 し た場合には NEWVERSION が定義 さ れていないた め、 2 番目の命令群 と デ ィ レ ク テ ィ ブ群がアセ ンブル さ れ ます。 armasm test.s 例 7-4 では、 NEWVERSION の値が {TRUE} の場合に最初の命令群がアセ ン ブル さ れ、 それ以外の場合は 2 番目の命令群がアセ ンブル さ れます。 例 7-4 変数の値に基づ く 条件付き アセ ン ブ リ IF NEWVERSION = {TRUE} ; first set of instructions or directives ELSE ; alternative set of instructions or directives ENDIF armasm を以下の よ う に呼び出 し た場合には、 最初の命令群 と デ ィ レ ク テ ィ ブ 群がアセ ン ブル さ れ ます。 armasm --predefine "NEWVERSION SETL {TRUE}" test.s armasm を以下の よ う に呼び出 し た場合には、 2 番目の命令群 と デ ィ レ ク テ ィ ブ 群がアセ ン ブル さ れ ます。 armasm --predefine "NEWVERSION SETL {FALSE}" test.s 7-44 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.4.5 WHILE、 WEND WHILE デ ィ レ ク テ ィ ブは、 繰 り 返 し アセ ン ブル さ れ る 命令やデ ィ レ ク テ ィ ブの シーケ ン ス を開始 し ます。 こ のシーケ ン ス は WEND デ ィ レ ク テ ィ ブで終了 し ま す。 構文 WHILE logical-expression code WEND 各項目には以下の意味があ り ます。 logical-expression {TRUE} ま たは {FALSE} を求め る 式を指定 し ます (「論理式」 (ペー ジ 3-39) を参照)。 使用法 命令のシーケ ン ス を複数回アセ ン ブルす る には、 WHILE デ ィ レ ク テ ィ ブ を WEND デ ィ レ ク テ ィ ブ と 組み合わせて使用 し ます。 反復回数はゼ ロ にす る こ と も で き ます。 IF...ENDIF 条件は WHILE...WEND ループ内で使用で き ます。 WHILE...WEND ループはネ ス ト で き ます (「ネ ス テ ィ ン グデ ィ レ ク テ ィ ブ」 (ペー ジ 7-36) を参照)。 例 count count ARM DUI 0204IJ SETA 1 WHILE count <= 4 SETA count+1 ; code ; code WEND ; ; ; ; ; you are not restricted to such simple conditions In this case, this code will be repeated four times Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-45 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.5 Frame デ ィ レ ク テ ィ ブ こ のセ ク シ ョ ン では、 以下のデ ィ レ ク テ ィ ブについて説明 し ます。 • 「FRAME ADDRESS」 (ページ 7-48) • • • • • • • • • • • • 「FRAME POP」 (ページ 7-50) 「FRAME PUSH」 (ページ 7-52) 「FRAME REGISTER」 (ページ 7-55) 「FRAME RESTORE」 (ページ 7-56) 「FRAME RETURN ADDRESS」 (ページ 7-57) 「FRAME SAVE」 (ページ 7-58) 「FRAME STATE REMEMBER」 (ページ 7-59) 「FRAME STATE RESTORE」 (ページ 7-60) 「FRAME UNWIND ON」 (ページ 7-61) 「FRAME UNWIND OFF」 (ページ 7-61) 「FUNCTION、 PROC」 (ページ 7-62) 「ENDFUNC、 ENDP」 (ページ 7-64) 上記のデ ィ レ ク テ ィ ブ を使用す る こ と に よ り 、 以下の処理を行 う こ と がで き ます。 • armlink --callgraph オプシ ョ ン を使用 し て、 アセ ン ブ ラ 関数に よ る ス タ ッ ク 使用量を計算で き ます。 ス タ ッ ク 使用量の特定には、 以下のルールが使用 さ れます。 7-46 — 関数が PROC ま たは ENDP でマー ク さ れていない場合、 ス タ ッ ク 使用 量は特定で き ません。 — 関数が PROC ま たは ENDP でマー ク さ れていて も FRAME PUSH ま たは FRAME POP でマー ク さ れていない場合、 ス タ ッ ク 使用量はゼ ロ であ る と 見な さ れます。 つま り 、 FRAME PUSH 0 ま たは FRAME POP 0 を手動 で追加す る 必要はあ り ません。 — 関数が PROC ま たは ENDP でマー ク さ れ、 かつ FRAME PUSH n ま たは FRAME POP n でマー ク さ れてい る 場合、 ス タ ッ ク 使用量は n バ イ ト と 見な さ れます。 • 特に既存の コ ー ド を変更す る 場合に、 関数の構造内でのエ ラ ーを回避で き ます。 • アセ ンブ ラ が関数の構造内のエ ラ ーについて警告 メ ッ セージ を生成で き ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス • デバ ッ グ時に関数呼び出 し のバ ッ ク ト レース を行 う こ と がで き ます。 • デバ ッ ガ を使用 し て、 アセ ン ブ ラ 関数のプ ロ フ ァ イ ルを取得す る こ と が で き ます。 アセ ン ブ ラ 関数のプ ロ フ ァ イ ルを必要 と し ていて も 、 他の目的に フ レーム記 述デ ィ レ ク テ ィ ブ を必要 と し ない場合、 以下の よ う にな り ます。 • FUNCTION デ ィ レ ク テ ィ ブ と ENDFUNC デ ィ レ ク テ ィ ブ、 ま たは PROC デ ィ レ ク テ ィ ブ と ENDP デ ィ レ ク テ ィ ブ を使用す る 必要があ り ます。 • 他の FRAME デ ィ レ ク テ ィ ブは省略で き ます。 • FUNCTION デ ィ レ ク テ ィ ブ と ENDFUNC デ ィ レ ク テ ィ ブは、 プ ロ フ ァ イ ルの取 得の対象 と な る 関数に対 し てのみ使用す る 必要があ り ます。 DWARF での標準構造フ レーム ア ド レ ス は、 割 り 込み関数の コ ールフ レーム があ る 場所を指定す る 、 ス タ ッ ク 上のア ド レ ス です。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-47 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.5.1 FRAME ADDRESS FRAME ADDRESS デ ィ レ ク テ ィ ブは、 後続の命令の標準構造フ レーム ア ド レ ス の 計算方法を記述 し ます。 こ のデ ィ レ ク テ ィ ブは、 FUNCTION デ ィ レ ク テ ィ ブ と ENDFUNC デ ィ レ ク テ ィ ブ を含む関数ま たは PROC デ ィ レ ク テ ィ ブ と ENDP デ ィ レ ク テ ィ ブ を含む関数でのみ使用で き ます。 構文 FRAME ADDRESS reg[,offset] 各項目には以下の意味があ り ます。 reg 標準構造フ レーム ア ド レ ス のベース と な る レ ジ ス タ を指定 し ま す。 関数で別の フ レーム ポ イ ン タ を使用 し ない限 り 、 こ の レ ジ ス タ が sp にな り ます。 offset reg か ら 標準構造フ レーム ア ド レ ス ま でのオ フ セ ッ ト を指定 し ま す。 offset がゼ ロ の場合は省略で き ます。 使用法 FRAME ADDRESS デ ィ レ ク テ ィ ブは、 コ ー ド に よ っ て標準構造フ レーム ア ド レ ス のベース と な る レ ジ ス タ が変更 さ れ る 場合ま たは レ ジ ス タ か ら 標準構造フ レーム ア ド レ ス ま でのオ フ セ ッ ト が変更 さ れ る 場合に使用 し ます。 FRAME ADDRESS デ ィ レ ク テ ィ ブは、 標準構造フ レーム ア ド レ ス の計算方法を変更す る 命令の直後に使用す る 必要があ り ます。 注 コ ー ド で レ ジ ス タ を保存 し て ス タ ッ ク ポ イ ン タ を変更す る 1 つの命令を使用 す る 場合、 FRAME ADDRESS と FRAME SAVE の両方を使用す る 代わ り に FRAME PUSH を 使用で き ます (「FRAME PUSH」 (ページ 7-52) を参照)。 ま た、 コ ー ド で レ ジ ス タ を ロ ー ド し て ス タ ッ ク ポ イ ン タ を変更す る 1 つの命 令を使用す る 場合は、FRAME ADDRESS と FRAME RESTORE の両方を使用す る 代わ り に FRAME POP を使用で き ます (「FRAME POP」 (ページ 7-50) を参照)。 例 _fn 7-48 FUNCTION ; CFA (Canonical Frame Address) is value ; of sp on entry to function PUSH {r4,fp,ip,lr,pc} FRAME PUSH {r4,fp,ip,lr,pc} Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス SUB sp,sp,#4 ; CFA offset now changed FRAME ADDRESS sp,24 ; - so we correct it ADD fp,sp,#20 FRAME ADDRESS fp,4 ; New base register ; code using fp to base call-frame on, instead of sp ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-49 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.5.2 FRAME POP FRAME POP デ ィ レ ク テ ィ ブ を使用 し て、 呼び出 さ れ る 側が レ ジ ス タ を リ ロ ー ド す る タ イ ミ ン グ を アセ ン ブ ラ に通知 し ます。 こ のデ ィ レ ク テ ィ ブは、 FUNCTION デ ィ レ ク テ ィ ブ と ENDFUNC デ ィ レ ク テ ィ ブ を含む関数ま たは PROC デ ィ レ ク テ ィ ブ と ENDP デ ィ レ ク テ ィ ブ を含む関数でのみ使用で き ます。 こ のデ ィ レ ク テ ィ ブは、 関数内の最後の命令の後で必ず使用す る 必要があ る も のではあ り ません。 構文 FRAME POP には以下の 3 つの構文があ り ます。 FRAME POP {reglist} FRAME POP {reglist},n FRAME POP n 各引数には以下の意味があ り ます。 reglist 関数へのエ ン ト リ で保持 し ていた値に復元 さ れ る レ ジ ス タ リ ス ト を指定 し ます。 リ ス ト には少な く と も 1 本の レ ジ ス タ を指定す る 必要があ り ます。 n ス タ ッ ク ポ イ ン タ が移動す る バ イ ト 数を指定 し ます。 使用法 FRAME POP は、FRAME ADDRESS デ ィ レ ク テ ィ ブお よ び FRAME RESTORE デ ィ レ ク テ ィ ブ を使用す る こ と と 同 じ です。 こ のデ ィ レ ク テ ィ ブ を使用す る と 、 1 つの命令で レ ジ ス タ を ロ ー ド し 、 ス タ ッ ク ポ イ ン タ を変更す る こ と がで き ます。 FRAME POP は、 こ のデ ィ レ ク テ ィ ブが参照す る 命令の直後に配置す る 必要があ り ます。 n が指定 さ れていないかゼ ロ の場合、 アセ ン ブ ラ に よ っ て、 {reglist} か ら 標準 構造フ レーム ア ド レ ス ま での新 し いオ フ セ ッ ト が計算 さ れます。 アセ ン ブ ラ は以下を前提 と し てい ます。 7-50 • ポ ッ プ さ れ る 各 ARM レ ジ ス タ に よ っ て ス タ ッ ク 上の 4 バ イ ト が占有 さ れてい ます。 • ポ ッ プ さ れ る 各 VFP 単精度レ ジ ス タ に よ っ て ス タ ッ ク 上の 4 バ イ ト が占 有 さ れ、 さ ら に リ ス ト ご と に 4 バ イ ト ワ ー ド が占有 さ れてい ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス • ポ ッ プ さ れ る 各 VFP 倍精度レ ジ ス タ に よ っ て ス タ ッ ク 上の 8 バ イ ト が占 有 さ れ、 さ ら に リ ス ト ご と に 4 バ イ ト ワー ド が占有 さ れてい ます。 「FRAME ADDRESS」 (ページ 7-48) お よ び 「FRAME RESTORE」 (ページ 7-56) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-51 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.5.3 FRAME PUSH FRAME PUSH デ ィ レ ク テ ィ ブ を使用 し て、 通常は関数エ ン ト リ において、 呼び出 さ れ る 側が レ ジ ス タ を保存す る タ イ ミ ン グ を アセ ン ブ ラ に通知 し ます。 こ の デ ィ レ ク テ ィ ブは、 FUNCTION デ ィ レ ク テ ィ ブ と ENDFUNC デ ィ レ ク テ ィ ブ を含む 関数ま たは PROC デ ィ レ ク テ ィ ブ と ENDP デ ィ レ ク テ ィ ブ を含む関数でのみ使用 で き ます。 構文 FRAME PUSH には以下の 2 つの構文があ り ます。 FRAME PUSH {reglist} FRAME PUSH {reglist},n FRAME PUSH n 各項目には以下の意味があ り ます。 reglist 標準構造フ レーム ア ド レ ス の下位方向に連続 し て ス ト ア さ れ る レ ジ ス タ の リ ス ト を指定 し ます。 リ ス ト には少な く と も 1 本の レ ジ ス タ を指定す る 必要があ り ます。 n ス タ ッ ク ポ イ ン タ が移動す る バ イ ト 数を指定 し ます。 使用法 FRAME PUSH は、 FRAME ADDRESS デ ィ レ ク テ ィ ブお よ び FRAME SAVE デ ィ レ ク テ ィ ブ を使用す る こ と と 同 じ です。 こ のデ ィ レ ク テ ィ ブ を使用す る と 、 1 つの命令で レ ジ ス タ を保存 し 、 ス タ ッ ク ポ イ ン タ を変更す る こ と がで き ます。 FRAME PUSH は、 こ のデ ィ レ ク テ ィ ブが参照す る 命令の直後に配置す る 必要があ り ます。 n が指定 さ れていないかゼ ロ の場合、 アセ ン ブ ラ に よ っ て、 {reglist} か ら 標準 構造フ レーム ア ド レ ス ま での新 し いオ フ セ ッ ト が計算 さ れます。 アセ ン ブ ラ は以下を前提 と し てい ます。 7-52 • プ ッ シ ュ さ れ る 各 ARM レ ジ ス タ に よ っ て ス タ ッ ク 上の 4 バ イ ト が占有 さ れてい ます。 • プ ッ シ ュ さ れ る 各 VFP 単精度レ ジ ス タ に よ っ て ス タ ッ ク 上の 4 バ イ ト が 占有 さ れ、 さ ら に リ ス ト ご と に 4 バ イ ト ワー ド が占有 さ れてい ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス • ポ ッ プ さ れ る 各 VFP 倍精度レ ジ ス タ に よ っ て ス タ ッ ク 上の 8 バ イ ト が占 有 さ れ、 さ ら に リ ス ト ご と に 4 バ イ ト ワー ド が占有 さ れてい ます。 「FRAME ADDRESS」 (ページ 7-48) お よ び 「FRAME SAVE」 (ページ 7-58) を 参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-53 デ ィ レ クテ ィ ブ リ フ ァ レンス 例 p 7-54 PROC ; Canonical frame address is sp + 0 EXPORT p PUSH {r4-r6,lr} ; sp has moved relative to the canonical frame address, ; and registers r4, r5, r6 and lr are now on the stack FRAME PUSH {r4-r6,lr} ; Equivalent to: ; FRAME ADDRESS sp,16 ; 16 bytes in {r4-r6,lr} ; FRAME SAVE {r4-r6,lr},-16 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.5.4 FRAME REGISTER FRAME REGISTER デ ィ レ ク テ ィ ブ を使用 し て、 レ ジ ス タ に保持 さ れてい る 関数引 数の位置を管理 し ます。 こ のデ ィ レ ク テ ィ ブは、 FUNCTION デ ィ レ ク テ ィ ブ と ENDFUNC デ ィ レ ク テ ィ ブ を含む関数ま たは PROC デ ィ レ ク テ ィ ブ と ENDP デ ィ レ ク テ ィ ブ を含む関数でのみ使用で き ます。 構文 FRAME REGISTER reg1,reg2 各項目には以下の意味があ り ます。 reg1 関数へのエ ン ト リ で引数を保持す る レ ジ ス タ を指定 し ます。 reg2 その値を保持す る レ ジ ス タ を指定 し ます。 使用法 FRAME REGISTER デ ィ レ ク テ ィ ブは、 関数へのエ ン ト リ で別の レ ジ ス タ に保持 さ れていた引数を保持す る レ ジ ス タ を使用す る 場合に使用 し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-55 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.5.5 FRAME RESTORE FRAME RESTORE デ ィ レ ク テ ィ ブ を使用 し て、 指定 さ れた レ ジ ス タ の内容が、 関 数へのエ ン ト リ で保持 さ れていた値に復元 さ れた こ と を アセ ン ブ ラ に通知 し ます。 こ のデ ィ レ ク テ ィ ブは、 FUNCTION デ ィ レ ク テ ィ ブ と ENDFUNC デ ィ レ ク テ ィ ブ を含む関数ま たは PROC デ ィ レ ク テ ィ ブ と ENDP デ ィ レ ク テ ィ ブ を含む関 数でのみ使用で き ます。 構文 FRAME RESTORE {reglist} 各項目には以下の意味があ り ます。 内容が復元 さ れた レ ジ ス タ の リ ス ト を指定 し ます。 リ ス ト には少 な く と も 1 つの レ ジ ス タ を指定す る 必要があ り ます。 reglist 使用法 FRAME RESTORE は、 呼び出 さ れ る 側が ス タ ッ ク か ら レ ジ ス タ を リ ロ ー ド し た直 後に使用 し ます。 こ のデ ィ レ ク テ ィ ブは、 関数内の最後の命令の後で必ず使 用す る 必要があ る も のではあ り ません。 reglist には、 整数レ ジ ス タ ま たは浮動小数点レ ジ ス タ のいずれか を指定で き ますが、 両方を混在 さ せ る こ と はで き ません。 注 ま た、 コ ー ド で レ ジ ス タ を ロ ー ド し て ス タ ッ ク ポ イ ン タ を変更す る 1 つの命 令を使用す る 場合は、FRAME RESTORE と FRAME ADDRESS の両方を使用す る 代わ り に FRAME POP を使用で き ます (「FRAME POP」 (ページ 7-50) を参照)。 7-56 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.5.6 FRAME RETURN ADDRESS FRAME RETURN ADDRESS デ ィ レ ク テ ィ ブに よ っ て、 r14 以外の レ ジ ス タ を復帰ア ド レ ス に使用す る 関数を定義で き ます。 こ のデ ィ レ ク テ ィ ブは、 FUNCTION デ ィ レ ク テ ィ ブ と ENDFUNC デ ィ レ ク テ ィ ブ を含む関数ま たは PROC デ ィ レ ク テ ィ ブ と ENDP デ ィ レ ク テ ィ ブ を含む関数でのみ使用で き ます。 注 r14 以外の レ ジ ス タ を復帰ア ド レ ス に使用す る 関数は AAPCS に準拠 し てい ま せん。 こ の よ う な関数はエ ク ス ポー ト し ないで下 さ い。 構文 FRAME RETURN ADDRESS reg 各引数には以下の意味があ り ます。 復帰ア ド レ ス に使用す る レ ジ ス タ を指定 し ます。 reg 使用法 FRAME RETURN ADDRESS デ ィ レ ク テ ィ ブは、 復帰ア ド レ ス に r14 を使用 し ない関数 で使用 し ます。 こ のデ ィ レ ク テ ィ ブ を使用 し ない と 、 デバ ッ ガはその関数の バ ッ ク ト レース を行 う こ と がで き ません。 FRAME RETURN ADDRESS は、 r14 を使用 し ない関数の開始位置を マー ク す る FUNCTION デ ィ レ ク テ ィ ブ ま たは PROC デ ィ レ ク テ ィ ブの直後に使用 し ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-57 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.5.7 FRAME SAVE FRAME SAVE デ ィ レ ク テ ィ ブは、 標準構造フ レーム ア ド レ ス か ら の相対位置に保 存 さ れ る レ ジ ス タ の位置を記述 し ます。 こ のデ ィ レ ク テ ィ ブは、 FUNCTION デ ィ レ ク テ ィ ブ と ENDFUNC デ ィ レ ク テ ィ ブ を含む関数ま たは PROC デ ィ レ ク テ ィ ブ と ENDP デ ィ レ ク テ ィ ブ を含む関数でのみ使用で き ます。 構文 FRAME SAVE {reglist}, offset 各項目には以下の意味があ り ます。 標準構造フ レーム ア ド レ ス か ら の offset か ら 連続 し て ス ト ア さ れ る レ ジ ス タ の リ ス ト を指定 し ます。 リ ス ト には少な く と も 1 つ の レ ジ ス タ を指定す る 必要があ り ます。 reglist 使用法 FRAME SAVE は、 呼び出 さ れ る 側が ス タ ッ ク に レ ジ ス タ を ス ト ア し た直後に使用 し ます。 reglist には、 バ ッ ク ト レース に不要な レ ジ ス タ を含め る こ と がで き ます。 DWARF コ ールフ レーム情報 と し て記録す る 必要のあ る レ ジ ス タ はアセ ン ブ ラ に よ っ て決定 さ れます。 注 コ ー ド で レ ジ ス タ を保存 し て ス タ ッ ク ポ イ ン タ を変更す る 1 つの命令を使用 す る 場合、 FRAME SAVE と FRAME ADDRESS の両方を使用す る 代わ り に FRAME PUSH を 使用で き ます (「FRAME PUSH」 (ページ 7-52) を参照)。 7-58 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.5.8 FRAME STATE REMEMBER FRAME STATE REMEMBER デ ィ レ ク テ ィ ブは、 標準構造フ レーム ア ド レ ス と 、 保存 さ れ る レ ジ ス タ 値の位置の計算方法に関す る 現在の情報を保存 し ます。 こ の デ ィ レ ク テ ィ ブは、 FUNCTION デ ィ レ ク テ ィ ブ と ENDFUNC デ ィ レ ク テ ィ ブ を含む 関数ま たは PROC デ ィ レ ク テ ィ ブ と ENDP デ ィ レ ク テ ィ ブ を含む関数でのみ使用 で き ます。 構文 FRAME STATE REMEMBER 使用法 イ ン ラ イ ンの終了シーケ ン ス では、 標準構造フ レーム ア ド レ ス と 、 保存 さ れ る レ ジ ス タ 値の位置の計算に関す る 情報が変更 さ れ る 場合があ り ます。 終了 シーケ ン ス の後、 以前 と 同 じ 情報を使用 し て別の分岐を継続で き ます。 こ の 情報を保存す る には FRAME STATE REMEMBER を使用 し 、 こ の情報を復元す る には FRAME STATE RESTORE を使用 し ます。 こ れ ら のデ ィ レ ク テ ィ ブはネ ス ト で き ます。 各 FRAME STATE RESTORE デ ィ レ ク テ ィ ブには、対応す る FRAME STATE REMEMBER デ ィ レ ク テ ィ ブが必要です。 詳細に ついては、 以下を参照 し て下 さ い。 「FRAME STATE RESTORE」 (ページ 7-60) • • 「FUNCTION、 PROC」 (ページ 7-62) 例 exitB ARM DUI 0204IJ ; function code FRAME STATE REMEMBER ; save frame state before in-line exit sequence POP {r4-r6,pc} ; do not have to FRAME POP here, as control has ; transferred out of the function FRAME STATE RESTORE ; end of exit sequence, so restore state ; code for exitB POP {r4-r6,pc} ENDP Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-59 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.5.9 FRAME STATE RESTORE FRAME STATE RESTORE デ ィ レ ク テ ィ ブは、 標準構造フ レーム ア ド レ ス と 、 保存 さ れ る レ ジ ス タ 値の位置の計算方法に関す る 現在の情報を復元 し ます。 こ の デ ィ レ ク テ ィ ブは、 FUNCTION デ ィ レ ク テ ィ ブ と ENDFUNC デ ィ レ ク テ ィ ブ を含む 関数ま たは PROC デ ィ レ ク テ ィ ブ と ENDP デ ィ レ ク テ ィ ブ を含む関数でのみ使用 で き ます。 構文 FRAME STATE RESTORE 使用法 参照先 : • 「FRAME STATE REMEMBER」 (ページ 7-59) • 7-60 「FUNCTION、 PROC」 (ページ 7-62) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.5.10 FRAME UNWIND ON FRAME UNWIND ON デ ィ レ ク テ ィ ブは、 こ の関数 と 後に続 く 関数の unwind テーブ ルを生成す る よ う アセ ンブ ラ に指示 し ます。 構文 FRAME UNWIND ON 使用法 こ のデ ィ レ ク テ ィ ブは関数の外部で使用で き ます。 こ の場合のアセ ン ブ ラ は、 FRAME UNWIND OFF デ ィ レ ク テ ィ ブに到達す る ま で、 後続のすべての関数の unwind テーブルを生成 し ます。 注 FRAME UNWIND デ ィ レ ク テ ィ ブは、 例外テーブル生成を有効にす る には不十分で す。 さ ら に、 FRAME UNWIND デ ィ レ ク テ ィ ブに他の FRAME デ ィ レ ク テ ィ ブがない場 合、 情報が不十分なので、 アセ ン ブ ラ は unwind 情報を生成で き ません。 「例外テーブル生成を制御す る 」 (ページ 3-21) も 参照 し て下 さ い。 7.5.11 FRAME UNWIND OFF FRAME UNWIND OFF デ ィ レ ク テ ィ ブは、 こ の関数 と 後に続 く 関数の nounwind テー ブルを生成す る よ う アセ ン ブ ラ に指示 し ます。 構文 FRAME UNWIND OFF 使用法 こ のデ ィ レ ク テ ィ ブは関数の外部で使用で き ます。 こ の場合のアセ ン ブ ラ は、 FRAME UNWIND ON デ ィ レ ク テ ィ ブに到達す る ま で、 後続のすべての関数の nounwind テーブルを生成 し ます。 「例外テーブル生成を制御す る 」 (ページ 3-21) も 参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-61 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.5.12 FUNCTION、 PROC FUNCTION デ ィ レ ク テ ィ ブは、 関数の開始位置を マー ク し ます。 PROC は FUNCTION と 同 じ 意味です。 構文 label FUNCTION [{reglist1} [, {reglist2}]] 各項目には以下の意味があ り ます。 reglist1 呼び出 さ れ る 側に よ っ て保存 さ れ る ARM レ ジ ス タ の リ ス ト を指 定で き ます (省略可)。 reglist1 が指定 さ れていない場合、 デバ ッ ガは レ ジ ス タ の使用状況をチ ェ ッ ク す る と き に AAPCS が使用 さ れてい る と 見な し ます。 reglist2 呼び出 さ れ る 側に よ っ て保存 さ れ る VFP レ ジ ス タ の リ ス ト を指 定で き ます (省略可)。 使用法 FUNCTION デ ィ レ ク テ ィ ブ を使用 し て関数の開始位置を マー ク し ます。 ELF の DWARF コ ールフ レーム情報を生成す る と き 、 アセ ン ブ ラ は FUNCTION を使用 し て関数の開始位置を識別 し ます。 FUNCTION に よ っ て標準構造フ レーム ア ド レ ス は r13 (sp) に設定 さ れ、 フ レー ム の ス タ ッ ク は空にな り ます。 各 FUNCTION デ ィ レ ク テ ィ ブには、 対応す る ENDFUNC デ ィ レ ク テ ィ ブが必要で す。 FUNCTION と ENDFUNC の対を ネ ス ト し た り 、 こ れ ら の対に PROC デ ィ レ ク テ ィ ブや ENDP デ ィ レ ク テ ィ ブ を含めた り す る こ と はで き ません。 別のプ ロ シージ ャ コ ール標準を使用 し てい る 場合は、 オプシ ョ ン の reglist パ ラ メ ー タ を使用 し て、 その情報をデバ ッ ガに通知で き ます。 ただ し 、 すべて のデバ ッ ガが こ の機能をサポー ト し てい る わけではあ り ません。 詳細につい ては、 デバ ッ ガのマニ ュ アルを参照 し て下 さ い。 ま た、 「FRAME ADDRESS」 (ページ 7-48) ~ 「FRAME STATE RESTORE」 (ページ 7-60) も 参照 し て下 さ い。 7-62 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 注 FUNCTION では、 ワー ド 境界 (Thumb の場合はハーフ ワー ド 境界) への境界調 整は自動的には行われ ません。 境界調整を行 う 必要があ る 場合は ALIGN を使用 し ます。 こ のデ ィ レ ク テ ィ ブ を使用 し ない と 、 コ ールフ レーム に よ っ て関数 の開始位置が示 さ れない場合があ り ます。 詳細については、 「ALIGN」 (ペー ジ 7-78) を参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-63 デ ィ レ クテ ィ ブ リ フ ァ レンス 例 ALIGN ; ensures alignment FUNCTION ; without the ALIGN directive, this might not be word-aligned EXPORT dadd PUSH {r4-r6,lr} ; this line automatically word-aligned FRAME PUSH {r4-r6,lr} ; subroutine body POP {r4-r6,pc} ENDFUNC PROC {r4-r8,r12},{D1-D3} ; non-AAPCS-conforming function ... ENDP dadd func6 7.5.13 ENDFUNC、 ENDP ENDFUNC デ ィ レ ク テ ィ ブは、 AAPCS 準拠の関数の終了位置を マー ク し ます (「FUNCTION、 PROC」 (ページ 7-62) を参照)。 ENDP は ENDFUNC と 同 じ 意味で す。 7-64 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.6 通知デ ィ レ ク テ ィ ブ こ のセ ク シ ョ ン では、 以下のデ ィ レ ク テ ィ ブについて説明 し ます。 • 「ASSERT」 アセ ン ブ リ 時にアサーシ ョ ンが偽にな る 場合にエ ラ ー メ ッ セージ を生成 し ます。 • 「INFO」 (ページ 7-67) アセ ン ブ リ 時に診断情報を生成 し ます。 • 「OPT」 (ページ 7-68) リ ス ト オプシ ョ ン を設定 し ます。 • 「TTL、 SUBT」 (ページ 7-71) リ ス ト に タ イ ト ル と サブ タ イ ト ルを挿入 し ます。 7.6.1 ASSERT ASSERT デ ィ レ ク テ ィ ブは、 指定 さ れた アサーシ ョ ン が偽にな る と 、 アセ ン ブ リ の第 2 パ ス でエ ラ ー メ ッ セージ を生成 し ます。 構文 ASSERT logical-expression 各項目には以下の意味があ り ます。 logical-expression {TRUE} ま たは {FALSE} を返すアサーシ ョ ン を指定 し ます。 使用法 ASSERT を使用 し て、 必要な条件がアセ ン ブ リ 時に満た さ れてい る か ど う か を 確認 し ます。 アサーシ ョ ン が偽の場合、 エ ラ ー メ ッ セージが生成 さ れ、 アセ ン ブルに失敗 し ます。 「INFO」 (ページ 7-67) も 参照 し て下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-65 デ ィ レ クテ ィ ブ リ フ ァ レンス 例 ASSERT 7-66 label1 <= label2 ; ; ; ; Tests if the address represented by label1 is <= the address represented by label2. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.6.2 INFO INFO デ ィ レ ク テ ィ ブは、 アセ ン ブルの ど ち ら のパ ス に関す る 診断情報の生成 も サポー ト し ます。 ! INFO と よ く 似てい ますが、 通知 さ れ る 情報の詳細度は低 く な り ます。 構文 INFO numeric-expression, string-expression 各引数には以下の意味があ り ます。 numeric-expression アセ ン ブ リ 時に評価 さ れ る 数値式を指定 し ます。 こ の式の結果が ゼ ロ にな っ た場合、 以下の よ う にな り ます。 • 第 1 パ ス では何 も 行われ ません。 • 第 2 パ ス では string-expression が出力 さ れます。 こ の式の結果がゼ ロ 以外の場合は、 string-expression がエ ラ ー メ ッ セージ と し て出力 さ れ、 アセ ン ブルに失敗 し ます。 string-expression 文字列を返す式を指定 し ます。 使用法 INFO デ ィ レ ク テ ィ ブ を使用す る と 、 独自のエ ラ ー メ ッ セージ を柔軟に作成す る こ と がで き ます。 数値式 と 文字列式に関す る 追加情報については、 「数値 式」 (ページ 3-36) お よ び 「文字列式」 (ページ 3-35) を参照 し て下 さ い。 「ASSERT」 (ページ 7-65) も 参照 し て下 さ い。 例 INFO 0, "Version 1.0" IF endofdata <= label1 INFO 4, "Data overrun at label1" ENDIF ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-67 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.6.3 OPT OPT デ ィ レ ク テ ィ ブは、 ソ ース コ ー ド 内か ら リ ス ト オプシ ョ ン を設定 し ます。 構文 OPT n 各パ ラ メ ー タ には以下の意味があ り ます。 OPT デ ィ レ ク テ ィ ブの設定を指定 し ます。 表 7-2 は、 利用 n 可能な設定を示 し てい ます。 表 7-2 OPT デ ィ レ ク テ ィ ブの設定 OPT n 効果 1 通常の リ ス テ ィ ン グが有効にな り ます。 2 通常の リ ス テ ィ ン グが無効にな り ます。 4 ページ区切 り が行われます。 すぐ に改ページが行われ、 新 し いページが始ま り ます。 8 行番号カ ウ ン タ がゼ ロ に リ セ ッ ト さ れます。 16 SET、 GBL、 お よ び LCL デ ィ レ ク テ ィ ブの リ ス テ ィ ン グが有効 にな り ます。 32 SET、 GBL、 お よ び LCL デ ィ レ ク テ ィ ブの リ ス テ ィ ン グが無効 にな り ます。 7-68 64 マ ク ロ 拡張の リ ス テ ィ ン グが有効にな り ます。 128 マ ク ロ 拡張の リ ス テ ィ ン グが無効にな り ます。 256 マ ク ロ 呼び出 し の リ ス テ ィ ン グが有効にな り ます。 512 マ ク ロ 呼び出 し の リ ス テ ィ ン グが無効にな り ます。 1024 第 1 パス の リ ス テ ィ ン グが有効にな り ます。 2048 第 1 パス の リ ス テ ィ ン グが無効にな り ます。 4096 条件デ ィ レ ク テ ィ ブの リ ス テ ィ ン グが有効にな り ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 表 7-2 OPT デ ィ レ ク テ ィ ブの設定 (続き) ARM DUI 0204IJ OPT n 効果 8192 条件デ ィ レ ク テ ィ ブの リ ス テ ィ ン グが無効にな り ます。 16384 MEND デ ィ レ ク テ ィ ブの リ ス テ ィ ン グが有効にな り ます。 32768 MEND デ ィ レ ク テ ィ ブの リ ス テ ィ ン グが無効にな り ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-69 デ ィ レ クテ ィ ブ リ フ ァ レンス 使用法 リ ス テ ィ ン グ を有効にす る には、--list= アセ ンブ ラ オプシ ョ ン を指定 し ます。 デフ ォ ル ト では、--list= オプシ ョ ン を指定す る と 、 変数宣言、 マ ク ロ 拡張、 呼び出 し 条件デ ィ レ ク テ ィ ブ、 MEND デ ィ レ ク テ ィ ブ を含む通常の リ ス ト が生 成 さ れ ます。 こ の リ ス ト は第 2 パ ス のみで生成 さ れます。 コ ー ド 内でデフ ォ ル ト の リ ス ト オプシ ョ ン を修正す る には、 OPT デ ィ レ ク テ ィ ブ を使用 し ます。 --list= オプシ ョ ン については、 「 リ ス ト を フ ァ イ ルに出力す る 」 (ページ 3-18) を参照 し て下 さ い。 OPT デ ィ レ ク テ ィ ブ を使用 し て、 コ ー ド の リ ス ト の フ ォ ーマ ッ ト を設定で き ま す。 例えば、 関数 と セ ク シ ョ ン の前に新 し いページ を指定で き ます。 例 start func1 7-70 AREA ; code ; code BL ; code OPT 4 ; code Example, CODE, READONLY func1 ; places a page break before func1 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.6.4 TTL、 SUBT TTL デ ィ レ ク テ ィ ブは、 リ ス テ ィ ン グ フ ァ イ ルの各ページの先頭に タ イ ト ルを 挿入 し ます。 こ の タ イ ト ルは、 新 し い TTL デ ィ レ ク テ ィ ブが発行 さ れ る ま で各 ページに出力 さ れ ます。 SUBT デ ィ レ ク テ ィ ブは、 リ ス テ ィ ン グ フ ァ イ ルのページにサブ タ イ ト ルを挿 入 し ます。 こ のサブ タ イ ト ルは、 新 し い SUBT デ ィ レ ク テ ィ ブが発行 さ れ る ま で各ページに出力 さ れます。 構文 TTL title SUBT subtitle 各項目には以下の意味があ り ます。 title タ イ ト ルを指定 し ます。 subtitle サブ タ イ ト ルを指定 し ます。 使用法 TTL デ ィ レ ク テ ィ ブ を使用 し て、 リ ス テ ィ ン グ フ ァ イ ルの各ページの最上部に タ イ ト ルを挿入 し ます。 最初のページに タ イ ト ルを出力す る 場合は、 ソ ース フ ァ イ ルの 1 行目に TTL デ ィ レ ク テ ィ ブ を配置す る 必要があ り ます。 タ イ ト ルを変更す る には、 別の TTL デ ィ レ ク テ ィ ブ を使用 し ます。 新 し い TTL デ ィ レ ク テ ィ ブの設定内容は、 次のページか ら 反映 さ れ ます。 SUBT デ ィ レ ク テ ィ ブ を使用 し て、 リ ス テ ィ ン グ フ ァ イ ルのページの最上部に サブ タ イ ト ルを挿入 し ます。 サブ タ イ ト ルは、 タ イ ト ルの次の行に出力 さ れ ます。 最初のページにサブ タ イ ト ルを出力す る 場合は、 ソ ース フ ァ イ ルの 1 行 目に SUBT デ ィ レ ク テ ィ ブ を配置す る 必要があ り ます。 サブ タ イ ト ルを変更す る には、 別の SUBT デ ィ レ ク テ ィ ブ を使用 し ます。 新 し い SUBT デ ィ レ ク テ ィ ブの設定内容は、 次のページか ら 反映 さ れ ます。 例 TTL ARM DUI 0204IJ First Title ; places a title on the first ; and subsequent pages of a ; listing file. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-71 デ ィ レ クテ ィ ブ リ フ ァ レンス SUBT 7-72 First Subtitle ; places a subtitle on the ; second and subsequent pages ; of a listing file. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.7 命令セ ッ ト と 構文選択のデ ィ レ ク テ ィ ブ こ のセ ク シ ョ ン では、 以下のデ ィ レ ク テ ィ ブについて説明 し ます。 • ARM DUI 0204IJ 「ARM、 THUMB、 THUMBX、 CODE16、 CODE32」 (ページ 7-74) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-73 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.7.1 ARM、 THUMB、 THUMBX、 CODE16、 CODE32 ARM デ ィ レ ク テ ィ ブ と CODE32 デ ィ レ ク テ ィ ブは同 じ 意味です。 こ れ ら は、 UAL 構文か Thumb-2 以前の ARM アセ ンブ ラ 言語構文のいずれか を使用 し て、 後 に続 く 命令を ARM 命令 と し て解釈す る よ う アセ ン ブ ラ に指示 し ます。 THUMB デ ィ レ ク テ ィ ブは、 UAL 構文を使用 し て、 後に続 く 命令を Thumb 命令 と し て命令を解釈す る よ う にアセ ン ブ ラ に指示 し ます。 THUMBX デ ィ レ ク テ ィ ブは、 UAL 構文を使用 し て、 後に続 く 命令を Thumb-2EE 命令 と し て解釈す る よ う にアセ ンブ ラ に指示 し ます。 CODE16 デ ィ レ ク テ ィ ブは、 UAL 以前のアセ ン ブ リ 言語構文を使用 し て、 後に 続 く 命令を Thumb 命令 と し て解釈す る よ う にアセ ン ブ ラ に指示 し ます。 こ れ ら のデ ィ レ ク テ ィ ブは ま た、 必要に応 じ て、 ARM に関 し ては最大 3 バ イ ト のパデ ィ ン グ を挿入 し て次の ワ ー ド 境界で整列 さ せ、 Thumb ま たは Thumb-2EE に関 し ては最大 1 バ イ ト のパデ ィ ン グ を挿入 し て次のハーフ ワ ー ド 境界で整列 さ せます。 構文 ARM THUMB THUMBX CODE16 CODE32 使用法 異な る 命令セ ッ ト を使用 し た コ ー ド を含むフ ァ イ ルでは、 以下の よ う にな り ます。 • ARM は ARM コ ー ド の前に配置す る 必要があ り ます。 CODE32 は ARM と 同 じ 意味です。 THUMB は、 UAL 構文で記述 さ れた Thumb コ ー ド の前に配置す る 必要があ • り ます。 • THUMBX は、 UAL 構文で記述 さ れた Thumb-2EE コ ー ド の前に配置す る 必 要があ り ます。 • CODE16 は、 UAL 以前の構文で記述 さ れた Thumb コ ー ド の前に配置す る 必要があ り ます。 7-74 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス こ れ ら のデ ィ レ ク テ ィ ブ を アセ ン ブル し て も 、 命令は生成 さ れません。 ま た、 状態が変更 さ れ る わけで も あ り ません。 こ れ ら のデ ィ レ ク テ ィ ブは、 ARM、 Thumb、 ま たは Thumb-2EE の命令を適切にアセ ン ブルす る よ う アセ ン ブ ラ に 指示 し 、 必要に応 じ てパデ ィ ン グ を挿入す る だけです。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-75 デ ィ レ クテ ィ ブ リ フ ァ レンス 例 こ の例では、 ARM お よ び THUMB を使用 し て ARM 命令か ら Thumb 命令に分岐す る 方法を示 し ます。 AREA ToThumb, CODE, READONLY ENTRY ARM ; Name this block of code ; Mark first instruction to execute ; Subsequent instructions are ARM start ADR BX THUMB into_thumb MOVS 7-76 r0, into_thumb + 1 r0 ; Processor starts in ARM state ; Inline switch to Thumb state ; Subsequent instructions are Thumb r0, #10 ; New-style Thumb instructions Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8 その他のデ ィ レ ク テ ィ ブ こ のセ ク シ ョ ン では、 以下のデ ィ レ ク テ ィ ブについて説明 し ます。 • • • • • • • • • • • • • • • • ARM DUI 0204IJ 「ALIGN」 (ページ 7-78) 「AREA」 (ページ 7-81) 「ATTR」 (ページ 7-86) 「END」 (ページ 7-88) 「ENTRY」 (ページ 7-88) 「EQU」 (ページ 7-90) 「EXPORT、 GLOBAL」 (ページ 7-92) 「EXPORTAS」 (ページ 7-94) 「GET、 INCLUDE」 (ページ 7-95) 「IMPORT、 EXTERN」 (ページ 7-97) 「INCBIN」 (ページ 7-100) 「KEEP」 (ページ 7-101) 「NOFP」 (ページ 7-102) 「REQUIRE」 (ページ 7-102) 「REQUIRE8、 PRESERVE8」 (ページ 7-103) 「ROUT」 (ページ 7-104) Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-77 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.1 ALIGN ALIGN デ ィ レ ク テ ィ ブは、 ゼ ロ 、 ま たは NOP 命令でパデ ィ ン グす る こ と に よ り 、 現在の位置を指定 さ れた境界で整列 さ せます。 構文 ALIGN {expr{,offset{,pad{,padsize}}}} 各項目には以下の意味があ り ます。 expr 20 ~ 231 の 2 の累乗を返す数値式を指定 し ます。 offset pad padsize 任意の数値式を指定で き ます。 任意の数値式を指定で き ます。 1、 2、 ま たは 4 を指定で き ます。 演算 現在の位置は、 以下の形式の次のア ド レ ス で整列 さ れ ます。 offset + n * expr expr が指定 さ れていない場合、 ALIGN に よ っ て現在の位置に次の ワー ド (4 バ イ ト ) 境界が設定 さ れます。 以前の位置 と 現在の新 し い位置 と の間にあ る 未 使用の空間は、 以下で埋め ら れます。 • pad が指定 さ れてい る 場合は、 pad の コ ピー。 • 以下すべての条件が満た さ れてい る 場合は、 NOP 命令。 • — pad は指定 さ れてい ません。 — ALIGN デ ィ レ ク テ ィ ブは、 ARM ま たは Thumb 命令に従い ます。 — 現在のセ ク シ ョ ンには、 AREA デ ィ レ ク テ ィ ブに設定 さ れた CODEALIGN 属性があ り ます。 それ以外の場合はゼ ロ に設定 し ます。 pad は、 padsize の値に応 じ て、 バ イ ト 、 ハーフ ワー ド 、 ま たは ワ ー ド と し て処 理 さ れ ます。 padsize が指定 さ れていない場合、 pad は、 デフ ォ ル ト でデー タ セ ク シ ョ ン のバ イ ト 、 Thumb コ ー ド のハーフ ワー ド 、 ARM コ ー ド の ワー ド にな り ます。 7-78 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 使用法 ALIGN を使用 し て、 デー タ と コ ー ド を適切な境界で整列 さ せます。 こ のデ ィ レ ク テ ィ ブは、 一般的に以下の状況で必要 と な り ます。 • ADR Thumb 疑似命令は、 ワ ー ド 境界で整列 さ れた ア ド レ ス し か ロ ー ド で き ませんが、 Thumb コ ー ド 内の ラ ベルは ワー ド 境界で整列 さ れていない 場合があ り ます。 こ の よ う な場合は、 ALIGN 4 を使用 し て、 Thumb コ ー ド 内のア ド レ ス を 4 バ イ ト 境界調整で整列 さ せ る こ と がで き ます。 • ALIGN を使用す る と 、 一部の ARM プ ロ セ ッ サに搭載 さ れてい る キ ャ ッ シ ュ を利用す る こ と がで き ます。 例えば、 ARM940T には、 16 バ イ ト の ラ イ ン か ら 構成 さ れ る キ ャ ッ シ ュ があ り ます。 こ の よ う な場合は、 ALIGN 16 を使用 し て、 関数エ ン ト リ を 16 バ イ ト 境界で整列 さ せて キ ャ ッ シ ュ の効果を最大限に高め る こ と がで き ます。 • LDRD お よ び LDRD のダブル ワー ド デー タ 転送命令は、 8 バ イ ト 境界で整列 さ せ る 必要があ り ます。 LDRD ま たは STRD を使用 し てデー タ にア ク セ スす る 場合は、 DCQ (「デー タ 定義デ ィ レ ク テ ィ ブ」 (ページ 7-18) を参照) な ど の メ モ リ 割 り 当てデ ィ レ ク テ ィ ブの前に ALIGN 8 を使用 し ます。 • ラ ベルだけの行は任意の境界で整列 さ れ ます。 それに続 く ARM コ ー ド は ワ ー ド 境界で整列 さ れ ます (Thumb コ ー ド はハーフ ワー ド 境界で整列 さ れ ます)。 そのため、 こ の ラ ベルでは コ ー ド が正 し く ア ド レ ス指定 さ れ ません。 こ の よ う な場合は、 ラ ベルの前に ALIGN 4 (Thumb の場合は ALIGN 2) を使用 し ます。 境界調整は、 ルーチンが配置 さ れ る ELF セ ク シ ョ ンの開始位置か ら 相対的に 行われ ます。 ELF セ ク シ ョ ンは、 同 じ 境界ま たはそれ よ り も 粗い境界で整列 さ せ る 必要があ り ます。 AREA デ ィ レ ク テ ィ ブの ALIGN 属性は異な る 方法で指定 さ れ ます (「AREA」 (ページ 7-81) お よ び 「「例」」 を参照)。 例 rout1 rout2 ARM DUI 0204IJ AREA ; code ; code MOV ALIGN ; code cacheable, CODE, ALIGN=3 ; aligned on 8-byte boundary pc,lr 8 ; aligned only on 4-byte boundary ; now aligned on 8-byte boundary Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-79 デ ィ レ クテ ィ ブ リ フ ァ レンス AREA DCB ALIGN DCB OffsetExample, CODE 1 ; This example places the two 4,3 ; bytes in the first and fourth 1 ; bytes of the same word. AREA Example, CODE, READONLY LDR r6,=label1 ; code MOV pc,lr label1 DCB 1 ; pc now misaligned ALIGN ; ensures that subroutine1 addresses subroutine1 ; the following instruction. MOV r5,#0x5 start 7-80 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.2 AREA AREA デ ィ レ ク テ ィ ブは、 新 し い コ ー ド セ ク シ ョ ン ま たはデー タ セ ク シ ョ ン を アセ ン ブルす る よ う アセ ン ブ ラ に指示 し ます。 こ れ ら のセ ク シ ョ ンは、 リ ン カに よ っ て操作 さ れ る 、 名前付 き で独立 し た分割不可能な コ ー ド ま たはデー タ のかた ま り です。 詳細については、 「ELF セ ク シ ョ ン と AREA デ ィ レ ク テ ィ ブ」 (ページ 2-16) を参照 し て下 さ い。 構文 AREA sectionname{,attr}{,attr}... 各項目には以下の意味があ り ます。 sectionname セ ク シ ョ ンに割 り 当て る 名前を指定 し ます。 セ ク シ ョ ンには任意の名前を指定で き ます。 ただ し 、 アル フ ァ ベ ッ ト 以外の文字で始ま る 名前は縦棒で囲む必要があ り ます。 こ れに反す る と 、 セ ク シ ョ ン名エ ラ ーが生成 さ れ ます。 以下に例を示 し ます。 |1_DataArea| 定型の名前は従来どお り です。 例えば、 |.text| は、 C コ ン パ イ ラ に よ っ て生成 さ れ る コ ー ド セ ク シ ョ ン、 ま たは C ラ イ ブ ラ リ に関連付け ら れた コ ー ド セ ク シ ョ ン に使用 さ れま す。 attr 1 つ以上のセ ク シ ョ ン属性を コ ン マで区切っ て指定 し ま す。 有効な属性は以下の と お り です。 ALIGN=expression デフ ォ ル ト では、 ELF セ ク シ ョ ンは 4 バ イ ト 境 界で整列 さ れます。 expression には 0 ~ 31 の任意 の整数値を指定で き ます。 こ のセ ク シ ョ ンは 2expression- バ イ ト 境界で整列 さ れ ます。 例えば、 expression に 10 が指定 さ れてい る 場合、 こ のセ ク シ ョ ンは 1KB 境界で整列 さ れ ます。 こ れは、 ALIGN デ ィ レ ク テ ィ ブの指定方法 と は異 な り ます。 詳細については、 「ALIGN」 (ページ 7-78) を参照 し て下 さ い。 注 ARM コ ー ド セ ク シ ョ ンには ALIGN=0 ま たは ALIGN=1 を使用 し ないで下 さ い。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-81 デ ィ レ クテ ィ ブ リ フ ァ レンス Thumb コ ー ド セ ク シ ョ ンには ALIGN=0 を使用 し な いで下 さ い。 ASSOC=section section には、 関連す る ELF セ ク シ ョ ン を指定 し ます。 sectionname は、 section を含むすべての リ ン ク に含ま れてい る 必要があ り ます。 CODE マシ ン命令を保持 し ます。 READONLY がデフ ォ ル ト です。 CODEALIGN ALIGN デ ィ レ ク テ ィ ブが異な る パデ ィ ン グ を指定 し ない限 り 、 セ ク シ ョ ン内の ALIGN デ ィ レ ク テ ィ ブが ARM ま たは Thumb 命令後に使用 さ れ る 際 に、 アセ ン ブ ラ に よ っ て NOP 命令が挿入 さ れ ま す。 COMDEF 共通セ ク シ ョ ン の定義です。 こ の ELF セ ク シ ョ ンは、 コ ー ド ま たはデー タ を保持で き ます。 こ の セ ク シ ョ ンは、 他の ソ ース フ ァ イ ル内にあ る 同 じ 名前の付いた他のセ ク シ ョ ン と 同 じ であ る 必 要があ り ます。 同 じ 名前の付いた同一の ELF セ ク シ ョ ンは、 リ ン カに よ っ て同 じ メ モ リ セ ク シ ョ ン にオーバー レ イ さ れます。 こ れ ら のセ ク シ ョ ンが異な っ てい る と 、 リ ン カに よ っ て警告 メ ッ セージが生成 さ れ、 セ ク シ ョ ン のオーバーレ イ は行われません。 『 リ ン カユーザガ イ ド 』 の第 3 章 基本 リ ン カ機能 の使用 を参照 し て下 さ い。 COMGROUP=symbol_name 共通グループセ ク シ ョ ン です。 共通グループセ ク シ ョ ン内のすべてのセ ク シ ョ ンは共通です。 オブ ジ ェ ク ト が リ ン ク さ れ る と 、 他のオブジ ェ ク ト フ ァ イ ルは、 署名が symbol_name の GROUP を持 ち ます。 1 つのグループのみが最終 イ メ ージに保 持 さ れ ます。 COMMON 7-82 共通デー タ セ ク シ ョ ン です。 こ のセ ク シ ョ ン内で は コ ー ド ま たはデー タ は定義で き ません。 こ のセ ク シ ョ ンは、 リ ン カに よ っ てゼ ロ に初期化 さ れ ます。 同 じ 名前の付いたすべての共通セ ク シ ョ ン Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス は、 リ ン カに よ っ て同 じ メ モ リ セ ク シ ョ ン に オーバーレ イ さ れます。 すべてのセ ク シ ョ ン が同 じ サ イ ズであ る 必要はあ り ません。 リ ン カは、 同 じ 名前の付いたセ ク シ ョ ン の う ち最 も 大 き な共 通セ ク シ ョ ン に必要 と さ れ る だけの空間を割 り 当て ます。 DATA 命令ではな く 、 デー タ を保持 し ます。 READWRITE がデフ ォ ル ト です。 FINI_ARRAY 現在の領域の ELF 型を SHT_FINI_ARRAY に設定 し ま す。 GROUP=symbol_name グループの署名を指定 し ます。 ソ ース フ ァ イ ル、 ま たは ソ ース フ ァ イ ルに含ま れ る フ ァ イ ルに よ っ て定義 さ れ る 必要があ り ます。 同 じ symbol_name 署名内のすべての AREAS は、 同 じ グ ループに配置 さ れます。 グループ内のセ ク シ ョ ン は、 一緒に保持ま たは検出 さ れ ます。 INIT_ARRAY 現在の領域の ELF 型を SHT_INIT_ARRAY に設定 し ま す。 LINKORDER=section イ メ ージ内での現在のセ ク シ ョ ン の相対的な位 置を指定 し ます。 その結果、 LINKORDER 属性を備え る セ ク シ ョ ンすべての順序が、 互いに関 し て イ メ ージ内で対応す る 名前付 き sections の順序 と 同 じ にな り ます。 ARM DUI 0204IJ MERGE=n リ ン カが現在のセ ク シ ョ ン を MERGE=n 属性を備え た他のセ ク シ ョ ン と マージで き る こ と を示 し ま す。 n はセ ク シ ョ ン内の要素のサ イ ズです。 例え ば、 文字の場合には n は 1 です。 こ の属性があ っ て も リ ン カはセ ク シ ョ ンのマージ を強制 さ れな いので、 必ず し も セ ク シ ョ ン がマージ さ れ る と は限 り ません。 NOALLOC タ ーゲ ッ ト シ ス テ ム上の メ モ リ が こ のエ リ アに 割 り 当て ら れない こ と を示 し ます。 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-83 デ ィ レ クテ ィ ブ リ フ ァ レンス NOINIT デー タ セ ク シ ョ ンが初期化 さ れていないか、 ま たはゼ ロ に初期化 さ れてい る こ と を示 し ます。 こ の属性に含まれ る のは、 空間予約デ ィ レ ク テ ィ ブ SPACE か、 初期値がゼ ロ に設定 さ れた DCB、 DCD、 DCDU、 DCQ、 DCQU、 DCW、 ま たは DCWU デ ィ レ ク テ ィ ブ だけです。 エ リ ア を初期化 し ないか、 ま たはゼ ロ で初期化す る かは リ ン ク 時に決め る こ と がで き ます。 『 リ ン カユーザガ イ ド 』 の第 3 章 基本 リ ン カ機能の使用 を参照 し て下 さ い。 PREINIT_ARRAY 現在の領域の ELF 型を SHT_PREINIT_ARRAY に設定 し ます。 こ のセ ク シ ョ ンへの書 き 込みが禁止 さ れてい る こ と を示 し ます。 コ ー ド エ リ アの場合は こ れがデ フ ォ ル ト です。 READONLY READWRITE こ のセ ク シ ョ ン に対す る 読み出 し と 書 き 込みが 可能な こ と を示 し ます。 デー タ エ リ アの場合は こ れがデフ ォ ル ト です。 SECFLAGS=n 現在のセ ク シ ョ ンに ELF フ ラ グ を 1 つ以上 (n で 指定 さ れます) 追加 し ます。 SECTYPE=n 現在のセ ク シ ョ ンの ELF 型を n に設定 し ます。 STRINGS 現在のセ ク シ ョ ンに SHF_STRINGS フ ラ グ を追加 し ます。 STRINGS 属性を使用す る には、 MERGE=1 属性 も 使用す る 必要があ り ます。 セ ク シ ョ ンの コ ン テ ン ツは、 DCB デ ィ レ ク テ ィ ブ を使用 し て NULL で 終わ る 文字列であ る 必要があ り ます。 使用法 AREA デ ィ レ ク テ ィ ブ を使用 し て、 ソ ース フ ァ イ ルを複数の ELF セ ク シ ョ ンに 分割 し ます。 複数の AREA デ ィ レ ク テ ィ ブで同 じ 名前を使用で き ます。 同 じ 名前 の付いたエ リ アはすべて、 同 じ ELF セ ク シ ョ ンに配置 さ れます。 特定の名前 の付いた最初の AREA デ ィ レ ク テ ィ ブの属性だけが適用 さ れます。 7-84 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 通常、 コ ー ド と デー タ には別々の ELF セ ク シ ョ ン を使用す る 必要があ り ま す。 大 き なプ ロ グ ラ ムは、 扱いやすい よ う に複数の コ ー ド セ ク シ ョ ン に分割 で き ます。 ま た、 大 き な独立デー タ セ ッ ト も 別々のセ ク シ ョ ン に配置す る の が適切です。 ロ ーカル ラ ベルの有効範囲は、 AREA デ ィ レ ク テ ィ ブに よ っ て定義 さ れ、 必要 に応 じ て ROUT デ ィ レ ク テ ィ ブに よ っ て分割 さ れます (「 ロ ーカル ラ ベル」 (ページ 3-33) お よ び 「ROUT」 (ページ 7-104) を参照)。 アセ ン ブ リ には少な く と も 1 つの AREA デ ィ レ ク テ ィ ブが必要です。 例 以下の例では、 Example と い う 名前の読み出 し 専用の コ ー ド セ ク シ ョ ン を定義 し ます。 AREA ARM DUI 0204IJ Example,CODE,READONLY ; code ; An example code section. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-85 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.3 ATTR ATTR デ ィ レ ク テ ィ ブセ ッ ト は、 ABI ビル ド 属性の値を設定 し ます。 ATTR ス コ ープデ ィ レ ク テ ィ ブは、 設定値の適用先の有効範囲を指定 し ます。 構文 ATTR FILESCOPE ATTR SCOPE name ATTR settype, tagid, value 各項目には以下の意味があ り ます。 name セ ク シ ョ ン名ま たはシ ン ボル名を指定 し ます。 settype 次のいずれか を指定で き ます。 • SETVALUE • SETSTRING • SETCOMPATIBLEWITHVALUE • SETCOMPATIBLEWITHSTRING tagid 属性 タ グ名 (ま たはその数値) を指定 し ます。 こ れは、 ARM アーキ テ ク チ ャ の ABI で定義 さ れます。 value settype に依存 し ます。 • 32 ビ ッ ト 整数値 (settype が SETVALUE ま たは SETCOMPATIBLEWITHVALUE の場合) • NULL で終わ る 文字列 (settype が SETSTRING ま たは SETCOMPATIBLEWITHSTRING の場合) 使用法 ATTR FILESCOPE デ ィ レ ク テ ィ ブに続 く ATTR 設定デ ィ レ ク テ ィ ブは、 オブジ ェ ク ト フ ァ イ ル全体に適用 さ れます。 ATTR SCOPE name デ ィ レ ク テ ィ ブに続 く ATTR 設 定デ ィ レ ク テ ィ ブは、 名前付 き セ ク シ ョ ン ま たはシ ン ボルだけに適用 さ れ ま す。 7-86 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 整数が必要な タ グの場合、 SETVALUE ま たは SETCOMPATIBLEWITHVALUE を使用す る 必 要があ り ます。 文字列が来 る こ と にな っ てい る タ グの場合、 SETSTRING ま たは SETCOMPATIBLEWITHSTRING を使用す る 必要があ り ます。 タ グ名の リ ス ト について は、 「ABI for the ARM Architecture」 の追捕表お よ び正誤表を参照 し て下 さ い。 SETCOMPATIBLEWITHVALUE と SETCOMPATIBLEWITHSTRING を使用 し て、 オブジ ェ ク ト フ ァ イ ル も 互換性を備え る タ グ値を設定 し ます。 例 ATTR ATTR ATTR ARM DUI 0204IJ SETSTRING Tag_CPU_raw_name, "Cortex-A8" SETVALUE Tag_VFP_arch, 3 ; VFPv3 instructions were permitted. SETVALUE 10, 3 ; 10 is the numerical value of ; Tag_VFP_arch. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-87 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.4 END END デ ィ レ ク テ ィ ブは、 ソ ース フ ァ イ ルの終わ り に到達 し た こ と を アセ ン ブ ラ に通知 し ます。 構文 END 使用法 すべてのアセ ン ブ リ 言語の ソ ース フ ァ イ ルは、 END デ ィ レ ク テ ィ ブが単独で記 述 さ れた行で終了す る 必要があ り ます。 GET デ ィ レ ク テ ィ ブに よ っ て ソ ース フ ァ イ ルがペア レ ン ト フ ァ イ ルに イ ン ク ルー ド さ れてい る 場合、 アセ ン ブ ラ はペア レ ン ト フ ァ イ ルに戻 り 、 GET デ ィ レ ク テ ィ ブの次の行か ら アセ ン ブルを継続 し ます。 詳細については、 「GET、 INCLUDE」 (ページ 7-95) を参照 し て下 さ い。 ト ッ プ レベルの ソ ース フ ァ イ ル内で、 エ ラ ーが発生す る こ と な く 第 1 パ ス で END に到達す る と 、 第 2 パ ス が開始 さ れます。 ト ッ プ レベルの ソ ース フ ァ イ ル内で、 第 2 パ ス で END に到達す る と 、 アセ ン ブ ラ はアセ ン ブ リ を終了 し て適切な出力を行い ます。 7.8.5 ENTRY ENTRY デ ィ レ ク テ ィ ブは、 プ ロ グ ラ ムへのエ ン ト リ ポ イ ン ト を宣言 し ます。 構文 ENTRY 使用法 プ ロ グ ラ ムには少な く と も 1 つの ENTRY ポ イ ン ト を指定す る 必要があ り ます。 ENTRY が存在 し ない場合は、 リ ン ク 時に警告 メ ッ セージが生成 さ れます。 1 つの ソ ース フ ァ イ ル内で複数の ENTRY デ ィ レ ク テ ィ ブ を使用す る こ と はで き ません。 ま た、 すべての ソ ース フ ァ イ ル内に ENTRY デ ィ レ ク テ ィ ブ を指定す る 必要があ る わけではあ り ません。 1 つの ソ ース フ ァ イ ル内に複数の ENTRY が存 在す る と 、 アセ ン ブ リ 時にエ ラ ー メ ッ セージが生成 さ れます。 7-88 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 例 AREA ENTRY ARM DUI 0204IJ ARMex, CODE, READONLY ; Entry point for the application Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-89 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.6 EQU EQU デ ィ レ ク テ ィ ブは、 数値定数、 レ ジ ス タ 相対値、 ま たはプ ロ グ ラ ム相対値 にシ ン ボル名を割 り 当て ます。 * は EQU と 同 じ 意味です。 構文 name EQU expr{, type} 各項目には以下の意味があ り ます。 name 値に割 り 当て る シ ン ボル名を指定 し ます。 expr レ ジ ス タ 相対ア ド レ ス、 プ ロ グ ラ ム相対ア ド レ ス、 絶対ア ド レ ス、 ま たは 32 ビ ッ ト 整数定数のいずれか を指定 し ます。 type は、 す。 • • • • • オプシ ョ ン です。 type には、 以下のいずれか を指定で き ま ARM THUMB CODE32 CODE16 DATA type は、 expr が絶対ア ド レ ス の場合にのみ使用で き ます。 name が エ ク ス ポー ト さ れ る 場合、 オブジ ェ ク ト フ ァ イ ル内のシ ン ボル テーブルに含ま れ る name エ ン ト リ は、 type に指定 さ れてい る 値に 基づいて ARM、 THUMB、 CODE32、 CODE16、 ま たは DATA のいずれか と し てマー ク さ れます。 こ の情報は リ ン カに よ っ て使用 さ れ ます。 使用法 EQU を使用 し て定数を定義 し ます。 こ れは、 C 言語で #define を使用 し て定数を 定義す る 方法 と 似てい ます。 シ ン ボルのエ ク ス ポー ト については、 「KEEP」 (ページ 7-101) お よ び 「EXPORT、 GLOBAL」 (ページ 7-92) を参照 し て下 さ い。 7-90 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 例 abc EQU 2 xyz EQU label+8 fiq EQU 0x1C, CODE32 ARM DUI 0204IJ ; ; ; ; ; assigns the value 2 to the symbol abc. assigns the address (label+8) to the symbol xyz. assigns the absolute address 0x1C to the symbol fiq, and marks it as code Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-91 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.7 EXPORT、 GLOBAL EXPORT デ ィ レ ク テ ィ ブは、 個別のオブジ ェ ク ト フ ァ イ ル と ラ イ ブ ラ リ フ ァ イ ルに含ま れ る シ ン ボルへの参照を解決す る ために リ ン カが使用で き る シ ン ボ ルを宣言 し ます。 GLOBAL は EXPORT と 同 じ 意味です。 構文 EXPORT {[WEAK]} EXPORT symbol {[type]} EXPORT symbol [attr{,type}] EXPORT symbol [WEAK{,attr}{,type}] 各項目には以下の意味があ り ます。 symbol エ ク ス ポー ト す る シ ン ボル名を指定 し ます。 シ ン ボル名では大文 字 と 小文字が区別 さ れます。 symbol が省略 さ れてい る 場合は、 す べてのシ ン ボルがエ ク ス ポー ト さ れ ます。 WEAK 他の ソ ース に よ っ て別の symbol がエ ク ス ポー ト さ れない場合に のみ、 symbol は他の ソ ース に イ ン ポー ト さ れ ます。 symbol を指定 せずに [WEAK] を指定す る と 、 エ ク ス ポー ト さ れ る すべてのシ ン ボルが WEAK にな り ます。 attr 次のいずれか を指定で き ます。 DYNAMIC ELF シ ン ボルの可視性を STV_DEFAULT に設定 し ます。 PROTECTED ELF シ ン ボルの可視性を STV_PROTECTED に設定 し ます。 HIDDEN ELF シ ン ボルの可視性を STV_HIDDEN に設定 し ます。 INTERNAL ELF シ ン ボルの可視性を STV_INTERNAL に設定 し ます。 type シ ン ボル型を指定 し ます。 DATA ソ ース がアセ ン ブル さ れ リ ン ク さ れ る と 、 symbol はデー タ と し て扱われます。 CODE ソ ース がアセ ン ブル さ れ リ ン ク さ れ る と 、 symbol は コ ー ド と し て扱われ ます。 ELFTYPE=n n の値に従っ て、 symbol は特定の ELF シ ン ボル と し て扱 われます。 ただ し 、 n は 0 ~ 15 の任意の値を取 り ます。 指定 さ れない場合、 アセ ン ブ ラ は最適な型を選択 し ます。 7-92 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 使用法 EXPORT を使用 し て、 他の フ ァ イ ルの コ ー ド が現在の フ ァ イ ルのシ ン ボルにア ク セ ス で き る よ う に し ます。 [WEAK] 属性を使用 し て、 symbol の別の イ ン ス タ ン ス が別の ソ ース に存在す る 場 合は、 その イ ン ス タ ン ス が こ の イ ン ス タ ン ス に優先 さ れ る こ と を リ ン カに通 知 し ます。 [WEAK] 属性は、 任意のシ ン ボルの可視化属性 と 共に使用で き ます。 「IMPORT、 EXTERN」 (ページ 7-97) も 参照 し て下 さ い。 シ ン ボルの可視性の詳細については、 www.infocenter.arm.com か ら 入手で き る ABI ド キ ュ メ ン ト の 『ELF for the ARM Architecture』 を参照 し て下 さ い。 例 AREA EXPORT DoAdd ADD Example,CODE,READONLY DoAdd ; Export the function name ; to be used by external ; modules. r0,r0,r1 エ ク ス ポー ト が重複す る 場合、 シ ン ボルの可視化はオーバー ラ イ ド さ れ る こ と があ り ます。 以下の例では、 最後の EXPORT のバ イ ン ド と 可視化が優先 さ れ ます。 EXPORT EXPORT ARM DUI 0204IJ SymA[WEAK] SymA[DYNAMIC] ; Export as weak-hidden ; SymA becomes non-weak dynamic. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-93 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.8 EXPORTAS EXPORTAS デ ィ レ ク テ ィ ブ を使用す る と 、 ソ ース フ ァ イ ル内の別のシ ン ボルに 対応す る 、 シ ン ボルを オブジ ェ ク ト フ ァ イ ルにエ ク ス ポー ト で き ます。 構文 EXPORTAS symbol1, symbol2 各項目には以下の意味があ り ます。 symbol1 ソ ース フ ァ イ ル内のシ ン ボルの名前を指定 し ます。 symbol1 は事 前に定義 さ れてい る 必要があ り ます。 こ の名前には、 エ リ ア名、 ラ ベル、 ま たは定数を含むシ ン ボルを指定で き ます。 symbol2 オブジ ェ ク ト フ ァ イ ルで使用す る シ ン ボルの名前を指定 し ます。 シ ン ボル名では大文字 と 小文字が区別 さ れ ます。 使用法 EXPORTAS を使用す る と 、 ソ ース フ ァ イ ル内の各 イ ン ス タ ン ス を変更す る こ と な く 、 オブジ ェ ク ト フ ァ イ ル内のシ ン ボルを変更す る こ と がで き ます。 「EXPORT、 GLOBAL」 (ページ 7-92) も 参照 し て下 さ い。 例 AREA data1, DATA AREA data2, DATA EXPORTAS data2, data1 one EQU 2 EXPORTAS one, two EXPORT one 7-94 ; ; ; ; starts a new area data1 starts a new area data2 the section symbol referred to as data2 will appear in the object file string table as data1. ; the symbol 'two' will appear in the object ; file's symbol table with the value 2. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.9 GET、 INCLUDE GET デ ィ レ ク テ ィ ブは、 アセ ン ブル中の フ ァ イ ル内に別の フ ァ イ ルを イ ン ク ルー ド し ます。 イ ン ク ルー ド さ れ る フ ァ イ ルは、 GET デ ィ レ ク テ ィ ブの位置で アセ ン ブル さ れ ます。 INCLUDE は GET と 同 じ 意味です。 構文 GET filename 各項目には以下の意味があ り ます。 filename アセ ン ブ リ 時に イ ン ク ルー ド さ れ る フ ァ イ ルの名前を指定 し ま す。 アセ ンブ ラ は UNIX 形式ま たは MS-DOS 形式のパ ス名を認識 し ます。 使用法 GET は、 アセ ン ブ リ 時にマ ク ロ 定義、 EQU、 お よ び記憶域マ ッ プ を イ ン ク ルー ド す る のに便利です。 イ ン ク ルー ド さ れた フ ァ イ ルのアセ ン ブルが完了す る と 、 アセ ンブ ラ は GET デ ィ レ ク テ ィ ブの次の行か ら アセ ンブルを継続 し ます。 デフ ォ ル ト では、 アセ ンブ ラ は、 現在の場所で イ ン ク ルー ド さ れ る フ ァ イ ル を検索 し ます。 現在の場所 と は、 呼び出 し 元の フ ァ イ ルが存在す る デ ィ レ ク ト リ を指 し ます。 検索パ ス にデ ィ レ ク ト リ を追加す る には、 アセ ン ブ ラ の -i コ マ ン ド ラ イ ン オプシ ョ ン を使用 し ます。 スペース を含むフ ァ イ ル名お よ び デ ィ レ ク ト リ 名を二重引用符 (" ") で囲ま ないで下 さ い。 イ ン ク ルー ド さ れ る フ ァ イ ル内で別の GET デ ィ レ ク テ ィ ブ を使用 し て、 他の フ ァ イ ルを イ ン ク ルー ド で き ます (「ネ ス テ ィ ン グデ ィ レ ク テ ィ ブ」 (ページ 7-36) を参照)。 イ ン ク ルー ド さ れ る フ ァ イ ルが現在の場所 と は異な る デ ィ レ ク ト リ にあ る 場 合は、 イ ン ク ルー ド さ れ る フ ァ イ ルの終わ り ま で、 そのデ ィ レ ク ト リ が現在 の場所 と な り ます。 その後、 前の場所が復元 さ れ ます。 GET を使用 し て、 オブジ ェ ク ト フ ァ イ ルを イ ン ク ルー ド す る こ と はで き ません (「INCBIN」 (ページ 7-100) を参照)。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-95 デ ィ レ クテ ィ ブ リ フ ァ レンス 例 AREA GET GET GET 7-96 Example, CODE, READONLY file1.s ; includes file1 if it exists ; in the current place. c:\project\file2.s ; includes file2 c:\Program files\file3.s ; space is permitted Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.10 IMPORT、 EXTERN こ れ ら のデ ィ レ ク テ ィ ブは、 現在のアセ ン ブ リ に定義 さ れていない名前を ア セ ンブ ラ に渡 し ます。 構文 directive symbol {[type]} directive symbol [attr{,type}] directive symbol [WEAK{,attr}{,type}] 各項目には以下の意味があ り ます。 directive 次のいずれか を指定で き ます。 IMPORT シ ン ボルを無条件に イ ン ポー ト し ます。 EXTERN シ ン ボルが現在のアセ ン ブ リ で参照 さ れ る 場合にのみ、 イ ン ポー ト し ます。 symbol 別々にアセ ン ブル さ れた ソ ース フ ァ イ ル、 オブジ ェ ク ト フ ァ イ ル、 ま たは ラ イ ブ ラ リ 内で定義 さ れてい る シ ン ボルの名前を指 定 し ます。 シ ン ボル名では大文字 と 小文字が区別 さ れ ます。 WEAK シ ン ボルが ど こ に も 定義 さ れていない場合に、 リ ン カに よ っ て エ ラ ー メ ッ セージが生成 さ れ る の を回避 し ます。 ま た、 こ のオプ シ ョ ン を指定す る と 、 リ ン カは イ ン ク ルー ド さ れていない ラ イ ブ ラ リ の検索 も 行い ません。 attr 次のいずれか を指定で き ます。 DYNAMIC ELF シ ン ボルの可視性を STV_DEFAULT に設定 し ます。 PROTECTED ELF シ ン ボルの可視性を STV_PROTECTED に設定 し ます。 HIDDEN ELF シ ン ボルの可視性を STV_HIDDEN に設定 し ます。 INTERNAL ELF シ ン ボルの可視性を STV_INTERNAL に設定 し ます。 type シ ン ボル型を指定 し ます。 DATA ソ ース がアセ ンブル さ れ リ ン ク さ れ る と 、 symbol はデー タ と し て扱われ ます。 CODE ソ ース がアセ ンブル さ れ リ ン ク さ れ る と 、 symbol は コ ー ド と し て扱われ ます。 ELFTYPE=n n の値に従っ て、 symbol は特定の ELF シ ン ボル と し て扱 われます。 ただ し 、 n は 0 ~ 15 の任意の値を取 り ます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-97 デ ィ レ クテ ィ ブ リ フ ァ レンス 指定 さ れない場合、 リ ン カは最適な型を選択 し ます。 7-98 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 使用法 別のオブジ ェ ク ト フ ァ イ ル内で定義 さ れたシ ン ボルへの リ ン ク 時に、 シ ン ボ ル名が解決 さ れます。 こ のシ ン ボルはプ ロ グ ラ ム のア ド レ ス と し て処理 さ れ ます。 [WEAK] が指定 さ れていない場合、 対応す る シ ン ボルが リ ン ク 時に検出 さ れない と 、 リ ン カに よ っ てエ ラ ーが生成 さ れ ます。 [WEAK] が指定 さ れてお り 、 対応す る シ ン ボルが リ ン ク 時に検出 さ れない場合 は、 以下の よ う にな り ます。 • 参照が B 命令ま たは BL 命令のデス テ ィ ネーシ ョ ン であ る 場合、 シ ン ボル の値が次の命令のア ド レ ス と し て使用 さ れます。 し たが っ て、 こ の B 命 令ま たは BL 命令は NOP と な り ます。 • それ以外の場合、 シ ン ボルの値はゼ ロ と 見な さ れます。 シ ン ボルの可視性の詳細については、 www.infocenter.arm.com か ら 入手で き る ABI ド キ ュ メ ン ト の 『ELF for the ARM Architecture』 を参照 し て下 さ い。 例 こ の例では、 C++ ラ イ ブ ラ リ が リ ン ク さ れていて、 演算結果に基づいて条件 分岐が発生す る か ど う か を確認 し てい ます。 AREA EXTERN LDR CMP BEQ ARM DUI 0204IJ Example, CODE, READONLY __CPP_INITIALIZE[WEAK] ; ; r0,=__CPP_INITIALIZE ; r0,#0 ; nocplusplus ; If C++ library linked, gets the address of __CPP_INITIALIZE function. If not linked, address is zeroed. Test if zero. Branch on the result. Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-99 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.11 INCBIN INCBIN デ ィ レ ク テ ィ ブは、 アセ ン ブル中の フ ァ イ ル内に別の フ ァ イ ルを イ ン ク ルー ド し ます。 こ の フ ァ イ ルはアセ ン ブル さ れずにその ま ま イ ン ク ルー ド さ れ ます。 構文 INCBIN filename 各項目には以下の意味があ り ます。 アセ ン ブ リ 時に イ ン ク ルー ド さ れ る フ ァ イ ルの名前を指定 し ま す。 アセ ン ブ ラ は UNIX 形式ま たは MS-DOS 形式のパ ス名を認識 し ます。 filename 使用法 INCBIN を使用 し て、 実行可能フ ァ イ ル、 リ テ ラ ル、 ま たは任意のデー タ を イ ン ク ルー ド で き ます。 フ ァ イ ルの内容は、 解釈 さ れ る こ と な く 、 現在の ELF セ ク シ ョ ンにバ イ ト 単位で追加 さ れます。 アセ ンブルは、 INCBIN デ ィ レ ク テ ィ ブの次の行か ら 継続 さ れ ます。 デフ ォ ル ト では、 アセ ン ブ ラ は、 現在の場所で イ ン ク ルー ド さ れ る フ ァ イ ル を検索 し ます。 現在の場所 と は、 呼び出 し 元の フ ァ イ ルが存在す る デ ィ レ ク ト リ を指 し ます。 検索パ ス にデ ィ レ ク ト リ を追加す る には、 アセ ン ブ ラ の -i コ マ ン ド ラ イ ン オプシ ョ ン を使用 し ます。 スペース を含むフ ァ イ ル名お よ び デ ィ レ ク ト リ 名を二重引用符 (" ") で囲ま ないで下 さ い。 例 AREA INCBIN INCBIN 7-100 Example, CODE, READONLY file1.dat ; ; ; c:\project\file2.txt ; includes file1 if it exists in the current place. includes file2 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.12 KEEP KEEP デ ィ レ ク テ ィ ブは、 オブジ ェ ク ト フ ァ イ ル内のシ ン ボルテーブルに ロ ー カルシ ン ボルを保持 し てお く よ う アセ ン ブ ラ に指示 し ます。 構文 KEEP {symbol} 各項目には以下の意味があ り ます。 保持す る ロ ーカルシ ン ボルの名前を指定 し ます。 symbol が指定 さ れていない場合は、 レ ジ ス タ 相対シ ン ボルを除 く すべての ロ ー カルシ ン ボルが保持 さ れます。 symbol 使用法 デフ ォ ル ト では、 アセ ンブ ラ に よ っ て出力 さ れ る オブジ ェ ク ト フ ァ イ ル内に 記述 さ れ る シ ン ボルは以下のシ ン ボルのみです。 • エ ク ス ポー ト さ れ る シ ン ボル • 再配置 さ れ る シ ン ボル KEEP を使用 し て、 デバ ッ グに使用で き る ロ ーカルシ ン ボルを保持 し ます。 保 持 さ れたシ ン ボルは、 ARM デバ ッ ガお よ び リ ン カ マ ッ プ フ ァ イ ルに出力 さ れ ます。 KEEP では、 レ ジ ス タ 相対シ ン ボルを保持で き ません (「MAP」 (ページ 7-21) を参照)。 例 label ARM DUI 0204IJ ADC KEEP ADD r2,r3,r4 label r2,r2,r5 ; makes label available to debuggers Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-101 デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.13 NOFP NOFP デ ィ レ ク テ ィ ブは、 アセ ン ブ リ 言語 ソ ース フ ァ イ ル内の浮動小数点命令 を禁止 し ます。 構文 NOFP 使用法 NOFP を使用 し て、 ソ フ ト ウ ェ ア ま たは タ ーゲ ッ ト ハー ド ウ ェ アで浮動小数点 命令がサポー ト さ れていない場合な ど に、 浮動小数点命令が使用 さ れ る こ と を防ぎ ます。 NOFP デ ィ レ ク テ ィ ブ よ り 後に浮動小数点命令が出現す る と 、 Unknown opcode エ ラ ーが生成 さ れ、 アセ ン ブルに失敗 し ます。 浮動小数点命令 よ り 後に NOFP デ ィ レ ク テ ィ ブが検出 さ れ る と 、 アセ ン ブ ラ に よ っ て以下のエ ラ ーが生成 さ れ ます。 Too late to ban floating point instructions アセ ン ブルに失敗 し ます。 7.8.14 REQUIRE REQUIRE デ ィ レ ク テ ィ ブは、 セ ク シ ョ ン間の依存関係を指定 し ます。 構文 REQUIRE label 各項目には以下の意味があ り ます。 必要な ラ ベルの名前を指定 し ます。 label 使用法 REQUIRE を使用す る と 、 関連す る セ ク シ ョ ンが直接呼び出 さ れない場合で も 、 そのセ ク シ ョ ン を イ ン ク ルー ド す る こ と がで き ます。 REQUIRE デ ィ レ ク テ ィ ブ を含むセ ク シ ョ ンが リ ン ク に イ ン ク ルー ド さ れ る 場合、 リ ン カは、 指定 さ れ た ラ ベルの定義を含むセ ク シ ョ ン も イ ン ク ルー ド し ます。 7-102 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 7.8.15 REQUIRE8、 PRESERVE8 REQUIRE8 デ ィ レ ク テ ィ ブは、 現在の フ ァ イ ルに 8 バ イ ト 境界で境界調整 さ れた ス タ ッ ク が必要であ る こ と を指定 し ます。 こ のデ ィ レ ク テ ィ ブは、 こ の こ と を リ ン カに通知す る ために REQ8 ビル ド 属性を設定 し ます。 PRESERVE8 デ ィ レ ク テ ィ ブは、 現在の フ ァ イ ルが 8 バ イ ト 境界で境界調整 さ れ た ス タ ッ ク を保持 し てい る こ と を指定 し ます。 こ のデ ィ レ ク テ ィ ブは、 こ の こ と を リ ン カに通知す る ために PRES8 ビル ド 属性を設定 し ます。 リ ン カは、 8 バ イ ト 境界で境界調整 さ れた ス タ ッ ク を必要 と す る コ ー ド が、 8 バ イ ト 境界で境界調整 さ れた ス タ ッ ク を保持す る コ ー ド に よ っ てのみ直接的 ま たは間接的に呼び出 さ れ る こ と をチ ェ ッ ク し ます。 構文 REQUIRE8 {bool} PRESERVE8 {bool} 各引数には以下の意味があ り ます。 任意でブール定数 ({TRUE} ま たは {FALSE}) を指定 し ます。 bool 使用法 コ ー ド で 8 バ イ ト 境界で境界調整 さ れた ス タ ッ ク を保持す る 場合は、 必要に 応 じ て、 PRESERVE8 を使用 し て フ ァ イ ルに PRES8 ビル ド 属性を設定 し ます。 コ ー ド で 8 バ イ ト 境界で境界調整 さ れた ス タ ッ ク を保持 し ない場合は、 PRESERVE8 {FALSE} を使用 し て PRES8 ビル ド 属性が設定 さ れない よ う に し ます。 注 PRESERVE8 と PRESERVE8 {FALSE} の両方を省略す る と 、 アセ ン ブ ラ は、 sp を変更 す る 命令を調べて、 PRES8 ビル ド 属性を設定す る か ど う か を決定 し ます。 PRESERVE8 は明示的に指定す る こ と をお勧め し ます。 以下の よ う に警告 メ ッ セージ を イ ネーブルで き ます。 armasm --diag_warning 1546 詳細については、 「コ マン ド 構文」 (ページ 3-2) を参照 し て下 さ い。 警告 メ ッ セージ を イ ネーブルす る と 、 以下の よ う な警告 メ ッ セージが表示 さ れます。 ARM DUI 0204IJ Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-103 デ ィ レ クテ ィ ブ リ フ ァ レンス "test.s", line 37: Warning: A1546W: Stack pointer update potentially breaks 8 byte stack alignment 37 00000044 STMFD sp!,{r2,r3,lr} 例 REQUIRE8 REQUIRE8 REQUIRE8 PRESERVE8 PRESERVE8 7.8.16 {TRUE} {FALSE} {TRUE} {FALSE} ; ; ; ; equivalent to REQUIRE8 equivalent to absence of REQUIRE8 equivalent to PRESERVE8 NOT exactly equivalent to absence of PRESERVE8 ROUT ROUT デ ィ レ ク テ ィ ブは、 ロ ーカル ラ ベルの有効範囲の境界を マー ク し ます (「 ロ ーカル ラ ベル」 (ページ 3-33) を参照)。 構文 {name} ROUT 各項目には以下の意味があ り ます。 有効範囲に割 り 当て る 名前を指定 し ます。 name 使用法 ROUT デ ィ レ ク テ ィ ブ を使用 し て、 ロ ーカル ラ ベルの有効範囲を制限 し ます。 こ れに よ り 、 誤っ て違 う ラ ベルが参照 さ れ る のを簡単に防 ぐ こ と がで き ます。 ロ ーカル ラ ベルの有効範囲内に ROUT デ ィ レ ク テ ィ ブが存在 し ない場合は、 ロ ーカル ラ ベルの有効範囲はエ リ ア全体 と な り ます (「AREA」 (ページ 7-81) を参照)。 正 し い ロ ーカル ラ ベルへの参照が行われ る よ う にす る には、 name オプシ ョ ン を使用 し ます。 ラ ベルの名前ま たは ラ ベルへの参照が、 その前の ROUT デ ィ レ ク テ ィ ブに指定 さ れてい る 名前 と 一致 し ない場合は、 アセ ンブ ラ に よ っ てエ ラ ー メ ッ セージが生成 さ れ、 アセ ン ブルに失敗 し ます。 例 routineA 3routineA 7-104 ; code ROUT ; code ; code ; ROUT is not necessarily a routine ; this label is checked Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ デ ィ レ クテ ィ ブ リ フ ァ レンス 4routineA otherstuff ARM DUI 0204IJ ; code BEQ ; code BGE ; code ; code ; code ROUT %4routineA %3 ; this reference is checked ; refers to 3 above, but not checked ; this label is checked ; start of next scope Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential 7-105 デ ィ レ クテ ィ ブ リ フ ァ レンス 7-106 Copyright © 2002-2008 ARM Limited. All rights reserved. Non-Confidential ARM DUI 0204IJ