Comments
Transcript
RealView Compilation Tools コンパイラリファレンスガイド
RealView Compilation Tools ® バージ ョ ン 4.0 コ ンパイ ラ リ フ ァ レ ン スガ イ ド Copyright © 2007-2009 ARM Limited. All rights reserved. ARM DUI 0348BJ (ID 1 0 0 4 1 9 ) RealView Compilation Tools コ ンパイ ラ リ フ ァ レ ン スガ イ ド Copyright © 2007-2009 ARM Limited. All rights reserved. リ リ ース情報 本書には以下の変更が加え ら れてい ます。 変更履歴 日付 発行 機密保持ス テー タ ス 変更点 2007 年 3 月 A 非機密扱い RealView Development Suite v3.1 向け リ リ ース 3.1 2008 年 9 月 B 非機密扱い RealView Development Suite v4.0 向け リ リ ース 4.0 2009 年 1 月 23 日 B 非機密扱い RealView Development Suite v4.0 マニ ュ アルの更新 2009 年 3 月 2 日 B 非機密扱い RealView Development Suite v4.0 マニ ュ アルの更新 2 著作権 ® ま たは ™ のマー ク が付いた言葉お よ び ロ ゴは、 こ の著作権情報で別段に規定 さ れてい る 場合を 除 き 、 ARM® Limited の EU ま たはその他の国におけ る 登録商標お よ び商標です。 本書に記載 さ れ てい る 他の製品名は、 各社の所有す る 商標です。 本書に記載 さ れてい る 情報の全部ま たは一部、 な ら びに本書で紹介す る 製品は、 著作権所有者の 文書に よ る 事前の許可を得ない限 り 、 転用 ・ 複製す る こ と を禁 じ ます。 本書に記載 さ れてい る 製品は、 今後 も 継続的に開発 ・ 改良の対象 と な り ます。 本書に含ま れ る 製 品お よ びその利用方法についての情報は、 ARM が利用者の利益のために提供す る も のです。 し た が っ て当社では、 製品の市販性ま たは利用の適切性を含め、 暗示的 ・ 明示的に関係な く 一切の責 任を負い ません。 本書は、 本製品の利用者をサポー ト す る こ と だけ を目的 と し てい ます。 本書に記載 さ れてい る 情 報の使用、 情報の誤 り ま たは省略、 あ る いは本製品の誤使用に よ っ て発生 し たいかな る 損失 ・ 損 傷について も 、 ARM Limited は一切責任を負い ません。 ARM と い う 用語が使用 さ れてい る 場合、 “ARM ま たは必要に応 じ てその子会社” を指 し ます。 機密保持ス テー タ ス 本書は非機密扱いであ り 、 本書を使用、 複製、 お よ び開示す る 権利は、 ARM お よ び ARM が本書 を提供 し た当事者 と の間で締結 し た契約の条項に基づいた ラ イ セ ン ス の制限に よ り 異な り ます。 ア ク セ ス制限は、 ARM 社内に よ る 分類です。 製品ス テー タ ス 本書の情報は最終版であ り 、 開発済み製品に対応 し てい ます。 Web ア ド レ ス http://www.arm.com ii Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 目次 RealView Compilation Tools コ ンパイ ラ リ フ ァ レ ン スガ イ ド 序章 本書について ................................................................................................. vi フ ィ ー ド バ ッ ク .............................................................................................. x 第1章 は じ めに 1.1 1.2 1.3 1.4 第2章 コ マ ン ド ラ イ ン オプ シ ョ ン ......................................................................... 2-2 言語拡張機能 3.1 3.2 3.3 3.4 3.5 ARM DUI 0348BJ ID 1 0 0 4 1 9 1-2 1-3 1-6 1-9 コ ンパイ ラの コ マ ン ド ラ イ ン オプ シ ョ ン 2.1 第3章 ARM コ ンパイ ラ について ........................................................................... ソ ース言語モー ド ....................................................................................... 言語の拡張 と 言語への準拠 ......................................................................... C ラ イ ブ ラ リ と C++ ラ イ ブ ラ リ ................................................................ プ リ プ ロ セ ッ サ拡張機能 ............................................................................ 3-2 C90 で使用可能な C99 言語機能 ................................................................ 3-5 C++ および C90 で使用可能な C99 言語機能 ............................................ 3-7 標準の C 言語の拡張機能 ......................................................................... 3-10 標準の C++ 言語の拡張機能 ..................................................................... 3-16 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, iii 3.6 3.7 第4章 コ ンパイ ラ固有の機能 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 第5章 C-3 C-4 C-5 C-6 C++ ISO/IEC 標準に関する制限 ................................................................. D-2 整数値に関する制限 ................................................................................... D-4 浮動小数点数に関する制限 ........................................................................ D-6 NEON サポー ト の使用 E.1 E.2 E.3 iv 整数変換 ..................................................................................................... 純仮想関数の呼び出 し ................................................................................ サポー ト さ れている主な言語機能 .............................................................. 標準 C++ ラ イ ブ ラ リ の実装定義 ................................................................ C および C++ コ ンパイ ラの実装に関する制限 D.1 D.2 D.3 付録 E 実装定義 ..................................................................................................... B-2 ISO C 標準で定義 さ れていない動作 ........................................................ B-10 標準 C++ の実装定義 C.1 C.2 C.3 C.4 付録 D via フ ァ イルの概要 ..................................................................................... A-2 構文 ............................................................................................................ A-3 標準 C の実装定義 B.1 B.2 付録 C C および C++ の実装に関する詳細 ............................................................ 5-2 C++ の実装に関する詳細 ......................................................................... 5-15 via フ ァ イルの構文 A.1 A.2 付録 B キーワー ド と 演算子 ................................................................................... 4-2 __declspec 属性 ....................................................................................... 4-27 関数属性 ................................................................................................... 4-35 型属性 ....................................................................................................... 4-47 変数属性 ................................................................................................... 4-52 プ ラ グマ ................................................................................................... 4-62 命令 コ ンパイ ラ組み込み関数 ................................................................... 4-80 VFP ス テー タ ス組み込み関数 ................................................................ 4-125 GNU 組み込み関数 ................................................................................. 4-126 コ ンパイ ラ によ る事前定義 .................................................................... 4-129 C および C++ の実装に関する詳細 5.1 5.2 付録 A 標準 C および標準 C++ 言語の拡張機能 .................................................. 3-20 GNU 言語拡張機能 ................................................................................... 3-26 は じ めに ..................................................................................................... E-2 ベ ク タ のデー タ 型 ....................................................................................... E-3 コ ンパイ ラ組み込み関数 ............................................................................ E-5 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 序章 本章では、 『RealView Compilation Tools コ ンパ イ ラ リ フ ァ レ ン ス ガ イ ド 』 につ いて概説 し ます。 以下のセ ク シ ョ ン か ら 構成 さ れてい ます。 • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「本書について」 (ページ vi) 「フ ィ ー ド バ ッ ク 」 (ページ x) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, v 序章 本書について 本書では、 RealView Compilation Tools (RVCT) に関す る 参考情報 と 、 ARM コ ンパ イ ラ に使用で き る コ マ ン ド ラ イ ン オプシ ョ ン について説明 し てい ます。 ま た、 ARM コ ンパ イ ラ におけ る C や C++ の実装について も 説明 し てい ます。 ARM コ ンパ イ ラ の使用に関す る 一般的な情報については、 『RVCT コ ンパ イ ラ ユーザガ イ ド 』 を参照 し て下 さ い。 対象読者 本書は、 RVCT を使用 し て アプ リ ケーシ ョ ン を作成 し てい る 開発者を対象 と し てい ます。 し たがっ て、 本書の内容は、 経験豊富な ソ フ ト ウ ェ ア開発者を 想定 し て記述 さ れてい ます。 RVCT に付属の ARM 開発ツールの概要について は、 『RealView Compilation Tools エ ッ セ ン シ ャ ルガ イ ド 』 を参照 し て下 さ い。 本書の構成 本書は以下の章 と 付録か ら 構成 さ れてい ます。 第 1 章 は じ めに ARM コ ンパ イ ラ の概要、 準拠すべ き 標準、 お よ び C と C++ ラ イ ブ ラ リ について説明 し ます。 第 2 章 コ ンパ イ ラ の コ マ ン ド ラ イ ンオプシ ョ ン ARM コ ンパ イ ラ に使用で き る すべての コ マ ン ド ラ イ ン オプシ ョ ン について説明 し ます。 第 3 章 言語拡張機能 ARM コ ンパ イ ラ が提供す る 言語拡張機能について説明 し 、 標準 への準拠お よ び実装に関す る 情報を提供 し ます。 第 4 章 コ ンパ イ ラ 固有の機能 ARM 特有のキー ワ ー ド 、 演算子、 プ ラ グマ、 組み込み関数、 マ ク ロ 、 お よ びセ ミ ホ ス テ ィ ン グ スーパーバ イ ザ コール (SVC) について詳 し く 説明 し ます。 第 5 章 C お よ び C++ の実装に関す る詳細 ARM コ ンパ イ ラ の言語実装について詳 し く 説明 し ます。 vi Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 序章 付録 A via フ ァ イ ルの構文 via フ ァ イ ルの構文について説明 し ます。 via フ ァ イ ルを使用す る と 、 多数の ARM ツールに対 し て コ マ ン ド ラ イ ン引数を指定で き ます。 付録 B 標準 C の実装定義 ISO の C 標準要件に直接関連す る ARM C の実装について説明 し ます。 付録 C 標準 C++ の実装定義 ARM C++ の実装について説明 し ます。 付録 D C お よ び C++ コ ンパ イ ラ の実装に関す る 制限 ARM コ ンパ イ ラ での C お よ び C++ の実装に関す る 制約事項につ いて説明 し ます。 付録 E NEON サポー ト の使用 今回 リ リ ース さ れた RVCT でサポー ト さ れ る NEON™ コ ンパ イ ラ 組み込み関数について説明 し ます。 本書では、 ARM ソ フ ト ウ ェ アがデフ ォ ル ト の場所に イ ン ス ト ール さ れてい る こ と を前提 と し てい ます。 例えば、 Windows 環境では、 デフ ォ ル ト の場所は volume:\Program Files\ARM にな り ます。 パ ス名を参照す る 際、 install_directory の 部分を こ の場所に読み替え て下 さ い。 例えば、 本書では、 install_directory\Documentation\... の よ う なパ ス名が使用 さ れます。 ARM ソ フ ト ウ ェ ア を別の場所に イ ン ス ト ール し た場合は、 フ ァ イ ルパ ス の見方を変え る 必要があ り ます。 表記規則 本書では以下の表記規則を使用 し てい ます。 monospace コ マ ン ド 、 フ ァ イ ル名、 プ ロ グ ラ ム名、 ソ ース コ ー ド な ど、 キーボー ド か ら 入力可能な テ キ ス ト を示 し てい ます。 monospace コ マ ン ド ま たはオプシ ョ ン に使用可能な略語を示 し ます。 コ マ ン ド 名ま たはオプシ ョ ン名をすべて入力す る 代わ り に、 下線部分 の文字だけ を入力す る こ と がで き ます。 monospace italic コ マ ン ド ま たは関数の引数で、 特定の値に置 き 換え る こ と が可 能な も のを示 し てい ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, vii 序章 monospace bold サン プル コ ー ド 以外に使用 さ れ る 言語キー ワー ド を示 し てい ま す。 italic 重要事項、 重要用語、 相互参照、 引用箇所を斜体で記載 し てい ます。 bold メ ニ ュ ー名な ど のユーザ イ ン タ フ ェース要素を太字で記載 し て い ます。 ま た、 適宜記述 リ ス ト 内の重要箇所 と ARM プ ロ セ ッ サ の信号名に も 太字を用いてい ます。 参考資料 こ こ では、 ARM プ ロ セ ッ サ フ ァ ミ リ の コ ー ド 開発に関す る 補足情報を記載 し た ARM Limited お よ び各社の出版物を紹介 し ます。 ARM Limited は自社出版物の定期的な更新 ・ 修正を行っ てい ます。 最新の正誤 表、 追補表、 ARM に関す る FAQ については、 http://infocenter.arm.com/help/index.jsp を ご覧下 さ い。 ARM の出版物 本書では、 RVCT 付属の開発ツールの参考情報を提供 し てい ます。 こ のほか、 本製品には以下のマニ ュ アルが同梱 さ れてい ます。 『RVCT エ ッ セ ン シ ャ ルガ イ ド 』 (ARM DUI 0202J) • • • • • • • • 『RVCT コ ンパ イ ラ ユーザガ イ ド 』 (ARM DUI 0205J) 『RVCT ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 (ARM DUI 0349J) 『RVCT リ ン カユーザガ イ ド 』 (ARM DUI 0206J) 『RVCT リ ン カ リ フ ァ レ ン ス ガ イ ド 』 (ARM DUI 0381J) 『RVCT ユーテ ィ リ テ ィ ガ イ ド 』 (ARM DUI 0382J) 『RVCT アセ ンブ ラ ガ イ ド 』 (ARM DUI 0204J) 『RVCT デベ ロ ッ パガ イ ド 』 (ARM DUI 0203J) 準拠す る 基本標準、 ソ フ ト ウ ェ ア イ ン タ フ ェース、 お よ び ARM でサポー ト さ れてい る 標準に関す る 詳細については、 install_directory\Documentation\Specifications\... を参照 し て下 さ い。 viii Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 序章 特定の ARM 製品に関す る 情報については、 以下のマニ ュ アルを参照 し て下 さ い。 • 『ARM アーキ テ ク チ ャ リ フ ァ レ ン ス マニ ュ アル』 (ARMv7-A お よ び ARMv7-R エデ ィ シ ョ ン) (ARM DDI 0406J) • 『ARM7-M アーキ テ ク チ ャ リ フ ァ レ ン ス マニ ュ アル』 (ARM DDI 0403J) • 『ARM6-M アーキ テ ク チ ャ リ フ ァ レ ン ス マニ ュ アル』 (ARM DDI 0419J) • お使いのハー ド ウ ェ アデバ イ ス の ARM デー タ シー ト ま たはテ ク ニ カル リ フ ァ レ ン ス マニ ュ アル 他の出版物 以下の出版物は、 ETSI 基本操作について説明し ています。 出版物はすべて http://www.itu.int にあ る 国際電気通信連合 (ITU) の通信局か ら 入手で き ます。 • ETSI G.191 勧告 : Software tools for speech and audio coding standardization • ITU-T Software Tool Library 2005 User's manual。 ETSI G.191 勧告の一部 と し て含まれてい ます。 • ETSI G723.1 勧告 : Dual rate speech coder for multimedia communications transmitting at 5.3 and 6.3 kbit/s • ETSI G.729 勧告 : Coding of speech at 8 kbit/s using conjugate-structure algebraic-code-excited linear prediction (CS-ACELP) TI の コ ンパ イ ラ 組み込み機能に関す る 出版物は、 Texas Instruments 社の Web サ イ ト http://www.ti.com か ら 入手で き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ix 序章 フ ィ ードバッ ク ARM Limited では RealView Compilation Tools お よ び本書に関す る フ ィ ー ド バ ッ ク をお待ち し てお り ます。 RealView Compilation Tools に関する フ ィ ー ド バ ッ ク RVCT に関 し て問題があ る 場合は、 購入元にお問い合わせ下 さ い。 こ の と き 、 迅速かつ適切な対応を さ せて頂 く ために、 以下の情報を ご用意下 さ い。 • お名前 と 会社名 • 製品のシ リ アル番号 • 製品の リ リ ース情報 • プ ラ ッ ト フ ォ ームの詳細 (ハー ド ウ ェ アプ ラ ッ ト フ ォ ーム、 オペレー テ ィ ン グ シ ス テ ムの種類 と バージ ョ ン な ど) • 問題を再現す る サ イ ズの小 さ な独立 し たサン プル コ ー ド • 操作の目的 と 実際の動作に関す る 詳 し い説明 • 使用 し た コ マ ン ド ( コ マ ン ド ラ イ ン オプシ ョ ン を含む) • 問題を例示す る サ ンプル出力 • ツールのバージ ョ ン情報 (バージ ョ ン番号、 ビル ド 番号を含む) 本書に関する フ ィ ー ド バ ッ ク 本書に関す る ご意見につ き ま し ては、 以下の内容を記載 し た電子 メ ールを [email protected] ま でお送 り 下 さ い。 • • • • マニ ュ アル名 文書番号 問題のあ る ページ番号 問題点の簡潔な説明 補足すべ き 点や改善すべ き 点についてのご提案 も お待ち し てお り ます。 x Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 第1章 は じ めに 本章では、 RealView Compilation Tools (RVCT) 付属の ARM コ ンパ イ ラ につ いて概説 し ます。 こ こ では、 準拠すべ き 標準について説明 し 、 さ ら に RVCT 付属の ラ ン タ イ ム ラ イ ブ ラ リ の概要について も 説明 し ます。 以下のセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「ARM コ ンパ イ ラ について」 (ページ 1-2) • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「 ソ ース言語モー ド 」 (ページ 1-3) 「言語の拡張 と 言語への準拠」 (ページ 1-6) 「C ラ イ ブ ラ リ と C++ ラ イ ブ ラ リ 」 (ページ 1-9) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 1-1 は じ めに 1.1 ARM コ ンパイ ラ について ARM コ ンパ イ ラ armcc を使用す る こ と に よ り C コ ー ド と C++ コ ー ド を コ ンパ イ ルで き ます。 コ ンパ イ ラ : • 最適化を行い ます。 コ マ ン ド ラ イ ン オプシ ョ ン を使用す る と 、 最適化の レベルを制御で き ます。 • コ ンパ イ ル : — ISO 標準 C:1990 ソ ース — ISO 標準 C:1999 ソ ース — ISO 標準 C++:2003 ソ ース のいずれか を以下の コ ー ド に コ ンパ イ ルで き ます。 — 32 ビ ッ ト の ARM コ ー ド • — 16 ビ ッ ト ま たは 32 ビ ッ ト の Thumb-2 コ ー ド — 16 ビ ッ ト の Thumb コ ー ド Application Binary Interface for the ARM Architecture (BSABI) に準拠 し ま す。 こ れに関連す る コ ンパ イ ラ の処理は次の と お り です。 — 出力オブジ ェ ク ト を ELF 形式で生成 し ます。 — DWARF Debugging Standard Version 3 (DWARF 3) 準拠のデバ ッ グ 情報を生成 し ます。 DWARF 2 デバ ッ グ テーブル も サポー ト さ れま す。 詳細については、 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の 「ARM アーキ テ ク チ ャ 用 ABI への準拠」 (ページ 1-3) を参照 し て下 さ い。 • 出力 コ ー ド のアセ ンブ リ 言語に よ る リ ス ト を生成 し 、 アセ ン ブ リ 言語の リ ス ト を ソ ース コ ー ド と イ ン タ リ ーブで き ます。 以前の リ リ ース の RVCT か ら ア ッ プグ レー ド す る 場合、 ま たは RVCT を初め て使用す る 場合は、 『RealView Compilation Tools エ ッ セ ン シ ャ ルガ イ ド 』 を読 んで、 最新情報を確認 し て下 さ い。 1-2 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 は じ めに 1.2 ソ ース言語モー ド ARM コ ンパ イ ラ には、 以下の 3 つの ソ ース言語モー ド があ り ます。 こ れ ら の モー ド を使用 し て、 さ ま ざ ま な タ イ プの C お よ び C++ の ソ ース コ ー ド を コ ン パ イ ルで き ます。 以下に設定方法を示 し ます。 1.2.1 • ISO C90 • ISO C99 • ISO C++ ISO C90 ARM コ ンパ イ ラ は、1990 C 標準お よ び追補表の定義に従っ て C を コ ンパ イ ル し ます。 • ISO/IEC 9899:1990。 C の 1990 年度国際標準。 • ISO/IEC 9899 AM1 : 1995 年の標準追補 1 で、wchar.h か ら wtype.h ま での 国際文字のサポー ト が追加 さ れ ま し た。 ARM コ ンパ イ ラ は、 以下の よ う な ISO C90 の拡張機能 も サポー ト し てい ま す。 詳細については、 「言語の拡張 と 言語への準拠」 (ページ 1-6) を参照 し て 下 さ い。 本書で使用す る 用語について説明 し ます。 C90 ISO C90 コ ンパ イ ラ で、 ARM 拡張機能 と 組み合わせて使用 し ま す。 C90 コ ー ド を コ ンパ イ ルす る 場合は、 --c90 オプシ ョ ン を使用 し て 下 さ い。 こ れがデフ ォ ル ト です。 厳密な C90 1990 C 標準お よ び追補表の定義に従っ た C です。 関連項目 「--c90」 (ページ 2-25) • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「言語の拡張 と 言語への準拠」 (ページ 1-6) 付録 B 標準 C の実装定義 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 1-3 は じ めに 1.2.2 ISO C99 ARM コ ンパ イ ラ は、1999 C 標準お よ び追補表の定義に従っ て C を コ ンパ イ ル し ます。 • ISO/IEC 9899:1999。 C の 1999 年度国際標準。 ARM コ ンパ イ ラ は、 ISO C99 の拡張機能 も サポー ト し ます。 詳細については、 「言語の拡張 と 言語への準拠」 (ページ 1-6) を参照 し て下 さ い。 本書で使用す る 用語について説明 し ます。 ISO C99 コ ンパ イ ラ で、 ARM お よ び GNU 拡張機能 と 組み合わせ て使用 し ます。 C99 C99 コ ー ド を コ ンパ イ ルす る 場合は、--c99 オプシ ョ ン を使用 し て 下 さ い。 厳密な C99 1999 C 標準お よ び追補表の定義に従っ た C です。 標準 C C90 ま たは C99 を適宜意味 し ます。 C C90、 厳密な C90、 C99、 お よ び標準 C の総称です。 関連項目 • 「--c99」 (ページ 2-26) • • 1.2.3 「言語の拡張 と 言語への準拠」 (ページ 1-6) 付録 B 標準 C の実装定義 ISO C++ ARM コ ンパ イ ラ は、 2003 標準の定義に従っ て C++ を コ ンパ イ ル し ます ( ワ イ ド ス ト リ ーム と エキ ス ポー ト テ ン プ レー ト を除 く )。 • ISO/IEC 14822:2003。 C++ の 2003 年度国際標準。 ARM コ ンパ イ ラ は、 ISO C++ の拡張機能の一部 も サポー ト し てい ます。 詳細 については、 「言語の拡張 と 言語への準拠」 (ページ 1-6) を参照 し て下 さ い。 本書で使用す る 用語について説明 し ます。 1-4 厳密な C++ ワ イ ド ス ト リ ーム と エキ ス ポー ト テ ン プ レー ト を除いた ISO C++ です。 標準 C++ 厳密な C++ です。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 は じ めに C++ ワ イ ド ス ト リ ーム と エキ ス ポー ト テ ン プ レー ト 機能を除い た ISO C++ です。 ARM 拡張機能 と の組み合わせは任意で す。 C++ コ ー ド を コ ンパ イ ルす る 場合は、--cpp オプシ ョ ン を使 用 し て下 さ い。 関連項目 • 「--cpp」 (ページ 2-34) • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「言語の拡張 と 言語への準拠」 (ページ 1-6) 付録 C 標準 C++ の実装定義 . Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 1-5 は じ めに 1.3 言語の拡張 と 言語への準拠 コ ンパ イ ラ は、 さ ま ざ ま な ソ ース言語に対す る 多 く の言語拡張をサポー ト し てい ます。 ま た、 使用可能な ソ ース言語へ準拠す る ための コ マ ン ド ラ イ ン オ プシ ョ ン も 用意 さ れてい ます。 1.3.1 言語拡張機能 コ ンパ イ ラ がサポー ト す る 言語拡張機能は以下の よ う に分類で き ます。 C99 の機能 コ ンパ イ ラ は C99 の言語機能の一部を使用で き る よ う に し ます。 • 厳密な C90 の拡張の例 と し ては、 // 形式の コ メ ン ト があ り ます。 • 標準 C++ お よ び厳密な C90 両方の拡張の例 と し て は、 restrict ポ イ ン タ があ り ます。 詳細については、 以下のサブセ ク シ ョ ン を参照 し て下 さ い。 • 「C90 で使用可能な C99 言語機能」 (ページ 3-5) • 「C++ お よ び C90 で使用可能な C99 言語機能」 (ペー ジ 3-7) 標準 C の拡張 コ ンパ イ ラ は厳密な C99 の拡張を サポー ト し ます。 例え ば、 旧式の非プ ロ ト タ イ プ定義を無効にす る 関数プ ロ ト タ イ プです。 詳細については、 「標準の C 言語の拡張機能」 (ページ 3-10) を参照 し て下 さ い。 標準 C の こ れ ら の拡張は C90 で も 使用で き ます。 標準 C++ の拡張 コ ンパ イ ラ は、 ク ラ ス メ ンバの宣言で使用す る 修飾名の よ う な、 厳密な C++ の拡張を数多 く サポー ト し てい ます。 詳 細については、 「標準の C++ 言語の拡張機能」 (ページ 3-16) を参照 し て下 さ い。 こ れ ら の拡張は標準 C と C90 では使用で き ません。 標準 C と 標準 C++ の拡張 コ ンパ イ ラ は、 匿名の ク ラ ス、 構造体、 お よ び共用体の よ う な、 厳密な C++ お よ び厳密な C90 に特有な拡張機能の 一部をサポー ト し てい ます。 詳細については、 「標準 C お よ び標準 C++ 言語の拡張機能」 (ページ 3-20) を参照 し て下 さ い。 1-6 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 は じ めに GNU 拡張機能 コ ンパ イ ラ は、 GNU 形式の拡張左辺値 や GNU 組み込み 関数の よ う な GNU コ ンパ イ ラ の拡張機能の一部をサポー ト し てい ます。 詳細については、 以下のサブセ ク シ ョ ン を 参照 し て下 さ い。 「言語標準の準拠」 • • 「GNU 言語拡張機能」 (ページ 3-26) • 第 4 章 コ ンパ イ ラ 固有の機能 ARM 特有の機能拡張 コ ンパ イ ラ は、 命令の組み込み関数やその他の組み込み関 数の よ う な、 ARM コ ンパ イ ラ 特有の拡張機能を数多 く サ ポー ト し てい ます。 詳細については、 第 4 章 コ ンパ イ ラ 固 有の機能 を参照 し て下 さ い。 1.3.2 言語標準の準拠 コ ンパ イ ラ には、 ソ ース言語への準拠の程度に よ っ て複数のモー ド があ り ま す。 厳密モー ド 厳密モー ド では、 ソ ース言語に対応す る 言語標準への準拠が強 く 要求 さ れます。 例えば、 // 形式の コ メ ン ト を厳密モー ド の C90 で コ ンパ イ ルす る と エ ラ ーにな り ます。 厳密モー ド で コ ンパ イ ルす る には、 コ マ ン ド ラ イ ン オプシ ョ ン --strict を使用 し て下 さ い。 GNU モー ド GNU モー ド では、 ソ ース言語の GNU コ ンパ イ ラ 拡張機能がす べて使用可能にな り ます。 GNU モー ド の例を以下に示 し ます。 • ソ ース言語が C90、 C99 のいずれかの場合は、 switch ス テー ト メ ン ト の case で範囲指定がで き ます。 • ソ ース言語が C90 ま たは C++ の場合は、 C99 形式の指定済 みの イ ニシ ャ ラ イ ザを使用で き ます。 GNU モー ド で コ ンパ イ ルす る 場合は、 コ ンパ イ ラ の --gnu オプ シ ョ ン を使用 し て下 さ い。 注 非厳密モー ド で使用可能な GNU 拡張機能は他に も あ り ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 1-7 は じ めに 例 以下の例では、 ソ ース言語モー ド と 言語準拠モー ド の組み合わせを示 し ます。 • 拡張子が .cpp の フ ァ イ ルを コ マ ン ド ラ イ ン オプシ ョ ン --strict を使用 し て コ ンパ イ ルす る と 、 標準 C++ の コ ンパ イ ルにな り ます。 • C の ソ ース フ ァ イ ルを コ マ ン ド ラ イ ン オプシ ョ ン --gnu で コ ンパ イ ルす る と 、 GNU モー ド の C90 コ ンパ イ ルにな り ます。 • 拡張子が .c の フ ァ イ ルを コ マ ン ド ラ イ ン オプシ ョ ン --strict と --gnu を 両方指定 し て コ ンパ イ ルす る と エ ラ ーにな り ます。 関連項目 • 「--gnu」 (ページ 2-75) • • • 1-8 「--strict, --no_strict」 (ページ 2-133) 「GNU 言語拡張機能」 (ページ 3-26) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「フ ァ イ ル命名規則」 (ページ 2-14) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 は じ めに 1.4 C ラ イ ブ ラ リ と C++ ラ イ ブ ラ リ RVCT では、 実行時に以下の C ラ イ ブ ラ リ お よ び C++ ラ イ ブ ラ リ を使用で き ます。 ARM C ラ イ ブ ラ リ ARM C ラ イ ブ ラ リ には、 標準 C 関数 と 、 C ラ イ ブ ラ リ お よ び C++ ラ イ ブ ラ リ で使用 さ れ る ヘルパ関数が含まれてい ます。 ま た、 こ の C ラ イ ブ ラ リ は、 標準 C ラ イ ブ ラ リ 関数を セ ミ ホ ス ト 環境で実装す る と き に使用 さ れ る 、 printf の よ う な タ ーゲ ッ ト 依 存関数 も 提供 し ます。 こ れ ら の C ラ イ ブ ラ リ は、 ユーザ コ ー ド 内 の タ ーゲ ッ ト 依存関数を再定義 し 、 セ ミ ホ ス ト の依存性を除去 で き る よ う に構成 さ れてい ます。 ARM ラ イ ブ ラ リ は、 以下に準拠 し てい ます。 • C Library ABI for the ARM Architecture (CLIBABI) • C++ ABI for the ARM Architecture (CPPABI) 詳細については、 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の 「ARM アーキ テ ク チ ャ 用 ABI への準拠」 (ページ 1-3) を参照 し て 下 さ い。 Rogue Wave 標準 C++ ラ イ ブ ラ リ v.2.02.03 Rogue Wave Software, Inc. か ら 提供 さ れてい る Rogue Wave 標準 C++ ラ イ ブ ラ リ には、 標準 C++ 関数 と 、 cout な ど のオブジ ェ ク ト が含まれてい ます。 ま た、 デー タ 構造 と 標準テ ンプ レー ト ラ イ ブ ラ リ (STL) と 呼ばれ る アルゴ リ ズ ム も 含ま れてい ます。 C++ ラ イ ブ ラ リ は C ラ イ ブ ラ リ を使用 し て、 タ ーゲ ッ ト に特化 し た サポー ト を提供 し ます。 Rogue Wave 標準 C++ ラ イ ブ ラ リ は、C++ 例外が有効にな っ た状態で提供 さ れ ます。 Rogue Wave ラ イ ブ ラ リ の詳細については、 Rogue Wave の HTML 形式のマニ ュ アル と Rogue Wave の Web サ イ ト を参照 し て下 さ い。 http://www.roguewave.com サポー ト ラ イ ブ ラ リ ARM C ラ イ ブ ラ リ には、 C++ のサポー ト を可能に し 、 異な る アーキ テ ク チ ャ やプ ロ セ ッ サ向けの コ ー ド を コ ンパ イ ルす る た めの追加 コ ン ポーネ ン ト が含まれてい ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 1-9 は じ めに C ラ イ ブ ラ リ と C++ ラ イ ブ ラ リ は、 バ イ ナ リ のみで提供 さ れてい ます。 1990 ISO 標準 C ラ イ ブ ラ リ には、 イ ン タ ー ワー ク が選択 さ れてい る か、 ま たは浮 動小数点サポー ト が選択 さ れてい る かに よ っ て、 タ ーゲ ッ ト シ ス テ ム のバ イ ト 順序な ど、 主要な ビル ド オプシ ョ ンの組み合わせに応 じ たバ リ ア ン ト があ り ます。 詳細については、 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の第 2 章 C の ラ イ ブ ラ リ と C++ の ラ イ ブ ラ リ を参照 し て下 さ い。 1-10 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 第2章 コ ンパイ ラの コ マ ン ド ラ イ ン オプ シ ョ ン 本章では、 ARM コ ンパ イ ラ armcc に使用で き る コ マ ン ド ラ イ ン オプシ ョ ン に ついて説明 し ます。 以下のセ ク シ ョ ン か ら 構成 さ れてい ます。 • ARM DUI 0348BJ ID 1 0 0 4 1 9 「コ マ ン ド ラ イ ンオプシ ョ ン」 (ページ 2-2) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-1 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1 コ マ ン ド ラ イ ン オプ シ ョ ン こ のセ ク シ ョ ン では、 コ ンパ イ ラ でサポー ト さ れてい る コ マ ン ド ラ イ ン オプ シ ョ ン を アルフ ァ ベ ッ ト 順に リ ス ト し ます。 2.1.1 -Aopt こ のオプシ ョ ンは、 アセ ンブ ラ が コ ンパ イ ラ に よ っ て呼び出 さ れ、 .s 入力 フ ァ イ ル ま たは組み込みアセ ン ブ リ 言語で記述 さ れた関数を アセ ン ブルす る 際に、 アセ ンブ ラ に渡す コ マ ン ド ラ イ ン オプシ ョ ン を指定 し ます。 構文 -Aopt 各パ ラ メ ー タ には以下の意味があ り ます。 アセ ン ブ ラ に渡 さ れ る コ マ ン ド ラ イ ン オプシ ョ ン です。 opt 注 コ ンパ イ ラ に よ っ て アセ ン ブ ラ が呼び出 さ れ る と 、 自動的にア セ ン ブ ラ に渡 さ れ る コ ンパ イ ラ コ マ ン ド ラ イ ン オプシ ョ ン も あ り ます。 例えば、 オプシ ョ ン --cpu が コ ンパ イ ラ コ マ ン ド ラ イ ン オプシ ョ ン で指定 さ れてい る 場合、 こ のオプシ ョ ンは、 アセ ン ブ ラ が呼び出 さ れ、 .s フ ァ イ ルま たは組み込みアセ ンブ ラ がアセ ンブル さ れ る と 、 必ずアセ ンブ ラ に渡 さ れます。 コ ンパ イ ラ に よ っ て アセ ン ブ ラ に渡 さ れた コ ンパ イ ラ コ マ ン ド ラ イ ン オプシ ョ ン を参照す る には、 コ ンパ イ ラ コ マ ン ド ラ イ ン オプシ ョ ン -A--show_cmdline を使用 し ます。 例 armcc -A--predefine="NEWVERSION SETL {TRUE}" main.c 制約条件 サポー ト さ れていないオプシ ョ ンが -A を使用 し て渡 さ れ る と 、 エ ラ ーが生成 さ れ ます。 2-2 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--cpu=name」 (ページ 2-35) • • 2.1.2 「-Lopt」 (ページ 2-88) 「--show_cmdline」 (ページ 2-128) --allow_null_this, --no_allow_this こ のオプシ ョ ンは、 NULL オブジ ェ ク ト ポ イ ン タ での メ ンバ関数の呼び出 し を有効ま たは無効に し ます。 デ フ ォル ト デフ ォ ル ト は --no_allow_null_this です。 2.1.3 --alternative_tokens, --no_alternative_tokens こ れ ら のオプシ ョ ン を使用す る と 、 代替 ト ー ク ン を認識す る か ど う か を C お よ び C++ で指定で き ます。 使用法 C お よ び C++ では、 こ のオプシ ョ ン を使用 し て、 連字の認識を制御 し ます。 C++ では、 こ のオプシ ョ ン を使用 し て、 and や bitand な ど の演算子キー ワ ー ド の認識を制御 し ます。 デ フ ォル ト デフ ォ ル ト は --alternative_tokens です。 2.1.4 --anachronisms, --no_anachronisms こ のオプシ ョ ン を使用す る と 、 C++ でアナ ク ロ ニ ズ ム を有効ま たは無効にで き ます。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デ フ ォル ト デフ ォ ル ト は --no_anachronisms です。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-3 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 例 typedef enum { red, white, blue } tricolor; inline tricolor operator++(tricolor c, int) { int i = static_cast<int>(c) + 1; return static_cast<tricolor>(i); } void foo(void) { tricolor c = red; c++; // okay ++c; // anachronism } オプシ ョ ン --anachronisms を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 警告 メ ッ セージが表示 さ れます。 オプシ ョ ン --anachronisms を使用せずに こ の コ ー ド を コ ンパ イ ルす る と 、 エ ラ ー メ ッ セージが表示 さ れ ます。 関連項目 • 「--cpp」 (ページ 2-34) • • • 2.1.5 「--strict, --no_strict」 (ページ 2-133) 「--strict_warnings」 (ページ 2-134) 「アナ ク ロ ニズ ム」 (ページ 5-16) --apcs=qualifer...qualifier こ のオプシ ョ ン を使用す る と 、 コ ー ド の生成時に イ ン タ ーワ ー ク お よ び位置 非依存を制御で き ます。 --apcs コ マ ン ド ラ イ ン オプシ ョ ンに修飾子を指定す る こ と に よ り 、 コ ンパ イ ラ に よ っ て使用 さ れ る ARM アーキ テ ク チ ャ 向けプ ロ シージ ャ コ ール標準 (AAPCS) のバ リ ア ン ト を定義で き ます。 構文 --apcs=qualifer...qualifier qualifier...qualifier に よ っ て修飾子の リ ス ト が表 さ れ る 場合、 以下の規則が 適用 さ れ ます。 • 少な く と も 1 つの修飾子を指定す る 必要があ り ます。 • 2-4 リ ス ト の修飾子間には スペース を挿入 し ないで下 さ い。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン qualifier の各 イ ン ス タ ン ス は以下のいずれかであ る 必要があ り ます。 /interwork、 /nointerwork こ のオプシ ョ ン を使用す る と 、 ARM ま たは Thumb™ の イ ン タ ー ワ ー ク がサポー ト さ れた コ ー ド か、 サポー ト さ れな い コ ー ド が生成 さ れます。 デフ ォ ル ト は /nointerwork です。 ただ し 、 ARMv6 以降は例外で、 こ の場合のデフ ォ ル ト は /interwork です。 /ropi、 /noropi こ のオプシ ョ ン を使用す る と 、 読み出 し 専用の位置非依存 (ROPI) コ ー ド を生成す る か ど う か を指定で き ます。 デ フ ォ ル ト は /noropi です。 /[no]pic は /[no]ropi の別名です。 /rwpi、 /norwpi こ のオプシ ョ ン を使用す る と 、 読み出 し / 書き 込みの位置 非依存 (RWPI) コ ー ド を生成す る か ど う か を指定で き ま す。 デフ ォ ル ト は /norwpi です。 /[no]pid は /[no]rwpi の別名です。 /fpic、 /nofpic こ のオプシ ョ ン を使用す る と 、 相対ア ド レ ス参照がプ ロ グ ラ ム を ロ ー ド し た場所に依存 し ない、 読み出 し 専用の位置 非依存 コ ー ド を生成す る か ど う か を指定で き ます。 注 ま た、 複数の修飾子を指定す る こ と も で き ます。 例えば、 --apcs=/nointerwork/noropi/norwpi は、 --apcs=/nointerwork --apcs=noropi/norwpi と 同 じ 意味です。 デ フ ォル ト --apcs オプシ ョ ン を指定 し なか っ た場合、 コ ンパ イ ラ は --apcs=/nointerwork/noropi/norwpi/nofpic が指定 さ れた と き と 同 じ 処理を実行 し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-5 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 使用法 /interwork, /nointerwork デフ ォ ル ト では、 以下の よ う に コ ー ド が生成 さ れます。 /ropi, /noropi • イ ン タ ー ワー ク がサポー ト さ れない コ ー ド がサポー ト さ れ ます。 ARMv5T 以降のアーキ テ ク チ ャ に対応 す る --cpu が指定 さ れていない限 り は、 /nointerwork がデフ ォ ル ト にな り ます。 • イ ン タ ー ワー ク がサポー ト さ れた ARMv5T 以降の ARM アーキ テ ク チ ャ では、 イ ン タ ー ワー ク が自動的 に発生 し ます。 ROPI コ ー ド を生成す る ために /ropi 修飾子を選択す る と 、 コ ンパ イ ラ は以下の処理を行い ます。 • 読み出 し 専用 コ ー ド お よ びデー タ のア ド レ ス を、 PC 相対で生成 し ます。 • 読み出 し 専用の出力セ ク シ ョ ン に位置非依存 (PI) 属性を設定 し ます。 注 C++ を コ ンパ イ ルす る と き は、--apcs=/ropi はサポー ト さ れ ません。 /rwpi, /norwpi RWPI コ ー ド を生成す る ために /rwpi 修飾子を選択す る と 、 コ ンパ イ ラ は以下の処理を行い ます。 • ス タ テ ィ ッ ク ベース レ ジ ス タ sb か ら のオ フ セ ッ ト を 使用 し て、 書 き 込み可能デー タ を ア ド レ ス指定 し ま す。 つま り 、 以下の こ と を意味 し ます。 — — — • 2-6 実行時に RW デー タ 領域のベース ア ド レ ス を修 正で き ます。 デー タ の複数の イ ン ス タ ン ス を生成で き ます。 デー タ を位置非依存デー タ にす る こ と がで き ま す (ただ し 、 デー タ を位置非依存デー タ にす る 必要はあ り ません)。 読み出 し / 書 き 込み出力セ ク シ ョ ンに PI 属性を設定 し ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 注 デフ ォ ル ト は --lower_rwpi オプシ ョ ン であ る ため、 RWPI でない コ ー ド は、 等価な RWPI の コ ー ド に自動的に変換 さ れ ます。 こ の ス タ テ ィ ッ ク な初期化は、 実行時に C++ の コ ン ス ト ラ ク タ メ カ ニズ ムに よ っ て行われ ます ( こ の メ カ ニ ズ ムは C に も 使用 さ れます)。 /fpic, /nofpic こ のオプシ ョ ン を選択す る と 、 コ ンパ イ ラ は以下の処理を 行い ます。 • PC 相対ア ド レ シ ン グ を使用 し てすべての静的デー タ にア ク セ ス し ます。 • リ ン カに よ っ て作成 さ れ る グ ロ ーバルオ フ セ ッ ト テーブル (GOT) エ ン ト リ を使用 し て、 イ ン ポー ト ま たはエ ク ス ポー ト さ れたすべての読み出 し - 書 き 込 みデー タ にア ク セ ス し ます。 • すべての読み出 し 専用デー タ へのア ク セ ス を PC 相対 で行い ます。 コ ー ド で共有オブジ ェ ク ト を使用 し てい る 場合、 /fpic を 指定 し て コ ンパ イ ルす る 必要があ り ます。 コ ー ド で System V の共有 ラ イ ブ ラ リ を使用 し てい る 場合にのみ、 相対ア ド レ ス が実装 さ れ ます。 静的 イ メ ージ ま たは静的 ラ イ ブ ラ リ を ビル ド す る 場合、 /fpic を指定 し て コ ンパ イ ルす る 必要はあ り ません。 C++ を コ ンパ イ ルす る と き に、 /fpic を使用で き ます。 こ の 場合、 仮想関数テーブル と typeinfo は、 PC 相対でア ク セ ス で き る よ う に読み出 し - 書 き 込み領域に配置 さ れます。 注 System V ま たは ARM Linux 共有 ラ イ ブ ラ リ を ビル ド す る 場合は、--apcs /fpic と --no_hide_all を一緒に使用 し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-7 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 制約条件 /ropi、 /rwpi、 /fpic のいずれか を指定 し て コ ー ド を コ ンパ イ ルす る 場合、 い く つかの制限が適用 さ れます。 /ropi /ropi を使用 し て コ ンパ イ ルす る 場合の主な制限を以下に示 し ま す。 • C++ を コ ンパ イ ルす る と き 、--apcs=/ropi は使用で き ません。 • 正規の C の一部の構造を --apcs=/ropi で コ ンパ イ ルす る と 、 正 し く 機能 し ません。 以下に例を示 し ます。 extern const int ci; // ro const int *p2 = &ci; // this static initialization // does not work with --apcs=/ropi 上記の よ う な静的初期化を実行す る には、--lower_ropi オプ シ ョ ン を使用 し て コ ー ド を コ ンパ イ ル し ます。 以下に例を 示 し ます。 armcc --apcs=/ropi --lower_ropi /rwpi /rwpi を使用 し て コ ンパ イ ルす る 場合の主な制限を以下に示 し ま す。 正規の C の一部の構造を --apcs=/rwpi で コ ンパ イ ルす る と 、 正 し く 機能 し ません。 以下に例を示 し ます。 • int i; int *p1 = &i; // // // // rw this static initialization does not work with --apcs=/rwpi --no_lower_rwpi 上記の よ う な静的初期化を実行す る には、--lower_rwpi オプ シ ョ ン を使用 し て コ ー ド を コ ンパ イ ル し ます。 以下に例を 示 し ます。 armcc --apcs=/rwpi 注 --lower_rwpi はデフ ォ ル ト であ る ため、 指定す る 必要はあ り ません。 /fpic を使用 し て コ ンパ イ ルす る 場合の主な制限を以下に示 し ま /fpic す。 • --apcs=/fpic を使用 し た場合、 コ ンパ イ ラ は __declspec(dllexport) と し てマー ク さ れた関数 と デー タ のみ を エ ク ス ポー ト し ます。 2-8 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • --apcs=/fpic と --no_hide_all を同 じ コ マ ン ド ラ イ ン で使用 し た場合、 コ ンパ イ ラ は、 __declspec(dll*) を使用 し ないすべ ての extern 変数 と 関数に対 し て、 デフ ォ ル ト の ELF 動的可 視性を使用 し ます。 デフ ォ ル ト の ELF 可視性では関数の自 動 イ ン ラ イ ンは無効にな り ます。 • GNU モー ド で --apcs=/fpic を使用す る 場合は、--no_hide_all も 使用す る 必要があ り ます。 関連項目 • 「--hide_all, --no_hide_all」 (ページ 2-78) • 「--lower_ropi, --no_lower_ropi」 (ページ 2-97) • 「--lower_rwpi, --no_lower_rwpi」 (ページ 2-97) • 「__declspec(dllexport)」 (ページ 4-27) • 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の 「再入可能お よ びス レ ッ ド セーフ コー ド の記述」 (ページ 2-5) • 『 リ ン カユーザガ イ ド 』 の 「ベニア」 (ページ 3-22) • 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の第 4 章 BPABI お よ び SysV の共有 ラ イ ブ ラ リ と 実行可能フ ァ イ ル • install_directory\Documentation\Specifications\... にあ る 『Procedure Call Standard for the ARM architecture』 2.1.6 --arm こ のオプシ ョ ン を使用す る と 、 ARM 命令セ ッ ト を タ ーゲ ッ ト にす る よ う に コ ンパ イ ラ に要求で き ます。 コ ンパ イ ラ は、 ARM コ ー ド と Thumb コ ー ド の両方 を生成で き る よ う にな り ますが、 ARM コ ー ド が優先 さ れ る も の と 認識 し ま す。 注 こ のオプシ ョ ンは、 Cortex-M3 な ど の Thumb のみのプ ロ セ ッ サには影響を及 ぼ し ません。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン デフ ォル ト こ れは、 ARM 命令セ ッ ト を サポー ト す る タ ーゲ ッ ト のデフ ォ ル ト オプシ ョ ン です。 関連項目 2.1.7 • 「--arm_only」 (ページ 2-17) • 「--cpu=list」 (ページ 2-34) • 「--cpu=name」 (ページ 2-35) • 「--thumb」 (ページ 2-135) • 「#pragma arm」 (ページ 4-63) • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「 タ ーゲ ッ ト プ ロ セ ッ サ ま たはアーキ テ ク チ ャ の指定」 (ページ 2-26) --arm_linux こ のオプシ ョ ン を使用す る と 、 ARM Linux コ ンパ イ ルに適 し たデフ ォ ル ト 値 でその他のオプシ ョ ン セ ッ ト を設定で き ます。 使用法 こ れ ら のデフ ォ ル ト は、 以下のいずれかの ARM Linux オプシ ョ ン を使用す る と 自動的に イ ネーブルにな り ます。 • --arm_linux_paths • 完全 GCC エ ミ ュ レーシ ョ ン モー ド の --translate_gcc • 完全 GCC エ ミ ュ レーシ ョ ン モー ド の --translate_g++ • 完全 GCC エ ミ ュ レーシ ョ ン モー ド の --translate_gld こ のオプシ ョ ンは、 通常、 従来の コ ー ド の移行を支援す る ために使用 さ れ ま す。 こ のオプシ ョ ン を使用す る こ と に よ り 、 既存の メ ー ク フ ァ イ ルで使用 さ れ る コ ンパ イ ラ オプシ ョ ン を簡略化す る と 同時に、 ヘ ッ ダ フ ァ イ ル と ラ イ ブ ラ リ の検索に使用す る パ ス を完全かつ明示的に制御で き ます。 RVCT v4.0 よ り 前の ビル ド か ら 移行す る 場合は、 コ ンパ イ ラ に用意 さ れた こ れ ら のオプシ ョ ン をすべて単一の --arm_linux オプシ ョ ン で置換で き ます。 2-10 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン デ フ ォル ト デフ ォ ル ト で、 以下のオプシ ョ ン セ ッ ト が設定 さ れます。 --apcs=/interwork • • --enum_is_int • --gnu • --library_interface=aeabi_glibc • --no_hide_all • --preinclude=linux_rvct.h • --wchar32 例 デフ ォ ル ト のオプシ ョ ン セ ッ ト を適用す る には、--arm_linux を使用 し ます。 デフ ォ ル ト オプシ ョ ン を オーバー ラ イ ド す る には、 各オプシ ョ ン を別々に指 定 し ます。 例えば、--arm_linux --hide_all の よ う に記述 し ます。 後者の例では、--arm_linux に含まれた --no_hide_all が --hide_all に よ っ てオー バー ラ イ ド さ れ ます。 関連項目 • 「--arm_linux_config_file=path」 (ページ 2-12) • • • • • • • • • • • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--arm_linux_configure」 (ページ 2-13) 「--arm_linux_paths」 (ページ 2-15) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_includes=paths」 (ページ 2-29) 「--configure_extra_libraries=paths」 (ページ 2-30) 「--configure_gcc=path」 (ページ 2-31) 「--configure_gld=path」 (ページ 2-32) 「--configure_sysroot=path」 (ページ 2-33) 「--shared」 (ページ 2-127) 「--translate_g++」 (ページ 2-136) 「--translate_gcc」 (ページ 2-138) 「--translate_gld」 (ページ 2-139) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-11 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • • 2.1.8 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 --arm_linux_config_file=path こ のオプシ ョ ンは、 ARM Linux ビル ド 用に作成 さ れた コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルの場所を指定 し ます。 こ のオプシ ョ ン を使用す る と 、 コ ー ド を コ ンパ イ ルす る と き に、 標準の Linux コ ン フ ィ ギ ュ レーシ ョ ン設定を使用で き る よ う にな り ます。 構文 --arm_linux_config_file=path path は、 コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルのパ ス と フ ァ イ ル名です。 制約条件 こ のオプシ ョ ンは、 コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを生成す る と き だけで な く 、 コ ンパ イ ル と リ ン ク 時に コ ン フ ィ ギ ュ レーシ ョ ン を使用す る と き に も 使用す る 必要があ り ます。 ARM Linux コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを コ マ ン ド ラ イ ン で指定 し て、--translate_gcc、--translate_g++、 ま たは --translate_gld を使用 し た場合は、 こ れ以外の特定のオプシ ョ ン のデフ ォ ル ト 設定が影響を受け ます。 --bss_threshold のデフ ォ ル ト 値はゼ ロ にな り 、--signed_bitfields と --unsigned_bitfields のデフ ォ ル ト は --signed_bitfields にな り 、--enum_is_int と --wchar32 はオ ンにな り ます。 関連項目 「--arm_linux」 (ページ 2-10) • • • • • • • • 2-12 「--arm_linux_configure」 (ページ 2-13) 「--arm_linux_paths」 (ページ 2-15) 「--bss_threshold=num」 (ページ 2-22) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_includes=paths」 (ページ 2-29) 「--configure_extra_libraries=paths」 (ページ 2-30) 「--configure_gcc=path」 (ページ 2-31) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • • • • • • • • • • • • • 2.1.9 「--configure_gld=path」 (ページ 2-32) 「--configure_sysroot=path」 (ページ 2-33) 「--enum_is_int」 (ページ 2-59) 「--shared」 (ページ 2-127) 「--signed_bitfields, --unsigned_bitfields」 (ページ 2-129) 「--translate_g++」 (ページ 2-136) 「--translate_gcc」 (ページ 2-138) 「--translate_gld」 (ページ 2-139) 「--wchar32」 (ページ 2-151) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 --arm_linux_configure こ のオプシ ョ ンは、 GNU C ラ イ ブ ラ リ glibc の イ ン ク ルー ド パ ス、 ラ イ ブ ラ リ パ ス、 お よ び標準 ラ イ ブ ラ リ について記述 し た コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを作成す る こ と に よ っ て、 ARM Linux で使用す る RVCT を設定 し ま す。 作成 さ れた コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルは、 コ ー ド を ビル ド す る と き に使用 さ れます。 使用法 自動 と 手動の コ ン フ ィ ギ ュ レーシ ョ ン方法が適用 さ れ ます。 自動 コ ン フ ィ ギ ュ レーシ ョ ン では、 イ ン ス ト ール さ れた GNU ツールチ ェ ーンが PATH 環境 変数に基づいて自動的に検索 さ れ、 使用す る コ ン フ ィ ギ ュ レーシ ョ ン設定を 決定す る ために問い合わせが行われ ます。 手動 コ ン フ ィ ギ ュ レーシ ョ ン を実 行す る と 、 ヘ ッ ダ フ ァ イ ル と ラ イ ブ ラ リ に独自の場所を指定で き ます。 手動 コ ン フ ィ ギ ュ レーシ ョ ンは、 GNU ツールチ ェーン が完全に イ ン ス ト ール さ れ ていない場合に使用で き ます。 自動 コ ン フ ィ ギ ュ レーシ ョ ン を実行す る には • ARM DUI 0348BJ ID 1 0 0 4 1 9 armcc --arm_linux_configure --arm_linux_config_file=config_file_path --configure_gcc=path --configure_gld=path Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-13 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン config_file_path は、 作成 さ れ る コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルのパ ス と フ ァ イ ル名です。 GNU コ ンパ イ ラ コ レ ク シ ョ ン (GCC) ド ラ イ バの場 所 と GNU リ ン カの場所を オプシ ョ ン で指定 し て、 シ ス テ ム環境変数 PATH に よ っ て指定 さ れた場所を オーバー ラ イ ド す る こ と も で き ます。 手動 コ ン フ ィ ギ ュ レーシ ョ ン を実行す る には • armcc --arm_linux_configure --arm_linux_config_file=path --configure_cpp_headers=path --configure_sysroot=path GNU libstdc++ 標準テ ンプ レー ト ラ イ ブ ラ リ (STL) のヘ ッ ダ フ ァ イ ル へのパ ス、 お よ び ラ イ ブ ラ リ と ヘ ッ ダ フ ァ イ ルが含まれてい る シ ス テ ム ルー ト パ ス が指定 さ れます。 制約条件 自動 コ ン フ ィ ギ ュ レーシ ョ ン を実行す る には、 GNU ツールチ ェ ーンがシ ス テ ム上に存在す る こ と が必要です。 自動 コ ン フ ィ ギ ュ レーシ ョ ン を利用す る 場合は、 シ ス テ ム環境変数 PATH を使 用 し て ARM Linux GCC を検索で き る 必要があ り ます。 適切な GCC がシ ス テ ムパ ス にない場合は、 GCC をパ ス に追加す る か、--configure_gcc (お よ びオプ シ ョ ン で --configure_gld) を使用 し て、 適切な GCC の場所を手動で指定で き ます。 デフ ォル ト 追加のオプシ ョ ン を使用 し て GCC ま たは GNU リ ン カの場所を指定 し ない限 り 、 自動 コ ン フ ィ ギ ュ レーシ ョ ンが適用 さ れます。 つま り 、 追加のオプシ ョ ン を使用 し て場所を指定 し ない限 り 、 シ ス テ ムパ ス環境変数に基づいて ARM Linux GCC の検索が コ ンパ イ ラ に よ っ て試み ら れ ます。 関連項目 • 「--arm_linux」 (ページ 2-10) • • • • • • • 2-14 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_paths」 (ページ 2-15) 「--configure_gcc=path」 (ページ 2-31) 「--configure_gld=path」 (ページ 2-32) 「--configure_sysroot=path」 (ページ 2-33) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_includes=paths」 (ページ 2-29) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • • • • • • • • • 2.1.10 「--configure_extra_libraries=paths」 (ページ 2-30) 「--shared」 (ページ 2-127) 「--translate_g++」 (ページ 2-136) 「--translate_gcc」 (ページ 2-138) 「--translate_gld」 (ページ 2-139) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 --arm_linux_paths こ のオプシ ョ ン を使用す る と 、 ARM Linux の コ ー ド を ビル ド で き ます。 使用法 こ のオプシ ョ ンは、 RVCT を ARM Linux と 共に使用す る よ う に設定 し た後で 使用で き ます。 こ のオプシ ョ ンは コ ンパ イ ラ 専用です。 典型的な GCC 使用モデルがベース と な っ てお り 、 標準のシ ス テ ム オブジ ェ ク ト フ ァ イ ル と ラ イ ブ ラ リ の直接 リ ン ク と 選択は、 コ ンパ イ ラ ド ラ イ バに基づいて行われます。 こ のオプシ ョ ンは、 RVCT v4.0 よ り 前のバージ ョ ン の RVCT か ら の移行を支 援す る 目的で も 使用 さ れ ます。 --arm_linux_configure を使用 し て コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを作成 し た ら 、 標準のオプシ ョ ン と 検索パ ス の リ ス ト を --arm_linux_paths オプシ ョ ン に よ っ て置 き 換え る こ と で、 既存の ビル ド を修正 で き ます。 つま り 、--arm_linux_paths を使用 し て以下を置換で き ます。 • --arm_linux について リ ス ト さ れたすべてのデフ ォ ル ト オプシ ョ ン • • • ヘ ッ ダパ ス ラ イ ブ ラ リ パス 標準 ラ イ ブ ラ リ 制約条件 --arm_linux_config_file=filename を使用 し て、 コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルの場所を指定す る 必要があ り ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-15 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 例 アプ リ ケーシ ョ ン コ ー ド を コ ンパ イ ル し 、 リ ン ク し ます。 armcc --arm_linux_paths --arm_linux_config_file=my_config_file -o hello -O2 -Otime -g hello.c ソ ース フ ァ イ ル source.c を共有 ラ イ ブ ラ リ で使用で き る よ う に コ ンパ イ ル し ます。 armcc --arm_linux_paths --arm_linux_config_file=my_config_file --apcs=/fpic -c source.c コ ンパ イ ラ を使用 し て、 2 つのオブジ ェ ク ト フ ァ イ ル obj1 と obj2 を共有 ラ イ ブ ラ リ my_shared_lib.so に リ ン ク し ます。 armcc --arm_linux_paths --arm_linux_config_file=my_config_file --shared -o my_shared_lib.so obj1.o obj2.o 関連項目 • 「--arm_linux」 (ページ 2-10) • • • • • • • • • • • • • • • • 2-16 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_configure」 (ページ 2-13) 「--configure_gcc=path」 (ページ 2-31) 「--configure_gld=path」 (ページ 2-32) 「--configure_sysroot=path」 (ページ 2-33) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_includes=paths」 (ページ 2-29) 「--configure_extra_libraries=paths」 (ページ 2-30) 「--shared」 (ページ 2-127) 「--translate_g++」 (ページ 2-136) 「--translate_gcc」 (ページ 2-138) 「--translate_gld」 (ページ 2-139) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.11 --arm_only こ のオプシ ョ ン を使用す る と 、 ARM 専用 コ ー ド が適用 さ れ ます。 コ ンパ イ ラ は、 あ たか も Thumb コ ー ド が タ ーゲ ッ ト アーキ テ ク チ ャ に存在 し ないかの よ う に振舞い ます。 --arm_only オプシ ョ ンは、 アセ ン ブ ラ と リ ン カに伝播 さ れ ます。 例 armcc --arm_only myprog.c 注 armcc --arm_only --thumb myprog.c を指定 し て も 、 Thumb コ ー ド が存在 し ない こ と を確認す る ために コ ー ド がチ ェ ッ ク さ れ る わけではあ り ません。 つま り 、 --thumb は --arm_only を オーバー ラ イ ド し ます。 関連項目 • 「--arm」 (ページ 2-9) • 「--thumb」 (ページ 2-135) • 『アセ ンブ ラ ガ イ ド 』 の 「 コ マ ン ド 構文」 (ページ 3-2) にあ る --16 と --32 に関す る 説明 2.1.12 --asm こ のオプシ ョ ンは、 コ ンパ イ ラ に よ っ て生成 さ れたマシ ン コ ー ド の逆アセ ン ブ リ の フ ァ イ ルに リ ス ト を書 き 込む よ う に コ ンパ イ ラ に指示 し ます。 こ のオプシ ョ ン を選択す る と 、 オブジ ェ ク ト コ ー ド が生成 さ れ ます。 -c オプ シ ョ ン が選択 さ れていない場合、 リ ン ク 手順 も 実行 さ れます。 注 オブジ ェ ク ト コ ー ド を生成せずに、 コ ンパ イ ラ に よ っ て生成 さ れたマシ ン コ ー ド の逆アセ ンブ リ を生成す る 場合は、 --asm の代わ り に -S を選択 し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-17 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 使用法 --asm のア ク シ ョ ンお よ び生成 さ れた逆アセ ンブ リ フ ァ イ ルの フルネームは、 使用 さ れ る オプシ ョ ン の組み合わせに よ っ て異な り ます。 表 2-1 --asm オプ シ ョ ン を使用 し た コ ンパイル コ ンパイ ラ オプ シ ョ ン アクシ ョ ン --asm こ のオプシ ョ ン を使用す る と 、 コ ンパ イ ル さ れた ソ ース の 逆アセ ンブ リ の リ ス ト が フ ァ イ ルに書 き 込まれます。 -c オプシ ョ ンが使用 さ れない場合、 リ ン ク 手順 も 実行 さ れ ます。 逆アセ ンブ リ は、 テ キ ス ト フ ァ イ ルに書 き 込まれ、 フ ァ イ ル名には、 フ ァ イ ル拡張子 .s が付け ら れた入力フ ァ イ ル名 がデフ ォ ル ト で使用 さ れます。 --asm -c リ ン ク 手順が実行 さ れない点を除いて、 --asm と 同 じ です。 --asm --interleave ソ ース コ ー ド が逆アセ ンブ リ を使用 し て イ ン タ ー リ ーブ さ れ る 点を除いて、 --asm と 同 じ です。 逆アセ ンブ リ は、 テ キ ス ト フ ァ イ ルに書 き 込まれ、 フ ァ イ ル名には、 フ ァ イ ル拡張子 .txt が付け ら れた入力フ ァ イ ル 名がデフ ォ ル ト で使用 さ れます。 --asm --multifile コ ンパ イ ラ に よ っ て、 メ イ ン フ ァ イ ルに結合 さ れた フ ァ イ ル用に空のオブジ ェ ク ト フ ァ イ ルが生成 さ れ る 点を除いて、 --asm と 同 じ です。 --asm -o filename オブジ ェ ク ト フ ァ イ ルの名前が filename で あ る点 を除い て、 --asm と 同じ です。 逆アセ ンブ リ は、 フ ァ イ ル filename.s に書き 込まれます。 オブジ ェ ク ト フ ァ イ ルの名前に フ ァ イ ル拡張子 .s が付いて いない こ と を確認 し て下 さ い。 オブジ ェ ク ト フ ァ イ ルの フ ァ イ ル拡張子が .s の場合、 逆アセ ンブ リ はオブジ ェ ク ト フ ァ イ ルの上に上書 き さ れます。 こ れに よ っ て、 予期 し ていな か っ た結果が生 じ る 場合があ り ます。 関連項目 「-c」 (ページ 2-24) • • • • 2-18 「--interleave」 (ページ 2-84) 「--multifile, --no_multifile」 (ページ 2-103) 「-o filename」 (ページ 2-106) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 「-S」 (ページ 2-127) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「フ ァ イ ル命名規則」 (ページ 2-14) • • 2.1.13 --autoinline, --no_autoinline こ のオプシ ョ ン を使用す る と 、 関数の自動 イ ン ラ イ ン展開を有効ま たは無効 にで き ます。 必要に応 じ て、 コ ンパ イ ラ が高い最適化レベルで自動的に関数を イ ン ラ イ ン 化 し ます。 -Ospace オプシ ョ ン と -Otime オプシ ョ ンは、 関数サ イ ズ な ど の他の 要素 と 共に、 コ ンパ イ ラ が関数を自動的に イ ン ラ イ ン展開す る 方法に影響を 及ぼ し ます。 他の さ ま ざ ま な要素 と 組み合わせて -Otime を選択す る と 、 関数が イ ン ラ イ ン 展開 さ れ る 可能性が高 く な り ます。 デ フ ォル ト 最適化レベル -O0 と -O1 では、 --no_autoinline がデフ ォ ル ト です。 最適化レベル -O2 と -O3 では、--autoinline がデフ ォ ル ト です。 関連項目 「--forceinline」 (ページ 2-66) • 「--inline, --no_inline」 (ページ 2-83) 「-Onum」 (ページ 2-108) 「-Ospace」 (ページ 2-110) 「-Otime」 (ページ 2-111) • • • • 2.1.14 --bigend こ のオプシ ョ ンは、 ビ ッ グエ ンデ ィ ア ン メ モ リ を使用 し て ARM プ ロ セ ッ サ 用の コ ー ド を生成す る よ う に コ ンパ イ ラ に指示 し ます。 ARM アーキ テ ク チ ャ では、 次の ビ ッ グエ ンデ ィ ア ン モー ド が定義 さ れます。 BE8 バ イ ト イ ンバ リ ア ン ト ア ド レ シ ン グモー ド (ARMv6 以降)。 BE32 従来の ビ ッ グエ ンデ ィ ア ン モー ド 。 リ ン ク 時に BE8 と BE32 の ど ち ら を使用す る か を選択で き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-19 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン デフ ォル ト --bigend を明示的に指定 し なか っ た場合、 --littleend が指定 さ れた と き と 同 じ 処理を実行 し ます。 関連項目 • 「--littleend」 (ページ 2-95) • • • 2.1.15 『デベ ロ ッ パガ イ ド 』 の 「エ ンデ ィ ア ンのサポー ト 」 (ページ 2-14) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--be8」 (ページ 2-5) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--be32」 (ページ 2-5) --bitband こ のオプシ ョ ンは、 const 以外のすべてのグ ロ ーバル構造体オブジ ェ ク ト を ビ ッ ト バン ド し ます。 1 ワー ド の メ モ リ を ビ ッ ト バン ド 領域のシ ン グルビ ッ ト にマ ッ プで き ます。 こ れに よ り 、 メ モ リ アーキ テ ク チ ャ の SRAM 領域 と ペ リ フ ェ ラ ル領域にあ る シ ン グルビ ッ ト 値へのア ト ミ ッ ク ア ク セ ス を効率化で き ます。 メ モ リ ア ク セ ス幅に依存す る ペ リ フ ェ ラ ルの場合、 ビ ッ ト バン ド 構造体の ビ ッ ト フ ィ ール ド の char 型、 short 型、 お よ び int 型には、 エ イ リ ア ス空間に 対す る バ イ ト 、 ハーフ ワー ド 、 お よ びワ ー ド の ス ト ア ま たは ロ ー ド がそれぞ れ生成 さ れます。 制限 次の使用制限があ り ます。 2-20 • こ のオプシ ョ ンは struct 型のみに影響 し ます。 共用体型、 ま たは共用体 を メ ンバ と し て持つその他の集合型はビ ッ ト バン ド 化で き ません。 • 構造体の メ ンバは個別にビ ッ ト バン ド 化で き ません。 • ビ ッ ト バン ド ア ク セ ス は、 シ ン グルビ ッ ト の ビ ッ ト フ ィ ール ド にのみ生 成 さ れます。 • ビ ッ ト バン ド ア ク セ ス は、 const オブジ ェ ク ト 、 ポ イ ン タ 、 お よ び ロ ー カルオブジ ェ ク ト には生成 さ れ ません。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 例 例 2-1 (ページ 2-21) では、 ビ ッ ト フ ィ ール ド i と k への書 き 込みは、 --bitband コ マ ン ド ラ イ ン オプシ ョ ン を使用 し て コ ンパ イ ルす る と ビ ッ ト バン ド さ れます。 例 2-1 ビ ッ ト バン ド の例 typedef int i int j int k } BB; struct { : 1; : 2; : 1; BB value; void update_value(void) { value.i = 1; value.k = 1; } 関連項目 • 「__attribute__((bitband))」 (ページ 4-47) • • 2.1.16 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「ビ ッ ト バンデ ィ ン グ」 (ページ 4-17) 使用 し てい る プ ロ セ ッ サの 『テ ク ニ カル リ フ ァ レ ン ス マニ ュ アル』 --brief_diagnostics, --no_brief_diagnostics こ のオプシ ョ ン を使用す る と 、 コ ンパ イ ラ に よ る 診断 メ ッ セージの短縮形の 出力を有効ま たは無効にで き ます。 有効にす る と 、 元の ソ ース行は表示 さ れず、 1 行に収ま ら ないエ ラ ー メ ッ セージは折 り 返 さ れ ません。 デ フ ォル ト デフ ォ ル ト は --no_brief_diagnostics です。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-21 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 例 /* main.c */ #include <stdio.h> int main(void) { printf(" “Hello, world\n"); return 0; } --brief_diagnostics を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 警告 メ ッ セー ジが表示 さ れます。 関連項目 「--diag_error=tag[,tag,...]」 (ページ 2-50) • • • • • • • • • • 2.1.17 「--diag_remark=tag[,tag,... ]」 (ページ 2-51) 「--diag_style={arm|ide|gnu}」 (ページ 2-52) 「--diag_suppress=tag[,tag,...]」 (ページ 2-53) 「--diag_warning=tag[,tag,...]」 (ページ 2-54) 「--errors=filename」 (ページ 2-60) 「--remarks」 (ページ 2-124) 「-W」 (ページ 2-149) 「--wrap_diagnostics, --no_wrap_diagnostics」 (ページ 2-153) 『コ ンパ イ ラ ユーザガ イ ド 』 の第 6 章 診断 メ ッ セージ --bss_threshold=num こ のオプシ ョ ン を使用す る と 、 セ ク シ ョ ン での小容量のグ ロ ーバル ZI デー タ 項目の配置を制御で き ます。 小容量のグ ロ ーバル ZI デー タ 項目は、 サ イ ズが 8 バ イ ト 以下の未初期化デー タ 項目です。 2-22 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 構文 --bss_threshold=num 各パ ラ メ ー タ には以下の意味があ り ます。 以下のいずれか を指定 し ます。 num 0 小容量のグ ロ ーバル ZI デー タ 項目を ZI デー タ セ ク シ ョ ン に配置 し ます。 8 小容量のグ ロ ーバル ZI デー タ 項目を RW デー タ セ ク シ ョ ンに配置 し ます。 使用法 現在のバージ ョ ンの RVCT では、 コ ンパ イ ラ は最適化を目的 と し て、 小容量 のグ ロ ーバル ZI デー タ 項目を RW デー タ セ ク シ ョ ンに配置す る 場合があ り ま す。 RVCT 2.0.1 以前では、 小容量のグ ロ ーバル ZI デー タ 項目は、 デフ ォ ル ト で ZI デー タ セ ク シ ョ ンに配置 さ れま し た。 こ のオプシ ョ ン を使用 し て、 ZI デー タ セ ク シ ョ ンへの小容量のグ ロ ーバル ZI デー タ 項目の配置について、 RVCT 2.0.1 以前の動作を エ ミ ュ レー ト し ます。 注 --bss_threshold=0 オプシ ョ ンは、 現在の コ ンパ イ ルモジ ュ ールの すべての 小容 量のグ ロ ーバル ZI デー タ 項目を ZI デー タ セ ク シ ョ ン に配置す る よ う に コ ン パ イ ラ に指示 し ます。 固有の変数を配置す る には、 以下のオプシ ョ ン を使用 し ます。 • • ZI デー タ セ ク シ ョ ン に配置す る には、 __attribute__((zero_init)) を使用 し ます。 固有の ZI デー タ セ ク シ ョ ン に配置す る には、 __attribute__((section)) と __attribute__((zero_init)) を組み合わせて使用 し ます。 デ フ ォル ト --bss_threshold オプシ ョ ン を指定 し なか っ た場合、 コ ンパ イ ラ は --bss_threshold=8 が指定 さ れた と き と 同 じ 処理を実行 し ます。 ARM Linux コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを コ マ ン ド ラ イ ン で指定 し て、 --translate_gcc ま たは --translate_g++ を使用 し た場合は、 --bss_threshold=0 を 指定 し た と き と 同 じ 処理が実行 さ れます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-23 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 例 int glob1; /* ZI (.bss) in RVCT 2.0.1 and earlier */ /* RW (.data) in RVCT 2.1 and later */ こ の コ ー ド を --bss_threshold=0 で コ ンパ イ ルす る と 、 ZI デー タ セ ク シ ョ ン に glob1 が配置 さ れ ます。 関連項目 「#pragma arm section [section_sort_list]」 (ページ 4-63) • • • • • 2.1.18 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_configure」 (ページ 2-13) 「__attribute__((section("name")))」 (ページ 4-57) 「__attribute__((zero_init))」 (ページ 4-61) -c こ のオプシ ョ ンは、 コ ンパ イ ル手順を実行 し て、 リ ン ク 手順は実行 し ない よ う に コ ンパ イ ラ に指示 し ます。 注 こ のオプシ ョ ンは、 大文字の -C オプシ ョ ン と は異な り ます。 使用法 -c オプシ ョ ンは、 複数の ソ ース フ ァ イ ルのプ ロ ジ ェ ク ト での使用をお勧め し ます。 関連項目 「--asm」 (ページ 2-17) • • • • 2-24 「--list」 (ページ 2-92) 「-o filename」 (ページ 2-106) 「-S」 (ページ 2-127) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.19 -C こ のオプシ ョ ンは、 プ リ プ ロ セ ッ サ出力内に コ メ ン ト を残す よ う に コ ンパ イ ラ に指示 し ます。 こ のオプシ ョ ン を選択す る と 、 オプシ ョ ン -E が暗黙的に選択 さ れ ます。 注 こ のオプシ ョ ンは、 小文字の -c オプシ ョ ン と は異な り ます。 関連項目 • 「-E」 (ページ 2-58) 2.1.20 --c90 こ のオプシ ョ ン を使用す る と 、 C90 ソ ース コ ー ド の コ ンパ イ ルが可能にな り ます。 デ フ ォル ト こ のオプシ ョ ンは、 接尾文字が .c、 .ac、 ま たは .tc の フ ァ イ ルに対 し て暗黙 的に選択 さ れます。 注 フ ァ イ ル名の拡張子 .ac と .tc は廃止 さ れ ま し た。 関連項目 • 「--c99」 • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--gnu」 (ページ 2-75) 「--strict, --no_strict」 (ページ 2-133) 「 ソ ース言語モー ド 」 (ページ 1-3) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「フ ァ イ ル命名規則」 (ページ 2-14) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-25 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.21 --c99 こ のオプシ ョ ン を使用す る と 、 C99 ソ ース コ ー ド の コ ンパ イ ルが可能にな り ます。 関連項目 • 「--c90」 (ページ 2-25) • • • 2.1.22 「--gnu」 (ページ 2-75) 「--strict, --no_strict」 (ページ 2-133) 「 ソ ース言語モー ド 」 (ページ 1-3) --code_gen, --no_code_gen こ のオプシ ョ ン を使用す る と 、 オブジ ェ ク ト コ ー ド を生成す る か ど う か を指 定で き ます。 オブジ ェ ク ト コ ー ド の生成が無効な場合、 コ ンパ イ ラ は、 構文のチ ェ ッ ク の みを実行 し 、 オブジ ェ ク ト フ ァ イ ルを作成 し ません。 デフ ォル ト デフ ォ ル ト は --code_gen です。 2.1.23 --compatible=name こ のオプシ ョ ン を使用す る と 、 コ ンパ イ ラ に よ っ て生成 さ れた コ ー ド が複数 のプ ロ セ ッ サ ま たはアーキ テ ク チ ャ と 互換性を持つ よ う にな り ます。 有効な組み合わせは表 2-2 に示す と お り です。 グループ 1 の任意のプ ロ セ ッ サ ま たはアーキ テ ク チ ャ を、 グループ 2 の任意のプ ロ セ ッ サ ま たはアーキ テ ク チ ャ と 組み合わせ る こ と がで き ます。 表 2-2 互換性のある プ ロ セ ッ サまたはアーキテ ク チ ャ の組み合わせ 2-26 グルー プ1 ARM7TDMI, 4T グルー プ2 Cortex-M1, Cortex-M3, 7-M, 6-M, 6S-M Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 構文 --compatible=name 各パ ラ メ ー タ には以下の意味があ り ます。 プ ロ セ ッ サ ま たはアーキ テ ク チ ャ の名前、 ま たは NONE です。 プ ロ セ ッ サ名 と アーキ テ ク チ ャ 名では、 大文字 と 小文字は区別 さ れ ません。 name こ のオプシ ョ ンが コ マ ン ド ラ イ ン で複数回指定 さ れた場合は、 最後に指定 さ れたオプシ ョ ンがそれ よ り 前のオプシ ョ ン を オー バー ラ イ ド し ます。 指定 さ れた こ のオプシ ョ ン をすべて無効にす る には、 コ マ ン ド ラ イ ン の末尾で --compatible=NONE を指定 し ます。 例 armcc --cpu=arm7tdmi --compatible=cortex-m3 myprog.c 関連項目 • 2.1.24 「--cpu=name」 (ページ 2-35) --compile_all_input, --no_compile_all_input こ のオプシ ョ ン を使用す る と 、 フ ァ イ ル拡張子の処理の抑制を有効ま たは無 効にで き ます。 有効の場合には、 コ ンパ イ ラ はフ ァ イ ル拡張子の処理を完全に抑止 し 、 すべ ての入力フ ァ イ ルを接尾文字 .c の付いた入力フ ァ イ ル と し て処理 し ます。 デ フ ォル ト デフ ォ ル ト は --no_compile_all_input です。 関連項目 • ARM DUI 0348BJ ID 1 0 0 4 1 9 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「フ ァ イ ル命名規則」 (ページ 2-14) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-27 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.25 --configure_cpp_headers=path こ のオプシ ョ ンは、 ARM Linux と 共用す る ために RVCT を設定す る 際 GNU libstdc++ STL ヘ ッ ダ フ ァ イ ルのパ ス を指定 し ます。 構文 --configure_cpp_headers=path 各パ ラ メ ー タ には以下の意味があ り ます。 GNU C++ STL ヘ ッ ダ フ ァ イ ルへのパ ス です。 path 使用法 こ のオプシ ョ ンは、 自動検出 さ れたすべてのパ ス を オーバー ラ イ ド し ます。 RVCT を ARM Linux と 共に使用で き る よ う に設定す る 際の、 手動設定の一部 と し て使用で き ます。 関連項目 「--arm_linux」 (ページ 2-10) • • • • • • • • • • • • • • • • • 2-28 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_configure」 (ページ 2-13) 「--arm_linux_paths」 (ページ 2-15) 「--configure_gcc=path」 (ページ 2-31) 「--configure_gld=path」 (ページ 2-32) 「--configure_sysroot=path」 (ページ 2-33) 「--configure_extra_includes=paths」 (ページ 2-29) 「--configure_extra_libraries=paths」 (ページ 2-30) 「--shared」 (ページ 2-127) 「--translate_g++」 (ページ 2-136) 「--translate_gcc」 (ページ 2-138) 「--translate_gld」 (ページ 2-139) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.26 --configure_extra_includes=paths こ のオプシ ョ ンは、 RVCT を ARM Linux と 共に使用で き る よ う に設定す る 際 に、 追加のシ ス テ ム イ ン ク ルー ド パ ス を指定 し ます。 構文 --configure_extra_includes=paths 各パ ラ メ ー タ には以下の意味があ り ます。 paths 追加のシ ス テ ム イ ン ク ルー ド パ ス の場所を示すパ ス名を コ ン マ で区切っ た リ ス ト です。 関連項目 「--arm_linux」 (ページ 2-10) • • • • • • • • • • • • • • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_configure」 (ページ 2-13) 「--arm_linux_paths」 (ページ 2-15) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_libraries=paths」 (ページ 2-30) 「--configure_gcc=path」 (ページ 2-31) 「--configure_gld=path」 (ページ 2-32) 「--configure_sysroot=path」 (ページ 2-33) 「--shared」 (ページ 2-127) 「--translate_g++」 (ページ 2-136) 「--translate_gcc」 (ページ 2-138) 「--translate_gld」 (ページ 2-139) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-29 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.27 --configure_extra_libraries=paths こ のオプシ ョ ンは、 RVCT を ARM Linux と 共に使用で き る よ う に設定す る 際 に、 追加のシ ス テ ム ラ イ ブ ラ リ パ ス を指定 し ます。 構文 --configure_extra_libraries=paths 各パ ラ メ ー タ には以下の意味があ り ます。 paths 追加のシ ス テ ム ラ イ ブ ラ リ パ ス の場所を示すパ ス名を コ ン マで 区切っ た リ ス ト です。 関連項目 「--arm_linux」 (ページ 2-10) • • • • • • • • • • • • • • • • • 2-30 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_configure」 (ページ 2-13) 「--arm_linux_paths」 (ページ 2-15) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_includes=paths」 (ページ 2-29) 「--configure_gcc=path」 (ページ 2-31) 「--configure_gld=path」 (ページ 2-32) 「--configure_sysroot=path」 (ページ 2-33) 「--shared」 (ページ 2-127) 「--translate_g++」 (ページ 2-136) 「--translate_gcc」 (ページ 2-138) 「--translate_gld」 (ページ 2-139) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.28 --configure_gcc=path こ のオプシ ョ ンは、 RVCT を ARM Linux と 共に使用で き る よ う に設定す る 際 に、 GCC ド ラ イ バの場所を指定 し ます。 構文 --configure_gcc=path 各パ ラ メ ー タ には以下の意味があ り ます。 GCC ド ラ イ バのパ ス と フ ァ イ ル名です。 path 使用法 コ ン フ ィ ギ ュ レーシ ョ ン時に指定 さ れた GCC ド ラ イ バのデフ ォ ル ト の場所を オーバー ラ イ ド す る 場合、 ま たは --arm_linux_configure の自動 コ ン フ ィ ギ ュ レーシ ョ ン で ド ラ イ バが見つか ら ない場合は、 こ のオプシ ョ ン を使用 し ます。 関連項目 • 「--arm_linux」 (ページ 2-10) • • • • • • • • • • • • • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_configure」 (ページ 2-13) 「--arm_linux_paths」 (ページ 2-15) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_includes=paths」 (ページ 2-29) 「--configure_extra_libraries=paths」 (ページ 2-30) 「--configure_gld=path」 (ページ 2-32) 「--configure_sysroot=path」 (ページ 2-33) 「--shared」 (ページ 2-127) 「--translate_g++」 (ページ 2-136) 「--translate_gcc」 (ページ 2-138) 「--translate_gld」 (ページ 2-139) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-31 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.29 --configure_gld=path こ のオプシ ョ ンは、 GNU リ ン カ ld の場所を指定 し ます。 構文 --configure_gld=path 各パ ラ メ ー タ には以下の意味があ り ます。 GNU リ ン カのパ ス と フ ァ イ ル名です。 path 使用法 コ ン フ ィ ギ ュ レーシ ョ ン時、 GCC に よ っ て使用 さ れ る GNU リ ン カの場所の 特定が コ ンパ イ ラ に よ っ て試み ら れます。 コ ンパ イ ラ に よ っ て こ の場所を特 定で き ない場合、 ま たは GNU リ ン カの通常のパ ス を オーバー ラ イ ド す る 必要 があ る 場合は、--configure_gld=path オプシ ョ ン を使用 し て、 場所を指定で き ま す。 パ ス は、 GNU ld バ イ ナ リ の完全パ ス と フ ァ イ ル名にな り ます。 関連項目 「--arm_linux」 (ページ 2-10) • • • • • • • • • • • • • • • • 2-32 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_configure」 (ページ 2-13) 「--arm_linux_paths」 (ページ 2-15) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_includes=paths」 (ページ 2-29) 「--configure_extra_libraries=paths」 (ページ 2-30) 「--configure_gcc=path」 (ページ 2-31) 「--configure_sysroot=path」 (ページ 2-33) 「--shared」 (ページ 2-127) 「--translate_g++」 (ページ 2-136) 「--translate_gcc」 (ページ 2-138) 「--translate_gld」 (ページ 2-139) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • 2.1.30 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 --configure_sysroot=path こ のオプシ ョ ンは、 RVCT を ARM Linux と 共に使用で き る よ う に設定す る 際 に、 使用す る シ ス テ ムルー ト パ ス を指定 し ます。 構文 --configure_sysroot=path path は、 使用す る シ ス テ ムルー ト パ ス です。 使用法 こ のオプシ ョ ンは、 自動検出 さ れたすべてのシ ス テ ムルー ト パ ス を オーバー ラ イ ド し ます。 RVCT を ARM Linux と 共に使用で き る よ う に設定す る 手動設 定の一環 と し て こ のオプシ ョ ン を使用す る と 、 通常のシ ス テ ムルー ト パ ス と は異な る パ ス を指定で き ます。 シ ス テ ムルー ト パ ス と は、 ラ イ ブ ラ リ と ヘ ッ ダ フ ァ イ ルが通常保存 さ れてい る ベース パ ス の こ と です。 標準的な Linux シ ス テ ム では、 フ ァ イ ルシ ス テ ムの ルー ト であ る 場合が一般的です。 ク ロ ス コ ンパ イ ルの GNU ツールチ ェーン で は、 通常、 GNU C ラ イ ブ ラ リ が イ ン ス ト ール さ れてい る 親デ ィ レ ク ト リ にな り ます。 こ のデ ィ レ ク ト リ には、 C ラ イ ブ ラ リ と ヘ ッ ダ フ ァ イ ルを格納す る lib、 usr/lib、 お よ び usr/include の各サブデ ィ レ ク ト リ が含ま れてい ます。 関連項目 「--arm_linux」 (ページ 2-10) • • • • • • • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_configure」 (ページ 2-13) 「--arm_linux_paths」 (ページ 2-15) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_includes=paths」 (ページ 2-29) 「--configure_extra_libraries=paths」 (ページ 2-30) 「--configure_gcc=path」 (ページ 2-31) 「--configure_gld=path」 (ページ 2-32) 「--shared」 (ページ 2-127) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-33 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • • • • • • • 2.1.31 「--translate_g++」 (ページ 2-136) 「--translate_gcc」 (ページ 2-138) 「--translate_gld」 (ページ 2-139) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 --cpp こ のオプシ ョ ン を使用す る と 、 C++ ソ ース コ ー ド の コ ンパ イ ルが可能にな り ます。 デフ ォル ト こ のオプシ ョ ンは、 接尾文字が .cpp、 .cxx、 .c++、 .cc、 ま たは .CC の フ ァ イ ル に対 し て暗黙的に選択 さ れ ます。 関連項目 「--anachronisms, --no_anachronisms」 (ページ 2-3) • • • • • • 2.1.32 「--c90」 (ページ 2-25) 「--c99」 (ページ 2-26) 「--gnu」 (ページ 2-75) 「--strict, --no_strict」 (ページ 2-133) 「 ソ ース言語モー ド 」 (ページ 1-3) --cpu=list こ のオプシ ョ ン を使用す る と 、--cpu=name オプシ ョ ン と 組み合わせて使用で き る 、 サポー ト さ れてい る アーキ テ ク チ ャ 名 と プ ロ セ ッ サ名が一覧表示 さ れ ま す。 関連項目 • 「--cpu=name」 2-34 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.33 --cpu=name こ のオプシ ョ ン を使用す る と 、 選択 し た ARM プ ロ セ ッ サ ま たはアーキ テ ク チ ャ の コ ー ド を生成で き ます。 構文 --cpu=name 各パ ラ メ ー タ には以下の意味があ り ます。 name プ ロ セ ッ サ ま たはアーキ テ ク チ ャ の名前です。 name がプ ロ セ ッ サ名の場合は、 ARM7TDMI, ARM1176JZ-S, MPCore な ど、 ARM デー タ シー ト に記載 さ れてい る と お り に名前を入力 し ま す。 name がアーキ テ ク チ ャ 名の場合は、 名前が 表 2-3 のアーキ テ ク チ ャ の リ ス ト に含ま れてい る 必要があ り ます。 プ ロ セ ッ サ名 と アーキ テ ク チ ャ 名では、 大文字 と 小文字は区別 さ れ ません。 ワ イ ル ド カー ド 文字は使用で き ません。 表 2-3 サポー ト さ れている ARM アーキテ ク チ ャ と プ ロ セ ッ サの例 アーキテ ク チャ 説明 プ ロ セ ッ サの例 4 Thumb をサポー ト し ていない ARMv4 SA-1100 4T Thumb をサポー ト し てい る ARMv4 ARM7TDMI、 ARM9TDMI、 ARM720T、 ARM740T、 ARM920T、 ARM922T、 ARM940T、 SC100 5T Thumb お よ び イ ン タ ーワー ク をサポー ト し てい る ARMv5 5TE Thumb、 イ ン タ ーワー ク 、 DSP 乗算、 お よ びダブル ワー ド 命令を サポー ト し てい る ARMv5 ARM9E、 ARM946E-S、 ARM966E-S 5TEJ Thumb、 イ ン タ ーワ ー ク 、 DSP 乗算、 ダブル ワー ド 命令、 お よ び Jazelle® 拡張をサポー ト し てい る ARMv5a ARM926EJ-S、 ARM1026EJ-S、 SC200 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-35 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 表 2-3 サポー ト さ れている ARM アーキテ ク チ ャ と プ ロ セ ッ サの例 ( 続き ) アーキテ ク チャ 説明 プ ロ セ ッ サの例 6 Thumb、 イ ン タ ーワ ー ク 、 DSP 乗算、 ダブル ワー ド 命令、 非境界 整列、 混合エンデ ィ ア ン、 Jazelle 拡張、 お よ び メ デ ィ ア拡張をサ ポー ト し てい る ARMv6 ARM1136J-S、 ARM1136JF-S 6-M Thumb のみ と プ ロ セ ッ サ状態命令をサポー ト し てい る ARMv6 マ イ ク ロ コ ン ト ローラ プ ロ フ ァ イル OS 拡張機能な し の Cortex-M1 6S-M Thumb のみ と 、 プ ロ セ ッ サ状態命令お よ び OS 拡張をサポー ト し てい る ARMv6 マ イ ク ロ コ ン ト ロ ー ラ プ ロ フ ァ イ ル OS 拡張機能付き の Cortex-M1 6K SMP 拡張をサポー ト し てい る ARMv6 MPCore 6T2 Thumb-2 をサポー ト し てい る ARMv6 ARM1156T2-S、 ARM1156T2F-S 6Z Security Extensions をサポー ト し てい る ARMv6 ARM1176JZF-S、 ARM1176JZ-S 7 Thumb-2 のみをサポー ト し 、 ハー ド ウ ェ ア除算をサポー ト し てい ない ARMv7 7-A ARM、 Thumb-2、 お よ び Thumb-2EE 命令セ ッ ト 、 DSP サポー ト 、 お よ び 32 ビ ッ ト SIMD のサポー ト を装備 し た仮想 MMU ベース メ モ リ シ ス テ ム をサポー ト す る ARMv7 アプ リ ケーシ ョ ンプ ロ フ ァ イル Cortex-A8、 Cortex-A9 7-R ARM、 Thumb-2、 DSP サポー ト 、 お よ び 32 ビ ッ ト SIMD サポー ト を装備 し た ARMv7 リ アル タ イ ムプ ロ フ ァ イ ル Cortex-R4、 Cortex-R4F 7-M Thumb-2 のみ と ハー ド ウ ェ ア除算をサポー ト し てい る ARMv7 マ イ ク ロ コ ン ト ローラ プ ロ フ ァ イル Cortex-M3、 SC300 a. ARM コ ンパ イ ラ は Java バ イ ト コ ー ド を生成で き ません。 注 ARMv7 は実際の ARM アーキ テ ク チ ャ ではあ り ません。 --cpu=7 は、 ARMv7-A、 ARMv7-R、 お よ び ARMv7-M アーキ テ ク チ ャ のすべてに共通す る 機能を示 し ます。 当然、 --cpu=7 と 一緒に使用 さ れ る 機能は、 ARMv7-A、 ARMv7-R、 ARMv7-M のすべてのアーキ テ ク チ ャ 上に存在 し ます。 2-36 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン デ フ ォル ト --cpu オプシ ョ ン を指定 し ない場合は、--cpu=ARM7TDMI が想定 さ れ ます。 CPU アーキ テ ク チ ャ お よ びプ ロ セ ッ サがすべて記載 さ れた一覧を表示す る に は、--cpu=list オプシ ョ ン を使用 し ます。 使用法 以下に、 プ ロ セ ッ サ と アーキ テ ク チ ャ に関す る オプシ ョ ンの一般的な特徴を 示 し ます。 プロセッサ • プ ロ セ ッ サ を選択す る と 、 適切な アーキ テ ク チ ャ 、 浮動小 数点ユニ ッ ト (FPU)、 お よ び メ モ リ 構成が選択 さ れます。 • --cpu の値には、 現時点でのすべての ARM 製品名ま たは アーキ テ ク チ ャ バージ ョ ン を指定で き ます。 Marvell Feroceon や Intel XScale な ど、 他の ARM アーキ テ ク チ ャ ベース のプ ロ セ ッ サ も サポー ト さ れてい ます。 • --cpu オプシ ョ ン でプ ロ セ ッ サ を指定す る と 、 コ ンパ イ ル さ れ る コ ー ド はそのプ ロ セ ッ サ用に最適化 さ れ ます。 こ のオ プシ ョ ンに よ り 、 コ ンパ イ ラ は特定の コ プ ロ セ ッ サ ま たは 命令ス ケ ジ ュ ー リ ン グの機能を使用 し て、 最適なパフ ォ ー マ ン ス を実現で き ます。 アーキ テ ク チ ャ • --cpu オプシ ョ ン でアーキ テ ク チ ャ 名を指定す る と 、 コ ンパ イ ル さ れた コ ー ド は、 そのアーキ テ ク チ ャ を サポー ト し て い る すべてのプ ロ セ ッ サで実行で き ます。 例えば、--cpu=5TE を指定す る と 、 ARM926EJ-S® で使用で き る コ ー ド が生成 さ れ ます。 FPU • --cpu を選択す る と 、--fpu が暗黙的に選択 さ れ る こ と があ り ます。 例えば、--arm オプシ ョ ン を指定 し て コ ンパ イ ルす る 場合、--cpu=ARM1136JF-S を指定す る と 暗黙的に --fpu=vfpv2 が 選択 さ れ ます。 同様に、 --cpu=Cortex-R4F を指定す る と 、 --fpu=vfpv3_d16 が暗黙的に選択 さ れ ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-37 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 注 暗黙的な FPU は、 コ マ ン ド ラ イ ン で --fpu に よ っ て 明示的 に指定 さ れた FPU に よ っ てオーバー ラ イ ド さ れ る こ と に注 意 し て下 さ い。 • --fpu オプシ ョ ン も --cpu オプシ ョ ン も 指定 さ れていない場 合には、--fpu=softvfp が使用 さ れます。 ARM と Thumb • --cpu=ARM7TDMI な ど の Thumb 命令対応プ ロ セ ッ サ ま たはアー キ テ ク チ ャ を指定 し て も 、 ARM コ ンパ イ ラ は Thumb コ ー ド を生成 し ません。 Long 乗算な ど、 使用 さ れ る プ ロ セ ッ サ の機能だけが有効にな り ます。 プ ロ セ ッ サが Thumb 専用プ ロ セ ッ サ (Cortex-M3 な ど) でない場合は、--thumb オプシ ョ ン を使用 し て Thumb コ ー ド を生成 し ます。 こ の場合、 --thumb は不要です。 注 タ ーゲ ッ ト プ ロ セ ッ サ ま たはアーキ テ ク チ ャ を指定す る と 、 他の ARM プ ロ セ ッ サに対す る オブジ ェ ク ト コ ー ド の互換 性が失われ る こ と があ り ます。 例えば、 アーキ テ ク チ ャ ARMv6 用に コ ンパ イ ル さ れた コ ー ド に ARMv6 固有の命令 が含まれてい る 場合、 その コ ー ド は ARM920T プ ロ セ ッ サ では実行で き ない こ と があ り ます。 し たが っ て、 目的に応 じ た最小公分母のプ ロ セ ッ サ を選択す る 必要があ り ます。 2-38 • ARMv4T ま たは ARMv5T を サポー ト す る プ ロ セ ッ サ用の コ ー ド を コ ンパ イ ル し てお り 、 その コ ー ド を ARM/Thumb 混合シ ス テ ム で使用す る 場合は、 イ ン タ ー ワー ク オプシ ョ ン の --apcs=/interwork を指定す る 必要があ り ます。 ARMv5T 以降を サポー ト す る プ ロ セ ッ サでは、 デフ ォ ル ト で イ ン タ ー ワ ー ク オプシ ョ ン が有効にな り ます。 • コ マ ン ド ラ イ ン で --thumb オプシ ョ ン を指定 し て Thumb 用 に コ ンパ イ ルす る と 、 コ ンパ イ ラ は可能な範囲で Thumb 命 令セ ッ ト を使用 し て コ ー ド を コ ンパ イ ル し ます。 ただ し 、 一部の コ ー ド は ARM コ ー ド に コ ンパ イ ル さ れ る こ と があ り ます。 例えば、 Thumb-1 プ ロ セ ッ サ用の コ ー ド を コ ンパ イ ル し てお り 、 VFP を使用 し てい る 場合は、 浮動小数点演 算を含むすべての関数が ARM 用に コ ンパ イ ル さ れ ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • --cpu=Cortex-M3 な ど、 ARMv7-M 用の コ ー ド を コ ンパ イ ルす る 場合は、 ARMv7-M では Thumb-2 のみがサポー ト さ れて い る ため、 コ マ ン ド ラ イ ン で --thumb を指定す る 必要はあ り ません。 制約条件 同 じ コ マ ン ド ラ イ ン でプ ロ セ ッ サ と アーキ テ ク チ ャ の両方を指定す る こ と は で き ません。 関連項目 • 「--apcs=qualifer...qualifier」 (ページ 2-4) • • • 2.1.34 「--cpu=list」 (ページ 2-34) 「--fpu=name」 (ページ 2-70) 「--thumb」 (ページ 2-135) --create_pch=filename こ のオプシ ョ ンは、 指定 し た フ ァ イ ル名で プ リ コ ンパ イ ル (PCH) フ ァ イ ル を作成す る よ う に コ ンパ イ ラ に指示 し ます。 こ のオプシ ョ ンは他のすべての PCH オプシ ョ ン よ り も 優先 さ れます。 構文 --create_pch=filename 各パ ラ メ ー タ には以下の意味があ り ます。 filename 作成 さ れ る PCH フ ァ イ ルの名前を指定 し ます。 関連項目 「--pch」 (ページ 2-113) • • • • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--pch_dir=dir」 (ページ 2-113) 「--pch_messages, --no_pch_messages」 (ページ 2-114) 「--pch_verbose, --no_pch_verbose」 (ページ 2-115) 「--use_pch=filename」 (ページ 2-144) 「#pragma hdrstop」 (ページ 4-70) 「#pragma no_pch」 (ページ 4-72) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-39 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「プ リ コ ンパ イ ルヘ ッ ダ フ ァ イ ル」 (ページ 2-19) 2.1.35 -Dname[(parm-list)][=def] こ のオプシ ョ ン ではマ ク ロ name が定義 さ れます。 構文 -Dname[(parm-list)][=def] 各パ ラ メ ー タ には以下の意味があ り ます。 name 定義す る マ ク ロ の名前です。 parm-list コ ン マで区切 ら れたマ ク ロ パ ラ メ ー タ の リ ス ト を指定で き ます (省略可)。 関数形式のマ ク ロ は、 マ ク ロ パ ラ メ ー タ リ ス ト を マ ク ロ 名に追加す る こ と で定義で き ます。 パ ラ メ ー タ リ ス ト は括弧で囲む必要があ り ます。 複数のパ ラ メ ー タ を指定す る 場合は、 リ ス ト の コ ン マ と パ ラ メ ー タ 名の間に ス ペース を入れないで下 さ い。 注 UNIX シ ス テ ム では、 括弧を エ ス ケープす る 必要があ り ます。 オプシ ョ ンのマ ク ロ 定義です。 =def =def が省略 さ れてい る 場合、 name を 1 と 定義 し ます。 ト ー ク ン と し て認識 さ れた文字を コ マ ン ド ラ イ ン に含め る には、 マ ク ロ 定義を二重引用符で囲みます。 使用法 -Dname を指定 し た と き の効果は、 各 ソ ース フ ァ イ ルの冒頭にテ キ ス ト #define name を記述 し た と き の効果 と 同 じ です。 制約条件 コ ンパ イ ラ は以下の順序でマ ク ロ を定義 し た り 、 定義を削除 し た り し ます。 1. コ ンパ イ ラ の定義済みマ ク ロ 2. -Dname を使用 し て明示的に定義 さ れたマ ク ロ 3. 2-40 -Uname を使用 し て明示的に定義が削除 さ れたマ ク ロ Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 例 コ マ ン ド ラ イ ン でオプシ ョ ン -DMAX(X,Y)="((X > Y) ? X : Y)" を指定す る こ と は、 各 ソ ース フ ァ イ ルの冒頭でマ ク ロ #define MAX(X, Y) ((X > Y) ? X : Y) を定義す る こ と と 同 じ 意味です。 関連項目 「-C」 (ページ 2-25) • • • • 2.1.36 「-E」 (ページ 2-58) 「-Uname」 (ページ 2-141) 「コ ンパ イ ラ に よ る事前定義」 (ページ 4-129) --data_reorder, --no_data_reorder こ のオプシ ョ ン を使用す る と 、 ト ッ プ レベルのデー タ 項目 (グ ロ ーバルデー タ な ど) の自動再順序付け を行 う か ど う か を指定で き ます。 コ ンパ イ ラ は、 デー タ 項目間の無駄な空間を除去す る こ と で、 メ モ リ を節約 で き ます。 ただ し 、 コ ンパ イ ラ に よ る デー タ の順序付けについて コ ー ド が想 定を誤っ てい る 場合は、--data_reorder に よ っ て既存の コ ー ド が壊れ る こ と が あ り ます。 ISO C 標準では、 デー タ の順序が保証 さ れないため、 想定 さ れた順序に依存 す る コ ー ド の記述を避け る 必要があ り ます。 デー タ の順序付けが必要な場合 は、 デー タ 項目を構造化 し て下 さ い。 デ フ ォル ト デフ ォ ル ト は --data_reorder です。 2.1.37 --debug, --no_debug こ のオプシ ョ ン を使用す る と 、 現在の コ ンパ イ ル用のデバ ッ グ テーブルを生 成す る か ど う か を指定で き ます。 --debug が使用 さ れてい る か ど う かにかかわ ら ず、 コ ンパ イ ラ は同 じ コ ー ド を 生成 し ます。 違 う のはデバ ッ グ テーブルが存在す る こ と だけです。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-41 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン デフ ォル ト デフ ォ ル ト は --no_debug です。 --debug を使用 し て も 、 最適化の設定には影響 し ません。 デフ ォ ル ト で は、--debug オプシ ョ ン を単独で使用す る こ と は、 以下のオプシ ョ ン を指定す る こ と と 同 じ です。 --debug --dwarf3 --debug_macros 関連項目 • 「--debug_macros, --no_debug_macros」 • • • 2.1.38 「--dwarf2」 (ページ 2-58) 「--dwarf3」 (ページ 2-58) 「-Onum」 (ページ 2-108) --debug_macros, --no_debug_macros こ のオプシ ョ ン を使用す る と 、 プ リ プ ロ セ ッ サマ ク ロ 定義に関す る デバ ッ グ テーブルエ ン ト リ を生成す る か ど う か を指定で き ます。 使用法 --no_debug_macros を使用す る と 、 デバ ッ グ イ メ ージのサ イ ズ を縮小で き ます。 こ のオプシ ョ ンは --debug オプシ ョ ン と 組み合わせて使用す る 必要があ り ま す。 デフ ォル ト デフ ォ ル ト は --debug_macros です。 関連項目 「--debug, --no_debug」 • 2.1.39 --default_extension=ext こ のオプシ ョ ン を使用す る と 、 オブジ ェ ク ト フ ァ イ ルの フ ァ イ ル拡張子をデ フ ォ ル ト の拡張子 (.o) か ら 指定 し た拡張子に変更で き ます。 2-42 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 構文 --default_extension=ext 各パ ラ メ ー タ には以下の意味があ り ます。 指定 し た フ ァ イ ル拡張子です。 ext 例 以下の例では、 test.o ではな く test.obj と い う オブジ ェ ク ト フ ァ イ ルを作成 し ます。 armcc --default_extension=obj -c test.c 注 -o filename オプシ ョ ンは、 上記のオプシ ョ ン を オーバー ラ イ ド し ます。 例え ば、 以下の コ マ ン ド を実行す る と 、 オブジ ェ ク ト フ ァ イ ルの名前は test.o と な り ます。 armcc --default_extension=obj -o test.o -c test.c 2.1.40 --dep_name, --no_dep_name こ のオプシ ョ ン を使用す る と 、 依存名の処理を行 う か ど う か を C++ で指定で き ます。 C++ 標準では、 以下の場合にテ ンプ レー ト 内の名前をル ッ ク ア ッ プす る こ と が定義 さ れてい ます。 • 名前が非依存名の場合は、 テ ンプ レー ト が解析 さ れ る と き • 名前が依存名の場合は、 テ ン プ レー ト が解析 さ れ る と き 、 ま たはテ ン プ レー ト の イ ン ス タ ン ス が生成 さ れ る と き オプシ ョ ン --no_dep_name を選択す る と 、 イ ン ス タ ン ス が生成 さ れ る と き にの み、 テ ン プ レー ト の依存名がル ッ ク ア ッ プ さ れ ます。 つま り 、 テ ン プ レー ト が解析 さ れ る と き の依存名のル ッ ク ア ッ プは無効にな っ てい ます。 注 オプシ ョ ン --no_dep_name は、 C++ 標準に準拠 し ていない従来の ソ ース コ ー ド を移行す る 目的でのみ提供 さ れてい ます。 他の目的で こ のオプシ ョ ン を使用 す る こ と はお勧め し ません。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-43 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デフ ォル ト デフ ォ ル ト は --dep_name です。 制約条件 依存名の処理を イ ネーブル し た場合は、 解析がデフ ォ ル ト で実行 さ れ る ため、 オプシ ョ ン --dep_name を オプシ ョ ン --no_parse_templates と 組み合わせて使用 す る こ と はで き ません。 エラー オプシ ョ ン --dep_name と オプシ ョ ン --no_parse_templates を組み合わせて使用 す る と 、 コ ンパ イ ラ に よ っ てエ ラ ーが生成 さ れ ます。 関連項目 • 「--parse_templates, --no_parse_templates」 (ページ 2-112) • 2.1.41 「テ ンプ レー ト の イ ン ス タ ン ス生成」 (ページ 5-17) --depend=filename こ のオプシ ョ ンは、 コ ンパ イ ル中、 フ ァ イ ルに メ ー ク フ ァ イ ル用の依存関係 行を書 き 込む よ う に コ ンパ イ ラ に指示 し ます。 構文 --depend=filename 各パ ラ メ ー タ には以下の意味があ り ます。 filename 出力す る 依存関係フ ァ イ ルの名前です。 制約条件 コ マ ン ド ラ イ ン で複数の ソ ース フ ァ イ ルを指定 し た場合は、 --depend オプシ ョ ンは無視 さ れます。 こ の場合、 依存関係フ ァ イ ルは生成 さ れ ません。 2-44 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 使用法 こ の出力フ ァ イ ルは、 make ユーテ ィ リ テ ィ での使用に適 し てい ます。 出力形 式を変更 し 、 UNIX の make ユーテ ィ リ テ ィ と の互換性を確保す る に は、--depend_format を使用 し ます。 関連項目 「--depend_format=string」 • • 「--depend_system_headers, --no_depend_system_headers」 (ページ 2-47) • • • • • • 2.1.42 「--depend_target=target」 (ページ 2-48) 「--ignore_missing_headers」 (ページ 2-80) 「--list」 (ページ 2-92) 「-M」 (ページ 2-99) 「--md」 (ページ 2-100) 「--phony_targets」 (ページ 2-116) --depend_format=string こ のオプシ ョ ンに よ り 、 UNIX の一部の make プ ロ グ ラ ム と の互換性を確保す る ために、 出力に依存す る フ ァ イ ルの形式が変更 さ れ ます。 構文 --depend_format=string string には以下のいずれか を指定で き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 unix UNIX 形式のパ ス区切 り 文字を使用 し て依存関係フ ァ イ ル エ ン ト リ を生成 し ます。 unix_escaped 動作は unix と 同 じ ですが、 スペース を \ でエ ス ケープ し ま す。 unix_quoted 動作は unix と 同 じ ですが、 パ ス名を二重引用符で囲みま す。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-45 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 使用法 Windows シ ス テ ム では、 --depend_format=unix を使用す る と き 、 UNIX 形式のパ ス名を使用す る 必要があ り ます。 つま り 、 UNIX 形式のパ ス の区切子の記号 / が \ の代わ り に使 用 さ れ ます。 unix UNIX シ ス テ ム では、 --depend_format=unix を使用 し て も 、 変化はあ り ません。 unix_escaped Windows シ ス テ ム では、 --depend_format=unix_escaped を使 用す る と き 、 UNIX 形式のパ ス名を使用す る 必要があ り 、 スペース が \ でエ ス ケープ さ れ ます。 UNIX シ ス テ ム では、 --depend_format=unix_escaped を使用す る と き 、 スペース が \ でエ ス ケープ さ れます。 unix_quoted Windows シ ス テ ム では、 --depend_format=unix_quoted を使用 す る と き 、 UNIX 形式のパ ス名を使用す る 必要があ り 、 パ ス名が "" で囲ま れます。 UNIX シ ス テ ム では、 --depend_format=unix_quoted を使用す る と き 、 パ ス名が "" で囲まれます。 デフ ォル ト --depend_format オプシ ョ ン を指定 し ない場合、 出力に依存す る フ ァ イ ルの形 式は、 使用 し てい る オペレーテ ィ ン グ シ ス テ ムに よ っ て異な り ます。 Windows Windows シ ス テ ム では、 状況に応 じ て、 デフ ォ ル ト で Windows 形式のパ ス ま たは UNIX 形式のパ ス のいずれか を 使用で き ます。 UNIX UNIX シ ス テ ム では、 デフ ォ ル ト は --depend_format=unix で す。 例 Windows シ ス テ ム で、 オプシ ョ ン --depend=depend.txt --depend_format=unix_escaped を使用 し て以下の行を含むフ ァ イ ル main.c を コ ン パ イ ル し ます。 #include "..\include\header files\common.h" 以下のエ ン ト リ を含む依存関係フ ァ イ ル depend.txt が生成 さ れ ます。 2-46 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン main.axf: main.c main.axf: ../include/header\ files/common.h 関連項目 • 「--depend=filename」 (ページ 2-44) • • • • • • 2.1.43 「--depend_system_headers, --no_depend_system_headers」 「--depend_target=target」 (ページ 2-48) 「--ignore_missing_headers」 (ページ 2-80) 「-M」 (ページ 2-99) 「--md」 (ページ 2-100) 「--phony_targets」 (ページ 2-116) --depend_system_headers, --no_depend_system_headers こ のオプシ ョ ン を使用す る と 、 -M オプシ ョ ン ま たは --md オプシ ョ ン を使用 し て メ ー ク フ ァ イ ルの依存関係情報を生成す る 際に、 シ ス テ ム の出力に依存関 係行を含め る か ど う か を指定で き ます。 デ フ ォル ト デフ ォ ル ト は --depend_system_headers です。 例 /* hello.c */ #include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; } オプシ ョ ン -M を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 以下の コ ー ド が生 成 さ れ ます。 __image.axf: hello.c __image.axf: ...\include\...\stdio.h オプシ ョ ン -M --no_depend_system_headers を使用 し て こ の コ ー ド を コ ンパ イ ル す る と 、 以下の コ ー ド が生成 さ れ ます。 __image.axf: hello.c ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-47 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--depend=filename」 (ページ 2-44) • • • • • • 2.1.44 「--depend_format=string」 (ページ 2-45) 「--depend_target=target」 「--ignore_missing_headers」 (ページ 2-80) 「-M」 (ページ 2-99) 「--md」 (ページ 2-100) 「--phony_targets」 (ページ 2-116) --depend_target=target こ のオプシ ョ ンは タ ーゲ ッ ト を メ ー ク フ ァ イ ル依存関係の生成に設定 し ます。 使用法 こ のオプシ ョ ン を使用 し て、 デフ ォ ル ト の タ ーゲ ッ ト を オーバー ラ イ ド し ま す。 制限 こ のオプシ ョ ンは GCC の -MT に似てい ますが、 複数の タ ーゲ ッ ト を指定す る と き の動作が異な り ます。 例えば、gcc -M -MT target1 -MT target2 file.c に よ っ て target1 target2: file.c header.h の結果が得 ら れ ますが、 --depend_target=target1 --depend_target=target2 は target2 を タ ーゲ ッ ト と し て 扱い ます。 関連項目 • 「--depend=filename」 (ページ 2-44) • • 「--depend_format=string」 (ページ 2-45) 「--depend_system_headers, --no_depend_system_headers」 (ページ 2-47) • • • • 2-48 「--ignore_missing_headers」 (ページ 2-80) 「-M」 (ページ 2-99) 「--md」 (ページ 2-100) 「--phony_targets」 (ページ 2-116) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.45 --device=list こ のオプシ ョ ン を使用す る と 、--device=name オプシ ョ ン と 一緒に使用可能なサ ポー ト さ れてい る デバ イ ス名が一覧にな り ます。 関連項目 • 2.1.46 「--device=name」 --device=name こ のオプシ ョ ンに よ り 、 特定のマ イ ク ロ コ ン ト ロ ー ラ ま たは SoC (System-on-Chip) デバ イ ス の コ ー ド を コ ンパ イ ルで き ます。 構文 --device=name 各パ ラ メ ー タ には以下の意味があ り ます。 タ ーゲ ッ ト マ イ ク ロ コ ン ト ロ ー ラ ま たは SoC デバ イ ス の名前で す。 name 使用法 特定のデバ イ ス名を指定す る と 、 そのデバ イ ス が対応す る CPU か ら デフ ォ ル ト のエ ンデ ィ ア ン方式 と 浮動小数点アーキ テ ク チ ャ を継承 し ます。 --bi、--li、 お よ び --fpu の各オプシ ョ ン を使用す る と 、 エ ンデ ィ ア ン方式 と タ ーゲ ッ ト 浮 動小数点アーキ テ ク チ ャ のデフ ォ ル ト 設定を変更で き ます。 関連項目 • 「--bigend」 (ページ 2-19) • • • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--device=list」 「--fpu=name」 (ページ 2-70) 「--littleend」 (ページ 2-95) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--device=list」 (ページ 2-16) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--device=name」 (ページ 2-16) 『アセ ンブ ラ ガ イ ド 』 の 「C プ リ プ ロ セ ッ サを使用す る」 (ページ 3-51) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-49 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.47 --diag_error=tag[,tag,...] こ のオプシ ョ ン を使用 し て、 指定 さ れた タ グ を持つ診断 メ ッ セージにエ ラ ー の重大度を設定 し ます。 注 こ のオプシ ョ ン には #pragma と 同等の #pragma diag_error があ り ます。 構文 --diag_error=tag[,tag,...] 各パ ラ メ ー タ には以下の意味があ り ます。 tag[,tag,...] 重大度を変更す る メ ッ セージ を指定す る 診断 メ ッ セージの 番号を コ ン マで区切っ た リ ス ト です。 少な く と も 1 つの診断 メ ッ セージ を指定す る 必要があ り ま す。 複数の診断 メ ッ セージの番号を指定す る 場合は、 リ ス ト の コ ン マ と 番号の間に スペース を入れないで下 さ い。 使用法 以下の タ イ プの診断 メ ッ セージの重大度は変更可能です。 • 番号の形式が #nnnn-D の メ ッ セージ。 • 番号の形式が CnnnnW の警告 メ ッ セージ。 関連項目 「--diag_remark=tag[,tag,... ]」 (ページ 2-51) • • • • • 「--diag_suppress=tag[,tag,...]」 (ページ 2-53) 「--diag_warning=tag[,tag,...]」 (ページ 2-54) 「#pragma diag_error tag[,tag,...]」 (ページ 4-66) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「診断 メ ッ セージの重大度の変更」 (ページ 6-6) 2-50 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.48 --diag_remark=tag[,tag,...] こ のオプシ ョ ン を使用 し て、 指定 さ れた タ グ を含む診断 メ ッ セージの重大度 を注釈に設定で き ます。 --diag_remark オプシ ョ ンの動作は、 コ ンパ イ ラ が指定 さ れた タ グ を含む診断 メ ッ セージの重大度を エ ラ ーではな く 、 注釈に設定す る 点を除いて、 --diag_errors に似てい ます。 注 デフ ォ ル ト では、 注釈は表示 さ れ ません。 注釈 メ ッ セージ を表示す る には、 コ ンパ イ ラ オプシ ョ ン --remarks を使用 し て下 さ い。 注 こ のオプシ ョ ンには #pragma と 同等の #pragma diag_remark があ り ます。 構文 --diag_remark=tag[,tag,...] 各パ ラ メ ー タ には以下の意味があ り ます。 tag[,tag,...] 重大度を変更す る メ ッ セージ を指定す る 診断 メ ッ セージの 番号を コ ン マで区切っ た リ ス ト です。 関連項目 • 「--diag_error=tag[,tag,...]」 (ページ 2-50) • • • • • 「--diag_suppress=tag[,tag,...]」 (ページ 2-53) 「--diag_warning=tag[,tag,...]」 (ページ 2-54) 「--remarks」 (ページ 2-124) 「#pragma diag_remark tag[,tag,...]」 (ページ 4-67) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「診断 メ ッ セージの重大度の変更」 (ページ 6-6) ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-51 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.49 --diag_style={arm|ide|gnu} こ のオプシ ョ ン を使用す る と 、 診断 メ ッ セージの表示に使用す る 形式を指定 で き ます。 構文 --diag_style=string string には以下のいずれか を指定で き ます。 arm ARM コ ンパ イ ラ の形式を使用 し て メ ッ セージ を表示 し ます。 ide エ ラ ーのあ る 行の行番号 と 文字数を表示 し ます。 こ れ ら の値は括 弧に囲ま れて表示 さ れます。 gnu gcc で使用 さ れ る 形式で メ ッ セージ を表示 し ます。 デフ ォル ト --diag_style オプシ ョ ン を指定 し ない場合は、--diag_style=arm が想定 さ れ ます。 使用法 オプシ ョ ン --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,...]」 (ページ 2-50) • • • • • 「--diag_remark=tag[,tag,... ]」 (ページ 2-51) 「--diag_suppress=tag[,tag,...]」 (ページ 2-53) 「--diag_warning=tag[,tag,...]」 (ページ 2-54) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「診断 メ ッ セージの重大度の変更」 (ページ 6-6) 2-52 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.50 --diag_suppress=tag[,tag,...] こ のオプシ ョ ン を指定す る と 、 指定 さ れた タ グの診断 メ ッ セージが無効にな り ます。 --diag_suppress オプシ ョ ンの動作は、 コ ンパ イ ラ が指定 さ れた タ グ を含む診 断 メ ッ セージの重大度を エ ラ ーに設定す る のではな く 、 非表示にす る 点を除 いて、 --diag_errors に似てい ます。 注 こ のオプシ ョ ンには #pragma と 同等の #pragma diag_suppress があ り ます。 構文 --diag_suppress=tag[,tag,...] 各パ ラ メ ー タ には以下の意味があ り ます。 tag[,tag,...] 非表示にす る メ ッ セージ を指定す る 診断 メ ッ セージの番号 を コ ン マで区切っ た リ ス ト です。 関連項目 • 「--diag_error=tag[,tag,...]」 (ページ 2-50) • • • • 「--diag_remark=tag[,tag,... ]」 (ページ 2-51) 「--diag_warning=tag[,tag,...]」 (ページ 2-54) 「#pragma diag_suppress tag[,tag,...]」 (ページ 4-68) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「診断 メ ッ セージの非表示」 (ページ 6-7) 2.1.51 --diag_suppress=optimizations こ のオプシ ョ ンは、 ハ イ レベルの最適化に関す る 診断 メ ッ セージ を非表示に し ます。 デ フ ォル ト デフ ォ ル ト では、 最適化 メ ッ セージの重大度は注釈にな っ てい ます。 --diag_suppress=optimizations を指定す る と 、 最適化 メ ッ セージが非表示にな り ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-53 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 注 重大度が注釈の最適化 メ ッ セージ を表示す る には、 --remarks オプシ ョ ン を使 用 し ます。 使用法 コ ンパ イ ラ は、 ループの展開な ど最適化レベル -O3 での コ ンパ イ ル時に特定 のハ イ レベルベ ク タ お よ びス カ ラ の最適化を実行 し ます。 こ のオプシ ョ ン を 使用 し て、 こ れ ら のハ イ レベルの最適化に関す る 診断 メ ッ セージ を非表示に し ます。 例 int factorial(int n) { int result=1; while (n > 0) result *= n--; return result; } -O3 -Otime --remarks --diag_suppress=optimizations オプシ ョ ン を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 最適化 メ ッ セージは表示 さ れ ません。 関連項目 • 「--diag_suppress=tag[,tag,...]」 (ページ 2-53) • • • • 2.1.52 「--diag_warning=optimizations」 (ページ 2-55) 「-Onum」 (ページ 2-108) 「-Otime」 (ページ 2-111) 「--remarks」 (ページ 2-124) --diag_warning=tag[,tag,...] こ のオプシ ョ ン を使用 し て、 指定 さ れた タ グ を含む診断 メ ッ セージの重大度 を警告に設定で き ます。 --diag_warning オプシ ョ ンの動作は、 コ ンパ イ ラ が指定 さ れた タ グ を含む診断 メ ッ セージの重大度を エ ラ ーではな く 、 警告に設定す る 点を除いて、 --diag_errors に似てい ます。 2-54 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 注 こ のオプシ ョ ンには #pragma と 同等の #pragma diag_warning があ り ます。 構文 --diag_warning=tag[,tag,...] 各パ ラ メ ー タ には以下の意味があ り ます。 tag[,tag,...] 重大度を変更す る メ ッ セージ を指定す る 診断 メ ッ セージの 番号を コ ン マで区切っ た リ ス ト です。 関連項目 • 「--diag_error=tag[,tag,...]」 (ページ 2-50) • • • • 「--diag_remark=tag[,tag,... ]」 (ページ 2-51) 「--diag_suppress=tag[,tag,...]」 (ページ 2-53) 「#pragma diag_warning tag[, tag, ...]」 (ページ 4-68) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「診断 メ ッ セージの重大度の変更」 (ページ 6-6) 2.1.53 --diag_warning=optimizations こ のオプシ ョ ンは、 ハ イ レベルの最適化診断 メ ッ セージに警告の重大度を設 定 し ます。 デ フ ォル ト デフ ォ ル ト では、 最適化 メ ッ セージの重大度は注釈にな っ てい ます。 使用法 コ ンパ イ ラ は、 ループの展開な ど最適化レベル -O3 -Otime での コ ンパ イ ル時に 特定のハ イ レベルベ ク タ お よ びス カ ラ の最適化を実行 し ます。 こ のオプシ ョ ン を使用 し て、 こ れ ら のハ イ レベルの最適化に関す る 診断 メ ッ セージ を表示 し ます。 例 int factorial(int n) { int result=1; ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-55 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン while (n > 0) result *= n--; return result; } --vectorize --cpu=Cortex-A8 -O3 -Otime --diag_warning=optimizations オプシ ョ ン を 使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 最適化の警告 メ ッ セージが表示 さ れ ます。 関連項目 • 「--diag_suppress=optimizations」 (ページ 2-53) • • • 2.1.54 「--diag_warning=tag[,tag,...]」 (ページ 2-54) 「-Onum」 (ページ 2-108) 「-Otime」 (ページ 2-111) --dllexport_all, --no_dllexport_all こ のオプシ ョ ン を使用す る と 、 DLL の作成時にシ ン ボルを表示す る か ど う か を制御で き ます。 デフ ォル ト デフ ォ ル ト は --no_dllexport_all です。 使用法 オプシ ョ ン --dllexport_all は、 すべての extern 定義を __declspec(dllexport) と し てマー ク す る と き に使用 し ます。 関連項目 • 「--apcs=qualifer...qualifier」 (ページ 2-4) • 2.1.55 「__declspec(dllexport)」 (ページ 4-27) --dllimport_runtime, --no_dllimport_runtime こ のオプシ ョ ン を使用す る と 、 ラ ン タ イ ム ラ イ ブ ラ リ を共有 ラ イ ブ ラ リ と し て使用 し た と き にシ ン ボルを表示す る か ど う か を制御で き ます。 デフ ォル ト デフ ォ ル ト は --no_dllimport_runtime です。 2-56 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 使用法 以下を マー ク す る と き は、 オプシ ョ ン --dllimport_runtime を使用 し ます。 • すべての組み込みシ ン ボルを __declspec(dllimport) と し てマー ク す る と き • cpprt ラ ン タ イ ム ラ イ ブ ラ リ で イ ン ポー ト 用に生成 さ れた ラ ン タ イ ム型 情報 (RTTI) • 最適化 さ れた printf() 関数 と __hardfp_ 関数を イ ン ポー ト 対象 と し て マー ク す る と き (元の関数が __declspec(dllimport) と し てマー ク さ れて い る 場合) 関連項目 • 「--guiding_decls, --no_guiding_decls」 (ページ 2-77) • • 2.1.56 「--rtti, --no_rtti」 (ページ 2-126) 「__declspec(dllimport)」 (ページ 4-30) --dollar, --no_dollar こ のオプシ ョ ンは、 識別子での ド ル記号 $ の使用を許可ま たは拒否す る よ う に コ ンパ イ ラ に指示 し ます。 デ フ ォル ト オプシ ョ ン --strict が指定 さ れていない限 り 、 デフ ォ ル ト は --dollar です。 オプシ ョ ン --strict が指定 さ れてい る 場合、 デフ ォ ル ト は --no_dollar にな り ます。 関連項目 • 「識別子内の ド ル記号」 (ページ 3-14) • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--strict, --no_strict」 (ページ 2-133) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-57 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.57 --dwarf2 こ のオプシ ョ ンは、 DWARF 2 デバ ッ グ テーブル形式を使用す る よ う に コ ンパ イ ラ に指示 し ます。 デフ ォル ト --dwarf2 を明示的に指定 し なか っ た場合、 --dwarf3 が指定 さ れた と き と 同 じ 処 理を実行 し ます。 関連項目 • 「--dwarf3」 2.1.58 --dwarf3 こ のオプシ ョ ンは、 DWARF 3 デバ ッ グ テーブル形式を使用す る よ う に コ ンパ イ ラ に指示 し ます。 デフ ォル ト --dwarf2 を明示的に指定 し なか っ た場合、 --dwarf3 が指定 さ れた と き と 同 じ 処 理を実行 し ます。 関連項目 • 「--dwarf2」 2.1.59 -E こ のオプシ ョ ンは、 プ リ プ ロ セ ッ サの処理のみを実行す る よ う に コ ンパ イ ラ に指示 し ます。 デフ ォ ル ト では、 プ リ プ ロ セ ッ サか ら の出力は標準出力ス ト リ ームに送信 さ れ、 標準の UNIX ま たは MS-DOS の指定方法を使用 し て フ ァ イ ルに転送で き ます。 -o オプシ ョ ン を使用 し て、 前処理済み出力用の フ ァ イ ルを指定す る こ と も で き ます。 デフ ォ ル ト では、 コ メ ン ト は出力か ら 除外 さ れ ます。 プ リ プ ロ セ ッ サ は、 任意の拡張子 (.o, .s、 .txt な ど) が付いた ソ ース フ ァ イ ルを処理で き ま す。 2-58 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 例 armcc -E source.c > raw.c 関連項目 • 「-C」 (ページ 2-25) • 2.1.60 「-o filename」 (ページ 2-106) --emit_frame_directives, --no_emit_frame_directives こ のオプシ ョ ンは、 DWARF FRAME デ ィ レ ク テ ィ ブ を逆アセ ン ブ リ 出力に配置 す る よ う コ ンパ イ ラ に指示 し ます。 デ フ ォル ト デフ ォ ル ト は --no_emit_frame_directives です。 例 armcc --asm --emit_frame_directives foo.c armcc -S emit_frame_directives foo.c 関連項目 • 「--asm」 (ページ 2-17) • • 「-S」 (ページ 2-127) 『アセ ンブ ラ ガ イ ド 』 の 「フ レームデ ィ レ ク テ ィ ブの使用」 (ページ 2-56) 2.1.61 --enum_is_int こ のオプシ ョ ン を使用す る と 、 すべての列挙型のサ イ ズ を 4 バ イ ト 以上にす る こ と がで き ます。 こ のオプシ ョ ンは、 デフ ォ ル ト では無効にな っ てお り 、 すべての列挙子の値 を保持で き る 最小のデー タ 型が使用 さ れ ます。 ARM Linux コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを コ マ ン ド ラ イ ン で指定 し た場 合、 こ のオプシ ョ ンはデフ ォ ル ト でオ ン にな り ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-59 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 注 --enum_is_int オプシ ョ ン を一般的な用途に使用す る こ と はお勧め し ません。 関連項目 • 「--arm_linux_config_file=path」 (ページ 2-12) • • 2.1.62 「--arm_linux_configure」 (ページ 2-13) 「--interface_enums_are_32_bit」 (ページ 2-83) --errors=filename こ のオプシ ョ ン を使用す る と 、 診断 メ ッ セージの出力を、 stderr か ら 指定 さ れたエ ラ ーフ ァ イ ルに転送で き ます。 構文 --errors=filename 各パ ラ メ ー タ には以下の意味があ り ます。 filename エ ラ ーが転送 さ れ る フ ァ イ ルの名前です。 間違っ たオプシ ョ ン名を入力 し た場合な ど、 コ マ ン ド オプシ ョ ン の問題に関 連す る 診断は転送 さ れません。 ただ し 、 オプシ ョ ン に無効な引数を指定 し た 場合 (--cpu=999 な ど)、 関連す る 診断は指定 さ れた フ ァ イ ル filename に転送 さ れ ます。 関連項目 「--brief_diagnostics, --no_brief_diagnostics」 (ページ • 2-21) • • • • • • • • • 2-60 「--diag_error=tag[,tag,...]」 (ページ 2-50) 「--diag_remark=tag[,tag,... ]」 (ページ 2-51) 「--diag_style={arm|ide|gnu}」 (ページ 2-52) 「--diag_suppress=tag[,tag,...]」 (ページ 2-53) 「--diag_warning=tag[,tag,...]」 (ページ 2-54) 「--remarks」 (ページ 2-124) 「-W」 (ページ 2-149) 「--wrap_diagnostics, --no_wrap_diagnostics」 (ページ 2-153) 『コ ンパ イ ラ ユーザガ イ ド 』 の第 6 章 診断 メ ッ セージ Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.63 --exceptions, --no_exceptions こ のオプシ ョ ン を使用す る と 、 例外処理を有効ま たは無効にで き ます。 C++ では、 --exceptions オプシ ョ ン を使用す る と throw と try/catch の使用が有 効にな り 、 関数の例外を指定で き 、 コ ンパ イ ラ は実行時に例外の伝播を サ ポー ト す る ために unwind テーブルを生成 し ます。 C++ では、 --no_exceptions オプシ ョ ン が指定 さ れてい る 場合、 ソ ース コ ー ド で throw と try/catch を使用す る こ と はで き ません。 指定 さ れた関数の例外は解析 さ れ ますが、 それ ら のほ と ん どは無視 さ れ ます。 C では、 --no_exceptions を使用 し て コ ンパ イ ル さ れた コ ー ド の動作は、 コ ンパ イ ル さ れた関数に よ っ て例外が ス ロ ー さ れた場合、 定義 さ れません。 C 関数に 例外を適切に伝播す る には、 --exceptions を使用す る 必要があ り ます。 デ フ ォル ト デフ ォ ル ト は --no_exceptions です。 ただ し 、ARM Linux コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを コ マ ン ド ラ イ ン で指定 し て、 --translate_g++ を使用 し た場合、 デ フ ォ ル ト は --exceptions にな り ます。 関連項目 「--arm_linux_config_file=path」 (ページ 2-12) • • • 2.1.64 「--arm_linux_configure」 (ページ 2-13) 「--exceptions_unwind, --no_exceptions_unwind」 --exceptions_unwind, --no_exceptions_unwind こ のオプシ ョ ン を指定す る と 、 例外に対応 し た コ ー ド に対 し て関数の展開を 有効ま たは無効にで き ます。 こ のオプシ ョ ンは、 --exceptions が有効な場合に のみ有効です。 --no_exceptions_unwind お よ び --exceptions を使用す る と 、 例外は、 コ ンパ イ ル さ れた関数に伝播 さ れ ません。 代わ り に、 std::terminate が呼び出 さ れ ます。 デ フ ォル ト デフ ォ ル ト は --exceptions_unwind です。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-61 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--exceptions, --no_exceptions」 (ページ 2-61) • 2.1.65 「実行時に展開 さ れ る関数」 (ページ 5-21) --export_all_vtbl, --no_export_all_vtbl こ のオプシ ョ ン を使用す る と 、 動的シ ン ボルのエ ク ス ポー ト 方法を C++ で制 御で き ます。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デフ ォル ト デフ ォ ル ト は --no_export_all_vtbl です。 使用法 オプシ ョ ン export_all_vtbl を使用す る と 、 すべての仮想関数テーブルお よ び キー関数が含ま れた ク ラ ス の RTTI がエ ク ス ポー ト さ れ ます。 キー関数は、 ク ラ ス で最初に宣言 さ れてい る 仮想関数であ り 、 イ ン ラ イ ン関数ではな く 、 純 仮想関数で も あ り ません。 注 __declspec(notshared) を使用す る こ と に よ り 、 特定の ク ラ ス のエ ク ス ポー ト を 無効にす る こ と がで き ます。 関連項目 • 「__declspec(notshared)」 (ページ 4-33) 2.1.66 --export_defs_implicitly, --no_export_defs_implicitly こ のオプシ ョ ン を使用す る と 、 動的シ ン ボルのエ ク ス ポー ト 方法を制御で き ます。 デフ ォル ト デフ ォ ル ト は --no_export_defs_implicitly です。 2-62 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 使用法 オプシ ョ ン --export_defs_implicitly を使用す る と 、 __declspec(dllimport) が指 定 さ れたプ ロ ト タ イ プの定義がエ ク ス ポー ト さ れます。 関連項目 • 「__declspec(dllimport)」 (ページ 4-30) 2.1.67 --extended_initializers, --no_extended_initializers こ れ ら のオプシ ョ ン を使用す る と 、--strict ま たは --strict_warnings で コ ンパ イ ルす る 場合で も 、 拡張定数 イ ニ シ ャ ラ イ ザの使用を有効ま たは無効にで き ます。 整数型へのア ド レ ス のキ ャ ス ト な ど、 移植性がない も のの、 広 く サポー ト さ れてい る 特定の定数 イ ニシ ャ ラ イ ザを使用す る と 、--extended_initializers に よ っ て、 式に定数値を含め る 必要があ る か、 ま たは式が算術型であ る 必要が あ る こ と を示す特定のエ ラ ーではな く 、 厳密モー ド 以外のモー ド で通常生成 さ れ る 定数 イ ニシ ャ ラ イ ザに関す る 同一の一般的な警告が生成 さ れ ます。 デ フ ォル ト --strict ま たは --strict_warnings を指定 し て コ ンパ イ ルす る 場合、 デフ ォ ル ト は --no_extended_initializers です。 厳密モー ド 以外のモー ド で コ ンパ イ ルす る 場合、 デフ ォ ル ト は --extended_initializers です。 関連項目 「--strict, --no_strict」 (ページ 2-133) • • • 2.1.68 「--strict_warnings」 (ページ 2-134) 「定数式」 (ページ 3-10) --feedback=filename こ のオプシ ョ ン を使用す る と 、 未使用の関数を効率的に削除で き る だけでな く 、 ARMv4T アーキ テ ク チ ャ では、 イ ン タ ー ワー ク に必要な コ ンパ イ ルを削 減す る こ と も で き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-63 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 構文 --feedback=filename 各パ ラ メ ー タ には以下の意味があ り ます。 filename ARM リ ン カの前回の実行で作成 さ れた フ ィ ー ド バ ッ ク フ ァ イ ル です。 使用法 同 じ フ ィ ー ド バ ッ ク フ ァ イ ルを使用 し て コ ンパ イ ルを複数回実行で き ます。 コ ンパ イ ラ に よ っ て、 フ ィ ー ド バ ッ ク フ ァ イ ルで特定 さ れた未使用の関数は、 対応す る オブジ ェ ク ト フ ァ イ ル内の各関数独自の ELF セ ク シ ョ ン に配置 さ れ ます。 フ ィ ー ド バ ッ ク フ ァ イ ルには、 前回の ビル ド に関す る 情報が含ま れてい ます。 その理由は以下の と お り です。 • フ ィ ー ド バ ッ ク フ ァ イ ルは、 情報が古い場合があ り ます。 例えば、 未使 用であ る と 識別 さ れた関数が現在の ソ ース コ ー ド で使用 さ れてい る 場合 があ り ます。 未使用の関数の コ ー ド は、 現在の ソ ース コ ー ド で使用 さ れ ていない場合のみ、 リ ン カに よ っ て削除 さ れます。 注 • 2-64 — こ のため、 リ ン カ フ ィ ー ド バ ッ ク を使用 し て未使用の関数を削除 す る こ と は安全な最適化ですが、 コ ー ド サ イ ズにはあ ま り 影響を 及ぼ さ ない場合があ り ます。 — イ ン タ ー ワー ク に必要な コ ンパ イ ルを削減す る 場合の使用要件は、 未使用の関数を削除す る 場合の要件 よ り 厳格です。 イ ン タ ー ワー ク に必要な コ ンパ イ ルを削減す る 場合は、 フ ィ ー ド バ ッ ク フ ァ イ ル を その生成元であ る ソ ース コ ー ド に合わせて、 常に最新の状態に 保つ こ と が重要 と な り ます。 リ ン カの フ ィ ー ド バ ッ ク を最大限に活用す る には、 完全な コ ンパ イ ル と リ ン ク を 2 回以上実行す る 必要があ り ます。 ただ し 、 通常は、 前回の ビ ル ド 時の フ ィ ー ド バ ッ ク を使用 し て 1 回 コ ンパ イ ル し て リ ン ク すれば十 分です。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--split_sections」 (ページ 2-131) • 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--feedback_type=type」 (ペー ジ 2-25) • 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「 リ ン カの フ ィ ー ド バ ッ ク の使用」 (ページ 2-30) 2.1.69 --force_new_nothrow, --no_force_new_nothrow こ のオプシ ョ ン を使用す る と 、 new 式の動作を C++ で制御で き ます。 C++ 標準で、 エ ラ ーの発生時に NULL を返すために使用で き る オプシ ョ ン と し て指定 さ れてい る のは no throw operator new のみで、throw() で宣言 さ れてい ま す。 他の operator new を使用 し て NULL を返す こ と はで き ません。 ま た、 デフ ォ ル ト の operator new を使用す る と 、 エ ラ ーの発生時に例外が ス ロ ー さ れます。 --force_new_nothrow を使用す る と 、 コ ンパ イ ラ はグ ロ ーバルの ::operator new や ::operator new[] を使用す る new T(...args...) な ど の式を、new (std::nothrow) T(...args...) と 同 じ よ う に処理 し ます。 ま た --force_new_nothrow を使用す る と 、 ク ラ ス固有の operator new や、 オー バー ロ ー ド し た グ ロ ーバルの operator new が、 no throw と し て処理 さ れます。 注 オプシ ョ ン --force_new_nothrow は、 C++ 標準に準拠 し ていない従来の ソ ース コ ー ド を移行す る 目的でのみ提供 さ れてい ます。 他の目的で こ のオプシ ョ ン を使用す る こ と はお勧め し ません。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デ フ ォル ト デフ ォ ル ト は --no_force_new_nothrow です。 例 struct S { void* operator new(std::size_t); ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-65 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン void* operator new[](std::size_t); }; void *operator new(std::size_t, int); --force_new_nothrow オプシ ョ ンが有効な場合、 上記の コ ー ド は以下の コ ー ド と し て処理 さ れ ます。 struct S { void* operator new(std::size_t) throw(); void* operator new[](std::size_t) throw(); }; void *operator new(std::size_t, int) throw(); 関連項目 • 「::operator new 関数の使用」 (ページ 5-15) 2.1.70 --forceinline こ のオプシ ョ ン を使用す る と 、 すべての イ ン ラ イ ン関数が __forceinline で修 飾 さ れてい る かの よ う に処理 さ れ ます。 イ ン ラ イ ン関数 と は、 inline ま たは __inline で修飾 さ れてい る 関数の こ と で す。 C++ では、 構造体、 ク ラ ス、 ま たは共用体の定義内で定義 さ れてい る 関 数を イ ン ラ イ ン関数 と 呼びます。 --forceinline を使用す る と 、 それに よ っ てマー ク さ れた関数の イ ン ラ イ ン展 開が常に試行 さ れます。 ただ し 、 問題が発生す る 場合、 コ ンパ イ ラ は関数を イ ン ラ イ ン関数化 し ません。 例えば、 再帰関数は一度 し か イ ン ラ イ ン展開で き ません。 関連項目 • 「--autoinline, --no_autoinline」 (ページ 2-19) • • • • 2-66 「--inline, --no_inline」 (ページ 2-83) 「__forceinline」 (ページ 4-7) 「__inline」 (ページ 4-10) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「 イ ン ラ イ ン展開の管理」 (ページ 5-22) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.71 --fp16_format=format こ のオプシ ョ ン を使用す る と 、 半精度浮動小数点数を VFPv3 アーキ テ ク チ ャ のオプシ ョ ン の拡張機能 と し て使用で き ます。 形式が指定 さ れていない場合 は、 __fp16 デー タ 型を使用す る と エ ラ ーにな り ます。 構文 --fp16_format=format format には以下のいずれか を指定で き ます。 alternative 範囲は拡大 さ れ ますが、 NaN 値や無限大値は持たない ieee の代 替です。 ieee IEEE 754 標準の リ ビ ジ ョ ン であ る IEEE 754r に よ っ て定義 さ れ た、 半精度 2 進浮動小数点形式です。 こ れがデフ ォ ル ト の設定です。 形式を指定 し ない こ と に相当 し 、 none __fp16 デー タ 型を使用す る と エ ラ ーにな る こ と を意味 し ます。 関連項目 • • 「コ ンパ イ ラ 組み込み関数」 (ページ E-5) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「半精度浮動小数点数のサポー ト 」 (ページ 5-41) 2.1.72 --fpmode=model こ のオプシ ョ ン を使用 し て、 浮動小数点適合性を指定 し 、 ラ イ ブ ラ リ の属性 と 浮動小数点の最適化を設定で き ます。 構文 --fpmode=model model は以下のいずれかです。 ieee_full IEEE 標準で保証 さ れてい る すべての機能、 演算、 お よ び表現を、 単精度お よ び倍精度で使用で き ます。 演算モー ド は、 実行時に動 的に選択で き ます。 こ のオプシ ョ ン では以下のシ ン ボルが定義 さ れ ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-67 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン __FP_IEEE __FP_FENV_EXCEPTIONS __FP_FENV_ROUNDING __FP_INEXACT_EXCEPTION ieee_fixed 最 も 近い値に丸め、 不正確な例外の発生を報告 し ない IEEE 標 準。 こ のオプシ ョ ン では以下のシ ン ボルが定義 さ れます。 __FP_IEEE __FP_FENV_EXCEPTIONS ieee_no_fenv 最 も 近い値に丸め、 例外を発生 さ せない IEEE 標準。 こ のモー ド は ス テー ト レ ス であ り 、 Java の浮動小数点算術モデル と 互換性 があ り ます。 こ のオプシ ョ ン ではシ ン ボル __FP_IEEE が定義 さ れ ます。 std 0 に フ ラ ッ シ ュ さ れ る 非正規化数があ り 、 最 も 近い値に丸め、 例 外の発生を報告 し ない IEEE 有限値。 標準 C お よ び C++ と の互換 性があ り ます。 こ れがデフ ォ ル ト です。 通常の有限値は、 IEEE 標準に よ っ て予測 さ れます。 ただ し 、 以 下の よ う な例外 も あ り ます。 fast • IEEE モデルに よ っ て定義 さ れてい る すべての状況で NaN と 無限値が生成 さ れ る と は限 り ません。 ま た、 それ ら が生 成 さ れ る 場合、 異な る 符号が使用 さ れ る 可能性があ り ます。 • 0 の符号は IEEE モデルに よ っ て予測 さ れ る 符号 と 異な る 可 能性があ り ます。 強力な浮動小数点の最適化を実行 し ます。 大幅なパフ ォーマ ン ス向上 と 引 き 換えに、 精度がやや落ち る 可能性があ り ます。 こ の オプシ ョ ン ではシ ン ボル __FP_FAST が定義 さ れます。 こ のオプシ ョ ン を選択す る と 、 ISO C お よ び C++ 標準には完全に 準拠 し ない動作 と な り ます。 ただ し 、 数値的に頑健な浮動小数点 プ ロ グ ラ ムは正 し く 動作 し ます。 以下の よ う な多 く の変換が実行 さ れ る 場合があ り ます。 • 2-68 すべての浮動小数点引数を単精度数値 と し て正確に表現で き 、 その結果が即座に単精度数値に変換 さ れ る 場合、 倍精 度数学関数は単精度数学関数に変換 さ れ る 可能性があ り ま す。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン こ の変換は、 選択 し た ラ イ ブ ラ リ に単精度数学関数が含ま れてい る 場合 (選択 し た ラ イ ブ ラ リ が rvct や aeabi_glibc で あ る 場合) にのみ実行 さ れます。 以下に例を示 し ます。 float f(float a) { return sqrt(a); } 上記の コ ー ド が以下の コ ー ド に変換 さ れます。 float f(float a) { return sqrtf(a); }. • 倍精度か ら 単精度に変換 さ れた浮動小数点式は、 必要に応 じ て単精度で評価 さ れます。 例えば、 float y = (float)(x + 1.0) は float y = (float)x + 1.0f と し て評価 さ れ ます。 • 浮動小数点定数に よ る 除算は、 逆数を使用 し た乗算に置 き 換え ら れ ます。 例えば、x / 3.0 は x * (1.0 / 3.0) と し て評価 さ れ ます。 • 数学関数が呼び出 さ れた後、 errno の値が ISO C ま たは C++ 標準に準拠す る と は限 り ません。 こ のため、 コ ンパ イ ラ は sqrt() ま たは sqrtf() を呼び出す代わ り に、 VFP 平方根命令 を イ ン ラ イ ン展開で き ます。 注 VFP を有効にす る ために、 初期化 コ ー ド が必要 と な る 場合があ り ます。 詳細 については、 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「VFP サポー ト 」 (ページ 5-39) を参照 し て下 さ い。 関連項目 • install_directory\RVDS\Examples\...\vfpsupport にあ る 『ARM Application Note 133 - Using VFP with RVDS』 2.1.73 --fpu=list こ のオプシ ョ ン を使用す る と 、--fpu=name オプシ ョ ン と 組み合わせて使用で き る 、 サポー ト さ れてい る FPU アーキ テ ク チ ャ 名が一覧表示 さ れ ます。 非推奨オプシ ョ ンは表示 さ れ ません。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-69 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--fpu=name」 2.1.74 --fpu=name こ のオプシ ョ ン を使用す る と 、 タ ーゲ ッ ト の FPU アーキ テ ク チ ャ を指定で き ます。 こ のオプシ ョ ン を指定 し た場合、 コ マ ン ド ラ イ ン の暗黙的な FPU オプシ ョ ン (--cpu オプシ ョ ン な ど を指定 し た場合な ど) がオーバー ラ イ ド さ れ ます。 FPU アーキ テ ク チ ャ がすべて記載 さ れた一覧を表示す る には、--fpu=list オプ シ ョ ン を使用 し ます。 構文 --fpu=name name には以下のいずれか を指定で き ます。 none 浮動小数点オプシ ョ ン が使用 さ れない こ と を示 し ます。 こ のオプ シ ョ ン を指定す る と 、 浮動小数点 コ ー ド は使用で き ません。 コ ー ド に float 型が含まれてい る と 、 エ ラ ーが生成 さ れ ます。 vfpv こ れは vfpv2 と 同 じ 意味です。 vfpv2 アーキ テ ク チ ャ VFPv2 に適合す る 、 ハー ド ウ ェ アのベ ク タ 浮動 小数点ユニ ッ ト を選択 し ます。 注 コ マ ン ド ラ イ ン で armcc --thumb --fpu=vfpv2 を指定す る と 、 コ ン パ イ ラ はで き る 限 り Thumb 命令セ ッ ト を使用 し て コ ー ド を コ ン パ イ ル し ますが、 浮動小数点に深 く 依存 し た関数は ARM コ ー ド に コ ンパ イ ル さ れます。 こ の場合、 事前定義 さ れた __thumb は無 効にな り ます。 ARM C コ ー ド において、vfp ま たは vfpv2 を --arm オプシ ョ ン と 組 み合わせて使用す る 場合には、 イ ン タ ー ワー ク す る ARM コ ー ド が コ ンパ イ ル さ れ ソ フ ト ウ ェ ア浮動小数点 リ ン ケージ を使用す る よ う に、 __softfp キーワ ー ド を指定す る 必要があ り ます。 2-70 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン vfpv3 アーキ テ ク チ ャ VFPv3 に適合す る 、 ハー ド ウ ェ アのベ ク タ 浮動 小数点ユニ ッ ト を選択 し ます。 VFPv3 は、 浮動小数点の例外を ト ラ ッ プで き ない点を除いて、 VFPv2 と 下位互換性があ り ます。 vpfv3 は RealView Development Suite 3.0 以降でのみ使用で き ます。 vfpv3_fp16 半精度拡張機能 も 備え た アーキ テ ク チ ャ VFPv3 互換のハー ド ウ ェ アのベ ク タ 浮動小数点ユニ ッ ト を選択 し ます。vfpv3_d16_fp16 は、 RealView Development Suite 4.0 以降でのみ使用で き ます。 vfpv3_d16 アーキ テ ク チ ャ VFPv3-D16 に適合す る 、 ハー ド ウ ェ アのベ ク タ 浮動小数点ユニ ッ ト を選択 し ます。 vfpv3_d16 は、 RealView Development Suite 4.0 以降でのみ使用で き ます。 vfpv3_d16_fp16 半精度拡張機能 も 備え た アーキ テ ク チ ャ VFPv3-D16 に適合す る 、 ハー ド ウ ェ アのベ ク タ 浮動小数点ユニ ッ ト を選択 し ます。 vfpv3_d16_fp16 は、 RealView Development Suite 4.0 以降でのみ使用 で き ます。 softvfp ソ フ ト ウ ェ アの浮動小数点 ラ イ ブ ラ リ fplib を選択 し ます。 --fpu オプシ ョ ン が指定 さ れていない場合、 ま たは FPU を備え ていな い CPU を選択 し た場合は、 こ れがデフ ォ ル ト にな り ます。 RVCT の以前の リ リ ース では、--fpu=softvfp と 暗黙的な VFP ハー ド ウ ェ ア を備え た CPU を指定 し た場合、 リ ン カは VFP 命令を使 用す る ソ フ ト ウ ェ ア浮動小数点呼び出 し を実装 し た ラ イ ブ ラ リ を選択 し てい ま し た。 現在は、 こ の動作は行われ ません。 こ の以 前の動作が必要な場合は、--fpu=softvfp+vfp を使用 し ます。 softvfp+vfpv2 VFPv2 命令を使用で き る ソ フ ト ウ ェ ア浮動小数点 リ ン ケージが 含まれた浮動小数点 ラ イ ブ ラ リ を選択 し ます。 VFP ユニ ッ ト を実 装す る シ ス テ ム で ARM コ ー ド を Thumb コ ー ド と イ ン タ ー ワ ー ク さ せ る 場合は、 こ のオプシ ョ ン を選択 し ます。 こ のオプシ ョ ン を設定 し た場合、 以下の よ う にな り ます。 • ARM DUI 0348BJ ID 1 0 0 4 1 9 --thumb オプシ ョ ン を使用 し て コ ンパ イ ルを実行す る と 、 VFP 命令を使用す る 浮動小数点 ラ イ ブ ラ リ に リ ン ク さ れ る 点を除 き 、--fpu=softvfp を指定 し た場合 と ま っ た く 同 じ よ う に動作 し ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-71 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • --arm オプシ ョ ン を使用 し て コ ンパ イ ルを実行す る と 、 すべ ての関数に ソ フ ト ウ ェ ア浮動小数点 リ ン ケージが用い ら れ る 点を除 き 、--fpu=vfpv2 を指定 し た場合 と 同 じ よ う に動作 し ます。 し たがっ て、 こ のオプシ ョ ン を使用 し て コ ンパ イ ル さ れた ARM 関数は、--fpu=softvfp を指定 し た場合 と 同 じ 方 法で浮動小数点引数 と 結果を受け渡 し ますが、 内部では VFP 命令が使用 さ れ ます。 注 C コ ー ド において、 softvfp+vfpv2 を --arm ま たは --thumb オプシ ョ ン と 組み合わせて使用す る と 、 イ ン タ ー ワー ク す る 浮動小数点 コ ー ド が ソ フ ト ウ ェ ア浮動小数点 リ ン ケージ を使用す る よ う に コ ンパ イ ル さ れ ます。 softvfp+vfpv3 VFPv3 アーキ テ ク チ ャ を タ ーゲ ッ ト にす る ソ フ ト ウ ェ ア浮動小 数点 リ ン ケージが含ま れた浮動小数点 ラ イ ブ ラ リ を選択 し ます。 VFPv3 ユニ ッ ト を実装す る シ ス テ ム で ARM コ ー ド を Thumb コ ー ド と イ ン タ ー ワ ー ク さ せ る 場合は、 こ のオプシ ョ ン を選択 し ます。 softvfp+vfpv3 は、 RealView Development Suite 3.0 以降で のみ使用で き ます。 softvfp+vfpv3_fp16 半精度浮動小数点拡張サポー ト に よ っ て VFPv3 アーキ テ ク チ ャ を タ ーゲ ッ ト にす る 、 ソ フ ト ウ ェ ア浮動小数点 リ ン ケージ付 き の浮動小数点 ラ イ ブ ラ リ を選択 し ます。 softvfp+vfpv3_fp16 は、 RealView Development Suite 4.0 以降でのみ使用で き ます。 softvfp+vfpv3_d16 VFPv3-D16 アーキ テ ク チ ャ を タ ーゲ ッ ト にす る 、 ソ フ ト ウ ェ ア 浮動小数点 リ ン ケージ付 き の浮動小数点 ラ イ ブ ラ リ を選択 し ま す。 softvfp+vfpv3_d16 は、 RealView Development Suite 4.0 以降での み使用で き ます。 softvfp+vfpv3_d16_fp16 半精度浮動小数点拡張サポー ト に よ っ て VFPv3-D16 アーキ テ ク チ ャ を タ ーゲ ッ ト にす る 、 ソ フ ト ウ ェ ア浮動小数点 リ ン ケージ 付 き の浮動小数点 ラ イ ブ ラ リ を選択 し ます。 softvfp+vfpv3_d16_fp16 は、 RealView Development Suite 4.0 以降で のみ使用で き ます。 2-72 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 制約条件 --fpu オプシ ョ ン を使用 し て明示的に選択 さ れた FPU は、 --cpu オプシ ョ ン を 使用 し て暗黙的に選択 さ れた FPU を常にオーバー ラ イ ド し ます。 例えば、 オ プシ ョ ン --cpu=ARM1136JF-S --fpu=softvfp は、 CPU の選択に よ っ て アーキ テ ク チ ャ VPFv2 の使用が暗黙的に示 さ れてい る 場合で も 、 ソ フ ト ウ ェ ア浮動小数 点 ラ イ ブ ラ リ fplib を使用す る コ ー ド を生成 し ます。 --cpu オプシ ョ ン を使用 し て FPU を暗黙的に指定 し た場合に、 --fpu を使用 し て明示的に選択 さ れた FPU と こ のオプシ ョ ン が互換 し ていない と 、 コ ンパ イ ラ に よ っ てエ ラ ーが生成 さ れます。 コ ンパ イ ラ は、 ス カ ラ 浮動小数点演算のみを生成 し ます。 VFP ベ ク タ 演算を 使用す る には、 アセ ン ブ リ コ ー ド を使用す る 必要があ り ます。 softvfp では NEON のサポー ト は無効にな っ てい ます。 デ フ ォル ト VFP コ プ ロ セ ッ サが存在す る 場合は、 VFP 命令が生成 さ れ ます。 VFP コ プ ロ セ ッ サがない場合は、 浮動小数点演算を実行す る ために、 ソ フ ト ウ ェ アの浮 動小数点 ラ イ ブ ラ リ fplib を呼び出す コ ー ド が生成 さ れ ます。 注 デフ ォ ル ト で、 プ ロ セ ッ サ ま たはアーキ テ ク チ ャ に何を選択す る かに よ っ て、 特定の浮動小数点ユニ ッ ト が暗黙的に選択 さ れ る こ と があ り ます。 例えば、 オプシ ョ ン --cpu ARM1136JF-S を選択す る と 、 オプシ ョ ン --fpu vfpv2 が暗黙的 に選択 さ れます。 関連項目 • 「--arm」 (ページ 2-9) • 「--cpu=name」 (ページ 2-35) • 「--thumb」 (ページ 2-135) • 「__softfp」 (ページ 4-17) • 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「浮動小数点の計算 と リ ン ケージ」 (ページ 5-43) • ARM DUI 0348BJ ID 1 0 0 4 1 9 『デベ ロ ッ パガ イ ド 』 の 「浮動小数点ビル ド オプシ ョ ン」 (ページ 2-5) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-73 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.75 --friend_injection, --no_friend_injection こ のオプシ ョ ン を使用す る と 、 friend 宣言を表示す る か ど う か を C++ で制御 で き ます。 C++ で こ れ ら のオプシ ョ ン を使用す る と 、 friend のみで宣言 さ れてい る ク ラ ス名ま たは関数名が、 通常のル ッ ク ア ッ プ メ カ ニ ズ ム を使用 し た と き に表示 さ れ る か ど う か を制御で き ます。 friend 名が宣言 さ れた場合、 それ ら は通常のル ッ ク ア ッ プ を使用 し た と き に 表示 さ れ ます。 friend 名が宣言 さ れなか っ た場合 (標準に準拠 し た場合)、 関 数名は引数依存ル ッ ク ア ッ プ を使用 し た と き のみ表示で き 、 ク ラ ス名は表示 で き ません。 注 オプシ ョ ン --friend_injection は、 C++ 標準に準拠 し ていない従来の ソ ース コ ー ド を移行す る 目的でのみ提供 さ れてい ます。 他の目的で こ のオプシ ョ ン を使用す る こ と はお勧め し ません。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デフ ォル ト デフ ォ ル ト は --no_friend_injection です。 関連項目 「friend」 (ページ 3-17) • 2.1.76 -g こ のオプシ ョ ン を使用す る と 、 現在の コ ンパ イ ル用のデバ ッ グ テーブルを生 成で き ます。 -g が使用 さ れてい る か ど う かにかかわ ら ず、 コ ンパ イ ラ は同 じ コ ー ド を生成 し ます。 違 う のはデバ ッ グ テーブルが存在す る こ と だけです。 -g を使用し て も 、 最適化の設定には影響し ません。 デフ ォル ト では、-g オプシ ョ ン を単独で使用する こ と は、 以下のオプシ ョ ン を指定する こ と と 同じ です。 -g --dwarf3 --debug_macros 2-74 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--debug, --no_debug」 (ページ 2-41) • • • • 2.1.77 「--debug_macros, --no_debug_macros」 (ページ 2-42) 「--dwarf2」 (ページ 2-58) 「--dwarf3」 (ページ 2-58) 「-Onum」 (ページ 2-108) --global_reg=reg_name[,reg_name,...] こ のオプシ ョ ンは、 指定 し た レ ジ ス タ 名を固定レ ジ ス タ と し て処理 し ます。 構文 --global_reg=reg_name[,reg_name,...] reg_name は レ ジ ス タ の APCS ま たは TPCS 名で、 1 ~ 8 の整数値で示 さ れます。 レ ジ ス タ 名 1 ~ 8 は レ ジ ス タ r4 ~ r11 に順にマ ッ プ さ れ ます。 制限 こ のオプシ ョ ンには、 __global_reg 記憶域 ク ラ ス指定子 と 同 じ 制限があ り ま す。 例 --global_reg=1,4,5 // は レ ジ ス タ r4、 r7 、 お よ び r8 を それぞれ予約 し ます。 関連項目 「__global_reg」 (ページ 4-7) • • 2.1.78 『ARM ソ フ ト ウ ェ ア開発ツールキ ッ ト リ フ ァ レ ン ス ガ イ ド 』。 --gnu こ のオプシ ョ ン を使用す る と 、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の拡張機能を有効にで き ます。 拡張機能の互換性があ る GCC の バージ ョ ンは、 定義済みマ ク ロ __GNUC__ と __GNUC_MINOR__ を調べて特定で き ま す。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-75 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--c90」 (ページ 2-25) • • • • • 2.1.79 「--c99」 (ページ 2-26) 「--cpp」 (ページ 2-34) 「--strict, --no_strict」 (ページ 2-133) 「GNU 言語拡張機能」 (ページ 3-26) 「コ ンパ イ ラ に よ る事前定義」 (ページ 4-129) --gnu_instrument, --no_gnu_instrument こ のオプシ ョ ンは GCC 形式の計測を挿入 し ます。 関連項目 「--gnu_instrument, --no_gnu_instrument」 • 2.1.80 --gnu_version=version こ のオプシ ョ ン を使用す る と 、 特定のバージ ョ ン の GCC と 互換の動作が試み ら れます。 構文 --gnu_version=version version は、 互換の動作を試み る GCC のバージ ョ ン を表す 10 進数です。 モー ド こ のオプシ ョ ンは、 GNU 互換性モー ド と 共に使用 し ます。 使用法 こ のオプシ ョ ンは、 上級ユーザを対象 と し た も ので、 従来の コ ー ド を処理す る 目的で使用 さ れ ます。 通常、 こ のオプシ ョ ン を使用す る 必要はあ り ません。 デフ ォル ト RVCT v4.0 では、 デフ ォ ル ト は 40200 です。 こ れは、 GCC バージ ョ ン 4.2.0 に対 応 し ます。 2-76 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 例 --gnu_version=30401 は、 GCC 3.4.1 と 可能な限 り 互換な動作を し ます。 関連項目 • 2.1.81 「--gnu」 (ページ 2-75) --guiding_decls, --no_guiding_decls こ のオプシ ョ ン を使用す る と 、 テ ン プ レー ト 関数の導入宣言を認識す る か ど う か を C++ で指定で き ます。 導入宣言 と は、 関数テ ンプ レー ト の イ ン ス タ ン ス に一致す る が、 その定義が 関数テ ン プ レー ト か ら 派生す る ため明示的な定義がない関数宣言を指 し ます。 --no_guiding_decls を --old_specializations と 組み合わせて使用 し た場合、 非 メ ンバテ ン プ レー ト 関数の特殊化は認識 さ れず、 独立関数の定義 と し て処理 さ れます。 注 オプシ ョ ン --guiding_decls は、 C++ 標準に準拠 し ていない従来の ソ ース コ ー ド を移行す る 目的でのみ提供 さ れてい ます。 他の目的で こ のオプシ ョ ン を使 用す る こ と はお勧め し ません。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デ フ ォル ト デフ ォ ル ト は --no_guiding_decls です。 例 template <class T> void f(T) { ... } void f(int); ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-77 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 導入宣言 と し て考え た場合、 f(int) はテ ン プ レー ト の イ ン ス タ ン ス にな り ま す。 導入宣言でない場合は独立 し た関数にな る ので、 定義を記述す る 必要が あ り ます。 関連項目 • 「--apcs=qualifer...qualifier」 (ページ 2-4) • 「--old_specializations, --no_old_specializations」 (ペー ジ 2-110) 2.1.82 --help こ のオプシ ョ ン を選択す る と 、 主な コ マ ン ド ラ イ ン オプシ ョ ン の一覧が表示 さ れ ます。 こ れは、 オプシ ョ ンや ソ ース フ ァ イ ルを指定 し ない場合のデフ ォ ル ト の動作 です。 関連項目 • 「--show_cmdline」 (ページ 2-128) • 2.1.83 「--vsn」 (ページ 2-149) --hide_all, --no_hide_all こ のオプシ ョ ン を使用す る と 、 SVr4 共有オブジ ェ ク ト の作成時にシ ン ボルを 表示す る か ど う か を制御で き ます。 使用法 --no_hide_all を使用す る と 、 コ ンパ イ ラ はすべての extern 変数お よ び関数に 対 し て STV_DEFAULT 表示を使用 し ます ( こ れ ら の変数や関数が __declspec(dll*) を使用 し ていない場合)。 ま た、 変数お よ び関数はダ イ ナ ミ ッ ク ロ ーダに よ っ て実行時にプ リ エ ン プテ ィ ブに も な り ます。 System V ま たは ARM Linux 共有 ラ イ ブ ラ リ を構築す る 場合は、--no_hide_all と --apcs /fpic を一緒に使用 し ます。 デフ ォル ト デフ ォ ル ト は --hide_all です。 2-78 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--apcs=qualifer...qualifier」 (ページ 2-4) • • • • 「__declspec(dllexport)」 (ページ 4-27) 「__declspec(dllimport)」 (ページ 4-30) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「シ ン ボルの可視性」 (ページ 4-4) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--symver_script=file」 (ペー ジ 2-65) 2.1.84 -Idir[,dir,...] こ のオプシ ョ ン を使用す る と 、 指定 さ れたデ ィ レ ク ト リ ま たは コ ン マで区切 ら れたデ ィ レ ク ト リ の リ ス ト が、 イ ン ク ルー ド フ ァ イ ルの検索場所 リ ス ト に 追加 さ れ ます。 複数のデ ィ レ ク ト リ を指定 し た場合、 それ ら のデ ィ レ ク ト リ は -I オプシ ョ ン に指定 し た順序で検索 さ れ ます。 構文 -Idir[,dir,...] 各パ ラ メ ー タ には以下の意味があ り ます。 dir[,dir,...] イ ン ク ルー ド フ ァ イ ルの検索対象 と な る デ ィ レ ク ト リ の コ ン マ区切 り の リ ス ト です。 ただ し 、 少な く と も 1 つのデ ィ レ ク ト リ が指定 さ れてい る 必要があ り ます。 複数のデ ィ レ ク ト リ を指定す る 場合は、 リ ス ト の コ ン マ と デ ィ レ ク ト リ 名の間に スペース を入れないで下 さ い。 関連項目 • 「-Jdir[,dir,...]」 (ページ 2-86) • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--kandr_include」 (ページ 2-87) 「--preinclude=filename」 (ページ 2-118) 「--sys_include」 (ページ 2-135) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「ヘ ッ ダ フ ァ イ ル」 (ページ 2-16) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-79 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.85 --ignore_missing_headers こ のオプシ ョ ンは、 ヘ ッ ダーフ ァ イ ルが見つか ら ない場合で も 、 ヘ ッ ダー フ ァ イ ルの依存関係行を出力す る よ う コ ンパ イ ラ に指示 し ます。 ヘ ッ ダーフ ァ イ ルが見つか ら ない と い う 警告やエ ラ ー メ ッ セージは抑制 さ れ る ため、 コ ンパ イ ラ は失敗せずに継続 し ます。 使用法 こ のオプシ ョ ンは、 メ ー ク フ ァ イ ルを自動更新す る ために使用 し ます。 GCC -MG コ マ ン ド ラ イ ン オプシ ョ ン に似てい ます。 関連項目 「--depend=filename」 (ページ 2-44) • • • 「--depend_format=string」 (ページ 2-45) 「--depend_system_headers, --no_depend_system_headers」 (ページ 2-47) • • • • 2.1.86 「--depend_target=target」 (ページ 2-48) 「-M」 (ページ 2-99) 「--md」 (ページ 2-100) 「--phony_targets」 (ページ 2-116) --implicit_include, --no_implicit_include こ のオプシ ョ ン を使用す る と 、 イ ン ス タ ン ス化 さ れ る テ ン プ レー ト エ ン テ ィ テ ィ の定義を検索す る 方法 と し て ソ ース フ ァ イ ルを暗黙に イ ン ク ルー ド す る か ど う か を C++ で制御で き ます。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デフ ォル ト デフ ォ ル ト は --implicit_include です。 2-80 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--implicit_include_searches, --no_implicit_include_searches」 • 2.1.87 「暗黙の イ ン ク ルー ド 」 (ページ 5-17) --implicit_include_searches, --no_implicit_include_searches こ のオプシ ョ ン を使用す る と 、 テ ン プ レー ト の暗黙の イ ン ク ルー ド フ ァ イ ル を コ ンパ イ ラ が検索す る 方法を C++ で制御で き ます。 オプシ ョ ン --implicit_include_searches が選択 さ れてい る 場合は、 コ ンパ イ ラ は、 検索パ ス を使用 し て、 形式 filename.* の名前の一部に基づいて、 暗黙の イ ン ク ルー ド フ ァ イ ルを検索 し ます。 検索パ ス は、 -I? -J、 お よ び RVCT40INC 環 境変数に よ っ て決定 し ます。 オプシ ョ ン --no_implicit_include_searches が選択 さ れてい る 場合は、 コ ンパ イ ラ は、 パ ス名を含む完全な フ ァ イ ル名に基づいて、 暗黙の イ ン ク ルー ド フ ァ イ ルを検索 し ます。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デ フ ォル ト デフ ォ ル ト は --no_implicit_include_searches です。 関連項目 「-Idir[,dir,...]」 (ページ 2-79) • • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--implicit_include, --no_implicit_include」 (ページ 2-80) 「-Jdir[,dir,...]」 (ページ 2-86) 「暗黙の イ ン ク ルー ド 」 (ページ 5-17) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「検索パ ス」 (ページ 2-17) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-81 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.88 --implicit_typename, --no_implicit_typename こ のオプシ ョ ン を使用す る と 、 テ ン プ レー ト パ ラ メ ー タ に依存す る 名前の型 の有無を状況か ら 暗黙的に判断す る か ど う か を C++ で指定で き ます。 注 オプシ ョ ン --implicit_typename は、 C++ 標準に準拠 し ていない従来の ソ ース コ ー ド を移行す る 目的でのみ提供 さ れてい ます。 他の目的で こ のオプシ ョ ン を使用す る こ と はお勧め し ません。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デフ ォル ト デフ ォ ル ト は --no_implicit_typename です。 注 --implicit_typename オプシ ョ ン を指定す る 場合、--no_parse_templates も 指定 し なければ効果はあ り ません。 関連項目 • 「--dep_name, --no_dep_name」 (ページ 2-43) • • 2.1.89 「--parse_templates, --no_parse_templates」 (ページ 2-112) 「テ ンプ レー ト の イ ン ス タ ン ス生成」 (ページ 5-17) --info=totals こ のオプシ ョ ンは、 オブジ ェ ク ト フ ァ イ ルご と にオブジ ェ ク ト の コ ー ド と デー タ のサ イ ズの合計を確認す る よ う に コ ンパ イ ラ に指示 し ます。 コ ンパ イ ラ は、 fromelf -z が使用 さ れてい る 場合、 fromelf に よ っ て返 さ れた合 計 と 同 じ 合計を同様の形式で返 し ます。 組み込みアセ ンブ リ が ソ ース コ ー ド に存在す る 場合、 合計には組み込みアセ ン ブ ラ のサ イ ズ も 含まれ ます。 2-82 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 例 Code (inc. data) 3308 1556 Code (inc. data) 416 28 RO Data 0 RO Data 0 RW Data 44 RW Data 0 ZI Data 10200 ZI Data 0 Debug 8402 Debug 7722 File Name dhry_1.o File Name dhry_2.o (inc. data) 列には、 コ ー ド の一部 と し て使用 さ れてい る 定数、 文字列 リ テ ラ ル、 お よ びその他のデー タ 項目のサ イ ズが表示 さ れ ます。 こ の例の Code 列の 値には、 こ の値が含まれてい ます。 関連項目 「--list」 (ページ 2-92) • • 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--info=topic[,topic,...]」 (ページ 2-29) • • 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「 コ ー ド メ ト リ ッ ク 」 (ページ 5-11) 『ユーテ ィ リ テ ィ ガ イ ド 』 の 「 コ マ ン ド ラ イ ンオプシ ョ ンの使用」 (ページ 2-2) 2.1.90 --inline, --no_inline こ のオプシ ョ ン を使用す る と 、 関数の イ ン ラ イ ン展開を有効ま たは無効にで き ます。 関数の イ ン ラ イ ン展開を無効にす る と 、 debug illusion を改善で き ま す。 オプシ ョ ン --inline を使用す る と 、 コ ンパ イ ラ は各関数を イ ン ラ イ ン展開 し ます。 --inline を指定 し て コ ー ド を コ ンパ イ ル し て も 、 すべての関数が イ ン ラ イ ン展開 さ れ る わけではあ り ません。 コ ンパ イ ラ が関数を イ ン ラ イ ン展開す る か ど う か を判断す る 方法の詳細については、 『コ ンパ イ ラ ユーザガ イ ド 』 の 「コ ンパ イ ラ に よ る イ ン ラ イ ン展開はどの よ う な場合に実際的か ?」 (ページ 5-21) を参照 し て下 さ い。 オプシ ョ ン --no_inline が選択 さ れてい る 場合、 コ ンパ イ ラ は、 __forceinline で修飾 さ れてい る 関数以外の関数については イ ン ラ イ ン展開 し ません。 デ フ ォル ト デフ ォ ル ト は --inline です。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-83 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--autoinline, --no_autoinline」 (ページ 2-19) • • • • • • • 「--forceinline」 (ページ 2-66) 「-Onum」 (ページ 2-108) 「-Ospace」 (ページ 2-110) 「-Otime」 (ページ 2-111) 「__forceinline」 (ページ 4-7) 「__inline」 (ページ 4-10) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「 リ ン カのフ ィ ー ド バ ッ ク の使用」 (ページ 2-30) • 2.1.91 『コ ンパ イ ラ ユーザガ イ ド 』 の 「関数の イ ン ラ イ ン展開」 (ページ 5-20) --interface_enums_are_32_bit こ のオプシ ョ ンは、 列挙型のサ イ ズ と い う 点で、 外部 コ ー ド イ ン タ フ ェース と の互換性の確保に役立ち ます。 使用法 --enum_is_int を使用 し て コ ンパ イ ル し たオブジ ェ ク ト フ ァ イ ル は、--enum_is_int を使用せずに コ ンパ イ ル し た別のオブジ ェ ク ト フ ァ イ ル と リ ン ク で き ません。 リ ン カは、 列挙型が外部 イ ン タ フ ェース に影響を与え る 方 法で使用 さ れ る か ど う か を判断で き ないので、 こ れ ら の ビル ド の違い を検出 す る と 、 警告ま たはエ ラ ーを生成 し ます。 --interface_enums_are_32_bit を使用 し て コ ンパ イ ルす る と 、 こ の問題を防ぐ こ と がで き ます。 コ ンパ イ ル さ れた オブジ ェ ク ト フ ァ イ ルは別のオブジ ェ ク ト フ ァ イ ル と リ ン ク で き 、 列挙型の サ イ ズが異な る こ と が原因で リ ン カに よ っ て競合が検出 さ れ る こ と はあ り ま せん。 注 こ のオプシ ョ ン を使用す る と 、 外部 イ ン タ フ ェ ース で使用 さ れ る すべての列 挙型が 32 ビ ッ ト 幅であ る こ と を コ ンパ イ ラ に対 し て保証す る こ と にな り ま す。 例えば、 宣言す る すべての enum に 2 の 16 乗 よ り 大 き な値が少な く と も 1 つ含まれ る よ う に し た場合、--enum_is_int を使用す る か ど う かにかかわ ら ず、 コ ンパ イ ラ は強制的に enum を 32 ビ ッ ト 幅にす る よ う にな り ます。 ユーザは、 コ ンパ イ ラ に対 し て行っ た保証が確実に守 ら れ る よ う にす る 必要があ り ます (外部 イ ン タ フ ェ ース に enums が含ま れていない こ と を確認す る こ と に よ っ て、 こ の条件を満たす こ と も で き ます)。 2-84 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 2.1.92 「--enum_is_int」 (ページ 2-59) --interleave こ のオプシ ョ ン を使用す る と 、 --asm オプシ ョ ン ま たは -S オプシ ョ ン を使用 し て生成 さ れた アセ ン ブ リ リ ス ト 内に、 C ま たは C++ ソ ース コ ー ド を コ メ ン ト と し て 1 行ずつ イ ン タ ー リ ーブで き ます。 使用法 --interleave のア ク シ ョ ンは、 使用 さ れ る オプシ ョ ンの組み合わせに よ っ て異 な り ます。 表 2-4 ---interleave オプ シ ョ ン を使用 し た コ ンパイル コ ンパイ ラ オプ シ ョ ン ARM DUI 0348BJ ID 1 0 0 4 1 9 アクシ ョ ン --asm --interleave こ のオプシ ョ ン を使用する と 、 コ ンパ イ ル さ れた ソ ース の 逆アセ ンブ リ の リ ス ト が フ ァ イ ルに書き 込まれ、 ソ ース コ ー ド が逆アセ ンブ リ で イ ン タ ー リ ーブ さ れます。 -c オプシ ョ ンが使用 さ れない場合、 リ ン ク 手順 も 実行 さ れ ます。 逆アセ ンブ リ は、 テ キ ス ト フ ァ イ ルに書き 込まれ、 フ ァ イ ル名には、 フ ァ イ ル拡張子 .txt が付け ら れた入力フ ァ イ ル 名がデフ ォ ル ト で使用 さ れます。 -S --interleave こ のオプシ ョ ン を使用する と 、 コ ンパ イ ル さ れた ソ ース の 逆アセ ンブ リ の リ ス ト が フ ァ イ ルに書き 込まれ、 ソ ース コ ー ド が逆アセ ンブ リ で イ ン タ ー リ ーブ さ れます。 逆アセ ンブ リ は、 テ キ ス ト フ ァ イ ルに書き 込まれ、 フ ァ イ ル名には、 フ ァ イ ル拡張子 .txt が付け ら れた入力フ ァ イ ル 名がデフ ォ ル ト で使用 さ れます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-85 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 制約条件 • --asm --interleave ま たは -S --interleave を指定 し て生成 さ れた アセ ン ブ リ リ ス ト を再アセ ンブルす る こ と はで き ません。 • 前処理済みの ソ ース フ ァ イ ルには、 #line デ ィ レ ク テ ィ ブが含ま れ ます。 --asm --interleave ま たは -S --interleave を使用 し て前処理済みの フ ァ イ ルを コ ンパ イ ル し た場合、 コ ンパ イ ラ は #line デ ィ レ ク テ ィ ブに よ っ て 示 さ れた元の フ ァ イ ルを検索 し 、 それ ら の フ ァ イ ルか ら 正 し い コ ー ド 行 を使用 し ます。 こ れに よ り 、 前処理済みフ ァ イ ルを コ ンパ イ ル し た と き に、 元の フ ァ イ ルを コ ンパ イ ル し た と き と 同 じ 出力 と 動作が提供 さ れま す。 コ ンパ イ ラ が元の フ ァ イ ルを見つけ ら れなか っ た場合、 ソ ース を イ ン タ ー リ ーブで き ません。 こ のため、 #line デ ィ レ ク テ ィ ブ を使用 し て ソ ー ス フ ァ イ ルの前処理を行っ たが元の未処理の フ ァ イ ルが存在 し ない場合 は、--interleave を使用 し て コ ンパ イ ルを実行す る 前にすべての #line デ ィ レ ク テ ィ ブ を削除す る 必要があ り ます。 関連項目 • 「--asm」 (ページ 2-17) • 2.1.93 「-S」 (ページ 2-127) -Jdir[,dir,...] こ のオプシ ョ ン を使用す る と 、 指定 さ れたデ ィ レ ク ト リ ま たは コ ン マで区切 ら れたデ ィ レ ク ト リ の リ ス ト が、 シ ス テ ム イ ン ク ルー ド の リ ス ト に追加 さ れ ます。 --diag_error が使用 さ れてい る 場合で も 、 警告 と 注釈は非表示にな り ます。 RVCT40INC 環境変数は、-J を使用 し てオーバー ラ イ ド し ない限 り 、 デフ ォ ル ト のシ ス テ ム イ ン ク ルー ド パ ス に設定 さ れ ます。 まず山形括弧で囲ま れた イ ン ク ルー ド フ ァ イ ルは、 シ ス テ ム イ ン ク ルー ド の リ ス ト で検索 さ れ、 その後に オプシ ョ ン -I で指定 し た イ ン ク ルー ド リ ス ト で検索 さ れます。 注 Windows シ ス テ ム では、 RVCT40INC に よ っ て定義 さ れ る デフ ォ ル ト のパ ス には スペース が含ま れてい ます。 そのため、 コ マ ン ド ラ イ ン で、 こ の環境変数を 指定す る 場合は、 二重引用符で囲む必要があ り ます。 以下に例を示 し ます。 armcc -J"%RVCT40INC%" -c main.c 2-86 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 構文 -Jdir[,dir,...] 各パ ラ メ ー タ には以下の意味があ り ます。 dir[,dir,...] シ ス テ ム イ ン ク ルー ド の リ ス ト に追加 さ れ る コ ン マで区切 ら れたデ ィ レ ク ト リ の リ ス ト です。 ただ し 、 少な く と も 1 つのデ ィ レ ク ト リ が指定 さ れてい る 必要があ り ます。 複数のデ ィ レ ク ト リ を指定す る 場合は、 リ ス ト の コ ン マ と デ ィ レ ク ト リ 名の間に スペース を入れないで下 さ い。 関連項目 • 「-Idir[,dir,...]」 (ページ 2-79) • • • • 2.1.94 「--kandr_include」 「--preinclude=filename」 (ページ 2-118) 「--sys_include」 (ページ 2-135) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「ヘ ッ ダ フ ァ イ ル」 (ページ 2-16) --kandr_include こ のオプシ ョ ン を使用す る と 、 イ ン ク ルー ド フ ァ イ ルの検索にカーニガ ン & リ ッ チーの検索規則が使用 さ れ ます。 現在の場所は元の ソ ース フ ァ イ ルに よ っ て定義 さ れ、 ス タ ッ ク さ れ ません。 こ のオプシ ョ ンが指定 さ れていない場合は、 バー ク レー方式の検索が行われ ます。 関連項目 • 「-Idir[,dir,...]」 (ページ 2-79) • • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「-Jdir[,dir,...]」 (ページ 2-86) 「--preinclude=filename」 (ページ 2-118) 「--sys_include」 (ページ 2-135) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「ヘ ッ ダ フ ァ イ ル」 (ページ 2-16) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「現在の場所」 (ページ 2-16) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-87 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.95 -Lopt こ のオプシ ョ ン を使用 し て、 コ ンパ イ ル後に リ ン ク 手順が実行 さ れ る と き に リ ン カに渡す コ マ ン ド ラ イ ン オプシ ョ ン を指定で き ます。 オプシ ョ ンは、 部 分的に リ ン ク さ れたオブジ ェ ク ト ま たは実行可能 イ メ ージ を作成す る と き に も 渡す こ と がで き ます。 構文 -Lopt 各パ ラ メ ー タ には以下の意味があ り ます。 リ ン カに渡 さ れ る コ マ ン ド ラ イ ン オプシ ョ ン です。 opt 制約条件 サポー ト さ れていない リ ン カオプシ ョ ンが -L を使用 し て リ ン カに渡 さ れ る と 、 エ ラ ーが生成 さ れます。 例 armcc main.c -L--map 関連項目 • 「-Aopt」 (ページ 2-2) • 2.1.96 「--show_cmdline」 (ページ 2-128) --library_interface=lib こ のオブジ ェ ク ト を使用す る と 、 選択 し た ラ イ ブ ラ リ の タ イ プ と 互換性があ る コ ー ド を生成で き ます。 構文 --library_interface=lib lib には、 以下のいずれかが使用 さ れ ます。 rvct 2-88 こ のオプシ ョ ン を使用す る と 、 コ ンパ イ ラ の出力が RVCT ラ ン タ イ ム ラ イ ブ ラ リ と 連動す る よ う に指定で き ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン rvct_c90 --library_interface=rvct と 同様に動作 し ます。 ただ し 、 C90 に よ っ て予約 さ れていない関数名に対す る 入力 ソ ース コ ー ド 内の参照が コ ンパ イ ラ に よ っ て変更 さ れない点が異な り ます。 ま た、 一部の C99 math.h 関数名には、 __hardfp_tgamma の よ う に、 接頭辞 __hardfp_ が付 く 場合があ り ます。 aeabi_clib90 こ のオプシ ョ ン を使用す る と 、 コ ンパ イ ラ の出力が ARM 組み込みアプ リ ケーシ ョ ンバ イ ナ リ イ ン タ フ ェース (AEABI) 準拠の ISO C90 ラ イ ブ ラ リ と 連動す る よ う に指 定で き ます。 aeabi_clib99 こ のオプシ ョ ン を使用す る と 、 コ ンパ イ ラ の出力が ARM 組み込みアプ リ ケーシ ョ ンバ イ ナ リ イ ン タ フ ェース (AEABI) 準拠の ISO C99 ラ イ ブ ラ リ と 連動す る よ う に指 定で き ます。 aeabi_clib こ のオプシ ョ ン を使用す る と 、 コ ンパ イ ラ の出力が ARM 組み込みアプ リ ケーシ ョ ンバ イ ナ リ イ ン タ フ ェース (AEABI) 準拠の ISO C ラ イ ブ ラ リ と 連動す る よ う に指定 で き ます。 オプシ ョ ン --library_interface=aeabi_clib を選択す る と 、 使用 さ れた ソ ース言語に応 じ て --library_interface=aeabi_clib90 ま たは --library_interface=aeabi_clib99 を指定 し た場合 と 同 じ にな り ます。 選択す る ソ ース言語は、 選択 さ れ る コ マ ン ド ラ イ ン オプ シ ョ ン と 使用 さ れ る フ ァ イ ル名接尾文字に応 じ て異な り ま す。 aeabi_glibc こ のオプシ ョ ン を使用す る と 、 コ ンパ イ ラ の出力が AEABI 準拠の GNU C ラ イ ブ ラ リ と 連動す る よ う に指定で き ます。 デ フ ォル ト --library_interface を指定 し ない場合は、 --library_interface=rvct が想定 さ れ ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-89 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 使用法 • オプシ ョ ン --library_interface=rvct は、 コ ンパ イ ラ と ラ イ ブ ラ リ の最適 化を最大限に利用 し て リ ン ク す る と き に使用 し ます。 • ABI に準拠 し た C ラ イ ブ ラ リ と リ ン ク す る 場合は、 形式 --library_interface=aeabi_* のオプシ ョ ン を使用 し ます。 形式 --library_interface=aeabi_* のオプシ ョ ン を指定す る と 、 コ ンパ イ ラ は、 RVCT C ラ イ ブ ラ リ の最適化 さ れた関数への呼び出 し を生成 し ません。 例 RVCT C ラ イ ブ ラ リ の関数を置換す る 組み込みオペレーテ ィ ン グ シ ス テ ム の 関数が コ ー ド に よ っ て呼び出 さ れた場合、 --library_interface=aeabi_clib を使 用 し て コ ー ド を コ ンパ イ ル し 、 オペレーテ ィ ン グ シ ス テ ムに よ っ て置換 さ れ る ラ イ ブ ラ リ 関数の特定の RVCT バ リ ア ン ト の呼び出 し を無効に し ます。 関連項目 • 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の 「ARM アーキ テ ク チ ャ 用 ABI への準拠」 (ページ 1-3) 2.1.97 --library_type=lib リ ン ク 時に使用す る 選択 し た ラ イ ブ ラ リ を有効に し ます。 注 こ のオプシ ョ ン で リ ン カ を使用す る と 、 他のすべての --library_type オプシ ョ ン がオーバー ラ イ ド さ れ ます。 構文 --library_type=lib lib には、 以下のいずれかが使用 さ れ ます。 standardlib リ ン ク 時に フル RVCT ラ ン タ イ ム ラ イ ブ ラ リ を選択す る よ う に 指定 し ます。 こ のオプシ ョ ンは、 コ ンパ イ ラ の最適化を最大限に利用 し て リ ン ク す る と き に使用 し ます。 microlib 2-90 リ ン ク 時に C マ イ ク ロ ラ イ ブ ラ リ (microlib) を選択す る よ う に 指定 し ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン デ フ ォル ト --library_type を指定 し ない場合は、 --library_type=standardlib が想定 さ れま す。 関連項目 • • 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の 「microlib を使用 し た アプ リ ケーシ ョ ンの作成」 (ページ 3-4) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library_type=lib」 (ページ 2-39) 2.1.98 --licretry フ ロ ーテ ィ ン グ ラ イ セ ン ス を使用 し てい る 場合は、 armcc を起動 し た と き に、 10 回ま で ラ イ セ ン ス の取得を試みます。 使用法 夜間ビル ド の よ う な典型的な ビル ド プ ロ セ ス には、 何千 も の ARM コ ンパ イ ルツール呼び出 し が含まれてい る 場合があ り ます。 各ツール呼び出 し には、 ク ラ イ ア ン ト (ビル ド ) マシ ン と ラ イ セ ン ス サーバ と の間のネ ッ ト ワー ク 通 信が伴い ます。 ただ し 、 ビル ド マシ ンが ラ イ セ ン ス サーバか ら の ラ イ セ ン ス の取得を試みた と き に一時的なネ ッ ト ワ ー ク 障害が発生 し た場合、 ツールが ラ イ セ ン ス を取得で き ない可能性があ り ます。 --licretry を使用す る と 、 こ の 種の問題の解決を試み る こ と がで き ます。 こ のオプシ ョ ンは、 RVCT40_CCOPT 環境変数で指定す る こ と をお勧め し ます。 こ れに よ り 、 ビル ド フ ァ イ ルを修正す る 必要がな く な り ます。 注 こ のオプシ ョ ンは、 ネ ッ ト ワー ク ま たは ラ イ セ ン ス サーバの設定に関す る 他 の問題がない こ と を確認 し た後でのみ使用 し て下 さ い。 関連項目 ARM DUI 0348BJ ID 1 0 0 4 1 9 • 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--licretry」 (ページ 2-40) • 『アセ ンブ ラ ガ イ ド 』 の 「 コ マ ン ド 構文」 (ページ 3-2) • 『ユーテ ィ リ テ ィ ガ イ ド 』 の 「--licretry」 (ページ 2-36) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-91 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.99 • 『RealView Compilation Tools エ ッ セ ン シ ャ ルガ イ ド 』 の 「RVCT で使用す る環境変数」 (ページ 1-7) • 『ARM ツール用 FLEXnet ラ イ セ ン ス管理ガ イ ド 』 --list こ のオプシ ョ ンは、 ソ ース フ ァ イ ルの生の リ ス ト 情報を生成す る よ う に コ ン パ イ ラ に指示 し ます。 生の リ ス ト フ ァ イ ルの名前には、 フ ァ イ ル拡張子 .lst が付け ら れた入力フ ァ イ ル名がデフ ォ ル ト で使用 さ れます。 コ マ ン ド ラ イ ン で複数の ソ ース フ ァ イ ルを指定 し た場合は、 指定 し た フ ァ イ ルの最初の フ ァ イ ルに対 し てのみ生の リ ス ト 情報が生成 さ れ ます。 使用法 通常、 生の リ ス ト 情報はフ ォーマ ッ ト さ れた リ ス ト を生成す る ために使用 さ れ ます。 生の リ ス ト フ ァ イ ルには、 元の ソ ース行、 イ ン ク ルー ド フ ァ イ ルに おけ る 遷移に関す る 情報、 お よ び コ ンパ イ ラ に よ っ て生成 さ れ る 診断情報が 含まれ ます。 リ ス ト フ ァ イ ルの各行は、 行の タ イ プ を表す以下のいずれかの キー文字で始ま り ます。 N 通常の ソ ース行であ る こ と を示 し ます。 その行の残 り の部分は ソ ース行のテ キ ス ト です。 X 通常の ソ ース行の拡張形式です。 こ の行の残 り の部分は、 ソ ース 行のテ キ ス ト です。 こ の行は、 特別な修正が含まれてい る 場合の み、 N 行の後に記述 さ れ ます。 コ メ ン ト は軽微な修正 と 見な さ れ、 マ ク ロ 拡張、 行の結合、 ト リ グ ラ フ な どは特別な修正 と 見な さ れます。 コ メ ン ト は、 拡張形式行では 1 つの スペース で置 き 換え ら れます。 S #if ま たは こ れに似たデ ィ レ ク テ ィ ブに よ っ て ス キ ッ プ さ れ る ソ ース行であ る こ と を示 し ます。 こ の行の残 り の部分はテ キ ス ト です。 注 ス キ ッ プ を終了す る #else、 #elseif、 ま たは #endif は、 N でマー ク さ れ ます。 L 2-92 ソ ース位置の変更を示 し ます。 つま り 、 こ の行にはプ リ プ ロ セ ッ サに よ っ て出力 さ れ る # 識別デ ィ レ ク テ ィ ブに似た形式が使用 さ れ ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン L line-number "filename" key key には以下の ど ち ら か を指定で き ます。 1 イ ン ク ルー ド フ ァ イ ルへのエ ン ト リ 2 イ ン ク ルー ド フ ァ イ ルか ら の終了 それ以外の場合、key は省略 さ れ ます。 生の リ ス ト フ ァ イ ルの 1 行 目は、 常に元の入力フ ァ イ ルを表す L 行です。 L 行は、 #line デ ィ レ ク テ ィ ブに対 し て も 出力 さ れ ます (key が省略 さ れてい る 場 合)。 L 行は、 生の リ ス ト フ ァ イ ル内の次の ソ ース行の ソ ース位 置を示 し ます。 R/W/E 下記の よ う な診断情報を示 し ます。 R 注釈 W 警告 E エラー こ の行には以下の形式が使用 さ れます。 type "filename" line-number column-number message-text type には、 R、 W、 ま たは E のいずれかが使用 さ れます。 フ ァ イ ルの最後の部分のエ ラ ーは、 元の ソ ース フ ァ イ ルの最終 行であ る こ と と 、 列数が 0 であ る こ と を示 し ます。 コ マ ン ド ラ イ ン エ ラ ーの フ ァ イ ル名は、 "<command line>" と し て表 さ れ ます。 エ ラ ー メ ッ セージには、 行番号 と 列番号は表示 さ れま せん。 内部エ ラ ーには、 従来の位置情報 と 、 (Internal fault) で始ま る メ ッ セージ テ キ ス ト が使用 さ れ ます。 オーバー ロ ー ド し た呼び出 し に曖昧性があ る と き に、 競合す る すべてのルーチン が表示 さ れ る 場合な ど、 診断 メ ッ セージに リ ス ト が表示 さ れ る 場合、 最初の診断行の後に同 じ 形式の行が 1 つ ま たは複数表示 さ れ ます。 ただ し 、 コ ー ド 文字には、 最初の行の コ ー ド 文字を小文字に し た も のが使用 さ れ ます。 こ れ ら の行の ソ ース位置は、 対応す る 最初の行の ソ ース位置 と 同 じ です。 例 /* main.c */ #include <stdbool.h> int main(void) ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-93 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン { return(true); } オプシ ョ ン --list を指定 し て こ の コ ー ド を コ ンパ イ ルす る と 、 以下の よ う に 生の リ ス ト フ ァ イ ルが生成 さ れ ます。 L 1 "main.c" N#include <stdbool.h> L 1 "...\include\...\stdbool.h" 1 N/* stdbool.h */ N ... N #ifndef __cplusplus /* In C++, 'bool', 'true' and 'false' and keywords */ N #define bool _Bool N #define true 1 N #define false 0 N #endif ... L 2 "main.c" 2 N Nint main(void) N{ N return(true); X return(1); N} 関連項目 • 「--asm」 (ページ 2-17) • • • • • • • • 「-c」 (ページ 2-24) 「--depend=filename」 (ページ 2-44) 「--depend_format=string」 (ページ 2-45) 「--info=totals」 (ページ 2-82) 「--interleave」 (ページ 2-84) 「--md」 (ページ 2-100) 「-S」 (ページ 2-127) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「診断 メ ッ セージの重大度」 (ページ 6-4) 2-94 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.100 --list_macros こ のオプシ ョ ンは、 指定 し た ソ ース フ ァ イ ルの処理後にマ ク ロ 定義を stdout に一覧表示 し ます。 こ の出力一覧には、 コ マ ン ド ラ イ ン で使用 さ れ、 コ ンパ イ ラ で事前定義 さ れ、 ヘ ッ ダーフ ァ イ ルや ソ ース フ ァ イ ルで見つか っ たマ ク ロ 定義が使用法に応 じ て含ま れます。 使用法 コ マ ン ド ラ イ ン で定義 さ れ、 コ ンパ イ ラ で事前定義 さ れ、 ヘ ッ ダーフ ァ イ ル や ソ ース フ ァ イ ルで見つか っ たマ ク ロ を一覧表示す る には、 空でない ソ ース フ ァ イ ルで --list_macros を使用 し ます。 コ ンパ イ ラ で事前定義 さ れ、 コ マ ン ド ラ イ ン で指定 さ れたマ ク ロ のみを一覧 表示す る には、 空の ソ ース フ ァ イ ルで --list_macros を使用 し ます。 制限 コ ー ド 生成が抑制 さ れ ます。 関連項目 「コ ンパ イ ラ に よ る事前定義」 (ページ 4-129) • • • • • 「-Dname[(parm-list)][=def]」 (ページ 2-40) 「-E」 (ページ 2-58) 「--show_cmdline」 (ページ 2-128) 「--via=filename」 (ページ 2-147) 2.1.101 --littleend こ のオプシ ョ ンは、 リ ト ルエ ンデ ィ ア ン メ モ リ を使用 し て ARM プ ロ セ ッ サ 用の コ ー ド を生成す る よ う に コ ンパ イ ラ に指示 し ます。 リ ト ルエ ンデ ィ ア ン の メ モ リ では、 ワ ー ド の最下位バ イ ト に最下位ア ド レ ス が割 り 当て ら れ ます。 デ フ ォル ト --bigend を明示的に指定 し なか っ た場合、 --littleend が指定 さ れた と き と 同 じ 処理を実行 し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-95 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--bigend」 (ページ 2-19) 2.1.102 --locale=lang_country こ のオプシ ョ ン を使用す る と 、 ソ ース フ ァ イ ルのデフ ォ ル ト ロ ケールを、 lang_country に指定 し た ロ ケールに切 り 替え る こ と がで き ます。 構文 --locale=lang_country 各パ ラ メ ー タ には以下の意味があ り ます。 lang_country は新 し いデフ ォ ル ト の ロ ケールです。 こ のオプシ ョ ンは、--multibyte_chars と 組み合わせて使用 し ます。 制約条件 ホ ス ト プ ラ ッ ト フ ォ ームに よ っ ては、 ロ ケール名の大文字 と 小文字が区別 さ れ る 場合があ り ます。 使用で き る ロ ケールの設定は、 ホ ス ト プ ラ ッ ト フ ォ ーム に よ っ て異な り ます。 ホ ス ト プ ラ ッ ト フ ォ ームに適切な ロ ケールのサポー ト が イ ン ス ト ール さ れて い る こ と を確認 し て下 さ い。 例 日本語の ソ ース フ ァ イ ルを英語ベース の Windows ワ ー ク ス テーシ ョ ン で コ ン パ イ ルす る には、 以下の よ う に指定 し ます。 --multibyte_chars --locale=japanese ま た、 日本語の ソ ース フ ァ イ ルを英語ベース の UNIX ワー ク ス テーシ ョ ンで コ ンパ イ ルす る には、 以下の よ う に指定 し ます。 --multibyte_chars --locale=ja_JP 関連項目 • 「--message_locale=lang_country[.codepage]」 (ページ 2-100) • 2-96 「--multibyte_chars, --no_multibyte_chars」 (ページ 2-103) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.103 --loose_implicit_cast こ のオプシ ョ ン を使用す る と 、 暗黙的に行われ る 不正な キ ャ ス ト (0 以外の 整数が暗黙的に pointer にキ ャ ス ト さ れ る 場合な ど) を正規のキ ャ ス ト に変換 で き ます。 例 int *p = 0x8000; オプシ ョ ン --loose_implicit_cast を指定せずに こ の例を コ ンパ イ ルす る と 、 エ ラ ーが生成 さ れ ます。 オプシ ョ ン --loose_implicit_cast を指定 し て こ の例を コ ンパ イ ルす る と 、 警告 メ ッ セージが生成 さ れ ます。 こ の メ ッ セージは、 表示 さ れない よ う にす る こ と がで き ます。 2.1.104 --lower_ropi, --no_lower_ropi こ のオプシ ョ ン を使用す る と 、 --apcs=/ropi を指定 し て コ ンパ イ ルす る 際に C の制約条件を緩和す る か ど う か を指定で き ます。 デ フ ォル ト デフ ォ ル ト は --no_lower_ropi です。 注 --lower_ropi を指定 し て コ ンパ イ ルを実行す る と 、実行時に C お よ び C++ で記 述 さ れた コ ー ド の C++ の コ ン ス ト ラ ク タ メ カ ニ ズ ムに よ っ て ス タ テ ィ ッ ク な 初期化が実行 さ れ ます。 こ れに よ り 、 ス タ テ ィ ッ ク な初期化を ROPI コ ー ド と 連携 さ せ る こ と がで き ます。 関連項目 • 「--apcs=qualifer...qualifier」 (ページ 2-4) • • 「--lower_rwpi, --no_lower_rwpi」 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「位置非依存修飾子」 (ページ 2-28) 2.1.105 --lower_rwpi, --no_lower_rwpi こ のオプシ ョ ン を使用す る と 、 --apcs=/rwpi を指定 し て コ ンパ イ ルす る 際に C と C++ の制約条件を緩和す る か ど う か を指定で き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-97 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン デフ ォル ト デフ ォ ル ト は --lower_rwpi です。 注 --lower_rwpi を指定 し て コ ンパ イ ルを実行す る と 、 実行時に C++ の コ ン ス ト ラ ク タ メ カ ニズ ム に よ っ て ス タ テ ィ ッ ク な初期化が実行 さ れます ( こ の メ カ ニ ズ ムは C に も 使用 さ れ ます)。 こ れに よ り 、 ス タ テ ィ ッ ク な初期化を RWPI コ ー ド と 連携 さ せ る こ と がで き ます。 関連項目 • 「--apcs=qualifer...qualifier」 (ページ 2-4) • • 「--lower_ropi, --no_lower_ropi」 (ページ 2-97) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「位置非依存修飾子」 (ページ 2-28) 2.1.106 --ltcg こ のオプシ ョ ン を使用す る と 、 オブジ ェ ク ト を中間形式で作成 し て、 リ ン ク 時の コ ー ド 生成最適化を実行で き る よ う にな り ます。 適用 さ れ る 最適化には、 モジ ュ ール間の イ ン ラ イ ン展開に よ る パフ ォ ーマ ン ス の向上、 ベース ア ド レ ス の共有に よ る コ ー ド サ イ ズの縮小な ど が含まれ ます。 注 こ のオプシ ョ ン を使用す る と 、 リ ン ク 時間が長 く な り 、 必要な メ モ リ 容量が 増え る 可能性があ り ます。 大容量のアプ リ ケーシ ョ ンの場合は、 オブジ ェ ク ト のサブセ ッ ト ご と に部分 リ ン ク 手順で コ ー ド を生成す る こ と をお勧め し ま す。 例 以下に、--ltcg オプシ ョ ンの使用例を示 し ます。 armcc -c --ltcg file1.c armcc -c --ltcg file2.c armlink --ltcg file1.o file2.o -o prog.axf 2-98 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--multifile, --no_multifile」 (ページ 2-103) • • 「-Onum」 (ページ 2-108) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--ltcg」 (ページ 2-42) 2.1.107 -M こ のオプシ ョ ンは、 make ユーテ ィ リ テ ィ での使用に適 し た メ ー ク フ ァ イ ル用 の依存関係行の リ ス ト を生成す る よ う コ ンパ イ ラ に指示 し ます。 こ のオプシ ョ ン を指定す る と 、 コ ンパ イ ルのプ リ プ ロ セ ッ サ処理のみが実行 さ れ ます。 デフ ォ ル ト では、 標準出力ス ト リ ーム に出力 さ れ ます。 複数の ソ ース フ ァ イ ルを指定 し た場合は、 1 つの依存関係フ ァ イ ルが作成 さ れ ます。 -o filename オプシ ョ ン を指定す る と 、 標準出力に生成 さ れ る 依存関係行は source.o ではな く filename.o を参照 し ます。 ただ し 、-M -o filename の組み合わせ を使用 し た場合、 オブジ ェ ク ト フ ァ イ ルは生成 さ れません。 ソ ース フ ァ イ ルご と に依存関係行 と オブジ ェ ク ト フ ァ イ ルを生成す る に は、--md オプシ ョ ン を使用 し ます。 例 出力は、 標準の UNIX ま たは MS-DOS の指定方法で フ ァ イ ルに転送で き ます。 例えば以下の よ う に指定で き ます。 armcc -M source.c > Makefile 関連項目 • 「-C」 (ページ 2-25) • • 「--depend=filename」 (ページ 2-44) 「--depend_system_headers, --no_depend_system_headers」 (ページ 2-47) • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「-E」 (ページ 2-58) 「--md」 (ページ 2-100) 「-o filename」 (ページ 2-106) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-99 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.108 --md こ のオプシ ョ ンは、 ソ ース を コ ンパ イ ル し 、 フ ァ イ ルに メ ー ク フ ァ イ ル用の 依存関係行を書 き 込む よ う コ ンパ イ ラ に指示 し ます。 こ の出力フ ァ イ ルは、 make ユーテ ィ リ テ ィ での使用に適 し てい ます。 コ ンパ イ ラ は出力フ ァ イ ルに filename.d と い う 名前を付け ます。 filename は ソ ース フ ァ イ ルの名前です。 複数の ソ ース フ ァ イ ルを指定 し た場合は、 ソ ー ス フ ァ イ ルご と に依存関係フ ァ イ ルが作成 さ れ ます。 関連項目 • 「--depend=filename」 (ページ 2-44) • • 「--depend_format=string」 (ページ 2-45) 「--depend_system_headers, --no_depend_system_headers」 (ページ 2-47) • • 「-M」 (ページ 2-99) 「-o filename」 (ページ 2-106) 2.1.109 --message_locale=lang_country[.codepage] こ のオプシ ョ ン を使用す る と 、 エ ラ ー メ ッ セージ と 警告 メ ッ セージの表示に 使用す る デフ ォ ル ト の言語を、 lang_country ま たは lang_country.codepage に指 定 し た言語に切 り 替え る こ と がで き ます。 構文 --message_locale=lang_country[.codepage] 各パ ラ メ ー タ には以下の意味があ り ます。 lang_country[.codepage] エ ラ ー メ ッ セージ と 警告 メ ッ セージの表示に使用す る 新 し いデ フ ォ ル ト の言語です。 使用で き る 言語は、 ど のホ ス ト プ ラ ッ ト フ ォ ーム で も 同 じ です。 以下の設定がサポー ト さ れてい ます。 • en_US • zh_CN • ko_KR • ja_JP 2-100 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン デ フ ォル ト --message_locale を指定 し なか っ た場合、 コ ンパ イ ラ は --message_locale=en_US が指定 さ れた と き と 同 じ 処理を実行 し ます。 制約条件 ホ ス ト プ ラ ッ ト フ ォ ームに適切な ロ ケールのサポー ト が イ ン ス ト ール さ れて い る こ と を確認 し て下 さ い。 ホ ス ト プ ラ ッ ト フ ォ ームに よ っ ては、 ロ ケール名の大文字 と 小文字が区別 さ れ る 場合があ り ます。 コ ー ド ページ と その意味を特定で き る か ど う かは、 ホ ス ト プ ラ ッ ト フ ォ ーム に よ っ て異な り ます。 エラー サポー ト さ れない設定を指定す る と 、 コ ンパ イ ラ に よ っ てエ ラ ー メ ッ セージ が生成 さ れます。 例 日本語で メ ッ セージ を表示す る には、 以下の よ う に指定 し ます。 --message_locale=ja_JP 関連項目 • 「--locale=lang_country」 (ページ 2-96) • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--multibyte_chars, --no_multibyte_chars」 (ページ 2-103) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-101 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.110 --min_array_alignment=opt こ のオプシ ョ ン を使用す る と 、 配列の最小境界整列を指定で き ます。 構文 --min_array_alignment=opt 各パ ラ メ ー タ には以下の意味があ り ます。 配列の最小境界整列を指定 し ます。 opt には、 以下のいずれかの 値を指定で き ます。 1 バ イ ト 境界で整列 さ れ る か、 非境界整列 さ れ ます。 2 2 バ イ ト (ハーフ ワ ー ド ) 境界で整列 さ れます。 opt 4 4 バ イ ト (ワ ー ド ) 境界で整列 さ れ ます。 8 8 バ イ ト (ダブル ワ ー ド ) 境界で整列 さ れます。 デフ ォル ト --min_array_alignment オプシ ョ ン を指定 し なか っ た場合、 コ ンパ イ ラ は --min_array_alignment=1 が指定 さ れた と き と 同 じ 処理を実行 し ます。 例 --min_array_alignment=8 を指定 し て以下の コ ー ド を コ ンパ イ ルす る と 、 コ メ ン ト に記載 さ れてい る バ イ ト 境界で整列 さ れ ます。 char arr_c1[1]; char c1; // alignment == 8 // alignment == 1 関連項目 • 「__align」 (ページ 4-2) • 2-102 「__ALIGNOF__」 (ページ 4-5) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.111 --mm こ のオプシ ョ ンは -M --no_depend_system_headers と 同 じ 効果があ り ます。 関連項目 「--depend_system_headers, --no_depend_system_headers」 • (ページ 2-47) • 「-M」 (ページ 2-99) 2.1.112 --multibyte_chars, --no_multibyte_chars こ れ ら のオプシ ョ ン を使用す る と 、 コ メ ン ト 、 文字列 リ テ ラ ル、 お よ び文字 定数に使用 さ れてい る マルチバ イ ト 文字シーケ ン ス を処理す る か ど う か を指 定で き ます。 デ フ ォル ト デフ ォ ル ト は --no_multibyte_chars です。 使用法 マルチバ イ ト のエ ン コ ーデ ィ ン グは、 日本語の Shift-Japanese Industrial Standard (Shift-JIS) に代表 さ れ る 文字セ ッ ト に使用 さ れ ます。 関連項目 • 「--locale=lang_country」 (ページ 2-96) • 「--message_locale=lang_country[.codepage]」 (ページ 2-100) 2.1.113 --multifile, --no_multifile こ のオプシ ョ ン を使用す る と 、 マルチ フ ァ イ ルの コ ンパ イ ルを有効ま たは無 効にで き ます。 --multifile が指定 さ れ る と 、 コ ンパ イ ラ は、 個々の フ ァ イ ルではな く 、 コ マ ン ド ラ イ ン で指定 さ れたすべての フ ァ イ ルに対 し て最適化を実行 し ます。 指 定 さ れた フ ァ イ ルは、 1 つのオブジ ェ ク ト フ ァ イ ルに コ ンパ イ ル さ れます。 結合 さ れたオブジ ェ ク ト フ ァ イ ルには、 コ マ ン ド ラ イ ン で最初に指定 し た ソ ース フ ァ イ ルに基づいた名前が付け ら れ ます。 結合 さ れたオブジ ェ ク ト フ ァ イ ルに別の名前を指定す る には、-o filename オプシ ョ ン を使用 し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-103 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン コ マ ン ド ラ イ ン で指定 し た後続の各 ソ ース フ ァ イ ルに空のオブジ ェ ク ト フ ァ イ ルが作成 さ れ、 標準の make シ ス テ ム の要件を満た し ます。 注 コ マ ン ド ラ イ ン で ソ ース フ ァ イ ルを 1 つ し か指定 し ない場合は、 --multifile を指定 し て コ ンパ イ ル し て も 機能 し ません。 デフ ォル ト オプシ ョ ン -O3 が指定 さ れていない限 り 、 デフ ォ ル ト は --no_multifile にな り ます。 オプシ ョ ン -O3 が指定 さ れてい る場合は、 デフ ォル ト は --multifile にな り ます。 使用法 --multifile が指定 さ れ る と 、 コ ンパ イ ラ に よ っ て、 複数の ソ ース フ ァ イ ルが コ ンパ イ ル さ れ、 追加で最適化が実行 さ れ る 場合があ り ます。 コ マ ン ド ラ イ ン で指定で き る ソ ース フ ァ イ ル数に制限はあ り ません が、--multifile を使用す る 場合、 コ ンパ イ ル時に大量の メ モ リ が必要にな る た め、 実質的な ソ ース フ ァ イ ルの制限は 10 個です。 最適な結果を得 る には、 機 能的に関連す る ソ ース フ ァ イ ルで構成す る 小 さ な グループ を選択す る よ う に し て下 さ い。 例 armcc -c --multifile test1.c ... testn.c -o test.o 結果 と し て得 ら れたオブジ ェ ク ト フ ァ イ ルは、 test1.c ではな く 、 test.o と 名 前が付け ら れ、 空のオブジ ェ ク ト フ ァ イ ル test2.o ~ testn.o は、 コ マ ン ド ラ イ ン で指定 さ れた ソ ース フ ァ イ ル test1.c ... testn.c ご と に作成 さ れ ます。 関連項目 • 「-c」 (ページ 2-24) • • • • • 2-104 「--default_extension=ext」 (ページ 2-42) 「--ltcg」 (ページ 2-98) 「-o filename」 (ページ 2-106) 「-Onum」 (ページ 2-108) 「--whole_program」 (ページ 2-151) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.114 --multiply_latency=cycles こ のオプシ ョ ンは、 ハー ド ウ ェ ア乗算器が使用 し たサ イ ク ル数を コ ンパ イ ラ に知 ら せます。 構文 --multiply_latency=cycles cycles は使用 し たサ イ ク ル数です。 使用法 こ のオプシ ョ ン を使用 し て、 乗算器ブ ロ ッ ク と チ ッ プの関連部分を使用 し て 乗算を行 う MUL 命令に必要なサ イ ク ル数を コ ンパ イ ラ に知 ら せます。 完了す る ま で、 チ ッ プの こ れ ら の部分を別の命令に使用す る こ と はで き ません。 MUL の結果を後の命令で使用す る こ と も で き ません。 プ ロ セ ッ サの特定のハー ド ウ ェ ア実装には乗算器オプシ ョ ン を複数備え る こ と も 可能です。 例えば、 1 サ イ ク ルで実行す る 実装 も あれば、 実行に 33 サ イ ク ルかか る 実装 も あ り ます。 こ のオプシ ョ ンは、 特定のプ ロ セ ッ サの正 し い サ イ ク ル数を伝達す る ために使用 し ます。 例 --multiply_latency=33 関連項目 • 『Cortex™-M1 テ ク ニ カル リ フ ァ レ ン ス マニ ュ アル』 2.1.115 --nonstd_qualifier_deduction, --no_nonstd_qualifier_deduction こ のオプシ ョ ン を使用す る と 、 指定 さ れた名前の修飾子の部分で、 非標準テ ン プ レー ト 引数を推論す る か ど う か を C++ で制御で き ます。 こ の機能が イ ネーブル さ れてい る と 、 テ ン プ レー ト パ ラ メ ー タ T のテ ン プ レー ト 引数が、 A<T>::B ま たは T::B な ど の コ ン テ キ ス ト と し て推論 さ れます。 標準的な推測 メ カ ニ ズ ム では、 こ れ ら の コ ン テ キ ス ト が、 明示的に指定 さ れ たか他の場所で推測 さ れたテ ンプ レー ト パ ラ メ ー タ の値を使用す る 非推測 コ ン テ キ ス ト と し て処理 さ れ ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-105 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 注 オプシ ョ ン --nonstd_qualifier_deduction は、 C++ 標準に準拠 し ていない従来の ソ ース コ ー ド を移行す る 目的でのみ提供 さ れてい ます。 他の目的で こ のオプ シ ョ ン を使用す る こ と はお勧め し ません。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デフ ォル ト デフ ォ ル ト は --no_nonstd_qualifier_deduction です。 2.1.116 -o filename 出力フ ァ イ ルの名前を指定 し ます。 生成 さ れた出力フ ァ イ ルの フルネームは、 表 2-5 お よ び表 2-6 (ページ 2-107) で説明 さ れてい る よ う に、 使用 さ れ る オ プシ ョ ン の組み合わせに よ っ て異な り ます。 構文 -o オプシ ョ ン を指定す る と 、 コ ンパ イ ラ は、 表 2-5 の規則に従っ て、 出力 フ ァ イ ルに名前を付け ます。 表 2-5 -o オプ シ ョ ン を使用 し た コ ンパイル コ ンパイ ラ オプ ション アクシ ョ ン 出力を標準出力ス ト リ ームに書き 込み ます -o- 使用に関する注意 事項 filename は - です。 -E が指定 さ れない 限 り 、 -S と 想定 さ れ ます。 -o filename filename と い う 名前で実行可能 イ メ ー ジ を生成 し ます 2-106 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 表 2-5 -o オプ シ ョ ン を使用 し た コ ンパイル ( 続き ) コ ンパイ ラ オプ ション アクシ ョ ン -c -o filename filename と い う 名前でオプシ ョ ン フ ァ 使用に関する注意 事項 イ ルを生成 し ます -S -o filename filename と い う 名前でアセ ンブ リ 言語 フ ァ イ ルを生成 し ます -E -o filename filename と い う 名前でプ リ プ ロ セ ッ サ の出力を含むフ ァ イ ルを生成 し ます -o オプシ ョ ン を指定 し ない場合は、 コ ンパ イ ラ は、 表 2-6 の規則に従っ て、 出力フ ァ イ ルに名前を付け ます。 表 2-6 -o オプ シ ョ ン を使用 し ない コ ンパイル コ ンパイ ラ オプ ション アクシ ョ ン -c フ ァ イ ル拡張子 .o が付け ら れた入力 フ ァ イ ル名がデフ ォ ル ト で使用 さ れ る オブジ ェ ク ト フ ァ イ ルを生成 し ます -S フ ァ イ ル拡張子 .s が付け ら れた入力 フ ァ イ ル名がデフ ォ ル ト で使用 さ れ る 出力フ ァ イ ルを生成 し ます -E プ リ プ ロ セ ッ サの出力を標準出力ス ト リ ームに書 き 込みます (オプシ ョ ン な し ) __image.axf のデフ ォ ル ト 名で実行可能 イ メ ージ を生成 し ます 使用に関する注意 事項 コ マ ン ド ラ イ ンで は、 -o、 -c、 -E ま た は -S は指定 さ れま せん。 注 こ のオプシ ョ ンは、--default_extension オプシ ョ ン を オーバー ラ イ ド し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-107 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--asm」 (ページ 2-17) • • • • • • • • • 「-c」 (ページ 2-24) 「--default_extension=ext」 (ページ 2-42) 「--depend=filename」 (ページ 2-44) 「--depend_format=string」 (ページ 2-45) 「-E」 (ページ 2-58) 「--interleave」 (ページ 2-84) 「--list」 (ページ 2-92) 「--md」 (ページ 2-100) 「-S」 (ページ 2-127) 2.1.117 -Onum こ のオプシ ョ ン を使用す る と 、 ソ ース フ ァ イ ルの コ ンパ イ ル時に使用す る 最 適化レベルを指定で き ます。 構文 -Onum num には、 以下のいずれか を指定 し ます。 0 最小限の最適化。 ほ と ん ど の最適化を実行 し ません。 デバ ッ グ ビ ュ ーを可能な限 り 最適化す る 、 最 も 低い最適化レベルです。 1 制限 さ れた最適化。 未使用の イ ン ラ イ ン関数 と 静的関数を削除 し ます。 デバ ッ グ ビ ュ ーに著 し く 悪影響を及ぼす最適化は実行 し ま せん。 こ のオプシ ョ ン を --debug と 組み合わせて使用す る と 、 十 分満足で き る デバ ッ グ ビ ュ ー と 優れた コ ー ド 密度が提供 さ れ ま す。 2 高度な最適化。 --debug と 組み合わせて使用す る と 、 オブジ ェ ク ト コ ー ド と ソ ース コ ー ド と の間のマ ッ プが明確でない場合があ る ため、 デバ ッ グ ビ ュ ーの質は低下 し ます。 こ れがデフ ォ ル ト の最適化レベルです。 2-108 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 最大限の最適化。 -O3 は -O2 と 同 じ 最適化を実行 し ますが、-O2 と 比 べ る と 、 生成 さ れ る コ ー ド のサ イ ズや実行速度のバ ラ ン ス を重 点的に最適化 し ます。 つま り 、 以下の よ う にな り ます。 3 • -O3 -Otime を指定す る と 、 イ メ ージのサ イ ズが大 き く な る 可 能性はあ り ますが、-O2 -Otime を指定 し た場合 よ り も 実行速 度が速い コ ー ド が生成 さ れ る よ う に最適化 さ れ ます。 • -O3 -Ospace を指定す る と 、 実行速度が遅 く な る 可能性はあ り ますが、-O2 -Ospace を指定 し た場合 よ り も コ ー ド のサ イ ズ が小 さ く な る よ う に最適化 さ れ ます。 ま た、-O3 を使用す る と 、 さ ら に以下の よ う な強力な最適化を実 行で き ます。 • ループの展開な ど、 -O3 -Otime が指定 さ れた場合のハ イ レベ ルの ス カ ラ の最適化。 コ ー ド サ イ ズの増加を抑え なが ら パ フ ォ ーマ ン ス を大幅に向上で き ますが、 ビル ド に時間がか か る 可能性があ り ます。 • -O3 -Otime が指定 さ れた場合の、 よ り 強力な イ ン ラ イ ン展開 と イ ン ラ イ ン展開の自動化。 • デフ ォ ル ト で実行 さ れ る マルチ フ ァ イ ル コ ンパ イ ル。 注 --fpmode オプシ ョ ン を使用 し て該当す る 数値モデルを選択す る と 、 浮動小数 点 コ ー ド のパフ ォ ーマ ン ス が影響を受け る 場合があ り ます。 注 最適化オプシ ョ ンの実装情報は今後の リ リ ース で変更 さ れ る 可能性があ る た め、 こ れ ら の情報に依存 し ない よ う に し て下 さ い。 デ フ ォル ト -Onum を指定 し ない場合は、-O2 が想定 さ れ ます。 関連項目 • 「--autoinline, --no_autoinline」 (ページ 2-19) • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--debug, --no_debug」 (ページ 2-41) 「--forceinline」 (ページ 2-66) 「--fpmode=model」 (ページ 2-67) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-109 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • • • • • • 「--inline, --no_inline」 (ページ 2-83) 「--ltcg」 (ページ 2-98) 「--multifile, --no_multifile」 (ページ 2-103) 「-Ospace」 「-Otime」 (ページ 2-111) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「 コー ド の最適化」 (ページ 5-2) 2.1.118 --old_specializations, --no_old_specializations こ のオプシ ョ ン を使用す る と 、 旧方式のテ ン プ レー ト 特殊化を実行す る か ど う か を C++ で指定で き ます。 旧方式のテ ンプ レー ト 特殊化では、 template<> 構文が使用 さ れ ません。 注 オプシ ョ ン --old_specializations は、 C++ 標準に準拠 し ていない従来の ソ ース コ ー ド を移行す る 目的でのみ提供 さ れてい ます。 他の目的で こ のオプシ ョ ン を使用す る こ と はお勧め し ません。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デフ ォル ト デフ ォ ル ト は --no_old_specializations です。 2.1.119 -Ospace こ のオプシ ョ ン を使用す る と 、 実行時間が長 く な る 可能性はあ り ますが、 イ メ ージサ イ ズが小 さ く な る よ う に最適化 さ れます。 パフ ォ ーマ ン ス よ り も コ ー ド サ イ ズが重要な場合は、 こ のオプシ ョ ン を使用 し ます。 例えば、 -Ospace オプシ ョ ン を指定す る と 、 大 き な構造の コ ピーは、 イ ン ラ イ ン コ ー ド ではな く ア ウ ト オブ ラ イ ンの関数を呼び出す こ と で実行 さ れます。 必要に応 じ て、 コ ー ド の中で時間が優先 さ れ る 部分は -Otime を使用 し て コ ン パ イ ル し 、 それ以外の部分は -Ospace を使用 し て コ ンパ イ ルす る こ と がで き ま す。 2-110 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン デ フ ォル ト -Ospace と -Otime を両方 と も 指定 し なか っ た場合、 コ ンパ イ ラ は -Ospace が指定 さ れた と き と 同 じ 処理を し ます。 関連項目 • 「-Otime」 • • • • 「-Onum」 (ページ 2-108) 「#pragma Onum」 (ページ 4-72) 「#pragma Ospace」 (ページ 4-73) 「#pragma Otime」 (ページ 4-73) 2.1.120 -Otime こ のオプシ ョ ン を使用す る と 、 イ メ ージサ イ ズが大 き く な る 可能性はあ り ま すが、 実行時間が短 く な る よ う に最適化 さ れ ます。 コ ー ド サ イ ズ よ り も 実行時間が重要な場合は、 こ のオプシ ョ ン を使用 し ます。 必要に応 じ て、 コ ー ド の中で時間が優先 さ れ る 部分は -Otime を使用 し て コ ン パ イ ル し 、 それ以外の部分は -Ospace を使用 し て コ ンパ イ ルす る こ と がで き ま す。 デ フ ォル ト -Otime を指定 し ない場合は、-Ospace が想定 さ れ ます。 例 -Otime オプシ ョ ン を指定す る と 、 while (expression) body; が以下の よ う に コ ンパ イ ル さ れ ます。 if (expression) { do body; while (expression); } ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-111 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--multifile, --no_multifile」 (ページ 2-103) • • • • • 「-Onum」 (ページ 2-108) 「-Ospace」 (ページ 2-110) 「#pragma Onum」 (ページ 4-72) 「#pragma Ospace」 (ページ 4-73) 「#pragma Otime」 (ページ 4-73) 2.1.121 --parse_templates, --no_parse_templates こ のオプシ ョ ン を使用 し て、 非 ク ラ ス のテ ン プ レー ト を汎用形式で解析す る か ど う か、 つま り テ ン プ レー ト が定義 さ れ、 イ ン ス タ ン ス化 さ れ る 前に解析 す る か ど う か を C++ で指定で き ます。 注 オプシ ョ ン --no_parse_templates は、 C++ 標準に準拠 し ていない従来の ソ ース コ ー ド を移行す る 目的でのみ提供 さ れてい ます。 他の目的で こ のオプシ ョ ン を使用す る こ と はお勧め し ません。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デフ ォル ト デフ ォ ル ト は --parse_templates です。 注 依存名の処理を イ ネーブル し た場合は、 解析がデフ ォ ル ト で実行 さ れ る た め、--no_parse_templates を --dep_name と 組み合わせて使用す る こ と はで き ませ ん。 こ れ ら のオプシ ョ ン を組み合わせて使用す る と 、 エ ラ ーが生成 さ れ ます。 関連項目 • 「--dep_name, --no_dep_name」 (ページ 2-43) • 2-112 「テ ンプ レー ト の イ ン ス タ ン ス生成」 (ページ 5-17) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.122 --pch こ のオプシ ョ ンは、 PCH フ ァ イ ルが存在す る 場合は こ れを使用 し 、 存在 し な い場合は PCH フ ァ イ ルを作成す る よ う に コ ンパ イ ラ に指示 し ます。 オプシ ョ ン --pch が指定 さ れ る と 、 コ ンパ イ ラ は、 filename.pch と い う 名前の PCH フ ァ イ ルを検索 し ます。 こ の と き 、 filename.* は元の ソ ース フ ァ イ ルの名 前 と な り ます。 コ ンパ イ ラ は、 PCH フ ァ イ ル filename.pch が存在す る 場合は、 こ れを使用 し 、 存在 し ない場合は、 元の ソ ース フ ァ イ ル と 同 じ デ ィ レ ク ト リ に filename.pch と い う 名前の PCH フ ァ イ ルを作成 し ます。 制約条件 こ のオプシ ョ ンは、 同 じ コ マ ン ド ラ イ ン にオプシ ョ ン --use_pch=filename ま た はオプシ ョ ン --create_pch=filename が含まれてい る 場合は機能 し ません。 関連項目 「--create_pch=filename」 (ページ 2-39) • • • • • • • • 「--pch_dir=dir」 「--pch_messages, --no_pch_messages」 (ページ 2-114) 「--pch_verbose, --no_pch_verbose」 (ページ 2-115) 「--use_pch=filename」 (ページ 2-144) 「#pragma hdrstop」 (ページ 4-70) 「#pragma no_pch」 (ページ 4-72) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「プ リ コ ンパ イ ルヘ ッ ダ フ ァ イ ル」 (ページ 2-19) 2.1.123 --pch_dir=dir こ のオプシ ョ ン を使用 し て、 PCH フ ァ イ ルが保存 さ れ る デ ィ レ ク ト リ を指定 で き ます。 こ のデ ィ レ ク ト リ は、 PCH フ ァ イ ルが作成 さ れた り 、 使用 さ れた り す る と 、 ア ク セ ス で き る よ う にな り ます。 こ のオプシ ョ ンは、 自動ま たは手動の PCH モー ド で使用で き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-113 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 構文 --pch_dir=dir 各パ ラ メ ー タ には以下の意味があ り ます。 PCH フ ァ イ ルが保存 さ れ る デ ィ レ ク ト リ の名前です。 dir エラー 指定 さ れたデ ィ レ ク ト リ dir が存在 し ない場合、 コ ンパ イ ラ に よ っ てエ ラ ー が生成 さ れます。 関連項目 • 「--create_pch=filename」 (ページ 2-39) • • • • • • • 「--pch」 (ページ 2-113) 「--pch_messages, --no_pch_messages」 「--pch_verbose, --no_pch_verbose」 (ページ 2-115) 「--use_pch=filename」 (ページ 2-144) 「#pragma hdrstop」 (ページ 4-70) 「#pragma no_pch」 (ページ 4-72) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「プ リ コ ンパ イ ルヘ ッ ダ フ ァ イ ル」 (ページ 2-19) 2.1.124 --pch_messages, --no_pch_messages こ のオプシ ョ ン を使用す る と 、 現在の コ ンパ イ ルで PCH フ ァ イ ルが使用 さ れ た こ と を示す メ ッ セージ を表示す る か ど う か を指定で き ます。 デフ ォル ト デフ ォ ル ト は --pch_messages です。 関連項目 「--create_pch=filename」 (ページ 2-39) • • • • • 2-114 「--pch」 (ページ 2-113) 「--pch_dir=dir」 (ページ 2-113) 「--pch_verbose, --no_pch_verbose」 (ページ 2-115) 「--use_pch=filename」 (ページ 2-144) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • • • 「#pragma hdrstop」 (ページ 4-70) 「#pragma no_pch」 (ページ 4-72) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「プ リ コ ンパ イ ルヘ ッ ダ フ ァ イ ル」 (ページ 2-19) 2.1.125 --pch_verbose, --no_pch_verbose こ のオプシ ョ ン を使用す る と 、 フ ァ イ ルを プ リ コ ンパ イ ルで き ない理由を示 す メ ッ セージ を表示す る か ど う か を指定で き ます。 自動 PCH モー ド では、 こ のオプシ ョ ン を指定す る と 、 現在の コ ンパ イ ルに使 用で き ない PCH フ ァ イ ルご と に、 使用で き ない理由を示す メ ッ セージが表示 さ れ ます。 デ フ ォル ト デフ ォ ル ト は --no_pch_verbose です。 関連項目 「--create_pch=filename」 (ページ 2-39) • • • • • • • • 「--pch」 (ページ 2-113) 「--pch_dir=dir」 (ページ 2-113) 「--pch_messages, --no_pch_messages」 (ページ 2-114) 「--use_pch=filename」 (ページ 2-144) 「#pragma hdrstop」 (ページ 4-70) 「#pragma no_pch」 (ページ 4-72) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「プ リ コ ンパ イ ルヘ ッ ダ フ ァ イ ル」 (ページ 2-19) 2.1.126 --pending_instantiations=n こ のオプシ ョ ン を使用す る と 、 同時に イ ン ス タ ン ス化で き る テ ン プ レー ト の 最大数を C++ で指定で き ます。 構文 --pending_instantiations=n ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-115 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 各パ ラ メ ー タ には以下の意味があ り ます。 使用可能な同時に イ ン ス タ ン ス化で き る テ ン プ レー ト の最大数 です。 n n が 0 の場合、 制限はあ り ません。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デフ ォル ト --pending_instantations オプシ ョ ン を指定 し なか っ た場合、 コ ンパ イ ラ は --pending_instantiations=64 が指定 さ れた と き と 同 じ 処理を実行 し ます。 使用法 こ のオプシ ョ ン を使用す る と 、 無制限に繰 り 返 さ れ る イ ン ス タ ン ス化を検出 で き ます。 2.1.127 --phony_targets こ のオプシ ョ ンは、 ダ ミ ーの メ ー ク フ ァ イ ル規則を生成す る よ う コ ンパ イ ラ に指示 し ます。 こ れ ら の規則は、 メ ー ク フ ァ イ ルに対応す る 更新を行わずに ヘ ッ ダーフ ァ イ ルを削除 し た場合に生成 さ れ る make エ ラ ーを回避 し ます。 こ のオプシ ョ ンは、 GCC の コ マ ン ド ラ イ ン オプシ ョ ン -MG に似てい ます。 例 出力例 source.o: source.c source.o: header.h header.h: 関連項目 • 「--depend=filename」 (ページ 2-44) • • 「--depend_format=string」 (ページ 2-45) 「--depend_system_headers, --no_depend_system_headers」 (ページ 2-47) • 2-116 「--depend_target=target」 (ページ 2-48) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • • • 「--ignore_missing_headers」 (ページ 2-80) 「-M」 (ページ 2-99) 「--md」 (ページ 2-100) 2.1.128 --pointer_alignment=num こ のオプシ ョ ン を使用 し て、 アプ リ ケーシ ョ ン に必要な非境界整列ポ イ ン タ のサポー ト を指定で き ます。 構文 --pointer_alignment=num num には以下のいずれか を指定で き ます。 1 ポ イ ン タ を介 し た ア ク セ ス は、 境界整列が 1 であ る (バ イ ト 境界 で整列 さ れ る か境界整列 さ れない) も の と し て処理 さ れ ます。 2 ポ イ ン タ を介 し た ア ク セ ス は、 境界整列が最大 2 であ る (ハーフ ワー ド 境界で整列 さ れ る ) も の と し て処理 さ れ ます。 4 ポ イ ン タ を介 し た ア ク セ ス は、 境界整列が最大 4 であ る ( ワー ド 境界で整列 さ れ る ) も の と し て処理 さ れます。 8 ポ イ ン タ でのア ク セ ス は、 通常の境界整列であ る と し て、 つま り 最大で も ダブル ワー ド 境界で整列 さ れ る も の と し て処理 さ れ ます。 使用法 こ のオプシ ョ ンは、 境界整列要件がないアーキ テ ク チ ャ 用に記述 さ れた ソ ー ス コ ー ド を移植す る 場合に利用で き ます。 __packed 修飾子を使用す る こ と で、 生成 さ れ る コ ー ド の質に大 き な影響を及ぼす こ と な く 、 非境界整列デー タ へ のア ク セ ス を よ り 厳密に制御で き ます。 制約条件 ポ イ ン タ が境界整列 さ れていない と 、 非境界整列ア ク セ ス がサポー ト さ れた CPU で も 、 コ ー ド サ イ ズが大 き く な る こ と があ り ます。 こ れは、 非境界整列 ア ク セ ス のサポー ト に よ る メ リ ッ ト は、 ロ ー ド 命令 と ス ト ア命令のサブセ ッ ト に し かないか ら です。 コ ンパ イ ラ は、 非境界整列 さ れた メ モ リ オブジ ェ ク ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-117 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン ト に対 し て、 ハー ド ウ ェ ア浮動小数点の ロ ー ド 命令 と ス ト ア命令な ど、 多重 ワー ド 転送命令ま たは コ プ ロ セ ッ サ と メ モ リ 間の転送命令を直接的に使用す る こ と がで き ません。 注 • v6 以前のアーキ テ ク チ ャ な ど、 非境界整列ア ク セ ス のハー ド ウ ェ アサ ポー ト がない CPU 用に コ ンパ イ ルを行 う と 、 コ ー ド サ イ ズが著 し く 増 大す る 場合があ り ます。 • こ のオプシ ョ ン に よ っ て、 メ モ リ 内のオブジ ェ ク ト の配置や、 構造体の レ イ ア ウ ト と パデ ィ ン グが影響を受け る こ と はあ り ません。 関連項目 • 「__packed」 (ページ 4-12) • • 「#pragma pack(n)」 (ページ 4-73) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「デー タ の境界整列」 (ページ 5-29) 2.1.129 --preinclude=filename こ のオプシ ョ ン を使用す る と 、 指定 さ れた フ ァ イ ルの ソ ース コ ー ド が コ ンパ イ ルの開始時に イ ン ク ルー ド さ れます。 構文 --preinclude=filename 各パ ラ メ ー タ には以下の意味があ り ます。 filename ソ ース コ ー ド が イ ン ク ルー ド さ れ る フ ァ イ ルの名前です。 使用法 こ のオプシ ョ ン を使用す る こ と に よ っ て、 標準のマ ク ロ 定義を確立で き ます。 filename は、 イ ン ク ルー ド 検索 リ ス ト 上のデ ィ レ ク ト リ 内か ら 検索 さ れ ます。 コ マ ン ド ラ イ ン で こ のオプシ ョ ン を繰 り 返 し 指定す る こ と も で き ます。 その 結果、 指定 し た順に フ ァ イ ルが事前に含まれます。 例 armcc --preinclude file1.h --preinclude file2.h -c source.c 2-118 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「-Idir[,dir,...]」 (ページ 2-79) • • • • 「-Jdir[,dir,...]」 (ページ 2-86) 「--kandr_include」 (ページ 2-87) 「--sys_include」 (ページ 2-135) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「ヘ ッ ダ フ ァ イ ル」 (ページ 2-16) 2.1.130 --preprocessed こ のオプシ ョ ンは、 フ ァ イ ル名拡張子が .i の フ ァ イ ルを、 マ ク ロ が既に代入 さ れたかの よ う にプ リ プ ロ セ ッ サに処理 さ せます。 使用法 こ のオプシ ョ ン を使用す る と 、 別のプ リ プ ロ セ ッ サ を使用で き ます。 前処理 さ れた コー ド を生成し、 --preprocessed を使用し てそれを フ ァ イ ル名 .i フ ァ イ ルの 形式で コ ンパ イ ラ に渡し て、 フ ァ イ ルが前処理済みであ る こ と を知 ら せます。 制限 こ のオプシ ョ ンはマ ク ロ にのみ適用 さ れ ます。 ト リ グ ラ フ、 ラ イ ン連結、 コ メ ン ト 、 お よ びその他のプ リ プ ロ セ ッ サ項目は、 通常どお り にプ リ プ ロ セ ッ サに よ っ て前処理 さ れます。 --compile_all_input を使用す る 場合、.i フ ァ イ ルは .c フ ァ イ ル と し て処理 さ れ ます。 プ リ プ ロ セ ッ サは、 前処理がなか っ た よ う に動作 し ます。 例 armcc --preprocessed foo.i -c -o foo.o 関連項目 • 「--compile_all_input, --no_compile_all_input」 (ページ 2-27) • ARM DUI 0348BJ ID 1 0 0 4 1 9 「-E」 (ページ 2-58) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-119 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.131 --profile=filename こ のオプシ ョ ン を使用す る と 、 ARM Profiler か ら の フ ィ ー ド バ ッ ク を使用す る よ う に コ ンパ イ ラ に指定す る こ と に よ り 、 サ イ ズが小 さ く パフ ォ ーマ ン ス の高い コ ー ド を生成で き ます。 構文 --profile=filename 各パ ラ メ ー タ には以下の意味があ り ます。 filename ARM Profiler 解析フ ァ イ ルの名前です。 例 こ の例では、 hello.c の コ ー ド を生成す る と き に、 hello_001.apa で提供 さ れ る ARM Profiler フ ィ ー ド バ ッ ク が使用 さ れ ます。 armcc -c -O3 -Otime --profile=hello_001.apa hello.c 関連項目 • 『ARM Profiler ユーザガ イ ド 』 2.1.132 --project=filename, --no_project=filename オプシ ョ ン --project=filename は、 filename に よ っ て指定 さ れたプ ロ ジ ェ ク ト テ ン プ レー ト フ ァ イ ルを ロ ー ド す る よ う に コ ンパ イ ラ に指示 し ます。 注 filename をデフ ォ ル ト のプ ロ ジ ェ ク ト フ ァ イ ル と し て使用す る には、 RVDS_PROJECT 環境変数を filename に設定 し ます。 オプシ ョ ン --no_project を指定す る と 、 環境変数 RVDS_PROJECT で指定 さ れたデ フ ォ ル ト のプ ロ ジ ェ ク ト テ ン プ レー ト フ ァ イ ルは使用 さ れ ません。 構文 --project=filename --no_project 2-120 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 各パ ラ メ ー タ には以下の意味があ り ます。 filename プ ロ ジ ェ ク ト テ ン プ レー ト フ ァ イ ルの名前です。 制約条件 プ ロ ジ ェ ク ト テ ンプ レー ト フ ァ イ ルのオプシ ョ ンは、 コ マ ン ド ラ イ ン で設定 済みのオプシ ョ ン と 競合 し ない場合にのみ設定で き ます。 プ ロ ジ ェ ク ト テ ン プ レー ト フ ァ イ ルのオプシ ョ ンが既存の コ マ ン ド ラ イ ン オプシ ョ ン と 競合す る 場合は、 コ マ ン ド ラ イ ン オプシ ョ ンが優先 さ れます。 例 以下のプ ロ ジ ェ ク ト テ ンプ レー ト フ ァ イ ルについて考え てみます。 <!-- suiteconf.cfg --> <suiteconf name="Platform Baseboard for ARM926EJ-S"> <tool name="armcc"> <cmdline> --cpu=ARM926EJ-S --fpu=vfpv2 </cmdline> </tool> </suiteconf> RVDS_PROJECT 環境変数が こ の フ ァ イ ルを示す よ う に設定 さ れてい る 場合に、 次 の コ マ ン ド を実行 し た と し ます。 armcc -c foo.c の実際の コ マ ン ド ラ イ ンは、 以下の よ う にな り ます。 armcc --cpu=ARM926EJ-S --fpu=VFPv2 -c foo.c 関連項目 • 「--reinitialize_workdir」 (ページ 2-123) • 「--workdir=directory」 (ページ 2-152) 2.1.133 --reassociate-saturation こ のオプシ ョ ン を使用す る こ と で、 サチ ュ レー ト 演算の再関連付け を許可 し て、 サチ ュ レー ト 加算を使用す る ループ をベ ク ト ル化す る と き に最適化を強 化で き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-121 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 制限 サチ ュ レー ト 加算は関連付けで き ないため、 再関連付け を有効にす る と 結果 に影響 し 、 精度が落ち ます。 例 次の コ ー ド は、 --reassociate-saturation を指定 し なければベ ク ト ル化 し ませ ん。 #include <dspfns.h> int f(short *a, short *b) { int i; int r = 0; for (i = 0; i < 100; i++) r=L_mac(r,a[i],b[i]); return r; } 2.1.134 --reduce_paths, --no_reduce_paths こ のオプシ ョ ン を使用す る と 、 フ ァ イ ルパ ス の冗長なパ ス名情報の除外を有 効にす る か ま たは無効にで き ます。 冗長なパ ス名情報の除外が有効な場合、 コ ンパ イ ラ は、 オペレーテ ィ ン グ シ ス テ ム に渡 さ れたデ ィ レ ク ト リ パ ス か ら 形式 xyz\.. のシーケ ン ス を削除 し ま す。 こ れに よ っ て、 #include の検索な ど、 コ ンパ イ ラ に よ っ て作成 さ れたシ ス テ ムパ ス が イ ン ク ルー ド さ れ ます。 注 形式 xyz\.. のシーケ ン ス の削除は、 xyz が リ ン ク の場合、 無効 と な る 場合があ り ます。 モー ド こ のオプシ ョ ンは Windows シ ス テ ム でのみ使用で き ます。 2-122 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 使用法 Windows シ ス テ ム には、 フ ァ イ ルパ ス が 260 文字ま で と い う 制限があ り ます。 絶対名が 260 文字を超え る パ ス名が存在す る 場合、 --reduce_paths オプシ ョ ン を使用 し て、 デ ィ レ ク ト リ を .. の対応す る イ ン ス タ ン ス と マ ッ チア ッ プ し 、 directory/.. シーケ ン ス をペアで削除す る こ と に よ り 、 絶対パ ス名の長 さ を短 縮で き ます。 注 --reduce_paths オプシ ョ ン を使用 し てパ ス の長 さ を短縮す る のではな く 、 長い フ ァ イ ルパ スや深いネ ス ト 構造の フ ァ イ ルパ ス を使用 し ない よ う にす る こ と をお勧め し ます。 デ フ ォル ト デフ ォ ル ト は --no_reduce_paths です。 例 以下の フ ァ イ ル ..\..\..\xyzzy\xyzzy\objects\file.c を以下のデ ィ レ ク ト リ \foo\bar\baz\gazonk\quux\bop か ら コ ンパ イ ル し た と き の実際のパ ス は、 以下の よ う にな り ます。 \foo\bar\baz\gazonk\quux\bop\..\..\..\xyzzy\xyzzy\objects\file.o オプシ ョ ン --reduce_paths を使用 し て同 じ デ ィ レ ク ト リ か ら 同 じ フ ァ イ ルを コ ンパ イ ルす る と 、 実際のパ ス は以下の よ う にな り ます。 \foo\bar\baz\xyzzy\xyzzy\objects\file.c 2.1.135 --reinitialize_workdir こ のオプシ ョ ン を使用す る と 、 --workdir を使用 し てプ ロ ジ ェ ク ト テ ン プ レー ト の作業デ ィ レ ク ト リ を再初期化す る か ど う か を指定で き ます。 --workdir を使用 し て設定 さ れたデ ィ レ ク ト リ が、 変更 さ れたプ ロ ジ ェ ク ト テ ン プ レー ト フ ァ イ ルが含まれてい る 既存の作業デ ィ レ ク ト リ を参照 し てい る 場合、 こ のオプシ ョ ン を指定す る と 、 作業デ ィ レ ク ト リ は削除 さ れ、 元のプ ロ ジ ェ ク ト テ ン プ レー ト フ ァ イ ルの新 し い コ ピーで再作成 さ れます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-123 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 制約条件 こ のオプシ ョ ンは、 --workdir オプシ ョ ン と 組み合わせて使用す る 必要があ り ます。 関連項目 • 「--project=filename, --no_project=filename」 (ページ 2-120) • 「--workdir=directory」 (ページ 2-152) 2.1.136 --relaxed_ref_def, --no_relaxed_ref_def こ のオプシ ョ ン を使用す る と 、 複数のオブジ ェ ク ト フ ァ イ ルがグ ロ ーバル変 数の仮定義を使用で き る よ う にな り ます。 一部の従来型プ ロ グ ラ ムは、 こ の 宣言ス タ イ ルを使用 し て作成 さ れてい ます。 使用法 こ のオプシ ョ ンは主に、 GNU C と 互換性を保つために提供 さ れてい る も の で、 新 し いアプ リ ケーシ ョ ン コ ー ド には推奨 さ れません。 デフ ォル ト デフ ォ ル ト は厳密な参照 と 定義です (各グ ロ ーバル変数は、 1 つのオブジ ェ ク ト フ ァ イ ルでのみ宣言で き ます)。 ただ し 、 ARM Linux コ ン フ ィ ギ ュ レー シ ョ ン フ ァ イ ルを コ マ ン ド ラ イ ン で指定 し て、--translate_gcc を使用 し た場 合、 デフ ォ ル ト は --relaxed_ref_def にな り ます。 制約条件 こ のオプシ ョ ンは C++ で使用で き ません。 関連項目 • 「--arm_linux_config_file=path」 (ページ 2-12) • • • 2-124 「--arm_linux_configure」 (ページ 2-13) 「--translate_gcc」 (ページ 2-138) 『Rationale for International Standard - Programming Languages - C』 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.137 --remarks こ のオプシ ョ ンは、 構造内のパデ ィ ン グに関す る 警告な ど の注釈 メ ッ セージ を表示す る よ う に コ ンパ イ ラ に指示 し ます。 注 デフ ォ ル ト では、 注釈は表示 さ れ ません。 関連項目 • 「--brief_diagnostics, --no_brief_diagnostics」 (ページ 2-21) • • • • • • • • 「--diag_error=tag[,tag,...]」 (ページ 2-50) 「--diag_remark=tag[,tag,... ]」 (ページ 2-51) 「--diag_style={arm|ide|gnu}」 (ページ 2-52) 「--diag_suppress=tag[,tag,...]」 (ページ 2-53) 「--diag_warning=tag[,tag,...]」 (ページ 2-54) 「--errors=filename」 (ページ 2-60) 「-W」 (ページ 2-149) 「--wrap_diagnostics, --no_wrap_diagnostics」 (ページ 2-153) 2.1.138 --restrict, --no_restrict こ のオプシ ョ ン を使用す る と 、 C99 のキーワ ー ド restrict の使用を許可す る か ど う か を指定で き ます。 注 代替キー ワ ー ド __restrict お よ び __restrict__ は、 restrict の同義語 と し てサ ポー ト さ れ ます。 こ れ ら の代替キー ワー ド は、--restrict オプシ ョ ン を指定 し てい る か ど う かに関係な く 、 常に使用で き ます。 デ フ ォル ト ISO C99 ソ ース コ ー ド を コ ンパ イ ルす る 場合、 C99 キー ワ ー ド restrict はデ フ ォ ル ト で イ ネーブルにな っ てい ます。 ISO C90 ま たは ISO C++ ソ ース コ ー ド を コ ンパ イ ルす る 場合、C99 キー ワ ー ド restrict はデフ ォ ル ト でデ ィ セーブルにな っ てい ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-125 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「restrict」 (ページ 3-9) 2.1.139 --retain=option こ のオプシ ョ ン を使用す る と 、 コ ンパ イ ラ に よ っ て実行 さ れ る 最適化を制限 で き 、 検証、 デバ ッ グ、 カバレ ッ ジ テ ス ト な ど の実行時に便利です。 構文 --retain=option option には、 以下のいずれか を指定 し ます。 fns 使用 さ れていない関数が削除 さ れ る のを防ぎ ます。 inlinefns 使用 さ れていない イ ン ラ イ ン関数が削除 さ れ る の を防ぎ ます。 noninlinefns 使用 さ れていない非 イ ン ラ イ ン関数が削除 さ れ る のを防ぎ ます。 a||b か ら a|b への変換な ど、 パ ス削除に よ る 最適化が行われ る の paths を防ぎ ます。 こ れに よ り 、 MCDC (Modified Condition Decision Coverage) テ ス ト がサポー ト さ れます。 例えば イ ン ラ イ ン展開ま たは末尾呼び出 し に よ っ て、 呼び出 し が削除 さ れ る のを防ぎ ます。 calls calls:distinct 例えば ク ロ ス ジ ャ ン プ (つま り 、 共通末尾パ ス マージ) に よ っ て、 呼び出 し がマージ さ れ る のを防ぎ ます。 libcalls 例えば イ ン ラ イ ン展開に よ っ て、 ラ イ ブ ラ リ 関数への呼び出 し が削除 さ れ る のを防ぎ ます。 data デー タ が削除 さ れ る のを防ぎ ます。 rodata 読み出 し 専用デー タ が削除 さ れ る の を防ぎ ます。 rwdata 読み出 し / 書 き 込みデー タ が削除 さ れ る のを防ぎ ます。 data:order デー タ が並べ替え ら れ る の を防ぎ ます。 関連項目 • 「__attribute__((nomerge))」 (ページ 4-40) • 2-126 「__attribute__((notailcall))」 (ページ 4-41) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.140 --rtti, --no_rtti こ のオプシ ョ ン を使用す る と 、 RTTI 機能の dynamic_cast と typeid を C++ でサ ポー ト す る か ど う か を指定で き ます。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デ フ ォル ト デフ ォ ル ト は --rtti です。 関連項目 • 「--dllimport_runtime, --no_dllimport_runtime」 (ページ 2-56) 2.1.141 -S こ のオプシ ョ ンは、 コ ンパ イ ラ に よ っ て生成 さ れたマシ ン コ ー ド の逆アセ ン ブ リ を フ ァ イ ルに出力す る よ う に コ ンパ イ ラ に指示 し ます。 --asm オプシ ョ ン と は異な り 、 オブジ ェ ク ト モジ ュ ールは生成 さ れ ません。 ア セ ンブ リ 出力フ ァ イ ルの名前は、 デフ ォ ル ト では filename.s と な り 、 現在の 場所に配置 さ れ ます。 filename はデ ィ レ ク ト リ 名を取 り 除いた ソ ース フ ァ イ ル の名前です。 デフ ォ ル ト の フ ァ イ ル名は、-o オプシ ョ ン でオーバー ラ イ ド で き ます。 armasm を使用す る と 、 出力フ ァ イ ルを アセ ン ブル し てオブジ ェ ク ト コ ー ド を 生成で き ます。 コ ンパ イ ラ は、 出力を再アセ ンブルす る と き に互換性のあ る コ ンパ イ ラ オプシ ョ ン ま たはアセ ン ブ ラ オプシ ョ ンが使用 さ れ る よ う に、 AAPCS バ リ ア ン ト やバ イ ト 順序な ど の コ マ ン ド ラ イ ン オプシ ョ ン用に ASSERT デ ィ レ ク テ ィ ブ を追加 し ます。 アセ ンブ ラ と コ ンパ イ ラ には同 じ AAPCS 設定 を指定す る 必要があ り ます。 関連項目 「--apcs=qualifer...qualifier」 (ページ 2-4) • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--asm」 (ページ 2-17) 「-c」 (ページ 2-24) 「--info=totals」 (ページ 2-82) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-127 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • • • • 「--interleave」 (ページ 2-84) 「--list」 (ページ 2-92) 「-o filename」 (ページ 2-106) 『アセ ンブ ラ ガ イ ド 』 2.1.142 --shared こ のオプシ ョ ン を使用す る と 、 --arm_linux_paths オプシ ョ ン を使用 し て ARM Linux のビル ド を行 う と き に、 共有 ラ イ ブ ラ リ を生成で き ます。 ARM Linux コ ン フ ィ ギ ュ レーシ ョ ン に基づいて、 共有 ラ イ ブ ラ リ で使用す る のに適 し た ラ イ ブ ラ リ と 初期化 コ ー ド を選択で き ます。 制約条件 こ のオプシ ョ ンは、 --arm_linux_paths お よ び --apcs=/fpic と 共に使用す る 必要 があ り ます。 例 obj1.o と obj2.o と い う 2 つのオブジ ェ ク ト フ ァ イ ルを共有 ラ イ ブ ラ リ libexample.o に リ ン ク す る には、 次の よ う に指定 し ます。 armcc --arm_linux_paths --arm_linux_config_file=my_config_file --shared -o libexample.so obj1.o obj2.o 関連項目 • 「--arm_linux」 (ページ 2-10) • • • • • • • • • • • 2-128 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_configure」 (ページ 2-13) 「--arm_linux_paths」 (ページ 2-15) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_includes=paths」 (ページ 2-29) 「--configure_extra_libraries=paths」 (ページ 2-30) 「--configure_gcc=path」 (ページ 2-31) 「--configure_gld=path」 (ページ 2-32) 「--configure_sysroot=path」 (ページ 2-33) 「--translate_g++」 (ページ 2-136) 「--translate_gcc」 (ページ 2-138) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • • • • • 「--translate_gld」 (ページ 2-139) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 2.1.143 --show_cmdline こ のオプシ ョ ン を指定す る と 、 コ マ ン ド ラ イ ン オプシ ョ ンが ど の よ う に処理 さ れ る か を表示で き ます。 コ マ ン ド は適切な形式で表示 さ れ ます。 ま た、 via フ ァ イ ルの内容は展開 さ れ ます。 関連項目 • 「-Aopt」 (ページ 2-2) • • 「-Lopt」 (ページ 2-88) 「--via=filename」 (ページ 2-147) 2.1.144 --signed_bitfields, --unsigned_bitfields こ のオプシ ョ ン を使用す る と 、 int 型の ビ ッ ト フ ィ ール ド を符号付 き にす る か ど う か を指定で き ます。 C 標準では、 ビ ッ ト フ ィ ール ド を宣言す る 際に使用 さ れ る 型指定子が int ま た は int と し て定義 さ れた typedef 名の場合、 ビ ッ ト フ ィ ール ド が符号付 き にな る か ど う かは実装に よ っ て異な る と 規定 さ れてい ます。 デ フ ォル ト デフ ォ ル ト は、--unsigned_bitfields です。 ただ し 、 ARM Linux コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを コ マ ン ド ラ イ ン で指定 し て、 --translate_gcc ま たは --tranlsate_g++ を使用 し た場合、 デフ ォ ル ト は --signed_bitfields にな り ます。 注 ARM の ビ ッ ト フ ィ ール ド をデフ ォ ル ト で符号な し の値にす る AAPCS の要件 は、 バージ ョ ン 2.03 の標準では緩和 さ れま し た。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-129 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 例 typedef int integer; struct { integer x : 1; } bf; --signed_bitfields を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 符号付 き の ビ ッ ト フ ィ ール ド と し て処理 さ れ ます。 関連項目 • 「--arm_linux_config_file=path」 (ページ 2-12) • 「--arm_linux_configure」 (ページ 2-13) 2.1.145 --signed_chars, --unsigned_chars こ のオプシ ョ ン を使用す る と 、 char 型を符号付 き にす る か ど う か を指定で き ます。 char が符号付 き であ る 場合、 コ ンパ イ ラ はマ ク ロ __FEATURE_SIGNED_CHAR を定義 し ます。 注 こ のオプシ ョ ン を使用ま たは使用せずに コ ンパ イ ル さ れてお り 、 イ ン タ フ ェース ま たはデー タ 構造を共有 し てい る 変換ユニ ッ ト を混合す る と き は、 注意が必要です。 ARM ABI では、 char を符号な し バ イ ト と し て定義 し ます。 こ れは、 RVCT に 付属の C++ ラ イ ブ ラ リ が使用 し てい る 解釈です。 デフ ォル ト デフ ォ ル ト は --unsigned_chars です。 関連項目 • 2-130 「定義済みマ ク ロ 」 (ページ 4-129) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.146 --split_ldm こ のオプシ ョ ンは、LDM 命令 と STM 命令を複数の LDM 命令ま たは STM 命令に分割 す る よ う コ ンパ イ ラ に指示 し ます。 --split_ldm を選択す る と 、 LDM 命令ま たは STM 命令の レ ジ ス タ 転送の最大数が 以下に制限 さ れ ます。 • すべての STM 命令では最大 5 • PC を ロ ー ド し ない LDM 命令では最大 5 • PC を ロ ー ド す る LDM 命令では最大 4 こ れ ら の制限を超え た レ ジ ス タ 転送が要求 さ れ る と 、 複数の LDM 命令ま たは STM 命令が使用 さ れ ます。 使用法 --split_ldm オプシ ョ ン を使用す る と 、 以下の ARM シ ス テ ム で割 り 込みレ イ テ ン シ を減少 さ せ る こ と がで き ます。 • キ ャ ッ シ ュ レ ス ARM7TDMI な ど のキ ャ ッ シ ュ や書 き 込みバ ッ フ ァ のな い ARM シ ス テ ム • ゼ ロ ウ ェ イ ト 状態モー ド 、 32 ビ ッ ト メ モ リ を使用す る ARM シ ス テ ム 注 --split_ldm を使用す る と 、 コ ー ド サ イ ズが増加 し 、 パフ ォ ーマ ン ス が若干低 下 し ます。 制約条件 • --split_ldm を使用す る と 、 デフ ォ ル ト では イ ン ラ イ ン アセ ン ブ ラ の LDM 命令 と STM 命令が分割 さ れます。 ただ し 、 後で個々の命令が LDM 命令ま た は STM 命令に再連結 さ れ る こ と があ り ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 • --split_ldm を使用す る と 、 LDM 命令 と STM 命令のみが分割 さ れます。 • 一部の タ ーゲ ッ ト ハー ド ウ ェ アでは、--split_ldm を指定 し て コ ー ド を ビ ル ド し て も 効果があ り ません。 以下に例を示 し ます。 — キ ャ ッ シ ュ 付 き シ ス テ ムや書 き 込みバ ッ フ ァ 付 き プ ロ セ ッ サ。 — ゼ ロ ウ ェ イ ト 状態 メ モ リ を使用 し ていないシ ス テ ムや、 低速なペ リ フ ェ ラ ルデバ イ ス のあ る シ ス テ ム。 こ の よ う な シ ス テ ム の割 り 込 みレ イ テ ン シは、 最 も 速度の遅い メ モ リ ま たはペ リ フ ェ ラ ルデバ Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-131 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン イ スへのア ク セ ス に必要なサ イ ク ル数に よ っ て決ま り ます。 こ の割 り 込みレ イ テ ン シは、 通常、 複数レ ジ ス タ の転送に よ っ て誘発 さ れ る レ イ テ ン シ よ り も 大 き く な り ます。 関連項目 • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「命令の展開」 (ページ 7-10) 2.1.147 --split_sections こ のオプシ ョ ンは、 ソ ース フ ァ イ ルの関数ご と に、 1 つの ELF セ ク シ ョ ン が 生成す る よ う に コ ンパ イ ラ に指示 し ます。 出力セ ク シ ョ ン には、 そのセ ク シ ョ ン を生成 し た関数の名前に接頭文字 i. が 追加 さ れた名前が付け ら れます。 注 別々のセ ク シ ョ ンに特定のデー タ 項目ま たはデー タ 構造を配置す る 場合、 __attribute__((section(...))) を使用 し て こ れ ら を個別にマー ク し ます。 使用 さ れていない関数を削除す る 場合は、 こ のオプシ ョ ン よ り も リ ン カの フ ィ ー ド バ ッ ク に よ る 最適化を優先的に使用す る こ と をお勧め し ます。 こ れ は、 リ ン カの フ ィ ー ド バ ッ ク ではすべてのセ ク シ ョ ンの分割にかか る オー バーヘ ッ ド が発生 し ないので、 生成 さ れ る コ ー ド のサ イ ズが小 さ く な る か ら です。 制約条件 こ のオプシ ョ ン を指定す る と 、 関数間でア ド レ ス、 デー タ 、 お よ び文字列 リ テ ラ ルを共有す る 可能性が小 さ く な り ます。 こ のため、 一部の関数で コ ー ド のサ イ ズがわずかに増加 し ます。 例 int f(int x) { return x+1; } --split_sections を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 以下の コ ー ド が 生成 さ れ ます。 2-132 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン AREA ||i.f||, CODE, READONLY, ALIGN=2 f PROC ADD BX ENDP r0,r0,#1 lr 関連項目 • 「--data_reorder, --no_data_reorder」 (ページ 2-41) • • • • • 「--feedback=filename」 (ページ 2-63) 「--multifile, --no_multifile」 (ページ 2-103) 「__attribute__((section("name")))」 (ページ 4-43) 「#pragma arm section [section_sort_list]」 (ページ 4-63) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「 リ ン カの フ ィ ー ド バ ッ ク の使用」 (ページ 2-30) 2.1.148 --strict, --no_strict こ のオプシ ョ ン を使用す る と 、 使用 さ れた ソ ース言語に応 じ て、 厳密な C ま たは厳密な C++ への準拠の程度を指定で き ます。 --strict が指定 さ れ る と 、 以下の よ う にな り ます。 • ISO C ま たは ISO C++ と 競合す る 機能が無効に さ れ ます。 • 非標準機能が使用 さ れてい る 場合、 エ ラ ー メ ッ セージが表示 さ れます。 デ フ ォル ト デフ ォ ル ト は --no_strict です。 使用法 --strict を指定す る と 、 以下の標準への準拠が強 く 要求 さ れ ます。 ISO C90 ARM DUI 0348BJ ID 1 0 0 4 1 9 • ISO/IEC 9899:1990, the 1990 International Standard for C • ISO/IEC 9899 AM1, the 1995 Normative Addendum 1 ISO C99 ISO/IEC 9899:1999, the 1999 International Standard for C ISO C++ ISO/IEC 14822:2003, the 2003 International Standard for C++ Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-133 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン エラー --strict が有効にな っ てお り 、 関連す る ISO 標準の違反が発生 し た場合は、 エ ラ ー メ ッ セージが表示 さ れます。 診断 メ ッ セージの重大度は、 通常の方法で制御で き ます。 例 void foo(void) { long long i; /* okay in nonstrict C90 */ } --strict を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 エ ラ ーが生成 さ れ ます。 関連項目 「--c90」 (ページ 2-25) • • • • • • • 「--c99」 (ページ 2-26) 「--cpp」 (ページ 2-34) 「--gnu」 (ページ 2-75) 「--strict_warnings」 「識別子内の ド ル記号」 (ページ 3-14) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「 ソ ース言語モー ド 」 (ページ 1-4) 2.1.149 --strict_warnings --strict モー ド でエ ラ ーの診断は、 可能な場合は警告にダ ウ ン グ レー ド さ れ ます。 重大なエ ラ ー (修復す る 正 し いプ ロ グ ラ ム を作成で き ないな ど) は、 コ ンパ イ ラ でダ ウ ン グ レー ド で き ない場合 も あ り ます。 エラー --strict_warnings が有効にな っ てお り 、 関連す る ISO 標準の違反が発生 し た場 合は、 通常、 コ ンパ イ ラ に よ っ て警告 メ ッ セージが生成 さ れ ます。 診断 メ ッ セージの重大度は、 通常の方法で制御で き ます。 注 場合に よ っ ては、 厳密には不正な違反が検出 さ れ、 コ ンパ イ ルが終了 し た と き 、 警告の代わ り にエ ラ ーが生成 さ れ る 場合 も あ り ます。 以下に例を示 し ま す。 2-134 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン #ifdef $Super$ extern void $Super$$__aeabi_idiv0(void); /* intercept __aeabi_idiv0 */ #endif --strict_warnings を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 --dollar オプ シ ョ ン を使用 し なか っ た場合に、 エ ラ ーが生成 さ れます。 例 void foo(void) { long long i; /* okay in nonstrict C90 */ } --strict_warnings を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 警告 メ ッ セージ が生成 さ れます。 式 long long が厳密には不正な場合で も 、 コ ンパ イ ルは継続 し ます。 関連項目 「 ソ ース言語モー ド 」 (ページ 1-3) • • • • • • • 「識別子内の ド ル記号」 (ページ 3-14) 「--c90」 (ページ 2-25) 「--c99」 (ページ 2-26) 「--cpp」 (ページ 2-34) 「--gnu」 (ページ 2-75) 「--strict, --no_strict」 (ページ 2-133) 2.1.150 --sys_include こ のオプシ ョ ン を使用す る と 、 現在の場所が イ ン ク ルー ド 検索パ ス か ら 除外 さ れ ます。 引用符で囲ま れた イ ン ク ルー ド フ ァ イ ルは、 山形括弧で囲まれた イ ン ク ルー ド フ ァ イ ル と 同 じ よ う に処理 さ れ ます。 異な る のは、 引用符で囲まれた イ ン ク ルー ド フ ァ イ ルは -I に よ っ て指定 さ れたデ ィ レ ク ト リ で常に最初に検索 さ れ、 山形括弧で囲ま れた イ ン ク ルー ド フ ァ イ ルは -J に よ っ て指定 さ れたデ ィ レ ク ト リ で最初に検索 さ れ る と い う 点です。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-135 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「-Idir[,dir,...]」 (ページ 2-79) • • • • • 「-Jdir[,dir,...]」 (ページ 2-86) 「--kandr_include」 (ページ 2-87) 「--preinclude=filename」 (ページ 2-118) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「現在の場所」 (ページ 2-16) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「検索パ ス」 (ページ 2-17) 2.1.151 --thumb こ のオプシ ョ ン を使用す る と 、 Thumb 命令セ ッ ト が タ ーゲ ッ ト にな る よ う に コ ンパ イ ラ が設定 さ れます。 デフ ォル ト こ れは、 ARM 命令セ ッ ト に対応 し ていない タ ーゲ ッ ト のデフ ォ ル ト オプシ ョ ン です。 関連項目 • 「--arm」 (ページ 2-9) • 「#pragma arm」 (ページ 4-63) • 「#pragma thumb」 (ページ 4-79) • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「 タ ーゲ ッ ト プ ロ セ ッ サ ま たはアーキ テ ク チ ャ の指定」 (ページ 2-26) • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「 タ ーゲ ッ ト CPU の選択」 (ページ 5-4) 2.1.152 --translate_g++ こ のオプシ ョ ン を使用す る と 、 GNU ツールか ら の コ マ ン ド ラ イ ン の変換を有 効に し て、 GNU コ ンパ イ ラ を C++ モー ド でエ ミ ュ レー ト で き ます。 2-136 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 使用法 こ のオプシ ョ ン を使用す る と 、 以下のいずれかが提供 さ れ ます。 • ARM Linux を タ ーゲ ッ ト と し た完全な GCC エ ミ ュ レーシ ョ ン • 個々の GCC コ マ ン ド ラ イ ン引数を それに相当す る RVCT 引数に変換す る こ と に よ る 、 完全な GCC エ ミ ュ レーシ ョ ン のサブセ ッ ト 完全な ARM Linux GCC エ ミ ュ レーシ ョ ン を提供す る には、 --arm_linux_config_file も 使用す る 必要があ り ます。 こ れ ら のオプシ ョ ン を組 み合わせて使用す る こ と に よ り 、 コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルに よ っ て 指定 さ れた適切な GNU ヘ ッ ダ フ ァ イ ル と ラ イ ブ ラ リ が選択 さ れ、 デフ ォ ル ト 動作に対す る 変更が組み込ま れ ます。 完全な GCC エ ミ ュ レーシ ョ ン を目標 と せずに、 GCC コ マ ン ド ラ イ ン引数を それに相当す る RVCT 引数に変換す る には、 --translate_g++ を使用 し て g++ を エ ミ ュ レー ト し ます。 ただ し 、 --arm_linux_config_file と 一緒には使用 し ない で下 さ い。 こ の方法では完全な GCC エ ミ ュ レーシ ョ ン を目標 と し ていないの で、 RVCT のデフ ォ ル ト 動作が保持 さ れ、 ARM Linux を タ ーゲ ッ ト と し たデ フ ォ ル ト の設定は行われ ません。 RVCT ラ イ ブ ラ リ パ ス と オプシ ョ ン のデフ ォ ル ト は変更 さ れ ません。 制約条件 ARM Linux コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを コ マ ン ド ラ イ ン で指定 し て --translate_g++ を使用 し た場合は、--exceptions と --no_exceptions、--bss_threshold、--relaxed_ref_def と --no_relaxed_ref_def、 お よ び --signed_bitfields と --unsigned_bitfields のデフ ォ ル ト 設定が変更 さ れま す。 関連項目 「--arm_linux」 (ページ 2-10) • • • • • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_configure」 (ページ 2-13) 「--arm_linux_paths」 (ページ 2-15) 「--bss_threshold=num」 (ページ 2-22) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_includes=paths」 (ページ 2-29) 「--configure_extra_libraries=paths」 (ページ 2-30) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-137 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • • • • • • • • • • • • • 「--configure_gcc=path」 (ページ 2-31) 「--configure_gld=path」 (ページ 2-32) 「--configure_sysroot=path」 (ページ 2-33) 「--exceptions, --no_exceptions」 (ページ 2-61) 「--relaxed_ref_def, --no_relaxed_ref_def」 (ページ 2-123) 「--shared」 (ページ 2-127) 「--signed_bitfields, --unsigned_bitfields」 (ページ 2-129) 「--translate_gcc」 「--translate_gld」 (ページ 2-139) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 2.1.153 --translate_gcc こ のオプシ ョ ン を使用す る と 、 GNU ツールか ら の コ マ ン ド ラ イ ン の変換を有 効に し て、 gcc を エ ミ ュ レー ト で き ます。 使用法 こ のオプシ ョ ン を使用す る と 、 以下のいずれかが提供 さ れ ます。 • ARM Linux を タ ーゲ ッ ト と し た完全な GCC エ ミ ュ レーシ ョ ン • 個々の GCC コ マ ン ド ラ イ ン引数を それに相当す る RVCT 引数に変換す る こ と に よ る 、 完全な GCC エ ミ ュ レーシ ョ ン のサブセ ッ ト 完全な GCC エ ミ ュ レーシ ョ ン を提供す る には、--arm_linux_config_file も 使用 す る 必要があ り ます。 こ れ ら のオプシ ョ ン を組み合わせて使用す る こ と に よ り 、 コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルに よ っ て指定 さ れた適切な GNU ヘ ッ ダ フ ァ イ ル と ラ イ ブ ラ リ が選択 さ れ、 デフ ォ ル ト 動作に対す る 変更が組み込ま れ ます。 完全な GCC エ ミ ュ レーシ ョ ン を目標 と せずに、 個々の GCC コ マ ン ド ラ イ ン 引数を それに相当す る RVCT 引数に変換す る には、--translate_gcc を使用 し て gcc を エ ミ ュ レー ト し ます。 ただ し 、--arm_linux_config_file と 一緒には使用 し ないで下 さ い。 こ の方法では完全な GCC エ ミ ュ レーシ ョ ン を目標 と し ていな 2-138 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン いので、 RVCT のデフ ォ ル ト 動作が保持 さ れ、 ARM Linux を タ ーゲ ッ ト と し たデフ ォ ル ト の設定は行われません。 RVCT ラ イ ブ ラ リ パ ス と オプシ ョ ンのデ フ ォ ル ト は変更 さ れ ません。 制約条件 ARM Linux コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを コ マ ン ド ラ イ ン で指定 し て --translate_gcc を使用 し た場合は、--bss_threshold、--relaxed_ref_def と --no_relaxed_ref_def、 お よ び --signed_bitfields と --unsigned_bitfields のデ フ ォ ル ト 設定が変更 さ れ ます。 関連項目 • 「--arm_linux」 (ページ 2-10) • • • • • • • • • • • • • • • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_configure」 (ページ 2-13) 「--arm_linux_paths」 (ページ 2-15) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_includes=paths」 (ページ 2-29) 「--configure_extra_libraries=paths」 (ページ 2-30) 「--configure_gcc=path」 (ページ 2-31) 「--configure_gld=path」 (ページ 2-32) 「--configure_sysroot=path」 (ページ 2-33) 「--relaxed_ref_def, --no_relaxed_ref_def」 (ページ 2-123) 「--shared」 (ページ 2-127) 「--signed_bitfields, --unsigned_bitfields」 (ページ 2-129) 「--translate_g++」 (ページ 2-136) 「--translate_gld」 (ページ 2-139) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-139 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.154 --translate_gld こ のオプシ ョ ン を使用す る と 、 GNU ツールか ら の コ マ ン ド ラ イ ン の変換を有 効に し て、 GNU ld を エ ミ ュ レー ト で き ます。 使用法 こ のオプシ ョ ン を使用す る と 、 以下のいずれかが提供 さ れ ます。 • ARM Linux を タ ーゲ ッ ト と し た完全な GNU ld エ ミ ュ レーシ ョ ン • 個々の GNU ld コ マ ン ド ラ イ ン引数を それに相当す る RVCT 引数に変換 す る こ と に よ る 、 完全な GNU ld エ ミ ュ レーシ ョ ンのサブセ ッ ト 完全な GNU ld エ ミ ュ レーシ ョ ン を提供す る には、--arm_linux_config_file も 使 用す る 必要があ り ます。 こ れ ら のオプシ ョ ン を組み合わせて使用す る こ と に よ り 、 コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルに よ っ て指定 さ れた適切な GNU ヘ ッ ダ フ ァ イ ル と ラ イ ブ ラ リ が選択 さ れ、 デフ ォ ル ト 動作に対す る 変更が組み込 ま れ ます。 完全な GNU ld エ ミ ュ レーシ ョ ン を目標 と せずに、 個々の GNU ld コ マ ン ド ラ イ ン引数を それに相当す る RVCT 引数に変換す る には、--translate_gld を使用 し て GNU ld を エ ミ ュ レー ト し ます。 ただ し 、--arm_linux_config_file と 一緒に は使用 し ないで下 さ い。 こ の方法では完全な GNU ld エ ミ ュ レーシ ョ ン を目標 と し ていないので、 RVCT のデフ ォ ル ト 動作が保持 さ れ、 ARM Linux を タ ー ゲ ッ ト と し たデフ ォ ル ト の設定は行われ ません。 RVCT ラ イ ブ ラ リ パ ス と オプ シ ョ ン のデフ ォ ル ト は変更 さ れません。 注 • --translate_gld は、 armcc を GNU リ ン カであ る かの よ う に呼び出 し て使 用 し ます。 GNU リ ン カ と 直接関連す る 既存の ビル ド ス ク リ プ ト に よ っ て 使用 さ れ る こ と だけ を想定 し てい ます。 • gcc モー ド と g++ モー ド では、--translate_gld を指定す る と 、 armcc がそれ に よ っ て使用 さ れ る リ ン カ と し て報告 さ れ ます。 例えば gcc -print-file-name=ld の よ う にな り ます。 関連項目 • 「--arm_linux」 (ページ 2-10) • • 2-140 「--arm_linux_config_file=path」 (ページ 2-12) 「--arm_linux_configure」 (ページ 2-13) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン • • • • • • • • • • • • • • 「--arm_linux_paths」 (ページ 2-15) 「--configure_cpp_headers=path」 (ページ 2-28) 「--configure_extra_includes=paths」 (ページ 2-29) 「--configure_extra_libraries=paths」 (ページ 2-30) 「--configure_gcc=path」 (ページ 2-31) 「--configure_gld=path」 (ページ 2-32) 「--configure_sysroot=path」 (ページ 2-33) 「--shared」 (ページ 2-127) 「--translate_g++」 (ページ 2-136) 「--translate_gcc」 (ページ 2-138) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--arm_linux」 (ページ 2-3) 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 の 「--library=name」 (ページ 2-38) 『 リ ンカ リ フ ァ レンスガイ ド』 の 「--[no_]search_dynamic_libraries」 (ページ 2-59) 『Application Note 212 - Building Linux applications using RVCT v4.0 and the GNU Tools and Libraries』 2.1.155 --trigraphs, --no_trigraphs こ のオプシ ョ ン を使用す る と 、 ト リ グ ラ フ の認識を イ ネーブル ま たはデ ィ セーブルにで き ます。 デ フ ォル ト デフ ォ ル ト は --trigraphs です。 ただ し 、 GNU モー ド の場合は例外で、 こ の場 合のデフ ォ ル ト は --no_trigraphs にな り ます。 関連項目 • ISO/IEC 9899:TC2 2.1.156 -Uname こ のオプシ ョ ン を使用す る と 、 マ ク ロ name の最初の定義を削除で き ます。 マ ク ロ name には、 以下のいずれか を指定で き ます。 • • ARM DUI 0348BJ ID 1 0 0 4 1 9 定義済みマ ク ロ 。 -D オプシ ョ ン を使用 し て指定 さ れたマ ク ロ 。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-141 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 注 すべての コ ンパ イ ラ の定義済みマ ク ロ について、 定義を削除で き る わけでは あ り ません。 構文 -Uname 各パ ラ メ ー タ には以下の意味があ り ます。 定義を削除す る マ ク ロ の名前です。 name 使用法 -Uname を指定 し た と き の効果は、 各 ソ ース フ ァ イ ルの冒頭にテ キ ス ト #undef name を記述 し た と き の効果 と 同 じ です。 制約条件 コ ンパ イ ラ は以下の順序でマ ク ロ を定義 し た り 、 定義を削除 し た り し ます。 1. コ ンパ イ ラ の定義済みマ ク ロ 2. -Dname を使用 し て明示的に定義 さ れたマ ク ロ 3. -Uname を使用 し て明示的に定義が削除 さ れたマ ク ロ 関連項目 「-C」 (ページ 2-25) • • • • • 「-Dname[(parm-list)][=def]」 (ページ 2-40) 「-E」 (ページ 2-58) 「-M」 (ページ 2-99) 「コ ンパ イ ラ に よ る事前定義」 (ページ 4-129) 2.1.157 --unaligned_access, --no_unaligned_access こ のオプシ ョ ン を使用す る と 、 ARM アーキ テ ク チ ャ ベース のプ ロ セ ッ サでの デー タ への非境界整列ア ク セ ス を有効ま たは無効にで き ます。 2-142 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン デ フ ォル ト デフ ォ ル ト は、 デー タ への非境界整列ア ク セ ス をサポー ト し てい る ARM アーキ テ ク チ ャ ベース のプ ロ セ ッ サの --unaligned_access です。 こ の中には以 下が含まれます。 • すべての ARMv6 アーキ テ ク チ ャ ベース のプ ロ セ ッ サ。 • ARMv7-A お よ び ARMv7-R アーキ テ ク チ ャ ベース のプ ロ セ ッ サ。 デフ ォ ル ト は、 デー タ への非境界整列ア ク セ ス に対応 し ていない ARM アー キ テ ク チ ャ ベース のプ ロ セ ッ サの --no_unaligned_access です。 こ の中には以下 が含ま れ ます。 • すべての ARMv6 よ り 前のアーキ テ ク チ ャ ベース のプ ロ セ ッ サ。 • ARMv7-M アーキ テ ク チ ャ ベース のプ ロ セ ッ サ。 使用法 --unaligned_access --cpu=ARM1136J-S な ど のデー タ への非境界整列ア ク セ ス をサポー ト す る プ ロ セ ッ サで --unaligned_access を使用す る と 、 パ ッ ク 構 造体へのア ク セ ス を高速化で き ます。 非境界整列のサポー ト を イ ネーブルす る には、 以下の手順を実 行す る 必要があ り ます。 • 初期化 コ ー ド で CP15 レ ジ ス タ の A ビ ッ ト (ビ ッ ト 1) を ク リ ア し ます。 • 初期化 コ ー ド で CP15 レ ジ ス タ 1 の U ビ ッ ト (ビ ッ ト 22) を 設定 し ます。 U ビ ッ ト の初期値は、 コ アへの UBITINIT 入力に よ っ て決 定 し ます。 RVCT ラ イ ブ ラ リ には、 非境界整列ア ク セ ス を利用す る 目的で設 計 さ れた特殊なバージ ョ ン の特定の ラ イ ブ ラ リ 関数が含まれて い ます。 非境界整列ア ク セ ス のサポー ト が イ ネーブル さ れてい る 場合は、 RVCT ツールは こ れ ら の ラ イ ブ ラ リ 関数を使用 し て、 非 境界整列ア ク セ ス を利用 し ます。 --no_unaligned_access --no_unaligned_access は、 ARMv6 プ ロ セ ッ サで非境界整列 ワー ド ま たはハーフ ワー ド へのア ク セ ス を生成 し ない と き に使用 し ま す。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-143 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 非境界整列ア ク セ ス を生成せずに ARMv6 タ ーゲ ッ ト でモジ ュ ロ の 4 バ イ ト の境界調整チ ェ ッ ク を有効にす る には、 以下の手順を 実行す る 必要があ り ます。 • 初期化 コ ー ド で CP15 レ ジ ス タ 1 の A ビ ッ ト (ビ ッ ト 1) を 設定 し ます。 • 初期化 コ ー ド で CP15 レ ジ ス タ 1 の U ビ ッ ト (ビ ッ ト 22) を 設定 し ます。 U ビ ッ ト の初期値は、 コ アへの UBITINIT 入力に よ っ て決 定 し ます。 注 long long 整数への非境界整列ア ク セ ス な ど の非境界整列ダブル ワー ド ア ク セ ス は、 ARM プ ロ セ ッ サ コ アではサポー ト さ れてい ません。 ダブル ワー ド ア ク セ ス は、 8 バ イ ト ま たは 4 バ イ ト 境界 で整列 さ れ る 必要があ り ます。 コ ンパ イ ラ は、 モジ ュ ロ 8 バ イ ト の境界調整チ ェ ッ ク を サポー ト し てい ません。 すなわち、 CP15 レ ジ ス タ 1 の コ ン フ ィ グ レー シ ョ ン U = 0, A = 1 は、 コ ンパ イ ラ ( よ り 一般的には RVCT ツール セ ッ ト ) ではサポー ト さ れ ません。 RVCT ラ イ ブ ラ リ には、 非境界整列ア ク セ ス を利用す る 目的で設 計 さ れた特殊なバージ ョ ン の特定の ラ イ ブ ラ リ 関数が含まれて い ます。 非境界整列ア ク セ ス のサポー ト がデ ィ セーブル さ れてい る と き に、 こ の よ う な拡張 さ れた ラ イ ブ ラ リ 関数が使用 さ れな いに よ う にす る には、 C お よ び C++ の ソ ース フ ァ イ ル と アセ ン ブ リ 言語の ソ ース フ ァ イ ルの混合を コ ンパ イ ルす る 際に コ ンパ イ ラ の コ マ ン ド ラ イ ン と アセ ン ブ ラ の コ マ ン ド ラ イ ンの両方で --no_unaligned_access を指定す る 必要があ り ます。 制約条件 デー タ への非境界整列ア ク セ ス を サポー ト し てい る プ ロ セ ッ サ用に コ ンパ イ ル さ れた コ ー ド は、 ソ フ ト ウ ェ アの境界整列のサポー ト の選択がプ ロ セ ッ サ コ アの境界整列のサポー ト の選択 と 一致 し てい る 場合にのみ、 正確に実行 さ れ ます。 2-144 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--cpu=name」 (ページ 2-35) • • 『アセ ンブ ラ ガ イ ド 』 の 「 コ マ ン ド 構文」 (ページ 3-2) 『デベ ロ ッ パガ イ ド 』 の 「境界整列のサポー ト 」 (ページ 2-13) 2.1.158 --use_pch=filename こ のオプシ ョ ンは、 現在の コ ンパ イ ルにおいて、 指定 さ れた filename の PCH フ ァ イ ルを使用す る よ う に コ ンパ イ ラ に指示 し ます。 同 じ コ マ ン ド ラ イ ン で --pch を指定 し た場合、 こ のオプシ ョ ン が優先 さ れま す。 構文 --use_pch=filename 各パ ラ メ ー タ には以下の意味があ り ます。 filename 現在の コ ンパ イ ルにおいて、 使用 さ れ る PCH フ ァ イ ルです。 制約条件 同 じ コ マ ン ド ラ イ ン で --create_pch=filename を指定 し た場合、 こ のオプシ ョ ン は無効にな り ます。 エラー 指定 し た フ ァ イ ルが存在 し ない場合、 ま たは有効な PCH フ ァ イ ルでない場合 は、 コ ンパ イ ラ に よ っ てエ ラ ーが生成 さ れ ます。 関連項目 • 「--create_pch=filename」 (ページ 2-39) • • • • • 「--pch」 (ページ 2-113) 「--pch_dir=dir」 (ページ 2-113) 「--pch_messages, --no_pch_messages」 (ページ 2-114) 「--pch_verbose, --no_pch_verbose」 (ページ 2-115) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「プ リ コ ンパ イ ルヘ ッ ダ フ ァ イ ル」 (ページ 2-19) ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-145 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.159 --using_std, --no_using_std こ のオプシ ョ ン を使用す る と 、 標準のヘ ッ ダ フ ァ イ ルが イ ン ク ルー ド さ れた と き に std ネーム スペース を暗黙的に使用す る か ど う か を C++ で指定で き ま す。 注 こ のオプシ ョ ンは、 C++ 標準に準拠 し ていない従来の ソ ース コ ー ド を移行す る 目的でのみ提供 さ れてい ます。 他の目的で こ のオプシ ョ ン を使用す る こ と はお勧め し ません。 モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デフ ォル ト デフ ォ ル ト は --no_using_std です。 関連項目 「ネーム スペース」 (ページ 5-18) • 2.1.160 --vectorize, --no_vectorize こ のオプシ ョ ンは、 C コ ー ド ま たは C++ コ ー ド か ら 直接 NEON ベ ク タ 命令を 生成す る 機能を有効ま たは無効に し ます。 デフ ォル ト デフ ォ ル ト は --no_vectorize です。 2-146 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 制約条件 ループ をベ ク ト ル化す る には、 以下のオプシ ョ ン を指定す る 必要があ り ます。 --cpu=name タ ーゲ ッ ト プ ロ セ ッ サには NEON の機能が必要です。 -Otime 実行時間を短縮す る ための最適化の種類。 -Onum 最適化の レベル。 以下のいずれか を使用す る 必要があ り ます。 • -O2 高度な最適化。 こ れがデフ ォ ル ト です。 • -O3 最大限の最適化。 注 NEON は、 ARM ア ド バン ス ト SIMD (Single Instruction Multiple Data、 単一命 令複数デー タ 処理) 拡張機能の実装です。 ベ ク ト ル化を使用で き る よ う にす る には、 FLEXnet ラ イ セ ン ス が個別に必要 です。 こ の ラ イ セ ン ス は、 RVDS 4.0 Professional に付属 し てい ます。 例 armcc --vectorize --cpu=Cortex-A8 -O3 -Otime -c file.c 関連項目 • 「--cpu=name」 (ページ 2-35) • • 「-Onum」 (ページ 2-108) 「-Otime」 (ページ 2-111) 2.1.161 --vfe, --no_vfe こ のオプシ ョ ン を使用す る と 、 C++ での仮想関数の削除 (VFE) を有効ま た は無効にで き ます。 VFE に よ っ て、 使用 さ れていない仮想関数が コ ー ド か ら 削除 さ れ ます。 VFE を有効にす る と 、 コ ンパ イ ラ は仮想関数の削除に関す る 情報を接頭文字 .arm_vfe_ が付いた特別なセ ク シ ョ ンに配置 し ます。 こ れ ら のセ ク シ ョ ンは残 り の コ ー ド では参照 さ れないので、 VFE に対応 し ていない リ ン カでは無視 さ れ ます。 こ のため、 こ れ ら の情報に よ っ て実行可能フ ァ イ ルのサ イ ズが増加 す る こ と はあ り ません。 ただ し 、 オブジ ェ ク ト フ ァ イ ルのサ イ ズは増加 し ま す。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-147 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン モー ド こ のオプシ ョ ンは、 ソ ース言語が C++ の場合にのみ有効です。 デフ ォル ト RVCT v2.1 以前の コ ンパ イ ラ で コ ンパ イ ル さ れた従来のオブジ ェ ク ト フ ァ イ ルに VFE に関す る 情報が含まれていない場合を除 き 、 デフ ォ ル ト は --vfe で す。 関連項目 • 「純仮想関数の呼び出 し 」 (ページ C-4) • 『 リ ン カユーザガ イ ド 』 の 「未使用仮想関数の削除」 (ページ 3-14) 2.1.162 --via=filename こ のオプシ ョ ンは、 指定 さ れた フ ァ イ ルか ら 追加の コ マ ン ド ラ イ ン オプシ ョ ン を読み出す よ う に コ ンパ イ ラ に指示 し ます。 フ ァ イ ルか ら 読み出 さ れたオ プシ ョ ンは、 現在の コ マ ン ド ラ イ ン に追加 さ れます。 Via コ マ ン ド は、 via フ ァ イ ル内でネ ス ト で き ます。 構文 --via=filename 各パ ラ メ ー タ には以下の意味があ り ます。 filename コ マ ン ド ラ イ ン で イ ン ク ルー ド さ れ る オプシ ョ ン を含む via フ ァ イ ルの名前です。 例 ソ ース フ ァ イ ル main.c の場合、 以下の ラ イ ンが含ま れてい る via フ ァ イ ル apcs.txt と --apcs=/rwpi --no_lower_rwpi --via=L_apcs.txt 以下の ラ イ ンが含まれてい る 2 番目の via フ ァ イ ル L_apcs.txt について、 -L--rwpi -L--callgraph 以下の コ マ ン ド ラ イ ン を実行 し て、 main.c を コ ンパ イ ルす る と 、 armcc main.c -L-o” main.axf" --via=apcs.txt 2-148 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 以下の コ マ ン ド ラ イ ン を使用 し て main.c が コ ンパ イ ル さ れます。 armcc --no_lower_rwpi --apcs=/rwpi -L--rwpi -L--callgraph -L-o"main.axf" main.c 関連項目 • 付録 A via フ ァ イ ルの構文 • 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「フ ァ イ ルか ら の コ ンパ イ ラ オプシ ョ ン の読み出 し 」 (ページ 2-13) 2.1.163 --vla, --no_vla こ のオプシ ョ ン を使用す る と 、 可変長配列を サポー ト す る か ど う か を指定で き ます。 デ フ ォル ト C90 お よ び標準 C++ は、デフ ォ ル ト では可変長配列を サポー ト し てい ません。 オプシ ョ ン --vla を選択す る と 、C90 ま たは標準 C++ で可変長配列のサポー ト が有効にな り ます。 可変長配列は、標準 C と GNU コ ンパ イ ラ の拡張機能の両方でサポー ト さ れて い ます。 オプシ ョ ン --vla は、 ソ ース言語が C99 であ る か、 ま たはオプシ ョ ン --gnu が指定 さ れてい る 場合に、 暗黙的に選択 さ れ ます。 例 size_t arr_size(int n) { char array[n]; return sizeof array; } // variable length array, dynamically allocated // evaluated at runtime 関連項目 • 「--c90」 (ページ 2-25) • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--c99」 (ページ 2-26) 「--cpp」 (ページ 2-34) 「--gnu」 (ページ 2-75) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-149 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.164 --vsn こ のオプシ ョ ン を選択す る と 、 バージ ョ ン情報 と ラ イ セ ン ス情報が表示 さ れ ます。 関連項目 • 「--help」 (ページ 2-78) 2.1.165 -W こ のオプシ ョ ンは、 すべての警告 メ ッ セージ を非表示にす る よ う に コ ンパ イ ラ に指示 し ます。 関連項目 「--brief_diagnostics, --no_brief_diagnostics」 (ページ • 2-21) • • • • • • • • 「--diag_error=tag[,tag,...]」 (ページ 2-50) 「--diag_remark=tag[,tag,... ]」 (ページ 2-51) 「--diag_style={arm|ide|gnu}」 (ページ 2-52) 「--diag_suppress=tag[,tag,...]」 (ページ 2-53) 「--diag_warning=tag[,tag,...]」 (ページ 2-54) 「--errors=filename」 (ページ 2-60) 「--remarks」 (ページ 2-124) 「--wrap_diagnostics, --no_wrap_diagnostics」 (ページ 2-153) 2.1.166 --wchar, --no_wchar こ のオプシ ョ ンは、 wchar_t の使用を許可ま たは禁止 し ます。 使用 し ない場合 には、 必ず し も 誤っ た宣言 と はな り ません。 使用法 こ のオプシ ョ ン を使用す る と 、 wchar_t サ イ ズに依存 し ないオブジ ェ ク ト フ ァ イ ルを作成で き ます。 2-150 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 制限 --no_wchar を指定 し た場合 • 構造体宣言の wchar_t フ ィ ール ド は、 構造体が使用 さ れ る か ど う かに関 係な く 、 コ ンパ イ ラ でエ ラ ーにな り ます。 • typedef の wchar_t は、 typedef が使用 さ れ る か ど う かに関係な く 、 コ ンパ イ ラ でエ ラ ーにな り ます。 デ フ ォル ト デフ ォ ル ト は --wchar です。 関連項目 「--wchar16」 • • 「--wchar32」 (ページ 2-151) 2.1.167 --wchar16 こ のオプシ ョ ン を選択す る と 、 wchar_t の型が unsigned short に変更 さ れます。 こ のオプシ ョ ン を選択す る と 、 C の定義 さ れた型 wchar_t の型 と C++ のネ イ テ ィ ブ型 wchar_t の型の両方が変更 さ れ ます。 こ れは、 WCHAR_MIN お よ び WCHAR_MAX の値に も 影響 し ます。 デ フ ォル ト --wchar32 を明示的に指定 し なか っ た場合、 --wchar16 が指定 さ れた と き と 同 じ 処理を実行 し ます。 関連項目 • 「--wchar, --no_wchar」 (ページ 2-150) • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--wchar32」 (ページ 2-151) 「定義済みマ ク ロ 」 (ページ 4-129) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-151 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 2.1.168 --wchar32 こ のオプシ ョ ン を選択す る と 、 wchar_t の型が unsigned int に変更 さ れ ます。 こ のオプシ ョ ン を選択す る と 、 C の定義 さ れた型 wchar_t の型 と C++ のネ イ テ ィ ブ型 wchar_t の型の両方が変更 さ れます。 こ れは、 WCHAR_MIN お よ び WCHAR_MAX の値に も 影響 し ます。 デフ ォル ト --wchar32 が明示的に指定 さ れ る か、 コ マ ン ド ラ イ ン で ARM Linux コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを指定 し ない限 り 、--wchar16 が指定 さ れた と き と 同 じ 処理が行われ ます。 ARM Linux コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを コ マ ン ド ラ イ ン で指定す る と 、--wchar32 が有効にな り ます。 関連項目 「--arm_linux_config_file=path」 (ページ 2-12) • • • • • 「--arm_linux_configure」 (ページ 2-13) 「--wchar, --no_wchar」 (ページ 2-150) 「--wchar16」 (ページ 2-150) 「定義済みマ ク ロ 」 (ページ 4-129) 2.1.169 --whole_program こ のオプシ ョ ンは、 コ マ ン ド ラ イ ン で指定 し た ソ ース フ ァ イ ルに よ っ てプ ロ グ ラ ム全体が形成 さ れ る こ と を コ ンパ イ ラ に保証 し ます。 コ ンパ イ ラ は、 表 示 さ れ る ソ ース コ ー ド が、 コ ンパ イ ルす る プ ロ グ ラ ムの ソ ース コ ー ド の完全 なセ ッ ト であ る と い う 認識に基づいて最適化を適用で き ます。 こ の認識がな い と 、 コ ンパ イ ラ は コ ー ド に十分な最適化を適用で き ません。 使用法 こ のオプシ ョ ン を使用す る と 、 小 さ いプ ロ グ ラ ム か ら 最大のパフ ォ ーマ ン ス を得 る こ と がで き ます。 制限 コ ンパ イ ラ に渡す ソ ース コ ー ド がすべて揃っ ていない場合は、 こ のオプシ ョ ン を使用 し ないで く だ さ い。 2-152 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン 関連項目 • 「--multifile, --no_multifile」 (ページ 2-103) 2.1.170 --workdir=directory こ のオプシ ョ ン を使用す る と 、 プ ロ ジ ェ ク ト テ ン プ レー ト に作業デ ィ レ ク ト リ を提供す る か ど う か を指定で き ます。 注 プ ロ ジ ェ ク ト テ ンプ レー ト に作業デ ィ レ ク ト リ が必要 と な る のは、 作業デ ィ レ ク ト リ に RVD コ ン フ ィ グ レーシ ョ ン フ ァ イ ルな ど の フ ァ イ ルが含まれてい る 場合のみです。 構文 --workdir=directory 各パ ラ メ ー タ には以下の意味があ り ます。 directory プ ロ ジ ェ ク ト デ ィ レ ク ト リ の名前です。 制約条件 --workdir を使用 し てプ ロ ジ ェ ク ト 作業デ ィ レ ク ト リ を指定す る 場合、 --project を使用 し てプ ロ ジ ェ ク ト フ ァ イ ルを指定す る 必要があ り ます。 エラー --workdir を指定せずに --project を使用す る と き に、 --workdir が要求 さ れた場 合、 エ ラ ー メ ッ セージが表示 さ れ ます。 関連項目 • 「--project=filename, --no_project=filename」 (ページ 2-120) • 「--reinitialize_workdir」 (ページ 2-123) 2.1.171 --wrap_diagnostics, --no_wrap_diagnostics こ のオプシ ョ ン を使用す る と 、 1 行に収ま ら ないエ ラ ー メ ッ セージ テ キ ス ト を折 り 返すか ど う か を指定で き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 2-153 コ ンパイ ラのコ マ ン ド ラ イ ンオプ シ ョ ン デフ ォル ト デフ ォ ル ト は --no_wrap_diagnostics です。 関連項目 「--brief_diagnostics, --no_brief_diagnostics」 (ページ • 2-21) • • • • • • • • • 2-154 「--diag_error=tag[,tag,...]」 (ページ 2-50) 「--diag_remark=tag[,tag,... ]」 (ページ 2-51) 「--diag_style={arm|ide|gnu}」 (ページ 2-52) 「--diag_suppress=tag[,tag,...]」 (ページ 2-53) 「--diag_warning=tag[,tag,...]」 (ページ 2-54) 「--errors=filename」 (ページ 2-60) 「--remarks」 (ページ 2-124) 「-W」 (ページ 2-149) 『コ ンパ イ ラ ユーザガ イ ド 』 の第 6 章 診断 メ ッ セージ Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 第3章 言語拡張機能 こ の章では、 ARM コ ンパ イ ラ でサポー ト さ れてい る 言語拡張機能について説 明 し ます。 以下のセ ク シ ョ ン か ら 構成 さ れてい ます。 • • • • • • • 「プ リ プ ロ セ ッ サ拡張機能」 (ページ 3-2) 「C90 で使用可能な C99 言語機能」 (ページ 3-5) 「C++ お よ び C90 で使用可能な C99 言語機能」 (ページ 3-7) 「標準の C 言語の拡張機能」 (ページ 3-10) 「標準の C++ 言語の拡張機能」 (ページ 3-16) 「標準 C お よ び標準 C++ 言語の拡張機能」 (ページ 3-20) 「GNU 言語拡張機能」 (ページ 3-26) ARM コ ンパ イ ラ に関する補足情報については、 以下の付録を参照し て下 さ い。 ARM DUI 0348BJ ID 1 0 0 4 1 9 • 付録 B 標準 C の実装定義 • 付録 C 標準 C++ の実装定義 • 付録 D C お よ び C++ コ ンパ イ ラ の実装に関す る 制限 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-1 言語拡張機能 3.1 プ リ プ ロ セ ッ サ拡張機能 コ ンパ イ ラ は、 System V リ リ ース 4 の #assert プ リ プ ロ セ ッ シ ン グ拡張機能を は じ め と す る 複数のプ リ プ ロ セ ッ サ拡張機能を サポー ト し てい ます。 3.1.1 #assert System V リ リ ース 4 の #assert プ リ プ ロ セ ッ シ ン グ拡張機能がサポー ト さ れて い ます。 こ れ ら の拡張機能に よ っ て、 述語名を定義お よ びテ ス ト で き る よ う にな り ます。 こ の よ う な名前は名前空間内に配置 さ れ、 マ ク ロ 名を含む他のすべての名前 と 区別 さ れ ます。 構文 #assert name #assert name[(token-sequence)] 各パ ラ メ ー タ には以下の意味があ り ます。 name 述語名 token-sequence オプシ ョ ン の ト ー ク ン シーケ ン ス。 ト ー ク ン シーケ ン ス を省略 し た場合、 name に値は指定 さ れ ません。 ト ー ク ン シーケ ン ス を含めた場合は、name に token-sequence 値が指定 さ れ ます。 例 #assert を使用 し て定義 し た述語名は、 例えば以下の よ う に、 #if 式でテ ス ト で き ます。 #if #name(token-sequence) こ の結果、 token-sequence ト ー ク ン シーケ ン ス が含まれた、 指定 し た名前 name の #assert が検出 さ れた場合は 1 が返 さ れ、 検出 さ れなか っ た場合は 0 が返 さ れます。 1 つの述語には、 同時に複数の値を割 り 当て る こ と がで き ます。 関連項目 • 3-2 「#unassert」 (ページ 3-3) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 3.1.2 #include_next こ のプ リ プ ロ セ ッ サデ ィ レ ク テ ィ ブは、 #include デ ィ レ ク テ ィ ブのバ リ ア ン ト です。 こ のデ ィ レ ク テ ィ ブ を指定す る と 、 カ レ ン ト ソ ース フ ァ イ ルが検出 さ れ る デ ィ レ ク ト リ 、 つま り #include_next デ ィ レ ク テ ィ ブ を含むデ ィ レ ク ト リ に続 く 検索パ ス上のデ ィ レ ク ト リ 内でのみ、 指定 さ れた フ ァ イ ルが検索 さ れ ます。 注 こ のプ リ プ ロ セ ッ サデ ィ レ ク テ ィ ブは、 ARM コ ンパ イ ラ に よ っ てサポー ト さ れてい る GNU コ ンパ イ ラ 拡張機能です。 3.1.3 #unassert 述語名は #unassert プ リ プ ロ セ ッ シ ン グデ ィ レ ク テ ィ ブ を使用 し て削除で き ま す。 構文 #unassert name #unassert name[(token-sequence)] 各パ ラ メ ー タ には以下の意味があ り ます。 name 述語名 token-sequence オプシ ョ ンの ト ー ク ン シーケ ン ス。 ト ー ク ン シーケ ン ス を省略 し た場合は、 name の定義がすべ て削除 さ れます。 ト ー ク ン シーケ ン ス を含めた場合は、 指定 さ れた定義のみ が削除 さ れ ます。 その他すべての定義はその ま ま残 さ れま す。 関連項目 • ARM DUI 0348BJ ID 1 0 0 4 1 9 「#assert」 (ページ 3-2) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-3 言語拡張機能 3.1.4 #warning プ リ プ ロ セ ッ シ ン グデ ィ レ ク テ ィ ブ #warning がサポー ト さ れ ます。 こ のデ ィ レ ク テ ィ ブは、 #error デ ィ レ ク テ ィ ブ と 同様に、 コ ンパ イ ル時にユーザ定義警 告を生成 し ます。 ただ し 、 こ のデ ィ レ ク テ ィ ブに よ っ て コ ンパ イ ルが中断 さ れ る こ と はあ り ません。 制約条件 --strict オプシ ョ ン を指定 し た場合、 #warning デ ィ レ ク テ ィ ブは使用で き ませ ん。 使用 し た場合、 エ ラ ーが生成 さ れ ます。 関連項目 • 3-4 「--strict, --no_strict」 (ページ 2-133) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 3.2 C90 で使用可能な C99 言語機能 コ ンパ イ ラ は、 C99 形式の // コ メ ン ト な ど の さ ま ざ ま な ISO C90 標準の拡張 機能をサポー ト し てい ます。 こ れ ら の拡張機能は、 ソ ース言語が C90 で、 厳密モー ド 以外のモー ド で コ ン パ イ ル し てい る 場合に使用で き ます。 こ れ ら の拡張機能は、 ソ ース言語が C90 で、 コ ンパ イ ラ が --strict コ ンパ イ ラ オプシ ョ ン を使用 し た厳密な C90 の コ ンパ イ ルに制限 さ れてい る 場合には 使用で き ません。 注 C++ 形式の // コ メ ン ト な ど の標準の C お よ び C++ 言語の機能は、 こ のセ ク シ ョ ン で説明す る C90 言語の拡張機能に似てい る 場合があ り ます。 こ の よ う な機能は、 --strict コ ンパ イ ラ オプシ ョ ン を使用 し て厳密な標準 の C ま たは C++ を コ ンパ イ ルす る 場合に引 き 続 き 使用で き ます。 3.2.1 // コ メ ン ト 文字シーケ ン ス // は、 C99 や C++ と 同様に、 1 行の コ メ ン ト の開始を示 し ま す。 C90 の // コ メ ン ト の意味は、 C99 の // コ メ ン ト と 同 じ です。 例 // this is a comment 関連項目 • 3.2.2 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「C99 の新機能」 (ページ 5-51) 構造体への添字の付加 C90 では、 左辺値でない配列はポ イ ン タ に変換 さ れ る ため、 こ れ ら の配列に 添字を付加す る こ と がで き ます。 ただ し 、 次のシーケ ン ス ポ イ ン ト の後で こ れ ら の配列を変更ま たは使用 し た り 、 こ れ ら の配列に単項演算子の & を使用 し た り す る こ と はで き ません。 C90 では こ れ ら の配列に添字を付加で き ます が、 C99 モー ド 以外では こ れ ら の配列はポ イ ン タ に変換 さ れません。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-5 言語拡張機能 例 struct Subscripting_Struct { int a[4]; }; extern struct Subscripting_Struct Subscripting_0(void); int Subscripting_1 (int index) { return Subscripting_0().a[index]; } 3.2.3 フ レキシ ブル配列 メ ンバ struct の最後の メ ンバは、 不完全な配列型にで き ます。 不完全な配列型の最後 の メ ンバが構造体 の唯一の メ ンバであ る 場合、 構造体 のサ イ ズはゼ ロ にな る た め、 その よ う な構成には し ないで下 さ い。 例 typedef struct { int len; char p[]; // incomplete array type, for use in a malloced data structure } str; 関連項目 • 3-6 『コ ンパ イ ラ ユーザガ イ ド 』 の 「C99 の新機能」 (ページ 5-51) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 3.3 C++ および C90 で使用可能な C99 言語機能 コ ンパ イ ラ は、 旧方式のプ ロ ト タ イ プ以外の定義を オーバー ラ イ ド す る 関数 のプ ロ ト タ イ プな ど、 さ ま ざ ま な ISO C++ 標準お よ び C90 言語の拡張機能を サポー ト し てい ます。 こ れ ら の拡張機能は以下の場合に使用で き ます。 • ソ ース言語が C++ で、 厳密モー ド 以外のモー ド で コ ンパ イ ル し てい る 場 合 • ソ ース言語が C90 で、 厳密モー ド 以外のモー ド で コ ンパ イ ル し てい る 場 合 こ れ ら の拡張機能は以下の場合には使用で き ません。 • ソ ース言語が C++ で、 コ ンパ イ ラ が --strict コ ンパ イ ラ オプシ ョ ン を使 用 し た厳密な C90 の コ ンパ イ ルに制限 さ れてい る 場合 • ソ ース言語が C90 で、 コ ンパ イ ラ が --strict コ ンパ イ ラ オプシ ョ ン を使 用 し た厳密な標準 C の コ ンパ イ ルに制限 さ れてい る 場合 注 long long 整数な ど の標準 C の言語機能は、 こ のセ ク シ ョ ン で説明す る 言語拡 張機能に似てい る 場合があ り ます。 こ の よ う な機能は、 --strict コ ンパ イ ラ オ プシ ョ ン を使用 し て厳密な標準の C++ ま たは C90 を コ ンパ イ ルす る 場合に引 き 続 き 使用で き ます。 3.3.1 可変個引数マ ク ロ C90 お よ び C++ では、 引数の数の変化を許可す る マ ク ロ を宣言で き ます。 C90 お よ び C++ で可変個引数マ ク ロ を宣言す る ための構文は、 --gnu オプシ ョ ン を選択 し ない限 り 、 C99 の可変個引数マ ク ロ の宣言に従い ます。 --gnu オプ シ ョ ン を選択 し た場合は、 GNU の可変個引数マ ク ロ の構文に従い ます。 例 #define debug(format, ...) fprintf (stderr, format, __VA_ARGS__) void variadic_macros(void) { debug ("a test string is printed out along with %x %x %x\n", 12, 14, 20); } ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-7 言語拡張機能 関連項目 3.3.2 • 「--gnu」 (ページ 2-75) • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「C99 の新機能」 (ページ 5-51) long long ARM コ ンパ イ ラ は、型指定子 long long お よ び unsigned long long に よ っ て、64 ビ ッ ト 整数型をサポー ト し ます。 こ れ ら の型の動作は、 通常の算術変換が行 われ る と い う 点で、 long と unsigned long に似てい ます。 __int64 は long long と 同 じ 意味です。 整数定数には以下を設定で き ます。 • ll 接尾文字。 定数の型 と し て、 long long が適 し ていれば long long を、 適 し ていなければ unsigned long long を設定 し ます。 • ull ま たは llu 接尾文字。 定数の型 と し て unsigned long long を設定 し ま す。 printf() と scanf() の フ ォ ーマ ッ ト 指定子に ll を含め る こ と に よ り 、 %lld や %llu の よ う に、 それに続 く 変換が long long 引数に適用 さ れ る よ う に指定で き ます。 ま た、 プ レーン整数定数の値が十分に大 き い場合、 プ レーン整数定数は long long 型ま たは unsigned long long 型にな り ます。 コ ンパ イ ラ に よ っ て、その変更 を示す警告 メ ッ セージが生成 さ れ ます。 例えば、 厳密な 1990 ISO 標準 C では、 2147483648 は unsigned long 型です。 ARM C お よ び C++ では、こ れが long long 型 と な り ます。 こ の影響の 1 つ と し て、 以下の よ う な式の値があ り ます。 2147483648 > –1 こ の式は、 厳密な C お よ び C++ の場合は 0、 ARM C お よ び C++ の場合は 1 に 評価 さ れ ます。 long long 型は、 通常の算術変換で使用 さ れ ます。 関連項目 「__int64」 (ページ 4-10) • 3-8 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 3.3.3 restrict restrict キー ワ ー ド は、 さ ま ざ ま なオブジ ェ ク ト のポ イ ン タ 型や関数パ ラ メ ー タ 配列が、 重複す る メ モ リ 領域を指 さ ない よ う にす る こ と がで き る C99 機能です。 そのため、 こ のキーワ ー ド を使用す る と 、 コ ンパ イ ラ は、 エ イ リ ア ス が生成 さ れ る ために行われない可能性のあ る 最適化を実行 し ます。 制約条件 C90 ま たは C++ で restrict キー ワ ー ド を イ ネーブルす る には、--restrict オプ シ ョ ン を指定す る 必要があ り ます。 restrict の同義語 と し て、 キー ワー ド __restrict お よ び __restrict__ がサポー ト さ れ、--restrict オプシ ョ ン と 無関係に常に使用で き ます。 例 void copy_array(int n, int *restrict a, int *restrict b) { while (n-- > 0) *a++ = *b++; } 関連項目 • 「--restrict, --no_restrict」 (ページ 2-125) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「C99 の新機能」 (ページ 5-51) • 3.3.4 16 進浮動小数点数 C90 お よ び C++ は、 16 進形式で記述 し た浮動小数点数を サポー ト し てい ま す。 例 float hex_floats(void) { return 0x1.fp3; // 1.55e1 } 関連項目 • 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「C99 の新機能」 (ページ 5-51) ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-9 言語拡張機能 3.4 標準の C 言語の拡張機能 コ ンパ イ ラ は、 旧式の非プ ロ ト タ イ プ定義を無効にす る 関数プ ロ ト タ イ プな ど、 さ ま ざ ま な ISO C99 標準の拡張機能を サポー ト し てい ます。 こ れ ら の拡張機能は以下の場合に使用で き ます。 • ソ ース言語が C99 で、 厳密モー ド 以外のモー ド で コ ンパ イ ル し てい る 場 合 • ソ ース言語が C90 で、 厳密モー ド 以外のモー ド で コ ンパ イ ル し てい る 場 合 以下の場合、 こ れ ら の拡張機能は使用で き ません。 3.4.1 • ソ ース言語が C90 で、 コ ンパ イ ラ が --strict コ ンパ イ ラ オプシ ョ ン を使 用 し た厳密な C90 の コ ンパ イ ルに制限 さ れてい る 場合 • ソ ース言語が C99 で、 コ ンパ イ ラ が --strict コ ンパ イ ラ オプシ ョ ン を使 用 し た厳密な標準 C の コ ンパ イ ルに制限 さ れてい る 場合 • ソ ース言語は C++ です。 定数式 イ ニシ ャ ラ イ ザでは、 以下に示す よ う な拡張定数式がサポー ト さ れてい ます。 以下の例では、 デフ ォ ル ト 、--strict_warnings、 お よ び --strict の各 コ ンパ イ ラ モー ド の動作を示 し ます。 例 1 : 変数のア ド レ スの代入 コ ー ド には、 変数のア ド レ ス を フ ァ イ ルの有効範囲内で代入す る 定数式が含 ま れてい る 場合があ り ます。 以下に例を示 し ます。 int i; int j = (int)&i; /* but not allowed by ISO */ 上記の コ ー ド を C 用に コ ンパ イ ルす る と 、 以下の動作が発生 し ます。 3-10 • • デフ ォ ル ト モー ド では、 警告が生成 さ れ ます。 --strict_warnings モー ド では、 警告が生成 さ れます。 • --strict モー ド では、 エ ラ ーが生成 さ れます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 例 2 : 定数値のイ ニシ ャ ラ イザ 以下の例は、 定数値を含む式を C コ ー ド で記述 し た場合の コ ンパ イ ラ の動作 を示 し てい ます。 extern extern static static extern extern static static int int int int int int int int const c = 10; const x = c + 10; y = c + 10; const z = c + 10; *const cp = (int*)0x100; *const xp = cp + 0x100; * yp = cp + 0x100; *const zp = cp + 0x100; /* /* /* /* /* /* /* /* /* Std ok error error error ok error error error RVCT v3.1 ok ext ext ext ok ext ext ext */ */ */ */ */ */ */ */ */ 上記の コ メ ン ト 部分は、 ISO C 標準で定義 さ れてい る 動作、 Std と RVCT の動 作を示 し てい ます。 各表記の意味は以下の と お り です。 • ok は、 その ス テー ト メ ン ト をすべての C モー ド で使用で き る こ と を示 し てい ます。 • ext は、 ISO C 標準の拡張機能であ る こ と を示 し てい ます。 こ の動作は、 C を コ ンパ イ ルす る と き に使用 さ れ る 厳密モー ド に よ っ て、 以下の よ う に異な り ます。 非厳密 警告が生成 さ れ る こ と な く 、 使用で き ます。 --strict_warnings 使用で き ますが、 警告が生成 さ れます。 --strict ISO C 標準に準拠 し てい ますが、 エ ラ ーが発生 し ます。 関連項目 • 「--extended_initializers, --no_extended_initializers」 (ページ 2-63) • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--strict, --no_strict」 (ページ 2-133) 「--strict_warnings」 (ページ 2-134) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-11 言語拡張機能 3.4.2 配列 と ポ イ ン タ の拡張機能 以下の配列 と ポ イ ン タ の拡張機能がサポー ト さ れてい ます。 • unsigned char * と char * な ど、 交換可能だが同一ではない型へのポ イ ン タ 間では、 代入 と ポ イ ン タ の相違が許可 さ れます。 こ の中には、 同 じ サ イ ズの整数型へのポ イ ン タ も 含まれ ます。 典型的な例 と し ては、 int * と long * が挙げ ら れます。 こ の場合は警告が生成 さ れ ます。 任意の文字へのポ イ ン タ に対す る 文字列定数の代入は、 警告な し で許可 さ れ ます。 • ポ イ ン タ 型の代入は、 int ** を const int ** に代入す る 場合な ど、 デス テ ィ ネーシ ョ ン の型に ト ッ プ レベル以外の型修飾子が付加 さ れてい る 場 合に許可 さ れ ます。 こ の よ う なポ イ ン タ 型の比較 と ポ イ ン タ の相違 も 許 可 さ れます。 こ の場合は警告が生成 さ れ ます。 • ポ イ ン タ に対す る 演算では、 必要に応 じ て、 void へのポ イ ン タ が別の型 に暗黙的に変換 さ れ ます。 ま た、 NULL ポ イ ン タ 定数 も 、 必要に応 じ て、 適切な型の NULL ポ イ ン タ に暗黙的に変換 さ れます。 ISO C では、 こ れ ら の変換が可能な演算子 と 、 そ う でない演算子があ り ます。 • 明示的な型のキ ャ ス ト がな く て も 、 異な る 関数型へのポ イ ン タ を代入 し た り 、 等 し い (==) か等 し く ない (!=) かで比較 し た り で き ます。 こ の 場合は、 警告ま たはエ ラ ーが生成 さ れ ます。 こ の拡張機能は C++ モー ド では使用で き ません。 • void へのポ イ ン タ は、 関数型へのポ イ ン タ と の間で、 暗黙的に変換で き ます。 3-12 • イ ニシ ャ ラ イ ザでは、 あ る 整数型でポ イ ン タ 定数値を保持で き る 場合、 その整数型にポ イ ン タ 定数値を キ ャ ス ト で き ます。 • 左辺値でない配列式は、 添字が付加 さ れてい る か、 似た よ う な方法で使 用 さ れ る 場合に、 配列の第 1 要素へのポ イ ン タ に変換 さ れ ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 3.4.3 block-scope 関数の宣言 block-scope 関数の宣言に対 し ては、 以下の 2 つの拡張機能がサポー ト さ れて い ます。 • block-scope 関数を宣言す る と 、 フ ァ イ ルの有効範囲内の関数名 も 宣言 さ れ ます。 • block-scope 関数宣言では ス タ テ ィ ッ ク 記憶域 ク ラ ス を持つ こ と がで き る ので、 行っ た宣言にはデフ ォ ル ト に よ り 内部 リ ン ケージが含ま れます。 例 void f1(void) { static void g(void); /* static function declared in local scope */ /* use of static keyword is illegal in strict ISO C */ } void f2(void) { g(); /* uses previous local declaration */ } static void g(int i) { } /* error - conflicts with previous declaration of g */ ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-13 言語拡張機能 3.4.4 識別子内の ド ル記号 識別子内では ド ル ($) 記号を使用で き ます。 注 --strict オプシ ョ ン を使用 し て コ ンパ イ ル し た場合は、--dollar コ マ ン ド ラ イ ン オプシ ョ ン を使用 し て、 識別子内で ド ル記号を使用可能にす る こ と がで き ます。 例 #define DOLLAR$ 関連項目 • 「--dollar, --no_dollar」 (ページ 2-57) • 3.4.5 「--strict, --no_strict」 (ページ 2-133) ト ッ プ レ ベルの宣言 C の入力フ ァ イ ルに ト ッ プ レベルの宣言を必ず し も 含め る 必要はあ り ません。 エラー C の入力フ ァ イ ルに ト ッ プ レベルの宣言が含まれていない場合は、 注釈が生 成 さ れます。 注 デフ ォ ル ト では、 注釈は表示 さ れ ません。 注釈 メ ッ セージ を表示す る には、 コ ンパ イ ラ オプシ ョ ン --remarks を使用 し て下 さ い。 関連項目 • 「--remarks」 (ページ 2-125) 3.4.6 有用な再宣言 問題がない場合、 typedef 名の再宣言は許可 さ れ ます。 つま り 、 同 じ 型の typedef 名を同 じ 有効範囲内で再宣言で き ます。 3-14 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 例 typedef int INT;typedef int INT; /* redeclaration */ 3.4.7 外部エ ン テ ィ テ ィ 他の有効範囲内で宣言 さ れた外部エ ン テ ィ テ ィ が認識 さ れ ます。 エラー 別の範囲内で宣言 さ れてい る 外部エ ン テ ィ テ ィ が認識 さ れた場合は、 コ ンパ イ ラ に よ っ て警告が生成 さ れ ます。 例 void f1(void) { extern void f(); } void f2(void) { f(); /* Out of scope declaration */ } 3.4.8 関数のプ ロ ト タ イ プ コ ンパ イ ラ は、 コ ー ド の後半に記述 さ れてい る 、 旧方式のプ ロ ト タ イ プ以外 の定義を オーバー ラ イ ド す る 関数のプ ロ ト タ イ プ を認識 し ます。 以下に例を 示 し ます。 エラー 旧方式の関数プ ロ ト タ イ プ を使用 し た場合は、 コ ンパ イ ラ に よ っ て警告 メ ッ セージが生成 さ れ ます。 例 int function_prototypes(char); // Old-style function definition. int function_prototypes(x) char x; { return x == 0; } ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-15 言語拡張機能 3.5 標準の C++ 言語の拡張機能 コ ンパ イ ラ は、 ク ラ ス メ ンバの定義で使用す る 修飾名の よ う な、 ISO C++ 標 準の拡張を数多 く サポー ト し てい ます。 こ れ ら の拡張機能は、 ソ ース言語が C++ で、 厳密モー ド 以外のモー ド で コ ン パ イ ル し てい る 場合に使用で き ます。 こ れ ら の拡張機能は、 ソ ース言語が C++ で、 コ ンパ イ ラ が --strict コ ンパ イ ラ オプシ ョ ン を使用 し た厳密な標準 C++ の コ ンパ イ ルに制限 さ れてい る 場合 には使用で き ません。 3.5.1 ? 演算子 2 番目 と 3 番目のオペ ラ ン ド が文字列 リ テ ラ ル ま たは ワ イ ド 文字列 リ テ ラ ルの ? 演算子は、 char * ま たは wchar_t * に暗黙的に変換で き ます。 C++ では、 文字 列 リ テ ラ ルは const です。 const を削除 し 、 文字列 リ テ ラ ルを char * ま たは wchar_t * に変換で き る よ う にす る 暗黙の変換があ り ます。 ただ し 、 こ の変換 は単純な文字列 リ テ ラ ルのみに適用 さ れ ます。 ? 演算の結果に対す る こ の変換 は、 拡張機能に よ り 許可 さ れ ます。 例 char *p = x ? "abc" : "def"; 3.5.2 ク ラ ス メ ンバの宣言 ク ラ ス メ ンバの宣言では、 修飾 さ れた名前を使用で き ます。 エラー 修飾名が ク ラ ス メ ンバの宣言に使用 さ れてい る 場合は、 警告が生成 さ れ ます。 例 struct A { int A::f(); }; 3-16 // is the same as int f(); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 3.5.3 friend class に対す る friend 宣言では、 class キー ワー ド を省略で き ます。 デフ ォ ル ト では、 ア ク セ ス のチ ェ ッ ク は、 friend 宣言で実行 さ れ ません。 ア ク セ ス のチ ェ ッ ク を行 う には、--strict コ マ ン ド ラ イ ン オプシ ョ ン を使用 し て下 さ い。 例 class B; class A { friend B; }; // is the same as "friend class B" 関連項目 • 3.5.4 「--strict, --no_strict」 (ページ 2-133) 読み出 し / 書き込み定数 外部定数に リ ン ケージ を指定す る と 、 定数を動的に初期化 し た り 、 定数に可 変 メ ンバを使用 し た り で き ます。 注 "C++:read/write" リ ン ケージ を使用す る 必要があ る のは、--apcs /rwpi で コ ンパ イ ル さ れ る コ ー ド だけです。 こ のオプシ ョ ン を使用 し て既存の コ ー ド を再 コ ンパ イ ルす る 場合は、 動的に初期化 さ れた り 、 可変 メ ンバを保持 し てい る 外 部定数に対す る リ ン ケージの指定を変更す る 必要があ り ます。 --apcs /rwpi オプシ ョ ン を使用 し て C++ を コ ンパ イ ルす る と 、 生成 さ れた コ ー ド は ISO C++ 標準に準拠 し な く な り ます。 例 3-1 の宣言では、 x が読み出 し 専 用セ グ メ ン ト 内にあ る こ と が想定 さ れてい ます。 例 3-1 外部ア ク セス extern const T x; extern "C++" const T x; extern "C" const T x; ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-17 言語拡張機能 定数ではユーザ定義 コ ン ス ト ラ ク タ を含む x を動的に初期化す る こ と はで き ず、 ま た T が可変 メ ンバを保持す る こ と も で き ません。 例 3-2 の新 し い リ ン ケージ指定では、 x が定数で初期化 さ れたか ど う かにかかわ ら ず、 読み出 し / 書 き 込みセ グ メ ン ト 内にあ る こ と を宣言 し てい ます。 こ の場合は x を動的に初 期化す る こ と が可能であ り 、 T は可変 メ ンバを保持で き ます。 x、 y、 z を別の フ ァ イ ル内で定義す る 場合 も 、 同 じ リ ン ケージ を指定す る 必要があ り ます。 例 3-2 リ ン ケージ指定 extern const int z; extern "C++:read/write" const int y; extern "C++:read/write" { const int i=5; extern const T x=6; struct S { static const T T x; }; /* /* /* /* in read-only segment, cannot */ be dynamically initialized */ in read/write segment */ can be dynamically initialized */ /* placed in read-only segment, */ /* not extern because implicitly static */ /* placed in read/write segment */ /* placed in read/write segment */ } 定数オブジ ェ ク ト は、 他の リ ン ケージで再宣言す る こ と はで き ません。 例 3-3 の コ ー ド では コ ンパ イ ルエ ラ ーが発生 し ます。 例 3-3 コ ンパイルエ ラ ー extern "C++" const T x; extern "C++:read/write" const T x; /* error */ 注 C には リ ン ケージ を指定で き ないため、 C++ で宣言 さ れた const オブジ ェ ク ト を extern "C++:read/write" と し て C 言語で記述 さ れた ソ ース か ら 使用す る こ と はで き ません。 関連項目 • 3-18 「--apcs=qualifer...qualifier」 (ページ 2-4) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 3.5.5 ス カ ラ 型定数 ス カ ラ 型の定数は、 ク ラ ス内に定義で き ます。 こ れは旧形式です。 新 し い形式 では、 初期化 さ れ る ス タ テ ィ ッ ク デー タ メ ンバを使用 し ます。 エラー ク ラ ス内に整数型定数の メ ンバを定義 し た場合は、 警告が生成 さ れ ます。 例 class A { const int size = 10; // must be static const int size = 10; int a[size]; }; 3.5.6 非 メ ンバ関数テ ン プ レ ー ト の特殊化 拡張機能 と し て、 非 メ ンバ関数テ ン プ レー ト の特殊化に記憶域 ク ラ ス を指定 で き ます。 3.5.7 型変換 extern "C" 関数へのポ イ ン タ と 、extern "C++" 関数へのポ イ ン タ 間の型変換が可 能です。 例 extern "C" void f(); void (*pf)() = &f; ARM DUI 0348BJ ID 1 0 0 4 1 9 // f’ s type has extern "C" linkage // pf points to an extern "C++" function // error unless implicit conversion is allowed Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-19 言語拡張機能 3.6 標準 C および標準 C++ 言語の拡張機能 コ ンパ イ ラ は、 ISO C99 標準 と ISO C++ 標準の両方に対 し て、 さ ま ざ ま な拡 張機能をサポー ト し てい ます。 こ れ ら の拡張機能には、 さ ま ざ ま な整数型拡 張機能、 浮動小数点拡張機能、 16 進数の浮動小数点定数、 匿名 ク ラ ス、 匿名 構造体、 匿名共同体な ど があ り ます。 こ れ ら の拡張機能は以下の場合に使用で き ます。 • ソ ース言語が C++ で、 厳密モー ド 以外のモー ド で コ ンパ イ ル し てい る 場 合 • ソ ース言語が C99 で、 厳密モー ド 以外のモー ド で コ ンパ イ ル し てい る 場 合 • ソ ース言語が C90 で、 厳密モー ド 以外のモー ド で コ ンパ イ ル し てい る 場 合 こ れ ら の拡張機能は以下の場合には使用で き ません。 3.6.1 • ソ ース言語が C++ で、 コ ンパ イ ラ が --strict コ ンパ イ ラ オプシ ョ ン を使 用 し た厳密な C++ の コ ンパ イ ルに制限 さ れてい る 場合 • ソ ース言語が C99 で、 コ ンパ イ ラ が --strict コ ンパ イ ラ オプシ ョ ン を使 用 し た厳密な標準 C の コ ンパ イ ルに制限 さ れてい る 場合 • ソ ース言語が C90 で、 コ ンパ イ ラ が --strict コ ンパ イ ラ オプシ ョ ン を使 用 し た厳密な C90 の コ ンパ イ ルに制限 さ れてい る 場合 レ ジ ス タ 変数のア ド レ ス register 記憶域 ク ラ ス の変数のア ド レ ス を取得で き ます。 エラー register 記憶域 ク ラ ス を含む変数のア ド レ ス を取得す る と 、 コ ンパ イ ラ に よ っ て警告が生成 さ れます。 例 void foo(void) { register int i; int *j = &i; } 3-20 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 3.6.2 関数の引数 デフ ォ ル ト の引数は、 ト ッ プ レベルの関数宣言以外の関数パ ラ メ ー タ に対 し て指定で き ます。 例えば、 デフ ォ ル ト の引数は、 typedef 宣言、 関数へのポ イ ン タ 宣言、 メ ンバ関数へのポ イ ン タ 宣言で使用で き ます。 3.6.3 匿名 ク ラ ス、 匿名構造体、 匿名共用体 匿名 ク ラ ス、 匿名構造体、 匿名共用体は、 拡張機能 と し てサポー ト さ れてい ます。 ま た、 匿名構造体、 お よ び匿名共用体は、 C お よ び C++ でサポー ト さ れてい ます。 デフ ォ ル ト では、 匿名共用体は C++ で使用で き ます。 ただ し 、 以下の場合は、 anon_unions プ ラ グマ を指定す る 必要があ り ます。 • C で匿名共用体 と 匿名構造体を使用す る 場合 • C++ で匿名 ク ラ ス と 匿名構造体を使用す る 場合 匿名共同体は、 typedef の名前に よ っ て、 それを保持す る ク ラ ス に導入で き ま す。 こ の共同体は、 実際の匿名共同体 と は異な り 、 直接宣言す る 必要はあ り ません。 以下に例を示 し ます。 typedef union { int i, j; } U; #pragma anon_unions class A { U; }; // U identifies a reusable anonymous union. // Okay -- references to A::i and A::j are allowed. こ の拡張機能に よ っ て、 匿名 ク ラ ス と 匿名構造体を使用で き ます。 ただ し 、 C++ の機能が使用 さ れていない こ と が条件です。 例えば、 ス タ テ ィ ッ ク デー タ メ ンバや メ ンバ関数、 非公開 メ ンバ、 お よ びネ ス ト さ れてい る 型 (匿名 ク ラ ス、 匿名構造体、 匿名共用体を除 く ) は、 匿名 ク ラ スお よ び匿名構造体で は使用で き ません。 以下に例を示 し ます。 #pragma anon_unions struct A { struct { int i, j; }; }; ARM DUI 0348BJ ID 1 0 0 4 1 9 // Okay -- references to A::i and A::j are allowed. Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-21 言語拡張機能 関連項目 • 「無名のフ ィ ール ド 」 (ページ 3-33) • 「#pragma anon_unions, #pragma no_anon_unions」 (ページ 4-62) 3.6.4 ア セ ン ブ ラ ラ ベル アセ ン ブ ラ ラ ベルは、 C シ ン ボルに使用す る アセ ン ブ ラ 名を指定 し ます。 例え ば、 アセ ン ブ ラ コ ー ド と C コ ー ド で counter な ど の同 じ シ ン ボル名を使用す る 場合があ り ます。 こ の よ う な場合に対処す る ため、 以下の よ う にアセ ン ブ ラ で使用す る 異な る 名前を エ ク ス ポー ト で き ます。 int counter __asm__("counter_v1") = 0; こ の場合は、 counter シ ン ボルではな く 、 counter_v1 シ ン ボルがエ ク ス ポー ト さ れます。 関連項目 • 3.6.5 「__asm」 (ページ 4-5) 空の宣言 セ ミ コ ロ ンだけの空の宣言が許可 さ れ ます。 例 ; // do nothing 3.6.6 16 進数浮動小数点定数 ARM コ ンパ イ ラ は、 浮動小数点定数を IEEE ビ ッ ト パ タ ーン と し て明示的に 指定で き る よ う に、 C の数値定数構文の拡張機能を実装 し てい ます。 3-22 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 構文 IEEE ビ ッ ト パ タ ーン と し て浮動小数点定数を指定す る ための構文は以下の と お り です。 3.6.7 0f_n 8 桁の 16 進数 n が float 定数 と 解釈 さ れ ます。 桁数は必ず 8 桁で あ る 必要があ り ます。 0d_nn 16 桁の 16 進数 nn が double 定数 と 解釈 さ れ ます。 桁数は必ず 16 桁 であ る 必要があ り ます。 不完全な enum 型 enum 型の forward 宣言がサポー ト さ れてい ます。 例 enum Incomplete_Enums_0; int Incomplete_Enums_2 (enum Incomplete_Enums_0 * passon) { return 0; } int Incomplete_Enums_1 (enum Incomplete_Enums_0 * passon) { return Incomplete_Enums_2(passon); } enum Incomplete_Enums_0 { ALPHA, BETA, GAMMA }; 3.6.8 整数型の拡張機能 整数定数式では、 整数定数を ポ イ ン ト 型にキ ャ ス ト し 、 その後、 整数型に戻 す こ と がで き ます。 3.6.9 ラ ベルの定義 標準 C お よ び標準 C++ では、 ラ ベル定義の後に ス テー ト メ ン ト を配置す る 必 要があ り ます。 C お よ び C++ では、 ラ ベル定義の直後に閉 じ 中括弧を配置で き ます。 エラー ラ ベル定義の直後に閉 じ 中括弧があ る 場合は、 コ ンパ イ ラ に よ っ て警告が生 成 さ れ ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-23 言語拡張機能 例 void foo(char *p) { if (p) { /* ... */ label: } } 3.6.10 long float long float は、 double と 同 じ 意味 と し て容認 さ れます。 3.6.11 非ス タ テ ィ ッ ク ロー カル変数 括弧で囲まれた関数の非ス タ テ ィ ッ ク ロ ーカル変数は、 ロ ーカル ク ラ ス内の、 例えば sizeof な ど の評価 さ れない式で参照で き ます。 こ の場合は警告が生成 さ れ ます。 3.6.12 構造体、 共用体、 列挙型、 ビ ッ ト フ ィ ール ド の拡張機能 以下の構造体、 共用体、 列挙型、 ビ ッ ト フ ィ ール ド の拡張機能がサポー ト さ れてい ます。 • C では、 フ ァ イ ル有効範囲配列の要素の型は、 不完全な struct 型ま たは union 型にで き ます。 要素の型は、 例えば配列に付加 さ れ る 添字があ る 場 合な ど、 そのサ イ ズが必要 と さ れ る 前に完全にな っ てい る 必要があ り ま す。 配列が extern 型でない場合、 要素の型は コ ンパ イ ルが終了す る ま で に完全にな っ てい る 必要があ り ます。 • struct 指定子ま たは union 指定子の閉 じ 中括弧 (}) の前にあ る 最後のセ ミ コ ロ ンは省略で き ます。 こ の場合は警告が生成 さ れます。 • 3-24 値が 1 つで、 ス タ テ ィ ッ ク 配列の 構造体 ま たは共用体全体の初期化に使用 す る イ ニ シ ャ ラ イ ザの式を中括弧で囲む必要はあ り ません。 ISO C では 中括弧の使用が規定 さ れてい ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 • 以下を含め、 C++ 匿名の共用体に似た構造体を使用で き る よ う にす る た めの拡張機能がサポー ト さ れてい ます。 — 匿名の共用体だけでな く 、 匿名の構造体 も 使用で き ます。 匿名構造 体の メ ンバは、 親の構造体の有効範囲に関連付け ら れ、 通常の メ ン バ と 同 じ よ う にル ッ ク ア ッ プ さ れ ます。 — 匿名構造体の メ ンバは、 typedef の名前に よ っ て、 それを保持す る 構造体に導入で き ます。 つま り 、 実際の匿名の共用体の よ う に メ ン バを直接宣言す る 必要はあ り ません。 — タ グは、 C モー ド の場合にのみ宣言で き ます。 匿名の構造体 と 匿名の共用体を サポー ト す る には、 anon_unions プ ラ グマ を使用す る 必要があ り ます。 • enum リ ス ト の終わ り には 1 つ余分な コ ン マ を追加で き ますが、 その場合 には注釈が生成 さ れ ます。 • enum タ グは不完全で も 構い ません。 タ グの名前は、 中括弧で囲ま れた リ ス ト を指定す る こ と に よ っ て、 後で定義 し て解決で き ます。 • 列挙定数の値は、 int の範囲内ではな く 、 unsigned int の範囲内に収ま る 符号な し の値を求め る 式に よ っ て指定で き ます。 以下に例を示 し ます。 /* When ints enum a { w = enum b { x = enum c { y = enum d { z = • are 32 bits: */ -2147483648 }; 0x80000000 }; 0x80000001 }; 2147483649 }; /* /* /* /* No error */ No error */ No error */ Error */ ビ ッ ト フ ィ ール ド には、 int お よ び unsigned int 型のほかに、 enum 型ま た は整数型の基本型を割 り 当て る こ と がで き ます。 関連項目 • 「プ ラ グマ」 (ページ 4-62) • 「構造体、 共用体、 列挙型、 ビ ッ ト フ ィ ール ド の拡張機能」 (ページ 3-24) • ARM DUI 0348BJ ID 1 0 0 4 1 9 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「C99 の新機能」 (ページ 5-51) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-25 言語拡張機能 3.7 GNU 言語拡張機能 こ のセ ク シ ョ ン では、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の拡張機能について説明 し ます。 こ れ ら の拡張機能は、 GNU モー ド 、 つま り 、--gnu オプシ ョ ン を使用 し て ソ ース コ ー ド を コ ンパ イ ル し た場合にのみサ ポー ト さ れます。 詳細については、 「言語標準の準拠」 (ページ 1-7) お よ び 「--gnu」 (ページ 2-75) を参照 し て下 さ い。 注 すべての GNU コ ンパ イ ラ 拡張機能がすべての言語に対 し てサポー ト さ れてい る わけではあ り ません。 例えば、 C++ では拡張ポ イ ン タ 算術演算はサポー ト さ れてい ません。 GNU 拡張機能の使用方法の詳細については、 http://gcc.gnu.org で GNU コ ン パ イ ラ のオ ン ラ イ ン マニ ュ アルを参照 し て下 さ い。 ARM コ ンパ イ ラ に関す る 補足情報については、 以下の付録を参照 し て下 さ い。 • 付録 B 標準 C の実装定義 3.7.1 • 付録 C 標準 C++ の実装定義 • 付録 D C お よ び C++ コ ンパ イ ラ の実装に関す る制限 代替キーワー ド コ ンパ イ ラ は、 __keyword__ と い う 形式の代替キー ワー ド を認識 し ます。 こ の よ う な代替キー ワー ド の動作は、 元のキー ワ ー ド の動作 と 同 じ です。 例 __const__ int pi = 3.14; // same as const int pi = 3.14 3.7.2 asm keyword こ のキー ワー ド は、 __asm キー ワ ー ド と 同 じ 意味です。 モー ド C90 お よ び C99 の GNU モー ド でのみサポー ト さ れてい ます。 3-26 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 関連項目 • 3.7.3 「__asm」 (ページ 4-5) case の範囲 switch ス テー ト メ ン ト の値の範囲を指定で き ます。 例 int Case_Ranges_0(int arg) { int aLocal; int bLocal =arg; switch (bLocal) { case 0 ... 10: aLocal= 1; break; case 11 ... 100: aLocal =2; break; default: aLocal=-1; } return aLocal; } 3.7.4 共用体のキ ャ ス ト union 型へのキ ャ ス ト は、 指定 さ れ る 型が union であ る と い う 点を除いては、 他のキ ャ ス ト と 同 じ です。 型は union タ グか typedef 名のいずれかで指定で き ます。 モー ド C90 お よ び C99 の GNU モー ド でのみサポー ト さ れてい ます。 例 typedef union { double d; int i; } foo_t; int Cast_to_Union_0(int a, double b) ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-27 言語拡張機能 { foo_t u; if (a>100) u = (foo_t) a ; // automatically equivalent to u.i=a; else u = (foo_t) b ; // automatically equivalent to u.d=b; return u.i; } 3.7.5 文字エ スケープ シーケ ン ス 文字列では、 エ ス ケープシーケ ン ス ‘\e’ を エ ス ケープ文字 <ESC> (ASCII 27) に対 し て使用で き ます。 例 void foo(void) { printf("Escape sequence is: \e\n"); } 3.7.6 複合 リ テ ラ ル C99 と 同様に、 複合 リ テ ラ ルがサポー ト さ れてい ます。 複合 リ テ ラ ルはすべて 左辺値です。 例 int y[] = (int []) {1, 2, 3}; // error in strict C99, okay in C99 --gnu int z[] = (int [3]) {1}; モー ド C90 お よ び C99 の GNU モー ド でのみサポー ト さ れてい ます。 注 複合 リ テ ラ ルは、 C99 では イ ニシ ャ ラ イ ザ と し て も 使用で き ます。 ただ し コ ン パ イ ラ では、 C99 ソ ース コ ー ド を コ ンパ イ ル し た場合 よ り も 、 GNU モー ド を 使用 し た場合の方が、 イ ニシ ャ ラ イ ザ と し ての複合 リ テ ラ ルを よ り 柔軟に受 け入れ る こ と がで き ます。 3-28 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 3.7.7 条件付き ス テー ト メ ン ト 条件付 き ス テー ト メ ン ト の中間にあ る オペ ラ ン ド は、 結果がテ ス ト と 同 じ に な る 場合は省略で き ます。 以下に例を示 し ます。 例 以下の ス テー ト メ ン ト は同 じ 意味にな り ます。 c = i ? : j; // middle operand omitted c = i ? i : j; if (i) c = i; else c = j; // expanded in full こ れは、 特にテ ス ト で以下の よ う に値が変更 さ れ る 場合に役立ち ます。 i++ ? : j; i++ はマ ク ロ の結果です。 こ の よ う に コ ー ド を記述 し た場合、 i++ は 1 回だけ評 価 さ れ ます。 i の元の値が 0 以外の場合、 評価結果は i の元の値にな り ます。 こ の よ う な結 果にな り ますが、 i は 1 回 イ ン ク リ メ ン ト さ れます。 モー ド GNU モー ド でのみサポー ト さ れてい ます。 サポー ト さ れてい る 言語は、 C90、 C99、 お よ び C++ です。 3.7.8 指定済みのイ ニ シ ャ ラ イザ C99 と 同様に、 指定済みの イ ニシ ャ ラ イ ザがサポー ト さ れてい ます。 例 int a[6] = { [4] = 29, [2] = 15 }; int b[6] = { 0,0,15,0,29,0 }; // a[] is equivalent to b[] モー ド C90 お よ び C++ の GNU モー ド でのみサポー ト さ れてい ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-29 言語拡張機能 関連項目 • 3.7.9 『コ ンパ イ ラ ユーザガ イ ド 』 の 「C99 の新機能」 (ページ 5-51) 拡張左辺値 GNU モー ド では、 コ ン マ式 と ?: 構造体を参照す る と き に、 左辺値の構成要 素に関 し て制限の少ない定義を使用で き ます。 以下の よ う に、 複合式、 条件 式、 お よ びキ ャ ス ト を使用で き ます。 • 以下の よ う に複合式を代入で き ます。 (a++, b) += x; こ れは以下の コ ー ド と 同等です。 temp = (a++,b); b = temp + x • 複合式 &(a, b) のア ド レ ス を取得で き ます。 こ れは (a, &b) と 同等です。 • 以下の よ う に条件式を使用で き ます。 (a ? b : c) = a; 上記の例では、b ま たは c を a に依存す る デス テ ィ ネーシ ョ ン と し て選択 し ます。 モー ド C90 お よ び C99 の GNU モー ド でのみサポー ト さ れてい ます。 3.7.10 イ ニ シ ャ ラ イザ 標準 C++ お よ び ISO C99 で規定 さ れてい る よ う に、 自動変数用の集合 イ ニ シ ャ ラ イ ザの要素を定数式にす る 必要はあ り ません。 モー ド C90 の GNU モー ド でのみサポー ト さ れてい ます。 例 float Initializers_0 (float f, float g) { float beat_freqs[2] = { f-g, f+g }; float aLocal; int i=0; 3-30 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 for (; i<2; i++) aLocal += beat_freqs[i]; return aLocal; } 3.7.11 インライン inline 関数修飾子は、 関数を イ ン ラ イ ン展開すべ き であ る と い う コ ンパ イ ラ への ヒ ン ト です。 static inline foo (){...} foo は フ ァ イ ルに対 し て内部的に使用 さ れます。 こ の関数のシ ン ボルはエ ク ス ポー ト さ れません。 inline foo(){...} foo は フ ァ イ ルに対 し て内部的に使用 さ れます。 こ の関数はア ウ ト オブ ラ イ ン関数 と し て使用で き る よ う にな り 、 foo と い う 名前 がエ ク ス ポー ト さ れ ます。 extern inline foo (){...} GNU モー ド では、 foo は イ ン ラ イ ン展開 さ れてい る 場合に内部的 に使用 さ れ ます。 イ ン ラ イ ン展開 さ れていない場合、 内部バー ジ ョ ン の呼び出 し は使用 さ れず、 外部バージ ョ ンが参照 さ れま す。 ま た、 foo シ ン ボルは生成 さ れません。 非 GNU モー ド では、 extern は無視 さ れ、 機能は C++ の inline foo() と 同 じ にな り ます。 C では、 __inline を使用す る 必要があ り ます。 詳細については、 「Extern イ ン ラ イ ン関数」 (ページ 5-22) を参照 し て下 さ い。 モー ド C90 の GNU モー ド でのみサポー ト さ れてい ます。 3.7.12 値 と し ての ラ ベル コ ンパ イ ラ は、 && 演算子を使用す る GCC ラ ベルを値 と し てサポー ト し ます。 モー ド C お よ び C++ の GNU モー ド でサポー ト さ れてい ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-31 言語拡張機能 例 ラ ベルのテーブル int f(int n) { void *const table[] = { &&a1, &&a2}; goto *table[n]; a1: return 1; a2: return 2; } 継続に使用 さ れ る ラ ベル void *toggle(void *lab, int *x) { if (lab) goto *lab; a1: *x = 1; return &&a2; a2: *x = 0; return &&a1; } 3.7.13 ポ イ ン タ 算術演算 void ポ イ ン タ と 関数ポ イ ン タ に対 し て算術演算を実行で き ます。 void 型ま たは関数型のサ イ ズは 1 に定義 さ れます。 モー ド C90 お よ び C99 の GNU モー ド でのみサポー ト さ れてい ます。 エラー コ ンパ イ ラ では、 void ポ イ ン タ ま たは関数ポ イ ン タ で算術演算を検出 し た場 合に、 警告を生成 し ます。 例 int ptr_arith_0(void) { void * pointer; return sizeof *pointer; } int ptr_arith_1(void) { static int diff; 3-32 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 言語拡張機能 diff = ptr_arith_0 - ptr_arith_1; return sizeof ptr_arith_0; } 3.7.14 ス テー ト メ ン ト 式 ス テー ト メ ン ト 式を使用す る と 、 宣言を含む コ ー ド のすべてのセ ク シ ョ ン を 中括弧 ({ }) の中に配置す る こ と がで き ます。 ス テー ト メ ン ト リ ス ト の最後の項目が、 ス テー ト メ ン ト 式の結果です。 制約条件 ス テー ト メ ン ト 式内に分岐す る こ と はで き ません。 C++ モー ド では、 外部への分岐 も 許可 さ れてい ません。 ス テー ト メ ン ト 式内 では、 可変長配列、 破棄可能なエ ン テ ィ テ ィ 、 ト ラ イ 、 キ ャ ッ チ、 ロ ーカル の非 POD ク ラ ス定義、 お よ びダ イ ナ ミ ッ ク に初期化 さ れた ロ ーカル ス タ テ ィ ッ ク 変数が許可 さ れてい ません。 例 int bar(int b, int foo) { if (({ int y = foo; int z; if (y > 0) z = y; else z = -y; z>b; })) b++; return b; } 3.7.15 無名の フ ィ ール ド 構造体や共用体を別の構造体や共用体に埋め込む と き 、 内部の構造体に名前 を付け る 必要はあ り ません。 .name を使用 し て参照す る こ と な く 、 無名の構造 体の内容にア ク セ ス で き ます。 無名の フ ィ ール ド は、 匿名共用体お よ び匿名構造体 と 同等です。 モー ド C90 お よ び C99 の GNU モー ド でのみサポー ト さ れてい ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3-33 言語拡張機能 例 struct { int a; union { int b; float c; }; int d; } Unnamed_Fields_0; int Unnamed_Fields_1() { return Unnamed_Fields_0.b; } 関連項目 • 3-34 「匿名 ク ラ ス、 匿名構造体、 匿名共用体」 (ページ 3-21) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 第4章 コ ンパイ ラ固有の機能 本章では、 ARM コ ンパ イ ラ 固有の機能について説明 し ます。 以下のセ ク シ ョ ン か ら 構成 さ れてい ます。 「キーワー ド と 演算子」 (ページ 4-2) • • • • • • • • • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「__declspec 属性」 (ページ 4-27) 「関数属性」 (ページ 4-35) 「型属性」 (ページ 4-47) 「変数属性」 (ページ 4-52) 「プ ラ グマ」 (ページ 4-62) 「命令 コ ンパ イ ラ 組み込み関数」 (ページ 4-80) 「VFP ス テー タ ス組み込み関数」 (ページ 4-125) 「GNU 組み込み関数」 (ページ 4-126) 「コ ンパ イ ラ に よ る事前定義」 (ページ 4-129) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-1 コ ンパイ ラ固有の機能 4.1 キーワー ド と 演算子 こ のセ ク シ ョ ン では、 ARM コ ンパ イ ラ armcc でサポー ト さ れてい る 関数の キー ワ ー ド お よ び演算子について説明 し ます。 表 4-1 は、 C お よ び C++ 標準に対す る ARM 拡張のキー ワー ド を示 し てい ま す。 ARM コ ンパ イ ラ 固有の動作ま たは制約条件を サポー ト し ていない標準 C お よ び標準 C++ キー ワー ド は、 こ のテーブルには記載 さ れてい ません。 表 4-1 ARM コ ンパイ ラ によ っ てサポー ト さ れているキーワー ド 拡張 キーワー ド 4.1.1 __align __int64 __svc __ALIGNOF__ __INTADDR__ __svc_indirect __asm __irq __svc_indirect_r7 __declspec __packed __value_in_regs __forceinline __pure __weak __global_reg __softfp __writeonly __inline __smc __align __align キー ワー ド は、 n バ イ ト 境界に変数を整列す る よ う コ ンパ イ ラ に指示 し ます。 __align は記憶域 ク ラ ス修飾子です。 こ れは、 関数の型には影響 し ません。 4-2 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 構文 __align(n) 各項目には以下の意味があ り ます。 境界整列を指定 し ます。 n ロ ーカル変数の場合、 n には、 1、 2、 4、 ま たは 8 を設定で き ま す。 グ ロ ーバル変数の場合、 n には、 2 の累乗で 0x80000000 以下の任 意の値を設定で き ます。 キー ワー ド __align は、 変数名のす ぐ前に置かれ ます。 使用法 __align(n) は、 宣言 さ れてい る 変数の通常の境界整列が n に指定 さ れた値 よ り 小 さ く な る 場合に便利です。VFP 命令を使用す る 場合には 8 バ イ ト 境界整列に よ っ てパフ ォーマ ン ス が大幅に向上 し ます。 __align は、 extern お よ び static と 組み合わせて使用で き ます。 制約条件 __align は記憶域 ク ラ ス修飾子なので、 以下では使用で き ません。 • typedef や構造体定義を含む型 • 関数のパ ラ メ ー タ 指定で き る のはオーバーア ラ イ メ ン ト だけです。 つま り 、 2 バ イ ト オブジ ェ ク ト を 4 バ イ ト 境界で整列 さ せ る こ と はで き ますが、 4 バ イ ト オブジ ェ ク ト を 2 バ イ ト 境界で整列 さ せ る こ と はで き ません。 例 __align(8) char buffer[128]; // buffer starts on eight-byte boundary void foo(void) { ... __align(16) int i; // this alignment value is not permitted for // a local variable ... } __align(16) int i; // permitted as a global variable. ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-3 コ ンパイ ラ固有の機能 関連項目 • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「--min_array_alignment=opt」 (ページ 2-102) 4.1.2 __alignof__ __alignof__ キー ワー ド を使用す る と 、 型や変数の境界整列について照会で き ます。 注 こ のキー ワー ド は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の拡張機能です。 構文 __alignof__(type) __alignof__(expr) 各パ ラ メ ー タ には以下の意味があ り ます。 type 型を指定 し ます。 expr 左辺値を指定 し ます。 戻り値 __alignof__(type) は type 型の整列要求を返 し 、 整列要求がない場合は 1 を返 し ます。 __alignof__(expr) は、 左辺値 expr の型の整列要求を返 し 、 整列要求がない場 合は 1 を返 し ます。 例 int Alignment_0(void) { return __alignof__(int); } 関連項目 • 4-4 「__ALIGNOF__」 (ページ 4-5) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.1.3 __ALIGNOF__ __ALIGNOF__ キー ワ ー ド は、 指定 さ れた型ま たは指定 さ れたオブジ ェ ク ト の型 の整列要求を返 し ます。 構文 __ALIGNOF__(type) __ALIGNOF__(expr) 各パ ラ メ ー タ には以下の意味があ り ます。 type 型を指定 し ます。 expr 左辺値を指定 し ます。 戻り値 __ALIGNOF__(type) は type 型の整列要求を返 し 、 整列要求がない場合は 1 を返 し ます。 __ALIGNOF__(expr) は、 左辺値 expr の型の整列要求を返 し 、 整列要求がない場 合は 1 を返 し ます。 左辺値自体は評価 さ れ ません。 例 typedef struct s_foo { int i; short j; } foo; typedef __packed struct s_bar { int i; short j; } bar; return __ALIGNOF(struct s_foo); // returns 4 return __ALIGNOF(foo); // returns 4 return __ALIGNOF(bar); // returns 1 関連項目 • 4.1.4 「__alignof__」 (ページ 4-4) __asm こ のキー ワ ー ド を使用 し て、 コ ンパ イ ラ か ら ARM アセ ン ブ ラ armasm に情報 を渡 し ます。 こ のキー ワ ー ド の正確な ア ク シ ョ ンは、 使用法に よ っ て異な り ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-5 コ ンパイ ラ固有の機能 使用法 組み込みアセ ン ブ ラ __asm キー ワー ド を使用 し て、 組み込みアセ ン ブ リ 関数を宣言ま たは定義で き ます。 以下に例を示 し ます。 __asm void my_strcpy(const char *src, char *dst); 詳細については、 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「組み込みアセ ンブ ラ 」 (ページ 7-19) を参照 し て下 さ い。 イ ン ラ イ ン アセ ン ブ ラ __asm キー ワー ド を使用 し て、 イ ン ラ イ ン アセ ンブ リ を関数に組 み込む こ と がで き ます。 以下に例を示 し ます。 int qadd(int i, int j) { int res; __asm { QADD res, i, j } return res; } 詳細については、 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「 イ ン ラ イ ン ア セ ンブ ラ 」 (ページ 7-2) を参照 し て下 さ い。 アセ ン ブ ラ ラ ベル __asm キー ワー ド を使用 し て、 C シ ン ボルのアセ ン ブ ラ ラ ベルを 指定で き ます。 以下に例を示 し ます。 int count __asm__("count_v1"); // export count_v1, not count 詳細については、 「アセ ンブ ラ ラ ベル」 (ページ 3-22) を参照 し て下 さ い。 名前付 き レ ジ ス タ 変数 __asm キー ワー ド を使用 し て、 名前付 き レ ジ ス タ 変数を宣言で き ます。 以下に例を示 し ます。 register int foo __asm("r0"); 詳細については、 「名前付 き レ ジ ス タ 変数」 (ページ 4-122) を参 照 し て下 さ い。 関連項目 • 「asm keyword」 (ページ 3-26) 4-6 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.1.5 __forceinline __forceinline キー ワ ー ド は、 C 関数ま たは C++ 関数を イ ン ラ イ ン で コ ンパ イ ルす る よ う コ ンパ イ ラ に指示 し ます。 __forceinline のセマ ン テ ィ ク ス は、 以下の よ う に C++ での inline キー ワー ド のセマ ン テ ィ ク ス と ま っ た く 同 じ です。 コ ンパ イ ラ は、 関数の特性に関係な く 、 __forceinline と し て修飾 さ れてい る 関数を イ ン ラ イ ン関数に し よ う と し ます。 ただ し 、 問題が発生す る 場合、 コ ンパ イ ラ は関数を イ ン ラ イ ン関数に し ません。 例えば、 再帰関数は一度 し か イ ン ラ イ ン展開で き ません。 __forceinline は記憶域 ク ラ ス修飾子です。 こ れは、 関数の型には影響 し ませ ん。 注 こ のキー ワ ー ド には、 同等の関数属性 __attribute__((always_inline)) があ り ま す。 例 __forceinline static int max(int x, in y) { return x > y ? x : y; // always inline if possible } 関連項目 • 「--forceinline」 (ページ 2-66) • 4.1.6 「__attribute__((always_inline))」 (ページ 4-37) __global_reg __global_reg 記憶域 ク ラ ス指定子では、 宣言 さ れた変数がグ ロ ーバル変数レ ジ ス タ に割 り 当て ら れ ます。 構文 __global_reg(n) type varName 各パ ラ メ ー タ には以下の意味があ り ます。 n ARM DUI 0348BJ ID 1 0 0 4 1 9 1 か ら 8 ま での整数を指定 し ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-7 コ ンパイ ラ固有の機能 以下の型のいずれか を指定 し ます。 • long long を除 く 任意の整数型 type • 任意の char 型 • 任意のポ イ ン タ 型 変数の名前を指定 し ます。 varName 制約条件 こ の記憶域 ク ラ ス を使用す る と 、 extern、 static、 typedef な ど の追加の記憶域 ク ラ ス は使用で き ません。 C では、 グ ロ ーバルレ ジ ス タ 変数を宣言時に修飾ま たは初期化す る こ と はで き ません。 C++ では、 すべての初期化が動的な初期化 と し て処理 さ れ ます。 使用 さ れてい る AAPCS のバ リ ア ン ト に応 じ て、 使用で き る レ ジ ス タ 変数の 数は異な り ますが、 グ ロ ーバル変数レ ジ ス タ と し て 5 ~ 7 本の レ ジ ス タ を使 用で き ます。 実際には、 以下の数を超え る 使用はお勧め し ません。 • ARM ま たは Thumb-2 の場合は 3 つのグ ロ ーバルレ ジ ス タ 変数 • Thumb-1 の場合は 1 つのグ ロ ーバルレ ジ ス タ 変数 • グ ロ ーバル浮動小数点レ ジ ス タ 変数 と し て使用可能な浮動小数点レ ジ ス タ の半数 多 く のグ ロ ーバル変数を宣言す る と 、 コ ー ド サ イ ズは著 し く 増大 し ます。 場 合に よ っ ては、 プ ロ グ ラ ム を コ ンパ イ ルで き な く な り ます。 注意 グ ロ ーバルレ ジ ス タ 変数を使用す る 場合は、 以下の理由で注意を払 う 必要が あ り ます。 • 4-8 異な る コ ンパ イ ルユニ ッ ト 間での直接呼び出 し が適切であ る か ど う かが リ ン ク 時にチ ェ ッ ク さ れ ません。 プ ロ グ ラ ム で使用 さ れてい る グ ロ ーバ ルレ ジ ス タ 変数は、 で き る 限 り 、 プ ロ グ ラ ムの各 コ ンパ イ ルユニ ッ ト で 定義 し て下 さ い。 一般的に、 レ ジ ス タ 変数の定義はグ ロ ーバルヘ ッ ダ フ ァ イ ルに配置す る のが最 も 適切です。 グ ロ ーバルレ ジ ス タ の値は、 レ ジ ス タ が使用 さ れ る 前に、 コ ー ド の最初の段階で設定す る 必要があ り ま す。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 • グ ロ ーバルレ ジ ス タ 変数は呼び出 し 先退避レ ジ ス タ にマ ッ ピ ン グ さ れ る ため、 その値を グ ロ ーバルレ ジ ス タ 変数 と し て使用 し ない ラ イ ブ ラ リ 関 数な ど の コ ンパ イ ルユニ ッ ト では、 こ の値が関数への呼び出 し を介 し て 保存お よ び復元 さ れ ます。 • グ ロ ーバルレ ジ ス タ 変数を使用す る コ ンパ イ ルユニ ッ ト への コ ールバ ッ ク は危険です。 例えば、 グ ロ ーバルレ ジ ス タ を使用す る 関数が、 グ ロ ー バルレ ジ ス タ 変数を宣言 し ない コ ンパ イ ルユニ ッ ト か ら 呼び出 さ れ る と 、 その関数は推測 し た グ ロ ーバルレ ジ ス タ 変数か ら 誤っ た値を読み出 す こ と にな り ます。 • こ の記憶域 ク ラ ス は、 フ ァ イ ルの有効範囲のみで使用で き ます。 例 例 4-1 では、 r5 に割 り 当て ら れた グ ロ ーバル変数レ ジ ス タ を宣言 し ます。 例 4-1 グローバル整数レ ジ ス タ 変数の宣言 __global_reg(2) int x; v2 is the synonym for r5 グ ロ ーバルレ ジ ス タ は、 同 じ 変数のすべての宣言で指定す る 必要があ る ため、 例 4-2 ではエ ラ ーが発生 し ます。 例 4-2 グローバルレ ジ ス タ - 宣言エ ラ ー int x; __global_reg(1) int x; // error C で記述 し た __global_reg 変数は、 定義時に初期化で き ません。 例 4-3 におい て、 C++ ではエ ラ ーにな り ませんが、 C ではエ ラ ーにな り ます。 例 4-3 グローバルレ ジ ス タ - 初期化エ ラ ー __global_reg(1) int x=1; // error in C, OK in C++ ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-9 コ ンパイ ラ固有の機能 関連項目 • 「--global_reg=reg_name[,reg_name,...]」 (ページ 2-75) 4.1.7 __inline __inline キー ワー ド は、 コ ンパ イ ラ に対 し 、 必要に応 じ て、 C 関数ま たは C++ 関数を イ ン ラ イ ン で コ ンパ イ ルす る よ う に指示 し ます。 __inline のセマ ン テ ィ ク ス は、 以下の よ う に inline キー ワ ー ド のセマ ン テ ィ ク ス と ま っ た く 同 じ です。 ただ し 、 inline は C90 では使用で き ません。 __inline は記憶域 ク ラ ス修飾子です。 こ れは、 関数の型には影響 し ません。 例 __inline int f(int x) { return x*5+1; } int g(int x, int y) { return f(x) + f(y); } 関連項目 • 4.1.8 『コ ンパ イ ラ ユーザガ イ ド 』 の 「関数の イ ン ラ イ ン展開」 (ページ 5-20) __int64 __int64 キー ワー ド は、 キー ワ ー ド シーケ ン ス long long と 同 じ 意味です。 __int64 は、--strict の使用時に も 容認 さ れます。 関連項目 「--strict, --no_strict」 (ページ 2-133) • • 4-10 「long long」 (ページ 3-8) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.1.9 __INTADDR__ __INTADDR__ 演算では、 括弧で囲ま れた式が定数式 と し て処理 さ れ、 その定数 式が整数定数に変換 さ れ ます。 注 こ の式は offsetof マ ク ロ で使用 さ れます。 構文 __INTADDR(expr) 各パ ラ メ ー タ には以下の意味があ り ます。 整数定数式を指定 し ます。 expr 戻り値 __INTADDR__(expr) は、 expr と 同等の整数定数を戻 し ます。 関連項目 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「組み込みアセ ンブ リ の制限」 (ページ • 7-21) 4.1.10 __irq __irq キーワ ー ド は、 C 関数ま たは C++ 関数を、 割 り 込みルーチン と し て使用 可能に し ます。 __irq は、 関数修飾子です。 こ れは、 関数の型に影響 し ます。 制約条件 浮動小数点を除 き 、 破壊 さ れた レ ジ ス タ は、 AAPCS で通常保持 さ れ る も のだ けではな く すべて保持 さ れ ます。 こ の場合はデフ ォ ル ト の AAPCS モー ド を使 用す る 必要があ り ます。 こ の関数か ら は、 プ ロ グ ラ ム カ ウ ン タ に lr-4 を、 CPSR に SPSR の値を設定す る こ と で終了で き ます。 __irq 関数で引数や戻 り 値を使用す る こ と はで き ませ ん。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-11 コ ンパイ ラ固有の機能 注 Thumb 専用プ ロ セ ッ サに コ ンパ イ ルす る 場合は、 割 り 込みハン ド ラ が Thumb 状態で開始 さ れ る ため、 コ ー ド は Thumb コ ー ド に コ ンパ イ ル さ れ ます。 それ 以外の場合は、 --thumb オプシ ョ ン ま たは #pragma thumb を使用 し て Thumb 用に コ ンパ イ ル し て も 、 __irq と 指定 さ れてい る 関数はすべて ARM に コ ンパ イ ル さ れ ます。 関連項目 • 「--thumb」 (ページ 2-136) • • 4.1.11 「#pragma thumb」 (ページ 4-79) 『デベ ロ ッ パガ イ ド 』 の第 6 章 プ ロ セ ッ サ例外処理 __packed __packed 修飾子を指定す る と 、 すべての有効型の境界整列が 1 に設定 さ れま す。 し たがっ て、 • パ ッ ク オブジ ェ ク ト を境界整列 さ せ る ためのパデ ィ ン グの挿入は行われ ません。 • パ ッ ク 型のオブジ ェ ク ト の読み出 し ま たは書 き 込みは、 非境界整列ア ク セ ス を使用 し て行われます。 構造体ま たは共用体が __packed 修飾子を使用 し て宣言 さ れてい る 場合、 その すべての メ ンバに __packed 修飾子が適用 さ れます。 メ ンバ間に も 構造体の終わ り に も パデ ィ ン グは挿入 さ れ ません。 パ ッ ク 構造体のすべてのサブ構造体は、 __packed を使用 し て宣言す る 必要があ り ます。 非パ ッ ク 構造体の整数サブ フ ィ ール ド は個々にパ ッ ク で き ます。 使用法 __packed 修飾子は、 構造体を外部のデー タ 構造体にマ ッ プ し た り 非境界整列 デー タ にア ク セ スす る 際に使用す る と 効果的ですが、 ア ク セ ス にかか る コ ス ト が比較的高いため、 一般的には、 デー タ サ イ ズの削減には効果があ り ませ ん。 非境界整列ア ク セ ス の数は、 パ ッ ク す る 必要のあ る 構造体に フ ィ ール ド をパ ッ ク す る こ と に よ っ てのみ減 ら す こ と がで き ます。 4-12 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 注 ハー ド ウ ェ アで非境界整列ア ク セ ス を サポー ト し ていない ARM プ ロ セ ッ サ (ARMv6 以前のプ ロ セ ッ サな ど) では、 コ ー ド サ イ ズお よ び実行速度におい て、 非境界整列デー タ へのア ク セ ス に コ ス ト がかか る 場合があ り ます。 コ ー ド サ イ ズの増大 と パフ ォ ーマ ン ス の低下を避け る ため、 パ ッ ク 構造体を介 し たデー タ ア ク セ ス は最小限に抑え る 必要があ り ます。 制約条件 __packed を使用す る 場合は、 以下の制限が適用 さ れ ます。 • __packed 修飾子は、 前に __packed を使用せずに宣言 さ れた構造体には使 用で き ません。 • 他の型修飾子 と は異な り 、 構造体の型については、 同 じ 型について __packed バージ ョ ン と __packed 以外のバージ ョ ンの両方を使用す る こ と はで き ません。 • __packed 修飾子は、 整数型の ロ ーカル変数には影響 し ません。 • パ ッ ク 構造体ま たは共用体は、 対応す る 非パ ッ ク 構造体 と の代入互換性 はあ り ません。 構造体に よ っ て使用 さ れ る メ モ リ レ イ ア ウ ト は異な る た め、 パ ッ ク 構造体を非パ ッ ク 構造体に割 り 当て る には、 フ ィ ール ド ご と に コ ピーす る 以外に方法はあ り ません。 • __packed を使用 し ない場合の影響については定義 さ れてい ません。 ま た、 非パ ッ ク 構造体をパ ッ ク 構造体にキ ャ ス ト し た場合の影響について も 定 義 さ れてい ません。 整数型へのポ イ ン タ は、 明示的、 暗示的を問わず、 パ ッ ク 整数型へのポ イ ン タ に適切にキ ャ ス ト で き ます。 ま た、 char 型で __packed を使用 し ない こ と も 可能です。 • パ ッ ク 配列型はあ り ません。 パ ッ ク 配列 と は、 パ ッ ク 型のオブジ ェ ク ト の配列を指 し ます。 配列はパデ ィ ン グ さ れ ません。 例 例 4-4 (ページ 4-14) の場合は、 ポ イ ン タ を使用 し て、 パ ッ ク 型を指す こ と が で き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-13 コ ンパイ ラ固有の機能 例 4-4 パ ッ ク へのポ イ ン タ typedef __packed int* PpI; __packed int *p; PpI p2; typedef int *PI; __packed PI p3; int *__packed p4; /* /* /* /* /* /* /* /* /* pointer to a __packed int */ pointer to a __packed int */ 'p2' has the same type as 'p' */ __packed is a qualifier */ like 'const' or 'volatile' */ pointer to int */ a __packed pointer to a normal int */ -- not the same type as 'p' and 'p2' */ 'p4' has the same type as 'p3' */ 例 4-5 では、 ポ イ ン タ を使用 し てパ ッ ク オブジ ェ ク ト にア ク セ スす る 場合、 コ ンパ イ ラ に よ っ て、 ポ イ ン タ の境界整列に依存せずに機能す る コ ー ド が生 成 さ れ る のを示 し ます。 例 4-5 パ ッ ク 構造体 typedef __packed struct { char x; int y; } X; int f(X *p) { return p->y; } typedef struct { short x; char y; __packed int z; char a; } Y; int g(Y *p) { return p->z + p->x; } 4-14 // all fields inherit the __packed qualifier // 5 byte structure, natural alignment = 1 // does an unaligned read // only pack this field // 8 byte structure, natural alignment = 2 // only unaligned read for z Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 関連項目 • 「__attribute__((packed))」 (ページ 4-56) • 「#pragma pack(n)」 (ページ 4-73) • 「パ ッ ク 構造体」 (ページ 5-11) • 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「__packed 修飾子 と 非境界整列型のデー タ ア ク セ ス」 (ページ 5-31) • 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「パ ッ ク 構造体 と 個別パ ッ ク フ ィ ール ド 」 (ページ 5-33) 4.1.12 __pure __pure キーワ ー ド は、 関数宣言が純関数であ る こ と を示 し ます。 関数は、 以下の場合のみ、 純関数 にな り ます。 • • 結果が引数の値のみに依存す る 場合 関数に副作用がない場合 __pure は、 関数修飾子です。 こ れは、 関数の型に影響 し ます。 注 こ のキー ワ ー ド には、 同等の関数属性 __attribute__((const)) があ り ます。 デ フ ォル ト デフ ォ ル ト では、 関数は非純関数であ る こ と が想定 さ れ ます。 使用法 純関数は、 共通部分式の削除の対象にな り ます。 制約条件 純関数 と し て宣言 さ れた関数には、 副作用はあ り ません。 純関数の例 ARM DUI 0348BJ ID 1 0 0 4 1 9 • 非純関数の呼び出 し はで き ません。 • コ ンパ イ ラ は、 ス タ ッ ク メ モ リ を除いて純関数が メ モ リ にア ク セ ス し な い こ と を想定 し てい る ため、 純関数はグ ロ ーバル変数 も デ リ フ ァ レ ン ス ポ イ ン タ も 使用す る こ と がで き ません。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-15 コ ンパイ ラ固有の機能 • 同 じ パ ラ メ ー タ で 2 度呼び出 さ れ る 場合、 純関数は毎回同 じ 値を返す必 要があ り ます。 例 int factr(int n) __pure { int f = 1; while (n > 0) f *= n--; return f;} 関連項目 • 「__attribute__((const))」 (ページ 4-37) • • 4.1.13 『コ ンパ イ ラ ユーザガ イ ド 』 の 「__pure」 (ページ 5-16) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「ARM 関数修飾子の配置」 (ページ 5-18) __smc __smc キー ワー ド は、 SMC ( セキ ュ アモニ タ ー コール) 関数を宣言 し ます。 SMC 関数を呼び出す と 、 関数の呼び出 し 時に コ ンパ イ ラ に よ っ て生成 さ れ る 命令ス ト リ ーム に SMC 命令が挿入 さ れ ます。 注 SMC 命令は、 ARM アセ ンブ リ 言語の以前のバージ ョ ン で使用 さ れた SMI 命令 を置換 し ます。 __smc は、 関数修飾子です。 こ れは、 関数の型に影響 し ます。 構文 __smc(int smc_num) return-type function-name([argument-list]); 各項目には以下の意味があ り ます。 smc_num SMC 命令で使用 さ れ る 4 ビ ッ ト の イ ミ デ ィ エー ト 値を指定 し ます。 smc_num の値は、 ARM プ ロ セ ッ サでは無視 さ れ ますが、 SMC 例外ハン ド ラ で使用 し て、 要求 さ れてい る サービ ス を特定す る こ と がで き ます。 4-16 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 制約条件 Security Extensions があ る 場合、 SMC 命令は、 選択 し た ARM アーキ テ ク チ ャ ベース のプ ロ セ ッ サで使用可能です。 詳細については、 『アセ ンブ ラ ガ イ ド 』 の 「SMC」 (ページ 4-150) を参照 し て下 さ い。 SMC 命令を サポー ト し ていないアーキ テ ク チ ャ の __smc キー ワ ー ド を含んでい る ソ ース コ ー ド を コ ンパ イ ルす る 場合、 コ ンパ イ ラ はエ ラ ーを生成 し ます。 例 __smc(5) void mycall(void); /* declare a name by which SMC #5 can be called */ ... mycall(); /* invoke the function */ 関連項目 • 『アセ ンブ ラ ガ イ ド 』 の 「SMC」 (ページ 4-150) 4.1.14 __softfp __softfp キー ワ ー ド は、 関数が ソ フ ト ウ ェ ア浮動小数点 リ ン ケージ を使用す る こ と を示 し ます。 __softfp は、 関数修飾子です。 こ れは、 関数の型に影響 し ます。 注 こ のキー ワ ー ド には #pragma と 同等の #pragma __softfp_linkage があ り ます。 使用法 こ の関数への呼び出 し に よ り 、 浮動小数点引数が整数レ ジ ス タ に渡 さ れます。 結果が浮動小数点値であ る 場合、 こ の値は整数レ ジ ス タ に戻 さ れ ます。 こ れ に よ り 、 ソ フ ト ウ ェ ア浮動小数点を対象 と し た コ ンパ イ ルの動作が繰 り 返 さ れ ます。 こ のキー ワ ー ド を使用す る と 、 ハー ド ウ ェ ア浮動小数点 と ソ フ ト ウ ェ ア浮動 小数点を使用す る よ う に コ ンパ イ ル さ れ る ソ ース で、 同 じ ラ イ ブ ラ リ を使用 で き る よ う にな り ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-17 コ ンパイ ラ固有の機能 注 C++ では、 __softfp キー ワー ド で修飾 さ れた仮想関数がオーバー ラ イ ド さ れ る 場合、 オーバー ラ イ ド す る 関数 も __softfp と し て宣言す る 必要があ り ます。 関 数が一致 し ない場合は、 コ ンパ イ ラ に よ っ てエ ラ ーが生成 さ れ ます。 関連項目 • 「--fpu=name」 (ページ 2-70) • 「#pragma softfp_linkage, #pragma no_softfp_linkage」 (ページ 4-76) • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「浮動小数点の計算 と リ ン ケージ」 (ページ 5-43) 4.1.15 __svc __svc キー ワー ド は、 最高 4 つの整数引数を取得 し 、 最高 4 つの結果を value_in_regs 構造体に返す スーパーバ イ ザ コール (SVC) 関数を宣言 し ます。 __svc は、 関数修飾子です。 こ れは、 関数の型に影響 し ます。 構文 __svc(int svc_num) return-type function-name([argument-list]); 各パ ラ メ ー タ には以下の意味があ り ます。 svc_num SVC 命令で使用 さ れ る イ ミ デ ィ エー ト 値を指定 し ます。 以下の範囲の整数を求め る 式を指定 し ます。 • ARM 命令の場合は 0 ~ 224–1 (24 ビ ッ ト 値) • 16 ビ ッ ト Thumb 命令の場合は 0 ~ 255 (8 ビ ッ ト 値) 使用法 こ れに よ り 、 通常の関数呼び出 し と 同 じ よ う に動作す る AAPCS 準拠の操作 と し て、 関数の呼び出 し が イ ン ラ イ ン で コ ンパ イ ル さ れ ます。 __value_in_regs 修飾子を使用す る と 、 16 バ イ ト ま での小 さ な構造体を、 AAPCS で定義 さ れてい る 通常の構造体受け渡 し メ カ ニ ズ ムに よ っ てではな く 、 レ ジ ス タ に返す よ う に指定で き ます。 4-18 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 例 __svc(42) void terminate_1(int procnum); // terminate_1 returns no results __svc(42) int terminate_2(int procnum); // terminate_2 returns one result typedef struct res_type { int res_1; int res_2; int res_3; int res_4; } res_type; __svc(42) __value_in_regs res_type terminate_3(int procnum); // terminate_3 returns more than // one result エラー SVC 命令を サポー ト し ない ARM アーキ テ ク チ ャ バ リ ア ン ト 、 ま たは ARM アーキ テ ク チ ャ ベース のプ ロ セ ッ サが、 --cpu オプシ ョ ン を使用 し て コ マ ン ド ラ イ ン で指定 さ れ る と 、 コ ンパ イ ラ はエ ラ ーを生成 し ます。 関連項目 「--cpu=name」 (ページ 2-35) • • • 4.1.16 「__value_in_regs」 (ページ 4-22) 『アセ ンブ ラ ガ イ ド 』 の 「SVC」 (ページ 4-142) __svc_indirect __svc_indirect キー ワ ー ド は、 演算 コ ー ド を r12 で SVC ハン ド ラ に渡 し ます。 __svc_indirect は、 関数修飾子です。 こ れは、 関数の型に影響 し ます。 構文 __svc_indirect(int svc_num) return-type function-name(int real_num[, argument-list]); 各パ ラ メ ー タ には以下の意味があ り ます。 svc_num SVC 命令で使用 さ れ る イ ミ デ ィ エー ト 値を指定 し ます。 以下の範囲の整数を求め る 式を指定 し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 • ARM 命令の場合は 0 ~ 224–1 (24 ビ ッ ト 値) • 16 ビ ッ ト Thumb 命令の場合は 0 ~ 255 (8 ビ ッ ト 値) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-19 コ ンパイ ラ固有の機能 real_num r12 で、 関数の実行を決定す る 際にハン ド ラ に渡 さ れ る 値 です。 間接的な メ カ ニ ズ ム を使用す る には、 使用す る シ ス テ ム のハン ド ラ が、 r12 の 値を使用 し て要求 さ れてい る 演算を選択す る 必要があ り ます。 使用法 こ の機能を使用す る と 、 間接的に SVC を実装で き ます。 例 int __svc_indirect(0) ioctl(int svcino, int fn, void *argp); 以下の呼び出 し を行 う と ioctl(IOCTL+4, RESET, NULL); r12 の IOCTL+4 を使用 し て、 SVC #0 に コ ンパ イ ル さ れます。 エラー SVC 命令をサポー ト し ない ARM アーキ テ ク チ ャ バ リ ア ン ト 、 ま たは ARM アーキ テ ク チ ャ ベース のプ ロ セ ッ サが、 --cpu オプシ ョ ン を使用 し て コ マ ン ド ラ イ ン で指定 さ れ る と 、 コ ンパ イ ラ はエ ラ ーを生成 し ます。 関連項目 • 「--cpu=name」 (ページ 2-35) • • 4.1.17 「__value_in_regs」 (ページ 4-22) 『アセ ンブ ラ ガ イ ド 』 の 「SVC」 (ページ 4-142) __svc_indirect_r7 r12 ではな く r7 を使用す る 点を除 き 、 __svc_indirect_r7 キー ワー ド は __svc_indirect と 同様に動作 し ます。 __svc_indirect_r7 は、 関数修飾子です。 こ れは、 関数の型に影響 し ます。 4-20 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 構文 __svc_indirect_r7(int svc_num) return-type function-name(int real_num[, argument-list]); 各パ ラ メ ー タ には以下の意味があ り ます。 svc_num SVC 命令で使用 さ れ る イ ミ デ ィ エー ト 値を指定 し ます。 以下の範囲の整数を求め る 式を指定 し ます。 real_num • ARM 命令の場合は 0 ~ 224–1 (24 ビ ッ ト 値) • 16 ビ ッ ト Thumb 命令の場合は 0 ~ 255 (8 ビ ッ ト 値) r7 で、 関数の実行を決定す る 際にハン ド ラ に渡 さ れ る 値です。 使用法 ARM Linux 上の Thumb アプ リ ケーシ ョ ン では、 __svc_indirect_r7 を使用 し て カーネルを syscalls に し ます。 こ の機能を使用 し て も 、 間接的に SVC を実装で き ます。 例 long __svc_indirect_r7(0) \ SVC_write(unsigned, int fd, const char * buf, size_t count); #define write(fd, buf, count) SVC_write(4, (fd), (buf), (count)) 以下の呼び出 し を行 う と write(fd, buf, count); r0 = fd、 r1 = buf、 r2 = count、 お よ び r7 = 4 を使用 し て SVC #0 に コ ンパ イ ル さ れ ます。 エラー SVC 命令を サポー ト し ない ARM アーキ テ ク チ ャ バ リ ア ン ト 、 ま たは ARM アーキ テ ク チ ャ ベース のプ ロ セ ッ サが、 --cpu オプシ ョ ン を使用 し て コ マ ン ド ラ イ ン で指定 さ れ る と 、 コ ンパ イ ラ はエ ラ ーを生成 し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-21 コ ンパイ ラ固有の機能 関連項目 • 「__value_in_regs」 • • 4.1.18 「--cpu=name」 (ページ 2-35) 『アセ ンブ ラ ガ イ ド 』 の 「SVC」 (ページ 4-142) __value_in_regs __value_in_regs 修飾子は、 最大 4 つの整数 ワー ド か ら な る 構造体、 ま たは最 大 4 つの float ま たは double を、 メ モ リ を使用す る のではな く 、 それぞれ整数 レ ジ ス タ と 浮動小数点レ ジ ス タ で返す よ う コ ンパ イ ラ に指示 し ます。 __value_in_regs は、 関数修飾子です。 こ れは、 関数の型に影響 し ます。 構文 __value_in_regs return-type function-name([argument-list]); 各パ ラ メ ー タ には以下の意味があ り ます。 return-type 最大 4 ワ ー ド のサ イ ズ ま での構造体の型を指定 し ます。 使用法 関数 __value_in_regs の宣言は、 複数の結果を返す関数を呼び出す と き に便利 です。 制約条件 構造体の コ ピーを作成す る 必要があ る 場合、 C++ 関数では __value_in_regs 構 造体を返す こ と はで き ません。 __value_in_regs と し て宣言 さ れた仮想関数がオーバー ラ イ ド さ れ る 場合、 オーバー ラ イ ド す る 関数 も __value_in_regs と し て宣言す る 必要があ り ます。 関 数が一致 し ない場合は、 コ ンパ イ ラ に よ っ てエ ラ ーが生成 さ れ ます。 エラー __value_in_regs に よ っ て修飾 さ れ る 関数で返 さ れ る 構造体が大 き すぎ る 場合、 警告が生成 さ れ、 __value_in_regs 構造体は無視 さ れます。 4-22 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 例 typedef struct int64_struct { unsigned int lo; unsigned int hi; } int64_struct; __value_in_regs extern int64_struct mul64(unsigned a, unsigned b); 関連項目 • 4.1.19 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「__value_in_regs」 (ページ 5-16) __weak こ のキー ワ ー ド は、 コ ンパ イ ラ にシ ン ボルを weak でエ ク ス ポー ト す る よ う 指 示 し ます。 __weak キーワ ー ド は、 関数 と 変数の宣言、 お よ び関数の定義に適用で き ます。 使用法 関数 と 変数の宣言 宣言の場合、 こ の記憶域 ク ラ ス は、 リ ン カに よ っ て未解決の参 照 と し てエ ラ ーが生成 さ れない よ う な extern オブジ ェ ク ト の宣 言を指定 し ます ( こ れには、 関数が存在 し ない場合 も 含まれま す)。 以下に例を示 し ます。 __weak void f(void); ... f(); // call f weakly 存在 し ない weak 関数への参照が、 分岐ま たは分岐 リ ン ク 命令に コ ンパ イ ル さ れ る コ ー ド か ら 行われ る 場合、 以下のいずれかが 行われ ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 • 参照は次の命令への分岐 と し て解決 さ れ ます。 こ れに よ り 、 こ の分岐は NOP と な り ます。 • こ の分岐は NOP 命令に置 き 換わ り ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-23 コ ンパイ ラ固有の機能 関数の定義 __weak で定義 さ れた関数は、 そのシ ン ボルを weak でエ ク ス ポー ト し ます。 weak で定義 さ れた関数は、 通常に定義 さ れた関数 と 同様に動作 し ます。 ただ し 、 非 weak で定義 さ れた同 じ 名前の関 数が同 じ イ メ ージに リ ン ク さ れてい る 場合は除 き ます。 非 weak で定義 さ れた関数 と weak で定義 さ れた関数の両方が同 じ イ メ ー ジ内に存在す る 場合、 すべての関数呼び出 し が非 weak 関数呼び 出 し と し て解決 さ れます。 複数の weak の定義があ る 場合、 リ ン カに よ っ て、 すべての呼び出 し に使用す る 1 つの定義が選択 さ れ ます。 __weak で宣言 し た後に __weak を使用せずに定義 し た関数は、 非 weak 関数 と し て動作 し ます。 制約条件 __weak を使用 し て、 関数 と 変数の宣言お よ び関数の定義を修飾す る 場合、 制 限条件があ り ます。 関数 と 変数の宣言 関数ま たは変数は、 同 じ コ ンパ イ ルにおいて weak と 非 weak の ど ち ら か と し て使用す る 必要があ り ます。 例えば、 以下の コ ー ド では、 g() お よ び h() か ら f() を weak で使用 し てい ます。 void f(void); void g() { f(); } __weak void f(void); void h() { f(); } 関数ま たは変数を定義 し てい る コ ンパ イ ルで、 その関数ま たは 変数を weak で使用す る こ と はで き ません。 以下の コ ー ド では、 h() か ら 非 weak で f() を使用 し てい ます。 __weak void f(void); void h() { f(); } void f() {} 4-24 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 リ ン カは、 他の コ ンパ イ ルで関数や変数が非 weak で使用 さ れて い る 場合を除 き 、 ラ イ ブ ラ リ か ら 関数や変数を ロ ー ド し ません。 参照が未解決の ま ま であ る 場合、 その値は NULL と 見な さ れます。 ただ し 、 コ ー ド か ら 位置非依存セ ク シ ョ ン ま たは存在 し ない __weak 関数への参照が未解決の場合、 その未解決の参照は NULL に はな り ません。 関数の定義 weak で定義 さ れた関数は イ ン ラ イ ン展開で き ません。 例 __weak const int c; // assume 'c' is not present in final link const int *f1() { return &c; } // '&c' returns non-NULL if // compiled and linked /ropi __weak int i; // assume 'i' is not present in final link int *f2() { return &i; } // '&i' returns non-NULL if // compiled and linked /rwpi __weak void f(void); // assume 'f' is not present in final link typedef void (*FP)(void); FP g() { return f; } // 'g' returns non-NULL if // compiled and linked /ropi 関連項目 • ARM DUI 0348BJ ID 1 0 0 4 1 9 ラ イ ブ ラ リ 検索の詳細については、 『ユーテ ィ リ テ ィ ガ イ ド 』 の 「第 3 章 armar の使用」 を参照 し て下 さ い。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-25 コ ンパイ ラ固有の機能 4.1.20 __writeonly __writeonly 型の修飾子は、 デー タ オブジ ェ ク ト が読み出せない こ と を示 し ま す。 C お よ び C++ 型シ ス テ ム では、 こ の修飾子は、 const ま たは volatile の よ う な cv 修飾子 と し て動作 し ます。 こ の修飾子の場合、 __writeonly 型の左辺値は、 右辺値に変換で き ません。 割 り 当てが読み出 し - 変更 - 書 き 込み と し て実装 さ れた場合、 __writeonly ビ ッ ト フ ィ ール ド への割 り 当ては許可 さ れません。 こ れは実装に依存 し ます。 例 void foo(__writeonly int *ptr) { *ptr = 0; // allowed printf("ptr value = %d\n", *ptr); // error } 4-26 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.2 __declspec 属性 __declspec キー ワー ド を使用す る と 、 オブジ ェ ク ト お よ び関数の特殊な属性 を指定で き ます。 例えば、 __declspec キー ワ ー ド を使用す る と 、 イ ン ポー ト ま たはエ ク ス ポー ト さ れた関数や変数を宣言 し た り 、 ス レ ッ ド ロ ーカル記憶域 (TLS) オブジ ェ ク ト を宣言 し た り す る こ と がで き ます。 __declspec キー ワ ー ド は、 宣言の指定の先頭に付け る 必要があ り ます。 以下に 例を示 し ます。 __declspec(noreturn) void overflow(void); __declspec(thread) int i; 表 4-2 では、 使用可能な __declspec 属性を示 し ます。 __declspec 属性は、 記憶 域 ク ラ ス修飾子です。 こ れ ら は、 関数ま たは変数の型には影響 し ません。 表 4-2 コ ンパイ ラ でサポー ト さ れる __declspec 属性および同等属性 4.2.1 __declspec 属性 __declspec 以外の同等属性 __declspec(dllexport) - __declspec(dllimport) - __declspec(noinline) __attribute__((noinline)) __declspec(noreturn) __attribute__((noreturn)) __declspec(nothrow) - __declspec(notshared) - __declspec(thread) - __declspec(dllexport) __declspec(dllexport) 属性は、 DLL ラ イ ブ ラ リ の ビル ド 時に、 ダ イ ナ ミ ッ ク シ ン ボルテーブルか ら シ ン ボルの定義を エ ク ス ポー ト し ます。 ク ラ ス では、 仮 想関数テーブル、 コ ン ス ト ラ ク シ ョ ン仮想関数テーブル、 RTTI な ど の ク ラ ス ・ イ ンペデ ィ メ ン タ の可視性を制御 し 、 メ ンバ関数やス タ テ ィ ッ ク デー タ メ ンバのデフ ォ ル ト の可視性を設定 し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-27 コ ンパイ ラ固有の機能 使用法 __declspec(dllexport) は、 関数、 ク ラ ス、 ま たは ク ラ ス の個々の メ ンバに使用 で き ます。 イ ン ラ イ ン関数が __declspec(dllexport) と し てマー ク さ れ る と 、 関数定義は イ ン ラ イ ン展開 さ れ る 場合があ り ますが、 イ ン ラ イ ン関数以外の関数 と 同様に、 関数のア ウ ト オブ ラ イ ン イ ン ス タ ン ス が常に生成 さ れてエ ク ス ポー ト さ れま す。 ク ラ ス が __declspec(dllexport) と し てマー ク さ れてい る と (例えば class __declspec(dllexport) S { ... };)、 その ス タ テ ィ ッ ク デー タ メ ンバ と メ ンバ関数がすべてエ ク ス ポー ト さ れ ます。 個々の ス タ テ ィ ッ ク デー タ メ ンバ と メ ンバ関数が __declspec(dllexport) と し てマー ク さ れてい る と 、 それ ら の メ ンバのみがエ ク ス ポー ト さ れ ます。 仮想関数テーブル、 コ ン ス ト ラ ク シ ョ ン 仮想関数テーブル、 お よ び RTTI も エ ク ス ポー ト さ れます。 注 以下は正 し い宣言です。 class __declspec(dllexport) S { ... }; 以下の宣言は正 し く あ り ません。 __declspec(dllexport) class S { ... }; --export_all_vtbl と 一緒に __declspec(notshared) を使用す る と 、 ク ラ スや構造 体の仮想関数テーブル、 コ ン ス ト ラ ク シ ョ ン仮想関数テーブル、 お よ び RTTI がエ ク ス ポー ト さ れ る のを防止で き ます。 --export_all_vtbl と __declspec(dllexport) は通常は一緒に使用 さ れません。 制限 ク ラ ス を __declspec(dllexport) でマー ク す る と 、 その ク ラ ス の個々の メ ンバを __declspec(dllexport) でマー ク す る こ と はで き ません。 ク ラ ス を __declspec(dllexport) でマー ク す る 場合は、 その ク ラ ス のベース ク ラ ス がすべて __declspec(dllexport) でマー ク さ れてい る こ と を確認 し て く だ さ い。 ク ラ ス内の仮想関数を エ ク ス ポー ト す る 場合は、 その ク ラ ス の仮想関数をす べてエ ク ス ポー ト す る か、 イ ン ラ イ ン で定義 し て ク ラ イ ア ン ト に表示 さ れ る よ う に し て く だ さ い。 4-28 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 例 宣言で必要な __declspec() は、 定義が同 じ 共有 ラ イ ブ ラ リ にあ る か ど う かに よ っ て異な り ます。 /* This is the declaration for use in the same shared library as the */ /* definition */ __declspec(dllexport) extern int mymod_get_version(void); /* Translation unit containing the definition */ __declspec(dllexport) extern int mymod_get_version(void) { return 42; } /* This is the declaration for use in a shared library that does not contain */ /* the definition */ __declspec(dllimport) extern int mymod_get_version(void); 次のマ ク ロ の結果、 定義 リ ン ク 単位内の非定義変換単位は __declspec(dllexport) を認識 し ます。 /* mymod.h - interface to my module */ #ifdef BUILDING_MYMOD #define MYMOD_API __declspec(dllexport) #else /* not BUILDING_MYMOD */ #define MYMOD_API __declspec(dllimport) #endif MYMOD_API int mymod_get_version(void); 関連項目 • 「__declspec(dllimport)」 (ページ 4-30) • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「__declspec(notshared)」 (ページ 4-33) 「--export_all_vtbl, --no_export_all_vtbl」 (ページ 2-62) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-29 コ ンパイ ラ固有の機能 4.2.2 __declspec(dllimport) __declspec(dllimport) 属性は、 DLL ラ イ ブ ラ リ の ビル ド 時に、 ダ イ ナ ミ ッ ク シ ン ボルテーブルか ら シ ン ボルが イ ン ポー ト さ れ ます。 使用法 イ ン ラ イ ン関数が __declspec(dllimport) と し てマー ク さ れ る と 、 こ の コ ンパ イ ルユニ ッ ト 内の関数定義が イ ン ラ イ ン展開 さ れ る 場合があ り ますが、 ア ウ ト オブ ラ イ ン で生成 さ れ る こ と はあ り ません。 ア ウ ト オブ ラ イ ンの呼び出 し ま たはア ド レ ス参照では、 イ ン ポー ト さ れたシ ン ボルが使用 さ れます。 __declspec(dllimport) は、 extern 関数 と 変数、 お よ び ク ラ ス にのみ使用で き ま す。 ク ラ ス が __declspec(dllimport) と し てマー ク さ れてい る と 、 その ス タ テ ィ ッ ク デー タ メ ンバ と メ ンバ関数がすべて イ ン ポー ト さ れ ます。 個々の ス タ テ ィ ッ ク デー タ メ ンバ と メ ンバ関数が __declspec(dllimport) でマー ク さ れてい る と 、 それ ら の メ ンバのみが イ ン ポー ト さ れ ます。 制限 ク ラ ス を __declspec(dllimport) でマー ク す る と 、 その ク ラ ス の個々の メ ンバを __declspec(dllimport) でマー ク す る こ と はで き ません。 例 __declspec(dllimport) int i; class __declspec(dllimport) X { void f(); }; 関連項目 • 4-30 「__declspec(dllexport)」 (ページ 4-27) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.2.3 __declspec(noinline) __declspec(noinline) 属性を使用す る と 、 その関数の呼び出 し 時に、 その関数 を イ ン ラ イ ン展開 し ない よ う にす る こ と がで き ます。 注 __declspec 属性には、 同等関数属性 __attribute__((noinline)) があ り ます。 関連項目 • 「#pragma inline, #pragma no_inline」 (ページ 4-71) • 4.2.4 「__attribute__((noinline))」 (ページ 4-39) __declspec(noreturn) __declspec(noreturn) 属性は、 関数が戻 ら ない こ と を示 し ます。 注 こ の属性には、 同等の関数 __attribute((noreturn)) があ り ます。 ただ し 、 関数 定義を コ ンパ イ ルす る 際に、 関数が明示的ま たは暗黙的な戻 り 値に達 し た場 合、 __attribute((noreturn)) は無視 さ れて警告が生成 さ れ る と い う 点で、 __attribute((noreturn)) と __declspec(noreturn) は異な り ます。 こ れは __declspec(noreturn) には当ては ま り ません。 使用法 こ の属性を使用 し て、 exit() な ど、 戻 ら ない関数を呼び出す コ ス ト を削減 し ます。 noreturn 関数がその呼び出 し 元に戻 る 場合の動作は定義 さ れてい ませ ん。 制約条件 noreturn 関数の呼び出 し 時に、 復帰ア ド レ ス は保持 さ れません。 こ れに よ り 、 デバ ッ ガに よ る コ ール ス タ ッ ク の表示が制限 さ れます。 例 __declspec(noreturn) void overflow(void); // never return on overflow int negate(int x) { ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-31 コ ンパイ ラ固有の機能 if (x == 0x80000000) overflow(); return -x; } 関連項目 • 4.2.5 「__attribute__((noreturn))」 (ページ 4-41) __declspec(nothrow) __declspec(nothrow) 属性は、 関数の呼び出 し に よ っ て C++ 例外が呼び出 し か ら 呼び出 し 元に伝播 さ れない こ と を示 し ます。 ARM ラ イ ブ ラ リ ヘ ッ ダに よ り 、 こ の修飾子は、 ISO C 標準で例外を ス ロ ー し ない こ と が規定 さ れてい る C 関数の宣言に自動的に追加 さ れ ます。 使用法 コ ンパ イ ラ は、 関数に よ っ て例外が ス ロ ー さ れない こ と を認識 し てい る 場合、 その関数の呼び出 し 元用に生成す る 例外処理テーブルのサ イ ズ を縮小で き る こ と があ り ます。 制約条件 関数の呼び出 し に よ っ て C++ 例外が呼び出 し か ら 呼び出 し 元に伝播 さ れ る 場 合、 動作は定義 さ れません。 例外が イ ネーブルにな っ た状態で コ ンパ イ ル し ない と 、 こ の修飾子は無視 さ れ ます。 例 struct S { ~S(); }; __declspec(nothrow) extern void f(void); void g(void) { S s; f(); } 4-32 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 関連項目 • 「--force_new_nothrow, --no_force_new_nothrow」 (ページ 2-65) • 4.2.6 「::operator new 関数の使用」 (ページ 5-15) __declspec(notshared) __declspec(notshared) 属性は特定の ク ラ ス の仮想関数テーブル と RTTI がエ ク ス ポー ト さ れ る の を防止 し ます。 こ れは、 他の適用オプシ ョ ン に関係な く 機 能 し ます。 例えば、--export_all_vtbl を使用 し て も 、 __declspec(notshared) が オーバー ラ イ ド さ れ る こ と はあ り ません。 例 struct __declspec(notshared) X { virtual int f(); }; // do not export this int X::f() { return 1; } struct Y : X { virtual int g(); }; // do export this int Y::g() { return 1; } 4.2.7 __declspec(thread) __declspec(thread) 属性は、 変数が ス レ ッ ド ロ ーカルで、 ス レ ッ ド の保存期間 が設定 さ れてい る こ と を示 し ます。 そのため、 リ ン カに よ っ て、 ス レ ッ ド の 作成時に記憶域が自動的に割 り 当て ら れ る よ う に調整 さ れます。 注 キー ワー ド __thread は、 __declspec(thread) の同義 と し てサポー ト さ れてい ま す。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-33 コ ンパイ ラ固有の機能 制約条件 フ ァ イ ル有効範囲の ス レ ッ ド ロ ーカル変数は、 動的に初期化で き ません。 例 __declspec(thread) int i; __thread int j; // same as __decspec(thread) int j; 4-34 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.3 関数属性 __attribute__ キー ワ ー ド を使用す る と 、 変数ま たは構造体フ ィ ール ド 、 関数、 型な ど の特殊な属性を指定で き ます。 こ のキー ワ ー ド の形式には、 以下のい ずれか を使用 し ます。 __attribute__ ((attribute1, attribute2, ...)) __attribute__ ((__attribute1__, __attribute2__, ...)) 以下に例を示 し ます。 void * Function_Attributes_malloc_0(int b) __attribute__ ((malloc)); static int b __attribute__ ((__unused__)); 表 4-3 では、 使用可能な関数属性を示 し ます。 表 4-3 コ ンパイ ラ でサポー ト さ れる関数属性および同等属性 関数属性 非属性等価 __attribute__((alias)) - __attribute__((always_inline)) __forceinline __attribute__((const)) __pure __attribute__((deprecated)) - __attribute__((malloc)) - __attribute__((noinline)) __declspec(noinline) __attribute__((no_instrument_function)) __attribute__((nomerge)) - __attribute__((nonnull)) ARM DUI 0348BJ ID 1 0 0 4 1 9 __attribute__((noreturn)) __declspec(noreturn)) __attribute__((notailcall)) - __attribute__((pure)) - __attribute__((unused)) - Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-35 コ ンパイ ラ固有の機能 表 4-3 コ ンパイ ラ でサポー ト さ れる関数属性および同等属性 (continued) 関数属性 非属性等価 __attribute__((used)) - __attribute__((visibility("visibility_type"))) __attribute__((weak)) 4.3.1 __weak __attribute__((alias)) こ の関数属性を使用す る と 、 関数の複数エ イ リ ア ス を指定で き ます。 関数が現在の変換単位で定義 さ れ る 場合、 エ イ リ ア ス の呼び出 し はその関数 の呼び出 し に置 き 換え ら れ、 エ イ リ ア ス が元の名前 と 共に生成 さ れ ます。 関 数が現在の変換単位で定義 さ れない場合、 エ イ リ ア ス の呼び出 し は実関数の 呼び出 し に置 き 換え ら れます。 関数が static と し て定義 さ れ る 場合、 関数名 はエ イ リ ア ス名に置 き 換え ら れ、 エ イ リ ア ス名が外部で宣言 さ れた場合、 関 数は外部で宣言 さ れます。 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 注 変数名は、 対応す る 変数属性 __attribute__((alias)) を使用 し てエ イ リ ア ス さ れ る 可能性があ り ます。 構文 return-type newname([argument-list]) __attribute__((alias("oldname"))); 各パ ラ メ ー タ には以下の意味があ り ます。 oldname エ イ リ ア ス さ れ る 関数の名前を指定 し ます。 newname エ イ リ ア ス さ れ る 関数の新 し い名前を指定 し ます。 例 #include <stdio.h> void foo(void) { printf("%s\n", __FUNCTION__); 4-36 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 } void bar(void) __attribute__((alias("foo"))); void gazonk(void) { bar(); // calls foo } 関連項目 • 4.3.2 「__attribute__((alias))」 (ページ 4-53) __attribute__((always_inline)) こ の関数属性は、 関数を イ ン ラ イ ン展開す る 必要があ る こ と を示 し ます。 コ ンパ イ ラ は、 関数の特性に関係な く 、 その関数を イ ン ラ イ ン関数に し よ う と し ます。 ただ し 、 問題が発生す る 場合、 コ ンパ イ ラ は関数を イ ン ラ イ ン関 数に し ません。 例えば、 再帰関数は一度 し か イ ン ラ イ ン展開で き ません。 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 同等のキー ワ ー ド __forceinline があ り ます。 例 static int max(int x, int y) __attribute__((always_inline)) { return x > y ? x : y; // always inline if possible } 関連項目 • 「--forceinline」 (ページ 2-66) • 4.3.3 「__forceinline」 (ページ 4-7) __attribute__((const)) 多 く の関数は渡 さ れた引数のみを確認 し 、 戻 り 値以外には作用 し ません。 関 数に よ る グ ロ ーバル メ モ リ の読み出 し は許可 さ れていないため、 こ れは __attribute__((pure)) よ り も 厳密な ク ラ ス です。 渡 さ れた引数に対 し てのみ演 算を行 う 関数は、 共通部分式の削除 と ループの最適化の対象にな り ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-37 コ ンパイ ラ固有の機能 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 同等のキー ワ ー ド __pure があ り ます。 例 int Function_Attributes_const_0(int b) __attribute__ ((const)); int Function_Attributes_const_2(int b) { int aLocal=0; aLocal += Function_Attributes_const_0(b); aLocal += Function_Attributes_const_0(b); return aLocal; } こ の コ ー ド の Function_Attributes_const_0 は 1 回 し か呼び出 さ れない場合があ り ます。 その場合、 正 し い戻 り 値を得 る ため結果は 2 倍に さ れ ます。 関連項目 • 「__attribute__((pure))」 (ページ 4-42) • 4.3.4 『コ ンパ イ ラ ユーザガ イ ド 』 の 「__pure」 (ページ 5-16) __attribute__((deprecated)) こ の関数属性を使用 し て、 非推奨の関数が使用 さ れた場合に、 警告を生成す る こ と がで き ます。 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 例 int Function_Attributes_deprecated_0(int b) __attribute__ ((deprecated)); 4-38 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.3.5 __attribute__((malloc)) こ の関数属性を使用す る と 、 関数を malloc 関数 と 同 じ よ う に処理 し 、 関連付 け ら れた最適化を実行で き ます。 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 例 void * Function_Attributes_malloc_0(int b) __attribute__ ((malloc)); 4.3.6 __attribute__((noinline)) こ の関数属性を使用す る と 、 その関数の呼び出 し 時に、 その関数を イ ン ラ イ ン展開 し ない よ う にす る こ と がで き ます。 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 __declspec と 同等の __declspec(noinline) があ り ます。 例 int fn(void) __attribute__((noinline)); int fn(void) { return 42; } 関連項目 • 「#pragma inline, #pragma no_inline」 (ページ 4-71) • ARM DUI 0348BJ ID 1 0 0 4 1 9 「__declspec(noinline)」 (ページ 4-31) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-39 コ ンパイ ラ固有の機能 4.3.7 __attribute__((no_instrument_function)) こ の関数属性は、 --gnu_instrument を使用 し て達成 さ れ る 計測の関数を除外 し ます。 関連項目 • 「--gnu_instrument, --no_gnu_instrument」 (ページ 2-76) 4.3.8 __attribute__((nomerge)) こ の関数属性を使用す る と 、 ソ ース内で別々にな っ てい る 関数呼び出 し がオ ブジ ェ ク ト コ ー ド で一つに ま と め ら れ る の を防 ぐ こ と がで き ます。 関連項目 「__attribute__((notailcall))」 (ページ 4-41) • • 4.3.9 「--retain=option」 (ページ 2-126) __attribute__((nonnull)) こ の関数属性は、 NULL ポ イ ン タ であ っ てはな ら ない関数パ ラ メ ー タ を指定 し ます。 こ の関数属性を使用す る と 、 こ の種のパ ラ メ ー タ が検出 さ れた と き に コ ンパ イ ラ が警告を生成で き る よ う にな り ます。 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 構文 __attribute__((nonnull(arg-index, ...))) arg-index, ... は引数 イ ンデ ッ ク ス の リ ス ト を示 し ます。 引数 イ ンデ ッ ク ス の リ ス ト を指定 し ない場合は、 すべてのポ イ ン タ 引数が 「nonnull」 と し てマー ク さ れます。 4-40 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 例 以下の宣言は同 じ 意味にな り ます。 void * my_memcpy (void *dest, const void *src, size_t len) __attribute__((nonnull (1, 2))); void * my_memcpy (void *dest, const void *src, size_t len) __attribute__((nonnull)); 4.3.10 __attribute__((noreturn)) こ の関数属性を使用す る と 、 その関数が値を返 さ ない こ と を コ ンパ イ ラ に通 知で き ます。 こ の通知に よ り 、 コ ンパ イ ラ は実行 さ れない コ ー ド を削除す る こ と に よ っ て コ ー ド を最適化で き ます。 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 __declspec と 同等の __declspec(noreturn) があ り ます。 ただ し 、 関数定義を コ ンパ イ ルす る 際に、 関数が明示的ま たは暗黙的な戻 り 値に達 し た場合、 __attribute((noreturn)) は無視 さ れて警告が生成 さ れ る と い う 点で、 __attribute((noreturn)) と __declspec(noreturn) は異な り ます。 こ れは __declspec(noreturn) には当ては ま り ません。 例 int Function_Attributes_NoReturn_0(void) __attribute__ ((noreturn)); 関連項目 • 4.3.11 「__declspec(noreturn)」 (ページ 4-31) __attribute__((notailcall)) こ の関数属性を使用す る と 、 関数の末尾呼び出 し を防 ぐ こ と がで き ます。 つ ま り 、 (関数の呼び出 し がその関数の末尾で行われたために) 関数が分岐に よ っ て転送 さ れた場合で も 、 関数は必ず リ ン ク 付 き 分岐に よ っ て呼び出 さ れ ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-41 コ ンパイ ラ固有の機能 関連項目 • 「__attribute__((nomerge))」 (ページ 4-40) • 4.3.12 「--retain=option」 (ページ 2-126) __attribute__((pure)) 多 く の関数は、 値を返す以外に効果がな く 、 その戻 り 値はパ ラ メ ー タ と グ ロ ーバル変数にのみ依存 し ます。 こ の よ う な関数は、 デー タ フ ロ ー分析の対 象 と な り 、 削除 さ れ る 場合があ り ます。 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 こ の関数属性は、 __pure キー ワー ド と 関連 し てい ますが、 同等ではあ り ませ ん。 __pure と 同等の関数属性は、 __attribute__((const)) です。 例 int Function_Attributes_pure_0(int b) __attribute__ ((pure)); int Function_Attributes_pure_0(int b) { static int aStatic; aStatic++; return b++; } int Function_Attributes_pure_2(int b) { int aLocal=0; aLocal += Function_Attributes_pure_0(b); return 0; } こ の場合、 Function_Attributes_pure_0 の結果は使用 さ れないため、 こ の関数の 呼び出 し は削除す る こ と がで き ます。 4-42 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.3.13 __attribute__((section("name"))) section 関数属性を使用す る と 、 イ メ ージの異な る セ ク シ ョ ンに コ ー ド を配置 で き ます。 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 例 以下の例では、 Function_Attributes_section_0 は、 .text ではな く 、 RO セ ク シ ョ ン new_section に置かれます。 void Function_Attributes_section_0 (void) __attribute__ ((section ("new_section"))); void Function_Attributes_section_0 (void) { static int aStatic =0; aStatic++; } 以下の例では、 section 関数属性は、 #pragma arm section 設定を オーバー ラ イ ド し ます。 #pragma arm section code="foo" int f2() { return 1; } // into the 'foo' area __attribute__ ((section ("bar"))) int f3() { return 1; } // into the 'bar' area int f4() { return 1; } // into the 'foo' area #pragma arm section 関連項目 • ARM DUI 0348BJ ID 1 0 0 4 1 9 「#pragma arm section [section_sort_list]」 (ページ 4-63) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-43 コ ンパイ ラ固有の機能 4.3.14 __attribute__((unused)) unused 関数属性を使用す る と 、 その関数が参照 さ れない場合に警告が生成 さ れない よ う にす る こ と がで き ます。 こ の関数属性を使用 し て も 、 未使用の関 数を削除す る 処理の動作が変更 さ れ る こ と はあ り ません。 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 例 static int Function_Attributes_unused_0(int b) __attribute__ ((unused)); 4.3.15 __attribute__((used)) こ の関数属性を使用す る と 、 その ス タ テ ィ ッ ク 関数は参照 さ れていな く て も 、 オブジ ェ ク ト フ ァ イ ル内に保持 さ れ る こ と を コ ンパ イ ラ に通知で き ます。 使用済み と マー ク さ れた ス タ テ ィ ッ ク 関数は、 宣言 さ れた順番で単一セ ク シ ョ ン に生成 さ れ ます。 __attribute__((section)) を使用 し て、 配置 さ れ る セ ク シ ョ ン関数を指定で き ます。 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 注 __attribute__((used)) を使用 し て、 ス タ テ ィ ッ ク 変数を使用済み と マー ク す る こ と も で き ます。 例 static int lose_this(int); static int keep_this(int) __attribute__((used)); // retained in object file static int keep_this_too(int) __attribute__((used)); // retained in object file 関連項目 • 「__attribute__((section("name")))」 (ページ 4-43) • 4-44 「__attribute__((used))」 (ページ 4-59) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.3.16 __attribute__((visibility("visibility_type"))) こ の関数属性は ELF シ ン ボルの可視性に影響 し ます。 注 こ の属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の拡張 機能です。 構文 __attribute__((visibility("visibility_type"))) visibility_type は、 次のいずれかです。 default 想定 さ れ る シ ン ボルの可視性は他のオプシ ョ ン で変更で き ます。 デフ ォ ル ト の可視性はその よ う な変更を オーバー ラ イ ド し ます。 デフ ォ ル ト の可視性は外部 リ ン ケージに相当 し ます。 hidden シ ン ボルはダ イ ナ ミ ッ ク シ ン ボルテーブルに配置 さ れないため、 他の実行可能フ ァ イ ルや共有 ラ イ ブ ラ リ が直接それを参照す る こ と はで き ません。 関数ポ イ ン タ を使用 し た間接的な参照は可能 です。 internal プ ロ セ ッ サ固有のアプ リ ケーシ ョ ンバ イ ナ リ イ ン タ フ ェース (psABI) に よ る 別の指定がない限 り 、 内部可視性は関数が別の モジ ュ ールか ら 呼び出 さ れない こ と を意味 し ます。 protected シ ン ボルはダ イ ナ ミ ッ ク シ ン ボルテーブルに配置 さ れますが、 定義モジ ュ ール内の参照は ロ ーカルシ ン ボルにバ イ ン ド し ます。 つま り 、 シ ン ボルを別のモジ ュ ールでオーバー ラ イ ド す る こ と はで き ません。 使用法 default の可視性を指定す る 場合を除いて、 こ の属性は、 こ れがなければ外部 リ ン ケージのあ る 宣言で使用す る よ う に設計 さ れてい ます。 こ の属性は C と C++ で使用で き ます。 C++ では、 型、 メ ンバ関数、 お よ び ネーム スペース の宣言に も 適用で き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-45 コ ンパイ ラ固有の機能 例 void __attribute__((visibility( “internal” ))) foo() { ... } 関連項目 • 「--arm_linux」 (ページ 2-10) • 「__attribute__((visibility("visibility_type")))」 (ペー ジ 4-60) 4.3.17 __attribute__((weak)) __attribute__((weak)) で定義 さ れた関数は、 そのシ ン ボルを weak でエ ク ス ポー ト し ます。 __attribute__((weak)) で宣言 し た後に __attribute__((weak)) を使用せずに定義 し た関数は、 weak 関数 と し て動作 し ます。 こ れは、 __weak キー ワ ー ド の動作 と は異な り ます。 注 こ の関数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 例 extern int Function_Attributes_weak_0 (int b) __attribute__ ((weak)); 関連項目 • 4-46 「__weak」 (ページ 4-23) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.4 型属性 __attribute__ キー ワ ー ド を使用す る と 、 変数ま たは構造体フ ィ ール ド 、 関数、 型な ど の特殊な属性を指定で き ます。 こ のキー ワ ー ド の形式には、 以下のい ずれか を使用 し ます。 __attribute__ ((attribute1, attribute2, ...)) __attribute__ ((__attribute1__, __attribute2__, ...)) 以下に例を示 し ます。 void * Function_Attributes_malloc_0(int b) __attribute__ ((malloc)); static int b __attribute__ ((__unused__)); 表 4-4 には、 使用可能な型属性の要約を示 し ます。 表 4-4 コ ンパイ ラ によ っ てサポー ト さ れてい る型属性および同等属性 型属性 非属性等価 __attribute__((bitband)) - __attribute__((aligned)) __align __attribute__((packed)) __packeda __attribute__((transparent_union)) - a. __packed 修飾子は、 GNU モー ド の型には影響 し ません。 4.4.1 __attribute__((bitband)) __attribute__((bitband)) は、 メ モ リ アーキ テ ク チ ャ の SRAM 領域 と ペ リ フ ェ ラ ル領域にあ る シ ン グルビ ッ ト 値へのア ト ミ ッ ク ア ク セ ス を効率化で き る 型 属性です。 特定の メ モ リ 領域では、 従来の読み取 り 、 変更、 書 き 込み方式で はな く 、 1 回の メ モ リ ア ク セ ス で直接シ ン グルビ ッ ト を設定 し た り ク リ ア し た り で き ます。 ま た、 従来の読み取 り の後でシ フ ト お よ びマ ス ク 操作を使用 し な く て も 、 直接シ ン グルビ ッ ト を読み取 る こ と も で き ます。 例 4-6 に、 __attribute__((bitband)) の使用法を示 し ます。 例 4-6 __attribute__((bitband)) の使用 typedef int int int ARM DUI 0348BJ ID 1 0 0 4 1 9 struct { i: 1; j: 2; k: 3; Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-47 コ ンパイ ラ固有の機能 } BB __attribute__((bitband)); BB bb __attribute__((at(0x20000004))); void foo(void) { bb.i = 1; } 幅に依存す る ペ リ フ ェ ラ ルの場合、 ビ ッ ト バン ド 構造体の ビ ッ ト フ ィ ール ド の char 型、 short 型、 お よ び int 型には、 エ イ リ ア ス空間に対す る バ イ ト 、 ハーフ ワー ド 、 お よ び ワー ド の ス ト ア ま たは ロ ー ド がそれぞれ生成 さ れます。 例 4-7 では、 ビ ッ ト バン ド ア ク セ ス が bb.i に生成 さ れ ます。 例 4-7 ビ ッ ト フ ィ ール ド ビ ッ ト バン ド ア ク セス typedef struct { char i: 1; int j: 2; int k: 3; } BB __attribute__((bitband)); BB bb __attribute__((at(0x20000004))); void foo() { bb.i = 1; } __attribute__((at())) を使用 し て ビ ッ ト バンバン ド 変数を ビ ッ ト バン ド 領域に 配置 し ない場合は、 別の方法で再配置す る 必要があ り ます。 再配置す る には、 適切な ス キ ャ ッ タ ロ ー ド 記述フ ァ イ ルを使用す る か、 --rw_base リ ン カ コ マ ン ド ラ イ ン オプシ ョ ン を使用 し ます。 詳細については、 『 リ ン カ リ フ ァ レ ン ス ガ イ ド 』 を参照 し て下 さ い。 4-48 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 制限 次の使用制限があ り ます。 • こ の型属性は struct でのみ使用で き ます。 共用体型、 ま たは共用体を メ ンバ と し て持つその他の集合型はビ ッ ト バン ド 化で き ません。 • 構造体の メ ンバは個別に ビ ッ ト バン ド 化で き ません。 • ビ ッ ト バン ド ア ク セ ス は、 シ ン グルビ ッ ト のビ ッ ト フ ィ ール ド にのみ生 成 さ れ ます。 • ビ ッ ト バン ド ア ク セ ス は、 const オブジ ェ ク ト 、 ポ イ ン タ 、 お よ び ロ ー カルオブジ ェ ク ト には生成 さ れ ません。 関連項目 「__attribute__((at(address)))」 (ページ 4-54) • • • 4.4.2 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「ビ ッ ト バンデ ィ ン グ」 (ページ 4-17) 使用 し てい る プ ロ セ ッ サの 『テ ク ニ カル リ フ ァ レ ン ス マニ ュ アル』 __attribute__((aligned)) aligned 型属性を使用す る と 、 その型の最小境界整列を指定で き ます。 注 こ の型属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の拡 張機能です。 4.4.3 __attribute((packed)) packed 型属性を使用す る と 、 その型に可能な最小境界整列を使用す る よ う に 指定で き ます。 注 こ の型属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の拡 張機能です。 エラー こ の属性を typedef で使用す る と 、 ARM コ ンパ イ ラ は以下の よ う な警告 メ ッ セージ を生成 し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-49 コ ンパイ ラ固有の機能 関連項目 • 「__packed」 (ページ 4-12) • 「#pragma pack(n)」 (ページ 4-73) • 「パ ッ ク 構造体」 (ページ 5-11) • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「__packed 修飾子 と 非境界整列型のデー タ ア ク セ ス」 (ページ 5-31) • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「パ ッ ク 構造体 と 個別パ ッ ク フ ィ ール ド 」 (ページ 5-33) 4.4.4 __attribute__((transparent_union)) transparent_union 型属性を使用す る と 、 transparent_union 型 を指定で き ます。 つま り __attribute__((transparent_union))__ で修飾 さ れた共用体デー タ 型です。 透過ユニオ ン型を持つパ ラ メ ー タ を使用 し て関数が定義 さ れ る と 、 共用体の 型の引数を使用 し た関数の呼び出 し は、 渡 さ れた引数の型を持つ メ ンバーお よ び渡 さ れた引数値に設定 さ れた値を持つ共用体オブジ ェ ク ト を初期化す る 結果にな り ます。 共用体デー タ 型が __attribute__((transparent_union)) で修飾 さ れ る と 、 透過ユ ニオ ンはその型のすべての関数パ ラ メ ー タ に適用 さ れ ます。 注 こ の型属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の拡 張機能です。 注 個別関数パ ラ メ ー タ は、 対応す る __attribute__((transparent_union)) 変数属性 に よ っ て修飾 さ れ る 可能性 も あ り ます。 4-50 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 例 typedef union { int i; float f; } U __attribute__((transparent_union)); void foo(U u) { static int s; s += u.i; /* Use the 'int' field */ }void caller(void) { foo(1); /* u.i is set to 1 */ foo(1.0f); /* u.f is set to 1.0f */ } モー ド GNU モー ド でのみサポー ト さ れてい ます。 関連項目 • ARM DUI 0348BJ ID 1 0 0 4 1 9 「__attribute__((transparent_union))」 (ページ 4-57) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-51 コ ンパイ ラ固有の機能 4.5 変数属性 __attribute__ キーワ ー ド を使用す る と 、 変数ま たは構造体フ ィ ール ド 、 関数、 型な ど の特殊な属性を指定で き ます。 こ のキーワ ー ド の形式には、 以下のい ずれか を使用 し ます。 __attribute__ ((attribute1, attribute2, ...)) __attribute__ ((__attribute1__, __attribute2__, ...)) 以下に例を示 し ます。 void * Function_Attributes_malloc_0(int b) __attribute__ ((malloc)); static int b __attribute__ ((__unused__)); 表 4-3 (ページ 4-35) は、 使用可能な変数属性の要約を示 し ます。 表 4-5 コ ンパイ ラ によ っ てサポー ト さ れている変数属性および同等変数 変数属性 非属性等価 __attribute__((alias)) - __attribute__((at(address))) - __attribute__((aligned)) - __attribute__((deprecated)) - __attribute__((packed)) - __attribute__((section(“name”))) - __attribute__((transparent_union)) - __attribute__((unused)) - __attribute__((used)) - __attribute__((weak)) __weak __attribute__((visibility("visibility_type"))) __attribute__((zeroinit)) 4-52 - Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.5.1 __attribute__((alias)) こ の変数属性を使用す る と 、 変数の複数エ イ リ ア ス を指定で き ます。 変数が現在の変換単位で定義 さ れ る 場合、 エ イ リ ア ス の参照はその変数の参 照に置 き 換え ら れ、 エ イ リ ア ス が元の名前 と 共に生成 さ れ ます。 変数が現在 の変換単位で定義 さ れない場合、 エ イ リ ア ス の参照は実変数の参照に置 き 換 え ら れ ます。 変数が static と し て定義 さ れ る 場合、 変数名はエ イ リ ア ス名に 置 き 換え ら れ、 エ イ リ ア ス名が外部で宣言 さ れた場合、 変数は外部で宣言 さ れ ます。 注 関数名は、 対応す る 関数属性 __attribute__((alias)) を使用 し てエ イ リ ア ス さ れ る 可能性があ り ます。 構文 type newname __attribute__((alias("oldname"))); 各パ ラ メ ー タ には以下の意味があ り ます。 エ イ リ ア ス さ れ る 変数の名前を指定 し ます。 newname エ イ リ ア ス さ れ る 変数の新 し い名前を指定 し ます。 oldname 例 #include <stdio.h> int oldname = 1; extern int newname __attribute__((alias("oldname"))); // declaration void foo(void) { printf("newname = %d\n", newname); // prints 1 } 関連項目 • ARM DUI 0348BJ ID 1 0 0 4 1 9 「__attribute__((alias))」 (ページ 4-36) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-53 コ ンパイ ラ固有の機能 4.5.2 __attribute__((at(address))) こ の変数属性を使用す る と 、 変数の絶対ア ド レ ス を指定で き ます。 変数はそのセ ク シ ョ ン に置かれ、 変数を含んでい る セ ク シ ョ ンは、 コ ンパ イ ラ に よ っ て適切な型が与え ら れ ます。 • 読み出 し 専用変数は、 RO 型のセ ク シ ョ ン に置かれ ます。 • 初期化 さ れた読み出 し - 書 き 込み変数は、 RW 型のセ ク シ ョ ンに置かれ ます。 特に、 明示的にゼ ロ に初期化 さ れた変数は、 ZI ではな く RW に置かれ ま す。 こ の よ う な変数は、 コ ンパ イ ラ の ZI か ら RW 最適化の対象にはな り ません。 • 初期化 さ れない変数は、 ZI 型のセ ク シ ョ ンに置かれ ます。 注 こ の変数属性は、 GNU コ ンパ イ ラ に よ っ てサポー ト さ れ ません。 構文 __attribute__((at(address))) 各パ ラ メ ー タ には以下の意味があ り ます。 address 必要な変数ア ド レ ス を指定 し ます。 制約条件 リ ン カは、 at 変数属性に よ っ て生成 さ れたセ ク シ ョ ン を常に配置で き る わけ ではあ り ません。 エラー 指定 さ れた ア ド レ ス にセ ッ シ ョ ン を配置す る こ と がで き ない場合、 リ ン カは エ ラ ー メ ッ セージ を発行 し ます。 例 const int x1 __attribute__((at(0x10000))) = 10; /* RO */ int x2 __attribute__((at(0x12000))) = 10; /* RW */ int x3 __attribute__((at(0x14000))) = 0; /* RW, not ZI */ int x4 __attribute__((at(0x16000))); /* ZI */ 4-54 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 関連項目 • 4.5.3 『 リ ン カユーザガ イ ド 』 の 「__at セ ク シ ョ ン を使用 し て特定のア ド レ ス にセ ク シ ョ ン を配置する 」 (ページ 5-16) __attribute__((aligned)) aligned 変数属性を使用す る と 、 変数や構造体フ ィ ール ド の最小境界整列をバ イ ト 単位で指定で き ます。 注 こ の変数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 例 int Variable_Attributes_aligned_0 __attribute__ ((aligned (16))); /* aligned on 16 byte boundary */ short Variable_Attributes_aligned_1[3] __attribute__ ((aligned)); /* aligns on 4 byte boundary for ARM */ 関連項目 • 4.5.4 「__align」 (ページ 4-2) __attribute__((deprecated)) deprecated 変数属性を使用す る と 、 警告やエ ラ ーが生成 さ れ る こ と な く 、 非推 奨の変数を宣言で き ます。 deprecated 変数へのア ク セ ス に対 し ては警告が生成 さ れ ますが、 コ ンパ イ ルは実行 さ れます。 こ の警告では、 その変数が使用 さ れてい る 場所 と 定義 さ れてい る 場所を通知 し ます。 こ の情報は、 特定の変数 が非推奨の原因を判断す る のに役立ち ます。 注 こ の変数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-55 コ ンパイ ラ固有の機能 例 extern int Variable_Attributes_deprecated_0 __attribute__ ((deprecated)); extern int Variable_Attributes_deprecated_1 __attribute__ ((deprecated)); void Variable_Attributes_deprecated_2() { Variable_Attributes_deprecated_0=1; Variable_Attributes_deprecated_1=2; } こ の例を コ ンパ イ ルす る と 、 2 つの警告 メ ッ セージが生成 さ れます。 4.5.5 __attribute__((packed)) packed 変数属性を使用す る と 、 その変数や構造体フ ィ ール ド に可能な最小境 界整列を使用す る よ う に指定で き ます。 つま り 、 よ り 大 き い値を aligned 属性 で指定 し ない限 り 、 変数には 1 バ イ ト 、 フ ィ ール ド には 1 ビ ッ ト が使用 さ れ ます。 注 こ の変数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 例 struct { char a; int b __attribute__ ((packed)); } Variable_Attributes_packed_0; 関連項目 • 「#pragma pack(n)」 (ページ 4-73) • 「パ ッ ク 構造体」 (ページ 5-11) • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「__packed 修飾子 と 非境界整列型のデー タ ア ク セ ス」 (ページ 5-31) • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「パ ッ ク 構造体 と 個別パ ッ ク フ ィ ール ド 」 (ページ 5-33) 4-56 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.5.6 __attribute__((section("name"))) 通常 ARM コ ンパ イ ラ では、 生成 し たオブジ ェ ク ト を data や bss な ど のセ ク シ ョ ン に配置 し ます。 し か し 、 追加のデー タ セ ク シ ョ ン が必要にな っ た り 、 変数を特別なセ ク シ ョ ンに配置 し た り す る 場合 (特別なハー ド ウ ェ アへの マ ッ プ を行 う 場合な ど) があ り ます。 section 属性を使用す る と 、 変数を特定 のデー タ セ ク シ ョ ン に配置す る よ う に指定で き ます。 section 属性を使用す る と 、 zero_init 属性を使用 し ない限 り 、 読み出 し 専用変数は RO デー タ セ ク シ ョ ン に配置 さ れ、 読み出 し - 書 き 込み変数は RW デー タ セ ク シ ョ ン に配置 さ れ ます。 こ の場合、 変数は ZI セ ク シ ョ ン に配置 さ れ ます。 注 こ の変数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 例 /* in RO section */ const int descriptor[3] __attribute__ ((section ("descr"))) = { 1,2,3 }; /* in RW section */ long long rw[10] __attribute__ ((section ("RW"))); /* in ZI section * long long altstack[10] __attribute__ ((section ("STACK"), zero_init));/ 4.5.7 __attribute__((transparent_union)) 共用体であ る 関数パ ラ メ ー タ に transparent_union 変数属性を ア タ ッ チす る と 、 対応す る 引数に任意の共用体 メ ンバの型を使用で き ます。 ただ し 、 その引数 は最初の共用体 メ ンバ と 同 じ 型の引数 と し て渡 さ れ ます。 注 C の仕様では、 あ る 型 と し て共用体が書 き 込まれ、 別の型でその共用体が読 み出 さ れた と き に返 さ れ る 値は定義 さ れてい ません。 こ のため、 transparent_union が ど の型 と し て書 き 込まれ る か を特定す る 方法 も 、 引数 と し て渡す必要があ り ます。 注 こ の変数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-57 コ ンパイ ラ固有の機能 注 ま た、 こ の属性を共用体デー タ 型の typedef で使用す る こ と も で き ます。 その 場合、 こ の属性は同 じ 型を持つすべての関数パ ラ メ ー タ に適用 さ れ ます。 モー ド GNU モー ド でのみサポー ト さ れてい ます。 例 typedef union { int myint; float myfloat; } transparent_union_t; void Variable_Attributes_transparent_union_0(transparent_union_t aUnion __attribute__ ((transparent_union))) { static int aStatic; aStatic +=aUnion.myint; } void Variable_Attributes_transparent_union_1() { int aLocal =0; float bLocal =0; Variable_Attributes_transparent_union_0(aLocal); Variable_Attributes_transparent_union_0(bLocal); } 関連項目 • 4.5.8 「__attribute__((transparent_union))」 (ページ 4-50) __attribute__((unused)) 通常、 宣言 さ れてい る 変数が一度 も 参照 さ れない場合は、 警告が生成 さ れま す。 こ の属性を使用す る と 、 特定の変数が使用 さ れない こ と が予想済みであ る こ と を コ ンパ イ ラ に通知 し 、 その変数が使用 さ れな く て も 警告を生成 し な い よ う に指定で き ます。 注 こ の変数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 4-58 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 例 void Variable_Attributes_unused_0() { static int aStatic =0; int aUnused __attribute__ ((unused)); int bUnused; aStatic++; } 上記の例では、 宣言 さ れてい る bUnused が一度 も 参照 さ れない こ と を示す以下 の よ う な警告を生成 し ますが、 aUnused に対 し ては警告を生成 し ません。 注 GNU コ ンパ イ ラ は、 警告を生成 し ません。 4.5.9 __attribute__((used)) こ の変数属性を使用す る と 、 その ス タ テ ィ ッ ク 変数は参照 さ れていな く て も 、 オブジ ェ ク ト フ ァ イ ル内に保持 さ れ る こ と を コ ンパ イ ラ に通知で き ます。 使用済み と マー ク さ れた ス タ テ ィ ッ ク 変数は、 宣言 さ れた順番で単一セ ク シ ョ ン に生成 さ れます。 __attribute__((section)) を使用 し て、 変数が配置 さ れ る セ ク シ ョ ン を指定で き ます。 注 こ の変数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 注 __attribute__((used)) を使用 し て、 ス タ テ ィ ッ ク 関数を使用済み と マー ク す る こ と も で き ます。 使用法 __attribute__((used)) を使用 し て、 オブジ ェ ク ト 内にテーブルを ビル ド で き ま す。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-59 コ ンパイ ラ固有の機能 例 static int lose_this = 1; static int keep_this __attribute__((used)) = 2; // retained in object file static int keep_this_too __attribute__((used)) = 3; // retained in object file 関連項目 • 「__attribute__((section("name")))」 (ページ 4-57) • 4.5.10 「__attribute__((used))」 (ページ 4-44) __attribute__((visibility("visibility_type"))) こ の変数属性は ELF シ ン ボルの可視性に影響 し ます。 注 こ の属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の拡張 機能です。 visibility_type に使用可能な値は、 同 じ 名前の関数属性に指定 さ れてい る 値 と 同 じ です。 例 int i __attribute__((visibility( “hidden” ))); 関連項目 • 「--arm_linux」 (ページ 2-10) • 「__attribute__((visibility("visibility_type")))」 (ペー ジ 4-45) 4.5.11 __attribute__((weak)) weak 変数を宣言で き ます。 こ の宣言は、 __weak と 似た方法で作用 し ます。 • GNU モー ド の例を以下に示 し ます。 extern int Variable_Attributes_weak_1 __attribute__((weak)); • 非 GNU モー ド の例を以下に示 し ます。 __weak int Variable_Attributes_weak_compare; 4-60 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 注 GNU モー ド では、 extern 修飾子を指定す る 必要があ り ます。 非 GNU モー ド で は、 変数が extern でない場合、 コ ンパ イ ラ はその変数を他の非 weak 変数 と 同 じ よ う に扱い ます。 注 こ の変数属性は、 ARM コ ンパ イ ラ でサポー ト さ れてい る GNU コ ンパ イ ラ の 拡張機能です。 関連項目 • 4.5.12 「__weak」 (ページ 4-23) __attribute__((zero_init)) section 属性を使用す る と 、 変数を特定のデー タ セ ク シ ョ ン に配置す る よ う に 指定で き ます。 zero_init 属性は、 イ ニシ ャ ラ イ ザが指定 さ れていない変数を ZI デー タ セ ク シ ョ ン に配置す る よ う 指定 し ます。 イ ニシ ャ ラ イ ザが指定 さ れ てい る 場合は、 エ ラ ーが生成 さ れ ます。 例 __attribute__((zero_init)) int x; __attribute__((section("mybss"), zero_init)) int y; /* in section ".bss" */ /* in section "mybss" */ 関連項目 • ARM DUI 0348BJ ID 1 0 0 4 1 9 「__attribute__((section("name")))」 (ページ 4-57) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-61 コ ンパイ ラ固有の機能 4.6 プ ラ グマ ARM コ ンパ イ ラ は、 ARM 固有のプ ラ グマの数を認識 し ます。 表 4-6 に、 使 用可能なプ ラ グマ を示 し ます。 注 プ ラ グマに よ っ て、 関連す る コ マ ン ド ラ イ ン オプシ ョ ンはオーバー ラ イ ド さ れ ます。 例えば、 #pragma arm を指定す る と 、--thumb コ マ ン ド ラ イ ン オプシ ョ ン がオーバー ラ イ ド さ れ ます。 表 4-6 コ ンパイ ラ でサポー ト さ れる プ ラ グマ プ ラ グマ #pragma anon_unions, #pragma hdrstop #pragma Otime #pragma arm #pragma import symbol_name #pragma pack(n) #pragma arm section [section_sort_list] #pragma import(__use_full_stdio) #pragma pop #pragma diag_default tag[,tag,...] #pragma inline, #pragma push #pragma diag_error tag[,tag,...] #pragma no_pch #pragma diag_remark tag[,tag,...] #pragma Onum #pragma unroll [(n)] #pragma diag_suppress tag[,tag,...] #pragma once #pragma unroll_completely #pragma diag_warning tag[,tag,...] #pragma hdrstop #pragma thumb #pragma [no_]exceptions_unwind #pragma Ospace #pragma no_anon_unions 4.6.1 #pragma no_inline #pragma softfp_linkage, no_softfp_linkage #pragma anon_unions, #pragma no_anon_unions こ れ ら のプ ラ グマ を使用す る と 、 匿名の構造体 と 共用体のサポー ト を有効ま たは無効にで き ます。 4-62 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 デ フ ォル ト デフ ォ ル ト は #pragma no_anon_unions です。 関連項目 「匿名 ク ラ ス、 匿名構造体、 匿名共用体」 (ページ 3-21) • • 4.6.2 「__attribute__((transparent_union))」 (ページ 4-50) #pragma arm こ のプ ラ グマ を使用す る と 、 ARM 命令セ ッ ト の コ ー ド 生成に切 り 替わ り ま す。 こ れに よ り 、--thumb コ ンパ イ ラ オプシ ョ ンはオーバー ラ イ ド さ れ ます。 関連項目 「--arm」 (ページ 2-9) • • • 4.6.3 「--thumb」 (ページ 2-136) 「#pragma thumb」 (ページ 4-79) #pragma arm section [section_sort_list] こ のプ ラ グマ を使用す る と 、 セ ク シ ョ ン名が以後の関数ま たはオブジ ェ ク ト に使用 さ れ る よ う に指定 さ れ ます。 こ れには、 初期化を行 う ために コ ンパ イ ラ が作成す る 匿名オブジ ェ ク ト の定義が含まれ ます。 注 関数ま たは変数の __attribute__((section(..))) を、#pragma arm section の代わ り に使用で き ます。 構文 #pragma arm section [section_sort_list] 各パ ラ メ ー タ には以下の意味があ り ます。 section_sort_list セ ク シ ョ ン名のオプシ ョ ンの リ ス ト が後続の関数ま たはオ ブジ ェ ク ト に使用 さ れ る よ う に指定 さ れ ます。 section_sort_list の構文は以下の と お り です。 section_type[[=]"name"] [,section_type="name"]* ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-63 コ ンパイ ラ固有の機能 有効なセ ク シ ョ ンの型は以下の と お り です。 • code • rodata • rwdata • zidata 使用法 ARM リ ン カに ス キ ャ ッ タ ロ ー ド 記述フ ァ イ ルを使用 し て、 命名 さ れたセ ク シ ョ ン を メ モ リ 内の特定のア ド レ ス に配置す る 方法を制御で き ます。 制約条件 こ のオプシ ョ ンは、 以下に対 し ては作用 し ません。 • イ ン ラ イ ン関数お よ び こ の関数の ロ ーカル ス タ テ ィ ッ ク 変数 • テ ン プ レー ト の イ ン ス タ ン スお よ び こ の イ ン ス タ ン ス の ロ ーカル ス タ テ ィ ッ ク 変数 • 未使用の変数 と 関数の削除。 使用 さ れ る 関数や変数 と 同 じ セ ク シ ョ ンに 存在す る 関数や変数は未使用であ っ て も 保持 さ れ ますが、 #pragma arm section を使用す る と 、 リ ン カは、 こ の よ う な関数や変数を削除で き る こ と があ り ます。 • 定義がオブジ ェ ク ト フ ァ イ ルに書 き 込まれ る 順序 例 int x1 = 5; // in .data (default) int y1[100]; // in .bss (default) int const z1[3] = {1,2,3}; // in .constdata (default) #pragma arm section rwdata = "foo", rodata = "bar" int x2 = 5; // in foo (data part of region) int y2[100]; // in .bss int const z2[3] = {1,2,3}; // in bar char *s2 = "abc"; // s2 in foo, "abc" in .conststring #pragma arm section rodata int x3 = 5; // in foo int y3[100]; // in .bss int const z3[3] = {1,2,3}; // in .constdata char *s3 = "abc"; // s3 in foo, "abc" in .conststring #pragma arm section code = "foo" int add1(int x) // in foo (code part of region) { 4-64 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 return x+1; } #pragma arm section code 関連項目 • 「__attribute__((section("name")))」 (ページ 4-43) • 4.6.4 『 リ ン カユーザガ イ ド 』 の第 5 章 ス キ ャ ッ タ ロ ー ド 記述フ ァ イ ルの使用 #pragma diag_default tag[,tag,...] こ のプ ラ グマ を使用す る と 、 指定 さ れた タ グ付 き の診断 メ ッ セージの重大度 が、 プ ラ グマの発行前に設定 さ れていた重大度に戻 り ます。 構文 #pragma diag_default tag[,tag,...] 各パ ラ メ ー タ には以下の意味があ り ます。 tag[,tag,...] 重大度を変更す る メ ッ セージ を指定す る 診断 メ ッ セージの 番号を コ ン マで区切っ た リ ス ト です。 少な く と も 1 つの診断 メ ッ セージ を指定す る 必要があ り ま す。 例 // <stdio.h> not #included deliberately #pragma diag_error 223 void hello(void) { printf("Hello "); } #pragma diag_default 223 void world(void) { printf("world!\n"); } --diag_warning=223 オプシ ョ ン を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 診 断 メ ッ セージが生成 さ れ、 printf() 関数が暗示的に宣言 さ れた こ と を レ ポー ト し ます。 #pragma diag_default 223 は、--diag_warning コ マ ン ド ラ イ ン オプシ ョ ン で指定 さ れた と お り 、 診断 メ ッ セージ 223 重大度を警告の重大度に戻 し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-65 コ ンパイ ラ固有の機能 関連項目 • 「--diag_warning=tag[,tag,...]」 (ページ 2-54) • • • • • 「#pragma diag_error tag[,tag,...]」 「#pragma diag_remark tag[,tag,...]」 (ページ 4-67) 「#pragma diag_suppress tag[,tag,...]」 (ページ 4-68) 「#pragma diag_warning tag[, tag, ...]」 (ページ 4-68) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「診断 メ ッ セージの出力の制御」 (ペー ジ 6-5) 4.6.5 #pragma diag_error tag[,tag,...] こ のプ ラ グマは、 指定 さ れた タ グ を持つ診断 メ ッ セージ を エ ラ ーの重大度に 設定 し ます。 構文 #pragma diag_error tag[,tag,...] 各パ ラ メ ー タ には以下の意味があ り ます。 tag[,tag,...] 重大度を変更す る メ ッ セージ を指定す る 診断 メ ッ セージの 番号を コ ン マで区切っ た リ ス ト です。 少な く と も 1 つの診断 メ ッ セージ を指定す る 必要があ り ま す。 関連項目 • 「--diag_error=tag[,tag,...]」 (ページ 2-50) • • • • • 「#pragma diag_default tag[,tag,...]」 (ページ 4-65) 「#pragma diag_remark tag[,tag,...]」 (ページ 4-67) 「#pragma diag_suppress tag[,tag,...]」 (ページ 4-68) 「#pragma diag_warning tag[, tag, ...]」 (ページ 4-68) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「診断 メ ッ セージの重大度の変更」 (ページ 6-6) 4-66 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.6.6 #pragma diag_remark tag[,tag,...] こ のプ ラ グマは、 指定 さ れた タ グ を持つ診断 メ ッ セージ を注釈の重大度に設 定 し ます。 コ ンパ イ ラ が指定 さ れた タ ブ を持つ診断 メ ッ セージ を エ ラ ーの重大度ではな く 、注釈の重大度に設定す る 点を除いて、#pragma diag_remark の動作は #pragma diag_errors に似てい ます。 注 デフ ォ ル ト では、 注釈は表示 さ れ ません。 注釈 メ ッ セージ を表示す る に は、--remarks コ ンパ イ ラ オプシ ョ ン を使用 し て下 さ い。 構文 #pragma diag_remark tag[,tag,...] 各パ ラ メ ー タ には以下の意味があ り ます。 tag[,tag,...] 重大度を変更す る メ ッ セージ を指定す る 診断 メ ッ セージの 番号を コ ン マで区切っ た リ ス ト です。 関連項目 • 「--diag_remark=tag[,tag,... ]」 (ページ 2-51) • • • • • • 「--remarks」 (ページ 2-125) 「#pragma diag_default tag[,tag,...]」 (ページ 4-65) 「#pragma diag_error tag[,tag,...]」 (ページ 4-66) 「#pragma diag_suppress tag[,tag,...]」 (ページ 4-68) 「#pragma diag_warning tag[, tag, ...]」 (ページ 4-68) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「診断 メ ッ セージの重大度の変更」 (ページ 6-6) ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-67 コ ンパイ ラ固有の機能 4.6.7 #pragma diag_suppress tag[,tag,...] こ のプ ラ グマは、 指定 さ れた タ グ を含むすべての診断 メ ッ セージ をデ ィ セー ブルに し ます。 コ ンパ イ ラ が指定 さ れた タ ブ を持つ診断 メ ッ セージ を エ ラ ーの重大度に設定 す る 代わ り に非表示にす る 点を除いて、#pragma diag_suppress の動作は #pragma diag_errors に似てい ます。 構文 #pragma diag_suppress tag[,tag,...] 各パ ラ メ ー タ には以下の意味があ り ます。 tag[,tag,...] 非表示にす る メ ッ セージ を指定す る 診断 メ ッ セージの番号 を コ ン マで区切っ た リ ス ト です。 関連項目 • 「--diag_suppress=tag[,tag,...]」 (ページ 2-53) • • • • • 「#pragma diag_default tag[,tag,...]」 (ページ 4-65) 「#pragma diag_error tag[,tag,...]」 (ページ 4-66) 「#pragma diag_remark tag[,tag,...]」 (ページ 4-67) 「#pragma diag_warning tag[, tag, ...]」 『コ ンパ イ ラ ユーザガ イ ド 』 の 「診断 メ ッ セージの非表示」 (ページ 6-7) 4.6.8 #pragma diag_warning tag[, tag, ...] こ のプ ラ グマは、 指定 さ れた タ グ を持つ診断 メ ッ セージ を警告の重大度に設 定 し ます。 コ ンパ イ ラ が指定 さ れた タ ブ を持つ診断 メ ッ セージ を エ ラ ーの重大度ではな く 、注釈の重大度に設定す る 点を除いて、#pragma diag_remark の動作は #pragma diag_errors に似てい ます。 4-68 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 構文 #pragma diag_warning tag[,tag,...] 各パ ラ メ ー タ には以下の意味があ り ます。 tag[,tag,...] 重大度を変更す る メ ッ セージ を指定す る 診断 メ ッ セージの 番号を コ ン マで区切っ た リ ス ト です。 関連項目 「--diag_warning=tag[,tag,...]」 (ページ 2-54) • • • • • • 「#pragma diag_default tag[,tag,...]」 (ページ 4-65) 「#pragma diag_error tag[,tag,...]」 (ページ 4-66) 「#pragma diag_remark tag[,tag,...]」 (ページ 4-67) 「#pragma diag_suppress tag[,tag,...]」 (ページ 4-68) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「診断 メ ッ セージの重大度の変更」 (ページ 6-6) 4.6.9 #pragma exceptions_unwind, #pragma no_exceptions_unwind こ れ ら のプ ラ グマ を使用す る と 、 実行時の関数の展開を有効ま たは無効にで き ます。 デ フ ォル ト デフ ォ ル ト は #pragma exceptions_unwind です。 関連項目 「--exceptions, --no_exceptions」 (ページ 2-61) • • 「--exceptions_unwind, --no_exceptions_unwind」 (ページ 2-61) • ARM DUI 0348BJ ID 1 0 0 4 1 9 「実行時に展開 さ れ る 関数」 (ページ 5-21) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-69 コ ンパイ ラ固有の機能 4.6.10 #pragma hdrstop こ のプ ラ グマ を使用 し て、 プ リ コ ンパ イ ルヘ ッ ダ フ ァ イ ル群の終わ り を指定 で き ます。 こ のプ ラ グマは、 プ リ プ ロ セ ッ シ ン グデ ィ レ ク テ ィ ブに属 さ ない最初の ト ー ク ンの前に配置す る 必要があ り ます。 関連項目 • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「プ リ コ ンパ イ ルヘ ッ ダ フ ァ イ ル」 (ページ 2-19) 4.6.11 #pragma import symbol_name こ のプ ラ グマに よ っ て、 イ ン ポー ト す る symbol_name への参照が生成 さ れ ま す。 こ れは以下のアセ ン ブ ラ デ ィ レ ク テ ィ ブ を使用す る こ と と 同 じ です。 IMPORT symbol_name 構文 #pragma import symbol_name 各パ ラ メ ー タ には以下の意味があ り ます。 symbol_name イ ン ポー ト す る シ ン ボルを指定 し ます。 使用法 こ のプ ラ グマ を使用す る と 、 ヒ ープ実装や リ アル タ イ ム分割な ど、 C ラ イ ブ ラ リ の特定機能を選択で き ます。 本書に記載 さ れてい る 機能でシ ン ボル参照 の イ ン ポー ト が必要 と な る 場合、 必要な シ ン ボルは自動的に指定 さ れ ます。 関連項目 • 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の 「C ラ イ ブ ラ リ を使用 し た アプ リ ケーシ ョ ンの作成」 (ページ 2-22) 4-70 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.6.12 #pragma import(__use_full_stdio) こ のプ ラ グマに よ っ て、 ANSI C の完全な標準入出力機能を使用す る microlib の拡張バージ ョ ンが選択 さ れ ます。 以下の例外が適用 さ れ ます。 • feof() と ferror() は常に 0 を返 し ます。 • setvbuf() と setbuf() は必ず失敗 し ます。 エ ラ ーお よ びフ ァ イ ル末尾の通知がサポー ト さ れていないので、 feof() と ferror() は常に 0 を返 し ます。 ス ト リ ームはいずれ も バ ッ フ ァ さ れないので、 setvbuf() と setbuf() は必ず失 敗 し ます。 こ のバージ ョ ンの microlib stdio は、 standardlib stdio 関数 と 同 じ 方法で リ タ ー ゲ ッ ト に設定で き ます。 関連項目 • 「--library_type=lib」 (ページ 2-90) • • 4.6.13 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の第 3 章 C マ イ ク ロ ラ イ ブ ラリ 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の 「入出力関数のカ ス タ マ イ ズ」 (ページ 2-92) #pragma inline, #pragma no_inline こ れ ら のプ ラ グマは、 --inline お よ び --no_inline コ マ ン ド ラ イ ン オプシ ョ ン と 同様に、 イ ン ラ イ ン展開を制御 し ます。 #pragma no_inline で定義 さ れた関数 は、 他の関数に イ ン ラ イ ン展開 さ れず、 その関数の呼び出 し も イ ン ラ イ ン展 開 し ません。 他の関数への イ ン ラ イ ン展開の非表示は、 関数を __declspec(noinline) ま たは __attribute__((noinline)) と マー ク す る こ と に よ っ て も 実行で き ます。 デ フ ォル ト デフ ォ ル ト は #pragma inline です。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-71 コ ンパイ ラ固有の機能 関連項目 • 「--inline, --no_inline」 (ページ 2-83) • • 4.6.14 「__declspec(noinline)」 (ページ 4-31) 「__attribute__((noinline))」 (ページ 4-39) #pragma no_pch こ のプ ラ グマ を使用 し て、 指定 し た ソ ース フ ァ イ ルの PCH 処理を抑止で き ま す。 関連項目 • 「--pch」 (ページ 2-113) • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「プ リ コ ンパ イ ルヘ ッ ダ フ ァ イ ル」 (ページ 2-19) 4.6.15 #pragma Onum こ のプ ラ グマ を使用す る と 、 最適化レベルが変更 さ れ ます。 構文 #pragma Onum 各パ ラ メ ー タ には以下の意味があ り ます。 num 新 し い最適化レベルを指定 し ます。 num の値は、 0、 1、 2、 3 のいずれかです。 関連項目 「-Onum」 (ページ 2-108) • 4.6.16 #pragma once こ のプ ラ グマ を使用す る と 、 コ ンパ イ ラ は後続のヘ ッ ダ フ ァ イ ルの イ ン ク ルー ド を ス キ ッ プで き ます。 #pragma once は、 他の コ ンパ イ ラ と の互換性を保つ目的でサポー ト さ れてい る ため、 他の形式のヘ ッ ダ保護 コ ーデ ィ ン グ を使用で き ます。 し か し 、 #ifndef や #define の コ ーデ ィ ン グの方が移植が容易であ る ため、 こ れ ら のプ ラ グマ を 使用す る こ と をお勧め し ます。 4-72 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 例 以下の例の よ う に、 ヘ ッ ダ フ ァ イ ルの本体を囲む よ う に #ifndef 保護変数を配 置 し 、 #define 保護変数を #ifndef の後に配置 し ます。 #ifndef FILE_H #define FILE_H #pragma once // optional ... body of the header file ...#endif 上記の例では、 #pragma once がオプシ ョ ン と し てマー ク さ れてい ます。 こ れは、 コ ンパ イ ラ が #ifndef ヘ ッ ダ保護 コ ーデ ィ ン グ を認識 し て、#pragma once がな く て も それ以後の イ ン ク ルー ド を ス キ ッ プす る ためです。 4.6.17 #pragma Ospace こ のプ ラ グマ を使用す る と 、 実行時間が長 く な る 可能性はあ り ますが、 イ メ ージサ イ ズが小 さ く な る よ う に最適化 さ れ ます。 関連項目 「#pragma Otime」 • • 4.6.18 「-Ospace」 (ページ 2-110) #pragma Otime こ のプ ラ グマ を使用す る と 、 イ メ ージサ イ ズが大 き く な る 可能性はあ り ます が、 実行時間が削減 さ れ る よ う に最適化 さ れ ます。 関連項目 • 「#pragma Ospace」 • 4.6.19 「-Otime」 (ページ 2-111) #pragma pack(n) こ のプ ラ グマ を使用す る と 、 構造体の メ ンバの境界が n と 自然な境界の小 さ い方の値で整列 さ れます。 パ ッ ク さ れたオブジ ェ ク ト の読み出 し と 書 き 込み は、 非境界整列ア ク セ ス を使用 し て行われ ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-73 コ ンパイ ラ固有の機能 構文 #pragma pack(n) 各パ ラ メ ー タ には以下の意味があ り ます。 バ イ ト 単位の境界整列です。 有効な境界整列値は 1、 2、 4、 お よ び 8 です。 n デフ ォル ト デフ ォ ル ト は #pragma pack(8) です。 例 こ の例では、 pack(2) に よ っ て整数変数 b が 2 バ イ ト 境界で整列 さ れ る 方法を 示 し ます。 typedef struct { char a; int b; } S; #pragma pack(2) typedef struct { char a; int b; } SP; S var = { 0x11, 0x44444444 }; SP pvar = { 0x11, 0x44444444 }; S の レ イ ア ウ ト は図 4-1、 SP の レ イ ア ウ ト は図 4-2 (ページ 4-75) に示す と お り です。 図 4-2 (ページ 4-75) では、 x が 1 バ イ ト のパデ ィ ン グ を示 し ます。 0 1 2 3 a padding 4 5 6 7 b b b b 図 4-1 非パ ッ ク構造体 S 4-74 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 0 1 a x 4 5 b b 2 b 3 b 図 4-2 パ ッ ク構造体 SP 注 SP は 6 バ イ ト 構造体です。 b の後にパデ ィ ン グはあ り ません。 関連項目 • 「__packed」 (ページ 4-12) • 「__attribute__((packed))」 (ページ 4-56) • 「パ ッ ク 構造体」 (ページ 5-11) • 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「__packed 修飾子 と 非境界整列型のデー タ ア ク セ ス」 (ページ 5-31) • 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「パ ッ ク 構造体 と 個別パ ッ ク フ ィ ール ド 」 (ページ 5-33) 4.6.20 #pragma pop こ のプ ラ グマ を使用す る と 、 前に保存 さ れたプ ラ グマ状態が復元 さ れ ます。 関連項目 • 4.6.21 「#pragma push」 #pragma push こ のプ ラ グマ を使用す る と 、 現在のプ ラ グマ状態が保存 さ れ ます。 関連項目 • ARM DUI 0348BJ ID 1 0 0 4 1 9 「#pragma pop」 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-75 コ ンパイ ラ固有の機能 4.6.22 #pragma softfp_linkage, #pragma no_softfp_linkage こ れ ら のプ ラ グマは、 ソ フ ト ウ ェ ア浮動小数点 リ ン ケージ を制御 し ます。 #pragma softfp_linkage に よ っ て、 次の #pragma no_softfp_linkage ま でのすべて の関数宣言において、 ソ フ ト ウ ェ ア浮動小数点 リ ン ケージ を使用す る 関数が 記述 さ れてい る こ と を示 し ます。 注 こ のプ ラ グマには、 同等のキー ワ ー ド __softfp があ り ます。 使用法 こ のプ ラ グマは、 フ ァ イ ルを変更せずにヘ ッ ダ フ ァ イ ルにあ る イ ン タ フ ェー ス仕様全体に適用す る 場合に便利です。 デフ ォル ト デフ ォ ル ト は #pragma no_softfp_linkage です。 関連項目 「__softfp」 (ページ 4-17) • • 『コ ンパ イ ラ ユーザガ イ ド 』 の 「浮動小数点の計算 と リ ン ケージ」 (ページ 5-43) 4.6.23 #pragma unroll [(n)] こ のプ ラ グマに よ っ て、 コ ンパ イ ラ に n 回の繰 り 返 し に よ る ループの展開を 指示 し ます。 注 ベ ク ト ル化 さ れたループ も ベ ク ト ル化 さ れていないループ も 、 ど ち ら も #pragma unroll [(n)] を使用 し て展開で き ます。 すなわち、 #pragma unroll [(n)] は --vectorize と --no_vectorize の両方に適用 さ れ ます。 4-76 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 構文 #pragma unroll #pragma unroll (n) 各パ ラ メ ー タ には以下の意味があ り ます。 展開のための繰 り 返 し 回数を示すオプシ ョ ン値です。 n デ フ ォル ト n の値を指定 し ない場合は、 #pragma unroll (4) が仮定 さ れます。 使用法 -O3 -Otime を使用 し て コ ンパ イ ルす る 場合、 ループの展開が有効な場所では自 動的にループが展開 さ れ ます。 こ のプ ラ グマ を使用す る と 、 自動的に展開 さ れないループの展開を コ ンパ イ ラ に要求で き ます。 注 こ の #pragma は、 コ ンパ イ ラ に よ っ て最適なループの展開が行われていない と い う 確証が --diag_warning=optimizations な ど か ら 得 ら れ る 場合にのみ使用 し ま す。 制約条件 #pragma unroll [(n)] は、 for ループ、 while ループ、 ま たは do ... while ループの 直前でのみ使用で き ます。 例 void matrix_multiply(float ** __restrict dest, float ** __restrict src1, float ** __restrict src2, unsigned int n) { unsigned int i, j, k; for (i = 0; i < n; i++) { for (k = 0; k < n; k++) { float sum = 0.0f; /* #pragma unroll */ for(j = 0; j < n; j++) sum += src1[i][j] * src2[j][k]; dest[i][k] = sum; ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-77 コ ンパイ ラ固有の機能 } } } こ の例では、 src2 が src2[j][k] と し て イ ンデ ク ス が付け ら れ、 ループが逆の順 序すなわち j が k の内側にネ ス ト さ れてい る ので、 コ ンパ イ ラ に よ る ループ 解析は正常に完了 し ません。 こ の例の #pragma unroll の コ メ ン ト 化を解除す る と 、 ループは 4 回展開 さ れ ます。 n * n のマ ト リ ク ス の よ う なサ イ ズが 4 の倍数でないマ ト リ ク ス を掛け る こ と が目的であれば、 代わ り に #pragma unroll (m) を使用で き ます。 こ こ で、 m は、 n が m の整数倍であ る よ う な値です。 関連項目 • 「--diag_warning=optimizations」 (ページ 2-55) • • • • • 4.6.24 「-Onum」 (ページ 2-108) 「-Otime」 (ページ 2-111) 「--vectorize, --no_vectorize」 (ページ 2-146) 「#pragma unroll_completely」 『コ ンパ イ ラ ユーザガ イ ド 』 の 「ループの最適化」 (ページ 5-5) #pragma unroll_completely こ のプ ラ グマに よ っ て、 ループ を完全に展開す る こ と を コ ンパ イ ラ に指示 し ます。 ループの繰 り 返 し 回数を コ ンパ イ ラ が判別で き る 場合にのみ有効です。 注 ベ ク ト ル化 さ れたループ も ベ ク ト ル化 さ れていないループ も 、 ど ち ら も #pragma unroll_completely を使用 し て展開で き ます。 すなわち、 #pragma unroll_completely は --no_vectorize と --vectorize の両方に適用 さ れ ます。 使用法 -O3 -Otime を使用 し て コ ンパ イ ルす る 場合、 ループの展開が有効な場所では自 動的にループが展開 さ れます。 こ のプ ラ グマ を使用す る と 、 自動的には完全 に展開 さ れないループ を完全に展開す る こ と を コ ンパ イ ラ に要求で き ます。 4-78 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 注 こ の #pragma は、 コ ンパ イ ラ に よ っ て最適なループの展開が行われていない と い う 確証が --diag_warning=optimizations な ど か ら 得 ら れ る 場合にのみ使用 し ま す。 制約条件 #pragma unroll_completely は、 for ループ、 while ループ、 ま たは do ... while ルー プの直前でのみ使用で き ます。 #pragma unroll_completely を外側のループで使用す る と 、 ベ ク ト ル化を防止で き ます。 逆に、 内側のループで #pragma unroll_completely を使用す る のが有効 な場合 も あ り ます。 関連項目 • 「--diag_warning=optimizations」 (ページ 2-55) • • • • • 4.6.25 「-Onum」 (ページ 2-108) 「-Otime」 (ページ 2-111) 「--vectorize, --no_vectorize」 (ページ 2-146) 「#pragma unroll [(n)]」 (ページ 4-76) 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「ループの最適化」 (ページ 5-5) #pragma thumb こ のプ ラ グマ を使用す る と 、 Thumb 命令セ ッ ト の コ ー ド 生成に切 り 替わ り ま す。 こ れに よ り 、--arm コ ンパ イ ラ オプシ ョ ンはオーバー ラ イ ド さ れ ます。 Thumb-2 以前のプ ロ セ ッ サ用の コ ー ド を コ ンパ イ ル し てお り 、 VFP を使用 し てい る 場合は、 浮動小数点演算を含むすべての関数が ARM 用に コ ンパ イ ル さ れ ます。 関連項目 • 「--arm」 (ページ 2-9) • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「--thumb」 (ページ 2-136) 「#pragma arm」 (ページ 4-63) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-79 コ ンパイ ラ固有の機能 4.7 命令コ ンパイ ラ組み込み関数 こ のセ ク シ ョ ン では、 C ま たは C++ コ ー ド か ら の ARM マシ ン言語命令を実 行す る 命令 コ ンパ イ ラ 組み込み関数について説明 し ます。 表 4-7 には、 使用 で き る コ ンパ イ ラ 組み込み関数を示 し ます。 表 4-7 ARM コ ンパイ ラ によ っ てサポー ト さ れている命令コ ンパイ ラ組み込み関数 命令コ ンパイ ラ組み込み関数 __breakpoint __ldrt __schedule_barrier __cdp __memory_changed __semihost __clrex __nop __sev __clz __pld __sqrt __current_pc __pldw __sqrtf __current_sp __pli __ssat __disable_fiq __promise __strex __disable_irq __qadd __strexd __enable_fiq __qdbl __strt __enable_irq __qsub __swp __fabs __rbit __usat __fabsf __rev __wfe __force_stores __return_address __wfi __ldrex __ror __yield __ldrexd 「GNU 組み込み関数」 (ページ 4-126) も 参照 し て下 さ い。 4.7.1 __breakpoint こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに BKPT 命令を挿入 し ます。 組み込み関数を使用す る と 、 C ま た は C++ コ ー ド にブ レー ク ポ イ ン ト 命令を含め る こ と がで き ます。 4-80 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 構文 void __breakpoint(int val) 各パ ラ メ ー タ には以下の意味があ り ます。 コ ンパ イ ル時の定数整数を指定 し ます。 その範囲は以下の と お り です。 0 ... 65535 ソ ース を ARM コ ー ド と し て コ ンパ イ ルす る 場合 0 ... 255 ソ ース を Thumb コ ー ド と し て コ ンパ イ ルす る 場合 val エラー BKPT 命令を サポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __breakpoint コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ン パ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れ ます。 BKPT 命令を サポー ト し ていないアーキ テ ク チ ャ で、 こ の命令を実行す る と 、 未定義の命令の ト ラ ッ プが発生 し ます。 例 void func(void) { ... __breakpoint(0xF02C); ... } 関連項目 • 4.7.2 『アセ ンブ ラ ガ イ ド 』 の 「BKPT」 (ページ 4-141) __cdp こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に CDP ま たは CDP2 命令を挿入 し ます。 組み込み関数を使用す る と 、 C ま たは C++ コ ー ド に コ プ ロ セ ッ サのデー タ 演算を含め る こ と がで き ま す。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-81 コ ンパイ ラ固有の機能 構文 __cdp(unsigned int coproc, unsigned int opcode1, unsigned int opcode2) 各パ ラ メ ー タ には以下の意味があ り ます。 coproc 命令が実行 さ れ る コ プ ロ セ ッ サ を識別 し ます。 coproc は、 0 ~ 15 の範囲内の整数であ る 必要があ り ます。 opcode1 コ プ ロ セ ッ サ固有のオペ コ ー ド を指定 し ます。 0x100 を オペ コ ー ド に追加 し て、 CDP2 命令を生成 し ます。 opcode2 コ プ ロ セ ッ サ固有のオペ コ ー ド を指定 し ます。 使用法 こ れ ら の命令の使用方法は コ プ ロ セ ッ サに よ っ て異な り ます。 詳細について は、 使用 し てい る コ プ ロ セ ッ サのマニ ュ アルを参照 し て下 さ い。 関連項目 • 4.7.3 『アセ ンブ ラ ガ イ ド 』 の 「CDP、 CDP2」 (ページ 4-133) __clrex こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに CLREX 命令を挿入 し ます。 組み込み関数を使用す る と 、 C ま た は C++ コ ー ド に CLREX 命令を含め る こ と がで き ます。 構文 void __clrex(void) エラー CLREX 命令をサポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __clrex コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れ ます。 関連項目 • 4-82 『アセ ンブ ラ ガ イ ド 』 の 「CLREX」 (ページ 4-43) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.7.4 __clz こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に CLZ 命令、 ま たは等価 コ ー ド シーケ ン ス を挿入 し ます。 組み込 み関数を使用す る と 、 C ま たは C++ コ ー ド に含ま れ る デー タ 値の先行ゼ ロ の 数を カ ウ ン ト で き ます。 構文 unsigned char __clz(unsigned int val) 各パ ラ メ ー タ には以下の意味があ り ます。 unsigned int を指定 し ます。 val 戻り値 __clz コ ンパ イ ラ 組み込み関数を使用す る と 、 val に含まれ る 先行ゼ ロ の数が 返 さ れ ます。 関連項目 • 「その他の組み込み関数」 (ページ 4-128) • 4.7.5 『アセ ンブ ラ ガ イ ド 』 の 「CLZ」 (ページ 4-61) __current_pc こ の コ ンパ イ ラ 組み込み関数を使用す る と 、 関数が使用 さ れ る 位置のプ ロ グ ラ ム カ ウ ン タ の現在値を決定で き ます。 構文 unsigned int __current_pc(void) 戻り値 __current_pc コ ンパ イ ラ 組み込み関数を使用す る と 、 関数が使用 さ れ る 位置の プ ロ グ ラ ム カ ウ ン タ の現在値が返 さ れ ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-83 コ ンパイ ラ固有の機能 関連項目 • 「__current_sp」 • • 4.7.6 「__return_address」 (ページ 4-101) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「sp、 lr、 ま たは pc にア ク セ スす る従来 の イ ン ラ イ ン アセ ンブ ラ 」 (ページ 7-30) __current_sp こ の コ ンパ イ ラ 組み込み関数を使用す る と 、 プ ロ グ ラ ム の現在位置の ス タ ッ ク ポ イ ン タ 値が返 さ れます。 構文 unsigned int __current_sp(void) 戻り値 __current_sp コ ンパ イ ラ 組み込み関数を使用す る と 、 関数が使用 さ れ る 位置の ス タ ッ ク ポ イ ン タ の現在値が返 さ れ ます。 関連項目 • 「その他の組み込み関数」 (ページ 4-128) • • • 4.7.7 「__current_pc」 (ページ 4-83) 「__return_address」 (ページ 4-101) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「sp、 lr、 ま たは pc にア ク セ スす る従来 の イ ン ラ イ ン アセ ンブ ラ 」 (ページ 7-30) __disable_fiq こ の コ ンパ イ ラ 組み込み関数は、 FIQ 割 り 込みをデ ィ セーブルに し ます。 注 通常、 こ の コ ンパ イ ラ 組み込み関数は、 CPSR で F ビ ッ ト を設定す る こ と に よ っ て、 FIQ 割 り 込みをデ ィ セーブル し ます。 ただ し 、 v7-M の場合は、 フ ォ ール ト マ ス ク レ ジ ス タ (FAULTMASK) が設定 さ れ ます。 v6-M では、 FIQ 割 り 込みがサポー ト さ れてい ません。 4-84 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 構文 int __disable_fiq(void) 注 M プ ロ フ ァ イ ルでは、 __disable_fiq コ ンパ イ ラ 組み込み関数に次のプ ロ ト タ イ プがあ り ます。 void __disable_fiq(void) 戻り値 __disable_fiq を使用す る と 、 FIQ 割 り 込みの無効以前に、 PSR に FIQ 割 り 込み マ ス ク が持っ ていた値を返 し ます。 制約条件 __disable_fiq コ ンパ イ ラ 組み込み関数を実行で き る のは、 特権モー ド 、 つま り 非ユーザモー ド の場合のみです。 こ の コ ンパ イ ラ 組み込み関数を ユーザ モー ド で実行 し て も 、 CPSR 内の割 り 込みフ ラ グが変更 さ れ る こ と はあ り ませ ん。 例 void foo(void) { int was_masked = __disable_fiq(); /* ... */ if (!was_masked) __enable_fiq(); } 関連項目 • 「__enable_fiq」 (ページ 4-87) 4.7.8 __disable_irq こ の コ ンパ イ ラ 組み込み関数は、 IRQ 割 り 込みをデ ィ セーブルに し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-85 コ ンパイ ラ固有の機能 注 通常、 こ の コ ンパ イ ラ 組み込み関数は、 CPSR で I ビ ッ ト を設定す る こ と に よ っ て、 IRQ 割 り 込みをデ ィ セーブル し ます。 ただ し 、 M プ ロ フ ァ イ ルの場 合は、 例外マ ス ク レ ジ ス タ (PRIMASK) が設定 さ れ ます。 構文 int __disable_irq(void) 注 M プ ロ フ ァ イ ルでは、 __disable_irq コ ンパ イ ラ 組み込み関数に次のプ ロ ト タ イ プがあ り ます。 void __disable_irq(void) 戻り値 __disable_irq() を使用す る と 、 IRQ 割 り 込みの無効以前に、 PSR に IRQ 割 り 込 みマ ス ク が持っ ていた値を返 し ます。 例 void foo(void) { int was_masked = __disable_irq(); /* ... */ if (!was_masked) __enable_irq(); } 制約条件 __disable_irq コ ンパ イ ラ 組み込み関数を実行で き る のは、 特権モー ド 、 つま り 非ユーザモー ド の場合のみです。 こ の コ ンパ イ ラ 組み込み関数を ユーザ モー ド で実行 し て も 、 CPSR 内の割 り 込みフ ラ グが変更 さ れ る こ と はあ り ませ ん。 関連項目 「__enable_irq」 (ページ 4-87) • 4-86 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.7.9 __enable_fiq こ の コ ンパ イ ラ 組み込み関数は、 FIQ 割 り 込みを イ ネーブル し ます。 注 通常、 こ の コ ンパ イ ラ 組み込み関数は、 CPSR で F ビ ッ ト を ク リ アす る こ と に よ っ て、 FIQ 割 り 込みを イ ネーブル し ます。 ただ し 、 v7-M の場合は、 フ ォ ー ル ト マ ス ク レ ジ ス タ (FAULTMASK) が ク リ ア さ れ ます。 v6-M では、 FIQ 割 り 込みがサポー ト さ れてい ません。 構文 void __enable_fiq(void) 制約条件 __enable_fiq コ ンパ イ ラ 組み込み関数を実行で き る のは、 特権モー ド 、 つま り 非ユーザモー ド の場合のみです。 こ の コ ンパ イ ラ 組み込み関数を ユーザモー ド で実行 し て も 、 CPSR 内の割 り 込みフ ラ グが変更 さ れ る こ と はあ り ません。 関連項目 「__disable_fiq」 (ページ 4-84) • 4.7.10 __enable_irq こ の コ ンパ イ ラ 組み込み関数は、 IRQ 割 り 込みを イ ネーブル し ます。 注 通常、 こ の コ ンパ イ ラ 組み込み関数は、 CPSR で I ビ ッ ト を ク リ アす る こ と に よ っ て、 IRQ 割 り 込みを イ ネーブル し ます。 ただ し 、 Cortex M プ ロ フ ァ イ ルプ ロ セ ッ サの場合は、 例外マ ス ク レ ジ ス タ (PRIMASK) が ク リ ア さ れ ます。 構文 void __enable_irq(void) ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-87 コ ンパイ ラ固有の機能 制約条件 __enable_irq コ ンパ イ ラ 組み込み関数を実行で き る のは、 特権モー ド 、 つま り 非ユーザモー ド の場合のみです。 こ の コ ンパ イ ラ 組み込み関数を ユーザ モー ド で実行 し て も 、 CPSR 内の割 り 込みフ ラ グが変更 さ れ る こ と はあ り ませ ん。 関連項目 • 「__disable_irq」 (ページ 4-85) 4.7.11 __fabs こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに VABS 命令、 ま たは等価 コ ー ド シーケ ン ス を挿入 し ます。 こ の 関数を使用す る と 、 C ま たは C++ コ ー ド 内か ら の倍精度浮動小数点絶対値を 取得で き ます。 注 __fabs コ ンパ イ ラ 組み込み関数は、 標準的な C ラ イ ブ ラ リ 関数 fabs のアナ ロ グです。 標準 ラ イ ブ ラ リ 関数では、 __fabs の呼び出 し に対す る 、 VFP コ プ ロ セ ッ サ を装備 し た ARM アーキ テ ク チ ャ ベース のプ ロ セ ッ サ上のシ ン グル、 イ ン ラ イ ン、 マシ ン命令への コ ンパ イ ルが保証 さ れてい ますが、 こ れは異な り ます。 構文 double __fabs(double val) 各パ ラ メ ー タ には以下の意味があ り ます。 val 倍精度浮動小数点値を指定 し ます。 戻り値 __fabs コ ンパ イ ラ 組み込み関数は、 val の絶対値を double と し て返 し ます。 関連項目 • 「__fabsf」 (ページ 4-89) • 4-88 『アセ ンブ ラ ガ イ ド 』 の 「VABS、 VNEG、 VSQRT」 (ページ 5-112) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.7.12 __fabsf こ の コ ンパ イ ラ 組み込み関数は、 __fabs 組み込み関数の単精度バージ ョ ン で す。 機能的には、 以下の点を除いて __fabs と 同 じ です。 • こ の関数は、 double 型の引数の代わ り に、 float 型の引数を取 り ます。 • double 値の代わ り に、 float 値を返 し ます。 関連項目 「__fabs」 (ページ 4-88) • • 4.7.13 『アセ ンブ ラ ガ イ ド 』 の 「V{Q}ABS お よ び V{Q}NEG」 (ページ 5-67) __force_stores こ の コ ンパ イ ラ 組み込み関数を使用す る と 、 現在の関数の外側で可視のすべ ての変数 (関数 と の間で受け渡 し が行われ る ポ イ ン タ を持つ変数な ど) は、 変更 さ れた場合に メ モ リ に書 き 込ま れ ます。 こ の コ ンパ イ ラ 組み込み関数は、 ス ケ ジ ュ ー リ ン グのバ リ ア と し て も 機能 し ます。 構文 void __force_stores(void) 関連項目 • 「__memory_changed」 (ページ 4-94) • 4.7.14 「__schedule_barrier」 (ページ 4-103) __ldrex こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に LDREX[size] 形式の命令を挿入 し ます。 LDREX 命令を使用 し て、 C ま たは C++ の コ ー ド に メ モ リ か ら デー タ を ロ ー ド で き ます。 LDREX[size] の size は、 バ イ ト ス ト アの B ま たはハーフ ワ ー ド ス ト アの H です。 サ イ ズが指定 さ れていない場合は、 ワ ー ド ス ト アが実行 さ れ ます。 構文 unsigned int __ldrex(volatile void *ptr) ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-89 コ ンパイ ラ固有の機能 各パ ラ メ ー タ には以下の意味があ り ます。 メ モ リ か ら ロ ー ド さ れ る デー タ のア ド レ ス を指 し ます。 ロ ー ド さ れ る デー タ の型を指定す る には、 パ ラ メ ー タ を適切なポ イ ン タ 型にキ ャ ス ト し ます。 ptr 表 4-8 __ldrex コ ンパイ ラ組み込み関数によ っ てサポー ト さ れる ア ク セス幅 命令 ロー ド さ れたデー タ のサイ ズ C のキ ャ ス ト LDREXB 符号な し バ イ ト (unsigned char *) LDREXB 符号付 き バ イ ト (signed char *) LDREXH 符号な し ハーフ ワー ド (unsigned short *) LDREXH 符号付 き ハーフ ワー ド (short *) LDREX ワー ド (int *) 戻り値 __ldrex コ ンパ イ ラ 組み込み関数は、 ptr が示す メ モ リ ア ド レ ス か ら ロ ー ド さ れ たデー タ を返 し ます。 エラー LDREX 命令をサポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __ldrex コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れ ます。 __ldrex コ ンパ イ ラ 組み込み関数は、 ダブル ワ ー ド デー タ へのア ク セ ス を サ ポー ト し ません。 サポー ト さ れないア ク セ ス幅を指定す る と 、 コ ンパ イ ラ に よ っ てエ ラ ーが生成 さ れます。 例 int foo(void) { int loc = 0xff; return __ldrex((volatile char *)loc); } 4-90 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 コ マ ン ド ラ イ ン オプシ ョ ン --cpu=6k を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 以下の コ ー ド が生成 さ れます。 ||foo|| PROC MOV r0,#0xff LDREXB r0,[r0] BX lr ENDP 関連項目 • 「__ldrexd」 「__strex」 (ページ 4-108) 「__strexd」 (ページ 4-110) 『アセ ンブ ラ ガ イ ド 』 の 「LDREX と STREX」 (ページ 4-40) • • • 4.7.15 __ldrexd こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に LDREXD 命令を挿入 し ます。 LDREXD 命令を使用 し て、 C ま たは C++ コ ー ド に メ モ リ か ら デー タ を ロ ー ド で き ます。 ダブル ワー ド デー タ への ア ク セ ス を サポー ト し てい ます。 構文 unsigned long long __ldrexd(volatile void *ptr) 各パ ラ メ ー タ には以下の意味があ り ます。 メ モ リ か ら ロ ー ド さ れ る デー タ のア ド レ ス を指 し ます。 ロ ー ド さ れ る デー タ の型を指定す る には、 パ ラ メ ー タ を適切なポ イ ン タ 型にキ ャ ス ト し ます。 ptr 表 4-9 __ldrex コ ンパイ ラ組み込み関数によ っ てサポー ト さ れる ア ク セス幅 ARM DUI 0348BJ ID 1 0 0 4 1 9 命令 ロー ド さ れたデー タ のサイ ズ C のキ ャ ス ト LDREXD 符号な し long long (unsigned long long *) LDREXD 符号付き long long (signed long long *) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-91 コ ンパイ ラ固有の機能 戻り値 __ldrexd コ ンパ イ ラ 組み込み関数は、 ptr が示す メ モ リ ア ド レ ス か ら ロ ー ド さ れたデー タ を返 し ます。 エラー LDREXD 命令をサポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ン パ イ ラ は __ldrexd コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れ ます。 __ldrexd コ ンパ イ ラ 組み込み関数は、 ダブル ワー ド デー タ へのア ク セ ス のみ をサポー ト し ます。 サポー ト さ れないア ク セ ス幅を指定す る と 、 コ ンパ イ ラ に よ っ てエ ラ ーが生成 さ れます。 関連項目 • 「__ldrex」 (ページ 4-89) • • • 4.7.16 「__strex」 (ページ 4-108) 「__strexd」 (ページ 4-110) 『アセ ンブ ラ ガ イ ド 』 の 「LDREX と STREX」 (ページ 4-40) __ldrt こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに LDR{size}T 形式のアセ ン ブ リ 言語命令を挿入 し ます。 LDRT 命令 を使用 し て、 C ま たは C++ コ ー ド に メ モ リ か ら デー タ を ロ ー ド で き ます。 構文 unsigned int __ldrt(const volatile void *ptr) 4-92 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 各パ ラ メ ー タ には以下の意味があ り ます。 メ モ リ か ら ロ ー ド さ れ る デー タ のア ド レ ス を指 し ます。 ロ ー ド さ れ る デー タ のサ イ ズ を指定す る には、 パ ラ メ ー タ を適切な整数 型にキ ャ ス ト し ます。 ptr 表 4-10 __ldrt コ ンパイ ラ組み込み関数によ っ てサポー ト さ れる ア ク セス幅 命令a ロー ド さ れたデー タ のサイ ズ C のキ ャ ス ト LDRSBT 符号付き バ イ ト (signed char *) LDRBT 符号な し バ イ ト (char *) LDRSHT 符号付き ハーフ ワ ー ド (signed short int *) LDRHT 符号な し ハーフ ワ ー ド (short int *) LDRT ワー ド (int *) a. ま たはその等価命令 戻り値 __ldrt コ ンパ イ ラ 組み込み関数は、 ptr が示す メ モ リ ア ド レ ス か ら ロ ー ド さ れ たデー タ を返 し ます。 エラー LDRT 命令を サポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __ldrt コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れ ます。 __ldrt コ ンパ イ ラ 組み込み関数は、 ダブル ワー ド デー タ へのア ク セ ス をサ ポー ト し ません。 サポー ト さ れないア ク セ ス幅を指定す る と 、 コ ンパ イ ラ に よ っ てエ ラ ーが生成 さ れます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-93 コ ンパイ ラ固有の機能 例 int foo(void) { int loc = 0xff; return __ldrt((const volatile int *)loc); } デフ ォ ル ト オプシ ョ ン を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 以下の コ ー ド が生成 さ れ ます。 ||foo|| PROC MOV LDRBT MOV LDRBT ORR BX ENDP r0,#0xff r1,[r0],#0 r2,#0x100 r0,[r2],#0 r0,r1,r0,LSL #8 lr 関連項目 • 「--thumb」 (ページ 2-136) • 4.7.17 『アセ ンブ ラ ガ イ ド 』 の 「LDR と STR (ユーザモー ド )」 (ページ 4-18) __memory_changed こ の コ ンパ イ ラ 組み込み関数を使用す る と 、 現在の関数の外側で可視のすべ ての変数 (関数 と の間で受け渡 し が行われ る ポ イ ン タ を持つ変数な ど) は、 変更 さ れた場合は メ モ リ に書 き 込ま れ、 その後、 メ モ リ か ら 読み出 さ れます。 こ の コ ンパ イ ラ 組み込み関数は、 ス ケ ジ ュ ー リ ン グのバ リ ア と し て も 機能 し ます。 構文 void __memory_changed(void) 関連項目 • 「__force_stores」 (ページ 4-89) • 4-94 「__schedule_barrier」 (ページ 4-103) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.7.18 __nop こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に NOP 命令、 ま たは等価 コ ー ド シーケ ン ス を挿入 し ます。 ソ ース フ ァ イ ル内の各 __nop コ ンパ イ ラ 組み込み関数ご と に、 1 つの NOP 命令が生成 さ れ ます。 コ ンパ イ ラ は、 通常の到達で き ない コ ー ド の削除を除 き 、 NOP 命令の削除に よ る 最適化は行い ません。 __nop コ ンパ イ ラ 組み込み関数は、 コ ンパ イ ラ 内での 命令ス ケ ジ ュ ー リ ン グのバ リ ア と し て も 機能 し ます。 つま り 、 最適化を行っ て も 、 NOP の一方の側か ら 他方の側へ命令が移動 さ れ る こ と はあ り ません。 注 __schedule_barrier コ ンパ イ ラ 組み込み関数を使用す る と 、 NOP 命令を生成す る こ と な く 、 ス ケ ジ ュ ー リ ン グのバ リ ア を挿入で き ます。 構文 void __nop(void) 関連項目 • 「__sev」 (ページ 4-105) • • • • • 「__schedule_barrier」 (ページ 4-103) 「__wfe」 (ページ 4-115) 「__wfi」 (ページ 4-115) 「__yield」 (ページ 4-116) 『アセ ンブ ラ ガ イ ド 』 の 「NOP、 SEV、 WFE、 WFI、 YIELD」 (ページ 4-152) • 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「汎用の コ ンパ イ ラ 組み込み関数」 (ページ 4-4) 4.7.19 __pld こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に PLD な ど のデー タ プ リ フ ェ ッ チを挿入 し ます。 こ れに よ り 、 ア ド レ ス か ら のデー タ の ロ ー ド が実行 さ れ る こ と を、 C ま たは C++ プ ロ グ ラ ム か ら メ モ リ シ ス テ ム に事前に通知す る こ と がで き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-95 コ ンパイ ラ固有の機能 構文 void __pld(...) 各パ ラ メ ー タ には以下の意味があ り ます。 プ リ フ ェ ッ チす る メ モ リ のア ド レ ス を指定す る 、 任意の数のポ イ ン タ ま たは整数引数を示 し ます。 ... 制約条件 タ ーゲ ッ ト アーキ テ ク チ ャ がデー タ のプ リ フ ェ ッ チを サポー ト し ない場合、 こ の コ ンパ イ ラ 組み込み関数は無効です。 例 extern int data1; extern int data2; volatile int* interrupt = (volatile int *)0x8000; volatile int* uart = (volatile int *)0x9000; void get(void) { __pld(data1, data2); while (!*interrupt); *uart = data1; // trigger uart as soon as interrupt occurs *(uart+1) = data2; } 関連項目 • 「__pldw」 • • 4.7.20 「__pli」 (ページ 4-97) 『アセ ンブ ラ ガ イ ド 』 の 「PLD、 PLDW、 PLI」 (ページ 4-26) __pldw こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに PLDW 命令を挿入 し ます。 こ れに よ り 、 ア ド レ ス か ら のデー タ の ロ ー ド が書 き 込み目的で実行 さ れ る こ と を、 C ま たは C++ プ ロ グ ラ ム か ら メ モ リ シ ス テ ム に事前に通知で き ます。 4-96 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 構文 void __pldw(...) 各パ ラ メ ー タ には以下の意味があ り ます。 プ リ フ ェ ッ チす る メ モ リ のア ド レ ス を指定す る 、 任意の数のポ イ ン タ ま たは整数引数を示 し ます。 ... 制約条件 タ ーゲ ッ ト アーキ テ ク チ ャ がデー タ のプ リ フ ェ ッ チを サポー ト し ない場合、 こ の コ ンパ イ ラ 組み込み関数は無効です。 こ の組み込み関数は、 マルチプ ロ セ ッ シ ン グ拡張機能を提供 し てい る ARMv7 以上のアーキ テ ク チ ャ でのみ有効です。 つま り 、 事前定義のマ ク ロ __TARGET_FEATURE_MULTIPROCESSING が定義 さ れてい る 場合です。 例 void foo(int *bar) { __pldw(bar); } 関連項目 • 「コ ンパ イ ラ に よ る事前定義」 (ページ 4-129) • • • 4.7.21 「__pld」 (ページ 4-95) 「__pli」 『アセ ンブ ラ ガ イ ド 』 の 「PLD、 PLDW、 PLI」 (ページ 4-26) __pli こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に PLI な ど の命令プ リ フ ェ ッ チを挿入 し ます。 こ れに よ り 、 ア ド レ ス か ら の命令の ロ ー ド が実行 さ れ る こ と を、 C ま たは C++ プ ロ グ ラ ム か ら メ モ リ シ ス テ ムに事前に通知す る こ と がで き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-97 コ ンパイ ラ固有の機能 構文 void __pli(...) 各パ ラ メ ー タ には以下の意味があ り ます。 プ リ フ ェ ッ チす る 命令のア ド レ ス を指定す る 、 任意の数のポ イ ン タ ま たは整数引数を示 し ます。 ... 制約条件 タ ーゲ ッ ト アーキ テ ク チ ャ が命令のプ リ フ ェ ッ チをサポー ト し ない場合、 こ の コ ンパ イ ラ 組み込み関数は無効です。 関連項目 • 「__pld」 (ページ 4-95) • • 4.7.22 「__pldw」 (ページ 4-96) 『アセ ンブ ラ ガ イ ド 』 の 「PLD、 PLDW、 PLI」 (ページ 4-26) __promise こ の組み込み関数は、 式の結果がゼ ロ 以外にな る こ と を コ ンパ イ ラ に保証 し ます。 そのため、 コ ンパ イ ラ は コ ー ド をベ ク ト ル化す る と き に強力な最適化 を実行で き ます。 構文 void __promise(expr) expr は、 ゼ ロ 以外を求め る 式です。 関連項目 • 4.7.23 『コ ンパ イ ラ ユーザガ イ ド 』 の 「__promise を使用 し たベ ク ト ル化の向 上」 (ページ 3-18) __qadd こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに QADD 命令、 ま たは等価 コ ー ド シーケ ン ス を挿入 し ます。 コ ン パ イ ラ 組み込み関数を使用す る と 、 C ま たは C++ コ ー ド 内に含ま れ る 2 つの 整数のサチ ュ レー ト 加算を取得で き ます。 4-98 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 構文 int __qadd(int val1, int val2) 各パ ラ メ ー タ には以下の意味があ り ます。 サチ ュ レー ト 加算演算の最初の加数を指定 し ます。 val2 サチ ュ レー ト 加算演算の 2 番目の加数を指定 し ます。 val1 戻り値 __qadd コ ンパ イ ラ 組み込み関数を使用す る と 、 val1 お よ び val2 のサチ ュ レー ト 加算が返 さ れ ます。 関連項目 • 「__qdbl」 • • 「__qsub」 (ページ 4-100) 『アセ ンブ ラ ガ イ ド 』 の 「QADD、 QSUB、 QDADD、 QDSUB」 (ページ 4-101) 4.7.24 __qdbl こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に整数のサチ ュ レー ト 加算 と 等価の命令を挿入 し ます。 コ ンパ イ ラ 組み込み関数を使用す る と 、 C ま たは C++ コ ー ド 内に含ま れ る 整数のサ チ ュ レー ト 倍数を取得で き ます。 構文 int __qdbl(int val) 各パ ラ メ ー タ には以下の意味があ り ます。 倍にな る デー タ 値を指定 し ます。 val 戻り値 __qdbl コ ンパ イ ラ 組み込み関数を使用す る と 、 val と そのサチ ュ レー ト 加算、 ま たは同様に __qadd(val, val) が返 さ れます。 関連項目 • ARM DUI 0348BJ ID 1 0 0 4 1 9 「__qadd」 (ページ 4-98) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-99 コ ンパイ ラ固有の機能 4.7.25 __qsub こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに QSUB 命令、 ま たは等価 コ ー ド シーケ ン ス を挿入 し ます。 コ ン パ イ ラ 組み込み関数を使用す る と 、 C ま たは C++ コ ー ド 内に含ま れ る 2 つの 整数のサチ ュ レー ト 減算を取得で き ます。 構文 int __qsub(int val1, int val2) 各パ ラ メ ー タ には以下の意味があ り ます。 val1 サチ ュ レー ト 減算演算の被減数を指定 し ます。 val2 サチ ュ レー ト 減算演算の減数を指定 し ます。 戻り値 __qsub コ ンパ イ ラ 組み込み関数を使用す る と 、 val1 お よ び val2 のサチ ュ レー ト 減算が返 さ れます。 関連項目 • 「__qadd」 (ページ 4-98) • 『アセ ンブ ラ ガ イ ド 』 の 「QADD、 QSUB、 QDADD、 QDSUB」 (ページ 4-101) 4.7.26 __rbit こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに RBIT 命令を挿入 し ます。 コ ンパ イ ラ 組み込み関数を使用す る と 、 C ま たは C++ コ ー ド 内に含まれ る 32 ビ ッ ト ワ ー ド 内の ビ ッ ト 順序を反転 で き ます。 構文 unsigned int __rbit(unsigned int val) 各パ ラ メ ー タ には以下の意味があ り ます。 val ビ ッ ト 順序が反転 さ れ る デー タ 値を指定 し ます。 4-100 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 戻り値 __rbit コ ンパ イ ラ 組み込み関数を使用す る と 、 ビ ッ ト 順序を反転す る こ と に よ り val か ら 取得 し た値が返 さ れ ます。 関連項目 • 4.7.27 『アセ ンブ ラ ガ イ ド 』 の 「REV、 REV16、 REVSH、 RBIT」 (ページ 4-72) __rev こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に REV 命令、 ま たは等価 コ ー ド シーケ ン ス を挿入 し ます。 こ の コ ンパ イ ラ 組み込み関数を使用す る と 、 C ま たは C++ の コ ー ド 内で、 32 ビ ッ ト のビ ッ グエ ンデ ィ ア ンデー タ 値を リ ト ルエ ンデ ィ ア ンデー タ 値に、 ま たは 32 ビ ッ ト の リ ト ルエ ンデ ィ ア ンデー タ 値を ビ ッ グエ ンデ ィ ア ンデー タ 値に変換 で き ます。 注 コ ンパ イ ラ は、 式を認識す る と 自動的に REV を導入 し ます。 構文 unsigned int __rev(unsigned int val) 各パ ラ メ ー タ には以下の意味があ り ます。 val unsigned int を指定 し ます。 戻り値 __rev コ ンパ イ ラ 組み込み関数を使用す る と 、 バ イ ト 順序を反転す る こ と に よ り val か ら 取得 し た値が返 さ れ ます。 関連項目 • 4.7.28 『アセ ンブ ラ ガ イ ド 』 の 「REV、 REV16、 REVSH、 RBIT」 (ページ 4-72) __return_address こ の コ ンパ イ ラ 組み込み関数は、 現在の関数の復帰ア ド レ ス を返 し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-101 コ ンパイ ラ固有の機能 構文 unsigned int __return_address(void) 戻り値 __return_address コ ンパ イ ラ 組み込み関数を使用す る と 、 現在の関数か ら 復帰 す る 場合に使用 さ れ る リ ン ク レ ジ ス タ の値が返 さ れ ます。 制約条件 __return_address コ ンパ イ ラ 組み込み関数は、 イ ン ラ イ ン展開、 末尾の呼び出 し 、 コ ー ド の共有な ど、 最適化を実行す る コ ンパ イ ラ の機能には影響 し ませ ん。 最適化が実行 さ れた場合、 __return_address に よ っ て返 さ れた値は、 実行 さ れた最適化を反映 し ます。 最適化な し 最適化が実行 さ れない場合、 関数 foo 内か ら __return_address に よ っ て返 さ れた値は、 foo の復帰ア ド レ ス にな り ます。 イ ン ラ イ ン最適化 関数 foo が関数 bar に イ ン ラ イ ン展開 さ れ る と 、 関数 foo 内か ら __return_address に よ っ て返 さ れた値は、 bar の復帰ア ド レ ス にな り ます。 Tail 呼び出 し 最適化 関数 foo が関数 bar か ら 末尾呼び出 し さ れ る と 、 関数 foo 内か ら __return_address に よ っ て返 さ れた値は、 bar の復帰ア ド レ ス にな り ます。 関連項目 • 「その他の組み込み関数」 (ページ 4-128) • • • 4-102 「__current_pc」 (ページ 4-83) 「__current_sp」 (ページ 4-84) 『コ ンパ イ ラ ユーザガ イ ド 』 の 「sp、 lr、 ま たは pc にア ク セ スす る従来 の イ ン ラ イ ン アセ ンブ ラ 」 (ページ 7-30) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.7.29 __ror こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に ROR 命令ま たはオペ ラ ン ド 回転を挿入 し ます。 コ ンパ イ ラ 組み 込み関数を使用す る と 、 C ま たは C++ コ ー ド 内に含まれ る 指定 さ れた桁数分 だけ値を右に回転で き ます。 注 コ ンパ イ ラ は、 式を認識す る と 自動的に ROR を導入 し ます。 構文 unsigned int __ror(unsigned int val, unsigned int shift) 各パ ラ メ ー タ には以下の意味があ り ます。 シ フ ト さ れ る 値を指定 し ます。 shift 1 ~ 31 の範囲の定数シ フ ト を指定 し ます。 val 戻り値 __ror コ ンパ イ ラ 組み込み関数を使用す る と 、 shift 桁数分右に回転 し た val の 値が返 さ れ ます。 関連項目 • 4.7.30 『アセ ンブ ラ ガ イ ド 』 の 「ASR、 LSL、 LSR、 ROR、 RRX」 (ページ 4-73) __schedule_barrier こ の コ ンパ イ ラ 組み込み関数を使用す る と 、 シーケ ン ス ポ イ ン ト が作成 さ れ ます。 シーケ ン ス ポ イ ン ト の前後にあ る 演算は結合 さ れません。 ス ケ ジ ュ ー リ ン グのバ リ アに よ り 、 メ モ リ は更新 さ れ ません。 変数が レ ジ ス タ で保持 さ れてい る 場合、 変数は直接更新 さ れ、 書 き 出 さ れ ません。 こ の コ ンパ イ ラ 組み込み関数は、 NOP 命令が生成 さ れない点を除 き 、 __nop コ ン パ イ ラ 組み込み関数 と 似てい ます。 構文 void schedule_barrier(void) ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-103 コ ンパイ ラ固有の機能 関連項目 • 4.7.31 「__nop」 (ページ 4-95) __semihost こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに SVC ま たは BKPT 命令を挿入 し ます。 こ の コ ンパ イ ラ 組み込み関 数を使用す る と 、 タ ーゲ ッ ト アーキ テ ク チ ャ と は関係のないセ ミ ホ ス テ ィ ン グ呼び出 し を C ま たは C++ か ら 行 う こ と がで き ます。 構文 int __semihost(int val, const void *ptr) 各パ ラ メ ー タ には以下の意味があ り ます。 セ ミ ホ ス テ ィ ン グ要求の要求 コ ー ド を指定 し ます。 val 詳細については、 『デベ ロ ッ パガ イ ド 』 の 「第 8 章 セ ミ ホ ス テ ィ ン グ 」 を参照 し て下 さ い。 引数 / 結果ブ ロ ッ ク へのポ イ ン タ を指定 し ます。 ptr 詳細については、 『デベ ロ ッ パガ イ ド 』 の 「第 8 章 セ ミ ホ ス テ ィ ン グ 」 を参照 し て下 さ い。 戻り値 セ ミ ホ ス テ ィ ン グ呼び出 し の結果については、 『デベ ロ ッ パガ イ ド 』 の 「第 8 章 セ ミ ホ ス テ ィ ン グ 」 を参照 し て下 さ い。 使用法 C ま たは C++ か ら の コ ンパ イ ル組み込み関数を使用 し て、 タ ーゲ ッ ト お よ び 命令セ ッ ト に適 し たセ ミ ホ ス テ ィ ン グ呼び出 し を生成 し ます。 4-104 SVC 0x123456 すべてのアーキ テ ク チ ャ の ARM 状態時 SVC 0xAB ARMv7-M を除 く Thumb 状態時。 こ の動作は、 ARM ま た は各社のすべてのデバ ッ グ タ ーゲ ッ ト で保証 さ れてい る と は限 り ません。 BKPT 0xAB ARMv7-M 用、 Thumb-2 のみ Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 制約条件 ARMv7 よ り 前の ARM プ ロ セ ッ サでは、 SVC 命令を使用 し てセ ミ ホ ス テ ィ ン グ 呼び出 し を行い ます。 ただ し 、 Cortex M プ ロ フ ァ イ ルプ ロ セ ッ サ用に コ ンパ イ ル し てい る 場合、 セ ミ ホ ス テ ィ ン グは BKPT 命令を使用 し て実装 さ れ ます。 例 char buffer[100]; ... void foo(void) { __semihost(0x01, (const void *)buf); // equivalent in thumb state to // int __svc(0xAB) my_svc(int, int *); // result = my_svc(0x1, &buffer); } オプシ ョ ン --thumb を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 以下の コ ー ド が生成 さ れ ます。 ||foo|| PROC ... LDR MOVS SVC ... |L1.12| ... buffer % r1,|L1.12| r0,#1 #0xab 400 関連項目 • 「--cpu=list」 (ページ 2-34) • • • • • 4.7.32 「--thumb」 (ページ 2-136) 「__svc」 (ページ 4-18) 『アセ ンブ ラ ガ イ ド 』 の 「BKPT」 (ページ 4-141) 『アセ ンブ ラ ガ イ ド 』 の 「SVC」 (ページ 4-142) 『デベ ロ ッ パガ イ ド 』 の第 8 章 セ ミ ホ ス テ ィ ン グ __sev こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に SEV 命令を挿入 し ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-105 コ ンパイ ラ固有の機能 構文 void __sev(void) エラー SEV 命令をサポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __sev コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れます。 関連項目 • 「__nop」 (ページ 4-95) • • • • 「__wfe」 (ページ 4-115) 「__wfi」 (ページ 4-115) 「__yield」 (ページ 4-116) 『アセ ンブ ラ ガ イ ド 』 の 「NOP、 SEV、 WFE、 WFI、 YIELD」 (ページ 4-152) 4.7.33 __sqrt こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに VFP VSQRT 命令を挿入 し ます。 コ ンパ イ ラ 組み込み関数を使用 す る と 、 C ま たは C++ コ ー ド 内に含ま れ る 倍精度浮動小数点値の平方根を取 得で き ます。 注 __sqrt コ ンパ イ ラ 組み込み関数は、 標準的な C ラ イ ブ ラ リ 関数 sqrt のアナ ロ グです。 標準 ラ イ ブ ラ リ 関数では、 __sqrt の呼び出 し に対す る 、 VFP コ プ ロ セ ッ サ を装備 し た ARM アーキ テ ク チ ャ ベース のプ ロ セ ッ サ上のシ ン グル、 イ ン ラ イ ン、 マシ ン命令への コ ンパ イ ルが保証 さ れてい ますが、 こ れは異な り ます。 構文 double __sqrt(double val) 各パ ラ メ ー タ には以下の意味があ り ます。 val 4-106 倍精度浮動小数点値を指定 し ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 戻り値 __sqrt コ ンパ イ ラ 組み込み関数を使用す る と 、 double と し て val の平方根が返 さ れ ます。 エラー VFP コ プ ロ セ ッ サ を装備 し ていない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __sqrt コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れ ます。 関連項目 • 「__sqrtf」 • 4.7.34 『アセ ンブ ラ ガ イ ド 』 の 「VABS、 VNEG、 VSQRT」 (ページ 5-112) __sqrtf こ の コ ンパ イ ラ 組み込み関数は、 __sqrtf 組み込み関数の単精度バージ ョ ン で す。 機能的には、 以下の点を除いて __sqrt と 同 じ です。 • こ の関数は、 double 型の引数の代わ り に、 float 型の引数を取 り ます。 • double 値の代わ り に、 float 値を返 し ます。 関連項目 「__sqrt」 (ページ 4-106) • • 4.7.35 『アセ ンブ ラ ガ イ ド 』 の 「VABS、 VNEG、 VSQRT」 (ページ 5-112) __ssat こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に SSAT 命令を挿入 し ます。 コ ンパ イ ラ 組み込み関数を使用す る と 、 C ま たは C++ コ ー ド 内か ら の符号つ き の値をサチ ュ レー ト で き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-107 コ ンパイ ラ固有の機能 構文 int __ssat(int val, unsigned int sat) 各パ ラ メ ー タ には以下の意味があ り ます。 val サチ ュ レー ト さ れ る 値を指定 し ます。 sat サチ ュ レー ト さ せ る ビ ッ ト 位置を指定 し ます。 sat は 1 ~ 32 の範囲で指定す る 必要があ り ます。 戻り値 __ssat コ ンパ イ ラ 組み込み関数を使用す る と 、 符号つ き 範囲 –2sat–1 ? x ? 2sat–1 –1 にサチ ュ レー ト さ れた val が返 さ れます。 エラー SSAT 命令をサポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __ssat コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れ ます。 関連項目 • 「__usat」 (ページ 4-114) • 4.7.36 『アセ ンブ ラ ガ イ ド 』 の 「SSAT、 USAT」 (ページ 4-103) __strex こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに STREX[size] 形式の命令を挿入 し ます。 C ま たは C++ コ ー ド の STREX 命令を使用 し て、 デー タ を メ モ リ に ス ト アで き ます。 構文 int __strex(unsigned int val, volatile void *ptr) 各パ ラ メ ー タ には以下の意味があ り ます。 val 4-108 メ モ リ に書 き 込む値を指定 し ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 メ モ リ に書 き 込まれ る デー タ のア ド レ ス を指 し ます。 書 き 込まれ る デー タ のサ イ ズ を指定す る には、 パ ラ メ ー タ を適切な整数型 にキ ャ ス ト し ます。 ptr 表 4-11 __strex コ ンパイ ラ組み込み関数によ っ てサポー ト さ れる ア ク セス幅 命令 ス ト ア さ れたデー タ のサイ ズ C のキ ャ ス ト STREXB 符号な し バ イ ト (char *) STREXH 符号な し ハーフ ワ ー ド (short *) STREX ワー ド (int *) 戻り値 __strex コ ンパ イ ラ 組み込み関数は、 以下を返 し ます。 0 STREX 命令が正 し く 実行 さ れた場合 1 STREX 命令が ロ ッ ク ア ウ ト さ れた場合 エラー STREX 命令を サポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __strex コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れ ます。 __strex コ ンパ イ ラ 組み込み関数は、 ダブル ワー ド デー タ へのア ク セ ス をサ ポー ト し ません。 サポー ト さ れないア ク セ ス幅を指定す る と 、 コ ンパ イ ラ に よ っ てエ ラ ーが生成 さ れます。 例 int foo(void) { int loc=0xff; return(!__strex(0x20, (volatile char *)loc)); } コ マ ン ド ラ イ ン オプシ ョ ン --cpu=6k を使用 し て こ の コ ー ド を コ ンパ イ ルす る と 、 以下の コ ー ド が生成 さ れます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-109 コ ンパイ ラ固有の機能 ||foo|| PROC MOV MOV STREXB RSBS MOVCC BX ENDP r0,#0xff r2,#0x20 r1,r2,[r0] r0,r1,#1 r0,#0 lr 関連項目 • 「__ldrex」 (ページ 4-89) 「__ldrexd」 (ページ 4-91) 「__strexd」 『アセ ンブ ラ ガ イ ド 』 の 「LDREX と STREX」 (ページ 4-40) • • • 4.7.37 __strexd こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに STREXD 命令を挿入 し ます。 C ま たは C++ コ ー ド の STREXD 命令 を使用 し て、 デー タ を メ モ リ に ス ト アで き ます。 メ モ リ へのダブル ワ ー ド デー タ の排他的ス ト アがサポー ト さ れてい ます。 構文 int __strexd(unsigned long long val, volatile void *ptr) 各パ ラ メ ー タ には以下の意味があ り ます。 val メ モ リ に書 き 込む値を指定 し ます。 ptr メ モ リ に書 き 込まれ る デー タ のア ド レ ス を指 し ます。 書 き 込まれ る デー タ のサ イ ズ を指定す る には、 パ ラ メ ー タ を適切な整数型 にキ ャ ス ト し ます。 表 4-12 __strexd コ ンパイ ラ組み込み関数によ っ てサポー ト さ れる ア ク セス幅 4-110 命令 ス ト ア さ れたデー タ のサイ ズ C のキ ャ ス ト STREXD 符号な し long long (unsigned long long *) STREXD 符号付 き long long (signed long long *) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 戻り値 __strexd コ ンパ イ ラ 組み込み関数は、 以下を返 し ます。 0 STREXD 命令が正 し く 実行 さ れた場合 1 STREXD 命令が ロ ッ ク ア ウ ト さ れた場合 エラー STREXD 命令を サポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ン パ イ ラ は __strexd コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れ ます。 __strexd コ ンパ イ ラ 組み込み関数は、 ダブル ワー ド デー タ へのア ク セ ス のみ をサポー ト し ます。 サポー ト さ れないア ク セ ス幅を指定す る と 、 コ ンパ イ ラ に よ っ てエ ラ ーが生成 さ れます。 関連項目 • 「__ldrex」 (ページ 4-89) • • • 4.7.38 「__ldrexd」 (ページ 4-91) 「__strex」 (ページ 4-108) 『アセ ンブ ラ ガ イ ド 』 の 「LDREX と STREX」 (ページ 4-40) __strt こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に STR{size}T 形式のアセ ン ブ リ 言語命令を挿入 し ます。 STRT 命令 を使用 し て、 デー タ を C ま たは C++ コ ー ド の メ モ リ に ス ト アで き ます。 構文 void __strt(unsigned int val, volatile void *ptr) 各パ ラ メ ー タ には以下の意味があ り ます。 val ARM DUI 0348BJ ID 1 0 0 4 1 9 メ モ リ に書 き 込む値を指定 し ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-111 コ ンパイ ラ固有の機能 メ モ リ に書 き 込まれ る デー タ のア ド レ ス を指 し ます。 書 き 込まれ る デー タ のサ イ ズ を指定す る には、 パ ラ メ ー タ を適切な整数型 にキ ャ ス ト し ます。 ptr 表 4-13 __strt コ ンパイ ラ組み込み関数によ っ てサポー ト さ れる ア ク セス幅 命令 ロー ド さ れたデー タ のサイ ズ C のキ ャ ス ト STRBT 符号な し バ イ ト (char *) STRHT 符号な し ハーフ ワー ド (short int *) STRT ワー ド (int *) エラー STRT 命令をサポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __strt コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れ ます。 __strt コ ンパ イ ラ 組み込み関数は、 符号つ き デー タ お よ びダブル ワー ド デー タ へのア ク セ ス をサポー ト し ません。 サポー ト さ れないア ク セ ス幅を指定す る と 、 コ ンパ イ ラ に よ っ てエ ラ ーが生成 さ れます。 例 void foo(void) { int loc=0xff; __strt(0x20, (volatile char *)loc); } こ の コ ー ド を コ ンパ イ ルす る と 、 以下が生成 さ れます。 ||foo|| PROC MOV MOV STRBT BX ENDP 4-112 r0,#0xff r1,#0x20 r1,[r0],#0 lr Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 関連項目 • 「--thumb」 (ページ 2-136) 『アセ ンブ ラ ガ イ ド 』 の 「LDR と STR (ユーザモー ド )」 (ページ 4-18) • 4.7.39 __swp こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に SWP{size} 命令を挿入 し ます。 コ ンパ イ ラ 組み込み関数を使用 す る と 、 C ま たは C++ コ ー ド 内か ら のデー タ を メ モ リ 位置間で ス ワ ッ プで き ます。 注 ARMv6 以降では、 SWP お よ び SWPB の使用はお勧めで き ません。 構文 unsigned int __swp(unsigned int val, volatile void *ptr) 各パ ラ メ ー タ には以下の意味があ り ます。 val メ モ リ に書 き 込まれ る デー タ 値を指定 し ます。 ptr メ モ リ に書 き 込まれ る デー タ のア ド レ ス を指 し ます。 書 き 込まれ る デー タ のサ イ ズ を指定す る には、 パ ラ メ ー タ を適切な整数型 にキ ャ ス ト し ます。 表 4-14 __swp コ ンパイ ラ組み込み関数によ っ てサポー ト さ れる ア ク セス幅 命令 ロー ド さ れたデー タ のサイ ズ C のキ ャ ス ト SWPB 符号な し バ イ ト (char *) SWP ワー ド (int *) 戻り値 __swp コ ンパ イ ラ 組み込み関数を使用す る と 、 val に よ っ て上書 き さ れ る 前に、 ptr に よ っ て示 さ れた メ モ リ ア ド レ ス にあ る デー タ 値が返 さ れ ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-113 コ ンパイ ラ固有の機能 例 int foo(void) { int loc=0xff; return(__swp(0x20, (volatile int *)loc)); } こ の コ ー ド を コ ンパ イ ルす る と 、 以下が生成 さ れます。 ||foo|| PROC MOV MOV SWP BX ENDP r1, #0xff r0, #0x20 r0, r0, [r1] lr 関連項目 • 4.7.40 『アセ ンブ ラ ガ イ ド 』 の 「SWP と SWPB」 (ページ 4-44) __usat こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに USAT 命令を挿入 し ます。 コ ンパ イ ラ 組み込み関数を使用す る と 、 C ま たは C++ コ ー ド 内か ら の符号な し の値を サチ ュ レー ト で き ます。 構文 int __usat(unsigned int val, unsigned int sat) 各パ ラ メ ー タ には以下の意味があ り ます。 val サチ ュ レー ト さ れ る 値を指定 し ます。 sat サチ ュ レー ト さ せ る ビ ッ ト 位置を指定 し ます。 usat は 0 ~ 31 の範囲で指定す る 必要があ り ます。 戻り値 __usat コ ンパ イ ラ 組み込み関数を使用す る と 、 符号な し 範囲 0 ? x ? 2sat–1 –1 に サチ ュ レー ト さ れた val が返 さ れます。 4-114 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 エラー USAT 命令を サポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __usat コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れ ます。 関連項目 • 「__ssat」 (ページ 4-107) • 4.7.41 『アセ ンブ ラ ガ イ ド 』 の 「SSAT、 USAT」 (ページ 4-103) __wfe こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に WFE 命令を挿入 し ます。 v6T2 アーキ テ ク チ ャ では、 WFE 命令は NOP 命令 と し て実行 さ れます。 構文 void __wfe(void) エラー WFE 命令を サポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __wfe コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れます。 関連項目 「__wfi」 • • • • • 「__nop」 (ページ 4-95) 「__sev」 (ページ 4-105) 「__yield」 (ページ 4-116) 『アセ ンブ ラ ガ イ ド 』 の 「NOP、 SEV、 WFE、 WFI、 YIELD」 (ページ 4-152) 4.7.42 __wfi こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ーム に WFI 命令を挿入 し ます。 v6T2 アーキ テ ク チ ャ では、 WFI 命令は NOP 命令 と し て実行 さ れます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-115 コ ンパイ ラ固有の機能 構文 void __wfi(void) エラー WFI 命令をサポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __wfi コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れます。 関連項目 • 「__yield」 • • • • 「__nop」 (ページ 4-95) 「__sev」 (ページ 4-105) 「__wfe」 (ページ 4-115) 『アセ ンブ ラ ガ イ ド 』 の 「NOP、 SEV、 WFE、 WFI、 YIELD」 (ページ 4-152) 4.7.43 __yield こ の コ ンパ イ ラ 組み込み関数を使用 し て、 コ ンパ イ ラ に よ っ て生成 さ れ る 命 令ス ト リ ームに YIELD 命令を挿入 し ます。 構文 void __yield(void) エラー YIELD 命令をサポー ト し ない タ ーゲ ッ ト 向けに コ ンパ イ ル さ れ る 場合、 コ ンパ イ ラ は __yield コ ンパ イ ラ 組み込み関数を認識 し ません。 こ の場合、 コ ンパ イ ラ に よ っ て警告ま たはエ ラ ーが生成 さ れ ます。 関連項目 • 「__nop」 (ページ 4-95) • • • • 「__sev」 (ページ 4-105) 「__wfe」 (ページ 4-115) 「__wfi」 (ページ 4-115) 『アセ ンブ ラ ガ イ ド 』 の 「NOP、 SEV、 WFE、 WFI、 YIELD」 (ページ 4-152) 4-116 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.7.44 ARMv6 SIMD コ ンパイ ラ 組み込み関数 ARM アーキ テ ク チ ャ v6 命令セ ッ ト アーキ テ ク チ ャ は、 高パフ ォーマ ン ス メ デ ィ ア アプ リ ケーシ ョ ンの ソ フ ト ウ ェ ア実装効率化のため、 60 以上の SIMD 命令を ARMv6 に追加 し ます。 ARM コ ンパ イ ラ は、 ARMv6 SIMD 命令に対応す る コ ンパ イ ラ の組み込み関 数を サポー ト し ます。 こ れ ら の コ ンパ イ ラ 組み込み関数は、 ARMv6 アーキ テ ク チ ャ ま たはプ ロ セ ッ サ用に コ ー ド を コ ンパ イ ルす る 場合に使用で き ます。 以下の リ ス ト には、 こ れ ら の コ ンパ イ ラ 組み込み関数のプ ロ ト タ イ プ を示 し ます。 こ の リ ス ト の関数プ ロ ト タ イ プは、 コ ンパ イ ラ 組み込み関数に よ っ て 実行 さ れた ARMv6 命令のプ リ ミ テ ィ ブ ま たは基本形式について説明 し ます。 コ ンパ イ ラ 組み込み関数に よ っ て実行 さ れた基本的な命令の名前を取得す る には、 コ ンパ イ ラ 組み込み関数名か ら 先頭のア ン ダース コ ア を削除 し ます (__)。 例えば、 __qadd16 コ ンパ イ ラ 組み込み関数は、 ARMv6 QADD16 命令に対応 し ます。 注 各 ARMv6 SIMD コ ンパ イ ラ 組み込み関数は、 ARM v6 アーキ テ ク チ ャ ま たは プ ロ セ ッ サのシ ン グル、 イ ン ラ イ ン、 マシ ン命令への コ ンパ イ ルが保証 さ れ てい ます。 ただ し 機会があれば、 コ ンパ イ ラ は、 ベース と な る 命令の最適化 さ れた形式を使用す る 可能性があ り ます。 ARMv6 SIMD 命令は、 Application Program Status Register (APSR) の GE[3:0] ビ ッ ト を設定で き ます。 SIMD 命令は、 こ れ ら の フ ラ グ を更新 し て、 SIMD 演 算の各 8/16 ビ ッ ト ス ラ イ ス に対 し " 等 し いか よ り 大 き い " ス テー タ ス を示 し ます。 ARM コ ンパ イ ラ は、 GE[3:0] ビ ッ ト を グ ロ ーバル変数 と し て処理 し ます。 C ま たは C++ プ ロ グ ラ ム内か ら こ れ ら の ビ ッ ト にア ク セ スす る には、 以下のいず れか を実行 し ます。 • 名前付 き レ ジ ス タ 変数を通 じ て APSR の ビ ッ ト 16 ~ 19 にア ク セ ス し ま す。 • __sel コ ンパ イ ラ 組み込み関数を使用 し て、 SEL 命令を制御 し ます。 unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned ARM DUI 0348BJ ID 1 0 0 4 1 9 int int int int int int int int __qadd16(unsigned int, unsigned int) __qadd8(unsigned int, unsigned int) __qasx(unsigned int, unsigned int) __qsax(unsigned int, unsigned int) __qsub16(unsigned int, unsigned int) __qsub8(unsigned int, unsigned int) __sadd16(unsigned int, unsigned int) __sadd8(unsigned int, unsigned int) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-117 コ ンパイ ラ固有の機能 unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned 4-118 int __sasx(unsigned int, unsigned int) int __sel(unsigned int, unsigned int) int __shadd16(unsigned int, unsigned int) int __shadd8(unsigned int, unsigned int) int __shasx(unsigned int, unsigned int) int __shsax(unsigned int, unsigned int) int __shsub16(unsigned int, unsigned int) int __shsub8(unsigned int, unsigned int) int __smlad(unsigned int, unsigned int, unsigned int) long long __smlald(unsigned int, unsigned int, unsigned long long) int __smlsd(unsigned int, unsigned int, unsigned int) long long __smlsld(unsigned int, unsigned int, unsigned long long) int __smuad(unsigned int, unsigned int) int __smusd(unsigned int, unsigned int) int __ssat16(unsigned int, unsigned int) int __ssax(unsigned int, unsigned int) int __ssub16(unsigned int, unsigned int) int __ssub8(unsigned int, unsigned int) int __sxtab16(unsigned int, unsigned int) int __sxtb16(unsigned int, unsigned int) int __uadd16(unsigned int, unsigned int) int __uadd8(unsigned int, unsigned int) int __uasx(unsigned int, unsigned int) int __uhadd16(unsigned int, unsigned int) int __uhadd8(unsigned int, unsigned int) int __uhasx(unsigned int, unsigned int) int __uhsax(unsigned int, unsigned int) int __uhsub16(unsigned int, unsigned int) int __uhsub8(unsigned int, unsigned int) int __uqadd16(unsigned int, unsigned int) int __uqadd8(unsigned int, unsigned int) int __uqasx(unsigned int, unsigned int) int __uqsax(unsigned int, unsigned int) int __uqsub16(unsigned int, unsigned int) int __uqsub8(unsigned int, unsigned int) int __usad8(unsigned int, unsigned int) int __usada8(unsigned int, unsigned int, unsigned int) int __usax(unsigned int, unsigned int) int __usat16(unsigned int, unsigned int) int __usub16(unsigned int, unsigned int) int __usub8(unsigned int, unsigned int) int __uxtab16(unsigned int, unsigned int) int __uxtb16(unsigned int, unsigned int) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 関連項目 • 「名前付 き レ ジ ス タ 変数」 (ページ 4-122) 『アセ ンブ ラ ガ イ ド 』 の 「レ ジ ス タ 」 (ページ 2-7) 『アセ ンブ ラ ガ イ ド 』 の 「SEL」 (ページ 4-70) 『アセ ンブ ラ ガ イ ド 』 の第 5 章 NEON と VFP プ ロ グ ラ ミ ン グ • • • 4.7.45 ETSI の基本操作 RVCT では、 ETSI G.729 勧告 『Coding of speech at 8 kbit/s using conjugate-structure algebraic-code-excited linear prediction (CS-ACELP)』 で説明 さ れてい る 元の ETSI フ ァ ミ リ の基本操作をサポー ト し てい ます。 ユーザ コ ー ド 内で ETSI の基本操作を使用す る には、 dspfns.h 標準ヘ ッ ダ フ ァ イ ルを イ ン ク ルー ド し ます。 dspfns.h に提供 さ れてい る コ ンパ イ ラ 組み込み関 数は、 表 4-15 に リ ス ト さ れてい ます。 表 4-15 RVCT でサポー ト さ れる ETSI の基本操作 コ ンパイ ラ組み込み関数 ARM DUI 0348BJ ID 1 0 0 4 1 9 abs_s L_add_c L_mult L_sub_c norm_l add L_deposit_h L_negate mac_r round div_s L_deposit_l L_sat msu_r saturate extract_h L_mac L_shl mult shl extract_l L_macNs L_shr mult_r shr L_abs L_msu L_shr_r negate shr_r L_add L_msuNs L_sub norm_s sub Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-119 コ ンパイ ラ固有の機能 ヘ ッ ダ フ ァ イ ル dspfns.h も 、 C ま たは C++ プ ロ グ ラ ム で使用す る ためのグ ロ ーバル変数 と し て、 特定の ス テー タ ス フ ラ グ を公開 し ます。 dspfns.h に よ っ て公開 さ れた ス テー タ ス フ ラ グは、 表 4-16 に リ ス ト さ れてい ます。 表 4-16 RVCT で公開 さ れた ETSI ス テー タ ス フ ラ グ ス テー タ ス フ ラ グ 説明 Overflow オーバーフ ロ ース テー タ ス フ ラ グ 通常、 サチ ュ レー ト 関数には、 オーバーフ ロ ーについて固定 作用があ り ます。 Carry キ ャ リ ース テー タ ス フ ラ グ 例 #include <limits.h> #include <stdint.h> #include <dspfns.h> // include ETSI basic operations int32_t C_L_add(int32_t a, int32_t b) { int32_t c = a + b; if (((a ^ b) & INT_MIN) == 0) { if ((c ^ a) & INT_MIN) { c = (a < 0) ? INT_MIN : INT_MAX; } } return c; } __asm int32_t asm_L_add(int32_t a, int32_t b) { qadd r0, r0, r1 bx lr } int32_t foo(int32_t a, int32_t b) { int32_t c, d, e, f; Overflow = 0; // set global overflow flag c = C_L_add(a, b); // C saturating add d = asm_L_add(a, b); // assembly language saturating add e = __qadd(a, b); // ARM intrinsic saturating add f = L_add(a, b); // ETSI saturating add return Overflow ? -1 : c == d == e == f; // returns 1, unless overflow } 4-120 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 関連項目 • C コ ー ド お よ び コ ンパ イ ラ 組み込み関数の組み合わせ と し ての ETSI 基 本操作の定義のためのヘ ッ ダ フ ァ イ ル dspfns.h • 『 コ ンパ イ ラ ユーザガ イ ド 』 の 「ETSI の基本操作」 (ページ 4-7) • ETSI G.191 勧告 : 『Software tools for speech and audio coding standardization』 • 『ITU-T Software Tool Library 2005 User's manual』。 ETSI G.191 勧告の一部 と し て含まれてい ます。 4.7.46 • ETSI G723.1 勧告 : 『Dual rate speech coder for multimedia communications transmitting at 5.3 and 6.3 kbit/s』 • ETSI G.729 勧告 : 『Coding of speech at 8 kbit/s using conjugate-structure algebraic-code-excited linear prediction (CS-ACELP)』 C55x コ ンパイ ラ組み込み関数 ARM コ ンパ イ ラ は、 選択 し た TI C55x コ ンパ イ ラ 組み込み関数のエ ミ ュ レー シ ョ ン をサポー ト し ます。 ユーザ コ ー ド 内で TI C55x コ ンパ イ ラ 組み込み関数を使用す る には、 標準の ヘ ッ ダ フ ァ イ ル c55x.h を イ ン ク ルー ド し ます。 c55x.h に提供 さ れてい る コ ンパ イ ラ 組み込み関数は、 表 4-17 に リ ス ト さ れてい ます。 表 4-17 RVCT でサポー ト さ れてい る TI C55x コ ンパイ ラ組み込み関数 コ ンパイ ラ組み込み関数 ARM DUI 0348BJ ID 1 0 0 4 1 9 _abss _lshrs _rnd _smas _count _lsadd _norm _smpy _divs _lsmpy _round _sneg _labss _lsneg _roundn _sround _lmax _lsshl _sadd _sroundn _lmin _lssub _shl _sshl _lnorm _max _shrs _ssub _lshl _min _smac Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-121 コ ンパイ ラ固有の機能 例 #include <limits.h> #include <stdint.h> #include <c55x.h> // include TI C55x intrinsics __asm int32_t asm_lsadd(int32_t a, int32_t b) { qadd r0, r0, r1 bx lr} int32_t foo(int32_t a, int32_t b) { int32_t c, d, e; c = asm_lsadd(a, b); // assembly language saturating add d = __qadd(a, b); // ARM intrinsic saturating add e = _lsadd(a, b); // TI C55x saturating add return c == d == e; // returns 1 } 関連項目 4.7.47 • C55x コ ンパ イ ラ 組み込み関数の ARM 実装の詳細についてのヘ ッ ダ フ ァ イ ル c55x.h • TI の コ ンパ イ ラ 組み込み機能に関す る 出版物は、 Texas Instruments 社の Web サ イ ト http://www.ti.com か ら 入手で き ます。 名前付き レ ジ ス タ 変数 コ ンパ イ ラ を使用す る と 、 名前付 き レ ジ ス タ 変数を使用 し て、 ARM アーキ テ ク チ ャ ベース のプ ロ セ ッ サの レ ジ ス タ にア ク セ ス で き ます。 名前付 き レ ジ ス タ 変数は、 サポー ト さ れてい ます。 • フ ァ イ ルの有効範囲内 • 関数パ ラ メ ー タ 上ではな く ロ ーカルの有効範囲内です。 構文 register type var-name __asm(reg); 各パ ラ メ ー タ には以下の意味があ り ます。 type 名前付 き レ ジ ス タ 変数の型を指定 し ます。 レ ジ ス タ に名前を付け る 際、 同サ イ ズであればいずれの型で も 、 名前付 き レ ジ ス タ 変数の宣言に使用で き ます。 型は構造体で も 可 能ですが、 ビ ッ ト フ ィ ール ド の レ イ ア ウ ト はエ ンデ ィ ア ン方式 に関連 し ます。 4-122 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 var-name 名前付 き レ ジ ス タ 変数の名前を指定 し ます。 reg ARM アーキ テ ク チ ャ ベース のプ ロ セ ッ サ上の レ ジ ス タ 名を示す 文字列を指定 し ます。 表 4-18 に、 ARM アーキ テ ク チ ャ ベース のプ ロ セ ッ サの名前付 き レ ジ ス タ 変数 と 一緒に使用で き る レ ジ ス タ を示 し ます。 表 4-18 ARM アーキテ ク チ ャ ベースのプ ロ セ ッ サで使用可能な名前付き レ ジ ス タ ARM DUI 0348BJ ID 1 0 0 4 1 9 レジス タ __asm の文字列 プロセ ッサ CPSR "cpsr" ま たは "apsr" すべてのプ ロ セ ッ サ BASEPRI "basepri" Cortex-M3 BASEPRI_MAX "basepri_max" Cortex-M3 CONTROL "control" Cortex-M1、 Cortex-M3 EAPSR "eapsr" Cortex-M1、 Cortex-M3 EPSR "epsr" Cortex-M1、 Cortex-M3 FAULTMASK "faultmask" Cortex-M3 IAPSR "iapsr" Cortex-M1、 Cortex-M3 IEPSR "iepsr" Cortex-M1、 Cortex-M3 IPSR "ipsr" Cortex-M1、 Cortex-M3 MSP "msp" Cortex-M1、 Cortex-M3 PRIMASK "primask" Cortex-M1、 Cortex-M3 PSP "psp" Cortex-M1、 Cortex-M3 r0 ~ r12 "r0" ~ "r12" すべてのプ ロ セ ッ サ r13 ま たは sp "r13" ま たは "sp" すべてのプ ロ セ ッ サ r14 ま たは lr "r14" or "lr" すべてのプ ロ セ ッ サ r15 ま たは pc "r15" or "pc" すべてのプ ロ セ ッ サ SPSR "spsr" すべてのプ ロ セ ッ サ XPSR "xpsr" Cortex-M1、 Cortex-M3 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-123 コ ンパイ ラ固有の機能 VFP を持つ タ ーゲ ッ ト では、 表 4-19 の レ ジ ス タ も 名前付 き レ ジ ス タ 変数 と 一緒に使用で き ます。 表 4-19 VFP を持つ タ ーゲ ッ ト で使用可能な名前付き レ ジ ス タ レ ジス タ __asm の文字列 FPSID "fpsid" FPSCR "fpscr" FPEXC "fpexc" 例 void foo(void) { register int foo __asm("r0"); } こ の例では、 foo は、 レ ジ ス タ r0 の名前付 き レ ジ ス タ 変数 と し て宣言 さ れ ま す。 関連項目 • 4-124 『コ ンパ イ ラ ユーザガ イ ド 』 の 「名前付 き レ ジ ス タ 変数」 (ページ 4-11) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.8 VFP ス テー タ ス組み込み関数 コ ンパ イ ラ には、 浮動小数点ス テー タ ス / 制御レ ジ ス タ (FPSCR) を読み出すた めの組み込み関数が用意 さ れてい ます。 注 こ の レ ジ ス タ を読み出す代わ り の方法 と し て、 名前付 き レ ジ ス タ 変数を使用 す る こ と をお勧め し ます。 こ う す る こ と に よ り 、 レ ジ ス タ に効率的にア ク セ ス で き る よ う にな り ます。 詳細については、 「名前付 き レ ジ ス タ 変数」 (ペー ジ 4-122) を参照 し て下 さ い。 4.8.1 __vfp_status こ の組み込み関数は FPSCR を読み出 し ます。 構文 unsigned int __vfp_status(unsigned int mask, unsigned int flags); エラー VFP のない タ ーゲ ッ ト を コ ンパ イ ルす る と き に、 こ の組み込み関数を使用 し よ う と す る と 、 エ ラ ーが生成 さ れ ます。 関連項目 • 『ARM アーキ テ ク チ ャ リ フ ァ レ ン ス マニ ュ アル』 の FPSCR レ ジ ス タ に関 す る 説明 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-125 コ ンパイ ラ固有の機能 4.9 GNU 組み込み関数 以下の関数は、 GNU ラ イ ブ ラ リ ヘ ッ ダ フ ァ イ ルへの互換性を提供 し ます。 4.9.1 標準以外の関数 __builtin_alloca(), __builtin_bcmp(), __builtin_exit(), __builtin_gamma(), __builtin_gammaf(), __builtin_gammal(), __builtin_index(), __builtin_rindex(), __builtin_strcasecmp(), __builtin_strncasecmp() 4.9.2 C99 の関数 __builtin_Exit(), __builtin_acoshf(), __builtin_acoshl(), __builtin_acosh(), __builtin_asinhf(), __builtin_asinhl(), __builtin_asinh(), __builtin_atanhf(), __builtin_atanhl(), __builtin_atanh(), __builtin_cabsf(), __builtin_cabsl(), __builtin_cabs(), __builtin_cacosf(), __builtin_cacoshf(), __builtin_cacoshl(), __builtin_cacosh(), __builtin_cacosl(), __builtin_cacos(), __builtin_cargf(), __builtin_cargl(), __builtin_carg(), __builtin_casinf(), __builtin_casinhf(), __builtin_casinhl(), __builtin_casinh(), __builtin_casinl(), __builtin_casin(), __builtin_catanf(), __builtin_catanhf(), __builtin_catanhl(), __builtin_catanh(), __builtin_catanl(), __builtin_catan(), __builtin_cbrtf(), __builtin_cbrtl(), __builtin_cbrt(), __builtin_ccosf(), __builtin_ccoshf(), __builtin_ccoshl(), __builtin_ccosh(), __builtin_ccosl(), __builtin_ccos(), __builtin_cexpf(), __builtin_cexpl(), __builtin_cexp(), __builtin_cimagf(), __builtin_cimagl(), __builtin_cimag(), __builtin_clogf(), __builtin_clogl(), __builtin_clog(), __builtin_conjf(), __builtin_conjl(), __builtin_conj(), __builtin_copysignf(), __builtin_copysignl(), __builtin_copysign(), __builtin_cpowf(), __builtin_cpowl(), __builtin_cpow(), __builtin_cprojf(), __builtin_cprojl(), __builtin_cproj(), __builtin_crealf(), __builtin_creall(), __builtin_creal(), __builtin_csinf(), __builtin_csinhf(), __builtin_csinhl(), __builtin_csinh(), __builtin_csinl(), __builtin_csin(), __builtin_csqrtf(), __builtin_csqrtl(), __builtin_csqrt(), __builtin_ctanf(), __builtin_ctanhf(), __builtin_ctanhl(), __builtin_ctanh(), __builtin_ctanl(), __builtin_ctan(), __builtin_erfcf(), __builtin_erfcl(), __builtin_erfc(), __builtin_erff(), __builtin_erfl(), __builtin_erf(), __builtin_exp2f(), __builtin_exp2l(), __builtin_exp2(), __builtin_expm1f(), __builtin_expm1l(), __builtin_expm1(), __builtin_fdimf(), __builtin_fdiml(), __builtin_fdim(), __builtin_fmaf(), __builtin_fmal(), __builtin_fmaxf(), __builtin_fmaxl(), __builtin_fmax(), __builtin_fma(), __builtin_fminf(), __builtin_fminl(), __builtin_fmin(), __builtin_hypotf(), __builtin_hypotl(), __builtin_hypot(), __builtin_ilogbf(), __builtin_ilogbl(), __builtin_ilogb(), __builtin_imaxabs(), __builtin_isblank(), __builtin_isfinite(), __builtin_isinf(), __builtin_isnan(), __builtin_isnanf(), __builtin_isnanl(), __builtin_isnormal(), __builtin_iswblank(), __builtin_lgammaf(), __builtin_lgammal(), __builtin_lgamma(), __builtin_llabs(), __builtin_llrintf(), __builtin_llrintl(), __builtin_llrint(), __builtin_llroundf(), __builtin_llroundl(), __builtin_llround(), __builtin_log1pf(), __builtin_log1pl(), __builtin_log1p(), __builtin_log2f(), __builtin_log2l(), __builtin_log2(), __builtin_logbf(), __builtin_logbl(), 4-126 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 __builtin_logb(), __builtin_lrintf(), __builtin_lrintl(), __builtin_lrint(), __builtin_lroundf(), __builtin_lroundl(), __builtin_lround(), __builtin_nearbyintf(), __builtin_nearbyintl(), __builtin_nearbyint(), __builtin_nextafterf(), __builtin_nextafterl(), __builtin_nextafter(), __builtin_nexttowardf(), __builtin_nexttowardl(), __builtin_nexttoward(), __builtin_remainderf(), __builtin_remainderl(), __builtin_remainder(), __builtin_remquof(), __builtin_remquol(), __builtin_remquo(), __builtin_rintf(), __builtin_rintl(), __builtin_rint(), __builtin_roundf(), __builtin_roundl(), __builtin_round(), __builtin_scalblnf(), __builtin_scalblnl(), __builtin_scalbln(), __builtin_scalbnf(), __builtin_calbnl(), __builtin_scalbn(), __builtin_signbit(), __builtin_signbitf(), __builtin_signbitl(), __builtin_snprintf(), __builtin_tgammaf(), __builtin_tgammal(), __builtin_tgamma(), __builtin_truncf(), __builtin_truncl(), __builtin_trunc(), __builtin_vfscanf(), __builtin_vscanf(), __builtin_vsnprintf(), __builtin_vsscanf() 4.9.3 C90 予約済み名前空間の C99 の関数 __builtin_acosf(), __builtin_acosl(), __builtin_asinf(), __builtin_asinl(), __builtin_atan2f(), __builtin_atan2l(), __builtin_atanf(), __builtin_atanl(), __builtin_ceilf(), __builtin_ceill(), __builtin_cosf(), __builtin_coshf(), __builtin_coshl(), __builtin_cosl(), __builtin_expf(), __builtin_expl(), __builtin_fabsf(), __builtin_fabsl(), __builtin_floorf(), __builtin_floorl(), __builtin_fmodf(), __builtin_fmodl(), __builtin_frexpf(), __builtin_frexpl(), __builtin_ldexpf(), __builtin_ldexpl(), __builtin_log10f(), __builtin_log10l(), __builtin_logf(), __builtin_logl(), __builtin_modfl(), __builtin_modf(), __builtin_powf(), __builtin_powl(), __builtin_sinf(), __builtin_sinhf(), __builtin_sinhl(), __builtin_sinl(), __builtin_sqrtf(), sqrtl, __builtin_tanf(), __builtin_tanhf(), __builtin_tanhl(), __builtin_tanl() 4.9.4 C94 の関数 __builtin_swalnum(), __builtin_iswalpha(), __builtin_iswcntrl(), __builtin_iswdigit(), __builtin_iswgraph(), __builtin_iswlower(), __builtin_iswprint(), __builtin_iswpunct(), __builtin_iswspace(), __builtin_iswupper(), __builtin_iswxdigit(), __builtin_towlower(), __builtin_towupper() 4.9.5 C90 の関数 __builtin_abort(), __builtin_abs(), __builtin_acos(), __builtin_asin(), __builtin_atan2(), __builtin_atan(), __builtin_calloc(), __builtin_ceil(), __builtin_cosh(), __builtin_cos(), __builtin_exit(), __builtin_exp(), __builtin_fabs(), __builtin_floor(), __builtin_fmod(), __builtin_fprintf(), __builtin_fputc(), __builtin_fputs(), __builtin_frexp(), __builtin_fscanf(), __builtin_isalnum(), __builtin_isalpha(), __builtin_iscntrl(), __builtin_isdigit(), __builtin_isgraph(), __builtin_islower(), __builtin_isprint(), __builtin_ispunct(), __builtin_isspace(), ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-127 コ ンパイ ラ固有の機能 __builtin_isupper(), __builtin_isxdigit(), __builtin_tolower(), __builtin_toupper(), __builtin_labs(), __builtin_ldexp(), __builtin_log10(), __builtin_log(), __builtin_malloc(), __builtin_memchr(), __builtin_memcmp(), __builtin_memcpy(), __builtin_memset(), __builtin_modf(), __builtin_pow(), __builtin_printf(), __builtin_putchar(), __builtin_puts(), __builtin_scanf(), __builtin_sinh(), __builtin_sin(), __builtin_snprintf(), __builtin_sprintf(), __builtin_sqrt(), __builtin_sscanf(), __builtin_strcat(), __builtin_strchr(), __builtin_strcmp(), __builtin_strcpy(), __builtin_strcspn(), __builtin_strlen(), __builtin_strncat(), __builtin_strncmp(), __builtin_strncpy(), __builtin_strpbrk(), __builtin_strrchr(), __builtin_strspn(), __builtin_strstr(), __builtin_tanh(), __builtin_tan(), __builtin_vfprintf(), __builtin_vprintf(), __builtin_vsprintf() 4.9.6 C99 の浮動小数点関数 __builtin_huge_val(), __builtin_huge_valf(), __builtin_huge_vall(), __builtin_inf(), __builtin_nan(), __builtin_nanf(), __builtin_nanl(), __builtin_nans(), __builtin_nansf(), __builtin_nansl() 4.9.7 その他の組み込み関数 __builtin_clz(), __builtin_constant_p(), __builtin_ctz(), builtin_ctzl(), __builtin_ctzll(), __builtin_expect(), __builtin_ffs(), __builtin_ffsl(), __builtin_ffsll(), __builtin_frame_address(), __builtin_return_address(), __builtin_popcount(), __builtin_signbit() 4-128 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 4.10 コ ンパイ ラ によ る事前定義 こ の項では、 ARM コ ンパ イ ラ の定義済みのマ ク ロ の値について説明 し ます。 4.10.1 定義済みマ ク ロ 表 4-20 は、 C お よ び C++ 向けに ARM コ ンパ イ ラ で定義済みのマ ク ロ の名前 を示 し てい ます。 値フ ィ ール ド に記載がない場合は、 シ ン ボルが定義 さ れて い る だけです。 表 4-20 定義済みマ ク ロ 名前 値 定義 さ れる ケース __arm__ – --thumb オプシ ョ ンが指定 さ れ る 場合で も 、 ARM コ ンパ イ ラ で は常に定義 さ れます。 「__ARMCC_VERSION」 も 参照 し て下 さ い。 __ARMCC_VERSION ver 常に定義 さ れます。 10 進数値で、 リ リ ース ご と に増加 し ます。 値には PVbbbb 形式が使用 さ れます。 • P は メ ジ ャ ーバージ ョ ン を示 し ます。 • V はマ イ ナーバージ ョ ン を示 し ます。 • bbbb はビル ド 番号を示 し ます。 注 こ のマ ク ロ は、 バージ ョ ン番号を使用 し て、 __arm__ を定義す る RVCT と 他の ツールを区別す る のに使用で き ます。 __APCS_INTERWORK – --apcs /interwork オプシ ョ ン を指定 し てい る 場合、 ま たは CPU アーキ テ ク チ ャ を ARMv5T 以降に設定 し てい る 場合 __APCS_ROPI – --apcs /ropi オプシ ョ ン を指定 し てい る 場合 __APCS_RWPI – --apcs /rwpi オプシ ョ ン を指定 し てい る 場合 __APCS_FPIC – --apcs /fpic オプシ ョ ン を指定 し てい る 場合 __ARRAY_OPERATORS – C++ コ ンパ イ ラ モー ド で、 array new と delete が イ ネーブルな場 合 __BASE_FILE__ name 常に定義 さ れます。 現在の ソ ース フ ァ イ ルではな く 元の ソ ース フ ァ イ ルを示す こ と (つま り 、 現在の フ ァ イ ルが イ ン ク ルー ド さ れ る フ ァ イ ルの場合) 以外は、 __FILE__ と 同 じ です。 __BIG_ENDIAN – ビ ッ グエンデ ィ ア ン タ ーゲ ッ ト 向けに コ ンパ イ ル し てい る 場合 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-129 コ ンパイ ラ固有の機能 表 4-20 定義済みマ ク ロ (continued) 名前 値 定義 さ れる ケース _BOOL – C++ コ ンパ イ ラ モー ド で、 bool がキーワ ー ド であ る こ と を指定 す る 場合 __cplusplus – C++ コ ンパ イ ラ モー ド の場合 __CC_ARM 1 --thumb オプシ ョ ンが指定 さ れ る 場合で も 、 ARM コ ンパ イ ラ で は常に 1 に設定 さ れます。 __CHAR_UNSIGNED__ – GNU モー ド の場合。 char が符号な し の型であ る 場合にのみ定義 さ れます。 __DATE__ date 常に定義 さ れます。 __EDG__ – 常に定義 さ れます。 __EDG_IMPLICIT_USING_STD – C++ モー ド で、--implicit_using_std オプシ ョ ン を指定 し てい る 場合 __EDG_VERSION__ – Edison Design Group (EDG) フ ロ ン ト エン ド のバージ ョ ン番号 を表す整数値が常に設定 さ れます。 例えば、 バージ ョ ン 3.8 は 308 と 表 し ます。 EDG フ ロ ン ト エン ド のバージ ョ ン番号は RVCT ま たは RealView Development Suite のバージ ョ ン番号 と 一致す る必要はあ り ませ ん。 __EXCEPTIONS 1 C++ モー ド で、--exceptions オプシ ョ ン を指定 し てい る 場合 __FEATURE_SIGNED_CHAR – --signed_chars オプシ ョ ン を指定 し てい る 場合 (CHAR_MIN お よ び CHAR_MAX に よ っ て使用) __FILE__ name 常に文字列 リ テ ラ ル と し て定義 さ れます。 __FP_FAST – --fpmode=fast オプシ ョ ン を指定 し てい る 場合 __FP_FENV_EXCEPTIONS – --fpmode=ieee_full オプシ ョ ン、 ま たは --fpmode=ieee_fixed オプ シ ョ ン を指定 し てい る 場合 __FP_FENV_ROUNDING – --fpmode=ieee_full オプシ ョ ン を指定 し てい る 場合 __FP_IEEE – --fpmode=ieee_full、--fpmode=ieee_fixed、 ま たは --fpmode=ieee_no_fenv のいずれかのオプシ ョ ン を指定 し てい る 場合 __FP_INEXACT_EXCEPTION 4-130 – --fpmode=ieee_full オプシ ョ ン を指定 し てい る 場合 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 表 4-20 定義済みマ ク ロ (continued) 名前 値 定義 さ れる ケース __GNUC__ ver --gnu オプシ ョ ン を指定 し てい る 場合に、 使用 し てい る GNU モー ド の現在の メ ジ ャ ーバージ ョ ン を示す整数値が設定 さ れま す。 __GNUC_MINOR__ ver --gnu オプシ ョ ン を指定 し てい る 場合に、 使用 し てい る GNU モー ド の現在のマ イ ナーバージ ョ ン を示す整数値が設定 さ れま す。 __GNUG__ ver GNU モー ド で --cpp オプシ ョ ン を指定 し てい る 場合。 __GNUC__ と 同 じ 値を保持 し ます。 __IMPLICIT_INCLUDE – --implicit_include オプシ ョ ン を指定 し てい る 場合 __INTMAX_TYPE__ – GNU モー ド の場合。 intmax_t typedef の正 し い潜在型を定義 し ま す。 __LINE__ num 常に、 こ のマ ク ロ を含むコ ー ド 行の ソ ース行番号が設定 さ れま す。 __MODULE__ mod __FILE__ の値の フ ァ イ ル名部分が含まれます。 __NO_INLINE__ – GNU モー ド で --no_inline オプシ ョ ン を指定 し てい る 場合 __OPTIMISE_LEVEL num -Onum オプシ ョ ン を使用 し て最適化レベルを変更 し てい る 場合 を除いて、 デフ ォ ル ト では常に 2 に設定 さ れます。 __OPTIMISE_SPACE – -Ospace オプシ ョ ン を指定 し てい る 場合 __OPTIMISE_TIME – -Otime オプシ ョ ン を指定 し てい る 場合 __OPTIMIZE__ – GNU モー ド で -O1、-O2、 ま たは -O3 を指定 し てい る 場合 __OPTIMIZE_SIZE__ – GNU モー ド で -Ospace を指定 し てい る 場合 __PLACEMENT_DELETE – C++ モー ド で、 配置の削除 (つま り 、 コ ン ト ラ ク タ で例外が ス ロ ー さ れ る 場合、 配置演算子 new に対応する 演算子 delete が呼 び出 さ れます) が イ ネーブルの場合。 こ れは、 例外の使用時の みに関係 し ます。 __PTRDIFF_TYPE__ – GNU モー ド の場合。 ptrdiff_t typedef の正 し い潜在型を定義 し ます。 __RTTI – C++ モー ド で、 RTTI が イ ネーブルな場合 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-131 コ ンパイ ラ固有の機能 表 4-20 定義済みマ ク ロ (continued) 名前 値 __sizeof_int 4 定義 さ れる ケース sizeof(int) の場合 (ただ し 、 プ リ プ ロ セ ッ サ式で も 使用で き ま す) __sizeof_long 4 sizeof(long) の場合 (ただ し 、 プ リ プ ロ セ ッ サ式で も 使用で き ます) __sizeof_ptr 4 sizeof(void *) の場合 (ただ し 、 プ リ プ ロ セ ッ サ式で も 使用で き ます) __SIZE_TYPE__ – GNU モー ド の場合。 size_t typedef の正 し い潜在型を定義 し ま す。 __SOFTFP__ – コ ンパ イ ルで、 ソ フ ト ウ ェ ア浮動小数点コ ール標準お よ び ラ イ ブ ラ リ を使用する 場合。 ARM ま たは Thumb で --fpu=softvfp オ プシ ョ ン を指定する 場合、 ま たは Thumb で --fpu=softvfp+vfpv2 オプシ ョ ン を指定する 場合に設定 さ れます。 __STDC__ – すべての コ ンパ イ ラ モー ド の場合 __STDC_VERSION__ – 標準バージ ョ ン情報 __STRICT_ANSI__ – --strict オプシ ョ ン を指定 し てい る 場合 __SUPPORT_SNAN__ – --fpmode=ieee_fixed ま たは --fpmode=ieee_full を指定す る 場合の シ グナル NaN のサポー ト 。 __TARGET_ARCH_ARM num タ ーゲ ッ ト CPU の ARM ベース アーキ テ ク チ ャ の番号 (コ ンパ イ ラ で ARM と Thumb のど ち ら に向けて コ ンパ イ ル し てい る か は無関係です)。 各 ARM アーキ テ ク チ ャ バージ ョ ンで __TARGET_ARCH_ARM に指定で き る 値については、 表 4-21 (ページ 4-136) を参照 し て下 さ い。 __TARGET_ARCH_THUMB num タ ーゲ ッ ト CPU の Thumb ベース アーキ テ ク チ ャ の番号 (コ ン パ イ ラ で ARM と Thumb のど ち ら に向けて コ ンパ イ ル し てい る かは無関係です)。 タ ーゲ ッ ト が Thumb をサポー ト し ていない 場合は、 値に 0 が設定 さ れます。 各 ARM アーキ テ ク チ ャ バー ジ ョ ンで __TARGET_ARCH_THUMB に指定で き る 値については、 表 4-21 (ページ 4-136) を参照 し て下 さ い。 __TARGET_ARCH_XX – XX は タ ーゲ ッ ト アーキ テ ク チ ャ を表 し 、 その値は タ ーゲ ッ ト アーキ テ ク チ ャ に よ っ て異な り ます。 例えば、 コ ンパ イ ラ オプ シ ョ ン --cpu=4T ま たは --cpu=ARM7TDMI を指定す る と 、 __TARGET_ARCH_4T が定義 さ れます。 4-132 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 表 4-20 定義済みマ ク ロ (continued) 名前 値 定義 さ れる ケース __TARGET_CPU_XX – XX は タ ーゲ ッ ト CPU を表 し ます。 XX の値は --cpu コ ンパ イ ラ オ プシ ョ ンか ら 導 き 出 さ れ る か、 何 も 指定 し ていない場合はデ フ ォ ル ト 値が使用 さ れます。 例えば、 コ ンパ イ ラ オプシ ョ ン --cpu=ARM7TM が指定 さ れていれば __TARGET_CPU_ARM7TM が定義 さ れ、 __TARGET_CPU_ で始ま る その他のシ ン ボルは定義 さ れませ ん。 タ ーゲ ッ ト アーキ テ ク チ ャ が指定 さ れていれば __TARGET_CPU_generic が定義 さ れます。 プ ロ セ ッ サ名にハ イ フ ン (- ) 文字が含まれ る 場合、 こ れ ら の 文字はア ン ダース コ ア (_) に対応 し ます。 例えば、 --cpu=ARM1136JF-S は __TARGET_CPU_ARM1136JF_S と な り ます。 __TARGET_FEATURE_DOUBLEWORD – ARMv5T 以上のバージ ョ ン __TARGET_FEATURE_DSPMUL – ARMv5TE な ど の DSP 拡張乗算器が使用可能な場合 __TARGET_FEATURE_MULTIPLY – タ ーゲ ッ ト アーキ テ ク チ ャ で、 long 乗算命令 MULL お よ び MULAL がサポー ト さ れてい る 場合 __TARGET_FEATURE_DIVIDE – タ ーゲ ッ ト アーキ テ ク チ ャ でハー ド ウ ェ ア除算命令 (つま り 、 ARMv7-M ま たは ARMv7-R) がサポー ト さ れてい る 場合 __TARGET_FEATURE_MULTIPROCESSING – 以下のいずれかのオプシ ョ ン を指定する 場合 • --cpu=Cortex-A9 __TARGET_FEATURE_THUMB ARM DUI 0348BJ ID 1 0 0 4 1 9 – • --cpu=Cortex-A9.no_neon • --cpu=Cortex-A9.no_neon.no_vfp タ ーゲ ッ ト アーキ テ ク チ ャ で Thumb がサポー ト さ れてい る 場 合 (ARMv4T 以降) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-133 コ ンパイ ラ固有の機能 表 4-20 定義済みマ ク ロ (continued) 名前 値 定義 さ れる ケース __TARGET_FPU_xx – FPU の用途を示す以下のいずれかの値が設定 さ れます。 • __TARGET_FPU_NONE • __TARGET_FPU_VFP • __TARGET_FPU_SOFTVFP ま た、 以下のいずれかの --fpu オプシ ョ ン を使用 し て コ ンパ イ ルする 場合は、 それに対応する タ ーゲ ッ ト 名 も 設定 さ れます。 • --fpu=softvfp+vfpv2, __TARGET_FPU_SOFTVFP_VFPV2 • --fpu=softvfp+vfpv3, __TARGET_FPU_SOFTVFP_VFPV3 • --fpu=softvfp+vfpv3_fp16, __TARGET_FPU_SOFTVFP_VFPV3_FP16 • --fpu=softvfp+vfpv3_d16, __TARGET_FPU_SOFTVFP_VFPV3_D16 • --fpu=softvfp+vfpv3_d16_fp16, __TARGET_FPU_SOFTVFP_VFPV3_D16_FP16 • --fpu=vfpv2, __TARGET_FPU_VFPV2 • --fpu=vfpv3, __TARGET_FPU_VFPV3 • --fpu=vfpv3_fp16, __TARGET_FPU_VFPV3_FP16 • --fpu=vfpv3_d16, __TARGET_FPU_VFPV3_D16 • --fpu=vfpv3_d16_fp16, __TARGET_FPU_VFPV3_D16_FP16 詳細については、 「--fpu=name」 (ページ 2-70) を参照 し て 下 さ い。 __TARGET_PROFILE_A --cpu=7-A オプシ ョ ン を指定する 場合 __TARGET_PROFILE_R --cpu=7-R オプシ ョ ン を指定する 場合 __TARGET_PROFILE_M 以下のいずれかのオプシ ョ ン を指定する 場合 --cpu=6-M • 4-134 • --cpu=6S-M • --cpu=7-M Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 コ ンパイ ラ固有の機能 表 4-20 定義済みマ ク ロ (continued) 名前 値 __thumb__ – 定義 さ れる ケース コ ンパ イ ラ が Thumb モー ド の場合。 つま り 、 コ マ ン ド ラ イ ンで --thumb オプシ ョ ン を指定 し た場合か、 ソ ース コ ー ド で #pragma thumb を指定 し た場合。 注 • Thumb 向けに コ ンパ イ ル し てい る 場合で も 、 コ ンパ イ ラ で一部 ARM コ ー ド が生成 さ れ る こ と があ り ます。 • #pragma thumb ま たは #pragma arm を使用 し てい る 場合、 __thumb お よ び __thumb__ が定義 さ れた り さ れなか っ た り し ます。 ただ し 、 他の何 ら かの理由 (例えば、 関数が __irq と し て指定 さ れ る 場合) で Thumb 関数が ARM コ ー ド と し て生成 さ れ る 場合は変更 し ません。 __TIME__ time 常に定義 さ れます。 __UINTMAX_TYPE__ – GNU モー ド の場合。 uintmax_t typedef の正 し い潜在型を定義 し ます。 GNU モー ド の場合。 空の文字列を定義 し ます。 こ のマ ク ロ は Linux の一部のヘ ッ ダーフ ァ イ ルで使用 さ れます。 __USER_LABEL_PREFIX__ __VERSION__ ver --gnu オプシ ョ ン を指定 し てい る 場合に、 使用 し てい る GNU モー ド の現在のバージ ョ ン を示す文字列値が設定 さ れます。 _WCHAR_T – C++ モー ド で、 wchar_t がキーワー ド であ る こ と を指定す る 場合 __WCHAR_TYPE__ – GNU モー ド の場合。 wchar_t typedef の正 し い潜在型を定義 し ま す。 __WCHAR_UNSIGNED__ – GNU モー ド で --cpp オプシ ョ ン を指定 し てい る 場合。 wchar_t が 符号な し の型であ る 場合にのみ定義 さ れます。 __WINT_TYPE__ – GNU モー ド の場合。 wint_t typedef の正 し い潜在型を定義 し ま す。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 4-135 コ ンパイ ラ固有の機能 表 4-21 は、 __TARGET_ARCH_THUMB に指定で き る 値 (表 4-20 (ページ 4-129) を参 照)、 お よ び こ れ ら の値が ARM アーキ テ ク チ ャ の各バージ ョ ン と ど の よ う に 関連 し てい る か を示 し た も のです。 表 4-21 Thumb アーキテ ク チ ャバージ ョ ン と ARM アーキテ ク チ ャ バージ ョ ンの関連 4.10.2 ARM アーキテ ク チャ __TARGET_ARCH_ARM __TARGET_ARCH_THUMB v4 4 0 v4T 4 1 v5T、 v5TE、 v5TEJ 5 2 v6、 v6K、 v6Z 6 3 v6T2 6 4 v6-M、 v6S-M 0 3 v7-A、 v7-R 7 4 v7-M 0 4 関数名 表 4-22 には、 C お よ び C++ 向けの ARM コ ンパ イ ラ に よ っ てサポー ト さ れて い る 組み込み変数が記載 さ れてい ます。 表 4-22 組み込み変数 名前 __FUNCTION__ 値 ソ ース で使用 さ れてい る 関数名を保持 し ます。 __FUNCTION__ は、 定数文字列 リ テ ラ ルです。 プ リ プ ロ セ ッ サ を使用 し て こ れ ら の 内容を他のテ キ ス ト に結合 し 、 新 し い ト ー ク ン を形成する こ と はで き ません。 __PRETTY_FUNCTION__ 4-136 言語固有の形式で出力 さ れた関数名を保持 し ます。 __PRETTY_FUNCTION__ は、 定数文字列 リ テ ラ ルです。 プ リ プ ロ セ ッ サを使用 し て こ れ ら の内容を他のテ キ ス ト に結合 し 、 新 し い ト ー ク ン を形成する こ と はで き ません。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 第5章 C および C++ の実装に関する詳細 本章では、 ARM コ ンパ イ ラ 用言語の実装の詳細について説明 し ます。 以下の セ ク シ ョ ンか ら 構成 さ れてい ます。 • 「C お よ び C++ の実装に関す る 詳細」 (ページ 5-2) • ARM DUI 0348BJ ID 1 0 0 4 1 9 「C++ の実装に関す る詳細」 (ページ 5-15) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 5-1 C および C++ の実装に関する詳細 5.1 C および C++ の実装に関する詳細 こ のセ ク シ ョ ン では、 C お よ び C++ に共通す る 言語の実装の詳細について説 明 し ます。 5.1.1 文字セ ッ ト と 識別子 コ ンパ イ ラ に認識 さ れ る 文字セ ッ ト と 識別子には以下の規則が適用 さ れます。 • すべての内部識別子 と 外部識別子で大文字 と 小文字が区別 さ れ ます。 --strict コ ンパ イ ラ オプシ ョ ン を指定 し てい る 場合を除 き 、 識別子に ド ル ($) 文字を含め る こ と がで き ます。 --strict オプシ ョ ン を指定 し てい る 場合に識別子で ド ル記号を使用す る には、--dollar コ マ ン ド ラ イ ン オプ シ ョ ン も 使用 し て下 さ い。 • setlocale(LC_CTYPE, "ISO8859-1") を呼び出す と 、isupper() 関数 と islower() 関数は 7 ビ ッ ト の ASCII サブセ ッ ト ではな く 、 8 ビ ッ ト の Latin-1 アル フ ァ ベ ッ ト に基づいて動作 し ます。 こ の ロ ケールは リ ン ク 時に選択す る 必要があ り ます。 • ソ ース フ ァ イ ルは、 現在選択 し てい る ロ ケールに応 じ て コ ンパ イ ル さ れ ます。 ソ ース フ ァ イ ルに ASCII 以外の文字が含まれてい る 場合は、 --locale コ マ ン ド ラ イ ン オプシ ョ ン を指定 し て別の ロ ケールを選択す る 必要があ り ます。 詳細については、 『コ ンパ イ ラ ユーザガ イ ド 』 の 「ARM コ ンパ イ ラ の起動」 (ページ 2-3) を参照 し て下 さ い。 • ARM コ ンパ イ ラ では、 Unicode な ど のマルチバ イ ト 文字セ ッ ト がサポー ト さ れ ます。 • ソ ース文字セ ッ ト のその他のプ ロ パテ ィ はホ ス ト 固有です。 実行文字セ ッ ト のその他のプ ロ パテ ィ は タ ーゲ ッ ト 固有です。 ARM の C お よ び C++ の ラ イ ブ ラ リ は ISO 8859-1 (Latin-1 アルフ ァ ベ ッ ト ) 文字セ ッ ト をサ ポー ト す る ので、 以下の特徴があ り ます。 • 実行文字セ ッ ト は、 ソ ース文字セ ッ ト と 同一です。 • 実行文字セ ッ ト の 1 文字は 8 ビ ッ ト で構成 さ れ ます。 • int は 4 文字 (バ イ ト ) で構成 さ れます。 メ モ リ シ ス テ ムには以下の種類 があ り ます。 リ ト ルエ ンデ ィ ア ン バ イ ト は、 最下位ア ド レ ス の最下位バ イ ト か ら 、 最 上位ア ド レ ス の最上位バ イ ト に順序付け ら れます。 5-2 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ の実装に関する詳細 ビ ッ グエ ンデ ィ ア ン バ イ ト は、 最上位ア ド レ ス の最下位バ イ ト か ら 、 最 下位ア ド レ ス の最上位バ イ ト に順序付け ら れ ます。 • C では、 すべての文字定数が int 型です。 C++ では、 1 文字の文字定数は char 型で、 複数文字の文字定数は int 型です。 4 文字ま での定数は整数値 で表現 さ れます。 定数の最後の文字は、 整数値の最下位バ イ ト を占有 し ます。 その前の 3 文字ま では上位バ イ ト に配置 さ れ ます。 未使用バ イ ト には NULL (\0) 文字が埋め込ま れます。 • 表 5-1 は、 1 つの文字ま たは文字エ ス ケープシーケ ン ス を含むすべての 整数文字定数を、 ソ ース文字セ ッ ト と 実行文字セ ッ ト の両方で示 し てい ます。 表 5-1 文字エ スケープ コ ー ド エスケープ シーケ ン ス Char の値 説明 \a 7 注意 (ベル) \b 8 バ ッ ク スペース \t 9 水平 タ ブ \n 10 改行 ( ラ イ ン フ ィ ー ド ) \v 11 垂直 タ ブ \f 12 改ページ \r 13 キ ャ リ ッ ジ リ タ ーン \xnn 0xnn 16 進 ASCII コ ー ド \nnn 0nnn 8 進 ASCII コ ー ド • 文字列 リ テ ラ ルお よ び文字定数内の ソ ース文字セ ッ ト の文字は、 実行文 字セ ッ ト にその ま ま マ ッ プ さ れ ます。 • char 型のデー タ 項目は、 デフ ォ ル ト で符号な し に設定 さ れ ます。 こ れ ら の項目は、signed char ま たは unsigned char と し て明示的に宣言で き ます。 — --signed_chars オプシ ョ ン を使用す る と 、 char を符号付 き に設定で き ます。 — --unsigned_chars オプシ ョ ン を使用す る と 、 char を符号な し に設定 で き ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 5-3 C および C++ の実装に関する詳細 注 --signed_chars お よ び --unsigned_chars オプシ ョ ン を使用ま たは使用せず に コ ンパ イ ル さ れ、 イ ン タ フ ェースやデー タ 構造を共有 し てい る 変換ユ ニ ッ ト を混合す る 場合は、 注意が必要です。 ARM ABI では、 char を符号な し バ イ ト と し て定義 し ます。 こ れは、 RVCT に付属の C++ ラ イ ブ ラ リ が使用 し てい る 解釈です。 • 5.1.2 マルチバ イ ト 文字を ワ イ ド キ ャ ラ ク タ 定数の対応す る ワ イ ド キ ャ ラ ク タ に変換す る と き 、 ロ ケールは使用 さ れ ません。 こ れは、 一般的な実装に は無関係です。 基本デー タ 型 こ のセ ク シ ョ ン では、 ARM C お よ び C++ での基本デー タ 型の実装方法につい て説明 し ます。 基本デー タ 型のサイ ズ と 境界整列 表 5-2 は、 基本デー タ 型のサ イ ズ と 自然配列を示 し てい ます。 表 5-2 デー タ 型のサイ ズ と 境界整列 5-4 型 サイ ズ (ビ ッ ト 数) 自然配列 (バイ ト 数) char 8 1 (バ イ ト 境界で整列) short 16 2 (ハーフ ワー ド 境界で整列) int 32 4 (ワー ド 境界で整列) long 32 4 (ワー ド 境界で整列) long long 64 8 (ダブル ワー ド 境界で整列) float 32 4 (ワー ド 境界で整列) double 64 8 (ダブル ワー ド 境界で整列) long double 64 8 (ダブル ワー ド 境界で整列) すべてのポ イ ン タ 32 4 (ワー ド 境界で整列) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ の実装に関する詳細 表 5-2 デー タ 型のサイ ズ と 境界整列 (continued) 型 サイ ズ (ビ ッ ト 数) 自然配列 (バイ ト 数) bool (C++ のみ) 8 1 (バ イ ト 境界で整列) _Bool (C のみa) 8 1 (バ イ ト 境界で整列) wchar_t (C++ の 16 2 (ハーフ ワ ー ド 境界で整列) み) a. stdbool.h は、 C 言語の bool マ ク ロ を定義す る ために使用で き ます。 型の境界整列は、 コ ン テ キ ス ト に応 じ て変化 し ます。 • 通常、 ロ ーカル変数は レ ジ ス タ に保持 さ れ ますが、 ロ ーカル変数が多 く な り ス タ ッ ク を使用す る 場合は、 常に ワ ー ド 境界で整列 さ れ ます。 例え ば、 ロ ーカル変数 char が ス タ ッ ク 上に配置 さ れ る 場合の境界整列は 4 で す。 • パ ッ ク 型の自然配列は 1 です。 詳細については、 「構造体、 共用体、 列挙型、 ビ ッ ト フ ィ ール ド 」 (ページ 5-8) を参照 し て下 さ い。 整数 整数は、 2 の補数形式で表現 さ れ ます。 long long の下位 ワ ー ド は、 リ ト ルエ ン デ ィ ア ン モー ド では下位ア ド レ ス、 ビ ッ グエ ンデ ィ ア ン モー ド では上位ア ド レ ス に配置 さ れます。 浮動小数点数 浮動小数点数は、 IEEE 形式で保存 さ れ ます。 • float 値は、 IEEE の単精度値で表現 さ れます。 • double 値 と long double 値は、 IEEE の倍精度値で表現 さ れます。 double 値 と long double 値の場合、 符号、 指数、 お よ び仮数の最上位部を保持 す る ワー ド は、 ビ ッ グエ ンデ ィ ア ン モー ド では下位マシ ン ア ド レ ス に、 リ ト ルエ ンデ ィ ア ン モー ド では上位マシ ン ア ド レ ス に保存 さ れます。 詳細につい ては、 「浮動小数点型の演算」 (ページ 5-7) を参照 し て下 さ い。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 5-5 C および C++ の実装に関する詳細 配列 と ポ イ ン タ 以下は、 メ ンバへのポ イ ン タ を除 き 、 C お よ び C++ のオブジ ェ ク ト を指すす べてのポ イ ン タ に適用 さ れます。 • 隣接す る バ イ ト には、 1 つずつ異な る ア ド レ ス が割 り 当て ら れます。 • マ ク ロ NULL は値 0 に展開 さ れ ます。 • • 整数 と ポ イ ン タ 間のキ ャ ス ト に よ っ て表現が変化す る こ と はあ り ませ ん。 コ ンパ イ ラ では、 関数へのポ イ ン タ と デー タ へのポ イ ン タ 間のキ ャ ス ト について警告を生成 し ます。 size_t 型は、 unsigned int と し て定義 さ れ ます。 • ptrdiff_t 型は、 signed int と し て定義 さ れ ます。 • 5.1.3 基本デー タ 型の演算 ARM コ ンパ イ ラ では、 ISO C99 標準お よ び ISO C++ 標準の関連セ ク シ ョ ン で 定義 さ れてい る 通常の算術変換を実行 し ます。 以下のサブセ ク シ ョ ン では、 算術演算に関す る 補足事項について説明 し ます。 「式の評価」 (ページ B-8) も 参照 し て下 さ い。 整数型の演算 整数型の演算には以下の規則が適用 さ れ ます。 • すべての符号付 き 整数演算には、 2 の補数表現が使用 さ れ ます。 • 符号付 き 整数型のビ ッ ト ご と の演算は、 2 の補数表現か ら 自然に生 じ る 規則に従い ます。 符号拡張は行われ ません。 • 符号付 き 数値の右シ フ ト は算術演算です。 • int 型の値の場合、 • 5-6 — 0 ~ 127 の範囲外のシ フ ト は定義 さ れ ません。 — 31 を超え る 左シ フ ト が行われ る と 、 ゼ ロ が返 さ れ ます。 — 31 を超え る 右シ フ ト が行われ る 場合、 符号な し 値ま たは正の符号 付 き 値のシ フ ト ではゼ ロ が返 さ れ ます。 負の符号付 き 値で こ の よ う な シ フ ト を行 う と 、 –1 が返 さ れます。 long long 型の値の場合、 0 ~ 63 の範囲外のシ フ ト は定義 さ れ ません。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ の実装に関する詳細 • 整数除算の剰余の符号は、 ISO C99 標準で規定 さ れてい る 分子の符号 と 同 じ です。 • 整数型の値が短い符号付 き 整数型に切 り 捨て ら れ る 場合は、 適切な数の 最上位ビ ッ ト を破棄す る こ と で結果が求め ら れ ます。 そのため、 元の数 が大 き すぎ る と 、 値の正負にかかわ ら ず、 結果の符号 と 元の符号が同 じ にな ら ない こ と があ り ます。 • 整数型同士の変換では例外は発生 し ません。 • 整数のオーバーフ ロ ーでは例外は発生 し ません。 • ゼ ロ に よ る 整数除算では、 デフ ォ ル ト では 0 が返 さ れます。 浮動小数点型の演算 浮動小数点型の演算には、 以下の特徴があ り ます。 • 通常の IEEE 754 の規則が適用 さ れます。 • • デフ ォ ル ト では、 最 も 近い表現可能な値に丸め ら れ ます。 デフ ォ ル ト では、 浮動小数点例外はデ ィ セーブルにな っ てい ます。 「--fpmode=model」 (ページ 2-67) も 参照 し て下 さ い。 注 浮動小数点の処理に関す る IEEE 754 標準では、 例外に対す る デフ ォ ル ト のア ク シ ョ ン と し て ト ラ ッ プな し で続行す る こ と が定義 さ れてい ます。 fenv.h 内の 関数 と 定義を カ ス タ マ イ ズす る こ と で、 浮動小数点エ ラ ーの処理方法を修正 す る こ と がで き ます。 詳細については、 「エ ラ ー通知、 エ ラ ー処理、 プ ロ グ ラ ム終了処理のカ ス タ マ イ ズ」 (ページ 2-70) を参照 し て下 さ い。 ポ イ ン タ 減算 以下は、 C のすべてのポ イ ン タ に適用 さ れます。 ま た、 メ ンバへのポ イ ン タ を除 く C++ のポ イ ン タ に も 適用 さ れます。 • あ る ポ イ ン タ か ら 別のポ イ ン タ を減算す る 場合の差は、 以下の式の結果 にな り ます。 ((int)a - (int)b) / (int)sizeof(type pointed to) • ARM DUI 0348BJ ID 1 0 0 4 1 9 ポ イ ン タ がオブジ ェ ク ト を指 し 、 そのオブジ ェ ク ト の境界整列がオブ ジ ェ ク ト のサ イ ズ と 等 し い場合は、 こ の境界整列に よ り こ の除算は必ず 割 り 切れ ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 5-7 C および C++ の実装に関する詳細 • 5.1.4 ポ イ ン タ がオブジ ェ ク ト を指 し 、 パ ッ ク 型や大部分の struct の よ う に、 そのオブジ ェ ク ト の境界整列がオブジ ェ ク ト のサ イ ズ よ り も 小 さ い場合 は、 ど ち ら のポ イ ン タ も 同 じ 配列の要素を指 し てい る 必要があ り ます。 構造体、 共用体、 列挙型、 ビ ッ ト フ ィ ール ド こ のセ ク シ ョ ン では、 構造化 さ れたデー タ 型を実装す る union、 enum、 お よ び struct について説明 し ます。 ま た、 構造体のパデ ィ ン グ と ビ ッ ト フ ィ ール ド の実装について も 説明 し ます。 詳細については、 「匿名 ク ラ ス、 匿名構造体、 匿名共用体」 (ページ 3-21) を 参照 し て下 さ い。 共用体 異な る 型の メ ンバを使用 し て union の メ ンバにア ク セ スす る と き は、 元の型の 表現か ら 結果の値を予測で き ます。 エ ラ ーは発生 し ません。 列挙型 enum 型のオブジ ェ ク ト は、 その enum の範囲を含む最小の整数型で実装 さ れ ま す。 enum を保持す る 型は、 以下の型の う ち enum 内の列挙子の範囲が収ま る 最 も 小 さ い型 (一覧で先に示 し た型) にな り ます。 --enum_is_int を使用 し ていない場合は unsigned char • • --enum_is_int を使用 し ていない場合は signed char • --enum_is_int を使用 し ていない場合は unsigned short • --enum_is_int を使用 し ていない場合は signed short • • C で --strict を指定 し てい る 場合を除 き 、 unsigned int • C で --strict を指定 し てい る 場合を除 き 、 signed long long • C で --strict を指定 し てい る 場合を除 き 、 unsigned long long signed int こ の よ う に enum を実装す る こ と で、 デー タ サ イ ズ を小 さ く で き ます。 コ マ ン ド ラ イ ン オプシ ョ ン --enum_is_int を使用 し て、 enum の基本型を最低で も int の 幅に設定で き ます。 詳細については、 『Procedure Call Standard for the ARM Architecture』 仕様の C 言 語マ ッ ピ ン グに関す る 説明を参照 し て下 さ い。 5-8 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ の実装に関する詳細 注 --enum_is_int オプシ ョ ン を使用ま たは使用せずに コ ンパ イ ル さ れてお り 、 イ ン タ フ ェース ま たはデー タ 構造を共有 し てい る 変換ユニ ッ ト を混合す る と き は、 注意が必要です。 範囲外の値の処理 厳密な C では、列挙値は例えば -2147483648 ~ +2147483647 の範囲の int で表 現で き る 必要があ り ます。 以前の リ リ ース の RVCT では、--strict オプシ ョ ン を指定 し た場合を除 き 、 範囲外の値は警告が表示 さ れ る こ と な く int にキ ャ ス ト さ れ ま し た。 RVCT v2.2 以降では、 列挙値が範囲外の場合、 以下の警告が表示 さ れ ます。 #66: enumeration value is out of "int" range こ の よ う な値は C++ で も 同様に、unsigned int、long long、 ま たは unsigned long long と し て扱われ ます。 列挙値が範囲外であ る こ と を示す警告が表示 さ れ る よ う にす る には、 以下の コ マ ン ド を使用 し て警告を エ ラ ーに変更 し ます。 armcc --diag_error=66 ... 構造体 こ こ で説明す る 内容は以下に適用 さ れ ます。 • すべての C 構造体 • 仮想関数ま たはベース ク ラ ス を使用 し ないすべての C++ 構造体 と ク ラ ス 構造体の境界整列 パ ッ ク さ れていない構造体の境界整列は、 その構造体の フ ィ ー ル ド に必要な最大の境界整列にな り ます。 フ ィ ール ド の境界整列 構造体は、 名前が付け ら れた最初の コ ン ポーネ ン ト が最下位ア ド レ ス にな る よ う に配置 さ れ ます。 フ ィ ール ド は、 以下の よ う に 整列 さ れ ます。 • char 型の フ ィ ール ド は、 次に使用可能なバ イ ト に揃え て整 列 さ れます。 • short 型の フ ィ ール ド は、 次の偶数ア ド レ ス のバ イ ト に揃え て整列 さ れます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 5-9 C および C++ の実装に関する詳細 • RVCT 2.0 以降では、 double 型 と long long 型が 8 バ イ ト 境界 で整列 さ れます。 こ のため、ARMv5TE 以降では LDRD 命令 と STRD 命令を効率的に使用で き ます。 • ビ ッ ト フ ィ ール ド の境界整列は、 そのビ ッ ト フ ィ ール ド の 宣言方法に よ っ て異な り ます。 詳細については、 「パ ッ ク 構 造体のビ ッ ト フ ィ ール ド 」 (ページ 5-14) を参照 し て下 さ い。 • その他のすべての型は、 ワ ー ド 境界で整列 さ れ ます。 フ ィ ール ド が正 し く 整列 さ れ、 かつ構造自体が正 し く 整列す る よ う に、 構造 体にはパデ ィ ン グ を挿入で き ます。 図 5-1 は、 従来の非パ ッ ク 構造体の例を 示 し てい ます。 フ ィ ール ド を正 し く 整列す る ために、 バ イ ト 1、 2、 3 にパデ ィ ン グ を挿入 し てい ます。 ま た、 構造体自体を正 し く 整列す る ために、 バ イ ト 11、 12 にパデ ィ ン グ を挿入 し てい ます。 sizeof() 関数では、 こ のパデ ィ ン グ を 含めた構造体のサ イ ズが返 さ れ ます。 struct {char c; int x; short s} ex1; 0 1 c 2 3 padding 4 5 9 10 s x 7 8 11 12 padding 図 5-1 従来のパ ッ ク さ れていない構造体の例 コ ンパ イ ラ では、 構造体の定義方法に応 じ て、 以下のいずれかの方法で構造 体にパデ ィ ン グ を挿入 し ます。 • static ま たは extern と し て定義 さ れてい る 構造は、 ゼ ロ でパデ ィ ン グ さ れ ます。 • malloc() ま たは auto で ス タ ッ ク ま たは ヒ ープ上に定義 さ れ る 構造体に は、 その メ モ リ 位置に以前に格納 さ れていた値を その ま ま埋め込みま す。 memcmp() を使用 し て、 こ の よ う に定義 さ れたパデ ィ ン グ済みの構造 体を比較す る こ と はで き ません (図 5-1 を参照)。 --remarks オプシ ョ ン を使用す る と 、 コ ンパ イ ラ が struct にパデ ィ ン グ を挿入 し た と き に生成 さ れ る メ ッ セージ を表示で き ます。 C++ では、 以下の よ う に空の イ ニシ ャ ラ イ ザを備え た構造体が許可 さ れ ます。 5-10 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ の実装に関する詳細 struct { int x; } X = { }; ただ し 、 C を コ ンパ イ ル し てい る と き 、 ま たは --cpp お よ び --c90 オプシ ョ ン を指定 し て C++ を コ ンパ イ ル し てい る と き は、 以下の よ う なエ ラ ーが生成 さ れ ます。 パ ッ ク構造体 パ ッ ク 構造体 と は、 構造体自体の境界整列 と 、 構造体内の フ ィ ール ド の境界 整列が常に 1 の構造体です。 パ ッ ク 構造体は、 __packed 修飾子で定義で き ます。 ま たは、 非境界整列デー タ を持つ構造体が確実にパ ッ ク さ れ る よ う に #pragma pack(n) を使用す る こ と も で き ます。 構造体のデフ ォ ル ト のパ ッ ク 方法を変更す る コ マ ン ド ラ イ ン オプ シ ョ ンはあ り ません。 ビ ッ ト フ ィ ール ド パ ッ ク さ れていない構造体では、 ARM コ ンパ イ ラ に よ っ て コ ン テナ内に ビ ッ ト フ ィ ール ド が割 り 当て ら れます。 コ ン テナは、 型が宣言 さ れ、 正 し く 整列 さ れたオブジ ェ ク ト です。 ビ ッ ト フ ィ ール ド は、 コ ン フ ィ グ レーシ ョ ンに基づいて、 指定 さ れた最初の フ ィ ール ド が ワー ド 内の最下位ア ド レ ス の ビ ッ ト を占有す る よ う に割 り 当て ら れ ます。 リ ト ルエ ンデ ィ ア ン 最下位ア ド レ ス が最下位の内容にな り ます。 ビ ッ グエ ンデ ィ ア ン 最下位ア ド レ ス が最上位の内容にな り ます。 ビ ッ ト フ ィ ール ド コ ン テナには、 任意の整数型を指定で き ます。 注 厳密な 1990 ISO 標準 C では、 ビ ッ ト フ ィ ール ド に指定で き る 型は int、 signed int、 お よ び unsigned int のみです。 int 型以外を ビ ッ ト フ ィ ール ド に指定す る と 、 コ ンパ イ ラ か ら 以下のエ ラ ーが表示 さ れ ます。 signed 修飾子 も unsigned 修飾子 も 付けずに宣言 さ れたプ レーン な ビ ッ ト フ ィ ール ド は、 unsigned と し て扱われ ます。 例えば、 int x:10 では、 10 ビ ッ ト の符号な し 整数が割 り 当て ら れます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 5-11 C および C++ の実装に関する詳細 ビ ッ ト フ ィ ール ド は、 以下の よ う に未割 り 当ての ビ ッ ト が十分にあ る 、 適切 な型の最初の コ ン テナに割 り 当て ら れます。 struct X { int x:10; int y:20; }; 最初の宣言では、 整数 コ ン テナを作成 し 、 x に 10 ビ ッ ト を割 り 当て ます。 2 番 目の宣言では、 コ ンパ イ ラ に よ っ て未割 り 当て ビ ッ ト が十分にあ る 既存の整 数 コ ン テナが検索 さ れ、 x と 同 じ コ ン テナ内に y を割 り 当て ます。 1 つのビ ッ ト フ ィ ール ド は、 コ ン テナ内に完全に含まれます。 コ ン テナ内に収 ま ら ない ビ ッ ト フ ィ ール ド は、 次の同 じ 型の コ ン テナ内に配置 さ れ ます。 例 えば、 以下の よ う に上記の構造体に ビ ッ ト フ ィ ール ド z を追加で宣言す る と 、 コ ン テナがオーバーフ ロ ー し ます。 struct X { int x:10; int y:20; int z:5; }; コ ンパ イ ラ では、 最初の コ ン テナの残 り 2 ビ ッ ト にパデ ィ ン グ を挿入 し 、 新 し い整数 コ ン テナを z に割 り 当て ます。 ビ ッ ト フ ィ ール ド コ ン テナは、 以下の よ う に互いに重複 さ せ る こ と がで き ま す。 struct X { int x:10; char y:2; }; 最初の宣言では、 整数 コ ン テナを作成 し 、 x に 10 ビ ッ ト を割 り 当て ます。 こ れ ら の 10 ビ ッ ト は、 整数 コ ン テナの先頭バ イ ト と 2 バ イ ト 目の 2 ビ ッ ト を占有 し ます。 2 番目の宣言では、 コ ンパ イ ラ に よ っ て char 型の コ ン テナがチ ェ ッ ク さ れ ます。 適切な コ ン テナがないため、 コ ンパ イ ラ は正 し く 整列 さ れた char コ ン テナを新たに割 り 当て ます。 char の自然配列は 1 なので、 コ ンパ イ ラ はその ビ ッ ト フ ィ ール ド を完全に収 容す る こ と がで き る 未割 り 当て ビ ッ ト を含む最初のバ イ ト を検索 し ます。 上 記の例では、 int コ ン テナの 2 番目のバ イ ト の う ち、 2 ビ ッ ト が x に割 り 当て 5-12 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ の実装に関する詳細 ら れ、 6 ビ ッ ト が未割 り 当てです。 コ ンパ イ ラ は、 char コ ン テナの割 り 当て を 前の int コ ン テナの 2 バ イ ト 目か ら 始め、 x に割 り 当て ら れてい る 最初の 2 ビ ッ ト を ス キ ッ プ し て、 2 ビ ッ ト を y に割 り 当て ます。 y が char y:8 と 宣言 さ れてい る 場合、 コ ン テナを オーバーフ ロ ー さ せ る こ と は で き ないため、 コ ンパ イ ラ は 2 バ イ ト 目の残 り のビ ッ ト にパデ ィ ン グ を挿入 し 、 char コ ン テナを新 し く 3 バ イ ト 目に割 り 当て ます。 以下の例の よ う な構 造体の ビ ッ ト フ ィ ール ド の割 り 当て を図 5-2 に示 し ます。 struct X { int x:10; char y:8; }; Bit number 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 unallocated y padding x 図 5-2 ビ ッ ト フ ィ ール ド の割 り 当て 1 注 異な る 型の コ ン テナの ビ ッ ト フ ィ ール ド 宣言に も 同 じ 基本規則が適用 さ れま す。 例えば、 上記の例に int ビ ッ ト フ ィ ール ド を追加す る と 以下の よ う にな り ます。 struct X { int x:10; char y:8; int z:5; } コ ンパ イ ラ は、 int コ ン テナの割 り 当て を int x:10 コ ン テナ と 同 じ 位置か ら 始 め、 バ イ ト 境界で整列 さ れた char と 5 ビ ッ ト の ビ ッ ト フ ィ ール ド を割 り 当て ます (図 5-3 を参照)。 Bit number 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 free z y padding x 図 5-3 ビ ッ ト フ ィ ール ド の割 り 当て 2 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 5-13 C および C++ の実装に関する詳細 名前を付けずにサ イ ズが 0 の ビ ッ ト フ ィ ール ド を宣言す る こ と で、 ビ ッ ト フ ィ ール ド コ ン テナに明示的にパデ ィ ン グ を挿入で き ます。 コ ン テナが空で なければ、 サ イ ズが 0 の ビ ッ ト フ ィ ール ド で コ ン テナが完全に埋め ら れ ます。 その後の ビ ッ ト フ ィ ール ド 宣言は、 新 し い空の コ ン テナか ら 始ま り ます。 パ ッ ク 構造体のビ ッ ト フ ィ ール ド パ ッ ク 構造体内のビ ッ ト フ ィ ール ド コ ン テナのア ラ イ メ ン ト は 1 です。 し た がっ て、 パ ッ ク 構造体内の ビ ッ ト フ ィ ール ド にパデ ィ ン グ さ れ る 最大ビ ッ ト 数は 7 ビ ッ ト です。 パ ッ ク さ れない構造体の場合、 挿入 さ れ る パデ ィ ン グは最 大 8*sizeof(container-type)–1 bits です。 5-14 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ の実装に関する詳細 5.2 C++ の実装に関する詳細 こ のセ ク シ ョ ン では、 C++ 言語に固有の実装の詳細について説明 し ます。 5.2.1 ::operator new 関数の使用 ISO C++ 標準に従い、 ::operator new(std::size_t) では、 メ モ リ 割 り 当てに失敗 し た と き に、 シ グナルを発生 さ せ る のではな く 、 例外を ス ロ ー し ます。 例外 がキ ャ ッ チ さ れなか っ た場合は、 std::terminate() が呼び出 さ れます。 コ ンパ イ ラ オプシ ョ ン --force_new_nothrow を指定す る と 、 コ ンパ イ ル時にすべ ての new 呼び出 し が ::operator new(std::size_t, std::nothrow_t&) ま たは :operator new[](std::size_t, std::nothrow_t&) への呼び出 し に変換 さ れ ます。 た だ し 、 ラ イ ブ ラ リ 内の operator new 呼び出 し お よ び ク ラ ス固有の operator new 呼び出 し は変換 さ れ ません。 詳細については、 「--force_new_nothrow, --no_force_new_nothrow」 (ページ 2-65) を参照 し て下 さ い。 従来のサポー ト RVCT v2.0 では、 ::operator new 関数で メ モ リ 不足が発生す る と 、 C++ 例外を ス ロ ーす る のではな く 、 シ グナル SIGOUTOFHEAP が発生 し ま し た。 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の 「ISO C ラ イ ブ ラ リ の実装定義」 (ページ 2-113) を参照 し て く だ さ い。 最新 リ リ ース では、 new_handler を イ ン ス ト ール し てシ グナルを発生 さ せ、 RVCT v2.0 と 同 じ 動作にす る こ と がで き ます。 注 こ の動作の実装方法は今後の リ リ ース で変更 さ れ る 可能性があ る ため、 こ の よ う な動作に依存 し ない よ う に し て下 さ い。 5.2.2 仮配列 ADS v1.2 と RVCT v1.2 の C++ コ ンパ イ ラ では、int a[] の よ う な不完全な仮の 配列宣言を使用で き ま し たが、 RVCT v2.x 以上の コ ンパ イ ラ で C++ を コ ンパ イ ルす る 場合は仮配列を使用で き ません。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 5-15 C および C++ の実装に関する詳細 5.2.3 C++ 関数での旧方式の C パ ラ メ ー タ ADS v1.2 RVCT と RVCT v1.2 の C++ コ ンパ イ ラ では、 C++ 関数で旧方式の C パ ラ メ ー タ を使用で き ま し た。 以下に例を示 し ます。 void f(x) int x; { } RVCT v2.x 以降の コ ンパ イ ラ では、 コ ー ド 内の関数で こ の よ う な旧方式のパ ラ メ ー タ を使用 し てい る 場合は、--anachronisms コ ンパ イ ラ オプシ ョ ン を指定 す る 必要があ り ます。 コ ンパ イ ラ では こ の よ う なパ ラ メ ー タ を検出す る と 警 告を生成 し ます。 5.2.4 アナ ク ロ ニズム --anachronisms オプシ ョ ン を指定 し て アナ ク ロ ニズ ム を イ ネーブルす る 場合 は、 以下のアナ ク ロ ニ ズ ムが許容 さ れ ます。 5-16 • 関数宣言で 多重定義が許可 さ れます。 こ の よ う な多重定義は容認 さ れます が、 無視 さ れ ます。 • デフ ォ ル ト の初期化を使用 し て初期化で き る ス タ テ ィ ッ ク デー タ メ ンバ の定義は不要です。 こ のアナ ク ロ ニズ ムは、 テ ンプ レー ト ク ラ ス の ス タ テ ィ ッ ク デー タ メ ンバには適用 さ れ ません。 こ の よ う な ス タ テ ィ ッ ク デー タ メ ンバは常に定義す る 必要があ り ます。 • 配列削除演算では配列の要素数を指定で き ますが、 こ の値は無視 さ れ ま す。 • operator++() 関数 と operator--() 関数を 1 つ使用す る と 、 前置演算 と 後置 演算の両方を多重定義で き ます。 • イ ミ デ ィ エー ト ベース ク ラ ス が 1 つ し か存在 し ない場合は、 ベース ク ラ ス イ ニシ ャ ラ イ ザ内でベース ク ラ ス名を省略で き ます。 • コ ン ス ト ラ ク タ お よ びデス ト ラ ク タ 内では this ポ イ ン タ の代入が許可 さ れ ます。 • bound 関数のポ イ ン タ 、 つま り 特定のオブジ ェ ク ト の メ ンバ関数へのポ イ ン タ は、 関数へのポ イ ン タ にキ ャ ス ト で き ます。 • 入れ子にな っ た ク ラ ス名は、 その名前で他の ク ラ ス が宣言 さ れていなけ れば、 入れ子にな っ ていない ク ラ ス名 と し て使用で き ます。 こ のアナ ク ロ ニズ ムはテ ン プ レー ト ク ラ ス には適用 さ れ ません。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ の実装に関する詳細 • const 型以外への参照は、 異な る 型の値で初期化で き ます。 一時デー タ が 作成 さ れ、 その一時デー タ が変換 さ れた初期値で初期化 さ れて、 その一 時デー タ に参照が設定 さ れ ます。 • const ク ラ ス型以外への参照は、 ク ラ ス型の右辺値ま たはその ク ラ ス型 か ら 派生 し た ク ラ ス で初期化で き ます。 一時デー タ が追加使用 さ れ る こ と はあ り ません。 • 旧方式のパ ラ メ ー タ 宣言を使用す る 関数は許可 さ れ、 プ ロ ト タ イ プ宣言 さ れたかの よ う に多重定義 さ れ る 関数に参加で き ます。 互換性チ ェ ッ ク の完了時、 関数のパ ラ メ ー タ 型にはデフ ォ ル ト の引数のプ ロ モーシ ョ ン が適用 さ れないため、 以下の例では f と い う 名前の付いた 2 つの関数の 多重定義が宣言 さ れ ます。 int f(int); int f(x) char x; { return x; } 注 C で も 上の コ ー ド を使用で き ますが、 意味が異な り ます。 f の仮宣言の後 には、 その定義が続 き ます。 5.2.5 テ ン プ レ ー ト のイ ン ス タ ン ス生成 ARM コ ンパ イ ラ は、 すべてのテ ン プ レー ト の イ ン ス タ ン ス生成を自動的に行 い、 各テ ンプ レー ト エ ン テ ィ テ ィ の定義が リ ン ク 後に 1 つ し か残 ら ない よ う に し ます。 コ ンパ イ ラ は、 名前の付いた共通セ ク シ ョ ン にテ ン プ レー ト エ ン テ ィ テ ィ を生成す る こ と で こ の処理を行い ます。 し たが っ て、 重複す る すべ ての共通セ ク シ ョ ン、 つま り 同 じ 名前の共通セ ク シ ョ ン が リ ン カに よ っ て削 除 さ れ ます。 注 --pending_instantiations コ ンパ イ ラ オプシ ョ ン を指定 し て、 特定のテ ン プ レー ト に対 し て同時に生成 さ れ る イ ン ス タ ン ス数を制限で き ます。 「--pending_instantiations=n」 (ページ 2-115) も 参照 し て下 さ い。 暗黙のイ ン クルー ド 暗黙の イ ン ク ルー ド が イ ネーブルにな っ てい る と き 、 .h フ ァ イ ルで宣言 さ れ たテ ン プ レー ト エ ン テ ィ テ ィ の イ ン ス タ ン ス生成のために定義が必要な場合 は、 コ ンパ イ ラ は対応す る .cc フ ァ イ ルを暗黙に イ ン ク ルー ド し て、 その定 義の ソ ース コ ー ド を取得で き る も の と 見な し ます。 例えば、 テ ン プ レー ト エ ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 5-17 C および C++ の実装に関する詳細 ン テ ィ テ ィ ABC::f が xyz.h フ ァ イ ルで宣言 さ れ、 コ ンパ イ ル中に ABC::f の イ ン ス タ ン ス生成が必要な場合で も 、 コ ンパ イ ルで処理中の ソ ース コ ー ド に ABC::f の定義が含ま れていなければ、 コ ンパ イ ラ は xyz.cc フ ァ イ ルが存在す る か ど う か をチ ェ ッ ク し ます。 フ ァ イ ルが存在 し てい る 場合、 コ ンパ イ ラ は こ の フ ァ イ ルが メ イ ン ソ ース フ ァ イ ルの最後に イ ン ク ルー ド さ れてい る かの よ う に処理 し ます。 コ ンパ イ ラ が特定のテ ン プ レー ト エ ン テ ィ テ ィ のテ ンプ レー ト 定義フ ァ イ ル を検索す る には、 テ ン プ レー ト が宣言 さ れてい る フ ァ イ ルの完全パ ス名 と 、 その フ ァ イ ルが、 例えば #include <file.h> な ど のシ ス テ ム イ ン ク ルー ド 構文 を使用 し て イ ン ク ルー ド さ れたか ど う か を把握す る 必要があ り ます。 #line デ ィ レ ク テ ィ ブ を含む前処理 さ れた ソ ース では、 こ の情報を使用で き ません。 そのため、 コ ンパ イ ラ は #line デ ィ レ ク テ ィ ブ を含む ソ ース コ ー ド では暗黙の イ ン ク ルー ド を試みません。 コ ンパ イ ラ は、 定義フ ァ イ ルの接尾文字 .cc と .CC を探 し ます。 コ マ ン ド ラ イ ン オプシ ョ ン --implicit_include お よ び --no_implicit_include を 指定 し て、 暗黙の イ ン ク ルー ド モー ド を有効ま たは無効にで き ます。 暗黙の イ ン ク ルー ド は、 フ ァ イ ルの通常の コ ンパ イ ル中、 つま り -E コ マ ン ド ラ イ ン オプシ ョ ン を使用 し ていない場合のみ実行 さ れます。 詳細については、 「 コ マ ン ド ラ イ ンオプシ ョ ン」 (ページ 2-2) を参照 し て下 さ い。 5.2.6 ネームスペース テ ンプ レー ト の イ ン ス タ ン ス生成で名前のル ッ ク ア ッ プを行 う と き に、 テ ン プ レー ト 定義の コ ン テキ ス ト 内で見つか る名前 も あれば、 テ ンプ レー ト の イ ン ス タ ン ス生成の コ ン テキ ス ト 内で見つか る名前 も あ り ます。 コ ンパ イ ラ には、 以下の 2 つの異な る イ ン ス タ ン ス生成ル ッ ク ア ッ プアルゴ リ ズ ムが実装 さ れて い ます。 • 標準で規定 さ れ、 依存名ル ッ ク ア ッ プ と 呼ばれ る アルゴ リ ズ ム • 依存名ル ッ ク ア ッ プが実装 さ れ る前のアルゴ リ ズ ム 依存名ル ッ ク ア ッ プは、 別の コ マ ン ド ラ イ ン オプシ ョ ン で明示的にデ ィ セー ブルに設定 さ れていない限 り 、 ま たは コ ン フ ィ グ レーシ ョ ン フ ラ グ と コ マ ン ド ラ イ ン オプシ ョ ンのいずれかで依存名処理が イ ネーブルに設定 さ れてい る 場合に、 厳密モー ド で実行 さ れ ます。 5-18 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ の実装に関する詳細 依存名ル ッ ク ア ッ プ処理 コ ンパ イ ラ では、 依存名ル ッ ク ア ッ プ を実行す る と き に、 標準で規定 さ れて い る イ ン ス タ ン ス生成の名前ル ッ ク ア ッ プ規則を実装 し ます。 こ の処理では、 ク ラ ス以外のプ ロ ト タ イ プの イ ン ス タ ン ス生成を行 う 必要があ り ます。 その ため、 標準で規定 さ れてい る 型名 と テ ン プ レー ト キー ワー ド を使用 し て コ ー ド を記述す る こ と が必要です。 参照 コ ン テキス ト を使用 し たル ッ ク ア ッ プ コ ンパ イ ラ では依存名ル ッ ク ア ッ プ を使用 し ない場合、 標準の 2 フ ェーズ ル ッ ク ア ッ プ規則に近い名前ル ッ ク ア ッ プアルゴ リ ズ ム を使用 し ます。 ただ し 、 あ る 意味では、 こ れは既存の コ ー ド や既存の コ ンパ イ ラ と の互換性が高 いアルゴ リ ズ ム です。 テ ンプ レー ト の イ ン ス タ ン ス生成の一環 と し て名前をル ッ ク ア ッ プ し 、 その イ ン ス タ ン ス生成の ロ ーカル コ ン テ キ ス ト で名前が見つか ら ない場合は、 統 合 さ れた イ ン ス タ ン ス生成 コ ン テ キ ス ト でル ッ ク ア ッ プ し ます。 こ の統合 さ れた イ ン ス タ ン ス生成 コ ン テ キ ス ト には、 テ ン プ レー ト 定義の コ ン テ キ ス ト にあ る 名前 と 、 イ ン ス タ ン ス生成の コ ン テ キ ス ト にあ る 名前の両方が含まれ ます。 以下に例を示 し ます。 namespace N { int g(int); int x = 0; template <class T> struct A { T f(T t) { return g(t); } T f() { return x; } }; } namespace M { int x = 99; double g(double); N::A<int> ai; int i = ai.f(0); // N::A<int>::f(int) calls N::g(int) int i2 = ai.f(); // N::A<int>::f() returns 0 (= N::x) N::A<double> ad; double d = ad.f(0); // N::A<double>::f(double) calls M::g(double) double d2 = ad.f(); // N::A<double>::f() also returns 0 (= N::x) } ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 5-19 C および C++ の実装に関する詳細 テ ン プ レー ト の イ ン ス タ ン ス生成での名前のル ッ ク ア ッ プは、 以下の点で、 標準で規定 さ れてい る 規則に準拠 し ません。 • テ ン プ レー ト 定義の コ ン テ キ ス ト にあ る 名前のみが関数ではない名前 と 見な さ れますが、 ル ッ ク ア ッ プはテ ン プ レー ト の定義時に参照で き る 名 前に限定 さ れません。 • テ ン プ レー ト が参照 さ れ る コ ン テ キ ス ト にあ る 関数は、 そのテ ン プ レー ト 内のすべての関数呼び出 し で考慮 さ れ ます。 参照 コ ン テ キ ス ト にあ る 関数は、 依存関数呼び出 し にのみ参照 さ れ ます。 引数依存ル ッ ク ア ッ プ 引数依存ル ッ ク ア ッ プが イ ネーブルにな っ てい る と き 、 引数依存ル ッ ク ア ッ プ を使用 し て参照で き る 関数は、 通常のル ッ ク ア ッ プで参照で き る 関数で多 重定義で き ます。 標準では、 通常のル ッ ク ア ッ プで見つか っ た名前がブ ロ ッ ク extern 宣言であ っ て も こ の多重定義を行 う こ と が規定 さ れてい ます。 こ の 多重定義は コ ンパ イ ラ で行われ ますが、 デフ ォ ル ト モー ド では、 通常のル ッ ク ア ッ プでブ ロ ッ ク extern が見つか る と 、 引数依存ル ッ ク ア ッ プが抑制 さ れ ます。 し たが っ て、 ネーム スペース を使用 し ていない場合で も 、 引数依存ル ッ ク ア ッ プ を使っ て コ ンパ イ ルを行 う か ど う かに よ っ て、 プ ロ グ ラ ム の動作が異 な り ます。 以下に例を示 し ます。 struct A { }; A operator+(A, double); void f() { A a1; A operator+(A, int); a1 + 1.0; // calls operator+(A, double) with arg-dependent lookup } // enabled but otherwise calls operator+(A, int); 5.2.7 C++ の例外処理 RVCT では、 C++ の例外処理が完全にサポー ト さ れ ます。 ただ し 、 デフ ォ ル ト ではサポー ト さ れ ません。 C++ の例外処理は、--exceptions オプシ ョ ン を指定 し て イ ネーブルにす る 必要があ り ます。 詳細については、 「--exceptions, --no_exceptions」 (ページ 2-61) を参照 し て下 さ い。 5-20 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ の実装に関する詳細 注 Rogue Wave 標準 C++ ラ イ ブ ラ リ は、 C++ 例外が有効にな っ た状態で提供 さ れ ます。 例外テーブル生成の制御は制限付 き で実行で き ます。 実行時に展開 さ れる関数 デフ ォ ル ト では、--exceptions を指定 し て コ ンパ イ ル し た関数は、 実行時に展 開で き ます。 詳細については、 「--exceptions, --no_exceptions」 (ペー ジ 2-61) を参照 し て下 さ い。 関数の展開 には、 C++ の自動変数の破棄やス タ ッ ク フ レームに保持 さ れた レ ジ ス タ 値の復元を行 う こ と が含まれます。 関 数の展開は、 実行 さ れ る 操作を記述 し た例外テーブルを生成す る こ と に よ っ て実装 さ れます。 プ ラ グマ #pragma exceptions_unwind お よ び #pragma no_exceptions_unwind を指定 し て、 特定の関数の展開を イ ネーブル ま たはデ ィ セーブルに設定で き ます。 詳 細については、 「プ ラ グマ」 (ページ 4-62) を参照 し て下 さ い。 --exceptions_unwind オプシ ョ ン を使用 し て、 こ のプ ラ グマの初期値を設定 し ま す。 関数の展開をデ ィ セーブルす る と 、 以下の影響があ り ます。 • 実行時にその関数か ら 例外を ス ロ ーで き ないため、 その ス ロ ーの ス タ ッ ク の展開が行われません。 ス ロ ー し てい る 言語が C++ の場合、 std::terminate が呼び出 さ れ ます。 • 関数の記述に非常に コ ンパ ク ト な例外テーブル表記を使用で き る ため、 テーブルの最適化が行われ、 リ ン カの機能を向上で き ます。 • 呼び出 し 側 と 呼び出 さ れ る 側が正 し く 相互作用す る 必要があ る ため、 関 数の イ ン ラ イ ン展開が制限 さ れ ます。 し たが っ て、 #pragma no_exceptions_unwind を使用す る と 、 ソ ース に不要な コ ー ド を追加せずに、 展開を強制的に防ぐ こ と がで き ます。 それに対 し て、 C++ では、 保護 さ れた関数に限 り 、 空の例外関数指定に よ り 展開が許可 さ れ、 ISO C++ 標準に従っ て std::unexpected() が呼び出 さ れます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 5-21 C および C++ の実装に関する詳細 5.2.8 Extern イ ン ラ イ ン関数 ISO C++ 標準では、 イ ン ラ イ ン関数を使用す る 場合は必ずその関数を定義す る こ と が規定 さ れてい ます。 C++ コ ンパ イ ラ は、 イ ン ラ イ ン関数の複数のア ウ ト オブ ラ イ ン コ ピーが競合 し ない よ う に、 ア ウ ト オブ ラ イ ン extern 関数を 共通セ ク シ ョ ン に生成 し ます。 アウ ト オブ ラ イ ン イ ン ラ イ ン関数 コ ンパ イ ラ は、 以下の場合に イ ン ラ イ ン関数のア ウ ト オブ ラ イ ン コ ピーを生 成 し ます。 • 以下の よ う に関数のア ド レ ス を受け取 る 場合。 inline int g() { return 1; } int (*fp)() = &g; • 再帰関数の よ う に関数を イ ン ラ イ ン にで き ない場合。 inline unsigned int fact(unsigned int n) { return n < 2 ? 1 : n * fact(n - 1); } • コ ンパ イ ラ で使用 さ れ る ヒ ュ ー リ ス テ ィ ッ ク に よ り 、 その関数を イ ン ラ イ ン展開 し ない方が よ い と 判断 さ れ る 場合。 こ の ヒ ュ ー リ ス テ ィ ッ ク は、-Ospace お よ び -Otime の影響を受け ます。 -Otime を使用す る と 、 コ ンパ イ ラ では よ り 多 く の関数を イ ン ラ イ ン展開 し ます。 __forceinline を指定 し て関数を宣言す る と 、 こ の ヒ ュ ー リ ス テ ィ ッ ク を オーバー ラ イ ド で き ます。 以下に例を示 し ます。 __forceinline int g() { return 1; } 詳細については、 「--forceinline」 (ページ 2-66) も 参照 し て下 さ い。 5-22 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 付録 A via フ ァ イルの構文 こ の付録では、 すべての ARM 開発ツールでサポー ト さ れてい る via フ ァ イ ル の構文について説明 し ます。 以下のセ ク シ ョ ンか ら 構成 さ れてい ます。 • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「via フ ァ イ ルの概要」 (ページ A-2) 「構文」 (ページ A-3) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, A-1 via フ ァ イルの構文 A.1 via フ ァ イルの概要 via フ ァ イ ルは、 ARM 開発ツールに渡す コ マ ン ド ラ イ ン引数 と オプシ ョ ン が 記述 さ れたプ レーン テ キ ス ト フ ァ イ ルです。 via フ ァ イ ルは、 以下に示すすべ ての ARM コ マ ン ド ラ イ ン ツールで使用で き ます。 つま り 、 via フ ァ イ ルは、 --via コ マ ン ド ラ イ ン オプシ ョ ン を使用 し て、 コ マ ン ド ラ イ ン か ら 指定で き ま す。 • armcc • armasm • armlink • fromelf • armar 詳細については、 各ツールのマニ ュ アルを参照 し て下 さ い。 注 一般的には、 via フ ァ イ ルを使用 し て、 ツールに対 し て任意の コ マ ン ド ラ イ ン オプシ ョ ン (--via を含む) を指定で き ます。 つま り 、 ネ ス ト さ れた複数の via フ ァ イ ルを via フ ァ イ ル内か ら 呼び出す こ と がで き ます。 こ のセ ク シ ョ ンは以下のサブセ ク シ ョ ンか ら 構成 さ れてい ます。 • 「via フ ァ イ ルの評価」 A.1.1 via フ ァ イルの評価 via フ ァ イ ルをサポー ト す る ツールが呼び出 さ れ る と 、 その ツールに よ っ て以 下の処理が行われます。 1. 指定 さ れてい る 最初の --via via_file 引数を、 via フ ァ イ ルか ら 抽出 さ れ た引数 ワー ド のシーケ ン ス に置 き 換え ます。 こ の中には、 再帰処理を行 う 、 via フ ァ イ ル内でネ ス ト さ れた --via コ マ ン ド も 含ま れ ます。 2. それ以降の --via via_file 引数について も 、 出現 し た順番で同 じ よ う に 処理 し ます。 つま り 、 via フ ァ イ ルは指定 さ れた順番で処理 さ れ、 ネ ス ト さ れた via フ ァ イ ルを含めて各 via フ ァ イ ルが完全に処理 さ れてか ら 次の via フ ァ イ ルが処理 さ れます。 A-2 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 via フ ァ イルの構文 A.2 構文 via フ ァ イ ルは以下の構文規則に準拠 し てい る 必要があ り ます。 • via フ ァ イ ルは、 一連の ワー ド で構成 さ れ る テ キ ス ト フ ァ イ ルです。 テ キ ス ト フ ァ イ ル内の各 ワー ド は、 引数文字列に変換 さ れてか ら ツールに渡 さ れ ます。 • 区切 ら れた文字列内にあ る 場合を除 き 、 ワー ド はホ ワ イ ト スペース ま た は行の終わ り で区切 ら れ ます。 以下に例を示 し ます。 --c90 --strict (2 ワ ー ド ) --c90--strict (1 ワ ー ド ) • 行の終わ り はホ ワ イ ト スペース と し て処理 さ れます。 以下に例を示 し ま す。 --c90 --strict 上記の コ マ ン ド は、 以下の コ マ ン ド と 同 じ 意味です。 --c90 --strict • 二重引用符 (") ま たはアポ ス ト ロ フ ィ (') で囲ま れた文字列は、 1 ワー ド と し て処理 さ れ ます。 二重引用符で囲まれた ワ ー ド 内で使用 さ れ てい る アポ ス ト ロ フ ィ は通常の文字 と し て処理 さ れ ます。 アポ ス ト ロ フ ィ で区切 ら れた ワ ー ド 内では、 二重引用符は通常の文字 と し て処理 さ れ ます。 二重引用符は、 スペース を含むフ ァ イ ル名ま たはパ ス名を 1 つの ワ ー ド と し て ま と め る ために使用 さ れます。 以下に例を示 し ます。 -I C:\My Project\includes (3 ワー ド ) -I "C:\My Project\includes" (1 ワー ド ) ま た、 アポ ス ト ロ フ ィ を使用 し て、 二重引用符を含む ワー ド を 1 つの ワー ド と し て ま と め る こ と がで き ます。 以下に例を示 し ます。 -DNAME='"RealView Compilation Tools"' (1 ワー ド ) • 括弧で囲まれた文字は、 1 ワー ド と し て処理 さ れ ます。 以下に例を示 し ます。 --option(x, y, z) (1 ワ ー ド ) --option (x, y, z) (2 ワ ー ド ) • ARM DUI 0348BJ ID 1 0 0 4 1 9 二重引用符ま たはアポ ス ト ロ フ ィ で囲まれた文字列内では、 バ ッ ク ス ラ ッ シ ュ (\) 文字を使用 し て、 二重引用符、 アポ ス ト ロ フ ィ 、 お よ び バ ッ ク ス ラ ッ シ ュ 文字を エ ス ケープで き ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, A-3 via フ ァ イルの構文 • 1 つの ワ ー ド と し て ま と め ら れた ワ ー ド のす ぐ隣にあ る ワ ー ド は、 1 ワー ド と し て処理 さ れます。 以下に例を示 し ます。 -I"C:\Project\includes" 上記の例は、 以下の 1 ワー ド と し て処理 さ れ ます。 -IC:\Project\includes • 先頭にあ る ホ ワ イ ト スペース文字を除いて、 セ ミ コ ロ ン (;) ま たは ハ ッ シ ュ (#) 文字で始ま る 行は、 コ メ ン ト 行 と し て解釈 さ れます。 セ ミ コ ロ ン ま たはハ ッ シ ュ 文字が行頭以外の場所にあ る 場合、 それ ら の文字 は コ メ ン ト の開始を表す文字 と し ては解釈 さ れ ません。 以下に例を示 し ます。 -o objectname.axf ;this is not a comment コ メ ン ト の終わ り は、 行の終わ り ま たはフ ァ イ ルの終わ り と な り ます。 複数行にわた る コ メ ン ト はな く 、 行の一部だけが コ メ ン ト にな る こ と も あ り ません。 • プ リ プ ロ セ ッ サオプシ ョ ン -Dsymbol="value" を含む行は、 '-Dsymbol="value"' ま たは -Dsymbol='"value"' の よ う に、 単一引用符で囲む 必要があ り ます。 以下に例を示 し ます。 -c -DFOO_VALUE='"FOO_VALUE"' A-4 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 付録 B 標準 C の実装定義 こ の付録では、 ISO C 標準に準拠 し た C の実装におけ る 必要事項について説 明 し ます。 以下のセ ク シ ョ ン か ら 構成 さ れてい ます。 • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「実装定義」 (ページ B-2) 「ISO C 標準で定義 さ れていない動作」 (ページ B-10) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, B-1 標準 C の実装定義 B.1 実装定義 ISO C 標準 (ISO/IEC 9899:1990 (E)) の付録 G には、 移植性の問題に関す る 情報が記載 さ れてい ます。 ま た、 小節 G3 には、 各実装で文書化す る 必要のあ る 処理が記載 さ れてい ます。 注 第 4 章 コ ンパ イ ラ 固有の機能 で説明 し てい ますので こ の付録では触れませ ん。 ただ し 、 参考情報があ る 場合はそれを提供 し てい ます。 以下のサブセ ク シ ョ ンは、 小節 G3 の各セ ク シ ョ ン に対応 し てお り 、 ISO C 標 準では定義 さ れていない、実装定義の ARM C コ ンパ イ ラ お よ び C ラ イ ブ ラ リ の機能について説明 し ます。 注 ヘ ッ ダ wctype.h お よ び wchar.h では、 ワ イ ド キ ャ ラ ク タ を用いた フ ァ イ ルの処 理はサポー ト さ れてい ません。 B-2 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 標準 C の実装定義 B.1.1 変換 コ ンパ イ ラ に よ っ て生成 さ れ る 診断 メ ッ セージには、 以下の形式が使用 さ れ ます。 source-file, line-number: severity: error-code: explanation severity には、 以下のいずれかが使用 さ れ ます。 [blank] severity が空白の場合、 こ れは注釈であ る ため、 一般的な C ま た は C++ の用法であ る こ と を示 し ます。 ただ し 、 場合に よ っ ては 特殊な用法の場合 も あ り ます。 デフ ォ ル ト では、 注釈は表示 さ れ ません。 注釈 メ ッ セージ を表示す る には、--remarks オプシ ョ ン を 使用 し ます。 詳細については、 「診断 メ ッ セージの出力の制御」 (ページ 6-5) を参照 し て下 さ い。 コ ンパ イ ルは続行 さ れます。 Warning 問題を引 き 起 こ す可能性があ る 異常が コ ー ド 内にあ る こ と を示 し ます。 コ ンパ イ ルは続行 さ れ ます。 Error コ ンパ イ ルが停止す る 原因 と な る 問題があ る こ と を示 し ます。 例 えば、 C 言語ま たは C++ 言語の構文規則ま たは意味上の規則に 違反 し てい る こ と を示 し ます。 Internal fault コ ンパ イ ラ で内部的な問題が発生 し てい る こ と を示 し ます。 「フ ィ ー ド バ ッ ク 」 (ページ x) に記載 さ れてい る 情報を用意 し て、 購入元にお問い合わせ下 さ い。 他の項目は以下の よ う にな り ます。 error-code エ ラ ーの種類を識別す る ための値です。 explanation エ ラ ーの内容を示すテ キ ス ト です。 詳細については、 『コ ンパ イ ラ ユーザガ イ ド 』 の第 6 章 診断 メ ッ セージ を参 照 し て下 さ い。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, B-3 標準 C の実装定義 B.1.2 環境 コ マ ン ド ラ イ ン を ARM アーキ テ ク チ ャ ベース の環境か ら main() の引数に マ ッ プす る 方法は実装に よ っ て異な り ます。 汎用 ARM C ラ イ ブ ラ リ では以下 がサポー ト さ れてい ます。 • 「main()」 • • 「 イ ン タ ラ ク テ ィ ブデバ イ ス」 「標準入力ス ト リ ーム、 標準出力ス ト リ ーム、 標準エ ラ ース ト リ ームの 転送」 (ページ B-5) main() main() に渡 さ れ る 引数は、 ホ ワ イ ト スペース が二重引用符で囲まれてい る 場 合を除 き 、 ホ ワ イ ト スペース で区切 ら れた、 コ マ ン ド ラ イ ンの ワー ド (I/O 転 送命令は含まれ ません) と な り ます。 注 • ホ ワ イ ト スペース文字 と は、 isspace() の結果が真 と な る 任意の文字で す。 • 二重引用符ま たは二重引用符内のバ ッ ク ス ラ ッ シ ュ 文字 (\) の前には、 バ ッ ク ス ラ ッ シ ュ 文字を追加す る 必要があ り ます。 • 二重引用符内の I/O 転送命令は認識 さ れ ません。 イ ン タ ラ ク テ ィ ブデバイ ス ホ ス テ ィ ン グ さ れない ARM C ラ イ ブ ラ リ の実装では、 イ ン タ ラ ク テ ィ ブデバ イ ス が意味を な さ ない場合があ り ます。 汎用 ARM C ラ イ ブ ラ リ では一対のデ バ イ ス がサポー ト さ れてい ます。 ど ち ら のデバ イ ス も :tt で呼び出 さ れ、 キーボー ド 入力 と VDU 画面出力を処理す る 目的で使用 さ れ ます。 こ の汎用的 な実装では、 以下の よ う にな り ます。 • I/O 転送が行われない限 り 、 :tt に接続 さ れた ス ト リ ーム ではバ ッ フ ァ リ ン グが実行 さ れません。 • :tt 以外への I/O 転送が行われ る と 、 フルフ ァ イ ルバ ッ フ ァ リ ン グが使 用 さ れます。 ただ し 、 stdout と stderr の両方が同 じ フ ァ イ ルに転送 さ れ る 場合は、 ラ イ ンバ ッ フ ァ リ ン グが使用 さ れます。 B-4 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 標準 C の実装定義 標準入力ス ト リ ーム、 標準出力ス ト リ ーム、 標準エ ラ ース ト リ ームの転送 汎用 ARM C ラ イ ブ ラ リ を使用す る と 実行時に、 標準入力ス ト リ ーム、 標準出 力ス ト リ ーム、 お よ び標準エ ラ ース ト リ ーム を転送で き ます。 例えば、 mycopy が、 標準入力を標準出力に コ ピーす る 、 ホ ス ト デバ ッ ガ上で実行 さ れ る プ ロ グ ラ ム であ る 場合には、 以下の コ マ ン ド ラ イ ン を入力す る こ と で こ のプ ロ グ ラ ムが実行 さ れます。 mycopy < infile > outfile 2> errfile フ ァ イ ルは以下の よ う に転送 さ れ ます。 stdin 標準入力ス ト リ ームは、 infile に転送 さ れ ます。 stdout 標準出力ス ト リ ームは、 outfile に転送 さ れ ます。 stderr 標準エ ラ ース ト リ ームは、 errfile に転送 さ れ ます。 以下の転送が可能です。 0< filename stdin を filename か ら 読み出 し ます。 < filename stdin を filename か ら 読み出 し ます。 1> filename stdout を filename に書 き 込みます。 > filename stdout を filename に書 き 込みます。 2> filename stderr を filename に書 き 込みます。 2>&1 stderr が stdout と 同 じ 場所に書 き 込ま れます。 >& file stdout と stderr のいずれ も filename に書 き 込まれ ます。 >> filename stdout は filename に追加 さ れ ます。 >>& filename stdout と stderr のいずれ も filename に追加 さ れ ます。 stdin、 stdout、 お よ び stderr と タ ーゲ ッ ト 間で転送す る には、 以下の よ う に定 義す る 必要があ り ます。 #pragma import(_main_redirection) フ ァ イ ル転送は、 以下のいずれかの場合にのみ実行 さ れ ます。 • ARM DUI 0348BJ ID 1 0 0 4 1 9 起動 さ れてい る オペレーテ ィ ン グ シ ス テ ム が フ ァ イ ル転送を サポー ト し てい る 場合 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, B-5 標準 C の実装定義 • プ ロ グ ラ ムが文字の読み出 し と 書 き 込みを実行 し 、 C ラ イ ブ ラ リ 関数 fputc() お よ び fgetc() がプ ロ グ ラ ムに よ っ て置換 さ れていない場合 B.1.3 識別子 詳細については、 「文字セ ッ ト と 識別子」 (ページ 5-2) を参照 し て下 さ い。 B.1.4 文字 詳細については、 「文字セ ッ ト と 識別子」 (ページ 5-2) を参照 し て下 さ い。 B.1.5 整数 詳細については、 「整数」 (ページ 5-5) を参照 し て下 さ い。 B.1.6 浮動小数点 詳細については、 「浮動小数点数」 (ページ 5-5) を参照 し て下 さ い。 B.1.7 配列 と ポ イ ン タ 詳細については、 「配列 と ポ イ ン タ 」 (ページ 5-6) を参照 し て下 さ い。 B.1.8 レジス タ ARM コ ンパ イ ラ を使用す る と 、 register 記憶域 ク ラ ス を持つ よ う に、 任意の 数の ロ ーカルオブジ ェ ク ト を宣言で き ます。 B.1.9 構造体、 共用体、 列挙型、 ビ ッ ト フ ィ ール ド ISO/IEC C 標準では、 構造化 さ れたデー タ の型について、 以下の実装の詳細を 文書化す る こ と が要求 さ れてい ます。 • 共用体の メ ンバが、 異な る 型の メ ンバを使用 し て ア ク セ ス さ れた場合の 結果 • 構造体 メ ンバのパデ ィ ン グ と 境界整列 • プ レーン な int ビ ッ ト フ ィ ール ド が signed int ビ ッ ト フ ィ ール ド と unsigned int ビ ッ ト フ ィ ール ド の ど ち ら と し て処理 さ れ る のか • B-6 ユニ ッ ト 内の ビ ッ ト フ ィ ール ド の割 り 当て順序 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 標準 C の実装定義 • ビ ッ ト フ ィ ール ド が記憶域ユニ ッ ト の境界を超え る こ と が許 さ れ る か ど うか • 列挙型の値を表現す る と き に使用 さ れ る 整数型 詳細については、 第 5 章 C お よ び C++ の実装に関す る詳細 を参照 し て下 さ い。 共用体 詳細については、 「共用体」 (ページ 5-8) を参照 し て下 さ い。 列挙型 詳細については、 「列挙型」 (ページ 5-8) を参照 し て下 さ い。 構造体のパデ ィ ン グ と 境界整列 詳細については、 「構造体」 (ページ 5-9) を参照 し て下 さ い。 ビ ッ ト フ ィ ール ド 詳細については、 「ビ ッ ト フ ィ ール ド 」 (ページ 5-11) を参照 し て下 さ い。 B.1.10 修飾子 volatile 修飾子の指定 さ れた型を持つオブジ ェ ク ト は、 そのサ イ ズ と 境界整列 に基づいて ワー ド 、 ハーフ ワー ド 、 ま たはバ イ ト と し て ア ク セ ス さ れ ます。 1 ワー ド よ り 大 き い volatile オブジ ェ ク ト の場合、 オブジ ェ ク ト の各部分へのア ク セ ス順は定義 さ れてい ません。 通常、 volatile ビ ッ ト フ ィ ール ド を更新す る には、 読み出 し - 修正 - 書 き 込みの手続 き が必要です。 境界整列 さ れた ワー ド 型、 ハーフ ワー ド 型、 お よ びバ イ ト 型へのア ク セ ス はア ト ミ ッ ク です。 その 他の volatile ア ク セ ス は必ず し も ア ト ミ ッ ク ではあ り ません。 それ以外の場合は、 ソ ース コ ー ド に よ っ て暗黙に定義 さ れ る 順番で、 ソ ース コ ー ド が暗黙に定義す る と お り に、 volatile 修飾子の指定 さ れたオブジ ェ ク ト の読み出 し と 書 き 込みが行われます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, B-7 標準 C の実装定義 B.1.11 式の評価 コ ンパ イ ラ で再度順序付け を行 う こ と がで き る 式は、 括弧内に記述 さ れてい る 場合で も 、 優先度が等 し い連想型お よ び可換型の演算子が使用 さ れ る 式だ けです。 例えば、 a、 b、 c が整数式の場合、 a + (b + c) は (a + b) + c と し て評価 さ れ る こ と があ り ます。 シーケ ン ス間で、 コ ンパ イ ラ は、 括弧に関係な く ど の よ う な順序で も 式を評 価で き ます。 し たがっ て、 各シーケ ン ス の間の式の影響は ど の よ う な順序で も 起 こ り 得ます。 コ ンパ イ ラ は関数引数を任意の順序で評価で き ます。 関連す る 標準仕様に よ っ て定義 さ れていない評価順序は、 次の事由に よ っ て 異な る 場合があ り ます。 • コ ンパ イ ル時の最適化レベル • コ ンパ イ ラ のバージ ョ ン B-8 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 標準 C の実装定義 B.1.12 プ リ プ ロ セ ッ シ ン グデ ィ レ ク テ ィ ブ ISO 標準の C ヘ ッ ダ フ ァ イ ルは、 #include <stdio.h> の よ う に、 標準仕様で定義 さ れてい る 方法で参照で き ます。 イ ン ク ルー ド 可能な ソ ース フ ァ イ ルの名前は引用符で囲む こ と がで き ます。 コ ンパ イ ラ では、 ホ ス ト フ ァ イ ル名ま たは UNIX フ ァ イ ル名がサポー ト さ れ ます。 UNIX 以外のホ ス ト で UNIX フ ァ イ ル名が使用 さ れてい る 場合には、 コ ンパ イ ラ はその フ ァ イ ル名を ロ ーカルで使用で き る 名前に変換 し よ う と 試み ます。 認識 さ れ る #pragma デ ィ レ ク テ ィ ブ を 「プ ラ グマ」 (ページ 4-62) に示 し ます。 B.1.13 ラ イ ブ ラ リ 関数 ISO C ラ イ ブ ラ リ のバ リ ア ン ト は、 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の 「 ラ ン タ イ ム ラ イ ブ ラ リ について」 (ページ 1-2) に リ ス ト さ れてい ます。 各 C ラ イ ブ ラ リ の特徴は、 実装に よ っ て異な り ます。 汎用 ARM C ラ イ ブ ラ リ では、 以下の機能がサポー ト さ れてい ます。 • マ ク ロ NULL は整数定数 0 に展開 さ れ ます。 • プ ロ グ ラ ムに よ っ て printf な ど の予約済みの外部識別子が再定義 さ れ る と 、 プ ロ グ ラ ムが標準 ラ イ ブ ラ リ に リ ン ク さ れた際にエ ラ ーが発生す る 可能性があ り ます。 プ ロ グ ラ ム と 標準 ラ イ ブ ラ リ が リ ン ク さ れない場 合、 エ ラ ーは検出 さ れ ません。 • __aeabi_assert() 関数は stderr にエ ラ ー診断の詳細を出力 し 、 その後 abort() 関数を呼び出 し ます。 *** assertion failed: expression, file name, line number 注 assert マ ク ロ の動作は、 直近の #include <assert.h> の行に よ り 定義 さ れ た演算の条件に よ っ て異な り ます。 詳細については、 『 ラ イ ブ ラ リ / 浮動 小数点サポー ト ガ イ ド 』 の 「プ ロ グ ラ ムか ら の終了処理」 (ページ 2-46) を参照 し て下 さ い。 数学関数、 マ ク ロ 、 ロ ケール、 シ グナル、 お よ び入出力の実装の詳細につい ては、 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の第 2 章 C の ラ イ ブ ラ リ と C++ の ラ イ ブ ラ リ を参照 し て下 さ い。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, B-9 標準 C の実装定義 B.2 ISO C 標準で定義 さ れていない動作 ISO C 標準で定義 さ れていない動作を以下に示 し ます。 B-10 • 文字 と 文字列のエ ス ケープでは、 \ の次の文字に特別な意味がない場合 は、 文字自体がエ ス ケープの値にな り ます。 例えば、 \s は s と 同 じ であ る ため、 警告が生成 さ れます。 • 無名フ ィ ール ド はあ る が命名 さ れた フ ィ ール ド がない構造体 struct はデ フ ォ ル ト で許可 さ れ ますが、 厳密な 1990 ISO 標準 C モー ド ではエ ラ ー にな り ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 付録 C 標準 C++ の実装定義 C++ を コ ンパ イ ルす る 場合、 ISO/IEC の C++ 標準に記載 さ れてい る 言語機能 のほ と ん ど が ARM コ ンパ イ ラ でサポー ト さ れ ます。 こ の付録では、 こ の標準 で定義 さ れてい る C++ 言語機能を一覧 し 、 その言語機能が ARM C++ でサ ポー ト さ れてい る か ど う かについて説明 し ます。 以下のセ ク シ ョ ン か ら 構成 さ れてい ます。 • 「整数変換」 (ページ C-3) • • • 「純仮想関数の呼び出 し 」 (ページ C-4) 「サポー ト さ れてい る 主な言語機能」 (ページ C-5) 「標準 C++ ラ イ ブ ラ リ の実装定義」 (ページ C-6) 注 こ の付録では、 標準 C の実装に関す る 情報については触れてい ません。 詳細 については、 付録 B 標準 C の実装定義 を参照 し て下 さ い。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, C-1 標準 C++ の実装定義 C++ を ISO C モー ド で コ ンパ イ ルす る 場合の ARM コ ンパ イ ラ は、 ARM C コ ンパ イ ラ と 同 じ です。 C ま たは C++ に固有の実装機能があ る 場合は、 本文中 にその旨を明記 し てい ます。 標準 C++ の拡張については、 以下のマニ ュ アル を参照 し て下 さ い。 「標準の C++ 言語の拡張機能」 (ページ 3-16) • • • C-2 「C++ お よ び C90 で使用可能な C99 言語機能」 (ページ 3-7) 「標準 C お よ び標準 C++ 言語の拡張機能」 (ページ 3-20) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 標準 C++ の実装定義 C.1 整数変換 整数変換の際、 デス テ ィ ネーシ ョ ンの型が符号付 き の場合に、 そのデス テ ィ ネーシ ョ ンの型 と ビ ッ ト フ ィ ール ド 幅で表現可能であれば、 その値は変換 さ れ ません。 それ以外の場合は、 デス テ ィ ネーシ ョ ンの型のサ イ ズに収ま る よ う に、 値が切 り 捨て ら れ ます。 注 こ のセ ク シ ョ ンは ISO/IEC 標準の 「4.7 整数変換」 に関連 し てい ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, C-3 標準 C++ の実装定義 C.2 純仮想関数の呼び出 し 純仮想関数の呼び出 し は不正です。 コー ド か ら 純仮想関数を呼び出す と 、 コ ン パ イ ラ では ラ イ ブ ラ リ 関数 __cxa_pure_virtual への呼び出 し が含め ら れます。 __cxa_pure_virtual 関数は、 シ グナル SIGPVFN を生成 し ます。 デフ ォ ル ト の信 号ハン ド ラ は、 エ ラ ー メ ッ セージ を出力 し て終了 し ます。 詳細については、 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の 「__default_signal_handler()」 (ページ 2-76) を参照 し て下 さ い。 C-4 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 標準 C++ の実装定義 C.3 サポー ト さ れている主な言語機能 表 C-1 は、本 リ リ ース の ARM C++ でサポー ト さ れてい る 主な言語機能を示 し てい ます。 表 C-1 サポー ト さ れている主な言語機能 ARM DUI 0348BJ ID 1 0 0 4 1 9 主な機能 ISO/IEC 標準のセ ク ション サポー ト コ ア言語 1 ~ 13 ○ テ ンプ レー ト 14 ○ (エ ク ス ポー ト テ ンプ レー ト は除 く ) 例外 15 ○ ラ イブラ リ 17 ~ 27 「標準 C++ ラ イ ブ ラ リ の実装定義」 (ペー ジ C-6) と 『 ラ イ ブ ラ リ / 浮動小数点サ ポー ト ガ イ ド 』 を参照 し て く だ さ い。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, C-5 標準 C++ の実装定義 C.4 標準 C++ ラ イ ブ ラ リ の実装定義 Rogue Wave ラ イ ブ ラ リ v.2.02.03 は、 標準で定義 さ れてい る ラ イ ブ ラ リ のサブ セ ッ ト です。 1999 ISO C 標準 と は多少の違いがあ り ます。 実装定義について は、 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の 「標準 C++ ラ イ ブ ラ リ の 実装定義」 (ページ 2-120) を参照 し て下 さ い。 こ の ラ イ ブ ラ リ と ユーザ定義関数を併用 し て、 タ ーゲ ッ ト に よ っ て異な る ア プ リ ケーシ ョ ン を作成で き ます。 『 ラ イ ブ ラ リ / 浮動小数点サポー ト ガ イ ド 』 の 「 ラ ン タ イ ム ラ イ ブ ラ リ について」 (ページ 1-2) を参照 し て く だ さ い。 C-6 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 付録 D C および C++ コ ンパイ ラの実装に関する制限 本付録では、 ARM コ ンパ イ ラ を使用 し て C お よ び C++ を コ ンパ イ ルす る 場 合の実装に関す る 制限について説明 し ます。 以下のセ ク シ ョ ン か ら 構成 さ れ てい ます。 • 「C++ ISO/IEC 標準に関す る 制限」 (ページ D-2) • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「整数値に関す る 制限」 (ページ D-4) 「浮動小数点数に関す る 制限」 (ページ D-6) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, D-1 C および C++ コ ンパイ ラの実装に関する制限 D.1 C++ ISO/IEC 標準に関する制限 ISO/IEC C++ 標準では、 コ ンパ イ ラ が準拠す る 必要のあ る 最小限の制限が規 定 さ れてい ます。 異な る コ ンパ イ ラ にアプ リ ケーシ ョ ン を移植す る 場合は、 こ れ ら の制限に注意す る 必要があ り ます。 表 D-1 に、 こ れ ら の制限の概要を 示 し ます。 こ の表で 「 メ モ リ 」 と 表示 さ れてい る 項目は、 使用可能な メ モ リ の容量に よ る 制限以外に ARM コ ンパ イ ラ に よ る 制限がない こ と を示 し ます。 表 D-1 実装に関する制限 推奨 ARM 複合ス テー ト メ ン ト のネ ス ト レベル、 反復制御構造、 選択制 御構造 256 メモリ 条件付 き イ ン ク ルー ド のネ ス ト レベル 256 メモリ 宣言の算術演算、 構造体、 共用体、 ま たは不完全型を修飾す る ポ イ ン タ 、 配列、 お よ び関数宣言子 (任意の組み合わせ) 256 メモリ 1 つの式に含まれ る 括弧のネ ス ト レベル 256 メモリ 内部識別子ま たはマ ク ロ 名の最初の文字数 1024 メモリ 外部識別子の最初の文字数 1024 メモリ 65536 メモリ 1024 メモリ 65536 メモリ 1 つの関数宣言に含まれ る パ ラ メ ー タ 256 メモリ 1 つの関数 コ ールに含まれ る 引数の数 256 メモリ 1 つのマ ク ロ 定義に含まれ る パ ラ メ ー タ 256 メモリ 1 つのマ ク ロ 呼び出 し に含まれ る 引数 256 メモリ 1 行の論理 ソ ース行に含まれ る 文字 65536 メモリ 文字ス ト リ ン グ リ テ ラ ルま たは連結後の ワ イ ド ス ト リ ン グ リ テ ラ ルに含まれ る 文字 65536 メモリ 262144 4294967296 説明 1 つの変換ユニ ッ ト に含まれ る 外部識別子 1 つのブ ロ ッ ク 内で宣言 さ れ る 、 有効範囲がブ ロ ッ ク であ る 識別子 1 つの変換ユニ ッ ト 内で同時に定義 さ れ る マ ク ロ 識別子 C ま たは C++ オブジ ェ ク ト のサ イ ズ (配列を含む) D-2 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ コ ンパイ ラの実装に関する制限 表 D-1 実装に関する制限 (continued) 推奨 ARM 256 メモリ ネ ス ト さ れた switch ス テー ト メ ン ト を除 く 、 1 つの switch ス テー ト メ ン ト の case ラ ベル 16384 メモリ 1 つの ク ラ ス、 構造体、 ま たは共用体に含まれ る デー タ メ ン バの数 16384 メモリ 4096 メモリ 256 メモリ 32 33 16384 メモリ 1 つの ク ラ ス の直接ベース ク ラ ス 1024 メモリ 1 つの ク ラ ス で宣言 さ れ る メ ンバ 4096 メモリ 16384 メモリ 1 つの ク ラ ス が持つ直接お よ び間接仮想ベース 1024 メモリ 1 つの ク ラ ス に含まれ る ス タ テ ィ ッ ク メ ンバ 1024 メモリ 1 つの ク ラ ス に含まれ る フ レ ン ド 宣言 4096 メモリ 1 つの ク ラ ス に含まれ る ア ク セ ス制御宣言 4096 メモリ 1 つの コ ン ス ト ラ ク タ 定義に含まれ る メ ンバ イ ニシ ャ ラ イ ザ 6144 メモリ 256 メモリ ネ ス ト さ れた外部指定子 1024 メモリ 1 つのテ ンプ レー ト 宣言に含まれ る テ ンプ レー ト 引数 1024 メモリ 17 メモリ 1 つの try ブ ロ ッ ク に対す る ハン ド ラ 256 メモリ 1 つの関数宣言に含まれ る throw 指定 256 メモリ 説明 #include フ ァ イ ルのネ ス ト レベル 1 つの列挙型に含まれ る 列挙定数 1 つの struct 宣言 リ ス ト 内にネ ス ト さ れ る ク ラ ス、 構造体、 ま たは共用体定義の レベル atexit() に よ っ て登録 さ れ る 関数 直接お よ び間接ベース ク ラ ス 1 つの ク ラ ス内で最終的にオーバ ラ イ ド さ れ る 仮想関数 (ア ク セ ス可能か ど う かに関係な く ) 1 つの識別子に対す る 有効範囲修飾子 再帰的にネ ス ト さ れたテ ンプ レー ト の イ ン ス タ ン ス ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, D-3 C および C++ コ ンパイ ラの実装に関する制限 D.2 整数値に関する制限 表 D-2 は、 ARM C お よ び C++ におけ る 整数値の範囲を示 し ます。 表の 値の列 は、 範囲の終端の数値を示 し てい ます。 16 進値の列は ARM コ ンパ イ ラ に よ っ て こ の値 と し て解釈 さ れ る ビ ッ ト パ タ ーン を 16 進数で示 し ます。 こ れ ら の定 数は、 limits.h イ ン ク ルー ド フ ァ イ ルで定義 さ れ ます。 定数を入力す る 場合は、 サ イ ズ と 符号の指定に注意 し て下 さ い。 10 進数 と 16 進数 /8 進数では、 定数の解釈が異な り ます。 詳細については、 「参考資料」 (ページ viii) に記述 さ れてい る よ う に、 適切な C/C++ 標準、 ま たは推奨 さ れ る C お よ び C++ の参考書を参照 し て下 さ い。 表 D-2 整数の範囲 D-4 値 16 進値 char の最大値 255 0xFF CHAR_MIN char の最小値 0 0x00 SCHAR_MAX signed char の最大値 127 0x7F SCHAR_MIN signed char の最小値 –128 0x80 UCHAR_MAX unsigned char の最大値 255 0xFF SHRT_MAX short の最大値 32767 0x7FFF SHRT_MIN short の最小値 –32768 0x8000 USHRT_MAX unsigned short の最大値 65535 0xFFFF INT_MAX int の最大値 2147483647 0x7FFFFFFF INT_MIN int の最小値 –2147483648 0x80000000 LONG_MAX long の最大値 2147483647 0x7FFFFFFF LONG_MIN long の最小値 –2147483648 0x80000000 ULONG_MAX unsigned long の最大値 4294967295 0xFFFFFFFF 定数 意味 CHAR_MAX Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ コ ンパイ ラの実装に関する制限 表 D-2 整数の範囲 (continued) 値 16 進値 long long の最大値 9.2E+18 0x7FFFFFFF FFFFFFFF LLONG_MIN long long の最小値 –9.2E+18 0x80000000 00000000 ULLONG_MAX unsigned long long の最大値 1.8E+19 0xFFFFFFFF FFFFFFFF 定数 意味 LLONG_MAX ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, D-5 C および C++ コ ンパイ ラの実装に関する制限 D.3 浮動小数点数に関する制限 こ のセ ク シ ョ ン では、 浮動小数点数の特性について説明 し ます。 表 D-3 は、 浮動小数点数の特性、 範囲、 制限を示 し ます。 こ れ ら の定数は、 float.h イ ン ク ルー ド フ ァ イ ルで定義 さ れます。 表 D-3 浮動小数点数に関する制限 定数 意味 FLT_MAX float の最大値 FLT_MIN float の正規化 さ れた正の最小浮動小数点数値 DBL_MAX double の最大値 1.79769313486231571e+308 DBL_MIN double の正規化 さ れた正の最小浮動小数点数値 2.22507385850720138e–308 LDBL_MAX long double の最大値 1.79769313486231571e+308 LDBL_MIN long double の正規化 さ れた正の最小浮動小数点数値 2.22507385850720138e–308 FLT_MAX_EXP float 型の基数 2 の指数の最大値 128 FLT_MIN_EXP float 型の基数 2 の指数の最小値 –125 DBL_MAX_EXP double 型の基数 2 の指数の最大値 1024 DBL_MIN_EXP double 型の基数 2 の指数の最小値 –1021 LDBL_MAX_EXP long double 型の基数 2 の指数の最大値 1024 LDBL_MIN_EXP long double 型の基数 2 の指数の最小値 –1021 FLT_MAX_10_EXP float 型の基数 10 の指数の最大値 38 FLT_MIN_10_EXP float 型の基数 10 の指数の最小値 –37 DBL_MAX_10_EXP double 型の基数 10 の指数の最大値 308 DBL_MIN_10_EXP double 型の基数 10 の指数の最小値 –307 LDBL_MAX_10_EXP long double 型の基数 10 の指数の最大値 308 LDBL_MIN_10_EXP long double 型の基数 10 の指数の最小値 –307 D-6 値 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, 3.40282347e+38F 1.175494351e–38F ARM DUI 0348BJ ID 1 0 0 4 1 9 C および C++ コ ンパイ ラの実装に関する制限 表 D-4 では、 浮動小数点数のその他の特性について説明 し てい ます。 こ れ ら の定数 も 、 float.h イ ン ク ルー ド フ ァ イ ルで定義 さ れ ます。 表 D-4 浮動小数点数に関する その他の特性 定数 意味 値 FLT_RADIX ARM 浮動小数点数表現のベース (基数) FLT_ROUNDS 浮動小数点数の丸めモー ド FLT_DIG float の精度の 10 進数 6 DBL_DIG double の精度の 10 進数 15 LDBL_DIG long double の精度の 10 進数 15 FLT_MANT_DIG float 型の精度の 2 進数 24 DBL_MANT_DIG double 型の精度の 2 進数 53 LDBL_MANT_DIG long double 型の精度の 2 進数 53 FLT_EPSILON float 型において 1.0 + x != 1.0 が成 り 立つ正の値 x の最小値 1.19209290e–7F DBL_EPSILON double 型において 1.0 + x != 1.0 が成 り 立つ正の値 x の最小 2.2204460492503131e–16 2 (直近の値) 1 値 LDBL_EPSILON long double 型において 1.0 + x != 1.0 が成 り 立つ正の値 x の 2.2204460492503131e–16L 最小値 注 ARM DUI 0348BJ ID 1 0 0 4 1 9 • 浮動小数点数を よ り 精度の低い浮動小数点型の値に変換す る と 、 その値 は表現可能な近似値に丸め ら れます。 • 浮動小数点演算は IEEE 754 に準拠 し てい ます。 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, D-7 C および C++ コ ンパイ ラの実装に関する制限 D-8 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 付録 E NEON サポー ト の使用 こ の付録では、 RealView Compilation Tools (RVCT) の今回の リ リ ース でサ ポー ト さ れてい る NEON 組み込み関数について説明 し ます。 以下のセ ク シ ョ ンか ら 構成 さ れてい ます。 • 「は じ めに」 (ページ E-2) • • ARM DUI 0348BJ ID 1 0 0 4 1 9 「ベ ク タ のデー タ 型」 (ページ E-3) 「コ ンパ イ ラ 組み込み関数」 (ページ E-5) Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-1 NEON サポー ト の使用 E.1 は じ めに RVCT には、 ARM 状態 と Thumb 状態の両方で Cortex-A8 プ ロ セ ッ サ用の NEON コ ー ド を生成で き る コ ンパ イ ラ 組み込み関数があ り ます。 NEON コ ン パ イ ラ 組み込み関数は、 ヘ ッ ダ フ ァ イ ル arm_neon.h で定義 さ れてい ます。 こ の ヘ ッ ダ フ ァ イ ルには、 コ ンパ イ ラ 組み込み関数 と 一連のベ ク タ 型の両方が定 義 さ れてい ます。 ARMv7 よ り 前のアーキ テ ク チ ャ では、 NEON コ ンパ イ ラ 組み込み関数がサ ポー ト さ れてい ません。 こ れ ら の古いバージ ョ ンのアーキ テ ク チ ャ や、 NEON が含まれない ARMv7 アーキ テ ク チ ャ プ ロ フ ァ イ ルを ビル ド の対象 と す る 場 合、 NEON コ ンパ イ ラ 組み込み関数は通常の関数呼び出 し と し て処理 さ れ、 リ ン ク 時にエ ラ ーが発生 し ます。 E-2 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 E.2 ベ ク タ のデー タ 型 次のデー タ 型は、 ベ ク タ を表すために定義 さ れてい ます。 NEON ベ ク タ の デー タ 型は、 次のパ タ ーン に従っ て命名 さ れ ます。 <type><size>x<number of lanes>_t 例えば、 int16x4_t は 4 つの レーン か ら な る ベ ク タ であ り 、 各ベ ク タ に符号付 き の 16 ビ ッ ト 整数が 1 つ含ま れてい ます。 表 E-1 にベ ク タ のデー タ 型を一覧 で示 し ます。 表 E-1 ベ ク タ のデー タ 型 int8x8_t int8x16_t int16x4_t int16x8_t int32x2_t int32x4_t int64x1_t int64x2_t uint8x8_t uint8x16_t uint16x4_t uint16x8_t uint32x2_t uint32x4_t uint64x1_t uint64x2_t float16x4_t float16x8_t float32x2_t float32x4_t poly8x8_t poly8x16_t poly16x4_t poly16x8_t コ ンパ イ ラ 組み込み関数の中には、 次の よ う なベ ク タ 型の配列を使用す る も のがあ り ます。 <type><size>x<number of lanes>x<length of array>_t こ れ ら の型は、 val と い う 1 つの要素を持つ通常の C 構造体 と し て処理 さ れま す。 サ ンプル構造体の定義は次の よ う にな り ます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-3 NEON サポー ト の使用 struct int16x4x2_t { int16x4_t val[2]; }; 表 E-1 (ページ E-3) に示 し たベ ク タ 型について も 、 配列長が 2 ~ 4 の配列型 が定義 さ れてい ます。 E-4 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 E.3 コ ンパイ ラ組み込み関数 本付録で説明す る コ ンパ イ ラ 組み込み関数は、 NEON 命令にほぼその ま ま対 応 し てい ます。 各セ ク シ ョ ンは関数プ ロ ト タ イ プの リ ス ト で始ま り ます。 こ の リ ス ト には、 対応す る アセ ンブ ラ 命令を示す コ メ ン ト が付いてい ます。 命 令は必要なセマ ン テ ィ ッ ク ス に応 じ て コ ンパ イ ラ に よ り 自動的に選択 さ れま すが、 リ ス ト に示す と お り の命令が生成 さ れ る 保証はあ り ません。 コ ンパ イ ラ 組み込み関数では、 NEON 統一アセ ン ブ ラ 構文に似た命名方式が 使用 さ れてい ます。 つま り 、 それぞれの コ ンパ イ ラ 組み込み関数は以下を形 成 し ます。 <opname><flags>_<type> コ ンパ イ ラ 組み込み関数が 128 ビ ッ ト ベ ク タ で動作す る よ う に指定す る q フ ラ グが追加で提供 さ れてい ます。 以下に例を示 し ます。 • vmul_s16 は、 符号付 き 16 ビ ッ ト 値の 2 つのベ ク タ を乗算 し ます。 こ れは、 VMUL.I16 d2, d0, d1 に コ ンパ イ ル さ れます。 • vaddl_u8 は、符号な し 8 ビ ッ ト 値を含む 2 つの 64 ビ ッ ト ベ ク タ の long 加 算です。 こ の演算の結果は、 符合な し 16 ビ ッ ト 値の 128 ビ ッ ト ベ ク タ にな り ます。 こ れは、 VADDL.U8 q1, d0, d1 に コ ンパ イ ル さ れます。 注 こ の項で示す コ ンパ イ ラ 組み込み関数のプ ロ ト タ イ プでは、 次の型注釈が使 用 さ れてい ます。 __const(n) 引数 n は コ ンパ イ ル時定数でなければな り ません。 __constrange(min, max) 引数は min ~ max の範囲内の コ ンパ イ ル時定数でなければな り ま せん。 __transfersize(n) コ ンパ イ ラ 組み込み関数に よ っ て こ のポ イ ン タ か ら n バ イ ト が ロ ー ド さ れます。 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-5 NEON サポー ト の使用 注 __fp16 を使用す る NEON コ ンパ イ ラ 組み込み関数のプ ロ ト タ イ プは、 NEON 半精度 VFP 拡張のあ る タ ーゲ ッ ト で し か使用で き ません。 __fp16 の使用を イ ネーブルす る には、 --fp16_format コ マ ン ド ラ イ ン オプシ ョ ン を使用 し ます。 詳 細については、 「--fp16_format=format」 (ページ 2-67) を参照 し て下 さ い。 E.3.1 加算 以下の コ ンパ イ ラ 組み込み関数では、 ベ ク タ を加算 し ます。 結果値の各レー ンは、 各オペ ラ ン ド ベ ク タ の対応す る レーン を加算 し た結果にな り ます。 演 算は次の よ う に行われ ます。 • 「ベ ク タ 加算 : vadd -> Vr[i]:=Va[i]+Vb[i]」 • • • • 「ベ ク タ 加算 (long) : vadd -> Vr[i]:=Va[i]+Vb[i]」 (ページ E-7) 「ベ ク タ 加算 (ワ イ ド ) : vadd -> Vr[i]:=Va[i]+Vb[i]」 (ページ E-7) 「ベ ク タ 二分加算 : vhadd -> Vr[i]:=(Va[i]+Vb[i])>>1」 (ページ E-7) 「ベ ク タ 丸め二分加算 : vrhadd -> Vr[i]:=(Va[i]+Vb[i]+1)>>1」 (ページ E-7) • 「サチ ュ レー ト ベ ク タ 加算 : vqadd -> Vr[i]:=sat<size>(Va[i]+Vb[i])」 (ページ E-8) • • 「ベ ク タ 加算、 上位半分 -> Vr[i]:=Va[i]+Vb[i]」 (ページ E-8) 「ベ ク タ 丸め加算、 上位半分」 (ページ E-8) ベ ク タ 加算 : vadd -> Vr[i]:=Va[i]+Vb[i] Vr、 Va、 Vb の レーンサ イ ズは同 じ です。 int8x8_t int16x4_t int32x2_t int64x1_t float32x2_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t float32x4_t E-6 vadd_s8(int8x8_t a, int8x8_t b); vadd_s16(int16x4_t a, int16x4_t b); vadd_s32(int32x2_t a, int32x2_t b); vadd_s64(int64x1_t a, int64x1_t b); vadd_f32(float32x2_t a, float32x2_t b); vadd_u8(uint8x8_t a, uint8x8_t b); vadd_u16(uint16x4_t a, uint16x4_t b); vadd_u32(uint32x2_t a, uint32x2_t b); vadd_u64(uint64x1_t a, uint64x1_t b); vaddq_s8(int8x16_t a, int8x16_t b); vaddq_s16(int16x8_t a, int16x8_t b); vaddq_s32(int32x4_t a, int32x4_t b); vaddq_s64(int64x2_t a, int64x2_t b); vaddq_f32(float32x4_t a, float32x4_t b); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, // // // // // // // // // // // // // // VADD.I8 d0,d0,d0 VADD.I16 d0,d0,d0 VADD.I32 d0,d0,d0 VADD.I64 d0,d0,d0 VADD.F32 d0,d0,d0 VADD.I8 d0,d0,d0 VADD.I16 d0,d0,d0 VADD.I32 d0,d0,d0 VADD.I64 d0,d0,d0 VADD.I8 q0,q0,q0 VADD.I16 q0,q0,q0 VADD.I32 q0,q0,q0 VADD.I64 q0,q0,q0 VADD.F32 q0,q0,q0 ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 uint8x16_t uint16x8_t uint32x4_t uint64x2_t vaddq_u8(uint8x16_t a, uint8x16_t b); vaddq_u16(uint16x8_t a, uint16x8_t b); vaddq_u32(uint32x4_t a, uint32x4_t b); vaddq_u64(uint64x2_t a, uint64x2_t b); // // // // VADD.I8 q0,q0,q0 VADD.I16 q0,q0,q0 VADD.I32 q0,q0,q0 VADD.I64 q0,q0,q0 ベ ク タ 加算 (long) : vadd -> Vr[i]:=Va[i]+Vb[i] Va と Vb の レーンサ イ ズは同 じ です。 結果は、 幅の 2 倍に当た る 128 ビ ッ ト ベ ク タ レーン にな り ます。 int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t vaddl_s8(int8x8_t a, int8x8_t b); vaddl_s16(int16x4_t a, int16x4_t b); vaddl_s32(int32x2_t a, int32x2_t b); vaddl_u8(uint8x8_t a, uint8x8_t b); vaddl_u16(uint16x4_t a, uint16x4_t b); vaddl_u32(uint32x2_t a, uint32x2_t b); // // // // // // VADDL.S8 q0,d0,d0 VADDL.S16 q0,d0,d0 VADDL.S32 q0,d0,d0 VADDL.U8 q0,d0,d0 VADDL.U16 q0,d0,d0 VADDL.U32 q0,d0,d0 ベ ク タ 加算 (ワ イ ド ) : vadd -> Vr[i]:=Va[i]+Vb[i] int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t vaddw_s8(int16x8_t a, int8x8_t b); vaddw_s16(int32x4_t a, int16x4_t b); vaddw_s32(int64x2_t a, int32x2_t b); vaddw_u8(uint16x8_t a, uint8x8_t b); vaddw_u16(uint32x4_t a, uint16x4_t b); vaddw_u32(uint64x2_t a, uint32x2_t b); // // // // // // VADDW.S8 q0,q0,d0 VADDW.S16 q0,q0,d0 VADDW.S32 q0,q0,d0 VADDW.U8 q0,q0,d0 VADDW.U16 q0,q0,d0 VADDW.U32 q0,q0,d0 ベ ク タ 二分加算 : vhadd -> Vr[i]:=(Va[i]+Vb[i])>>1 int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t int8x16_t int16x8_t int32x4_t uint8x16_t uint16x8_t uint32x4_t vhadd_s8(int8x8_t a, int8x8_t b); vhadd_s16(int16x4_t a, int16x4_t b); vhadd_s32(int32x2_t a, int32x2_t b); vhadd_u8(uint8x8_t a, uint8x8_t b); vhadd_u16(uint16x4_t a, uint16x4_t b); vhadd_u32(uint32x2_t a, uint32x2_t b); vhaddq_s8(int8x16_t a, int8x16_t b); vhaddq_s16(int16x8_t a, int16x8_t b); vhaddq_s32(int32x4_t a, int32x4_t b); vhaddq_u8(uint8x16_t a, uint8x16_t b); vhaddq_u16(uint16x8_t a, uint16x8_t b); vhaddq_u32(uint32x4_t a, uint32x4_t b); // // // // // // // // // // // // VHADD.S8 d0,d0,d0 VHADD.S16 d0,d0,d0 VHADD.S32 d0,d0,d0 VHADD.U8 d0,d0,d0 VHADD.U16 d0,d0,d0 VHADD.U32 d0,d0,d0 VHADD.S8 q0,q0,q0 VHADD.S16 q0,q0,q0 VHADD.S32 q0,q0,q0 VHADD.U8 q0,q0,q0 VHADD.U16 q0,q0,q0 VHADD.U32 q0,q0,q0 ベ ク タ 丸め二分加算 : vrhadd -> Vr[i]:=(Va[i]+Vb[i]+1)>>1 int8x8_t int16x4_t int32x2_t uint8x8_t ARM DUI 0348BJ ID 1 0 0 4 1 9 vrhadd_s8(int8x8_t a, int8x8_t b); vrhadd_s16(int16x4_t a, int16x4_t b); vrhadd_s32(int32x2_t a, int32x2_t b); vrhadd_u8(uint8x8_t a, uint8x8_t b); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, // // // // VRHADD.S8 d0,d0,d0 VRHADD.S16 d0,d0,d0 VRHADD.S32 d0,d0,d0 VRHADD.U8 d0,d0,d0 E-7 NEON サポー ト の使用 uint16x4_t uint32x2_t int8x16_t int16x8_t int32x4_t uint8x16_t uint16x8_t uint32x4_t vrhadd_u16(uint16x4_t a, uint16x4_t b); vrhadd_u32(uint32x2_t a, uint32x2_t b); vrhaddq_s8(int8x16_t a, int8x16_t b); vrhaddq_s16(int16x8_t a, int16x8_t b); vrhaddq_s32(int32x4_t a, int32x4_t b); vrhaddq_u8(uint8x16_t a, uint8x16_t b); vrhaddq_u16(uint16x8_t a, uint16x8_t b); vrhaddq_u32(uint32x4_t a, uint32x4_t b); // // // // // // // // VRHADD.U16 d0,d0,d0 VRHADD.U32 d0,d0,d0 VRHADD.S8 q0,q0,q0 VRHADD.S16 q0,q0,q0 VRHADD.S32 q0,q0,q0 VRHADD.U8 q0,q0,q0 VRHADD.U16 q0,q0,q0 VRHADD.U32 q0,q0,q0 サチ ュ レ ー ト ベ ク タ 加算 : vqadd -> Vr[i]:=sat<size>(Va[i]+Vb[i]) int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vqadd_s8(int8x8_t a, int8x8_t b); vqadd_s16(int16x4_t a, int16x4_t b); vqadd_s32(int32x2_t a, int32x2_t b); vqadd_s64(int64x1_t a, int64x1_t b); vqadd_u8(uint8x8_t a, uint8x8_t b); vqadd_u16(uint16x4_t a, uint16x4_t b); vqadd_u32(uint32x2_t a, uint32x2_t b); vqadd_u64(uint64x1_t a, uint64x1_t b); vqaddq_s8(int8x16_t a, int8x16_t b); vqaddq_s16(int16x8_t a, int16x8_t b); vqaddq_s32(int32x4_t a, int32x4_t b); vqaddq_s64(int64x2_t a, int64x2_t b); vqaddq_u8(uint8x16_t a, uint8x16_t b); vqaddq_u16(uint16x8_t a, uint16x8_t b); vqaddq_u32(uint32x4_t a, uint32x4_t b); vqaddq_u64(uint64x2_t a, uint64x2_t b); // // // // // // // // // // // // // // // // VQADD.S8 d0,d0,d0 VQADD.S16 d0,d0,d0 VQADD.S32 d0,d0,d0 VQADD.S64 d0,d0,d0 VQADD.U8 d0,d0,d0 VQADD.U16 d0,d0,d0 VQADD.U32 d0,d0,d0 VQADD.U64 d0,d0,d0 VQADD.S8 q0,q0,q0 VQADD.S16 q0,q0,q0 VQADD.S32 q0,q0,q0 VQADD.S64 q0,q0,q0 VQADD.U8 q0,q0,q0 VQADD.U16 q0,q0,q0 VQADD.U32 q0,q0,q0 VQADD.U64 q0,q0,q0 // // // // // // VADDHN.I16 VADDHN.I32 VADDHN.I64 VADDHN.I16 VADDHN.I32 VADDHN.I64 ベ ク タ 加算、 上位半分 -> Vr[i]:=Va[i]+Vb[i] int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t vaddhn_s16(int16x8_t a, int16x8_t b); vaddhn_s32(int32x4_t a, int32x4_t b); vaddhn_s64(int64x2_t a, int64x2_t b); vaddhn_u16(uint16x8_t a, uint16x8_t b); vaddhn_u32(uint32x4_t a, uint32x4_t b); vaddhn_u64(uint64x2_t a, uint64x2_t b); d0,q0,q0 d0,q0,q0 d0,q0,q0 d0,q0,q0 d0,q0,q0 d0,q0,q0 ベ ク タ 丸め加算、 上位半分 int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t E-8 vraddhn_s16(int16x8_t a, int16x8_t b); vraddhn_s32(int32x4_t a, int32x4_t b); vraddhn_s64(int64x2_t a, int64x2_t b); vraddhn_u16(uint16x8_t a, uint16x8_t b); vraddhn_u32(uint32x4_t a, uint32x4_t b); vraddhn_u64(uint64x2_t a, uint64x2_t b); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, // // // // // // VRADDHN.I16 VRADDHN.I32 VRADDHN.I64 VRADDHN.I16 VRADDHN.I32 VRADDHN.I64 d0,q0,q0 d0,q0,q0 d0,q0,q0 d0,q0,q0 d0,q0,q0 d0,q0,q0 ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 E.3.2 乗算 以下の コ ンパ イ ラ 組み込み関数は、 乗算を含む演算に使用 し ます。 ベ ク タ 乗算 : vmul -> Vr[i] := Va[i] * Vb[i] int8x8_t int16x4_t int32x2_t float32x2_t uint8x8_t uint16x4_t uint32x2_t poly8x8_t int8x16_t int16x8_t int32x4_t float32x4_t uint8x16_t uint16x8_t uint32x4_t poly8x16_t vmul_s8(int8x8_t a, int8x8_t b); vmul_s16(int16x4_t a, int16x4_t b); vmul_s32(int32x2_t a, int32x2_t b); vmul_f32(float32x2_t a, float32x2_t b); vmul_u8(uint8x8_t a, uint8x8_t b); vmul_u16(uint16x4_t a, uint16x4_t b); vmul_u32(uint32x2_t a, uint32x2_t b); vmul_p8(poly8x8_t a, poly8x8_t b); vmulq_s8(int8x16_t a, int8x16_t b); vmulq_s16(int16x8_t a, int16x8_t b); vmulq_s32(int32x4_t a, int32x4_t b); vmulq_f32(float32x4_t a, float32x4_t b); vmulq_u8(uint8x16_t a, uint8x16_t b); vmulq_u16(uint16x8_t a, uint16x8_t b); vmulq_u32(uint32x4_t a, uint32x4_t b); vmulq_p8(poly8x16_t a, poly8x16_t b); // // // // // // // // // // // // // // // // VMUL.I8 d0,d0,d0 VMUL.I16 d0,d0,d0 VMUL.I32 d0,d0,d0 VMUL.F32 d0,d0,d0 VMUL.I8 d0,d0,d0 VMUL.I16 d0,d0,d0 VMUL.I32 d0,d0,d0 VMUL.P8 d0,d0,d0 VMUL.I8 q0,q0,q0 VMUL.I16 q0,q0,q0 VMUL.I32 q0,q0,q0 VMUL.F32 q0,q0,q0 VMUL.I8 q0,q0,q0 VMUL.I16 q0,q0,q0 VMUL.I32 q0,q0,q0 VMUL.P8 q0,q0,q0 ベ ク タ 積和 : vmla -> Vr[i] := Va[i] + Vb[i] * Vc[i] int8x8_t int16x4_t int32x2_t float32x2_t uint8x8_t uint16x4_t uint32x2_t int8x16_t int16x8_t int32x4_t float32x4_t uint8x16_t uint16x8_t uint32x4_t vmla_s8(int8x8_t a, int8x8_t b, int8x8_t c); vmla_s16(int16x4_t a, int16x4_t b, int16x4_t c); vmla_s32(int32x2_t a, int32x2_t b, int32x2_t c); vmla_f32(float32x2_t a, float32x2_t b, float32x2_t c); vmla_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); vmla_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c); vmla_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c); vmlaq_s8(int8x16_t a, int8x16_t b, int8x16_t c); vmlaq_s16(int16x8_t a, int16x8_t b, int16x8_t c); vmlaq_s32(int32x4_t a, int32x4_t b, int32x4_t c); vmlaq_f32(float32x4_t a, float32x4_t b, float32x4_t c); vmlaq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c); vmlaq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c); vmlaq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c); // // // // // // // // // // // // // // VMLA.I8 d0,d0,d0 VMLA.I16 d0,d0,d0 VMLA.I32 d0,d0,d0 VMLA.F32 d0,d0,d0 VMLA.I8 d0,d0,d0 VMLA.I16 d0,d0,d0 VMLA.I32 d0,d0,d0 VMLA.I8 q0,q0,q0 VMLA.I16 q0,q0,q0 VMLA.I32 q0,q0,q0 VMLA.F32 q0,q0,q0 VMLA.I8 q0,q0,q0 VMLA.I16 q0,q0,q0 VMLA.I32 q0,q0,q0 ベ ク タ 積和 (long) : vmla -> Vr[i] := Va[i] + Vb[i] * Vc[i] int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t vmlal_s8(int16x8_t a, int8x8_t b, int8x8_t c); vmlal_s16(int32x4_t a, int16x4_t b, int16x4_t c); vmlal_s32(int64x2_t a, int32x2_t b, int32x2_t c); vmlal_u8(uint16x8_t a, uint8x8_t b, uint8x8_t c); vmlal_u16(uint32x4_t a, uint16x4_t b, uint16x4_t c); vmlal_u32(uint64x2_t a, uint32x2_t b, uint32x2_t c); ARM DUI 0348BJ ID 1 0 0 4 1 9 // // // // // // VMLAL.S8 q0,d0,d0 VMLAL.S16 q0,d0,d0 VMLAL.S32 q0,d0,d0 VMLAL.U8 q0,d0,d0 VMLAL.U16 q0,d0,d0 VMLAL.U32 q0,d0,d0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-9 NEON サポー ト の使用 ベ ク タ 積差 : vmls -> Vr[i] := Va[i] - Vb[i] * Vc[i] int8x8_t int16x4_t int32x2_t float32x2_t uint8x8_t uint16x4_t uint32x2_t int8x16_t int16x8_t int32x4_t float32x4_t uint8x16_t uint16x8_t uint32x4_t vmls_s8(int8x8_t a, int8x8_t b, int8x8_t c); vmls_s16(int16x4_t a, int16x4_t b, int16x4_t c); vmls_s32(int32x2_t a, int32x2_t b, int32x2_t c); vmls_f32(float32x2_t a, float32x2_t b, float32x2_t c); vmls_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); vmls_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c); vmls_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c); vmlsq_s8(int8x16_t a, int8x16_t b, int8x16_t c); vmlsq_s16(int16x8_t a, int16x8_t b, int16x8_t c); vmlsq_s32(int32x4_t a, int32x4_t b, int32x4_t c); vmlsq_f32(float32x4_t a, float32x4_t b, float32x4_t c); vmlsq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c); vmlsq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c); vmlsq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c); // // // // // // // // // // // // // // VMLS.I8 d0,d0,d0 VMLS.I16 d0,d0,d0 VMLS.I32 d0,d0,d0 VMLS.F32 d0,d0,d0 VMLS.I8 d0,d0,d0 VMLS.I16 d0,d0,d0 VMLS.I32 d0,d0,d0 VMLS.I8 q0,q0,q0 VMLS.I16 q0,q0,q0 VMLS.I32 q0,q0,q0 VMLS.F32 q0,q0,q0 VMLS.I8 q0,q0,q0 VMLS.I16 q0,q0,q0 VMLS.I32 q0,q0,q0 ベ ク タ 積差 (long) int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t vmlsl_s8(int16x8_t a, int8x8_t b, int8x8_t c); vmlsl_s16(int32x4_t a, int16x4_t b, int16x4_t c); vmlsl_s32(int64x2_t a, int32x2_t b, int32x2_t c); vmlsl_u8(uint16x8_t a, uint8x8_t b, uint8x8_t c); vmlsl_u16(uint32x4_t a, uint16x4_t b, uint16x4_t c); vmlsl_u32(uint64x2_t a, uint32x2_t b, uint32x2_t c); // // // // // // VMLSL.S8 q0,d0,d0 VMLSL.S16 q0,d0,d0 VMLSL.S32 q0,d0,d0 VMLSL.U8 q0,d0,d0 VMLSL.U16 q0,d0,d0 VMLSL.U32 q0,d0,d0 ベ ク タ サチ ュ レ ー ト ダ ブル乗算、 上位半分 int16x4_t int32x2_t int16x8_t int32x4_t vqdmulh_s16(int16x4_t a, int16x4_t b); vqdmulh_s32(int32x2_t a, int32x2_t b); vqdmulhq_s16(int16x8_t a, int16x8_t b); vqdmulhq_s32(int32x4_t a, int32x4_t b); // // // // VQDMULH.S16 VQDMULH.S32 VQDMULH.S16 VQDMULH.S32 d0,d0,d0 d0,d0,d0 q0,q0,q0 q0,q0,q0 サチ ュ レ ー ト 丸めベ ク タ ダブル乗算、 上位半分 int16x4_t int32x2_t int16x8_t int32x4_t vqrdmulh_s16(int16x4_t a, int16x4_t b); vqrdmulh_s32(int32x2_t a, int32x2_t b); vqrdmulhq_s16(int16x8_t a, int16x8_t b); vqrdmulhq_s32(int32x4_t a, int32x4_t b); // // // // VQRDMULH.S16 VQRDMULH.S32 VQRDMULH.S16 VQRDMULH.S32 d0,d0,d0 d0,d0,d0 q0,q0,q0 q0,q0,q0 サチ ュ レ ー ト ベ ク タ ダ ブル積和 (long) int32x4_t vqdmlal_s16(int32x4_t a, int16x4_t b, int16x4_t c); // VQDMLAL.S16 q0,d0,d0 int64x2_t vqdmlal_s32(int64x2_t a, int32x2_t b, int32x2_t c); // VQDMLAL.S32 q0,d0,d0 E-10 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 サチ ュ レー ト ベ ク タ ダ ブル積差 (long) int32x4_t vqdmlsl_s16(int32x4_t a, int16x4_t b, int16x4_t c); // VQDMLSL.S16 q0,d0,d0 int64x2_t vqdmlsl_s32(int64x2_t a, int32x2_t b, int32x2_t c); // VQDMLSL.S32 q0,d0,d0 ベ ク タ 乗算 (long) int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t poly16x8_t vmull_s8(int8x8_t a, int8x8_t b); vmull_s16(int16x4_t a, int16x4_t b); vmull_s32(int32x2_t a, int32x2_t b); vmull_u8(uint8x8_t a, uint8x8_t b); vmull_u16(uint16x4_t a, uint16x4_t b); vmull_u32(uint32x2_t a, uint32x2_t b); vmull_p8(poly8x8_t a, poly8x8_t b); // // // // // // // VMULL.S8 q0,d0,d0 VMULL.S16 q0,d0,d0 VMULL.S32 q0,d0,d0 VMULL.U8 q0,d0,d0 VMULL.U16 q0,d0,d0 VMULL.U32 q0,d0,d0 VMULL.P8 q0,d0,d0 サチ ュ レー ト ベ ク タ ダ ブル乗算 (long) int32x4_t vqdmull_s16(int16x4_t a, int16x4_t b); // VQDMULL.S16 q0,d0,d0 int64x2_t vqdmull_s32(int32x2_t a, int32x2_t b); // VQDMULL.S32 q0,d0,d0 E.3.3 減算 以下の コ ンパ イ ラ 組み込み関数は、 減算を含む演算に使用 し ます。 ベ ク タ 減算 int8x8_t int16x4_t int32x2_t int64x1_t float32x2_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t float32x4_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t ARM DUI 0348BJ ID 1 0 0 4 1 9 vsub_s8(int8x8_t a, int8x8_t b); vsub_s16(int16x4_t a, int16x4_t b); vsub_s32(int32x2_t a, int32x2_t b); vsub_s64(int64x1_t a, int64x1_t b); vsub_f32(float32x2_t a, float32x2_t b); vsub_u8(uint8x8_t a, uint8x8_t b); vsub_u16(uint16x4_t a, uint16x4_t b); vsub_u32(uint32x2_t a, uint32x2_t b); vsub_u64(uint64x1_t a, uint64x1_t b); vsubq_s8(int8x16_t a, int8x16_t b); vsubq_s16(int16x8_t a, int16x8_t b); vsubq_s32(int32x4_t a, int32x4_t b); vsubq_s64(int64x2_t a, int64x2_t b); vsubq_f32(float32x4_t a, float32x4_t b); vsubq_u8(uint8x16_t a, uint8x16_t b); vsubq_u16(uint16x8_t a, uint16x8_t b); vsubq_u32(uint32x4_t a, uint32x4_t b); vsubq_u64(uint64x2_t a, uint64x2_t b); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, // // // // // // // // // // // // // // // // // // VSUB.I8 d0,d0,d0 VSUB.I16 d0,d0,d0 VSUB.I32 d0,d0,d0 VSUB.I64 d0,d0,d0 VSUB.F32 d0,d0,d0 VSUB.I8 d0,d0,d0 VSUB.I16 d0,d0,d0 VSUB.I32 d0,d0,d0 VSUB.I64 d0,d0,d0 VSUB.I8 q0,q0,q0 VSUB.I16 q0,q0,q0 VSUB.I32 q0,q0,q0 VSUB.I64 q0,q0,q0 VSUB.F32 q0,q0,q0 VSUB.I8 q0,q0,q0 VSUB.I16 q0,q0,q0 VSUB.I32 q0,q0,q0 VSUB.I64 q0,q0,q0 E-11 NEON サポー ト の使用 ベ ク タ 減算 (long) : vsub -> Vr[i]:=Va[i]+Vb[i] int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t vsubl_s8(int8x8_t a, int8x8_t b); vsubl_s16(int16x4_t a, int16x4_t b); vsubl_s32(int32x2_t a, int32x2_t b); vsubl_u8(uint8x8_t a, uint8x8_t b); vsubl_u16(uint16x4_t a, uint16x4_t b); vsubl_u32(uint32x2_t a, uint32x2_t b); // // // // // // VSUBL.S8 q0,d0,d0 VSUBL.S16 q0,d0,d0 VSUBL.S32 q0,d0,d0 VSUBL.U8 q0,d0,d0 VSUBL.U16 q0,d0,d0 VSUBL.U32 q0,d0,d0 ベ ク タ 減算 (ワ イ ド ) : vsub -> Vr[i]:=Va[i]+Vb[i] int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t vsubw_s8(int16x8_t a, int8x8_t b); vsubw_s16(int32x4_t a, int16x4_t b); vsubw_s32(int64x2_t a, int32x2_t b); vsubw_u8(uint16x8_t a, uint8x8_t b); vsubw_u16(uint32x4_t a, uint16x4_t b); vsubw_u32(uint64x2_t a, uint32x2_t b); // // // // // // VSUBW.S8 q0,q0,d0 VSUBW.S16 q0,q0,d0 VSUBW.S32 q0,q0,d0 VSUBW.U8 q0,q0,d0 VSUBW.U16 q0,q0,d0 VSUBW.U32 q0,q0,d0 サチ ュ レ ー ト ベ ク タ 減算 int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vqsub_s8(int8x8_t a, int8x8_t b); vqsub_s16(int16x4_t a, int16x4_t b); vqsub_s32(int32x2_t a, int32x2_t b); vqsub_s64(int64x1_t a, int64x1_t b); vqsub_u8(uint8x8_t a, uint8x8_t b); vqsub_u16(uint16x4_t a, uint16x4_t b); vqsub_u32(uint32x2_t a, uint32x2_t b); vqsub_u64(uint64x1_t a, uint64x1_t b); vqsubq_s8(int8x16_t a, int8x16_t b); vqsubq_s16(int16x8_t a, int16x8_t b); vqsubq_s32(int32x4_t a, int32x4_t b); vqsubq_s64(int64x2_t a, int64x2_t b); vqsubq_u8(uint8x16_t a, uint8x16_t b); vqsubq_u16(uint16x8_t a, uint16x8_t b); vqsubq_u32(uint32x4_t a, uint32x4_t b); vqsubq_u64(uint64x2_t a, uint64x2_t b); // // // // // // // // // // // // // // // // VQSUB.S8 d0,d0,d0 VQSUB.S16 d0,d0,d0 VQSUB.S32 d0,d0,d0 VQSUB.S64 d0,d0,d0 VQSUB.U8 d0,d0,d0 VQSUB.U16 d0,d0,d0 VQSUB.U32 d0,d0,d0 VQSUB.U64 d0,d0,d0 VQSUB.S8 q0,q0,q0 VQSUB.S16 q0,q0,q0 VQSUB.S32 q0,q0,q0 VQSUB.S64 q0,q0,q0 VQSUB.U8 q0,q0,q0 VQSUB.U16 q0,q0,q0 VQSUB.U32 q0,q0,q0 VQSUB.U64 q0,q0,q0 // // // // // // // // // VHSUB.S8 d0,d0,d0 VHSUB.S16 d0,d0,d0 VHSUB.S32 d0,d0,d0 VHSUB.U8 d0,d0,d0 VHSUB.U16 d0,d0,d0 VHSUB.U32 d0,d0,d0 VHSUB.S8 q0,q0,q0 VHSUB.S16 q0,q0,q0 VHSUB.S32 q0,q0,q0 ベ ク タ 二分減算 int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t int8x16_t int16x8_t int32x4_t E-12 vhsub_s8(int8x8_t a, int8x8_t b); vhsub_s16(int16x4_t a, int16x4_t b); vhsub_s32(int32x2_t a, int32x2_t b); vhsub_u8(uint8x8_t a, uint8x8_t b); vhsub_u16(uint16x4_t a, uint16x4_t b); vhsub_u32(uint32x2_t a, uint32x2_t b); vhsubq_s8(int8x16_t a, int8x16_t b); vhsubq_s16(int16x8_t a, int16x8_t b); vhsubq_s32(int32x4_t a, int32x4_t b); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 uint8x16_t vhsubq_u8(uint8x16_t a, uint8x16_t b); // VHSUB.U8 q0,q0,q0 uint16x8_t vhsubq_u16(uint16x8_t a, uint16x8_t b); // VHSUB.U16 q0,q0,q0 uint32x4_t vhsubq_u32(uint32x4_t a, uint32x4_t b); // VHSUB.U32 q0,q0,q0 ベ ク タ 減算、 上位半分 int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t vsubhn_s16(int16x8_t a, int16x8_t b); vsubhn_s32(int32x4_t a, int32x4_t b); vsubhn_s64(int64x2_t a, int64x2_t b); vsubhn_u16(uint16x8_t a, uint16x8_t b); vsubhn_u32(uint32x4_t a, uint32x4_t b); vsubhn_u64(uint64x2_t a, uint64x2_t b); // // // // // // VSUBHN.I16 VSUBHN.I32 VSUBHN.I64 VSUBHN.I16 VSUBHN.I32 VSUBHN.I64 d0,q0,q0 d0,q0,q0 d0,q0,q0 d0,q0,q0 d0,q0,q0 d0,q0,q0 丸めベ ク タ 減算、 上位半分 int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t E.3.4 vrsubhn_s16(int16x8_t a, int16x8_t b); vrsubhn_s32(int32x4_t a, int32x4_t b); vrsubhn_s64(int64x2_t a, int64x2_t b); vrsubhn_u16(uint16x8_t a, uint16x8_t b); vrsubhn_u32(uint32x4_t a, uint32x4_t b); vrsubhn_u64(uint64x2_t a, uint64x2_t b); // // // // // // VRSUBHN.I16 VRSUBHN.I32 VRSUBHN.I64 VRSUBHN.I16 VRSUBHN.I32 VRSUBHN.I64 d0,q0,q0 d0,q0,q0 d0,q0,q0 d0,q0,q0 d0,q0,q0 d0,q0,q0 比較 多様な比較用 コ ンパ イ ラ 組み込み関数が用意 さ れてい ます。 あ る レーン に関 し て比較が真であ る 場合、 その レーンの結果はすべての ビ ッ ト が 1 に設定 さ れ ます。 あ る レーンに関 し て比較が偽であ る 場合、 すべてのビ ッ ト は 0 に設定 さ れ ます。 戻 り 値の型は符号な し 整数です。 こ れは、 比較の結果を vbsl コ ンパ イ ラ 組み込み関数の最初の引数 と し て使用で き る こ と を意味 し ます。 ベ ク タ 比較 (等 し い) uint8x8_t uint16x4_t uint32x2_t uint32x2_t uint8x8_t uint16x4_t uint32x2_t uint8x8_t uint8x16_t uint16x8_t uint32x4_t uint32x4_t uint8x16_t ARM DUI 0348BJ ID 1 0 0 4 1 9 vceq_s8(int8x8_t a, int8x8_t b); vceq_s16(int16x4_t a, int16x4_t b); vceq_s32(int32x2_t a, int32x2_t b); vceq_f32(float32x2_t a, float32x2_t b); vceq_u8(uint8x8_t a, uint8x8_t b); vceq_u16(uint16x4_t a, uint16x4_t b); vceq_u32(uint32x2_t a, uint32x2_t b); vceq_p8(poly8x8_t a, poly8x8_t b); vceqq_s8(int8x16_t a, int8x16_t b); vceqq_s16(int16x8_t a, int16x8_t b); vceqq_s32(int32x4_t a, int32x4_t b); vceqq_f32(float32x4_t a, float32x4_t b); vceqq_u8(uint8x16_t a, uint8x16_t b); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, // // // // // // // // // // // // // VCEQ.I8 d0, d0, d0 VCEQ.I16 d0, d0, d0 VCEQ.I32 d0, d0, d0 VCEQ.F32 d0, d0, d0 VCEQ.I8 d0, d0, d0 VCEQ.I16 d0, d0, d0 VCEQ.I32 d0, d0, d0 VCEQ.I8 d0, d0, d0 VCEQ.I8 q0, q0, q0 VCEQ.I16 q0, q0, q0 VCEQ.I32 q0, q0, q0 VCEQ.F32 q0, q0, q0 VCEQ.I8 q0, q0, q0 E-13 NEON サポー ト の使用 uint16x8_t vceqq_u16(uint16x8_t a, uint16x8_t b); uint32x4_t vceqq_u32(uint32x4_t a, uint32x4_t b); uint8x16_t vceqq_p8(poly8x16_t a, poly8x16_t b); // VCEQ.I16 q0, q0, q0 // VCEQ.I32 q0, q0, q0 // VCEQ.I8 q0, q0, q0 ベ ク タ 比較 (以上) uint8x8_t uint16x4_t uint32x2_t uint32x2_t uint8x8_t uint16x4_t uint32x2_t uint8x16_t uint16x8_t uint32x4_t uint32x4_t uint8x16_t uint16x8_t uint32x4_t vcge_s8(int8x8_t a, int8x8_t b); vcge_s16(int16x4_t a, int16x4_t b); vcge_s32(int32x2_t a, int32x2_t b); vcge_f32(float32x2_t a, float32x2_t b); vcge_u8(uint8x8_t a, uint8x8_t b); vcge_u16(uint16x4_t a, uint16x4_t b); vcge_u32(uint32x2_t a, uint32x2_t b); vcgeq_s8(int8x16_t a, int8x16_t b); vcgeq_s16(int16x8_t a, int16x8_t b); vcgeq_s32(int32x4_t a, int32x4_t b); vcgeq_f32(float32x4_t a, float32x4_t b); vcgeq_u8(uint8x16_t a, uint8x16_t b); vcgeq_u16(uint16x8_t a, uint16x8_t b); vcgeq_u32(uint32x4_t a, uint32x4_t b); // // // // // // // // // // // // // // VCGE.S8 d0, d0, d0 VCGE.S16 d0, d0, d0 VCGE.S32 d0, d0, d0 VCGE.F32 d0, d0, d0 VCGE.U8 d0, d0, d0 VCGE.U16 d0, d0, d0 VCGE.U32 d0, d0, d0 VCGE.S8 q0, q0, q0 VCGE.S16 q0, q0, q0 VCGE.S32 q0, q0, q0 VCGE.F32 q0, q0, q0 VCGE.U8 q0, q0, q0 VCGE.U16 q0, q0, q0 VCGE.U32 q0, q0, q0 // // // // // // // // // // // // // // VCGE.S8 d0, d0, d0 VCGE.S16 d0, d0, d0 VCGE.S32 d0, d0, d0 VCGE.F32 d0, d0, d0 VCGE.U8 d0, d0, d0 VCGE.U16 d0, d0, d0 VCGE.U32 d0, d0, d0 VCGE.S8 q0, q0, q0 VCGE.S16 q0, q0, q0 VCGE.S32 q0, q0, q0 VCGE.F32 q0, q0, q0 VCGE.U8 q0, q0, q0 VCGE.U16 q0, q0, q0 VCGE.U32 q0, q0, q0 // // // // // // // // VCGT.S8 d0, d0, d0 VCGT.S16 d0, d0, d0 VCGT.S32 d0, d0, d0 VCGT.F32 d0, d0, d0 VCGT.U8 d0, d0, d0 VCGT.U16 d0, d0, d0 VCGT.U32 d0, d0, d0 VCGT.S8 q0, q0, q0 ベ ク タ 比較 (以下) uint8x8_t uint16x4_t uint32x2_t uint32x2_t uint8x8_t uint16x4_t uint32x2_t uint8x16_t uint16x8_t uint32x4_t uint32x4_t uint8x16_t uint16x8_t uint32x4_t vcle_s8(int8x8_t a, int8x8_t b); vcle_s16(int16x4_t a, int16x4_t b); vcle_s32(int32x2_t a, int32x2_t b); vcle_f32(float32x2_t a, float32x2_t b); vcle_u8(uint8x8_t a, uint8x8_t b); vcle_u16(uint16x4_t a, uint16x4_t b); vcle_u32(uint32x2_t a, uint32x2_t b); vcleq_s8(int8x16_t a, int8x16_t b); vcleq_s16(int16x8_t a, int16x8_t b); vcleq_s32(int32x4_t a, int32x4_t b); vcleq_f32(float32x4_t a, float32x4_t b); vcleq_u8(uint8x16_t a, uint8x16_t b); vcleq_u16(uint16x8_t a, uint16x8_t b); vcleq_u32(uint32x4_t a, uint32x4_t b); ベ ク タ 比較 (よ り 大き い) uint8x8_t uint16x4_t uint32x2_t uint32x2_t uint8x8_t uint16x4_t uint32x2_t uint8x16_t E-14 vcgt_s8(int8x8_t a, int8x8_t b); vcgt_s16(int16x4_t a, int16x4_t b); vcgt_s32(int32x2_t a, int32x2_t b); vcgt_f32(float32x2_t a, float32x2_t b); vcgt_u8(uint8x8_t a, uint8x8_t b); vcgt_u16(uint16x4_t a, uint16x4_t b); vcgt_u32(uint32x2_t a, uint32x2_t b); vcgtq_s8(int8x16_t a, int8x16_t b); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 uint16x8_t uint32x4_t uint32x4_t uint8x16_t uint16x8_t uint32x4_t vcgtq_s16(int16x8_t a, int16x8_t b); vcgtq_s32(int32x4_t a, int32x4_t b); vcgtq_f32(float32x4_t a, float32x4_t b); vcgtq_u8(uint8x16_t a, uint8x16_t b); vcgtq_u16(uint16x8_t a, uint16x8_t b); vcgtq_u32(uint32x4_t a, uint32x4_t b); // // // // // // VCGT.S16 q0, q0, q0 VCGT.S32 q0, q0, q0 VCGT.F32 q0, q0, q0 VCGT.U8 q0, q0, q0 VCGT.U16 q0, q0, q0 VCGT.U32 q0, q0, q0 // // // // // // // // // // // // // // VCGT.S8 d0, d0, d0 VCGT.S16 d0, d0, d0 VCGT.S32 d0, d0, d0 VCGT.F32 d0, d0, d0 VCGT.U8 d0, d0, d0 VCGT.U16 d0, d0, d0 VCGT.U32 d0, d0, d0 VCGT.S8 q0, q0, q0 VCGT.S16 q0, q0, q0 VCGT.S32 q0, q0, q0 VCGT.F32 q0, q0, q0 VCGT.U8 q0, q0, q0 VCGT.U16 q0, q0, q0 VCGT.U32 q0, q0, q0 ベ ク タ 比較 (よ り 小 さ い) uint8x8_t uint16x4_t uint32x2_t uint32x2_t uint8x8_t uint16x4_t uint32x2_t uint8x16_t uint16x8_t uint32x4_t uint32x4_t uint8x16_t uint16x8_t uint32x4_t vclt_s8(int8x8_t a, int8x8_t b); vclt_s16(int16x4_t a, int16x4_t b); vclt_s32(int32x2_t a, int32x2_t b); vclt_f32(float32x2_t a, float32x2_t b); vclt_u8(uint8x8_t a, uint8x8_t b); vclt_u16(uint16x4_t a, uint16x4_t b); vclt_u32(uint32x2_t a, uint32x2_t b); vcltq_s8(int8x16_t a, int8x16_t b); vcltq_s16(int16x8_t a, int16x8_t b); vcltq_s32(int32x4_t a, int32x4_t b); vcltq_f32(float32x4_t a, float32x4_t b); vcltq_u8(uint8x16_t a, uint8x16_t b); vcltq_u16(uint16x8_t a, uint16x8_t b); vcltq_u32(uint32x4_t a, uint32x4_t b); ベ ク タ 絶対値比較 (以上) uint32x2_t vcage_f32(float32x2_t a, float32x2_t b); // VACGE.F32 d0, d0, d0 uint32x4_t vcageq_f32(float32x4_t a, float32x4_t b); // VACGE.F32 q0, q0, q0 ベ ク タ 絶対値比較 (以下) uint32x2_t vcale_f32(float32x2_t a, float32x2_t b); // VACGE.F32 d0, d0, d0 uint32x4_t vcaleq_f32(float32x4_t a, float32x4_t b); // VACGE.F32 q0, q0, q0 ベ ク タ 絶対値比較 (よ り 大き い) uint32x2_t vcagt_f32(float32x2_t a, float32x2_t b); // VACGT.F32 d0, d0, d0 uint32x4_t vcagtq_f32(float32x4_t a, float32x4_t b); // VACGT.F32 q0, q0, q0 ベ ク タ 絶対値比較 (よ り 小 さ い) uint32x2_t vcalt_f32(float32x2_t a, float32x2_t b); // VACGT.F32 d0, d0, d0 uint32x4_t vcaltq_f32(float32x4_t a, float32x4_t b); // VACGT.F32 q0, q0, q0 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-15 NEON サポー ト の使用 ベク タ テス ト ビ ッ ト uint8x8_t uint16x4_t uint32x2_t uint8x8_t uint16x4_t uint32x2_t uint8x8_t uint8x16_t uint16x8_t uint32x4_t uint8x16_t uint16x8_t uint32x4_t uint8x16_t E.3.5 vtst_s8(int8x8_t a, int8x8_t b); vtst_s16(int16x4_t a, int16x4_t b); vtst_s32(int32x2_t a, int32x2_t b); vtst_u8(uint8x8_t a, uint8x8_t b); vtst_u16(uint16x4_t a, uint16x4_t b); vtst_u32(uint32x2_t a, uint32x2_t b); vtst_p8(poly8x8_t a, poly8x8_t b); vtstq_s8(int8x16_t a, int8x16_t b); vtstq_s16(int16x8_t a, int16x8_t b); vtstq_s32(int32x4_t a, int32x4_t b); vtstq_u8(uint8x16_t a, uint8x16_t b); vtstq_u16(uint16x8_t a, uint16x8_t b); vtstq_u32(uint32x4_t a, uint32x4_t b); vtstq_p8(poly8x16_t a, poly8x16_t b); // // // // // // // // // // // // // // VTST.8 d0, d0, d0 VTST.16 d0, d0, d0 VTST.32 d0, d0, d0 VTST.8 d0, d0, d0 VTST.16 d0, d0, d0 VTST.32 d0, d0, d0 VTST.8 d0, d0, d0 VTST.8 q0, q0, q0 VTST.16 q0, q0, q0 VTST.32 q0, q0, q0 VTST.8 q0, q0, q0 VTST.16 q0, q0, q0 VTST.32 q0, q0, q0 VTST.8 q0, q0, q0 絶対差 以下の コ ンパ イ ラ 組み込み関数は、 絶対差を含む演算に使用 し ます。 引数間の絶対差 Vr[i] = | Va[i] - Vb[i] | int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t float32x2_t int8x16_t int16x8_t int32x4_t uint8x16_t uint16x8_t uint32x4_t float32x4_t vabd_s8(int8x8_t a, int8x8_t b); vabd_s16(int16x4_t a, int16x4_t b); vabd_s32(int32x2_t a, int32x2_t b); vabd_u8(uint8x8_t a, uint8x8_t b); vabd_u16(uint16x4_t a, uint16x4_t b); vabd_u32(uint32x2_t a, uint32x2_t b); vabd_f32(float32x2_t a, float32x2_t b); vabdq_s8(int8x16_t a, int8x16_t b); vabdq_s16(int16x8_t a, int16x8_t b); vabdq_s32(int32x4_t a, int32x4_t b); vabdq_u8(uint8x16_t a, uint8x16_t b); vabdq_u16(uint16x8_t a, uint16x8_t b); vabdq_u32(uint32x4_t a, uint32x4_t b); vabdq_f32(float32x4_t a, float32x4_t b); // // // // // // // // // // // // // // VABD.S8 d0,d0,d0 VABD.S16 d0,d0,d0 VABD.S32 d0,d0,d0 VABD.U8 d0,d0,d0 VABD.U16 d0,d0,d0 VABD.U32 d0,d0,d0 VABD.F32 d0,d0,d0 VABD.S8 q0,q0,q0 VABD.S16 q0,q0,q0 VABD.S32 q0,q0,q0 VABD.U8 q0,q0,q0 VABD.U16 q0,q0,q0 VABD.U32 q0,q0,q0 VABD.F32 q0,q0,q0 絶対差 (long) int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t E-16 vabdl_s8(int8x8_t a, int8x8_t b); vabdl_s16(int16x4_t a, int16x4_t b); vabdl_s32(int32x2_t a, int32x2_t b); vabdl_u8(uint8x8_t a, uint8x8_t b); vabdl_u16(uint16x4_t a, uint16x4_t b); vabdl_u32(uint32x2_t a, uint32x2_t b); // // // // // // Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, VABDL.S8 q0,d0,d0 VABDL.S16 q0,d0,d0 VABDL.S32 q0,d0,d0 VABDL.U8 q0,d0,d0 VABDL.U16 q0,d0,d0 VABDL.U32 q0,d0,d0 ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 絶対差 と 累積 Vr[i] = Va[i] + | Vb[i] - Vc[i] | int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t int8x16_t int16x8_t int32x4_t uint8x16_t uint16x8_t uint32x4_t vaba_s8(int8x8_t a, int8x8_t b, int8x8_t c); vaba_s16(int16x4_t a, int16x4_t b, int16x4_t c); vaba_s32(int32x2_t a, int32x2_t b, int32x2_t c); vaba_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); vaba_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c); vaba_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c); vabaq_s8(int8x16_t a, int8x16_t b, int8x16_t c); vabaq_s16(int16x8_t a, int16x8_t b, int16x8_t c); vabaq_s32(int32x4_t a, int32x4_t b, int32x4_t c); vabaq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c); vabaq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c); vabaq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c); // // // // // // // // // // // // VABA.S8 d0,d0,d0 VABA.S16 d0,d0,d0 VABA.S32 d0,d0,d0 VABA.U8 d0,d0,d0 VABA.U16 d0,d0,d0 VABA.U32 d0,d0,d0 VABA.S8 q0,q0,q0 VABA.S16 q0,q0,q0 VABA.S32 q0,q0,q0 VABA.U8 q0,q0,q0 VABA.U16 q0,q0,q0 VABA.U32 q0,q0,q0 // // // // // // VABAL.S8 q0,d0,d0 VABAL.S16 q0,d0,d0 VABAL.S32 q0,d0,d0 VABAL.U8 q0,d0,d0 VABAL.U16 q0,d0,d0 VABAL.U32 q0,d0,d0 絶対差 と 累積 (long) int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t E.3.6 vabal_s8(int16x8_t a, int8x8_t b, int8x8_t c); vabal_s16(int32x4_t a, int16x4_t b, int16x4_t c); vabal_s32(int64x2_t a, int32x2_t b, int32x2_t c); vabal_u8(uint16x8_t a, uint8x8_t b, uint8x8_t c); vabal_u16(uint32x4_t a, uint16x4_t b, uint16x4_t c); vabal_u32(uint64x2_t a, uint32x2_t b, uint32x2_t c); 最大 / 最小 以下の コ ンパ イ ラ 組み込み関数は、 最大値お よ び最小値を必要 と す る 演算に 使用 し ます。 vmax -> Vr[i] := (Va[i] >= Vb[i]) ? Va[i] : Vb[i] int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t float32x2_t int8x16_t int16x8_t int32x4_t uint8x16_t uint16x8_t uint32x4_t float32x4_t ARM DUI 0348BJ ID 1 0 0 4 1 9 vmax_s8(int8x8_t a, int8x8_t b); vmax_s16(int16x4_t a, int16x4_t b); vmax_s32(int32x2_t a, int32x2_t b); vmax_u8(uint8x8_t a, uint8x8_t b); vmax_u16(uint16x4_t a, uint16x4_t b); vmax_u32(uint32x2_t a, uint32x2_t b); vmax_f32(float32x2_t a, float32x2_t b); vmaxq_s8(int8x16_t a, int8x16_t b); vmaxq_s16(int16x8_t a, int16x8_t b); vmaxq_s32(int32x4_t a, int32x4_t b); vmaxq_u8(uint8x16_t a, uint8x16_t b); vmaxq_u16(uint16x8_t a, uint16x8_t b); vmaxq_u32(uint32x4_t a, uint32x4_t b); vmaxq_f32(float32x4_t a, float32x4_t b); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, // // // // // // // // // // // // // // VMAX.S8 d0,d0,d0 VMAX.S16 d0,d0,d0 VMAX.S32 d0,d0,d0 VMAX.U8 d0,d0,d0 VMAX.U16 d0,d0,d0 VMAX.U32 d0,d0,d0 VMAX.F32 d0,d0,d0 VMAX.S8 q0,q0,q0 VMAX.S16 q0,q0,q0 VMAX.S32 q0,q0,q0 VMAX.U8 q0,q0,q0 VMAX.U16 q0,q0,q0 VMAX.U32 q0,q0,q0 VMAX.F32 q0,q0,q0 E-17 NEON サポー ト の使用 vmin -> Vr[i] := (Va[i] >= Vb[i]) ? Vb[i] : Va[i] int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t float32x2_t int8x16_t int16x8_t int32x4_t uint8x16_t uint16x8_t uint32x4_t float32x4_t E.3.7 vmin_s8(int8x8_t a, int8x8_t b); vmin_s16(int16x4_t a, int16x4_t b); vmin_s32(int32x2_t a, int32x2_t b); vmin_u8(uint8x8_t a, uint8x8_t b); vmin_u16(uint16x4_t a, uint16x4_t b); vmin_u32(uint32x2_t a, uint32x2_t b); vmin_f32(float32x2_t a, float32x2_t b); vminq_s8(int8x16_t a, int8x16_t b); vminq_s16(int16x8_t a, int16x8_t b); vminq_s32(int32x4_t a, int32x4_t b); vminq_u8(uint8x16_t a, uint8x16_t b); vminq_u16(uint16x8_t a, uint16x8_t b); vminq_u32(uint32x4_t a, uint32x4_t b); vminq_f32(float32x4_t a, float32x4_t b); // // // // // // // // // // // // // // VMIN.S8 d0,d0,d0 VMIN.S16 d0,d0,d0 VMIN.S32 d0,d0,d0 VMIN.U8 d0,d0,d0 VMIN.U16 d0,d0,d0 VMIN.U32 d0,d0,d0 VMIN.F32 d0,d0,d0 VMIN.S8 q0,q0,q0 VMIN.S16 q0,q0,q0 VMIN.S32 q0,q0,q0 VMIN.U8 q0,q0,q0 VMIN.U16 q0,q0,q0 VMIN.U32 q0,q0,q0 VMIN.F32 q0,q0,q0 対加算 以下の コ ンパ イ ラ 組み込み関数は、 対加算演算に使用 し ます。 対加算 int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t float32x2_t vpadd_s8(int8x8_t a, int8x8_t b); vpadd_s16(int16x4_t a, int16x4_t b); vpadd_s32(int32x2_t a, int32x2_t b); vpadd_u8(uint8x8_t a, uint8x8_t b); vpadd_u16(uint16x4_t a, uint16x4_t b); vpadd_u32(uint32x2_t a, uint32x2_t b); vpadd_f32(float32x2_t a, float32x2_t b); // // // // // // // VPADD.I8 d0,d0,d0 VPADD.I16 d0,d0,d0 VPADD.I32 d0,d0,d0 VPADD.I8 d0,d0,d0 VPADD.I16 d0,d0,d0 VPADD.I32 d0,d0,d0 VPADD.F32 d0,d0,d0 対加算 (long) int16x4_t int32x2_t int64x1_t uint16x4_t uint32x2_t uint64x1_t int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t E-18 vpaddl_s8(int8x8_t a); vpaddl_s16(int16x4_t a); vpaddl_s32(int32x2_t a); vpaddl_u8(uint8x8_t a); vpaddl_u16(uint16x4_t a); vpaddl_u32(uint32x2_t a); vpaddlq_s8(int8x16_t a); vpaddlq_s16(int16x8_t a); vpaddlq_s32(int32x4_t a); vpaddlq_u8(uint8x16_t a); vpaddlq_u16(uint16x8_t a); vpaddlq_u32(uint32x4_t a); // // // // // // // // // // // // VPADDL.S8 d0,d0 VPADDL.S16 d0,d0 VPADDL.S32 d0,d0 VPADDL.U8 d0,d0 VPADDL.U16 d0,d0 VPADDL.U32 d0,d0 VPADDL.S8 q0,q0 VPADDL.S16 q0,q0 VPADDL.S32 q0,q0 VPADDL.U8 q0,q0 VPADDL.U16 q0,q0 VPADDL.U32 q0,q0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 対加算および加算累積 int16x4_t int32x2_t int64x1_t uint16x4_t uint32x2_t uint64x1_t int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t E.3.8 vpadal_s8(int16x4_t a, int8x8_t b); vpadal_s16(int32x2_t a, int16x4_t b); vpadal_s32(int64x1_t a, int32x2_t b); vpadal_u8(uint16x4_t a, uint8x8_t b); vpadal_u16(uint32x2_t a, uint16x4_t b); vpadal_u32(uint64x1_t a, uint32x2_t b); vpadalq_s8(int16x8_t a, int8x16_t b); vpadalq_s16(int32x4_t a, int16x8_t b); vpadalq_s32(int64x2_t a, int32x4_t b); vpadalq_u8(uint16x8_t a, uint8x16_t b); vpadalq_u16(uint32x4_t a, uint16x8_t b); vpadalq_u32(uint64x2_t a, uint32x4_t b); // // // // // // // // // // // // VPADAL.S8 d0,d0 VPADAL.S16 d0,d0 VPADAL.S32 d0,d0 VPADAL.U8 d0,d0 VPADAL.U16 d0,d0 VPADAL.U32 d0,d0 VPADAL.S8 q0,q0 VPADAL.S16 q0,q0 VPADAL.S32 q0,q0 VPADAL.U8 q0,q0 VPADAL.U16 q0,q0 VPADAL.U32 q0,q0 最大値の畳み込み vpmax -> 隣接す る 対の最大値を取得 し ます。 int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t float32x2_t E.3.9 vpmax_s8(int8x8_t a, int8x8_t b); vpmax_s16(int16x4_t a, int16x4_t b); vpmax_s32(int32x2_t a, int32x2_t b); vpmax_u8(uint8x8_t a, uint8x8_t b); vpmax_u16(uint16x4_t a, uint16x4_t b); vpmax_u32(uint32x2_t a, uint32x2_t b); vpmax_f32(float32x2_t a, float32x2_t b); // // // // // // // VPMAX.S8 d0,d0,d0 VPMAX.S16 d0,d0,d0 VPMAX.S32 d0,d0,d0 VPMAX.U8 d0,d0,d0 VPMAX.U16 d0,d0,d0 VPMAX.U32 d0,d0,d0 VPMAX.F32 d0,d0,d0 // // // // // // // VPMIN.S8 d0,d0,d0 VPMIN.S16 d0,d0,d0 VPMIN.S32 d0,d0,d0 VPMIN.U8 d0,d0,d0 VPMIN.U16 d0,d0,d0 VPMIN.U32 d0,d0,d0 VPMIN.F32 d0,d0,d0 最小値の畳み込み vpmin -> 隣接す る 対の最小値を取得 し ます。 int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t float32x2_t E.3.10 vpmin_s8(int8x8_t a, int8x8_t b); vpmin_s16(int16x4_t a, int16x4_t b); vpmin_s32(int32x2_t a, int32x2_t b); vpmin_u8(uint8x8_t a, uint8x8_t b); vpmin_u16(uint16x4_t a, uint16x4_t b); vpmin_u32(uint32x2_t a, uint32x2_t b); vpmin_f32(float32x2_t a, float32x2_t b); 逆数 / 平方根 逆数の推定 / ス テ ッ プ と 1/ 逆平方根の推定 / ス テ ッ プです。 float32x2_t float32x4_t float32x2_t float32x4_t vrecps_f32(float32x2_t a, float32x2_t b); vrecpsq_f32(float32x4_t a, float32x4_t b); vrsqrts_f32(float32x2_t a, float32x2_t b); vrsqrtsq_f32(float32x4_t a, float32x4_t b); ARM DUI 0348BJ ID 1 0 0 4 1 9 // // // // VRECPS.F32 d0, d0, d0 VRECPS.F32 q0, q0, q0 VRSQRTS.F32 d0, d0, d0 VRSQRTS.F32 q0, q0, q0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-19 NEON サポー ト の使用 E.3.11 符号付き変数に よ る シ フ ト 以下の コ ンパ イ ラ 組み込み関数は、 符合付 き 変数に よ る シ フ ト を含む演算に 使用 し ます。 ベ ク タ 左シ フ ト : Vr[i] := Va[i] << Vb[i] (負の値は右シ フ ト ) int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vshl_s8(int8x8_t a, int8x8_t b); vshl_s16(int16x4_t a, int16x4_t b); vshl_s32(int32x2_t a, int32x2_t b); vshl_s64(int64x1_t a, int64x1_t b); vshl_u8(uint8x8_t a, int8x8_t b); vshl_u16(uint16x4_t a, int16x4_t b); vshl_u32(uint32x2_t a, int32x2_t b); vshl_u64(uint64x1_t a, int64x1_t b); vshlq_s8(int8x16_t a, int8x16_t b); vshlq_s16(int16x8_t a, int16x8_t b); vshlq_s32(int32x4_t a, int32x4_t b); vshlq_s64(int64x2_t a, int64x2_t b); vshlq_u8(uint8x16_t a, int8x16_t b); vshlq_u16(uint16x8_t a, int16x8_t b); vshlq_u32(uint32x4_t a, int32x4_t b); vshlq_u64(uint64x2_t a, int64x2_t b); // // // // // // // // // // // // // // // // VSHL.S8 d0,d0,d0 VSHL.S16 d0,d0,d0 VSHL.S32 d0,d0,d0 VSHL.S64 d0,d0,d0 VSHL.U8 d0,d0,d0 VSHL.U16 d0,d0,d0 VSHL.U32 d0,d0,d0 VSHL.U64 d0,d0,d0 VSHL.S8 q0,q0,q0 VSHL.S16 q0,q0,q0 VSHL.S32 q0,q0,q0 VSHL.S64 q0,q0,q0 VSHL.U8 q0,q0,q0 VSHL.U16 q0,q0,q0 VSHL.U32 q0,q0,q0 VSHL.U64 q0,q0,q0 サチ ュ レ ー ト ベ ク タ 左シ フ ト (負の値は右シ フ ト ) int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vqshl_s8(int8x8_t a, int8x8_t b); vqshl_s16(int16x4_t a, int16x4_t b); vqshl_s32(int32x2_t a, int32x2_t b); vqshl_s64(int64x1_t a, int64x1_t b); vqshl_u8(uint8x8_t a, int8x8_t b); vqshl_u16(uint16x4_t a, int16x4_t b); vqshl_u32(uint32x2_t a, int32x2_t b); vqshl_u64(uint64x1_t a, int64x1_t b); vqshlq_s8(int8x16_t a, int8x16_t b); vqshlq_s16(int16x8_t a, int16x8_t b); vqshlq_s32(int32x4_t a, int32x4_t b); vqshlq_s64(int64x2_t a, int64x2_t b); vqshlq_u8(uint8x16_t a, int8x16_t b); vqshlq_u16(uint16x8_t a, int16x8_t b); vqshlq_u32(uint32x4_t a, int32x4_t b); vqshlq_u64(uint64x2_t a, int64x2_t b); // // // // // // // // // // // // // // // // VQSHL.S8 d0,d0,d0 VQSHL.S16 d0,d0,d0 VQSHL.S32 d0,d0,d0 VQSHL.S64 d0,d0,d0 VQSHL.U8 d0,d0,d0 VQSHL.U16 d0,d0,d0 VQSHL.U32 d0,d0,d0 VQSHL.U64 d0,d0,d0 VQSHL.S8 q0,q0,q0 VQSHL.S16 q0,q0,q0 VQSHL.S32 q0,q0,q0 VQSHL.S64 q0,q0,q0 VQSHL.U8 q0,q0,q0 VQSHL.U16 q0,q0,q0 VQSHL.U32 q0,q0,q0 VQSHL.U64 q0,q0,q0 ベ ク タ 丸め左シ フ ト (負の値は右シ フ ト ) int8x8_t int16x4_t int32x2_t E-20 vrshl_s8(int8x8_t a, int8x8_t b); vrshl_s16(int16x4_t a, int16x4_t b); vrshl_s32(int32x2_t a, int32x2_t b); // VRSHL.S8 d0,d0,d0 // VRSHL.S16 d0,d0,d0 // VRSHL.S32 d0,d0,d0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vrshl_s64(int64x1_t a, int64x1_t b); vrshl_u8(uint8x8_t a, int8x8_t b); vrshl_u16(uint16x4_t a, int16x4_t b); vrshl_u32(uint32x2_t a, int32x2_t b); vrshl_u64(uint64x1_t a, int64x1_t b); vrshlq_s8(int8x16_t a, int8x16_t b); vrshlq_s16(int16x8_t a, int16x8_t b); vrshlq_s32(int32x4_t a, int32x4_t b); vrshlq_s64(int64x2_t a, int64x2_t b); vrshlq_u8(uint8x16_t a, int8x16_t b); vrshlq_u16(uint16x8_t a, int16x8_t b); vrshlq_u32(uint32x4_t a, int32x4_t b); vrshlq_u64(uint64x2_t a, int64x2_t b); // // // // // // // // // // // // // VRSHL.S64 d0,d0,d0 VRSHL.U8 d0,d0,d0 VRSHL.U16 d0,d0,d0 VRSHL.U32 d0,d0,d0 VRSHL.U64 d0,d0,d0 VRSHL.S8 q0,q0,q0 VRSHL.S16 q0,q0,q0 VRSHL.S32 q0,q0,q0 VRSHL.S64 q0,q0,q0 VRSHL.U8 q0,q0,q0 VRSHL.U16 q0,q0,q0 VRSHL.U32 q0,q0,q0 VRSHL.U64 q0,q0,q0 サチ ュ レー ト 丸めベ ク タ 左シ フ ト (負の値は右シ フ ト ) int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t E.3.12 vqrshl_s8(int8x8_t a, int8x8_t b); vqrshl_s16(int16x4_t a, int16x4_t b); vqrshl_s32(int32x2_t a, int32x2_t b); vqrshl_s64(int64x1_t a, int64x1_t b); vqrshl_u8(uint8x8_t a, int8x8_t b); vqrshl_u16(uint16x4_t a, int16x4_t b); vqrshl_u32(uint32x2_t a, int32x2_t b); vqrshl_u64(uint64x1_t a, int64x1_t b); vqrshlq_s8(int8x16_t a, int8x16_t b); vqrshlq_s16(int16x8_t a, int16x8_t b); vqrshlq_s32(int32x4_t a, int32x4_t b); vqrshlq_s64(int64x2_t a, int64x2_t b); vqrshlq_u8(uint8x16_t a, int8x16_t b); vqrshlq_u16(uint16x8_t a, int16x8_t b); vqrshlq_u32(uint32x4_t a, int32x4_t b); vqrshlq_u64(uint64x2_t a, int64x2_t b); // // // // // // // // // // // // // // // // VQRSHL.S8 d0,d0,d0 VQRSHL.S16 d0,d0,d0 VQRSHL.S32 d0,d0,d0 VQRSHL.S64 d0,d0,d0 VQRSHL.U8 d0,d0,d0 VQRSHL.U16 d0,d0,d0 VQRSHL.U32 d0,d0,d0 VQRSHL.U64 d0,d0,d0 VQRSHL.S8 q0,q0,q0 VQRSHL.S16 q0,q0,q0 VQRSHL.S32 q0,q0,q0 VQRSHL.S64 q0,q0,q0 VQRSHL.U8 q0,q0,q0 VQRSHL.U16 q0,q0,q0 VQRSHL.U32 q0,q0,q0 VQRSHL.U64 q0,q0,q0 定数に よ る シ フ ト 以下の コ ンパ イ ラ 組み込み関数は定数に よ る シ フ ト 操作を提供 し ます。 定数に よ る ベ ク タ 右シ フ ト int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t vshr_n_s8(int8x8_t a, __constrange(1,8) int b); vshr_n_s16(int16x4_t a, __constrange(1,16) int b); vshr_n_s32(int32x2_t a, __constrange(1,32) int b); vshr_n_s64(int64x1_t a, __constrange(1,64) int b); vshr_n_u8(uint8x8_t a, __constrange(1,8) int b); vshr_n_u16(uint16x4_t a, __constrange(1,16) int b); vshr_n_u32(uint32x2_t a, __constrange(1,32) int b); vshr_n_u64(uint64x1_t a, __constrange(1,64) int b); vshrq_n_s8(int8x16_t a, __constrange(1,8) int b); ARM DUI 0348BJ ID 1 0 0 4 1 9 // // // // // // // // // VSHR.S8 d0,d0,#8 VSHR.S16 d0,d0,#16 VSHR.S32 d0,d0,#32 VSHR.S64 d0,d0,#64 VSHR.U8 d0,d0,#8 VSHR.U16 d0,d0,#16 VSHR.U32 d0,d0,#32 VSHR.U64 d0,d0,#64 VSHR.S8 q0,q0,#8 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-21 NEON サポー ト の使用 int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vshrq_n_s16(int16x8_t a, __constrange(1,16) int b); vshrq_n_s32(int32x4_t a, __constrange(1,32) int b); vshrq_n_s64(int64x2_t a, __constrange(1,64) int b); vshrq_n_u8(uint8x16_t a, __constrange(1,8) int b); vshrq_n_u16(uint16x8_t a, __constrange(1,16) int b); vshrq_n_u32(uint32x4_t a, __constrange(1,32) int b); vshrq_n_u64(uint64x2_t a, __constrange(1,64) int b); // // // // // // // VSHR.S16 q0,q0,#16 VSHR.S32 q0,q0,#32 VSHR.S64 q0,q0,#64 VSHR.U8 q0,q0,#8 VSHR.U16 q0,q0,#16 VSHR.U32 q0,q0,#32 VSHR.U64 q0,q0,#64 // // // // // // // // // // // // // // // // VSHL.I8 d0,d0,#0 VSHL.I16 d0,d0,#0 VSHL.I32 d0,d0,#0 VSHL.I64 d0,d0,#0 VSHL.I8 d0,d0,#0 VSHL.I16 d0,d0,#0 VSHL.I32 d0,d0,#0 VSHL.I64 d0,d0,#0 VSHL.I8 q0,q0,#0 VSHL.I16 q0,q0,#0 VSHL.I32 q0,q0,#0 VSHL.I64 q0,q0,#0 VSHL.I8 q0,q0,#0 VSHL.I16 q0,q0,#0 VSHL.I32 q0,q0,#0 VSHL.I64 q0,q0,#0 定数に よ る ベ ク タ 左シ フ ト int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vshl_n_s8(int8x8_t a, __constrange(0,7) int b); vshl_n_s16(int16x4_t a, __constrange(0,15) int b); vshl_n_s32(int32x2_t a, __constrange(0,31) int b); vshl_n_s64(int64x1_t a, __constrange(0,63) int b); vshl_n_u8(uint8x8_t a, __constrange(0,7) int b); vshl_n_u16(uint16x4_t a, __constrange(0,15) int b); vshl_n_u32(uint32x2_t a, __constrange(0,31) int b); vshl_n_u64(uint64x1_t a, __constrange(0,63) int b); vshlq_n_s8(int8x16_t a, __constrange(0,7) int b); vshlq_n_s16(int16x8_t a, __constrange(0,15) int b); vshlq_n_s32(int32x4_t a, __constrange(0,31) int b); vshlq_n_s64(int64x2_t a, __constrange(0,63) int b); vshlq_n_u8(uint8x16_t a, __constrange(0,7) int b); vshlq_n_u16(uint16x8_t a, __constrange(0,15) int b); vshlq_n_u32(uint32x4_t a, __constrange(0,31) int b); vshlq_n_u64(uint64x2_t a, __constrange(0,63) int b); 定数に よ る ベ ク タ 丸め右シ フ ト int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t E-22 vrshr_n_s8(int8x8_t a, __constrange(1,8) int b); vrshr_n_s16(int16x4_t a, __constrange(1,16) int b); vrshr_n_s32(int32x2_t a, __constrange(1,32) int b); vrshr_n_s64(int64x1_t a, __constrange(1,64) int b); vrshr_n_u8(uint8x8_t a, __constrange(1,8) int b); vrshr_n_u16(uint16x4_t a, __constrange(1,16) int b); vrshr_n_u32(uint32x2_t a, __constrange(1,32) int b); vrshr_n_u64(uint64x1_t a, __constrange(1,64) int b); vrshrq_n_s8(int8x16_t a, __constrange(1,8) int b); vrshrq_n_s16(int16x8_t a, __constrange(1,16) int b); vrshrq_n_s32(int32x4_t a, __constrange(1,32) int b); vrshrq_n_s64(int64x2_t a, __constrange(1,64) int b); vrshrq_n_u8(uint8x16_t a, __constrange(1,8) int b); vrshrq_n_u16(uint16x8_t a, __constrange(1,16) int b); vrshrq_n_u32(uint32x4_t a, __constrange(1,32) int b); vrshrq_n_u64(uint64x2_t a, __constrange(1,64) int b); // // // // // // // // // // // // // // // // VRSHR.S8 d0,d0,#8 VRSHR.S16 d0,d0,#16 VRSHR.S32 d0,d0,#32 VRSHR.S64 d0,d0,#64 VRSHR.U8 d0,d0,#8 VRSHR.U16 d0,d0,#16 VRSHR.U32 d0,d0,#32 VRSHR.U64 d0,d0,#64 VRSHR.S8 q0,q0,#8 VRSHR.S16 q0,q0,#16 VRSHR.S32 q0,q0,#32 VRSHR.S64 q0,q0,#64 VRSHR.U8 q0,q0,#8 VRSHR.U16 q0,q0,#16 VRSHR.U32 q0,q0,#32 VRSHR.U64 q0,q0,#64 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 定数に よ る ベ ク タ 右シ フ ト と 累積 int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vsra_n_s8(int8x8_t a, int8x8_t b, __constrange(1,8) int c); vsra_n_s16(int16x4_t a, int16x4_t b, __constrange(1,16) int c); vsra_n_s32(int32x2_t a, int32x2_t b, __constrange(1,32) int c); vsra_n_s64(int64x1_t a, int64x1_t b, __constrange(1,64) int c); vsra_n_u8(uint8x8_t a, uint8x8_t b, __constrange(1,8) int c); vsra_n_u16(uint16x4_t a, uint16x4_t b, __constrange(1,16) int c); vsra_n_u32(uint32x2_t a, uint32x2_t b, __constrange(1,32) int c); vsra_n_u64(uint64x1_t a, uint64x1_t b, __constrange(1,64) int c); vsraq_n_s8(int8x16_t a, int8x16_t b, __constrange(1,8) int c); vsraq_n_s16(int16x8_t a, int16x8_t b, __constrange(1,16) int c); vsraq_n_s32(int32x4_t a, int32x4_t b, __constrange(1,32) int c); vsraq_n_s64(int64x2_t a, int64x2_t b, __constrange(1,64) int c); vsraq_n_u8(uint8x16_t a, uint8x16_t b, __constrange(1,8) int c); vsraq_n_u16(uint16x8_t a, uint16x8_t b, __constrange(1,16) int c); vsraq_n_u32(uint32x4_t a, uint32x4_t b, __constrange(1,32) int c); vsraq_n_u64(uint64x2_t a, uint64x2_t b, __constrange(1,64) int c); // // // // // // // // // // // // // // // // VSRA.S8 d0,d0,#8 VSRA.S16 d0,d0,#16 VSRA.S32 d0,d0,#32 VSRA.S64 d0,d0,#64 VSRA.U8 d0,d0,#8 VSRA.U16 d0,d0,#16 VSRA.U32 d0,d0,#32 VSRA.U64 d0,d0,#64 VSRA.S8 q0,q0,#8 VSRA.S16 q0,q0,#16 VSRA.S32 q0,q0,#32 VSRA.S64 q0,q0,#64 VSRA.U8 q0,q0,#8 VSRA.U16 q0,q0,#16 VSRA.U32 q0,q0,#32 VSRA.U64 q0,q0,#64 定数に よ る丸め右シ フ ト と 累積 int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vrsra_n_s8(int8x8_t a, int8x8_t b, __constrange(1,8) int c); vrsra_n_s16(int16x4_t a, int16x4_t b, __constrange(1,16) int c); vrsra_n_s32(int32x2_t a, int32x2_t b, __constrange(1,32) int c); vrsra_n_s64(int64x1_t a, int64x1_t b, __constrange(1,64) int c); vrsra_n_u8(uint8x8_t a, uint8x8_t b, __constrange(1,8) int c); vrsra_n_u16(uint16x4_t a, uint16x4_t b, __constrange(1,16) int c); vrsra_n_u32(uint32x2_t a, uint32x2_t b, __constrange(1,32) int c); vrsra_n_u64(uint64x1_t a, uint64x1_t b, __constrange(1,64) int c); vrsraq_n_s8(int8x16_t a, int8x16_t b, __constrange(1,8) int c); vrsraq_n_s16(int16x8_t a, int16x8_t b, __constrange(1,16) int c); vrsraq_n_s32(int32x4_t a, int32x4_t b, __constrange(1,32) int c); vrsraq_n_s64(int64x2_t a, int64x2_t b, __constrange(1,64) int c); vrsraq_n_u8(uint8x16_t a, uint8x16_t b, __constrange(1,8) int c); vrsraq_n_u16(uint16x8_t a, uint16x8_t b, __constrange(1,16) int c); vrsraq_n_u32(uint32x4_t a, uint32x4_t b, __constrange(1,32) int c); vrsraq_n_u64(uint64x2_t a, uint64x2_t b, __constrange(1,64) int c); // // // // // // // // // // // // // // // // VRSRA.S8 d0,d0,#8 VRSRA.S16 d0,d0,#16 VRSRA.S32 d0,d0,#32 VRSRA.S64 d0,d0,#64 VRSRA.U8 d0,d0,#8 VRSRA.U16 d0,d0,#16 VRSRA.U32 d0,d0,#32 VRSRA.U64 d0,d0,#64 VRSRA.S8 q0,q0,#8 VRSRA.S16 q0,q0,#16 VRSRA.S32 q0,q0,#32 VRSRA.S64 q0,q0,#64 VRSRA.U8 q0,q0,#8 VRSRA.U16 q0,q0,#16 VRSRA.U32 q0,q0,#32 VRSRA.U64 q0,q0,#64 定数に よ るサチ ュ レ ー ト ベ ク タ 左シ フ ト int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t vqshl_n_s8(int8x8_t a, __constrange(0,7) int b); vqshl_n_s16(int16x4_t a, __constrange(0,15) int b); vqshl_n_s32(int32x2_t a, __constrange(0,31) int b); vqshl_n_s64(int64x1_t a, __constrange(0,63) int b); vqshl_n_u8(uint8x8_t a, __constrange(0,7) int b); vqshl_n_u16(uint16x4_t a, __constrange(0,15) int b); vqshl_n_u32(uint32x2_t a, __constrange(0,31) int b); vqshl_n_u64(uint64x1_t a, __constrange(0,63) int b); vqshlq_n_s8(int8x16_t a, __constrange(0,7) int b); ARM DUI 0348BJ ID 1 0 0 4 1 9 // // // // // // // // // VQSHL.S8 d0,d0,#0 VQSHL.S16 d0,d0,#0 VQSHL.S32 d0,d0,#0 VQSHL.S64 d0,d0,#0 VQSHL.U8 d0,d0,#0 VQSHL.U16 d0,d0,#0 VQSHL.U32 d0,d0,#0 VQSHL.U64 d0,d0,#0 VQSHL.S8 q0,q0,#0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-23 NEON サポー ト の使用 int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vqshlq_n_s16(int16x8_t a, __constrange(0,15) int b); vqshlq_n_s32(int32x4_t a, __constrange(0,31) int b); vqshlq_n_s64(int64x2_t a, __constrange(0,63) int b); vqshlq_n_u8(uint8x16_t a, __constrange(0,7) int b); vqshlq_n_u16(uint16x8_t a, __constrange(0,15) int b); vqshlq_n_u32(uint32x4_t a, __constrange(0,31) int b); vqshlq_n_u64(uint64x2_t a, __constrange(0,63) int b); // // // // // // // VQSHL.S16 q0,q0,#0 VQSHL.S32 q0,q0,#0 VQSHL.S64 q0,q0,#0 VQSHL.U8 q0,q0,#0 VQSHL.U16 q0,q0,#0 VQSHL.U32 q0,q0,#0 VQSHL.U64 q0,q0,#0 定数に よ るサチ ュ レ ー ト ベ ク タ 左シ フ ト (符号付きか ら符号な し への変換) uint8x8_t uint16x4_t uint32x2_t uint64x1_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vqshlu_n_s8(int8x8_t a, __constrange(0,7) int b); vqshlu_n_s16(int16x4_t a, __constrange(0,15) int b); vqshlu_n_s32(int32x2_t a, __constrange(0,31) int b); vqshlu_n_s64(int64x1_t a, __constrange(0,63) int b); vqshluq_n_s8(int8x16_t a, __constrange(0,7) int b); vqshluq_n_s16(int16x8_t a, __constrange(0,15) int b); vqshluq_n_s32(int32x4_t a, __constrange(0,31) int b); vqshluq_n_s64(int64x2_t a, __constrange(0,63) int b); // // // // // // // // VQSHLU.S8 d0,d0,#0 VQSHLU.S16 d0,d0,#0 VQSHLU.S32 d0,d0,#0 VQSHLU.S64 d0,d0,#0 VQSHLU.S8 q0,q0,#0 VQSHLU.S16 q0,q0,#0 VQSHLU.S32 q0,q0,#0 VQSHLU.S64 q0,q0,#0 定数に よ る ベ ク タ ナ ロー イ ン グサチ ュ レ ー ト 右シ フ ト int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t vshrn_n_s16(int16x8_t a, __constrange(1,8) int b); vshrn_n_s32(int32x4_t a, __constrange(1,16) int b); vshrn_n_s64(int64x2_t a, __constrange(1,32) int b); vshrn_n_u16(uint16x8_t a, __constrange(1,8) int b); vshrn_n_u32(uint32x4_t a, __constrange(1,16) int b); vshrn_n_u64(uint64x2_t a, __constrange(1,32) int b); // // // // // // VSHRN.I16 VSHRN.I32 VSHRN.I64 VSHRN.I16 VSHRN.I32 VSHRN.I64 d0,q0,#8 d0,q0,#16 d0,q0,#32 d0,q0,#8 d0,q0,#16 d0,q0,#32 定数に よ る ベ ク タ ナ ロー イ ン グサチ ュ レ ー ト 右シ フ ト (符号付きか ら 符号な し への変換) uint8x8_t vqshrun_n_s16(int16x8_t a, __constrange(1,8) int b); // VQSHRUN.S16 d0,q0,#8 uint16x4_t vqshrun_n_s32(int32x4_t a, __constrange(1,16) int b); // VQSHRUN.S32 d0,q0,#16 uint32x2_t vqshrun_n_s64(int64x2_t a, __constrange(1,32) int b); // VQSHRUN.S64 d0,q0,#32 定数に よ る丸めベ ク タ ナ ロー イ ン グサチ ュ レー ト 右シ フ ト (符号付きか ら 符 号な し への変換) uint8x8_t vqrshrun_n_s16(int16x8_t a, __constrange(1,8) int b); // VQRSHRUN.S16 d0,q0,#8 uint16x4_t vqrshrun_n_s32(int32x4_t a, __constrange(1,16) int b); // VQRSHRUN.S32 d0,q0,#16 uint32x2_t vqrshrun_n_s64(int64x2_t a, __constrange(1,32) int b); // VQRSHRUN.S64 d0,q0,#32 定数に よ る ベ ク タ ナ ロー イ ン グサチ ュ レ ー ト 右シ フ ト int8x8_t int16x4_t int32x2_t E-24 vqshrn_n_s16(int16x8_t a, __constrange(1,8) int b); vqshrn_n_s32(int32x4_t a, __constrange(1,16) int b); vqshrn_n_s64(int64x2_t a, __constrange(1,32) int b); // VQSHRN.S16 d0,q0,#8 // VQSHRN.S32 d0,q0,#16 // VQSHRN.S64 d0,q0,#32 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 uint8x8_t vqshrn_n_u16(uint16x8_t a, __constrange(1,8) int b); // VQSHRN.U16 d0,q0,#8 uint16x4_t vqshrn_n_u32(uint32x4_t a, __constrange(1,16) int b); // VQSHRN.U32 d0,q0,#16 uint32x2_t vqshrn_n_u64(uint64x2_t a, __constrange(1,32) int b); // VQSHRN.U64 d0,q0,#32 定数に よ る丸めベ ク タ ナ ロー イ ン グ右シ フ ト int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t vrshrn_n_s16(int16x8_t a, __constrange(1,8) int b); vrshrn_n_s32(int32x4_t a, __constrange(1,16) int b); vrshrn_n_s64(int64x2_t a, __constrange(1,32) int b); vrshrn_n_u16(uint16x8_t a, __constrange(1,8) int b); vrshrn_n_u32(uint32x4_t a, __constrange(1,16) int b); vrshrn_n_u64(uint64x2_t a, __constrange(1,32) int b); // // // // // // VRSHRN.I16 VRSHRN.I32 VRSHRN.I64 VRSHRN.I16 VRSHRN.I32 VRSHRN.I64 d0,q0,#8 d0,q0,#16 d0,q0,#32 d0,q0,#8 d0,q0,#16 d0,q0,#32 定数に よ る丸めベ ク タ ナ ロー イ ン グサチ ュ レ ー ト 右シ フ ト int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t vqrshrn_n_s16(int16x8_t a, __constrange(1,8) int b); vqrshrn_n_s32(int32x4_t a, __constrange(1,16) int b); vqrshrn_n_s64(int64x2_t a, __constrange(1,32) int b); vqrshrn_n_u16(uint16x8_t a, __constrange(1,8) int b); vqrshrn_n_u32(uint32x4_t a, __constrange(1,16) int b); vqrshrn_n_u64(uint64x2_t a, __constrange(1,32) int b); // // // // // // VQRSHRN.S16 VQRSHRN.S32 VQRSHRN.S64 VQRSHRN.U16 VQRSHRN.U32 VQRSHRN.U64 d0,q0,#8 d0,q0,#16 d0,q0,#32 d0,q0,#8 d0,q0,#16 d0,q0,#32 定数に よ る拡張付き ベ ク タ 左シ フ ト int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t E.3.13 vshll_n_s8(int8x8_t a, __constrange(0,8) int b); vshll_n_s16(int16x4_t a, __constrange(0,16) int b); vshll_n_s32(int32x2_t a, __constrange(0,32) int b); vshll_n_u8(uint8x8_t a, __constrange(0,8) int b); vshll_n_u16(uint16x4_t a, __constrange(0,16) int b); vshll_n_u32(uint32x2_t a, __constrange(0,32) int b); // // // // // // VSHLL.S8 q0,d0,#0 VSHLL.S16 q0,d0,#0 VSHLL.S32 q0,d0,#0 VSHLL.U8 q0,d0,#0 VSHLL.U16 q0,d0,#0 VSHLL.U32 q0,d0,#0 シ フ ト し て挿入 以下の コ ンパ イ ラ 組み込み関数は、 シ フ ト し て挿入操作を含む演算に使用 し ます。 ベ ク タ 右シ フ ト と 挿入 int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t poly8x8_t vsri_n_s8(int8x8_t a, int8x8_t b, __constrange(1,8) int c); vsri_n_s16(int16x4_t a, int16x4_t b, __constrange(1,16) int c); vsri_n_s32(int32x2_t a, int32x2_t b, __constrange(1,32) int c); vsri_n_s64(int64x1_t a, int64x1_t b, __constrange(1,64) int c); vsri_n_u8(uint8x8_t a, uint8x8_t b, __constrange(1,8) int c); vsri_n_u16(uint16x4_t a, uint16x4_t b, __constrange(1,16) int c); vsri_n_u32(uint32x2_t a, uint32x2_t b, __constrange(1,32) int c); vsri_n_u64(uint64x1_t a, uint64x1_t b, __constrange(1,64) int c); vsri_n_p8(poly8x8_t a, poly8x8_t b, __constrange(1,8) int c); ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, // // // // // // // // // VSRI.8 d0,d0,#8 VSRI.16 d0,d0,#16 VSRI.32 d0,d0,#32 VSRI.64 d0,d0,#64 VSRI.8 d0,d0,#8 VSRI.16 d0,d0,#16 VSRI.32 d0,d0,#32 VSRI.64 d0,d0,#64 VSRI.8 d0,d0,#8 E-25 NEON サポー ト の使用 poly16x4_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t poly8x16_t poly16x8_t vsri_n_p16(poly16x4_t a, poly16x4_t b, __constrange(1,16) int c); vsriq_n_s8(int8x16_t a, int8x16_t b, __constrange(1,8) int c); vsriq_n_s16(int16x8_t a, int16x8_t b, __constrange(1,16) int c); vsriq_n_s32(int32x4_t a, int32x4_t b, __constrange(1,32) int c); vsriq_n_s64(int64x2_t a, int64x2_t b, __constrange(1,64) int c); vsriq_n_u8(uint8x16_t a, uint8x16_t b, __constrange(1,8) int c); vsriq_n_u16(uint16x8_t a, uint16x8_t b, __constrange(1,16) int c); vsriq_n_u32(uint32x4_t a, uint32x4_t b, __constrange(1,32) int c); vsriq_n_u64(uint64x2_t a, uint64x2_t b, __constrange(1,64) int c); vsriq_n_p8(poly8x16_t a, poly8x16_t b, __constrange(1,8) int c); vsriq_n_p16(poly16x8_t a, poly16x8_t b, __constrange(1,16) int c); // // // // // // // // // // // VSRI.16 d0,d0,#16 VSRI.8 q0,q0,#8 VSRI.16 q0,q0,#16 VSRI.32 q0,q0,#32 VSRI.64 q0,q0,#64 VSRI.8 q0,q0,#8 VSRI.16 q0,q0,#16 VSRI.32 q0,q0,#32 VSRI.64 q0,q0,#64 VSRI.8 q0,q0,#8 VSRI.16 q0,q0,#16 // // // // // // // // // // // // // // // // // // // // VSLI.8 d0,d0,#0 VSLI.16 d0,d0,#0 VSLI.32 d0,d0,#0 VSLI.64 d0,d0,#0 VSLI.8 d0,d0,#0 VSLI.16 d0,d0,#0 VSLI.32 d0,d0,#0 VSLI.64 d0,d0,#0 VSLI.8 d0,d0,#0 VSLI.16 d0,d0,#0 VSLI.8 q0,q0,#0 VSLI.16 q0,q0,#0 VSLI.32 q0,q0,#0 VSLI.64 q0,q0,#0 VSLI.8 q0,q0,#0 VSLI.16 q0,q0,#0 VSLI.32 q0,q0,#0 VSLI.64 q0,q0,#0 VSLI.8 q0,q0,#0 VSLI.16 q0,q0,#0 ベ ク タ 左シ フ ト と 挿入 int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t poly8x8_t poly16x4_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t poly8x16_t poly16x8_t E.3.14 vsli_n_s8(int8x8_t a, int8x8_t b, __constrange(0,7) int c); vsli_n_s16(int16x4_t a, int16x4_t b, __constrange(0,15) int c); vsli_n_s32(int32x2_t a, int32x2_t b, __constrange(0,31) int c); vsli_n_s64(int64x1_t a, int64x1_t b, __constrange(0,63) int c); vsli_n_u8(uint8x8_t a, uint8x8_t b, __constrange(0,7) int c); vsli_n_u16(uint16x4_t a, uint16x4_t b, __constrange(0,15) int c); vsli_n_u32(uint32x2_t a, uint32x2_t b, __constrange(0,31) int c); vsli_n_u64(uint64x1_t a, uint64x1_t b, __constrange(0,63) int c); vsli_n_p8(poly8x8_t a, poly8x8_t b, __constrange(0,7) int c); vsli_n_p16(poly16x4_t a, poly16x4_t b, __constrange(0,15) int c); vsliq_n_s8(int8x16_t a, int8x16_t b, __constrange(0,7) int c); vsliq_n_s16(int16x8_t a, int16x8_t b, __constrange(0,15) int c); vsliq_n_s32(int32x4_t a, int32x4_t b, __constrange(0,31) int c); vsliq_n_s64(int64x2_t a, int64x2_t b, __constrange(0,63) int c); vsliq_n_u8(uint8x16_t a, uint8x16_t b, __constrange(0,7) int c); vsliq_n_u16(uint16x8_t a, uint16x8_t b, __constrange(0,15) int c); vsliq_n_u32(uint32x4_t a, uint32x4_t b, __constrange(0,31) int c); vsliq_n_u64(uint64x2_t a, uint64x2_t b, __constrange(0,63) int c); vsliq_n_p8(poly8x16_t a, poly8x16_t b, __constrange(0,7) int c); vsliq_n_p16(poly16x8_t a, poly16x8_t b, __constrange(0,15) int c); 単一ベ ク タ のロー ド と ス ト ア 何 ら かの型の単一ベ ク タ の ロ ー ド と ス ト ア を行い ます。 uint8x16_t uint16x8_t uint32x4_t uint64x2_t int8x16_t E-26 vld1q_u8(__transfersize(16) uint8_t const * ptr); // VLD1.8 {d0, d1}, [r0] vld1q_u16(__transfersize(8) uint16_t const * ptr); // VLD1.16 {d0, d1}, [r0] vld1q_u32(__transfersize(4) uint32_t const * ptr); // VLD1.32 {d0, d1}, [r0] vld1q_u64(__transfersize(2) uint64_t const * ptr); // VLD1.64 {d0, d1}, [r0] vld1q_s8(__transfersize(16) int8_t const * ptr); // VLD1.8 {d0, d1}, [r0] Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 int16x8_t int32x4_t int64x2_t float16x8_t float32x4_t poly8x16_t poly16x8_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x8_t int16x4_t int32x2_t int64x1_t float16x4_t float32x2_t poly8x8_t poly16x4_t uint8x16_t lane); uint16x8_t int lane); uint32x4_t int lane); uint64x2_t int lane); vld1q_s16(__transfersize(8) int16_t const * ptr); // VLD1.16 {d0, d1}, [r0] vld1q_s32(__transfersize(4) int32_t const * ptr); // VLD1.32 {d0, d1}, [r0] vld1q_s64(__transfersize(2) int64_t const * ptr); // VLD1.64 {d0, d1}, [r0] vld1q_f16(__transfersize(8) __fp16 const * ptr); // VLD1.16 {d0, d1}, [r0] vld1q_f32(__transfersize(4) float32_t const * ptr); // VLD1.32 {d0, d1}, [r0] vld1q_p8(__transfersize(16) poly8_t const * ptr); // VLD1.8 {d0, d1}, [r0] vld1q_p16(__transfersize(8) poly16_t const * ptr); // VLD1.16 {d0, d1}, [r0] vld1_u8(__transfersize(8) uint8_t const * ptr); // VLD1.8 {d0}, [r0] vld1_u16(__transfersize(4) uint16_t const * ptr); // VLD1.16 {d0}, [r0] vld1_u32(__transfersize(2) uint32_t const * ptr); // VLD1.32 {d0}, [r0] vld1_u64(__transfersize(1) uint64_t const * ptr); // VLD1.64 {d0}, [r0] vld1_s8(__transfersize(8) int8_t const * ptr); // VLD1.8 {d0}, [r0] vld1_s16(__transfersize(4) int16_t const * ptr); // VLD1.16 {d0}, [r0] vld1_s32(__transfersize(2) int32_t const * ptr); // VLD1.32 {d0}, [r0] vld1_s64(__transfersize(1) int64_t const * ptr); // VLD1.64 {d0}, [r0] vld1_f16(__transfersize(4) __fp16 const * ptr); // VLD1.16 {d0}, [r0] vld1_f32(__transfersize(2) float32_t const * ptr); // VLD1.32 {d0}, [r0] vld1_p8(__transfersize(8) poly8_t const * ptr); // VLD1.8 {d0}, [r0] vld1_p16(__transfersize(4) poly16_t const * ptr); // VLD1.16 {d0}, [r0] vld1q_lane_u8(__transfersize(1) uint8_t const * ptr, uint8x16_t vec, __constrange(0,15) int // VLD1.8 {d0[0]}, [r0] vld1q_lane_u16(__transfersize(1) uint16_t const * ptr, uint16x8_t vec, __constrange(0,7) // VLD1.16 {d0[0]}, [r0] vld1q_lane_u32(__transfersize(1) uint32_t const * ptr, uint32x4_t vec, __constrange(0,3) // VLD1.32 {d0[0]}, [r0] vld1q_lane_u64(__transfersize(1) uint64_t const * ptr, uint64x2_t vec, __constrange(0,1) ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-27 NEON サポー ト の使用 int8x16_t lane); int16x8_t lane); int32x4_t lane); // VLD1.64 {d0}, [r0] vld1q_lane_s8(__transfersize(1) int8_t const * ptr, int8x16_t vec, __constrange(0,15) int // VLD1.8 {d0[0]}, [r0] vld1q_lane_s16(__transfersize(1) int16_t const * ptr, int16x8_t vec, __constrange(0,7) int // VLD1.16 {d0[0]}, [r0] vld1q_lane_s32(__transfersize(1) int32_t const * ptr, int32x4_t vec, __constrange(0,3) int // VLD1.32 {d0[0]}, [r0] float16x4_t vld1q_lane_f16(__transfersize(1) __fp16 const * ptr, float16x4_t vec, __constrange(0,3) int lane); // VLD1.16 {d0[0]}, [r0] float16x8_t vld1q_lane_f16(__transfersize(1) __fp16 const * ptr, float16x8_t vec, __constrange(0,7) int lane); // VLD1.16 {d0[0]}, [r0] float32x4_t vld1q_lane_f32(__transfersize(1) float32_t const * ptr, float32x4_t vec, __constrange(0,3) int lane); // VLD1.32 {d0[0]}, [r0] int64x2_t vld1q_lane_s64(__transfersize(1) int64_t const * ptr, int64x2_t vec, __constrange(0,1) int lane); // VLD1.64 {d0}, [r0] poly8x16_t vld1q_lane_p8(__transfersize(1) poly8_t const * ptr, poly8x16_t vec, __constrange(0,15) int lane); // VLD1.8 {d0[0]}, [r0] poly16x8_t vld1q_lane_p16(__transfersize(1) poly16_t const * ptr, poly16x8_t vec, __constrange(0,7) int lane); // VLD1.16 {d0[0]}, [r0] uint8x8_t vld1_lane_u8(__transfersize(1) uint8_t const * ptr, uint8x8_t vec, __constrange(0,7) int lane); // VLD1.8 {d0[0]}, [r0] uint16x4_t vld1_lane_u16(__transfersize(1) uint16_t const * ptr, uint16x4_t vec, __constrange(0,3) int lane); // VLD1.16 {d0[0]}, [r0] uint32x2_t vld1_lane_u32(__transfersize(1) uint32_t const * ptr, uint32x2_t vec, __constrange(0,1) int lane); // VLD1.32 {d0[0]}, [r0] uint64x1_t vld1_lane_u64(__transfersize(1) uint64_t const * ptr, uint64x1_t vec, __constrange(0,0) int lane); // VLD1.64 {d0}, [r0] int8x8_t vld1_lane_s8(__transfersize(1) int8_t const * ptr, int8x8_t vec, __constrange(0,7) int lane); int16x4_t lane); int32x2_t lane); // VLD1.8 {d0[0]}, [r0] vld1_lane_s16(__transfersize(1) int16_t const * ptr, int16x4_t vec, __constrange(0,3) int // VLD1.16 {d0[0]}, [r0] vld1_lane_s32(__transfersize(1) int32_t const * ptr, int32x2_t vec, __constrange(0,1) int // VLD1.32 {d0[0]}, [r0] float32x2_t vld1_lane_f32(__transfersize(1) float32_t const * ptr, float32x2_t vec, __constrange(0,1) E-28 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 int lane); int64x1_t lane); poly8x8_t lane); poly16x4_t lane); // VLD1.32 {d0[0]}, [r0] vld1_lane_s64(__transfersize(1) int64_t const * ptr, int64x1_t vec, __constrange(0,0) int // VLD1.64 {d0}, [r0] vld1_lane_p8(__transfersize(1) poly8_t const * ptr, poly8x8_t vec, __constrange(0,7) int // VLD1.8 {d0[0]}, [r0] vld1_lane_p16(__transfersize(1) poly16_t const * ptr, poly16x4_t vec, __constrange(0,3) int // VLD1.16 {d0[0]}, [r0] vld1q_dup_u8(__transfersize(1) uint8_t const * ptr); // VLD1.8 {d0[]}, [r0] uint16x8_t vld1q_dup_u16(__transfersize(1) uint16_t const * ptr); // VLD1.16 {d0[]}, [r0] uint32x4_t vld1q_dup_u32(__transfersize(1) uint32_t const * ptr); // VLD1.32 {d0[]}, [r0] uint64x2_t vld1q_dup_u64(__transfersize(1) uint64_t const * ptr); // VLD1.64 {d0}, [r0] int8x16_t vld1q_dup_s8(__transfersize(1) int8_t const * ptr); // VLD1.8 {d0[]}, [r0] int16x8_t vld1q_dup_s16(__transfersize(1) int16_t const * ptr); // VLD1.16 {d0[]}, [r0] int32x4_t vld1q_dup_s32(__transfersize(1) int32_t const * ptr); // VLD1.32 {d0[]}, [r0] int64x2_t vld1q_dup_s64(__transfersize(1) int64_t const * ptr); // VLD1.64 {d0}, [r0] float16x8_t vld1q_dup_f16(__transfersize(1) __fp16 const * ptr); // VLD1.16 {d0[]}, [r0] float32x4_t vld1q_dup_f32(__transfersize(1) float32_t const * ptr); // VLD1.32 {d0[]}, [r0] poly8x16_t vld1q_dup_p8(__transfersize(1) poly8_t const * ptr); // VLD1.8 {d0[]}, [r0] poly16x8_t vld1q_dup_p16(__transfersize(1) poly16_t const * ptr); // VLD1.16 {d0[]}, [r0] uint8x8_t vld1_dup_u8(__transfersize(1) uint8_t const * ptr); // VLD1.8 {d0[]}, [r0] uint16x4_t vld1_dup_u16(__transfersize(1) uint16_t const * ptr); // VLD1.16 {d0[]}, [r0] uint32x2_t vld1_dup_u32(__transfersize(1) uint32_t const * ptr); // VLD1.32 {d0[]}, [r0] uint64x1_t vld1_dup_u64(__transfersize(1) uint64_t const * ptr); uint8x16_t // VLD1.64 {d0}, [r0] vld1_dup_s8(__transfersize(1) int8_t const * ptr); // VLD1.8 {d0[]}, [r0] int16x4_t vld1_dup_s16(__transfersize(1) int16_t const * ptr); // VLD1.16 {d0[]}, [r0] int32x2_t vld1_dup_s32(__transfersize(1) int32_t const * ptr); // VLD1.32 {d0[]}, [r0] int8x8_t ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-29 NEON サポー ト の使用 int64x1_t vld1_dup_s64(__transfersize(1) int64_t const * ptr); // VLD1.64 {d0}, [r0] float16x4_t vld1_dup_f16(__transfersize(1) __fp16 const * ptr); // VLD1.16 {d0[]}, [r0] float32x2_t vld1_dup_f32(__transfersize(1) float32_t const * ptr); // VLD1.32 {d0[]}, [r0] poly8x8_t vld1_dup_p8(__transfersize(1) poly8_t const * ptr); // VLD1.8 {d0[]}, [r0] poly16x4_t vld1_dup_p16(__transfersize(1) poly16_t const * ptr); // VLD1.16 {d0[]}, [r0] void vst1q_u8(__transfersize(16) uint8_t * ptr, uint8x16_t val); // VST1.8 {d0, d1}, [r0] void vst1q_u16(__transfersize(8) uint16_t * ptr, uint16x8_t val); // VST1.16 {d0, d1}, [r0] void vst1q_u32(__transfersize(4) uint32_t * ptr, uint32x4_t val); // VST1.32 {d0, d1}, [r0] void vst1q_u64(__transfersize(2) uint64_t * ptr, uint64x2_t val); // VST1.64 {d0, d1}, [r0] void vst1q_s8(__transfersize(16) int8_t * ptr, int8x16_t val); // VST1.8 {d0, d1}, [r0] void vst1q_s16(__transfersize(8) int16_t * ptr, int16x8_t val); // VST1.16 {d0, d1}, [r0] void vst1q_s32(__transfersize(4) int32_t * ptr, int32x4_t val); // VST1.32 {d0, d1}, [r0] void vst1q_s64(__transfersize(2) int64_t * ptr, int64x2_t val); // VST1.64 {d0, d1}, [r0] void vst1q_f16(__transfersize(8) __fp16 * ptr, float16x8_t val); // VST1.16 {d0, d1}, [r0] void vst1q_f32(__transfersize(4) float32_t * ptr, float32x4_t val); // VST1.32 {d0, d1}, [r0] void vst1q_p8(__transfersize(16) poly8_t * ptr, poly8x16_t val); // VST1.8 {d0, d1}, [r0] void vst1q_p16(__transfersize(8) poly16_t * ptr, poly16x8_t val); // VST1.16 {d0, d1}, [r0] void vst1_u8(__transfersize(8) uint8_t * ptr, uint8x8_t val); // VST1.8 {d0}, [r0] void vst1_u16(__transfersize(4) uint16_t * ptr, uint16x4_t val); // VST1.16 {d0}, [r0] void vst1_u32(__transfersize(2) uint32_t * ptr, uint32x2_t val); // VST1.32 {d0}, [r0] void vst1_u64(__transfersize(1) uint64_t * ptr, uint64x1_t val); // VST1.64 {d0}, [r0] void vst1_s8(__transfersize(8) int8_t * ptr, int8x8_t val); void void void E-30 // VST1.8 {d0}, [r0] vst1_s16(__transfersize(4) int16_t * ptr, int16x4_t val); // VST1.16 {d0}, [r0] vst1_s32(__transfersize(2) int32_t * ptr, int32x2_t val); // VST1.32 {d0}, [r0] vst1_s64(__transfersize(1) int64_t * ptr, int64x1_t val); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 void void void void void void void void void void void void void void void void void void void void void void void void // VST1.64 {d0}, [r0] vst1_f16(__transfersize(4) __fp16 * ptr, float16x4_t val); // VST1.16 {d0}, [r0] vst1_f32(__transfersize(2) float32_t * ptr, float32x2_t val); // VST1.32 {d0}, [r0] vst1_p8(__transfersize(8) poly8_t * ptr, poly8x8_t val); // VST1.8 {d0}, [r0] vst1_p16(__transfersize(4) poly16_t * ptr, poly16x4_t val); // VST1.16 {d0}, [r0] vst1q_lane_u8(__transfersize(1) uint8_t * ptr, uint8x16_t val, __constrange(0,15) int lane); // VST1.8 {d0[0]}, [r0] vst1q_lane_u16(__transfersize(1) uint16_t * ptr, uint16x8_t val, __constrange(0,7) int lane); // VST1.16 {d0[0]}, [r0] vst1q_lane_u32(__transfersize(1) uint32_t * ptr, uint32x4_t val, __constrange(0,3) int lane); // VST1.32 {d0[0]}, [r0] vst1q_lane_u64(__transfersize(1) uint64_t * ptr, uint64x2_t val, __constrange(0,1) int lane); // VST1.64 {d0}, [r0] vst1q_lane_s8(__transfersize(1) int8_t * ptr, int8x16_t val, __constrange(0,15) int lane); // VST1.8 {d0[0]}, [r0] vst1q_lane_s16(__transfersize(1) int16_t * ptr, int16x8_t val, __constrange(0,7) int lane); // VST1.16 {d0[0]}, [r0] vst1q_lane_s32(__transfersize(1) int32_t * ptr, int32x4_t val, __constrange(0,3) int lane); // VST1.32 {d0[0]}, [r0] vst1q_lane_s64(__transfersize(1) int64_t * ptr, int64x2_t val, __constrange(0,1) int lane); // VST1.64 {d0}, [r0] vst1q_lane_f16(__transfersize(1) __fp16 * ptr, float16x8_t val, __constrange(0,7) int lane); // VST1.16 {d0[0]}, [r0] vst1q_lane_f32(__transfersize(1) float32_t * ptr, float32x4_t val, __constrange(0,3) int lane); // VST1.32 {d0[0]}, [r0] vst1q_lane_p8(__transfersize(1) poly8_t * ptr, poly8x16_t val, __constrange(0,15) int lane); // VST1.8 {d0[0]}, [r0] vst1q_lane_p16(__transfersize(1) poly16_t * ptr, poly16x8_t val, __constrange(0,7) int lane); // VST1.16 {d0[0]}, [r0] vst1_lane_u8(__transfersize(1) uint8_t * ptr, uint8x8_t val, __constrange(0,7) int lane); // VST1.8 {d0[0]}, [r0] vst1_lane_u16(__transfersize(1) uint16_t * ptr, uint16x4_t val, __constrange(0,3) int lane); // VST1.16 {d0[0]}, [r0] vst1_lane_u32(__transfersize(1) uint32_t * ptr, uint32x2_t val, __constrange(0,1) int lane); // VST1.32 {d0[0]}, [r0] vst1_lane_u64(__transfersize(1) uint64_t * ptr, uint64x1_t val, __constrange(0,0) int lane); // VST1.64 {d0}, [r0] vst1_lane_s8(__transfersize(1) int8_t * ptr, int8x8_t val, __constrange(0,7) int lane); // VST1.8 {d0[0]}, [r0] vst1_lane_s16(__transfersize(1) int16_t * ptr, int16x4_t val, __constrange(0,3) int lane); // VST1.16 {d0[0]}, [r0] vst1_lane_s32(__transfersize(1) int32_t * ptr, int32x2_t val, __constrange(0,1) int lane); // VST1.32 {d0[0]}, [r0] vst1_lane_s64(__transfersize(1) int64_t * ptr, int64x1_t val, __constrange(0,0) int lane); // VST1.64 {d0}, [r0] ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-31 NEON サポー ト の使用 void void void void vst1_lane_f16(__transfersize(1) __fp16 * ptr, float16x4_t val, __constrange(0,3) int lane); // VST1.16 {d0[0]}, [r0] vst1_lane_f32(__transfersize(1) float32_t * ptr, float32x2_t val, __constrange(0,1) int lane); // VST1.32 {d0[0]}, [r0] vst1_lane_p8(__transfersize(1) poly8_t * ptr, poly8x8_t val, __constrange(0,7) int lane); // VST1.8 {d0[0]}, [r0] vst1_lane_p16(__transfersize(1) poly16_t * ptr, poly16x4_t val, __constrange(0,3) int lane); // VST1.16 {d0[0]}, [r0] E.3.15 N 要素構造体のロー ド と ス ト ア 以下の コ ンパ イ ラ 組み込み関数は、 n 要素構造体の ロ ー ド ま たは ス ト ア を行 い ます。 ま た、 配列構造体 も 同様に定義 さ れてい ます。 例えば、 int16x4x2_t 構造体は次の よ う に定義 さ れます。 struct int16x4x2_t { int16x4_t val[2]; }; uint8x16x2_t vld2q_u8(__transfersize(32) uint8_t const * ptr); // VLD2.8 {d0, d2}, [r0] uint16x8x2_t vld2q_u16(__transfersize(16) uint16_t const * ptr); // VLD2.16 {d0, d2}, [r0] uint32x4x2_t vld2q_u32(__transfersize(8) uint32_t const * ptr); // VLD2.32 {d0, d2}, [r0] int8x16x2_t vld2q_s8(__transfersize(32) int8_t const * ptr); // VLD2.8 {d0, d2}, [r0] int16x8x2_t vld2q_s16(__transfersize(16) int16_t const * ptr); // VLD2.16 {d0, d2}, [r0] int32x4x2_t vld2q_s32(__transfersize(8) int32_t const * ptr); // VLD2.32 {d0, d2}, [r0] float16x8x2_t vld2q_f16(__transfersize(16) __fp16 const * ptr); // VLD2.16 {d0, d2}, [r0] float32x4x2_t vld2q_f32(__transfersize(8) float32_t const * ptr); // VLD2.32 {d0, d2}, [r0] poly8x16x2_t vld2q_p8(__transfersize(32) poly8_t const * ptr); // VLD2.8 {d0, d2}, [r0] poly16x8x2_t vld2q_p16(__transfersize(16) poly16_t const * ptr); // VLD2.16 {d0, d2}, [r0] uint8x8x2_t vld2_u8(__transfersize(16) uint8_t const * ptr); // VLD2.8 {d0, d1}, [r0] uint16x4x2_t vld2_u16(__transfersize(8) uint16_t const * ptr); // VLD2.16 {d0, d1}, [r0] uint32x2x2_t vld2_u32(__transfersize(4) uint32_t const * ptr); // VLD2.32 {d0, d1}, [r0] uint64x1x2_t vld2_u64(__transfersize(2) uint64_t const * ptr); // VLD1.64 {d0, d1}, [r0] int8x8x2_t vld2_s8(__transfersize(16) int8_t const * ptr); // VLD2.8 {d0, d1}, [r0] E-32 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 int16x4x2_t vld2_s16(__transfersize(8) int16_t const * ptr); // VLD2.16 {d0, d1}, [r0] int32x2x2_t vld2_s32(__transfersize(4) int32_t const * ptr); // VLD2.32 {d0, d1}, [r0] int64x1x2_t vld2_s64(__transfersize(2) int64_t const * ptr); // VLD1.64 {d0, d1}, [r0] float16x4x2_t vld2_f16(__transfersize(8) __fp16 const * ptr); // VLD2.16 {d0, d1}, [r0] float32x2x2_t vld2_f32(__transfersize(4) float32_t const * ptr); // VLD2.32 {d0, d1}, [r0] poly8x8x2_t vld2_p8(__transfersize(16) poly8_t const * ptr); // VLD2.8 {d0, d1}, [r0] poly16x4x2_t vld2_p16(__transfersize(8) poly16_t const * ptr); // VLD2.16 {d0, d1}, [r0] uint8x16x3_t vld3q_u8(__transfersize(48) uint8_t const * ptr); // VLD3.8 {d0, d2, d4}, [r0] uint16x8x3_t vld3q_u16(__transfersize(24) uint16_t const * ptr); // VLD3.16 {d0, d2, d4}, [r0] uint32x4x3_t vld3q_u32(__transfersize(12) uint32_t const * ptr); // VLD3.32 {d0, d2, d4}, [r0] int8x16x3_t vld3q_s8(__transfersize(48) int8_t const * ptr); // VLD3.8 {d0, d2, d4}, [r0] int16x8x3_t vld3q_s16(__transfersize(24) int16_t const * ptr); // VLD3.16 {d0, d2, d4}, [r0] int32x4x3_t vld3q_s32(__transfersize(12) int32_t const * ptr); // VLD3.32 {d0, d2, d4}, [r0] float16x8x3_t vld3q_f16(__transfersize(24) __fp16 const * ptr); // VLD3.16 {d0, d2, d4}, [r0] float32x4x3_t vld3q_f32(__transfersize(12) float32_t const * ptr); // VLD3.32 {d0, d2, d4}, [r0] poly8x16x3_t vld3q_p8(__transfersize(48) poly8_t const * ptr); // VLD3.8 {d0, d2, d4}, [r0] poly16x8x3_t vld3q_p16(__transfersize(24) poly16_t const * ptr); // VLD3.16 {d0, d2, d4}, [r0] uint8x8x3_t vld3_u8(__transfersize(24) uint8_t const * ptr); // VLD3.8 {d0, d1, d2}, [r0] uint16x4x3_t vld3_u16(__transfersize(12) uint16_t const * ptr); // VLD3.16 {d0, d1, d2}, [r0] uint32x2x3_t vld3_u32(__transfersize(6) uint32_t const * ptr); // VLD3.32 {d0, d1, d2}, [r0] uint64x1x3_t vld3_u64(__transfersize(3) uint64_t const * ptr); // VLD1.64 {d0, d1, d2}, [r0] int8x8x3_t vld3_s8(__transfersize(24) int8_t const * ptr); // VLD3.8 {d0, d1, d2}, [r0] int16x4x3_t vld3_s16(__transfersize(12) int16_t const * ptr); // VLD3.16 {d0, d1, d2}, [r0] int32x2x3_t vld3_s32(__transfersize(6) int32_t const * ptr); // VLD3.32 {d0, d1, d2}, [r0] int64x1x3_t vld3_s64(__transfersize(3) int64_t const * ptr); ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-33 NEON サポー ト の使用 // VLD1.64 {d0, d1, d2}, [r0] float16x4x3_t vld3_f16(__transfersize(12) __fp16 const * ptr); // VLD3.16 {d0, d1, d2}, [r0] float32x2x3_t vld3_f32(__transfersize(6) float32_t const * ptr); // VLD3.32 {d0, d1, d2}, [r0] poly8x8x3_t vld3_p8(__transfersize(24) poly8_t const * ptr); // VLD3.8 {d0, d1, d2}, [r0] poly16x4x3_t vld3_p16(__transfersize(12) poly16_t const * ptr); // VLD3.16 {d0, d1, d2}, [r0] uint8x16x4_t vld4q_u8(__transfersize(64) uint8_t const * ptr); // VLD4.8 {d0, d2, d4, d6}, [r0] uint16x8x4_t vld4q_u16(__transfersize(32) uint16_t const * ptr); // VLD4.16 {d0, d2, d4, d6}, [r0] uint32x4x4_t vld4q_u32(__transfersize(16) uint32_t const * ptr); // VLD4.32 {d0, d2, d4, d6}, [r0] int8x16x4_t vld4q_s8(__transfersize(64) int8_t const * ptr); // VLD4.8 {d0, d2, d4, d6}, [r0] int16x8x4_t vld4q_s16(__transfersize(32) int16_t const * ptr); // VLD4.16 {d0, d2, d4, d6}, [r0] int32x4x4_t vld4q_s32(__transfersize(16) int32_t const * ptr); // VLD4.32 {d0, d2, d4, d6}, [r0] float16x8x4_t vld4q_f16(__transfersize(32) __fp16 const * ptr); // VLD4.16 {d0, d2, d4, d6}, [r0] float32x4x4_t vld4q_f32(__transfersize(16) float32_t const * ptr); // VLD4.32 {d0, d2, d4, d6}, [r0] poly8x16x4_t vld4q_p8(__transfersize(64) poly8_t const * ptr); // VLD4.8 {d0, d2, d4, d6}, [r0] poly16x8x4_t vld4q_p16(__transfersize(32) poly16_t const * ptr); // VLD4.16 {d0, d2, d4, d6}, [r0] uint8x8x4_t vld4_u8(__transfersize(32) uint8_t const * ptr); // VLD4.8 {d0, d1, d2, d3}, [r0] uint16x4x4_t vld4_u16(__transfersize(16) uint16_t const * ptr); // VLD4.16 {d0, d1, d2, d3}, [r0] uint32x2x4_t vld4_u32(__transfersize(8) uint32_t const * ptr); // VLD4.32 {d0, d1, d2, d3}, [r0] uint64x1x4_t vld4_u64(__transfersize(4) uint64_t const * ptr); // VLD1.64 {d0, d1, d2, d3}, [r0] int8x8x4_t vld4_s8(__transfersize(32) int8_t const * ptr); // VLD4.8 {d0, d1, d2, d3}, [r0] int16x4x4_t vld4_s16(__transfersize(16) int16_t const * ptr); // VLD4.16 {d0, d1, d2, d3}, [r0] int32x2x4_t vld4_s32(__transfersize(8) int32_t const * ptr); // VLD4.32 {d0, d1, d2, d3}, [r0] int64x1x4_t vld4_s64(__transfersize(4) int64_t const * ptr); // VLD1.64 {d0, d1, d2, d3}, [r0] float16x4x4_t vld4_f16(__transfersize(16) __fp16 const * ptr); // VLD4.16 {d0, d1, d2, d3}, [r0] E-34 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 float32x2x4_t vld4_f32(__transfersize(8) float32_t const * ptr); // VLD4.32 {d0, d1, d2, d3}, [r0] poly8x8x4_t vld4_p8(__transfersize(32) poly8_t const * ptr); // VLD4.8 {d0, d1, d2, d3}, [r0] poly16x4x4_t vld4_p16(__transfersize(16) poly16_t const * ptr); // VLD4.16 {d0, d1, d2, d3}, [r0] uint8x8x2_t vld2_dup_u8(__transfersize(2) uint8_t const * ptr); // VLD2.8 {d0[], d1[]}, [r0] uint16x4x2_t vld2_dup_u16(__transfersize(2) uint16_t const * ptr); // VLD2.16 {d0[], d1[]}, [r0] uint32x2x2_t vld2_dup_u32(__transfersize(2) uint32_t const * ptr); // VLD2.32 {d0[], d1[]}, [r0] uint64x1x2_t vld2_dup_u64(__transfersize(2) uint64_t const * ptr); // VLD1.64 {d0, d1}, [r0] int8x8x2_t vld2_dup_s8(__transfersize(2) int8_t const * ptr); // VLD2.8 {d0[], d1[]}, [r0] int16x4x2_t vld2_dup_s16(__transfersize(2) int16_t const * ptr); // VLD2.16 {d0[], d1[]}, [r0] int32x2x2_t vld2_dup_s32(__transfersize(2) int32_t const * ptr); // VLD2.32 {d0[], d1[]}, [r0] int64x1x2_t vld2_dup_s64(__transfersize(2) int64_t const * ptr); // VLD1.64 {d0, d1}, [r0] float16x4x2_t vld2_dup_f16(__transfersize(2) __fp16 const * ptr); // VLD2.16 {d0[], d1[]}, [r0] float32x2x2_t vld2_dup_f32(__transfersize(2) float32_t const * ptr); // VLD2.32 {d0[], d1[]}, [r0] poly8x8x2_t vld2_dup_p8(__transfersize(2) poly8_t const * ptr); // VLD2.8 {d0[], d1[]}, [r0] poly16x4x2_t vld2_dup_p16(__transfersize(2) poly16_t const * ptr); // VLD2.16 {d0[], d1[]}, [r0] uint8x8x3_t vld3_dup_u8(__transfersize(3) uint8_t const * ptr); // VLD3.8 {d0[], d1[], d2[]}, [r0] uint16x4x3_t vld3_dup_u16(__transfersize(3) uint16_t const * ptr); // VLD3.16 {d0[], d1[], d2[]}, [r0] uint32x2x3_t vld3_dup_u32(__transfersize(3) uint32_t const * ptr); // VLD3.32 {d0[], d1[], d2[]}, [r0] uint64x1x3_t vld3_dup_u64(__transfersize(3) uint64_t const * ptr); // VLD1.64 {d0, d1, d2}, [r0] int8x8x3_t vld3_dup_s8(__transfersize(3) int8_t const * ptr); // VLD3.8 {d0[], d1[], d2[]}, [r0] int16x4x3_t vld3_dup_s16(__transfersize(3) int16_t const * ptr); // VLD3.16 {d0[], d1[], d2[]}, [r0] int32x2x3_t vld3_dup_s32(__transfersize(3) int32_t const * ptr); // VLD3.32 {d0[], d1[], d2[]}, [r0] int64x1x3_t vld3_dup_s64(__transfersize(3) int64_t const * ptr); // VLD1.64 {d0, d1, d2}, [r0] float16x4x3_t vld3_dup_f16(__transfersize(3) __fp16 const * ptr); // VLD3.16 {d0[], d1[], d2[]}, [r0] float32x2x3_t vld3_dup_f32(__transfersize(3) float32_t const * ptr); ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-35 NEON サポー ト の使用 // VLD3.32 {d0[], d1[], d2[]}, [r0] poly8x8x3_t vld3_dup_p8(__transfersize(3) poly8_t const * ptr); // VLD3.8 {d0[], d1[], d2[]}, [r0] poly16x4x3_t vld3_dup_p16(__transfersize(3) poly16_t const * ptr); // VLD3.16 {d0[], d1[], d2[]}, [r0] uint8x8x4_t vld4_dup_u8(__transfersize(4) uint8_t const * ptr); // VLD4.8 {d0[], d1[], d2[], d3[]}, [r0] uint16x4x4_t vld4_dup_u16(__transfersize(4) uint16_t const * ptr); // VLD4.16 {d0[], d1[], d2[], d3[]}, [r0] uint32x2x4_t vld4_dup_u32(__transfersize(4) uint32_t const * ptr); // VLD4.32 {d0[], d1[], d2[], d3[]}, [r0] uint64x1x4_t vld4_dup_u64(__transfersize(4) uint64_t const * ptr); // VLD1.64 {d0, d1, d2, d3}, [r0] int8x8x4_t vld4_dup_s8(__transfersize(4) int8_t const * ptr); // VLD4.8 {d0[], d1[], d2[], d3[]}, [r0] int16x4x4_t vld4_dup_s16(__transfersize(4) int16_t const * ptr); // VLD4.16 {d0[], d1[], d2[], d3[]}, [r0] int32x2x4_t vld4_dup_s32(__transfersize(4) int32_t const * ptr); // VLD4.32 {d0[], d1[], d2[], d3[]}, [r0] int64x1x4_t vld4_dup_s64(__transfersize(4) int64_t const * ptr); // VLD1.64 {d0, d1, d2, d3}, [r0] float16x4x4_t vld4_dup_f16(__transfersize(4) __fp16 const * ptr); // VLD4.16 {d0[], d1[], d2[], d3[]}, [r0] float32x2x4_t vld4_dup_f32(__transfersize(4) float32_t const * ptr); // VLD4.32 {d0[], d1[], d2[], d3[]}, [r0] poly8x8x4_t vld4_dup_p8(__transfersize(4) poly8_t const * ptr); // VLD4.8 {d0[], d1[], d2[], d3[]}, [r0] poly16x4x4_t vld4_dup_p16(__transfersize(4) poly16_t const * ptr); // VLD4.16 {d0[], d1[], d2[], d3[]}, [r0] uint16x8x2_t vld2q_lane_u16(__transfersize(2) uint16_t const * ptr, uint16x8x2_t src, __constrange(0,7) int lane); // VLD2.16 {d0[0], d2[0]}, [r0] uint32x4x2_t vld2q_lane_u32(__transfersize(2) uint32_t const * ptr, uint32x4x2_t src, __constrange(0,3) int lane); // VLD2.32 {d0[0], d2[0]}, [r0] int16x8x2_t vld2q_lane_s16(__transfersize(2) int16_t const * ptr, int16x8x2_t src, __constrange(0,7) int lane); // VLD2.16 {d0[0], d2[0]}, [r0] int32x4x2_t vld2q_lane_s32(__transfersize(2) int32_t const * ptr, int32x4x2_t src, __constrange(0,3) int lane); // VLD2.32 {d0[0], d2[0]}, [r0] float16x8x2_t vld2q_lane_f16(__transfersize(2) __fp16 const * ptr, float16x8x2_t src, __constrange(0,7) int lane); // VLD2.16 {d0[0], d2[0]}, [r0] float32x4x2_t vld2q_lane_f32(__transfersize(2) float32_t const * ptr, float32x4x2_t src, __constrange(0,3) int lane); // VLD2.32 {d0[0], d2[0]}, [r0] poly16x8x2_t vld2q_lane_p16(__transfersize(2) poly16_t const * ptr, poly16x8x2_t src, __constrange(0,7) int lane); E-36 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 // VLD2.16 {d0[0], d2[0]}, [r0] uint8x8x2_t vld2_lane_u8(__transfersize(2) uint8_t const * ptr, uint8x8x2_t src, __constrange(0,7) int lane); // VLD2.8 {d0[0], d1[0]}, [r0] uint16x4x2_t vld2_lane_u16(__transfersize(2) uint16_t const * ptr, uint16x4x2_t src, __constrange(0,3) int lane); // VLD2.16 {d0[0], d1[0]}, [r0] uint32x2x2_t vld2_lane_u32(__transfersize(2) uint32_t const * ptr, uint32x2x2_t src, __constrange(0,1) int lane); // VLD2.32 {d0[0], d1[0]}, [r0] int8x8x2_t vld2_lane_s8(__transfersize(2) int8_t const * ptr, int8x8x2_t src, __constrange(0,7) int lane); // VLD2.8 {d0[0], d1[0]}, [r0] int16x4x2_t vld2_lane_s16(__transfersize(2) int16_t const * ptr, int16x4x2_t src, __constrange(0,3) int lane); // VLD2.16 {d0[0], d1[0]}, [r0] int32x2x2_t vld2_lane_s32(__transfersize(2) int32_t const * ptr, int32x2x2_t src, __constrange(0,1) int lane); // VLD2.32 {d0[0], d1[0]}, [r0] float16x4x2_t vld2_lane_f32(__transfersize(2) __fp16 const * ptr, float16x4x2_t src, __constrange(0,3) int lane); // VLD2.16 {d0[0], d1[0]}, [r0] float32x2x2_t vld2_lane_f32(__transfersize(2) float32_t const * ptr, float32x2x2_t src, __constrange(0,1) int lane); // VLD2.32 {d0[0], d1[0]}, [r0] poly8x8x2_t vld2_lane_p8(__transfersize(2) poly8_t const * ptr, poly8x8x2_t src, __constrange(0,7) int lane); // VLD2.8 {d0[0], d1[0]}, [r0] poly16x4x2_t vld2_lane_p16(__transfersize(2) poly16_t const * ptr, poly16x4x2_t src, __constrange(0,3) int lane); // VLD2.16 {d0[0], d1[0]}, [r0] uint16x8x3_t vld3q_lane_u16(__transfersize(3) uint16_t const * ptr, uint16x8x3_t src, __constrange(0,7) int lane); // VLD3.16 {d0[0], d2[0], d4[0]}, [r0] uint32x4x3_t vld3q_lane_u32(__transfersize(3) uint32_t const * ptr, uint32x4x3_t src, __constrange(0,3) int lane); // VLD3.32 {d0[0], d2[0], d4[0]}, [r0] int16x8x3_t vld3q_lane_s16(__transfersize(3) int16_t const * ptr, int16x8x3_t src, __constrange(0,7) int lane); // VLD3.16 {d0[0], d2[0], d4[0]}, [r0] int32x4x3_t vld3q_lane_s32(__transfersize(3) int32_t const * ptr, int32x4x3_t src, __constrange(0,3) int lane); // VLD3.32 {d0[0], d2[0], d4[0]}, [r0] float16x8x3_t vld3q_lane_f32(__transfersize(3) __fp16 const * ptr, float16x8x3_t src, __constrange(0,7) int lane); // VLD3.16 {d0[0], d2[0], d4[0]}, [r0] float32x4x3_t vld3q_lane_f32(__transfersize(3) float32_t const * ptr, float32x4x3_t src, __constrange(0,3) int lane); // VLD3.32 {d0[0], d2[0], d4[0]}, [r0] poly16x8x3_t vld3q_lane_p16(__transfersize(3) poly16_t const * ptr, poly16x8x3_t src, ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-37 NEON サポー ト の使用 __constrange(0,7) int lane); // VLD3.16 {d0[0], d2[0], d4[0]}, [r0] uint8x8x3_t vld3_lane_u8(__transfersize(3) uint8_t const * ptr, uint8x8x3_t src, __constrange(0,7) int lane); // VLD3.8 {d0[0], d1[0], d2[0]}, [r0] uint16x4x3_t vld3_lane_u16(__transfersize(3) uint16_t const * ptr, uint16x4x3_t src, __constrange(0,3) int lane); // VLD3.16 {d0[0], d1[0], d2[0]}, [r0] uint32x2x3_t vld3_lane_u32(__transfersize(3) uint32_t const * ptr, uint32x2x3_t src, __constrange(0,1) int lane); // VLD3.32 {d0[0], d1[0], d2[0]}, [r0] int8x8x3_t vld3_lane_s8(__transfersize(3) int8_t const * ptr, int8x8x3_t src, __constrange(0,7) int lane); // VLD3.8 {d0[0], d1[0], d2[0]}, [r0] int16x4x3_t vld3_lane_s16(__transfersize(3) int16_t const * ptr, int16x4x3_t src, __constrange(0,3) int lane); // VLD3.16 {d0[0], d1[0], d2[0]}, [r0] int32x2x3_t vld3_lane_s32(__transfersize(3) int32_t const * ptr, int32x2x3_t src, __constrange(0,1) int lane); // VLD3.32 {d0[0], d1[0], d2[0]}, [r0] float16x4x3_t vld3_lane_f16(__transfersize(3) __fp16 const * ptr, float16x4x3_t src, __constrange(0,3) int lane); // VLD3.16 {d0[0], d1[0], d2[0]}, [r0] float32x2x3_t vld3_lane_f32(__transfersize(3) float32_t const * ptr, float32x2x3_t src, __constrange(0,1) int lane); // VLD3.32 {d0[0], d1[0], d2[0]}, [r0] poly8x8x3_t vld3_lane_p8(__transfersize(3) poly8_t const * ptr, poly8x8x3_t src, __constrange(0,7) int lane); // VLD3.8 {d0[0], d1[0], d2[0]}, [r0] poly16x4x3_t vld3_lane_p16(__transfersize(3) poly16_t const * ptr, poly16x4x3_t src, __constrange(0,3) int lane); // VLD3.16 {d0[0], d1[0], d2[0]}, [r0] uint16x8x4_t vld4q_lane_u16(__transfersize(4) uint16_t const * ptr, uint16x8x4_t src, __constrange(0,7) int lane); // VLD4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0] uint32x4x4_t vld4q_lane_u32(__transfersize(4) uint32_t const * ptr, uint32x4x4_t src, __constrange(0,3) int lane); // VLD4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0] int16x8x4_t vld4q_lane_s16(__transfersize(4) int16_t const * ptr, int16x8x4_t src, __constrange(0,7) int lane); // VLD4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0] int32x4x4_t vld4q_lane_s32(__transfersize(4) int32_t const * ptr, int32x4x4_t src, __constrange(0,3) int lane); // VLD4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0] float16x8x4_t vld4q_lane_f32(__transfersize(4) __fp16 const * ptr, float16x8x4_t src, __constrange(0,7) int lane); // VLD4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0] float32x4x4_t vld4q_lane_f32(__transfersize(4) float32_t const * ptr, float32x4x4_t src, __constrange(0,3) int lane); E-38 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 // VLD4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0] poly16x8x4_t vld4q_lane_p16(__transfersize(4) poly16_t const * ptr, poly16x8x4_t src, __constrange(0,7) int lane); // VLD4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0] uint8x8x4_t vld4_lane_u8(__transfersize(4) uint8_t const * ptr, uint8x8x4_t src, __constrange(0,7) int lane); // VLD4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0] uint16x4x4_t vld4_lane_u16(__transfersize(4) uint16_t const * ptr, uint16x4x4_t src, __constrange(0,3) int lane); // VLD4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0] uint32x2x4_t vld4_lane_u32(__transfersize(4) uint32_t const * ptr, uint32x2x4_t src, __constrange(0,1) int lane); // VLD4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0] int8x8x4_t vld4_lane_s8(__transfersize(4) int8_t const * ptr, int8x8x4_t src, __constrange(0,7) int lane); // VLD4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0] int16x4x4_t vld4_lane_s16(__transfersize(4) int16_t const * ptr, int16x4x4_t src, __constrange(0,3) int lane); // VLD4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0] int32x2x4_t vld4_lane_s32(__transfersize(4) int32_t const * ptr, int32x2x4_t src, __constrange(0,1) int lane); // VLD4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0] float16x4x4_t vld4_lane_f16(__transfersize(4) __fp16 const * ptr, float16x4x4_t src, __constrange(0,3) int lane); // VLD4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0] float32x2x4_t vld4_lane_f32(__transfersize(4) float32_t const * ptr, float32x2x4_t src, __constrange(0,1) int lane); // VLD4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0] poly8x8x4_t vld4_lane_p8(__transfersize(4) poly8_t const * ptr, poly8x8x4_t src, __constrange(0,7) int lane); // VLD4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0] poly16x4x4_t vld4_lane_p16(__transfersize(4) poly16_t const * ptr, poly16x4x4_t src, __constrange(0,3) int lane); // VLD4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0] void vst2q_u8(__transfersize(32) uint8_t * ptr, uint8x16x2_t val); // VST2.8 {d0, d2}, [r0] void vst2q_u16(__transfersize(16) uint16_t * ptr, uint16x8x2_t val); // VST2.16 {d0, d2}, [r0] void vst2q_u32(__transfersize(8) uint32_t * ptr, uint32x4x2_t val); // VST2.32 {d0, d2}, [r0] void vst2q_s8(__transfersize(32) int8_t * ptr, int8x16x2_t val); // VST2.8 {d0, d2}, [r0] void vst2q_s16(__transfersize(16) int16_t * ptr, int16x8x2_t val); // VST2.16 {d0, d2}, [r0] void vst2q_s32(__transfersize(8) int32_t * ptr, int32x4x2_t val); // VST2.32 {d0, d2}, [r0] void vst2q_f16(__transfersize(16) __fp16 * ptr, float16x8x2_t val); // VST2.16 {d0, d2}, [r0] void vst2q_f32(__transfersize(8) float32_t * ptr, float32x4x2_t val); ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-39 NEON サポー ト の使用 void void void void void void void void void void void void void void void void void void void void void void void void E-40 // VST2.32 {d0, d2}, [r0] vst2q_p8(__transfersize(32) poly8_t * ptr, poly8x16x2_t val); // VST2.8 {d0, d2}, [r0] vst2q_p16(__transfersize(16) poly16_t * ptr, poly16x8x2_t val); // VST2.16 {d0, d2}, [r0] vst2_u8(__transfersize(16) uint8_t * ptr, uint8x8x2_t val); // VST2.8 {d0, d1}, [r0] vst2_u16(__transfersize(8) uint16_t * ptr, uint16x4x2_t val); // VST2.16 {d0, d1}, [r0] vst2_u32(__transfersize(4) uint32_t * ptr, uint32x2x2_t val); // VST2.32 {d0, d1}, [r0] vst2_u64(__transfersize(2) uint64_t * ptr, uint64x1x2_t val); // VST1.64 {d0, d1}, [r0] vst2_s8(__transfersize(16) int8_t * ptr, int8x8x2_t val); // VST2.8 {d0, d1}, [r0] vst2_s16(__transfersize(8) int16_t * ptr, int16x4x2_t val); // VST2.16 {d0, d1}, [r0] vst2_s32(__transfersize(4) int32_t * ptr, int32x2x2_t val); // VST2.32 {d0, d1}, [r0] vst2_s64(__transfersize(2) int64_t * ptr, int64x1x2_t val); // VST1.64 {d0, d1}, [r0] vst2_f16(__transfersize(8) __fp16 * ptr, float16x4x2_t val); // VST2.16 {d0, d1}, [r0] vst2_f32(__transfersize(4) float32_t * ptr, float32x2x2_t val); // VST2.32 {d0, d1}, [r0] vst2_p8(__transfersize(16) poly8_t * ptr, poly8x8x2_t val); // VST2.8 {d0, d1}, [r0] vst2_p16(__transfersize(8) poly16_t * ptr, poly16x4x2_t val); // VST2.16 {d0, d1}, [r0] vst3q_u8(__transfersize(48) uint8_t * ptr, uint8x16x3_t val); // VST3.8 {d0, d2, d4}, [r0] vst3q_u16(__transfersize(24) uint16_t * ptr, uint16x8x3_t val); // VST3.16 {d0, d2, d4}, [r0] vst3q_u32(__transfersize(12) uint32_t * ptr, uint32x4x3_t val); // VST3.32 {d0, d2, d4}, [r0] vst3q_s8(__transfersize(48) int8_t * ptr, int8x16x3_t val); // VST3.8 {d0, d2, d4}, [r0] vst3q_s16(__transfersize(24) int16_t * ptr, int16x8x3_t val); // VST3.16 {d0, d2, d4}, [r0] vst3q_s32(__transfersize(12) int32_t * ptr, int32x4x3_t val); // VST3.32 {d0, d2, d4}, [r0] vst3q_f16(__transfersize(24) __fp16 * ptr, float16x8x3_t val); // VST3.16 {d0, d2, d4}, [r0] vst3q_f32(__transfersize(12) float32_t * ptr, float32x4x3_t val); // VST3.32 {d0, d2, d4}, [r0] vst3q_p8(__transfersize(48) poly8_t * ptr, poly8x16x3_t val); // VST3.8 {d0, d2, d4}, [r0] vst3q_p16(__transfersize(24) poly16_t * ptr, poly16x8x3_t val); // VST3.16 {d0, d2, d4}, [r0] Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 void void void void void void void void void void void void void void void void void void void void void void void void void vst3_u8(__transfersize(24) uint8_t * ptr, uint8x8x3_t val); // VST3.8 {d0, d1, d2}, [r0] vst3_u16(__transfersize(12) uint16_t * ptr, uint16x4x3_t val); // VST3.16 {d0, d1, d2}, [r0] vst3_u32(__transfersize(6) uint32_t * ptr, uint32x2x3_t val); // VST3.32 {d0, d1, d2}, [r0] vst3_u64(__transfersize(3) uint64_t * ptr, uint64x1x3_t val); // VST1.64 {d0, d1, d2}, [r0] vst3_s8(__transfersize(24) int8_t * ptr, int8x8x3_t val); // VST3.8 {d0, d1, d2}, [r0] vst3_s16(__transfersize(12) int16_t * ptr, int16x4x3_t val); // VST3.16 {d0, d1, d2}, [r0] vst3_s32(__transfersize(6) int32_t * ptr, int32x2x3_t val); // VST3.32 {d0, d1, d2}, [r0] vst3_s64(__transfersize(3) int64_t * ptr, int64x1x3_t val); // VST1.64 {d0, d1, d2}, [r0] vst3_f16(__transfersize(12) __fp16 * ptr, float16x4x3_t val); // VST3.16 {d0, d1, d2}, [r0] vst3_f32(__transfersize(6) float32_t * ptr, float32x2x3_t val); // VST3.32 {d0, d1, d2}, [r0] vst3_p8(__transfersize(24) poly8_t * ptr, poly8x8x3_t val); // VST3.8 {d0, d1, d2}, [r0] vst3_p16(__transfersize(12) poly16_t * ptr, poly16x4x3_t val); // VST3.16 {d0, d1, d2}, [r0] vst4q_u8(__transfersize(64) uint8_t * ptr, uint8x16x4_t val); // VST4.8 {d0, d2, d4, d6}, [r0] vst4q_u16(__transfersize(32) uint16_t * ptr, uint16x8x4_t val); // VST4.16 {d0, d2, d4, d6}, [r0] vst4q_u32(__transfersize(16) uint32_t * ptr, uint32x4x4_t val); // VST4.32 {d0, d2, d4, d6}, [r0] vst4q_s8(__transfersize(64) int8_t * ptr, int8x16x4_t val); // VST4.8 {d0, d2, d4, d6}, [r0] vst4q_s16(__transfersize(32) int16_t * ptr, int16x8x4_t val); // VST4.16 {d0, d2, d4, d6}, [r0] vst4q_s32(__transfersize(16) int32_t * ptr, int32x4x4_t val); // VST4.32 {d0, d2, d4, d6}, [r0] vst4q_f16(__transfersize(32) __fp16 * ptr, float16x8x4_t val); // VST4.16 {d0, d2, d4, d6}, [r0] vst4q_f32(__transfersize(16) float32_t * ptr, float32x4x4_t val); // VST4.32 {d0, d2, d4, d6}, [r0] vst4q_p8(__transfersize(64) poly8_t * ptr, poly8x16x4_t val); // VST4.8 {d0, d2, d4, d6}, [r0] vst4q_p16(__transfersize(32) poly16_t * ptr, poly16x8x4_t val); // VST4.16 {d0, d2, d4, d6}, [r0] vst4_u8(__transfersize(32) uint8_t * ptr, uint8x8x4_t val); // VST4.8 {d0, d1, d2, d3}, [r0] vst4_u16(__transfersize(16) uint16_t * ptr, uint16x4x4_t val); // VST4.16 {d0, d1, d2, d3}, [r0] vst4_u32(__transfersize(8) uint32_t * ptr, uint32x2x4_t val); ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-41 NEON サポー ト の使用 void void void void void void void void void void void void void void void void void void void void void void void void E-42 // VST4.32 {d0, d1, d2, d3}, [r0] vst4_u64(__transfersize(4) uint64_t * ptr, uint64x1x4_t val); // VST1.64 {d0, d1, d2, d3}, [r0] vst4_s8(__transfersize(32) int8_t * ptr, int8x8x4_t val); // VST4.8 {d0, d1, d2, d3}, [r0] vst4_s16(__transfersize(16) int16_t * ptr, int16x4x4_t val); // VST4.16 {d0, d1, d2, d3}, [r0] vst4_s32(__transfersize(8) int32_t * ptr, int32x2x4_t val); // VST4.32 {d0, d1, d2, d3}, [r0] vst4_s64(__transfersize(4) int64_t * ptr, int64x1x4_t val); // VST1.64 {d0, d1, d2, d3}, [r0] vst4_f16(__transfersize(16) __fp16 * ptr, float16x4x4_t val); // VST4.16 {d0, d1, d2, d3}, [r0] vst4_f32(__transfersize(8) float32_t * ptr, float32x2x4_t val); // VST4.32 {d0, d1, d2, d3}, [r0] vst4_p8(__transfersize(32) poly8_t * ptr, poly8x8x4_t val); // VST4.8 {d0, d1, d2, d3}, [r0] vst4_p16(__transfersize(16) poly16_t * ptr, poly16x4x4_t val); // VST4.16 {d0, d1, d2, d3}, [r0] vst2q_lane_u16(__transfersize(2) uint16_t * ptr, uint16x8x2_t val, __constrange(0,7) int lane); // VST2.16 {d0[0], d2[0]}, [r0] vst2q_lane_u32(__transfersize(2) uint32_t * ptr, uint32x4x2_t val, __constrange(0,3) int lane); // VST2.32 {d0[0], d2[0]}, [r0] vst2q_lane_s16(__transfersize(2) int16_t * ptr, int16x8x2_t val, __constrange(0,7) int lane); // VST2.16 {d0[0], d2[0]}, [r0] vst2q_lane_s32(__transfersize(2) int32_t * ptr, int32x4x2_t val, __constrange(0,3) int lane); // VST2.32 {d0[0], d2[0]}, [r0] vst2q_lane_f16(__transfersize(2) __fp16 * ptr, float16x8x2_t val, __constrange(0,7) int lane); // VST2.16 {d0[0], d2[0]}, [r0] vst2q_lane_f32(__transfersize(2) float32_t * ptr, float32x4x2_t val, __constrange(0,3) int lane); // VST2.32 {d0[0], d2[0]}, [r0] vst2q_lane_p16(__transfersize(2) poly16_t * ptr, poly16x8x2_t val, __constrange(0,7) int lane); // VST2.16 {d0[0], d2[0]}, [r0] vst2_lane_u8(__transfersize(2) uint8_t * ptr, uint8x8x2_t val, __constrange(0,7) int lane); // VST2.8 {d0[0], d1[0]}, [r0] vst2_lane_u16(__transfersize(2) uint16_t * ptr, uint16x4x2_t val, __constrange(0,3) int lane); // VST2.16 {d0[0], d1[0]}, [r0] vst2_lane_u32(__transfersize(2) uint32_t * ptr, uint32x2x2_t val, __constrange(0,1) int lane); // VST2.32 {d0[0], d1[0]}, [r0] vst2_lane_s8(__transfersize(2) int8_t * ptr, int8x8x2_t val, __constrange(0,7) int lane); // VST2.8 {d0[0], d1[0]}, [r0] vst2_lane_s16(__transfersize(2) int16_t * ptr, int16x4x2_t val, __constrange(0,3) int lane); // VST2.16 {d0[0], d1[0]}, [r0] vst2_lane_s32(__transfersize(2) int32_t * ptr, int32x2x2_t val, __constrange(0,1) int lane); // VST2.32 {d0[0], d1[0]}, [r0] vst2_lane_f16(__transfersize(2) __fp16 * ptr, float16x4x2_t val, __constrange(0,3) int lane); // VST2.16 {d0[0], d1[0]}, [r0] vst2_lane_f32(__transfersize(2) float32_t * ptr, float32x2x2_t val, __constrange(0,1) int lane); // VST2.32 {d0[0], d1[0]}, [r0] Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 void void void void void void void void void void void void void void void void void void void void void void void void void vst2_lane_p8(__transfersize(2) poly8_t * ptr, poly8x8x2_t val, __constrange(0,7) int lane); // VST2.8 {d0[0], d1[0]}, [r0] vst2_lane_p16(__transfersize(2) poly16_t * ptr, poly16x4x2_t val, __constrange(0,3) int lane); // VST2.16 {d0[0], d1[0]}, [r0] vst3q_lane_u16(__transfersize(3) uint16_t * ptr, uint16x8x3_t val, __constrange(0,7) int lane); // VST3.16 {d0[0], d2[0], d4[0]}, [r0] vst3q_lane_u32(__transfersize(3) uint32_t * ptr, uint32x4x3_t val, __constrange(0,3) int lane); // VST3.32 {d0[0], d2[0], d4[0]}, [r0] vst3q_lane_s16(__transfersize(3) int16_t * ptr, int16x8x3_t val, __constrange(0,7) int lane); // VST3.16 {d0[0], d2[0], d4[0]}, [r0] vst3q_lane_s32(__transfersize(3) int32_t * ptr, int32x4x3_t val, __constrange(0,3) int lane); // VST3.32 {d0[0], d2[0], d4[0]}, [r0] vst3q_lane_f16(__transfersize(3) __fp16 * ptr, float16x8x3_t val, __constrange(0,7) int lane); // VST3.16 {d0[0], d2[0], d4[0]}, [r0] vst3q_lane_f32(__transfersize(3) float32_t * ptr, float32x4x3_t val, __constrange(0,3) int lane); // VST3.32 {d0[0], d2[0], d4[0]}, [r0] vst3q_lane_p16(__transfersize(3) poly16_t * ptr, poly16x8x3_t val, __constrange(0,7) int lane); // VST3.16 {d0[0], d2[0], d4[0]}, [r0] vst3_lane_u8(__transfersize(3) uint8_t * ptr, uint8x8x3_t val, __constrange(0,7) int lane); // VST3.8 {d0[0], d1[0], d2[0]}, [r0] vst3_lane_u16(__transfersize(3) uint16_t * ptr, uint16x4x3_t val, __constrange(0,3) int lane); // VST3.16 {d0[0], d1[0], d2[0]}, [r0] vst3_lane_u32(__transfersize(3) uint32_t * ptr, uint32x2x3_t val, __constrange(0,1) int lane); // VST3.32 {d0[0], d1[0], d2[0]}, [r0] vst3_lane_s8(__transfersize(3) int8_t * ptr, int8x8x3_t val, __constrange(0,7) int lane); // VST3.8 {d0[0], d1[0], d2[0]}, [r0] vst3_lane_s16(__transfersize(3) int16_t * ptr, int16x4x3_t val, __constrange(0,3) int lane); // VST3.16 {d0[0], d1[0], d2[0]}, [r0] vst3_lane_s32(__transfersize(3) int32_t * ptr, int32x2x3_t val, __constrange(0,1) int lane); // VST3.32 {d0[0], d1[0], d2[0]}, [r0] vst3_lane_f16(__transfersize(3) __fp16 * ptr, float16x4x3_t val, __constrange(0,3) int lane); // VST3.16 {d0[0], d1[0], d2[0]}, [r0] vst3_lane_f32(__transfersize(3) float32_t * ptr, float32x2x3_t val, __constrange(0,1) int lane); // VST3.32 {d0[0], d1[0], d2[0]}, [r0] vst3_lane_p8(__transfersize(3) poly8_t * ptr, poly8x8x3_t val, __constrange(0,7) int lane); // VST3.8 {d0[0], d1[0], d2[0]}, [r0] vst3_lane_p16(__transfersize(3) poly16_t * ptr, poly16x4x3_t val, __constrange(0,3) int lane); // VST3.16 {d0[0], d1[0], d2[0]}, [r0] vst4q_lane_u16(__transfersize(4) uint16_t * ptr, uint16x8x4_t val, __constrange(0,7) int lane); // VST4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0] vst4q_lane_u32(__transfersize(4) uint32_t * ptr, uint32x4x4_t val, __constrange(0,3) int lane); // VST4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0] vst4q_lane_s16(__transfersize(4) int16_t * ptr, int16x8x4_t val, __constrange(0,7) int lane); // VST4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0] vst4q_lane_s32(__transfersize(4) int32_t * ptr, int32x4x4_t val, __constrange(0,3) int lane); // VST4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0] vst4q_lane_f16(__transfersize(4) __fp16 * ptr, float16x8x4_t val, __constrange(0,7) int lane); // VST4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0] vst4q_lane_f32(__transfersize(4) float32_t * ptr, float32x4x4_t val, __constrange(0,3) int lane); ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-43 NEON サポー ト の使用 void void void void void void void void void void void // VST4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0] vst4q_lane_p16(__transfersize(4) poly16_t * ptr, poly16x8x4_t val, __constrange(0,7) int lane); // VST4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0] vst4_lane_u8(__transfersize(4) uint8_t * ptr, uint8x8x4_t val, __constrange(0,7) int lane); // VST4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0] vst4_lane_u16(__transfersize(4) uint16_t * ptr, uint16x4x4_t val, __constrange(0,3) int lane); // VST4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0] vst4_lane_u32(__transfersize(4) uint32_t * ptr, uint32x2x4_t val, __constrange(0,1) int lane); // VST4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0] vst4_lane_s8(__transfersize(4) int8_t * ptr, int8x8x4_t val, __constrange(0,7) int lane); // VST4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0] vst4_lane_s16(__transfersize(4) int16_t * ptr, int16x4x4_t val, __constrange(0,3) int lane); // VST4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0] vst4_lane_s32(__transfersize(4) int32_t * ptr, int32x2x4_t val, __constrange(0,1) int lane); // VST4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0] vst4_lane_f16(__transfersize(4) __fp16 * ptr, float16x4x4_t val, __constrange(0,3) int lane); // VST4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0] vst4_lane_f32(__transfersize(4) float32_t * ptr, float32x2x4_t val, __constrange(0,1) int lane); // VST4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0] vst4_lane_p8(__transfersize(4) poly8_t * ptr, poly8x8x4_t val, __constrange(0,7) int lane); // VST4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0] vst4_lane_p16(__transfersize(4) poly16_t * ptr, poly16x4x4_t val, __constrange(0,3) int lane); // VST4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0] E.3.16 ベ ク タ か らのレ ーンの抽出 こ れ ら の コ ンパ イ ラ 組み込み関数では、 ベ ク タ か ら 1 つの レーン (要素) を 抽出 し ます。 uint8_t uint16_t uint32_t int8_t int16_t int32_t poly8_t poly16_t float32_t uint8_t uint16_t uint32_t int8_t int16_t int32_t poly8_t poly16_t float32_t int64_t E-44 vget_lane_u8(uint8x8_t vec, __constrange(0,7) int lane); vget_lane_u16(uint16x4_t vec, __constrange(0,3) int lane); vget_lane_u32(uint32x2_t vec, __constrange(0,1) int lane); vget_lane_s8(int8x8_t vec, __constrange(0,7) int lane); vget_lane_s16(int16x4_t vec, __constrange(0,3) int lane); vget_lane_s32(int32x2_t vec, __constrange(0,1) int lane); vget_lane_p8(poly8x8_t vec, __constrange(0,7) int lane); vget_lane_p16(poly16x4_t vec, __constrange(0,3) int lane); vget_lane_f32(float32x2_t vec, __constrange(0,1) int lane); vgetq_lane_u8(uint8x16_t vec, __constrange(0,15) int lane); vgetq_lane_u16(uint16x8_t vec, __constrange(0,7) int lane); vgetq_lane_u32(uint32x4_t vec, __constrange(0,3) int lane); vgetq_lane_s8(int8x16_t vec, __constrange(0,15) int lane); vgetq_lane_s16(int16x8_t vec, __constrange(0,7) int lane); vgetq_lane_s32(int32x4_t vec, __constrange(0,3) int lane); vgetq_lane_p8(poly8x16_t vec, __constrange(0,15) int lane); vgetq_lane_p16(poly16x8_t vec, __constrange(0,7) int lane); vgetq_lane_f32(float32x4_t vec, __constrange(0,3) int lane); vget_lane_s64(int64x1_t vec, __constrange(0,0) int lane); // // // // // // // // // // // // // // // // // // // VMOV.U8 r0, d0[0] VMOV.U16 r0, d0[0] VMOV.32 r0, d0[0] VMOV.S8 r0, d0[0] VMOV.S16 r0, d0[0] VMOV.32 r0, d0[0] VMOV.U8 r0, d0[0] VMOV.U16 r0, d0[0] VMOV.32 r0, d0[0] VMOV.U8 r0, d0[0] VMOV.U16 r0, d0[0] VMOV.32 r0, d0[0] VMOV.S8 r0, d0[0] VMOV.S16 r0, d0[0] VMOV.32 r0, d0[0] VMOV.U8 r0, d0[0] VMOV.U16 r0, d0[0] VMOV.32 r0, d0[0] VMOV r0,r0,d0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 uint64_t int64_t uint64_t E.3.17 vget_lane_u64(uint64x1_t vec, __constrange(0,0) int lane); vgetq_lane_s64(int64x2_t vec, __constrange(0,1) int lane); vgetq_lane_u64(uint64x2_t vec, __constrange(0,1) int lane); // VMOV r0,r0,d0 // VMOV r0,r0,d0 // VMOV r0,r0,d0 ベ ク タ 内のレ ーンの設定 こ れ ら の コ ンパ イ ラ 組み込み関数では、 ベ ク タ 内の 1 つの レーン (要素) を 設定 し ます。 uint8x8_t vset_lane_u8(uint8_t value, uint8x8_t vec, __constrange(0,7) int lane); // VMOV.8 d0[0],r0 uint16x4_t vset_lane_u16(uint16_t value, uint16x4_t vec, __constrange(0,3) int lane); // VMOV.16 d0[0],r0 uint32x2_t vset_lane_u32(uint32_t value, uint32x2_t vec, __constrange(0,1) int lane); // VMOV.32 d0[0],r0 int8x8_t vset_lane_s8(int8_t value, int8x8_t vec, __constrange(0,7) int lane); // VMOV.8 d0[0],r0 int16x4_t vset_lane_s16(int16_t value, int16x4_t vec, __constrange(0,3) int lane); // VMOV.16 d0[0],r0 int32x2_t vset_lane_s32(int32_t value, int32x2_t vec, __constrange(0,1) int lane); // VMOV.32 d0[0],r0 poly8x8_t vset_lane_p8(poly8_t value, poly8x8_t vec, __constrange(0,7) int lane); // VMOV.8 d0[0],r0 poly16x4_t vset_lane_p16(poly16_t value, poly16x4_t vec, __constrange(0,3) int lane); // VMOV.16 d0[0],r0 float32x2_t vset_lane_f32(float32_t value, float32x2_t vec, __constrange(0,1) int lane); // VMOV.32 d0[0],r0 uint8x16_t vsetq_lane_u8(uint8_t value, uint8x16_t vec, __constrange(0,15) int lane); // VMOV.8 d0[0],r0 uint16x8_t vsetq_lane_u16(uint16_t value, uint16x8_t vec, __constrange(0,7) int lane); // VMOV.16 d0[0],r0 uint32x4_t vsetq_lane_u32(uint32_t value, uint32x4_t vec, __constrange(0,3) int lane); // VMOV.32 d0[0],r0 int8x16_t vsetq_lane_s8(int8_t value, int8x16_t vec, __constrange(0,15) int lane); // VMOV.8 d0[0],r0 int16x8_t vsetq_lane_s16(int16_t value, int16x8_t vec, __constrange(0,7) int lane); // VMOV.16 d0[0],r0 int32x4_t vsetq_lane_s32(int32_t value, int32x4_t vec, __constrange(0,3) int lane); // VMOV.32 d0[0],r0 poly8x16_t vsetq_lane_p8(poly8_t value, poly8x16_t vec, __constrange(0,15) int lane); // VMOV.8 d0[0],r0 poly16x8_t vsetq_lane_p16(poly16_t value, poly16x8_t vec, __constrange(0,7) int lane); // VMOV.16 d0[0],r0 float32x4_t vsetq_lane_f32(float32_t value, float32x4_t vec, __constrange(0,3) int lane); // VMOV.32 d0[0],r0 int64x1_t vset_lane_s64(int64_t value, int64x1_t vec, __constrange(0,0) int lane); // VMOV d0,r0,r0 uint64x1_t vset_lane_u64(uint64_t value, uint64x1_t vec, __constrange(0,0) int lane); // VMOV d0,r0,r0 ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-45 NEON サポー ト の使用 int64x2_t uint64x2_t E.3.18 vsetq_lane_s64(int64_t value, int64x2_t vec, __constrange(0,1) int lane); // VMOV d0,r0,r0 vsetq_lane_u64(uint64_t value, uint64x2_t vec, __constrange(0,1) int lane); // VMOV d0,r0,r0 ビ ッ ト パ タ ーンから のベ ク タ の初期化 以下の コ ンパ イ ラ 組み込み関数は、 リ テ ラ ルビ ッ ト パ タ ーンか ら ベ ク タ を生 成 し ます。 int8x8_t int16x4_t int32x2_t float16x4_t float32x2_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t poly8x8_t poly16x4_t int64x1_t E.3.19 vcreate_s8(uint64_t a); vcreate_s16(uint64_t a); vcreate_s32(uint64_t a); vcreate_f16(uint64_t a); vcreate_f32(uint64_t a); vcreate_u8(uint64_t a); vcreate_u16(uint64_t a); vcreate_u32(uint64_t a); vcreate_u64(uint64_t a); vcreate_p8(uint64_t a); vcreate_p16(uint64_t a); vcreate_s64(uint64_t a); // // // // // // // // // // // // VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV d0,r0,r0 d0,r0,r0 d0,r0,r0 d0,r0,r0 d0,r0,r0 d0,r0,r0 d0,r0,r0 d0,r0,r0 d0,r0,r0 d0,r0,r0 d0,r0,r0 d0,r0,r0 すべてのレーン を同 じ 値に設定 以下の コ ンパ イ ラ 組み込み関数は、 すべての レーン を同 じ 値に設定 し ます。 すべてのレーン を同 じ 値に設定 uint8x8_t uint16x4_t uint32x2_t int8x8_t int16x4_t int32x2_t poly8x8_t poly16x4_t float32x2_t uint8x16_t uint16x8_t uint32x4_t int8x16_t int16x8_t int32x4_t poly8x16_t poly16x8_t float32x4_t int64x1_t E-46 vdup_n_u8(uint8_t value); vdup_n_u16(uint16_t value); vdup_n_u32(uint32_t value); vdup_n_s8(int8_t value); vdup_n_s16(int16_t value); vdup_n_s32(int32_t value); vdup_n_p8(poly8_t value); vdup_n_p16(poly16_t value); vdup_n_f32(float32_t value); vdupq_n_u8(uint8_t value); vdupq_n_u16(uint16_t value); vdupq_n_u32(uint32_t value); vdupq_n_s8(int8_t value); vdupq_n_s16(int16_t value); vdupq_n_s32(int32_t value); vdupq_n_p8(poly8_t value); vdupq_n_p16(poly16_t value); vdupq_n_f32(float32_t value); vdup_n_s64(int64_t value); // // // // // // // // // // // // // // // // // // // VDUP.8 d0,r0 VDUP.16 d0,r0 VDUP.32 d0,r0 VDUP.8 d0,r0 VDUP.16 d0,r0 VDUP.32 d0,r0 VDUP.8 d0,r0 VDUP.16 d0,r0 VDUP.32 d0,r0 VDUP.8 q0,r0 VDUP.16 q0,r0 VDUP.32 q0,r0 VDUP.8 q0,r0 VDUP.16 q0,r0 VDUP.32 q0,r0 VDUP.8 q0,r0 VDUP.16 q0,r0 VDUP.32 q0,r0 VMOV d0,r0,r0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 uint64x1_t int64x2_t uint64x2_t uint8x8_t uint16x4_t uint32x2_t int8x8_t int16x4_t int32x2_t poly8x8_t poly16x4_t float32x2_t uint8x16_t uint16x8_t uint32x4_t int8x16_t int16x8_t int32x4_t poly8x16_t poly16x8_t float32x4_t int64x1_t uint64x1_t int64x2_t uint64x2_t vdup_n_u64(uint64_t value); vdupq_n_s64(int64_t value); vdupq_n_u64(uint64_t value); vmov_n_u8(uint8_t value); vmov_n_u16(uint16_t value); vmov_n_u32(uint32_t value); vmov_n_s8(int8_t value); vmov_n_s16(int16_t value); vmov_n_s32(int32_t value); vmov_n_p8(poly8_t value); vmov_n_p16(poly16_t value); vmov_n_f32(float32_t value); vmovq_n_u8(uint8_t value); vmovq_n_u16(uint16_t value); vmovq_n_u32(uint32_t value); vmovq_n_s8(int8_t value); vmovq_n_s16(int16_t value); vmovq_n_s32(int32_t value); vmovq_n_p8(poly8_t value); vmovq_n_p16(poly16_t value); vmovq_n_f32(float32_t value); vmov_n_s64(int64_t value); vmov_n_u64(uint64_t value); vmovq_n_s64(int64_t value); vmovq_n_u64(uint64_t value); // // // // // // // // // // // // // // // // // // // // // // // // // VMOV d0,r0,r0 VMOV d0,r0,r0 VMOV d0,r0,r0 VDUP.8 d0,r0 VDUP.16 d0,r0 VDUP.32 d0,r0 VDUP.8 d0,r0 VDUP.16 d0,r0 VDUP.32 d0,r0 VDUP.8 d0,r0 VDUP.16 d0,r0 VDUP.32 d0,r0 VDUP.8 q0,r0 VDUP.16 q0,r0 VDUP.32 q0,r0 VDUP.8 q0,r0 VDUP.16 q0,r0 VDUP.32 q0,r0 VDUP.8 q0,r0 VDUP.16 q0,r0 VDUP.32 q0,r0 VMOV d0,r0,r0 VMOV d0,r0,r0 VMOV d0,r0,r0 VMOV d0,r0,r0 すべてのレ ーン を ベ ク タ の 1 つのレ ーンの値に設定 uint8x8_t uint16x4_t uint32x2_t int8x8_t int16x4_t int32x2_t poly8x8_t poly16x4_t float32x2_t uint8x16_t uint16x8_t uint32x4_t int8x16_t int16x8_t int32x4_t poly8x16_t poly16x8_t float32x4_t int64x1_t uint64x1_t vdup_lane_u8(uint8x8_t vec, __constrange(0,7) int lane); vdup_lane_u16(uint16x4_t vec, __constrange(0,3) int lane); vdup_lane_u32(uint32x2_t vec, __constrange(0,1) int lane); vdup_lane_s8(int8x8_t vec, __constrange(0,7) int lane); vdup_lane_s16(int16x4_t vec, __constrange(0,3) int lane); vdup_lane_s32(int32x2_t vec, __constrange(0,1) int lane); vdup_lane_p8(poly8x8_t vec, __constrange(0,7) int lane); vdup_lane_p16(poly16x4_t vec, __constrange(0,3) int lane); vdup_lane_f32(float32x2_t vec, __constrange(0,1) int lane); vdupq_lane_u8(uint8x8_t vec, __constrange(0,7) int lane); vdupq_lane_u16(uint16x4_t vec, __constrange(0,3) int lane); vdupq_lane_u32(uint32x2_t vec, __constrange(0,1) int lane); vdupq_lane_s8(int8x8_t vec, __constrange(0,7) int lane); vdupq_lane_s16(int16x4_t vec, __constrange(0,3) int lane); vdupq_lane_s32(int32x2_t vec, __constrange(0,1) int lane); vdupq_lane_p8(poly8x8_t vec, __constrange(0,7) int lane); vdupq_lane_p16(poly16x4_t vec, __constrange(0,3) int lane); vdupq_lane_f32(float32x2_t vec, __constrange(0,1) int lane); vdup_lane_s64(int64x1_t vec, __constrange(0,0) int lane); vdup_lane_u64(uint64x1_t vec, __constrange(0,0) int lane); ARM DUI 0348BJ ID 1 0 0 4 1 9 // // // // // // // // // // // // // // // // // // // // Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, VDUP.8 d0,d0[0] VDUP.16 d0,d0[0] VDUP.32 d0,d0[0] VDUP.8 d0,d0[0] VDUP.16 d0,d0[0] VDUP.32 d0,d0[0] VDUP.8 d0,d0[0] VDUP.16 d0,d0[0] VDUP.32 d0,d0[0] VDUP.8 q0,d0[0] VDUP.16 q0,d0[0] VDUP.32 q0,d0[0] VDUP.8 q0,d0[0] VDUP.16 q0,d0[0] VDUP.32 q0,d0[0] VDUP.8 q0,d0[0] VDUP.16 q0,d0[0] VDUP.32 q0,d0[0] VMOV d0,d0 VMOV d0,d0 E-47 NEON サポー ト の使用 int64x2_t uint64x2_t E.3.20 vdupq_lane_s64(int64x1_t vec, __constrange(0,0) int lane); vdupq_lane_u64(uint64x1_t vec, __constrange(0,0) int lane); // VMOV q0,q0 // VMOV q0,q0 ベ ク タ の結合 こ れ ら の コ ンパ イ ラ 組み込み関数では、 2 つの 64 ビ ッ ト ベ ク タ を結合 し て 1 つの 128 ビ ッ ト ベ ク タ に し ます。 int8x16_t int16x8_t int32x4_t int64x2_t float16x8_t float32x4_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t poly8x16_t poly16x8_t E.3.21 vcombine_s8(int8x8_t low, int8x8_t high); vcombine_s16(int16x4_t low, int16x4_t high); vcombine_s32(int32x2_t low, int32x2_t high); vcombine_s64(int64x1_t low, int64x1_t high); vcombine_f16(float16x4_t low, float16x4_t high); vcombine_f32(float32x2_t low, float32x2_t high); vcombine_u8(uint8x8_t low, uint8x8_t high); vcombine_u16(uint16x4_t low, uint16x4_t high); vcombine_u32(uint32x2_t low, uint32x2_t high); vcombine_u64(uint64x1_t low, uint64x1_t high); vcombine_p8(poly8x8_t low, poly8x8_t high); vcombine_p16(poly16x4_t low, poly16x4_t high); // // // // // // // // // // // // VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 ベ ク タ の分割 こ れ ら の コ ンパ イ ラ 組み込み関数では、 1 つの 128 ビ ッ ト ベ ク タ を 2 つの コ ン ポーネ ン ト の 64 ビ ッ ト ベ ク タ に分割 し ます。 int8x8_t int16x4_t int32x2_t int64x1_t float16x4_t float32x2_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t poly8x8_t poly16x4_t int8x8_t int16x4_t int32x2_t int64x1_t float16x4_t float32x2_t uint8x8_t uint16x4_t uint32x2_t E-48 vget_high_s8(int8x16_t a); vget_high_s16(int16x8_t a); vget_high_s32(int32x4_t a); vget_high_s64(int64x2_t a); vget_high_f16(float16x8_t a); vget_high_f32(float32x4_t a); vget_high_u8(uint8x16_t a); vget_high_u16(uint16x8_t a); vget_high_u32(uint32x4_t a); vget_high_u64(uint64x2_t a); vget_high_p8(poly8x16_t a); vget_high_p16(poly16x8_t a); vget_low_s8(int8x16_t a); vget_low_s16(int16x8_t a); vget_low_s32(int32x4_t a); vget_low_s64(int64x2_t a); vget_low_f16(float16x8_t a); vget_low_f32(float32x4_t a); vget_low_u8(uint8x16_t a); vget_low_u16(uint16x8_t a); vget_low_u32(uint32x4_t a); // // // // // // // // // // // // // // // // // // // // // VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV VMOV d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 uint64x1_t poly8x8_t poly16x4_t E.3.22 vget_low_u64(uint64x2_t a); vget_low_p8(poly8x16_t a); vget_low_p16(poly16x8_t a); // VMOV d0,d0 // VMOV d0,d0 // VMOV d0,d0 ベ ク タ の変換 以下の コ ンパ イ ラ 組み込み関数は、 ベ ク タ の変換に使用 し ます。 浮動小数点か らの変換 int32x2_t uint32x2_t int32x4_t uint32x4_t int32x2_t uint32x2_t int32x4_t uint32x4_t vcvt_s32_f32(float32x2_t a); vcvt_u32_f32(float32x2_t a); vcvtq_s32_f32(float32x4_t a); vcvtq_u32_f32(float32x4_t a); vcvt_n_s32_f32(float32x2_t a, __constrange(1,32) int b); vcvt_n_u32_f32(float32x2_t a, __constrange(1,32) int b); vcvtq_n_s32_f32(float32x4_t a, __constrange(1,32) int b); vcvtq_n_u32_f32(float32x4_t a, __constrange(1,32) int b); // // // // // // // // VCVT.S32.F32 VCVT.U32.F32 VCVT.S32.F32 VCVT.U32.F32 VCVT.S32.F32 VCVT.U32.F32 VCVT.S32.F32 VCVT.U32.F32 d0, d0, q0, q0, d0, d0, q0, q0, d0 d0 q0 q0 d0, d0, q0, q0, #32 #32 #32 #32 // // // // // // // // VCVT.F32.S32 VCVT.F32.U32 VCVT.F32.S32 VCVT.F32.U32 VCVT.F32.S32 VCVT.F32.U32 VCVT.F32.S32 VCVT.F32.U32 d0, d0, q0, q0, d0, d0, q0, q0, d0 d0 q0 q0 d0, d0, q0, q0, #32 #32 #32 #32 浮動小数点への変換 float32x2_t float32x2_t float32x4_t float32x4_t float32x2_t float32x2_t float32x4_t float32x4_t vcvt_f32_s32(int32x2_t a); vcvt_f32_u32(uint32x2_t a); vcvtq_f32_s32(int32x4_t a); vcvtq_f32_u32(uint32x4_t a); vcvt_n_f32_s32(int32x2_t a, __constrange(1,32) int b); vcvt_n_f32_u32(uint32x2_t a, __constrange(1,32) int b); vcvtq_n_f32_s32(int32x4_t a, __constrange(1,32) int b); vcvtq_n_f32_u32(uint32x4_t a, __constrange(1,32) int b); 浮動小数点間の変換 float16x4_t vcvt_f16_f32(float32x4_t a); // VCVT.F16.F32 d0, q0 float32x4_t vcvt_f32_f16(float16x4_t a); // VCVT.F32.F16 q0, d0 ベ ク タ Narrow 整数 int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t ARM DUI 0348BJ ID 1 0 0 4 1 9 vmovn_s16(int16x8_t a); vmovn_s32(int32x4_t a); vmovn_s64(int64x2_t a); vmovn_u16(uint16x8_t a); vmovn_u32(uint32x4_t a); vmovn_u64(uint64x2_t a); // // // // // // VMOVN.I16 VMOVN.I32 VMOVN.I64 VMOVN.I16 VMOVN.I32 VMOVN.I64 d0,q0 d0,q0 d0,q0 d0,q0 d0,q0 d0,q0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-49 NEON サポー ト の使用 ベ ク タ Long 移動 int16x8_t int32x4_t int64x2_t uint16x8_t uint32x4_t uint64x2_t vmovl_s8(int8x8_t a); vmovl_s16(int16x4_t a); vmovl_s32(int32x2_t a); vmovl_u8(uint8x8_t a); vmovl_u16(uint16x4_t a); vmovl_u32(uint32x2_t a); // // // // // // VMOVL.S8 q0,d0 VMOVL.S16 q0,d0 VMOVL.S32 q0,d0 VMOVL.U8 q0,d0 VMOVL.U16 q0,d0 VMOVL.U32 q0,d0 ベ ク タ サチ ュ レ ー ト Narrow 整数 int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t vqmovn_s16(int16x8_t a); vqmovn_s32(int32x4_t a); vqmovn_s64(int64x2_t a); vqmovn_u16(uint16x8_t a); vqmovn_u32(uint32x4_t a); vqmovn_u64(uint64x2_t a); // // // // // // VQMOVN.S16 VQMOVN.S32 VQMOVN.S64 VQMOVN.U16 VQMOVN.U32 VQMOVN.U64 d0,q0 d0,q0 d0,q0 d0,q0 d0,q0 d0,q0 ベ ク タ サチ ュ レ ー ト Narrow 整数、 符号付きか ら符号な し への変換 uint8x8_t vqmovun_s16(int16x8_t a); uint16x4_t vqmovun_s32(int32x4_t a); uint32x2_t vqmovun_s64(int64x2_t a); E.3.23 uint8x8_t int8x8_t poly8x8_t uint8x8_t int8x8_t poly8x8_t uint8x8_t int8x8_t poly8x8_t uint8x8_t int8x8_t poly8x8_t E.3.24 uint8x8_t int8x8_t poly8x8_t uint8x8_t int8x8_t poly8x8_t uint8x8_t E-50 // VQMOVUN.S16 d0,q0 // VQMOVUN.S32 d0,q0 // VQMOVUN.S64 d0,q0 テーブル検索 vtbl1_u8(uint8x8_t a, uint8x8_t b); vtbl1_s8(int8x8_t a, int8x8_t b); vtbl1_p8(poly8x8_t a, uint8x8_t b); vtbl2_u8(uint8x8x2_t a, uint8x8_t b); vtbl2_s8(int8x8x2_t a, int8x8_t b); vtbl2_p8(poly8x8x2_t a, uint8x8_t b); vtbl3_u8(uint8x8x3_t a, uint8x8_t b); vtbl3_s8(int8x8x3_t a, int8x8_t b); vtbl3_p8(poly8x8x3_t a, uint8x8_t b); vtbl4_u8(uint8x8x4_t a, uint8x8_t b); vtbl4_s8(int8x8x4_t a, int8x8_t b); vtbl4_p8(poly8x8x4_t a, uint8x8_t b); // // // // // // // // // // // // VTBL.8 VTBL.8 VTBL.8 VTBL.8 VTBL.8 VTBL.8 VTBL.8 VTBL.8 VTBL.8 VTBL.8 VTBL.8 VTBL.8 d0, d0, d0, d0, d0, d0, d0, d0, d0, d0, d0, d0, {d0}, d0 {d0}, d0 {d0}, d0 {d0, d1}, d0 {d0, d1}, d0 {d0, d1}, d0 {d0, d1, d2}, d0 {d0, d1, d2}, d0 {d0, d1, d2}, d0 {d0, d1, d2, d3}, d0 {d0, d1, d2, d3}, d0 {d0, d1, d2, d3}, d0 拡張テーブル検索の コ ンパイ ラ組み込み関数 vtbx1_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); vtbx1_s8(int8x8_t a, int8x8_t b, int8x8_t c); vtbx1_p8(poly8x8_t a, poly8x8_t b, uint8x8_t c); vtbx2_u8(uint8x8_t a, uint8x8x2_t b, uint8x8_t c); vtbx2_s8(int8x8_t a, int8x8x2_t b, int8x8_t c); vtbx2_p8(poly8x8_t a, poly8x8x2_t b, uint8x8_t c); vtbx3_u8(uint8x8_t a, uint8x8x3_t b, uint8x8_t c); // // // // // // // VTBX.8 VTBX.8 VTBX.8 VTBX.8 VTBX.8 VTBX.8 VTBX.8 d0, d0, d0, d0, d0, d0, d0, {d0}, d0 {d0}, d0 {d0}, d0 {d0, d1}, d0 {d0, d1}, d0 {d0, d1}, d0 {d0, d1, d2}, d0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 int8x8_t poly8x8_t uint8x8_t int8x8_t poly8x8_t E.3.25 vtbx3_s8(int8x8_t a, int8x8x3_t b, int8x8_t c); vtbx3_p8(poly8x8_t a, poly8x8x3_t b, uint8x8_t c); vtbx4_u8(uint8x8_t a, uint8x8x4_t b, uint8x8_t c); vtbx4_s8(int8x8_t a, int8x8x4_t b, int8x8_t c); vtbx4_p8(poly8x8_t a, poly8x8x4_t b, uint8x8_t c); // // // // // VTBX.8 VTBX.8 VTBX.8 VTBX.8 VTBX.8 d0, d0, d0, d0, d0, {d0, {d0, {d0, {d0, {d0, d1, d1, d1, d1, d1, d2}, d0 d2}, d0 d2, d3}, d0 d2, d3}, d0 d2, d3}, d0 ス カ ラ 値での演算 こ れ ら の コ ンパ イ ラ 組み込み関数については、 ス カ ラ 引数が定数であ る 場合、 ま たは vget_lane コ ンパ イ ラ 組み込み関数のいずれか を使用す る 場合にのみ、 効率的な コ ー ド の生成が保証 さ れ ます。 ス カ ラ に よ る ベ ク タ 積和 int16x4_t vmla_lane_s16(int16x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l); // VMLA.I16 d0, d0, d0[0] int32x2_t vmla_lane_s32(int32x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l); // VMLA.I32 d0, d0, d0[0] uint16x4_t vmla_lane_u16(uint16x4_t a, uint16x4_t b, uint16x4_t v, __constrange(0,3) int l); // VMLA.I16 d0, d0, d0[0] uint32x2_t vmla_lane_u32(uint32x2_t a, uint32x2_t b, uint32x2_t v, __constrange(0,1) int l); // VMLA.I32 d0, d0, d0[0] float32x2_t vmla_lane_f32(float32x2_t a, float32x2_t b, float32x2_t v, __constrange(0,1) int l); // VMLA.F32 d0, d0, d0[0] int16x8_t vmlaq_lane_s16(int16x8_t a, int16x8_t b, int16x4_t v, __constrange(0,3) int l); // VMLA.I16 q0, q0, d0[0] int32x4_t vmlaq_lane_s32(int32x4_t a, int32x4_t b, int32x2_t v, __constrange(0,1) int l); // VMLA.I32 q0, q0, d0[0] uint16x8_t vmlaq_lane_u16(uint16x8_t a, uint16x8_t b, uint16x4_t v, __constrange(0,3) int l); // VMLA.I16 q0, q0, d0[0] uint32x4_t vmlaq_lane_u32(uint32x4_t a, uint32x4_t b, uint32x2_t v, __constrange(0,1) int l); // VMLA.I32 q0, q0, d0[0] float32x4_t vmlaq_lane_f32(float32x4_t a, float32x4_t b, float32x2_t v, __constrange(0,1) int l); // VMLA.F32 q0, q0, d0[0] ス カ ラ に よ る ベ ク タ 拡張積和 int32x4_t int64x2_t uint32x4_t uint64x2_t vmlal_lane_s16(int32x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l); // VMLAL.S16 q0, d0, d0[0] vmlal_lane_s32(int64x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l); // VMLAL.S32 q0, d0, d0[0] vmlal_lane_u16(uint32x4_t a, uint16x4_t b, uint16x4_t v, __constrange(0,3) int l); // VMLAL.U16 q0, d0, d0[0] vmlal_lane_u32(uint64x2_t a, uint32x2_t b, uint32x2_t v, __constrange(0,1) int l); // VMLAL.U32 q0, d0, d0[0] ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-51 NEON サポー ト の使用 ス カ ラ に よ る ベ ク タ 拡張サチ ュ レ ー ト ダ ブル積和 int32x4_t int64x2_t vqdmlal_lane_s16(int32x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l); // VQDMLAL.S16 q0, d0, d0[0] vqdmlal_lane_s32(int64x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l); // VQDMLAL.S32 q0, d0, d0[0] ス カ ラ に よ る ベ ク タ 積差 int16x4_t vmls_lane_s16(int16x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l); // VMLS.I16 d0, d0, d0[0] int32x2_t vmls_lane_s32(int32x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l); // VMLS.I32 d0, d0, d0[0] uint16x4_t vmls_lane_u16(uint16x4_t a, uint16x4_t b, uint16x4_t v, __constrange(0,3) int l); // VMLS.I16 d0, d0, d0[0] uint32x2_t vmls_lane_u32(uint32x2_t a, uint32x2_t b, uint32x2_t v, __constrange(0,1) int l); // VMLS.I32 d0, d0, d0[0] float32x2_t vmls_lane_f32(float32x2_t a, float32x2_t b, float32x2_t v, __constrange(0,1) int l); // VMLS.F32 d0, d0, d0[0] int16x8_t vmlsq_lane_s16(int16x8_t a, int16x8_t b, int16x4_t v, __constrange(0,3) int l); // VMLS.I16 q0, q0, d0[0] int32x4_t vmlsq_lane_s32(int32x4_t a, int32x4_t b, int32x2_t v, __constrange(0,1) int l); // VMLS.I32 q0, q0, d0[0] uint16x8_t vmlsq_lane_u16(uint16x8_t a, uint16x8_t b, uint16x4_t v, __constrange(0,3) int l); // VMLS.I16 q0, q0, d0[0] uint32x4_t vmlsq_lane_u32(uint32x4_t a, uint32x4_t b, uint32x2_t v, __constrange(0,1) int l); // VMLS.I32 q0, q0, d0[0] float32x4_t vmlsq_lane_f32(float32x4_t a, float32x4_t b, float32x2_t v, __constrange(0,1) int l); // VMLS.F32 q0, q0, d0[0] ス カ ラ に よ る ベ ク タ 拡張積差 int32x4_t int64x2_t uint32x4_t uint64x2_t vmlsl_lane_s16(int32x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l); // VMLSL.S16 q0, d0, d0[0] vmlsl_lane_s32(int64x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l); // VMLSL.S32 q0, d0, d0[0] vmlsl_lane_u16(uint32x4_t a, uint16x4_t b, uint16x4_t v, __constrange(0,3) int l); // VMLSL.U16 q0, d0, d0[0] vmlsl_lane_u32(uint64x2_t a, uint32x2_t b, uint32x2_t v, __constrange(0,1) int l); // VMLSL.U32 q0, d0, d0[0] ス カ ラ に よ る ベ ク タ 拡張サチ ュ レ ー ト ダ ブル積差 int32x4_t int64x2_t E-52 vqdmlsl_lane_s16(int32x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l); // VQDMLSL.S16 q0, d0, d0[0] vqdmlsl_lane_s32(int64x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l); // VQDMLSL.S32 q0, d0, d0[0] Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 ス カ ラ に よ る ベ ク タ 乗算 int16x4_t int32x2_t float32x2_t uint16x4_t uint32x2_t int16x8_t int32x4_t float32x4_t uint16x8_t uint32x4_t vmul_n_s16(int16x4_t a, int16_t b); vmul_n_s32(int32x2_t a, int32_t b); vmul_n_f32(float32x2_t a, float32_t b); vmul_n_u16(uint16x4_t a, uint16_t b); vmul_n_u32(uint32x2_t a, uint32_t b); vmulq_n_s16(int16x8_t a, int16_t b); vmulq_n_s32(int32x4_t a, int32_t b); vmulq_n_f32(float32x4_t a, float32_t b); vmulq_n_u16(uint16x8_t a, uint16_t b); vmulq_n_u32(uint32x4_t a, uint32_t b); // // // // // // // // // // VMUL.I16 VMUL.I32 VMUL.F32 VMUL.I16 VMUL.I32 VMUL.I16 VMUL.I32 VMUL.F32 VMUL.I16 VMUL.I32 d0,d0,d0[0] d0,d0,d0[0] d0,d0,d0[0] d0,d0,d0[0] d0,d0,d0[0] q0,q0,d0[0] q0,q0,d0[0] q0,q0,d0[0] q0,q0,d0[0] q0,q0,d0[0] ス カ ラ に よ る ベ ク タ Long 乗算 int32x4_t vmull_n_s16(int16x4_t vec1, int16_t val2); int64x2_t vmull_n_s32(int32x2_t vec1, int32_t val2); uint32x4_t vmull_n_u16(uint16x4_t vec1, uint16_t val2); uint64x2_t vmull_n_u32(uint32x2_t vec1, uint32_t val2); // // // // VMULL.S16 VMULL.S32 VMULL.U16 VMULL.U32 q0,d0,d0[0] q0,d0,d0[0] q0,d0,d0[0] q0,d0,d0[0] ス カ ラ に よ る Long ベ ク タ 乗算 int32x4_t vmull_lane_s16(int16x4_t vec1, int16x4_t val2, __constrange(0, 3) int val3); // VMULL.S16 q0,d0,d0[0]int64x2_t vmull_lane_s32(int32x2_t vec1, int32x2_t val2, __constrange(0, 1) int val3); // VMULL.S32 q0,d0,d0[0]uint32x4_t vmull_lane_u16(uint16x4_t vec1, uint16x4_t val2, __constrange(0, 3) int val3); // VMULL.U16 q0,d0,d0[0]uint64x2_t vmull_lane_u32(uint32x2_t vec1, uint32x2_t val2, __constrange(0, 1) int val3); // VMULL.U32 q0,d0,d0[0] ス カ ラ に よ るサチ ュ レー ト Long ベ ク タ ダ ブル乗算 int32x4_t vqdmull_n_s16(int16x4_t vec1, int16_t val2); int64x2_t vqdmull_n_s32(int32x2_t vec1, int32_t val2); // VQDMULL.S16 q0,d0,d0[0] // VQDMULL.S32 q0,d0,d0[0] ス カ ラ に よ るサチ ュ レー ト Long ベ ク タ ダ ブル乗算 int32x4_t vqdmull_lane_s16(int16x4_t vec1, int16x4_t val2, __constrange(0, 3) int val3); // VQDMULL.S16 q0,d0,d0[0] int64x2_t vqdmull_lane_s32(int32x2_t vec1, int32x2_t val2, __constrange(0, 1) int val3); // VQDMULL.S32 q0,d0,d0[0] ス カ ラ に よ るサチ ュ レー ト ベ ク タ ダ ブル乗算 (上位半分) int16x4_t vqdmulh_n_s16(int16x4_t vec1, int16_t val2); int32x2_t vqdmulh_n_s32(int32x2_t vec1, int32_t val2); ARM DUI 0348BJ ID 1 0 0 4 1 9 // VQDMULH.S16 d0,d0,d0[0] // VQDMULH.S32 d0,d0,d0[0] Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-53 NEON サポー ト の使用 int16x8_t vqdmulhq_n_s16(int16x8_t vec1, int16_t val2); int32x4_t vqdmulhq_n_s32(int32x4_t vec1, int32_t val2); // VQDMULH.S16 q0,q0,d0[0] // VQDMULH.S32 q0,q0,d0[0] ス カ ラ に よ るサチ ュ レ ー ト ベ ク タ ダ ブル乗算 (上位半分) int16x4_t vqdmulh_lane_s16(int16x4_t vec1, int16x4_t val2, __constrange(0, 3) int val3); // VQDMULH.S16 d0,d0,d0[0] int32x2_t vqdmulh_lane_s32(int32x2_t vec1, int32x2_t val2, __constrange(0, 1) int val3); // VQDMULH.S32 d0,d0,d0[0] int16x8_t vqdmulhq_lane_s16(int16x8_t vec1, int16x4_t val2, __constrange(0, 3) int val3); // VQDMULH.S16 q0,q0,d0[0] int32x4_t vqdmulhq_lane_s32(int32x4_t vec1, int32x2_t val2, __constrange(0, 1) int val3); // VQDMULH.S32 q0,q0,d0[0] ス カ ラ に よ るサチ ュ レ ー ト 丸めベ ク タ ダ ブル乗算 (上位半分) int16x4_t int32x2_t int16x8_t int32x4_t vqrdmulh_n_s16(int16x4_t vec1, int16_t val2); vqrdmulh_n_s32(int32x2_t vec1, int32_t val2); vqrdmulhq_n_s16(int16x8_t vec1, int16_t val2); vqrdmulhq_n_s32(int32x4_t vec1, int32_t val2); // // // // VQRDMULH.S16 VQRDMULH.S32 VQRDMULH.S16 VQRDMULH.S32 d0,d0,d0[0] d0,d0,d0[0] q0,q0,d0[0] q0,q0,d0[0] ス カ ラ に よ る丸めサチ ュ レ ー ト ベ ク タ ダ ブル乗算 (上位半分) int16x4_t vqrdmulh_lane_s16(int16x4_t vec1, int16x4_t val2, __constrange(0, 3) int val3); // VQRDMULH.S16 d0,d0,d0[0] int32x2_t vqrdmulh_lane_s32(int32x2_t vec1, int32x2_t val2, __constrange(0, 1) int val3); // VQRDMULH.S32 d0,d0,d0[0] int16x8_t vqrdmulhq_lane_s16(int16x8_t vec1, int16x4_t val2, __constrange(0, 3) int val3); // VQRDMULH.S16 q0,q0,d0[0] int32x4_t vqrdmulhq_lane_s32(int32x4_t vec1, int32x2_t val2, __constrange(0, 1) int val3); // VQRDMULH.S32 q0,q0,d0[0] ス カ ラ に よ る ベ ク タ 積和 int16x4_t int32x2_t uint16x4_t uint32x2_t float32x2_t int16x8_t int32x4_t uint16x8_t uint32x4_t float32x4_t E-54 vmla_n_s16(int16x4_t a, int16x4_t b, int16_t c); vmla_n_s32(int32x2_t a, int32x2_t b, int32_t c); vmla_n_u16(uint16x4_t a, uint16x4_t b, uint16_t c); vmla_n_u32(uint32x2_t a, uint32x2_t b, uint32_t c); vmla_n_f32(float32x2_t a, float32x2_t b, float32_t c); vmlaq_n_s16(int16x8_t a, int16x8_t b, int16_t c); vmlaq_n_s32(int32x4_t a, int32x4_t b, int32_t c); vmlaq_n_u16(uint16x8_t a, uint16x8_t b, uint16_t c); vmlaq_n_u32(uint32x4_t a, uint32x4_t b, uint32_t c); vmlaq_n_f32(float32x4_t a, float32x4_t b, float32_t c); // // // // // // // // // // VMLA.I16 VMLA.I32 VMLA.I16 VMLA.I32 VMLA.F32 VMLA.I16 VMLA.I32 VMLA.I16 VMLA.I32 VMLA.F32 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, d0, d0, d0, d0, d0, q0, q0, q0, q0, q0, d0, d0, d0, d0, d0, q0, q0, q0, q0, q0, d0[0] d0[0] d0[0] d0[0] d0[0] d0[0] d0[0] d0[0] d0[0] d0[0] ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 ス カ ラ に よ る ベ ク タ 拡張積和 int32x4_t int64x2_t uint32x4_t uint64x2_t vmlal_n_s16(int32x4_t a, int16x4_t b, int16_t c); vmlal_n_s32(int64x2_t a, int32x2_t b, int32_t c); vmlal_n_u16(uint32x4_t a, uint16x4_t b, uint16_t c); vmlal_n_u32(uint64x2_t a, uint32x2_t b, uint32_t c); // // // // VMLAL.S16 VMLAL.S32 VMLAL.U16 VMLAL.U32 q0, q0, q0, q0, d0, d0, d0, d0, d0[0] d0[0] d0[0] d0[0] ス カ ラ に よ る ベ ク タ 拡張サチ ュ レ ー ト ダ ブル積和 int32x4_t int64x2_t vqdmlal_n_s16(int32x4_t a, int16x4_t b, int16_t c); vqdmlal_n_s32(int64x2_t a, int32x2_t b, int32_t c); // VQDMLAL.S16 q0, d0, d0[0] // VQDMLAL.S32 q0, d0, d0[0] ス カ ラ に よ る ベ ク タ 積差 int16x4_t int32x2_t uint16x4_t uint32x2_t float32x2_t int16x8_t int32x4_t uint16x8_t uint32x4_t float32x4_t vmls_n_s16(int16x4_t a, int16x4_t b, int16_t c); vmls_n_s32(int32x2_t a, int32x2_t b, int32_t c); vmls_n_u16(uint16x4_t a, uint16x4_t b, uint16_t c); vmls_n_u32(uint32x2_t a, uint32x2_t b, uint32_t c); vmls_n_f32(float32x2_t a, float32x2_t b, float32_t c); vmlsq_n_s16(int16x8_t a, int16x8_t b, int16_t c); vmlsq_n_s32(int32x4_t a, int32x4_t b, int32_t c); vmlsq_n_u16(uint16x8_t a, uint16x8_t b, uint16_t c); vmlsq_n_u32(uint32x4_t a, uint32x4_t b, uint32_t c); vmlsq_n_f32(float32x4_t a, float32x4_t b, float32_t c); // // // // // // // // // // VMLS.I16 VMLS.I32 VMLS.I16 VMLS.I32 VMLS.F32 VMLS.I16 VMLS.I32 VMLS.I16 VMLS.I32 VMLS.F32 // // // // VMLSL.S16 VMLSL.S32 VMLSL.U16 VMLSL.U32 d0, d0, d0, d0, d0, q0, q0, q0, q0, q0, d0, d0, d0, d0, d0, q0, q0, q0, q0, q0, d0[0] d0[0] d0[0] d0[0] d0[0] d0[0] d0[0] d0[0] d0[0] d0[0] ス カ ラ に よ る ベ ク タ 拡張積差 int32x4_t int64x2_t uint32x4_t uint64x2_t vmlsl_n_s16(int32x4_t a, int16x4_t b, int16_t c); vmlsl_n_s32(int64x2_t a, int32x2_t b, int32_t c); vmlsl_n_u16(uint32x4_t a, uint16x4_t b, uint16_t c); vmlsl_n_u32(uint64x2_t a, uint32x2_t b, uint32_t c); q0, q0, q0, q0, d0, d0, d0, d0, d0[0] d0[0] d0[0] d0[0] ス カ ラ に よ る ベ ク タ 拡張サチ ュ レ ー ト ダ ブル積差 int32x4_t int64x2_t E.3.26 vqdmlsl_n_s16(int32x4_t a, int16x4_t b, int16_t c); vqdmlsl_n_s32(int64x2_t a, int32x2_t b, int32_t c); // VQDMLSL.S16 q0, d0, d0[0] // VQDMLSL.S32 q0, d0, d0[0] ベ ク タ 抽出 int8x8_t uint8x8_t poly8x8_t int16x4_t uint16x4_t poly16x4_t int32x2_t uint32x2_t vext_s8(int8x8_t a, int8x8_t b, __constrange(0,7) int c); vext_u8(uint8x8_t a, uint8x8_t b, __constrange(0,7) int c); vext_p8(poly8x8_t a, poly8x8_t b, __constrange(0,7) int c); vext_s16(int16x4_t a, int16x4_t b, __constrange(0,3) int c); vext_u16(uint16x4_t a, uint16x4_t b, __constrange(0,3) int c); vext_p16(poly16x4_t a, poly16x4_t b, __constrange(0,3) int c); vext_s32(int32x2_t a, int32x2_t b, __constrange(0,1) int c); vext_u32(uint32x2_t a, uint32x2_t b, __constrange(0,1) int c); ARM DUI 0348BJ ID 1 0 0 4 1 9 // // // // // // // // Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, VEXT.8 d0,d0,d0,#0 VEXT.8 d0,d0,d0,#0 VEXT.8 d0,d0,d0,#0 VEXT.16 d0,d0,d0,#0 VEXT.16 d0,d0,d0,#0 VEXT.16 d0,d0,d0,#0 VEXT.32 d0,d0,d0,#0 VEXT.32 d0,d0,d0,#0 E-55 NEON サポー ト の使用 int64x1_t uint64x1_t int8x16_t uint8x16_t poly8x16_t int16x8_t uint16x8_t poly16x8_t int32x4_t uint32x4_t int64x2_t uint64x2_t E.3.27 vext_s64(int64x1_t a, int64x1_t b, __constrange(0,0) int c); vext_u64(uint64x1_t a, uint64x1_t b, __constrange(0,0) int c); vextq_s8(int8x16_t a, int8x16_t b, __constrange(0,15) int c); vextq_u8(uint8x16_t a, uint8x16_t b, __constrange(0,15) int c); vextq_p8(poly8x16_t a, poly8x16_t b, __constrange(0,15) int c); vextq_s16(int16x8_t a, int16x8_t b, __constrange(0,7) int c); vextq_u16(uint16x8_t a, uint16x8_t b, __constrange(0,7) int c); vextq_p16(poly16x8_t a, poly16x8_t b, __constrange(0,7) int c); vextq_s32(int32x4_t a, int32x4_t b, __constrange(0,3) int c); vextq_u32(uint32x4_t a, uint32x4_t b, __constrange(0,3) int c); vextq_s64(int64x2_t a, int64x2_t b, __constrange(0,1) int c); vextq_u64(uint64x2_t a, uint64x2_t b, __constrange(0,1) int c); // // // // // // // // // // // // VEXT.64 d0,d0,d0,#0 VEXT.64 d0,d0,d0,#0 VEXT.8 q0,q0,q0,#0 VEXT.8 q0,q0,q0,#0 VEXT.8 q0,q0,q0,#0 VEXT.16 q0,q0,q0,#0 VEXT.16 q0,q0,q0,#0 VEXT.16 q0,q0,q0,#0 VEXT.32 q0,q0,q0,#0 VEXT.32 q0,q0,q0,#0 VEXT.64 q0,q0,q0,#0 VEXT.64 q0,q0,q0,#0 ベ ク タ 要素の反転 (エ ンデ ィ ア ン方式のスワ ッ プ) VREVn.m では、 n ビ ッ ト 幅のセ ッ ト 内の m ビ ッ ト レーンの順序を反転 し ま す。 int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t poly8x8_t poly16x4_t float32x2_t int8x16_t int16x8_t int32x4_t uint8x16_t uint16x8_t uint32x4_t poly8x16_t poly16x8_t float32x4_t int8x8_t int16x4_t uint8x8_t uint16x4_t poly8x8_t int8x16_t int16x8_t uint8x16_t uint16x8_t poly8x16_t int8x8_t uint8x8_t poly8x8_t E-56 vrev64_s8(int8x8_t vec); vrev64_s16(int16x4_t vec); vrev64_s32(int32x2_t vec); vrev64_u8(uint8x8_t vec); vrev64_u16(uint16x4_t vec); vrev64_u32(uint32x2_t vec); vrev64_p8(poly8x8_t vec); vrev64_p16(poly16x4_t vec); vrev64_f32(float32x2_t vec); vrev64q_s8(int8x16_t vec); vrev64q_s16(int16x8_t vec); vrev64q_s32(int32x4_t vec); vrev64q_u8(uint8x16_t vec); vrev64q_u16(uint16x8_t vec); vrev64q_u32(uint32x4_t vec); vrev64q_p8(poly8x16_t vec); vrev64q_p16(poly16x8_t vec); vrev64q_f32(float32x4_t vec); vrev32_s8(int8x8_t vec); vrev32_s16(int16x4_t vec); vrev32_u8(uint8x8_t vec); vrev32_u16(uint16x4_t vec); vrev32_p8(poly8x8_t vec); vrev32q_s8(int8x16_t vec); vrev32q_s16(int16x8_t vec); vrev32q_u8(uint8x16_t vec); vrev32q_u16(uint16x8_t vec); vrev32q_p8(poly8x16_t vec); vrev16_s8(int8x8_t vec); vrev16_u8(uint8x8_t vec); vrev16_p8(poly8x8_t vec); // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // VREV64.8 d0,d0 VREV64.16 d0,d0 VREV64.32 d0,d0 VREV64.8 d0,d0 VREV64.16 d0,d0 VREV64.32 d0,d0 VREV64.8 d0,d0 VREV64.16 d0,d0 VREV64.32 d0,d0 VREV64.8 q0,q0 VREV64.16 q0,q0 VREV64.32 q0,q0 VREV64.8 q0,q0 VREV64.16 q0,q0 VREV64.32 q0,q0 VREV64.8 q0,q0 VREV64.16 q0,q0 VREV64.32 q0,q0 VREV32.8 d0,d0 VREV32.16 d0,d0 VREV32.8 d0,d0 VREV32.16 d0,d0 VREV32.8 d0,d0 VREV32.8 q0,q0 VREV32.16 q0,q0 VREV32.8 q0,q0 VREV32.16 q0,q0 VREV32.8 q0,q0 VREV16.8 d0,d0 VREV16.8 d0,d0 VREV16.8 d0,d0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 int8x16_t uint8x16_t poly8x16_t E.3.28 vrev16q_s8(int8x16_t vec); vrev16q_u8(uint8x16_t vec); vrev16q_p8(poly8x16_t vec); // VREV16.8 q0,q0 // VREV16.8 q0,q0 // VREV16.8 q0,q0 その他の単一オペ ラ ン ド の算術演算 以下の コ ンパ イ ラ 組み込み関数は、 その他の単一オペ ラ ン ド の数学関数です。 絶対値 : Vd[i] = |Va[i]| int8x8_t int16x4_t int32x2_t float32x2_t int8x16_t int16x8_t int32x4_t float32x4_t vabs_s8(int8x8_t a); vabs_s16(int16x4_t a); vabs_s32(int32x2_t a); vabs_f32(float32x2_t a); vabsq_s8(int8x16_t a); vabsq_s16(int16x8_t a); vabsq_s32(int32x4_t a); vabsq_f32(float32x4_t a); // // // // // // // // VABS.S8 d0,d0 VABS.S16 d0,d0 VABS.S32 d0,d0 VABS.F32 d0,d0 VABS.S8 q0,q0 VABS.S16 q0,q0 VABS.S32 q0,q0 VABS.F32 q0,q0 サチ ュ レー ト 絶対値 : Vd[i] = sat(|Va[i]|) int8x8_t int16x4_t int32x2_t int8x16_t int16x8_t int32x4_t vqabs_s8(int8x8_t a); vqabs_s16(int16x4_t a); vqabs_s32(int32x2_t a); vqabsq_s8(int8x16_t a); vqabsq_s16(int16x8_t a); vqabsq_s32(int32x4_t a); // // // // // // VQABS.S8 d0,d0 VQABS.S16 d0,d0 VQABS.S32 d0,d0 VQABS.S8 q0,q0 VQABS.S16 q0,q0 VQABS.S32 q0,q0 反転 : Vd[i] = - Va[i] int8x8_t int16x4_t int32x2_t float32x2_t int8x16_t int16x8_t int32x4_t float32x4_t vneg_s8(int8x8_t a); vneg_s16(int16x4_t a); vneg_s32(int32x2_t a); vneg_f32(float32x2_t a); vnegq_s8(int8x16_t a); vnegq_s16(int16x8_t a); vnegq_s32(int32x4_t a); vnegq_f32(float32x4_t a); // // // // // // // // VNEG.S8 d0,d0 VNEG.S16 d0,d0 VNEG.S32 d0,d0 VNEG.F32 d0,d0 VNEG.S8 q0,q0 VNEG.S16 q0,q0 VNEG.S32 q0,q0 VNEG.F32 q0,q0 サチ ュ レー ト 反転 : sat(Vd[i] = - Va[i]) int8x8_t int16x4_t int32x2_t int8x16_t int16x8_t int32x4_t ARM DUI 0348BJ ID 1 0 0 4 1 9 vqneg_s8(int8x8_t a); vqneg_s16(int16x4_t a); vqneg_s32(int32x2_t a); vqnegq_s8(int8x16_t a); vqnegq_s16(int16x8_t a); vqnegq_s32(int32x4_t a); // // // // // // VQNEG.S8 d0,d0 VQNEG.S16 d0,d0 VQNEG.S32 d0,d0 VQNEG.S8 q0,q0 VQNEG.S16 q0,q0 VQNEG.S32 q0,q0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-57 NEON サポー ト の使用 先行符号ビ ッ ト カ ウ ン ト int8x8_t int16x4_t int32x2_t int8x16_t int16x8_t int32x4_t vcls_s8(int8x8_t a); vcls_s16(int16x4_t a); vcls_s32(int32x2_t a); vclsq_s8(int8x16_t a); vclsq_s16(int16x8_t a); vclsq_s32(int32x4_t a); // // // // // // VCLS.S8 d0,d0 VCLS.S16 d0,d0 VCLS.S32 d0,d0 VCLS.S8 q0,q0 VCLS.S16 q0,q0 VCLS.S32 q0,q0 先行ゼロ カ ウ ン ト int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t int8x16_t int16x8_t int32x4_t uint8x16_t uint16x8_t uint32x4_t vclz_s8(int8x8_t a); vclz_s16(int16x4_t a); vclz_s32(int32x2_t a); vclz_u8(uint8x8_t a); vclz_u16(uint16x4_t a); vclz_u32(uint32x2_t a); vclzq_s8(int8x16_t a); vclzq_s16(int16x8_t a); vclzq_s32(int32x4_t a); vclzq_u8(uint8x16_t a); vclzq_u16(uint16x8_t a); vclzq_u32(uint32x4_t a); // // // // // // // // // // // // VCLZ.I8 d0,d0 VCLZ.I16 d0,d0 VCLZ.I32 d0,d0 VCLZ.I8 d0,d0 VCLZ.I16 d0,d0 VCLZ.I32 d0,d0 VCLZ.I8 q0,q0 VCLZ.I16 q0,q0 VCLZ.I32 q0,q0 VCLZ.I8 q0,q0 VCLZ.I16 q0,q0 VCLZ.I32 q0,q0 セ ッ ト ビ ッ ト 数カ ウ ン ト uint8x8_t int8x8_t poly8x8_t uint8x16_t int8x16_t poly8x16_t vcnt_u8(uint8x8_t a); vcnt_s8(int8x8_t a); vcnt_p8(poly8x8_t a); vcntq_u8(uint8x16_t a); vcntq_s8(int8x16_t a); vcntq_p8(poly8x16_t a); // // // // // // VCNT.8 VCNT.8 VCNT.8 VCNT.8 VCNT.8 VCNT.8 d0,d0 d0,d0 d0,d0 q0,q0 q0,q0 q0,q0 逆数の推定 float32x2_t uint32x2_t float32x4_t uint32x4_t vrecpe_f32(float32x2_t a); vrecpe_u32(uint32x2_t a); vrecpeq_f32(float32x4_t a); vrecpeq_u32(uint32x4_t a); // // // // VRECPE.F32 VRECPE.U32 VRECPE.F32 VRECPE.U32 d0,d0 d0,d0 q0,q0 q0,q0 逆平方根の推定 float32x2_t uint32x2_t float32x4_t uint32x4_t E-58 vrsqrte_f32(float32x2_t a); vrsqrte_u32(uint32x2_t a); vrsqrteq_f32(float32x4_t a); vrsqrteq_u32(uint32x4_t a); // // // // VRSQRTE.F32 VRSQRTE.U32 VRSQRTE.F32 VRSQRTE.U32 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, d0,d0 d0,d0 q0,q0 q0,q0 ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 E.3.29 論理演算 以下の コ ンパ イ ラ 組み込み関数は、 ビ ッ ト ご と の論理演算に使用 し ます。 ビ ッ ト 否定 int8x8_t int16x4_t int32x2_t uint8x8_t uint16x4_t uint32x2_t poly8x8_t int8x16_t int16x8_t int32x4_t uint8x16_t uint16x8_t uint32x4_t poly8x16_t vmvn_s8(int8x8_t a); vmvn_s16(int16x4_t a); vmvn_s32(int32x2_t a); vmvn_u8(uint8x8_t a); vmvn_u16(uint16x4_t a); vmvn_u32(uint32x2_t a); vmvn_p8(poly8x8_t a); vmvnq_s8(int8x16_t a); vmvnq_s16(int16x8_t a); vmvnq_s32(int32x4_t a); vmvnq_u8(uint8x16_t a); vmvnq_u16(uint16x8_t a); vmvnq_u32(uint32x4_t a); vmvnq_p8(poly8x16_t a); // // // // // // // // // // // // // // VMVN VMVN VMVN VMVN VMVN VMVN VMVN VMVN VMVN VMVN VMVN VMVN VMVN VMVN d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 d0,d0 q0,q0 q0,q0 q0,q0 q0,q0 q0,q0 q0,q0 q0,q0 ビ ッ ト 単位論理積 int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vand_s8(int8x8_t a, int8x8_t b); vand_s16(int16x4_t a, int16x4_t b); vand_s32(int32x2_t a, int32x2_t b); vand_s64(int64x1_t a, int64x1_t b); vand_u8(uint8x8_t a, uint8x8_t b); vand_u16(uint16x4_t a, uint16x4_t b); vand_u32(uint32x2_t a, uint32x2_t b); vand_u64(uint64x1_t a, uint64x1_t b); vandq_s8(int8x16_t a, int8x16_t b); vandq_s16(int16x8_t a, int16x8_t b); vandq_s32(int32x4_t a, int32x4_t b); vandq_s64(int64x2_t a, int64x2_t b); vandq_u8(uint8x16_t a, uint8x16_t b); vandq_u16(uint16x8_t a, uint16x8_t b); vandq_u32(uint32x4_t a, uint32x4_t b); vandq_u64(uint64x2_t a, uint64x2_t b); // // // // // // // // // // // // // // // // VAND VAND VAND VAND VAND VAND VAND VAND VAND VAND VAND VAND VAND VAND VAND VAND d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 // // // // // // VORR VORR VORR VORR VORR VORR d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 ビ ッ ト 論理和 int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t ARM DUI 0348BJ ID 1 0 0 4 1 9 vorr_s8(int8x8_t a, int8x8_t b); vorr_s16(int16x4_t a, int16x4_t b); vorr_s32(int32x2_t a, int32x2_t b); vorr_s64(int64x1_t a, int64x1_t b); vorr_u8(uint8x8_t a, uint8x8_t b); vorr_u16(uint16x4_t a, uint16x4_t b); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-59 NEON サポー ト の使用 uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vorr_u32(uint32x2_t a, uint32x2_t b); vorr_u64(uint64x1_t a, uint64x1_t b); vorrq_s8(int8x16_t a, int8x16_t b); vorrq_s16(int16x8_t a, int16x8_t b); vorrq_s32(int32x4_t a, int32x4_t b); vorrq_s64(int64x2_t a, int64x2_t b); vorrq_u8(uint8x16_t a, uint8x16_t b); vorrq_u16(uint16x8_t a, uint16x8_t b); vorrq_u32(uint32x4_t a, uint32x4_t b); vorrq_u64(uint64x2_t a, uint64x2_t b); // // // // // // // // // // VORR VORR VORR VORR VORR VORR VORR VORR VORR VORR d0,d0,d0 d0,d0,d0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 // // // // // // // // // // // // // // // // VEOR VEOR VEOR VEOR VEOR VEOR VEOR VEOR VEOR VEOR VEOR VEOR VEOR VEOR VEOR VEOR d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 // // // // // // // // // // // // // // // // VBIC VBIC VBIC VBIC VBIC VBIC VBIC VBIC VBIC VBIC VBIC VBIC VBIC VBIC VBIC VBIC d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 ビ ッ ト 排他的論理和 (EOR または XOR) int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t veor_s8(int8x8_t a, int8x8_t b); veor_s16(int16x4_t a, int16x4_t b); veor_s32(int32x2_t a, int32x2_t b); veor_s64(int64x1_t a, int64x1_t b); veor_u8(uint8x8_t a, uint8x8_t b); veor_u16(uint16x4_t a, uint16x4_t b); veor_u32(uint32x2_t a, uint32x2_t b); veor_u64(uint64x1_t a, uint64x1_t b); veorq_s8(int8x16_t a, int8x16_t b); veorq_s16(int16x8_t a, int16x8_t b); veorq_s32(int32x4_t a, int32x4_t b); veorq_s64(int64x2_t a, int64x2_t b); veorq_u8(uint8x16_t a, uint8x16_t b); veorq_u16(uint16x8_t a, uint16x8_t b); veorq_u32(uint32x4_t a, uint32x4_t b); veorq_u64(uint64x2_t a, uint64x2_t b); ビッ ト クリア int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t E-60 vbic_s8(int8x8_t a, int8x8_t b); vbic_s16(int16x4_t a, int16x4_t b); vbic_s32(int32x2_t a, int32x2_t b); vbic_s64(int64x1_t a, int64x1_t b); vbic_u8(uint8x8_t a, uint8x8_t b); vbic_u16(uint16x4_t a, uint16x4_t b); vbic_u32(uint32x2_t a, uint32x2_t b); vbic_u64(uint64x1_t a, uint64x1_t b); vbicq_s8(int8x16_t a, int8x16_t b); vbicq_s16(int16x8_t a, int16x8_t b); vbicq_s32(int32x4_t a, int32x4_t b); vbicq_s64(int64x2_t a, int64x2_t b); vbicq_u8(uint8x16_t a, uint8x16_t b); vbicq_u16(uint16x8_t a, uint16x8_t b); vbicq_u32(uint32x4_t a, uint32x4_t b); vbicq_u64(uint64x2_t a, uint64x2_t b); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 ビ ッ ト 論理和補数 int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t vorn_s8(int8x8_t a, int8x8_t b); vorn_s16(int16x4_t a, int16x4_t b); vorn_s32(int32x2_t a, int32x2_t b); vorn_s64(int64x1_t a, int64x1_t b); vorn_u8(uint8x8_t a, uint8x8_t b); vorn_u16(uint16x4_t a, uint16x4_t b); vorn_u32(uint32x2_t a, uint32x2_t b); vorn_u64(uint64x1_t a, uint64x1_t b); vornq_s8(int8x16_t a, int8x16_t b); vornq_s16(int16x8_t a, int16x8_t b); vornq_s32(int32x4_t a, int32x4_t b); vornq_s64(int64x2_t a, int64x2_t b); vornq_u8(uint8x16_t a, uint8x16_t b); vornq_u16(uint16x8_t a, uint16x8_t b); vornq_u32(uint32x4_t a, uint32x4_t b); vornq_u64(uint64x2_t a, uint64x2_t b); // // // // // // // // // // // // // // // // VORN VORN VORN VORN VORN VORN VORN VORN VORN VORN VORN VORN VORN VORN VORN VORN d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 ビ ッ ト 単位の選択 注 こ の コ ンパ イ ラ 組み込み関数は、 レ ジ ス タ の割 り 当てに よ っ て、 VBSL/VBIF/VBIT のいずれかに コ ンパ イ ル さ れます。 int8x8_t int16x4_t int32x2_t int64x1_t uint8x8_t uint16x4_t uint32x2_t uint64x1_t float32x2_t poly8x8_t poly16x4_t int8x16_t int16x8_t int32x4_t int64x2_t uint8x16_t uint16x8_t uint32x4_t uint64x2_t float32x4_t poly8x16_t poly16x8_t vbsl_s8(uint8x8_t a, int8x8_t b, int8x8_t c); vbsl_s16(uint16x4_t a, int16x4_t b, int16x4_t c); vbsl_s32(uint32x2_t a, int32x2_t b, int32x2_t c); vbsl_s64(uint64x1_t a, int64x1_t b, int64x1_t c); vbsl_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); vbsl_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c); vbsl_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c); vbsl_u64(uint64x1_t a, uint64x1_t b, uint64x1_t c); vbsl_f32(uint32x2_t a, float32x2_t b, float32x2_t c); vbsl_p8(uint8x8_t a, poly8x8_t b, poly8x8_t c); vbsl_p16(uint16x4_t a, poly16x4_t b, poly16x4_t c); vbslq_s8(uint8x16_t a, int8x16_t b, int8x16_t c); vbslq_s16(uint16x8_t a, int16x8_t b, int16x8_t c); vbslq_s32(uint32x4_t a, int32x4_t b, int32x4_t c); vbslq_s64(uint64x2_t a, int64x2_t b, int64x2_t c); vbslq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c); vbslq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c); vbslq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c); vbslq_u64(uint64x2_t a, uint64x2_t b, uint64x2_t c); vbslq_f32(uint32x4_t a, float32x4_t b, float32x4_t c); vbslq_p8(uint8x16_t a, poly8x16_t b, poly8x16_t c); vbslq_p16(uint16x8_t a, poly16x8_t b, poly16x8_t c); ARM DUI 0348BJ ID 1 0 0 4 1 9 // // // // // // // // // // // // // // // // // // // // // // VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL VBSL d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 d0,d0,d0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 q0,q0,q0 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-61 NEON サポー ト の使用 E.3.30 転置操作 こ れ ら の コ ンパ イ ラ 組み込み関数は、 転置操作に使用 し ます。 要素の置換 int8x8x2_t int16x4x2_t int32x2x2_t uint8x8x2_t uint16x4x2_t uint32x2x2_t float32x2x2_t poly8x8x2_t poly16x4x2_t int8x16x2_t int16x8x2_t int32x4x2_t uint8x16x2_t uint16x8x2_t uint32x4x2_t float32x4x2_t poly8x16x2_t poly16x8x2_t vtrn_s8(int8x8_t a, int8x8_t b); vtrn_s16(int16x4_t a, int16x4_t b); vtrn_s32(int32x2_t a, int32x2_t b); vtrn_u8(uint8x8_t a, uint8x8_t b); vtrn_u16(uint16x4_t a, uint16x4_t b); vtrn_u32(uint32x2_t a, uint32x2_t b); vtrn_f32(float32x2_t a, float32x2_t b); vtrn_p8(poly8x8_t a, poly8x8_t b); vtrn_p16(poly16x4_t a, poly16x4_t b); vtrnq_s8(int8x16_t a, int8x16_t b); vtrnq_s16(int16x8_t a, int16x8_t b); vtrnq_s32(int32x4_t a, int32x4_t b); vtrnq_u8(uint8x16_t a, uint8x16_t b); vtrnq_u16(uint16x8_t a, uint16x8_t b); vtrnq_u32(uint32x4_t a, uint32x4_t b); vtrnq_f32(float32x4_t a, float32x4_t b); vtrnq_p8(poly8x16_t a, poly8x16_t b); vtrnq_p16(poly16x8_t a, poly16x8_t b); // // // // // // // // // // // // // // // // // // VTRN.8 d0,d0 VTRN.16 d0,d0 VTRN.32 d0,d0 VTRN.8 d0,d0 VTRN.16 d0,d0 VTRN.32 d0,d0 VTRN.32 d0,d0 VTRN.8 d0,d0 VTRN.16 d0,d0 VTRN.8 q0,q0 VTRN.16 q0,q0 VTRN.32 q0,q0 VTRN.8 q0,q0 VTRN.16 q0,q0 VTRN.32 q0,q0 VTRN.32 q0,q0 VTRN.8 q0,q0 VTRN.16 q0,q0 // // // // // // // // // // // // // // // // VZIP.8 d0,d0 VZIP.16 d0,d0 VZIP.8 d0,d0 VZIP.16 d0,d0 VZIP.32 d0,d0 VZIP.8 d0,d0 VZIP.16 d0,d0 VZIP.8 q0,q0 VZIP.16 q0,q0 VZIP.32 q0,q0 VZIP.8 q0,q0 VZIP.16 q0,q0 VZIP.32 q0,q0 VZIP.32 q0,q0 VZIP.8 q0,q0 VZIP.16 q0,q0 要素のイ ン タ ー リ ーブ int8x8x2_t int16x4x2_t uint8x8x2_t uint16x4x2_t float32x2x2_t poly8x8x2_t poly16x4x2_t int8x16x2_t int16x8x2_t int32x4x2_t uint8x16x2_t uint16x8x2_t uint32x4x2_t float32x4x2_t poly8x16x2_t poly16x8x2_t E-62 vzip_s8(int8x8_t a, int8x8_t b); vzip_s16(int16x4_t a, int16x4_t b); vzip_u8(uint8x8_t a, uint8x8_t b); vzip_u16(uint16x4_t a, uint16x4_t b); vzip_f32(float32x2_t a, float32x2_t b); vzip_p8(poly8x8_t a, poly8x8_t b); vzip_p16(poly16x4_t a, poly16x4_t b); vzipq_s8(int8x16_t a, int8x16_t b); vzipq_s16(int16x8_t a, int16x8_t b); vzipq_s32(int32x4_t a, int32x4_t b); vzipq_u8(uint8x16_t a, uint8x16_t b); vzipq_u16(uint16x8_t a, uint16x8_t b); vzipq_u32(uint32x4_t a, uint32x4_t b); vzipq_f32(float32x4_t a, float32x4_t b); vzipq_p8(poly8x16_t a, poly8x16_t b); vzipq_p16(poly16x8_t a, poly16x8_t b); Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9 NEON サポー ト の使用 要素のイ ン タ ー リ ーブ解除 int8x8x2_t int16x4x2_t int32x2x2_t uint8x8x2_t uint16x4x2_t uint32x2x2_t float32x2x2_t poly8x8x2_t poly16x4x2_t int8x16x2_t int16x8x2_t int32x4x2_t uint8x16x2_t uint16x8x2_t uint32x4x2_t float32x4x2_t poly8x16x2_t poly16x8x2_t E.3.31 vuzp_s8(int8x8_t a, int8x8_t b); vuzp_s16(int16x4_t a, int16x4_t b); vuzp_s32(int32x2_t a, int32x2_t b); vuzp_u8(uint8x8_t a, uint8x8_t b); vuzp_u16(uint16x4_t a, uint16x4_t b); vuzp_u32(uint32x2_t a, uint32x2_t b); vuzp_f32(float32x2_t a, float32x2_t b); vuzp_p8(poly8x8_t a, poly8x8_t b); vuzp_p16(poly16x4_t a, poly16x4_t b); vuzpq_s8(int8x16_t a, int8x16_t b); vuzpq_s16(int16x8_t a, int16x8_t b); vuzpq_s32(int32x4_t a, int32x4_t b); vuzpq_u8(uint8x16_t a, uint8x16_t b); vuzpq_u16(uint16x8_t a, uint16x8_t b); vuzpq_u32(uint32x4_t a, uint32x4_t b); vuzpq_f32(float32x4_t a, float32x4_t b); vuzpq_p8(poly8x16_t a, poly8x16_t b); vuzpq_p16(poly16x8_t a, poly16x8_t b); // // // // // // // // // // // // // // // // // // VUZP.8 d0,d0 VUZP.16 d0,d0 VUZP.32 d0,d0 VUZP.8 d0,d0 VUZP.16 d0,d0 VUZP.32 d0,d0 VUZP.32 d0,d0 VUZP.8 d0,d0 VUZP.16 d0,d0 VUZP.8 q0,q0 VUZP.16 q0,q0 VUZP.32 q0,q0 VUZP.8 q0,q0 VUZP.16 q0,q0 VUZP.32 q0,q0 VUZP.32 q0,q0 VUZP.8 q0,q0 VUZP.16 q0,q0 ベ ク タ の再解釈キ ャ ス ト 操作 状況に よ っ ては、 ベ ク タ を その ま ま の値で、 異な る 型 と 見な し て扱 う こ と が 必要にな る 場合があ り ます。 その よ う な場合に変換を実行す る ための コ ンパ イ ラ 組み込み関数のセ ッ ト が用意 さ れてい ます。 構文 vreinterpret{q}_dsttype_srctype 各項目には以下の意味があ り ます。 q 128 ビ ッ ト ベ ク タ に対 し て変換を実行す る こ と を表 し ます。 名前 に こ れが含ま れない場合は、 64 ビ ッ ト ベ ク タ に対 し て変換を実 行 し ます。 dsttype 変換先の型を表 し ます。 srctype 変換元の型を表 し ます。 例 以下の コ ンパ イ ラ 組み込み関数は、 4 つの符号付 き 16 ビ ッ ト 整数を持つベ ク タ を、 4 つの符号無 し 整数を持つベ ク タ に変換 し ます。 uint16x4_t vreinterpret_u16_s16(int16x4_t a); ARM DUI 0348BJ ID 1 0 0 4 1 9 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, E-63 NEON サポー ト の使用 以下の コ ンパ イ ラ 組み込み関数は、 4 つの 32 ビ ッ ト 浮動小数点整数を持つベ ク タ を、 4 つの符号付 き 整数を持つベ ク タ に変換 し ます。 int8x16_t vreinterpretq_s8_f32(float32x4_t a); こ れ ら の変換では、 ベ ク タ に よ っ て表現 さ れ る ビ ッ ト パ タ ーンは変わ り ませ ん。 E-64 Copyright © 2007-2009 ARM Limited. All rights reserved. Non-Confidential, ARM DUI 0348BJ ID 1 0 0 4 1 9