11.07.2015 Views

RealView Compilation Tools コンパイラリファレンスガイド - ARM ...

RealView Compilation Tools コンパイラリファレンスガイド - ARM ...

RealView Compilation Tools コンパイラリファレンスガイド - ARM ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

®<strong>RealView</strong><strong>Compilation</strong> <strong>Tools</strong>バージ ョ ン 4.0コンパイラリファレンスガイドCopyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved.<strong>ARM</strong> DUI 0348BJ (ID 100419)


<strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong>コンパイラリファレンスガイドCopyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved.リリース 情 報本 書 には 以 下 の 変 更 が 加 え ら れています。変 更 履 歴日 付 発 行 機 密 保 持 ステー タ ス 変 更 点2007 年 3 月 A 非 機 密 扱 い <strong>RealView</strong> Development Suite v3.1 向 け リ リ ース 3.12008 年 9 月 B 非 機 密 扱 い <strong>RealView</strong> Development Suite v4.0 向 け リ リ ース 4.02009 年 1 月 23 日 B 非 機 密 扱 い <strong>RealView</strong> Development Suite v4.0 マニュアルの 更 新2009 年 3 月 2 日 B 非 機 密 扱 い <strong>RealView</strong> Development Suite v4.0 マニュアルの 更 新 2著 作 権®または のマー ク が 付 いた 言 葉 およびロ ゴは、 こ の 著 作 権 情 報 で 別 段 に 規 定 さ れている 場 合 を除 き、 <strong>ARM</strong> ® Limited の EU ま たはその 他 の 国 におけ る 登 録 商 標 および 商 標 です。 本 書 に 記 載 さ れてい る 他 の 製 品 名 は、 各 社 の 所 有 する 商 標 です。本 書 に 記 載 さ れてい る 情 報 の 全 部 ま たは 一 部 、 な らびに 本 書 で 紹 介 する 製 品 は、 著 作 権 所 有 者 の文 書 に よ る 事 前 の 許 可 を 得 ない 限 り 、 転 用 ・ 複 製 する こ と を 禁 じ ます。本 書 に 記 載 さ れてい る 製 品 は、 今 後 も 継 続 的 に 開 発 ・ 改 良 の 対 象 と な り ます。 本 書 に 含 まれる 製品 およびその 利 用 方 法 についての 情 報 は、 <strong>ARM</strong> が 利 用 者 の 利 益 のために 提 供 する ものです。 したがって 当 社 では、 製 品 の 市 販 性 ま たは 利 用 の 適 切 性 を 含 め、 暗 示 的 ・ 明 示 的 に 関 係 な く 一 切 の 責任 を 負 いません。本 書 は、 本 製 品 の 利 用 者 をサポー ト する こ と だけを 目 的 と し ています。 本 書 に 記 載 さ れている 情報 の 使 用 、 情 報 の 誤 り ま たは 省 略 、 あ るいは 本 製 品 の 誤 使 用 に よ って 発 生 し たいかな る 損 失 ・ 損傷 について も、 <strong>ARM</strong> Limited は 一 切 責 任 を 負 いません。<strong>ARM</strong> と い う 用 語 が 使 用 さ れてい る 場 合 、 “<strong>ARM</strong> ま たは 必 要 に 応 じ てその 子 会 社 ” を 指 します。機 密 保 持 ステー タ ス本 書 は 非 機 密 扱 いであ り 、 本 書 を 使 用 、 複 製 、 および 開 示 する 権 利 は、 <strong>ARM</strong> および <strong>ARM</strong> が 本 書を 提 供 し た 当 事 者 と の 間 で 締 結 し た 契 約 の 条 項 に 基 づいた ラ イ セン スの 制 限 に よ り 異 な り ます。アクセス 制 限 は、 <strong>ARM</strong> 社 内 に よ る 分 類 です。製 品 ステー タ ス本 書 の 情 報 は 最 終 版 であ り 、 開 発 済 み 製 品 に 対 応 し ています。Web アドレスhttp://www.arm.comii Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


目 次<strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong>コンパイラリファレンスガイド序 章本 書 について ................................................................................................. viフィードバック .............................................................................................. x第 1 章第 2 章第 3 章はじめに1.1 <strong>ARM</strong> コンパイラについて ........................................................................... 1-21.2 ソース 言 語 モード ....................................................................................... 1-31.3 言 語 の 拡 張 と 言 語 への 準 拠 ......................................................................... 1-61.4 C ライブラリと C++ ライブラリ ................................................................ 1-9コンパイラのコマンドラインオプショ ン2.1 コマンドラインオプション ......................................................................... 2-2言 語 拡 張 機 能3.1 プ リ プロセ ッ サ 拡 張 機 能 ............................................................................ 3-23.2 C90 で 使 用 可 能 な C99 言 語 機 能 ................................................................ 3-53.3 C++ および C90 で 使 用 可 能 な C99 言 語 機 能 ............................................ 3-73.4 標 準 の C 言 語 の 拡 張 機 能 ......................................................................... 3-103.5 標 準 の C++ 言 語 の 拡 張 機 能 ..................................................................... 3-16<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. iiiID 100419Non-Confidential,


3.6 標 準 C および 標 準 C++ 言 語 の 拡 張 機 能 .................................................. 3-203.7 GNU 言 語 拡 張 機 能 ................................................................................... 3-26第 4 章第 5 章付 録 A付 録 B付 録 C付 録 D付 録 Eコ ンパイ ラ 固 有 の 機 能4.1 キーワー ド と 演 算 子 ................................................................................... 4-24.2 __declspec 属 性 ....................................................................................... 4-274.3 関 数 属 性 ................................................................................................... 4-354.4 型 属 性 ....................................................................................................... 4-474.5 変 数 属 性 ................................................................................................... 4-524.6 プラグマ ................................................................................................... 4-624.7 命 令 コ ンパイ ラ 組 み 込 み 関 数 ................................................................... 4-804.8 VFP ステー タ ス 組 み 込 み 関 数 ................................................................ 4-1254.9 GNU 組 み 込 み 関 数 ................................................................................. 4-1264.10 コ ンパイ ラによ る 事 前 定 義 .................................................................... 4-129C および C++ の 実 装 に 関 する 詳 細5.1 C および C++ の 実 装 に 関 する 詳 細 ............................................................ 5-25.2 C++ の 実 装 に 関 する 詳 細 ......................................................................... 5-15via フ ァ イルの 構 文A.1 via フ ァ イルの 概 要 ..................................................................................... A-2A.2 構 文 ............................................................................................................ A-3標 準 C の 実 装 定 義B.1 実 装 定 義 ..................................................................................................... B-2B.2 ISO C 標 準 で 定 義 されていない 動 作 ........................................................ B-10標 準 C++ の 実 装 定 義C.1 整 数 変 換 ..................................................................................................... C-3C.2 純 仮 想 関 数 の 呼 び 出 し ................................................................................ C-4C.3 サポー ト されている 主 な 言 語 機 能 .............................................................. C-5C.4 標 準 C++ ラ イ ブ ラ リ の 実 装 定 義 ................................................................ C-6C および C++ コ ンパイ ラの 実 装 に 関 する 制 限D.1 C++ ISO/IEC 標 準 に 関 する 制 限 ................................................................. D-2D.2 整 数 値 に 関 する 制 限 ................................................................................... D-4D.3 浮 動 小 数 点 数 に 関 する 制 限 ........................................................................ D-6NEON サポー ト の 使 用E.1 はじめに ..................................................................................................... E-2E.2 ベクタのデータ 型 ....................................................................................... E-3E.3 コ ンパイ ラ 組 み 込 み 関 数 ............................................................................ E-5iv Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


序 章本 章 では、 『<strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong> コンパイラ リファレンスガイド』 について 概 説 します。 以 下 のセ ク シ ョ ンか ら 構 成 さ れています。• 「 本 書 について」 (ページ vi)• 「フ ィードバッ ク」 (ページ x)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. vID 100419Non-Confidential,


序 章本 書 について本 書 では、 <strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong> (RVCT) に 関 する 参 考 情 報 と 、 <strong>ARM</strong> コンパイ ラに 使 用 でき る コマン ド ラ イ ンオプシ ョ ンについて 説 明 し ています。また、<strong>ARM</strong> コンパイラにおける C や C++ の 実 装 について も 説 明 し ています。<strong>ARM</strong> コ ンパイ ラ の 使 用 に 関 する 一 般 的 な 情 報 については、 『RVCT コンパイラユーザガ イ ド』 を 参 照 して 下 さい。対 象 読 者本 書 は、 RVCT を 使 用 し てアプ リ ケーシ ョ ン を 作 成 し てい る 開 発 者 を 対 象 としています。 し たがって、 本 書 の 内 容 は、 経 験 豊 富 な ソ フ ト ウ ェ ア 開 発 者 を想 定 し て 記 述 さ れています。 RVCT に 付 属 の <strong>ARM</strong> 開 発 ツールの 概 要 については、 『<strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong> エッセンシャルガイド』 を 参 照 して 下 さい。本 書 の 構 成本 書 は 以 下 の 章 と 付 録 か ら 構 成 さ れています。第 1 章 はじめに<strong>ARM</strong> コ ンパ イ ラ の 概 要 、 準 拠 すべき 標 準 、 および C と C++ ライブラ リについて 説 明 します。第 2 章 コンパイラのコマンドラインオプション<strong>ARM</strong> コンパイラに 使 用 できるすべてのコマンドラインオプションについて 説 明 します。第 3 章 言 語 拡 張 機 能<strong>ARM</strong> コ ンパイ ラ が 提 供 する 言 語 拡 張 機 能 について 説 明 し、 標 準への 準 拠 および 実 装 に 関 する 情 報 を 提 供 し ます。第 4 章 コンパイラ 固 有 の 機 能<strong>ARM</strong> 特 有 のキーワー ド 、 演 算 子 、 プ ラ グマ、 組 み 込 み 関 数 、 マクロ、およびセミホスティングスーパーバイザコール (SVC)について 詳 し く 説 明 し ます。第 5 章 C および C++ の 実 装 に 関 する 詳 細<strong>ARM</strong> コンパイラの 言 語 実 装 について 詳 し く 説 明 します。vi Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


序 章付 録 A via ファイルの 構 文via フ ァ イルの 構 文 について 説 明 し ます。 via フ ァ イ ルを 使 用 すると 、 多 数 の <strong>ARM</strong> ツールに 対 してコマン ド ラ イン 引 数 を 指 定 できます。付 録 B 標 準 C の 実 装 定 義ISO の C 標 準 要 件 に 直 接 関 連 する <strong>ARM</strong> C の 実 装 について 説 明 します。付 録 C 標 準 C++ の 実 装 定 義<strong>ARM</strong> C++ の 実 装 について 説 明 し ます。付 録 D C および C++ コ ンパ イ ラ の 実 装 に 関 する 制 限<strong>ARM</strong> コンパイラでの C および C++ の 実 装 に 関 する 制 約 事 項 について 説 明 します。付 録 E NEON サポー ト の 使 用今 回 リ リ ース さ れた RVCT でサポー ト される NEON コンパイラ組 み 込 み 関 数 について 説 明 し ます。本 書 では、 <strong>ARM</strong> ソ フ ト ウ ェアがデフ ォル ト の 場 所 にイ ン ス ト ールされていることを 前 提 としています。 例 えば、 Windows 環 境 では、 デフ ォル ト の 場 所 はvolume:\Program Files\<strong>ARM</strong> にな り ます。 パス 名 を 参 照 する 際 、 install_directory の部 分 を こ の 場 所 に 読 み 替 えて 下 さ い。 例 えば、 本 書 では、install_directory\Documentation\... のよ うなパス 名 が 使 用 されます。 <strong>ARM</strong> ソフト ウ ェ アを 別 の 場 所 にイ ン ス ト ールし た 場 合 は、 フ ァ イルパスの 見 方 を 変 える 必 要 があ り ます。表 記 規 則本 書 では 以 下 の 表 記 規 則 を 使 用 し ています。monospacemonospaceコマンド、 ファイル 名 、 プログラム 名 、 ソースコードなど、キーボードから 入 力 可 能 なテキス ト を 示 しています。コ マン ド ま たはオプシ ョ ンに 使 用 可 能 な 略 語 を 示 し ます。 コマンド 名 ま たはオプシ ョ ン 名 をすべて 入 力 する 代 わ り に、 下 線 部 分の 文 字 だけを 入 力 する こ と がで き ます。monospace italicコマン ド または 関 数 の 引 数 で、 特 定 の 値 に 置 き 換 える こ と が 可能 なものを 示 しています。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. viiID 100419Non-Confidential,


序 章monospace boldサンプルコード 以 外 に 使 用 される 言 語 キーワード を 示 しています。italicbold重 要 事 項 、 重 要 用 語 、 相 互 参 照 、 引 用 箇 所 を 斜 体 で 記 載 し ています。メ ニュー 名 などのユーザインタフェース 要 素 を 太 字 で 記 載 しています。 ま た、 適 宜 記 述 リ ス ト 内 の 重 要 箇 所 と <strong>ARM</strong> プロセッサの 信 号 名 に も 太 字 を 用 いています。参 考 資 料ここでは、<strong>ARM</strong> プ ロ セ ッ サフ ァ ミ リ のコー ド 開 発 に 関 する 補 足 情 報 を 記 載 した <strong>ARM</strong> Limited および 各 社 の 出 版 物 を 紹 介 します。<strong>ARM</strong> Limited は 自 社 出 版 物 の 定 期 的 な 更 新 ・ 修 正 を 行 っています。 最 新 の 正 誤表 、 追 補 表 、 <strong>ARM</strong> に 関 する FAQ については、http://infocenter.arm.com/help/index.jsp をご 覧 下 さい。<strong>ARM</strong> の 出 版 物本 書 では、 RVCT 付 属 の 開 発 ツールの 参 考 情 報 を 提 供 し ています。 このほか、本 製 品 には 以 下 のマニ ュ アルが 同 梱 されています。• 『RVCT エッセンシャルガイド』 (<strong>ARM</strong> DUI 0202J)• 『RVCT コンパイラユーザガイド』 (<strong>ARM</strong> DUI 0205J)• 『RVCT ライブラリ / 浮 動 小 数 点 サポー ト ガ イ ド 』 (<strong>ARM</strong> DUI 0349J)• 『RVCT リンカユーザガイド』 (<strong>ARM</strong> DUI 0206J)• 『RVCT リンカリファレンスガイド』 (<strong>ARM</strong> DUI 0381J)• 『RVCT ユーテ ィ リ テ ィ ガイ ド』 (<strong>ARM</strong> DUI 0382J)• 『RVCT アセンブラガイ ド』 (<strong>ARM</strong> DUI 0204J)• 『RVCT デベロ ッ パガ イ ド 』 (<strong>ARM</strong> DUI 0203J)準 拠 する 基 本 標 準 、 ソ フ ト ウ ェ ア イ ン タ フ ェース、 および <strong>ARM</strong> でサポー トされている 標 準 に 関 する 詳 細 については、install_directory\Documentation\Specifications\... を 参 照 して 下 さい。viii Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


序 章特 定 の <strong>ARM</strong> 製 品 に 関 する 情 報 については、 以 下 のマニ ュ アルを 参 照 し て 下さい。• 『<strong>ARM</strong> アーキテ クチャ リ フ ァ レンスマニュアル』 (<strong>ARM</strong>v7-A および<strong>ARM</strong>v7-R エデ ィ シ ョ ン) (<strong>ARM</strong> DDI 0406J)• 『<strong>ARM</strong>7-M アーキテクチャ リ フ ァ レンスマニュアル』 (<strong>ARM</strong> DDI 0403J)• 『<strong>ARM</strong>6-M アーキテクチャ リ フ ァ レンスマニュアル』 (<strong>ARM</strong> DDI 0419J)• お 使 いのハー ド ウ ェ アデバイ スの <strong>ARM</strong> データ シー ト ま たはテ ク ニカルリファレンスマニュアル他 の 出 版 物以 下 の 出 版 物 は、 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 communicationstransmitting at 5.3 and 6.3 kbit/s• ETSI G.729 勧 告 : Coding of speech at 8 kbit/s using conjugate-structurealgebraic-code-excited linear prediction (CS-ACELP)TI のコ ンパ イ ラ 組 み 込 み 機 能 に 関 する 出 版 物 は、 Texas Instruments 社 の Webサイ ト http://www.ti.com から 入 手 できます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. ixID 100419Non-Confidential,


序 章フィードバック<strong>ARM</strong> Limited では <strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong> および 本 書 に 関 する フ ィ ー ドバックをお 待 ちしており ます。<strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong> に 関 する フ ィ ー ドバッ クRVCT に 関 し て 問 題 があ る 場 合 は、 購 入 元 にお 問 い 合 わせ 下 さ い。 このとき、迅 速 かつ 適 切 な 対 応 を させて 頂 く ために、 以 下 の 情 報 を ご 用 意 下 さ い。• お 名 前 と 会 社 名• 製 品 のシ リ アル 番 号• 製 品 の リ リ ース 情 報• プラッ ト フォームの 詳 細 (ハードウェアプラッ ト フォーム、 オペレーティングシステムの 種 類 とバージョンなど)• 問 題 を 再 現 するサ イ ズの 小 さ な 独 立 し たサンプルコー ド• 操 作 の 目 的 と 実 際 の 動 作 に 関 する 詳 し い 説 明• 使 用 し た コ マン ド (コ マン ド ラ イ ンオプシ ョ ン を 含 む)• 問 題 を 例 示 するサンプル 出 力• ツールのバージ ョ ン 情 報 (バージ ョ ン 番 号 、 ビル ド 番 号 を 含 む)本 書 に 関 する フ ィ ー ド バ ッ ク本 書 に 関 するご 意 見 につきましては、 以 下 の 内 容 を 記 載 した 電 子 メールをerrata@arm.com までお 送 り 下 さい。• マニュアル 名• 文 書 番 号• 問 題 のあ るページ 番 号• 問 題 点 の 簡 潔 な 説 明補 足 すべき 点 や 改 善 すべき 点 についてのご 提 案 もお 待 ち し てお り ます。x Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


第 1 章はじめに本 章 では、 <strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong> (RVCT) 付 属 の <strong>ARM</strong> コンパイラについて 概 説 します。 こ こ では、 準 拠 すべき 標 準 について 説 明 し、 さ らに RVCT付 属 の ラ ン タ イ ム ラ イ ブ ラ リ の 概 要 について も 説 明 し ます。 以 下 のセ ク シ ョンから 構 成 されています。• 「<strong>ARM</strong> コンパイラについて」 (ページ 1-2)• 「ソース 言 語 モード」 (ページ 1-3)• 「 言 語 の 拡 張 と 言 語 への 準 拠 」 (ページ 1-6)• 「C ライブラリと C++ ライブラリ」 (ページ 1-9)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 1-1ID 100419Non-Confidential,


はじめに1.2 ソース 言 語 モード<strong>ARM</strong> コンパイラには、 以 下 の 3 つのソース 言 語 モードがあり ます。 これらのモード を 使 用 し て、 さ まざまな タ イプの C および C++ のソースコードをコンパイルできます。 以 下 に 設 定 方 法 を 示 し ます。• ISO C90• ISO C99• ISO C++1.2.1 ISO C90<strong>ARM</strong> コンパイラは、1990 C 標 準 および 追 補 表 の 定 義 に 従 って C をコンパイルします。• ISO/IEC 9899:1990。 C の 1990 年 度 国 際 標 準 。• ISO/IEC 9899 AM1 : 1995 年 の 標 準 追 補 1 で、wchar.h から wtype.h までの国 際 文 字 のサポー ト が 追 加 さ れま し た。<strong>ARM</strong> コンパイラは、 以 下 のよ うな ISO C90 の 拡 張 機 能 もサポー ト し ています。 詳 細 については、 「 言 語 の 拡 張 と 言 語 への 準 拠 」 (ページ 1-6) を 参 照 して下 さい。本 書 で 使 用 する 用 語 について 説 明 し ます。C90ISO C90 コンパイラで、 <strong>ARM</strong> 拡 張 機 能 と 組 み 合 わせて 使 用 し ます。C90 コードをコンパイルする 場 合 は、 --c90 オプシ ョ ンを 使 用 して下 さい。 これがデフォルトです。厳 密 な C90 1990 C 標 準 および 追 補 表 の 定 義 に 従 った C です。関 連 項 目• 「--c90」 (ページ 2-25)• 「 言 語 の 拡 張 と 言 語 への 準 拠 」 (ページ 1-6)• 付 録 B 標 準 C の 実 装 定 義<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 1-3ID 100419Non-Confidential,


はじめに1.2.2 ISO C99<strong>ARM</strong> コンパイラは、1999 C 標 準 および 追 補 表 の 定 義 に 従 って C をコンパイルします。• ISO/IEC 9899:1999。 C の 1999 年 度 国 際 標 準 。<strong>ARM</strong> コンパイラは、 ISO C99 の 拡 張 機 能 も サポー ト し ます。 詳 細 については、「 言 語 の 拡 張 と 言 語 への 準 拠 」 (ページ 1-6) を 参 照 して 下 さい。本 書 で 使 用 する 用 語 について 説 明 し ます。C99ISO C99 コンパイラで、<strong>ARM</strong> および GNU 拡 張 機 能 と 組 み 合 わせて 使 用 し ます。C99 コードをコンパイルする 場 合 は、--c99 オプシ ョ ンを 使 用 して下 さい。厳 密 な C99 1999 C 標 準 および 追 補 表 の 定 義 に 従 った C です。標 準 CCC90 または C99 を 適 宜 意 味 し ます。C90、 厳 密 な C90、 C99、 および 標 準 C の 総 称 です。関 連 項 目• 「--c99」 (ページ 2-26)• 「 言 語 の 拡 張 と 言 語 への 準 拠 」 (ページ 1-6)• 付 録 B 標 準 C の 実 装 定 義1.2.3 ISO C++<strong>ARM</strong> コンパイラは、 2003 標 準 の 定 義 に 従 って C++ をコンパイルします (ワイドスト リームとエキスポートテンプレートを 除 く)。• ISO/IEC 14822:2003。 C++ の 2003 年 度 国 際 標 準 。<strong>ARM</strong> コンパイラは、 ISO C++ の 拡 張 機 能 の 一 部 も サポー ト し ています。 詳 細については、 「 言 語 の 拡 張 と 言 語 への 準 拠 」 (ページ 1-6) を 参 照 して 下 さい。本 書 で 使 用 する 用 語 について 説 明 し ます。厳 密 な C++標 準 C++ワイドスト リームとエキスポートテンプレートを 除 いたISO C++ です。厳 密 な C++ です。1-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


はじめにC++ワ イ ド ス ト リ ーム とエキスポー ト テンプレー ト 機 能 を 除 いた ISO C++ です。 <strong>ARM</strong> 拡 張 機 能 と の 組 み 合 わせは 任 意 です。C++ コードをコンパイルする 場 合 は、--cpp オプシ ョ ンを 使用 して 下 さい。関 連 項 目• 「--cpp」 (ページ 2-34)• 「 言 語 の 拡 張 と 言 語 への 準 拠 」 (ページ 1-6)• 付 録 C 標 準 C++ の 実 装 定 義 .<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 1-5ID 100419Non-Confidential,


はじめに1.3 言 語 の 拡 張 と 言 語 への 準 拠コ ンパイ ラ は、 さ ま ざ ま な ソース 言 語 に 対 する 多 く の 言 語 拡 張 をサポー ト しています。 ま た、 使 用 可 能 な ソース 言 語 へ 準 拠 する ための コ マン ド ラ イ ンオプシ ョ ンも 用 意 されています。1.3.1 言 語 拡 張 機 能コ ンパイ ラ がサポー ト する 言 語 拡 張 機 能 は 以 下 の よ う に 分 類 で き ます。C99 の 機 能標 準 C の 拡 張標 準 C++ の 拡 張コンパイラは C99 の 言 語 機 能 の 一 部 を 使 用 で き る よ う に します。• 厳 密 な C90 の 拡 張 の 例 と し ては、 // 形 式 のコ メ ン トがあ り ます。• 標 準 C++ および 厳 密 な C90 両 方 の 拡 張 の 例 と し ては、 restrict ポインタがあります。詳 細 については、 以 下 のサブセ ク シ ョ ン を 参 照 し て 下 さい。• 「C90 で 使 用 可 能 な C99 言 語 機 能 」 (ページ 3-5)• 「C++ および C90 で 使 用 可 能 な C99 言 語 機 能 」 (ページ 3-7)コンパイラは 厳 密 な C99 の 拡 張 をサポー ト し ます。 例 えば、 旧 式 の 非 プ ロ ト タ イ プ 定 義 を 無 効 にする 関 数 プ ロ ト タイプです。 詳 細 については、 「 標 準 の C 言 語 の 拡 張 機 能 」(ページ 3-10) を 参 照 して 下 さい。標 準 C のこれらの 拡 張 は C90 で も 使 用 で き ます。コ ンパ イ ラ は、 ク ラ ス メ ンバの 宣 言 で 使 用 する 修 飾 名 の ような、 厳 密 な C++ の 拡 張 を 数 多 く サポー ト し ています。 詳細 については、 「 標 準 の C++ 言 語 の 拡 張 機 能 」 (ページ3-16) を 参 照 して 下 さい。こ れ ら の 拡 張 は 標 準 C と C90 では 使 用 でき ません。標 準 C と 標 準 C++ の 拡 張コ ンパ イ ラ は、 匿 名 の ク ラ ス、 構 造 体 、 および 共 用 体 の ような、 厳 密 な C++ および 厳 密 な C90 に 特 有 な 拡 張 機 能 の一 部 をサポー ト し ています。 詳 細 については、 「 標 準 C および 標 準 C++ 言 語 の 拡 張 機 能 」 (ページ 3-20) を 参 照 して 下 さい。1-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


はじめにGNU 拡 張 機 能コンパイラは、 GNU 形 式 の 拡 張 左 辺 値 や GNU 組 み 込 み関 数 の よ う な GNU コ ンパ イ ラ の 拡 張 機 能 の 一 部 をサポートしています。 詳 細 については、 以 下 のサブセ ク シ ョ ン を参 照 し て 下 さ い。• 「 言 語 標 準 の 準 拠 」• 「GNU 言 語 拡 張 機 能 」 (ページ 3-26)• 第 4 章 コンパイラ 固 有 の 機 能<strong>ARM</strong> 特 有 の 機 能 拡 張コ ンパイ ラ は、 命 令 の 組 み 込 み 関 数 やその 他 の 組 み 込 み 関数 のよ う な、 <strong>ARM</strong> コ ンパ イ ラ 特 有 の 拡 張 機 能 を 数 多 く サポー ト し ています。 詳 細 については、 第 4 章 コンパイラ 固有 の 機 能 を 参 照 して 下 さい。1.3.2 言 語 標 準 の 準 拠コ ンパ イ ラ には、 ソ ース 言 語 への 準 拠 の 程 度 に よ っ て 複 数 のモー ド があ り ます。厳 密 モー ド 厳 密 モー ド では、 ソース 言 語 に 対 応 する 言 語 標 準 への 準 拠 が 強く 要 求 されます。 例 えば、 // 形 式 のコ メ ン ト を 厳 密 モー ド の C90でコンパイルするとエラーになり ます。厳 密 モー ド で コ ンパイルするには、 コ マン ド ラ イ ンオプシ ョ ン--strict を 使 用 して 下 さい。GNU モード GNU モード では、 ソース 言 語 の GNU コ ンパ イ ラ 拡 張 機 能 がすべて 使 用 可 能 にな り ます。 GNU モー ド の 例 を 以 下 に 示 し ます。• ソース 言 語 が C90、 C99 のいずれかの 場 合 は、 switch ステートメントの case で 範 囲 指 定 がで き ます。• ソース 言 語 が C90 または C++ の 場 合 は、 C99 形 式 の 指 定 済みのイ ニシ ャ ラ イザを 使 用 でき ます。GNU モー ド でコ ンパイルする 場 合 は、 コ ンパイ ラの --gnu オプションを 使 用 して 下 さい。注非 厳 密 モー ド で 使 用 可 能 な GNU 拡 張 機 能 は 他 に も あ り ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 1-7ID 100419Non-Confidential,


はじめに例以 下 の 例 では、 ソース 言 語 モー ド と 言 語 準 拠 モー ド の 組 み 合 わせを 示 し ます。• 拡 張 子 が .cpp のファ イルをコマンド ラインオプシ ョ ン --strict を 使 用 してコンパイルすると、 標 準 C++ のコンパイルになり ます。• C のソースファイルをコマンドラインオプション --gnu でコンパイルすると、GNU モード の C90 コンパイルになります。• 拡 張 子 が .c のファ イルをコマンド ラ インオプシ ョ ン --strict と --gnu を両 方 指 定 し て コ ンパイルする と エ ラーにな り ます。関 連 項 目• 「--gnu」 (ページ 2-75)• 「--strict, --no_strict」 (ページ 2-133)• 「GNU 言 語 拡 張 機 能 」 (ページ 3-26)• 『コンパイ ラユーザガイ ド』 の 「フ ァ イル 命 名 規 則 」 (ページ 2-14)1-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


はじめに1.4 C ライブラリと C++ ライブラリRVCT では、 実 行 時 に 以 下 の C ライブラリおよび C++ ライブラリを 使 用 できます。<strong>ARM</strong> C ライブラリ<strong>ARM</strong> C ライブラリには、 標 準 C 関 数 と 、 C ライブラリおよびC++ ラ イ ブ ラ リ で 使 用 さ れるヘルパ 関 数 が 含 まれています。 また、 この C ライブラリは、 標 準 C ライブラリ 関 数 をセミホスト環 境 で 実 装 する と き に 使 用 さ れる、 printf のよ うなターゲッ ト 依存 関 数 も 提 供 し ます。 これらの C ライブラリは、 ユーザコード 内の ターゲ ッ ト 依 存 関 数 を 再 定 義 し、 セ ミ ホ ス ト の 依 存 性 を 除 去できるように 構 成 されています。<strong>ARM</strong> ラ イ ブ ラ リ は、 以 下 に 準 拠 し ています。• C Library ABI for the <strong>ARM</strong> Architecture (CLIBABI)• C++ ABI for the <strong>ARM</strong> Architecture (CPPABI)詳 細 については、 『ライブラ リ / 浮 動 小 数 点 サポー ト ガ イ ド 』 の「<strong>ARM</strong> アーキテクチャ 用 ABI への 準 拠 」 (ページ 1-3) を 参 照 して下 さい。Rogue Wave 標 準 C++ ライブラリ v.2.02.03Rogue 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サポー ト ラ イブラ リ<strong>ARM</strong> C ライブラリには、C++ のサポー ト を 可 能 にし、 異 なるアーキテクチャやプロセッサ 向 けのコード をコンパイルするための 追 加 コンポーネン ト が 含 まれています。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 1-9ID 100419Non-Confidential,


はじめにC ライブラリと C++ ライブラリは、バイナリのみで 提 供 されています。 1990ISO 標 準 C ライブラリには、 インターワークが 選 択 されているか、 または 浮動 小 数 点 サポー ト が 選 択 さ れてい る かに よ って、 ターゲ ッ ト シ ス テムのバ イト 順 序 など、 主 要 なビルドオプションの 組 み 合 わせに 応 じたバリアントがあります。詳 細 については、 『ライブラ リ / 浮 動 小 数 点 サポー ト ガ イ ド 』 の 第 2 章 C のライブラ リ と C++ のライブラ リ を 参 照 して 下 さい。1-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


第 2 章コンパイラのコマンドラインオプション本 章 では、 <strong>ARM</strong> コンパイラ armcc に 使 用 できるコマンドラインオプションについて 説 明 し ます。 以 下 のセ ク シ ョ ンか ら 構 成 さ れています。• 「コマンド ラ インオプシ ョ ン」 (ページ 2-2)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-1ID 100419Non-Confidential,


コンパイラのコマンドラインオプション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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション関 連 項 目• 「--cpu=name」 (ページ 2-35)• 「-Lopt」 (ページ 2-88)• 「--show_cmdline」 (ページ 2-128)2.1.2 --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 です。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-3ID 100419Non-Confidential,


コンパイラのコマンドラインオプション例typedef enum { red, white, blue } tricolor;inline tricolor operator++(tricolor c, int){int i = static_cast(c) + 1;return static_cast(i);}void foo(void){tricolor c = red;c++; // okay++c; // anachronism}オプシ ョ ン --anachronisms を 使 用 してこのコード をコンパイルする と、 警 告メ ッ セージが 表 示 さ れます。オプシ ョ ン --anachronisms を 使 用 せずに こ のコー ド を コ ンパイルする と 、 エラーメ ッセージが 表 示 されます。関 連 項 目• 「--cpp」 (ページ 2-34)• 「--strict, --no_strict」 (ページ 2-133)• 「--strict_warnings」 (ページ 2-134)• 「アナク ロニズム」 (ページ 5-16)2.1.5 --apcs=qualifer...qualifierこ のオプシ ョ ン を 使 用 する と 、 コー ド の 生 成 時 に イ ン ターワー クおよび 位 置非 依 存 を 制 御 で き ます。--apcs コマン ド ラ インオプシ ョ ンに 修 飾 子 を 指 定 する こ とによ り、 コンパイラによって 使 用 される <strong>ARM</strong> アーキテクチャ 向 けプロシージャ コール 標 準(AAPCS) のバリ アン ト を 定 義 できます。構 文--apcs=qualifer...qualifierqualifier...qualifier に よ って 修 飾 子 の リ ス ト が 表 さ れる 場 合 、 以 下 の 規 則 が適 用 さ れます。• 少 な く と も 1 つの 修 飾 子 を 指 定 する 必 要 があ り ます。• リ ス ト の 修 飾 子 間 にはスペース を 挿 入 し ないで 下 さ い。2-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションqualifier の 各 イ ン ス タ ン スは 以 下 のいずれかであ る 必 要 があ り ます。/interwork、 /nointerwork/ropi、 /noropi/rwpi、 /norwpi/fpic、 /nofpicこ のオプシ ョ ン を 使 用 する と 、 <strong>ARM</strong> または Thumb のイン ターワークがサポー ト されたコード か、 サポー ト されないコードが 生 成 されます。 デフォル ト は /nointerwork です。ただし、 <strong>ARM</strong>v6 以 降 は 例 外 で、 こ の 場 合 のデフ ォル ト は/interwork です。こ のオプシ ョ ン を 使 用 する と 、 読 み 出 し 専 用 の 位 置 非 依 存(ROPI) コー ド を 生 成 する かど う かを 指 定 で き ます。 デフォルトは /noropi です。/[no]pic は /[no]ropi の 別 名 です。こ のオプシ ョ ン を 使 用 する と 、 読 み 出 し / 書 き 込 みの 位 置非 依 存 (RWPI) コー ド を 生 成 する かど う かを 指 定 で き ます。 デフォル ト は /norwpi です。/[no]pid は /[no]rwpi の 別 名 です。こ のオプシ ョ ン を 使 用 する と 、 相 対 ア ド レ ス 参 照 がプ ロ グラ ム を ロー ド し た 場 所 に 依 存 し ない、 読 み 出 し 専 用 の 位 置非 依 存 コー ド を 生 成 する かど う かを 指 定 で き ます。注ま た、 複 数 の 修 飾 子 を 指 定 する こ と も で き ます。 例 えば、--apcs=/nointerwork/noropi/norwpi は、--apcs=/nointerwork --apcs=noropi/norwpi と同 じ 意 味 です。デフォルト--apcs オプシ ョ ン を 指 定 し なかった 場 合 、 コ ンパイ ラ は--apcs=/nointerwork/noropi/norwpi/nofpic が 指 定 されたと き と 同 じ 処 理 を 実 行 します。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-5ID 100419Non-Confidential,


コンパイラのコマンドラインオプション使 用 法/interwork, /nointerworkデフ ォル ト では、 以 下 の よ う に コー ド が 生 成 さ れます。• インターワークがサポート されないコードがサポートされます。<strong>ARM</strong>v5T 以 降 のアーキテ ク チ ャ に 対 応する --cpu が 指 定 されていない 限 り は、 /nointerworkがデフ ォル ト にな り ます。• インターワークがサポート された <strong>ARM</strong>v5T 以 降 の<strong>ARM</strong> アーキテ ク チャ では、 イ ン ターワー ク が 自 動 的に 発 生 し ます。/ropi, /noropi ROPI コー ド を 生 成 する ために /ropi 修 飾 子 を 選 択 する と 、コンパイラは 以 下 の 処 理 を 行 います。• 読 み 出 し 専 用 コー ド およびデータ のア ド レ ス を、 PC相 対 で 生 成 し ます。• 読 み 出 し 専 用 の 出 力 セ ク シ ョ ンに 位 置 非 依 存 (PI)属 性 を 設 定 し ます。注C++ をコンパイルするときは、--apcs=/ropi はサポー ト されません。/rwpi, /norwpi RWPI コー ド を 生 成 する ために /rwpi 修 飾 子 を 選 択 する と 、コンパイラは 以 下 の 処 理 を 行 います。• スタティックベースレジスタ sb からのオフセッ ト を使 用 し て、 書 き 込 み 可 能 データ をア ド レ ス 指 定 し ます。 つま り 、 以 下 の こ と を 意 味 し ます。— 実 行 時 に RW データ 領 域 のベース ア ド レ ス を 修正 でき ます。— データ の 複 数 の イ ン ス タ ン ス を 生 成 で き ます。— データ を 位 置 非 依 存 データ にする こ と がで き ます (ただ し、 データ を 位 置 非 依 存 データ にする必 要 はあ り ません)。• 読 み 出 し / 書 き 込 み 出 力 セ ク シ ョ ンに PI 属 性 を 設 定します。2-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション注デフォル ト は --lower_rwpi オプシ ョ ンであるため、 RWPIでないコードは、 等 価 な RWPI の コー ド に 自 動 的 に 変 換 されます。 こ のス タ テ ィ ッ ク な 初 期 化 は、 実 行 時 に C++ のコンス ト ラクタメカニズムによって 行 われます (このメカニズムは C に も 使 用 さ れます)。/fpic, /nofpicこ のオプシ ョ ン を 選 択 する と 、 コ ンパイ ラ は 以 下 の 処 理 を行 います。• PC 相 対 ア ド レ シングを 使 用 し てすべての 静 的 データにアクセスします。• リンカによって 作 成 されるグローバルオフセッ トテーブル (GOT) エン ト リ を 使 用 して、 インポートまたはエクスポート されたすべての 読 み 出 し- 書 き 込みデータ にア ク セス し ます。• すべての 読 み 出 し 専 用 データへのア ク セス を PC 相 対で 行 います。コードで 共 有 オブジェ ク ト を 使 用 している 場 合 、 /fpic を指 定 し て コ ンパ イ ルする 必 要 があ り ます。 コードで SystemV の 共 有 ライブラ リ を 使 用 している 場 合 にのみ、 相 対 アドレスが 実 装 されます。静 的 イ メ ージ ま たは 静 的 ラ イ ブ ラ リ を ビル ド する 場 合 、/fpic を 指 定 してコンパイルする 必 要 はあ り ません。C++ をコンパイルするときに、/fpic を 使 用 でき ます。 この場 合 、 仮 想 関 数 テーブル と typeinfo は、 PC 相 対 でア ク セスできるように 読 み 出 し - 書 き 込 み 領 域 に 配 置 さ れます。注System V または <strong>ARM</strong> Linux 共 有 ラ イ ブ ラ リ を ビル ド する場 合 は、--apcs /fpic と --no_hide_all を 一 緒 に 使 用 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-7ID 100419Non-Confidential,


コンパイラのコマンドラインオプション制 約 条 件/ropi、 /rwpi、 /fpic のいずれかを 指 定 し て コー ド を コ ンパイルする 場 合 、 い くつかの 制 限 が 適 用 されます。/ropi/rwpi/ropi を 使 用 してコンパイルする 場 合 の 主 な 制 限 を 以 下 に 示 し ます。• C++ をコンパイルするとき、--apcs=/ropi は 使 用 でき ません。• 正 規 の C の 一 部 の 構 造 を --apcs=/ropi でコンパイルすると、正 し く 機 能 しません。 以 下 に 例 を 示 し ます。extern const int ci; // roconst int *p2 = &ci; // this static initialization// does not work with --apcs=/ropi上 記 の よ う な 静 的 初 期 化 を 実 行 する には、--lower_ropi オプションを 使 用 してコードをコンパイルします。 以 下 に 例 を示 します。armcc --apcs=/ropi --lower_ropi/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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション• --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 CallStandard for the <strong>ARM</strong> architecture』2.1.6 --armこのオプションを 使 用 すると、 <strong>ARM</strong> 命 令 セ ッ ト を ターゲ ッ ト にする よ う に コンパイ ラに 要 求 できます。 コンパイラは、<strong>ARM</strong> コード と Thumb コードの 両 方を 生 成 できるようになりますが、 <strong>ARM</strong> コードが 優 先 される ものと 認 識 します。注このオプショ ンは、 Cortex-M3 などの Thumb のみのプロセ ッ サには 影 響 を 及ぼしません。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-9ID 100419Non-Confidential,


コンパイラのコマンドラインオプションデフォルトこれは、 <strong>ARM</strong> 命 令 セットをサポートするターゲットのデフォルトオプションです。関 連 項 目• 「--arm_only」 (ページ 2-17)• 「--cpu=list」 (ページ 2-34)• 「--cpu=name」 (ページ 2-35)• 「--thumb」 (ページ 2-135)• 「#pragma arm」 (ページ 4-63)• 『コンパイ ラユーザガイ ド』 の 「ターゲッ ト プロセッサまたはアーキテク チ ャ の 指 定 」 (ページ 2-26)2.1.7 --arm_linuxこのオプションを 使 用 すると、 <strong>ARM</strong> Linux コンパイルに 適 したデフォルト 値でその 他 のオプシ ョ ンセッ ト を 設 定 でき ます。使 用 法これらのデフォルトは、 以 下 のいずれかの <strong>ARM</strong> Linux オプシ ョ ンを 使 用 すると 自 動 的 に イ ネーブルにな り ます。• --arm_linux_paths• 完 全 GCC エミュレーションモードの --translate_gcc• 完 全 GCC エミュレーションモードの --translate_g++• 完 全 GCC エミュレーションモードの --translate_gldこ のオプシ ョ ンは、 通 常 、 従 来 の コー ド の 移 行 を 支 援 する ために 使 用 さ れます。 こ のオプシ ョ ン を 使 用 する こ と に よ り 、 既 存 の メ ー ク フ ァ イ ルで 使 用 される コ ンパ イ ラ オプシ ョ ン を 簡 略 化 する と 同 時 に、 ヘ ッ ダフ ァ イル と ラ イ ブラ リ の 検 索 に 使 用 するパス を 完 全 かつ 明 示 的 に 制 御 でき ます。RVCT v4.0 より 前 のビルドから 移 行 する 場 合 は、 コンパイラに 用 意 されたこれ ら のオプシ ョ ン をすべて 単 一 の --arm_linux オプシ ョ ンで 置 換 で き ます。2-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションデフォルトデフォル ト で、 以 下 のオプシ ョ ンセッ ト が 設 定 されます。• --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_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)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-11ID 100419Non-Confidential,


コンパイラのコマンドラインオプション• 『リンカリファレンスガイド』 の「--[no_]search_dynamic_libraries」 (ページ 2-59)• 『Application Note 212 - Building Linux applications using RVCT v4.0 and theGNU <strong>Tools</strong> and Libraries』2.1.8 --arm_linux_config_file=pathこのオプションは、 <strong>ARM</strong> Linux ビルド 用 に 作 成 されたコンフ ィ ギュレーシ ョンフ ァ イルの 場 所 を 指 定 します。 こ のオプシ ョ ン を 使 用 する と 、 コー ド を コンパイルする と きに、 標 準 の Linux コンフィギュレーション 設 定 を 使 用 できるようになります。構 文--arm_linux_config_file=pathpath は、 コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イルのパス と フ ァ イル 名 です。制 約 条 件このオプションは、 コンフィギュレーションファイルを 生 成 するときだけでな く 、 コ ンパイル と リ ン ク 時 にコ ン フ ィ ギ ュ レーシ ョ ン を 使 用 する と き に も使 用 する 必 要 があ り ます。<strong>ARM</strong> Linux コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イ ルを コ マン ド ラ イ ンで 指 定 して、--translate_gcc、--translate_g++、 または --translate_gld を 使 用 した 場 合 は、これ 以 外 の 特 定 のオプシ ョ ンのデフ ォル ト 設 定 が 影 響 を 受 けます。--bss_threshold のデフ ォル ト 値 はゼロにな り 、--signed_bitfields と--unsigned_bitfields のデフ ォル ト は --signed_bitfields にな り、--enum_is_int と--wchar32 はオンにな り ます。関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--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)2-12 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション• 「--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 theGNU <strong>Tools</strong> and Libraries』2.1.9 --arm_linux_configureこのオプショ ンは、 GNU C ライブラリ glibc のインクルードパス、 ライブラリパス、 および 標 準 ライブラ リについて 記 述 したコンフ ィギュレーシ ョ ンファイルを 作 成 することによって、 <strong>ARM</strong> Linux で 使 用 する RVCT を 設 定 し ます。 作 成 さ れた コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イルは、 コー ド を ビル ド する とき に 使 用 さ れます。使 用 法自 動 と 手 動 の コ ン フ ィ ギ ュ レーシ ョ ン 方 法 が 適 用 さ れます。 自 動 コ ン フ ィギュレーションでは、 インス トールされた GNU ツールチェーンが PATH 環 境変 数 に 基 づいて 自 動 的 に 検 索 さ れ、 使 用 する コ ン フ ィ ギ ュ レーシ ョ ン 設 定 を決 定 するために 問 い 合 わせが 行 われます。 手 動 コ ン フ ィ ギ ュ レーシ ョ ン を 実行 する と 、 ヘ ッ ダフ ァ イル と ラ イ ブ ラ リ に 独 自 の 場 所 を 指 定 で き ます。 手 動コンフィギュレーションは、 GNU ツールチェーンが 完 全 にインス ト ールされていない 場 合 に 使 用 でき ます。自 動 コ ン フ ィ ギ ュ レーシ ョ ン を 実 行 する には• armcc --arm_linux_configure --arm_linux_config_file=config_file_path--configure_gcc=path --configure_gld=path<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-13ID 100419Non-Confidential,


コンパイラのコマンドラインオプションconfig_file_path は、 作 成 される コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イルのパスとファイル 名 です。 GNU コンパイラコレクション (GCC) ド ライバの 場所 と GNU リ ン カの 場 所 をオプシ ョ ンで 指 定 し て、 シ ス テム 環 境 変 数PATH によって 指 定 された 場 所 をオーバーライ ドするこ と もできます。手 動 コ ン フ ィ ギ ュ レーシ ョ ン を 実 行 する には• armcc --arm_linux_configure --arm_linux_config_file=path--configure_cpp_headers=path --configure_sysroot=pathGNU libstdc++ 標 準 テンプレー ト ラ イ ブ ラ リ (STL) のヘッダファイルへのパス、 およびラ イブラ リ とヘッ ダフ ァ イルが 含 まれている システムルー ト パスが 指 定 さ れます。制 約 条 件自 動 コ ン フ ィ ギ ュ レーシ ョ ン を 実 行 する には、 GNU ツールチェーンがシステム 上 に 存 在 する こ と が 必 要 です。自 動 コ ン フ ィ ギ ュ レーシ ョ ン を 利 用 する 場 合 は、 シ ス テム 環 境 変 数 PATH を 使用 して <strong>ARM</strong> Linux GCC を 検 索 で き る 必 要 があ り ます。 適 切 な GCC がシステムパスにない 場 合 は、 GCC をパスに 追 加 する か、--configure_gcc (およびオプションで --configure_gld) を 使 用 して、 適 切 な GCC の 場 所 を 手 動 で 指 定 できます。デフォルト追 加 のオプシ ョ ン を 使 用 し て GCC または GNU リンカの 場 所 を 指 定 しない 限り 、 自 動 コ ン フ ィ ギ ュ レーシ ョ ンが 適 用 さ れます。 つま り、 追 加 のオプシ ョン を 使 用 し て 場 所 を 指 定 し ない 限 り 、 シ ス テムパス 環 境 変 数 に 基 づいて <strong>ARM</strong>Linux GCC の 検 索 がコ ンパイ ラによ って 試 みられます。関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--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)2-14 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション• 「--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 theGNU <strong>Tools</strong> and Libraries』2.1.10 --arm_linux_pathsこのオプションを 使 用 すると、 <strong>ARM</strong> Linux のコードをビルドできます。使 用 法このオプショ ンは、 RVCT を <strong>ARM</strong> Linux と 共 に 使 用 する よ う に 設 定 し た 後 で使 用 で き ます。このオプショ ンはコンパイラ 専 用 です。 典 型 的 な GCC 使 用 モデルがベース となっており、 標 準 のシステムオブジェク ト ファイルと ライブラ リの 直 接 リ ンク と 選 択 は、 コ ンパ イ ラ ド ラ イ バに 基 づいて 行 われます。このオプショ ンは、 RVCT v4.0 より 前 のバージョンの RVCT からの 移 行 を 支援 する 目 的 で も 使 用 さ れます。 --arm_linux_configure を 使 用 してコンフ ィ ギュレーシ ョ ン フ ァ イルを 作 成 し た ら、 標 準 のオプシ ョ ン と 検 索 パスの リ ス ト を--arm_linux_paths オプシ ョ ンによって 置 き 換 える こ とで、 既 存 のビルド を 修 正できます。 つま り、--arm_linux_paths を 使 用 して 以 下 を 置 換 できます。• --arm_linux について リ ス ト されたすべてのデフ ォル ト オプシ ョ ン• ヘッダパス• ライブラリパス• 標 準 ラ イ ブ ラ リ制 約 条 件--arm_linux_config_file=filename を 使 用 して、 コンフ ィ ギュレーシ ョ ンフ ァ イルの 場 所 を 指 定 する 必 要 があ り ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-15ID 100419Non-Confidential,


コンパイラのコマンドラインオプション例アプ リ ケーシ ョ ンコード をコンパイルし、 リ ンク します。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 -csource.cコ ンパ イ ラ を 使 用 し て、 2 つのオブジェ ク ト フ ァ イル obj1 と obj2 を 共 有 ラ イブラ リ my_shared_lib.so にリンクします。armcc --arm_linux_paths --arm_linux_config_file=my_config_file --shared -omy_shared_lib.so obj1.o obj2.o関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--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 theGNU <strong>Tools</strong> and Libraries』2-16 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション2.1.11 --arm_onlyこのオプションを 使 用 すると、 <strong>ARM</strong> 専 用 コー ド が 適 用 さ れます。 コンパイラは、 あたか も 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 を 選 択 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-17ID 100419Non-Confidential,


コンパイラのコマンドラインオプション使 用 法--asm のアクシ ョ ンおよび 生 成 された 逆 アセンブ リ フ ァ イルのフルネームは、使 用 さ れる オプシ ョ ンの 組 み 合 わせに よ っ て 異 な り ます。表 2-1 --asm オプシ ョ ン を 使 用 し た コ ンパイルコンパイラオプション--asm--asm -c--asm --interleave--asm --multifile--asm -o filenameアクションこ のオプシ ョ ン を 使 用 する と 、 コ ンパイルされた ソースの逆 アセンブ リ の リ ス ト がフ ァ イルに 書 き 込 まれます。-c オプシ ョ ンが 使 用 さ れない 場 合 、 リ ン ク 手 順 も 実 行 さ れます。逆 アセンブ リ は、 テキス ト フ ァ イルに 書 き 込 まれ、 フ ァ イル 名 には、 フ ァ イル 拡 張 子 .s が 付 け ら れた 入 力 フ ァ イル 名がデフ ォル ト で 使 用 されます。リ ン ク 手 順 が 実 行 されない 点 を 除 いて、 --asm と 同 じです。ソースコードが 逆 アセンブリ を 使 用 してインターリーブされる 点 を 除 いて、--asm と 同 じです。逆 アセンブ リ は、 テキス ト フ ァ イルに 書 き 込 まれ、 フ ァ イル 名 には、 フ ァ イル 拡 張 子 .txt が 付 け られた 入 力 フ ァ イル名 がデフ ォル ト で 使 用 さ れます。コンパイラによって、 メインファイルに 結 合 されたファイル 用 に 空 のオブジ ェ ク ト フ ァ イルが 生 成 さ れる 点 を 除 いて、--asm と 同 じです。オブジェ ク ト フ ァ イルの 名 前 が filename である 点 を 除 いて、--asmと 同 じです。逆 アセンブ リ は、 フ ァ イル filename.s に 書 き 込 まれます。オブジェク トファイルの 名 前 にファイル 拡 張 子 .s が 付 いていないこ と を 確 認 して 下 さい。 オブジェ ク ト フ ァ イルのフ ァイル 拡 張 子 が .s の 場 合 、 逆 アセンブ リ はオブジェ ク ト フ ァイルの 上 に 上 書 き されます。 これによって、 予 期 していなかった 結 果 が 生 じ る 場 合 があ り ます。関 連 項 目• 「-c」 (ページ 2-24)• 「--interleave」 (ページ 2-84)• 「--multifile, --no_multifile」 (ページ 2-103)• 「-o filename」 (ページ 2-106)2-18 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション• 「-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このオプショ ンは、 ビッグエンディアンメモリ を 使 用 して <strong>ARM</strong> プロセッサ用 の コー ド を 生 成 する よ う にコ ンパ イ ラ に 指 示 し ます。<strong>ARM</strong> アーキテクチャでは、 次 のビ ッ グエンディ アンモードが 定 義 されます。BE8 バイ ト インバリアン ト アドレシングモード (<strong>ARM</strong>v6 以 降 )。BE32 従 来 のビ ッ グエンデ ィ アンモー ド 。リンク 時 に BE8 と BE32 のどちらを 使 用 するかを 選 択 できます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-19ID 100419Non-Confidential,


コンパイラのコマンドラインオプションデフォルト--bigend を 明 示 的 に 指 定 し なかった 場 合 、 --littleend が 指 定 された と き と 同 じ処 理 を 実 行 します。関 連 項 目• 「--littleend」 (ページ 2-95)• 『デベロ ッ パガ イ ド 』 の 「エンデ ィ アンのサポー ト 」 (ページ 2-14)• 『リンカリファレンスガイド』 の 「--be8」 (ページ 2-5)• 『リンカリファレンスガイド』 の 「--be32」 (ページ 2-5)2.1.15 --bitbandこのオプションは、const 以 外 のすべてのグ ローバル 構 造 体 オブジ ェ ク ト をビットバンドします。 1 ワードのメモ リ をビッ トバンド 領 域 のシングルビッ トにマップでき ます。 これによ り、 メモリアーキテクチャの SRAM 領 域 と ペ リフ ェ ラル 領 域 にあ る シングルビ ッ ト 値 へのア ト ミ ッ ク ア ク セス を 効 率 化 で きます。メ モ リ ア ク セス 幅 に 依 存 するペ リ フ ェ ラ ルの 場 合 、 ビ ッ ト バン ド 構 造 体 のビットフィールドの char 型 、 short 型 、 および int 型 には、 エイ リ アス 空 間 に対 するバイ ト、 ハーフワード、 およびワードのス トアまたはロードがそれぞれ 生 成 さ れます。制 限次 の 使 用 制 限 があ り ます。• このオプションは struct 型 のみに 影 響 し ます。 共 用 体 型 、 ま たは 共 用 体をメンバとして 持 つその 他 の 集 合 型 はビットバンド 化 できません。• 構 造 体 の メ ンバは 個 別 にビ ッ ト バン ド 化 で き ません。• ビッ トバンドアクセスは、 シングルビッ トのビッ トフィールドにのみ 生成 されます。• ビットバンドアクセスは、const オブジェ ク ト 、 ポインタ、 およびローカルオブジェ ク ト には 生 成 されません。2-20 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション例例 2-1 (ページ 2-21) では、 ビ ッ ト フ ィールド i と k への 書 き 込 みは、--bitband コマンド ラインオプショ ンを 使 用 してコンパイルするとビッ トバンドされます。例 2-1 ビットバンドの 例typedef struct {int i : 1;int j : 2;int k : 1;} BB;BB value;void update_value(void){value.i = 1;value.k = 1;}関 連 項 目• 「__attribute__((bitband))」 (ページ 4-47)• 『コンパイ ラユーザガイ ド』 の 「ビ ッ ト バンディ ング」 (ページ 4-17)• 使 用 し てい る プ ロ セ ッ サの 『テ ク ニカル リ フ ァ レンスマニュアル』2.1.16 --brief_diagnostics, --no_brief_diagnosticsこ のオプシ ョ ン を 使 用 する と 、 コ ンパイ ラ に よ る 診 断 メ ッ セージの 短 縮 形 の出 力 を 有 効 ま たは 無 効 にで き ます。有 効 にする と 、 元 の ソース 行 は 表 示 さ れず、 1 行 に 収 ま ら ないエ ラー メ ッセージは 折 り 返 されません。デフォルトデフォル ト は --no_brief_diagnostics です。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-21ID 100419Non-Confidential,


コンパイラのコマンドラインオプション例/* main.c */#include int main(void){printf(" “Hello, world\n");return 0;}--brief_diagnostics を 使 用 してこのコード をコンパイルする と、 警 告 メ ッセージが 表 示 されます。関 連 項 目• 「--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)• 「--wrap_diagnostics, --no_wrap_diagnostics」 (ページ 2-153)• 『コンパイ ラユーザガイ ド』 の 第 6 章 診 断 メ ッ セージ2.1.17 --bss_threshold=numこのオプションを 使 用 すると、セクションでの 小 容 量 のグローバル ZI データ項 目 の 配 置 を 制 御 できます。 小 容 量 のグ ローバル ZI データ 項 目 は、 サイ ズが8 バイ ト 以 下 の 未 初 期 化 データ 項 目 です。2-22 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション構 文--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 が 指 定 されたと き と 同 じ 処 理 を 実 行 します。<strong>ARM</strong> Linux コンフィギュレーションファイルをコマンドラインで 指 定 して、--translate_gcc または --translate_g++ を 使 用 した 場 合 は、 --bss_threshold=0 を指 定 し た と き と 同 じ 処 理 が 実 行 さ れます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-23ID 100419Non-Confidential,


コンパイラのコマンドラインオプション例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)• 「--arm_linux_config_file=path」 (ページ 2-12)• 「--arm_linux_configure」 (ページ 2-13)• 「__attribute__((section("name")))」 (ページ 4-57)• 「__attribute__((zero_init))」 (ページ 4-61)2.1.18 -cこのオプションは、 コンパイル 手 順 を 実 行 して、 リンク 手 順 は 実 行 しないようにコンパイラに 指 示 します。注このオプションは、 大 文 字 の -C オプシ ョ ン とは 異 な り ます。使 用 法-c オプシ ョ ンは、 複 数 のソースフ ァ イルのプロジェ ク ト での 使 用 をお 勧 めします。関 連 項 目• 「--asm」 (ページ 2-17)• 「--list」 (ページ 2-92)• 「-o filename」 (ページ 2-106)• 「-S」 (ページ 2-127)2-24 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション2.1.19 -Cこ のオプシ ョ ンは、 プ リ プ ロ セ ッ サ 出 力 内 に コ メ ン ト を 残 すよ う に コ ンパイラに 指 示 します。このオプシ ョ ンを 選 択 する と、 オプシ ョ ン -E が 暗 黙 的 に 選 択 されます。注このオプショ ンは、 小 文 字 の -c オプシ ョ ン とは 異 な り ます。関 連 項 目• 「-E」 (ページ 2-58)2.1.20 --c90このオプションを 使 用 すると、 C90 ソースコードのコンパイルが 可 能 になります。デフォルトこ のオプシ ョ ンは、 接 尾 文 字 が .c、 .ac、 または .tc のファ イルに 対 して 暗 黙的 に 選 択 さ れます。注フ ァ イル 名 の 拡 張 子 .ac と .tc は 廃 止 されま し た。関 連 項 目• 「--c99」• 「--gnu」 (ページ 2-75)• 「--strict, --no_strict」 (ページ 2-133)• 「ソース 言 語 モード」 (ページ 1-3)• 『コンパイ ラユーザガイ ド』 の 「フ ァ イル 命 名 規 則 」 (ページ 2-14)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-25ID 100419Non-Confidential,


コンパイラのコマンドラインオプション2.1.21 --c99このオプションを 使 用 すると、 C99 ソースコードのコンパイルが 可 能 になります。関 連 項 目• 「--c90」 (ページ 2-25)• 「--gnu」 (ページ 2-75)• 「--strict, --no_strict」 (ページ 2-133)• 「ソース 言 語 モード」 (ページ 1-3)2.1.22 --code_gen, --no_code_genこのオプシ ョ ンを 使 用 する と、 オブジェ ク ト コード を 生 成 するかど う かを 指定 でき ます。オブジ ェ ク ト コー ド の 生 成 が 無 効 な 場 合 、 コ ンパイ ラ は、 構 文 のチェ ッ ク のみを 実 行 し、 オブジェ ク ト フ ァ イルを 作 成 し ません。デフォルトデフォル ト は --code_gen です。2.1.23 --compatible=nameこ のオプシ ョ ン を 使 用 する と 、 コ ンパ イ ラ に よ って 生 成 さ れた コー ド が 複 数のプ ロ セ ッ サま たはアーキテ ク チャ と 互 換 性 を 持 つよ う にな り ます。有 効 な 組 み 合 わせは 表 2-2 に 示 すとお り です。 グループ 1 の 任 意 のプロセ ッ サまたはアーキテクチャを、 グループ 2 の 任 意 のプロセ ッ サまたはアーキテ クチャ と 組 み 合 わせるこ とができます。表 2-2 互 換 性 のあるプロセ ッ サまたはアーキテ ク チ ャの 組 み 合 わせグループ 1グループ 2<strong>ARM</strong>7TDMI, 4TCortex-M1, Cortex-M3, 7-M, 6-M, 6S-M2-26 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション構 文--compatible=name各 パラ メ ータには 以 下 の 意 味 があ り ます。nameプロセッサまたはアーキテクチャの 名 前 、 または NONE です。 プロセ ッ サ 名 と アーキテ ク チャ 名 では、 大 文 字 と 小 文 字 は 区 別 さ れません。こ のオプシ ョ ンが コ マン ド ラ イ ンで 複 数 回 指 定 さ れた 場 合 は、最 後 に 指 定 されたオプシ ョ ンがそれよ り 前 のオプシ ョ ンをオーバーラ イ ド し ます。指 定 さ れた こ のオプシ ョ ン をすべて 無 効 にする には、 コ マン ドラインの 末 尾 で --compatible=NONE を 指 定 し ます。例armcc --cpu=arm7tdmi --compatible=cortex-m3 myprog.c関 連 項 目• 「--cpu=name」 (ページ 2-35)2.1.24 --compile_all_input, --no_compile_all_inputこ のオプシ ョ ン を 使 用 する と 、 フ ァ イル 拡 張 子 の 処 理 の 抑 制 を 有 効 ま たは 無効 にでき ます。有 効 の 場 合 には、 コ ンパイ ラ はフ ァ イル 拡 張 子 の 処 理 を 完 全 に 抑 止 し、 すべての 入 力 フ ァ イルを 接 尾 文 字 .c の 付 いた 入 力 フ ァ イル と し て 処 理 し ます。デフォルトデフォル ト は --no_compile_all_input です。関 連 項 目• 『コンパイ ラユーザガイ ド』 の 「フ ァ イル 命 名 規 則 」 (ページ 2-14)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-27ID 100419Non-Confidential,


コンパイラのコマンドラインオプション2.1.25 --configure_cpp_headers=pathこのオプションは、 <strong>ARM</strong> Linux と 共 用 する ために RVCT を 設 定 する 際 GNUlibstdc++ STL ヘッダファイルのパスを 指 定 します。構 文--configure_cpp_headers=path各 パ ラ メ ータには 以 下 の 意 味 があ り ます。pathGNU C++ STL ヘッダファイルへのパスです。使 用 法こ のオプシ ョ ンは、 自 動 検 出 さ れたすべてのパス をオーバーラ イ ド し ます。RVCT を <strong>ARM</strong> Linux と 共 に 使 用 で き る よ う に 設 定 する 際 の、 手 動 設 定 の 一 部として 使 用 できます。関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--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 theGNU <strong>Tools</strong> and Libraries』2-28 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション2.1.26 --configure_extra_includes=pathsこのオプショ ンは、 RVCT を <strong>ARM</strong> Linux と 共 に 使 用 できるように 設 定 する 際に、 追 加 のシ ス テム イ ン ク ルー ド パス を 指 定 し ます。構 文--configure_extra_includes=paths各 パラ メ ータには 以 下 の 意 味 があ り ます。paths追 加 のシ ス テム イ ン ク ルー ド パスの 場 所 を 示 すパス 名 を コ ンマで 区 切 った リ ス ト です。関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--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 theGNU <strong>Tools</strong> and Libraries』<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-29ID 100419Non-Confidential,


コンパイラのコマンドラインオプション2.1.27 --configure_extra_libraries=pathsこのオプションは、 RVCT を <strong>ARM</strong> Linux と 共 に 使 用 できるよ うに 設 定 する 際に、 追 加 のシステム ラ イブラ リ パス を 指 定 し ます。構 文--configure_extra_libraries=paths各 パ ラ メ ータには 以 下 の 意 味 があ り ます。paths追 加 のシステムラ イブラ リ パスの 場 所 を 示 すパス 名 をコンマで区 切 っ た リ ス ト です。関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--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 theGNU <strong>Tools</strong> and Libraries』2-30 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション2.1.28 --configure_gcc=pathこのオプショ ンは、 RVCT を <strong>ARM</strong> Linux と 共 に 使 用 できるように 設 定 する 際に、 GCC ド ラ イバの 場 所 を 指 定 し ます。構 文--configure_gcc=path各 パラ メ ータには 以 下 の 意 味 があ り ます。pathGCC ド ライバのパスとファイル 名 です。使 用 法コンフィギュレーション 時 に 指 定 された GCC ド ラ イバのデフ ォル ト の 場 所 をオーバーラ イ ドする 場 合 、 または --arm_linux_configure の 自 動 コ ンフ ィ ギ ュレーシ ョ ンでド ラ イバが 見 つからない 場 合 は、 このオプシ ョ ンを 使 用 します。関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--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 theGNU <strong>Tools</strong> and Libraries』<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-31ID 100419Non-Confidential,


コンパイラのコマンドラインオプション2.1.29 --configure_gld=pathこのオプションは、 GNU リンカ ld の 場 所 を 指 定 し ます。構 文--configure_gld=path各 パ ラ メ ータには 以 下 の 意 味 があ り ます。pathGNU リンカのパスとファイル 名 です。使 用 法コンフィギュレーション 時 、 GCC によって 使 用 される GNU リンカの 場 所 の特 定 が コ ンパ イ ラ に よ って 試 み ら れます。 コンパイラによってこの 場 所 を 特定 で き ない 場 合 、 ま たは GNU リンカの 通 常 のパスをオーバーライドする 必 要がある 場 合 は、--configure_gld=path オプシ ョ ン を 使 用 し て、 場 所 を 指 定 で き ます。 パスは、 GNU ld バイナリの 完 全 パスとファイル 名 になり ます。関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--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)2-32 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション• 『Application Note 212 - Building Linux applications using RVCT v4.0 and theGNU <strong>Tools</strong> and Libraries』2.1.30 --configure_sysroot=pathこのオプショ ンは、 RVCT を <strong>ARM</strong> Linux と 共 に 使 用 できるように 設 定 する 際に、 使 用 する シ ス テムルー ト パス を 指 定 し ます。構 文--configure_sysroot=pathpath は、 使 用 する シ ス テムルー ト パスです。使 用 法こ のオプシ ョ ンは、 自 動 検 出 さ れたすべてのシ ス テムルー ト パス をオーバーライドします。 RVCT を <strong>ARM</strong> Linux と 共 に 使 用 できるように 設 定 する 手 動 設定 の 一 環 と し て このオプシ ョ ンを 使 用 する と、 通 常 のシステムルー ト パス とは 異 な るパス を 指 定 でき ます。シ ス テムルー ト パス と は、 ラ イ ブ ラ リ と ヘ ッ ダ フ ァ イルが 通 常 保 存 さ れているベースパスのこ とです。 標 準 的 な Linux システムでは、 ファイルシステムのルー ト であ る 場 合 が 一 般 的 です。 クロスコンパイルの GNU ツールチェーンでは、 通 常 、 GNU C ライブラリがインストールされている 親 ディレクト リになります。 このディレク ト リには、 C ライブラリとヘッダファイルを 格 納 するlib、 usr/lib、 および usr/include の 各 サブデ ィ レ ク ト リ が 含 まれています。関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--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)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-33ID 100419Non-Confidential,


コンパイラのコマンドラインオプション• 「--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 theGNU <strong>Tools</strong> and Libraries』2.1.31 --cppこのオプションを 使 用 すると、 C++ ソースコードのコンパイルが 可 能 になります。デフォルトこ のオプシ ョ ンは、 接 尾 文 字 が .cpp、 .cxx、 .c++、 .cc、 または .CC のファ イルに 対 し て 暗 黙 的 に 選 択 さ れます。関 連 項 目• 「--anachronisms, --no_anachronisms」 (ページ 2-3)• 「--c90」 (ページ 2-25)• 「--c99」 (ページ 2-26)• 「--gnu」 (ページ 2-75)• 「--strict, --no_strict」 (ページ 2-133)• 「ソース 言 語 モード」 (ページ 1-3)2.1.32 --cpu=listこのオプションを 使 用 すると、--cpu=name オプシ ョ ン と 組 み 合 わせて 使 用 で きる、 サポート されているアーキテクチャ 名 とプロセッサ 名 が 一 覧 表 示 されます。関 連 項 目• 「--cpu=name」2-34 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション2.1.33 --cpu=nameこ のオプシ ョ ン を 使 用 する と 、 選 択 し た <strong>ARM</strong> プロセッサまたはアーキテクチャのコードを 生 成 できます。構 文--cpu=name各 パラ メ ータには 以 下 の 意 味 があ り ます。nameプロセッサまたはアーキテクチャの 名 前 です。name がプロセッサ 名 の 場 合 は、 <strong>ARM</strong>7TDMI, <strong>ARM</strong>1176JZ-S, MPCore など、<strong>ARM</strong> データシー ト に 記 載 されている とおり に 名 前 を 入 力 します。name がアーキテ ク チ ャ 名 の 場 合 は、 名 前 が 表 2-3 のアーキテクチャのリ ス トに 含 まれている 必 要 があり ます。プ ロ セ ッ サ 名 と アーキテ ク チ ャ 名 では、 大 文 字 と 小 文 字 は 区 別されません。ワイルドカード 文 字 は 使 用 できません。表 2-3 サポー ト されている <strong>ARM</strong> アーキテ ク チ ャ と プ ロセ ッ サの 例アーキテクチャ説 明プ ロセ ッ サの 例4 Thumb をサポー ト していない <strong>ARM</strong>v4 SA-11004T Thumb をサポート している <strong>ARM</strong>v4 <strong>ARM</strong>7TDMI、<strong>ARM</strong>9TDMI、<strong>ARM</strong>720T、<strong>ARM</strong>740T、<strong>ARM</strong>920T、<strong>ARM</strong>922T、<strong>ARM</strong>940T、 SC1005T5TE5TEJThumb およびインターワークをサポート している <strong>ARM</strong>v5Thumb、 インターワーク、DSP 乗 算 、 およびダブルワー ド 命 令 をサポー ト している <strong>ARM</strong>v5Thumb、 インターワーク、DSP 乗 算 、 ダブルワー ド 命 令 、 およびJazelle ® 拡 張 をサポー ト し てい る <strong>ARM</strong>v5 a<strong>ARM</strong>9E、<strong>ARM</strong>946E-S、<strong>ARM</strong>966E-S<strong>ARM</strong>926EJ-S、<strong>ARM</strong>1026EJ-S、 SC200<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-35ID 100419Non-Confidential,


コンパイラのコマンドラインオプション表 2-3 サポー ト されている <strong>ARM</strong> アーキテ ク チ ャ と プ ロセ ッ サの 例 ( 続 き )アーキテクチャ説 明プ ロセ ッ サの 例6 Thumb、 インターワーク、DSP 乗 算 、 ダブルワー ド 命 令 、 非 境 界整 列 、 混 合 エンデ ィ アン、 Jazelle 拡 張 、 および メ デ ィ ア 拡 張 をサポー ト している <strong>ARM</strong>v66-M Thumb のみ と プ ロ セ ッ サ 状 態 命 令 をサポー ト し てい る <strong>ARM</strong>v6 マイクロコントローラプロファイル<strong>ARM</strong>1136J-S、<strong>ARM</strong>1136JF-SOS 拡 張 機 能 な し のCortex-M16S-MThumb のみ と 、 プ ロ セ ッ サ 状 態 命 令 および OS 拡 張 をサポー ト している <strong>ARM</strong>v6 マイクロコン ト ローラプロファイルOS 拡 張 機 能 付 き のCortex-M16K SMP 拡 張 をサポー ト し てい る <strong>ARM</strong>v6 MPCore6T2 Thumb-2 をサポート している <strong>ARM</strong>v6 <strong>ARM</strong>1156T2-S、<strong>ARM</strong>1156T2F-S6Z Security Extensions をサポート している <strong>ARM</strong>v6 <strong>ARM</strong>1176JZF-S、<strong>ARM</strong>1176JZ-S7 Thumb-2 のみをサポー ト し、 ハード ウ ェ ア 除 算 をサポー ト し ていない <strong>ARM</strong>v77-A <strong>ARM</strong>、 Thumb-2、 および Thumb-2EE 命 令 セ ッ ト 、 DSP サポー ト 、および 32 ビッ ト SIMD のサポー ト を 装 備 し た 仮 想 MMU ベースメモリシステムをサポートする <strong>ARM</strong>v7 アプ リ ケーシ ョ ンプロファイル7-R <strong>ARM</strong>、 Thumb-2、 DSP サポー ト 、 および 32 ビッ ト SIMD サポートを 装 備 した <strong>ARM</strong>v7 リアルタイムプロファイル7-M Thumb-2 のみ と ハード ウ ェ ア 除 算 をサポー ト し ている <strong>ARM</strong>v7 マイクロコントローラプロファイルCortex-A8、 Cortex-A9Cortex-R4、 Cortex-R4FCortex-M3、 SC300a. <strong>ARM</strong> コンパイラは Java バイ ト コード を 生 成 でき ません。注<strong>ARM</strong>v7 は 実 際 の <strong>ARM</strong> アーキテクチャではあ り ません。 --cpu=7 は、<strong>ARM</strong>v7-A、 <strong>ARM</strong>v7-R、 および <strong>ARM</strong>v7-M アーキテ ク チ ャ のすべてに 共 通 する機 能 を 示 し ます。 当 然 、 --cpu=7 と 一 緒 に 使 用 される 機 能 は、 <strong>ARM</strong>v7-A、<strong>ARM</strong>v7-R、 <strong>ARM</strong>v7-M のすべてのアーキテ クチャ 上 に 存 在 し ます。2-36 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションデフォルト--cpu オプシ ョ ンを 指 定 しない 場 合 は、--cpu=<strong>ARM</strong>7TDMI が 想 定 されます。CPU アーキテ ク チ ャおよびプ ロ セ ッ サがすべて 記 載 さ れた 一 覧 を 表 示 するには、--cpu=list オプシ ョ ンを 使 用 し ます。使 用 法以 下 に、 プ ロ セ ッ サ と アーキテ ク チ ャ に 関 する オプシ ョ ンの 一 般 的 な 特 徴 を示 します。プロセッサ• プ ロ セ ッ サを 選 択 する と 、 適 切 なアーキテ ク チャ、 浮 動 小数 点 ユニ ッ ト (FPU)、 および メ モ リ 構 成 が 選 択 さ れます。• --cpu の 値 には、 現 時 点 でのすべての <strong>ARM</strong> 製 品 名 ま たはアーキテクチャバージ ョ ンを 指 定 でき ます。Marvell Feroceon や Intel XScale など、 他 の <strong>ARM</strong> アーキテクチ ャベースのプ ロ セ ッ サ も サポー ト さ れています。• --cpu オプシ ョ ンでプロセッサを 指 定 する と、 コンパイルされる コー ド はそのプ ロ セ ッ サ 用 に 最 適 化 さ れます。 このオプシ ョ ンによ り、 コンパイ ラは 特 定 のコプロセッサまたは命 令 ス ケジ ュー リ ングの 機 能 を 使 用 し て、 最 適 なパフ ォーマンスを 実 現 できます。アーキテクチャ• --cpu オプシ ョ ンでアーキテクチャ 名 を 指 定 する と、 コンパイルされたコードは、 そのアーキテクチャをサポート してい るすべてのプ ロ セ ッ サで 実 行 で き ます。 例 えば、--cpu=5TEを 指 定 する と 、 <strong>ARM</strong>926EJ-S ® で 使 用 できるコードが 生 成 されます。FPU• --cpu を 選 択 する と 、--fpu が 暗 黙 的 に 選 択 さ れる こ と があ ります。 例 えば、--arm オプシ ョ ン を 指 定 し て コ ンパ イ ルする場 合 、--cpu=<strong>ARM</strong>1136JF-S を 指 定 する と 暗 黙 的 に --fpu=vfpv2 が選 択 さ れます。 同 様 に、 --cpu=Cortex-R4F を 指 定 する と 、--fpu=vfpv3_d16 が 暗 黙 的 に 選 択 されます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-37ID 100419Non-Confidential,


コンパイラのコマンドラインオプション注暗 黙 的 な FPU は、 コマン ド ラ イ ンで --fpu によって 明 示 的に 指 定 された FPU によってオーバーライ ド されるこ とに 注意 して 下 さい。• --fpu オプシ ョ ン も --cpu オプシ ョ ンも 指 定 されていない 場合 には、--fpu=softvfp が 使 用 されます。<strong>ARM</strong> と Thumb• --cpu=<strong>ARM</strong>7TDMI などの Thumb 命 令 対 応 プ ロ セ ッ サま たはアーキテクチャを 指 定 しても、 <strong>ARM</strong> コンパイラは Thumb コードを 生 成 しません。 Long 乗 算 など、 使 用 さ れる プ ロ セ ッ サの 機 能 だけが 有 効 にな り ます。 プロセッサが Thumb 専 用 プロセッサ (Cortex-M3 など) でない 場 合 は、--thumb オプシ ョンを 使 用 して Thumb コードを 生 成 します。 こ の 場 合 、--thumb は 不 要 です。注ターゲッ ト プロセッサまたはアーキテクチャを 指 定 する と、他 の <strong>ARM</strong> プ ロ セ ッ サに 対 する オブジ ェ ク ト コー ド の 互 換性 が 失 われる こ と があ り ます。 例 えば、 アーキテ ク チ ャ<strong>ARM</strong>v6 用 にコ ンパイルされたコード に <strong>ARM</strong>v6 固 有 の 命 令が 含 まれてい る 場 合 、 その コー ド は <strong>ARM</strong>920T プロセッサでは 実 行 で き ない こ と があ り ます。 したがって、 目 的 に 応じ た 最 小 公 分 母 のプ ロ セ ッ サを 選 択 する 必 要 があ り ます。• <strong>ARM</strong>v4T または <strong>ARM</strong>v5T をサポートするプロセッサ 用 のコードをコンパイルしており、 そのコードを <strong>ARM</strong>/Thumb混 合 シ ス テムで 使 用 する 場 合 は、 イ ン ターワー ク オプシ ョンの --apcs=/interwork を 指 定 する 必 要 があ り ます。 <strong>ARM</strong>v5T以 降 をサポー ト する プ ロ セ ッ サでは、 デフ ォル ト で イ ンターワークオプシ ョ ンが 有 効 にな り ます。• コマンド ラインで --thumb オプシ ョ ンを 指 定 して Thumb 用にコンパイルすると、 コンパイラは 可 能 な 範 囲 で Thumb 命令 セ ッ ト を 使 用 し てコード を コ ンパイルし ます。 ただし、一 部 の コー ド は <strong>ARM</strong> コードにコンパイルされるこ とがあります。 例 えば、 Thumb-1 プロセッサ 用 のコードをコンパイルしており、 VFP を 使 用 し てい る 場 合 は、 浮 動 小 数 点 演算 を 含 むすべての 関 数 が <strong>ARM</strong> 用 にコ ンパイルされます。2-38 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション• --cpu=Cortex-M3 など、 <strong>ARM</strong>v7-M 用 のコード を コ ンパイルする 場 合 は、 <strong>ARM</strong>v7-M では Thumb-2 のみがサポー ト されているため、 コマンド ラインで --thumb を 指 定 する 必 要 はあ りません。制 約 条 件同 じ コマン ド ラ インでプロセッサと アーキテクチャの 両 方 を 指 定 する こ とはできません。関 連 項 目• 「--apcs=qualifer...qualifier」 (ページ 2-4)• 「--cpu=list」 (ページ 2-34)• 「--fpu=name」 (ページ 2-70)• 「--thumb」 (ページ 2-135)2.1.34 --create_pch=filenameこのオプショ ンは、 指 定 したファイル 名 でプリコンパイル (PCH) ファイルを 作 成 する よ う に コ ンパ イ ラ に 指 示 し ます。このオプショ ンは 他 のすべての PCH オプシ ョ ン よ り も 優 先 さ れます。構 文--create_pch=filename各 パラ メ ータには 以 下 の 意 味 があ り ます。filename作 成 さ れる PCH フ ァ イルの 名 前 を 指 定 し ます。関 連 項 目• 「--pch」 (ページ 2-113)• 「--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)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-39ID 100419Non-Confidential,


コンパイラのコマンドラインオプション• 『コンパイ ラユーザガイ ド』 の 「プ リ コ ンパイルヘッ ダフ ァ イル」(ページ 2-19)2.1.35 -Dname[(parm-list)][=def]このオプションではマクロ name が 定 義 されます。構 文-Dname[(parm-list)][=def]各 パ ラ メ ータには 以 下 の 意 味 があ り ます。nameparm-list定 義 する マ ク ロ の 名 前 です。コ ンマで 区 切 ら れたマ ク ロパ ラ メ ータ の リ ス ト を 指 定 で き ます( 省 略 可 )。 関 数 形 式 のマ ク ロは、 マ ク ロパ ラ メ ータ リ ス ト をマ クロ 名 に 追 加 する こ と で 定 義 で き ます。パ ラ メ ータ リ ス ト は 括 弧 で 囲 む 必 要 があ り ます。 複 数 のパ ラ メ ータを 指 定 する 場 合 は、 リストのコンマとパラメータ 名 の 間 にスペース を 入 れないで 下 さ い。注UNIX システムでは、 括 弧 をエスケープする 必 要 があり ます。=defオプシ ョ ンのマク ロ 定 義 です。=def が 省 略 さ れてい る 場 合 、 name を 1 と 定 義 します。ト ー ク ン と し て 認 識 さ れた 文 字 を コ マン ド ラ イ ンに 含 め る には、マク ロ 定 義 を 二 重 引 用 符 で 囲 みます。使 用 法-Dname を 指 定 したと きの 効 果 は、 各 ソースフ ァ イルの 冒 頭 にテキス ト #definename を 記 述 し た と き の 効 果 と 同 じ です。制 約 条 件コ ンパ イ ラ は 以 下 の 順 序 でマ ク ロ を 定 義 し た り 、 定 義 を 削 除 し た り し ます。1. コ ンパイ ラ の 定 義 済 みマ ク ロ2. -Dname を 使 用 して 明 示 的 に 定 義 されたマク ロ3. -Uname を 使 用 し て 明 示 的 に 定 義 が 削 除 さ れたマ ク ロ2-40 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション例コマンド ラインでオプショ ン-DMAX(X,Y)="((X > Y) ? X : Y)"を 指 定 する こ と は、 各 ソ ース フ ァ イ ルの 冒 頭 でマ ク ロ#define MAX(X, Y) ((X > Y) ? X : Y)を 定 義 する こ と と 同 じ 意 味 です。関 連 項 目• 「-C」 (ページ 2-25)• 「-E」 (ページ 2-58)• 「-Uname」 (ページ 2-141)• 「コ ンパイ ラ に よ る 事 前 定 義 」 (ページ 4-129)2.1.36 --data_reorder, --no_data_reorderこ のオプシ ョ ン を 使 用 する と 、 ト ッ プレベルのデータ 項 目 (グ ローバルデータ な ど) の 自 動 再 順 序 付 けを 行 う かど う かを 指 定 で き ます。コ ンパイ ラ は、 データ 項 目 間 の 無 駄 な 空 間 を 除 去 する こ と で、 メ モ リ を 節 約できます。 ただ し、 コ ンパイ ラ に よ るデータ の 順 序 付 けについて コー ド が 想定 を 誤 っている 場 合 は、--data_reorder によって 既 存 のコードが 壊 れるこ とがあります。ISO C 標 準 では、 データ の 順 序 が 保 証 さ れないため、 想 定 さ れた 順 序 に 依 存する コー ド の 記 述 を 避 け る 必 要 があ り ます。 データ の 順 序 付 けが 必 要 な 場 合は、 データ 項 目 を 構 造 化 し て 下 さ い。デフォルトデフォル ト は --data_reorder です。2.1.37 --debug, --no_debugこ のオプシ ョ ン を 使 用 する と 、 現 在 の コ ンパイル 用 のデバ ッ グテーブルを 生成 する かど う かを 指 定 で き ます。--debug が 使 用 されているかど う かにかかわらず、 コ ンパイ ラは 同 じ コード を生 成 し ます。 違 うのはデバッグテーブルが 存 在 することだけです。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-41ID 100419Non-Confidential,


コンパイラのコマンドラインオプションデフォルトデフォル ト は --no_debug です。--debug を 使 用 しても、 最 適 化 の 設 定 には 影 響 し ません。 デフォル ト では、--debug オプシ ョ ン を 単 独 で 使 用 する こ と は、 以 下 のオプシ ョ ン を 指 定 することと 同 じです。--debug --dwarf3 --debug_macros関 連 項 目• 「--debug_macros, --no_debug_macros」• 「--dwarf2」 (ページ 2-58)• 「--dwarf3」 (ページ 2-58)• 「-Onum」 (ページ 2-108)2.1.38 --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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション構 文--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.c2.1.40 --dep_name, --no_dep_nameこ のオプシ ョ ン を 使 用 する と 、 依 存 名 の 処 理 を 行 う かど う かを C++ で 指 定 できます。C++ 標 準 では、 以 下 の 場 合 にテンプレー ト 内 の 名 前 をル ッ ク ア ッ プする こ とが 定 義 されています。• 名 前 が 非 依 存 名 の 場 合 は、 テンプレー ト が 解 析 さ れる と き• 名 前 が 依 存 名 の 場 合 は、 テンプレー ト が 解 析 さ れる と き、 ま たはテンプレート のインスタンスが 生 成 される と きオプシ ョ ン --no_dep_name を 選 択 する と 、 イ ン ス タ ン スが 生 成 さ れる と き にのみ、 テンプレー ト の 依 存 名 がル ッ ク ア ッ プ さ れます。 つま り、 テンプレートが 解 析 さ れる と き の 依 存 名 のル ッ ク ア ッ プは 無 効 になっています。注オプシ ョ ン --no_dep_name は、 C++ 標 準 に 準 拠 し ていない 従 来 の ソ ース コー ドを 移 行 する 目 的 でのみ 提 供 さ れています。 他 の 目 的 で こ のオプシ ョ ンを 使 用する こ と はお 勧 めし ません。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-43ID 100419Non-Confidential,


コンパイラのコマンドラインオプションモードこ のオプシ ョ ンは、 ソ ース 言 語 が C++ の 場 合 にのみ 有 効 です。デフォルトデフォル ト は --dep_name です。制 約 条 件依 存 名 の 処 理 を イ ネーブルし た 場 合 は、 解 析 がデフ ォル ト で 実 行 さ れる ため、オプシ ョ ン --dep_name をオプシ ョ ン --no_parse_templates と 組 み 合 わせて 使 用するこ とはできません。エラーオプシ ョ ン --dep_name とオプション --no_parse_templates を 組 み 合 わせて 使 用する と、 コンパイ ラによってエラーが 生 成 されます。関 連 項 目• 「--parse_templates, --no_parse_templates」 (ページ 2-112)• 「テンプレー ト のイ ンス タ ンス 生 成 」 (ページ 5-17)2.1.41 --depend=filenameこのオプシ ョ ンは、 コンパイル 中 、 ファイルにメークファイル 用 の 依 存 関 係行 を 書 き 込 むよ う にコンパイ ラに 指 示 し ます。構 文--depend=filename各 パ ラ メ ータには 以 下 の 意 味 があ り ます。filename出 力 する 依 存 関 係 フ ァ イルの 名 前 です。制 約 条 件コマンド ラインで 複 数 のソースファイルを 指 定 した 場 合 は、--depend オプシ ョンは 無 視 されます。 こ の 場 合 、 依 存 関 係 フ ァ イルは 生 成 さ れません。2-44 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション使 用 法この 出 力 ファイルは、 make ユーテ ィ リ テ ィ での 使 用 に 適 し ています。 出 力 形式 を 変 更 し、 UNIX の make ユーテ ィ リ テ ィ と の 互 換 性 を 確 保 するには、--depend_format を 使 用 し ます。関 連 項 目• 「--depend_format=string」• 「--depend_system_headers, --no_depend_system_headers」(ページ 2-47)• 「--depend_target=target」 (ページ 2-48)• 「--ignore_missing_headers」 (ページ 2-80)• 「--list」 (ページ 2-92)• 「-M」 (ページ 2-99)• 「--md」 (ページ 2-100)• 「--phony_targets」 (ページ 2-116)2.1.42 --depend_format=stringこのオプショ ンによ り、 UNIX の 一 部 の make プ ロ グ ラ ム と の 互 換 性 を 確 保 する ために、 出 力 に 依 存 する フ ァ イルの 形 式 が 変 更 さ れます。構 文--depend_format=stringstring には 以 下 のいずれかを 指 定 で き ます。unixunix_escapedunix_quotedUNIX 形 式 のパス 区 切 り 文 字 を 使 用 し て 依 存 関 係 フ ァ イ ルエン ト リ を 生 成 します。動 作 は unix と 同 じですが、 スペースを \ でエスケープし ます。動 作 は unix と 同 じ ですが、 パス 名 を 二 重 引 用 符 で 囲 みます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-45ID 100419Non-Confidential,


コンパイラのコマンドラインオプション使 用 法unixunix_escapedunix_quotedWindows システムでは、--depend_format=unix を 使 用 する とき、 UNIX 形 式 のパス 名 を 使 用 する 必 要 があ り ます。 つまり、 UNIX 形 式 のパスの 区 切 子 の 記 号 / が \ の 代 わ り に 使用 されます。UNIX システムでは、--depend_format=unix を 使 用 しても、変 化 はあ り ません。Windows システムでは、--depend_format=unix_escaped を 使用 する と き、 UNIX 形 式 のパス 名 を 使 用 する 必 要 があ り 、スペースが \ でエスケープされます。UNIX システムでは、--depend_format=unix_escaped を 使 用 するとき、 スペースが \ でエスケープされます。Windows システムでは、--depend_format=unix_quoted を 使 用する と き、 UNIX 形 式 のパス 名 を 使 用 する 必 要 があ り 、 パス 名 が "" で 囲 まれます。UNIX システムでは、--depend_format=unix_quoted を 使 用 するとき、パス 名 が "" で 囲 まれます。デフォルト--depend_format オプシ ョ ン を 指 定 し ない 場 合 、 出 力 に 依 存 する フ ァ イルの 形式 は、 使 用 し ているオペレーテ ィ ングシ ステムによ って 異 な り ます。WindowsUNIXWindows システムでは、 状 況 に 応 じて、 デフォルトでWindows 形 式 のパス ま たは 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションmain.axf: main.cmain.axf: ../include/header\ files/common.h関 連 項 目• 「--depend=filename」 (ページ 2-44)• 「--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)2.1.43 --depend_system_headers, --no_depend_system_headersこのオプションを 使 用 すると、-M オプシ ョ ンまたは --md オプシ ョ ン を 使 用 して メ ー ク フ ァ イルの 依 存 関 係 情 報 を 生 成 する 際 に、 シ ス テムの 出 力 に 依 存 関係 行 を 含 め る かど う かを 指 定 で き ます。デフォルトデフォル ト は --depend_system_headers です。例/* hello.c */#include 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<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-47ID 100419Non-Confidential,


コンパイラのコマンドラインオプション関 連 項 目• 「--depend=filename」 (ページ 2-44)• 「--depend_format=string」 (ページ 2-45)• 「--depend_target=target」• 「--ignore_missing_headers」 (ページ 2-80)• 「-M」 (ページ 2-99)• 「--md」 (ページ 2-100)• 「--phony_targets」 (ページ 2-116)2.1.44 --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)• 「--ignore_missing_headers」 (ページ 2-80)• 「-M」 (ページ 2-99)• 「--md」 (ページ 2-100)• 「--phony_targets」 (ページ 2-116)2-48 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション2.1.45 --device=listこのオプションを 使 用 すると、--device=name オプシ ョ ン と 一 緒 に 使 用 可 能 なサポー ト さ れてい るデバ イ ス 名 が 一 覧 にな り ます。関 連 項 目• 「--device=name」2.1.46 --device=nameこのオプショ ンによ り、 特 定 のマイクロコン ト ローラまたは SoC(System-on-Chip) デバイスのコードをコンパイルできます。構 文--device=name各 パラ メ ータには 以 下 の 意 味 があ り ます。nameターゲッ ト マイ ク ロコン ト ローラまたは SoC デバイ スの 名 前 です。使 用 法特 定 のデバイ ス 名 を 指 定 する と 、 そのデバ イ スが 対 応 する CPU からデフォルト のエンデ ィ アン 方 式 と 浮 動 小 数 点 アーキテ ク チ ャ を 継 承 し ます。 --bi、--li、および --fpu の 各 オプシ ョ ン を 使 用 する と 、 エンデ ィ アン 方 式 と ターゲ ッ ト 浮動 小 数 点 アーキテ ク チ ャ のデフ ォル ト 設 定 を 変 更 で き ます。関 連 項 目• 「--bigend」 (ページ 2-19)• 「--device=list」• 「--fpu=name」 (ページ 2-70)• 「--littleend」 (ページ 2-95)• 『リンカリファレンスガイド』 の 「--device=list」 (ページ 2-16)• 『リンカリファレンスガイド』 の 「--device=name」 (ページ 2-16)• 『アセンブラガイ ド』 の 「C プ リ プ ロ セ ッ サを 使 用 する」 (ページ 3-51)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-49ID 100419Non-Confidential,


コンパイラのコマンドラインオプション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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション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)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-51ID 100419Non-Confidential,


コンパイラのコマンドラインオプション2.1.49 --diag_style={arm|ide|gnu}こ のオプシ ョ ン を 使 用 する と 、 診 断 メ ッ セージの 表 示 に 使 用 する 形 式 を 指 定できます。構 文--diag_style=stringstring には 以 下 のいずれかを 指 定 で き ます。armidegnu<strong>ARM</strong> コンパイ ラの 形 式 を 使 用 して メ ッセージを 表 示 し ます。エ ラーのあ る 行 の 行 番 号 と 文 字 数 を 表 示 し ます。 これらの 値 は 括弧 に 囲 まれて 表 示 さ れます。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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション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 を 指 定 する と 、 最 適 化 メ ッ セージが 非 表 示 になります。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-53ID 100419Non-Confidential,


コンパイラのコマンドラインオプション注重 大 度 が 注 釈 の 最 適 化 メ ッ セージを 表 示 するには、 --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)• 「--diag_warning=optimizations」 (ページ 2-55)• 「-Onum」 (ページ 2-108)• 「-Otime」 (ページ 2-111)• 「--remarks」 (ページ 2-124)2.1.52 --diag_warning=tag[,tag,...]こ のオプシ ョ ン を 使 用 し て、 指 定 さ れた タ グ を 含 む 診 断 メ ッ セージの 重 大 度を 警 告 に 設 定 できます。--diag_warning オプシ ョ ンの 動 作 は、 コ ンパイ ラ が 指 定 さ れた タ グ を 含 む 診 断メ ッ セージの 重 大 度 をエ ラーではな く 、 警 告 に 設 定 する 点 を 除 いて、--diag_errors に 似 ています。2-54 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション注このオプショ ンには #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;<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-55ID 100419Non-Confidential,


コンパイラのコマンドラインオプション}while (n > 0)result *= n--;return result;--vectorize --cpu=Cortex-A8 -O3 -Otime --diag_warning=optimizations オプシ ョ ンを使 用 し て こ の コー ド を コ ンパ イ ルする と 、 最 適 化 の 警 告 メ ッ セージが 表 示 されます。関 連 項 目• 「--diag_suppress=optimizations」 (ページ 2-53)• 「--diag_warning=tag[,tag,...]」 (ページ 2-54)• 「-Onum」 (ページ 2-108)• 「-Otime」 (ページ 2-111)2.1.54 --dllexport_all, --no_dllexport_allこのオプションを 使 用 すると、 DLL の 作 成 時 にシンボルを 表 示 する かど う かを 制 御 できます。デフォルトデフォル ト は --no_dllexport_all です。使 用 法オプシ ョ ン --dllexport_all は、 すべての extern 定 義 を __declspec(dllexport) とし てマー クする と き に 使 用 し ます。関 連 項 目• 「--apcs=qualifer...qualifier」 (ページ 2-4)• 「__declspec(dllexport)」 (ページ 4-27)2.1.55 --dllimport_runtime, --no_dllimport_runtimeこのオプションを 使 用 すると、 ランタイムライブラリを 共 有 ライブラリとして 使 用 したときにシンボルを 表 示 するかど うかを 制 御 できます。デフォルトデフォル ト は --no_dllimport_runtime です。2-56 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション使 用 法以 下 をマークする と きは、 オプシ ョ ン --dllimport_runtime を 使 用 し ます。• すべての 組 み 込 みシンボルを __declspec(dllimport) としてマークするとき• cpprt ランタイムライブラ リでインポート 用 に 生 成 されたランタイム 型情 報 (RTTI)• 最 適 化 さ れた printf() 関 数 と __hardfp_ 関 数 を イ ンポー ト 対 象 と し てマークする と き ( 元 の 関 数 が __declspec(dllimport) としてマークされてい る 場 合 )関 連 項 目• 「--guiding_decls, --no_guiding_decls」 (ページ 2-77)• 「--rtti, --no_rtti」 (ページ 2-126)• 「__declspec(dllimport)」 (ページ 4-30)2.1.56 --dollar, --no_dollarこのオプシ ョ ンは、 識 別 子 でのドル 記 号 $ の 使 用 を 許 可 または 拒 否 する よ うにコンパイラに 指 示 します。デフォルトオプシ ョ ン --strict が 指 定 されていない 限 り 、 デフ ォル ト は --dollar です。オプシ ョ ン --strict が 指 定 されている 場 合 、 デフ ォル ト は --no_dollar にな ります。関 連 項 目• 「 識 別 子 内 の ド ル 記 号 」 (ページ 3-14)• 「--strict, --no_strict」 (ページ 2-133)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-57ID 100419Non-Confidential,


コンパイラのコマンドラインオプション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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション例armcc -E source.c > raw.c関 連 項 目• 「-C」 (ページ 2-25)• 「-o filename」 (ページ 2-106)2.1.60 --emit_frame_directives, --no_emit_frame_directivesこのオプショ ンは、 DWARF FRAME デ ィ レ ク テ ィ ブを 逆 アセンブ リ 出 力 に 配 置するよ う コンパイラに 指 示 します。デフォルトデフォル ト は --no_emit_frame_directives です。例armcc --asm --emit_frame_directives foo.carmcc -S emit_frame_directives foo.c関 連 項 目• 「--asm」 (ページ 2-17)• 「-S」 (ページ 2-127)• 『アセンブラガイ ド』 の 「フ レームデ ィ レ ク テ ィ ブの 使 用 」 (ページ2-56)2.1.61 --enum_is_intこ のオプシ ョ ン を 使 用 する と 、 すべての 列 挙 型 のサ イ ズを 4 バイ ト 以 上 にすることができます。このオプショ ンは、 デフォルトでは 無 効 になっており、 すべての 列 挙 子 の 値を 保 持 で き る 最 小 のデータ 型 が 使 用 さ れます。<strong>ARM</strong> Linux コンフィギュレーションファイルをコマンドラインで 指 定 した 場合 、 こ のオプシ ョ ンはデフ ォル ト でオンにな り ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-59ID 100419Non-Confidential,


コンパイラのコマンドラインオプション注--enum_is_int オプシ ョ ン を 一 般 的 な 用 途 に 使 用 する こ と はお 勧 め し ません。関 連 項 目• 「--arm_linux_config_file=path」 (ページ 2-12)• 「--arm_linux_configure」 (ページ 2-13)• 「--interface_enums_are_32_bit」 (ページ 2-83)2.1.62 --errors=filenameこ のオプシ ョ ン を 使 用 する と 、 診 断 メ ッ セージの 出 力 を、 stderr か ら 指 定 されたエラーフ ァ イルに 転 送 でき ます。構 文--errors=filename各 パ ラ メ ータには 以 下 の 意 味 があ り ます。filenameエ ラーが 転 送 さ れる フ ァ イルの 名 前 です。間 違 ったオプション 名 を 入 力 した 場 合 など、 コマンドオプションの 問 題 に 関連 する 診 断 は 転 送 さ れません。 ただ し、 オプシ ョ ンに 無 効 な 引 数 を 指 定 し た場 合 (--cpu=999 など)、 関 連 する 診 断 は 指 定 さ れたフ ァ イル filename に 転 送 されます。関 連 項 目• 「--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)• 「--remarks」 (ページ 2-124)• 「-W」 (ページ 2-149)• 「--wrap_diagnostics, --no_wrap_diagnostics」 (ページ 2-153)• 『コンパイ ラユーザガイ ド』 の 第 6 章 診 断 メ ッ セージ2-60 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション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 です。 ただし、<strong>ARM</strong> Linux コンフィギュレーションファイルをコマンドラインで 指 定 して、--translate_g++ を 使 用 し た 場 合 、 デフォルトは --exceptions にな り ます。関 連 項 目• 「--arm_linux_config_file=path」 (ページ 2-12)• 「--arm_linux_configure」 (ページ 2-13)• 「--exceptions_unwind, --no_exceptions_unwind」2.1.64 --exceptions_unwind, --no_exceptions_unwindこ のオプシ ョ ン を 指 定 する と 、 例 外 に 対 応 し た コー ド に 対 し て 関 数 の 展 開 を有 効 ま たは 無 効 にで き ます。 このオプショ ンは、--exceptions が 有 効 な 場 合 にのみ 有 効 です。--no_exceptions_unwind および --exceptions を 使 用 する と、 例 外 は、 コンパイルされた 関 数 に 伝 播 されません。 代 わりに、std::terminate が 呼 び 出 さ れます。デフォルトデフォル ト は --exceptions_unwind です。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-61ID 100419Non-Confidential,


コンパイラのコマンドラインオプション関 連 項 目• 「--exceptions, --no_exceptions」 (ページ 2-61)• 「 実 行 時 に 展 開 さ れる 関 数 」 (ページ 5-21)2.1.65 --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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション使 用 法オプシ ョ ン --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)• 「--strict_warnings」 (ページ 2-134)• 「 定 数 式 」 (ページ 3-10)2.1.68 --feedback=filenameこ のオプシ ョ ン を 使 用 する と 、 未 使 用 の 関 数 を 効 率 的 に 削 除 で き る だけでなく、 <strong>ARM</strong>v4T アーキテクチャでは、 インターワークに 必 要 なコンパイルを 削減 する こ と も で き ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-63ID 100419Non-Confidential,


コンパイラのコマンドラインオプション構 文--feedback=filename各 パ ラ メ ータには 以 下 の 意 味 があ り ます。filename<strong>ARM</strong> リンカの 前 回 の 実 行 で 作 成 されたフィードバックファイルです。使 用 法同 じ フ ィ ー ド バ ッ ク フ ァ イルを 使 用 し て コ ンパイルを 複 数 回 実 行 で き ます。コ ンパ イ ラ に よ って、 フ ィ ー ド バ ッ ク フ ァ イ ルで 特 定 さ れた 未 使 用 の 関 数 は、対 応 するオブジェ ク ト フ ァ イル 内 の 各 関 数 独 自 の ELF セクションに 配 置 されます。フ ィ ー ド バ ッ ク フ ァ イルには、 前 回 のビル ド に 関 する 情 報 が 含 まれています。その 理 由 は 以 下 のとおり です。• フ ィ ー ド バ ッ ク フ ァ イルは、 情 報 が 古 い 場 合 があ り ます。 例 えば、 未 使用 であ る と 識 別 された 関 数 が 現 在 のソース コード で 使 用 されている 場 合があ り ます。 未 使 用 の 関 数 の コー ド は、 現 在 の ソース コー ド で 使 用 さ れていない 場 合 のみ、 リ ン カに よ っ て 削 除 さ れます。注— こ のため、 リ ン カ フ ィ ー ド バ ッ ク を 使 用 し て 未 使 用 の 関 数 を 削 除する こ と は 安 全 な 最 適 化 ですが、 コー ド サ イ ズにはあ ま り 影 響 を及 ぼ さ ない 場 合 があ り ます。— イ ン ターワー ク に 必 要 な コ ンパ イルを 削 減 する 場 合 の 使 用 要 件 は、未 使 用 の 関 数 を 削 除 する 場 合 の 要 件 よ り 厳 格 です。 インターワークに 必 要 な コ ンパ イ ルを 削 減 する 場 合 は、 フ ィ ー ド バ ッ ク フ ァ イルをその 生 成 元 であ る ソ ース コー ド に 合 わせて、 常 に 最 新 の 状 態 に保 つ こ と が 重 要 と な り ます。• リンカのフィードバックを 最 大 限 に 活 用 するには、 完 全 なコンパイルとリンクを 2 回 以 上 実 行 する 必 要 があ り ます。 ただし、 通 常 は、 前 回 のビルド 時 のフィードバックを 使 用 して 1 回 コンパイルして リ ンクすれば 十分 です。2-64 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション関 連 項 目• 「--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);<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-65ID 100419Non-Confidential,


コンパイラのコマンドラインオプション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)• 「--inline, --no_inline」 (ページ 2-83)• 「__forceinline」 (ページ 4-7)• 「__inline」 (ページ 4-10)• 『コンパイ ラユーザガイ ド』 の 「インライン 展 開 の 管 理 」 (ページ 5-22)2-66 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション2.1.71 --fp16_format=formatこ のオプシ ョ ン を 使 用 する と 、 半 精 度 浮 動 小 数 点 数 を VFPv3 アーキテクチャのオプシ ョ ンの 拡 張 機 能 と し て 使 用 で き ます。 形 式 が 指 定 さ れていない 場 合は、 __fp16 データ 型 を 使 用 する と エ ラーにな り ます。構 文--fp16_format=formatformat には 以 下 のいずれかを 指 定 で き ます。alternativeieee範 囲 は 拡 大 さ れますが、 NaN 値 や 無 限 大 値 は 持 たない ieee の 代替 です。IEEE 754 標 準 の リ ビジ ョ ンであ る IEEE 754r によって 定 義 された、 半 精 度 2 進 浮 動 小 数 点 形 式 です。none これがデフ ォル ト の 設 定 です。 形 式 を 指 定 しないこ とに 相 当 し、__fp16 データ 型 を 使 用 する と エ ラーにな る こ と を 意 味 し ます。関 連 項 目• 「コ ンパイ ラ 組 み 込 み 関 数 」 (ページ E-5)• 『コンパイ ラユーザガイ ド』 の 「 半 精 度 浮 動 小 数 点 数 のサポー ト 」(ページ 5-41)2.1.72 --fpmode=modelこ のオプシ ョ ン を 使 用 し て、 浮 動 小 数 点 適 合 性 を 指 定 し、 ラ イ ブ ラ リ の 属 性と 浮 動 小 数 点 の 最 適 化 を 設 定 で き ます。構 文--fpmode=modelmodel は 以 下 のいずれかです。ieee_full IEEE 標 準 で 保 証 さ れてい るすべての 機 能 、 演 算 、 および 表 現 を、単 精 度 および 倍 精 度 で 使 用 で き ます。 演 算 モー ド は、 実 行 時 に 動的 に 選 択 で き ます。このオプショ ンでは 以 下 のシンボルが 定 義 されます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-67ID 100419Non-Confidential,


コンパイラのコマンドラインオプション__FP_IEEE__FP_FENV_EXCEPTIONS__FP_FENV_ROUNDING__FP_INEXACT_EXCEPTIONieee_fixed最 も 近 い 値 に 丸 め、 不 正 確 な 例 外 の 発 生 を 報 告 し ない IEEE 標準 。このオプションでは 以 下 のシンボルが 定 義 されます。__FP_IEEE__FP_FENV_EXCEPTIONSieee_no_fenv最 も 近 い 値 に 丸 め、 例 外 を 発 生 させない IEEE 標 準 。 このモードはステート レスであ り、 Java の 浮 動 小 数 点 算 術 モデル と 互 換 性があ り ます。このオプションではシンボル __FP_IEEE が 定 義 されます。stdfast0 にフ ラ ッ シ ュ さ れる 非 正 規 化 数 があ り 、 最 も 近 い 値 に 丸 め、 例外 の 発 生 を 報 告 し ない IEEE 有 限 値 。 標 準 C および C++ との 互 換性 があ り ます。 これがデフ ォル ト です。通 常 の 有 限 値 は、 IEEE 標 準 に よ っ て 予 測 さ れます。 ただし、 以下 のよ う な 例 外 も あ り ます。• IEEE モデルに よ って 定 義 さ れてい るすべての 状 況 で NaNと 無 限 値 が 生 成 さ れる と は 限 り ません。 また、 それらが 生成 さ れる 場 合 、 異 な る 符 号 が 使 用 さ れる 可 能 性 があ り ます。• 0 の 符 号 は IEEE モデルによ って 予 測 される 符 号 と 異 なる 可能 性 があ り ます。強 力 な 浮 動 小 数 点 の 最 適 化 を 実 行 し ます。 大 幅 なパフ ォーマンス 向 上 と 引 き 換 えに、 精 度 がやや 落 ち る 可 能 性 があ り ます。 このオプシ ョ ンではシンボル __FP_FAST が 定 義 されます。このオプションを 選 択 すると、ISO C および C++ 標 準 には 完 全 に準 拠 し ない 動 作 と な り ます。 ただ し、 数 値 的 に 頑 健 な 浮 動 小 数 点プログラムは 正 し く 動 作 します。以 下 の よ う な 多 く の 変 換 が 実 行 さ れる 場 合 があ り ます。• すべての 浮 動 小 数 点 引 数 を 単 精 度 数 値 と し て 正 確 に 表 現 でき、 その 結 果 が 即 座 に 単 精 度 数 値 に 変 換 さ れる 場 合 、 倍 精度 数 学 関 数 は 単 精 度 数 学 関 数 に 変 換 さ れる 可 能 性 があ り ます。2-68 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションこ の 変 換 は、 選 択 し た ラ イ ブ ラ リ に 単 精 度 数 学 関 数 が 含 まれてい る 場 合 ( 選 択 し た ラ イ ブ ラ リ が 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 にある 『<strong>ARM</strong> ApplicationNote 133 - Using VFP with RVDS』2.1.73 --fpu=listこのオプションを 使 用 すると、--fpu=name オプシ ョ ン と 組 み 合 わせて 使 用 できる、 サポート されている FPU アーキテ ク チャ 名 が 一 覧 表 示 さ れます。非 推 奨 オプシ ョ ンは 表 示 さ れません。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-69ID 100419Non-Confidential,


コンパイラのコマンドラインオプション関 連 項 目• 「--fpu=name」2.1.74 --fpu=nameこのオプションを 使 用 すると、 ターゲッ トの FPU アーキテクチャを 指 定 できます。こ のオプシ ョ ン を 指 定 し た 場 合 、 コ マン ド ラ イ ンの 暗 黙 的 な FPU オプシ ョ ン(--cpu オプシ ョ ンな ど を 指 定 し た 場 合 な ど) がオーバーラ イ ド さ れます。FPU アーキテ ク チ ャ がすべて 記 載 さ れた 一 覧 を 表 示 する には、--fpu=list オプシ ョ ン を 使 用 し ます。構 文--fpu=namename には 以 下 のいずれかを 指 定 で き ます。nonevfpvvfpv2浮 動 小 数 点 オプシ ョ ンが 使 用 さ れない こ と を 示 し ます。 このオプシ ョ ン を 指 定 する と 、 浮 動 小 数 点 コー ド は 使 用 で き ません。 コードに float 型 が 含 まれている と、 エラーが 生 成 されます。これは vfpv2 と 同 じ 意 味 です。アーキテクチャ VFPv2 に 適 合 する、 ハー ド ウ ェ アのベク タ 浮 動小 数 点 ユニ ッ ト を 選 択 し ます。注コマンド ラインで armcc --thumb --fpu=vfpv2 を 指 定 する と 、 コ ンパイラはできる 限 り Thumb 命 令 セ ッ ト を 使 用 し て コー ド を コ ンパイルし ますが、 浮 動 小 数 点 に 深 く 依 存 し た 関 数 は <strong>ARM</strong> コードにコンパイルされます。 こ の 場 合 、 事 前 定 義 さ れた __thumb は 無効 にな り ます。<strong>ARM</strong> C コードにおいて、vfp または vfpv2 を --arm オプシ ョ ン と 組み 合 わせて 使 用 する 場 合 には、 イ ン ターワー ク する <strong>ARM</strong> コードが コ ンパイル さ れ ソ フ ト ウ ェ ア 浮 動 小 数 点 リ ンケージを 使 用 するように、__softfp キーワー ド を 指 定 する 必 要 があ り ます。2-70 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションvfpv3vfpv3_fp16vfpv3_d16アーキテクチャ VFPv3 に 適 合 する、 ハード ウ ェ アのベク タ 浮 動小 数 点 ユニ ッ ト を 選 択 し ます。 VFPv3 は、 浮 動 小 数 点 の 例 外 を トラップできない 点 を 除 いて、VFPv2 と 下 位 互 換 性 があ り ます。vpfv3 は <strong>RealView</strong> Development Suite 3.0 以 降 でのみ 使 用 で き ます。半 精 度 拡 張 機 能 も 備 えたアーキテ ク チャ VFPv3 互 換 のハー ドウ ェ アのベ ク タ 浮 動 小 数 点 ユニ ッ ト を 選 択 し ます。vfpv3_d16_fp16は、 <strong>RealView</strong> Development Suite 4.0 以 降 でのみ 使 用 で き ます。アーキテクチャ VFPv3-D16 に 適 合 する、 ハー ド ウ ェ アのベク タ浮 動 小 数 点 ユニ ッ ト を 選 択 し ます。 vfpv3_d16 は、 <strong>RealView</strong>Development Suite 4.0 以 降 でのみ 使 用 で き ます。vfpv3_d16_fp16半 精 度 拡 張 機 能 も 備 えたアーキテ ク チャ VFPv3-D16 に 適 合 する、ハー ド ウ ェ アのベ ク タ 浮 動 小 数 点 ユニ ッ ト を 選 択 し ます。vfpv3_d16_fp16 は、 <strong>RealView</strong> Development Suite 4.0 以 降 でのみ 使 用できます。softvfpソ フ ト ウ ェ アの 浮 動 小 数 点 ラ イ ブ ラ リ fplib を 選 択 し ます。 --fpuオプシ ョ ンが 指 定 されていない 場 合 、 または FPU を 備 えていない CPU を 選 択 した 場 合 は、 これがデフォル ト にな り ます。RVCT の 以 前 の リ リ ースでは、--fpu=softvfp と 暗 黙 的 な VFP ハードウェアを 備 えた CPU を 指 定 し た 場 合 、 リ ンカは VFP 命 令 を 使用 する ソ フ ト ウ ェ ア 浮 動 小 数 点 呼 び 出 し を 実 装 し た ラ イ ブ ラ リを 選 択 していま した。 現 在 は、 こ の 動 作 は 行 われません。 この 以前 の 動 作 が 必 要 な 場 合 は、--fpu=softvfp+vfp を 使 用 します。softvfp+vfpv2VFPv2 命 令 を 使 用 で き る ソ フ ト ウ ェ ア 浮 動 小 数 点 リ ンケージが含 まれた 浮 動 小 数 点 ラ イ ブ ラ リ を 選 択 し ます。 VFP ユニッ ト を 実装 する シ ス テムで <strong>ARM</strong> コードを Thumb コード と インターワーク させる 場 合 は、 こ のオプシ ョ ン を 選 択 し ます。こ のオプシ ョ ン を 設 定 し た 場 合 、 以 下 の よ う にな り ます。• --thumb オプシ ョ ン を 使 用 し て コ ンパ イ ルを 実 行 する と 、VFP 命 令 を 使 用 する 浮 動 小 数 点 ラ イ ブ ラ リ に リ ン ク さ れる点 を 除 き、--fpu=softvfp を 指 定 した 場 合 と まったく 同 じよ うに 動 作 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-71ID 100419Non-Confidential,


コンパイラのコマンドラインオプション• --arm オプシ ョ ン を 使 用 し て コ ンパイルを 実 行 する と 、 すべての 関 数 に ソ フ ト ウ ェ ア 浮 動 小 数 点 リ ンケージが 用 い ら れる 点 を 除 き、--fpu=vfpv2 を 指 定 した 場 合 と 同 じよ うに 動 作 します。 したがって、 このオプションを 使 用 してコンパイルされた <strong>ARM</strong> 関 数 は、--fpu=softvfp を 指 定 した 場 合 と 同 じ 方法 で 浮 動 小 数 点 引 数 と 結 果 を 受 け 渡 し ますが、 内 部 ではVFP 命 令 が 使 用 さ れます。注C コードにおいて、 softvfp+vfpv2 を --arm または --thumb オプシ ョン と 組 み 合 わせて 使 用 する と 、 イ ン ターワー ク する 浮 動 小 数 点コー ド が ソ フ ト ウ ェ ア 浮 動 小 数 点 リ ンケージを 使 用 する よ う にコンパイルされます。softvfp+vfpv3VFPv3 アーキテ ク チャ を ターゲ ッ ト にする ソ フ ト ウ ェ ア 浮 動 小数 点 リ ン ケージが 含 まれた 浮 動 小 数 点 ラ イ ブ ラ リ を 選 択 し ます。VFPv3 ユニッ ト を 実 装 するシステムで <strong>ARM</strong> コードを Thumbコー ド と イ ン ターワー ク させる 場 合 は、 こ のオプシ ョ ン を 選 択します。softvfp+vfpv3 は、 <strong>RealView</strong> Development Suite 3.0 以 降 でのみ 使 用 で き ます。softvfp+vfpv3_fp16半 精 度 浮 動 小 数 点 拡 張 サポー ト に よ って VFPv3 アーキテクチャを ターゲ ッ ト にする、 ソ フ ト ウ ェ ア 浮 動 小 数 点 リ ンケージ 付 きの 浮 動 小 数 点 ラ イ ブ ラ リ を 選 択 し ます。 softvfp+vfpv3_fp16 は、<strong>RealView</strong> Development Suite 4.0 以 降 でのみ 使 用 で き ます。softvfp+vfpv3_d16VFPv3-D16 アーキテクチャ をターゲッ ト にする、 ソ フ ト ウ ェア浮 動 小 数 点 リ ンケージ 付 き の 浮 動 小 数 点 ラ イ ブ ラ リ を 選 択 し ます。 softvfp+vfpv3_d16 は、 <strong>RealView</strong> Development Suite 4.0 以 降 でのみ 使 用 で き ます。softvfp+vfpv3_d16_fp16半 精 度 浮 動 小 数 点 拡 張 サポー ト に よ って VFPv3-D16 アーキテクチャ を ターゲ ッ ト にする、 ソ フ ト ウ ェ ア 浮 動 小 数 点 リ ンケージ付 きの 浮 動 小 数 点 ラ イ ブ ラ リ を 選 択 し ます。softvfp+vfpv3_d16_fp16 は、 <strong>RealView</strong> Development Suite 4.0 以 降 でのみ 使 用 で き ます。2-72 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション制 約 条 件--fpu オプシ ョ ン を 使 用 し て 明 示 的 に 選 択 さ れた FPU は、 --cpu オプシ ョ ンを使 用 し て 暗 黙 的 に 選 択 さ れた FPU を 常 にオーバーラ イ ド し ます。 例 えば、 オプシ ョ ン --cpu=<strong>ARM</strong>1136JF-S --fpu=softvfp は、 CPU の 選 択 によ ってアーキテ クチャ VPFv2 の 使 用 が 暗 黙 的 に 示 さ れてい る 場 合 で も、 ソ フ ト ウ ェ ア 浮 動 小 数点 ライブラ リ fplib を 使 用 する コー ド を 生 成 し ます。--cpu オプシ ョ ンを 使 用 して FPU を 暗 黙 的 に 指 定 し た 場 合 に、 --fpu を 使 用 して 明 示 的 に 選 択 された FPU とこのオプションが 互 換 していないと、 コンパイラによってエラーが 生 成 されます。コ ンパイ ラ は、 ス カ ラ 浮 動 小 数 点 演 算 のみを 生 成 し ます。 VFP ベクタ 演 算 を使 用 するには、 アセンブ リ コー ド を 使 用 する 必 要 があ り ます。softvfp では NEON のサポー ト は 無 効 になっています。デフォルトVFP コ プ ロ セ ッ サが 存 在 する 場 合 は、 VFP 命 令 が 生 成 さ れます。 VFP コプロセ ッ サがない 場 合 は、 浮 動 小 数 点 演 算 を 実 行 する ために、 ソ フ ト ウ ェ アの 浮動 小 数 点 ラ イ ブ ラ リ fplib を 呼 び 出 すコー ド が 生 成 さ れます。注デフ ォル ト で、 プ ロ セ ッ サま たはアーキテ ク チャ に 何 を 選 択 する かに よ って、特 定 の 浮 動 小 数 点 ユニ ッ ト が 暗 黙 的 に 選 択 さ れる こ と があ り ます。 例 えば、オプシ ョ ン --cpu <strong>ARM</strong>1136JF-S を 選 択 する と、 オプシ ョ ン --fpu vfpv2 が 暗 黙 的に 選 択 されます。関 連 項 目• 「--arm」 (ページ 2-9)• 「--cpu=name」 (ページ 2-35)• 「--thumb」 (ページ 2-135)• 「__softfp」 (ページ 4-17)• 『コンパイ ラユーザガイ ド』 の 「 浮 動 小 数 点 の 計 算 と リ ンケージ」(ページ 5-43)• 『デベロ ッ パガ イ ド 』 の 「 浮 動 小 数 点 ビル ド オプシ ョ ン」 (ページ 2-5)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-73ID 100419Non-Confidential,


コンパイラのコマンドラインオプション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_macros2-74 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション関 連 項 目• 「--debug, --no_debug」 (ページ 2-41)• 「--debug_macros, --no_debug_macros」 (ページ 2-42)• 「--dwarf2」 (ページ 2-58)• 「--dwarf3」 (ページ 2-58)• 「-Onum」 (ページ 2-108)2.1.77 --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)• 『<strong>ARM</strong> ソフトウェア 開 発 ツールキッ ト リファレンスガイド』。2.1.78 --gnuこのオプションを 使 用 すると、 <strong>ARM</strong> コンパイラでサポート されている GNUコ ンパイ ラ の 拡 張 機 能 を 有 効 にで き ます。 拡 張 機 能 の 互 換 性 があ る GCC のバージ ョ ンは、 定 義 済 みマ ク ロ __GNUC__ と __GNUC_MINOR__ を 調 べて 特 定 できます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-75ID 100419Non-Confidential,


コンパイラのコマンドラインオプション関 連 項 目• 「--c90」 (ページ 2-25)• 「--c99」 (ページ 2-26)• 「--cpp」 (ページ 2-34)• 「--strict, --no_strict」 (ページ 2-133)• 「GNU 言 語 拡 張 機 能 」 (ページ 3-26)• 「コ ンパ イ ラ に よ る 事 前 定 義 」 (ページ 4-129)2.1.79 --gnu_instrument, --no_gnu_instrumentこのオプションは GCC 形 式 の 計 測 を 挿 入 し ます。関 連 項 目• 「--gnu_instrument, --no_gnu_instrument」2.1.80 --gnu_version=versionこ のオプシ ョ ン を 使 用 する と 、 特 定 のバージ ョ ンの GCC と 互 換 の 動 作 が 試 みられます。構 文--gnu_version=versionversion は、 互 換 の 動 作 を 試 みる GCC のバージ ョ ンを 表 す 10 進 数 です。モードこのオプションは、 GNU 互 換 性 モー ド と 共 に 使 用 し ます。使 用 法このオプションは、 上 級 ユーザを 対 象 としたもので、 従 来 のコー ド を 処 理 する 目 的 で 使 用 されます。 通 常 、 こ のオプシ ョ ン を 使 用 する 必 要 はあ り ません。デフォルトRVCT v4.0 では、デフォル ト は 40200 です。 これは、GCC バージ ョ ン 4.2.0 に 対応 します。2-76 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション例--gnu_version=30401 は、 GCC 3.4.1 と 可 能 な 限 り 互 換 な 動 作 をします。関 連 項 目• 「--gnu」 (ページ 2-75)2.1.81 --guiding_decls, --no_guiding_declsこ のオプシ ョ ン を 使 用 する と 、 テンプレー ト 関 数 の 導 入 宣 言 を 認 識 する かどうかを C++ で 指 定 でき ます。導 入 宣 言 と は、 関 数 テンプレー ト のイ ン ス タ ン スに 一 致 するが、 その 定 義 が関 数 テンプレー ト か ら 派 生 する ため 明 示 的 な 定 義 がない 関 数 宣 言 を 指 し ます。--no_guiding_decls を --old_specializations と 組 み 合 わせて 使 用 し た 場 合 、 非 メンバテンプレー ト 関 数 の 特 殊 化 は 認 識 さ れず、 独 立 関 数 の 定 義 と し て 処 理 されます。注オプシ ョ ン --guiding_decls は、 C++ 標 準 に 準 拠 していない 従 来 のソースコード を 移 行 する 目 的 でのみ 提 供 さ れています。 他 の 目 的 でこのオプシ ョ ンを 使用 する こ と はお 勧 め し ません。モードこ のオプシ ョ ンは、 ソ ース 言 語 が C++ の 場 合 にのみ 有 効 です。デフォルトデフォル ト は --no_guiding_decls です。例template void f(T){...}void f(int);<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-77ID 100419Non-Confidential,


コンパイラのコマンドラインオプション導 入 宣 言 と し て 考 えた 場 合 、 f(int) はテンプレー ト のインス タンスにな り ます。 導 入 宣 言 でない 場 合 は 独 立 し た 関 数 にな るので、 定 義 を 記 述 する 必 要 があります。関 連 項 目• 「--apcs=qualifer...qualifier」 (ページ 2-4)• 「--old_specializations, --no_old_specializations」 (ページ 2-110)2.1.82 --helpこ のオプシ ョ ン を 選 択 する と 、 主 な コ マン ド ラ イ ンオプシ ョ ンの 一 覧 が 表 示されます。こ れは、 オプシ ョ ンやソース フ ァ イルを 指 定 し ない 場 合 のデフ ォル ト の 動 作です。関 連 項 目• 「--show_cmdline」 (ページ 2-128)• 「--vsn」 (ページ 2-149)2.1.83 --hide_all, --no_hide_allこのオプションを 使 用 すると、 SVr4 共 有 オブジ ェ ク ト の 作 成 時 にシンボルを表 示 する かど う かを 制 御 で き ます。使 用 法--no_hide_all を 使 用 する と、 コンパイ ラはすべての extern 変 数 および 関 数 に対 して STV_DEFAULT 表 示 を 使 用 し ます (これら の 変 数 や 関 数 が__declspec(dll*) を 使 用 していない 場 合 )。 ま た、 変 数 および 関 数 はダ イ ナ ミ ックローダによって 実 行 時 にプリエンプティブにもなります。System V または <strong>ARM</strong> Linux 共 有 ラ イ ブ ラ リ を 構 築 する 場 合 は、--no_hide_all と--apcs /fpic を 一 緒 に 使 用 し ます。デフォルトデフォル ト は --hide_all です。2-78 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション関 連 項 目• 「--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)• 「--kandr_include」 (ページ 2-87)• 「--preinclude=filename」 (ページ 2-118)• 「--sys_include」 (ページ 2-135)• 『コンパイ ラユーザガイ ド』 の 「ヘ ッ ダ フ ァ イ ル」 (ページ 2-16)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-79ID 100419Non-Confidential,


コンパイラのコマンドラインオプション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)• 「--depend_target=target」 (ページ 2-48)• 「-M」 (ページ 2-99)• 「--md」 (ページ 2-100)• 「--phony_targets」 (ページ 2-116)2.1.86 --implicit_include, --no_implicit_includeこのオプションを 使 用 すると、 インスタンス 化 されるテンプレートエンティテ ィ の 定 義 を 検 索 する 方 法 と し て ソ ース フ ァ イルを 暗 黙 に イ ン ク ルー ド するかど うかを C++ で 制 御 でき ます。モードこ のオプシ ョ ンは、 ソ ース 言 語 が C++ の 場 合 にのみ 有 効 です。デフォルトデフォル ト は --implicit_include です。2-80 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション関 連 項 目• 「--implicit_include_searches,--no_implicit_include_searches」• 「 暗 黙 の イ ン ク ルー ド 」 (ページ 5-17)2.1.87 --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)• 「--implicit_include, --no_implicit_include」 (ページ 2-80)• 「-Jdir[,dir,...]」 (ページ 2-86)• 「 暗 黙 の イ ン ク ルー ド 」 (ページ 5-17)• 『コンパイ ラユーザガイ ド』 の 「 検 索 パス」 (ページ 2-17)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-81ID 100419Non-Confidential,


コンパイラのコマンドラインオプション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)• 「--parse_templates, --no_parse_templates」 (ページ 2-112)• 「テンプレー ト のイ ンス タ ンス 生 成 」 (ページ 5-17)2.1.89 --info=totalsこのオプションは、 オブジェク ト ファイルごとにオブジェク トのコード とデータ のサ イ ズの 合 計 を 確 認 する よ う に コ ンパ イ ラ に 指 示 し ます。コンパイラは、fromelf -z が 使 用 さ れてい る 場 合 、 fromelf によって 返 された 合計 と 同 じ 合 計 を 同 様 の 形 式 で 返 し ます。 組 み 込 みアセンブ リ が ソ ース コー ドに 存 在 する 場 合 、 合 計 には 組 み 込 みアセンブ ラ のサ イ ズ も 含 まれます。2-82 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション例Code (inc. data) RO Data RW Data ZI Data Debug File Name3308 1556 0 44 10200 8402 dhry_1.oCode (inc. data) RO Data RW Data ZI Data Debug File Name416 28 0 0 0 7722 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 です。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-83ID 100419Non-Confidential,


コンパイラのコマンドラインオプション関 連 項 目• 「--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)• 『コンパイ ラユーザガイ ド』 の 「 関 数 の イ ン ラ イ ン 展 開 」 (ページ 5-20)2.1.91 --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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション関 連 項 目• 「--enum_is_int」 (ページ 2-59)2.1.92 --interleaveこのオプションを 使 用 すると、--asm オプシ ョ ンまたは -S オプシ ョ ンを 使 用 して 生 成 されたアセンブ リ リ ス ト 内 に、 C または C++ ソースコードをコ メン トとして 1 行 ずつイ ン ター リ ーブで き ます。使 用 法--interleave のアクションは、 使 用 されるオプションの 組 み 合 わせによって 異なります。表 2-4 ---interleave オプシ ョ ン を 使 用 し た コ ンパイルコンパイラオプション--asm --interleaveアクションこ のオプシ ョ ン を 使 用 する と 、 コ ンパイル さ れた ソ ースの逆 アセンブ リ の リ ス ト がフ ァ イルに 書 き 込 まれ、 ソースコードが 逆 アセンブリでインターリーブされます。-c オプシ ョ ンが 使 用 さ れない 場 合 、 リ ン ク 手 順 も 実 行 さ れます。逆 アセンブ リ は、 テキス ト フ ァ イルに 書 き 込 まれ、 フ ァ イル 名 には、 フ ァ イル 拡 張 子 .txt が 付 け られた 入 力 フ ァ イル名 がデフ ォル ト で 使 用 さ れます。-S --interleave こ のオプシ ョ ン を 使 用 する と 、 コ ンパイル さ れた ソ ースの逆 アセンブ リ の リ ス ト がフ ァ イルに 書 き 込 まれ、 ソースコードが 逆 アセンブリでインターリーブされます。逆 アセンブ リ は、 テキス ト フ ァ イルに 書 き 込 まれ、 フ ァ イル 名 には、 フ ァ イル 拡 張 子 .txt が 付 け られた 入 力 フ ァ イル名 がデフ ォル ト で 使 用 さ れます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-85ID 100419Non-Confidential,


コンパイラのコマンドラインオプション制 約 条 件• --asm --interleave または -S --interleave を 指 定 して 生 成 されたアセンブリリストを 再 アセンブルすることはできません。• 前 処 理 済 みの ソース フ ァ イルには、 #line ディレクティブが 含 まれます。--asm --interleave または -S --interleave を 使 用 し て 前 処 理 済 みのフ ァ イルをコンパイルした 場 合 、 コンパイラは #line ディレクティブによって示 された 元 のファイルを 検 索 し、 それらのファイルから 正 しいコード 行を 使 用 し ます。 こ れに よ り 、 前 処 理 済 みフ ァ イルを コ ンパイルし た と きに、 元 のファイルをコンパイルしたと き と 同 じ 出 力 と 動 作 が 提 供 されます。コ ンパ イ ラ が 元 のフ ァ イ ルを 見 つけ ら れなかっ た 場 合 、 ソ ース を イ ンターリーブできません。 このため、#line ディレクティブを 使 用 してソースフ ァ イルの 前 処 理 を 行 ったが 元 の 未 処 理 のフ ァ イルが 存 在 しない 場 合は、--interleave を 使 用 し て コ ンパイルを 実 行 する 前 にすべての #lineデ ィ レ ク テ ィ ブを 削 除 する 必 要 があ り ます。関 連 項 目• 「--asm」 (ページ 2-17)• 「-S」 (ページ 2-127)2.1.93 -Jdir[,dir,...]こ のオプシ ョ ン を 使 用 する と 、 指 定 さ れたデ ィ レ ク ト リ ま たはコ ンマで 区 切られたディレクトリのリストが、システムインクルードのリストに 追 加 されます。--diag_error が 使 用 さ れてい る 場 合 で も、 警 告 と 注 釈 は 非 表 示 にな り ます。RVCT40INC 環 境 変 数 は、-J を 使 用 してオーバーラ イ ド しない 限 り、 デフォル トのシステムインクルードパスに 設 定 されます。 まず 山 形 括 弧 で 囲 まれた イ ンクルードファイルは、 システムインクルードのリ ス トで 検 索 され、 その 後 にオプシ ョ ン -I で 指 定 し た イ ン クルード リ ス ト で 検 索 されます。注Windows システムでは、RVCT40INC によって 定 義 されるデフォルトのパスにはスペースが 含 まれています。 そのため、 コマン ド ラ イ ンで、 こ の 環 境 変 数 を指 定 する 場 合 は、 二 重 引 用 符 で 囲 む 必 要 があ り ます。 以 下 に 例 を 示 し ます。armcc -J"%RVCT40INC%" -c main.c2-86 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション構 文-Jdir[,dir,...]各 パラ メ ータには 以 下 の 意 味 があ り ます。dir[,dir,...]システムインクルードのリ ス トに 追 加 されるコンマで 区 切られたディレク ト リのリ ス トです。ただし、 少 な く と も 1 つのデ ィ レ ク ト リ が 指 定 されている必 要 があ り ます。複 数 のデ ィ レ ク ト リ を 指 定 する 場 合 は、 リ ス ト の コ ンマ とデ ィ レ ク ト リ 名 の 間 にスペース を 入 れないで 下 さ い。関 連 項 目• 「-Idir[,dir,...]」 (ページ 2-79)• 「--kandr_include」• 「--preinclude=filename」 (ページ 2-118)• 「--sys_include」 (ページ 2-135)• 『コンパイ ラユーザガイ ド』 の 「ヘ ッ ダ フ ァ イ ル」 (ページ 2-16)2.1.94 --kandr_includeこのオプショ ンを 使 用 すると、 インクルードファイルの 検 索 にカーニガン &リ ッ チーの 検 索 規 則 が 使 用 さ れます。現 在 の 場 所 は 元 のソースファイルによって 定 義 され、 スタッ クされません。こ のオプシ ョ ンが 指 定 さ れていない 場 合 は、 バーク レー 方 式 の 検 索 が 行 われます。関 連 項 目• 「-Idir[,dir,...]」 (ページ 2-79)• 「-Jdir[,dir,...]」 (ページ 2-86)• 「--preinclude=filename」 (ページ 2-118)• 「--sys_include」 (ページ 2-135)• 『コンパイ ラユーザガイ ド』 の 「ヘ ッ ダ フ ァ イ ル」 (ページ 2-16)• 『コンパイ ラユーザガイ ド』 の 「 現 在 の 場 所 」 (ページ 2-16)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-87ID 100419Non-Confidential,


コンパイラのコマンドラインオプション2.1.95 -Loptこ のオプシ ョ ンを 使 用 し て、 コ ンパイル 後 に リ ン ク 手 順 が 実 行 される と きにリ ンカに 渡 すコ マン ド ラ イ ンオプシ ョ ン を 指 定 で き ます。 オプシ ョ ンは、 部分 的 に リ ン ク さ れたオブジ ェ ク ト ま たは 実 行 可 能 イ メ ージを 作 成 する と きにも 渡 すこ とができます。構 文-Lopt各 パ ラ メ ータには 以 下 の 意 味 があ り ます。optリンカに 渡 されるコマンドラインオプションです。制 約 条 件サポー ト されていない リ ンカオプシ ョ ンが -L を 使 用 して リ ンカに 渡 されると 、 エ ラーが 生 成 さ れます。例armcc main.c -L--map関 連 項 目• 「-Aopt」 (ページ 2-2)• 「--show_cmdline」 (ページ 2-128)2.1.96 --library_interface=libこ のオブジ ェ ク ト を 使 用 する と 、 選 択 し た ラ イ ブ ラ リ の タ イ プ と 互 換 性 があるコードを 生 成 できます。構 文--library_interface=liblib には、 以 下 のいずれかが 使 用 されます。rvctこ のオプシ ョ ン を 使 用 する と 、 コ ンパ イ ラ の 出 力 が RVCTラ ン タ イ ム ラ イ ブ ラ リ と 連 動 する よ う に 指 定 で き ます。2-88 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションrvct_c90aeabi_clib90aeabi_clib99aeabi_clibaeabi_glibc--library_interface=rvct と 同 様 に 動 作 します。 ただし、C90に よ っ て 予 約 さ れていない 関 数 名 に 対 する 入 力 ソ ース コード 内 の 参 照 がコンパイラによって 変 更 されない 点 が 異 なります。 また、 一 部 の C99 math.h 関 数 名 には、__hardfp_tgammaの よ う に、 接 頭 辞 __hardfp_ が 付 く 場 合 があ り ます。こ のオプシ ョ ン を 使 用 する と 、 コ ンパイ ラ の 出 力 が <strong>ARM</strong>組 み 込 みアプ リ ケーシ ョ ンバイナ リ イ ン タ フ ェース(AEABI) 準 拠 の ISO C90 ライブラリと 連 動 するように 指定 でき ます。こ のオプシ ョ ン を 使 用 する と 、 コ ンパイ ラ の 出 力 が <strong>ARM</strong>組 み 込 みアプ リ ケーシ ョ ンバイナ リ イ ン タ フ ェース(AEABI) 準 拠 の ISO C99 ライブラリと 連 動 するように 指定 でき ます。こ のオプシ ョ ン を 使 用 する と 、 コ ンパイ ラ の 出 力 が <strong>ARM</strong>組 み 込 みアプ リ ケーシ ョ ンバイナ リ イ ン タ フ ェース(AEABI) 準 拠 の ISO C ラ イ ブ ラ リ と 連 動 する よ う に 指 定できます。オプシ ョ ン --library_interface=aeabi_clib を 選 択 する と 、使 用 さ れた ソ ース 言 語 に 応 じ て--library_interface=aeabi_clib90 または--library_interface=aeabi_clib99 を 指 定 した 場 合 と 同 じになります。選 択 する ソ ース 言 語 は、 選 択 さ れる コ マン ド ラ イ ンオプシ ョ ン と 使 用 さ れる フ ァ イル 名 接 尾 文 字 に 応 じ て 異 な り ます。こ のオプシ ョ ン を 使 用 する と 、 コ ンパイ ラ の 出 力 がAEABI 準 拠 の GNU C ラ イ ブ ラ リ と 連 動 する よ う に 指 定 できます。デフォルト--library_interface を 指 定 しない 場 合 は、 --library_interface=rvct が 想 定 されます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-89ID 100419Non-Confidential,


コンパイラのコマンドラインオプション使 用 法• オプシ ョ ン --library_interface=rvct は、 コ ンパイ ラ と ラ イ ブ ラ リ の 最 適化 を 最 大 限 に 利 用 し て リ ン ク する と きに 使 用 し ます。• ABI に 準 拠 し た C ライブラリとリンクする 場 合 は、 形 式--library_interface=aeabi_* のオプシ ョ ンを 使 用 し ます。 形 式--library_interface=aeabi_* のオプシ ョ ンを 指 定 する と、 コンパイ ラは、RVCT C ラ イ ブ ラ リ の 最 適 化 さ れた 関 数 への 呼 び 出 し を 生 成 し ません。例RVCT C ラ イ ブ ラ リ の 関 数 を 置 換 する 組 み 込 みオペレーテ ィ ン グシ ス テムの関 数 が コー ド に よ って 呼 び 出 さ れた 場 合 、 --library_interface=aeabi_clib を 使用 してコードをコンパイルし、 オペレーティ ングシステムによって 置 換 されるライブラリ 関 数 の 特 定 の RVCT バリアントの 呼 び 出 しを 無 効 にします。関 連 項 目• 『ライブラ リ / 浮 動 小 数 点 サポー ト ガ イ ド 』 の 「<strong>ARM</strong> アーキテクチャ 用ABI への 準 拠 」 (ページ 1-3)2.1.97 --library_type=libリンク 時 に 使 用 する 選 択 したライブラリを 有 効 にします。注このオプションでリンカを 使 用 すると、 他 のすべての--library_type オプシ ョンがオーバーラ イ ド されます。構 文--library_type=liblib には、 以 下 のいずれかが 使 用 されます。standardlibmicrolibリンク 時 にフル RVCT ランタイムライブラ リを 選 択 するように指 定 し ます。こ のオプシ ョ ンは、 コ ンパイ ラ の 最 適 化 を 最 大 限 に 利 用 し て リンクするときに 使 用 します。リンク 時 に C マイクロライブラ リ (microlib) を 選 択 するよ うに指 定 し ます。2-90 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションデフォルト--library_type を 指 定 しない 場 合 は、 --library_type=standardlib が 想 定 されます。関 連 項 目• 『ライブラ リ / 浮 動 小 数 点 サポー ト ガ イ ド 』 の 「microlib を 使 用 したアプリ ケーシ ョ ンの 作 成 」 (ページ 3-4)• 『リンカリファレンスガイド』 の 「--library_type=lib」 (ページ2-39)2.1.98 --licretryフローティングライセンスを 使 用 している 場 合 は、armcc を 起 動 したと きに、10 回 までラ イセンスの 取 得 を 試 みます。使 用 法夜 間 ビル ド の よ う な 典 型 的 なビル ド プ ロ セスには、 何 千 も の <strong>ARM</strong> コンパイルツール 呼 び 出 しが 含 まれている 場 合 があ り ます。 各 ツール 呼 び 出 しには、クライアント (ビルド) マシンとライセンスサーバとの 間 のネットワーク 通信 が 伴 います。 ただし、 ビルドマシンがラ イセンスサーバからのラ イセンスの 取 得 を 試 みた と き に 一 時 的 なネ ッ ト ワーク 障 害 が 発 生 し た 場 合 、 ツールがラ イ セン ス を 取 得 で き ない 可 能 性 があ り ます。 --licretry を 使 用 する と、 この種 の 問 題 の 解 決 を 試 みる こ とができます。このオプショ ンは、RVCT40_CCOPT 環 境 変 数 で 指 定 する こ と をお 勧 め し ます。 これに よ り 、 ビル ド フ ァ イルを 修 正 する 必 要 がな く な り ます。注このオプショ ンは、 ネッ ト ワークまたはライセンスサーバの 設 定 に 関 する 他の 問 題 がない こ と を 確 認 し た 後 でのみ 使 用 し て 下 さ い。関 連 項 目• 『リンカリファレンスガイド』 の 「--licretry」 (ページ 2-40)• 『アセンブラガイ ド』 の 「コマンド 構 文 」 (ページ 3-2)• 『ユーテ ィ リ テ ィ ガイ ド』 の 「--licretry」 (ページ 2-36)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-91ID 100419Non-Confidential,


コンパイラのコマンドラインオプション• 『<strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong> エッセンシャルガイド』 の 「RVCT で 使 用 する 環 境 変 数 」 (ページ 1-7)• 『<strong>ARM</strong> ツール 用 FLEXnet ライセンス 管 理 ガイド』2.1.99 --listこのオプシ ョ ンは、 ソースフ ァ イルの 生 の リ ス ト 情 報 を 生 成 する よ う にコンパイ ラ に 指 示 し ます。 生 の リ ス ト フ ァ イルの 名 前 には、 フ ァ イル 拡 張 子 .lstが 付 け ら れた 入 力 フ ァ イ ル 名 がデフ ォル ト で 使 用 さ れます。コマンド ラインで 複 数 のソースファイルを 指 定 した 場 合 は、 指 定 したファ イルの 最 初 のフ ァ イルに 対 し てのみ 生 の リ ス ト 情 報 が 生 成 さ れます。使 用 法通 常 、 生 の リ ス ト 情 報 はフ ォーマ ッ ト さ れた リ ス ト を 生 成 する ために 使 用 されます。 生 の リ ス ト フ ァ イルには、 元 のソース 行 、 イ ン クルード フ ァ イルにおけ る 遷 移 に 関 する 情 報 、 およびコ ンパイ ラ に よ って 生 成 さ れる 診 断 情 報 が含 まれます。 リ ス ト フ ァ イルの 各 行 は、 行 の タ イ プを 表 す 以 下 のいずれかのキー 文 字 で 始 ま り ます。NXS通 常 の ソ ース 行 であ る こ と を 示 し ます。 その 行 の 残 り の 部 分 はソース 行 のテキス トです。通 常 の ソース 行 の 拡 張 形 式 です。 この 行 の 残 りの 部 分 は、 ソース行 のテキス ト です。 この 行 は、 特 別 な 修 正 が 含 まれている 場 合 のみ、 N 行 の 後 に 記 述 されます。 コ メントは 軽 微 な 修 正 と 見 なされ、マ ク ロ 拡 張 、 行 の 結 合 、 ト リ グ ラ フ などは 特 別 な 修 正 と 見 な されます。 コ メ ン ト は、 拡 張 形 式 行 では 1 つのスペースで 置 き 換 えられます。#if またはこれに 似 たディレクティブによってスキップされるソース 行 であるこ とを 示 します。 この 行 の 残 りの 部 分 はテキス トです。注ス キ ッ プを 終 了 する #else、 #elseif、 または #endif は、 N でマークされます。Lソース 位 置 の 変 更 を 示 し ます。 つま り、 この 行 にはプ リ プロセッサによ って 出 力 される # 識 別 デ ィ レ ク テ ィ ブに 似 た 形 式 が 使 用 されます。2-92 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションL line-number "filename" keykey には 以 下 のど ち ら かを 指 定 で き ます。1 インクルードファイルへのエント リ2 インクルードファイルからの 終 了それ 以 外 の 場 合 、key は 省 略 されます。 生 の リ ス ト フ ァ イルの 1 行目 は、 常 に 元 の 入 力 フ ァ イルを 表 す L 行 です。 L 行 は、 #line ディレクティブに 対 しても 出 力 されます (key が 省 略 されている 場合 )。 L 行 は、 生 の リ ス ト フ ァ イル 内 の 次 のソース 行 のソース 位置 を 示 し ます。R/W/E下 記 の よ う な 診 断 情 報 を 示 し ます。RW注 釈警 告E エラーこの 行 には 以 下 の 形 式 が 使 用 されます。type "filename" line-number column-number message-texttype には、 R、 W、 または E のいずれかが 使 用 されます。フ ァ イルの 最 後 の 部 分 のエラーは、 元 のソース フ ァ イルの 最 終行 であ る こ と と 、 列 数 が 0 である こ と を 示 します。コマンド ラインエラーのファイル 名 は、"" として 表されます。 エ ラー メ ッ セージには、 行 番 号 と 列 番 号 は 表 示 さ れません。内 部 エ ラーには、 従 来 の 位 置 情 報 と 、 (Internal fault) で 始 ま るメッセージテキストが 使 用 されます。オーバーロー ド し た 呼 び 出 し に 曖 昧 性 があ る と き に、 競 合 するすべてのルーチンが 表 示 さ れる 場 合 な ど、 診 断 メ ッ セージに リス ト が 表 示 される 場 合 、 最 初 の 診 断 行 の 後 に 同 じ 形 式 の 行 が 1 つま たは 複 数 表 示 さ れます。 ただし、 コード 文 字 には、 最 初 の 行 のコー ド 文 字 を 小 文 字 に し た も のが 使 用 さ れます。 これらの 行 のソース 位 置 は、 対 応 する 最 初 の 行 のソース 位 置 と 同 じです。例/* main.c */#include int main(void)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-93ID 100419Non-Confidential,


コンパイラのコマンドラインオプション{}return(true);オプシ ョ ン --list を 指 定 してこのコード をコンパイルする と、 以 下 のよ う に生 の リ ス ト フ ァ イルが 生 成 されます。L 1 "main.c"N#include L 1 "...\include\...\stdbool.h" 1N/* stdbool.h */N...N #ifndef __cplusplus /* In C++, 'bool', 'true' and 'false' and keywords */N #define bool _BoolN #define true 1N #define false 0N #endif...L 2 "main.c" 2NNint 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション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このオプショ ンは、 リ トルエンディアンメモリ を 使 用 して <strong>ARM</strong> プロセッサ用 の コー ド を 生 成 する よ う にコ ンパ イ ラ に 指 示 し ます。リ ト ルエンデ ィ アンの メ モ リ では、 ワー ド の 最 下 位 バイ ト に 最 下 位 ア ド レ スが 割 り 当 て られます。デフォルト--bigend を 明 示 的 に 指 定 し なかった 場 合 、 --littleend が 指 定 された と き と 同 じ処 理 を 実 行 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-95ID 100419Non-Confidential,


コンパイラのコマンドラインオプション関 連 項 目• 「--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)• 「--multibyte_chars, --no_multibyte_chars」 (ページ 2-103)2-96 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション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++ の 制 約 条 件 を 緩 和 する かど う かを 指 定 で き ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-97ID 100419Non-Confidential,


コンパイラのコマンドラインオプションデフォルトデフォル ト は --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.carmcc -c --ltcg file2.carmlink --ltcg file1.o file2.o -o prog.axf2-98 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション関 連 項 目• 「--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)• 「-E」 (ページ 2-58)• 「--md」 (ページ 2-100)• 「-o filename」 (ページ 2-106)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-99ID 100419Non-Confidential,


コンパイラのコマンドラインオプション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_JP2-100 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションデフォルト--message_locale を 指 定 し なかった 場 合 、 コ ンパ イ ラ は --message_locale=en_USが 指 定 された と き と 同 じ 処 理 を 実 行 し ます。制 約 条 件ホス トプラッ ト フォームに 適 切 なロケールのサポートがインス トールされているこ とを 確 認 して 下 さい。ホ ス ト プラ ッ ト フ ォームによ っては、 ロ ケール 名 の 大 文 字 と 小 文 字 が 区 別 される 場 合 があ り ます。コードページとその 意 味 を 特 定 でき るかど う かは、 ホス ト プラ ッ ト フォームによって 異 なり ます。エラーサポー ト されない 設 定 を 指 定 する と、 コンパイ ラによってエラーメ ッセージが 生 成 されます。例日 本 語 で メ ッ セージを 表 示 する には、 以 下 の よ う に 指 定 し ます。--message_locale=ja_JP関 連 項 目• 「--locale=lang_country」 (ページ 2-96)• 「--multibyte_chars, --no_multibyte_chars」 (ページ 2-103)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-101ID 100419Non-Confidential,


コンパイラのコマンドラインオプション2.1.110 --min_array_alignment=optこ のオプシ ョ ン を 使 用 する と 、 配 列 の 最 小 境 界 整 列 を 指 定 で き ます。構 文--min_array_alignment=opt各 パ ラ メ ータには 以 下 の 意 味 があ り ます。opt配 列 の 最 小 境 界 整 列 を 指 定 し ます。 opt には、 以 下 のいずれかの値 を 指 定 できます。1 バ イ ト 境 界 で 整 列 さ れる か、 非 境 界 整 列 さ れます。2 2 バ イ ト (ハーフ ワー ド ) 境 界 で 整 列 さ れます。4 4 バイ ト (ワード) 境 界 で 整 列 されます。8 8 バ イ ト (ダブルワー ド ) 境 界 で 整 列 さ れます。デフォルト--min_array_alignment オプシ ョ ン を 指 定 し なかった 場 合 、 コ ンパイ ラ は--min_array_alignment=1 が 指 定 された と き と 同 じ 処 理 を 実 行 し ます。例--min_array_alignment=8 を 指 定 して 以 下 のコード をコンパイルする と、 コ メ ント に 記 載 さ れてい るバイ ト 境 界 で 整 列 さ れます。char arr_c1[1]; // alignment == 8char c1; // alignment == 1関 連 項 目• 「__align」 (ページ 4-2)• 「__ALIGNOF__」 (ページ 4-5)2-102 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション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 IndustrialStandard (Shift-JIS) に 代 表 さ れる 文 字 セ ッ ト に 使 用 さ れます。関 連 項 目• 「--locale=lang_country」 (ページ 2-96)• 「--message_locale=lang_country[.codepage]」 (ページ2-100)2.1.113 --multifile, --no_multifileこ のオプシ ョ ン を 使 用 する と 、 マルチフ ァ イルのコ ンパイルを 有 効 ま たは 無効 にでき ます。--multifile が 指 定 される と、 コ ンパイ ラは、 個 々のフ ァ イルではな く 、 コマン ド ラ インで 指 定 されたすべてのフ ァ イルに 対 して 最 適 化 を 実 行 します。 指定 されたファイルは、 1 つのオブジェク ト ファイルにコンパイルされます。結 合 さ れたオブジ ェ ク ト フ ァ イルには、 コ マン ド ラ イ ンで 最 初 に 指 定 し たソース フ ァ イルに 基 づいた 名 前 が 付 け ら れます。 結 合 さ れたオブジ ェ ク トフ ァ イルに 別 の 名 前 を 指 定 する には、-o filename オプシ ョ ンを 使 用 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-103ID 100419Non-Confidential,


コンパイラのコマンドラインオプションコマンド ラインで 指 定 した 後 続 の 各 ソースファイルに 空 のオブジェク ト ファイルが 作 成 され、 標 準 の 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)• 「--default_extension=ext」 (ページ 2-42)• 「--ltcg」 (ページ 2-98)• 「-o filename」 (ページ 2-106)• 「-Onum」 (ページ 2-108)• 「--whole_program」 (ページ 2-151)2-104 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション2.1.114 --multiply_latency=cyclesこのオプショ ンは、 ハードウェア 乗 算 器 が 使 用 したサイクル 数 をコンパイラに 知 らせます。構 文--multiply_latency=cyclescycles は 使 用 し たサイ クル 数 です。使 用 法こ のオプシ ョ ン を 使 用 し て、 乗 算 器 ブ ロ ッ ク と チ ッ プの 関 連 部 分 を 使 用 し て乗 算 を 行 う MUL 命 令 に 必 要 なサ イ ク ル 数 を コ ンパイ ラ に 知 らせます。 完 了 するまで、 チップのこれらの 部 分 を 別 の 命 令 に 使 用 することはできません。MUL の 結 果 を 後 の 命 令 で 使 用 する こ と も で き ません。プ ロ セ ッ サの 特 定 のハー ド ウ ェ ア 実 装 には 乗 算 器 オプシ ョ ン を 複 数 備 え る こと も 可 能 です。 例 えば、 1 サイクルで 実 行 する 実 装 もあれば、 実 行 に 33 サイクルかかる 実 装 もあり ます。 このオプショ ンは、 特 定 のプロセッサの 正 しいサ イ ク ル 数 を 伝 達 する ために 使 用 し ます。例--multiply_latency=33関 連 項 目• 『Cortex -M1 テクニカルリファレンスマニュアル』2.1.115 --nonstd_qualifier_deduction, --no_nonstd_qualifier_deductionこ のオプシ ョ ン を 使 用 する と 、 指 定 さ れた 名 前 の 修 飾 子 の 部 分 で、 非 標 準 テンプレー ト 引 数 を 推 論 するかど う かを C++ で 制 御 でき ます。この 機 能 がイネーブルされていると、 テンプレートパラ メータ T のテンプレート 引 数 が、 A::B または T::B などのコンテキス ト と して 推 論 されます。標 準 的 な 推 測 メ カニズムでは、 こ れら の コ ンテキ ス ト が、 明 示 的 に 指 定 さ れたか 他 の 場 所 で 推 測 さ れたテンプレー ト パ ラ メ ータ の 値 を 使 用 する 非 推 測 コンテキス ト と して 処 理 されます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-105ID 100419Non-Confidential,


コンパイラのコマンドラインオプション注オプシ ョ ン --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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション表 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 オプシ ョ ンをオーバーラ イ ド し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-107ID 100419Non-Confidential,


コンパイラのコマンドラインオプション関 連 項 目• 「--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こ のオプシ ョ ン を 使 用 する と 、 ソース フ ァ イルの コ ンパイル 時 に 使 用 する 最適 化 レベルを 指 定 で き ます。構 文-Onumnum には、 以 下 のいずれかを 指 定 し ます。0 最 小 限 の 最 適 化 。 ほとんどの 最 適 化 を 実 行 しません。 デバ ッ グビ ューを 可 能 な 限 り 最 適 化 する、 最 も 低 い 最 適 化 レベルです。1 制 限 さ れた 最 適 化 。 未 使 用 の イ ン ラ イ ン 関 数 と 静 的 関 数 を 削 除 します。 デバ ッ グ ビ ューに 著 し く 悪 影 響 を 及 ぼす 最 適 化 は 実 行 し ません。 このオプションを --debug と 組 み 合 わせて 使 用 する と 、 十分 満 足 でき るデバ ッ グ ビ ュー と 優 れた コー ド 密 度 が 提 供 されます。2 高 度 な 最 適 化 。--debug と 組 み 合 わせて 使 用 する と 、 オブジ ェ ク トコード と ソース コード と の 間 のマ ッ プが 明 確 でない 場 合 があ るため、 デバッグビューの 質 は 低 下 し ます。これがデフ ォル ト の 最 適 化 レベルです。2-108 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション3 最 大 限 の 最 適 化 。-O3 は -O2 と 同 じ 最 適 化 を 実 行 しますが、-O2 と 比べる と 、 生 成 さ れる コー ド のサ イ ズや 実 行 速 度 のバ ラ ン ス を 重点 的 に 最 適 化 し ます。 つま り、 以 下 のよ う にな り ます。• -O3 -Otime を 指 定 する と 、 イ メ ージのサ イ ズが 大 き く な る 可能 性 はあ り ますが、-O2 -Otime を 指 定 した 場 合 よ り も 実 行 速度 が 速 い コー ド が 生 成 さ れる よ う に 最 適 化 さ れます。• -O3 -Ospace を 指 定 する と 、 実 行 速 度 が 遅 く な る 可 能 性 はありますが、-O2 -Ospace を 指 定 した 場 合 よ り も コードのサイズが 小 さ く な る よ う に 最 適 化 されます。また、-O3 を 使 用 する と 、 さ ら に 以 下 の よ う な 強 力 な 最 適 化 を 実行 でき ます。• ループの 展 開 など、 -O3 -Otime が 指 定 された 場 合 のハイ レベルのス カ ラ の 最 適 化 。 コードサイズの 増 加 を 抑 えながらパフ ォーマン ス を 大 幅 に 向 上 で き ますが、 ビル ド に 時 間 がかか る 可 能 性 があ り ます。• -O3 -Otime が 指 定 さ れた 場 合 の、 よ り 強 力 な イ ン ラ イ ン 展 開と イ ン ラ イ ン 展 開 の 自 動 化 。• デフォル ト で 実 行 されるマルチファ イルコンパイル。注--fpmode オプシ ョ ン を 使 用 し て 該 当 する 数 値 モデルを 選 択 する と 、 浮 動 小 数点 コードのパフォーマンスが 影 響 を 受 ける 場 合 があ り ます。注最 適 化 オプシ ョ ンの 実 装 情 報 は 今 後 の リ リ ースで 変 更 さ れる 可 能 性 があ る ため、 これらの 情 報 に 依 存 し ないよ う にし て 下 さい。デフォルト-Onum を 指 定 しない 場 合 は、-O2 が 想 定 されます。関 連 項 目• 「--autoinline, --no_autoinline」 (ページ 2-19)• 「--debug, --no_debug」 (ページ 2-41)• 「--forceinline」 (ページ 2-66)• 「--fpmode=model」 (ページ 2-67)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-109ID 100419Non-Confidential,


コンパイラのコマンドラインオプション• 「--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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションデフォルト-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);}<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-111ID 100419Non-Confidential,


コンパイラのコマンドラインオプション関 連 項 目• 「--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)• 「テンプレー ト のイ ンス タ ンス 生 成 」 (ページ 5-17)2-112 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション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 モード で 使 用 でき ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-113ID 100419Non-Confidential,


コンパイラのコマンドラインオプション構 文--pch_dir=dir各 パ ラ メ ータには 以 下 の 意 味 があ り ます。dirPCH フ ァ イルが 保 存 されるデ ィ レ ク ト リ の 名 前 です。エラー指 定 さ れたデ ィ レ ク ト リ 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)• 「--pch」 (ページ 2-113)• 「--pch_dir=dir」 (ページ 2-113)• 「--pch_verbose, --no_pch_verbose」 (ページ 2-115)• 「--use_pch=filename」 (ページ 2-144)2-114 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション• 「#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<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-115ID 100419Non-Confidential,


コンパイラのコマンドラインオプション各 パ ラ メ ータには 以 下 の 意 味 があ り ます。n使 用 可 能 な 同 時 に イ ン ス タ ン ス 化 で き る テンプレー ト の 最 大 数です。n が 0 の 場 合 、 制 限 はあ り ません。モードこ のオプシ ョ ンは、 ソ ース 言 語 が C++ の 場 合 にのみ 有 効 です。デフォルト--pending_instantations オプシ ョ ンを 指 定 しなかった 場 合 、 コンパイ ラは--pending_instantiations=64 が 指 定 されたと き と 同 じ 処 理 を 実 行 します。使 用 法こ のオプシ ョ ン を 使 用 する と 、 無 制 限 に 繰 り 返 さ れる イ ン ス タ ン ス 化 を 検 出できます。2.1.127 --phony_targetsこ のオプシ ョ ンは、 ダ ミ ーの メ ー ク フ ァ イル 規 則 を 生 成 する よ う コ ンパイ ラに 指 示 し ます。 こ れら の 規 則 は、 メ ー ク フ ァ イルに 対 応 する 更 新 を 行 わずにヘ ッ ダーフ ァ イ ルを 削 除 し た 場 合 に 生 成 さ れる make エラーを 回 避 します。このオプションは、 GCC のコマンド ラインオプショ ン -MG に 似 ています。例出 力 例source.o: source.csource.o: header.hheader.h:関 連 項 目• 「--depend=filename」 (ページ 2-44)• 「--depend_format=string」 (ページ 2-45)• 「--depend_system_headers, --no_depend_system_headers」(ページ 2-47)• 「--depend_target=target」 (ページ 2-48)2-116 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション• 「--ignore_missing_headers」 (ページ 2-80)• 「-M」 (ページ 2-99)• 「--md」 (ページ 2-100)2.1.128 --pointer_alignment=numこ のオプシ ョ ン を 使 用 し て、 アプ リ ケーシ ョ ンに 必 要 な 非 境 界 整 列 ポ イ ン タのサポー ト を 指 定 でき ます。構 文--pointer_alignment=numnum には 以 下 のいずれかを 指 定 で き ます。1 ポ イ ン タ を 介 し たア ク セスは、 境 界 整 列 が 1 である (バイ ト 境 界で 整 列 されるか 境 界 整 列 されない) ものと して 処 理 されます。2 ポ イ ン タ を 介 し たア ク セスは、 境 界 整 列 が 最 大 2 である (ハーフワー ド 境 界 で 整 列 さ れる) も の と し て 処 理 さ れます。4 ポ イ ン タ を 介 し たア ク セスは、 境 界 整 列 が 最 大 4 である (ワード境 界 で 整 列 さ れる) も の と し て 処 理 さ れます。8 ポ イ ン タ でのア ク セスは、 通 常 の 境 界 整 列 であ る と し て、 つまり 最 大 で も ダブルワー ド 境 界 で 整 列 さ れる も の と し て 処 理 さ れます。使 用 法こ のオプシ ョ ンは、 境 界 整 列 要 件 がないアーキテ ク チャ 用 に 記 述 さ れた ソ ース コー ド を 移 植 する 場 合 に 利 用 で き ます。 __packed 修 飾 子 を 使 用 する こ と で、生 成 さ れる コー ド の 質 に 大 き な 影 響 を 及 ぼすこ と な く 、 非 境 界 整 列 データへのア ク セス を よ り 厳 密 に 制 御 で き ます。制 約 条 件ポ イ ン タ が 境 界 整 列 さ れていない と 、 非 境 界 整 列 ア ク セスがサポー ト さ れたCPU でも、 コードサイズが 大 き くなることがあります。 こ れは、 非 境 界 整 列アクセスのサポートによるメ リ ッ トは、 ロード 命 令 とストア 命 令 のサブセットにしかないからです。 コ ンパ イ ラ は、 非 境 界 整 列 さ れた メ モ リ オブジ ェ ク<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-117ID 100419Non-Confidential,


コンパイラのコマンドラインオプショント に 対 し て、 ハー ド ウ ェ ア 浮 動 小 数 点 の ロー ド 命 令 と ス ト ア 命 令 な ど、 多 重ワー ド 転 送 命 令 ま たはコ プ ロ セ ッ サ と メ モ リ 間 の 転 送 命 令 を 直 接 的 に 使 用 することができません。注• 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.c2-118 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション関 連 項 目• 「-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)• 「-E」 (ページ 2-58)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-119ID 100419Non-Confidential,


コンパイラのコマンドラインオプション2.1.131 --profile=filenameこのオプションを 使 用 すると、 <strong>ARM</strong> Profiler からのフィードバックを 使 用 する よ う に コ ンパイ ラ に 指 定 する こ と に よ り 、 サ イ ズが 小 さ く パフ ォーマン スの 高 いコー ド を 生 成 でき ます。構 文--profile=filename各 パ ラ メ ータには 以 下 の 意 味 があ り ます。filename<strong>ARM</strong> Profiler 解 析 フ ァ イルの 名 前 です。例この 例 では、hello.c の コー ド を 生 成 する と き に、 hello_001.apa で 提 供 される<strong>ARM</strong> Profiler フィードバックが 使 用 されます。armcc -c -O3 -Otime --profile=hello_001.apa hello.c関 連 項 目• 『<strong>ARM</strong> Profiler ユーザガイ ド』2.1.132 --project=filename, --no_project=filenameオプシ ョ ン --project=filename は、 filename に よ っ て 指 定 さ れたプ ロ ジ ェ ク トテンプレート ファイルをロードするよ うにコンパイラに 指 示 します。注filename をデフォル ト のプロジェ ク ト フ ァ イルと して 使 用 するには、RVDS_PROJECT 環 境 変 数 を filename に 設 定 し ます。オプシ ョ ン --no_project を 指 定 する と 、 環 境 変 数 RVDS_PROJECT で 指 定 されたデフォルトのプロジェク トテンプレートファイルは 使 用 されません。構 文--project=filename--no_project2-120 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション各 パラ メ ータには 以 下 の 意 味 があ り ます。filenameプロジェク トテンプレート ファイルの 名 前 です。制 約 条 件プロジェク トテンプレート ファイルのオプショ ンは、 コマンド ラインで 設 定済 みのオプシ ョ ン と 競 合 し ない 場 合 にのみ 設 定 で き ます。 プロジェク トテンプレー ト フ ァ イルのオプシ ョ ンが 既 存 のコマン ド ラ インオプシ ョ ン と 競 合 する 場 合 は、 コ マン ド ラ イ ンオプシ ョ ンが 優 先 さ れます。例以 下 のプ ロ ジ ェ ク ト テンプレー ト フ ァ イルについて 考 えてみます。--cpu=<strong>ARM</strong>926EJ-S--fpu=vfpv2RVDS_PROJECT 環 境 変 数 が こ のフ ァ イ ルを 示 すよ う に 設 定 さ れてい る 場 合 に、 次のコマンドを 実 行 したと します。armcc -c foo.cの 実 際 のコマン ド ラ イ ンは、 以 下 のよ う にな り ます。armcc --cpu=<strong>ARM</strong>926EJ-S --fpu=VFPv2 -c foo.c関 連 項 目• 「--reinitialize_workdir」 (ページ 2-123)• 「--workdir=directory」 (ページ 2-152)2.1.133 --reassociate-saturationこ のオプシ ョ ン を 使 用 する こ と で、 サチュ レー ト 演 算 の 再 関 連 付 けを 許 可 して、 サチュレー ト 加 算 を 使 用 するループをベク ト ル 化 する と きに 最 適 化 を 強化 でき ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-121ID 100419Non-Confidential,


コンパイラのコマンドラインオプション制 限サチュ レー ト 加 算 は 関 連 付 けで き ないため、 再 関 連 付 けを 有 効 にする と 結 果に 影 響 し、 精 度 が 落 ちます。例次 のコード は、 --reassociate-saturation を 指 定 しなければベク トル 化 しません。#include 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション使 用 法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.c2.1.135 --reinitialize_workdirこのオプションを 使 用 すると、--workdir を 使 用 してプロジェ ク ト テンプレート の 作 業 デ ィ レ ク ト リ を 再 初 期 化 する かど う かを 指 定 で き ます。--workdir を 使 用 して 設 定 されたディ レ ク ト リ が、 変 更 されたプロジェ ク ト テンプレー ト フ ァ イルが 含 まれてい る 既 存 の 作 業 デ ィ レ ク ト リ を 参 照 し てい る場 合 、 こ のオプシ ョ ン を 指 定 する と 、 作 業 デ ィ レ ク ト リ は 削 除 さ れ、 元 のプロ ジ ェ ク ト テンプレー ト フ ァ イ ルの 新 し い コ ピーで 再 作 成 さ れます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-123ID 100419Non-Confidential,


コンパイラのコマンドラインオプション制 約 条 件このオプションは、--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 つのオブジェク ト フ ァ イルでのみ 宣 言 で き ます)。 ただし、 <strong>ARM</strong> Linux コンフィギュレーシ ョ ン フ ァ イルを コ マン ド ラ イ ンで 指 定 し て、--translate_gcc を 使 用 した 場合 、 デフ ォル ト は --relaxed_ref_def にな り ます。制 約 条 件このオプションは C++ で 使 用 でき ません。関 連 項 目• 「--arm_linux_config_file=path」 (ページ 2-12)• 「--arm_linux_configure」 (ページ 2-13)• 「--translate_gcc」 (ページ 2-138)• 『Rationale for International Standard - Programming Languages - C』2-124 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション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 はデフ ォル ト でデ ィ セーブルになっています。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-125ID 100419Non-Confidential,


コンパイラのコマンドラインオプション関 連 項 目• 「restrict」 (ページ 3-9)2.1.139 --retain=optionこ のオプシ ョ ン を 使 用 する と 、 コ ンパ イ ラ に よ って 実 行 さ れる 最 適 化 を 制 限で き、 検 証 、 デバ ッ グ、 カバレ ッ ジテ ス ト などの 実 行 時 に 便 利 です。構 文--retain=optionoption には、 以 下 のいずれかを 指 定 し ます。fnsinlinefns使 用 されていない 関 数 が 削 除 されるのを 防 ぎます。使 用 されていないインラ イン 関 数 が 削 除 されるのを 防 ぎます。noninlinefns 使 用 されていない 非 インラ イン 関 数 が 削 除 されるのを 防 ぎます。pathscallsa||b から a|b への 変 換 など、 パス 削 除 によ る 最 適 化 が 行 われるのを 防 ぎます。 これによ り、 MCDC (Modified Condition DecisionCoverage) テス トがサポート されます。例 えばイ ン ラ イ ン 展 開 ま たは 末 尾 呼 び 出 し に よ って、 呼 び 出 しが 削 除 されるのを 防 ぎます。calls:distinct例 えば ク ロ ス ジ ャ ンプ (つま り 、 共 通 末 尾 パス マージ) に よ って、 呼 び 出 しがマージされるのを 防 ぎます。libcallsdatarodatarwdatadata:order例 えばイ ン ラ イ ン 展 開 に よ って、 ラ イ ブ ラ リ 関 数 への 呼 び 出 しが 削 除 されるのを 防 ぎます。データ が 削 除 さ れる のを 防 ぎ ます。読 み 出 し 専 用 データが 削 除 されるのを 防 ぎます。読 み 出 し / 書 き 込 みデータ が 削 除 さ れる のを 防 ぎ ます。データ が 並 べ 替 え られるのを 防 ぎ ます。関 連 項 目• 「__attribute__((nomerge))」 (ページ 4-40)• 「__attribute__((notailcall))」 (ページ 4-41)2-126 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション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)• 「--asm」 (ページ 2-17)• 「-c」 (ページ 2-24)• 「--info=totals」 (ページ 2-82)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-127ID 100419Non-Confidential,


コンパイラのコマンドラインオプション• 「--interleave」 (ページ 2-84)• 「--list」 (ページ 2-92)• 「-o filename」 (ページ 2-106)• 『アセンブラガイ ド』2.1.142 --sharedこのオプションを 使 用 すると、--arm_linux_paths オプシ ョ ンを 使 用 して <strong>ARM</strong>Linux のビルドを 行 う と きに、 共 有 ラ イブラ リ を 生 成 できます。 <strong>ARM</strong> 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 -olibexample.so obj1.o obj2.o関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--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)2-128 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション• 「--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 theGNU <strong>Tools</strong> 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 です。 ただし、 <strong>ARM</strong> Linux コンフィギュレーシ ョ ン フ ァ イルを コ マン ド ラ イ ンで 指 定 し て、 --translate_gcc または--tranlsate_g++ を 使 用 した 場 合 、 デフォル ト は --signed_bitfields にな り ます。注<strong>ARM</strong> のビッ ト フ ィールドをデフォルト で 符 号 なしの 値 にする AAPCS の 要 件は、 バージ ョ ン 2.03 の 標 準 では 緩 和 されま し た。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-129ID 100419Non-Confidential,


コンパイラのコマンドラインオプション例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 を 定 義します。注こ のオプシ ョ ン を 使 用 ま たは 使 用 せずに コ ンパイル さ れてお り 、 イ ン タフ ェース ま たはデータ 構 造 を 共 有 し てい る 変 換 ユニ ッ ト を 混 合 する と きは、注 意 が 必 要 です。<strong>ARM</strong> ABI では、 char を 符 号 なしバイ ト と して 定 義 します。 これは、 RVCT に付 属 の C++ ラ イ ブ ラ リ が 使 用 し てい る 解 釈 です。デフォルトデフォル ト は --unsigned_chars です。関 連 項 目• 「 定 義 済 みマ ク ロ」 (ページ 4-129)2-130 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション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 オプシ ョ ン を 使 用 する と 、 以 下 の <strong>ARM</strong> システムで 割 り 込 みレイテンシを 減 少 させるこ とができます。• キャッシュレス <strong>ARM</strong>7TDMI などのキャッシュや 書 き 込 みバッファのない <strong>ARM</strong> システム• ゼロウェイ ト 状 態 モード、 32 ビ ッ ト メ モ リ を 使 用 する <strong>ARM</strong> システム注--split_ldm を 使 用 する と 、 コー ド サ イ ズが 増 加 し、 パフ ォーマン スが 若 干 低下 します。制 約 条 件• --split_ldm を 使 用 する と 、 デフ ォル ト では イ ン ラ イ ンアセンブ ラ の LDM命 令 と STM 命 令 が 分 割 さ れます。 ただし、 後 で 個 々の 命 令 が LDM 命 令 ま たは STM 命 令 に 再 連 結 さ れる こ と があ り ます。• --split_ldm を 使 用 する と 、 LDM 命 令 と STM 命 令 のみが 分 割 さ れます。• 一 部 の ターゲ ッ ト ハー ド ウ ェ アでは、--split_ldm を 指 定 してコードをビルドしても 効 果 がありません。 以 下 に 例 を 示 し ます。— キャッシュ 付 きシステムや 書 き 込 みバッファ 付 きプロセッサ。— ゼ ロ ウ ェ イ ト 状 態 メ モ リ を 使 用 し ていないシ ス テムや、 低 速 なペリフェラルデバイスのあるシステム。 このよ うなシステムの 割 り 込みレ イ テンシは、 最 も 速 度 の 遅 い メ モ リ またはペ リ フ ェ ラルデバ<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-131ID 100419Non-Confidential,


コンパイラのコマンドラインオプションイスへのアクセスに 必 要 なサイクル 数 によって 決 まります。 この 割り 込 みレイテンシは、 通 常 、 複 数 レジスタの 転 送 によって 誘 発 されるレイテンシよ り も 大 き くなり ます。関 連 項 目• 『コンパイ ラユーザガイ ド』 の 「 命 令 の 展 開 」 (ページ 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションf PROCAREA ||i.f||, CODE, READONLY, ALIGN=2ADD r0,r0,#1BX lrENDP関 連 項 目• 「--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 • ISO/IEC 9899:1990, the 1990 International Standard for C• ISO/IEC 9899 AM1, the 1995 Normative Addendum 1ISO C99ISO C++ISO/IEC 9899:1999, the 1999 International Standard for CISO/IEC 14822:2003, the 2003 International Standard for C++<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-133ID 100419Non-Confidential,


コンパイラのコマンドラインオプションエラー--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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション#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 によって 指 定 されたディレクト リで 最 初 に 検 索 されるという 点 です。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-135ID 100419Non-Confidential,


コンパイラのコマンドラインオプション関 連 項 目• 「-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 命 令 セットがターゲットになるようにコ ンパ イ ラ が 設 定 さ れます。デフォルトこれは、 <strong>ARM</strong> 命 令 セ ッ ト に 対 応 し ていない ターゲ ッ ト のデフ ォル ト オプシ ョンです。関 連 項 目• 「--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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション使 用 法こ のオプシ ョ ン を 使 用 する と 、 以 下 のいずれかが 提 供 さ れます。• <strong>ARM</strong> Linux をターゲッ ト とした 完 全 な GCC エミュレーション• 個 々の GCC コ マン ド ラ イ ン 引 数 をそれに 相 当 する RVCT 引 数 に 変 換 することによる、 完 全 な GCC エミュレーションのサブセット完 全 な <strong>ARM</strong> Linux GCC エミュレーションを 提 供 するには、--arm_linux_config_file も 使 用 する 必 要 があり ます。 これらのオプショ ンを 組み 合 わせて 使 用 する こ と に よ り 、 コ ン フ ィ ギ ュ レーシ ョ ン フ ァ イルに よ って指 定 さ れた 適 切 な GNU ヘッダファイルと ライブラ リが 選 択 され、デフォルト動 作 に 対 する 変 更 が 組 み 込 まれます。完 全 な GCC エミュレーションを 目 標 とせずに、GCC コマンドライン 引 数 をそれに 相 当 する RVCT 引 数 に 変 換 するには、 --translate_g++ を 使 用 して g++ をエミュレートします。 ただし、--arm_linux_config_file と 一 緒 には 使 用 しないで 下 さい。 こ の 方 法 では 完 全 な GCC エミュレーションを 目 標 としていないので、 RVCT のデフ ォル ト 動 作 が 保 持 され、 <strong>ARM</strong> Linux をターゲッ ト としたデフ ォル ト の 設 定 は 行 われません。 RVCT ライブラリパスとオプションのデフォルトは 変 更 されません。制 約 条 件<strong>ARM</strong> Linux コンフィギュレーションファイルをコマンドラインで 指 定 して--translate_g++ を 使 用 した 場 合 は、--exceptions と--no_exceptions、--bss_threshold、--relaxed_ref_def と --no_relaxed_ref_def、 および --signed_bitfields と --unsigned_bitfields のデフ ォル ト 設 定 が 変 更 されます。関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--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)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-137ID 100419Non-Confidential,


コンパイラのコマンドラインオプション• 「--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 theGNU <strong>Tools</strong> and Libraries』2.1.153 --translate_gccこのオプションを 使 用 すると、 GNU ツールからのコマン ド ラ インの 変 換 を 有効 にし て、 gcc をエミ ュレート できます。使 用 法こ のオプシ ョ ン を 使 用 する と 、 以 下 のいずれかが 提 供 さ れます。• <strong>ARM</strong> 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションいので、 RVCT のデフ ォル ト 動 作 が 保 持 され、 <strong>ARM</strong> Linux をターゲッ ト としたデフ ォル ト の 設 定 は 行 われません。 RVCT ライブラリパスとオプションのデフォルトは 変 更 されません。制 約 条 件<strong>ARM</strong> Linux コンフィギュレーションファイルをコマンドラインで 指 定 して--translate_gcc を 使 用 した 場 合 は、--bss_threshold、--relaxed_ref_def と--no_relaxed_ref_def、 および --signed_bitfields と --unsigned_bitfields のデフォルト 設 定 が 変 更 されます。関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--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 theGNU <strong>Tools</strong> and Libraries』<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-139ID 100419Non-Confidential,


コンパイラのコマンドラインオプション2.1.154 --translate_gldこのオプションを 使 用 すると、 GNU ツールからのコマン ド ラ インの 変 換 を 有効 にし て、 GNU ld をエミ ュレート できます。使 用 法こ のオプシ ョ ン を 使 用 する と 、 以 下 のいずれかが 提 供 さ れます。• <strong>ARM</strong> 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 のデフ ォル ト 動 作 が 保 持 され、 <strong>ARM</strong> Linux をターゲッ ト としたデフォルトの 設 定 は 行 われません。 RVCT ライブラリパスとオプションのデフォルトは 変 更 されません。注• --translate_gld は、 armcc を GNU リ ンカであ る かの よ う に 呼 び 出 し て 使用 します。 GNU リ ン カ と 直 接 関 連 する 既 存 のビル ド ス ク リ プ ト に よ っ て使 用 さ れる こ と だけを 想 定 し ています。• gcc モード と g++ モード では、--translate_gld を 指 定 する と、 armcc がそれによって 使 用 される リ ンカと して 報 告 されます。 例 えば gcc-print-file-name=ld のよ うになり ます。関 連 項 目• 「--arm_linux」 (ページ 2-10)• 「--arm_linux_config_file=path」 (ページ 2-12)• 「--arm_linux_configure」 (ページ 2-13)2-140 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション• 「--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 theGNU <strong>Tools</strong> and Libraries』2.1.155 --trigraphs, --no_trigraphsこ のオプシ ョ ン を 使 用 する と 、 ト リ グ ラ フの 認 識 を イ ネーブルま たはデ ィセーブルにでき ます。デフォルトデフォル ト は --trigraphs です。 ただし、 GNU モード の 場 合 は 例 外 で、 この 場合 のデフ ォル ト は --no_trigraphs にな り ます。関 連 項 目• ISO/IEC 9899:TC22.1.156 -Unameこのオプションを 使 用 すると、 マクロ name の 最 初 の 定 義 を 削 除 できます。マクロ name には、 以 下 のいずれかを 指 定 でき ます。• 定 義 済 みマ ク ロ。• -D オプシ ョ ン を 使 用 し て 指 定 さ れたマ ク ロ。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-141ID 100419Non-Confidential,


コンパイラのコマンドラインオプション注すべての コ ンパイ ラ の 定 義 済 みマ ク ロ について、 定 義 を 削 除 で き るわけではありません。構 文-Uname各 パ ラ メ ータには 以 下 の 意 味 があ り ます。name定 義 を 削 除 する マ ク ロ の 名 前 です。使 用 法-Uname を 指 定 したと きの 効 果 は、 各 ソースフ ァ イルの 冒 頭 にテキス ト #undefname を 記 述 し た と き の 効 果 と 同 じ です。制 約 条 件コ ンパ イ ラ は 以 下 の 順 序 でマ ク ロ を 定 義 し た り 、 定 義 を 削 除 し た り し ます。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このオプションを 使 用 すると、 <strong>ARM</strong> アーキテクチャベースのプロセッサでのデータへの 非 境 界 整 列 ア ク セス を 有 効 ま たは 無 効 にで き ます。2-142 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプションデフォルトデフ ォル ト は、 データへの 非 境 界 整 列 ア ク セス をサポー ト し てい る <strong>ARM</strong>アーキテクチャベースのプロセッサの --unaligned_access です。 この 中 には 以下 が 含 まれます。• すべての <strong>ARM</strong>v6 アーキテクチャベースのプロセッサ。• <strong>ARM</strong>v7-A および <strong>ARM</strong>v7-R アーキテクチャベースのプロセッサ。デフ ォル ト は、 データへの 非 境 界 整 列 ア ク セスに 対 応 し ていない <strong>ARM</strong> アーキテクチャベースのプロセッサの --no_unaligned_access です。 この 中 には 以 下が 含 まれます。• すべての <strong>ARM</strong>v6 より 前 のアーキテクチャベースのプロセッサ。• <strong>ARM</strong>v7-M アーキテクチャベースのプロセッサ。使 用 法--unaligned_access--cpu=<strong>ARM</strong>1136J-S などのデータへの 非 境 界 整 列 ア ク セス をサポートするプロセッサで --unaligned_access を 使 用 する と、 パッ ク 構造 体 へのア ク セス を 高 速 化 で き ます。非 境 界 整 列 のサポー ト を イ ネーブルする には、 以 下 の 手 順 を 実行 する 必 要 があ り ます。• 初 期 化 コー ド で CP15 レジスタの A ビッ ト (ビッ ト 1) をクリアします。• 初 期 化 コー ド で CP15 レジスタ 1 の U ビット (ビッ ト 22) を設 定 し ます。U ビ ッ ト の 初 期 値 は、 コ アへの UBITINIT 入 力 に よ って 決定 します。RVCT ラ イ ブ ラ リ には、 非 境 界 整 列 ア ク セス を 利 用 する 目 的 で 設計 された 特 殊 なバージ ョ ンの 特 定 のラ イブラ リ 関 数 が 含 まれています。 非 境 界 整 列 ア ク セスのサポー ト が イ ネーブル さ れてい る場 合 は、 RVCT ツールはこれらのラ イブラ リ 関 数 を 使 用 して、 非境 界 整 列 ア ク セス を 利 用 し ます。--no_unaligned_access--no_unaligned_access は、 <strong>ARM</strong>v6 プ ロ セ ッ サで 非 境 界 整 列 ワー ドまたはハーフワードへのアクセスを 生 成 しないときに 使 用 します。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-143ID 100419Non-Confidential,


コンパイラのコマンドラインオプション非 境 界 整 列 ア ク セス を 生 成 せずに <strong>ARM</strong>v6 ターゲッ トでモジュロの 4 バイ ト の 境 界 調 整 チェ ッ ク を 有 効 にするには、 以 下 の 手 順 を実 行 する 必 要 があ り ます。• 初 期 化 コー ド で CP15 レジスタ 1 の A ビッ ト (ビッ ト 1) を設 定 し ます。• 初 期 化 コー ド で CP15 レジスタ 1 の U ビッ ト (ビッ ト 22) を設 定 し ます。U ビッ トの 初 期 値 は、 コアへの UBITINIT 入 力 に よ っ て 決定 します。注long long 整 数 への 非 境 界 整 列 ア ク セス などの 非 境 界 整 列 ダブルワードアクセスは、 <strong>ARM</strong> プロセッサコアではサポート されていません。 ダブルワード アクセスは、 8 バイ ト または 4 バイ ト 境 界で 整 列 さ れる 必 要 があ り ます。コンパイラは、モジュロ 8 バ イ ト の 境 界 調 整 チェ ッ ク をサポー トしていません。 すなわち、 CP15 レジスタ 1 のコンフィグレーション U = 0, A = 1 は、 コ ンパイ ラ (よ り 一 般 的 には RVCT ツールセッ ト) ではサポート されません。RVCT ラ イ ブ ラ リ には、 非 境 界 整 列 ア ク セス を 利 用 する 目 的 で 設計 された 特 殊 なバージ ョ ンの 特 定 のラ イブラ リ 関 数 が 含 まれています。 非 境 界 整 列 ア ク セスのサポー ト がデ ィ セーブル さ れている と き に、 こ の よ う な 拡 張 さ れた ラ イ ブ ラ リ 関 数 が 使 用 さ れないによ う にするには、 C および C++ のソースファイルとアセンブリ 言 語 のソースファイルの 混 合 をコンパイルする 際 にコンパイ ラのコマンド ラ インとアセンブラのコマンド ラ インの 両 方 で--no_unaligned_access を 指 定 する 必 要 があ り ます。制 約 条 件データへの 非 境 界 整 列 ア ク セス をサポー ト し てい る プ ロ セ ッ サ 用 に コ ンパ イル さ れた コー ド は、 ソ フ ト ウ ェ アの 境 界 整 列 のサポー ト の 選 択 がプ ロ セ ッ サコ アの 境 界 整 列 のサポー ト の 選 択 と 一 致 し てい る 場 合 にのみ、 正 確 に 実 行 されます。2-144 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション関 連 項 目• 「--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)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-145ID 100419Non-Confidential,


コンパイラのコマンドラインオプション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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション制 約 条 件ループをベ ク ト ル 化 する には、 以 下 のオプシ ョ ン を 指 定 する 必 要 があ り ます。--cpu=nameターゲッ トプロセッサには NEON の 機 能 が 必 要 です。-Otime 実 行 時 間 を 短 縮 する ための 最 適 化 の 種 類 。-Onum最 適 化 のレベル。 以 下 のいずれかを 使 用 する 必 要 があ り ます。• -O2 高 度 な 最 適 化 。 これがデフォルトです。• -O3 最 大 限 の 最 適 化 。注NEON は、 <strong>ARM</strong> アドバンスト 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 に 対 応 し ていない リ ンカでは 無 視 されます。 こ のため、 こ れら の 情 報 に よ って 実 行 可 能 フ ァ イルのサ イ ズが 増 加するこ とはあ り ません。 ただし、 オブジェ ク ト フ ァ イルのサイズは 増 加 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-147ID 100419Non-Confidential,


コンパイラのコマンドラインオプションモードこ のオプシ ョ ンは、 ソ ース 言 語 が 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.txt2-148 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション以 下 の コ マン ド ラ イ ン を 使 用 し て 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)• 「--c99」 (ページ 2-26)• 「--cpp」 (ページ 2-34)• 「--gnu」 (ページ 2-75)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-149ID 100419Non-Confidential,


コンパイラのコマンドラインオプション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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション制 限--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)• 「--wchar32」 (ページ 2-151)• 「 定 義 済 みマ ク ロ」 (ページ 4-129)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-151ID 100419Non-Confidential,


コンパイラのコマンドラインオプション2.1.168 --wchar32このオプションを 選 択 すると、wchar_t の 型 が unsigned int に 変 更 されます。このオプションを 選 択 すると、 C の 定 義 された 型 wchar_t の 型 と C++ のネイティブ 型 wchar_t の 型 の 両 方 が 変 更 されます。 これは、WCHAR_MIN およびWCHAR_MAX の 値 にも 影 響 し ます。デフォルト--wchar32 が 明 示 的 に 指 定 されるか、 コマン ド ラ イ ンで <strong>ARM</strong> Linux コンフィギュレーションファイルを 指 定 しない 限 り、--wchar16 が 指 定 された と き と 同 じ処 理 が 行 われます。 <strong>ARM</strong> 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コンパイラのコマンドラインオプション関 連 項 目• 「--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 行 に 収 ま ら ないエ ラー メ ッ セージテキス トを 折 り 返 すかど う かを 指 定 でき ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-153ID 100419Non-Confidential,


コンパイラのコマンドラインオプションデフォルトデフォル ト は --no_wrap_diagnostics です。関 連 項 目• 「--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)• 「-W」 (ページ 2-149)• 『コンパイ ラユーザガイ ド』 の 第 6 章 診 断 メ ッ セージ2-154 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


第 3 章言 語 拡 張 機 能この 章 では、 <strong>ARM</strong> コ ンパイ ラ でサポー ト さ れてい る 言 語 拡 張 機 能 について 説明 します。 以 下 のセクシ ョ ンから 構 成 されています。• 「プ リ プ ロ セ ッ サ 拡 張 機 能 」 (ページ 3-2)• 「C90 で 使 用 可 能 な C99 言 語 機 能 」 (ページ 3-5)• 「C++ および C90 で 使 用 可 能 な C99 言 語 機 能 」 (ページ 3-7)• 「 標 準 の C 言 語 の 拡 張 機 能 」 (ページ 3-10)• 「 標 準 の C++ 言 語 の 拡 張 機 能 」 (ページ 3-16)• 「 標 準 C および 標 準 C++ 言 語 の 拡 張 機 能 」 (ページ 3-20)• 「GNU 言 語 拡 張 機 能 」 (ページ 3-26)<strong>ARM</strong> コ ンパイ ラ に 関 する 補 足 情 報 については、 以 下 の 付 録 を 参 照 し て 下 さ い。• 付 録 B 標 準 C の 実 装 定 義• 付 録 C 標 準 C++ の 実 装 定 義• 付 録 D C および C++ コ ンパ イ ラ の 実 装 に 関 する 制 限<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-1ID 100419Non-Confidential,


言 語 拡 張 機 能3.1 プ リ プ ロセ ッ サ 拡 張 機 能コンパイラは、System V リリース 4 の #assert プ リ プ ロ セ ッ シング 拡 張 機 能 をは じ め と する 複 数 のプ リ プ ロ セ ッ サ 拡 張 機 能 をサポー ト し ています。3.1.1 #assertSystem V リリース 4 の #assert プ リ プ ロ セ ッ シング 拡 張 機 能 がサポー ト さ れています。 こ れら の 拡 張 機 能 に よ って、 述 語 名 を 定 義 およびテ ス ト で き る よ うにな り ます。こ の よ う な 名 前 は 名 前 空 間 内 に 配 置 さ れ、 マ ク ロ 名 を 含 む 他 のすべての 名 前と 区 別 されます。構 文#assert name#assert name[(token-sequence)]各 パ ラ メ ータには 以 下 の 意 味 があ り ます。nametoken-sequence述 語 名オプシ ョ ンの ト ーク ンシーケンス。ト ー ク ンシーケ ン ス を 省 略 し た 場 合 、 name に 値 は 指 定 されません。トークンシーケンスを 含 めた 場 合 は、name に token-sequence値 が 指 定 されます。例#assert を 使 用 し て 定 義 し た 述 語 名 は、 例 えば 以 下 の よ う に、 #if 式 でテス ト できます。#if #name(token-sequence)この 結 果 、token-sequence トークンシーケンスが 含 まれた、 指 定 した 名 前 nameの #assert が 検 出 された 場 合 は 1 が 返 され、 検 出 されなかった 場 合 は 0 が 返 されます。 1 つの 述 語 には、 同 時 に 複 数 の 値 を 割 り 当 て る こ と がで き ます。関 連 項 目• 「#unassert」 (ページ 3-3)3-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能3.1.2 #include_nextこのプリプロセッサディレクティブは、#include ディレクティブのバリアントです。 こ のデ ィ レ ク テ ィ ブを 指 定 する と 、 カ レ ン ト ソ ース フ ァ イ ルが 検 出 されるディ レク ト リ、 つま り #include_next ディレクティブを 含 むディレク ト リに 続 く 検 索 パス 上 のデ ィ レ ク ト リ 内 でのみ、 指 定 さ れた フ ァ イ ルが 検 索 さ れます。注このプリプロセッサディレクティブは、 <strong>ARM</strong> コンパイラによってサポート されている GNU コ ンパイ ラ 拡 張 機 能 です。3.1.3 #unassert述 語 名 は #unassert プリプロセッシングディレクティブを 使 用 して 削 除 できます。構 文#unassert name#unassert name[(token-sequence)]各 パラ メ ータには 以 下 の 意 味 があ り ます。nametoken-sequence述 語 名オプシ ョ ンの ト ーク ンシーケンス。トークンシーケンスを 省 略 した 場 合 は、name の 定 義 がすべて 削 除 されます。ト ーク ンシーケン ス を 含 めた 場 合 は、 指 定 された 定 義 のみが 削 除 されます。 その 他 すべての 定 義 はそのまま 残 されます。関 連 項 目• 「#assert」 (ページ 3-2)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-3ID 100419Non-Confidential,


言 語 拡 張 機 能3.1.4 #warningプリプロセッシングディレクティブ #warning がサポー ト されます。 このディレクティブは、#error デ ィ レ ク テ ィ ブ と 同 様 に、 コ ンパ イ ル 時 にユーザ 定 義 警告 を 生 成 し ます。 ただし、 このディ レ クテ ィブによってコンパイルが 中 断 されるこ とはあ り ません。制 約 条 件--strict オプシ ョ ン を 指 定 し た 場 合 、 #warning ディレクティブは 使 用 できません。 使 用 し た 場 合 、 エ ラーが 生 成 さ れます。関 連 項 目• 「--strict, --no_strict」 (ページ 2-133)3-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能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関 連 項 目• 『コンパイ ラユーザガイ ド』 の 「C99 の 新 機 能 」 (ページ 5-51)3.2.2 構 造 体 への 添 字 の 付 加C90 では、 左 辺 値 でない 配 列 はポ イ ン タに 変 換 されるため、 これらの 配 列 に添 字 を 付 加 する こ と がで き ます。 ただし、 次 のシーケンスポイン ト の 後 でこれら の 配 列 を 変 更 ま たは 使 用 し た り 、 こ れら の 配 列 に 単 項 演 算 子 の & を 使 用したりすることはできません。 C90 ではこれらの 配 列 に 添 字 を 付 加 できますが、 C99 モード 以 外 ではこれらの 配 列 はポイ ン タに 変 換 されません。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-5ID 100419Non-Confidential,


言 語 拡 張 機 能例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;関 連 項 目• 『コンパイ ラユーザガイ ド』 の 「C99 の 新 機 能 」 (ページ 5-51)3-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能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);}<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-7ID 100419Non-Confidential,


言 語 拡 張 機 能関 連 項 目• 「--gnu」 (ページ 2-75)• 『コンパイ ラユーザガイ ド』 の 「C99 の 新 機 能 」 (ページ 5-51)3.3.2 long long<strong>ARM</strong> コ ンパイ ラ は、 型 指 定 子 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 引 数 に 適 用 さ れる よ う に 指 定 で きます。ま た、 プレーン 整 数 定 数 の 値 が 十 分 に 大 きい 場 合 、 プレーン 整 数 定 数 は longlong 型 または unsigned long long 型 にな り ます。 コンパイラによって、その 変 更を 示 す 警 告 メ ッ セージが 生 成 さ れます。 例 えば、 厳 密 な 1990 ISO 標 準 C では、2147483648 は unsigned long 型 です。 <strong>ARM</strong> C および C++ では、これが long long型 となります。 この 影 響 の 1 つとして、 以 下 のよ うな 式 の 値 があります。2147483648 > –1この 式 は、 厳 密 な C および C++ の 場 合 は 0、 <strong>ARM</strong> C および C++ の 場 合 は 1 に評 価 さ れます。long long 型 は、 通 常 の 算 術 変 換 で 使 用 さ れます。関 連 項 目• 「__int64」 (ページ 4-10)3-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能3.3.3 restrictrestrict キーワー ド は、 さ ま ざ ま なオブジ ェ ク ト のポ イ ン タ 型 や 関 数 パ ラメ ータ 配 列 が、 重 複 する メ モ リ 領 域 を 指 さ ない よ う にする こ と がで き る 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)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-9ID 100419Non-Confidential,


言 語 拡 張 機 能3.4 標 準 の C 言 語 の 拡 張 機 能コ ンパイ ラは、 旧 式 の 非 プロ ト タ イプ 定 義 を 無 効 にする 関 数 プロ ト タ イプなど、 さ まざまな ISO C99 標 準 の 拡 張 機 能 をサポー ト し ています。こ れら の 拡 張 機 能 は 以 下 の 場 合 に 使 用 で き ます。• ソース 言 語 が C99 で、 厳 密 モード 以 外 のモード でコ ンパイルし ている 場合• ソース 言 語 が C90 で、 厳 密 モード 以 外 のモード でコ ンパイルし ている 場合以 下 の 場 合 、 こ れら の 拡 張 機 能 は 使 用 で き ません。• ソース 言 語 が C90 で、 コ ンパイ ラが --strict コンパイラオプションを 使用 した 厳 密 な C90 のコンパイルに 制 限 されている 場 合• ソース 言 語 が C99 で、 コ ンパイ ラが --strict コンパイラオプションを 使用 した 厳 密 な 標 準 C のコンパイルに 制 限 されている 場 合• ソース 言 語 は C++ です。3.4.1 定 数 式イ ニシ ャ ラ イ ザでは、 以 下 に 示 すよ う な 拡 張 定 数 式 がサポー ト さ れています。以 下 の 例 では、 デフ ォル ト 、--strict_warnings、 および --strict の 各 コ ンパイラモードの 動 作 を 示 します。例 1 : 変 数 のア ド レスの 代 入コー ド には、 変 数 のア ド レ ス を フ ァ イルの 有 効 範 囲 内 で 代 入 する 定 数 式 が 含まれている 場 合 があ り ます。 以 下 に 例 を 示 し ます。int i;int j = (int)&i; /* but not allowed by ISO */上 記 の コー ド を C 用 にコ ンパイルする と、 以 下 の 動 作 が 発 生 し ます。• デフォル ト モードでは、 警 告 が 生 成 されます。• --strict_warnings モード では、 警 告 が 生 成 されます。• --strict モー ド では、 エ ラーが 生 成 さ れます。3-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能例 2 : 定 数 値 のイニシャライザ以 下 の 例 は、 定 数 値 を 含 む 式 を C コー ド で 記 述 し た 場 合 の コ ンパ イ ラ の 動 作を 示 しています。/* Std RVCT v3.1 */extern int const c = 10; /* ok ok */extern int const x = c + 10; /* error ext */static int y = c + 10; /* error ext */static int const z = c + 10; /* error ext */extern int *const cp = (int*)0x100; /* ok ok */extern int *const xp = cp + 0x100; /* error ext */static int * yp = cp + 0x100; /* error ext */static int *const zp = cp + 0x100; /* error ext */上 記 の コ メ ン ト 部 分 は、 ISO C 標 準 で 定 義 さ れてい る 動 作 、 Std と RVCT の 動作 を 示 し ています。 各 表 記 の 意 味 は 以 下 の と お り です。• ok は、 そのステー ト メ ン ト をすべての C モード で 使 用 でき る こ と を 示 しています。• ext は、 ISO C 標 準 の 拡 張 機 能 であ る こ と を 示 し ています。 この 動 作 は、C を コ ンパ イ ルする と き に 使 用 さ れる 厳 密 モー ド に よ っ て、 以 下 の よ うに 異 な り ます。非 厳 密警 告 が 生 成 さ れる こ と な く 、 使 用 で き ます。--strict_warnings使 用 でき ますが、 警 告 が 生 成 されます。--strictISO C 標 準 に 準 拠 し ていますが、 エラーが 発 生 し ます。関 連 項 目• 「--extended_initializers, --no_extended_initializers」(ページ 2-63)• 「--strict, --no_strict」 (ページ 2-133)• 「--strict_warnings」 (ページ 2-134)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-11ID 100419Non-Confidential,


言 語 拡 張 機 能3.4.2 配 列 と ポイ ン タの 拡 張 機 能以 下 の 配 列 と ポ イ ン タ の 拡 張 機 能 がサポー ト さ れています。• unsigned char * と char * な ど、 交 換 可 能 だが 同 一 ではない 型 へのポ イ ンタ 間 では、 代 入 と ポ イ ン タ の 相 違 が 許 可 さ れます。 この 中 には、 同 じサイ ズの 整 数 型 へのポ イ ン タ も 含 まれます。 典 型 的 な 例 と し ては、int * とlong * が 挙 げられます。 こ の 場 合 は 警 告 が 生 成 さ れます。任 意 の 文 字 へのポ イ ン タ に 対 する 文 字 列 定 数 の 代 入 は、 警 告 な し で 許 可されます。• ポインタ 型 の 代 入 は、int ** を const int ** に 代 入 する 場 合 など、 デステ ィ ネーシ ョ ンの 型 に ト ッ プレベル 以 外 の 型 修 飾 子 が 付 加 されている 場合 に 許 可 されます。 このよ う なポイ ン タ 型 の 比 較 と ポイ ン タの 相 違 も 許可 されます。 こ の 場 合 は 警 告 が 生 成 さ れます。• ポインタに 対 する 演 算 では、 必 要 に 応 じて、void へのポ イ ン タが 別 の 型に 暗 黙 的 に 変 換 さ れます。 また、 NULL ポ イ ン タ 定 数 も 、 必 要 に 応 じ て、適 切 な 型 の NULL ポイ ン タに 暗 黙 的 に 変 換 されます。 ISO C では、 これら の 変 換 が 可 能 な 演 算 子 と 、 そ う でない 演 算 子 があ り ます。• 明 示 的 な 型 のキ ャ ス ト がな く て も、 異 な る 関 数 型 へのポ イ ン タ を 代 入 したり、 等 しい (==) か 等 し くない (!=) かで 比 較 したりできます。 この場 合 は、 警 告 ま たはエ ラーが 生 成 さ れます。こ の 拡 張 機 能 は C++ モー ド では 使 用 でき ません。• void へのポ イ ン タは、 関 数 型 へのポ イ ン タ と の 間 で、 暗 黙 的 に 変 換 で きます。• イ ニシ ャ ラ イ ザでは、 あ る 整 数 型 でポ イ ン タ 定 数 値 を 保 持 で き る 場 合 、その 整 数 型 にポ イ ン タ 定 数 値 を キ ャ ス ト で き ます。• 左 辺 値 でない 配 列 式 は、 添 字 が 付 加 さ れてい る か、 似 た よ う な 方 法 で 使用 さ れる 場 合 に、 配 列 の 第 1 要 素 へのポ イ ン タ に 変 換 さ れます。3-12 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能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 */<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-13ID 100419Non-Confidential,


言 語 拡 張 機 能3.4.4 識 別 子 内 の ド ル 記 号識 別 子 内 では ド ル ($) 記 号 を 使 用 できます。注--strict オプシ ョ ンを 使 用 してコンパイルした 場 合 は、--dollar コマンドラインオプシ ョ ン を 使 用 し て、 識 別 子 内 で ド ル 記 号 を 使 用 可 能 にする こ と がで きます。例#define DOLLAR$関 連 項 目• 「--dollar, --no_dollar」 (ページ 2-57)• 「--strict, --no_strict」 (ページ 2-133)3.4.5 ト ッ プ レベルの 宣 言C の 入 力 フ ァ イルに ト ップレベルの 宣 言 を 必 ずし も 含 める 必 要 はあ り ません。エラーC の 入 力 フ ァ イルに ト ッ プレベルの 宣 言 が 含 まれていない 場 合 は、 注 釈 が 生成 されます。注デフ ォル ト では、 注 釈 は 表 示 されません。 注 釈 メ ッ セージを 表 示 する には、コンパイラオプション --remarks を 使 用 して 下 さい。関 連 項 目• 「--remarks」 (ページ 2-125)3.4.6 有 用 な 再 宣 言問 題 がない 場 合 、 typedef 名 の 再 宣 言 は 許 可 さ れます。 つま り、 同 じ 型 のtypedef 名 を 同 じ 有 効 範 囲 内 で 再 宣 言 で き ます。3-14 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能例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;}<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-15ID 100419Non-Confidential,


言 語 拡 張 機 能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(); // is the same as int f();};3-16 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能3.5.3 friendclass に 対 する friend 宣 言 では、 class キーワー ド を 省 略 で き ます。デフォル ト では、 アクセスのチェ ッ クは、 friend 宣 言 で 実 行 さ れません。 アクセスのチェ ッ ク を 行 う には、--strict コマンドラインオプショ ンを 使 用 して 下さい。例class B;class A{friend B; // is the same as "friend class B"};関 連 項 目• 「--strict, --no_strict」 (ページ 2-133)3.5.4 読 み 出 し / 書 き 込 み 定 数外 部 定 数 に リ ンケージを 指 定 する と 、 定 数 を 動 的 に 初 期 化 し た り 、 定 数 に 可変 メンバを 使 用 したりできます。注"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;<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-17ID 100419Non-Confidential,


言 語 拡 張 機 能定 数 ではユーザ 定 義 コ ン ス ト ラ ク タ を 含 む x を 動 的 に 初 期 化 する こ と はで きず、 ま た T が 可 変 メ ンバを 保 持 する こ と も で き ません。 例 3-2 の 新 しい リ ンケージ 指 定 では、 x が 定 数 で 初 期 化 さ れたかど う かにかかわ らず、 読 み 出 し /書 き 込 みセグ メ ン ト 内 にあ る こ と を 宣 言 し ています。 この 場 合 は x を 動 的 に 初期 化 する こ と が 可 能 であ り 、 T は 可 変 メ ンバを 保 持 でき ます。 x、 y、 z を 別 のフ ァ イル 内 で 定 義 する 場 合 も、 同 じ リ ンケージを 指 定 する 必 要 があ り ます。例 3-2 リンケージ 指 定extern const int z; /* in read-only segment, cannot *//* be dynamically initialized */extern "C++:read/write" const int y; /* in read/write segment *//* can be dynamically initialized */extern "C++:read/write"{const int i=5; /* placed in read-only segment, *//* not extern because implicitly static */extern const T x=6; /* placed in read/write segment */struct S{static const T T x; /* 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 言 語 で 記 述 さ れた ソースか ら 使 用 する こ とはでき ません。関 連 項 目• 「--apcs=qualifer...qualifier」 (ページ 2-4)3-18 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能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;// f’ s type has extern "C" linkage// pf points to an extern "C++" function// error unless implicit conversion is allowed<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-19ID 100419Non-Confidential,


言 語 拡 張 機 能3.6 標 準 C および 標 準 C++ 言 語 の 拡 張 機 能コンパイラは、 ISO C99 標 準 と ISO C++ 標 準 の 両 方 に 対 して、 さ まざまな 拡張 機 能 をサポー ト し ています。 こ れら の 拡 張 機 能 には、 さ ま ざ ま な 整 数 型 拡張 機 能 、 浮 動 小 数 点 拡 張 機 能 、 16 進 数 の 浮 動 小 数 点 定 数 、 匿 名 ク ラ ス、 匿 名構 造 体 、 匿 名 共 同 体 などがあ り ます。こ れら の 拡 張 機 能 は 以 下 の 場 合 に 使 用 で き ます。• ソース 言 語 が C++ で、 厳 密 モード 以 外 のモード でコ ンパイルし ている 場合• ソース 言 語 が C99 で、 厳 密 モード 以 外 のモード でコ ンパイルし ている 場合• ソース 言 語 が C90 で、 厳 密 モード 以 外 のモード でコ ンパイルし ている 場合これらの 拡 張 機 能 は 以 下 の 場 合 には 使 用 でき ません。• ソース 言 語 が C++ で、 コ ンパイ ラが --strict コンパイラオプションを 使用 した 厳 密 な C++ のコンパイルに 制 限 されている 場 合• ソース 言 語 が C99 で、 コ ンパイ ラが --strict コンパイラオプションを 使用 した 厳 密 な 標 準 C のコンパイルに 制 限 されている 場 合• ソース 言 語 が C90 で、 コ ンパイ ラが --strict コンパイラオプションを 使用 した 厳 密 な C90 のコンパイルに 制 限 されている 場 合3.6.1 レ ジス タ 変 数 のア ド レ スregister 記 憶 域 ク ラ スの 変 数 のア ド レ ス を 取 得 でき ます。エラーregister 記 憶 域 ク ラ ス を 含 む 変 数 のア ド レ ス を 取 得 する と 、 コ ンパイ ラ によ っ て 警 告 が 生 成 さ れます。例void foo(void){register int i;int *j = &i;}3-20 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能3.6.2 関 数 の 引 数デフ ォル ト の 引 数 は、 ト ッ プレベルの 関 数 宣 言 以 外 の 関 数 パ ラ メ ータ に 対 して 指 定 でき ます。 例 えば、 デフ ォル ト の 引 数 は、 typedef 宣 言 、 関 数 へのポ インタ 宣 言 、 メンバ 関 数 へのポインタ 宣 言 で 使 用 できます。3.6.3 匿 名 ク ラ ス、 匿 名 構 造 体 、 匿 名 共 用 体匿 名 ク ラ ス、 匿 名 構 造 体 、 匿 名 共 用 体 は、 拡 張 機 能 と し てサポー ト さ れています。 ま た、 匿 名 構 造 体 、 および 匿 名 共 用 体 は、 C および C++ でサポー ト されています。デフ ォル ト では、 匿 名 共 用 体 は C++ で 使 用 でき ます。 ただ し、 以 下 の 場 合 は、anon_unions プ ラ グマを 指 定 する 必 要 があ り ます。• C で 匿 名 共 用 体 と 匿 名 構 造 体 を 使 用 する 場 合• C++ で 匿 名 ク ラ ス と 匿 名 構 造 体 を 使 用 する 場 合匿 名 共 同 体 は、 typedef の 名 前 によ って、 それを 保 持 する ク ラ スに 導 入 でき ます。 こ の 共 同 体 は、 実 際 の 匿 名 共 同 体 と は 異 な り 、 直 接 宣 言 する 必 要 はあ りません。 以 下 に 例 を 示 し ます。typedef union{int i, j;} U; // U identifies a reusable anonymous union.#pragma anon_unionsclass A{U; // Okay -- references to A::i and A::j are allowed.};こ の 拡 張 機 能 に よ って、 匿 名 ク ラ ス と 匿 名 構 造 体 を 使 用 で き ます。 ただ し、C++ の 機 能 が 使 用 されていないこ とが 条 件 です。 例 えば、 ス タテ ィ ッ クデータ メ ンバやメ ンバ 関 数 、 非 公 開 メ ンバ、 およびネス ト されている 型 ( 匿 名 クラ ス、 匿 名 構 造 体 、 匿 名 共 用 体 を 除 く ) は、 匿 名 ク ラ スおよび 匿 名 構 造 体 では 使 用 でき ません。 以 下 に 例 を 示 し ます。#pragma anon_unionsstruct A{struct{int i, j;}; // Okay -- references to A::i and A::j are allowed.};<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-21ID 100419Non-Confidential,


言 語 拡 張 機 能関 連 項 目• 「 無 名 のフ ィ ール ド 」 (ページ 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 シンボルがエクスポート されます。関 連 項 目• 「__asm」 (ページ 4-5)3.6.5 空 の 宣 言セミコロンだけの 空 の 宣 言 が 許 可 されます。例; // do nothing3.6.6 16 進 数 浮 動 小 数 点 定 数<strong>ARM</strong> コ ンパイ ラ は、 浮 動 小 数 点 定 数 を IEEE ビッ トパターンとして 明 示 的 に指 定 できるように、 C の 数 値 定 数 構 文 の 拡 張 機 能 を 実 装 し ています。3-22 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能構 文IEEE ビ ッ ト パターン と し て 浮 動 小 数 点 定 数 を 指 定 する ための 構 文 は 以 下 の とおりです。0f_n0d_nn8 桁 の 16 進 数 n が float 定 数 と 解 釈 さ れます。 桁 数 は 必 ず 8 桁 であ る 必 要 があ り ます。16 桁 の 16 進 数 nn が double 定 数 と 解 釈 さ れます。 桁 数 は 必 ず 16 桁である 必 要 があ り ます。3.6.7 不 完 全 な 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++ では、 ラベル 定 義 の 直 後 に 閉 じ 中 括 弧 を 配 置 できます。エラーラベル 定 義 の 直 後 に 閉 じ 中 括 弧 があ る 場 合 は、 コ ンパ イ ラ に よ っ て 警 告 が 生成 されます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-23ID 100419Non-Confidential,


言 語 拡 張 機 能例void foo(char *p){if (p){/* ... */label:}}3.6.10 long floatlong float は、 double と 同 じ 意 味 と し て 容 認 さ れます。3.6.11 非 ス タ テ ィ ッ ク ローカル 変 数括 弧 で 囲 まれた 関 数 の 非 ス タテ ィ ッ ク ローカル 変 数 は、 ローカルク ラ ス 内 の、例 えば sizeof などの 評 価 されない 式 で 参 照 できます。 こ の 場 合 は 警 告 が 生 成されます。3.6.12 構 造 体 、 共 用 体 、 列 挙 型 、 ビ ッ ト フ ィ ール ド の 拡 張 機 能以 下 の 構 造 体 、 共 用 体 、 列 挙 型 、 ビ ッ ト フ ィ ール ド の 拡 張 機 能 がサポー ト されています。• C では、 フ ァ イ ル 有 効 範 囲 配 列 の 要 素 の 型 は、 不 完 全 な struct 型 またはunion 型 にでき ます。 要 素 の 型 は、 例 えば 配 列 に 付 加 さ れる 添 字 があ る 場合 など、 そのサ イ ズが 必 要 と さ れる 前 に 完 全 になってい る 必 要 があ り ます。 配 列 が extern 型 でない 場 合 、 要 素 の 型 はコ ンパイルが 終 了 する までに 完 全 になっている 必 要 があ り ます。• struct 指 定 子 ま たは union 指 定 子 の 閉 じ 中 括 弧 (}) の 前 にある 最 後 のセミコロンは 省 略 できます。 こ の 場 合 は 警 告 が 生 成 さ れます。• 値 が 1 つで、 ス タ テ ィ ッ ク 配 列 の 構 造 体 または 共 用 体 全 体 の 初 期 化 に 使 用する イニシャ ラ イザの 式 を 中 括 弧 で 囲 む 必 要 はあ り ません。 ISO C では中 括 弧 の 使 用 が 規 定 さ れています。3-24 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能• 以 下 を 含 め、 C++ 匿 名 の 共 用 体 に 似 た 構 造 体 を 使 用 で き る よ う にする ための 拡 張 機 能 がサポー ト さ れています。— 匿 名 の 共 用 体 だけでな く 、 匿 名 の 構 造 体 も 使 用 で き ます。 匿 名 構 造体 の メ ンバは、 親 の 構 造 体 の 有 効 範 囲 に 関 連 付 け られ、 通 常 の メ ンバと 同 じよ うにルックアップされます。— 匿 名 構 造 体 の メ ンバは、 typedef の 名 前 に よ って、 それを 保 持 する構 造 体 に 導 入 でき ます。 つま り 、 実 際 の 匿 名 の 共 用 体 の よ う に メ ンバを 直 接 宣 言 する 必 要 はあ り ません。— タグは、 C モー ド の 場 合 にのみ 宣 言 で き ます。匿 名 の 構 造 体 と 匿 名 の 共 用 体 をサポー ト する には、 anon_unions プラグマを 使 用 する 必 要 があ り ます。• enum リストの 終 わりには 1 つ 余 分 な コ ンマを 追 加 で き ますが、 その 場 合には 注 釈 が 生 成 されます。• enum タグは 不 完 全 でも 構 いません。 タ グの 名 前 は、 中 括 弧 で 囲 まれた リス ト を 指 定 する こ と に よ って、 後 で 定 義 し て 解 決 で き ます。• 列 挙 定 数 の 値 は、 int の 範 囲 内 ではな く 、 unsigned int の 範 囲 内 に 収 ま る符 号 な し の 値 を 求 め る 式 に よ って 指 定 で き ます。 以 下 に 例 を 示 し ます。/* When ints are 32 bits: */enum a { w = -2147483648 }; /* No error */enum b { x = 0x80000000 }; /* No error */enum c { y = 0x80000001 }; /* No error */enum d { z = 2147483649 }; /* Error */• ビッ トフィールドには、int および unsigned int 型 のほかに、 enum 型 または 整 数 型 の 基 本 型 を 割 り 当 てる こ とができます。関 連 項 目• 「プ ラ グマ」 (ページ 4-62)• 「 構 造 体 、 共 用 体 、 列 挙 型 、 ビ ッ ト フ ィ ール ド の 拡 張 機 能 」 (ページ3-24)• 『コンパイ ラユーザガイ ド』 の 「C99 の 新 機 能 」 (ページ 5-51)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-25ID 100419Non-Confidential,


言 語 拡 張 機 能3.7 GNU 言 語 拡 張 機 能このセクションでは、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラ の 拡 張 機 能 について 説 明 し ます。 こ れら の 拡 張 機 能 は、 GNU モード、 つまり、--gnu オプションを 使 用 してソースコードをコンパイルした 場 合 にのみサポー ト されます。 詳 細 については、 「 言 語 標 準 の 準 拠 」 (ページ 1-7) および「--gnu」 (ページ 2-75) を 参 照 して 下 さい。注すべての GNU コ ンパイ ラ 拡 張 機 能 がすべての 言 語 に 対 し てサポー ト さ れているわけではあり ません。 例 えば、 C++ では 拡 張 ポ イ ン タ 算 術 演 算 はサポー トされていません。GNU 拡 張 機 能 の 使 用 方 法 の 詳 細 については、 http://gcc.gnu.org で GNU コンパイラのオンラインマニュアルを 参 照 して 下 さい。<strong>ARM</strong> コ ンパイ ラに 関 する 補 足 情 報 については、 以 下 の 付 録 を 参 照 し て 下 さい。• 付 録 B 標 準 C の 実 装 定 義• 付 録 C 標 準 C++ の 実 装 定 義• 付 録 D C および C++ コ ンパイ ラ の 実 装 に 関 する 制 限3.7.1 代 替 キーワー ドコンパイラは、__keyword__ と い う 形 式 の 代 替 キーワー ド を 認 識 し ます。 このよう な 代 替 キーワー ド の 動 作 は、 元 のキーワー ド の 動 作 と 同 じ です。例__const__ int pi = 3.14; // same as const int pi = 3.143.7.2 asm keywordこのキーワードは、__asm キーワード と 同 じ 意 味 です。モードC90 および C99 の GNU モード でのみサポー ト されています。3-26 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能関 連 項 目• 「__asm」 (ページ 4-5)3.7.3 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)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-27ID 100419Non-Confidential,


言 語 拡 張 機 能{}foo_t u;if (a>100)u = (foo_t) a ; // automatically equivalent to u.i=a;elseu = (foo_t) b ; // automatically equivalent to u.d=b;return u.i;3.7.5 文 字 エスケープシーケンス文 字 列 では、 エス ケープシーケ ン ス ‘\e’ をエスケープ 文 字 (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 --gnuint z[] = (int [3]) {1};モードC90 および C99 の GNU モード でのみサポー ト されています。注複 合 リ テ ラ ルは、 C99 ではイニシャ ラ イザ と して も 使 用 でき ます。 ただし コンパイラでは、 C99 ソースコードをコンパイルした 場 合 よ り も、 GNU モード を使 用 した 場 合 の 方 が、 イニシャライザとしての 複 合 リテラルをよ り 柔 軟 に 受け 入 れる こ と ができ ます。3-28 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能3.7.7 条 件 付 き ステー ト メ ン ト条 件 付 き ステー ト メ ン ト の 中 間 にあ るオペラ ン ド は、 結 果 がテス ト と 同 じになる 場 合 は 省 略 できます。以 下 に 例 を 示 し ます。例以 下 のス テー ト メ ン ト は 同 じ 意 味 にな り ます。c = i ? : j; // middle operand omittedc = 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 モード でのみサポー ト されています。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-29ID 100419Non-Confidential,


言 語 拡 張 機 能関 連 項 目• 『コンパイ ラユーザガイ ド』 の 「C99 の 新 機 能 」 (ページ 5-51)3.7.9 拡 張 左 辺 値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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能}for (; i


言 語 拡 張 機 能例ラベルのテーブル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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


言 語 拡 張 機 能}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 モード でのみサポー ト されています。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-33ID 100419Non-Confidential,


言 語 拡 張 機 能例struct{int a;union{int b;float c;};int d;} Unnamed_Fields_0;int Unnamed_Fields_1(){return Unnamed_Fields_0.b;}関 連 項 目• 「 匿 名 ク ラ ス、 匿 名 構 造 体 、 匿 名 共 用 体 」 (ページ 3-21)3-34 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


第 4 章コ ンパイ ラ 固 有 の 機 能本 章 では、 <strong>ARM</strong> コ ンパ イ ラ 固 有 の 機 能 について 説 明 し ます。 以 下 のセ ク シ ョンから 構 成 されています。• 「キーワー ド と 演 算 子 」 (ページ 4-2)• 「__declspec 属 性 」 (ページ 4-27)• 「 関 数 属 性 」 (ページ 4-35)• 「 型 属 性 」 (ページ 4-47)• 「 変 数 属 性 」 (ページ 4-52)• 「プ ラ グマ」 (ページ 4-62)• 「 命 令 コ ンパ イ ラ 組 み 込 み 関 数 」 (ページ 4-80)• 「VFP ス テータ ス 組 み 込 み 関 数 」 (ページ 4-125)• 「GNU 組 み 込 み 関 数 」 (ページ 4-126)• 「コ ンパイ ラ に よ る 事 前 定 義 」 (ページ 4-129)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-1ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能4.1 キーワー ド と 演 算 子このセクションでは、 <strong>ARM</strong> コンパイラ armcc でサポー ト さ れてい る 関 数 のキーワー ド および 演 算 子 について 説 明 し ます。表 4-1 は、 C および C++ 標 準 に 対 する <strong>ARM</strong> 拡 張 のキーワー ド を 示 し ています。 <strong>ARM</strong> コ ンパイ ラ 固 有 の 動 作 ま たは 制 約 条 件 をサポー ト し ていない 標 準 Cおよび 標 準 C++ キーワー ド は、 このテーブルには 記 載 されていません。表 4-1 <strong>ARM</strong> コンパイラによってサポートされているキーワード 拡 張キーワー ド__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__smc4.1.1 __align__align キーワードは、 n バ イ ト 境 界 に 変 数 を 整 列 する よ う コ ンパ イ ラ に 指 示します。__align は 記 憶 域 ク ラ ス 修 飾 子 です。 これは、 関 数 の 型 には 影 響 し ません。4-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能構 文__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 boundaryvoid 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.<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-3ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 『コンパイ ラユーザガイ ド』 の 「--min_array_alignment=opt」(ページ 2-102)4.1.2 __alignof____alignof__ キーワー ド を 使 用 する と 、 型 や 変 数 の 境 界 整 列 について 照 会 で きます。注このキーワードは、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの 拡 張 機 能 です。構 文__alignof__(type)__alignof__(expr)各 パ ラ メ ータには 以 下 の 意 味 があ り ます。type 型 を 指 定 し ます。expr 左 辺 値 を 指 定 し ます。戻 り 値__alignof__(type) は type 型 の 整 列 要 求 を 返 し、 整 列 要 求 がない 場 合 は 1 を 返 します。__alignof__(expr) は、 左 辺 値 expr の 型 の 整 列 要 求 を 返 し、 整 列 要 求 がない 場合 は 1 を 返 し ます。例int Alignment_0(void){return __alignof__(int);}関 連 項 目• 「__ALIGNOF__」 (ページ 4-5)4-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能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 4return __ALIGNOF(foo); // returns 4return __ALIGNOF(bar); // returns 1関 連 項 目• 「__alignof__」 (ページ 4-4)4.1.4 __asmこのキーワードを 使 用 して、 コンパイラから <strong>ARM</strong> アセンブラ armasm に 情 報を 渡 し ます。こ のキーワー ド の 正 確 なア ク シ ョ ンは、 使 用 法 に よ っ て 異 な り ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-5ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能使 用 法組 み 込 みアセンブ ラインラインアセンブラアセンブラ ラベル名 前 付 き レ ジ ス タ 変 数__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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能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)• 「__attribute__((always_inline))」 (ページ 4-37)4.1.6 __global_reg__global_reg 記 憶 域 ク ラ ス 指 定 子 では、 宣 言 さ れた 変 数 がグ ローバル 変 数 レ ジスタに 割 り 当 てられます。構 文__global_reg(n) type varName各 パラ メ ータには 以 下 の 意 味 があ り ます。n1 から 8 までの 整 数 を 指 定 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-7ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能typevarName以 下 の 型 のいずれかを 指 定 し ます。• long long を 除 く 任 意 の 整 数 型• 任 意 の char 型• 任 意 のポ イ ン タ 型変 数 の 名 前 を 指 定 します。制 約 条 件こ の 記 憶 域 ク ラ ス を 使 用 する と 、 extern、 static、 typedef な どの 追 加 の 記 憶 域クラスは 使 用 できません。C では、 グ ローバルレ ジ ス タ 変 数 を 宣 言 時 に 修 飾 ま たは 初 期 化 する こ と はできません。 C++ では、 すべての 初 期 化 が 動 的 な 初 期 化 と し て 処 理 さ れます。使 用 さ れてい る AAPCS のバ リ アン ト に 応 じて、 使 用 でき る レジス タ 変 数 の数 は 異 な り ますが、 グ ローバル 変 数 レジ ス タ と し て 5 ~ 7 本 のレジス タ を 使用 でき ます。実 際 には、 以 下 の 数 を 超 え る 使 用 はお 勧 め し ません。• <strong>ARM</strong> または Thumb-2 の 場 合 は 3 つのグ ローバルレジス タ 変 数• Thumb-1 の 場 合 は 1 つのグ ローバルレジス タ 変 数• グ ローバル 浮 動 小 数 点 レ ジ ス タ 変 数 と し て 使 用 可 能 な 浮 動 小 数 点 レ ジ スタの 半 数多 くのグローバル 変 数 を 宣 言 する と、 コードサイズは 著 し く 増 大 します。 場合 によっては、 プログラムをコンパイルできなくなります。注 意グローバルレジス タ 変 数 を 使 用 する 場 合 は、 以 下 の 理 由 で 注 意 を 払 う 必 要 があります。• 異 な る コ ンパイルユニ ッ ト 間 での 直 接 呼 び 出 し が 適 切 であ る かど う かがリンク 時 にチェックされません。 プログラムで 使 用 されているグローバルレジスタ 変 数 は、 できる 限 り、 プログラムの 各 コンパイルユニッ ト で定 義 し て 下 さ い。 一 般 的 に、 レ ジ ス タ 変 数 の 定 義 はグ ローバルヘ ッ ダフ ァ イルに 配 置 するのが 最 も 適 切 です。 グローバルレジスタの 値 は、 レジスタが 使 用 される 前 に、 コードの 最 初 の 段 階 で 設 定 する 必 要 があ り ます。4-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能• グ ローバルレ ジ ス タ 変 数 は 呼 び 出 し 先 退 避 レ ジ ス タ にマ ッ ピ ング さ れるため、 その 値 をグローバルレジスタ 変 数 として 使 用 しないライブラリ 関数 などのコ ンパイルユニ ッ ト では、 この 値 が 関 数 への 呼 び 出 し を 介 し て保 存 および 復 元 さ れます。• グローバルレジスタ 変 数 を 使 用 する コンパイルユニッ ト へのコールバック は 危 険 です。 例 えば、 グ ローバルレ ジ ス タ を 使 用 する 関 数 が、 グ ローバルレ ジ ス タ 変 数 を 宣 言 し ない コ ンパイルユニ ッ ト か ら 呼 び 出 さ れると 、 その 関 数 は 推 測 し たグ ローバルレ ジ ス タ 変 数 か ら 誤 った 値 を 読 み 出すこ とになり ます。• こ の 記 憶 域 ク ラ スは、 フ ァ イ ルの 有 効 範 囲 のみで 使 用 で き ます。例例 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; // errorC で 記 述 し た __global_reg 変 数 は、 定 義 時 に 初 期 化 で き ません。 例 4-3 において、 C++ ではエラーにな り ませんが、 C ではエラーにな り ます。例 4-3 グローバルレジスタ - 初 期 化 エ ラー__global_reg(1) int x=1; // error in C, OK in C++<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-9ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 「--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);}関 連 項 目• 『コンパイ ラユーザガイ ド』 の 「 関 数 の イ ン ラ イ ン 展 開 」 (ページ 5-20)4.1.8 __int64__int64 キーワードは、 キーワード シーケンス long long と 同 じ 意 味 です。__int64 は、--strict の 使 用 時 に も 容 認 さ れます。関 連 項 目• 「--strict, --no_strict」 (ページ 2-133)• 「long long」 (ページ 3-8)4-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能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 関 数 で 引 数 や 戻 り 値 を 使 用 する こ と はで き ません。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-11ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能注Thumb 専 用 プ ロ セ ッ サに コ ンパ イルする 場 合 は、 割 り 込 みハン ド ラ が Thumb状 態 で 開 始 さ れる ため、 コー ド は Thumb コードにコンパイルされます。 それ以 外 の 場 合 は、 --thumb オプシ ョ ンまたは #pragma thumb を 使 用 して Thumb 用 にコンパイルしても、__irq と 指 定 されている 関 数 はすべて <strong>ARM</strong> にコンパイルされます。関 連 項 目• 「--thumb」 (ページ 2-136)• 「#pragma thumb」 (ページ 4-79)• 『デベロ ッ パガ イ ド 』 の 第 6 章 プ ロ セ ッ サ 例 外 処 理4.1.11 __packed__packed 修 飾 子 を 指 定 する と 、 すべての 有 効 型 の 境 界 整 列 が 1 に 設 定 されます。 し たがっ て、• パ ッ ク オブジ ェ ク ト を 境 界 整 列 させる ためのパデ ィ ングの 挿 入 は 行 われません。• パ ッ ク 型 のオブジ ェ ク ト の 読 み 出 し ま たは 書 き 込 みは、 非 境 界 整 列 ア クセスを 使 用 して 行 われます。構 造 体 ま たは 共 用 体 が __packed 修 飾 子 を 使 用 し て 宣 言 さ れてい る 場 合 、 そのすべての メ ンバに __packed 修 飾 子 が 適 用 さ れます。 メ ンバ 間 にも 構 造 体 の 終 わりにもパディングは 挿 入 されません。 パ ッ ク 構 造 体 のすべてのサブ 構 造 体 は、__packed を 使 用 し て 宣 言 する 必 要 があ り ます。 非 パ ッ ク 構 造 体 の 整 数 サブフ ィ ール ド は 個 々にパ ッ ク で き ます。使 用 法__packed 修 飾 子 は、 構 造 体 を 外 部 のデータ 構 造 体 にマ ッ プ し た り 非 境 界 整 列データ にア ク セスする 際 に 使 用 する と 効 果 的 ですが、 ア ク セ スにかか る コ スト が 比 較 的 高 いため、 一 般 的 には、 データサ イ ズの 削 減 には 効 果 があ り ません。 非 境 界 整 列 ア ク セスの 数 は、 パ ッ クする 必 要 のあ る 構 造 体 にフ ィ ール ドをパッ クする こ とによってのみ 減 らすこ とができます。4-12 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能注ハー ド ウ ェ アで 非 境 界 整 列 ア ク セス をサポー ト し ていない <strong>ARM</strong> プロセッサ(<strong>ARM</strong>v6 以 前 のプ ロ セ ッ サな ど) では、 コー ド サ イ ズおよび 実 行 速 度 において、 非 境 界 整 列 データへのア ク セスに コ ス ト がかか る 場 合 があ り ます。 コード サ イ ズの 増 大 と パフ ォーマン スの 低 下 を 避 け る ため、 パ ッ ク 構 造 体 を 介 したデータ ア ク セスは 最 小 限 に 抑 え る 必 要 があ り ます。制 約 条 件__packed を 使 用 する 場 合 は、 以 下 の 制 限 が 適 用 さ れます。• __packed 修 飾 子 は、 前 に __packed を 使 用 せずに 宣 言 さ れた 構 造 体 には 使用 でき ません。• 他 の 型 修 飾 子 と は 異 な り 、 構 造 体 の 型 については、 同 じ 型 について__packed バージ ョ ン と __packed 以 外 のバージ ョ ンの 両 方 を 使 用 する こ とはでき ません。• __packed 修 飾 子 は、 整 数 型 の ローカル 変 数 には 影 響 し ません。• パ ッ ク 構 造 体 ま たは 共 用 体 は、 対 応 する 非 パ ッ ク 構 造 体 と の 代 入 互 換 性はあ り ません。 構 造 体 に よ って 使 用 さ れる メ モ リ レ イ ア ウ ト は 異 な る ため、 パック 構 造 体 を 非 パック 構 造 体 に 割 り 当 てるには、 フィールドごとにコピーする 以 外 に 方 法 はあり ません。• __packed を 使 用 し ない 場 合 の 影 響 については 定 義 されていません。 また、非 パ ッ ク 構 造 体 をパ ッ ク 構 造 体 にキ ャ ス ト し た 場 合 の 影 響 について も 定義 されていません。 整 数 型 へのポ イ ン タは、 明 示 的 、 暗 示 的 を 問 わず、パッ ク 整 数 型 へのポ イ ン タに 適 切 にキ ャ ス ト でき ます。 また、char 型 で__packed を 使 用 しないこ と も 可 能 です。• パ ッ ク 配 列 型 はあ り ません。 パック 配 列 とは、 パック 型 のオブジェク トの 配 列 を 指 し ます。 配 列 はパデ ィ ング さ れません。例例 4-4 (ページ 4-14) の 場 合 は、 ポ イ ン タ を 使 用 し て、 パ ッ ク 型 を 指 すこ と ができます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-13ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能例 4-4 パックへのポインタtypedef __packed int* PpI; /* pointer to a __packed int */__packed int *p; /* pointer to a __packed int */PpI p2; /* 'p2' has the same type as 'p' *//* __packed is a qualifier *//* like 'const' or 'volatile' */typedef int *PI; /* pointer to int */__packed PI p3; /* a __packed pointer to a normal int *//* -- not the same type as 'p' and 'p2' */int *__packed p4; /* 'p4' has the same type as 'p3' */例 4-5 では、 ポ イ ン タ を 使 用 し てパ ッ ク オブジ ェ ク ト にア ク セ スする 場 合 、コ ンパ イ ラ に よ って、 ポ イ ン タ の 境 界 整 列 に 依 存 せずに 機 能 する コー ド が 生成 されるのを 示 します。例 4-5 パ ッ ク 構 造 体typedef __packed struct{char x;// all fields inherit the __packed qualifierint y;} X; // 5 byte structure, natural alignment = 1int f(X *p){return p->y;// does an unaligned read}typedef struct{short x;char y;__packed int z;// only pack this fieldchar a;} Y; // 8 byte structure, natural alignment = 2int g(Y *p){return p->z + p->x; // only unaligned read for z}4-14 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 「__attribute__((packed))」 (ページ 4-56)• 「#pragma pack(n)」 (ページ 4-73)• 「パ ッ ク 構 造 体 」 (ページ 5-11)• 『コンパイ ラユーザガイ ド』 の 「__packed 修 飾 子 と 非 境 界 整 列 型 のデータアクセス」 (ページ 5-31)• 『コンパイ ラユーザガイ ド』 の 「パ ッ ク 構 造 体 と 個 別 パ ッ ク フ ィ ール ド 」(ページ 5-33)4.1.12 __pure__pure キーワー ド は、 関 数 宣 言 が 純 関 数 であ る こ と を 示 し ます。関 数 は、 以 下 の 場 合 のみ、 純 関 数 にな り ます。• 結 果 が 引 数 の 値 のみに 依 存 する 場 合• 関 数 に 副 作 用 がない 場 合__pure は、 関 数 修 飾 子 です。 こ れは、 関 数 の 型 に 影 響 し ます。注こ のキーワー ド には、 同 等 の 関 数 属 性 __attribute__((const)) があ り ます。デフォルトデフ ォル ト では、 関 数 は 非 純 関 数 であ る こ と が 想 定 されます。使 用 法純 関 数 は、 共 通 部 分 式 の 削 除 の 対 象 にな り ます。制 約 条 件純 関 数 と し て 宣 言 さ れた 関 数 には、 副 作 用 はあ り ません。 純 関 数 の 例• 非 純 関 数 の 呼 び 出 しはでき ません。• コンパイラは、 スタックメモリを 除 いて 純 関 数 がメモリにアクセスしない こ と を 想 定 し てい る ため、 純 関 数 はグ ローバル 変 数 もデ リ フ ァ レ ン スポインタも 使 用 することができません。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-15ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能• 同 じパラ メータで 2 度 呼 び 出 さ れる 場 合 、 純 関 数 は 毎 回 同 じ 値 を 返 す 必要 があ り ます。例int factr(int n) __pure{int f = 1;while (n > 0)f *= n--;return f;}関 連 項 目• 「__attribute__((const))」 (ページ 4-37)• 『コンパイ ラユーザガイ ド』 の 「__pure」 (ページ 5-16)• 『コンパイ ラユーザガイ ド』 の 「<strong>ARM</strong> 関 数 修 飾 子 の 配 置 」 (ページ 5-18)4.1.13 __smc__smc キーワードは、 SMC (セキュアモニターコール) 関 数 を 宣 言 し ます。SMC 関 数 を 呼 び 出 す と 、 関 数 の 呼 び 出 し 時 に コ ンパイ ラ に よ って 生 成 さ れる命 令 ス ト リ ームに SMC 命 令 が 挿 入 さ れます。注SMC 命 令 は、 <strong>ARM</strong> アセンブリ 言 語 の 以 前 のバージ ョ ンで 使 用 された SMI 命 令を 置 換 し ます。__smc は、 関 数 修 飾 子 です。 これは、 関 数 の 型 に 影 響 します。構 文__smc(int smc_num) return-type function-name([argument-list]);各 項 目 には 以 下 の 意 味 があ り ます。smc_numSMC 命 令 で 使 用 さ れる 4 ビッ トのイミディエート 値 を 指 定します。smc_num の 値 は、 <strong>ARM</strong> プロセッサでは 無 視 されますが、SMC 例 外 ハン ド ラ で 使 用 し て、 要 求 さ れてい る サービ スを 特 定 する こ とができます。4-16 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能制 約 条 件Security Extensions がある 場 合 、 SMC 命 令 は、 選 択 し た <strong>ARM</strong> アーキテクチャベースのプ ロ セ ッ サで 使 用 可 能 です。 詳 細 については、 『アセンブラガイ ド』の 「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 があ り ます。使 用 法こ の 関 数 への 呼 び 出 し に よ り 、 浮 動 小 数 点 引 数 が 整 数 レ ジ ス タ に 渡 さ れます。結 果 が 浮 動 小 数 点 値 であ る 場 合 、 こ の 値 は 整 数 レ ジ ス タ に 戻 さ れます。 これに よ り 、 ソ フ ト ウ ェ ア 浮 動 小 数 点 を 対 象 と し た コ ンパイルの 動 作 が 繰 り 返 されます。こ のキーワー ド を 使 用 する と 、 ハー ド ウ ェ ア 浮 動 小 数 点 と ソ フ ト ウ ェ ア 浮 動小 数 点 を 使 用 する よ う に コ ンパイル さ れる ソースで、 同 じ ラ イ ブ ラ リ を 使 用できるようになります。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-17ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能注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_numSVC 命 令 で 使 用 さ れる イ ミ デ ィ エー ト 値 を 指 定 し ます。以 下 の 範 囲 の 整 数 を 求 め る 式 を 指 定 し ます。• <strong>ARM</strong> 命 令 の 場 合 は 0 ~ 2 24 –1 (24 ビット 値 )• 16 ビッ ト Thumb 命 令 の 場 合 は 0 ~ 255 (8 ビッ ト 値 )使 用 法こ れに よ り 、 通 常 の 関 数 呼 び 出 し と 同 じ よ う に 動 作 する AAPCS 準 拠 の 操 作と し て、 関 数 の 呼 び 出 し が イ ン ラ イ ンで コ ンパイル さ れます。__value_in_regs 修 飾 子 を 使 用 する と 、 16 バイ ト までの 小 さな 構 造 体 を、AAPCS で 定 義 されている 通 常 の 構 造 体 受 け 渡 し メカニズムによってではなく 、 レ ジ ス タ に 返 すよ う に 指 定 で き ます。4-18 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能例__svc(42) void terminate_1(int procnum); // terminate_1 returns no results__svc(42) int terminate_2(int procnum); // terminate_2 returns one resulttypedef 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 命 令 をサポー ト し ない <strong>ARM</strong> アーキテクチャバ リ アン ト 、 または <strong>ARM</strong>アーキテクチャベースのプロセッサが、 --cpu オプシ ョ ンを 使 用 してコマン ドラ インで 指 定 される と、 コンパイ ラはエラーを 生 成 します。関 連 項 目• 「--cpu=name」 (ページ 2-35)• 「__value_in_regs」 (ページ 4-22)• 『アセンブラガイ ド』 の 「SVC」 (ページ 4-142)4.1.16 __svc_indirect__svc_indirect キーワードは、 演 算 コード を r12 で SVC ハン ド ラに 渡 します。__svc_indirect は、 関 数 修 飾 子 です。 これは、 関 数 の 型 に 影 響 します。構 文__svc_indirect(int svc_num)return-type function-name(int real_num[, argument-list]);各 パラ メ ータには 以 下 の 意 味 があ り ます。svc_numSVC 命 令 で 使 用 される イ ミディエー ト 値 を 指 定 します。以 下 の 範 囲 の 整 数 を 求 め る 式 を 指 定 し ます。• <strong>ARM</strong> 命 令 の 場 合 は 0 ~ 2 24 –1 (24 ビッ ト 値 )• 16 ビッ ト Thumb 命 令 の 場 合 は 0 ~ 255 (8 ビッ ト 値 )<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-19ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能real_numr12 で、 関 数 の 実 行 を 決 定 する 際 にハン ド ラ に 渡 さ れる 値です。間 接 的 な メ カニズム を 使 用 するには、 使 用 する シ ス テムのハン ド ラ が、 r12 の値 を 使 用 し て 要 求 さ れてい る 演 算 を 選 択 する 必 要 があ り ます。使 用 法こ の 機 能 を 使 用 する と 、 間 接 的 に SVC を 実 装 できます。例int __svc_indirect(0) ioctl(int svcino, int fn, void *argp);以 下 の 呼 び 出 し を 行 う とioctl(IOCTL+4, RESET, NULL);r12 の IOCTL+4 を 使 用 して、 SVC #0 にコンパイルされます。エラーSVC 命 令 をサポー ト し ない <strong>ARM</strong> アーキテ クチャバ リ アン ト 、 または <strong>ARM</strong>アーキテクチャベースのプロセッサが、 --cpu オプシ ョ ンを 使 用 してコマン ドラインで 指 定 されると、 コンパイラはエラーを 生 成 します。関 連 項 目• 「--cpu=name」 (ページ 2-35)• 「__value_in_regs」 (ページ 4-22)• 『アセンブラガイ ド』 の 「SVC」 (ページ 4-142)4.1.17 __svc_indirect_r7r12 ではな く r7 を 使 用 する 点 を 除 き、 __svc_indirect_r7 キーワードは__svc_indirect と 同 様 に 動 作 し ます。__svc_indirect_r7 は、 関 数 修 飾 子 です。 これは、 関 数 の 型 に 影 響 します。4-20 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能構 文__svc_indirect_r7(int svc_num)return-type function-name(int real_num[, argument-list]);各 パラ メ ータには 以 下 の 意 味 があ り ます。svc_numreal_numSVC 命 令 で 使 用 される イ ミ デ ィ エー ト 値 を 指 定 し ます。以 下 の 範 囲 の 整 数 を 求 め る 式 を 指 定 し ます。• <strong>ARM</strong> 命 令 の 場 合 は 0 ~ 2 24 –1 (24 ビッ ト 値 )• 16 ビッ ト Thumb 命 令 の 場 合 は 0 ~ 255 (8 ビッ ト 値 )r7 で、 関 数 の 実 行 を 決 定 する 際 にハン ド ラ に 渡 さ れる 値 です。使 用 法<strong>ARM</strong> 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 命 令 をサポー ト し ない <strong>ARM</strong> アーキテクチャバ リ アン ト 、 または <strong>ARM</strong>アーキテクチャベースのプロセッサが、 --cpu オプシ ョ ンを 使 用 してコマン ドラ インで 指 定 される と、 コンパイ ラはエラーを 生 成 します。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-21ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 「__value_in_regs」• 「--cpu=name」 (ページ 2-35)• 『アセンブラガイ ド』 の 「SVC」 (ページ 4-142)4.1.18 __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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能例typedef struct int64_struct{unsigned int lo;unsigned int hi;} int64_struct;__value_in_regs externint64_struct mul64(unsigned a, unsigned b);関 連 項 目• 『コンパイ ラユーザガイ ド』 の 「__value_in_regs」 (ページ 5-16)4.1.19 __weakこのキーワードは、 コンパイラにシンボルを weak でエク スポー ト する よ う 指示 します。__weak キーワー ド は、 関 数 と 変 数 の 宣 言 、 および 関 数 の 定 義 に 適 用 で き ます。使 用 法関 数 と 変 数 の 宣 言宣 言 の 場 合 、 こ の 記 憶 域 ク ラ スは、 リ ン カに よ って 未 解 決 の 参照 と し てエ ラーが 生 成 さ れない よ う な extern オブジェ ク ト の 宣言 を 指 定 します (これには、 関 数 が 存 在 しない 場 合 も 含 まれます)。以 下 に 例 を 示 し ます。__weak void f(void);...f(); // call f weakly存 在 し ない weak 関 数 への 参 照 が、 分 岐 ま たは 分 岐 リ ン ク 命 令 にコ ンパイル さ れる コー ド か ら 行 われる 場 合 、 以 下 のいずれかが行 われます。• 参 照 は 次 の 命 令 への 分 岐 と し て 解 決 さ れます。 これによ り、こ の 分 岐 は NOP となります。• こ の 分 岐 は NOP 命 令 に 置 き 換 わ り ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-23ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能関 数 の 定 義__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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能リ ン カは、 他 のコ ンパ イルで 関 数 や 変 数 が 非 weak で 使 用 されてい る 場 合 を 除 き、 ラ イ ブ ラ リ か ら 関 数 や 変 数 を ロー ド し ません。参 照 が 未 解 決 のま まであ る 場 合 、 その 値 は NULL と 見 なされます。ただ し、 コー ド か ら 位 置 非 依 存 セ ク シ ョ ン ま たは 存 在 し ない__weak 関 数 への 参 照 が 未 解 決 の 場 合 、 その 未 解 決 の 参 照 は NULL にはな り ません。関 数 の 定 義weak で 定 義 された 関 数 はイ ン ラ イ ン 展 開 でき ません。例__weak const int c;// assume 'c' is not present in final linkconst int *f1() { return &c; } // '&c' returns non-NULL if// compiled and linked /ropi__weak int i;// assume 'i' is not present in final linkint *f2() { return &i; } // '&i' returns non-NULL if// compiled and linked /rwpi__weak void f(void);// assume 'f' is not present in final linktypedef void (*FP)(void);FP g() { return f; }// 'g' returns non-NULL if// compiled and linked /ropi関 連 項 目• ライブラリ 検 索 の 詳 細 については、『ユーテ ィ リ テ ィ ガ イ ド』 の「 第 3 章 armar の 使 用 」 を 参 照 して 下 さい。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-25ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能4.1.20 __writeonly__writeonly 型 の 修 飾 子 は、 データ オブジ ェ ク ト が 読 み 出 せない こ と を 示 し ます。C および C++ 型 システムでは、 この 修 飾 子 は、 const または volatile のよ うなcv 修 飾 子 と し て 動 作 し ます。 こ の 修 飾 子 の 場 合 、 __writeonly 型 の 左 辺 値 は、右 辺 値 に 変 換 で き ません。割 り 当 てが 読 み 出 し - 変 更 - 書 き 込 み と し て 実 装 さ れた 場 合 、 __writeonly ビット フ ィ ール ドへの 割 り 当 ては 許 可 されません。 これは 実 装 に 依 存 し ます。例void foo(__writeonly int *ptr){*ptr = 0;// allowedprintf("ptr value = %d\n", *ptr); // error}4-26 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.2 __declspec 属 性__declspec キーワー ド を 使 用 する と 、 オブジ ェ ク ト および 関 数 の 特 殊 な 属 性を 指 定 できます。 例 えば、 __declspec キーワード を 使 用 する と、 イ ンポー ト またはエ ク ス ポー ト さ れた 関 数 や 変 数 を 宣 言 し た り 、 ス レ ッ ド ローカル 記 憶 域(TLS) オブジェク ト を 宣 言 したりするこ とができます。__declspec キーワード は、 宣 言 の 指 定 の 先 頭 に 付 ける 必 要 があ り ます。 以 下 に例 を 示 し ます。__declspec(noreturn) void overflow(void);__declspec(thread) int i;表 4-2 では、 使 用 可 能 な __declspec 属 性 を 示 し ます。 __declspec 属 性 は、 記 憶域 クラス 修 飾 子 です。 これら は、 関 数 ま たは 変 数 の 型 には 影 響 し ません。表 4-2 コンパイラでサポートされる __declspec 属 性 および 同 等 属 性__declspec 属 性__declspec 以 外 の 同 等 属 性__declspec(dllexport) -__declspec(dllimport) -__declspec(noinline)__declspec(noreturn)__attribute__((noinline))__attribute__((noreturn))__declspec(nothrow) -__declspec(notshared) -__declspec(thread) -4.2.1 __declspec(dllexport)__declspec(dllexport) 属 性 は、 DLL ライブラリのビルド 時 に、 ダイナミックシンボルテーブルからシンボルの 定 義 をエクスポート します。 クラスでは、 仮想 関 数 テーブル、 コ ン ス ト ラ ク シ ョ ン 仮 想 関 数 テーブル、 RTTI などのクラス ・ イ ンペデ ィ メ ン タ の 可 視 性 を 制 御 し、 メ ンバ 関 数 やス タ テ ィ ッ クデータメ ンバのデフ ォル ト の 可 視 性 を 設 定 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-27ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能使 用 法__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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能例宣 言 で 必 要 な __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)#endifMYMOD_API int mymod_get_version(void);関 連 項 目• 「__declspec(dllimport)」 (ページ 4-30)• 「__declspec(notshared)」 (ページ 4-33)• 「--export_all_vtbl, --no_export_all_vtbl」 (ページ 2-62)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-29ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能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();};関 連 項 目• 「__declspec(dllexport)」 (ページ 4-27)4-30 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.2.3 __declspec(noinline)__declspec(noinline) 属 性 を 使 用 する と 、 その 関 数 の 呼 び 出 し 時 に、 その 関 数を イ ン ラ イ ン 展 開 し ない よ う にする こ と がで き ます。注__declspec 属 性 には、 同 等 関 数 属 性 __attribute__((noinline)) があ り ます。関 連 項 目• 「#pragma inline, #pragma no_inline」 (ページ 4-71)• 「__attribute__((noinline))」 (ページ 4-39)4.2.4 __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 overflowint negate(int x){<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-31ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能}if (x == 0x80000000) overflow();return -x;関 連 項 目• 「__attribute__((noreturn))」 (ページ 4-41)4.2.5 __declspec(nothrow)__declspec(nothrow) 属 性 は、 関 数 の 呼 び 出 し に よ っ て C++ 例 外 が 呼 び 出 し か ら呼 び 出 し 元 に 伝 播 さ れない こ と を 示 し ます。<strong>ARM</strong> ラ イ ブ ラ リ ヘ ッ ダに よ り 、 こ の 修 飾 子 は、 ISO C 標 準 で 例 外 を ス ローしないこ とが 規 定 されている C 関 数 の 宣 言 に 自 動 的 に 追 加 さ れます。使 用 法コ ンパイ ラ は、 関 数 に よ って 例 外 がス ローさ れない こ と を 認 識 し てい る 場 合 、その 関 数 の 呼 び 出 し 元 用 に 生 成 する 例 外 処 理 テーブルのサ イ ズ を 縮 小 で き ることがあります。制 約 条 件関 数 の 呼 び 出 し に よ っ て C++ 例 外 が 呼 び 出 し か ら 呼 び 出 し 元 に 伝 播 さ れる 場合 、 動 作 は 定 義 さ れません。例 外 が イ ネーブルにな った 状 態 で コ ンパ イ ル し ない と 、 こ の 修 飾 子 は 無 視 されます。例struct S{~S();};__declspec(nothrow) extern void f(void);void g(void){S s;f();}4-32 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 「--force_new_nothrow, --no_force_new_nothrow」 (ページ2-65)• 「::operator new 関 数 の 使 用 」 (ページ 5-15)4.2.6 __declspec(notshared)__declspec(notshared) 属 性 は 特 定 の ク ラ スの 仮 想 関 数 テーブル と RTTI がエクスポート されるのを 防 止 します。 こ れは、 他 の 適 用 オプシ ョ ンに 関 係 な く 機能 します。 例 えば、--export_all_vtbl を 使 用 しても、 __declspec(notshared) がオーバーラ イ ド される こ と はあ り ません。例struct __declspec(notshared) X{virtual int f();}; // do not export thisint X::f(){return 1;}struct Y : X{virtual int g();}; // do export thisint Y::g(){return 1;}4.2.7 __declspec(thread)__declspec(thread) 属 性 は、 変 数 がス レ ッ ド ローカルで、 ス レ ッ ド の 保 存 期 間が 設 定 されているこ とを 示 します。 そのため、 リ ンカによって、 スレッ ドの作 成 時 に 記 憶 域 が 自 動 的 に 割 り 当 て ら れる よ う に 調 整 さ れます。注キーワード __thread は、 __declspec(thread) の 同 義 と し てサポー ト されています。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-33ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能制 約 条 件フ ァ イル 有 効 範 囲 のス レ ッ ド ローカル 変 数 は、 動 的 に 初 期 化 で き ません。例__declspec(thread) int i;__thread int j; // same as __decspec(thread) int j;4-34 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能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))__attribute__((const))__forceinline__pure__attribute__((deprecated)) -__attribute__((malloc)) -__attribute__((noinline))__declspec(noinline)__attribute__((no_instrument_function))__attribute__((nomerge)) -__attribute__((nonnull))__attribute__((noreturn))__declspec(noreturn))__attribute__((notailcall)) -__attribute__((pure)) -__attribute__((unused)) -<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-35ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能表 4-3 コ ンパイ ラ でサポー ト される 関 数 属 性 および 同 等 属 性 (continued)関 数 属 性非 属 性 等 価__attribute__((used)) -__attribute__((visibility("visibility_type")))__attribute__((weak))__weak4.3.1 __attribute__((alias))こ の 関 数 属 性 を 使 用 する と 、 関 数 の 複 数 エ イ リ ア ス を 指 定 で き ます。関 数 が 現 在 の 変 換 単 位 で 定 義 さ れる 場 合 、 エ イ リ ア スの 呼 び 出 し はその 関 数の 呼 び 出 し に 置 き 換 え られ、 エ イ リ ア スが 元 の 名 前 と 共 に 生 成 さ れます。 関数 が 現 在 の 変 換 単 位 で 定 義 さ れない 場 合 、 エ イ リ ア スの 呼 び 出 し は 実 関 数 の呼 び 出 し に 置 き 換 え ら れます。 関 数 が static として 定 義 される 場 合 、 関 数 名はエイ リ アス 名 に 置 き 換 え られ、 エイ リ アス 名 が 外 部 で 宣 言 された 場 合 、 関数 は 外 部 で 宣 言 さ れます。注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。注変 数 名 は、 対 応 する 変 数 属 性 __attribute__((alias)) を 使 用 してエイ リ アス される 可 能 性 があり ます。構 文return-type newname([argument-list]) __attribute__((alias("oldname")));各 パ ラ メ ータには 以 下 の 意 味 があ り ます。oldname エ イ リ ア ス さ れる 関 数 の 名 前 を 指 定 し ます。newname エ イ リ ア ス さ れる 関 数 の 新 し い 名 前 を 指 定 し ます。例#include void foo(void){printf("%s\n", __FUNCTION__);4-36 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能}void bar(void) __attribute__((alias("foo")));void gazonk(void){bar(); // calls foo}関 連 項 目• 「__attribute__((alias))」 (ページ 4-53)4.3.2 __attribute__((always_inline))こ の 関 数 属 性 は、 関 数 を イ ン ラ イ ン 展 開 する 必 要 があ る こ と を 示 し ます。コ ンパイ ラ は、 関 数 の 特 性 に 関 係 な く 、 その 関 数 を イ ン ラ イ ン 関 数 に し よ うとします。 ただ し、 問 題 が 発 生 する 場 合 、 コ ンパ イ ラ は 関 数 を イ ン ラ イ ン 関数 にし ません。 例 えば、 再 帰 関 数 は 一 度 し か イ ン ラ イ ン 展 開 で き ません。注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。 同 等 のキーワー ド __forceinline があ り ます。例static int max(int x, int y) __attribute__((always_inline)){return x > y ? x : y; // always inline if possible}関 連 項 目• 「--forceinline」 (ページ 2-66)• 「__forceinline」 (ページ 4-7)4.3.3 __attribute__((const))多 く の 関 数 は 渡 さ れた 引 数 のみを 確 認 し、 戻 り 値 以 外 には 作 用 し ません。 関数 に よ る グ ローバル メ モ リ の 読 み 出 しは 許 可 さ れていないため、 こ れは__attribute__((pure)) よ りも 厳 密 なクラスです。 渡 された 引 数 に 対 し てのみ 演算 を 行 う 関 数 は、 共 通 部 分 式 の 削 除 と ループの 最 適 化 の 対 象 にな り ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-37ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている 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)• 『コンパイ ラユーザガイ ド』 の 「__pure」 (ページ 5-16)4.3.4 __attribute__((deprecated))こ の 関 数 属 性 を 使 用 し て、 非 推 奨 の 関 数 が 使 用 さ れた 場 合 に、 警 告 を 生 成 することができます。注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。例int Function_Attributes_deprecated_0(int b) __attribute__ ((deprecated));4-38 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.3.5 __attribute__((malloc))こ の 関 数 属 性 を 使 用 する と 、 関 数 を malloc 関 数 と 同 じ よ う に 処 理 し、 関 連 付け られた 最 適 化 を 実 行 で き ます。注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。例void * Function_Attributes_malloc_0(int b) __attribute__ ((malloc));4.3.6 __attribute__((noinline))こ の 関 数 属 性 を 使 用 する と 、 その 関 数 の 呼 び 出 し 時 に、 その 関 数 を イ ン ラ イン 展 開 しないよ う にする こ とができます。注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。 __declspec と 同 等 の __declspec(noinline) があ り ます。例int fn(void) __attribute__((noinline));int fn(void){return 42;}関 連 項 目• 「#pragma inline, #pragma no_inline」 (ページ 4-71)• 「__declspec(noinline)」 (ページ 4-31)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-39ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能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)• 「--retain=option」 (ページ 2-126)4.3.9 __attribute__((nonnull))こ の 関 数 属 性 は、 NULL ポインタであってはならない 関 数 パラ メータを 指 定します。 こ の 関 数 属 性 を 使 用 する と 、 こ の 種 のパ ラ メ ータ が 検 出 さ れた と きにコンパイラが 警 告 を 生 成 できるよ うになり ます。注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。構 文__attribute__((nonnull(arg-index, ...)))arg-index, ... は 引 数 インデッ クスのリ ス ト を 示 します。引 数 イ ンデ ッ ク スの リ ス ト を 指 定 し ない 場 合 は、 すべてのポ イ ン タ 引 数 が「nonnull」 と してマーク されます。4-40 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能例以 下 の 宣 言 は 同 じ 意 味 にな り ます。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))こ の 関 数 属 性 を 使 用 する と 、 その 関 数 が 値 を 返 さ ない こ と を コ ンパイ ラ に 通知 でき ます。 こ の 通 知 に よ り 、 コ ンパ イ ラ は 実 行 さ れない コー ド を 削 除 するこ と に よ って コー ド を 最 適 化 で き ます。注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。 __declspec と 同 等 の __declspec(noreturn) があ り ます。 ただし、関 数 定 義 を コ ンパイルする 際 に、 関 数 が 明 示 的 ま たは 暗 黙 的 な 戻 り 値 に 達 した 場 合 、 __attribute((noreturn)) は 無 視 されて 警 告 が 生 成 される という 点 で、__attribute((noreturn)) と __declspec(noreturn) は 異 な り ます。 これは__declspec(noreturn) には 当 てはま り ません。例int Function_Attributes_NoReturn_0(void) __attribute__ ((noreturn));関 連 項 目• 「__declspec(noreturn)」 (ページ 4-31)4.3.11 __attribute__((notailcall))こ の 関 数 属 性 を 使 用 する と 、 関 数 の 末 尾 呼 び 出 し を 防 ぐ こ と がで き ます。 つま り 、 ( 関 数 の 呼 び 出 し がその 関 数 の 末 尾 で 行 われたために) 関 数 が 分 岐 によ って 転 送 さ れた 場 合 で も、 関 数 は 必 ず リ ン ク 付 き 分 岐 に よ って 呼 び 出 さ れます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-41ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 「__attribute__((nomerge))」 (ページ 4-40)• 「--retain=option」 (ページ 2-126)4.3.12 __attribute__((pure))多 く の 関 数 は、 値 を 返 す 以 外 に 効 果 がな く 、 その 戻 り 値 はパラ メ ータ と グローバル 変 数 にのみ 依 存 し ます。 こ の よ う な 関 数 は、 データ フ ロー 分 析 の 対象 となり、 削 除 される 場 合 があります。注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.3.13 __attribute__((section("name")))section 関 数 属 性 を 使 用 する と 、 イ メ ージの 異 な る セ ク シ ョ ンに コー ド を 配 置できます。注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている 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' areaint f4(){return 1;} // into the 'foo' area#pragma arm section関 連 項 目• 「#pragma arm section [section_sort_list]」 (ページ 4-63)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-43ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能4.3.14 __attribute__((unused))unused 関 数 属 性 を 使 用 する と 、 その 関 数 が 参 照 さ れない 場 合 に 警 告 が 生 成 されないよ う にする こ とができ ます。 こ の 関 数 属 性 を 使 用 し て も、 未 使 用 の 関数 を 削 除 する 処 理 の 動 作 が 変 更 さ れる こ と はあ り ません。注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。例static int Function_Attributes_unused_0(int b) __attribute__ ((unused));4.3.15 __attribute__((used))こ の 関 数 属 性 を 使 用 する と 、 そのス タ テ ィ ッ ク 関 数 は 参 照 さ れていな く て も、オブジ ェ ク ト フ ァ イル 内 に 保 持 さ れる こ と を コ ンパ イ ラ に 通 知 で き ます。使 用 済 み と マー ク さ れた ス タ テ ィ ッ ク 関 数 は、 宣 言 さ れた 順 番 で 単 一 セ クションに 生 成 されます。 __attribute__((section)) を 使 用 して、 配 置 されるセクシ ョ ン 関 数 を 指 定 できます。注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。注__attribute__((used)) を 使 用 して、 スタテ ィ ッ ク 変 数 を 使 用 済 みとマークすることもできます。例static int lose_this(int);static int keep_this(int) __attribute__((used)); // retained in object filestatic int keep_this_too(int) __attribute__((used)); // retained in object file関 連 項 目• 「__attribute__((section("name")))」 (ページ 4-43)• 「__attribute__((used))」 (ページ 4-59)4-44 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.3.16 __attribute__((visibility("visibility_type")))こ の 関 数 属 性 は ELF シンボルの 可 視 性 に 影 響 し ます。注この 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの 拡 張機 能 です。構 文__attribute__((visibility("visibility_type")))visibility_type は、 次 のいずれかです。defaulthiddeninternalprotected想 定 さ れる シンボルの 可 視 性 は 他 のオプシ ョ ンで 変 更 で き ます。デフ ォル ト の 可 視 性 はその よ う な 変 更 をオーバーラ イ ド し ます。デフ ォル ト の 可 視 性 は 外 部 リ ンケージに 相 当 し ます。シンボルはダイナミ ッ クシンボルテーブルに 配 置 されないため、他 の 実 行 可 能 フ ァ イルや 共 有 ラ イ ブ ラ リ が 直 接 それを 参 照 することはできません。 関 数 ポ イ ン タ を 使 用 し た 間 接 的 な 参 照 は 可 能です。プロセッサ 固 有 のアプリケーショ ンバイナリ インタフェース(psABI) によ る 別 の 指 定 がない 限 り 、 内 部 可 視 性 は 関 数 が 別 のモジ ュールか ら 呼 び 出 さ れない こ と を 意 味 し ます。シンボルはダイナミ ッ クシンボルテーブルに 配 置 されますが、定 義 モジ ュール 内 の 参 照 はローカルシンボルにバ イ ン ド し ます。つま り、 シンボルを 別 のモジュールでオーバーラ イ ドする こ とはでき ません。使 用 法default の 可 視 性 を 指 定 する 場 合 を 除 いて、 こ の 属 性 は、 こ れがなければ 外 部リ ン ケージのあ る 宣 言 で 使 用 する よ う に 設 計 さ れています。こ の 属 性 は C と C++ で 使 用 でき ます。 C++ では、 型 、 メンバ 関 数 、およびネーム スペースの 宣 言 に も 適 用 で き ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-45ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能例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 キーワー ド の 動 作 とは 異 な り ます。注こ の 関 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。例extern int Function_Attributes_weak_0 (int b) __attribute__ ((weak));関 連 項 目• 「__weak」 (ページ 4-23)4-46 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能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))__attribute__((packed))__align__packed a__attribute__((transparent_union)) -a. __packed 修 飾 子 は、 GNU モード の 型 には 影 響 し ません。4.4.1 __attribute__((bitband))__attribute__((bitband)) は、 メ モ リ アーキテ ク チャの SRAM 領 域 と ペ リ フ ェラ ル 領 域 にあ る シングルビ ッ ト 値 へのア ト ミ ッ ク ア ク セス を 効 率 化 で き る 型属 性 です。 特 定 の メ モ リ 領 域 では、 従 来 の 読 み 取 り 、 変 更 、 書 き 込 み 方 式 ではな く、 1 回 の メ モ リ ア ク セスで 直 接 シングルビ ッ ト を 設 定 し た り ク リ ア したりできます。 ま た、 従 来 の 読 み 取 り の 後 でシ フ ト およびマ ス ク 操 作 を 使 用し な く て も、 直 接 シングルビ ッ ト を 読 み 取 る こ と も で き ます。 例 4-6 に、__attribute__((bitband)) の 使 用 法 を 示 し ます。例 4-6 __attribute__((bitband)) の 使 用typedef struct {int i: 1;int j: 2;int k: 3;<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-47ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能} 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能制 限次 の 使 用 制 限 があ り ます。• この 型 属 性 は struct でのみ 使 用 で き ます。 共 用 体 型 、 ま たは 共 用 体 を メンバ と し て 持 つその 他 の 集 合 型 はビ ッ ト バン ド 化 でき ません。• 構 造 体 の メ ンバは 個 別 にビ ッ ト バン ド 化 でき ません。• ビッ トバンドアクセスは、 シングルビッ トのビッ トフィールドにのみ 生成 されます。• ビッ トバンドアクセスは、const オブジェ ク ト 、 ポインタ、 およびローカルオブジェ ク ト には 生 成 されません。関 連 項 目• 「__attribute__((at(address)))」 (ページ 4-54)• 『コンパイ ラユーザガイ ド』 の 「ビ ッ ト バンディ ング」 (ページ 4-17)• 使 用 し てい る プ ロ セ ッ サの 『テ ク ニカル リ フ ァ レンスマニュアル』4.4.2 __attribute__((aligned))aligned 型 属 性 を 使 用 する と 、 その 型 の 最 小 境 界 整 列 を 指 定 で き ます。注こ の 型 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの 拡張 機 能 です。4.4.3 __attribute((packed))packed 型 属 性 を 使 用 する と 、 その 型 に 可 能 な 最 小 境 界 整 列 を 使 用 する よ う に指 定 で き ます。注こ の 型 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの 拡張 機 能 です。エラーこ の 属 性 を typedef で 使 用 する と 、 <strong>ARM</strong> コ ンパ イ ラ は 以 下 の よ う な 警 告 メ ッセージを 生 成 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-49ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 「__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)) で 修 飾 される と、 透 過 ユニオンはその 型 のすべての 関 数 パ ラ メ ータ に 適 用 さ れます。注この 型 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの 拡張 機 能 です。注個 別 関 数 パ ラ メ ータは、 対 応 する __attribute__((transparent_union)) 変 数 属 性に よ って 修 飾 さ れる 可 能 性 も あ り ます。4-50 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能例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 モード でのみサポー ト されています。関 連 項 目• 「__attribute__((transparent_union))」 (ページ 4-57)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-51ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.5.1 __attribute__((alias))こ の 変 数 属 性 を 使 用 する と 、 変 数 の 複 数 エ イ リ ア ス を 指 定 で き ます。変 数 が 現 在 の 変 換 単 位 で 定 義 さ れる 場 合 、 エ イ リ ア スの 参 照 はその 変 数 の 参照 に 置 き 換 え られ、 エイ リ アスが 元 の 名 前 と 共 に 生 成 されます。 変 数 が 現 在の 変 換 単 位 で 定 義 さ れない 場 合 、 エ イ リ ア スの 参 照 は 実 変 数 の 参 照 に 置 き 換えられます。 変 数 が static と し て 定 義 さ れる 場 合 、 変 数 名 はエ イ リ ア ス 名 に置 き 換 え られ、 エ イ リ ア ス 名 が 外 部 で 宣 言 さ れた 場 合 、 変 数 は 外 部 で 宣 言 されます。注関 数 名 は、 対 応 する 関 数 属 性 __attribute__((alias)) を 使 用 してエイ リ アス される 可 能 性 があ り ます。構 文type newname __attribute__((alias("oldname")));各 パラ メ ータには 以 下 の 意 味 があ り ます。oldname エイ リ アス される 変 数 の 名 前 を 指 定 します。newname エ イ リ ア ス さ れる 変 数 の 新 し い 名 前 を 指 定 し ます。例#include int oldname = 1;extern int newname __attribute__((alias("oldname"))); // declarationvoid foo(void){printf("newname = %d\n", newname); // prints 1}関 連 項 目• 「__attribute__((alias))」 (ページ 4-36)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-53ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 『リンカユーザガイド』 の 「__at セ ク シ ョ ン を 使 用 し て 特 定 のア ド レ スにセ ク シ ョ ン を 配 置 する」 (ページ 5-16)4.5.3 __attribute__((aligned))aligned 変 数 属 性 を 使 用 する と 、 変 数 や 構 造 体 フ ィ ール ド の 最 小 境 界 整 列 をバイト 単 位 で 指 定 できます。注こ の 変 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている 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 <strong>ARM</strong> */関 連 項 目• 「__align」 (ページ 4-2)4.5.4 __attribute__((deprecated))deprecated 変 数 属 性 を 使 用 する と 、 警 告 やエ ラーが 生 成 さ れる こ と な く 、 非 推奨 の 変 数 を 宣 言 できます。 deprecated 変 数 へのア ク セスに 対 し ては 警 告 が 生 成されますが、 コンパイルは 実 行 されます。 こ の 警 告 では、 その 変 数 が 使 用 されている 場 所 と 定 義 されている 場 所 を 通 知 し ます。 こ の 情 報 は、 特 定 の 変 数が 非 推 奨 の 原 因 を 判 断 する のに 役 立 ち ます。注こ の 変 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-55ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能例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 ビッ トが 使 用 されます。注こ の 変 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.5.6 __attribute__((section("name")))通 常 <strong>ARM</strong> コンパイラでは、 生 成 したオブジェク トを data や bss などのセクションに 配 置 します。 し か し、 追 加 のデータ セ ク シ ョ ンが 必 要 になった り 、変 数 を 特 別 なセ ク シ ョ ンに 配 置 し た り する 場 合 ( 特 別 なハー ド ウ ェ アへのマップを 行 う 場 合 など) があります。 section 属 性 を 使 用 する と、 変 数 を 特 定のデータ セ ク シ ョ ンに 配 置 する よ う に 指 定 で き ます。 section 属 性 を 使 用 すると、zero_init 属 性 を 使 用 し ない 限 り 、 読 み 出 し 専 用 変 数 は RO データ セ クシ ョ ンに 配 置 さ れ、 読 み 出 し - 書 き 込 み 変 数 は RW データ セ ク シ ョ ンに 配 置されます。 こ の 場 合 、 変 数 は ZI セクションに 配 置 されます。注こ の 変 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている 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 がどの 型 と して 書 き 込 まれるかを 特 定 する 方 法 も、 引 数 と して 渡 す 必 要 があ り ます。注こ の 変 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-57ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能注ま た、 こ の 属 性 を 共 用 体 データ 型 の 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);}関 連 項 目• 「__attribute__((transparent_union))」 (ページ 4-50)4.5.8 __attribute__((unused))通 常 、 宣 言 さ れてい る 変 数 が 一 度 も 参 照 さ れない 場 合 は、 警 告 が 生 成 さ れます。 こ の 属 性 を 使 用 する と 、 特 定 の 変 数 が 使 用 さ れない こ と が 予 想 済 みである こ と を コ ンパイ ラ に 通 知 し、 その 変 数 が 使 用 さ れな く て も 警 告 を 生 成 し ないよ うに 指 定 できます。注こ の 変 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。4-58 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能例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)) を 使 用 して、 変 数 が 配 置 されるセクショ ンを 指 定 できます。注こ の 変 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。注__attribute__((used)) を 使 用 し て、 ス タ テ ィ ッ ク 関 数 を 使 用 済 み と マー ク することもできます。使 用 法__attribute__((used)) を 使 用 して、 オブジェ ク ト 内 にテーブルをビルドできます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-59ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能例static int lose_this = 1;static int keep_this __attribute__((used)) = 2; // retained in object filestatic int keep_this_too __attribute__((used)) = 3; // retained in object file関 連 項 目• 「__attribute__((section("name")))」 (ページ 4-57)• 「__attribute__((used))」 (ページ 4-44)4.5.10 __attribute__((visibility("visibility_type")))こ の 変 数 属 性 は ELF シンボルの 可 視 性 に 影 響 し ます。注この 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能注GNU モード では、 extern 修 飾 子 を 指 定 する 必 要 があ り ます。 非 GNU モード では、 変 数 が extern でない 場 合 、 コ ンパイ ラ はその 変 数 を 他 の 非 weak 変 数 と 同じように 扱 います。注こ の 変 数 属 性 は、 <strong>ARM</strong> コンパイラでサポート されている GNU コンパイラの拡 張 機 能 です。関 連 項 目• 「__weak」 (ページ 4-23)4.5.12 __attribute__((zero_init))section 属 性 を 使 用 する と 、 変 数 を 特 定 のデータ セ ク シ ョ ンに 配 置 する よ う に指 定 で き ます。 zero_init 属 性 は、 イ ニシ ャ ラ イ ザが 指 定 さ れていない 変 数 をZI データ セ ク シ ョ ンに 配 置 する よ う 指 定 し ます。 イニシャライザが 指 定 されている 場 合 は、 エラーが 生 成 されます。例__attribute__((zero_init)) int x; /* in section ".bss" */__attribute__((section("mybss"), zero_init)) int y; /* in section "mybss" */関 連 項 目• 「__attribute__((section("name")))」 (ページ 4-57)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-61ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能4.6 プラグマ<strong>ARM</strong> コンパイラは、 <strong>ARM</strong> 固 有 のプ ラ グマの 数 を 認 識 し ます。 表 4-6 に、 使用 可 能 なプ ラ グマを 示 し ます。注プラグマによって、 関 連 するコマンドラインオプションはオーバーライドされます。 例 えば、 #pragma arm を 指 定 する と、--thumb コマンド ラインオプショ ンがオーバーラ イ ド されます。表 4-6 コンパイラでサポートされるプラグマプラグマ#pragma anon_unions,#pragma no_anon_unions#pragma hdrstop#pragma Otime#pragma arm #pragma import symbol_name #pragma pack(n)#pragma arm section[section_sort_list]#pragma diag_defaulttag[,tag,...]#pragma diag_errortag[,tag,...]#pragma diag_remarktag[,tag,...]#pragma diag_suppresstag[,tag,...]#pragma diag_warningtag[,tag,...]#pragma[no_]exceptions_unwind#pragmaimport(__use_full_stdio)#pragma inline,#pragma no_inline#pragma no_pch#pragma Onum#pragma once#pragma hdrstop#pragma Ospace#pragma pop#pragma push#pragma softfp_linkage,no_softfp_linkage#pragma unroll [(n)]#pragma unroll_completely#pragma thumb4.6.1 #pragma anon_unions, #pragma no_anon_unionsこ れら のプ ラ グマを 使 用 する と 、 匿 名 の 構 造 体 と 共 用 体 のサポー ト を 有 効 または 無 効 にで き ます。4-62 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能デフォルトデフォル ト は #pragma no_anon_unions です。関 連 項 目• 「 匿 名 ク ラ ス、 匿 名 構 造 体 、 匿 名 共 用 体 」 (ページ 3-21)• 「__attribute__((transparent_union))」 (ページ 4-50)4.6.2 #pragma armこ のプ ラ グマを 使 用 する と 、 <strong>ARM</strong> 命 令 セ ッ ト の コー ド 生 成 に 切 り 替 わ り ます。 これによ り、--thumb コンパイラオプションはオーバーライドされます。関 連 項 目• 「--arm」 (ページ 2-9)• 「--thumb」 (ページ 2-136)• 「#pragma thumb」 (ページ 4-79)4.6.3 #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"]*<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-63ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能有 効 なセ ク シ ョ ンの 型 は 以 下 の と お り です。• code• rodata• rwdata• zidata使 用 法<strong>ARM</strong> リ ンカにス キ ャ ッ タ ロー ド 記 述 フ ァ イルを 使 用 し て、 命 名 さ れたセ クシ ョ ン を メ モ リ 内 の 特 定 のア ド レ スに 配 置 する 方 法 を 制 御 で き ます。制 約 条 件このオプシ ョ ンは、 以 下 に 対 し ては 作 用 し ません。• イ ン ラ イ ン 関 数 および こ の 関 数 の ローカルス タ テ ィ ッ ク 変 数• テンプレートのインスタンスおよびこのインスタンスのローカルスタティック 変 数• 未 使 用 の 変 数 と 関 数 の 削 除 。 使 用 さ れる 関 数 や 変 数 と 同 じ セ ク シ ョ ンに存 在 する 関 数 や 変 数 は 未 使 用 であ って も 保 持 さ れますが、 #pragma armsection を 使 用 する と 、 リ ンカは、 こ の よ う な 関 数 や 変 数 を 削 除 で き ることがあります。• 定 義 がオブジ ェ ク ト フ ァ イルに 書 き 込 まれる 順 序例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 .bssint const z2[3] = {1,2,3}; // in barchar *s2 = "abc";// s2 in foo, "abc" in .conststring#pragma arm section rodataint x3 = 5;// in fooint y3[100];// in .bssint const z3[3] = {1,2,3}; // in .constdatachar *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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能return x+1;}#pragma arm section code関 連 項 目• 「__attribute__((section("name")))」 (ページ 4-43)• 『リンカユーザガイド』 の 第 5 章 スキャッタロード 記 述 ファイルの 使 用4.6.4 #pragma diag_default tag[,tag,...]こ のプ ラ グマを 使 用 する と 、 指 定 さ れた タ グ 付 き の 診 断 メ ッ セージの 重 大 度が、 プラ グマの 発 行 前 に 設 定 されていた 重 大 度 に 戻 り ます。構 文#pragma diag_default tag[,tag,...]各 パラ メ ータには 以 下 の 意 味 があ り ます。tag[,tag,...]重 大 度 を 変 更 する メ ッ セージを 指 定 する 診 断 メ ッ セージの番 号 を コ ンマで 区 切 った リ ス ト です。少 な く と も 1 つの 診 断 メ ッ セージを 指 定 する 必 要 があ り ます。例// not #included deliberately#pragma diag_error 223void hello(void){printf("Hello ");}#pragma diag_default 223void world(void){printf("world!\n");}--diag_warning=223 オプシ ョ ンを 使 用 してこのコード をコンパイルする と、 診断 メ ッセージが 生 成 され、printf() 関 数 が 暗 示 的 に 宣 言 さ れた こ と を レ ポー トします。#pragma diag_default 223 は、--diag_warning コマンド ラインオプショ ンで 指 定 された とお り 、 診 断 メ ッセージ 223 重 大 度 を 警 告 の 重 大 度 に 戻 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-65ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 「--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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.6.6 #pragma diag_remark tag[,tag,...]こ のプ ラ グマは、 指 定 さ れた タ グ を 持 つ 診 断 メ ッ セージを 注 釈 の 重 大 度 に 設定 します。コ ンパイ ラ が 指 定 さ れた タ ブを 持 つ 診 断 メ ッ セージをエ ラーの 重 大 度 ではなく 、 注 釈 の 重 大 度 に 設 定 する 点 を 除 いて、#pragma diag_remark の 動 作 は #pragmadiag_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)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-67ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能4.6.7 #pragma diag_suppress tag[,tag,...]こ のプ ラ グマは、 指 定 さ れた タ グ を 含 むすべての 診 断 メ ッ セージをデ ィ セーブルにし ます。コ ンパイ ラ が 指 定 さ れた タ ブを 持 つ 診 断 メ ッ セージをエ ラーの 重 大 度 に 設 定する 代 わ り に 非 表 示 にする 点 を 除 いて、#pragma diag_suppress の 動 作 は #pragmadiag_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 の 動 作 は #pragmadiag_errors に 似 ています。4-68 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能構 文#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)• 「 実 行 時 に 展 開 さ れる 関 数 」 (ページ 5-21)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-69ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能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)• 『ライブラ リ / 浮 動 小 数 点 サポー ト ガ イ ド 』 の 第 3 章 C マイクロライブラリ• 『ライブラ リ / 浮 動 小 数 点 サポー ト ガ イ ド 』 の 「 入 出 力 関 数 のカ ス タ マ イズ」 (ページ 2-92)4.6.13 #pragma inline, #pragma no_inlineこれらのプラグマは、--inline および --no_inline コマンド ラインオプショ ンと 同 様 に、 インライン 展 開 を 制 御 します。 #pragma no_inline で 定 義 された 関 数は、 他 の 関 数 に イ ン ラ イ ン 展 開 さ れず、 その 関 数 の 呼 び 出 し も イ ン ラ イ ン 展開 しません。他 の 関 数 へのイ ン ラ イ ン 展 開 の 非 表 示 は、 関 数 を __declspec(noinline) または__attribute__((noinline)) とマークすることによっても 実 行 できます。デフォルトデフォル ト は #pragma inline です。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-71ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 「--inline, --no_inline」 (ページ 2-83)• 「__declspec(noinline)」 (ページ 4-31)• 「__attribute__((noinline))」 (ページ 4-39)4.6.14 #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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能例以 下 の 例 の よ う に、 ヘ ッ ダ フ ァ イルの 本 体 を 囲 むよ う に #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」• 「-Ospace」 (ページ 2-110)4.6.18 #pragma Otimeこ のプ ラ グマを 使 用 する と 、 イ メ ージサ イ ズが 大 き く な る 可 能 性 はあ り ますが、 実 行 時 間 が 削 減 さ れる よ う に 最 適 化 さ れます。関 連 項 目• 「#pragma Ospace」• 「-Otime」 (ページ 2-111)4.6.19 #pragma pack(n)こ のプ ラ グマを 使 用 する と 、 構 造 体 の メ ンバの 境 界 が n と 自 然 な 境 界 の 小 さい 方 の 値 で 整 列 されます。 パ ッ ク さ れたオブジ ェ ク ト の 読 み 出 し と 書 き 込 みは、 非 境 界 整 列 ア ク セス を 使 用 し て 行 われます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-73ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能構 文#pragma pack(n)各 パ ラ メ ータには 以 下 の 意 味 があ り ます。nバイ ト 単 位 の 境 界 整 列 です。 有 効 な 境 界 整 列 値 は 1、 2、 4、 および 8 です。デフォルトデフォル ト は #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 3a padding4 5 6 7b b b b図 4-1 非 パ ッ ク 構 造 体 S4-74 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能注SP は 6 バ イ ト 構 造 体 です。 b の 後 にパデ ィ ングはあ り ません。0 1 2 3a x b b4b5b図 4-2 パ ッ ク 構 造 体 SP関 連 項 目• 「__packed」 (ページ 4-12)• 「__attribute__((packed))」 (ページ 4-56)• 「パ ッ ク 構 造 体 」 (ページ 5-11)• 『コンパイ ラユーザガイ ド』 の 「__packed 修 飾 子 と 非 境 界 整 列 型 のデータアクセス」 (ページ 5-31)• 『コンパイ ラユーザガイ ド』 の 「パ ッ ク 構 造 体 と 個 別 パ ッ ク フ ィ ール ド 」(ページ 5-33)4.6.20 #pragma popこ のプ ラ グマを 使 用 する と 、 前 に 保 存 さ れたプ ラ グマ 状 態 が 復 元 さ れます。関 連 項 目• 「#pragma push」4.6.21 #pragma pushこ のプ ラ グマを 使 用 する と 、 現 在 のプ ラ グマ 状 態 が 保 存 さ れます。関 連 項 目• 「#pragma pop」<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-75ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能構 文#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;<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-77ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能}}}この 例 では、src2 が src2[j][k] としてインデクスが 付 けられ、ループが 逆 の 順序 すなわち j が k の 内 側 にネス ト されているので、 コ ンパイ ラによ るループ解 析 は 正 常 に 完 了 し ません。 この 例 の #pragma unroll の コ メ ン ト 化 を 解 除 すると、 ループは 4 回 展 開 さ れます。n * n のマ ト リ ク スのよ う なサイズが 4 の 倍 数 でないマ ト リ ク ス を 掛 ける こ とが 目 的 であれば、 代 わ り に #pragma unroll (m) を 使 用 できます。 こ こで、 m は、n が m の 整 数 倍 であ る よ う な 値 です。関 連 項 目• 「--diag_warning=optimizations」 (ページ 2-55)• 「-Onum」 (ページ 2-108)• 「-Otime」 (ページ 2-111)• 「--vectorize, --no_vectorize」 (ページ 2-146)• 「#pragma unroll_completely」• 『コンパイ ラユーザガイ ド』 の 「ループの 最 適 化 」 (ページ 5-5)4.6.24 #pragma unroll_completelyこのプラグマによって、 ループを 完 全 に 展 開 することをコンパイラに 指 示 します。 ループの 繰 り 返 し 回 数 を コ ンパイ ラ が 判 別 で き る 場 合 にのみ 有 効 です。注ベク トル 化 されたループもベク トル 化 されていないループも、 どちらも#pragma unroll_completely を 使 用 して 展 開 できます。 すなわち、 #pragmaunroll_completely は --no_vectorize と --vectorize の 両 方 に 適 用 されます。使 用 法-O3 -Otime を 使 用 し てコ ンパイルする 場 合 、 ループの 展 開 が 有 効 な 場 所 では 自動 的 にループが 展 開 さ れます。 こ のプ ラ グマを 使 用 する と 、 自 動 的 には 完 全に 展 開 さ れないループを 完 全 に 展 開 する こ と を コ ンパイ ラ に 要 求 で き ます。4-78 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能注この #pragma は、 コンパイ ラによって 最 適 なループの 展 開 が 行 われていないとい う 確 証 が --diag_warning=optimizations な どか ら 得 られる 場 合 にのみ 使 用 し ます。制 約 条 件#pragma unroll_completely は、 for ループ、 while ループ、 ま たは do ... while ループの 直 前 でのみ 使 用 で き ます。#pragma unroll_completely を 外 側 のループで 使 用 する と、 ベク ト ル 化 を 防 止 できます。 逆 に、 内 側 のループで #pragma unroll_completely を 使 用 する のが 有 効な 場 合 も あ り ます。関 連 項 目• 「--diag_warning=optimizations」 (ページ 2-55)• 「-Onum」 (ページ 2-108)• 「-Otime」 (ページ 2-111)• 「--vectorize, --no_vectorize」 (ページ 2-146)• 「#pragma unroll [(n)]」 (ページ 4-76)• 『コンパイ ラユーザガイ ド』 の 「ループの 最 適 化 」 (ページ 5-5)4.6.25 #pragma thumbこ のプ ラ グマを 使 用 する と 、 Thumb 命 令 セ ッ ト のコー ド 生 成 に 切 り 替 わ り ます。 これによ り、--arm コンパイラオプションはオーバーライドされます。Thumb-2 以 前 のプ ロ セ ッ サ 用 の コー ド を コ ンパイルし てお り 、 VFP を 使 用 してい る 場 合 は、 浮 動 小 数 点 演 算 を 含 むすべての 関 数 が <strong>ARM</strong> 用 にコ ンパイルされます。関 連 項 目• 「--arm」 (ページ 2-9)• 「--thumb」 (ページ 2-136)• 「#pragma arm」 (ページ 4-63)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-79ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能4.7 命 令 コ ンパイ ラ 組 み 込 み 関 数このセクションでは、 C または C++ コードからの <strong>ARM</strong> マシン 言 語 命 令 を 実行 する 命 令 コ ンパ イ ラ 組 み 込 み 関 数 について 説 明 し ます。 表 4-7 には、 使 用で き る コ ンパイ ラ 組 み 込 み 関 数 を 示 し ます。表 4-7 <strong>ARM</strong> コ ンパイ ラによ っ てサポー ト されている 命 令 コ ンパイ ラ 組 み 込 み 関 数命 令 コ ンパイ ラ 組 み 込 み 関 数__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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能構 文void __breakpoint(int val)各 パラ メ ータには 以 下 の 意 味 があ り ます。val コ ンパイル 時 の 定 数 整 数 を 指 定 し ます。 その 範 囲 は 以 下 の と おりです。0 ... 65535 ソースを <strong>ARM</strong> コード と してコンパイルする場 合0 ... 255 ソースを Thumb コード と してコンパイルする場 合エラーBKPT 命 令 をサポー ト し ない ターゲ ッ ト 向 けにコ ンパ イル さ れる 場 合 、 コ ンパイラは __breakpoint コ ンパイ ラ 組 み 込 み 関 数 を 認 識 し ません。 こ の 場 合 、 コ ンパイラによって 警 告 またはエラーが 生 成 されます。BKPT 命 令 をサポー ト し ていないアーキテ ク チ ャ で、 こ の 命 令 を 実 行 する と 、未 定 義 の 命 令 の ト ラ ッ プが 発 生 し ます。例void func(void){...__breakpoint(0xF02C);...}関 連 項 目• 『アセンブラガイ ド』 の 「BKPT」 (ページ 4-141)4.7.2 __cdpこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパ イ ラ に よ って 生 成 さ れる 命令 ス ト リームに CDP または CDP2 命 令 を 挿 入 し ます。 組 み 込 み 関 数 を 使 用 すると、 C または C++ コードにコプロセッサのデータ 演 算 を 含 めるこ とができます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-81ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能構 文__cdp(unsigned int coproc, unsigned int opcode1, unsigned int opcode2)各 パ ラ メ ータには 以 下 の 意 味 があ り ます。coprocopcode1opcode2命 令 が 実 行 さ れる コ プ ロ セ ッ サを 識 別 し ます。coproc は、 0 ~ 15 の 範 囲 内 の 整 数 であ る 必 要 があ り ます。コ プ ロ セ ッ サ 固 有 のオペコー ド を 指 定 し ます。0x100 をオペコードに 追 加 して、 CDP2 命 令 を 生 成 し ます。コ プ ロ セ ッ サ 固 有 のオペコー ド を 指 定 し ます。使 用 法こ れら の 命 令 の 使 用 方 法 はコ プ ロ セ ッ サに よ って 異 な り ます。 詳 細 については、 使 用 し ている コプロ セ ッ サのマニ ュ アルを 参 照 し て 下 さ い。関 連 項 目• 『アセンブラガイ ド』 の 「CDP、 CDP2」 (ページ 4-133)4.7.3 __clrexこ のコ ンパ イ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパイ ラ に よ って 生 成 さ れる 命令 ス ト リームに CLREX 命 令 を 挿 入 し ます。 組 み 込 み 関 数 を 使 用 する と 、 C または C++ コードに CLREX 命 令 を 含 める こ とができます。構 文void __clrex(void)エラーCLREX 命 令 をサポー ト し ない ターゲ ッ ト 向 けに コ ンパイル さ れる 場 合 、 コ ンパイラは __clrex コ ンパイ ラ 組 み 込 み 関 数 を 認 識 し ません。 こ の 場 合 、 コ ンパ イラによって 警 告 またはエラーが 生 成 されます。関 連 項 目• 『アセンブラガイ ド』 の 「CLREX」 (ページ 4-43)4-82 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.7.4 __clzこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパ イ ラ に よ って 生 成 さ れる 命令 ス ト リームに CLZ 命 令 、 ま たは 等 価 コー ド シーケン ス を 挿 入 し ます。 組 み 込み 関 数 を 使 用 する と 、 C または C++ コードに 含 まれるデータ 値 の 先 行 ゼロの数 をカウン ト できます。構 文unsigned char __clz(unsigned int val)各 パラ メ ータには 以 下 の 意 味 があ り ます。valunsigned int を 指 定 し ます。戻 り 値__clz コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 val に 含 まれる 先 行 ゼロの 数 が返 されます。関 連 項 目• 「その 他 の 組 み 込 み 関 数 」 (ページ 4-128)• 『アセンブラガイ ド』 の 「CLZ」 (ページ 4-61)4.7.5 __current_pcこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 関 数 が 使 用 さ れる 位 置 のプ ロ グラ ムカ ウ ン タ の 現 在 値 を 決 定 で き ます。構 文unsigned int __current_pc(void)戻 り 値__current_pc コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 関 数 が 使 用 さ れる 位 置 のプ ロ グ ラ ムカ ウ ン タ の 現 在 値 が 返 さ れます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-83ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 「__current_sp」• 「__return_address」 (ページ 4-101)• 『コンパイ ラユーザガイ ド』 の 「sp、 lr、 または pc にアクセスする 従 来のインラインアセンブラ」 (ページ 7-30)4.7.6 __current_spこ のコ ンパ イ ラ 組 み 込 み 関 数 を 使 用 する と 、 プ ロ グ ラ ムの 現 在 位 置 のス タ ックポインタ 値 が 返 されます。構 文unsigned int __current_sp(void)戻 り 値__current_sp コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 関 数 が 使 用 さ れる 位 置 のスタックポインタの 現 在 値 が 返 されます。関 連 項 目• 「その 他 の 組 み 込 み 関 数 」 (ページ 4-128)• 「__current_pc」 (ページ 4-83)• 「__return_address」 (ページ 4-101)• 『コンパイ ラユーザガイ ド』 の 「sp、 lr、 または pc にアクセスする 従 来のインラインアセンブラ」 (ページ 7-30)4.7.7 __disable_fiqこ のコ ンパ イ ラ 組 み 込 み 関 数 は、 FIQ 割 り 込 みをデ ィ セーブルに し ます。注通 常 、 こ のコ ンパ イ ラ 組 み 込 み 関 数 は、 CPSR で F ビ ッ ト を 設 定 する こ と によって、 FIQ 割 り 込 みをディ セーブルし ます。 ただし、 v7-M の 場 合 は、フォールトマスクレジスタ (FAULTMASK) が 設 定 されます。 v6-M では、FIQ 割 り 込 みがサポート されていません。4-84 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能構 文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 割 り 込 みをデ ィ セーブルに し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-85ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能注通 常 、 こ のコ ンパ イ ラ 組 み 込 み 関 数 は、 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能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)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-87ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能制 約 条 件__enable_irq コ ンパイ ラ 組 み 込 み 関 数 を 実 行 で き る のは、 特 権 モー ド 、 つまり 非 ユーザモード の 場 合 のみです。 こ のコ ンパ イ ラ 組 み 込 み 関 数 をユーザモード で 実 行 し て も、 CPSR 内 の 割 り 込 みフ ラ グが 変 更 さ れる こ と はあ り ません。関 連 項 目• 「__disable_irq」 (ページ 4-85)4.7.11 __fabsこ のコ ンパ イ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパイ ラ に よ って 生 成 さ れる 命令 ス ト リームに VABS 命 令 、 ま たは 等 価 コー ド シーケ ン ス を 挿 入 し ます。 この関 数 を 使 用 する と、 C または C++ コー ド 内 か ら の 倍 精 度 浮 動 小 数 点 絶 対 値 を取 得 で き ます。注__fabs コ ンパ イ ラ 組 み 込 み 関 数 は、 標 準 的 な C ライブラリ 関 数 fabs のアナログです。 標 準 ラ イ ブ ラ リ 関 数 では、 __fabs の 呼 び 出 し に 対 する、 VFP コプロセッサを 装 備 した <strong>ARM</strong> アーキテクチャベースのプロセッサ 上 のシングル、インラ イン、 マシン 命 令 へのコンパイルが 保 証 されていますが、 これは 異 なります。構 文double __fabs(double val)各 パ ラ メ ータには 以 下 の 意 味 があ り ます。val 倍 精 度 浮 動 小 数 点 値 を 指 定 し ます。戻 り 値__fabs コ ンパ イ ラ 組 み 込 み 関 数 は、 val の 絶 対 値 を double として 返 します。関 連 項 目• 「__fabsf」 (ページ 4-89)• 『アセンブラガイ ド』 の 「VABS、 VNEG、 VSQRT」 (ページ 5-112)4-88 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.7.12 __fabsfこ の コ ンパイ ラ 組 み 込 み 関 数 は、 __fabs 組 み 込 み 関 数 の 単 精 度 バージ ョ ンです。 機 能 的 には、 以 下 の 点 を 除 いて __fabs と 同 じです。• この 関 数 は、double 型 の 引 数 の 代 わ り に、 float 型 の 引 数 を 取 り ます。• double 値 の 代 わ り に、 float 値 を 返 し ます。関 連 項 目• 「__fabs」 (ページ 4-88)• 『アセンブラガイ ド』 の 「V{Q}ABS および V{Q}NEG」 (ページ 5-67)4.7.13 __force_storesこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 現 在 の 関 数 の 外 側 で 可 視 のすべての 変 数 ( 関 数 と の 間 で 受 け 渡 し が 行 われる ポ イ ン タ を 持 つ 変 数 な ど) は、変 更 さ れた 場 合 に メ モ リ に 書 き 込 まれます。こ の コ ンパイ ラ 組 み 込 み 関 数 は、 ス ケジ ュー リ ングのバ リ ア と し て も 機 能 します。構 文void __force_stores(void)関 連 項 目• 「__memory_changed」 (ページ 4-94)• 「__schedule_barrier」 (ページ 4-103)4.7.14 __ldrexこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパ イ ラ に よ って 生 成 さ れる 命令 ス ト リームに LDREX[size] 形 式 の 命 令 を 挿 入 し ます。 LDREX 命 令 を 使 用 して、C または C++ のコー ド に メ モ リ か らデータ を ロー ド で き ます。 LDREX[size] のsize は、 バイ ト ス ト アの B またはハーフワードス ト アの H です。 サイズが 指 定さ れていない 場 合 は、 ワー ド ス ト アが 実 行 さ れます。構 文unsigned int __ldrex(volatile void *ptr)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-89ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能各 パ ラ メ ータには 以 下 の 意 味 があ り ます。ptrメモリからロードされるデータのアドレスを 指 します。 ロード されるデータ の 型 を 指 定 する には、 パ ラ メ ータ を 適 切 なポ イ ン タ型 にキ ャ ス ト し ます。表 4-8 __ldrex コ ンパイ ラ 組 み 込 み 関 数 によ っ てサポー ト されるア ク セス 幅命 令ロード されたデータのサイズC のキャ ス トLDREXB 符 号 な しバイ ト (unsigned char *)LDREXB 符 号 付 きバイ ト (signed char *)LDREXH 符 号 な しハーフ ワードLDREXH 符 号 付 きハーフ ワード(unsigned short *)(short *)LDREX ワード (int *)戻 り 値__ldrex コ ンパ イ ラ 組 み 込 み 関 数 は、 ptr が 示 す メ モ リ ア ド レ スから ロード されたデータ を 返 し ます。エラーLDREX 命 令 をサポー ト し ない ターゲ ッ ト 向 けに コ ンパイル さ れる 場 合 、 コ ンパイラは __ldrex コ ンパイ ラ 組 み 込 み 関 数 を 認 識 し ません。 こ の 場 合 、 コ ンパ イラによって 警 告 またはエラーが 生 成 されます。__ldrex コ ンパ イ ラ 組 み 込 み 関 数 は、 ダブルワー ド データへのア ク セス をサポー ト し ません。 サポー ト されないアクセス 幅 を 指 定 する と、 コンパイ ラによってエラーが 生 成 されます。例int foo(void){int loc = 0xff;return __ldrex((volatile char *)loc);}4-90 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能コマンド ラインオプショ ン --cpu=6k を 使 用 してこのコード をコンパイルすると 、 以 下 の コー ド が 生 成 さ れます。||foo|| PROCMOVLDREXBBXENDPr0,#0xffr0,[r0]lr関 連 項 目• 「__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 コ ンパイ ラ 組 み 込 み 関 数 によ っ てサポー ト されるア ク セス 幅命 令ロード されたデータのサイズC のキャス トLDREXD 符 号 な し long long (unsigned long long *)LDREXD 符 号 付 き long long (signed long long *)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-91ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能戻 り 値__ldrexd コ ンパ イ ラ 組 み 込 み 関 数 は、 ptr が 示 す メ モ リ ア ド レ スから ロード されたデータ を 返 し ます。エラーLDREXD 命 令 をサポー ト し ない ターゲ ッ ト 向 けに コ ンパ イ ル さ れる 場 合 、 コ ンパイラは __ldrexd コ ンパイ ラ 組 み 込 み 関 数 を 認 識 し ません。 この 場 合 、 コンパイラによって 警 告 またはエラーが 生 成 されます。__ldrexd コ ンパ イ ラ 組 み 込 み 関 数 は、 ダブルワー ド データへのア ク セスのみをサポート します。 サポー ト されないアクセス 幅 を 指 定 する と、 コンパイ ラによってエラーが 生 成 されます。関 連 項 目• 「__ldrex」 (ページ 4-89)• 「__strex」 (ページ 4-108)• 「__strexd」 (ページ 4-110)• 『アセンブラガイ ド』 の 「LDREX と STREX」 (ページ 4-40)4.7.16 __ldrtこ のコ ンパ イ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパイ ラ に よ って 生 成 さ れる 命令 ス ト リームに LDR{size}T 形 式 のアセンブ リ 言 語 命 令 を 挿 入 し ます。 LDRT 命 令を 使 用 して、 C または C++ コードにメモリからデータをロードできます。構 文unsigned int __ldrt(const volatile void *ptr)4-92 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能各 パラ メ ータには 以 下 の 意 味 があ り ます。ptrメモリからロード されるデータのアドレスを 指 します。 ロード されるデータのサイズを 指 定 するには、 パラ メータを 適 切 な 整 数型 にキ ャ ス ト し ます。表 4-10 __ldrt コ ンパイ ラ 組 み 込 み 関 数 によ っ てサポー ト されるア ク セス 幅命 令 aロード されたデータのサイズC のキャス トLDRSBT 符 号 付 きバイ ト (signed char *)LDRBT 符 号 な しバイ ト (char *)LDRSHT 符 号 付 きハーフ ワードLDRHT 符 号 な しハーフ ワード(signed short int *)(short int *)LDRT ワード (int *)a. ま たはその 等 価 命 令戻 り 値__ldrt コ ンパイ ラ 組 み 込 み 関 数 は、 ptr が 示 す メ モ リ ア ド レ スから ロード されたデータ を 返 し ます。エラーLDRT 命 令 をサポー ト し ない ターゲ ッ ト 向 けにコ ンパ イル さ れる 場 合 、 コ ンパイラは __ldrt コ ンパイ ラ 組 み 込 み 関 数 を 認 識 し ません。 この 場 合 、 コンパイラによって 警 告 またはエラーが 生 成 されます。__ldrt コ ンパイ ラ 組 み 込 み 関 数 は、 ダブルワー ド データへのア ク セス をサポー ト し ません。 サポー ト されないアクセス 幅 を 指 定 する と、 コンパイ ラによってエラーが 生 成 されます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-93ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能例int foo(void){int loc = 0xff;return __ldrt((const volatile int *)loc);}デフォル ト オプシ ョ ンを 使 用 してこのコード をコンパイルする と、 以 下 のコードが 生 成 されます。||foo|| PROCMOV r0,#0xffLDRBT r1,[r0],#0MOV r2,#0x100LDRBT r0,[r2],#0ORR r0,r1,r0,LSL #8BX lrENDP関 連 項 目• 「--thumb」 (ページ 2-136)• 『アセンブラガイ ド』 の 「LDR と STR (ユーザモード)」 (ページ 4-18)4.7.17 __memory_changedこ のコ ンパ イ ラ 組 み 込 み 関 数 を 使 用 する と 、 現 在 の 関 数 の 外 側 で 可 視 のすべての 変 数 ( 関 数 と の 間 で 受 け 渡 し が 行 われる ポ イ ン タ を 持 つ 変 数 な ど) は、変 更 さ れた 場 合 は メ モ リ に 書 き 込 まれ、 その 後 、 メ モ リ か ら 読 み 出 さ れます。こ のコ ンパ イ ラ 組 み 込 み 関 数 は、 ス ケジ ュー リ ングのバ リ ア と し て も 機 能 します。構 文void __memory_changed(void)関 連 項 目• 「__force_stores」 (ページ 4-89)• 「__schedule_barrier」 (ページ 4-103)4-94 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能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++ プログラムか ら メ モ リ シ ス テムに 事 前 に 通 知 する こ と がで き ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-95ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能構 文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」• 「__pli」 (ページ 4-97)• 『アセンブラガイ ド』 の 「PLD、 PLDW、 PLI」 (ページ 4-26)4.7.20 __pldwこ のコ ンパ イ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパイ ラ に よ って 生 成 さ れる 命令 ス ト リームに PLDW 命 令 を 挿 入 します。 これによ り、 アドレスからのデータの ロー ド が 書 き 込 み 目 的 で 実 行 さ れる こ と を、 C または C++ プログラムからメモリシステムに 事 前 に 通 知 できます。4-96 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能構 文void __pldw(...)各 パラ メ ータには 以 下 の 意 味 があ り ます。... プ リ フ ェ ッ チする メ モ リ のア ド レ ス を 指 定 する、 任 意 の 数 のポイ ン タ ま たは 整 数 引 数 を 示 し ます。制 約 条 件ターゲ ッ ト アーキテ ク チャ がデータ のプ リ フ ェ ッ チをサポー ト し ない 場 合 、こ の コ ンパイ ラ 組 み 込 み 関 数 は 無 効 です。こ の 組 み 込 み 関 数 は、 マルチプ ロ セ ッ シング 拡 張 機 能 を 提 供 し てい る <strong>ARM</strong>v7以 上 のアーキテ ク チャ でのみ 有 効 です。 つま り 、 事 前 定 義 のマ ク ロ__TARGET_FEATURE_MULTIPROCESSING が 定 義 されている 場 合 です。例void foo(int *bar){__pldw(bar);}関 連 項 目• 「コ ンパイ ラ に よ る 事 前 定 義 」 (ページ 4-129)• 「__pld」 (ページ 4-95)• 「__pli」• 『アセンブラガイ ド』 の 「PLD、 PLDW、 PLI」 (ページ 4-26)4.7.21 __pliこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパ イ ラ に よ って 生 成 さ れる 命令 ス ト リームに PLI な どの 命 令 プ リ フ ェ ッ チを 挿 入 し ます。 これによ り、 アドレ スか ら の 命 令 の ロー ド が 実 行 さ れる こ と を、 C または C++ プログラムからメ モ リ シ ス テムに 事 前 に 通 知 する こ と がで き ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-97ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能構 文void __pli(...)各 パ ラ メ ータには 以 下 の 意 味 があ り ます。... プ リ フ ェ ッ チする 命 令 のア ド レ ス を 指 定 する、 任 意 の 数 のポ イン タ ま たは 整 数 引 数 を 示 し ます。制 約 条 件ターゲッ ト アーキテクチャが 命 令 のプリ フェ ッチをサポート しない 場 合 、 この コ ンパイ ラ 組 み 込 み 関 数 は 無 効 です。関 連 項 目• 「__pld」 (ページ 4-95)• 「__pldw」 (ページ 4-96)• 『アセンブラガイ ド』 の 「PLD、 PLDW、 PLI」 (ページ 4-26)4.7.22 __promiseこ の 組 み 込 み 関 数 は、 式 の 結 果 がゼ ロ 以 外 にな る こ と を コ ンパイ ラ に 保 証 します。 そのため、 コンパイ ラはコード をベク ト ル 化 する と きに 強 力 な 最 適 化を 実 行 できます。構 文void __promise(expr)expr は、 ゼ ロ 以 外 を 求 め る 式 です。関 連 項 目• 『コンパイ ラユーザガイ ド』 の 「__promise を 使 用 したベク ト ル 化 の 向上 」 (ページ 3-18)4.7.23 __qaddこ のコ ンパ イ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパイ ラ に よ って 生 成 さ れる 命令 ス ト リームに QADD 命 令 、 ま たは 等 価 コー ド シーケ ン ス を 挿 入 し ます。 コンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 C または C++ コード 内 に 含 まれる 2 つの整 数 のサチュレー ト 加 算 を 取 得 できます。4-98 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能構 文int __qadd(int val1, int val2)各 パラ メ ータには 以 下 の 意 味 があ り ます。val1 サチュ レー ト 加 算 演 算 の 最 初 の 加 数 を 指 定 し ます。val2 サチュ レー ト 加 算 演 算 の 2 番 目 の 加 数 を 指 定 し ます。戻 り 値__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) が 返 されます。関 連 項 目• 「__qadd」 (ページ 4-98)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-99ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能戻 り 値__rbit コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 ビ ッ ト 順 序 を 反 転 する こ と により val か ら 取 得 し た 値 が 返 さ れます。関 連 項 目• 『アセンブラガイ ド』 の 「REV、 REV16、 REVSH、 RBIT」 (ページ 4-72)4.7.27 __revこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパ イ ラ に よ って 生 成 さ れる 命令 ス ト リームに REV 命 令 、 ま たは 等 価 コー ド シーケン ス を 挿 入 し ます。 このコンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 C または C++ のコード 内 で、 32 ビットのビッグエンディアンデータ 値 を リ トルエンディアンデータ 値 に、 または 32ビッ トのリ トルエンディアンデータ 値 をビッグエンディアンデータ 値 に 変 換できます。注コ ンパイ ラ は、 式 を 認 識 する と 自 動 的 に REV を 導 入 し ます。構 文unsigned int __rev(unsigned int val)各 パラ メ ータには 以 下 の 意 味 があ り ます。valunsigned int を 指 定 し ます。戻 り 値__rev コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 バイ ト 順 序 を 反 転 する こ と に より val から 取 得 した 値 が 返 されます。関 連 項 目• 『アセンブラガイ ド』 の 「REV、 REV16、 REVSH、 RBIT」 (ページ 4-72)4.7.28 __return_addressこ の コ ンパイ ラ 組 み 込 み 関 数 は、 現 在 の 関 数 の 復 帰 ア ド レ ス を 返 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-101ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能構 文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)• 「__current_pc」 (ページ 4-83)• 「__current_sp」 (ページ 4-84)• 『コンパイ ラユーザガイ ド』 の 「sp、 lr、 または pc にアクセスする 従 来のインラインアセンブラ」 (ページ 7-30)4-102 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.7.29 __rorこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパ イ ラ に よ って 生 成 さ れる 命令 ス ト リームに ROR 命 令 ま たはオペラ ン ド 回 転 を 挿 入 し ます。 コンパイラ 組 み込 み 関 数 を 使 用 する と 、 C または C++ コー ド 内 に 含 まれる 指 定 さ れた 桁 数 分だけ 値 を 右 に 回 転 でき ます。注コ ンパイ ラ は、 式 を 認 識 する と 自 動 的 に ROR を 導 入 し ます。構 文unsigned int __ror(unsigned int val, unsigned int shift)各 パラ メ ータには 以 下 の 意 味 があ り ます。val シフ ト される 値 を 指 定 します。shift 1 ~ 31 の 範 囲 の 定 数 シ フ ト を 指 定 し ます。戻 り 値__ror コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 shift 桁 数 分 右 に 回 転 し た val の値 が 返 されます。関 連 項 目• 『アセンブラガイ ド』 の 「ASR、 LSL、 LSR、 ROR、 RRX」 (ページ 4-73)4.7.30 __schedule_barrierこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 シーケン ス ポ イ ン ト が 作 成 さ れます。 シーケン スポ イ ン ト の 前 後 にあ る 演 算 は 結 合 されません。 スケジューリングのバリアにより、 メモリは 更 新 されません。 変 数 がレ ジ ス タ で 保 持 されている 場 合 、 変 数 は 直 接 更 新 さ れ、 書 き 出 さ れません。こ の コ ンパイ ラ 組 み 込 み 関 数 は、 NOP 命 令 が 生 成 されない 点 を 除 き、__nop コンパ イ ラ 組 み 込 み 関 数 と 似 ています。構 文void schedule_barrier(void)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-103ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 「__nop」 (ページ 4-95)4.7.31 __semihostこ のコ ンパ イ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパイ ラ に よ って 生 成 さ れる 命令 ス ト リームに SVC または BKPT 命 令 を 挿 入 します。 こ のコ ンパ イ ラ 組 み 込 み 関数 を 使 用 する と、 ターゲッ ト アーキテクチャ とは 関 係 のないセ ミ ホステ ィ ング 呼 び 出 し を C または C++ から 行 う こ とができます。構 文int __semihost(int val, const void *ptr)各 パ ラ メ ータには 以 下 の 意 味 があ り ます。valptrセミホスティング 要 求 の 要 求 コードを 指 定 します。詳 細 については、 『デベロ ッ パガ イ ド 』 の 「 第 8 章 セミホスティング」 を 参 照 して 下 さい。引 数 / 結 果 ブ ロ ッ ク へのポ イ ン タ を 指 定 し ます。詳 細 については、 『デベロ ッ パガ イ ド 』 の 「 第 8 章 セミホスティング」 を 参 照 して 下 さい。戻 り 値セミホスティング 呼 び 出 しの 結 果 については、『デベロ ッ パガ イ ド 』 の「 第 8 章 セミホスティング」 を 参 照 して 下 さい。使 用 法C または C++ か ら の コ ンパイル 組 み 込 み 関 数 を 使 用 し て、 ターゲ ッ ト および命 令 セ ッ ト に 適 し たセ ミ ホ ス テ ィ ング 呼 び 出 し を 生 成 し ます。SVC 0x123456SVC 0xABBKPT 0xABすべてのアーキテ ク チャ の <strong>ARM</strong> 状 態 時<strong>ARM</strong>v7-M を 除 く Thumb 状 態 時 。 こ の 動 作 は、 <strong>ARM</strong> または 各 社 のすべてのデバッグターゲッ ト で 保 証 されている とは 限 り ません。<strong>ARM</strong>v7-M 用 、 Thumb-2 のみ4-104 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能制 約 条 件<strong>ARM</strong>v7 よ り 前 の <strong>ARM</strong> プロセッサでは、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 r1,|L1.12|MOVS r0,#1SVC #0xab...|L1.12|...buffer% 400関 連 項 目• 「--cpu=list」 (ページ 2-34)• 「--thumb」 (ページ 2-136)• 「__svc」 (ページ 4-18)• 『アセンブラガイ ド』 の 「BKPT」 (ページ 4-141)• 『アセンブラガイ ド』 の 「SVC」 (ページ 4-142)• 『デベロ ッ パガ イ ド 』 の 第 8 章 セミホスティング4.7.32 __sevこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパ イ ラ に よ って 生 成 さ れる 命令 ス ト リームに SEV 命 令 を 挿 入 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-105ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能構 文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 コプロセッサを 装 備 した <strong>ARM</strong> アーキテクチャベースのプロセッサ 上 のシングル、インラ イン、 マシン 命 令 へのコンパイルが 保 証 されていますが、 これは 異 なります。構 文double __sqrt(double val)各 パ ラ メ ータには 以 下 の 意 味 があ り ます。val倍 精 度 浮 動 小 数 点 値 を 指 定 し ます。4-106 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能戻 り 値__sqrt コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 double として val の 平 方 根 が 返されます。エラーVFP コ プ ロ セ ッ サを 装 備 し ていない ターゲ ッ ト 向 けに コ ンパ イ ル さ れる 場 合 、コンパイラは __sqrt コ ンパイ ラ 組 み 込 み 関 数 を 認 識 し ません。 この 場 合 、 コンパイ ラ に よ って 警 告 ま たはエ ラーが 生 成 さ れます。関 連 項 目• 「__sqrtf」• 『アセンブラガイ ド』 の 「VABS、 VNEG、 VSQRT」 (ページ 5-112)4.7.34 __sqrtfこ の コ ンパイ ラ 組 み 込 み 関 数 は、 __sqrtf 組 み 込 み 関 数 の 単 精 度 バージ ョ ンです。 機 能 的 には、 以 下 の 点 を 除 いて __sqrt と 同 じです。• この 関 数 は、double 型 の 引 数 の 代 わ り に、 float 型 の 引 数 を 取 り ます。• double 値 の 代 わ り に、 float 値 を 返 し ます。関 連 項 目• 「__sqrt」 (ページ 4-106)• 『アセンブラガイ ド』 の 「VABS、 VNEG、 VSQRT」 (ページ 5-112)4.7.35 __ssatこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパ イ ラ に よ って 生 成 さ れる 命令 ス ト リームに SSAT 命 令 を 挿 入 し ます。 コ ンパイ ラ 組 み 込 み 関 数 を 使 用 すると、 C または C++ コード 内 からの 符 号 つきの 値 をサチュレートできます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-107ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能構 文int __ssat(int val, unsigned int sat)各 パ ラ メ ータには 以 下 の 意 味 があ り ます。valsatサチュ レー ト される 値 を 指 定 し ます。サチュレー ト させるビ ッ ト 位 置 を 指 定 します。sat は 1 ~ 32 の 範 囲 で 指 定 する 必 要 があ り ます。戻 り 値__ssat コ ンパ イ ラ 組 み 込 み 関 数 を 使 用 する と 、 符 号 つき 範 囲 –2 sat–1 ? x ? 2 sat–1–1 にサチュ レー ト された val が 返 されます。エラーSSAT 命 令 をサポー ト し ない ターゲ ッ ト 向 けに コ ンパイル さ れる 場 合 、 コ ンパイラは __ssat コ ンパイ ラ 組 み 込 み 関 数 を 認 識 し ません。 こ の 場 合 、 コ ンパイラによって 警 告 またはエラーが 生 成 されます。関 連 項 目• 「__usat」 (ページ 4-114)• 『アセンブラガイ ド』 の 「SSAT、 USAT」 (ページ 4-103)4.7.36 __strexこ のコ ンパ イ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパイ ラ に よ って 生 成 さ れる 命令 ス ト リームに STREX[size] 形 式 の 命 令 を 挿 入 し ます。 C または C++ コードのSTREX 命 令 を 使 用 し て、 データ を メ モ リ にス ト アで き ます。構 文int __strex(unsigned int val, volatile void *ptr)各 パ ラ メ ータには 以 下 の 意 味 があ り ます。valメ モ リ に 書 き 込 む 値 を 指 定 し ます。4-108 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能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 を 使 用 してこのコード をコンパイルすると 、 以 下 の コー ド が 生 成 さ れます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-109ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能||foo|| PROCMOVMOVSTREXBRSBSMOVCCBXENDPr0,#0xffr2,#0x20r1,r2,[r0]r0,r1,#1r0,#0lr関 連 項 目• 「__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)各 パ ラ メ ータには 以 下 の 意 味 があ り ます。valptrメ モ リ に 書 き 込 む 値 を 指 定 し ます。メ モ リ に 書 き 込 まれるデータ のア ド レ ス を 指 し ます。 書 き 込 まれるデータ のサ イ ズを 指 定 する には、 パ ラ メ ータ を 適 切 な 整 数 型にキャス ト します。表 4-12 __strexd コ ンパイ ラ 組 み 込 み 関 数 によ っ てサポー ト されるア ク セス 幅命 令ストアされたデータのサイズC のキャ ス トSTREXD 符 号 な し long long (unsigned long long *)STREXD 符 号 付 き long long (signed long long *)4-110 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能戻 り 値__strexd コ ンパイ ラ 組 み 込 み 関 数 は、 以 下 を 返 し ます。0 STREXD 命 令 が 正 し く 実 行 さ れた 場 合1 STREXD 命 令 が ロ ッ ク ア ウ ト さ れた 場 合エラーSTREXD 命 令 をサポー ト し ない ターゲ ッ ト 向 けにコ ンパ イル さ れる 場 合 、 コ ンパイラは __strexd コ ンパ イ ラ 組 み 込 み 関 数 を 認 識 し ません。 この 場 合 、 コンパイラによって 警 告 またはエラーが 生 成 されます。__strexd コ ンパイ ラ 組 み 込 み 関 数 は、 ダブルワー ド データへのア ク セスのみをサポート します。 サポー ト さ れないア ク セス 幅 を 指 定 する と 、 コ ンパイ ラによってエラーが 生 成 されます。関 連 項 目• 「__ldrex」 (ページ 4-89)• 「__ldrexd」 (ページ 4-91)• 「__strex」 (ページ 4-108)• 『アセンブラガイ ド』 の 「LDREX と STREX」 (ページ 4-40)4.7.38 __strtこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパ イ ラ に よ って 生 成 さ れる 命令 ス ト リームに STR{size}T 形 式 のアセンブ リ 言 語 命 令 を 挿 入 し ます。 STRT 命 令を 使 用 して、 データを C または C++ コードのメモリにス ト アできます。構 文void __strt(unsigned int val, volatile void *ptr)各 パラ メ ータには 以 下 の 意 味 があ り ます。valメ モ リ に 書 き 込 む 値 を 指 定 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-111ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能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|| PROCMOVMOVSTRBTBXENDPr0,#0xffr1,#0x20r1,[r0],#0lr4-112 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 「--thumb」 (ページ 2-136)• 『アセンブラガイ ド』 の 「LDR と STR (ユーザモード)」 (ページ 4-18)4.7.39 __swpこ の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパ イ ラ に よ って 生 成 さ れる 命令 ス ト リームに SWP{size} 命 令 を 挿 入 し ます。 コ ンパイ ラ 組 み 込 み 関 数 を 使 用する と、 C または C++ コード 内 からのデータを メモリ 位 置 間 でスワ ップできます。注<strong>ARM</strong>v6 以 降 では、 SWP および SWPB の 使 用 はお 勧 めでき ません。構 文unsigned int __swp(unsigned int val, volatile void *ptr)各 パラ メ ータには 以 下 の 意 味 があ り ます。valptrメモリに 書 き 込 まれるデータ 値 を 指 定 します。メ モ リ に 書 き 込 まれるデータ のア ド レ ス を 指 し ます。 書 き 込 まれるデータ のサ イ ズを 指 定 するには、 パ ラ メ ータ を 適 切 な 整 数 型にキャス ト します。表 4-14 __swp コ ンパイ ラ 組 み 込 み 関 数 によ っ てサポー ト されるア ク セス 幅命 令ロード されたデータのサイズC のキャス トSWPB 符 号 な しバイ ト (char *)SWP ワード (int *)戻 り 値__swp コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 val に よ っ て 上 書 き さ れる 前 に、ptr によって 示 されたメモリ アドレスにあるデータ 値 が 返 されます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-113ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能例int foo(void){int loc=0xff;return(__swp(0x20, (volatile int *)loc));}このコードをコンパイルすると、 以 下 が 生 成 されます。||foo|| PROCMOV r1, #0xffMOV r0, #0x20SWP r0, r0, [r1]BX lrENDP関 連 項 目• 『アセンブラガイ ド』 の 「SWP と SWPB」 (ページ 4-44)4.7.40 __usatこ のコ ンパ イ ラ 組 み 込 み 関 数 を 使 用 し て、 コ ンパイ ラ に よ って 生 成 さ れる 命令 ス ト リームに USAT 命 令 を 挿 入 します。 コ ンパ イ ラ 組 み 込 み 関 数 を 使 用 すると、 C または C++ コード 内 からの 符 号 なしの 値 をサチュレート できます。構 文int __usat(unsigned int val, unsigned int sat)各 パ ラ メ ータには 以 下 の 意 味 があ り ます。valsatサチュ レー ト される 値 を 指 定 し ます。サチュレー ト させるビ ッ ト 位 置 を 指 定 します。usat は 0 ~ 31 の 範 囲 で 指 定 する 必 要 があ り ます。戻 り 値__usat コ ンパ イ ラ 組 み 込 み 関 数 を 使 用 する と 、 符 号 な し 範 囲 0 ? x ? 2 sat–1 –1 にサチュ レー ト された val が 返 されます。4-114 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能エラーUSAT 命 令 をサポー ト し ない ターゲ ッ ト 向 けにコ ンパ イル さ れる 場 合 、 コ ンパイラは __usat コ ンパイ ラ 組 み 込 み 関 数 を 認 識 し ません。 この 場 合 、 コンパイラによって 警 告 またはエラーが 生 成 されます。関 連 項 目• 「__ssat」 (ページ 4-107)• 『アセンブラガイ ド』 の 「SSAT、 USAT」 (ページ 4-103)4.7.41 __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 命 令 と し て 実 行 さ れます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-115ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能構 文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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.7.44 <strong>ARM</strong>v6 SIMD コ ンパイ ラ 組 み 込 み 関 数<strong>ARM</strong> アーキテクチャ v6 命 令 セ ッ ト アーキテ ク チャは、 高 パフ ォーマン ス メデ ィ アアプ リ ケーシ ョ ンの ソ フ ト ウ ェ ア 実 装 効 率 化 のため、 60 以 上 の SIMD命 令 を <strong>ARM</strong>v6 に 追 加 し ます。<strong>ARM</strong> コンパイラは、 <strong>ARM</strong>v6 SIMD 命 令 に 対 応 する コ ンパイ ラ の 組 み 込 み 関数 をサポー ト し ます。 これら のコ ンパ イ ラ 組 み 込 み 関 数 は、 <strong>ARM</strong>v6 アーキテクチャまたはプロセッサ 用 にコードをコンパイルする 場 合 に 使 用 できます。以 下 の リ ス ト には、 こ れら のコ ンパ イ ラ 組 み 込 み 関 数 のプ ロ ト タ イ プを 示 します。 こ の リ ス ト の 関 数 プ ロ ト タ イ プは、 コ ンパ イ ラ 組 み 込 み 関 数 に よ っ て実 行 さ れた <strong>ARM</strong>v6 命 令 のプ リ ミ テ ィ ブま たは 基 本 形 式 について 説 明 し ます。コ ンパイ ラ 組 み 込 み 関 数 に よ って 実 行 さ れた 基 本 的 な 命 令 の 名 前 を 取 得 するには、 コ ンパイ ラ 組 み 込 み 関 数 名 か ら 先 頭 のアンダース コ ア を 削 除 し ます(__)。 例 えば、 __qadd16 コ ンパイ ラ 組 み 込 み 関 数 は、 <strong>ARM</strong>v6 QADD16 命 令 に 対 応します。注各 <strong>ARM</strong>v6 SIMD コ ンパイ ラ 組 み 込 み 関 数 は、 <strong>ARM</strong> v6 アーキテクチャ またはプロセッサのシングル、 インライン、 マシン 命 令 へのコンパイルが 保 証 されています。 ただ し 機 会 があれば、 コ ンパ イ ラ は、 ベース と な る 命 令 の 最 適 化さ れた 形 式 を 使 用 する 可 能 性 があ り ます。<strong>ARM</strong>v6 SIMD 命 令 は、 Application Program Status Register (APSR) の GE[3:0]ビッ トを 設 定 できます。 SIMD 命 令 は、 こ れら のフ ラ グ を 更 新 し て、 SIMD 演算 の 各 8/16 ビットスライスに 対 し " 等 しいかよ り 大 きい " ステータスを 示 します。<strong>ARM</strong> コンパイラは、GE[3:0] ビッ トをグローバル 変 数 として 処 理 します。 C または C++ プログラム 内 からこれらのビッ トにアクセスするには、 以 下 のいずれかを 実 行 し ます。• 名 前 付 き レ ジ ス タ 変 数 を 通 じ て APSR のビッ ト 16 ~ 19 にアクセスします。• __sel コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し て、 SEL 命 令 を 制 御 し ます。unsigned int __qadd16(unsigned int, unsigned int)unsigned int __qadd8(unsigned int, unsigned int)unsigned int __qasx(unsigned int, unsigned int)unsigned int __qsax(unsigned int, unsigned int)unsigned int __qsub16(unsigned int, unsigned int)unsigned int __qsub8(unsigned int, unsigned int)unsigned int __sadd16(unsigned int, unsigned int)unsigned int __sadd8(unsigned int, unsigned int)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-117ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能unsigned int __sasx(unsigned int, unsigned int)unsigned int __sel(unsigned int, unsigned int)unsigned int __shadd16(unsigned int, unsigned int)unsigned int __shadd8(unsigned int, unsigned int)unsigned int __shasx(unsigned int, unsigned int)unsigned int __shsax(unsigned int, unsigned int)unsigned int __shsub16(unsigned int, unsigned int)unsigned int __shsub8(unsigned int, unsigned int)unsigned int __smlad(unsigned int, unsigned int, unsigned int)unsigned long long __smlald(unsigned int, unsigned int, unsigned long long)unsigned int __smlsd(unsigned int, unsigned int, unsigned int)unsigned long long __smlsld(unsigned int, unsigned int, unsigned long long)unsigned int __smuad(unsigned int, unsigned int)unsigned int __smusd(unsigned int, unsigned int)unsigned int __ssat16(unsigned int, unsigned int)unsigned int __ssax(unsigned int, unsigned int)unsigned int __ssub16(unsigned int, unsigned int)unsigned int __ssub8(unsigned int, unsigned int)unsigned int __sxtab16(unsigned int, unsigned int)unsigned int __sxtb16(unsigned int, unsigned int)unsigned int __uadd16(unsigned int, unsigned int)unsigned int __uadd8(unsigned int, unsigned int)unsigned int __uasx(unsigned int, unsigned int)unsigned int __uhadd16(unsigned int, unsigned int)unsigned int __uhadd8(unsigned int, unsigned int)unsigned int __uhasx(unsigned int, unsigned int)unsigned int __uhsax(unsigned int, unsigned int)unsigned int __uhsub16(unsigned int, unsigned int)unsigned int __uhsub8(unsigned int, unsigned int)unsigned int __uqadd16(unsigned int, unsigned int)unsigned int __uqadd8(unsigned int, unsigned int)unsigned int __uqasx(unsigned int, unsigned int)unsigned int __uqsax(unsigned int, unsigned int)unsigned int __uqsub16(unsigned int, unsigned int)unsigned int __uqsub8(unsigned int, unsigned int)unsigned int __usad8(unsigned int, unsigned int)unsigned int __usada8(unsigned int, unsigned int, unsigned int)unsigned int __usax(unsigned int, unsigned int)unsigned int __usat16(unsigned int, unsigned int)unsigned int __usub16(unsigned int, unsigned int)unsigned int __usub8(unsigned int, unsigned int)unsigned int __uxtab16(unsigned int, unsigned int)unsigned int __uxtb16(unsigned int, unsigned int)4-118 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能関 連 項 目• 「 名 前 付 き レ ジ ス タ 変 数 」 (ページ 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 usingconjugate-structure algebraic-code-excited linear prediction (CS-ACELP)』 で 説 明 されている 元 の ETSI フ ァ ミ リ の 基 本 操 作 をサポー ト し ています。ユーザコード 内 で ETSI の 基 本 操 作 を 使 用 する には、 dspfns.h 標 準 ヘ ッ ダフ ァイルをインクルード します。 dspfns.h に 提 供 さ れてい る コ ンパ イ ラ 組 み 込 み 関数 は、 表 4-15 にリストされています。表 4-15 RVCT でサポー ト される ETSI の 基 本 操 作コ ンパイ ラ 組 み 込 み 関 数abs_s L_add_c L_mult L_sub_c norm_ladd L_deposit_h L_negate mac_r rounddiv_s L_deposit_l L_sat msu_r saturateextract_h L_mac L_shl mult shlextract_l L_macNs L_shr mult_r shrL_abs L_msu L_shr_r negate shr_rL_add L_msuNs L_sub norm_s sub<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-119ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能ヘッダファイル dspfns.h も、 C または C++ プログラムで 使 用 するためのグローバル 変 数 と し て、 特 定 のス テータ ス フ ラ グ を 公 開 し ます。 dspfns.h によって 公 開 されたステータ スフ ラ グは、 表 4-16 にリストされています。表 4-16 RVCT で 公 開 された ETSI ステータスフラグステータスフラグOverflowCarry説 明オーバーフ ローステータ ス フ ラ グ通 常 、 サチュ レー ト 関 数 には、 オーバーフ ローについて 固 定作 用 があ り ます。キャ リーステータスフラグ例#include #include #include // include ETSI basic operationsint32_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, r1bx lr}int32_t foo(int32_t a, int32_t b){int32_t c, d, e, f;Overflow = 0;// set global overflow flagc = C_L_add(a, b); // C saturating addd = asm_L_add(a, b); // assembly language saturating adde = __qadd(a, b); // <strong>ARM</strong> intrinsic saturating addf = L_add(a, b); // ETSI saturating addreturn Overflow ? -1 : c == d == e == f; // returns 1, unless overflow}4-120 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能関 連 項 目• C コー ド およびコ ンパイ ラ 組 み 込 み 関 数 の 組 み 合 わせ と し ての ETSI 基本 操 作 の 定 義 のためのヘッ ダフ ァ イル dspfns.h• 『コンパイ ラユーザガイ ド』 の 「ETSI の 基 本 操 作 」 (ページ 4-7)• ETSI G.191 勧 告 : 『Software tools for speech and audio codingstandardization』• 『ITU-T Software Tool Library 2005 User's manual』。 ETSI G.191 勧 告 の 一 部として 含 まれています。• ETSI G723.1 勧 告 : 『Dual rate speech coder for multimedia communicationstransmitting at 5.3 and 6.3 kbit/s』• ETSI G.729 勧 告 : 『Coding of speech at 8 kbit/s using conjugate-structurealgebraic-code-excited linear prediction (CS-ACELP)』4.7.46 C55x コ ンパイ ラ 組 み 込 み 関 数<strong>ARM</strong> コンパイラは、 選 択 した TI C55x コ ンパ イ ラ 組 み 込 み 関 数 のエ ミ ュ レーションをサポートします。ユーザコード 内 で TI C55x コ ンパ イ ラ 組 み 込 み 関 数 を 使 用 する には、 標 準 のヘッダファイル c55x.h をインクルードします。 c55x.h に 提 供 されている コ ンパイ ラ 組 み 込 み 関 数 は、 表 4-17 にリストされています。表 4-17 RVCT でサポー ト されている TI C55x コ ンパイ ラ 組 み 込 み 関 数コ ンパイ ラ 組 み 込 み 関 数_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<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-121ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能例#include #include #include // include TI C55x intrinsics__asm int32_t asm_lsadd(int32_t a, int32_t b){qadd r0, r0, r1bx lr}int32_t foo(int32_t a, int32_t b){int32_t c, d, e;c = asm_lsadd(a, b); // assembly language saturating addd = __qadd(a, b); // <strong>ARM</strong> intrinsic saturating adde = _lsadd(a, b); // TI C55x saturating addreturn c == d == e; // returns 1}関 連 項 目• C55x コ ンパイ ラ 組 み 込 み 関 数 の <strong>ARM</strong> 実 装 の 詳 細 についてのヘ ッ ダ フ ァイル c55x.h• TI の コ ンパイ ラ 組 み 込 み 機 能 に 関 する 出 版 物 は、 Texas Instruments 社 のWeb サイ ト http://www.ti.com か ら 入 手 で き ます。4.7.47 名 前 付 き レジス タ 変 数コ ンパ イ ラ を 使 用 する と 、 名 前 付 き レ ジ ス タ 変 数 を 使 用 し て、 <strong>ARM</strong> アーキテクチャベースのプロセッサのレジスタにアクセスできます。 名 前 付 き レ ジ スタ 変 数 は、 サポート されています。• フ ァ イルの 有 効 範 囲 内• 関 数 パ ラ メ ータ 上 ではな く ローカルの 有 効 範 囲 内 です。構 文register type var-name __asm(reg);各 パ ラ メ ータには 以 下 の 意 味 があ り ます。type名 前 付 き レ ジ ス タ 変 数 の 型 を 指 定 し ます。レジス タに 名 前 を 付 け る 際 、 同 サイ ズであればいずれの 型 で も、名 前 付 き レ ジ ス タ 変 数 の 宣 言 に 使 用 で き ます。 型 は 構 造 体 で も 可能 ですが、 ビ ッ ト フ ィ ール ド のレ イ ア ウ ト はエンデ ィ アン 方 式に 関 連 し ます。4-122 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能var-namereg名 前 付 き レ ジ ス タ 変 数 の 名 前 を 指 定 し ます。<strong>ARM</strong> アーキテクチャベースのプロセッサ 上 のレジス タ 名 を 示 す文 字 列 を 指 定 し ます。表 4-18 に、 <strong>ARM</strong> アーキテクチャベースのプロセッサの 名 前 付 きレ ジ ス タ 変 数 と 一 緒 に 使 用 で き る レ ジ ス タ を 示 し ます。表 4-18 <strong>ARM</strong> アーキテ ク チ ャベースのプ ロセ ッ サで 使 用 可 能 な 名 前 付 き レ ジス タレジスタ __asm の 文 字 列 プロセッサCPSR "cpsr" または "apsr" すべてのプ ロ セ ッ サBASEPRI "basepri" Cortex-M3BASEPRI_MAX "basepri_max" Cortex-M3CONTROL "control" Cortex-M1、 Cortex-M3EAPSR "eapsr" Cortex-M1、 Cortex-M3EPSR "epsr" Cortex-M1、 Cortex-M3FAULTMASK "faultmask" Cortex-M3IAPSR "iapsr" Cortex-M1、 Cortex-M3IEPSR "iepsr" Cortex-M1、 Cortex-M3IPSR "ipsr" Cortex-M1、 Cortex-M3MSP "msp" Cortex-M1、 Cortex-M3PRIMASK "primask" Cortex-M1、 Cortex-M3PSP "psp" Cortex-M1、 Cortex-M3r0 ~ 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<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-123ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能VFP を 持 つターゲッ ト では、 表 4-19 のレジスタも 名 前 付 きレジス タ 変 数 と 一 緒 に 使 用 で き ます。表 4-19 VFP を 持 つ タ ーゲ ッ ト で 使 用 可 能 な 名 前 付 き レジス タレジスタ__asm の 文 字 列FPSID "fpsid"FPSCR "fpscr"FPEXC "fpexc"例void foo(void){register int foo __asm("r0");}この 例 では、foo は、 レジ ス タ r0 の 名 前 付 き レ ジ ス タ 変 数 と し て 宣 言 さ れます。関 連 項 目• 『コンパイ ラユーザガイ ド』 の 「 名 前 付 き レ ジ ス タ 変 数 」 (ページ 4-11)4-124 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.8 VFP ステー タ ス 組 み 込 み 関 数コンパイラには、 浮 動 小 数 点 ス テータ ス / 制 御 レ ジ ス タ (FPSCR) を 読 み 出 すための 組 み 込 み 関 数 が 用 意 さ れています。注こ のレ ジ ス タ を 読 み 出 す 代 わ り の 方 法 と し て、 名 前 付 き レ ジ ス タ 変 数 を 使 用するこ とをお 勧 めします。 こ うすることにより、レジスタに 効 率 的 にアクセスできるようになります。 詳 細 については、 「 名 前 付 き レ ジ ス タ 変 数 」 (ページ 4-122) を 参 照 して 下 さい。4.8.1 __vfp_statusこ の 組 み 込 み 関 数 は FPSCR を 読 み 出 し ます。構 文unsigned int __vfp_status(unsigned int mask, unsigned int flags);エラーVFP のない ターゲ ッ ト を コ ンパイルする と き に、 こ の 組 み 込 み 関 数 を 使 用 しようとすると、エラーが 生 成 されます。関 連 項 目• 『<strong>ARM</strong> アーキテ クチャ リ フ ァ レンスマニュアル』 の FPSCR レジスタに 関する 説 明<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-125ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能__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(),<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-127ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能__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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能4.10 コ ンパイ ラによ る 事 前 定 義この 項 では、 <strong>ARM</strong> コ ンパイ ラ の 定 義 済 みのマ ク ロ の 値 について 説 明 し ます。4.10.1 定 義 済 みマ ク ロ表 4-20 は、 C および C++ 向 けに <strong>ARM</strong> コ ンパ イ ラ で 定 義 済 みのマ ク ロ の 名 前を 示 しています。 値 フ ィールドに 記 載 がない 場 合 は、 シンボルが 定 義 されているだけです。名 前 値 定 義 されるケース表 4-20 定 義 済 みマ ク ロ__arm__ – --thumb オプシ ョ ンが 指 定 される 場 合 でも、 <strong>ARM</strong> コンパイラでは 常 に 定 義 されます。「__<strong>ARM</strong>CC_VERSION」 も 参 照 して 下 さい。__<strong>ARM</strong>CC_VERSION ver 常 に 定 義 さ れます。 10 進 数 値 で、 リ リ ース ご と に 増 加 し ます。値 には PVbbbb 形 式 が 使 用 さ れます。• P はメジャーバージョンを 示 します。• V はマイナーバージ ョ ンを 示 し ます。• bbbb はビルド 番 号 を 示 します。注このマクロは、バージョン 番 号 を 使 用 して、__arm__ を 定 義 するRVCT と 他 のツールを 区 別 する のに 使 用 で き ます。__APCS_INTERWORK – --apcs /interwork オプシ ョ ン を 指 定 し てい る 場 合 、 ま たは CPUアーキテクチャ を <strong>ARM</strong>v5T 以 降 に 設 定 し ている 場 合__APCS_ROPI – --apcs /ropi オプシ ョ ン を 指 定 し てい る 場 合__APCS_RWPI – --apcs /rwpi オプシ ョ ン を 指 定 し てい る 場 合__APCS_FPIC – --apcs /fpic オプシ ョ ン を 指 定 し てい る 場 合__ARRAY_OPERATORS – C++ コンパイラモードで、 array new と delete がイネーブルな 場合__BASE_FILE__ name 常 に 定 義 さ れます。 現 在 の ソ ース フ ァ イルではな く 元 の ソ ースファイルを 示 すこと (つまり、 現 在 のファイルがインクルードさ れる フ ァ イルの 場 合 ) 以 外 は、 __FILE__ と 同 じです。__BIG_ENDIAN – ビッグエンディアンターゲッ ト 向 けにコンパイルしている 場 合<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-129ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能表 4-20 定 義 済 みマ ク ロ (continued)名 前 値 定 義 されるケース_BOOL – C++ コンパイラモードで、bool がキーワードである こ と を 指 定する 場 合__cplusplus – C++ コンパイラモードの 場 合__CC_<strong>ARM</strong> 1 --thumb オプシ ョ ンが 指 定 される 場 合 でも、 <strong>ARM</strong> コンパイラでは 常 に 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 または <strong>RealView</strong>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 – --fpmode=ieee_full オプシ ョ ン を 指 定 し てい る 場 合4-130 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能表 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 がイネーブルな 場 合<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-131ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能表 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__ – コ ンパイルで、 ソ フ ト ウ ェ ア 浮 動 小 数 点 コール 標 準 およびラ イブ ラ リ を 使 用 する 場 合 。 <strong>ARM</strong> または Thumb で --fpu=softvfp オプシ ョ ン を 指 定 する 場 合 、 ま たは Thumb で --fpu=softvfp+vfpv2オプシ ョ ン を 指 定 する 場 合 に 設 定 さ れます。__STDC__ – すべてのコ ンパイ ラ モー ド の 場 合__STDC_VERSION__ – 標 準 バージ ョ ン 情 報__STRICT_ANSI__ – --strict オプシ ョ ン を 指 定 し てい る 場 合__SUPPORT_SNAN__ – --fpmode=ieee_fixed または --fpmode=ieee_full を 指 定 する 場 合 のシグナル NaN のサポー ト 。__TARGET_ARCH_<strong>ARM</strong> num ターゲッ ト CPU の <strong>ARM</strong> ベース アーキテ ク チャの 番 号 (コ ンパイラで <strong>ARM</strong> と Thumb のどちらに 向 けてコンパイルしているかは 無 関 係 です)。 各 <strong>ARM</strong> アーキテクチャバージ ョ ンで__TARGET_ARCH_<strong>ARM</strong> に 指 定 でき る 値 については、 表 4-21 (ページ4-136) を 参 照 して 下 さい。__TARGET_ARCH_THUMB num ターゲッ ト CPU の Thumb ベース アーキテ ク チ ャ の 番 号 (コ ンパイラで <strong>ARM</strong> と Thumb のどちらに 向 けてコンパイルしているかは 無 関 係 です)。 ターゲッ トが Thumb をサポート していない場 合 は、 値 に 0 が 設 定 されます。 各 <strong>ARM</strong> アーキテクチャバージョンで __TARGET_ARCH_THUMB に 指 定 でき る 値 については、表 4-21 (ページ 4-136) を 参 照 して 下 さい。__TARGET_ARCH_XX – XX はターゲッ ト アーキテクチャを 表 し、 その 値 はターゲッ トアーキテクチャによ って 異 な り ます。 例 えば、 コ ンパイ ラ オプション --cpu=4T または --cpu=<strong>ARM</strong>7TDMI を 指 定 する と 、__TARGET_ARCH_4T が 定 義 されます。4-132 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能表 4-20 定 義 済 みマ ク ロ (continued)名 前 値 定 義 されるケース__TARGET_CPU_XX – XX はターゲッ ト CPU を 表 し ます。 XX の 値 は --cpu コンパイラオプシ ョ ンか ら 導 き 出 さ れる か、 何 も 指 定 し ていない 場 合 はデフ ォル ト 値 が 使 用 さ れます。 例 えば、 コンパイ ラオプシ ョ ン--cpu=<strong>ARM</strong>7TM が 指 定 されていれば __TARGET_CPU_<strong>ARM</strong>7TM が 定 義 され、 __TARGET_CPU_ で 始 ま るその 他 のシンボルは 定 義 されません。ターゲッ ト アーキテクチャが 指 定 されていれば__TARGET_CPU_generic が 定 義 されます。プロセッサ 名 にハイフン (- ) 文 字 が 含 まれる 場 合 、 こ れら の文 字 はアンダース コ ア (_) に 対 応 し ます。 例 えば、--cpu=<strong>ARM</strong>1136JF-S は __TARGET_CPU_<strong>ARM</strong>1136JF_S となります。__TARGET_FEATURE_DOUBLEWORD – <strong>ARM</strong>v5T 以 上 のバージ ョ ン__TARGET_FEATURE_DSPMUL – <strong>ARM</strong>v5TE などの DSP 拡 張 乗 算 器 が 使 用 可 能 な 場 合__TARGET_FEATURE_MULTIPLY – ターゲッ ト アーキテクチャで、 long 乗 算 命 令 MULL および MULALがサポー ト されている 場 合__TARGET_FEATURE_DIVIDE – ターゲ ッ ト アーキテ ク チャ でハー ド ウ ェ ア 除 算 命 令 (つま り 、<strong>ARM</strong>v7-M または <strong>ARM</strong>v7-R) がサポート されている 場 合__TARGET_FEATURE_MULTIPROCESSING – 以 下 のいずれかのオプシ ョ ン を 指 定 する 場 合• --cpu=Cortex-A9• --cpu=Cortex-A9.no_neon• --cpu=Cortex-A9.no_neon.no_vfp__TARGET_FEATURE_THUMB – ターゲッ ト アーキテクチャで Thumb がサポー ト されている 場合 (<strong>ARM</strong>v4T 以 降 )<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-133ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能表 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__TARGET_PROFILE_R__TARGET_PROFILE_M--cpu=7-A オプシ ョ ン を 指 定 する 場 合--cpu=7-R オプシ ョ ン を 指 定 する 場 合以 下 のいずれかのオプシ ョ ン を 指 定 する 場 合• --cpu=6-M• --cpu=6S-M• --cpu=7-M4-134 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


コ ンパイ ラ 固 有 の 機 能表 4-20 定 義 済 みマ ク ロ (continued)名 前 値 定 義 されるケース__thumb__ – コンパイラが Thumb モー ド の 場 合 。 つま り、コマン ド ラ インで--thumb オプシ ョ ン を 指 定 し た 場 合 か、 ソース コー ド で #pragmathumb を 指 定 し た 場 合 。注• Thumb 向 けにコ ンパイルしている 場 合 でも、 コ ンパイ ラで 一 部 <strong>ARM</strong> コー ド が 生 成 さ れる こ と があ り ます。• #pragma thumb または #pragma arm を 使 用 し てい る 場 合 、__thumb および __thumb__ が 定 義 された り されなかった りし ます。 ただ し、 他 の 何 ら かの 理 由 ( 例 えば、 関 数 が__irq と し て 指 定 さ れる 場 合 ) で Thumb 関 数 が <strong>ARM</strong> コード と し て 生 成 さ れる 場 合 は 変 更 し ません。__TIME__ time 常 に 定 義 さ れます。__UINTMAX_TYPE__ – GNU モー ド の 場 合 。 uintmax_t typedef の 正 し い 潜 在 型 を 定 義 します。__USER_LABEL_PREFIX__GNU モー ド の 場 合 。 空 の 文 字 列 を 定 義 し ます。 このマクロはLinux の 一 部 のヘッ ダーフ ァ イルで 使 用 されます。__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 の 正 し い 潜 在 型 を 定 義 し ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-135ID 100419Non-Confidential,


コ ンパイ ラ 固 有 の 機 能表 4-21 は、 __TARGET_ARCH_THUMB に 指 定 でき る 値 ( 表 4-20 (ページ 4-129) を 参照 )、 および こ れ ら の 値 が <strong>ARM</strong> アーキテクチャの 各 バージ ョ ン と どのよ う に関 連 し てい る かを 示 し た も のです。表 4-21 Thumb アーキテクチャバージ ョ ンと <strong>ARM</strong> アーキテ ク チ ャバージ ョ ンの 関 連<strong>ARM</strong> アーキテクチャ__TARGET_ARCH_<strong>ARM</strong>__TARGET_ARCH_THUMBv4 4 0v4T 4 1v5T、 v5TE、v5TEJ5 2v6、 v6K、 v6Z 6 3v6T2 6 4v6-M、 v6S-M 0 3v7-A、 v7-R 7 4v7-M 0 44.10.2 関 数 名表 4-22 には、 C および C++ 向 けの <strong>ARM</strong> コンパイラによってサポート されてい る 組 み 込 み 変 数 が 記 載 さ れています。表 4-22 組 み 込 み 変 数名 前__FUNCTION____PRETTY_FUNCTION__値ソ ースで 使 用 さ れてい る 関 数 名 を 保 持 し ます。__FUNCTION__ は、 定 数 文 字 列 リ テ ラ ルです。 プリプロセッサを 使 用 してこれらの内 容 を 他 のテキ ス ト に 結 合 し、 新 し い ト ー ク ン を 形 成 する こ と はで き ません。言 語 固 有 の 形 式 で 出 力 さ れた 関 数 名 を 保 持 し ます。__PRETTY_FUNCTION__ は、 定 数 文 字 列 リ テ ラ ルです。 プリプロセッサを 使 用 してこ れら の 内 容 を 他 のテキ ス ト に 結 合 し、 新 し い ト ー ク ン を 形 成 する こ と はで きません。4-136 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


第 5 章C および C++ の 実 装 に 関 する 詳 細本 章 では、 <strong>ARM</strong> コ ンパ イ ラ 用 言 語 の 実 装 の 詳 細 について 説 明 し ます。 以 下 のセクションから 構 成 されています。• 「C および C++ の 実 装 に 関 する 詳 細 」 (ページ 5-2)• 「C++ の 実 装 に 関 する 詳 細 」 (ページ 5-15)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-1ID 100419Non-Confidential,


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 コ マン ド ラ イ ンオプシ ョ ン を 指 定 し て 別 の ロ ケールを 選 択 する必 要 があ り ます。 詳 細 については、 『コンパイ ラユーザガイ ド』 の「<strong>ARM</strong> コンパイラの 起 動 」 (ページ 2-3) を 参 照 して 下 さい。• <strong>ARM</strong> コンパイラでは、 Unicode などのマルチバイ ト 文 字 セッ トがサポートされます。• ソ ース 文 字 セ ッ ト のその 他 のプ ロパテ ィ はホ ス ト 固 有 です。実 行 文 字 セ ッ ト のその 他 のプ ロパテ ィ はターゲ ッ ト 固 有 です。 <strong>ARM</strong> の C および C++ のライブラ リは ISO 8859-1 (Latin-1 アルフ ァベッ ト ) 文 字 セッ ト をサポー ト するので、 以 下 の 特 徴 があ り ます。• 実 行 文 字 セ ッ ト は、 ソース 文 字 セ ッ ト と 同 一 です。• 実 行 文 字 セ ッ ト の 1 文 字 は 8 ビッ トで 構 成 されます。• int は 4 文 字 (バ イ ト ) で 構 成 さ れます。 メモリシステムには 以 下 の 種 類があ り ます。リトルエンディアンバイ トは、 最 下 位 アドレスの 最 下 位 バイ トから、 最上 位 ア ド レ スの 最 上 位 バ イ ト に 順 序 付 け ら れます。5-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


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 を 符 号 なしに 設 定できます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-3ID 100419Non-Confidential,


C および C++ の 実 装 に 関 する 詳 細注--signed_chars および --unsigned_chars オプシ ョ ン を 使 用 ま たは 使 用 せずにコンパイルされ、 インタフェースやデータ 構 造 を 共 有 している 変 換 ユニ ッ ト を 混 合 する 場 合 は、 注 意 が 必 要 です。<strong>ARM</strong> ABI では、 char を 符 号 なしバイ ト と して 定 義 します。 これは、RVCT に 付 属 の C++ ラ イ ブ ラ リ が 使 用 し てい る 解 釈 です。• マルチバイト 文 字 をワイドキャラクタ 定 数 の 対 応 するワイドキャラクタに 変 換 する と き、 ロ ケールは 使 用 さ れません。 これは、 一 般 的 な 実 装 には 無 関 係 です。5.1.2 基 本 デー タ 型このセクションでは、<strong>ARM</strong> C および C++ での 基 本 データ 型 の 実 装 方 法 について 説 明 し ます。基 本 デー タ 型 のサイズ と 境 界 整 列表 5-2 は、 基 本 データ 型 のサ イ ズ と 自 然 配 列 を 示 し ています。表 5-2 デー タ 型 のサイズ と 境 界 整 列型サイズ(ビ ッ ト 数 )自 然 配 列 (バイ ト 数 )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 (ワー ド 境 界 で 整 列 )5-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


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) を 参 照 して 下 さい。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-5ID 100419Non-Confidential,


C および C++ の 実 装 に 関 する 詳 細配 列 と ポイ ン タ以 下 は、 メ ンバへのポ イ ン タ を 除 き、 C および C++ のオブジ ェ ク ト を 指 すすべてのポイ ンタに 適 用 されます。• 隣 接 するバ イ ト には、 1 つずつ 異 なるア ド レスが 割 り 当 てられます。• マクロ NULL は 値 0 に 展 開 されます。• 整 数 と ポ イ ン タ 間 のキ ャ ス ト に よ って 表 現 が 変 化 する こ と はあ り ません。• コ ンパイ ラでは、 関 数 へのポ イ ン タ とデータへのポ イ ン タ 間 のキ ャ ス トについて 警 告 を 生 成 し ます。• size_t 型 は、 unsigned int として 定 義 されます。• ptrdiff_t 型 は、 signed int として 定 義 されます。5.1.3 基 本 デー タ 型 の 演 算<strong>ARM</strong> コンパイラでは、 ISO C99 標 準 および ISO C++ 標 準 の 関 連 セ ク シ ョ ンで定 義 さ れてい る 通 常 の 算 術 変 換 を 実 行 し ます。 以 下 のサブセ ク シ ョ ンでは、算 術 演 算 に 関 する 補 足 事 項 について 説 明 し ます。「 式 の 評 価 」 (ページ B-8) も 参 照 して 下 さい。整 数 型 の 演 算整 数 型 の 演 算 には 以 下 の 規 則 が 適 用 さ れます。• すべての 符 号 付 き 整 数 演 算 には、 2 の 補 数 表 現 が 使 用 さ れます。• 符 号 付 き 整 数 型 のビ ッ ト ご と の 演 算 は、 2 の 補 数 表 現 か ら 自 然 に 生 じ る規 則 に 従 います。 符 号 拡 張 は 行 われません。• 符 号 付 き 数 値 の 右 シ フ ト は 算 術 演 算 です。• int 型 の 値 の 場 合 、— 0 ~ 127 の 範 囲 外 のシ フ ト は 定 義 さ れません。— 31 を 超 える 左 シフ ト が 行 われる と、 ゼロが 返 されます。— 31 を 超 え る 右 シ フ ト が 行 われる 場 合 、 符 号 な し 値 ま たは 正 の 符 号付 き 値 のシフ ト ではゼロが 返 されます。 負 の 符 号 付 き 値 でこのよ うなシフ ト を 行 う と、 –1 が 返 されます。• long long 型 の 値 の 場 合 、 0 ~ 63 の 範 囲 外 のシフ ト は 定 義 されません。5-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


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)• ポインタがオブジェ ク ト を 指 し、 そのオブジェ ク ト の 境 界 整 列 がオブジ ェ ク ト のサ イ ズ と 等 し い 場 合 は、 こ の 境 界 整 列 に よ り こ の 除 算 は 必 ず割 り 切 れます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-7ID 100419Non-Confidential,


C および C++ の 実 装 に 関 する 詳 細• ポ イ ン タ がオブジ ェ ク ト を 指 し、 パ ッ ク 型 や 大 部 分 の struct のよ うに、そのオブジ ェ ク ト の 境 界 整 列 がオブジ ェ ク ト のサ イ ズ よ り も 小 さ い 場 合は、 ど ち ら のポ イ ン タ も 同 じ 配 列 の 要 素 を 指 し てい る 必 要 があ り ます。5.1.4 構 造 体 、 共 用 体 、 列 挙 型 、 ビ ッ ト フ ィ ール ドこ のセ ク シ ョ ンでは、 構 造 化 さ れたデータ 型 を 実 装 する 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• signed int• C で --strict を 指 定 している 場 合 を 除 き、 unsigned int• C で --strict を 指 定 している 場 合 を 除 き、 signed long long• C で --strict を 指 定 している 場 合 を 除 き、 unsigned long longこのよ うに enum を 実 装 する こ とで、 データサイズを 小 さ く できます。 コマンドラインオプション --enum_is_int を 使 用 して、enum の 基 本 型 を 最 低 でも int の幅 に 設 定 でき ます。詳 細 については、 『Procedure Call Standard for the <strong>ARM</strong> Architecture』 仕 様 の C 言語 マ ッ ピングに 関 する 説 明 を 参 照 し て 下 さい。5-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


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 longlong として 扱 われます。列 挙 値 が 範 囲 外 であ る こ と を 示 す 警 告 が 表 示 さ れる よ う にする には、 以 下 のコマン ド を 使 用 して 警 告 をエラーに 変 更 し ます。armcc --diag_error=66 ...構 造 体こ こ で 説 明 する 内 容 は 以 下 に 適 用 さ れます。• すべての C 構 造 体• 仮 想 関 数 ま たはベース ク ラ ス を 使 用 し ないすべての C++ 構 造 体 と ク ラ ス構 造 体 の 境 界 整 列パ ッ ク さ れていない 構 造 体 の 境 界 整 列 は、 その 構 造 体 のフ ィ ール ド に 必 要 な 最 大 の 境 界 整 列 にな り ます。フ ィ ール ド の 境 界 整 列構 造 体 は、 名 前 が 付 け られた 最 初 のコ ンポーネン ト が 最 下 位 アドレスになるように 配 置 されます。 フィールドは、 以 下 のように整 列 さ れます。• char 型 のフ ィールドは、 次 に 使 用 可 能 なバイ ト に 揃 えて 整列 されます。• short 型 のフ ィ ール ド は、 次 の 偶 数 ア ド レ スのバイ ト に 揃 えて 整 列 されます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-9ID 100419Non-Confidential,


C および C++ の 実 装 に 関 する 詳 細• RVCT 2.0 以 降 では、 double 型 と long long 型 が 8 バイ ト 境 界で 整 列 されます。 このため、<strong>ARM</strong>v5TE 以 降 では LDRD 命 令 とSTRD 命 令 を 効 率 的 に 使 用 で き ます。• ビットフィールドの 境 界 整 列 は、 そのビッ トフィールドの宣 言 方 法 に よ って 異 な り ます。 詳 細 については、 「パ ッ ク 構造 体 のビ ッ ト フ ィ ール ド 」 (ページ 5-14) を 参 照 して 下 さい。• その 他 のすべての 型 は、 ワー ド 境 界 で 整 列 さ れます。フ ィ ール ド が 正 し く 整 列 され、 かつ 構 造 自 体 が 正 し く 整 列 する よ う に、 構 造体 にはパデ ィ ングを 挿 入 でき ます。 図 5-1 は、 従 来 の 非 パ ッ ク 構 造 体 の 例 を示 しています。 フィールドを 正 しく 整 列 するために、バイト 1、 2、 3 にパデ ィングを 挿 入 しています。 ま た、 構 造 体 自 体 を 正 し く 整 列 する ために、 バイ ト11、 12 にパディ ングを 挿 入 しています。 sizeof() 関 数 では、 こ のパデ ィ ングを含 めた 構 造 体 のサイ ズが 返 されます。struct {char c; int x; short s} ex1;0 1 2 3cspadding4 5 7 8x9 10 11 12padding図 5-1 従 来 のパ ッ ク されていない 構 造 体 の 例コ ンパイ ラ では、 構 造 体 の 定 義 方 法 に 応 じ て、 以 下 のいずれかの 方 法 で 構 造体 にパデ ィ ングを 挿 入 し ます。• static または extern として 定 義 されている 構 造 は、ゼロでパディングされます。• malloc() または auto でス タ ッ ク ま たは ヒ ープ 上 に 定 義 さ れる 構 造 体 には、 そのメ モ リ 位 置 に 以 前 に 格 納 されていた 値 をそのまま 埋 め 込 みます。 memcmp() を 使 用 して、 このよ う に 定 義 されたパディ ング 済 みの 構 造体 を 比 較 する こ とはできません ( 図 5-1 を 参 照 )。--remarks オプシ ョ ンを 使 用 する と、 コンパイ ラが struct にパディ ングを 挿 入し た と き に 生 成 さ れる メ ッ セージ を 表 示 で き ます。C++ では、 以 下 の よ う に 空 の イ ニシ ャ ラ イ ザを 備 えた 構 造 体 が 許 可 さ れます。5-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


C および C++ の 実 装 に 関 する 詳 細struct{int x;} X = { };ただし、 C をコンパイルしているとき、 または --cpp および --c90 オプシ ョ ンを 指 定 して C++ を コ ンパ イ ル し てい る と きは、 以 下 の よ う なエ ラーが 生 成 されます。パ ッ ク 構 造 体パ ッ ク 構 造 体 と は、 構 造 体 自 体 の 境 界 整 列 と 、 構 造 体 内 のフ ィ ール ド の 境 界整 列 が 常 に 1 の 構 造 体 です。パ ッ ク 構 造 体 は、 __packed 修 飾 子 で 定 義 で き ます。 ま たは、 非 境 界 整 列 データを 持 つ 構 造 体 が 確 実 にパ ッ ク さ れる よ う に #pragma pack(n) を 使 用 する こ と もできます。 構 造 体 のデフ ォル ト のパ ッ ク 方 法 を 変 更 する コ マン ド ラ イ ンオプションはありません。ビットフィールドパックされていない 構 造 体 では、 <strong>ARM</strong> コンパイラによってコンテナ 内 にビ ットフィールドが 割 り 当 てられます。 コ ンテナは、 型 が 宣 言 さ れ、 正 し く 整 列されたオブジェク トです。ビ ッ ト フ ィ ール ド は、 コ ンフ ィ グレーシ ョ ンに 基 づいて、 指 定 された 最 初 のフ ィ ール ド が ワー ド 内 の 最 下 位 ア ド レ スのビ ッ ト を 占 有 する よ う に 割 り 当 てられます。リトルエンディアン 最 下 位 ア ド レ スが 最 下 位 の 内 容 にな り ます。ビッグエンディアン 最 下 位 ア ド レ スが 最 上 位 の 内 容 にな り ます。ビ ッ ト フ ィ ール ド コ ンテナには、 任 意 の 整 数 型 を 指 定 で き ます。注厳 密 な 1990 ISO 標 準 C では、 ビ ッ ト フ ィールド に 指 定 でき る 型 は int、signedint、 および unsigned int のみです。 int 型 以 外 を ビ ッ ト フ ィ ール ド に 指 定 すると、 コ ンパイ ラから 以 下 のエ ラーが 表 示 されます。signed 修 飾 子 も unsigned 修 飾 子 も 付 けずに 宣 言 さ れたプレーンなビ ッ トフィールドは、unsigned として 扱 われます。 例 えば、 int x:10 では、 10 ビッ トの 符 号 なし 整 数 が 割 り 当 てられます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-11ID 100419Non-Confidential,


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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


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 number31 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 0unallocatedypaddingx図 5-2 ビ ッ ト フ ィ ール ド の 割 り 当 て 1注異 な る 型 の コ ンテナのビ ッ ト フ ィ ール ド 宣 言 に も 同 じ 基 本 規 則 が 適 用 さ れます。 例 えば、 上 記 の 例 に int ビ ッ ト フ ィ ール ド を 追 加 する と 以 下 の よ う にな ります。struct X{int x:10;char y:8;int z:5;}コンパイラは、int コンテナの 割 り 当 てを int x:10 コンテナと 同 じ 位 置 から 始め、 バイ ト 境 界 で 整 列 された char と 5 ビッ トのビッ トフィールドを 割 り 当 てます ( 図 5-3 を 参 照 )。Bit number31 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 0freezypaddingx図 5-3 ビ ッ ト フ ィ ール ド の 割 り 当 て 2<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-13ID 100419Non-Confidential,


C および C++ の 実 装 に 関 する 詳 細名 前 を 付 けずにサイズが 0 のビ ッ ト フ ィ ール ド を 宣 言 する こ と で、 ビ ッ トフ ィ ール ド コ ンテナに 明 示 的 にパデ ィ ングを 挿 入 で き ます。 コンテナが 空 でなければ、サイズが 0 のビッ ト フ ィールドでコンテナが 完 全 に 埋 められます。その 後 のビ ッ ト フ ィ ール ド 宣 言 は、 新 し い 空 の コ ンテナか ら 始 ま り ます。パ ッ ク 構 造 体 のビ ッ ト フ ィ ール ドパ ッ ク 構 造 体 内 のビ ッ ト フ ィ ール ド コ ンテナのア ラ イ メ ン ト は 1 です。 し たがって、 パ ッ ク 構 造 体 内 のビ ッ ト フ ィ ール ド にパデ ィ ング さ れる 最 大 ビ ッ ト数 は 7 ビッ トです。 パ ッ ク さ れない 構 造 体 の 場 合 、 挿 入 さ れるパデ ィ ングは 最大 8*sizeof(container-type)–1 bits です。5-14 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


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++ をコンパイルする 場 合 は 仮 配 列 を 使 用 でき ません。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-15ID 100419Non-Confidential,


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 オプショ ンを 指 定 してアナクロニズムをイネーブルする 場 合は、 以 下 のアナ ク ロ ニズムが 許 容 されます。• 関 数 宣 言 で 多 重 定 義 が 許 可 されます。 このよ うな 多 重 定 義 は 容 認 されますが、 無 視 されます。• デフ ォル ト の 初 期 化 を 使 用 し て 初 期 化 で き る ス タ テ ィ ッ クデータ メ ンバの 定 義 は 不 要 です。 このアナクロニズムは、 テンプレート クラスのスタテ ィ ッ クデータ メ ンバには 適 用 さ れません。 こ の よ う な ス タ テ ィ ッ クデータ メ ンバは 常 に 定 義 する 必 要 があ り ます。• 配 列 削 除 演 算 では 配 列 の 要 素 数 を 指 定 で き ますが、 この 値 は 無 視 されます。• operator++() 関 数 と operator--() 関 数 を 1 つ 使 用 する と 、 前 置 演 算 と 後 置演 算 の 両 方 を 多 重 定 義 できます。• イミディエートベースクラスが 1 つし か 存 在 し ない 場 合 は、 ベース ク ラス イ ニシ ャ ラ イ ザ 内 でベース ク ラ ス 名 を 省 略 で き ます。• コンスト ラクタおよびデスト ラクタ 内 では this ポ イ ン タ の 代 入 が 許 可 されます。• bound 関 数 のポ イ ン タ、 つま り 特 定 のオブジ ェ ク ト の メ ンバ 関 数 へのポインタは、 関 数 へのポインタにキャストできます。• 入 れ 子 になった ク ラ ス 名 は、 その 名 前 で 他 のク ラ スが 宣 言 されていなければ、 入 れ 子 になっていない ク ラ ス 名 と し て 使 用 で き ます。 このアナクロニズムはテンプレート クラスには 適 用 されません。5-16 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


C および C++ の 実 装 に 関 する 詳 細• const 型 以 外 への 参 照 は、 異 な る 型 の 値 で 初 期 化 で き ます。 一 時 データ が作 成 さ れ、 その 一 時 データ が 変 換 さ れた 初 期 値 で 初 期 化 さ れて、 その 一時 データ に 参 照 が 設 定 さ れます。• const ク ラ ス 型 以 外 への 参 照 は、 ク ラ ス 型 の 右 辺 値 ま たはその ク ラ ス 型か ら 派 生 し た ク ラ スで 初 期 化 で き ます。 一 時 データ が 追 加 使 用 さ れる ことはありません。• 旧 方 式 のパ ラ メ ータ 宣 言 を 使 用 する 関 数 は 許 可 さ れ、 プ ロ ト タ イ プ 宣 言さ れたかの よ う に 多 重 定 義 さ れる 関 数 に 参 加 で き ます。 互 換 性 チェ ッ クの 完 了 時 、 関 数 のパラ メ ータ 型 にはデフ ォル ト の 引 数 のプロモーシ ョ ンが 適 用 されないため、 以 下 の 例 では f という 名 前 の 付 いた 2 つの 関 数 の多 重 定 義 が 宣 言 さ れます。int f(int);int f(x) char x; { return x; }注C で も 上 のコード を 使 用 でき ますが、 意 味 が 異 な り ます。 f の 仮 宣 言 の 後には、 その 定 義 が 続 き ます。5.2.5 テンプレートのインスタンス 生 成<strong>ARM</strong> コンパイ ラは、 すべてのテンプレー ト のインス タンス 生 成 を 自 動 的 に 行い、 各 テンプレー ト エンテ ィ テ ィ の 定 義 が リ ン ク 後 に 1 つしか 残 らないよ うにします。 コ ンパイ ラは、 名 前 の 付 いた 共 通 セ ク シ ョ ンにテンプレー ト エンテ ィ テ ィ を 生 成 する こ と で こ の 処 理 を 行 います。 したがって、 重 複 するすべての 共 通 セ ク シ ョ ン、 つま り 同 じ 名 前 の 共 通 セ ク シ ョ ンが リ ン カに よ っ て 削除 されます。注--pending_instantiations コンパイラオプションを 指 定 して、 特 定 のテンプレート に 対 し て 同 時 に 生 成 さ れる イ ン ス タ ン ス 数 を 制 限 で き ます。「--pending_instantiations=n」 (ページ 2-115) も 参 照 して 下 さい。暗 黙 のイ ン クルー ド暗 黙 の イ ン ク ルー ド が イ ネーブルになってい る と き、 .h ファイルで 宣 言 されたテンプレー ト エンテ ィ テ ィ の イ ン ス タ ン ス 生 成 のために 定 義 が 必 要 な 場 合は、 コ ンパイ ラは 対 応 する .cc ファイルを 暗 黙 にインクルードして、 その 定義 のソース コー ド を 取 得 でき る もの と 見 な し ます。 例 えば、 テンプレー ト エ<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-17ID 100419Non-Confidential,


C および C++ の 実 装 に 関 する 詳 細ンティティ ABC::f が xyz.h ファイルで 宣 言 され、コンパイル 中 に ABC::f のインス タ ン ス 生 成 が 必 要 な 場 合 で も、 コ ンパイルで 処 理 中 の ソース コー ド にABC::f の 定 義 が 含 まれていなければ、 コ ンパイ ラは xyz.cc ファイルが 存 在 するかど うかをチェッ クします。 ファイルが 存 在 している 場 合 、 コンパイラはこのファイルがメ インソースファイルの 最 後 にインクルードされているかのように 処 理 します。コ ンパ イ ラ が 特 定 のテンプレー ト エンテ ィ テ ィ のテンプレー ト 定 義 フ ァ イ ルを 検 索 するには、 テンプレー ト が 宣 言 されている フ ァ イルの 完 全 パス 名 と、そのフ ァ イルが、 例 えば #include などのシステムインクルード 構 文を 使 用 してイン クルード されたかど う かを 把 握 する 必 要 があ り ます。 #lineデ ィ レ ク テ ィ ブを 含 む 前 処 理 さ れた ソースでは、 こ の 情 報 を 使 用 で き ません。そのため、 コンパイ ラは #line デ ィ レ ク テ ィ ブを 含 む ソ ース コー ド では 暗 黙 のインクルードを 試 みません。コ ンパイ ラ は、 定 義 フ ァ イルの 接 尾 文 字 .cc と .CC を 探 し ます。コマンド ラインオプショ ン --implicit_include および --no_implicit_include を指 定 し て、 暗 黙 のイ ン クルード モード を 有 効 または 無 効 にでき ます。暗 黙 の イ ン ク ルー ド は、 フ ァ イ ルの 通 常 の コ ンパ イ ル 中 、 つま り -E コマンドラ イ ンオプシ ョ ン を 使 用 し ていない 場 合 のみ 実 行 さ れます。詳 細 については、 「コマンド ラインオプシ ョ ン」 (ページ 2-2) を 参 照 して 下さい。5.2.6 ネームスペーステンプレートのインスタンス 生 成 で 名 前 のルッ クアップを 行 う と きに、 テンプレー ト 定 義 の コ ンテキ ス ト 内 で 見 つか る 名 前 も あれば、 テンプレートのインスタンス 生 成 のコンテキスト 内 で 見 つかる 名 前 もあります。 コンパイラには、以 下 の 2 つの 異 な る イ ン ス タ ン ス 生 成 ル ッ ク ア ッ プアルゴ リ ズムが 実 装 さ れています。• 標 準 で 規 定 さ れ、 依 存 名 ル ッ ク ア ッ プ と 呼 ばれる アルゴ リ ズム• 依 存 名 ル ッ ク ア ッ プが 実 装 さ れる 前 のアルゴ リ ズム依 存 名 ル ッ ク ア ッ プは、 別 の コ マン ド ラ イ ンオプシ ョ ンで 明 示 的 にデ ィ セーブルに 設 定 されていない 限 り 、 またはコ ンフ ィ グレーシ ョ ンフ ラ グ と コマンド ラ イ ンオプシ ョ ンのいずれかで 依 存 名 処 理 が イ ネーブルに 設 定 さ れてい る場 合 に、 厳 密 モー ド で 実 行 さ れます。5-18 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


C および C++ の 実 装 に 関 する 詳 細依 存 名 ル ッ ク ア ッ プ 処 理コ ンパイ ラ では、 依 存 名 ル ッ ク ア ッ プを 実 行 する と き に、 標 準 で 規 定 さ れてい る イ ン ス タ ン ス 生 成 の 名 前 ル ッ ク ア ッ プ 規 則 を 実 装 し ます。 この 処 理 では、ク ラス 以 外 のプロ ト タ イプのインスタンス 生 成 を 行 う 必 要 があ り ます。 そのため、 標 準 で 規 定 さ れてい る 型 名 と テンプレー ト キーワー ド を 使 用 し て コード を 記 述 する こ と が 必 要 です。参 照 コ ンテキス ト を 使 用 し たル ッ ク ア ッ プコ ンパイ ラ では 依 存 名 ル ッ ク ア ッ プを 使 用 し ない 場 合 、 標 準 の 2 フェーズル ッ ク ア ッ プ 規 則 に 近 い 名 前 ル ッ ク ア ッ プアルゴ リ ズム を 使 用 し ます。 ただし、 あ る 意 味 では、 こ れは 既 存 の コー ド や 既 存 の コ ンパ イ ラ と の 互 換 性 が 高いアルゴ リ ズムです。テンプレートのインスタンス 生 成 の 一 環 と して 名 前 をルッ クアップし、 そのイ ン ス タ ン ス 生 成 の ローカルコ ンテキ ス ト で 名 前 が 見 つか ら ない 場 合 は、 統合 されたインスタンス 生 成 コンテキス トでルッ クアップします。 こ の 統 合 されたインスタンス 生 成 コンテキス トには、 テンプレート 定 義 のコンテキス トにある 名 前 と、 インスタンス 生 成 のコンテキス ト にある 名 前 の 両 方 が 含 まれます。 以 下 に 例 を 示 し ます。namespace N{int g(int);int x = 0;template struct A{T f(T t) { return g(t); }T f() { return x; }};}namespace M {int x = 99;double g(double);N::A ai;int i = ai.f(0); // N::A::f(int) calls N::g(int)int i2 = ai.f(); // N::A::f() returns 0 (= N::x)N::A ad;double d = ad.f(0); // N::A::f(double) calls M::g(double)double d2 = ad.f(); // N::A::f() also returns 0 (= N::x)}<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-19ID 100419Non-Confidential,


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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


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() が 呼 び 出 されます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-21ID 100419Non-Confidential,


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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


付 録 Avia ファイルの 構 文こ の 付 録 では、 すべての <strong>ARM</strong> 開 発 ツールでサポー ト さ れてい る via ファイルの 構 文 について 説 明 し ます。 以 下 のセ ク シ ョ ンか ら 構 成 さ れています。• 「via フ ァ イルの 概 要 」 (ページ A-2)• 「 構 文 」 (ページ A-3)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. A-1ID 100419Non-Confidential,


via ファイルの 構 文A.1 via フ ァ イルの 概 要via ファイルは、 <strong>ARM</strong> 開 発 ツールに 渡 すコ マン ド ラ イ ン 引 数 と オプシ ョ ンが記 述 さ れたプレーンテキ ス ト フ ァ イ ルです。 via フ ァ イルは、 以 下 に 示 すすべての <strong>ARM</strong> コマンド ラインツールで 使 用 できます。 つま り、 via ファイルは、--via コマンドラインオプションを 使 用 して、 コマンドラインから 指 定 できます。• armcc• armasm• armlink• fromelf• armar詳 細 については、 各 ツールのマニュアルを 参 照 して 下 さい。注一 般 的 には、 via フ ァ イルを 使 用 して、 ツールに 対 して 任 意 のコマン ド ラ イ ンオプシ ョ ン (--via を 含 む) を 指 定 で き ます。 つま り、 ネス ト された 複 数 の viaファイルを via フ ァ イル 内 か ら 呼 び 出 すこ と がで き ます。こ のセ ク シ ョ ンは 以 下 のサブセ ク シ ョ ンか ら 構 成 さ れています。• 「via ファイルの 評 価 」A.1.1via フ ァ イルの 評 価via フ ァ イ ルをサポー ト する ツールが 呼 び 出 さ れる と 、 そのツールに よ っ て 以下 の 処 理 が 行 われます。1. 指 定 さ れてい る 最 初 の --via via_file 引 数 を、 via ファイルから 抽 出 された 引 数 ワー ド のシーケン スに 置 き 換 え ます。 こ の 中 には、 再 帰 処 理 を 行う、 via ファイル 内 でネストされた --via コマンド も 含 まれます。2. それ 以 降 の --via via_file 引 数 について も、 出 現 し た 順 番 で 同 じ よ う に処 理 し ます。つま り、 via ファイルは 指 定 された 順 番 で 処 理 され、 ネス ト された via ファイルを 含 めて 各 via ファイルが 完 全 に 処 理 されてから 次 の via ファイルが 処 理 されます。A-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


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='"<strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong>"' (1 ワード)• 括 弧 で 囲 まれた 文 字 は、 1 ワード と して 処 理 されます。 以 下 に 例 を 示 します。--option(x, y, z) (1 ワード)--option (x, y, z) (2 ワード)• 二 重 引 用 符 ま たはアポ ス ト ロ フ ィ で 囲 まれた 文 字 列 内 では、 バ ッ ク スラッシュ (\) 文 字 を 使 用 し て、 二 重 引 用 符 、 アポ ス ト ロ フ ィ 、 およびバックスラッシュ 文 字 をエスケープできます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. A-3ID 100419Non-Confidential,


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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


付 録 B標 準 C の 実 装 定 義こ の 付 録 では、 ISO C 標 準 に 準 拠 し た C の 実 装 におけ る 必 要 事 項 について 説明 します。 以 下 のセ ク シ ョ ンか ら 構 成 さ れています。• 「 実 装 定 義 」 (ページ B-2)• 「ISO C 標 準 で 定 義 さ れていない 動 作 」 (ページ B-10)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. B-1ID 100419Non-Confidential,


標 準 C の 実 装 定 義B.1 実 装 定 義ISO C 標 準 (ISO/IEC 9899:1990 (E)) の 付 録 G には、 移 植 性 の 問 題 に 関 する情 報 が 記 載 さ れています。 また、 小 節 G3 には、 各 実 装 で 文 書 化 する 必 要 のある 処 理 が 記 載 されています。注第 4 章 コンパイラ 固 有 の 機 能 で 説 明 していますのでこの 付 録 では 触 れません。 ただ し、 参 考 情 報 があ る 場 合 はそれを 提 供 し ています。以 下 のサブセ ク シ ョ ンは、 小 節 G3 の 各 セ ク シ ョ ンに 対 応 し てお り 、 ISO C 標準 では 定 義 さ れていない、 実 装 定 義 の <strong>ARM</strong> C コンパイラおよび C ライブラリの 機 能 について 説 明 し ます。注ヘッダ wctype.h および wchar.h では、 ワ イ ド キャ ラ ク タ を 用 いたフ ァ イルの 処理 はサポー ト されていません。B-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


標 準 C の 実 装 定 義B.1.1変 換コ ンパ イ ラ に よ っ て 生 成 さ れる 診 断 メ ッ セージには、 以 下 の 形 式 が 使 用 さ れます。source-file, line-number: severity: error-code: explanationseverity には、 以 下 のいずれかが 使 用 されます。[blank]WarningErrorseverity が 空 白 の 場 合 、 こ れは 注 釈 であ る ため、 一 般 的 な C または C++ の 用 法 であ る こ と を 示 し ます。 ただ し、 場 合 に よ っては特 殊 な 用 法 の 場 合 も あ り ます。 デフォル ト では、 注 釈 は 表 示 されません。 注 釈 メ ッ セージを 表 示 する には、--remarks オプシ ョ ンを使 用 し ます。 詳 細 については、 「 診 断 メ ッ セージの 出 力 の 制 御 」(ページ 6-5) を 参 照 して 下 さい。 コ ンパ イ ルは 続 行 さ れます。問 題 を 引 き 起 こ す 可 能 性 があ る 異 常 が コー ド 内 にあ る こ と を 示します。 コンパイルは 続 行 されます。コ ンパイルが 停 止 する 原 因 と な る 問 題 があ る こ と を 示 し ます。 例えば、 C 言 語 ま たは C++ 言 語 の 構 文 規 則 ま たは 意 味 上 の 規 則 に違 反 し てい る こ と を 示 し ます。Internal faultコ ンパイ ラ で 内 部 的 な 問 題 が 発 生 し てい る こ と を 示 し ます。「フ ィードバッ ク」 (ページ x) に 記 載 さ れてい る 情 報 を 用 意 して、 購 入 元 にお 問 い 合 わせ 下 さ い。他 の 項 目 は 以 下 のよ う にな り ます。error-codeエラーの 種 類 を 識 別 する ための 値 です。explanation エラーの 内 容 を 示 すテキス トです。詳 細 については、 『コンパイ ラユーザガイ ド』 の 第 6 章 診 断 メ ッ セージ を 参照 して 下 さい。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. B-3ID 100419Non-Confidential,


標 準 C の 実 装 定 義B.1.2環 境コマンド ラインを <strong>ARM</strong> アーキテクチャベースの 環 境 から main() の 引 数 にマップする 方 法 は 実 装 によって 異 なります。 汎 用 <strong>ARM</strong> C ライブラリでは 以 下がサポー ト されています。• 「main()」• 「インタラ クティブデバイス」• 「 標 準 入 力 ス ト リ ーム、 標 準 出 力 ス ト リ ーム、 標 準 エ ラース ト リ ームの転 送 」 (ページ B-5)main()main() に 渡 さ れる 引 数 は、 ホ ワ イ ト スペースが 二 重 引 用 符 で 囲 まれてい る 場合 を 除 き、 ホ ワ イ ト スペースで 区 切 ら れた、 コ マン ド ラ イ ンのワー ド (I/O 転送 命 令 は 含 まれません) と な り ます。注• ホワイ ト スペース 文 字 とは、isspace() の 結 果 が 真 と な る 任 意 の 文 字 です。• 二 重 引 用 符 ま たは 二 重 引 用 符 内 のバ ッ ク ス ラ ッ シ ュ 文 字 (\) の 前 には、バ ッ ク ス ラ ッ シ ュ 文 字 を 追 加 する 必 要 があ り ます。• 二 重 引 用 符 内 の I/O 転 送 命 令 は 認 識 さ れません。インタラクティブデバイスホスティングされない <strong>ARM</strong> C ライブラリの 実 装 では、インタラクティブデバイスが 意 味 をな さ ない 場 合 があ り ます。 汎 用 <strong>ARM</strong> C ライブラリでは 一 対 のデバイスがサポート されています。 どちらのデバイスも :tt で 呼 び 出 され、キーボード 入 力 と VDU 画 面 出 力 を 処 理 する 目 的 で 使 用 さ れます。 こ の 汎 用 的な 実 装 では、 以 下 の よ う にな り ます。• I/O 転 送 が 行 われない 限 り 、 :tt に 接 続 されたス ト リ ームではバッ フ ァ リングが 実 行 されません。• :tt 以 外 への I/O 転 送 が 行 われる と 、 フルフ ァ イルバ ッ フ ァ リ ングが 使用 されます。 ただし、stdout と stderr の 両 方 が 同 じ フ ァ イルに 転 送 される 場 合 は、 ラ イ ンバ ッ フ ァ リ ン グが 使 用 さ れます。B-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


標 準 C の 実 装 定 義標 準 入 力 ス ト リ ーム、 標 準 出 力 ス ト リ ーム、 標 準 エ ラース ト リ ームの 転 送汎 用 <strong>ARM</strong> C ラ イ ブ ラ リ を 使 用 する と 実 行 時 に、 標 準 入 力 ス ト リ ーム、 標 準 出力 ス ト リーム、 および 標 準 エラース ト リームを 転 送 できます。 例 えば、 mycopyが、 標 準 入 力 を 標 準 出 力 に コ ピーする、 ホ ス ト デバ ッ ガ 上 で 実 行 さ れる プ ログ ラ ムであ る 場 合 には、 以 下 の コ マン ド ラ イ ン を 入 力 する こ と で こ のプ ロ グラムが 実 行 されます。mycopy < infile > outfile 2> errfileファイルは 以 下 のように 転 送 されます。stdinstdoutstderr標 準 入 力 ス ト リ ームは、 infile に 転 送 されます。標 準 出 力 ス ト リ ームは、 outfile に 転 送 されます。標 準 エ ラース ト リ ームは、 errfile に 転 送 されます。以 下 の 転 送 が 可 能 です。0< filename stdin を filename か ら 読 み 出 し ます。< filename stdin を filename か ら 読 み 出 し ます。1> filename stdout を filename に 書 き 込 みます。> filename stdout を filename に 書 き 込 みます。2> filename stderr を filename に 書 き 込 みます。2>&1>& filestderr が stdout と 同 じ 場 所 に 書 き 込 まれます。stdout と stderr のいずれも filename に 書 き 込 まれます。>> filename stdout は filename に 追 加 されます。>>& filename stdout と stderr のいずれも filename に 追 加 されます。stdin、 stdout、 および stderr と ターゲ ッ ト 間 で 転 送 するには、 以 下 のよ う に 定義 する 必 要 があ り ます。#pragma import(_main_redirection)フ ァ イル 転 送 は、 以 下 のいずれかの 場 合 にのみ 実 行 さ れます。• 起 動 さ れてい る オペレーテ ィ ングシ ス テムがフ ァ イル 転 送 をサポー ト している 場 合<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. B-5ID 100419Non-Confidential,


標 準 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レジスタ<strong>ARM</strong> コンパイラを 使 用 すると、register 記 憶 域 ク ラ ス を 持 つよ う に、 任 意 の数 のローカルオブジェ ク ト を 宣 言 でき ます。B.1.9構 造 体 、 共 用 体 、 列 挙 型 、 ビ ッ ト フ ィ ール ドISO/IEC C 標 準 では、 構 造 化 さ れたデータ の 型 について、 以 下 の 実 装 の 詳 細 を文 書 化 する こ と が 要 求 さ れています。• 共 用 体 の メ ンバが、 異 なる 型 の メ ンバを 使 用 し てア ク セス された 場 合 の結 果• 構 造 体 メンバのパディングと 境 界 整 列• プレーンな int ビッ トフィールドが signed int ビットフィールドとunsigned int ビッ トフィールドのどちらとして 処 理 されるのか• ユニッ ト 内 のビ ッ ト フ ィールドの 割 り 当 て 順 序B-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


標 準 C の 実 装 定 義• ビ ッ ト フ ィ ール ド が 記 憶 域 ユニ ッ ト の 境 界 を 超 え る こ と が 許 されるかどうか• 列 挙 型 の 値 を 表 現 する と き に 使 用 さ れる 整 数 型詳 細 については、 第 5 章 C および C++ の 実 装 に 関 する 詳 細 を 参 照 して 下 さい。共 用 体詳 細 については、 「 共 用 体 」 (ページ 5-8) を 参 照 して 下 さい。列 挙 型詳 細 については、 「 列 挙 型 」 (ページ 5-8) を 参 照 して 下 さい。構 造 体 のパデ ィ ング と 境 界 整 列詳 細 については、 「 構 造 体 」 (ページ 5-9) を 参 照 して 下 さい。ビットフィールド詳 細 については、 「ビ ッ ト フ ィールド」 (ページ 5-11) を 参 照 して 下 さい。B.1.10修 飾 子volatile 修 飾 子 の 指 定 さ れた 型 を 持 つオブジ ェ ク ト は、 そのサ イ ズ と 境 界 整 列に 基 づいてワー ド、 ハーフ ワード 、 またはバイ ト と し てア ク セス されます。 1ワード よ り 大 きい volatile オブジェ ク ト の 場 合 、 オブジェ ク ト の 各 部 分 へのアクセス 順 は 定 義 されていません。 通 常 、 volatile ビ ッ ト フ ィ ール ド を 更 新 するには、 読 み 出 し - 修 正 - 書 き 込 みの 手 続 きが 必 要 です。 境 界 整 列 さ れた ワー ド型 、 ハーフ ワー ド 型 、 およびバイ ト 型 へのア ク セスはア ト ミ ッ ク です。 その他 の volatile アクセスは 必 ずしもアト ミ ックではありません。それ 以 外 の 場 合 は、ソースコードによって 暗 黙 に 定 義 される 順 番 で、ソースコー ド が 暗 黙 に 定 義 する と お り に、 volatile 修 飾 子 の 指 定 さ れたオブジ ェ ク トの 読 み 出 し と 書 き 込 みが 行 われます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. B-7ID 100419Non-Confidential,


標 準 C の 実 装 定 義B.1.11式 の 評 価コ ンパイ ラ で 再 度 順 序 付 けを 行 う こ と がで き る 式 は、 括 弧 内 に 記 述 さ れている 場 合 で も、 優 先 度 が 等 し い 連 想 型 および 可 換 型 の 演 算 子 が 使 用 さ れる 式 だけです。 例 えば、a、 b、 c が 整 数 式 の 場 合 、a + (b + c) は (a + b) + c として 評 価されるこ とがあり ます。シーケンス 間 で、 コ ンパイ ラは、 括 弧 に 関 係 な く どのよ う な 順 序 でも 式 を 評価 でき ます。 し たがって、 各 シーケン スの 間 の 式 の 影 響 はどのよ う な 順 序 でも 起 こ り 得 ます。コ ンパイ ラ は 関 数 引 数 を 任 意 の 順 序 で 評 価 で き ます。関 連 する 標 準 仕 様 に よ って 定 義 さ れていない 評 価 順 序 は、 次 の 事 由 に よ って異 なる 場 合 があ り ます。• コ ンパイル 時 の 最 適 化 レベル• コンパイラのバージョンB-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


標 準 C の 実 装 定 義B.1.12プリプロセッシングディレクティブISO 標 準 の C ヘッダファイルは、#include の よ う に、 標 準 仕 様 で 定 義されている 方 法 で 参 照 できます。イ ン ク ルー ド 可 能 な ソース フ ァ イルの 名 前 は 引 用 符 で 囲 むこ と がで き ます。コンパイラでは、 ホストファイル 名 または UNIX ファイル 名 がサポート されます。 UNIX 以 外 のホ ス ト で UNIX フ ァ イル 名 が 使 用 されている 場 合 には、 コンパイ ラ はそのフ ァ イル 名 を ローカルで 使 用 で き る 名 前 に 変 換 し よ う と 試 みます。認 識 さ れる #pragma ディレクティブを 「プラ グマ」 (ページ 4-62) に 示 し ます。B.1.13ライブラリ 関 数ISO C ライブラリのバリアントは、『ライブラ リ / 浮 動 小 数 点 サポー ト ガ イ ド 』の 「ランタイムライブラ リについて」 (ページ 1-2) にリストされています。各 C ラ イ ブ ラ リ の 特 徴 は、 実 装 に よ って 異 な り ます。 汎 用 <strong>ARM</strong> C ライブラリでは、 以 下 の 機 能 がサポー ト されています。• マクロ NULL は 整 数 定 数 0 に 展 開 されます。• プログラムによって printf などの 予 約 済 みの 外 部 識 別 子 が 再 定 義 さ れると 、 プ ロ グ ラ ムが 標 準 ラ イ ブ ラ リ に リ ン ク さ れた 際 にエ ラーが 発 生 する可 能 性 があ り ます。 プログラムと 標 準 ライブラ リがリ ンクされない 場合 、 エ ラーは 検 出 さ れません。• __aeabi_assert() 関 数 は stderr にエ ラー 診 断 の 詳 細 を 出 力 し、 その 後abort() 関 数 を 呼 び 出 し ます。*** assertion failed: expression, file name, line number注assert マ ク ロ の 動 作 は、 直 近 の #include の 行 によ り 定 義 された 演 算 の 条 件 に よ って 異 な り ます。 詳 細 については、 『ライブラ リ / 浮 動小 数 点 サポー ト ガ イ ド 』 の 「プ ロ グ ラ ムか ら の 終 了 処 理 」 (ページ2-46) を 参 照 して 下 さい。数 学 関 数 、 マ ク ロ、 ロ ケール、 シグナル、 および 入 出 力 の 実 装 の 詳 細 については、 『ライブラ リ / 浮 動 小 数 点 サポー ト ガ イ ド 』 の 第 2 章 C のライブラ リ とC++ のライブラ リを 参 照 して 下 さい。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. B-9ID 100419Non-Confidential,


標 準 C の 実 装 定 義B.2 ISO C 標 準 で 定 義 されていない 動 作ISO C 標 準 で 定 義 さ れていない 動 作 を 以 下 に 示 し ます。• 文 字 と 文 字 列 のエス ケープでは、 \ の 次 の 文 字 に 特 別 な 意 味 がない 場 合は、 文 字 自 体 がエス ケープの 値 にな り ます。 例 えば、 \s は s と 同 じであるため、 警 告 が 生 成 されます。• 無 名 フィールドはあるが 命 名 されたフィールドがない 構 造 体 struct はデフォルトで 許 可 されますが、 厳 密 な 1990 ISO 標 準 C モード ではエラーにな り ます。B-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


付 録 C標 準 C++ の 実 装 定 義C++ を コ ンパイルする 場 合 、 ISO/IEC の C++ 標 準 に 記 載 さ れてい る 言 語 機 能のほとんどが <strong>ARM</strong> コンパイラでサポート されます。 この 付 録 では、 この 標 準で 定 義 されている C++ 言 語 機 能 を 一 覧 し、 その 言 語 機 能 が <strong>ARM</strong> C++ でサポー ト さ れてい る かど う かについて 説 明 し ます。 以 下 のセ ク シ ョ ンか ら 構 成されています。• 「 整 数 変 換 」 (ページ C-3)• 「 純 仮 想 関 数 の 呼 び 出 し」 (ページ C-4)• 「サポー ト さ れてい る 主 な 言 語 機 能 」 (ページ C-5)• 「 標 準 C++ ラ イ ブ ラ リ の 実 装 定 義 」 (ページ C-6)注こ の 付 録 では、 標 準 C の 実 装 に 関 する 情 報 については 触 れていません。 詳 細については、 付 録 B 標 準 C の 実 装 定 義 を 参 照 して 下 さい。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. C-1ID 100419Non-Confidential,


標 準 C++ の 実 装 定 義C++ を ISO C モード でコ ンパイルする 場 合 の <strong>ARM</strong> コンパイラは、 <strong>ARM</strong> C コンパイ ラ と 同 じです。 C または C++ に 固 有 の 実 装 機 能 があ る 場 合 は、 本 文 中にその 旨 を 明 記 しています。 標 準 C++ の 拡 張 については、 以 下 のマニュ アルを 参 照 して 下 さい。• 「 標 準 の C++ 言 語 の 拡 張 機 能 」 (ページ 3-16)• 「C++ および C90 で 使 用 可 能 な C99 言 語 機 能 」 (ページ 3-7)• 「 標 準 C および 標 準 C++ 言 語 の 拡 張 機 能 」 (ページ 3-20)C-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


標 準 C++ の 実 装 定 義C.1 整 数 変 換整 数 変 換 の 際 、 デス テ ィ ネーシ ョ ンの 型 が 符 号 付 き の 場 合 に、 そのデス テ ィネーシ ョ ンの 型 と ビ ッ ト フ ィ ール ド 幅 で 表 現 可 能 であれば、 その 値 は 変 換 されません。 それ 以 外 の 場 合 は、 デステ ィ ネーシ ョ ンの 型 のサイ ズに 収 ま る ように、 値 が 切 り 捨 てられます。注このセクショ ンは ISO/IEC 標 準 の 「4.7 整 数 変 換 」 に 関 連 し ています。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. C-3ID 100419Non-Confidential,


標 準 C++ の 実 装 定 義C.2 純 仮 想 関 数 の 呼 び 出 し純 仮 想 関 数 の 呼 び 出 しは 不 正 です。 コー ド か ら 純 仮 想 関 数 を 呼 び 出 す と 、 コ ンパイラではライブラ リ 関 数 __cxa_pure_virtual への 呼 び 出 しが 含 められます。__cxa_pure_virtual 関 数 は、 シグナル SIGPVFN を 生 成 します。 デフォル ト の 信号 ハン ド ラ は、 エ ラー メ ッ セージを 出 力 し て 終 了 し ます。 詳 細 については、『ライブラ リ / 浮 動 小 数 点 サポー ト ガ イ ド 』 の 「__default_signal_handler()」(ページ 2-76) を 参 照 して 下 さい。C-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


標 準 C++ の 実 装 定 義C.3 サポー ト されている 主 な 言 語 機 能表 C-1 は、 本 リ リ ースの <strong>ARM</strong> C++ でサポー ト さ れてい る 主 な 言 語 機 能 を 示 しています。表 C-1 サポー ト されている 主 な 言 語 機 能主 な 機 能ISO/IEC 標 準 のセ クションサポー トコア 言 語 1 ~ 13 ○テンプレート 14 ○ (エクスポートテンプレートは 除 く)例 外 15 ○ライブラリ 17 ~ 27 「 標 準 C++ ラ イ ブ ラ リ の 実 装 定 義 」 (ページ C-6) と 『ライブラ リ / 浮 動 小 数 点 サポー ト ガイ ド』 を 参 照 して く ださい。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. C-5ID 100419Non-Confidential,


標 準 C++ の 実 装 定 義C.4 標 準 C++ ラ イ ブ ラ リ の 実 装 定 義Rogue Wave ライブラリ v.2.02.03 は、 標 準 で 定 義 されている ラ イ ブ ラ リ のサブセッ トです。 1999 ISO C 標 準 と は 多 少 の 違 いがあ り ます。 実 装 定 義 については、 『ライブラ リ / 浮 動 小 数 点 サポー ト ガ イ ド 』 の 「 標 準 C++ ライブラリの実 装 定 義 」 (ページ 2-120) を 参 照 して 下 さい。このラ イブラ リ とユーザ 定 義 関 数 を 併 用 して、 ターゲッ ト によって 異 なるアプリケーションを 作 成 できます。 『ライブラ リ / 浮 動 小 数 点 サポー ト ガ イ ド 』の 「ランタイムライブラ リについて」 (ページ 1-2) を 参 照 して く ださい。C-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


付 録 DC および C++ コンパイラの 実 装 に 関 する 制 限本 付 録 では、 <strong>ARM</strong> コンパイラを 使 用 して C および C++ をコンパイルする 場合 の 実 装 に 関 する 制 限 について 説 明 し ます。 以 下 のセ ク シ ョ ンか ら 構 成 さ れています。• 「C++ ISO/IEC 標 準 に 関 する 制 限 」 (ページ D-2)• 「 整 数 値 に 関 する 制 限 」 (ページ D-4)• 「 浮 動 小 数 点 数 に 関 する 制 限 」 (ページ D-6)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. D-1ID 100419Non-Confidential,


C および C++ コ ンパイ ラの 実 装 に 関 する 制 限D.1 C++ ISO/IEC 標 準 に 関 する 制 限ISO/IEC C++ 標 準 では、 コ ンパイ ラ が 準 拠 する 必 要 のあ る 最 小 限 の 制 限 が 規定 されています。 異 なる コンパイ ラにアプ リ ケーシ ョ ンを 移 植 する 場 合 は、こ れら の 制 限 に 注 意 する 必 要 があ り ます。 表 D-1 に、 これらの 制 限 の 概 要 を示 します。この 表 で 「メモ リ」 と 表 示 さ れてい る 項 目 は、 使 用 可 能 な メ モ リ の 容 量 に よ る制 限 以 外 に <strong>ARM</strong> コンパイラによる 制 限 がないことを 示 します。表 D-1 実 装 に 関 する 制 限説 明 推 奨 <strong>ARM</strong>複 合 ス テー ト メ ン ト のネ ス ト レベル、 反 復 制 御 構 造 、 選 択 制御 構 造256 メモリ条 件 付 き イ ン ク ルー ド のネ ス ト レベル 256 メモリ宣 言 の 算 術 演 算 、 構 造 体 、 共 用 体 、 ま たは 不 完 全 型 を 修 飾 する ポ イ ン タ、 配 列 、 および 関 数 宣 言 子 ( 任 意 の 組 み 合 わせ)256 メモリ1 つの 式 に 含 まれる 括 弧 のネス ト レベル 256 メモリ内 部 識 別 子 ま たはマ ク ロ 名 の 最 初 の 文 字 数 1024 メモリ外 部 識 別 子 の 最 初 の 文 字 数 1024 メモリ1 つの 変 換 ユニ ッ ト に 含 まれる 外 部 識 別 子 65536 メモリ1 つのブ ロ ッ ク 内 で 宣 言 さ れる、 有 効 範 囲 がブ ロ ッ ク であ る識 別 子1024 メモリ1 つの 変 換 ユニ ッ ト 内 で 同 時 に 定 義 さ れる マ ク ロ 識 別 子 65536 メモリ1 つの 関 数 宣 言 に 含 まれるパ ラ メ ータ 256 メモリ1 つの 関 数 コールに 含 まれる 引 数 の 数 256 メモリ1 つのマ ク ロ 定 義 に 含 まれるパラ メ ータ 256 メモリ1 つのマ ク ロ 呼 び 出 し に 含 まれる 引 数 256 メモリ1 行 の 論 理 ソ ース 行 に 含 まれる 文 字 65536 メモリ文 字 ス ト リ ング リ テ ラ ルま たは 連 結 後 のワ イ ド ス ト リ ング リテラルに 含 まれる 文 字65536 メモリC または C++ オブジ ェ ク ト のサ イ ズ ( 配 列 を 含 む) 262144 4294967296D-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


C および C++ コ ンパイ ラの 実 装 に 関 する 制 限表 D-1 実 装 に 関 する 制 限 (continued)説 明 推 奨 <strong>ARM</strong>#include ファイルのネストレベル 256 メモリネス ト された switch ステート メン ト を 除 く、 1 つの switch ステー ト メ ン ト の case ラベル1 つの ク ラ ス、 構 造 体 、 ま たは 共 用 体 に 含 まれるデータ メ ンバの 数16384 メモリ16384 メモリ1 つの 列 挙 型 に 含 まれる 列 挙 定 数 4096 メモリ1 つの struct 宣 言 リ ス ト 内 にネス ト さ れる ク ラ ス、 構 造 体 、ま たは 共 用 体 定 義 のレベル256 メモリatexit() に よ って 登 録 さ れる 関 数 32 33直 接 および 間 接 ベース ク ラ ス 16384 メモリ1 つの ク ラ スの 直 接 ベース ク ラ ス 1024 メモリ1 つのク ラ スで 宣 言 される メ ンバ 4096 メモリ1 つの ク ラ ス 内 で 最 終 的 にオーバ ラ イ ド さ れる 仮 想 関 数 (アク セ ス 可 能 かど う かに 関 係 な く )16384 メモリ1 つの ク ラ スが 持 つ 直 接 および 間 接 仮 想 ベース 1024 メモリ1 つのク ラ スに 含 まれる ス タ テ ィ ッ ク メ ンバ 1024 メモリ1 つのク ラ スに 含 まれる フ レ ン ド 宣 言 4096 メモリ1 つの ク ラ スに 含 まれる ア ク セス 制 御 宣 言 4096 メモリ1 つのコ ン ス ト ラ ク タ 定 義 に 含 まれる メ ンバイ ニシャ ラ イザ 6144 メモリ1 つの 識 別 子 に 対 する 有 効 範 囲 修 飾 子 256 メモリネ ス ト さ れた 外 部 指 定 子 1024 メモリ1 つのテンプレー ト 宣 言 に 含 まれる テンプレー ト 引 数 1024 メモリ再 帰 的 にネ ス ト さ れたテンプレー ト の イ ン ス タ ン ス 17 メモリ1 つの try ブロックに 対 するハンドラ 256 メモリ1 つの 関 数 宣 言 に 含 まれる throw 指 定 256 メモリ<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. D-3ID 100419Non-Confidential,


C および C++ コ ンパイ ラの 実 装 に 関 する 制 限D.2 整 数 値 に 関 する 制 限表 D-2 は、 <strong>ARM</strong> C および C++ におけ る 整 数 値 の 範 囲 を 示 し ます。 表 の 値 の 列は、 範 囲 の 終 端 の 数 値 を 示 し ています。 16 進 値 の 列 は <strong>ARM</strong> コンパイラによってこの 値 として 解 釈 されるビッ トパターンを 16 進 数 で 示 し ます。 これらの 定数 は、 limits.h インクルードファイルで 定 義 されます。定 数 を 入 力 する 場 合 は、 サ イ ズ と 符 号 の 指 定 に 注 意 し て 下 さ い。 10 進 数 と 16進 数 /8 進 数 では、 定 数 の 解 釈 が 異 な り ます。 詳 細 については、 「 参 考 資 料 」(ページ viii) に 記 述 されているよ うに、 適 切 な C/C++ 標 準 、 ま たは 推 奨 さ れる C および C++ の 参 考 書 を 参 照 して 下 さい。表 D-2 整 数 の 範 囲定 数 意 味 値 16 進 値CHAR_MAX char の 最 大 値 255 0xFFCHAR_MIN char の 最 小 値 0 0x00SCHAR_MAX signed char の 最 大 値 127 0x7FSCHAR_MIN signed char の 最 小 値 –128 0x80UCHAR_MAX unsigned char の 最 大 値 255 0xFFSHRT_MAX short の 最 大 値 32767 0x7FFFSHRT_MIN short の 最 小 値 –32768 0x8000USHRT_MAX unsigned short の 最 大 値 65535 0xFFFFINT_MAX int の 最 大 値 2147483647 0x7FFFFFFFINT_MIN int の 最 小 値 –2147483648 0x80000000LONG_MAX long の 最 大 値 2147483647 0x7FFFFFFFLONG_MIN long の 最 小 値 –2147483648 0x80000000ULONG_MAX unsigned long の 最 大 値 4294967295 0xFFFFFFFFD-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


C および C++ コ ンパイ ラの 実 装 に 関 する 制 限表 D-2 整 数 の 範 囲 (continued)定 数 意 味 値 16 進 値LLONG_MAX long long の 最 大 値 9.2E+18 0x7FFFFFFFFFFFFFFFLLONG_MIN long long の 最 小 値 –9.2E+18 0x8000000000000000ULLONG_MAX unsigned long long の 最 大 値 1.8E+19 0xFFFFFFFFFFFFFFFF<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. D-5ID 100419Non-Confidential,


C および C++ コ ンパイ ラの 実 装 に 関 する 制 限D.3 浮 動 小 数 点 数 に 関 する 制 限こ のセ ク シ ョ ンでは、 浮 動 小 数 点 数 の 特 性 について 説 明 し ます。表 D-3 は、 浮 動 小 数 点 数 の 特 性 、 範 囲 、 制 限 を 示 し ます。 これらの 定 数 は、float.h インクルードファイルで 定 義 されます。表 D-3 浮 動 小 数 点 数 に 関 する 制 限定 数 意 味 値FLT_MAX float の 最 大 値 3.40282347e+38FFLT_MIN float の 正 規 化 さ れた 正 の 最 小 浮 動 小 数 点 数 値 1.175494351e–38FDBL_MAX double の 最 大 値 1.79769313486231571e+308DBL_MIN double の 正 規 化 さ れた 正 の 最 小 浮 動 小 数 点 数 値 2.22507385850720138e–308LDBL_MAX long double の 最 大 値 1.79769313486231571e+308LDBL_MIN long double の 正 規 化 さ れた 正 の 最 小 浮 動 小 数 点 数 値 2.22507385850720138e–308FLT_MAX_EXP float 型 の 基 数 2 の 指 数 の 最 大 値 128FLT_MIN_EXP float 型 の 基 数 2 の 指 数 の 最 小 値 –125DBL_MAX_EXP double 型 の 基 数 2 の 指 数 の 最 大 値 1024DBL_MIN_EXP double 型 の 基 数 2 の 指 数 の 最 小 値 –1021LDBL_MAX_EXP long double 型 の 基 数 2 の 指 数 の 最 大 値 1024LDBL_MIN_EXP long double 型 の 基 数 2 の 指 数 の 最 小 値 –1021FLT_MAX_10_EXP float 型 の 基 数 10 の 指 数 の 最 大 値 38FLT_MIN_10_EXP float 型 の 基 数 10 の 指 数 の 最 小 値 –37DBL_MAX_10_EXP double 型 の 基 数 10 の 指 数 の 最 大 値 308DBL_MIN_10_EXP double 型 の 基 数 10 の 指 数 の 最 小 値 –307LDBL_MAX_10_EXP long double 型 の 基 数 10 の 指 数 の 最 大 値 308LDBL_MIN_10_EXP long double 型 の 基 数 10 の 指 数 の 最 小 値 –307D-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


C および C++ コ ンパイ ラの 実 装 に 関 する 制 限表 D-4 では、 浮 動 小 数 点 数 のその 他 の 特 性 について 説 明 し ています。 これらの 定 数 も、 float.h インクルードファイルで 定 義 されます。表 D-4 浮 動 小 数 点 数 に 関 するその 他 の 特 性定 数 意 味 値FLT_RADIX <strong>ARM</strong> 浮 動 小 数 点 数 表 現 のベース ( 基 数 ) 2FLT_ROUNDS 浮 動 小 数 点 数 の 丸 めモー ド ( 直 近 の 値 ) 1FLT_DIG float の 精 度 の 10 進 数 6DBL_DIG double の 精 度 の 10 進 数 15LDBL_DIG long double の 精 度 の 10 進 数 15FLT_MANT_DIG float 型 の 精 度 の 2 進 数 24DBL_MANT_DIG double 型 の 精 度 の 2 進 数 53LDBL_MANT_DIG long double 型 の 精 度 の 2 進 数 53FLT_EPSILON float 型 において 1.0 + x != 1.0 が 成 り 立 つ 正 の 値 x の 最 小 値 1.19209290e–7FDBL_EPSILONLDBL_EPSILONdouble 型 において 1.0 + x != 1.0 が 成 り 立 つ 正 の 値 x の 最 小値long double 型 において 1.0 + x != 1.0 が 成 り 立 つ 正 の 値 x の最 小 値2.2204460492503131e–162.2204460492503131e–16L注• 浮 動 小 数 点 数 を よ り 精 度 の 低 い 浮 動 小 数 点 型 の 値 に 変 換 する と 、 その 値は 表 現 可 能 な 近 似 値 に 丸 め ら れます。• 浮 動 小 数 点 演 算 は IEEE 754 に 準 拠 し ています。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. D-7ID 100419Non-Confidential,


C および C++ コ ンパイ ラの 実 装 に 関 する 制 限D-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


付 録 ENEON サポー ト の 使 用こ の 付 録 では、 <strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong> (RVCT) の 今 回 のリ リースでサポー ト されている NEON 組 み 込 み 関 数 について 説 明 し ます。以 下 のセ ク シ ョ ンか ら 構 成 さ れています。• 「はじ めに」 (ページ E-2)• 「ベ ク タ のデータ 型 」 (ページ E-3)• 「コ ンパイ ラ 組 み 込 み 関 数 」 (ページ E-5)<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-1ID 100419Non-Confidential,


NEON サポー ト の 使 用E.1 はじめにRVCT には、 <strong>ARM</strong> 状 態 と Thumb 状 態 の 両 方 で Cortex-A8 プロセッサ 用 のNEON コー ド を 生 成 で き る コ ンパ イ ラ 組 み 込 み 関 数 があ り ます。 NEON コンパイ ラ 組 み 込 み 関 数 は、 ヘ ッ ダフ ァ イル arm_neon.h で 定 義 されています。 このヘ ッ ダフ ァ イルには、 コ ンパイ ラ 組 み 込 み 関 数 と 一 連 のベク タ 型 の 両 方 が 定義 されています。<strong>ARM</strong>v7 よ り 前 のアーキテクチャでは、NEON コ ンパ イ ラ 組 み 込 み 関 数 がサポー ト されていません。 これらの 古 いバージョ ンのアーキテクチャや、NEONが 含 まれない <strong>ARM</strong>v7 アーキテクチャプロ フ ァ イルをビルドの 対 象 とする 場合 、 NEON コ ンパイ ラ 組 み 込 み 関 数 は 通 常 の 関 数 呼 び 出 し と し て 処 理 さ れ、リンク 時 にエラーが 発 生 します。E-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用E.2 ベクタのデータ 型次 のデータ 型 は、 ベ ク タ を 表 すために 定 義 さ れています。 NEON ベクタのデータ 型 は、 次 のパターンに 従 って 命 名 さ れます。x_t例 えば、 int16x4_t は 4 つのレーンか ら な るベ ク タ であ り 、 各 ベク タ に 符 号 付きの 16 ビッ ト 整 数 が 1 つ 含 まれています。 表 E-1 にベク タのデータ 型 を 一 覧で 示 し ます。表 E-1 ベクタのデータ 型int8x8_tint16x4_tint32x2_tint64x1_tuint8x8_tuint16x4_tuint32x2_tuint64x1_tfloat16x4_tfloat32x2_tpoly8x8_tpoly16x4_tint8x16_tint16x8_tint32x4_tint64x2_tuint8x16_tuint16x8_tuint32x4_tuint64x2_tfloat16x8_tfloat32x4_tpoly8x16_tpoly16x8_tコ ンパイ ラ 組 み 込 み 関 数 の 中 には、 次 の よ う なベク タ 型 の 配 列 を 使 用 する ものがあ り ます。xx_tこれらの 型 は、val という 1 つの 要 素 を 持 つ 通 常 の C 構 造 体 と し て 処 理 さ れます。サンプル 構 造 体 の 定 義 は 次 の よ う にな り ます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-3ID 100419Non-Confidential,


NEON サポー ト の 使 用struct int16x4x2_t{int16x4_t val[2];};表 E-1 (ページ E-3) に 示 し たベク タ 型 について も、 配 列 長 が 2 ~ 4 の 配 列 型が 定 義 されています。E-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用E.3 コ ンパイ ラ 組 み 込 み 関 数本 付 録 で 説 明 する コ ンパイ ラ 組 み 込 み 関 数 は、 NEON 命 令 にほぼそのま ま 対応 しています。 各 セ ク シ ョ ンは 関 数 プ ロ ト タ イ プの リ ス ト で 始 ま り ます。 この リ ス ト には、 対 応 する アセンブ ラ 命 令 を 示 すコ メ ン ト が 付 いています。 命令 は 必 要 なセマンテ ィ ッ ク スに 応 じ て コ ンパイ ラ に よ り 自 動 的 に 選 択 さ れますが、 リ ス ト に 示 すとお り の 命 令 が 生 成 される 保 証 はあ り ません。コ ンパイ ラ 組 み 込 み 関 数 では、 NEON 統 一 アセンブ ラ 構 文 に 似 た 命 名 方 式 が使 用 さ れています。 つま り 、 それぞれの コ ンパイ ラ 組 み 込 み 関 数 は 以 下 を 形成 します。_コ ンパイ ラ 組 み 込 み 関 数 が 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 バイ トがロード されます。<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-5ID 100419Non-Confidential,


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(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 vadd_s8(int8x8_t a, int8x8_t b); // VADD.I8 d0,d0,d0int16x4_t vadd_s16(int16x4_t a, int16x4_t b); // VADD.I16 d0,d0,d0int32x2_t vadd_s32(int32x2_t a, int32x2_t b); // VADD.I32 d0,d0,d0int64x1_t vadd_s64(int64x1_t a, int64x1_t b); // VADD.I64 d0,d0,d0float32x2_t vadd_f32(float32x2_t a, float32x2_t b); // VADD.F32 d0,d0,d0uint8x8_t vadd_u8(uint8x8_t a, uint8x8_t b); // VADD.I8 d0,d0,d0uint16x4_t vadd_u16(uint16x4_t a, uint16x4_t b); // VADD.I16 d0,d0,d0uint32x2_t vadd_u32(uint32x2_t a, uint32x2_t b); // VADD.I32 d0,d0,d0uint64x1_t vadd_u64(uint64x1_t a, uint64x1_t b); // VADD.I64 d0,d0,d0int8x16_t vaddq_s8(int8x16_t a, int8x16_t b); // VADD.I8 q0,q0,q0int16x8_t vaddq_s16(int16x8_t a, int16x8_t b); // VADD.I16 q0,q0,q0int32x4_t vaddq_s32(int32x4_t a, int32x4_t b); // VADD.I32 q0,q0,q0int64x2_t vaddq_s64(int64x2_t a, int64x2_t b); // VADD.I64 q0,q0,q0float32x4_t vaddq_f32(float32x4_t a, float32x4_t b); // VADD.F32 q0,q0,q0E-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用uint8x16_t vaddq_u8(uint8x16_t a, uint8x16_t b);uint16x8_t vaddq_u16(uint16x8_t a, uint16x8_t b);uint32x4_t vaddq_u32(uint32x4_t a, uint32x4_t b);uint64x2_t 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 vaddl_s8(int8x8_t a, int8x8_t b); // VADDL.S8 q0,d0,d0int32x4_t vaddl_s16(int16x4_t a, int16x4_t b); // VADDL.S16 q0,d0,d0int64x2_t vaddl_s32(int32x2_t a, int32x2_t b); // VADDL.S32 q0,d0,d0uint16x8_t vaddl_u8(uint8x8_t a, uint8x8_t b); // VADDL.U8 q0,d0,d0uint32x4_t vaddl_u16(uint16x4_t a, uint16x4_t b); // VADDL.U16 q0,d0,d0uint64x2_t vaddl_u32(uint32x2_t a, uint32x2_t b); // VADDL.U32 q0,d0,d0ベクタ 加 算 (ワイド) : vadd -> Vr[i]:=Va[i]+Vb[i]int16x8_t vaddw_s8(int16x8_t a, int8x8_t b); // VADDW.S8 q0,q0,d0int32x4_t vaddw_s16(int32x4_t a, int16x4_t b); // VADDW.S16 q0,q0,d0int64x2_t vaddw_s32(int64x2_t a, int32x2_t b); // VADDW.S32 q0,q0,d0uint16x8_t vaddw_u8(uint16x8_t a, uint8x8_t b); // VADDW.U8 q0,q0,d0uint32x4_t vaddw_u16(uint32x4_t a, uint16x4_t b); // VADDW.U16 q0,q0,d0uint64x2_t vaddw_u32(uint64x2_t a, uint32x2_t b); // VADDW.U32 q0,q0,d0ベク タ 二 分 加 算 : vhadd -> Vr[i]:=(Va[i]+Vb[i])>>1int8x8_t vhadd_s8(int8x8_t a, int8x8_t b); // VHADD.S8 d0,d0,d0int16x4_t vhadd_s16(int16x4_t a, int16x4_t b); // VHADD.S16 d0,d0,d0int32x2_t vhadd_s32(int32x2_t a, int32x2_t b); // VHADD.S32 d0,d0,d0uint8x8_t vhadd_u8(uint8x8_t a, uint8x8_t b); // VHADD.U8 d0,d0,d0uint16x4_t vhadd_u16(uint16x4_t a, uint16x4_t b); // VHADD.U16 d0,d0,d0uint32x2_t vhadd_u32(uint32x2_t a, uint32x2_t b); // VHADD.U32 d0,d0,d0int8x16_t vhaddq_s8(int8x16_t a, int8x16_t b); // VHADD.S8 q0,q0,q0int16x8_t vhaddq_s16(int16x8_t a, int16x8_t b); // VHADD.S16 q0,q0,q0int32x4_t vhaddq_s32(int32x4_t a, int32x4_t b); // VHADD.S32 q0,q0,q0uint8x16_t vhaddq_u8(uint8x16_t a, uint8x16_t b); // VHADD.U8 q0,q0,q0uint16x8_t vhaddq_u16(uint16x8_t a, uint16x8_t b); // VHADD.U16 q0,q0,q0uint32x4_t vhaddq_u32(uint32x4_t a, uint32x4_t b); // VHADD.U32 q0,q0,q0ベク タ 丸 め 二 分 加 算 : vrhadd -> Vr[i]:=(Va[i]+Vb[i]+1)>>1int8x8_t vrhadd_s8(int8x8_t a, int8x8_t b); // VRHADD.S8 d0,d0,d0int16x4_t vrhadd_s16(int16x4_t a, int16x4_t b); // VRHADD.S16 d0,d0,d0int32x2_t vrhadd_s32(int32x2_t a, int32x2_t b); // VRHADD.S32 d0,d0,d0uint8x8_t vrhadd_u8(uint8x8_t a, uint8x8_t b); // VRHADD.U8 d0,d0,d0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-7ID 100419Non-Confidential,


NEON サポー ト の 使 用uint16x4_t vrhadd_u16(uint16x4_t a, uint16x4_t b); // VRHADD.U16 d0,d0,d0uint32x2_t vrhadd_u32(uint32x2_t a, uint32x2_t b); // VRHADD.U32 d0,d0,d0int8x16_t vrhaddq_s8(int8x16_t a, int8x16_t b); // VRHADD.S8 q0,q0,q0int16x8_t vrhaddq_s16(int16x8_t a, int16x8_t b); // VRHADD.S16 q0,q0,q0int32x4_t vrhaddq_s32(int32x4_t a, int32x4_t b); // VRHADD.S32 q0,q0,q0uint8x16_t vrhaddq_u8(uint8x16_t a, uint8x16_t b); // VRHADD.U8 q0,q0,q0uint16x8_t vrhaddq_u16(uint16x8_t a, uint16x8_t b); // VRHADD.U16 q0,q0,q0uint32x4_t vrhaddq_u32(uint32x4_t a, uint32x4_t b); // VRHADD.U32 q0,q0,q0サチュレー ト ベク タ 加 算 : vqadd -> Vr[i]:=sat(Va[i]+Vb[i])int8x8_t vqadd_s8(int8x8_t a, int8x8_t b); // VQADD.S8 d0,d0,d0int16x4_t vqadd_s16(int16x4_t a, int16x4_t b); // VQADD.S16 d0,d0,d0int32x2_t vqadd_s32(int32x2_t a, int32x2_t b); // VQADD.S32 d0,d0,d0int64x1_t vqadd_s64(int64x1_t a, int64x1_t b); // VQADD.S64 d0,d0,d0uint8x8_t vqadd_u8(uint8x8_t a, uint8x8_t b); // VQADD.U8 d0,d0,d0uint16x4_t vqadd_u16(uint16x4_t a, uint16x4_t b); // VQADD.U16 d0,d0,d0uint32x2_t vqadd_u32(uint32x2_t a, uint32x2_t b); // VQADD.U32 d0,d0,d0uint64x1_t vqadd_u64(uint64x1_t a, uint64x1_t b); // VQADD.U64 d0,d0,d0int8x16_t vqaddq_s8(int8x16_t a, int8x16_t b); // VQADD.S8 q0,q0,q0int16x8_t vqaddq_s16(int16x8_t a, int16x8_t b); // VQADD.S16 q0,q0,q0int32x4_t vqaddq_s32(int32x4_t a, int32x4_t b); // VQADD.S32 q0,q0,q0int64x2_t vqaddq_s64(int64x2_t a, int64x2_t b); // VQADD.S64 q0,q0,q0uint8x16_t vqaddq_u8(uint8x16_t a, uint8x16_t b); // VQADD.U8 q0,q0,q0uint16x8_t vqaddq_u16(uint16x8_t a, uint16x8_t b); // VQADD.U16 q0,q0,q0uint32x4_t vqaddq_u32(uint32x4_t a, uint32x4_t b); // VQADD.U32 q0,q0,q0uint64x2_t vqaddq_u64(uint64x2_t a, uint64x2_t b); // VQADD.U64 q0,q0,q0ベ ク タ 加 算 、 上 位 半 分 -> Vr[i]:=Va[i]+Vb[i]int8x8_t vaddhn_s16(int16x8_t a, int16x8_t b); // VADDHN.I16 d0,q0,q0int16x4_t vaddhn_s32(int32x4_t a, int32x4_t b); // VADDHN.I32 d0,q0,q0int32x2_t vaddhn_s64(int64x2_t a, int64x2_t b); // VADDHN.I64 d0,q0,q0uint8x8_t vaddhn_u16(uint16x8_t a, uint16x8_t b); // VADDHN.I16 d0,q0,q0uint16x4_t vaddhn_u32(uint32x4_t a, uint32x4_t b); // VADDHN.I32 d0,q0,q0uint32x2_t vaddhn_u64(uint64x2_t a, uint64x2_t b); // VADDHN.I64 d0,q0,q0ベ ク タ 丸 め 加 算 、 上 位 半 分int8x8_t vraddhn_s16(int16x8_t a, int16x8_t b); // VRADDHN.I16 d0,q0,q0int16x4_t vraddhn_s32(int32x4_t a, int32x4_t b); // VRADDHN.I32 d0,q0,q0int32x2_t vraddhn_s64(int64x2_t a, int64x2_t b); // VRADDHN.I64 d0,q0,q0uint8x8_t vraddhn_u16(uint16x8_t a, uint16x8_t b); // VRADDHN.I16 d0,q0,q0uint16x4_t vraddhn_u32(uint32x4_t a, uint32x4_t b); // VRADDHN.I32 d0,q0,q0uint32x2_t vraddhn_u64(uint64x2_t a, uint64x2_t b); // VRADDHN.I64 d0,q0,q0E-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用E.3.2乗 算以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 乗 算 を 含 む 演 算 に 使 用 し ます。ベクタ 乗 算 : vmul -> Vr[i] := Va[i] * Vb[i]int8x8_t vmul_s8(int8x8_t a, int8x8_t b); // VMUL.I8 d0,d0,d0int16x4_t vmul_s16(int16x4_t a, int16x4_t b); // VMUL.I16 d0,d0,d0int32x2_t vmul_s32(int32x2_t a, int32x2_t b); // VMUL.I32 d0,d0,d0float32x2_t vmul_f32(float32x2_t a, float32x2_t b); // VMUL.F32 d0,d0,d0uint8x8_t vmul_u8(uint8x8_t a, uint8x8_t b); // VMUL.I8 d0,d0,d0uint16x4_t vmul_u16(uint16x4_t a, uint16x4_t b); // VMUL.I16 d0,d0,d0uint32x2_t vmul_u32(uint32x2_t a, uint32x2_t b); // VMUL.I32 d0,d0,d0poly8x8_t vmul_p8(poly8x8_t a, poly8x8_t b); // VMUL.P8 d0,d0,d0int8x16_t vmulq_s8(int8x16_t a, int8x16_t b); // VMUL.I8 q0,q0,q0int16x8_t vmulq_s16(int16x8_t a, int16x8_t b); // VMUL.I16 q0,q0,q0int32x4_t vmulq_s32(int32x4_t a, int32x4_t b); // VMUL.I32 q0,q0,q0float32x4_t vmulq_f32(float32x4_t a, float32x4_t b); // VMUL.F32 q0,q0,q0uint8x16_t vmulq_u8(uint8x16_t a, uint8x16_t b); // VMUL.I8 q0,q0,q0uint16x8_t vmulq_u16(uint16x8_t a, uint16x8_t b); // VMUL.I16 q0,q0,q0uint32x4_t vmulq_u32(uint32x4_t a, uint32x4_t b); // VMUL.I32 q0,q0,q0poly8x16_t vmulq_p8(poly8x16_t a, poly8x16_t b); // VMUL.P8 q0,q0,q0ベクタ 積 和 : vmla -> Vr[i] := Va[i] + Vb[i] * Vc[i]int8x8_t vmla_s8(int8x8_t a, int8x8_t b, int8x8_t c); // VMLA.I8 d0,d0,d0int16x4_t vmla_s16(int16x4_t a, int16x4_t b, int16x4_t c); // VMLA.I16 d0,d0,d0int32x2_t vmla_s32(int32x2_t a, int32x2_t b, int32x2_t c); // VMLA.I32 d0,d0,d0float32x2_t vmla_f32(float32x2_t a, float32x2_t b, float32x2_t c); // VMLA.F32 d0,d0,d0uint8x8_t vmla_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); // VMLA.I8 d0,d0,d0uint16x4_t vmla_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c); // VMLA.I16 d0,d0,d0uint32x2_t vmla_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c); // VMLA.I32 d0,d0,d0int8x16_t vmlaq_s8(int8x16_t a, int8x16_t b, int8x16_t c); // VMLA.I8 q0,q0,q0int16x8_t vmlaq_s16(int16x8_t a, int16x8_t b, int16x8_t c); // VMLA.I16 q0,q0,q0int32x4_t vmlaq_s32(int32x4_t a, int32x4_t b, int32x4_t c); // VMLA.I32 q0,q0,q0float32x4_t vmlaq_f32(float32x4_t a, float32x4_t b, float32x4_t c); // VMLA.F32 q0,q0,q0uint8x16_t vmlaq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c); // VMLA.I8 q0,q0,q0uint16x8_t vmlaq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c); // VMLA.I16 q0,q0,q0uint32x4_t vmlaq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c); // VMLA.I32 q0,q0,q0ベクタ 積 和 (long) : vmla -> Vr[i] := Va[i] + Vb[i] * Vc[i]int16x8_t vmlal_s8(int16x8_t a, int8x8_t b, int8x8_t c); // VMLAL.S8 q0,d0,d0int32x4_t vmlal_s16(int32x4_t a, int16x4_t b, int16x4_t c); // VMLAL.S16 q0,d0,d0int64x2_t vmlal_s32(int64x2_t a, int32x2_t b, int32x2_t c); // VMLAL.S32 q0,d0,d0uint16x8_t vmlal_u8(uint16x8_t a, uint8x8_t b, uint8x8_t c); // VMLAL.U8 q0,d0,d0uint32x4_t vmlal_u16(uint32x4_t a, uint16x4_t b, uint16x4_t c); // VMLAL.U16 q0,d0,d0uint64x2_t vmlal_u32(uint64x2_t a, uint32x2_t b, uint32x2_t c); // VMLAL.U32 q0,d0,d0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-9ID 100419Non-Confidential,


NEON サポー ト の 使 用ベクタ 積 差 : vmls -> Vr[i] := Va[i] - Vb[i] * Vc[i]int8x8_t vmls_s8(int8x8_t a, int8x8_t b, int8x8_t c); // VMLS.I8 d0,d0,d0int16x4_t vmls_s16(int16x4_t a, int16x4_t b, int16x4_t c); // VMLS.I16 d0,d0,d0int32x2_t vmls_s32(int32x2_t a, int32x2_t b, int32x2_t c); // VMLS.I32 d0,d0,d0float32x2_t vmls_f32(float32x2_t a, float32x2_t b, float32x2_t c); // VMLS.F32 d0,d0,d0uint8x8_t vmls_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); // VMLS.I8 d0,d0,d0uint16x4_t vmls_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c); // VMLS.I16 d0,d0,d0uint32x2_t vmls_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c); // VMLS.I32 d0,d0,d0int8x16_t vmlsq_s8(int8x16_t a, int8x16_t b, int8x16_t c); // VMLS.I8 q0,q0,q0int16x8_t vmlsq_s16(int16x8_t a, int16x8_t b, int16x8_t c); // VMLS.I16 q0,q0,q0int32x4_t vmlsq_s32(int32x4_t a, int32x4_t b, int32x4_t c); // VMLS.I32 q0,q0,q0float32x4_t vmlsq_f32(float32x4_t a, float32x4_t b, float32x4_t c); // VMLS.F32 q0,q0,q0uint8x16_t vmlsq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c); // VMLS.I8 q0,q0,q0uint16x8_t vmlsq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c); // VMLS.I16 q0,q0,q0uint32x4_t vmlsq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c); // VMLS.I32 q0,q0,q0ベクタ 積 差 (long)int16x8_t vmlsl_s8(int16x8_t a, int8x8_t b, int8x8_t c); // VMLSL.S8 q0,d0,d0int32x4_t vmlsl_s16(int32x4_t a, int16x4_t b, int16x4_t c); // VMLSL.S16 q0,d0,d0int64x2_t vmlsl_s32(int64x2_t a, int32x2_t b, int32x2_t c); // VMLSL.S32 q0,d0,d0uint16x8_t vmlsl_u8(uint16x8_t a, uint8x8_t b, uint8x8_t c); // VMLSL.U8 q0,d0,d0uint32x4_t vmlsl_u16(uint32x4_t a, uint16x4_t b, uint16x4_t c); // VMLSL.U16 q0,d0,d0uint64x2_t vmlsl_u32(uint64x2_t a, uint32x2_t b, uint32x2_t c); // VMLSL.U32 q0,d0,d0ベ ク タサチ ュ レー ト ダブル 乗 算 、 上 位 半 分int16x4_t vqdmulh_s16(int16x4_t a, int16x4_t b); // VQDMULH.S16 d0,d0,d0int32x2_t vqdmulh_s32(int32x2_t a, int32x2_t b); // VQDMULH.S32 d0,d0,d0int16x8_t vqdmulhq_s16(int16x8_t a, int16x8_t b); // VQDMULH.S16 q0,q0,q0int32x4_t vqdmulhq_s32(int32x4_t a, int32x4_t b); // VQDMULH.S32 q0,q0,q0サチ ュ レー ト 丸 めベク タ ダブル 乗 算 、 上 位 半 分int16x4_t vqrdmulh_s16(int16x4_t a, int16x4_t b); // VQRDMULH.S16 d0,d0,d0int32x2_t vqrdmulh_s32(int32x2_t a, int32x2_t b); // VQRDMULH.S32 d0,d0,d0int16x8_t vqrdmulhq_s16(int16x8_t a, int16x8_t b); // VQRDMULH.S16 q0,q0,q0int32x4_t vqrdmulhq_s32(int32x4_t a, int32x4_t b); // VQRDMULH.S32 q0,q0,q0サチ ュ レー ト ベ ク タ ダブル 積 和 (long)int32x4_t vqdmlal_s16(int32x4_t a, int16x4_t b, int16x4_t c); // VQDMLAL.S16 q0,d0,d0int64x2_t vqdmlal_s32(int64x2_t a, int32x2_t b, int32x2_t c); // VQDMLAL.S32 q0,d0,d0E-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用サチュレー ト ベク タダブル 積 差 (long)int32x4_t vqdmlsl_s16(int32x4_t a, int16x4_t b, int16x4_t c); // VQDMLSL.S16 q0,d0,d0int64x2_t vqdmlsl_s32(int64x2_t a, int32x2_t b, int32x2_t c); // VQDMLSL.S32 q0,d0,d0ベクタ 乗 算 (long)int16x8_t vmull_s8(int8x8_t a, int8x8_t b); // VMULL.S8 q0,d0,d0int32x4_t vmull_s16(int16x4_t a, int16x4_t b); // VMULL.S16 q0,d0,d0int64x2_t vmull_s32(int32x2_t a, int32x2_t b); // VMULL.S32 q0,d0,d0uint16x8_t vmull_u8(uint8x8_t a, uint8x8_t b); // VMULL.U8 q0,d0,d0uint32x4_t vmull_u16(uint16x4_t a, uint16x4_t b); // VMULL.U16 q0,d0,d0uint64x2_t vmull_u32(uint32x2_t a, uint32x2_t b); // VMULL.U32 q0,d0,d0poly16x8_t vmull_p8(poly8x8_t a, poly8x8_t b); // VMULL.P8 q0,d0,d0サチュレー ト ベク タダブル 乗 算 (long)int32x4_t vqdmull_s16(int16x4_t a, int16x4_t b); // VQDMULL.S16 q0,d0,d0int64x2_t vqdmull_s32(int32x2_t a, int32x2_t b); // VQDMULL.S32 q0,d0,d0E.3.3減 算以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 減 算 を 含 む 演 算 に 使 用 し ます。ベクタ 減 算int8x8_t vsub_s8(int8x8_t a, int8x8_t b); // VSUB.I8 d0,d0,d0int16x4_t vsub_s16(int16x4_t a, int16x4_t b); // VSUB.I16 d0,d0,d0int32x2_t vsub_s32(int32x2_t a, int32x2_t b); // VSUB.I32 d0,d0,d0int64x1_t vsub_s64(int64x1_t a, int64x1_t b); // VSUB.I64 d0,d0,d0float32x2_t vsub_f32(float32x2_t a, float32x2_t b); // VSUB.F32 d0,d0,d0uint8x8_t vsub_u8(uint8x8_t a, uint8x8_t b); // VSUB.I8 d0,d0,d0uint16x4_t vsub_u16(uint16x4_t a, uint16x4_t b); // VSUB.I16 d0,d0,d0uint32x2_t vsub_u32(uint32x2_t a, uint32x2_t b); // VSUB.I32 d0,d0,d0uint64x1_t vsub_u64(uint64x1_t a, uint64x1_t b); // VSUB.I64 d0,d0,d0int8x16_t vsubq_s8(int8x16_t a, int8x16_t b); // VSUB.I8 q0,q0,q0int16x8_t vsubq_s16(int16x8_t a, int16x8_t b); // VSUB.I16 q0,q0,q0int32x4_t vsubq_s32(int32x4_t a, int32x4_t b); // VSUB.I32 q0,q0,q0int64x2_t vsubq_s64(int64x2_t a, int64x2_t b); // VSUB.I64 q0,q0,q0float32x4_t vsubq_f32(float32x4_t a, float32x4_t b); // VSUB.F32 q0,q0,q0uint8x16_t vsubq_u8(uint8x16_t a, uint8x16_t b); // VSUB.I8 q0,q0,q0uint16x8_t vsubq_u16(uint16x8_t a, uint16x8_t b); // VSUB.I16 q0,q0,q0uint32x4_t vsubq_u32(uint32x4_t a, uint32x4_t b); // VSUB.I32 q0,q0,q0uint64x2_t vsubq_u64(uint64x2_t a, uint64x2_t b); // VSUB.I64 q0,q0,q0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-11ID 100419Non-Confidential,


NEON サポー ト の 使 用ベクタ 減 算 (long) : vsub -> Vr[i]:=Va[i]+Vb[i]int16x8_t vsubl_s8(int8x8_t a, int8x8_t b); // VSUBL.S8 q0,d0,d0int32x4_t vsubl_s16(int16x4_t a, int16x4_t b); // VSUBL.S16 q0,d0,d0int64x2_t vsubl_s32(int32x2_t a, int32x2_t b); // VSUBL.S32 q0,d0,d0uint16x8_t vsubl_u8(uint8x8_t a, uint8x8_t b); // VSUBL.U8 q0,d0,d0uint32x4_t vsubl_u16(uint16x4_t a, uint16x4_t b); // VSUBL.U16 q0,d0,d0uint64x2_t vsubl_u32(uint32x2_t a, uint32x2_t b); // VSUBL.U32 q0,d0,d0ベクタ 減 算 (ワイド): vsub -> Vr[i]:=Va[i]+Vb[i]int16x8_t vsubw_s8(int16x8_t a, int8x8_t b); // VSUBW.S8 q0,q0,d0int32x4_t vsubw_s16(int32x4_t a, int16x4_t b); // VSUBW.S16 q0,q0,d0int64x2_t vsubw_s32(int64x2_t a, int32x2_t b); // VSUBW.S32 q0,q0,d0uint16x8_t vsubw_u8(uint16x8_t a, uint8x8_t b); // VSUBW.U8 q0,q0,d0uint32x4_t vsubw_u16(uint32x4_t a, uint16x4_t b); // VSUBW.U16 q0,q0,d0uint64x2_t vsubw_u32(uint64x2_t a, uint32x2_t b); // VSUBW.U32 q0,q0,d0サチュレー ト ベク タ 減 算int8x8_t vqsub_s8(int8x8_t a, int8x8_t b); // VQSUB.S8 d0,d0,d0int16x4_t vqsub_s16(int16x4_t a, int16x4_t b); // VQSUB.S16 d0,d0,d0int32x2_t vqsub_s32(int32x2_t a, int32x2_t b); // VQSUB.S32 d0,d0,d0int64x1_t vqsub_s64(int64x1_t a, int64x1_t b); // VQSUB.S64 d0,d0,d0uint8x8_t vqsub_u8(uint8x8_t a, uint8x8_t b); // VQSUB.U8 d0,d0,d0uint16x4_t vqsub_u16(uint16x4_t a, uint16x4_t b); // VQSUB.U16 d0,d0,d0uint32x2_t vqsub_u32(uint32x2_t a, uint32x2_t b); // VQSUB.U32 d0,d0,d0uint64x1_t vqsub_u64(uint64x1_t a, uint64x1_t b); // VQSUB.U64 d0,d0,d0int8x16_t vqsubq_s8(int8x16_t a, int8x16_t b); // VQSUB.S8 q0,q0,q0int16x8_t vqsubq_s16(int16x8_t a, int16x8_t b); // VQSUB.S16 q0,q0,q0int32x4_t vqsubq_s32(int32x4_t a, int32x4_t b); // VQSUB.S32 q0,q0,q0int64x2_t vqsubq_s64(int64x2_t a, int64x2_t b); // VQSUB.S64 q0,q0,q0uint8x16_t vqsubq_u8(uint8x16_t a, uint8x16_t b); // VQSUB.U8 q0,q0,q0uint16x8_t vqsubq_u16(uint16x8_t a, uint16x8_t b); // VQSUB.U16 q0,q0,q0uint32x4_t vqsubq_u32(uint32x4_t a, uint32x4_t b); // VQSUB.U32 q0,q0,q0uint64x2_t vqsubq_u64(uint64x2_t a, uint64x2_t b); // VQSUB.U64 q0,q0,q0ベ ク タ 二 分 減 算int8x8_t vhsub_s8(int8x8_t a, int8x8_t b); // VHSUB.S8 d0,d0,d0int16x4_t vhsub_s16(int16x4_t a, int16x4_t b); // VHSUB.S16 d0,d0,d0int32x2_t vhsub_s32(int32x2_t a, int32x2_t b); // VHSUB.S32 d0,d0,d0uint8x8_t vhsub_u8(uint8x8_t a, uint8x8_t b); // VHSUB.U8 d0,d0,d0uint16x4_t vhsub_u16(uint16x4_t a, uint16x4_t b); // VHSUB.U16 d0,d0,d0uint32x2_t vhsub_u32(uint32x2_t a, uint32x2_t b); // VHSUB.U32 d0,d0,d0int8x16_t vhsubq_s8(int8x16_t a, int8x16_t b); // VHSUB.S8 q0,q0,q0int16x8_t vhsubq_s16(int16x8_t a, int16x8_t b); // VHSUB.S16 q0,q0,q0int32x4_t vhsubq_s32(int32x4_t a, int32x4_t b); // VHSUB.S32 q0,q0,q0E-12 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用uint8x16_t vhsubq_u8(uint8x16_t a, uint8x16_t b); // VHSUB.U8 q0,q0,q0uint16x8_t vhsubq_u16(uint16x8_t a, uint16x8_t b); // VHSUB.U16 q0,q0,q0uint32x4_t vhsubq_u32(uint32x4_t a, uint32x4_t b); // VHSUB.U32 q0,q0,q0ベク タ 減 算 、 上 位 半 分int8x8_t vsubhn_s16(int16x8_t a, int16x8_t b); // VSUBHN.I16 d0,q0,q0int16x4_t vsubhn_s32(int32x4_t a, int32x4_t b); // VSUBHN.I32 d0,q0,q0int32x2_t vsubhn_s64(int64x2_t a, int64x2_t b); // VSUBHN.I64 d0,q0,q0uint8x8_t vsubhn_u16(uint16x8_t a, uint16x8_t b); // VSUBHN.I16 d0,q0,q0uint16x4_t vsubhn_u32(uint32x4_t a, uint32x4_t b); // VSUBHN.I32 d0,q0,q0uint32x2_t vsubhn_u64(uint64x2_t a, uint64x2_t b); // VSUBHN.I64 d0,q0,q0丸 めベ ク タ 減 算 、 上 位 半 分int8x8_t vrsubhn_s16(int16x8_t a, int16x8_t b); // VRSUBHN.I16 d0,q0,q0int16x4_t vrsubhn_s32(int32x4_t a, int32x4_t b); // VRSUBHN.I32 d0,q0,q0int32x2_t vrsubhn_s64(int64x2_t a, int64x2_t b); // VRSUBHN.I64 d0,q0,q0uint8x8_t vrsubhn_u16(uint16x8_t a, uint16x8_t b); // VRSUBHN.I16 d0,q0,q0uint16x4_t vrsubhn_u32(uint32x4_t a, uint32x4_t b); // VRSUBHN.I32 d0,q0,q0uint32x2_t vrsubhn_u64(uint64x2_t a, uint64x2_t b); // VRSUBHN.I64 d0,q0,q0E.3.4比 較多 様 な 比 較 用 コ ンパイ ラ 組 み 込 み 関 数 が 用 意 さ れています。 あるレーンに 関し て 比 較 が 真 であ る 場 合 、 そのレーンの 結 果 はすべてのビ ッ ト が 1 に 設 定 されます。 あ る レーンに 関 し て 比 較 が 偽 であ る 場 合 、 すべてのビ ッ ト は 0 に 設 定されます。 戻 り 値 の 型 は 符 号 な し 整 数 です。 これは、 比 較 の 結 果 を vbsl コンパイ ラ 組 み 込 み 関 数 の 最 初 の 引 数 と し て 使 用 で き る こ と を 意 味 し ます。ベクタ 比 較 ( 等 しい)uint8x8_t vceq_s8(int8x8_t a, int8x8_t b);// VCEQ.I8 d0, d0, d0uint16x4_t vceq_s16(int16x4_t a, int16x4_t b); // VCEQ.I16 d0, d0, d0uint32x2_t vceq_s32(int32x2_t a, int32x2_t b); // VCEQ.I32 d0, d0, d0uint32x2_t vceq_f32(float32x2_t a, float32x2_t b); // VCEQ.F32 d0, d0, d0uint8x8_t vceq_u8(uint8x8_t a, uint8x8_t b); // VCEQ.I8 d0, d0, d0uint16x4_t vceq_u16(uint16x4_t a, uint16x4_t b); // VCEQ.I16 d0, d0, d0uint32x2_t vceq_u32(uint32x2_t a, uint32x2_t b); // VCEQ.I32 d0, d0, d0uint8x8_t vceq_p8(poly8x8_t a, poly8x8_t b); // VCEQ.I8 d0, d0, d0uint8x16_t vceqq_s8(int8x16_t a, int8x16_t b); // VCEQ.I8 q0, q0, q0uint16x8_t vceqq_s16(int16x8_t a, int16x8_t b); // VCEQ.I16 q0, q0, q0uint32x4_t vceqq_s32(int32x4_t a, int32x4_t b); // VCEQ.I32 q0, q0, q0uint32x4_t vceqq_f32(float32x4_t a, float32x4_t b); // VCEQ.F32 q0, q0, q0uint8x16_t vceqq_u8(uint8x16_t a, uint8x16_t b); // VCEQ.I8 q0, q0, q0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-13ID 100419Non-Confidential,


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 vcge_s8(int8x8_t a, int8x8_t b);// VCGE.S8 d0, d0, d0uint16x4_t vcge_s16(int16x4_t a, int16x4_t b); // VCGE.S16 d0, d0, d0uint32x2_t vcge_s32(int32x2_t a, int32x2_t b); // VCGE.S32 d0, d0, d0uint32x2_t vcge_f32(float32x2_t a, float32x2_t b); // VCGE.F32 d0, d0, d0uint8x8_t vcge_u8(uint8x8_t a, uint8x8_t b); // VCGE.U8 d0, d0, d0uint16x4_t vcge_u16(uint16x4_t a, uint16x4_t b); // VCGE.U16 d0, d0, d0uint32x2_t vcge_u32(uint32x2_t a, uint32x2_t b); // VCGE.U32 d0, d0, d0uint8x16_t vcgeq_s8(int8x16_t a, int8x16_t b); // VCGE.S8 q0, q0, q0uint16x8_t vcgeq_s16(int16x8_t a, int16x8_t b); // VCGE.S16 q0, q0, q0uint32x4_t vcgeq_s32(int32x4_t a, int32x4_t b); // VCGE.S32 q0, q0, q0uint32x4_t vcgeq_f32(float32x4_t a, float32x4_t b); // VCGE.F32 q0, q0, q0uint8x16_t vcgeq_u8(uint8x16_t a, uint8x16_t b); // VCGE.U8 q0, q0, q0uint16x8_t vcgeq_u16(uint16x8_t a, uint16x8_t b); // VCGE.U16 q0, q0, q0uint32x4_t vcgeq_u32(uint32x4_t a, uint32x4_t b); // VCGE.U32 q0, q0, q0ベ ク タ 比 較 ( 以 下 )uint8x8_t vcle_s8(int8x8_t a, int8x8_t b);// VCGE.S8 d0, d0, d0uint16x4_t vcle_s16(int16x4_t a, int16x4_t b); // VCGE.S16 d0, d0, d0uint32x2_t vcle_s32(int32x2_t a, int32x2_t b); // VCGE.S32 d0, d0, d0uint32x2_t vcle_f32(float32x2_t a, float32x2_t b); // VCGE.F32 d0, d0, d0uint8x8_t vcle_u8(uint8x8_t a, uint8x8_t b); // VCGE.U8 d0, d0, d0uint16x4_t vcle_u16(uint16x4_t a, uint16x4_t b); // VCGE.U16 d0, d0, d0uint32x2_t vcle_u32(uint32x2_t a, uint32x2_t b); // VCGE.U32 d0, d0, d0uint8x16_t vcleq_s8(int8x16_t a, int8x16_t b); // VCGE.S8 q0, q0, q0uint16x8_t vcleq_s16(int16x8_t a, int16x8_t b); // VCGE.S16 q0, q0, q0uint32x4_t vcleq_s32(int32x4_t a, int32x4_t b); // VCGE.S32 q0, q0, q0uint32x4_t vcleq_f32(float32x4_t a, float32x4_t b); // VCGE.F32 q0, q0, q0uint8x16_t vcleq_u8(uint8x16_t a, uint8x16_t b); // VCGE.U8 q0, q0, q0uint16x8_t vcleq_u16(uint16x8_t a, uint16x8_t b); // VCGE.U16 q0, q0, q0uint32x4_t vcleq_u32(uint32x4_t a, uint32x4_t b); // VCGE.U32 q0, q0, q0ベクタ 比 較 (より 大 きい)uint8x8_t vcgt_s8(int8x8_t a, int8x8_t b);// VCGT.S8 d0, d0, d0uint16x4_t vcgt_s16(int16x4_t a, int16x4_t b); // VCGT.S16 d0, d0, d0uint32x2_t vcgt_s32(int32x2_t a, int32x2_t b); // VCGT.S32 d0, d0, d0uint32x2_t vcgt_f32(float32x2_t a, float32x2_t b); // VCGT.F32 d0, d0, d0uint8x8_t vcgt_u8(uint8x8_t a, uint8x8_t b); // VCGT.U8 d0, d0, d0uint16x4_t vcgt_u16(uint16x4_t a, uint16x4_t b); // VCGT.U16 d0, d0, d0uint32x2_t vcgt_u32(uint32x2_t a, uint32x2_t b); // VCGT.U32 d0, d0, d0uint8x16_t vcgtq_s8(int8x16_t a, int8x16_t b); // VCGT.S8 q0, q0, q0E-14 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用uint16x8_t vcgtq_s16(int16x8_t a, int16x8_t b); // VCGT.S16 q0, q0, q0uint32x4_t vcgtq_s32(int32x4_t a, int32x4_t b); // VCGT.S32 q0, q0, q0uint32x4_t vcgtq_f32(float32x4_t a, float32x4_t b); // VCGT.F32 q0, q0, q0uint8x16_t vcgtq_u8(uint8x16_t a, uint8x16_t b); // VCGT.U8 q0, q0, q0uint16x8_t vcgtq_u16(uint16x8_t a, uint16x8_t b); // VCGT.U16 q0, q0, q0uint32x4_t vcgtq_u32(uint32x4_t a, uint32x4_t b); // VCGT.U32 q0, q0, q0ベクタ 比 較 (より 小 さい)uint8x8_t vclt_s8(int8x8_t a, int8x8_t b);// VCGT.S8 d0, d0, d0uint16x4_t vclt_s16(int16x4_t a, int16x4_t b); // VCGT.S16 d0, d0, d0uint32x2_t vclt_s32(int32x2_t a, int32x2_t b); // VCGT.S32 d0, d0, d0uint32x2_t vclt_f32(float32x2_t a, float32x2_t b); // VCGT.F32 d0, d0, d0uint8x8_t vclt_u8(uint8x8_t a, uint8x8_t b); // VCGT.U8 d0, d0, d0uint16x4_t vclt_u16(uint16x4_t a, uint16x4_t b); // VCGT.U16 d0, d0, d0uint32x2_t vclt_u32(uint32x2_t a, uint32x2_t b); // VCGT.U32 d0, d0, d0uint8x16_t vcltq_s8(int8x16_t a, int8x16_t b); // VCGT.S8 q0, q0, q0uint16x8_t vcltq_s16(int16x8_t a, int16x8_t b); // VCGT.S16 q0, q0, q0uint32x4_t vcltq_s32(int32x4_t a, int32x4_t b); // VCGT.S32 q0, q0, q0uint32x4_t vcltq_f32(float32x4_t a, float32x4_t b); // VCGT.F32 q0, q0, q0uint8x16_t vcltq_u8(uint8x16_t a, uint8x16_t b); // VCGT.U8 q0, q0, q0uint16x8_t vcltq_u16(uint16x8_t a, uint16x8_t b); // VCGT.U16 q0, q0, q0uint32x4_t vcltq_u32(uint32x4_t a, uint32x4_t b); // VCGT.U32 q0, q0, q0ベク タ 絶 対 値 比 較 ( 以 上 )uint32x2_t vcage_f32(float32x2_t a, float32x2_t b); // VACGE.F32 d0, d0, d0uint32x4_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, d0uint32x4_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, d0uint32x4_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, d0uint32x4_t vcaltq_f32(float32x4_t a, float32x4_t b); // VACGT.F32 q0, q0, q0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-15ID 100419Non-Confidential,


NEON サポー ト の 使 用ベクタテストビッ トuint8x8_t vtst_s8(int8x8_t a, int8x8_t b); // VTST.8 d0, d0, d0uint16x4_t vtst_s16(int16x4_t a, int16x4_t b); // VTST.16 d0, d0, d0uint32x2_t vtst_s32(int32x2_t a, int32x2_t b); // VTST.32 d0, d0, d0uint8x8_t vtst_u8(uint8x8_t a, uint8x8_t b); // VTST.8 d0, d0, d0uint16x4_t vtst_u16(uint16x4_t a, uint16x4_t b); // VTST.16 d0, d0, d0uint32x2_t vtst_u32(uint32x2_t a, uint32x2_t b); // VTST.32 d0, d0, d0uint8x8_t vtst_p8(poly8x8_t a, poly8x8_t b); // VTST.8 d0, d0, d0uint8x16_t vtstq_s8(int8x16_t a, int8x16_t b); // VTST.8 q0, q0, q0uint16x8_t vtstq_s16(int16x8_t a, int16x8_t b); // VTST.16 q0, q0, q0uint32x4_t vtstq_s32(int32x4_t a, int32x4_t b); // VTST.32 q0, q0, q0uint8x16_t vtstq_u8(uint8x16_t a, uint8x16_t b); // VTST.8 q0, q0, q0uint16x8_t vtstq_u16(uint16x8_t a, uint16x8_t b); // VTST.16 q0, q0, q0uint32x4_t vtstq_u32(uint32x4_t a, uint32x4_t b); // VTST.32 q0, q0, q0uint8x16_t vtstq_p8(poly8x16_t a, poly8x16_t b); // VTST.8 q0, q0, q0E.3.5絶 対 差以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 絶 対 差 を 含 む 演 算 に 使 用 し ます。引 数 間 の 絶 対 差 Vr[i] = | Va[i] - Vb[i] |int8x8_t vabd_s8(int8x8_t a, int8x8_t b); // VABD.S8 d0,d0,d0int16x4_t vabd_s16(int16x4_t a, int16x4_t b); // VABD.S16 d0,d0,d0int32x2_t vabd_s32(int32x2_t a, int32x2_t b); // VABD.S32 d0,d0,d0uint8x8_t vabd_u8(uint8x8_t a, uint8x8_t b); // VABD.U8 d0,d0,d0uint16x4_t vabd_u16(uint16x4_t a, uint16x4_t b); // VABD.U16 d0,d0,d0uint32x2_t vabd_u32(uint32x2_t a, uint32x2_t b); // VABD.U32 d0,d0,d0float32x2_t vabd_f32(float32x2_t a, float32x2_t b); // VABD.F32 d0,d0,d0int8x16_t vabdq_s8(int8x16_t a, int8x16_t b); // VABD.S8 q0,q0,q0int16x8_t vabdq_s16(int16x8_t a, int16x8_t b); // VABD.S16 q0,q0,q0int32x4_t vabdq_s32(int32x4_t a, int32x4_t b); // VABD.S32 q0,q0,q0uint8x16_t vabdq_u8(uint8x16_t a, uint8x16_t b); // VABD.U8 q0,q0,q0uint16x8_t vabdq_u16(uint16x8_t a, uint16x8_t b); // VABD.U16 q0,q0,q0uint32x4_t vabdq_u32(uint32x4_t a, uint32x4_t b); // VABD.U32 q0,q0,q0float32x4_t vabdq_f32(float32x4_t a, float32x4_t b); // VABD.F32 q0,q0,q0絶 対 差 (long)int16x8_t vabdl_s8(int8x8_t a, int8x8_t b); // VABDL.S8 q0,d0,d0int32x4_t vabdl_s16(int16x4_t a, int16x4_t b); // VABDL.S16 q0,d0,d0int64x2_t vabdl_s32(int32x2_t a, int32x2_t b); // VABDL.S32 q0,d0,d0uint16x8_t vabdl_u8(uint8x8_t a, uint8x8_t b); // VABDL.U8 q0,d0,d0uint32x4_t vabdl_u16(uint16x4_t a, uint16x4_t b); // VABDL.U16 q0,d0,d0uint64x2_t vabdl_u32(uint32x2_t a, uint32x2_t b); // VABDL.U32 q0,d0,d0E-16 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用絶 対 差 と 累 積 Vr[i] = Va[i] + | Vb[i] - Vc[i] |int8x8_t vaba_s8(int8x8_t a, int8x8_t b, int8x8_t c); // VABA.S8 d0,d0,d0int16x4_t vaba_s16(int16x4_t a, int16x4_t b, int16x4_t c); // VABA.S16 d0,d0,d0int32x2_t vaba_s32(int32x2_t a, int32x2_t b, int32x2_t c); // VABA.S32 d0,d0,d0uint8x8_t vaba_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); // VABA.U8 d0,d0,d0uint16x4_t vaba_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c); // VABA.U16 d0,d0,d0uint32x2_t vaba_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c); // VABA.U32 d0,d0,d0int8x16_t vabaq_s8(int8x16_t a, int8x16_t b, int8x16_t c); // VABA.S8 q0,q0,q0int16x8_t vabaq_s16(int16x8_t a, int16x8_t b, int16x8_t c); // VABA.S16 q0,q0,q0int32x4_t vabaq_s32(int32x4_t a, int32x4_t b, int32x4_t c); // VABA.S32 q0,q0,q0uint8x16_t vabaq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c); // VABA.U8 q0,q0,q0uint16x8_t vabaq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c); // VABA.U16 q0,q0,q0uint32x4_t vabaq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c); // VABA.U32 q0,q0,q0絶 対 差 と 累 積 (long)int16x8_t vabal_s8(int16x8_t a, int8x8_t b, int8x8_t c); // VABAL.S8 q0,d0,d0int32x4_t vabal_s16(int32x4_t a, int16x4_t b, int16x4_t c); // VABAL.S16 q0,d0,d0int64x2_t vabal_s32(int64x2_t a, int32x2_t b, int32x2_t c); // VABAL.S32 q0,d0,d0uint16x8_t vabal_u8(uint16x8_t a, uint8x8_t b, uint8x8_t c); // VABAL.U8 q0,d0,d0uint32x4_t vabal_u16(uint32x4_t a, uint16x4_t b, uint16x4_t c); // VABAL.U16 q0,d0,d0uint64x2_t vabal_u32(uint64x2_t a, uint32x2_t b, uint32x2_t c); // VABAL.U32 q0,d0,d0E.3.6最 大 / 最 小以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 最 大 値 および 最 小 値 を 必 要 と する 演 算 に使 用 し ます。vmax -> Vr[i] := (Va[i] >= Vb[i]) ? Va[i] : Vb[i]int8x8_t vmax_s8(int8x8_t a, int8x8_t b); // VMAX.S8 d0,d0,d0int16x4_t vmax_s16(int16x4_t a, int16x4_t b); // VMAX.S16 d0,d0,d0int32x2_t vmax_s32(int32x2_t a, int32x2_t b); // VMAX.S32 d0,d0,d0uint8x8_t vmax_u8(uint8x8_t a, uint8x8_t b); // VMAX.U8 d0,d0,d0uint16x4_t vmax_u16(uint16x4_t a, uint16x4_t b); // VMAX.U16 d0,d0,d0uint32x2_t vmax_u32(uint32x2_t a, uint32x2_t b); // VMAX.U32 d0,d0,d0float32x2_t vmax_f32(float32x2_t a, float32x2_t b); // VMAX.F32 d0,d0,d0int8x16_t vmaxq_s8(int8x16_t a, int8x16_t b); // VMAX.S8 q0,q0,q0int16x8_t vmaxq_s16(int16x8_t a, int16x8_t b); // VMAX.S16 q0,q0,q0int32x4_t vmaxq_s32(int32x4_t a, int32x4_t b); // VMAX.S32 q0,q0,q0uint8x16_t vmaxq_u8(uint8x16_t a, uint8x16_t b); // VMAX.U8 q0,q0,q0uint16x8_t vmaxq_u16(uint16x8_t a, uint16x8_t b); // VMAX.U16 q0,q0,q0uint32x4_t vmaxq_u32(uint32x4_t a, uint32x4_t b); // VMAX.U32 q0,q0,q0float32x4_t vmaxq_f32(float32x4_t a, float32x4_t b); // VMAX.F32 q0,q0,q0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-17ID 100419Non-Confidential,


NEON サポー ト の 使 用vmin -> Vr[i] := (Va[i] >= Vb[i]) ? Vb[i] : Va[i]int8x8_t vmin_s8(int8x8_t a, int8x8_t b); // VMIN.S8 d0,d0,d0int16x4_t vmin_s16(int16x4_t a, int16x4_t b); // VMIN.S16 d0,d0,d0int32x2_t vmin_s32(int32x2_t a, int32x2_t b); // VMIN.S32 d0,d0,d0uint8x8_t vmin_u8(uint8x8_t a, uint8x8_t b); // VMIN.U8 d0,d0,d0uint16x4_t vmin_u16(uint16x4_t a, uint16x4_t b); // VMIN.U16 d0,d0,d0uint32x2_t vmin_u32(uint32x2_t a, uint32x2_t b); // VMIN.U32 d0,d0,d0float32x2_t vmin_f32(float32x2_t a, float32x2_t b); // VMIN.F32 d0,d0,d0int8x16_t vminq_s8(int8x16_t a, int8x16_t b); // VMIN.S8 q0,q0,q0int16x8_t vminq_s16(int16x8_t a, int16x8_t b); // VMIN.S16 q0,q0,q0int32x4_t vminq_s32(int32x4_t a, int32x4_t b); // VMIN.S32 q0,q0,q0uint8x16_t vminq_u8(uint8x16_t a, uint8x16_t b); // VMIN.U8 q0,q0,q0uint16x8_t vminq_u16(uint16x8_t a, uint16x8_t b); // VMIN.U16 q0,q0,q0uint32x4_t vminq_u32(uint32x4_t a, uint32x4_t b); // VMIN.U32 q0,q0,q0float32x4_t vminq_f32(float32x4_t a, float32x4_t b); // VMIN.F32 q0,q0,q0E.3.7対 加 算以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 対 加 算 演 算 に 使 用 し ます。対 加 算int8x8_t vpadd_s8(int8x8_t a, int8x8_t b); // VPADD.I8 d0,d0,d0int16x4_t vpadd_s16(int16x4_t a, int16x4_t b); // VPADD.I16 d0,d0,d0int32x2_t vpadd_s32(int32x2_t a, int32x2_t b); // VPADD.I32 d0,d0,d0uint8x8_t vpadd_u8(uint8x8_t a, uint8x8_t b); // VPADD.I8 d0,d0,d0uint16x4_t vpadd_u16(uint16x4_t a, uint16x4_t b); // VPADD.I16 d0,d0,d0uint32x2_t vpadd_u32(uint32x2_t a, uint32x2_t b); // VPADD.I32 d0,d0,d0float32x2_t vpadd_f32(float32x2_t a, float32x2_t b); // VPADD.F32 d0,d0,d0対 加 算 (long)int16x4_t vpaddl_s8(int8x8_t a); // VPADDL.S8 d0,d0int32x2_t vpaddl_s16(int16x4_t a); // VPADDL.S16 d0,d0int64x1_t vpaddl_s32(int32x2_t a); // VPADDL.S32 d0,d0uint16x4_t vpaddl_u8(uint8x8_t a); // VPADDL.U8 d0,d0uint32x2_t vpaddl_u16(uint16x4_t a); // VPADDL.U16 d0,d0uint64x1_t vpaddl_u32(uint32x2_t a); // VPADDL.U32 d0,d0int16x8_t vpaddlq_s8(int8x16_t a); // VPADDL.S8 q0,q0int32x4_t vpaddlq_s16(int16x8_t a); // VPADDL.S16 q0,q0int64x2_t vpaddlq_s32(int32x4_t a); // VPADDL.S32 q0,q0uint16x8_t vpaddlq_u8(uint8x16_t a); // VPADDL.U8 q0,q0uint32x4_t vpaddlq_u16(uint16x8_t a); // VPADDL.U16 q0,q0uint64x2_t vpaddlq_u32(uint32x4_t a); // VPADDL.U32 q0,q0E-18 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用対 加 算 および 加 算 累 積int16x4_t vpadal_s8(int16x4_t a, int8x8_t b); // VPADAL.S8 d0,d0int32x2_t vpadal_s16(int32x2_t a, int16x4_t b); // VPADAL.S16 d0,d0int64x1_t vpadal_s32(int64x1_t a, int32x2_t b); // VPADAL.S32 d0,d0uint16x4_t vpadal_u8(uint16x4_t a, uint8x8_t b); // VPADAL.U8 d0,d0uint32x2_t vpadal_u16(uint32x2_t a, uint16x4_t b); // VPADAL.U16 d0,d0uint64x1_t vpadal_u32(uint64x1_t a, uint32x2_t b); // VPADAL.U32 d0,d0int16x8_t vpadalq_s8(int16x8_t a, int8x16_t b); // VPADAL.S8 q0,q0int32x4_t vpadalq_s16(int32x4_t a, int16x8_t b); // VPADAL.S16 q0,q0int64x2_t vpadalq_s32(int64x2_t a, int32x4_t b); // VPADAL.S32 q0,q0uint16x8_t vpadalq_u8(uint16x8_t a, uint8x16_t b); // VPADAL.U8 q0,q0uint32x4_t vpadalq_u16(uint32x4_t a, uint16x8_t b); // VPADAL.U16 q0,q0uint64x2_t vpadalq_u32(uint64x2_t a, uint32x4_t b); // VPADAL.U32 q0,q0E.3.8最 大 値 の 畳 み 込 みvpmax -> 隣 接 する 対 の 最 大 値 を 取 得 し ます。int8x8_t vpmax_s8(int8x8_t a, int8x8_t b); // VPMAX.S8 d0,d0,d0int16x4_t vpmax_s16(int16x4_t a, int16x4_t b); // VPMAX.S16 d0,d0,d0int32x2_t vpmax_s32(int32x2_t a, int32x2_t b); // VPMAX.S32 d0,d0,d0uint8x8_t vpmax_u8(uint8x8_t a, uint8x8_t b); // VPMAX.U8 d0,d0,d0uint16x4_t vpmax_u16(uint16x4_t a, uint16x4_t b); // VPMAX.U16 d0,d0,d0uint32x2_t vpmax_u32(uint32x2_t a, uint32x2_t b); // VPMAX.U32 d0,d0,d0float32x2_t vpmax_f32(float32x2_t a, float32x2_t b); // VPMAX.F32 d0,d0,d0E.3.9最 小 値 の 畳 み 込 みvpmin -> 隣 接 する 対 の 最 小 値 を 取 得 し ます。int8x8_t vpmin_s8(int8x8_t a, int8x8_t b); // VPMIN.S8 d0,d0,d0int16x4_t vpmin_s16(int16x4_t a, int16x4_t b); // VPMIN.S16 d0,d0,d0int32x2_t vpmin_s32(int32x2_t a, int32x2_t b); // VPMIN.S32 d0,d0,d0uint8x8_t vpmin_u8(uint8x8_t a, uint8x8_t b); // VPMIN.U8 d0,d0,d0uint16x4_t vpmin_u16(uint16x4_t a, uint16x4_t b); // VPMIN.U16 d0,d0,d0uint32x2_t vpmin_u32(uint32x2_t a, uint32x2_t b); // VPMIN.U32 d0,d0,d0float32x2_t vpmin_f32(float32x2_t a, float32x2_t b); // VPMIN.F32 d0,d0,d0E.3.10逆 数 / 平 方 根逆 数 の 推 定 / ステップと 1/ 逆 平 方 根 の 推 定 / ステップです。float32x2_t vrecps_f32(float32x2_t a, float32x2_t b); // VRECPS.F32 d0, d0, d0float32x4_t vrecpsq_f32(float32x4_t a, float32x4_t b); // VRECPS.F32 q0, q0, q0float32x2_t vrsqrts_f32(float32x2_t a, float32x2_t b); // VRSQRTS.F32 d0, d0, d0float32x4_t vrsqrtsq_f32(float32x4_t a, float32x4_t b); // VRSQRTS.F32 q0, q0, q0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-19ID 100419Non-Confidential,


NEON サポー ト の 使 用E.3.11符 号 付 き 変 数 によ るシ フ ト以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 符 合 付 き 変 数 に よ る シフ ト を 含 む 演 算 に使 用 し ます。ベクタ 左 シフ ト : Vr[i] := Va[i]


NEON サポー ト の 使 用int64x1_t vrshl_s64(int64x1_t a, int64x1_t b); // VRSHL.S64 d0,d0,d0uint8x8_t vrshl_u8(uint8x8_t a, int8x8_t b); // VRSHL.U8 d0,d0,d0uint16x4_t vrshl_u16(uint16x4_t a, int16x4_t b); // VRSHL.U16 d0,d0,d0uint32x2_t vrshl_u32(uint32x2_t a, int32x2_t b); // VRSHL.U32 d0,d0,d0uint64x1_t vrshl_u64(uint64x1_t a, int64x1_t b); // VRSHL.U64 d0,d0,d0int8x16_t vrshlq_s8(int8x16_t a, int8x16_t b); // VRSHL.S8 q0,q0,q0int16x8_t vrshlq_s16(int16x8_t a, int16x8_t b); // VRSHL.S16 q0,q0,q0int32x4_t vrshlq_s32(int32x4_t a, int32x4_t b); // VRSHL.S32 q0,q0,q0int64x2_t vrshlq_s64(int64x2_t a, int64x2_t b); // VRSHL.S64 q0,q0,q0uint8x16_t vrshlq_u8(uint8x16_t a, int8x16_t b); // VRSHL.U8 q0,q0,q0uint16x8_t vrshlq_u16(uint16x8_t a, int16x8_t b); // VRSHL.U16 q0,q0,q0uint32x4_t vrshlq_u32(uint32x4_t a, int32x4_t b); // VRSHL.U32 q0,q0,q0uint64x2_t vrshlq_u64(uint64x2_t a, int64x2_t b); // VRSHL.U64 q0,q0,q0サチュレー ト 丸 めベク タ 左 シフ ト ( 負 の 値 は 右 シ フ ト )int8x8_t vqrshl_s8(int8x8_t a, int8x8_t b); // VQRSHL.S8 d0,d0,d0int16x4_t vqrshl_s16(int16x4_t a, int16x4_t b); // VQRSHL.S16 d0,d0,d0int32x2_t vqrshl_s32(int32x2_t a, int32x2_t b); // VQRSHL.S32 d0,d0,d0int64x1_t vqrshl_s64(int64x1_t a, int64x1_t b); // VQRSHL.S64 d0,d0,d0uint8x8_t vqrshl_u8(uint8x8_t a, int8x8_t b); // VQRSHL.U8 d0,d0,d0uint16x4_t vqrshl_u16(uint16x4_t a, int16x4_t b); // VQRSHL.U16 d0,d0,d0uint32x2_t vqrshl_u32(uint32x2_t a, int32x2_t b); // VQRSHL.U32 d0,d0,d0uint64x1_t vqrshl_u64(uint64x1_t a, int64x1_t b); // VQRSHL.U64 d0,d0,d0int8x16_t vqrshlq_s8(int8x16_t a, int8x16_t b); // VQRSHL.S8 q0,q0,q0int16x8_t vqrshlq_s16(int16x8_t a, int16x8_t b); // VQRSHL.S16 q0,q0,q0int32x4_t vqrshlq_s32(int32x4_t a, int32x4_t b); // VQRSHL.S32 q0,q0,q0int64x2_t vqrshlq_s64(int64x2_t a, int64x2_t b); // VQRSHL.S64 q0,q0,q0uint8x16_t vqrshlq_u8(uint8x16_t a, int8x16_t b); // VQRSHL.U8 q0,q0,q0uint16x8_t vqrshlq_u16(uint16x8_t a, int16x8_t b); // VQRSHL.U16 q0,q0,q0uint32x4_t vqrshlq_u32(uint32x4_t a, int32x4_t b); // VQRSHL.U32 q0,q0,q0uint64x2_t vqrshlq_u64(uint64x2_t a, int64x2_t b); // VQRSHL.U64 q0,q0,q0E.3.12定 数 によ るシ フ ト以 下 の コ ンパイ ラ 組 み 込 み 関 数 は 定 数 に よ る シ フ ト 操 作 を 提 供 し ます。定 数 によ るベ ク タ 右 シ フ トint8x8_t vshr_n_s8(int8x8_t a, __constrange(1,8) int b); // VSHR.S8 d0,d0,#8int16x4_t vshr_n_s16(int16x4_t a, __constrange(1,16) int b); // VSHR.S16 d0,d0,#16int32x2_t vshr_n_s32(int32x2_t a, __constrange(1,32) int b); // VSHR.S32 d0,d0,#32int64x1_t vshr_n_s64(int64x1_t a, __constrange(1,64) int b); // VSHR.S64 d0,d0,#64uint8x8_t vshr_n_u8(uint8x8_t a, __constrange(1,8) int b); // VSHR.U8 d0,d0,#8uint16x4_t vshr_n_u16(uint16x4_t a, __constrange(1,16) int b); // VSHR.U16 d0,d0,#16uint32x2_t vshr_n_u32(uint32x2_t a, __constrange(1,32) int b); // VSHR.U32 d0,d0,#32uint64x1_t vshr_n_u64(uint64x1_t a, __constrange(1,64) int b); // VSHR.U64 d0,d0,#64int8x16_t vshrq_n_s8(int8x16_t a, __constrange(1,8) int b); // VSHR.S8 q0,q0,#8<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-21ID 100419Non-Confidential,


NEON サポー ト の 使 用int16x8_t vshrq_n_s16(int16x8_t a, __constrange(1,16) int b); // VSHR.S16 q0,q0,#16int32x4_t vshrq_n_s32(int32x4_t a, __constrange(1,32) int b); // VSHR.S32 q0,q0,#32int64x2_t vshrq_n_s64(int64x2_t a, __constrange(1,64) int b); // VSHR.S64 q0,q0,#64uint8x16_t vshrq_n_u8(uint8x16_t a, __constrange(1,8) int b); // VSHR.U8 q0,q0,#8uint16x8_t vshrq_n_u16(uint16x8_t a, __constrange(1,16) int b); // VSHR.U16 q0,q0,#16uint32x4_t vshrq_n_u32(uint32x4_t a, __constrange(1,32) int b); // VSHR.U32 q0,q0,#32uint64x2_t vshrq_n_u64(uint64x2_t a, __constrange(1,64) int b); // VSHR.U64 q0,q0,#64定 数 によ るベ ク タ 左 シ フ トint8x8_t vshl_n_s8(int8x8_t a, __constrange(0,7) int b); // VSHL.I8 d0,d0,#0int16x4_t vshl_n_s16(int16x4_t a, __constrange(0,15) int b); // VSHL.I16 d0,d0,#0int32x2_t vshl_n_s32(int32x2_t a, __constrange(0,31) int b); // VSHL.I32 d0,d0,#0int64x1_t vshl_n_s64(int64x1_t a, __constrange(0,63) int b); // VSHL.I64 d0,d0,#0uint8x8_t vshl_n_u8(uint8x8_t a, __constrange(0,7) int b); // VSHL.I8 d0,d0,#0uint16x4_t vshl_n_u16(uint16x4_t a, __constrange(0,15) int b); // VSHL.I16 d0,d0,#0uint32x2_t vshl_n_u32(uint32x2_t a, __constrange(0,31) int b); // VSHL.I32 d0,d0,#0uint64x1_t vshl_n_u64(uint64x1_t a, __constrange(0,63) int b); // VSHL.I64 d0,d0,#0int8x16_t vshlq_n_s8(int8x16_t a, __constrange(0,7) int b); // VSHL.I8 q0,q0,#0int16x8_t vshlq_n_s16(int16x8_t a, __constrange(0,15) int b); // VSHL.I16 q0,q0,#0int32x4_t vshlq_n_s32(int32x4_t a, __constrange(0,31) int b); // VSHL.I32 q0,q0,#0int64x2_t vshlq_n_s64(int64x2_t a, __constrange(0,63) int b); // VSHL.I64 q0,q0,#0uint8x16_t vshlq_n_u8(uint8x16_t a, __constrange(0,7) int b); // VSHL.I8 q0,q0,#0uint16x8_t vshlq_n_u16(uint16x8_t a, __constrange(0,15) int b); // VSHL.I16 q0,q0,#0uint32x4_t vshlq_n_u32(uint32x4_t a, __constrange(0,31) int b); // VSHL.I32 q0,q0,#0uint64x2_t vshlq_n_u64(uint64x2_t a, __constrange(0,63) int b); // VSHL.I64 q0,q0,#0定 数 によ るベ ク タ 丸 め 右 シ フ トint8x8_t vrshr_n_s8(int8x8_t a, __constrange(1,8) int b); // VRSHR.S8 d0,d0,#8int16x4_t vrshr_n_s16(int16x4_t a, __constrange(1,16) int b); // VRSHR.S16 d0,d0,#16int32x2_t vrshr_n_s32(int32x2_t a, __constrange(1,32) int b); // VRSHR.S32 d0,d0,#32int64x1_t vrshr_n_s64(int64x1_t a, __constrange(1,64) int b); // VRSHR.S64 d0,d0,#64uint8x8_t vrshr_n_u8(uint8x8_t a, __constrange(1,8) int b); // VRSHR.U8 d0,d0,#8uint16x4_t vrshr_n_u16(uint16x4_t a, __constrange(1,16) int b); // VRSHR.U16 d0,d0,#16uint32x2_t vrshr_n_u32(uint32x2_t a, __constrange(1,32) int b); // VRSHR.U32 d0,d0,#32uint64x1_t vrshr_n_u64(uint64x1_t a, __constrange(1,64) int b); // VRSHR.U64 d0,d0,#64int8x16_t vrshrq_n_s8(int8x16_t a, __constrange(1,8) int b); // VRSHR.S8 q0,q0,#8int16x8_t vrshrq_n_s16(int16x8_t a, __constrange(1,16) int b); // VRSHR.S16 q0,q0,#16int32x4_t vrshrq_n_s32(int32x4_t a, __constrange(1,32) int b); // VRSHR.S32 q0,q0,#32int64x2_t vrshrq_n_s64(int64x2_t a, __constrange(1,64) int b); // VRSHR.S64 q0,q0,#64uint8x16_t vrshrq_n_u8(uint8x16_t a, __constrange(1,8) int b); // VRSHR.U8 q0,q0,#8uint16x8_t vrshrq_n_u16(uint16x8_t a, __constrange(1,16) int b); // VRSHR.U16 q0,q0,#16uint32x4_t vrshrq_n_u32(uint32x4_t a, __constrange(1,32) int b); // VRSHR.U32 q0,q0,#32uint64x2_t vrshrq_n_u64(uint64x2_t a, __constrange(1,64) int b); // VRSHR.U64 q0,q0,#64E-22 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用定 数 によ るベ ク タ 右 シ フ ト と 累 積int8x8_t vsra_n_s8(int8x8_t a, int8x8_t b, __constrange(1,8) int c); // VSRA.S8 d0,d0,#8int16x4_t vsra_n_s16(int16x4_t a, int16x4_t b, __constrange(1,16) int c); // VSRA.S16 d0,d0,#16int32x2_t vsra_n_s32(int32x2_t a, int32x2_t b, __constrange(1,32) int c); // VSRA.S32 d0,d0,#32int64x1_t vsra_n_s64(int64x1_t a, int64x1_t b, __constrange(1,64) int c); // VSRA.S64 d0,d0,#64uint8x8_t vsra_n_u8(uint8x8_t a, uint8x8_t b, __constrange(1,8) int c); // VSRA.U8 d0,d0,#8uint16x4_t vsra_n_u16(uint16x4_t a, uint16x4_t b, __constrange(1,16) int c); // VSRA.U16 d0,d0,#16uint32x2_t vsra_n_u32(uint32x2_t a, uint32x2_t b, __constrange(1,32) int c); // VSRA.U32 d0,d0,#32uint64x1_t vsra_n_u64(uint64x1_t a, uint64x1_t b, __constrange(1,64) int c); // VSRA.U64 d0,d0,#64int8x16_t vsraq_n_s8(int8x16_t a, int8x16_t b, __constrange(1,8) int c); // VSRA.S8 q0,q0,#8int16x8_t vsraq_n_s16(int16x8_t a, int16x8_t b, __constrange(1,16) int c); // VSRA.S16 q0,q0,#16int32x4_t vsraq_n_s32(int32x4_t a, int32x4_t b, __constrange(1,32) int c); // VSRA.S32 q0,q0,#32int64x2_t vsraq_n_s64(int64x2_t a, int64x2_t b, __constrange(1,64) int c); // VSRA.S64 q0,q0,#64uint8x16_t vsraq_n_u8(uint8x16_t a, uint8x16_t b, __constrange(1,8) int c); // VSRA.U8 q0,q0,#8uint16x8_t vsraq_n_u16(uint16x8_t a, uint16x8_t b, __constrange(1,16) int c); // VSRA.U16 q0,q0,#16uint32x4_t vsraq_n_u32(uint32x4_t a, uint32x4_t b, __constrange(1,32) int c); // VSRA.U32 q0,q0,#32uint64x2_t vsraq_n_u64(uint64x2_t a, uint64x2_t b, __constrange(1,64) int c); // VSRA.U64 q0,q0,#64定 数 によ る 丸 め 右 シ フ ト と 累 積int8x8_t vrsra_n_s8(int8x8_t a, int8x8_t b, __constrange(1,8) int c); // VRSRA.S8 d0,d0,#8int16x4_t vrsra_n_s16(int16x4_t a, int16x4_t b, __constrange(1,16) int c); // VRSRA.S16 d0,d0,#16int32x2_t vrsra_n_s32(int32x2_t a, int32x2_t b, __constrange(1,32) int c); // VRSRA.S32 d0,d0,#32int64x1_t vrsra_n_s64(int64x1_t a, int64x1_t b, __constrange(1,64) int c); // VRSRA.S64 d0,d0,#64uint8x8_t vrsra_n_u8(uint8x8_t a, uint8x8_t b, __constrange(1,8) int c); // VRSRA.U8 d0,d0,#8uint16x4_t vrsra_n_u16(uint16x4_t a, uint16x4_t b, __constrange(1,16) int c); // VRSRA.U16 d0,d0,#16uint32x2_t vrsra_n_u32(uint32x2_t a, uint32x2_t b, __constrange(1,32) int c); // VRSRA.U32 d0,d0,#32uint64x1_t vrsra_n_u64(uint64x1_t a, uint64x1_t b, __constrange(1,64) int c); // VRSRA.U64 d0,d0,#64int8x16_t vrsraq_n_s8(int8x16_t a, int8x16_t b, __constrange(1,8) int c); // VRSRA.S8 q0,q0,#8int16x8_t vrsraq_n_s16(int16x8_t a, int16x8_t b, __constrange(1,16) int c); // VRSRA.S16 q0,q0,#16int32x4_t vrsraq_n_s32(int32x4_t a, int32x4_t b, __constrange(1,32) int c); // VRSRA.S32 q0,q0,#32int64x2_t vrsraq_n_s64(int64x2_t a, int64x2_t b, __constrange(1,64) int c); // VRSRA.S64 q0,q0,#64uint8x16_t vrsraq_n_u8(uint8x16_t a, uint8x16_t b, __constrange(1,8) int c); // VRSRA.U8 q0,q0,#8uint16x8_t vrsraq_n_u16(uint16x8_t a, uint16x8_t b, __constrange(1,16) int c); // VRSRA.U16 q0,q0,#16uint32x4_t vrsraq_n_u32(uint32x4_t a, uint32x4_t b, __constrange(1,32) int c); // VRSRA.U32 q0,q0,#32uint64x2_t vrsraq_n_u64(uint64x2_t a, uint64x2_t b, __constrange(1,64) int c); // VRSRA.U64 q0,q0,#64定 数 によ るサチ ュ レー ト ベ ク タ 左 シ フ トint8x8_t vqshl_n_s8(int8x8_t a, __constrange(0,7) int b); // VQSHL.S8 d0,d0,#0int16x4_t vqshl_n_s16(int16x4_t a, __constrange(0,15) int b); // VQSHL.S16 d0,d0,#0int32x2_t vqshl_n_s32(int32x2_t a, __constrange(0,31) int b); // VQSHL.S32 d0,d0,#0int64x1_t vqshl_n_s64(int64x1_t a, __constrange(0,63) int b); // VQSHL.S64 d0,d0,#0uint8x8_t vqshl_n_u8(uint8x8_t a, __constrange(0,7) int b); // VQSHL.U8 d0,d0,#0uint16x4_t vqshl_n_u16(uint16x4_t a, __constrange(0,15) int b); // VQSHL.U16 d0,d0,#0uint32x2_t vqshl_n_u32(uint32x2_t a, __constrange(0,31) int b); // VQSHL.U32 d0,d0,#0uint64x1_t vqshl_n_u64(uint64x1_t a, __constrange(0,63) int b); // VQSHL.U64 d0,d0,#0int8x16_t vqshlq_n_s8(int8x16_t a, __constrange(0,7) int b); // VQSHL.S8 q0,q0,#0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-23ID 100419Non-Confidential,


NEON サポー ト の 使 用int16x8_t vqshlq_n_s16(int16x8_t a, __constrange(0,15) int b); // VQSHL.S16 q0,q0,#0int32x4_t vqshlq_n_s32(int32x4_t a, __constrange(0,31) int b); // VQSHL.S32 q0,q0,#0int64x2_t vqshlq_n_s64(int64x2_t a, __constrange(0,63) int b); // VQSHL.S64 q0,q0,#0uint8x16_t vqshlq_n_u8(uint8x16_t a, __constrange(0,7) int b); // VQSHL.U8 q0,q0,#0uint16x8_t vqshlq_n_u16(uint16x8_t a, __constrange(0,15) int b); // VQSHL.U16 q0,q0,#0uint32x4_t vqshlq_n_u32(uint32x4_t a, __constrange(0,31) int b); // VQSHL.U32 q0,q0,#0uint64x2_t vqshlq_n_u64(uint64x2_t a, __constrange(0,63) int b); // VQSHL.U64 q0,q0,#0定 数 によ るサチ ュ レー ト ベク タ 左 シ フ ト ( 符 号 付 きから 符 号 な しへの 変 換 )uint8x8_t vqshlu_n_s8(int8x8_t a, __constrange(0,7) int b); // VQSHLU.S8 d0,d0,#0uint16x4_t vqshlu_n_s16(int16x4_t a, __constrange(0,15) int b); // VQSHLU.S16 d0,d0,#0uint32x2_t vqshlu_n_s32(int32x2_t a, __constrange(0,31) int b); // VQSHLU.S32 d0,d0,#0uint64x1_t vqshlu_n_s64(int64x1_t a, __constrange(0,63) int b); // VQSHLU.S64 d0,d0,#0uint8x16_t vqshluq_n_s8(int8x16_t a, __constrange(0,7) int b); // VQSHLU.S8 q0,q0,#0uint16x8_t vqshluq_n_s16(int16x8_t a, __constrange(0,15) int b); // VQSHLU.S16 q0,q0,#0uint32x4_t vqshluq_n_s32(int32x4_t a, __constrange(0,31) int b); // VQSHLU.S32 q0,q0,#0uint64x2_t vqshluq_n_s64(int64x2_t a, __constrange(0,63) int b); // VQSHLU.S64 q0,q0,#0定 数 によるベクタナローイングサチュレート 右 シフ トint8x8_t vshrn_n_s16(int16x8_t a, __constrange(1,8) int b); // VSHRN.I16 d0,q0,#8int16x4_t vshrn_n_s32(int32x4_t a, __constrange(1,16) int b); // VSHRN.I32 d0,q0,#16int32x2_t vshrn_n_s64(int64x2_t a, __constrange(1,32) int b); // VSHRN.I64 d0,q0,#32uint8x8_t vshrn_n_u16(uint16x8_t a, __constrange(1,8) int b); // VSHRN.I16 d0,q0,#8uint16x4_t vshrn_n_u32(uint32x4_t a, __constrange(1,16) int b); // VSHRN.I32 d0,q0,#16uint32x2_t vshrn_n_u64(uint64x2_t a, __constrange(1,32) int b); // VSHRN.I64 d0,q0,#32定 数 によるベクタナローイングサチュレート 右 シフ ト ( 符 号 付 きから 符 号 なしへの 変 換 )uint8x8_t vqshrun_n_s16(int16x8_t a, __constrange(1,8) int b); // VQSHRUN.S16 d0,q0,#8uint16x4_t vqshrun_n_s32(int32x4_t a, __constrange(1,16) int b); // VQSHRUN.S32 d0,q0,#16uint32x2_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,#8uint16x4_t vqrshrun_n_s32(int32x4_t a, __constrange(1,16) int b); // VQRSHRUN.S32 d0,q0,#16uint32x2_t vqrshrun_n_s64(int64x2_t a, __constrange(1,32) int b); // VQRSHRUN.S64 d0,q0,#32定 数 によるベクタナローイングサチュレート 右 シフ トint8x8_t vqshrn_n_s16(int16x8_t a, __constrange(1,8) int b); // VQSHRN.S16 d0,q0,#8int16x4_t vqshrn_n_s32(int32x4_t a, __constrange(1,16) int b); // VQSHRN.S32 d0,q0,#16int32x2_t vqshrn_n_s64(int64x2_t a, __constrange(1,32) int b); // VQSHRN.S64 d0,q0,#32E-24 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用uint8x8_t vqshrn_n_u16(uint16x8_t a, __constrange(1,8) int b); // VQSHRN.U16 d0,q0,#8uint16x4_t vqshrn_n_u32(uint32x4_t a, __constrange(1,16) int b); // VQSHRN.U32 d0,q0,#16uint32x2_t vqshrn_n_u64(uint64x2_t a, __constrange(1,32) int b); // VQSHRN.U64 d0,q0,#32定 数 による 丸 めベクタナローイング 右 シフ トint8x8_t vrshrn_n_s16(int16x8_t a, __constrange(1,8) int b); // VRSHRN.I16 d0,q0,#8int16x4_t vrshrn_n_s32(int32x4_t a, __constrange(1,16) int b); // VRSHRN.I32 d0,q0,#16int32x2_t vrshrn_n_s64(int64x2_t a, __constrange(1,32) int b); // VRSHRN.I64 d0,q0,#32uint8x8_t vrshrn_n_u16(uint16x8_t a, __constrange(1,8) int b); // VRSHRN.I16 d0,q0,#8uint16x4_t vrshrn_n_u32(uint32x4_t a, __constrange(1,16) int b); // VRSHRN.I32 d0,q0,#16uint32x2_t vrshrn_n_u64(uint64x2_t a, __constrange(1,32) int b); // VRSHRN.I64 d0,q0,#32定 数 による 丸 めベクタナローイングサチュレート 右 シフ トint8x8_t vqrshrn_n_s16(int16x8_t a, __constrange(1,8) int b); // VQRSHRN.S16 d0,q0,#8int16x4_t vqrshrn_n_s32(int32x4_t a, __constrange(1,16) int b); // VQRSHRN.S32 d0,q0,#16int32x2_t vqrshrn_n_s64(int64x2_t a, __constrange(1,32) int b); // VQRSHRN.S64 d0,q0,#32uint8x8_t vqrshrn_n_u16(uint16x8_t a, __constrange(1,8) int b); // VQRSHRN.U16 d0,q0,#8uint16x4_t vqrshrn_n_u32(uint32x4_t a, __constrange(1,16) int b); // VQRSHRN.U32 d0,q0,#16uint32x2_t vqrshrn_n_u64(uint64x2_t a, __constrange(1,32) int b); // VQRSHRN.U64 d0,q0,#32定 数 によ る 拡 張 付 きベク タ 左 シ フ トint16x8_t vshll_n_s8(int8x8_t a, __constrange(0,8) int b); // VSHLL.S8 q0,d0,#0int32x4_t vshll_n_s16(int16x4_t a, __constrange(0,16) int b); // VSHLL.S16 q0,d0,#0int64x2_t vshll_n_s32(int32x2_t a, __constrange(0,32) int b); // VSHLL.S32 q0,d0,#0uint16x8_t vshll_n_u8(uint8x8_t a, __constrange(0,8) int b); // VSHLL.U8 q0,d0,#0uint32x4_t vshll_n_u16(uint16x4_t a, __constrange(0,16) int b); // VSHLL.U16 q0,d0,#0uint64x2_t vshll_n_u32(uint32x2_t a, __constrange(0,32) int b); // VSHLL.U32 q0,d0,#0E.3.13シフ ト して 挿 入以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 シ フ ト し て 挿 入 操 作 を 含 む 演 算 に 使 用 します。ベクタ 右 シフ ト と 挿 入int8x8_t vsri_n_s8(int8x8_t a, int8x8_t b, __constrange(1,8) int c); // VSRI.8 d0,d0,#8int16x4_t vsri_n_s16(int16x4_t a, int16x4_t b, __constrange(1,16) int c); // VSRI.16 d0,d0,#16int32x2_t vsri_n_s32(int32x2_t a, int32x2_t b, __constrange(1,32) int c); // VSRI.32 d0,d0,#32int64x1_t vsri_n_s64(int64x1_t a, int64x1_t b, __constrange(1,64) int c); // VSRI.64 d0,d0,#64uint8x8_t vsri_n_u8(uint8x8_t a, uint8x8_t b, __constrange(1,8) int c); // VSRI.8 d0,d0,#8uint16x4_t vsri_n_u16(uint16x4_t a, uint16x4_t b, __constrange(1,16) int c); // VSRI.16 d0,d0,#16uint32x2_t vsri_n_u32(uint32x2_t a, uint32x2_t b, __constrange(1,32) int c); // VSRI.32 d0,d0,#32uint64x1_t vsri_n_u64(uint64x1_t a, uint64x1_t b, __constrange(1,64) int c); // VSRI.64 d0,d0,#64poly8x8_t vsri_n_p8(poly8x8_t a, poly8x8_t b, __constrange(1,8) int c); // VSRI.8 d0,d0,#8<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-25ID 100419Non-Confidential,


NEON サポー ト の 使 用poly16x4_t vsri_n_p16(poly16x4_t a, poly16x4_t b, __constrange(1,16) int c); // VSRI.16 d0,d0,#16int8x16_t vsriq_n_s8(int8x16_t a, int8x16_t b, __constrange(1,8) int c); // VSRI.8 q0,q0,#8int16x8_t vsriq_n_s16(int16x8_t a, int16x8_t b, __constrange(1,16) int c); // VSRI.16 q0,q0,#16int32x4_t vsriq_n_s32(int32x4_t a, int32x4_t b, __constrange(1,32) int c); // VSRI.32 q0,q0,#32int64x2_t vsriq_n_s64(int64x2_t a, int64x2_t b, __constrange(1,64) int c); // VSRI.64 q0,q0,#64uint8x16_t vsriq_n_u8(uint8x16_t a, uint8x16_t b, __constrange(1,8) int c); // VSRI.8 q0,q0,#8uint16x8_t vsriq_n_u16(uint16x8_t a, uint16x8_t b, __constrange(1,16) int c); // VSRI.16 q0,q0,#16uint32x4_t vsriq_n_u32(uint32x4_t a, uint32x4_t b, __constrange(1,32) int c); // VSRI.32 q0,q0,#32uint64x2_t vsriq_n_u64(uint64x2_t a, uint64x2_t b, __constrange(1,64) int c); // VSRI.64 q0,q0,#64poly8x16_t vsriq_n_p8(poly8x16_t a, poly8x16_t b, __constrange(1,8) int c); // VSRI.8 q0,q0,#8poly16x8_t vsriq_n_p16(poly16x8_t a, poly16x8_t b, __constrange(1,16) int c); // VSRI.16 q0,q0,#16ベクタ 左 シフ ト と 挿 入int8x8_t vsli_n_s8(int8x8_t a, int8x8_t b, __constrange(0,7) int c); // VSLI.8 d0,d0,#0int16x4_t vsli_n_s16(int16x4_t a, int16x4_t b, __constrange(0,15) int c); // VSLI.16 d0,d0,#0int32x2_t vsli_n_s32(int32x2_t a, int32x2_t b, __constrange(0,31) int c); // VSLI.32 d0,d0,#0int64x1_t vsli_n_s64(int64x1_t a, int64x1_t b, __constrange(0,63) int c); // VSLI.64 d0,d0,#0uint8x8_t vsli_n_u8(uint8x8_t a, uint8x8_t b, __constrange(0,7) int c); // VSLI.8 d0,d0,#0uint16x4_t vsli_n_u16(uint16x4_t a, uint16x4_t b, __constrange(0,15) int c); // VSLI.16 d0,d0,#0uint32x2_t vsli_n_u32(uint32x2_t a, uint32x2_t b, __constrange(0,31) int c); // VSLI.32 d0,d0,#0uint64x1_t vsli_n_u64(uint64x1_t a, uint64x1_t b, __constrange(0,63) int c); // VSLI.64 d0,d0,#0poly8x8_t vsli_n_p8(poly8x8_t a, poly8x8_t b, __constrange(0,7) int c); // VSLI.8 d0,d0,#0poly16x4_t vsli_n_p16(poly16x4_t a, poly16x4_t b, __constrange(0,15) int c); // VSLI.16 d0,d0,#0int8x16_t vsliq_n_s8(int8x16_t a, int8x16_t b, __constrange(0,7) int c); // VSLI.8 q0,q0,#0int16x8_t vsliq_n_s16(int16x8_t a, int16x8_t b, __constrange(0,15) int c); // VSLI.16 q0,q0,#0int32x4_t vsliq_n_s32(int32x4_t a, int32x4_t b, __constrange(0,31) int c); // VSLI.32 q0,q0,#0int64x2_t vsliq_n_s64(int64x2_t a, int64x2_t b, __constrange(0,63) int c); // VSLI.64 q0,q0,#0uint8x16_t vsliq_n_u8(uint8x16_t a, uint8x16_t b, __constrange(0,7) int c); // VSLI.8 q0,q0,#0uint16x8_t vsliq_n_u16(uint16x8_t a, uint16x8_t b, __constrange(0,15) int c); // VSLI.16 q0,q0,#0uint32x4_t vsliq_n_u32(uint32x4_t a, uint32x4_t b, __constrange(0,31) int c); // VSLI.32 q0,q0,#0uint64x2_t vsliq_n_u64(uint64x2_t a, uint64x2_t b, __constrange(0,63) int c); // VSLI.64 q0,q0,#0poly8x16_t vsliq_n_p8(poly8x16_t a, poly8x16_t b, __constrange(0,7) int c); // VSLI.8 q0,q0,#0poly16x8_t vsliq_n_p16(poly16x8_t a, poly16x8_t b, __constrange(0,15) int c); // VSLI.16 q0,q0,#0E.3.14単 一 ベク タのロー ド と ス ト ア何 らかの 型 の 単 一 ベク タのロー ド と ス ト アを 行 います。uint8x16_t vld1q_u8(__transfersize(16) uint8_t const * ptr);// VLD1.8 {d0, d1}, [r0]uint16x8_t vld1q_u16(__transfersize(8) uint16_t const * ptr);// VLD1.16 {d0, d1}, [r0]uint32x4_t vld1q_u32(__transfersize(4) uint32_t const * ptr);// VLD1.32 {d0, d1}, [r0]uint64x2_t vld1q_u64(__transfersize(2) uint64_t const * ptr);// VLD1.64 {d0, d1}, [r0]int8x16_t vld1q_s8(__transfersize(16) int8_t const * ptr);// VLD1.8 {d0, d1}, [r0]E-26 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用int16x8_t vld1q_s16(__transfersize(8) int16_t const * ptr);// VLD1.16 {d0, d1}, [r0]int32x4_t vld1q_s32(__transfersize(4) int32_t const * ptr);// VLD1.32 {d0, d1}, [r0]int64x2_t vld1q_s64(__transfersize(2) int64_t const * ptr);// VLD1.64 {d0, d1}, [r0]float16x8_t vld1q_f16(__transfersize(8) __fp16 const * ptr);// VLD1.16 {d0, d1}, [r0]float32x4_t vld1q_f32(__transfersize(4) float32_t const * ptr);// VLD1.32 {d0, d1}, [r0]poly8x16_t vld1q_p8(__transfersize(16) poly8_t const * ptr);// VLD1.8 {d0, d1}, [r0]poly16x8_t vld1q_p16(__transfersize(8) poly16_t const * ptr);// VLD1.16 {d0, d1}, [r0]uint8x8_t vld1_u8(__transfersize(8) uint8_t const * ptr);// VLD1.8 {d0}, [r0]uint16x4_t vld1_u16(__transfersize(4) uint16_t const * ptr);// VLD1.16 {d0}, [r0]uint32x2_t vld1_u32(__transfersize(2) uint32_t const * ptr);// VLD1.32 {d0}, [r0]uint64x1_t vld1_u64(__transfersize(1) uint64_t const * ptr);// VLD1.64 {d0}, [r0]int8x8_t vld1_s8(__transfersize(8) int8_t const * ptr);// VLD1.8 {d0}, [r0]int16x4_t vld1_s16(__transfersize(4) int16_t const * ptr);// VLD1.16 {d0}, [r0]int32x2_t vld1_s32(__transfersize(2) int32_t const * ptr);// VLD1.32 {d0}, [r0]int64x1_t vld1_s64(__transfersize(1) int64_t const * ptr);// VLD1.64 {d0}, [r0]float16x4_t vld1_f16(__transfersize(4) __fp16 const * ptr);// VLD1.16 {d0}, [r0]float32x2_t vld1_f32(__transfersize(2) float32_t const * ptr);// VLD1.32 {d0}, [r0]poly8x8_t vld1_p8(__transfersize(8) poly8_t const * ptr);// VLD1.8 {d0}, [r0]poly16x4_t vld1_p16(__transfersize(4) poly16_t const * ptr);// VLD1.16 {d0}, [r0]uint8x16_t vld1q_lane_u8(__transfersize(1) uint8_t const * ptr, uint8x16_t vec, __constrange(0,15) intlane);// VLD1.8 {d0[0]}, [r0]uint16x8_t vld1q_lane_u16(__transfersize(1) uint16_t const * ptr, uint16x8_t vec, __constrange(0,7)int lane);// VLD1.16 {d0[0]}, [r0]uint32x4_t vld1q_lane_u32(__transfersize(1) uint32_t const * ptr, uint32x4_t vec, __constrange(0,3)int lane);// VLD1.32 {d0[0]}, [r0]uint64x2_t vld1q_lane_u64(__transfersize(1) uint64_t const * ptr, uint64x2_t vec, __constrange(0,1)int lane);<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-27ID 100419Non-Confidential,


NEON サポー ト の 使 用int8x16_tlane);int16x8_tlane);// 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]int32x4_t vld1q_lane_s32(__transfersize(1) int32_t const * ptr, int32x4_t vec, __constrange(0,3) intlane);// VLD1.32 {d0[0]}, [r0]float16x4_t vld1q_lane_f16(__transfersize(1) __fp16 const * ptr, float16x4_t vec, __constrange(0,3) intlane);// VLD1.16 {d0[0]}, [r0]float16x8_t vld1q_lane_f16(__transfersize(1) __fp16 const * ptr, float16x8_t vec, __constrange(0,7) intlane);// 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) intlane);// VLD1.64 {d0}, [r0]poly8x16_t vld1q_lane_p8(__transfersize(1) poly8_t const * ptr, poly8x16_t vec, __constrange(0,15) intlane);// 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) intlane);// VLD1.8 {d0[0]}, [r0]uint16x4_t vld1_lane_u16(__transfersize(1) uint16_t const * ptr, uint16x4_t vec, __constrange(0,3) intlane);// VLD1.16 {d0[0]}, [r0]uint32x2_t vld1_lane_u32(__transfersize(1) uint32_t const * ptr, uint32x2_t vec, __constrange(0,1) intlane);// VLD1.32 {d0[0]}, [r0]uint64x1_t vld1_lane_u64(__transfersize(1) uint64_t const * ptr, uint64x1_t vec, __constrange(0,0) intlane);// VLD1.64 {d0}, [r0]int8x8_t vld1_lane_s8(__transfersize(1) int8_t const * ptr, int8x8_t vec, __constrange(0,7) int lane);int16x4_tlane);// 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]int32x2_t vld1_lane_s32(__transfersize(1) int32_t const * ptr, int32x2_t vec, __constrange(0,1) intlane);// 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用int lane);int64x1_tlane);// 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]poly8x8_t vld1_lane_p8(__transfersize(1) poly8_t const * ptr, poly8x8_t vec, __constrange(0,7) intlane);// VLD1.8 {d0[0]}, [r0]poly16x4_t vld1_lane_p16(__transfersize(1) poly16_t const * ptr, poly16x4_t vec, __constrange(0,3) intlane);// VLD1.16 {d0[0]}, [r0]uint8x16_t 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);// VLD1.64 {d0}, [r0]int8x8_t 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]<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-29ID 100419Non-Confidential,


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);// VST1.8 {d0}, [r0]void vst1_s16(__transfersize(4) int16_t * ptr, int16x4_t val);// VST1.16 {d0}, [r0]void vst1_s32(__transfersize(2) int32_t * ptr, int32x2_t val);// VST1.32 {d0}, [r0]void vst1_s64(__transfersize(1) int64_t * ptr, int64x1_t val);E-30 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用// VST1.64 {d0}, [r0]void vst1_f16(__transfersize(4) __fp16 * ptr, float16x4_t val);// VST1.16 {d0}, [r0]void vst1_f32(__transfersize(2) float32_t * ptr, float32x2_t val);// VST1.32 {d0}, [r0]void vst1_p8(__transfersize(8) poly8_t * ptr, poly8x8_t val);// VST1.8 {d0}, [r0]void vst1_p16(__transfersize(4) poly16_t * ptr, poly16x4_t val);// VST1.16 {d0}, [r0]void vst1q_lane_u8(__transfersize(1) uint8_t * ptr, uint8x16_t val, __constrange(0,15) int lane);// VST1.8 {d0[0]}, [r0]void vst1q_lane_u16(__transfersize(1) uint16_t * ptr, uint16x8_t val, __constrange(0,7) int lane);// VST1.16 {d0[0]}, [r0]void vst1q_lane_u32(__transfersize(1) uint32_t * ptr, uint32x4_t val, __constrange(0,3) int lane);// VST1.32 {d0[0]}, [r0]void vst1q_lane_u64(__transfersize(1) uint64_t * ptr, uint64x2_t val, __constrange(0,1) int lane);// VST1.64 {d0}, [r0]void vst1q_lane_s8(__transfersize(1) int8_t * ptr, int8x16_t val, __constrange(0,15) int lane);// VST1.8 {d0[0]}, [r0]void vst1q_lane_s16(__transfersize(1) int16_t * ptr, int16x8_t val, __constrange(0,7) int lane);// VST1.16 {d0[0]}, [r0]void vst1q_lane_s32(__transfersize(1) int32_t * ptr, int32x4_t val, __constrange(0,3) int lane);// VST1.32 {d0[0]}, [r0]void vst1q_lane_s64(__transfersize(1) int64_t * ptr, int64x2_t val, __constrange(0,1) int lane);// VST1.64 {d0}, [r0]void vst1q_lane_f16(__transfersize(1) __fp16 * ptr, float16x8_t val, __constrange(0,7) int lane);// VST1.16 {d0[0]}, [r0]void vst1q_lane_f32(__transfersize(1) float32_t * ptr, float32x4_t val, __constrange(0,3) int lane);// VST1.32 {d0[0]}, [r0]void vst1q_lane_p8(__transfersize(1) poly8_t * ptr, poly8x16_t val, __constrange(0,15) int lane);// VST1.8 {d0[0]}, [r0]void vst1q_lane_p16(__transfersize(1) poly16_t * ptr, poly16x8_t val, __constrange(0,7) int lane);// VST1.16 {d0[0]}, [r0]void vst1_lane_u8(__transfersize(1) uint8_t * ptr, uint8x8_t val, __constrange(0,7) int lane);// VST1.8 {d0[0]}, [r0]void vst1_lane_u16(__transfersize(1) uint16_t * ptr, uint16x4_t val, __constrange(0,3) int lane);// VST1.16 {d0[0]}, [r0]void vst1_lane_u32(__transfersize(1) uint32_t * ptr, uint32x2_t val, __constrange(0,1) int lane);// VST1.32 {d0[0]}, [r0]void vst1_lane_u64(__transfersize(1) uint64_t * ptr, uint64x1_t val, __constrange(0,0) int lane);// VST1.64 {d0}, [r0]void vst1_lane_s8(__transfersize(1) int8_t * ptr, int8x8_t val, __constrange(0,7) int lane);// VST1.8 {d0[0]}, [r0]void vst1_lane_s16(__transfersize(1) int16_t * ptr, int16x4_t val, __constrange(0,3) int lane);// VST1.16 {d0[0]}, [r0]void vst1_lane_s32(__transfersize(1) int32_t * ptr, int32x2_t val, __constrange(0,1) int lane);// VST1.32 {d0[0]}, [r0]void vst1_lane_s64(__transfersize(1) int64_t * ptr, int64x1_t val, __constrange(0,0) int lane);// VST1.64 {d0}, [r0]<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-31ID 100419Non-Confidential,


NEON サポー ト の 使 用void vst1_lane_f16(__transfersize(1) __fp16 * ptr, float16x4_t val, __constrange(0,3) int lane);// VST1.16 {d0[0]}, [r0]void vst1_lane_f32(__transfersize(1) float32_t * ptr, float32x2_t val, __constrange(0,1) int lane);// VST1.32 {d0[0]}, [r0]void vst1_lane_p8(__transfersize(1) poly8_t * ptr, poly8x8_t val, __constrange(0,7) int lane);// VST1.8 {d0[0]}, [r0]void vst1_lane_p16(__transfersize(1) poly16_t * ptr, poly16x4_t val, __constrange(0,3) int lane);// VST1.16 {d0[0]}, [r0]E.3.15N 要 素 構 造 体 のロー ド と ス ト ア以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


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);<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-33ID 100419Non-Confidential,


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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


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);<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-35ID 100419Non-Confidential,


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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


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) intlane);// 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) intlane);// VLD2.8 {d0[0], d1[0]}, [r0]int16x4x2_t vld2_lane_s16(__transfersize(2) int16_t const * ptr, int16x4x2_t src, __constrange(0,3) intlane);// VLD2.16 {d0[0], d1[0]}, [r0]int32x2x2_t vld2_lane_s32(__transfersize(2) int32_t const * ptr, int32x2x2_t src, __constrange(0,1) intlane);// 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) intlane);// 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,<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-37ID 100419Non-Confidential,


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) intlane);// 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) intlane);// 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) intlane);// 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) intlane);// 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) intlane);// 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 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


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) intlane);// 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) intlane);// 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) intlane);// 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) intlane);// 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) intlane);// 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);<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-39ID 100419Non-Confidential,


NEON サポー ト の 使 用// VST2.32 {d0, d2}, [r0]void vst2q_p8(__transfersize(32) poly8_t * ptr, poly8x16x2_t val);// VST2.8 {d0, d2}, [r0]void vst2q_p16(__transfersize(16) poly16_t * ptr, poly16x8x2_t val);// VST2.16 {d0, d2}, [r0]void vst2_u8(__transfersize(16) uint8_t * ptr, uint8x8x2_t val);// VST2.8 {d0, d1}, [r0]void vst2_u16(__transfersize(8) uint16_t * ptr, uint16x4x2_t val);// VST2.16 {d0, d1}, [r0]void vst2_u32(__transfersize(4) uint32_t * ptr, uint32x2x2_t val);// VST2.32 {d0, d1}, [r0]void vst2_u64(__transfersize(2) uint64_t * ptr, uint64x1x2_t val);// VST1.64 {d0, d1}, [r0]void vst2_s8(__transfersize(16) int8_t * ptr, int8x8x2_t val);// VST2.8 {d0, d1}, [r0]void vst2_s16(__transfersize(8) int16_t * ptr, int16x4x2_t val);// VST2.16 {d0, d1}, [r0]void vst2_s32(__transfersize(4) int32_t * ptr, int32x2x2_t val);// VST2.32 {d0, d1}, [r0]void vst2_s64(__transfersize(2) int64_t * ptr, int64x1x2_t val);// VST1.64 {d0, d1}, [r0]void vst2_f16(__transfersize(8) __fp16 * ptr, float16x4x2_t val);// VST2.16 {d0, d1}, [r0]void vst2_f32(__transfersize(4) float32_t * ptr, float32x2x2_t val);// VST2.32 {d0, d1}, [r0]void vst2_p8(__transfersize(16) poly8_t * ptr, poly8x8x2_t val);// VST2.8 {d0, d1}, [r0]void vst2_p16(__transfersize(8) poly16_t * ptr, poly16x4x2_t val);// VST2.16 {d0, d1}, [r0]void vst3q_u8(__transfersize(48) uint8_t * ptr, uint8x16x3_t val);// VST3.8 {d0, d2, d4}, [r0]void vst3q_u16(__transfersize(24) uint16_t * ptr, uint16x8x3_t val);// VST3.16 {d0, d2, d4}, [r0]void vst3q_u32(__transfersize(12) uint32_t * ptr, uint32x4x3_t val);// VST3.32 {d0, d2, d4}, [r0]void vst3q_s8(__transfersize(48) int8_t * ptr, int8x16x3_t val);// VST3.8 {d0, d2, d4}, [r0]void vst3q_s16(__transfersize(24) int16_t * ptr, int16x8x3_t val);// VST3.16 {d0, d2, d4}, [r0]void vst3q_s32(__transfersize(12) int32_t * ptr, int32x4x3_t val);// VST3.32 {d0, d2, d4}, [r0]void vst3q_f16(__transfersize(24) __fp16 * ptr, float16x8x3_t val);// VST3.16 {d0, d2, d4}, [r0]void vst3q_f32(__transfersize(12) float32_t * ptr, float32x4x3_t val);// VST3.32 {d0, d2, d4}, [r0]void vst3q_p8(__transfersize(48) poly8_t * ptr, poly8x16x3_t val);// VST3.8 {d0, d2, d4}, [r0]void vst3q_p16(__transfersize(24) poly16_t * ptr, poly16x8x3_t val);// VST3.16 {d0, d2, d4}, [r0]E-40 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用void vst3_u8(__transfersize(24) uint8_t * ptr, uint8x8x3_t val);// VST3.8 {d0, d1, d2}, [r0]void vst3_u16(__transfersize(12) uint16_t * ptr, uint16x4x3_t val);// VST3.16 {d0, d1, d2}, [r0]void vst3_u32(__transfersize(6) uint32_t * ptr, uint32x2x3_t val);// VST3.32 {d0, d1, d2}, [r0]void vst3_u64(__transfersize(3) uint64_t * ptr, uint64x1x3_t val);// VST1.64 {d0, d1, d2}, [r0]void vst3_s8(__transfersize(24) int8_t * ptr, int8x8x3_t val);// VST3.8 {d0, d1, d2}, [r0]void vst3_s16(__transfersize(12) int16_t * ptr, int16x4x3_t val);// VST3.16 {d0, d1, d2}, [r0]void vst3_s32(__transfersize(6) int32_t * ptr, int32x2x3_t val);// VST3.32 {d0, d1, d2}, [r0]void vst3_s64(__transfersize(3) int64_t * ptr, int64x1x3_t val);// VST1.64 {d0, d1, d2}, [r0]void vst3_f16(__transfersize(12) __fp16 * ptr, float16x4x3_t val);// VST3.16 {d0, d1, d2}, [r0]void vst3_f32(__transfersize(6) float32_t * ptr, float32x2x3_t val);// VST3.32 {d0, d1, d2}, [r0]void vst3_p8(__transfersize(24) poly8_t * ptr, poly8x8x3_t val);// VST3.8 {d0, d1, d2}, [r0]void vst3_p16(__transfersize(12) poly16_t * ptr, poly16x4x3_t val);// VST3.16 {d0, d1, d2}, [r0]void vst4q_u8(__transfersize(64) uint8_t * ptr, uint8x16x4_t val);// VST4.8 {d0, d2, d4, d6}, [r0]void vst4q_u16(__transfersize(32) uint16_t * ptr, uint16x8x4_t val);// VST4.16 {d0, d2, d4, d6}, [r0]void vst4q_u32(__transfersize(16) uint32_t * ptr, uint32x4x4_t val);// VST4.32 {d0, d2, d4, d6}, [r0]void vst4q_s8(__transfersize(64) int8_t * ptr, int8x16x4_t val);// VST4.8 {d0, d2, d4, d6}, [r0]void vst4q_s16(__transfersize(32) int16_t * ptr, int16x8x4_t val);// VST4.16 {d0, d2, d4, d6}, [r0]void vst4q_s32(__transfersize(16) int32_t * ptr, int32x4x4_t val);// VST4.32 {d0, d2, d4, d6}, [r0]void vst4q_f16(__transfersize(32) __fp16 * ptr, float16x8x4_t val);// VST4.16 {d0, d2, d4, d6}, [r0]void vst4q_f32(__transfersize(16) float32_t * ptr, float32x4x4_t val);// VST4.32 {d0, d2, d4, d6}, [r0]void vst4q_p8(__transfersize(64) poly8_t * ptr, poly8x16x4_t val);// VST4.8 {d0, d2, d4, d6}, [r0]void vst4q_p16(__transfersize(32) poly16_t * ptr, poly16x8x4_t val);// VST4.16 {d0, d2, d4, d6}, [r0]void vst4_u8(__transfersize(32) uint8_t * ptr, uint8x8x4_t val);// VST4.8 {d0, d1, d2, d3}, [r0]void vst4_u16(__transfersize(16) uint16_t * ptr, uint16x4x4_t val);// VST4.16 {d0, d1, d2, d3}, [r0]void vst4_u32(__transfersize(8) uint32_t * ptr, uint32x2x4_t val);<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-41ID 100419Non-Confidential,


NEON サポー ト の 使 用// VST4.32 {d0, d1, d2, d3}, [r0]void vst4_u64(__transfersize(4) uint64_t * ptr, uint64x1x4_t val);// VST1.64 {d0, d1, d2, d3}, [r0]void vst4_s8(__transfersize(32) int8_t * ptr, int8x8x4_t val);// VST4.8 {d0, d1, d2, d3}, [r0]void vst4_s16(__transfersize(16) int16_t * ptr, int16x4x4_t val);// VST4.16 {d0, d1, d2, d3}, [r0]void vst4_s32(__transfersize(8) int32_t * ptr, int32x2x4_t val);// VST4.32 {d0, d1, d2, d3}, [r0]void vst4_s64(__transfersize(4) int64_t * ptr, int64x1x4_t val);// VST1.64 {d0, d1, d2, d3}, [r0]void vst4_f16(__transfersize(16) __fp16 * ptr, float16x4x4_t val);// VST4.16 {d0, d1, d2, d3}, [r0]void vst4_f32(__transfersize(8) float32_t * ptr, float32x2x4_t val);// VST4.32 {d0, d1, d2, d3}, [r0]void vst4_p8(__transfersize(32) poly8_t * ptr, poly8x8x4_t val);// VST4.8 {d0, d1, d2, d3}, [r0]void vst4_p16(__transfersize(16) poly16_t * ptr, poly16x4x4_t val);// VST4.16 {d0, d1, d2, d3}, [r0]void vst2q_lane_u16(__transfersize(2) uint16_t * ptr, uint16x8x2_t val, __constrange(0,7) int lane);// VST2.16 {d0[0], d2[0]}, [r0]void vst2q_lane_u32(__transfersize(2) uint32_t * ptr, uint32x4x2_t val, __constrange(0,3) int lane);// VST2.32 {d0[0], d2[0]}, [r0]void vst2q_lane_s16(__transfersize(2) int16_t * ptr, int16x8x2_t val, __constrange(0,7) int lane);// VST2.16 {d0[0], d2[0]}, [r0]void vst2q_lane_s32(__transfersize(2) int32_t * ptr, int32x4x2_t val, __constrange(0,3) int lane);// VST2.32 {d0[0], d2[0]}, [r0]void vst2q_lane_f16(__transfersize(2) __fp16 * ptr, float16x8x2_t val, __constrange(0,7) int lane);// VST2.16 {d0[0], d2[0]}, [r0]void vst2q_lane_f32(__transfersize(2) float32_t * ptr, float32x4x2_t val, __constrange(0,3) int lane);// VST2.32 {d0[0], d2[0]}, [r0]void vst2q_lane_p16(__transfersize(2) poly16_t * ptr, poly16x8x2_t val, __constrange(0,7) int lane);// VST2.16 {d0[0], d2[0]}, [r0]void vst2_lane_u8(__transfersize(2) uint8_t * ptr, uint8x8x2_t val, __constrange(0,7) int lane);// VST2.8 {d0[0], d1[0]}, [r0]void vst2_lane_u16(__transfersize(2) uint16_t * ptr, uint16x4x2_t val, __constrange(0,3) int lane);// VST2.16 {d0[0], d1[0]}, [r0]void vst2_lane_u32(__transfersize(2) uint32_t * ptr, uint32x2x2_t val, __constrange(0,1) int lane);// VST2.32 {d0[0], d1[0]}, [r0]void vst2_lane_s8(__transfersize(2) int8_t * ptr, int8x8x2_t val, __constrange(0,7) int lane);// VST2.8 {d0[0], d1[0]}, [r0]void vst2_lane_s16(__transfersize(2) int16_t * ptr, int16x4x2_t val, __constrange(0,3) int lane);// VST2.16 {d0[0], d1[0]}, [r0]void vst2_lane_s32(__transfersize(2) int32_t * ptr, int32x2x2_t val, __constrange(0,1) int lane);// VST2.32 {d0[0], d1[0]}, [r0]void vst2_lane_f16(__transfersize(2) __fp16 * ptr, float16x4x2_t val, __constrange(0,3) int lane);// VST2.16 {d0[0], d1[0]}, [r0]void vst2_lane_f32(__transfersize(2) float32_t * ptr, float32x2x2_t val, __constrange(0,1) int lane);// VST2.32 {d0[0], d1[0]}, [r0]E-42 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用void vst2_lane_p8(__transfersize(2) poly8_t * ptr, poly8x8x2_t val, __constrange(0,7) int lane);// VST2.8 {d0[0], d1[0]}, [r0]void vst2_lane_p16(__transfersize(2) poly16_t * ptr, poly16x4x2_t val, __constrange(0,3) int lane);// VST2.16 {d0[0], d1[0]}, [r0]void 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]void 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]void 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]void 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]void vst3q_lane_f16(__transfersize(3) __fp16 * ptr, float16x8x3_t val, __constrange(0,7) int lane);// VST3.16 {d0[0], d2[0], d4[0]}, [r0]void 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]void 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]void 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]void 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]void 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]void 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]void 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]void 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]void vst3_lane_f16(__transfersize(3) __fp16 * ptr, float16x4x3_t val, __constrange(0,3) int lane);// VST3.16 {d0[0], d1[0], d2[0]}, [r0]void 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]void 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]void 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]void 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]void 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]void 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]void 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]void 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]void vst4q_lane_f32(__transfersize(4) float32_t * ptr, float32x4x4_t val, __constrange(0,3) int lane);<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-43ID 100419Non-Confidential,


NEON サポー ト の 使 用// VST4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0]void 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]void 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]void 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]void 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]void 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]void 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]void 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]void 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]void 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]void 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]void 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 vget_lane_u8(uint8x8_t vec, __constrange(0,7) int lane); // VMOV.U8 r0, d0[0]uint16_t vget_lane_u16(uint16x4_t vec, __constrange(0,3) int lane); // VMOV.U16 r0, d0[0]uint32_t vget_lane_u32(uint32x2_t vec, __constrange(0,1) int lane); // VMOV.32 r0, d0[0]int8_t vget_lane_s8(int8x8_t vec, __constrange(0,7) int lane); // VMOV.S8 r0, d0[0]int16_t vget_lane_s16(int16x4_t vec, __constrange(0,3) int lane); // VMOV.S16 r0, d0[0]int32_t vget_lane_s32(int32x2_t vec, __constrange(0,1) int lane); // VMOV.32 r0, d0[0]poly8_t vget_lane_p8(poly8x8_t vec, __constrange(0,7) int lane); // VMOV.U8 r0, d0[0]poly16_t vget_lane_p16(poly16x4_t vec, __constrange(0,3) int lane); // VMOV.U16 r0, d0[0]float32_t vget_lane_f32(float32x2_t vec, __constrange(0,1) int lane); // VMOV.32 r0, d0[0]uint8_t vgetq_lane_u8(uint8x16_t vec, __constrange(0,15) int lane); // VMOV.U8 r0, d0[0]uint16_t vgetq_lane_u16(uint16x8_t vec, __constrange(0,7) int lane); // VMOV.U16 r0, d0[0]uint32_t vgetq_lane_u32(uint32x4_t vec, __constrange(0,3) int lane); // VMOV.32 r0, d0[0]int8_t vgetq_lane_s8(int8x16_t vec, __constrange(0,15) int lane); // VMOV.S8 r0, d0[0]int16_t vgetq_lane_s16(int16x8_t vec, __constrange(0,7) int lane); // VMOV.S16 r0, d0[0]int32_t vgetq_lane_s32(int32x4_t vec, __constrange(0,3) int lane); // VMOV.32 r0, d0[0]poly8_t vgetq_lane_p8(poly8x16_t vec, __constrange(0,15) int lane); // VMOV.U8 r0, d0[0]poly16_t vgetq_lane_p16(poly16x8_t vec, __constrange(0,7) int lane); // VMOV.U16 r0, d0[0]float32_t vgetq_lane_f32(float32x4_t vec, __constrange(0,3) int lane); // VMOV.32 r0, d0[0]int64_t vget_lane_s64(int64x1_t vec, __constrange(0,0) int lane); // VMOV r0,r0,d0E-44 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用uint64_t vget_lane_u64(uint64x1_t vec, __constrange(0,0) int lane); // VMOV r0,r0,d0int64_t vgetq_lane_s64(int64x2_t vec, __constrange(0,1) int lane); // VMOV r0,r0,d0uint64_t vgetq_lane_u64(uint64x2_t vec, __constrange(0,1) int lane); // VMOV r0,r0,d0E.3.17ベクタ 内 のレーンの 設 定こ れら のコ ンパ イ ラ 組 み 込 み 関 数 では、 ベク タ 内 の 1 つのレーン ( 要 素 ) を設 定 し ます。uint8x8_t vset_lane_u8(uint8_t value, uint8x8_t vec, __constrange(0,7) int lane);// VMOV.8 d0[0],r0uint16x4_t vset_lane_u16(uint16_t value, uint16x4_t vec, __constrange(0,3) int lane);// VMOV.16 d0[0],r0uint32x2_t vset_lane_u32(uint32_t value, uint32x2_t vec, __constrange(0,1) int lane);// VMOV.32 d0[0],r0int8x8_t vset_lane_s8(int8_t value, int8x8_t vec, __constrange(0,7) int lane);// VMOV.8 d0[0],r0int16x4_t vset_lane_s16(int16_t value, int16x4_t vec, __constrange(0,3) int lane);// VMOV.16 d0[0],r0int32x2_t vset_lane_s32(int32_t value, int32x2_t vec, __constrange(0,1) int lane);// VMOV.32 d0[0],r0poly8x8_t vset_lane_p8(poly8_t value, poly8x8_t vec, __constrange(0,7) int lane);// VMOV.8 d0[0],r0poly16x4_t vset_lane_p16(poly16_t value, poly16x4_t vec, __constrange(0,3) int lane);// VMOV.16 d0[0],r0float32x2_t vset_lane_f32(float32_t value, float32x2_t vec, __constrange(0,1) int lane);// VMOV.32 d0[0],r0uint8x16_t vsetq_lane_u8(uint8_t value, uint8x16_t vec, __constrange(0,15) int lane);// VMOV.8 d0[0],r0uint16x8_t vsetq_lane_u16(uint16_t value, uint16x8_t vec, __constrange(0,7) int lane);// VMOV.16 d0[0],r0uint32x4_t vsetq_lane_u32(uint32_t value, uint32x4_t vec, __constrange(0,3) int lane);// VMOV.32 d0[0],r0int8x16_t vsetq_lane_s8(int8_t value, int8x16_t vec, __constrange(0,15) int lane);// VMOV.8 d0[0],r0int16x8_t vsetq_lane_s16(int16_t value, int16x8_t vec, __constrange(0,7) int lane);// VMOV.16 d0[0],r0int32x4_t vsetq_lane_s32(int32_t value, int32x4_t vec, __constrange(0,3) int lane);// VMOV.32 d0[0],r0poly8x16_t vsetq_lane_p8(poly8_t value, poly8x16_t vec, __constrange(0,15) int lane);// VMOV.8 d0[0],r0poly16x8_t vsetq_lane_p16(poly16_t value, poly16x8_t vec, __constrange(0,7) int lane);// VMOV.16 d0[0],r0float32x4_t vsetq_lane_f32(float32_t value, float32x4_t vec, __constrange(0,3) int lane);// VMOV.32 d0[0],r0int64x1_t vset_lane_s64(int64_t value, int64x1_t vec, __constrange(0,0) int lane);// VMOV d0,r0,r0uint64x1_t vset_lane_u64(uint64_t value, uint64x1_t vec, __constrange(0,0) int lane);// VMOV d0,r0,r0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-45ID 100419Non-Confidential,


NEON サポー ト の 使 用int64x2_t vsetq_lane_s64(int64_t value, int64x2_t vec, __constrange(0,1) int lane);// VMOV d0,r0,r0uint64x2_t vsetq_lane_u64(uint64_t value, uint64x2_t vec, __constrange(0,1) int lane);// VMOV d0,r0,r0E.3.18ビ ッ ト パタ ーンからのベ ク タの 初 期 化以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 リ テ ラ ルビ ッ ト パターンか らベ ク タ を 生成 します。int8x8_t vcreate_s8(uint64_t a); // VMOV d0,r0,r0int16x4_t vcreate_s16(uint64_t a); // VMOV d0,r0,r0int32x2_t vcreate_s32(uint64_t a); // VMOV d0,r0,r0float16x4_t vcreate_f16(uint64_t a); // VMOV d0,r0,r0float32x2_t vcreate_f32(uint64_t a); // VMOV d0,r0,r0uint8x8_t vcreate_u8(uint64_t a); // VMOV d0,r0,r0uint16x4_t vcreate_u16(uint64_t a); // VMOV d0,r0,r0uint32x2_t vcreate_u32(uint64_t a); // VMOV d0,r0,r0uint64x1_t vcreate_u64(uint64_t a); // VMOV d0,r0,r0poly8x8_t vcreate_p8(uint64_t a); // VMOV d0,r0,r0poly16x4_t vcreate_p16(uint64_t a); // VMOV d0,r0,r0int64x1_t vcreate_s64(uint64_t a); // VMOV d0,r0,r0E.3.19すべてのレーンを 同 じ 値 に 設 定以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 すべてのレーン を 同 じ 値 に 設 定 し ます。すべてのレーンを 同 じ 値 に 設 定uint8x8_t vdup_n_u8(uint8_t value); // VDUP.8 d0,r0uint16x4_t vdup_n_u16(uint16_t value); // VDUP.16 d0,r0uint32x2_t vdup_n_u32(uint32_t value); // VDUP.32 d0,r0int8x8_t vdup_n_s8(int8_t value); // VDUP.8 d0,r0int16x4_t vdup_n_s16(int16_t value); // VDUP.16 d0,r0int32x2_t vdup_n_s32(int32_t value); // VDUP.32 d0,r0poly8x8_t vdup_n_p8(poly8_t value); // VDUP.8 d0,r0poly16x4_t vdup_n_p16(poly16_t value); // VDUP.16 d0,r0float32x2_t vdup_n_f32(float32_t value); // VDUP.32 d0,r0uint8x16_t vdupq_n_u8(uint8_t value); // VDUP.8 q0,r0uint16x8_t vdupq_n_u16(uint16_t value); // VDUP.16 q0,r0uint32x4_t vdupq_n_u32(uint32_t value); // VDUP.32 q0,r0int8x16_t vdupq_n_s8(int8_t value); // VDUP.8 q0,r0int16x8_t vdupq_n_s16(int16_t value); // VDUP.16 q0,r0int32x4_t vdupq_n_s32(int32_t value); // VDUP.32 q0,r0poly8x16_t vdupq_n_p8(poly8_t value); // VDUP.8 q0,r0poly16x8_t vdupq_n_p16(poly16_t value); // VDUP.16 q0,r0float32x4_t vdupq_n_f32(float32_t value); // VDUP.32 q0,r0int64x1_t vdup_n_s64(int64_t value); // VMOV d0,r0,r0E-46 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用uint64x1_t vdup_n_u64(uint64_t value); // VMOV d0,r0,r0int64x2_t vdupq_n_s64(int64_t value); // VMOV d0,r0,r0uint64x2_t vdupq_n_u64(uint64_t value); // VMOV d0,r0,r0uint8x8_t vmov_n_u8(uint8_t value); // VDUP.8 d0,r0uint16x4_t vmov_n_u16(uint16_t value); // VDUP.16 d0,r0uint32x2_t vmov_n_u32(uint32_t value); // VDUP.32 d0,r0int8x8_t vmov_n_s8(int8_t value); // VDUP.8 d0,r0int16x4_t vmov_n_s16(int16_t value); // VDUP.16 d0,r0int32x2_t vmov_n_s32(int32_t value); // VDUP.32 d0,r0poly8x8_t vmov_n_p8(poly8_t value); // VDUP.8 d0,r0poly16x4_t vmov_n_p16(poly16_t value); // VDUP.16 d0,r0float32x2_t vmov_n_f32(float32_t value); // VDUP.32 d0,r0uint8x16_t vmovq_n_u8(uint8_t value); // VDUP.8 q0,r0uint16x8_t vmovq_n_u16(uint16_t value); // VDUP.16 q0,r0uint32x4_t vmovq_n_u32(uint32_t value); // VDUP.32 q0,r0int8x16_t vmovq_n_s8(int8_t value); // VDUP.8 q0,r0int16x8_t vmovq_n_s16(int16_t value); // VDUP.16 q0,r0int32x4_t vmovq_n_s32(int32_t value); // VDUP.32 q0,r0poly8x16_t vmovq_n_p8(poly8_t value); // VDUP.8 q0,r0poly16x8_t vmovq_n_p16(poly16_t value); // VDUP.16 q0,r0float32x4_t vmovq_n_f32(float32_t value); // VDUP.32 q0,r0int64x1_t vmov_n_s64(int64_t value); // VMOV d0,r0,r0uint64x1_t vmov_n_u64(uint64_t value); // VMOV d0,r0,r0int64x2_t vmovq_n_s64(int64_t value); // VMOV d0,r0,r0uint64x2_t vmovq_n_u64(uint64_t value); // VMOV d0,r0,r0すべてのレーンをベク タの 1 つのレーンの 値 に 設 定uint8x8_t vdup_lane_u8(uint8x8_t vec, __constrange(0,7) int lane); // VDUP.8 d0,d0[0]uint16x4_t vdup_lane_u16(uint16x4_t vec, __constrange(0,3) int lane); // VDUP.16 d0,d0[0]uint32x2_t vdup_lane_u32(uint32x2_t vec, __constrange(0,1) int lane); // VDUP.32 d0,d0[0]int8x8_t vdup_lane_s8(int8x8_t vec, __constrange(0,7) int lane); // VDUP.8 d0,d0[0]int16x4_t vdup_lane_s16(int16x4_t vec, __constrange(0,3) int lane); // VDUP.16 d0,d0[0]int32x2_t vdup_lane_s32(int32x2_t vec, __constrange(0,1) int lane); // VDUP.32 d0,d0[0]poly8x8_t vdup_lane_p8(poly8x8_t vec, __constrange(0,7) int lane); // VDUP.8 d0,d0[0]poly16x4_t vdup_lane_p16(poly16x4_t vec, __constrange(0,3) int lane); // VDUP.16 d0,d0[0]float32x2_t vdup_lane_f32(float32x2_t vec, __constrange(0,1) int lane); // VDUP.32 d0,d0[0]uint8x16_t vdupq_lane_u8(uint8x8_t vec, __constrange(0,7) int lane); // VDUP.8 q0,d0[0]uint16x8_t vdupq_lane_u16(uint16x4_t vec, __constrange(0,3) int lane); // VDUP.16 q0,d0[0]uint32x4_t vdupq_lane_u32(uint32x2_t vec, __constrange(0,1) int lane); // VDUP.32 q0,d0[0]int8x16_t vdupq_lane_s8(int8x8_t vec, __constrange(0,7) int lane); // VDUP.8 q0,d0[0]int16x8_t vdupq_lane_s16(int16x4_t vec, __constrange(0,3) int lane); // VDUP.16 q0,d0[0]int32x4_t vdupq_lane_s32(int32x2_t vec, __constrange(0,1) int lane); // VDUP.32 q0,d0[0]poly8x16_t vdupq_lane_p8(poly8x8_t vec, __constrange(0,7) int lane); // VDUP.8 q0,d0[0]poly16x8_t vdupq_lane_p16(poly16x4_t vec, __constrange(0,3) int lane); // VDUP.16 q0,d0[0]float32x4_t vdupq_lane_f32(float32x2_t vec, __constrange(0,1) int lane); // VDUP.32 q0,d0[0]int64x1_t vdup_lane_s64(int64x1_t vec, __constrange(0,0) int lane); // VMOV d0,d0uint64x1_t vdup_lane_u64(uint64x1_t vec, __constrange(0,0) int lane); // VMOV d0,d0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-47ID 100419Non-Confidential,


NEON サポー ト の 使 用int64x2_t vdupq_lane_s64(int64x1_t vec, __constrange(0,0) int lane); // VMOV q0,q0uint64x2_t vdupq_lane_u64(uint64x1_t vec, __constrange(0,0) int lane); // VMOV q0,q0E.3.20ベクタの 結 合こ れら の コ ンパイ ラ 組 み 込 み 関 数 では、 2 つの 64 ビッ トベクタを 結 合 して 1つの 128 ビッ トベクタにします。int8x16_t vcombine_s8(int8x8_t low, int8x8_t high); // VMOV d0,d0int16x8_t vcombine_s16(int16x4_t low, int16x4_t high); // VMOV d0,d0int32x4_t vcombine_s32(int32x2_t low, int32x2_t high); // VMOV d0,d0int64x2_t vcombine_s64(int64x1_t low, int64x1_t high); // VMOV d0,d0float16x8_t vcombine_f16(float16x4_t low, float16x4_t high); // VMOV d0,d0float32x4_t vcombine_f32(float32x2_t low, float32x2_t high); // VMOV d0,d0uint8x16_t vcombine_u8(uint8x8_t low, uint8x8_t high); // VMOV d0,d0uint16x8_t vcombine_u16(uint16x4_t low, uint16x4_t high); // VMOV d0,d0uint32x4_t vcombine_u32(uint32x2_t low, uint32x2_t high); // VMOV d0,d0uint64x2_t vcombine_u64(uint64x1_t low, uint64x1_t high); // VMOV d0,d0poly8x16_t vcombine_p8(poly8x8_t low, poly8x8_t high); // VMOV d0,d0poly16x8_t vcombine_p16(poly16x4_t low, poly16x4_t high); // VMOV d0,d0E.3.21ベクタの 分 割こ れら の コ ンパイ ラ 組 み 込 み 関 数 では、 1 つの 128 ビットベクタを 2 つのコ ンポーネン ト の 64 ビッ トベクタに 分 割 します。int8x8_t vget_high_s8(int8x16_t a); // VMOV d0,d0int16x4_t vget_high_s16(int16x8_t a); // VMOV d0,d0int32x2_t vget_high_s32(int32x4_t a); // VMOV d0,d0int64x1_t vget_high_s64(int64x2_t a); // VMOV d0,d0float16x4_t vget_high_f16(float16x8_t a); // VMOV d0,d0float32x2_t vget_high_f32(float32x4_t a); // VMOV d0,d0uint8x8_t vget_high_u8(uint8x16_t a); // VMOV d0,d0uint16x4_t vget_high_u16(uint16x8_t a); // VMOV d0,d0uint32x2_t vget_high_u32(uint32x4_t a); // VMOV d0,d0uint64x1_t vget_high_u64(uint64x2_t a); // VMOV d0,d0poly8x8_t vget_high_p8(poly8x16_t a); // VMOV d0,d0poly16x4_t vget_high_p16(poly16x8_t a); // VMOV d0,d0int8x8_t vget_low_s8(int8x16_t a); // VMOV d0,d0int16x4_t vget_low_s16(int16x8_t a); // VMOV d0,d0int32x2_t vget_low_s32(int32x4_t a); // VMOV d0,d0int64x1_t vget_low_s64(int64x2_t a); // VMOV d0,d0float16x4_t vget_low_f16(float16x8_t a); // VMOV d0,d0float32x2_t vget_low_f32(float32x4_t a); // VMOV d0,d0uint8x8_t vget_low_u8(uint8x16_t a); // VMOV d0,d0uint16x4_t vget_low_u16(uint16x8_t a); // VMOV d0,d0uint32x2_t vget_low_u32(uint32x4_t a); // VMOV d0,d0E-48 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用uint64x1_t vget_low_u64(uint64x2_t a); // VMOV d0,d0poly8x8_t vget_low_p8(poly8x16_t a); // VMOV d0,d0poly16x4_t vget_low_p16(poly16x8_t a); // VMOV d0,d0E.3.22ベクタの 変 換以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 ベ ク タ の 変 換 に 使 用 し ます。浮 動 小 数 点 からの 変 換int32x2_t vcvt_s32_f32(float32x2_t a);// VCVT.S32.F32 d0, d0uint32x2_t vcvt_u32_f32(float32x2_t a);// VCVT.U32.F32 d0, d0int32x4_t vcvtq_s32_f32(float32x4_t a);// VCVT.S32.F32 q0, q0uint32x4_t vcvtq_u32_f32(float32x4_t a);// VCVT.U32.F32 q0, q0int32x2_t vcvt_n_s32_f32(float32x2_t a, __constrange(1,32) int b); // VCVT.S32.F32 d0, d0, #32uint32x2_t vcvt_n_u32_f32(float32x2_t a, __constrange(1,32) int b); // VCVT.U32.F32 d0, d0, #32int32x4_t vcvtq_n_s32_f32(float32x4_t a, __constrange(1,32) int b); // VCVT.S32.F32 q0, q0, #32uint32x4_t vcvtq_n_u32_f32(float32x4_t a, __constrange(1,32) int b); // VCVT.U32.F32 q0, q0, #32浮 動 小 数 点 への 変 換float32x2_t vcvt_f32_s32(int32x2_t a);// VCVT.F32.S32 d0, d0float32x2_t vcvt_f32_u32(uint32x2_t a);// VCVT.F32.U32 d0, d0float32x4_t vcvtq_f32_s32(int32x4_t a);// VCVT.F32.S32 q0, q0float32x4_t vcvtq_f32_u32(uint32x4_t a);// VCVT.F32.U32 q0, q0float32x2_t vcvt_n_f32_s32(int32x2_t a, __constrange(1,32) int b); // VCVT.F32.S32 d0, d0, #32float32x2_t vcvt_n_f32_u32(uint32x2_t a, __constrange(1,32) int b); // VCVT.F32.U32 d0, d0, #32float32x4_t vcvtq_n_f32_s32(int32x4_t a, __constrange(1,32) int b); // VCVT.F32.S32 q0, q0, #32float32x4_t vcvtq_n_f32_u32(uint32x4_t a, __constrange(1,32) int b); // VCVT.F32.U32 q0, q0, #32浮 動 小 数 点 間 の 変 換float16x4_t vcvt_f16_f32(float32x4_t a); // VCVT.F16.F32 d0, q0float32x4_t vcvt_f32_f16(float16x4_t a); // VCVT.F32.F16 q0, d0ベクタ Narrow 整 数int8x8_t vmovn_s16(int16x8_t a); // VMOVN.I16 d0,q0int16x4_t vmovn_s32(int32x4_t a); // VMOVN.I32 d0,q0int32x2_t vmovn_s64(int64x2_t a); // VMOVN.I64 d0,q0uint8x8_t vmovn_u16(uint16x8_t a); // VMOVN.I16 d0,q0uint16x4_t vmovn_u32(uint32x4_t a); // VMOVN.I32 d0,q0uint32x2_t vmovn_u64(uint64x2_t a); // VMOVN.I64 d0,q0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-49ID 100419Non-Confidential,


NEON サポー ト の 使 用ベクタ Long 移 動int16x8_t vmovl_s8(int8x8_t a); // VMOVL.S8 q0,d0int32x4_t vmovl_s16(int16x4_t a); // VMOVL.S16 q0,d0int64x2_t vmovl_s32(int32x2_t a); // VMOVL.S32 q0,d0uint16x8_t vmovl_u8(uint8x8_t a); // VMOVL.U8 q0,d0uint32x4_t vmovl_u16(uint16x4_t a); // VMOVL.U16 q0,d0uint64x2_t vmovl_u32(uint32x2_t a); // VMOVL.U32 q0,d0ベクタサチュレート Narrow 整 数int8x8_t vqmovn_s16(int16x8_t a); // VQMOVN.S16 d0,q0int16x4_t vqmovn_s32(int32x4_t a); // VQMOVN.S32 d0,q0int32x2_t vqmovn_s64(int64x2_t a); // VQMOVN.S64 d0,q0uint8x8_t vqmovn_u16(uint16x8_t a); // VQMOVN.U16 d0,q0uint16x4_t vqmovn_u32(uint32x4_t a); // VQMOVN.U32 d0,q0uint32x2_t vqmovn_u64(uint64x2_t a); // VQMOVN.U64 d0,q0ベクタサチュレート Narrow 整 数 、 符 号 付 きから 符 号 な しへの 変 換uint8x8_t vqmovun_s16(int16x8_t a); // VQMOVUN.S16 d0,q0uint16x4_t vqmovun_s32(int32x4_t a); // VQMOVUN.S32 d0,q0uint32x2_t vqmovun_s64(int64x2_t a); // VQMOVUN.S64 d0,q0E.3.23テーブル 検 索uint8x8_t vtbl1_u8(uint8x8_t a, uint8x8_t b); // VTBL.8 d0, {d0}, d0int8x8_t vtbl1_s8(int8x8_t a, int8x8_t b); // VTBL.8 d0, {d0}, d0poly8x8_t vtbl1_p8(poly8x8_t a, uint8x8_t b); // VTBL.8 d0, {d0}, d0uint8x8_t vtbl2_u8(uint8x8x2_t a, uint8x8_t b); // VTBL.8 d0, {d0, d1}, d0int8x8_t vtbl2_s8(int8x8x2_t a, int8x8_t b); // VTBL.8 d0, {d0, d1}, d0poly8x8_t vtbl2_p8(poly8x8x2_t a, uint8x8_t b); // VTBL.8 d0, {d0, d1}, d0uint8x8_t vtbl3_u8(uint8x8x3_t a, uint8x8_t b); // VTBL.8 d0, {d0, d1, d2}, d0int8x8_t vtbl3_s8(int8x8x3_t a, int8x8_t b); // VTBL.8 d0, {d0, d1, d2}, d0poly8x8_t vtbl3_p8(poly8x8x3_t a, uint8x8_t b); // VTBL.8 d0, {d0, d1, d2}, d0uint8x8_t vtbl4_u8(uint8x8x4_t a, uint8x8_t b); // VTBL.8 d0, {d0, d1, d2, d3}, d0int8x8_t vtbl4_s8(int8x8x4_t a, int8x8_t b); // VTBL.8 d0, {d0, d1, d2, d3}, d0poly8x8_t vtbl4_p8(poly8x8x4_t a, uint8x8_t b); // VTBL.8 d0, {d0, d1, d2, d3}, d0E.3.24拡 張 テーブル 検 索 のコ ンパイ ラ 組 み 込 み 関 数uint8x8_t vtbx1_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); // VTBX.8 d0, {d0}, d0int8x8_t vtbx1_s8(int8x8_t a, int8x8_t b, int8x8_t c); // VTBX.8 d0, {d0}, d0poly8x8_t vtbx1_p8(poly8x8_t a, poly8x8_t b, uint8x8_t c); // VTBX.8 d0, {d0}, d0uint8x8_t vtbx2_u8(uint8x8_t a, uint8x8x2_t b, uint8x8_t c); // VTBX.8 d0, {d0, d1}, d0int8x8_t vtbx2_s8(int8x8_t a, int8x8x2_t b, int8x8_t c); // VTBX.8 d0, {d0, d1}, d0poly8x8_t vtbx2_p8(poly8x8_t a, poly8x8x2_t b, uint8x8_t c); // VTBX.8 d0, {d0, d1}, d0uint8x8_t vtbx3_u8(uint8x8_t a, uint8x8x3_t b, uint8x8_t c); // VTBX.8 d0, {d0, d1, d2}, d0E-50 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用int8x8_t vtbx3_s8(int8x8_t a, int8x8x3_t b, int8x8_t c); // VTBX.8 d0, {d0, d1, d2}, d0poly8x8_t vtbx3_p8(poly8x8_t a, poly8x8x3_t b, uint8x8_t c); // VTBX.8 d0, {d0, d1, d2}, d0uint8x8_t vtbx4_u8(uint8x8_t a, uint8x8x4_t b, uint8x8_t c); // VTBX.8 d0, {d0, d1, d2, d3}, d0int8x8_t vtbx4_s8(int8x8_t a, int8x8x4_t b, int8x8_t c); // VTBX.8 d0, {d0, d1, d2, d3}, d0poly8x8_t vtbx4_p8(poly8x8_t a, poly8x8x4_t b, uint8x8_t c); // VTBX.8 d0, {d0, d1, d2, d3}, d0E.3.25スカラ 値 での 演 算こ れら のコ ンパ イ ラ 組 み 込 み 関 数 については、 ス カ ラ 引 数 が 定 数 であ る 場 合 、または 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 vmlal_lane_s16(int32x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l);// VMLAL.S16 q0, d0, d0[0]int64x2_t vmlal_lane_s32(int64x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l);// VMLAL.S32 q0, d0, d0[0]uint32x4_t vmlal_lane_u16(uint32x4_t a, uint16x4_t b, uint16x4_t v, __constrange(0,3) int l);// VMLAL.U16 q0, d0, d0[0]uint64x2_t vmlal_lane_u32(uint64x2_t a, uint32x2_t b, uint32x2_t v, __constrange(0,1) int l);// VMLAL.U32 q0, d0, d0[0]<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-51ID 100419Non-Confidential,


NEON サポー ト の 使 用ス カ ラ によ るベ ク タ 拡 張 サチ ュ レー ト ダブル 積 和int32x4_tint64x2_tvqdmlal_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 vmlsl_lane_s16(int32x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l);// VMLSL.S16 q0, d0, d0[0]int64x2_t vmlsl_lane_s32(int64x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l);// VMLSL.S32 q0, d0, d0[0]uint32x4_t vmlsl_lane_u16(uint32x4_t a, uint16x4_t b, uint16x4_t v, __constrange(0,3) int l);// VMLSL.U16 q0, d0, d0[0]uint64x2_t vmlsl_lane_u32(uint64x2_t a, uint32x2_t b, uint32x2_t v, __constrange(0,1) int l);// VMLSL.U32 q0, d0, d0[0]ス カ ラ によ るベ ク タ 拡 張 サチ ュ レー ト ダブル 積 差int32x4_tint64x2_tvqdmlsl_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]E-52 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用スカラによるベクタ 乗 算int16x4_t vmul_n_s16(int16x4_t a, int16_t b); // VMUL.I16 d0,d0,d0[0]int32x2_t vmul_n_s32(int32x2_t a, int32_t b); // VMUL.I32 d0,d0,d0[0]float32x2_t vmul_n_f32(float32x2_t a, float32_t b); // VMUL.F32 d0,d0,d0[0]uint16x4_t vmul_n_u16(uint16x4_t a, uint16_t b); // VMUL.I16 d0,d0,d0[0]uint32x2_t vmul_n_u32(uint32x2_t a, uint32_t b); // VMUL.I32 d0,d0,d0[0]int16x8_t vmulq_n_s16(int16x8_t a, int16_t b); // VMUL.I16 q0,q0,d0[0]int32x4_t vmulq_n_s32(int32x4_t a, int32_t b); // VMUL.I32 q0,q0,d0[0]float32x4_t vmulq_n_f32(float32x4_t a, float32_t b); // VMUL.F32 q0,q0,d0[0]uint16x8_t vmulq_n_u16(uint16x8_t a, uint16_t b); // VMUL.I16 q0,q0,d0[0]uint32x4_t vmulq_n_u32(uint32x4_t a, uint32_t b); // VMUL.I32 q0,q0,d0[0]スカラによるベクタ Long 乗 算int32x4_t vmull_n_s16(int16x4_t vec1, int16_t val2); // VMULL.S16 q0,d0,d0[0]int64x2_t vmull_n_s32(int32x2_t vec1, int32_t val2); // VMULL.S32 q0,d0,d0[0]uint32x4_t vmull_n_u16(uint16x4_t vec1, uint16_t val2); // VMULL.U16 q0,d0,d0[0]uint64x2_t vmull_n_u32(uint32x2_t vec1, uint32_t val2); // VMULL.U32 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_tvmull_lane_s32(int32x2_t vec1, int32x2_t val2, __constrange(0, 1) int val3);// VMULL.S32 q0,d0,d0[0]uint32x4_tvmull_lane_u16(uint16x4_t vec1, uint16x4_t val2, __constrange(0, 3) int val3);// VMULL.U16 q0,d0,d0[0]uint64x2_tvmull_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);// VQDMULH.S16 d0,d0,d0[0]// VQDMULH.S32 d0,d0,d0[0]<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-53ID 100419Non-Confidential,


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 vqrdmulh_n_s16(int16x4_t vec1, int16_t val2);int32x2_t vqrdmulh_n_s32(int32x2_t vec1, int32_t val2);int16x8_t vqrdmulhq_n_s16(int16x8_t vec1, int16_t val2);int32x4_t vqrdmulhq_n_s32(int32x4_t vec1, int32_t val2);// VQRDMULH.S16 d0,d0,d0[0]// VQRDMULH.S32 d0,d0,d0[0]// VQRDMULH.S16 q0,q0,d0[0]// VQRDMULH.S32 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 vmla_n_s16(int16x4_t a, int16x4_t b, int16_t c); // VMLA.I16 d0, d0, d0[0]int32x2_t vmla_n_s32(int32x2_t a, int32x2_t b, int32_t c); // VMLA.I32 d0, d0, d0[0]uint16x4_t vmla_n_u16(uint16x4_t a, uint16x4_t b, uint16_t c); // VMLA.I16 d0, d0, d0[0]uint32x2_t vmla_n_u32(uint32x2_t a, uint32x2_t b, uint32_t c); // VMLA.I32 d0, d0, d0[0]float32x2_t vmla_n_f32(float32x2_t a, float32x2_t b, float32_t c); // VMLA.F32 d0, d0, d0[0]int16x8_t vmlaq_n_s16(int16x8_t a, int16x8_t b, int16_t c); // VMLA.I16 q0, q0, d0[0]int32x4_t vmlaq_n_s32(int32x4_t a, int32x4_t b, int32_t c); // VMLA.I32 q0, q0, d0[0]uint16x8_t vmlaq_n_u16(uint16x8_t a, uint16x8_t b, uint16_t c); // VMLA.I16 q0, q0, d0[0]uint32x4_t vmlaq_n_u32(uint32x4_t a, uint32x4_t b, uint32_t c); // VMLA.I32 q0, q0, d0[0]float32x4_t vmlaq_n_f32(float32x4_t a, float32x4_t b, float32_t c); // VMLA.F32 q0, q0, d0[0]E-54 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用ス カ ラによ るベク タ 拡 張 積 和int32x4_t vmlal_n_s16(int32x4_t a, int16x4_t b, int16_t c); // VMLAL.S16 q0, d0, d0[0]int64x2_t vmlal_n_s32(int64x2_t a, int32x2_t b, int32_t c); // VMLAL.S32 q0, d0, d0[0]uint32x4_t vmlal_n_u16(uint32x4_t a, uint16x4_t b, uint16_t c); // VMLAL.U16 q0, d0, d0[0]uint64x2_t vmlal_n_u32(uint64x2_t a, uint32x2_t b, uint32_t c); // VMLAL.U32 q0, d0, d0[0]ス カ ラによ るベク タ 拡 張 サチ ュ レー ト ダブル 積 和int32x4_t vqdmlal_n_s16(int32x4_t a, int16x4_t b, int16_t c); // VQDMLAL.S16 q0, d0, d0[0]int64x2_t vqdmlal_n_s32(int64x2_t a, int32x2_t b, int32_t c); // VQDMLAL.S32 q0, d0, d0[0]スカラによるベクタ 積 差int16x4_t vmls_n_s16(int16x4_t a, int16x4_t b, int16_t c); // VMLS.I16 d0, d0, d0[0]int32x2_t vmls_n_s32(int32x2_t a, int32x2_t b, int32_t c); // VMLS.I32 d0, d0, d0[0]uint16x4_t vmls_n_u16(uint16x4_t a, uint16x4_t b, uint16_t c); // VMLS.I16 d0, d0, d0[0]uint32x2_t vmls_n_u32(uint32x2_t a, uint32x2_t b, uint32_t c); // VMLS.I32 d0, d0, d0[0]float32x2_t vmls_n_f32(float32x2_t a, float32x2_t b, float32_t c); // VMLS.F32 d0, d0, d0[0]int16x8_t vmlsq_n_s16(int16x8_t a, int16x8_t b, int16_t c); // VMLS.I16 q0, q0, d0[0]int32x4_t vmlsq_n_s32(int32x4_t a, int32x4_t b, int32_t c); // VMLS.I32 q0, q0, d0[0]uint16x8_t vmlsq_n_u16(uint16x8_t a, uint16x8_t b, uint16_t c); // VMLS.I16 q0, q0, d0[0]uint32x4_t vmlsq_n_u32(uint32x4_t a, uint32x4_t b, uint32_t c); // VMLS.I32 q0, q0, d0[0]float32x4_t vmlsq_n_f32(float32x4_t a, float32x4_t b, float32_t c); // VMLS.F32 q0, q0, d0[0]ス カ ラによ るベク タ 拡 張 積 差int32x4_t vmlsl_n_s16(int32x4_t a, int16x4_t b, int16_t c); // VMLSL.S16 q0, d0, d0[0]int64x2_t vmlsl_n_s32(int64x2_t a, int32x2_t b, int32_t c); // VMLSL.S32 q0, d0, d0[0]uint32x4_t vmlsl_n_u16(uint32x4_t a, uint16x4_t b, uint16_t c); // VMLSL.U16 q0, d0, d0[0]uint64x2_t vmlsl_n_u32(uint64x2_t a, uint32x2_t b, uint32_t c); // VMLSL.U32 q0, d0, d0[0]ス カ ラによ るベク タ 拡 張 サチ ュ レー ト ダブル 積 差int32x4_t vqdmlsl_n_s16(int32x4_t a, int16x4_t b, int16_t c); // VQDMLSL.S16 q0, d0, d0[0]int64x2_t vqdmlsl_n_s32(int64x2_t a, int32x2_t b, int32_t c); // VQDMLSL.S32 q0, d0, d0[0]E.3.26ベクタ 抽 出int8x8_t vext_s8(int8x8_t a, int8x8_t b, __constrange(0,7) int c); // VEXT.8 d0,d0,d0,#0uint8x8_t vext_u8(uint8x8_t a, uint8x8_t b, __constrange(0,7) int c); // VEXT.8 d0,d0,d0,#0poly8x8_t vext_p8(poly8x8_t a, poly8x8_t b, __constrange(0,7) int c); // VEXT.8 d0,d0,d0,#0int16x4_t vext_s16(int16x4_t a, int16x4_t b, __constrange(0,3) int c); // VEXT.16 d0,d0,d0,#0uint16x4_t vext_u16(uint16x4_t a, uint16x4_t b, __constrange(0,3) int c); // VEXT.16 d0,d0,d0,#0poly16x4_t vext_p16(poly16x4_t a, poly16x4_t b, __constrange(0,3) int c); // VEXT.16 d0,d0,d0,#0int32x2_t vext_s32(int32x2_t a, int32x2_t b, __constrange(0,1) int c); // VEXT.32 d0,d0,d0,#0uint32x2_t vext_u32(uint32x2_t a, uint32x2_t b, __constrange(0,1) int c); // VEXT.32 d0,d0,d0,#0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-55ID 100419Non-Confidential,


NEON サポー ト の 使 用int64x1_t vext_s64(int64x1_t a, int64x1_t b, __constrange(0,0) int c); // VEXT.64 d0,d0,d0,#0uint64x1_t vext_u64(uint64x1_t a, uint64x1_t b, __constrange(0,0) int c); // VEXT.64 d0,d0,d0,#0int8x16_t vextq_s8(int8x16_t a, int8x16_t b, __constrange(0,15) int c); // VEXT.8 q0,q0,q0,#0uint8x16_t vextq_u8(uint8x16_t a, uint8x16_t b, __constrange(0,15) int c); // VEXT.8 q0,q0,q0,#0poly8x16_t vextq_p8(poly8x16_t a, poly8x16_t b, __constrange(0,15) int c); // VEXT.8 q0,q0,q0,#0int16x8_t vextq_s16(int16x8_t a, int16x8_t b, __constrange(0,7) int c); // VEXT.16 q0,q0,q0,#0uint16x8_t vextq_u16(uint16x8_t a, uint16x8_t b, __constrange(0,7) int c); // VEXT.16 q0,q0,q0,#0poly16x8_t vextq_p16(poly16x8_t a, poly16x8_t b, __constrange(0,7) int c); // VEXT.16 q0,q0,q0,#0int32x4_t vextq_s32(int32x4_t a, int32x4_t b, __constrange(0,3) int c); // VEXT.32 q0,q0,q0,#0uint32x4_t vextq_u32(uint32x4_t a, uint32x4_t b, __constrange(0,3) int c); // VEXT.32 q0,q0,q0,#0int64x2_t vextq_s64(int64x2_t a, int64x2_t b, __constrange(0,1) int c); // VEXT.64 q0,q0,q0,#0uint64x2_t vextq_u64(uint64x2_t a, uint64x2_t b, __constrange(0,1) int c); // VEXT.64 q0,q0,q0,#0E.3.27 ベ ク タ 要 素 の 反 転 (エンデ ィ ア ン 方 式 のスワ ッ プ)VREVn.m では、 n ビッ ト 幅 のセッ ト 内 の m ビ ッ ト レーンの 順 序 を 反 転 します。int8x8_t vrev64_s8(int8x8_t vec); // VREV64.8 d0,d0int16x4_t vrev64_s16(int16x4_t vec); // VREV64.16 d0,d0int32x2_t vrev64_s32(int32x2_t vec); // VREV64.32 d0,d0uint8x8_t vrev64_u8(uint8x8_t vec); // VREV64.8 d0,d0uint16x4_t vrev64_u16(uint16x4_t vec); // VREV64.16 d0,d0uint32x2_t vrev64_u32(uint32x2_t vec); // VREV64.32 d0,d0poly8x8_t vrev64_p8(poly8x8_t vec); // VREV64.8 d0,d0poly16x4_t vrev64_p16(poly16x4_t vec); // VREV64.16 d0,d0float32x2_t vrev64_f32(float32x2_t vec); // VREV64.32 d0,d0int8x16_t vrev64q_s8(int8x16_t vec); // VREV64.8 q0,q0int16x8_t vrev64q_s16(int16x8_t vec); // VREV64.16 q0,q0int32x4_t vrev64q_s32(int32x4_t vec); // VREV64.32 q0,q0uint8x16_t vrev64q_u8(uint8x16_t vec); // VREV64.8 q0,q0uint16x8_t vrev64q_u16(uint16x8_t vec); // VREV64.16 q0,q0uint32x4_t vrev64q_u32(uint32x4_t vec); // VREV64.32 q0,q0poly8x16_t vrev64q_p8(poly8x16_t vec); // VREV64.8 q0,q0poly16x8_t vrev64q_p16(poly16x8_t vec); // VREV64.16 q0,q0float32x4_t vrev64q_f32(float32x4_t vec); // VREV64.32 q0,q0int8x8_t vrev32_s8(int8x8_t vec); // VREV32.8 d0,d0int16x4_t vrev32_s16(int16x4_t vec); // VREV32.16 d0,d0uint8x8_t vrev32_u8(uint8x8_t vec); // VREV32.8 d0,d0uint16x4_t vrev32_u16(uint16x4_t vec); // VREV32.16 d0,d0poly8x8_t vrev32_p8(poly8x8_t vec); // VREV32.8 d0,d0int8x16_t vrev32q_s8(int8x16_t vec); // VREV32.8 q0,q0int16x8_t vrev32q_s16(int16x8_t vec); // VREV32.16 q0,q0uint8x16_t vrev32q_u8(uint8x16_t vec); // VREV32.8 q0,q0uint16x8_t vrev32q_u16(uint16x8_t vec); // VREV32.16 q0,q0poly8x16_t vrev32q_p8(poly8x16_t vec); // VREV32.8 q0,q0int8x8_t vrev16_s8(int8x8_t vec); // VREV16.8 d0,d0uint8x8_t vrev16_u8(uint8x8_t vec); // VREV16.8 d0,d0poly8x8_t vrev16_p8(poly8x8_t vec); // VREV16.8 d0,d0E-56 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用int8x16_t vrev16q_s8(int8x16_t vec); // VREV16.8 q0,q0uint8x16_t vrev16q_u8(uint8x16_t vec); // VREV16.8 q0,q0poly8x16_t vrev16q_p8(poly8x16_t vec); // VREV16.8 q0,q0E.3.28その 他 の 単 一 オペラ ン ド の 算 術 演 算以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 その 他 の 単 一 オペラ ン ド の 数 学 関 数 です。絶 対 値 : Vd[i] = |Va[i]|int8x8_t vabs_s8(int8x8_t a); // VABS.S8 d0,d0int16x4_t vabs_s16(int16x4_t a); // VABS.S16 d0,d0int32x2_t vabs_s32(int32x2_t a); // VABS.S32 d0,d0float32x2_t vabs_f32(float32x2_t a); // VABS.F32 d0,d0int8x16_t vabsq_s8(int8x16_t a); // VABS.S8 q0,q0int16x8_t vabsq_s16(int16x8_t a); // VABS.S16 q0,q0int32x4_t vabsq_s32(int32x4_t a); // VABS.S32 q0,q0float32x4_t vabsq_f32(float32x4_t a); // VABS.F32 q0,q0サチ ュ レー ト 絶 対 値 : Vd[i] = sat(|Va[i]|)int8x8_t vqabs_s8(int8x8_t a); // VQABS.S8 d0,d0int16x4_t vqabs_s16(int16x4_t a); // VQABS.S16 d0,d0int32x2_t vqabs_s32(int32x2_t a); // VQABS.S32 d0,d0int8x16_t vqabsq_s8(int8x16_t a); // VQABS.S8 q0,q0int16x8_t vqabsq_s16(int16x8_t a); // VQABS.S16 q0,q0int32x4_t vqabsq_s32(int32x4_t a); // VQABS.S32 q0,q0反 転 : Vd[i] = - Va[i]int8x8_t vneg_s8(int8x8_t a); // VNEG.S8 d0,d0int16x4_t vneg_s16(int16x4_t a); // VNEG.S16 d0,d0int32x2_t vneg_s32(int32x2_t a); // VNEG.S32 d0,d0float32x2_t vneg_f32(float32x2_t a); // VNEG.F32 d0,d0int8x16_t vnegq_s8(int8x16_t a); // VNEG.S8 q0,q0int16x8_t vnegq_s16(int16x8_t a); // VNEG.S16 q0,q0int32x4_t vnegq_s32(int32x4_t a); // VNEG.S32 q0,q0float32x4_t vnegq_f32(float32x4_t a); // VNEG.F32 q0,q0サチュレー ト 反 転 : sat(Vd[i] = - Va[i])int8x8_t vqneg_s8(int8x8_t a); // VQNEG.S8 d0,d0int16x4_t vqneg_s16(int16x4_t a); // VQNEG.S16 d0,d0int32x2_t vqneg_s32(int32x2_t a); // VQNEG.S32 d0,d0int8x16_t vqnegq_s8(int8x16_t a); // VQNEG.S8 q0,q0int16x8_t vqnegq_s16(int16x8_t a); // VQNEG.S16 q0,q0int32x4_t vqnegq_s32(int32x4_t a); // VQNEG.S32 q0,q0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-57ID 100419Non-Confidential,


NEON サポー ト の 使 用先 行 符 号 ビ ッ ト カウン トint8x8_t vcls_s8(int8x8_t a); // VCLS.S8 d0,d0int16x4_t vcls_s16(int16x4_t a); // VCLS.S16 d0,d0int32x2_t vcls_s32(int32x2_t a); // VCLS.S32 d0,d0int8x16_t vclsq_s8(int8x16_t a); // VCLS.S8 q0,q0int16x8_t vclsq_s16(int16x8_t a); // VCLS.S16 q0,q0int32x4_t vclsq_s32(int32x4_t a); // VCLS.S32 q0,q0先 行 ゼロ カウン トint8x8_t vclz_s8(int8x8_t a); // VCLZ.I8 d0,d0int16x4_t vclz_s16(int16x4_t a); // VCLZ.I16 d0,d0int32x2_t vclz_s32(int32x2_t a); // VCLZ.I32 d0,d0uint8x8_t vclz_u8(uint8x8_t a); // VCLZ.I8 d0,d0uint16x4_t vclz_u16(uint16x4_t a); // VCLZ.I16 d0,d0uint32x2_t vclz_u32(uint32x2_t a); // VCLZ.I32 d0,d0int8x16_t vclzq_s8(int8x16_t a); // VCLZ.I8 q0,q0int16x8_t vclzq_s16(int16x8_t a); // VCLZ.I16 q0,q0int32x4_t vclzq_s32(int32x4_t a); // VCLZ.I32 q0,q0uint8x16_t vclzq_u8(uint8x16_t a); // VCLZ.I8 q0,q0uint16x8_t vclzq_u16(uint16x8_t a); // VCLZ.I16 q0,q0uint32x4_t vclzq_u32(uint32x4_t a); // VCLZ.I32 q0,q0セッ トビッ ト 数 カウントuint8x8_t vcnt_u8(uint8x8_t a); // VCNT.8 d0,d0int8x8_t vcnt_s8(int8x8_t a); // VCNT.8 d0,d0poly8x8_t vcnt_p8(poly8x8_t a); // VCNT.8 d0,d0uint8x16_t vcntq_u8(uint8x16_t a); // VCNT.8 q0,q0int8x16_t vcntq_s8(int8x16_t a); // VCNT.8 q0,q0poly8x16_t vcntq_p8(poly8x16_t a); // VCNT.8 q0,q0逆 数 の 推 定float32x2_t vrecpe_f32(float32x2_t a); // VRECPE.F32 d0,d0uint32x2_t vrecpe_u32(uint32x2_t a); // VRECPE.U32 d0,d0float32x4_t vrecpeq_f32(float32x4_t a); // VRECPE.F32 q0,q0uint32x4_t vrecpeq_u32(uint32x4_t a); // VRECPE.U32 q0,q0逆 平 方 根 の 推 定float32x2_t vrsqrte_f32(float32x2_t a); // VRSQRTE.F32 d0,d0uint32x2_t vrsqrte_u32(uint32x2_t a); // VRSQRTE.U32 d0,d0float32x4_t vrsqrteq_f32(float32x4_t a); // VRSQRTE.F32 q0,q0uint32x4_t vrsqrteq_u32(uint32x4_t a); // VRSQRTE.U32 q0,q0E-58 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用E.3.29論 理 演 算以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 ビ ッ ト ご と の 論 理 演 算 に 使 用 し ます。ビット 否 定int8x8_t vmvn_s8(int8x8_t a); // VMVN d0,d0int16x4_t vmvn_s16(int16x4_t a); // VMVN d0,d0int32x2_t vmvn_s32(int32x2_t a); // VMVN d0,d0uint8x8_t vmvn_u8(uint8x8_t a); // VMVN d0,d0uint16x4_t vmvn_u16(uint16x4_t a); // VMVN d0,d0uint32x2_t vmvn_u32(uint32x2_t a); // VMVN d0,d0poly8x8_t vmvn_p8(poly8x8_t a); // VMVN d0,d0int8x16_t vmvnq_s8(int8x16_t a); // VMVN q0,q0int16x8_t vmvnq_s16(int16x8_t a); // VMVN q0,q0int32x4_t vmvnq_s32(int32x4_t a); // VMVN q0,q0uint8x16_t vmvnq_u8(uint8x16_t a); // VMVN q0,q0uint16x8_t vmvnq_u16(uint16x8_t a); // VMVN q0,q0uint32x4_t vmvnq_u32(uint32x4_t a); // VMVN q0,q0poly8x16_t vmvnq_p8(poly8x16_t a); // VMVN q0,q0ビ ッ ト 単 位 論 理 積int8x8_t vand_s8(int8x8_t a, int8x8_t b); // VAND d0,d0,d0int16x4_t vand_s16(int16x4_t a, int16x4_t b); // VAND d0,d0,d0int32x2_t vand_s32(int32x2_t a, int32x2_t b); // VAND d0,d0,d0int64x1_t vand_s64(int64x1_t a, int64x1_t b); // VAND d0,d0,d0uint8x8_t vand_u8(uint8x8_t a, uint8x8_t b); // VAND d0,d0,d0uint16x4_t vand_u16(uint16x4_t a, uint16x4_t b); // VAND d0,d0,d0uint32x2_t vand_u32(uint32x2_t a, uint32x2_t b); // VAND d0,d0,d0uint64x1_t vand_u64(uint64x1_t a, uint64x1_t b); // VAND d0,d0,d0int8x16_t vandq_s8(int8x16_t a, int8x16_t b); // VAND q0,q0,q0int16x8_t vandq_s16(int16x8_t a, int16x8_t b); // VAND q0,q0,q0int32x4_t vandq_s32(int32x4_t a, int32x4_t b); // VAND q0,q0,q0int64x2_t vandq_s64(int64x2_t a, int64x2_t b); // VAND q0,q0,q0uint8x16_t vandq_u8(uint8x16_t a, uint8x16_t b); // VAND q0,q0,q0uint16x8_t vandq_u16(uint16x8_t a, uint16x8_t b); // VAND q0,q0,q0uint32x4_t vandq_u32(uint32x4_t a, uint32x4_t b); // VAND q0,q0,q0uint64x2_t vandq_u64(uint64x2_t a, uint64x2_t b); // VAND q0,q0,q0ビ ッ ト 論 理 和int8x8_t vorr_s8(int8x8_t a, int8x8_t b); // VORR d0,d0,d0int16x4_t vorr_s16(int16x4_t a, int16x4_t b); // VORR d0,d0,d0int32x2_t vorr_s32(int32x2_t a, int32x2_t b); // VORR d0,d0,d0int64x1_t vorr_s64(int64x1_t a, int64x1_t b); // VORR d0,d0,d0uint8x8_t vorr_u8(uint8x8_t a, uint8x8_t b); // VORR d0,d0,d0uint16x4_t vorr_u16(uint16x4_t a, uint16x4_t b); // VORR d0,d0,d0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-59ID 100419Non-Confidential,


NEON サポー ト の 使 用uint32x2_t vorr_u32(uint32x2_t a, uint32x2_t b); // VORR d0,d0,d0uint64x1_t vorr_u64(uint64x1_t a, uint64x1_t b); // VORR d0,d0,d0int8x16_t vorrq_s8(int8x16_t a, int8x16_t b); // VORR q0,q0,q0int16x8_t vorrq_s16(int16x8_t a, int16x8_t b); // VORR q0,q0,q0int32x4_t vorrq_s32(int32x4_t a, int32x4_t b); // VORR q0,q0,q0int64x2_t vorrq_s64(int64x2_t a, int64x2_t b); // VORR q0,q0,q0uint8x16_t vorrq_u8(uint8x16_t a, uint8x16_t b); // VORR q0,q0,q0uint16x8_t vorrq_u16(uint16x8_t a, uint16x8_t b); // VORR q0,q0,q0uint32x4_t vorrq_u32(uint32x4_t a, uint32x4_t b); // VORR q0,q0,q0uint64x2_t vorrq_u64(uint64x2_t a, uint64x2_t b); // VORR q0,q0,q0ビ ッ ト 排 他 的 論 理 和 (EOR または XOR)int8x8_t veor_s8(int8x8_t a, int8x8_t b); // VEOR d0,d0,d0int16x4_t veor_s16(int16x4_t a, int16x4_t b); // VEOR d0,d0,d0int32x2_t veor_s32(int32x2_t a, int32x2_t b); // VEOR d0,d0,d0int64x1_t veor_s64(int64x1_t a, int64x1_t b); // VEOR d0,d0,d0uint8x8_t veor_u8(uint8x8_t a, uint8x8_t b); // VEOR d0,d0,d0uint16x4_t veor_u16(uint16x4_t a, uint16x4_t b); // VEOR d0,d0,d0uint32x2_t veor_u32(uint32x2_t a, uint32x2_t b); // VEOR d0,d0,d0uint64x1_t veor_u64(uint64x1_t a, uint64x1_t b); // VEOR d0,d0,d0int8x16_t veorq_s8(int8x16_t a, int8x16_t b); // VEOR q0,q0,q0int16x8_t veorq_s16(int16x8_t a, int16x8_t b); // VEOR q0,q0,q0int32x4_t veorq_s32(int32x4_t a, int32x4_t b); // VEOR q0,q0,q0int64x2_t veorq_s64(int64x2_t a, int64x2_t b); // VEOR q0,q0,q0uint8x16_t veorq_u8(uint8x16_t a, uint8x16_t b); // VEOR q0,q0,q0uint16x8_t veorq_u16(uint16x8_t a, uint16x8_t b); // VEOR q0,q0,q0uint32x4_t veorq_u32(uint32x4_t a, uint32x4_t b); // VEOR q0,q0,q0uint64x2_t veorq_u64(uint64x2_t a, uint64x2_t b); // VEOR q0,q0,q0ビットクリアint8x8_t vbic_s8(int8x8_t a, int8x8_t b); // VBIC d0,d0,d0int16x4_t vbic_s16(int16x4_t a, int16x4_t b); // VBIC d0,d0,d0int32x2_t vbic_s32(int32x2_t a, int32x2_t b); // VBIC d0,d0,d0int64x1_t vbic_s64(int64x1_t a, int64x1_t b); // VBIC d0,d0,d0uint8x8_t vbic_u8(uint8x8_t a, uint8x8_t b); // VBIC d0,d0,d0uint16x4_t vbic_u16(uint16x4_t a, uint16x4_t b); // VBIC d0,d0,d0uint32x2_t vbic_u32(uint32x2_t a, uint32x2_t b); // VBIC d0,d0,d0uint64x1_t vbic_u64(uint64x1_t a, uint64x1_t b); // VBIC d0,d0,d0int8x16_t vbicq_s8(int8x16_t a, int8x16_t b); // VBIC q0,q0,q0int16x8_t vbicq_s16(int16x8_t a, int16x8_t b); // VBIC q0,q0,q0int32x4_t vbicq_s32(int32x4_t a, int32x4_t b); // VBIC q0,q0,q0int64x2_t vbicq_s64(int64x2_t a, int64x2_t b); // VBIC q0,q0,q0uint8x16_t vbicq_u8(uint8x16_t a, uint8x16_t b); // VBIC q0,q0,q0uint16x8_t vbicq_u16(uint16x8_t a, uint16x8_t b); // VBIC q0,q0,q0uint32x4_t vbicq_u32(uint32x4_t a, uint32x4_t b); // VBIC q0,q0,q0uint64x2_t vbicq_u64(uint64x2_t a, uint64x2_t b); // VBIC q0,q0,q0E-60 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用ビ ッ ト 論 理 和 補 数int8x8_t vorn_s8(int8x8_t a, int8x8_t b); // VORN d0,d0,d0int16x4_t vorn_s16(int16x4_t a, int16x4_t b); // VORN d0,d0,d0int32x2_t vorn_s32(int32x2_t a, int32x2_t b); // VORN d0,d0,d0int64x1_t vorn_s64(int64x1_t a, int64x1_t b); // VORN d0,d0,d0uint8x8_t vorn_u8(uint8x8_t a, uint8x8_t b); // VORN d0,d0,d0uint16x4_t vorn_u16(uint16x4_t a, uint16x4_t b); // VORN d0,d0,d0uint32x2_t vorn_u32(uint32x2_t a, uint32x2_t b); // VORN d0,d0,d0uint64x1_t vorn_u64(uint64x1_t a, uint64x1_t b); // VORN d0,d0,d0int8x16_t vornq_s8(int8x16_t a, int8x16_t b); // VORN q0,q0,q0int16x8_t vornq_s16(int16x8_t a, int16x8_t b); // VORN q0,q0,q0int32x4_t vornq_s32(int32x4_t a, int32x4_t b); // VORN q0,q0,q0int64x2_t vornq_s64(int64x2_t a, int64x2_t b); // VORN q0,q0,q0uint8x16_t vornq_u8(uint8x16_t a, uint8x16_t b); // VORN q0,q0,q0uint16x8_t vornq_u16(uint16x8_t a, uint16x8_t b); // VORN q0,q0,q0uint32x4_t vornq_u32(uint32x4_t a, uint32x4_t b); // VORN q0,q0,q0uint64x2_t vornq_u64(uint64x2_t a, uint64x2_t b); // VORN q0,q0,q0ビ ッ ト 単 位 の 選 択注こ の コ ンパイ ラ 組 み 込 み 関 数 は、 レ ジ ス タ の 割 り 当 てに よ って、VBSL/VBIF/VBIT のいずれかにコンパイルされます。int8x8_t vbsl_s8(uint8x8_t a, int8x8_t b, int8x8_t c); // VBSL d0,d0,d0int16x4_t vbsl_s16(uint16x4_t a, int16x4_t b, int16x4_t c); // VBSL d0,d0,d0int32x2_t vbsl_s32(uint32x2_t a, int32x2_t b, int32x2_t c); // VBSL d0,d0,d0int64x1_t vbsl_s64(uint64x1_t a, int64x1_t b, int64x1_t c); // VBSL d0,d0,d0uint8x8_t vbsl_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); // VBSL d0,d0,d0uint16x4_t vbsl_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c); // VBSL d0,d0,d0uint32x2_t vbsl_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c); // VBSL d0,d0,d0uint64x1_t vbsl_u64(uint64x1_t a, uint64x1_t b, uint64x1_t c); // VBSL d0,d0,d0float32x2_t vbsl_f32(uint32x2_t a, float32x2_t b, float32x2_t c); // VBSL d0,d0,d0poly8x8_t vbsl_p8(uint8x8_t a, poly8x8_t b, poly8x8_t c); // VBSL d0,d0,d0poly16x4_t vbsl_p16(uint16x4_t a, poly16x4_t b, poly16x4_t c); // VBSL d0,d0,d0int8x16_t vbslq_s8(uint8x16_t a, int8x16_t b, int8x16_t c); // VBSL q0,q0,q0int16x8_t vbslq_s16(uint16x8_t a, int16x8_t b, int16x8_t c); // VBSL q0,q0,q0int32x4_t vbslq_s32(uint32x4_t a, int32x4_t b, int32x4_t c); // VBSL q0,q0,q0int64x2_t vbslq_s64(uint64x2_t a, int64x2_t b, int64x2_t c); // VBSL q0,q0,q0uint8x16_t vbslq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c); // VBSL q0,q0,q0uint16x8_t vbslq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c); // VBSL q0,q0,q0uint32x4_t vbslq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c); // VBSL q0,q0,q0uint64x2_t vbslq_u64(uint64x2_t a, uint64x2_t b, uint64x2_t c); // VBSL q0,q0,q0float32x4_t vbslq_f32(uint32x4_t a, float32x4_t b, float32x4_t c); // VBSL q0,q0,q0poly8x16_t vbslq_p8(uint8x16_t a, poly8x16_t b, poly8x16_t c); // VBSL q0,q0,q0poly16x8_t vbslq_p16(uint16x8_t a, poly16x8_t b, poly16x8_t c); // VBSL q0,q0,q0<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-61ID 100419Non-Confidential,


NEON サポー ト の 使 用E.3.30転 置 操 作こ れら の コ ンパイ ラ 組 み 込 み 関 数 は、 転 置 操 作 に 使 用 し ます。要 素 の 置 換int8x8x2_t vtrn_s8(int8x8_t a, int8x8_t b); // VTRN.8 d0,d0int16x4x2_t vtrn_s16(int16x4_t a, int16x4_t b); // VTRN.16 d0,d0int32x2x2_t vtrn_s32(int32x2_t a, int32x2_t b); // VTRN.32 d0,d0uint8x8x2_t vtrn_u8(uint8x8_t a, uint8x8_t b); // VTRN.8 d0,d0uint16x4x2_t vtrn_u16(uint16x4_t a, uint16x4_t b); // VTRN.16 d0,d0uint32x2x2_t vtrn_u32(uint32x2_t a, uint32x2_t b); // VTRN.32 d0,d0float32x2x2_t vtrn_f32(float32x2_t a, float32x2_t b); // VTRN.32 d0,d0poly8x8x2_t vtrn_p8(poly8x8_t a, poly8x8_t b); // VTRN.8 d0,d0poly16x4x2_t vtrn_p16(poly16x4_t a, poly16x4_t b); // VTRN.16 d0,d0int8x16x2_t vtrnq_s8(int8x16_t a, int8x16_t b); // VTRN.8 q0,q0int16x8x2_t vtrnq_s16(int16x8_t a, int16x8_t b); // VTRN.16 q0,q0int32x4x2_t vtrnq_s32(int32x4_t a, int32x4_t b); // VTRN.32 q0,q0uint8x16x2_t vtrnq_u8(uint8x16_t a, uint8x16_t b); // VTRN.8 q0,q0uint16x8x2_t vtrnq_u16(uint16x8_t a, uint16x8_t b); // VTRN.16 q0,q0uint32x4x2_t vtrnq_u32(uint32x4_t a, uint32x4_t b); // VTRN.32 q0,q0float32x4x2_t vtrnq_f32(float32x4_t a, float32x4_t b); // VTRN.32 q0,q0poly8x16x2_t vtrnq_p8(poly8x16_t a, poly8x16_t b); // VTRN.8 q0,q0poly16x8x2_t vtrnq_p16(poly16x8_t a, poly16x8_t b); // VTRN.16 q0,q0要 素 のイ ン タ ー リ ーブint8x8x2_t vzip_s8(int8x8_t a, int8x8_t b); // VZIP.8 d0,d0int16x4x2_t vzip_s16(int16x4_t a, int16x4_t b); // VZIP.16 d0,d0uint8x8x2_t vzip_u8(uint8x8_t a, uint8x8_t b); // VZIP.8 d0,d0uint16x4x2_t vzip_u16(uint16x4_t a, uint16x4_t b); // VZIP.16 d0,d0float32x2x2_t vzip_f32(float32x2_t a, float32x2_t b); // VZIP.32 d0,d0poly8x8x2_t vzip_p8(poly8x8_t a, poly8x8_t b); // VZIP.8 d0,d0poly16x4x2_t vzip_p16(poly16x4_t a, poly16x4_t b); // VZIP.16 d0,d0int8x16x2_t vzipq_s8(int8x16_t a, int8x16_t b); // VZIP.8 q0,q0int16x8x2_t vzipq_s16(int16x8_t a, int16x8_t b); // VZIP.16 q0,q0int32x4x2_t vzipq_s32(int32x4_t a, int32x4_t b); // VZIP.32 q0,q0uint8x16x2_t vzipq_u8(uint8x16_t a, uint8x16_t b); // VZIP.8 q0,q0uint16x8x2_t vzipq_u16(uint16x8_t a, uint16x8_t b); // VZIP.16 q0,q0uint32x4x2_t vzipq_u32(uint32x4_t a, uint32x4_t b); // VZIP.32 q0,q0float32x4x2_t vzipq_f32(float32x4_t a, float32x4_t b); // VZIP.32 q0,q0poly8x16x2_t vzipq_p8(poly8x16_t a, poly8x16_t b); // VZIP.8 q0,q0poly16x8x2_t vzipq_p16(poly16x8_t a, poly16x8_t b); // VZIP.16 q0,q0E-62 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419


NEON サポー ト の 使 用要 素 のイ ン タ ー リ ーブ 解 除int8x8x2_t vuzp_s8(int8x8_t a, int8x8_t b); // VUZP.8 d0,d0int16x4x2_t vuzp_s16(int16x4_t a, int16x4_t b); // VUZP.16 d0,d0int32x2x2_t vuzp_s32(int32x2_t a, int32x2_t b); // VUZP.32 d0,d0uint8x8x2_t vuzp_u8(uint8x8_t a, uint8x8_t b); // VUZP.8 d0,d0uint16x4x2_t vuzp_u16(uint16x4_t a, uint16x4_t b); // VUZP.16 d0,d0uint32x2x2_t vuzp_u32(uint32x2_t a, uint32x2_t b); // VUZP.32 d0,d0float32x2x2_t vuzp_f32(float32x2_t a, float32x2_t b); // VUZP.32 d0,d0poly8x8x2_t vuzp_p8(poly8x8_t a, poly8x8_t b); // VUZP.8 d0,d0poly16x4x2_t vuzp_p16(poly16x4_t a, poly16x4_t b); // VUZP.16 d0,d0int8x16x2_t vuzpq_s8(int8x16_t a, int8x16_t b); // VUZP.8 q0,q0int16x8x2_t vuzpq_s16(int16x8_t a, int16x8_t b); // VUZP.16 q0,q0int32x4x2_t vuzpq_s32(int32x4_t a, int32x4_t b); // VUZP.32 q0,q0uint8x16x2_t vuzpq_u8(uint8x16_t a, uint8x16_t b); // VUZP.8 q0,q0uint16x8x2_t vuzpq_u16(uint16x8_t a, uint16x8_t b); // VUZP.16 q0,q0uint32x4x2_t vuzpq_u32(uint32x4_t a, uint32x4_t b); // VUZP.32 q0,q0float32x4x2_t vuzpq_f32(float32x4_t a, float32x4_t b); // VUZP.32 q0,q0poly8x16x2_t vuzpq_p8(poly8x16_t a, poly8x16_t b); // VUZP.8 q0,q0poly16x8x2_t vuzpq_p16(poly16x8_t a, poly16x8_t b); // VUZP.16 q0,q0E.3.31ベク タの 再 解 釈 キャ ス ト 操 作状 況 に よ っては、 ベ ク タ をそのま まの 値 で、 異 な る 型 と 見 な し て 扱 う こ と が必 要 にな る 場 合 があ り ます。 その よ う な 場 合 に 変 換 を 実 行 する ための コ ンパイ ラ 組 み 込 み 関 数 のセ ッ ト が 用 意 さ れています。構 文vreinterpret{q}_dsttype_srctype各 項 目 には 以 下 の 意 味 があ り ます。qdsttypesrctype128 ビ ッ ト ベク タに 対 して 変 換 を 実 行 する こ と を 表 します。 名 前にこれが 含 まれない 場 合 は、 64 ビッ トベクタに 対 して 変 換 を 実行 します。変 換 先 の 型 を 表 し ます。変 換 元 の 型 を 表 し ます。例以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 4 つの 符 号 付 き 16 ビッ ト 整 数 を 持 つベクタを、 4 つの 符 号 無 し 整 数 を 持 つベ ク タ に 変 換 し ます。uint16x4_t vreinterpret_u16_s16(int16x4_t a);<strong>ARM</strong> DUI 0348BJ Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-63ID 100419Non-Confidential,


NEON サポー ト の 使 用以 下 の コ ンパイ ラ 組 み 込 み 関 数 は、 4 つの 32 ビ ッ ト 浮 動 小 数 点 整 数 を 持 つベクタを、4 つの 符 号 付 き 整 数 を 持 つベ ク タ に 変 換 し ます。int8x16_t vreinterpretq_s8_f32(float32x4_t a);これらの 変 換 では、 ベクタによって 表 現 されるビッ トパターンは 変 わり ません。E-64 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BJNon-Confidential, ID 100419

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!