12.07.2015 Views

RealView Compilation Tools コンパイラユーザガイド - ARM ...

RealView Compilation Tools コンパイラユーザガイド - ARM ...

RealView Compilation Tools コンパイラユーザガイド - ARM ...

SHOW MORE
SHOW LESS
  • No tags were found...

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 © 2002-2010 <strong>ARM</strong> Limited. All rights reserved.<strong>ARM</strong> DUI 0205IJ (ID 100419)


iv Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


目 次<strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong>コンパイラユーザガイド序 章本 書 について ............................................................................................... viiiフィードバック ............................................................................................ xiii第 1 章第 2 章はじめに1.1 <strong>ARM</strong> コンパイラについて ........................................................................... 1-21.2 NEON ベク トル 化 コンパイラについて ...................................................... 1-31.3 ソース 言 語 モード ....................................................................................... 1-41.4 C ライブラリと C++ ライブラリ ................................................................ 1-6<strong>ARM</strong> コンパイラの 使 い 方2.1 コ マン ド ラ イ ンオプシ ョ ンの 使 用 .............................................................. 2-22.2 フ ァ イル 命 名 規 則 ..................................................................................... 2-142.3 ヘッダファイル ......................................................................................... 2-162.4 プリコンパイルヘッダファイル ................................................................ 2-192.5 タ ーゲ ッ ト プロセ ッ サまたはアーキテ ク チ ャの 指 定 ............................... 2-262.6 使 用 する プロシージ ャ コール 標 準 (AAPCS) の 指 定 .............................. 2-282.7 リ ン カのフ ィ ー ド バ ッ クの 使 用 ................................................................ 2-302.8 シンボルバージ ョ ンの 追 加 ....................................................................... 2-33<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. vID 100419Non-Confidential,


第 3 章第 4 章第 5 章第 6 章第 7 章NEON ベ ク ト ル 化 コ ンパイ ラの 使 用3.1 NEON ユニッ ト .......................................................................................... 3-23.2 NEON コー ド の 記 述 ................................................................................... 3-33.3 自 動 ベク ト ル 化 の 動 作 ................................................................................ 3-53.4 サンプル ................................................................................................... 3-19コンパイラの 機 能4.1 コ ンパイ ラ 組 み 込 み 関 数 ............................................................................ 4-24.2 プラグマ ................................................................................................... 4-154.3 ビットバンディング ................................................................................. 4-174.4 スレッ ドローカルスト レージ ................................................................... 4-214.5 8 バイ ト 境 界 整 列 機 能 .............................................................................. 4-22コーディング 慣 行5.1 コー ド の 最 適 化 .......................................................................................... 5-25.2 コード メ ト リ ック ..................................................................................... 5-115.3 関 数 .......................................................................................................... 5-155.4 関 数 のイ ン ラ イ ン 展 開 .............................................................................. 5-205.5 デー タの 境 界 整 列 ..................................................................................... 5-295.6 浮 動 小 数 点 演 算 の 使 用 .............................................................................. 5-365.7 ゼロ 除 算 エ ラーの ト ラ ッ プ と 識 別 ............................................................ 5-465.8 C99 の 新 機 能 ............................................................................................ 5-51診 断 メ ッセージ6.1 診 断 結 果 の 転 送 .......................................................................................... 6-36.2 診 断 メ ッ セージの 重 大 度 ............................................................................ 6-46.3 診 断 メ ッ セージの 出 力 の 制 御 ..................................................................... 6-56.4 診 断 メ ッ セージの 重 大 度 の 変 更 ................................................................. 6-66.5 診 断 メ ッ セージの 非 表 示 ............................................................................ 6-76.6 診 断 メ ッ セージの 接 頭 文 字 ........................................................................ 6-86.7 -W オプシ ョ ン を 使 用 し た 警 告 メ ッ セージの 非 表 示 .................................. 6-96.8 終 了 ステー タ ス コー ド と 終 了 メ ッ セージ ................................................. 6-106.9 データ フ ロー 警 告 ..................................................................................... 6-11イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用7.1 インラインアセンブラ ................................................................................ 7-27.2 組 み 込 みアセンブ ラ ................................................................................. 7-197.3 sp、 lr、 または pc にア ク セスする 従 来 のイ ン ラ イ ンアセンブ ラ ............ 7-307.4 イ ン ラ イ ンアセンブ リ コー ド と 組 み 込 みアセンブ リ コー ド の 相 違 点 ..... 7-32vi Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


序 章本 章 では、 『<strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong> コンパイラユーザガイド』 について 概説 します。 以 下 のセ ク シ ョ ンか ら 構 成 さ れています。• 「 本 書 について」 (ページ viii)• 「フ ィードバッ ク」 (ページ xiii)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. viiID 100419Non-Confidential,


序 章本 書 について本 書 では、 <strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong> (RVCT) に 関 する 情 報 と、 <strong>ARM</strong> コンパイラおよび NEON ベク トル 化 コンパイラでサポート されるコマンド ラインオプシ ョ ンやコ ンパイ ラ 固 有 の 機 能 の 概 要 について 説 明 し ています。対 象 読 者本 書 は、 RVCT を 使 用 し てアプ リ ケーシ ョ ン を 作 成 し てい る 開 発 者 を 対 象 としています。 し たがって、 本 書 の 内 容 は、 経 験 豊 富 な ソ フ ト ウ ェ ア 開 発 者 を想 定 し て 記 述 さ れています。 RVCT に 付 属 の <strong>ARM</strong> 開 発 ツールの 概 要 については、 『<strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong> エッセンシャルガイド』 を 参 照 して 下 さい。本 書 の 構 成本 書 は 以 下 の 章 と 付 録 か ら 構 成 さ れています。第 1 章 はじめに<strong>ARM</strong> コ ンパ イ ラ の 概 要 、 準 拠 すべき 標 準 、 および C と C++ ライブラ リについて 説 明 します。第 2 章 <strong>ARM</strong> コンパイラの 使 い 方コマンド ラインオプシ ョ ンおよびコンパイ ラ 固 有 の 機 能 の 概 要について 説 明 し ます。 コ ンパイ ラ の 呼 び 出 し 方 法 、 RVCT ツールへのオプシ ョ ンの 渡 し 方 、 および 診 断 メ ッ セージの 制 御 方 法 について も 説 明 し ます。第 3 章 NEON ベク トル 化 コンパイラの 使 用NEON ベク トル 化 コンパイラに 関 するチュート リ アルについては、 本 章 をお 読 み 下 さ い。 ここでは、NEON ユニ ッ ト と 、 自 動 ベク ト ル 化 機 能 の 使 用 方 法 について 説 明 し ています。第 4 章 コンパイラの 機 能<strong>ARM</strong> コ ンパイ ラ でサポー ト さ れる コ ンパイ ラ 組 み 込 み 関 数 の 概要 について 説 明 し ます。第 5 章 コーディ ング 慣 行RVCT におけ る 効 果 的 なプ ロ グ ラ ミ ングの 概 要 について 説 明 し ます。viii Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


序 章参 考 資 料ここでは、<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 0348J)• 『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)『RVDS スタートガイド』 の 用 語 集基 本 標 準 、 ソ フ ト ウ ェ ア イ ン タ フ ェース、 および <strong>ARM</strong> でサポー ト されている 標 準 の 詳 細 については、 install_directory\Documentation\Specifications\...を 参 照 して 下 さい。特 定 の <strong>ARM</strong> 製 品 に 関 する 情 報 については、 以 下 のマニ ュ アルを 参 照 し て 下さい。• 『<strong>ARM</strong> アーキテクチャ リ フ ァ レンスマニュアル』 (<strong>ARM</strong>v7-A および<strong>ARM</strong>v7-R エデ ィ シ ョ ン) (<strong>ARM</strong> DDI 0406J)• 『<strong>ARM</strong>v7-M アーキテクチャ リ フ ァ レンスマニュアル』 (<strong>ARM</strong> DDI 0403J)• 『<strong>ARM</strong>v6-M アーキテクチャ リ フ ァ レンスマニュアル』 (<strong>ARM</strong> DDI 0419J)• お 使 いのハー ド ウ ェ アデバ イ スの <strong>ARM</strong> データ シー ト ま たはテ ク ニカルリファレンスマニュアルx Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


序 章この 本 は C 言 語 の 当 初 の 設 計 者 および 実 装 者 に よ る 共 著 で、 改 訂 版 ではANSI C の 要 点 が 追 加 されています。• Harbison, S.P. and Steele, G.L., A C Reference Manual (5th edition, 2002).Prentice-Hall, Englewood Cliffs, NJ, USA. ISBN 0-13-089592-XANSI C に 関 する 有 益 な 情 報 を 盛 り 込 みながら、 C を 非 常 に 詳 し く 解 説しているガイドです。• Plauger, P., The Standard C Library (1991). Prentice-Hall, Englewood Cliffs, NJ,USA. ISBN 0-13-131509-9C ライブラリに 関 連 する ANSI 標 準 規 格 と ISO 標 準 規 格 の 総 合 的 なガ イドです。• Koenig, A., C Traps and Pitfalls, Addison-Wesley (1989), Reading, Mass. ISBN0-201-17928-8C プ ロ グ ラ ミ ングで 直 面 する 最 も 一 般 的 な 問 題 点 の 回 避 方 法 を 説 明 し ています。 C の 初 心 者 か ら 上 級 者 までを 対 象 と し た 参 考 書 です。Debug With Arbitrary Record Format (DWARF) デバ ッ グテーブルの 標 準 とExecutable and Linking Format (ELF) 指 定 の 最 新 情 報 については、http://www.dwarfstd.org を 参 照 して 下 さい。以 下 の 出 版 物 は、 European Telecommunications Standards Institute (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)Texas Instruments のコ ンパ イ ラ 組 み 込 み 機 能 に 関 する 出 版 物 は、 TexasInstruments 社 の Web サイ ト http://www.ti.com か ら 入 手 で き ます。xii Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


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


序 章xiv Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


第 1 章はじめに本 章 では、 RVCT に 付 属 の <strong>ARM</strong> ® コンパイラについて 紹 介 します。 ここでは、準 拠 すべき 標 準 について 説 明 し、 さ ら に RVCT 付 属 の ラ ン タ イ ム ラ イ ブ ラ リの 概 要 について も 説 明 し ます。 以 下 のセ ク シ ョ ンか ら 構 成 さ れています。• 「<strong>ARM</strong> コンパイラについて」 (ページ 1-2)• 「NEON ベク トル 化 コンパイラについて」 (ページ 1-3)• 「ソース 言 語 モード」 (ページ 1-4)• 「C ライブラリと C++ ライブラリ」 (ページ 1-6)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 1-1ID 100419Non-Confidential,


はじめに1.1 <strong>ARM</strong> コンパイラについて<strong>ARM</strong> コンパイラ armcc は、 標 準 C および 標 準 C++ のソースコードを <strong>ARM</strong>アーキテクチャベースのプロセッサのマシンコードにコンパイルする、 最 適化 C および C++ コンパイラです。 このコンパイラは、Base Standard ApplicationBinary Interface for the <strong>ARM</strong> Architecture (BSABI) に 準 拠 し てお り 、 ELF 形 式 の出 力 オブジ ェ ク ト を 生 成 し ます。 DWARF 3 デバ ッ グテーブルのサポー ト も 含まれます。 <strong>ARM</strong> コンパイラでは、 Edison Design Group (EDG) フロン トエンドが 使 用 されています。以 前 の リ リ ースの RVCT からアップグレードする 場 合 や RVCT を 新 規 にインストールする 場 合 は、『RVCT エッセンシャルガイド』 を 読 んで 最 新 の 情 報 を確 認 し て 下 さ い。1-2 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


はじめに1.2 NEON ベク トル 化 コンパイラについてNEON は、 <strong>ARM</strong> Advanced SIMD (Single Instruction Multiple Data、 単 一 命 令複 数 データ 処 理 ) 拡 張 機 能 の 実 装 です。RVCT には、 Cortex-A8 や Cortex-A9 など NEON ユニッ ト を 持 つ <strong>ARM</strong> プロセッサを 対 象 にする <strong>ARM</strong> コンパイラのベク トル 化 モードである armcc--vectorize が 用 意 されています。注Cortex-A9 ターゲッ ト 用 にコンパイルするには、 <strong>RealView</strong> Development SuiteProfessional のライセンスが 必 要 です。ベク トル 化 とは、 コンパイラによって C コード または C++ コードから 直 接NEON ベ ク ト ル 命 令 を 生 成 する こ と を 指 し ます。コンパイラによる 自 動 ベク トル 化 のほかに、 RVCT では、 ベク ト ル 化 コンパイ ラ と アセンブ ラ コー ド 記 述 と の 中 間 に 位 置 する、 SIMD コー ド 生 成 用 のNEON コ ンパイ ラ 組 み 込 み 関 数 も サポー ト し ています。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 第 3 章 NEON ベク トル 化 コンパイラの 使 用• 「NEON コ ンパイ ラ 組 み 込 み 関 数 」 (ページ 4-12)• 『コンパイ ラ リ ファレンスガイ ド』 の 付 録 E NEON サポー ト の 使 用<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 1-3ID 100419Non-Confidential,


はじめに1.3 ソース 言 語 モード<strong>ARM</strong> コンパイラには、 以 下 の 3 つのソース 言 語 モード があ り ます。 これらのモード を 使 用 し て、 さ まざまな タ イプの C および C++ のソースコードをコンパイルできます。ISO C90ISO C99ISO C++<strong>ARM</strong> コンパイラは、 1990 C 標 準 および 追 補 表 の 定 義 に 従 って Cをコンパイルします。C90 コードをコンパイルする 場 合 は、 --c90 オプシ ョ ンを 使 用 して下 さい。 これがデフォルトです。<strong>ARM</strong> コンパイラは、 1999 C 標 準 および 追 補 表 の 定 義 に 従 って Cをコンパイルします。C99 コードをコンパイルする 場 合 は、 --c99 オプシ ョ ンを 使 用 して下 さい。<strong>ARM</strong> コンパイラは、2003 標 準 の 定 義 に 従 って C++ をコンパイルします (ワイドスト リームとエクスポートテンプレートを 除 く)。C++ コードをコンパイルする 場 合 は、 --cpp オプシ ョ ンを 使 用 して 下 さい。コンパイラは、 C および C++ 言 語 に 対 する 多 く の 言 語 拡 張 をサポー ト し ています。 例 えば、 一 部 の GNU コ ンパイ ラ の 拡 張 機 能 がサポー ト さ れます。 コンパイラには、 ソース 言 語 への 準 拠 の 程 度 に 対 応 したいくつかのモードがあります。厳 密 モー ド 厳 密 モー ド では、 ソース 言 語 に 対 応 する 言 語 標 準 への 準 拠 が 強く 要 求 されます。厳 密 モー ド で コ ンパ イ ルする には、 コ マン ド ラ イ ンオプシ ョ ン--strict を 使 用 して 下 さい。GNU モード GNU モード では、 ソース 言 語 の GNU コ ンパイ ラ 拡 張 機 能 がすべて 使 用 可 能 にな り ます。GNU モード でコ ンパイルする 場 合 は、 コ ンパイ ラの --gnu オプションを 使 用 して 下 さい。1-4 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


はじめにソース 言 語 モー ド および 言 語 標 準 の 準 拠 の 詳 細 については、 「C99 の 新 機 能 」(ページ 5-51) を 参 照 して 下 さい。 また、 以 下 も 参 照 して 下 さい。• 『コンパイ ラ リ ファレンスガイ ド』 の 「ソース 言 語 モード」 (ページ 1-3)• 『コンパイ ラ リ ファレンスガイ ド』 の 「 言 語 の 拡 張 と 言 語 への 準 拠 」(ページ 1-6)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--c90」 (ページ 2-25)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--c99」 (ページ 2-26)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--cpp」 (ページ 2-34)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--gnu」 (ページ 2-75)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--strict, --no_strict」(ページ 2-133)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 1-5ID 100419Non-Confidential,


はじめに1.4 C ライブラリと C++ ライブラリRVCT では、 実 行 時 に 以 下 の C ライブラリおよび C++ ライブラリを 使 用 できます。<strong>ARM</strong> C ライブラリ<strong>ARM</strong> C ライブラリには、 標 準 C 関 数 と 、 C ライブラリおよびC++ ラ イ ブ ラ リ で 使 用 さ れるヘルパ 関 数 が 含 まれています。<strong>ARM</strong> ラ イ ブ ラ リ は、 以 下 に 準 拠 し ています。• <strong>ARM</strong> アーキテクチャ 用 C ライブラリ ABI (CLIBABI)• C++ ABI for the <strong>ARM</strong> Architecture (CPPABI)詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の 「C ライブラリとC++ ライブラリ」 (ページ 1-9)• 『ライブラ リ ガイ ド』 の 「<strong>ARM</strong> アーキテクチャ 用 ABI への準 拠 」 (ページ 1-3)Rogue Wave 標 準 C++ ライブラリ v.2.02.03Rogue Wave Software, Inc. か ら 提 供 さ れてい る Rogue Wave 標 準C++ ライブラリには、 標 準 C++ 関 数 と 、 cout などのオブジェクトが 含 まれています。 また、 標 準 テンプレー ト ラ イ ブ ラ リ(STL) と 呼 ばれるデータ 構 造 と アルゴ リ ズム も 含 まれています。Rogue Wave ライブラリの 詳 細 については、Rogue Wave の HTML形 式 のマニ ュ アル と Rogue Wave の Web サイ ト を 参 照 して 下 さい。 http://www.roguewave.comサポー ト ラ イブラ リ<strong>ARM</strong> C ライブラリには、C++ のサポー ト を 可 能 にし、 異 なるアーキテクチャやプロセッサ 向 けのコード をコンパイルするための 追 加 コンポーネン ト が 含 まれています。C ライブラリと C++ ライブラリは、バイナリのみで 提 供 されています。 C ライブラ リおよび C++ ライブラリには、 インターワークが 選 択 されているか、 または 浮 動 小 数 点 サポー ト が 選 択 さ れてい る かに よ って、 ターゲ ッ ト シ ス テムのバイ ト 順 序 など、 主 要 なビル ド オプシ ョ ンの 組 み 合 わせに 応 じ たバ リ アントがあります。『ライブラ リガイ ド』 の 「 第 2 章 C のライブラ リ と C++ のライブラ リ」 の 章を 参 照 して 下 さい。1-6 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


第 2 章<strong>ARM</strong> コンパイラの 使 い 方本 章 では、 <strong>ARM</strong> コンパイラ armcc に 使 用 できるコマンドラインオプションについて 概 説 し ます。 コ ンパ イ ラ の 呼 び 出 し 方 法 、 RVCT ツールへのオプシ ョ ンの 渡 し 方 、 および 診 断 メ ッ セージの 制 御 方 法 について も 説 明 し ます。 以 下 のセクションから 構 成 されています。• 「コ マン ド ラ イ ンオプシ ョ ンの 使 用 」 (ページ 2-2)• 「フ ァ イル 命 名 規 則 」 (ページ 2-14)• 「ヘ ッ ダ フ ァ イ ル」 (ページ 2-16)• 「プ リ コ ンパイルヘッ ダフ ァ イル」 (ページ 2-19)• 「ターゲッ トプロセッサまたはアーキテクチャの 指 定 」 (ページ 2-26)• 「 使 用 する プ ロ シージ ャ コール 標 準 (AAPCS) の 指 定 」 (ページ 2-28)• 「リンカのフィードバックの 使 用 」 (ページ 2-30)• 「シンボルバージ ョ ンの 追 加 」 (ページ 2-33)『コンパイ ラ リ ファレンスガイ ド』 を 参 照 して 下 さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-1ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方2.1 コ マン ド ラ イ ンオプシ ョ ンの 使 用コンパイ ラの 多 く の 動 作 を、 コマン ド ラ インオプシ ョ ンを 使 用 して 制 御 できます。オプシ ョ ンの タ イ プに 基 づいて、 以 下 の 規 則 が 適 用 さ れます。1 文 字 オプシ ョ ンすべての 1 文 字 オプシ ョ ン、 ま たは 引 数 を 取 る 1 文 字 オプシ ョ ンには、 その 前 に 単 一 ダ ッ シ ュ (-) が 付 けられます。 オプシ ョ ンと 引 数 の 間 にはスペース を 挿 入 する こ と ができ ます。 引 数 はオプシ ョ ンの 直 後 に 指 定 する こ と もできます。 以 下 に 例 を 示 し ます。-J directory-J directoryキーワードオプシ ョ ンすべてのキーワー ド オプシ ョ ン、 ま たは 引 数 を 取 る キーワー ドオプシ ョ ンには、 その 前 に 二 重 ダ ッ シ ュ (--) が 付 けられます。オプシ ョ ン と 引 数 の 間 には、 スペースまたは = 文 字 を 挿 入 する 必要 があ り ます。 以 下 に 例 を 示 し ます。--depend=file.d--depend file.dコ ンパ イ ラ オプシ ョ ンの 先 頭 以 外 で 使 用 さ れてい る - または _ には、 どち らの 文 字 を 使 用 する こ と も で き ます。 例 えば、--force_new_nothrow は--force-new-nothrow と 同 じです。名 前 がダ ッ シ ュ で 始 ま る フ ァ イ ルを コ ンパ イ ルする には、 POSIX オプシ ョ ン-- を 使 用 し て、 後 続 のすべての 引 数 がコマン ド ス イ ッ チではな く フ ァ イル 名として 処 理 されるように 指 定 します。 例 えば、 -ifile_1 というファイルをコンパイルするには、 以 下 のコ マン ド を 使 用 し ます。armcc -c -- -ifile_12-2 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方2.1.1 <strong>ARM</strong> コンパイラの 起 動<strong>ARM</strong> コンパイラを 起 動 するコマンドは 以 下 のとおりです。armcc [help-options] [source-language] [search-paths] [project-template-options][PCH-options] [preprocessor-options] [C++-language] [output-format][target-options] [debug-options] [code-generation-options][optimization-options] [diagnostic-options] [additional-checks] [PCS-options][pass-thru-options] [arm-linux-options] [source]以 下 の 各 オプシ ョ ンの 詳 細 については、 『コンパイ ラ リ ファレンスガイ ド』 の「 第 2 章 コンパイラのコマンドラインオプション」 の 章 を 参 照 して 下 さい。help-optionssource-languagesearch-paths主 なコマンドラインオプション、 コンパイラのバージョン番 号 、 およびコ ンパ イ ラ に よ る コ マン ド ラ イ ンの 処 理 結 果を 示 し ます。• 「--help」 (ページ 2-78)• 「--show_cmdline」 (ページ 2-129)• 「--vsn」 (ページ 2-150)コ ンパイ ラ で 使 用 で き る ソース 言 語 のバ リ アン ト を 指 定 します。• 「--c90」 (ページ 2-25)• 「--c99」 (ページ 2-26)• 「--compile_all_input,--no_compile_all_input」 (ページ 2-27)• 「--cpp」 (ページ 2-34)• 「--gnu」 (ページ 2-75)• 「--strict, --no_strict」 (ページ 2-133)• 「--strict_warnings」 (ページ 2-134)言 語 オプシ ョ ンは、 組 み 合 わせて 使 用 で き ます。 以 下 に 例を 示 し ます。armcc --c90 --gnuイ ン ク ルー ド フ ァ イルの 検 索 対 象 と な るデ ィ レ ク ト リ を 指定 します。• 「-Idir[,dir,...]」 (ページ 2-79)• 「-Jdir[,dir,...]」 (ページ 2-86)• 「--kandr_include」 (ページ 2-87)• 「--preinclude=filename」 (ページ 2-118)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-3ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方• 「--reduce_paths, --no_reduce_paths」 (ページ 2-122)• 「--sys_include」 (ページ 2-135)以 下 のオプシ ョ ンの 組 み 合 わせがどの よ う に 機 能 する かについては、 「ヘ ッ ダ フ ァ イ ル」 (ページ 2-16) を 参 照 して下 さい。project-template-optionsプロジェク トテンプレートの 動 作 を 制 御 します。• 「--project=filename,--no_project=filename」 (ページ 2-120)• 「--reinitialize_workdir」 (ページ 2-123)• 「--workdir=directory」 (ページ 2-153)PCH-optionsPCH ファイルの 処 理 を 制 御 します。• 「--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)• 「--use_pch=filename」 (ページ 2-145)preprocessor-optionsプリプロセッサ 出 力 やマクロ 定 義 など、 プリプロセッサの動 作 を 指 定 し ます。• 「-C」 (ページ 2-25)• 「--code_gen, --no_code_gen」 (ページ 2-26)• 「-Dname[(parm-list)][=def]」 (ページ 2-40)• 「-E」 (ページ 2-58)• 「-M」 (ページ 2-99)• 「-Uname」 (ページ 2-141)2-4 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方C++-languageC++ のコ ンパ イルに 固 有 のオプシ ョ ン を 指 定 し ます。• 「--anachronisms, --no_anachronisms」 (ページ 2-3)• 「--dep_name, --no_dep_name」 (ページ 2-43)• 「--export_all_vtbl,--no_export_all_vtbl」 (ページ 2-62)• 「--force_new_nothrow,--no_force_new_nothrow」 (ページ 2-65)• 「--friend_injection,--no_friend_injection」 (ページ 2-74)• 「--guiding_decls, --no_guiding_decls」(ページ 2-77)• 「--implicit_include,--no_implicit_include」 (ページ 2-80)• 「--implicit_include_searches,--no_implicit_include_searches」 (ページ2-81)• 「--implicit_typename,--no_implicit_typename」 (ページ 2-82)• 「--nonstd_qualifier_deduction,--no_nonstd_qualifier_deduction」 (ページ2-105)• 「--old_specializations,--no_old_specializations」 (ページ 2-110)• 「--parse_templates,--no_parse_templates」 (ページ 2-112)• 「--pending_instantiations=n」 (ページ2-115)• 「--rtti, --no_rtti」 (ページ 2-127)• 「--using_std, --no_using_std」 (ページ2-146)• 「--vfe, --no_vfe」 (ページ 2-147)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-5ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方output-formattarget-optionsコ ンパ イ ラ の 出 力 形 式 を 指 定 し ます。 このオプションを 使用 する と 、 オブジ ェ ク ト フ ァ イル、 アセンブ リ 言 語 の 出 力リストファイル、およびメークファイルの 依 存 関 係 ファイルを 生 成 できます。• 「--asm」 (ページ 2-17)• 「-c」 (ページ 2-24)• 「--default_extension=ext」 (ページ 2-42)• 「--depend=filename」 (ページ 2-44)• 「--depend_format=string」 (ページ 2-45)• 「--depend_system_headers,--no_depend_system_headers」 (ページ 2-47)• 「--info=totals」 (ページ 2-82)• 「--interleave」 (ページ 2-85)• 「--list」 (ページ 2-92)• 「--md」 (ページ 2-100)• 「-o filename」 (ページ 2-106)• 「-S」 (ページ 2-127)• 「--split_sections」 (ページ 2-132)ターゲッ トプロセッサまたはアーキテクチャ、 および 起 動時 に 使 用 中 の ターゲ ッ ト 命 令 を 指 定 し ます。• 「--arm」 (ページ 2-9)• 「--compatible=name」 (ページ 2-26)• 「--cpu=list」 (ページ 2-34)• 「--cpu=name」 (ページ 2-35)• 「--fpu=list」 (ページ 2-69)• 「--fpu=name」 (ページ 2-70)• 「--thumb」 (ページ 2-136)詳 細 については、 「ターゲッ トプロセッサまたはアーキテク チ ャ の 指 定 」 (ページ 2-26) を 参 照 して 下 さい。half-precision floating-point option半 精 度 浮 動 小 数 点 数 を VFPv3 アーキテクチャのオプシ ョンの 拡 張 と し て 使 用 で き ます。• 「--fp16_format=format」 (ページ 2-67)2-6 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方debug-optionsデバ ッ グテーブルの 形 式 と 生 成 を 制 御 し ます。• 「--debug, --no_debug」 (ページ 2-41)• 「--debug_macros, --no_debug_macros」 (ページ 2-42)• 「--dwarf2」 (ページ 2-58)• 「--dwarf3」 (ページ 2-58)• 「-g」 (ページ 2-74)code-generation-optionsエンデ ィ アン、 シンボルの 可 視 性 、 および 境 界 調 整 条 件 など、 <strong>ARM</strong> コンパイラのコード 生 成 オプションを 指 定 します。• 「--alternative_tokens,--no_alternative_tokens」 (ページ 2-3)• 「--bigend」 (ページ 2-19)• 「--bss_threshold=num」 (ページ 2-22)• 「--dllexport_all, --no_dllexport_all」(ページ 2-56)• 「--dllimport_runtime,--no_dllimport_runtime」 (ページ 2-56)• 「--dollar, --no_dollar」 (ページ 2-57)• 「--enum_is_int」 (ページ 2-59)• 「--exceptions, --no_exceptions」 (ページ2-61)• 「--exceptions_unwind,--no_exceptions_unwind」 (ページ 2-61)• 「--export_all_vtbl,--no_export_all_vtbl」 (ページ 2-62)• 「--export_defs_implicitly,--no_export_defs_implicitly」 (ページ 2-62)• 「--extended_initializers,--no_extended_initializers」 (ページ 2-63)• 「--hide_all, --no_hide_all」 (ページ 2-78)• 「--littleend」 (ページ 2-95)• 「--locale=lang_country」 (ページ 2-96)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-7ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方• 「--loose_implicit_cast」 (ページ 2-97)• 「--message_locale=lang_country[.codepage]」 (ページ 2-100)• 「--min_array_alignment=opt」 (ページ 2-102)• 「--multibyte_chars,--no_multibyte_chars」 (ページ 2-103)• 「--pointer_alignment=num」 (ページ 2-117)• 「--restrict, --no_restrict」 (ページ 2-125)• 「--signed_bitfields,--unsigned_bitfields」 (ページ 2-129)• 「--signed_chars, --unsigned_chars」 (ページ2-130)• 「--split_ldm」 (ページ 2-131)• 「--unaligned_access,--no_unaligned_access」 (ページ 2-142)• 「--vectorize, --no_vectorize」 (ページ 2-146)• 「--vla, --no_vla」 (ページ 2-149)• 「--wchar16」 (ページ 2-151)• 「--wchar32」 (ページ 2-152)optimization-optionsコー ド の 最 適 化 のレベル と タ イ プを 制 御 し ます。• 「--autoinline, --no_autoinline」 (ページ2-19)• 「--data_reorder, --no_data_reorder」 (ページ 2-41)• 「--forceinline」 (ページ 2-66)• 「--fpmode=model」 (ページ 2-67)• 「--inline, --no_inline」 (ページ 2-83)• 「--library_interface=lib」 (ページ 2-88)• 「--library_type=lib」 (ページ 2-90)• 「--lower_ropi, --no_lower_ropi」 (ページ2-97)• 「--lower_rwpi, --no_lower_rwpi」 (ページ2-97)• 「--multifile, --no_multifile」 (ページ 2-103)2-8 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方• 「-Onum」 (ページ 2-108)• 「-Ospace」 (ページ 2-110)• 「-Otime」 (ページ 2-111)• 「--retain=option」 (ページ 2-126)注最 適 化 基 準 を 設 定 する こ と に よ り 、 コ ンパイ ラ が 生 成 するデバッグ 情 報 を 制 限 できます。diagnostic-optionsコンパイ ラによ る 診 断 メ ッセージの 出 力 を 制 御 します。• 「--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_suppress=optimizations」 (ページ2-53)• 「--diag_warning=tag[,tag,...]」 (ページ2-54)• 「--diag_warning=optimizations」 (ページ2-55)• 「--errors=filename」 (ページ 2-60)• 「--remarks」 (ページ 2-125)• 「-W」 (ページ 2-150)• 「--wrap_diagnostics,--no_wrap_diagnostics」 (ページ 2-153)詳 細 については、 第 6 章 診 断 メ ッ セージを 参 照 して 下 さい。command-line option file追 加 の コ マン ド ラ イ ンオプシ ョ ン を 含 むフ ァ イ ルを 指 定 します。• 「--via=filename」 (ページ 2-148)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-9ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方multiple compilations前 回 のビル ド に 関 する 情 報 を 含 んだフ ィ ー ド バ ッ ク フ ァ イルを 指 定 し ます。• 「--feedback=filename」 (ページ 2-63)• 「--profile=filename」 (ページ 2-120)PCS-optionspass-thru-optionsarm-linux-options使 用 する プ ロ シージ ャ コール 標 準 を 指 定 し ます。• 「--apcs=qualifer...qualifier」 (ページ 2-4)詳 細 については、 「 使 用 する プ ロ シージ ャ コール 標 準(AAPCS) の 指 定 」 (ページ 2-28) を 参 照 して 下 さい。オプシ ョ ンを RVCT ツールに 渡 すよ う にコンパイ ラに 指 示します。• 「-Aopt」 (ページ 2-2)• 「-Lopt」 (ページ 2-88)<strong>ARM</strong> Linux と 共 に 使 用 できるように RVCT を 設 定 するオプションや、<strong>ARM</strong> Linux をターゲッ ト としたアプリケーションおよび 共 有 ラ イブラ リ をビルドするオプシ ョ ンを 指 定 します。• 「--arm_linux_configure」 (ページ 2-13)• 「--arm_linux_config_file=path」 (ページ2-12)• 「--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)• 「--arm_linux」 (ページ 2-10)• 「--arm_linux_paths」 (ページ 2-15)• 「--shared」 (ページ 2-128)• 「--translate_gcc」 (ページ 2-138)• 「--translate_g++」 (ページ 2-136)2-10 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方• 「--translate_gld」 (ページ 2-140)sourceC または C++ のソースコードを 含 む 1 つ 以 上 のテキ ス トファイルのファイル 名 を 指 定 します。 デフォル ト では、 コンパイ ラはソースフ ァ イルを 検 索 し、 現 在 の 場 所 に 出 力ファイルを 作 成 します。ソースファイルがアセンブリ ファイルの 場 合 、 つま り、ファイル 拡 張 子 が .s の 場 合 、 コ ンパ イ ラ に よ っ て <strong>ARM</strong> アセンブラが 起 動 され、 そのソースファ イルが 処 理 されます。このオプションは arm-linux-options では 使 用 されません。その 他 すべてのオプシ ョ ンには 必 須 です。例 えば、 <strong>ARM</strong> コ ンパイ ラ では 複 数 の 入 力 フ ァ イルがサポー ト さ れます。armcc -c [options] ifile_1 ... ifile_n入 力 フ ァ イルにダ ッ シ ュ (-) を 指 定 する と、 コンパイラは stdin からの 読 み出 しを 行 います。 後 続 のすべての 引 数 が コ マン ド ス イ ッ チではな く フ ァ イル名 と し て 処 理 さ れる よ う に 指 定 する には、 POSIX オプシ ョ ン (--) を 使 用 します。 詳 細 については、 「コ マン ド ラ イ ンオプシ ョ ンの 使 用 」 (ページ 2-2) を参 照 し て 下 さ い。デフォルト 動 作コンパイラの 起 動 コンフィギュレーションは、 指 定 されたコマンドラインオプシ ョ ン と フ ァ イル 名 拡 張 子 に 従 って コ ンパイ ラ に よ って 決 定 さ れます。 コマンド ラインオプシ ョ ンによって、 ファ イル 拡 張 子 によって 決 まるデフォルトのコンフィグレーションがオーバーライドされます。 コ ンパ イ ラ の 起 動 言語 は C か C++、 命 令 セットは <strong>ARM</strong> か Thumb にな り ます。1 つのコマン ド で 複 数 のフ ァ イルを コ ンパイルする 場 合 、 すべてのフ ァ イルは 同 じ タ イプ (C または C++) でなければなりません。 コンパイラは、 ファイル 拡 張 子 に 基 づいて 言 語 を 切 り 替 える こ と ができ ません。 以 下 の 例 では、 指定 された ソース フ ァ イルで 異 な る 言 語 が 使 用 されているため、 エラーが 生 成されます。armcc -c test1.c test2.cpp競 合 する フ ァ イル 拡 張 子 の 付 いたフ ァ イルを 指 定 し て も、 コ ンパ イ ラ では、拡 張 子 に 関 係 な く 、 C および C++ 用 に 両 方 のフ ァ イルを コ ンパイルする こ とができ ます。 以 下 に 例 を 示 し ます。armcc -c --cpp test1.c test2.cpp<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-11ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方認 識 さ れない 拡 張 子 が、 filename.cmd のよ うに .c で 始 ま る 場 合 は、 エ ラー メ ッセージが 生 成 されます。1 回 のコ ンパ イルで 複 数 の ソース フ ァ イルを 指 定 する 場 合 には、 プリコンパイルヘッダ (PCH) ファイルの 処 理 のサポートは 利 用 できません。 PCH 処 理を 要 求 し た 場 合 に 元 の ソース フ ァ イルを 複 数 指 定 する と 、 コ ンパイ ラ に よ ってエラーメ ッセージが 生 成 され、 コンパイルが 中 止 されます。詳 細 については、 「プ リ コ ンパイルヘッ ダフ ァ イル」 (ページ 2-19) を 参 照 して 下 さい。2.1.2 コマンドラインオプションの 順 序一 般 的 に、 コ マン ド ラ イ ンオプシ ョ ンは 1 回 の コ ンパ イ ラ 呼 び 出 し において任 意 の 順 序 で 使 用 で き ます。 ただ し、 その 結 果 が、 コ マン ド ラ イ ンで 指 定 される 順 序 や 他 の 関 連 オプシ ョ ン と の 組 み 合 わせ 方 に よ って 変 わ る オプシ ョ ンも あ り ます。 例 えば、-O で 始 ま る 最 適 化 オプシ ョ ンや PCH オプシ ョ ンが、 これに 当 てはま り ます。 詳 細 については、 「プ リ コ ンパイルヘッ ダフ ァ イル」(ページ 2-19) を 参 照 して 下 さい。コ ンパ イ ラ を 使 用 する と 、 競 合 する 可 能 性 があ る 複 数 のオプシ ョ ン を 使 用 することができます。 つま り、 メークファ イルや via ファイルなどの 既 存 のコマン ド ラ イ ンに 新 し いオプシ ョ ン を 追 加 する こ と がで き ます。オプシ ョ ンが 同 じコマン ド ラ インにある 前 のオプシ ョ ンをオーバーラ イ ドする 場 合 、 最 後 に 指 定 さ れたオプシ ョ ンが 必 ず 優 先 さ れます。 以 下 に 例 を 示 します。armcc -O1 -O2 -Ospace -Otime ...これは、 コンパイラによって 以 下 のよ うに 実 行 されます。armcc -O2 -Otimeコンパイ ラがどのよ う にコマン ド ラ インを 処 理 したかを 確 認 するには、--show_cmdline オプシ ョ ンを 使 用 し ます。 これは、 コンパイラが 使 用 したデフォルト 以 外 のオプションを 示 します。 via フ ァ イ ルの 内 容 は 展 開 さ れています。 こ こで 使 用 した 例 では、 コンパイラは armcc -O2 -Otime を 実 行 し ますが、--show_cmdline の 出 力 には -O2 は 含 まれません。 その 理 由 は、 -O2 がデフ ォル トの 最 適 化 レベルであ り 、 --show_cmdline はデフ ォル ト で 適 用 されるオプシ ョ ンを 表 示 しないためです。2-12 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方2.1.3 環 境 変 数 を 使 用 し た コ マン ド ラ イ ンオプシ ョ ンの 指 定コマンド ラインオプショ ンは、RVCT40_CCOPT 環 境 変 数 の 値 を 設 定 する こ と によって 指 定 できます。 この 構 文 は、 コマンドライン 構 文 と 同 じです。 コンパイラは、RVCT40_CCOPT の 値 を 読 み 出 し、 コマン ド 文 字 列 の 前 に 挿 入 し ます。 これによ り、RVCT40_CCOPT で 指 定 されたオプシ ョ ンは、 コマン ド ラ イ ンの 引 数 によ ってオーバーラ イ ド 可 能 にな り ます。2.1.4 コ マン ド ラ イ ンオプシ ョ ンの 自 動 補 完コ マン ド ラ イ ンオプシ ョ ンが 自 動 補 完 さ れる よ う にする こ と がで き ます。 自動 補 完 を 行 う には、 自 動 補 完 する 文 字 の 後 に ド ッ ト (.) を 付 けます。 自 動 補完 はキーワー ド オプシ ョ ンのみに 使 用 でき ます。引 数 と ド ッ ト の 間 には、 等 号 (=) 文 字 またはスペース 文 字 が 必 要 です。 オプシ ョ ンの 引 数 に 自 動 補 完 を 使 用 する こ と はで き ません。自 動 補 完 さ れたオプシ ョ ンが 一 意 にな る よ う に 十 分 な 数 の 文 字 を 含 め る 必 要があ り ます。 例 えば、 コマン ド ラ イ ンで --diag_suppress=223 を 指 定 するには、--diag_su.=223 を 使 用 し ます。詳 細 については、 「コマンド ラ インオプシ ョ ンの 使 用 」 (ページ 2-2) を 参 照して 下 さい。2.1.5 ファイルからのコンパイラオプシ ョ ンの 読 み 出 しオペレーテ ィ ン グシ ス テムで コ マン ド ラ イ ンの 長 さ が 制 限 さ れてい る 場 合 は、追 加 の コ マン ド ラ イ ンオプシ ョ ン を フ ァ イルに 保 存 し た 上 で、 以 下 の コ ンパイラオプションを 使 用 します。--via filenameコンパイラは、 指 定 されたファイルを 開 き、 そのファイルから 追 加 のコマンド ラ イ ンオプシ ョ ン を 読 み 出 し ます。『コンパイ ラ リ ファレンスガイ ド』 の 付 録 A via ファイルの 構 文 を 参 照 して 下さい。2.1.6 stdin 入 力 の 指 定マイナス 記 号 (–) を ソ ース フ ァ イ ル 名 と し て 使 用 する と 、 コ ンパ イ ラ はstdin からの 入 力 を 受 け 付 けます。 デフォル ト のコンパイ ラモードは C です。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-13ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方入 力 を 終 了 する 場 合 は、 以 下 の 操 作 を 行 います。• Microsoft Windows システムでは、Ctrl-Z キーを 押 してから Return キーを押 します。• Red Hat Linux システムでは、Ctrl-D キーを 押 し ます。キーボード 入 力 の 場 合 のアセンブリ リストは、 以 下 の 条 件 の 両 方 が 満 たされている 場 合 に、 入 力 が 終 了 し た 後 に 出 力 ス ト リ ームに 送 信 されます。• 出 力 フ ァ イ ルが 指 定 さ れていない こ と 。• -E な どのプ リ プ ロ セ ッ サだけを 起 動 する オプシ ョ ンが 指 定 さ れていないこと。-o オプシ ョ ン を 使 用 し て 出 力 フ ァ イルを 指 定 する と 、 オブジ ェ ク ト フ ァ イルが 生 成 されます。 -E オプシ ョ ン を 指 定 する と 、 プ リ プ ロ セ ッ サ 出 力 が 出 力 ストリームに 送 信 されます。 -o- オプシ ョ ン を 指 定 する と 、 出 力 が stdout に 送 信されます。2-14 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方2.2 フ ァ イル 命 名 規 則<strong>ARM</strong> コ ンパイ ラ では、 フ ァ イル 名 の 接 尾 文 字 を 使 用 し て、 コ ンパイルや リ ンク ス テージに 関 連 する フ ァ イルの 種 別 を 識 別 し ます。 コンパイラで 認 識 される フ ァ イル 名 の 接 尾 文 字 については、 表 2-1 を 参 照 して 下 さい。表 2-1 <strong>ARM</strong> コ ンパイ ラ で 認 識 される フ ァ イル 名 の 接 尾 文 字接 尾 文 字 説 明 使 用 に 関 する 注 意 事 項.c C ソースファイル--c90 を 意 味 します。.cpp.c++.cxx.cc.CCC++ ソースファイル--cpp を 意 味 します。コ ンパイ ラ は 接 尾 文 字 .cc と .CC を 使 用 して、 暗 黙のインクルードのファイルを 識 別 します。 『コンパイラリファレンスガイド』 の 「 暗 黙 の イ ン ク ルード」 (ページ 5-17) を 参 照 して 下 さい。.d 依 存 関 係 リ ストファイル.h C または C++ヘッダファイル.d は、--md オプシ ョ ン を 使 用 し て 出 力 さ れた フ ァ イルのデフ ォル ト のフ ァ イル 名 接 尾 文 字 です。--cpp --arm.o.objELF 形 式 の<strong>ARM</strong>、Thumb、 または <strong>ARM</strong>/Thumb混 合 オブジ ェクトファイル.s <strong>ARM</strong>、Thumb、 または <strong>ARM</strong>/Thumb混 在 アセンブリ 言 語 ソースファイル入 力 フ ァ イル リ ス ト 内 の 接 尾 文 字 .s が 付 いたフ ァイルの 場 合 は、 コンパイラでアセンブラ armasm が 呼び 出 さ れ、 フ ァ イルがアセンブル さ れます。.s は、 -S または --asm オプシ ョ ン を 使 用 し て 出 力 された フ ァ イルのデフ ォル ト のフ ァ イル 名 接 尾 文 字 です。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-15ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方表 2-1 <strong>ARM</strong> コ ンパイ ラ で 認 識 される フ ァ イル 名 の 接 尾 文 字 ( 続 き)接 尾 文 字 説 明 使 用 に 関 する 注 意 事 項.lst.pch.txtエラーおよび警 告 リ ス トファイルプリコンパイルヘッ ダフ ァイルテキス ト ファイル.lst は、--list オプシ ョ ン を 使 用 し て 出 力 さ れたフ ァ イルのデフ ォル ト のフ ァ イル 名 接 尾 文 字 です。.pch は、--pch オプシ ョ ン を 使 用 し て 出 力 さ れたフ ァイルのデフ ォル ト のフ ァ イル 名 接 尾 文 字 です。.txt は、-S または --asm オプシ ョ ンを --interleave オプシ ョ ン と 組 み 合 わせて 使 用 して 出 力 されたフ ァ イルのデフ ォル ト のフ ァ イル 名 接 尾 文 字 です。2.2.1 移 植 性ホ ス ト 間 の 移 植 性 を 確 保 する には、 以 下 の 規 則 に 従 っ て 下 さ い。• ファイル 名 にはスペースを 含 めないで 下 さい。 スペースを 含 むパス 名 やフ ァ イル 名 を 使 用 する 必 要 がある 場 合 は、 パス 名 またはフ ァ イル 名 を 二重 引 用 符 (") ま たは 単 一 引 用 符 (') で 囲 んで 下 さい。• パス 名 を 組 み 込 む 場 合 は、 絶 対 パスではな く 相 対 パス を 指 定 し て 下 さい。• 組 み 込 むパス 名 ではバ ッ ク ス ラ ッ シ ュ (\) ではなく スラ ッシュ (/) を使 用 し て 下 さ い。2.2.2 出 力 フ ァ イルデフォル ト では、 <strong>ARM</strong> コンパイラによって 作 成 された 出 力 ファイルは、 現 在のデ ィ レ ク ト リ にあ り ます。 オブジェ ク ト フ ァ イルは、 <strong>ARM</strong> Executable andLinkable Format (ELF) で 作 成 さ れます。 ELF に 関 する ド キ ュ メ ン ト は、install_directory\Documentation\Specifications\ にあ り ます。2-16 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方2.3 ヘッダファイル<strong>ARM</strong> コンパイラが #include ヘ ッ ダ フ ァ イル と ソ ース フ ァ イルを 検 索 する 方 法は、 い く つかの 要 因 によ って 影 響 されます。 この 要 因 には 以 下 のよ うなものがあ り ます。• 環 境 変 数 RVCT40INC の 値• -I および -J コンパイラオプション• --kandr_include および --sys_include コンパイラオプション• ファイル 名 が 絶 対 ファイル 名 か 相 対 ファイル 名 か• フ ァ イル 名 が 山 形 括 弧 ま たは 二 重 引 用 符 で 囲 まれてい る かど う か詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の 「-Idir[,dir,...]」 (ページ2-79)• 『コンパイ ラ リ ファレンスガイ ド』 の 「-Jdir[,dir,...]」 (ページ2-86)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--kandr_include」 (ページ2-87)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--sys_include」 (ページ2-135)• 『コンパイ ラ リ ファレンスガイ ド』 の 「コマンド ラ インオプシ ョ ン」(ページ 2-2)2.3.1 現 在 の 場 所デフォル ト では、 <strong>ARM</strong> コンパイラは、 バークレー 版 UNIX の 検 索 規 則 を 使 用するため、 ソースファ イルと #include ヘッダファイルは、 現 在 の 場 所 からの相 対 位 置 で 検 索 さ れます。 現 在 の 場 所 と は、 その 時 点 で コ ンパイ ラ に よ って処 理 されているソースファイルまたはヘッダファイルが 含 まれているディ レクトリです。検 索 パスの 要 素 か ら の 相 対 位 置 でフ ァ イルが 検 出 さ れる と 、 そのフ ァ イルを含 むデ ィ レ ク ト リ が 新 し い 現 在 の 場 所 と な り ます。 コンパイラがそのファイルの 処 理 を 終 了 する と 、 以 前 の 現 在 場 所 に 戻 り ます。 常 に、 ネス ト された#include デ ィ レ ク テ ィ ブのス タ ッ ク に 対 応 する、 現 在 の 場 所 のス タ ッ ク があります。 例 えば、 現 在 の 場 所 が RVCT のインクルードディレク ト リ...\include である 場 合 、 コンパイ ラがインクルード ファ イル sys\defs.h を 検索 する 際 、 こ のデ ィ レ ク ト リ を 検 索 し、 フ ァ イルが 存 在 し てい る 場 合 は、...\include\sys\defs.h を 検 出 し ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-17ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方コンパイラが defs.h の 処 理 を 開 始 する と、 現 在 の 場 所 は ...\include\sys になります。 defs.h によってインクルード されるファイルで、 絶 対 パス 名 が 指 定 されていないフ ァ イルについては、 ...\include\sys か ら の 相 対 位 置 で 検 索 さ れます。元 の 現 在 の 場 所 であ る ...\include は、 コ ンパイ ラ で defs.h の 処 理 が 終 了 し たと きにのみ 復 元 さ れます。コンパイラオプション --kandr_include を 使 用 する と 、 現 在 の 場 所 のス タ ッ キングを 無 効 にできます。 このオプショ ンによ り、 コンパイラでは、 The CProgramming Language でカーニハン と リ ッチーが 初 めて 記 述 し た 検 索 規 則 が使 用 さ れます。 この 規 則 に 基 づき、 ルートから 始 まらないユーザ #include は、コ ンパイル 中 の ソース フ ァ イルを 含 むデ ィ レ ク ト リ の 相 対 位 置 か ら 検 索 さ れます。 『コンパイ ラ リ ファレンスガイ ド』 の 「--kandr_include」 (ページ2-87) を 参 照 して 下 さい。2.3.2 RVCT40INC 環 境 変 数RVCT40INC 環 境 変 数 は、 RVCT 付 属 の イ ン ク ルー ド フ ァ イル (ヘ ッ ダ フ ァ イ ルとソースファイル) の 場 所 を 指 します。 この 環 境 変 数 は 変 更 しないで 下 さい。別 の 場 所 にあ る フ ァ イルを イ ン ク ルー ド する 場 合 は、 必 要 に 応 じ て、-I と -Jコマンド ラインオプショ ンを 使 用 して 下 さい。コンパイル 時 に、RVCT40INC で 指 定 し たデ ィ レ ク ト リ は、-I オプシ ョ ンで 指 定 したデ ィ レ ク ト リ が 検 索 された 直 後 に 検 索 されます。 -J オプシ ョ ンを 使 用 すると、RVCT40INC は 無 視 されます。2-18 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方2.3.3 検 索 パス表 2-2 は、 インクルードファイル (ヘッダファイルとソースファイル) が 検索 されるときに、 コンパイラで 使 用 される 検 索 パスに 対 してコマンド ラインオプシ ョ ンがどのよ う に 影 響 するかを 示 しています。表 2-2 イ ン クルー ド フ ァ イルの 検 索 パスコンパイラオプション-I も -J も 指 定 しない 検 索 順 序RVCT40INCdirs"include" 検 索 順 序CP、 RVCT40INCdirs-I RVCT40INCdirs, Idirs CP、 Idirs、 RVCT40INCdirs-J Jdirs CP、 および Jdirs-I と -J の 両 方 を指 定Jdirs、 IdirsCP, Idirs、 Jdirs--sys_include 影 響 な し 検 索 パスか ら CP が 削 除 されます。--kandr_include 影 響 な し カーニハン & リ ッ チーの 検 索 規 則が 使 用 されます。表 2-2 (ページ 2-17) では、 以 下 の 表 記 規 則 が 使 用 されています。RVCT40INCdirsRVCT40INC 環 境 変 数 が 設 定 さ れてい る 場 合 、 こ の 環 境 変 数 で 指 定されているディレク ト リの 一 覧 を 示 しています。CP現 在 の 場 所 です。Idirs and Jdirs-Idirs および -Jdirs コンパイラオプションによって 指 定 されるディレク ト リを 示 しています。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-19ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方2.3.4 TMP 環 境 変 数 と TMPDIR 環 境 変 数Windows プ ラ ッ ト フ ォームでは、 環 境 変 数 TMP で 一 時 フ ァ イ ルに 使 用 さ れるディレク ト リが 指 定 されます。Red Hat Linux プ ラ ッ ト フ ォームでは、 環 境 変 数 TMPDIR で 一 時 フ ァ イルに 使 用されるディレク ト リが 指 定 されます。 TMPDIR が 設 定 されていない 場 合 には、 デフ ォル ト の 一 時 デ ィ レ ク ト リ が 使 用 さ れます。 通 常 、 こ のデ ィ レ ク ト リ は/tmp または /var/tmp です。2-20 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方2.4 プリコンパイルヘッダファイルソース フ ァ イルを コ ンパイルする と 、 イ ン ク ルー ド されるヘ ッ ダフ ァ イルもコンパイルされます。 1 つのヘッ ダフ ァ イルが 複 数 のソース フ ァ イルにイ ン クルードされる 場 合 、 そのヘッダファイルは、 各 ソースファイルがコンパイルされるたびに 再 コンパイルされます。 また、 インクルード されるヘッダファイルに 数 多 くのコード 行 が 含 まれていても、 そのヘッダファイルをインクルー ド する ソ ース フ ァ イ ルのサ イ ズが 比 較 的 小 さ い 場 合 があ り ます。 このため、 一 般 的 には、 ヘッダファイルをプリ コンパイルするこ とによって、 ヘッダファイルの 再 コンパイルを 避 けるこ とが 推 奨 されています。 このよ うなファイルは、 プリコンパイルヘッダ (PCH) フ ァ イル と 呼 ばれています。デフォル ト では、 コンパイ ラは PCH フ ァ イルを 作 成 する と き に 以 下 の 処 理 を行 います。• 元 の ソ ース フ ァ イ ルの 名 前 を 取 得 し、 拡 張 子 を .pch に 置 き 換 えます。• PCH ファイルを 元 のソースファイルと 同 じディ レク ト リに 作 成 します。注1 回 の コ ンパイルで 複 数 の ソース フ ァ イルを 指 定 する 場 合 には、 PCH 処 理 は利 用 で き ません。 PCH 処 理 を 要 求 した 場 合 に 元 のソースフ ァ イルを 複 数 指 定する と、 コンパイ ラによってエラーメ ッセージが 生 成 され、 コンパイルが 中止 されます。注PCH フ ァ イルが 使 用 可 能 で も、 コ ンパ イ ラ で 使 用 さ れる と は 限 り ません。 シス テムの 設 定 上 の 問 題 (RHE3 や Vista でのア ド レ ス 空 間 の ラ ンダム 化 な ど)によ り、 コンパイラが PCH ファイルを 使 用 できない 場 合 もあります。<strong>ARM</strong> コンパイラは、 ヘッダファイルを 自 動 的 にプリ コンパイルできます。 また、 <strong>ARM</strong> コ ンパ イ ラ で、 プ リ コ ンパ イルを 制 御 する こ と も で き ます。 詳 細 については、 以 下 を 参 照 して 下 さい。• 「 自 動 PCH 処 理 」 (ページ 2-20)• 「 手 動 PCH 処 理 」 (ページ 2-23)• 「PCH 処 理 中 の メ ッ セージ 出 力 の 制 御 」 (ページ 2-24)• 「パフ ォーマン スに 関 する 問 題 点 」 (ページ 2-24)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-21ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方2.4.1 自 動 PCH 処 理--pch コ マン ド ラ イ ンオプシ ョ ン を 使 用 する と 、 自 動 PCH 処 理 が 有 効 にな ります。 つま り、 コンパイ ラは 指 定 された 場 所 で PCH フ ァ イ ルを 自 動 的 に 検 索し、 検 出 さ れた 場 合 はそのフ ァ イルを 読 み 出 し ます。 ファイルが 検 出 されない 場 合 には、 コ ンパイ ラによ ってその 後 のコ ンパイルで 使 用 する ための PCHファイルが 作 成 されます。コンパイラは、 PCH フ ァ イルの 作 成 時 に、 元 の ソース フ ァ イルの 名 前 を 取 得し、 その 拡 張 子 を .pch に 置 き 換 えます。 --pch_dir オプシ ョ ン を 指 定 し た 場 合を 除 き、 PCH ファイルは 元 のソースファイルと 同 じディ レク ト リに 作 成 されます。詳 細 については、 「コ マン ド ラ イ ンオプシ ョ ンの 順 序 」 (ページ 2-11) を 参 照して 下 さい。ヘッダスト ップポイントPCH ファイルには、 ヘッダス ト ップポイン ト よりも 前 のすべてのコードのスナップショ ッ トが 含 まれます。 通 常 、 ヘ ッ ダ ス ト ッ プポ イ ン ト は、 プ リ プ ロセ ッ シングデ ィ レ ク テ ィ ブに 属 さ ない、 元 のソース フ ァ イル 内 の 最 初 の ト ークンとなります。 以 下 の 例 では、 ヘ ッ ダ ス ト ッ プポ イ ン ト は int であ り、 PCHファイルには xxx.h および yyy.h のインクルードが 反 映 されたスナップショ ットが 保 持 されます。#include "xxx.h"#include "yyy.h"int i;注ヘッダス ト ップポイン トは、#pragma hdrstop を 使 用 して 手 動 で 指 定 できます。このオプションは、 プリプロセッシングディレクティブに 属 さない 最 初 のト ー ク ン よ り 前 に 配 置 する 必 要 があ り ます。 上 記 の 例 では、 int の 前 に 配 置 します。 詳 細 については、 「PCH 処 理 の 制 御 」 (ページ 2-23) を 参 照 して 下 さい。PCH フ ァ イルの 生 成 に 影 響 する 条 件最 初 の 非 プ リ プ ロ セ ッ サ ト ー ク ン ま たは #pragma hdrstop が #if ブロック 内 に 出現 する 場 合 、 ヘ ッ ダ ス ト ッ プポ イ ン ト は #if の 開 始 位 置 と な り ます。 以 下 に 例を 示 し ます。2-22 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方#include "xxx.h"#ifndef YYY_H#define YYY_H 1#include "yyy.h"#endif#if TESTint i;#endifこの 例 では、 プ リ プロセ ッ シングデ ィ レ ク テ ィ ブに 属 さ ない 最 初 の ト ーク ンは int ですが、 ヘッ ダス ト ッ プポイ ン ト は、 それを 含 む #if ブ ロ ッ ク の 開 始 位置 となります。 この PCH ファイルには、xxx.h の イ ン ク ルー ド と 、 条 件 付 き でYYY_H の 定 義 と yyy.h のインクルードが 反 映 されます。 ただし、 #if TEST によって 生 成 される 状 態 は 保 持 されません。PCH ファイルは、 ヘッダスト ップポイント とその 前 にあるコード ( 主 にヘッダフ ァ イル) が 以 下 の 要 件 を 満 た し ている 場 合 にのみ 生 成 されます。• ヘ ッ ダ ス ト ッ プポ イ ン ト がフ ァ イルの 有 効 範 囲 内 に 存 在 し てい る こ と 。ヘ ッ ダ ス ト ッ プポ イ ン ト は、 ヘ ッ ダ フ ァ イ ルに よ っ て 設 定 さ れる 未 完 結の 範 囲 内 に 含 め る こ と はで き ません。 例 えば、 以 下 の 場 合 、 PCH ファイルは 作 成 されません。// xxx.hclass A{// xxx.c#include "xxx.h"int i;};• ヘ ッ ダ ス ト ッ プポ イ ン ト が、 ヘ ッ ダフ ァ イル 内 で 開 始 さ れる 宣 言 内 にないこと。 また、 C++ では、 ヘ ッ ダ ス ト ッ プポ イ ン ト が リ ン ケージ 指 定 の宣 言 リ ス ト に 含 まれていてはな り ません。 例 えば、 以 下 の 場 合 、 ヘ ッ ダストップポイントは int ですが、 新 し い 宣 言 の 開 始 位 置 ではないため、PCH ファイルは 作 成 されません。// yyy.hstatic// yyy.c#include "yyy.h"int i;• ヘッダス ト ップポイン トが、 ヘッダファイル 内 で 開 始 される #if ブロック 内 または #define 内 にないこ と。• ヘッ ダス ト ッ プポイ ン ト よ り も 前 に 行 われる 処 理 でエラーが 生 成 されていないこ と。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-23ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方注PCH フ ァ イルの 再 利 用 時 には、 警 告 や 他 の 診 断 情 報 は 再 生 成 さ れません。• 定 義 済 みマ ク ロ __DATE__ または __TIME__ への 参 照 がないこ と。• #line プリプロセッシングディレクティブのインスタンスがないこと。• #pragma no_pch がないこ と。• ヘッダス ト ップポイン ト よ り も 前 にあるコードによって、 プリ コンパイルヘッ ダに 関 連 するオーバーヘッ ド に 見 合 う だけの 十 分 な 数 の 宣 言 が 行われている こ と。コンパイル 時 に 複 数 の PCH フ ァ イルが 適 用 さ れる 場 合 があ り ます。 その 場 合 、最 も 大 きなファイル (つま り、 元 のソースファイルに 含 まれる 最 も 多 くのプリプロセッシングディレクティブが 含 まれるファイル) が 使 用 されます。 例えば、 元 のソース フ ァ イルが 以 下 の 行 で 始 ま っている と し ます。#include "xxx.h"#include "yyy.h"#include "zzz.h"xxx.h に 対 応 する PCH ファイルと、xxx.h および yyy.h に 対 応 する PCH ファイルがあ る 場 合 、 現 在 の コ ンパイルでは 両 方 が 適 用 さ れる と い う 想 定 で、 後 者の PCH ファイルが 選 択 されます。 さ ら に、 最 初 の 2 つのヘ ッ ダに 対 応 するPCH ファイルが 読 み 出 され、3 番 目 のヘ ッ ダが コ ンパ イ ル さ れた 後 、 3 つのすべてのヘ ッ ダに 対 応 する 新 し い PCH フ ァ イルが 作 成 さ れる 場 合 があ り ます。自 動 PCH 処 理 モード では、 コ ンパイ ラは、 以 下 のよ う な 場 合 に、 PCH ファイルが 古 いこ と を 通 知 し、 そのフ ァ イルを 削 除 し ます。• PCH ファイルが 1 つ 以 上 の 古 いヘッ ダフ ァ イルをベースに 生 成 されており 、 現 在 の コ ンパ イルで 使 用 で き る 場 合 。• PCH フ ァ イルに コ ンパ イル 中 の ソース フ ァ イル と 同 じ 基 本 名 が 付 いていても (xxx.pch と xxx.c な ど)、 誤 った コ マン ド ラ イ ンオプシ ョ ン を 使 用し たな どの 理 由 に よ り 現 在 の コ ンパイルでは 使 用 で き ない 場 合 。上 記 は 一 般 的 な 事 例 です。 他 の PCH ファイルは 必 要 に 応 じてユーザが 削 除 する 必 要 があ り ます。2-24 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方2.4.2 手 動 PCH 処 理PCH フ ァ イルのフ ァ イル 名 と 場 所 、 および PCH 処 理 の 対 象 と な るヘ ッ ダ フ ァイルの 部 分 を 指 定 できます。PCH フ ァ イルの 名 前 と 場 所 の 指 定PCH ファイルのファイル 名 と 場 所 は、 以 下 のコマンドラインオプションを 使用 して 指 定 できます。• --create_pch=filename• --use_pch=filename• --pch_dir=directory--pch_dir オプシ ョ ン と 共 に --create_pch または --use_pch のいずれかを 使 用 する と、 フ ァ イル 名 が 絶 対 パスで 指 定 されている 場 合 を 除 き、 指 定 されたフ ァイル 名 がデ ィ レ ク ト リ 名 に 追 加 されます。PCH コ マン ド ラ イ ンオプシ ョ ンの 順 序コンパイラでは、 上 記 の 3 つのオプシ ョ ンを 同 じ コマン ド ラ イ ンで 使 用 することはできません。 これらのオプショ ンの 2 つ 以 上 が 指 定 されている 場 合 には、 以 下 の 規 則 が 適 用 さ れます。• --use_pch は --pch よりも 優 先 されます。• --create_pch は 他 のすべての PCH オプシ ョ ンよ り も 優 先 されます。自 動 PCH 処 理 の 記 述 のほ と んどは、 こ れら のモー ド のいずれか 1 つに 適 用 されます。 例 えば、 ヘッダス ト ップポイ ン ト と PCH ファイルの 適 用 性 は、 同 じ方 法 で 決 定 さ れます。PCH 処 理 の 制 御以 下 のプ ラ グマを 使 用 し て、 ヘ ッ ダフ ァ イルの 一 部 が PCH 処 理 の 対 象 と な るように 指 定 できます。• 元 のソース フ ァ イル 内 で #pragma hdrstop ディレクティブを 使 用 して、 プリプロセッシングディ レクティブに 属 さない 最 初 のトークンよ り 前 に、手 動 のヘ ッ ダ ス ト ッ プポ イ ン ト を 挿 入 し ます。これによ り 、 プ リ コ ンパイルの 対 象 と な るヘッ ダフ ァ イル 群 の 終 わ り を指 定 で き ます。 以 下 に 例 を 示 し ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-25ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方#include "xxx.h"#include "yyy.h"#pragma hdrstop#include "zzz.h"この 例 では、 PCH ファイルに xxx.h および yyy.h の 処 理 状 態 は 含 まれますが、 zzz.h の 処 理 状 態 は 含 まれません。 このよ うな 方 法 は、#pragmahdrstop よ り 後 の 情 報 に 対 し て 別 の PCH ファイルを 作 成 する 必 要 がない場 合 に 使 用 する と 便 利 です。• #pragma no_pch デ ィ レ ク テ ィ ブを 使 用 する と 、 ソース フ ァ イルの PCH 処理 を 抑 止 できます。注これらのプラグマは、 自 動 PCH 処 理 を 行 う 場 合 で も 使 用 で き ます。詳 細 については、 「プラ グマ」 (ページ 4-15) を 参 照 して 下 さい。2.4.3 PCH 処 理 中 の メ ッ セージ 出 力 の 制 御コンパイラは、 PCH フ ァ イルの 作 成 時 ま たは 使 用 時 に、 以 下 の メ ッ セージを表 示 し ます。test.c: creating precompiled header file test.pchこのメ ッセージは、 コマンドラインオプション --no_pch_messages を 使 用 して抑 止 で き ます。--pch_verbose オプシ ョ ン を 使 用 する と 、 コ ンパ イ ラ は、 確 認 し たが 使 用 で きない 各 PCH フ ァ イ ルについての メ ッ セージ を 表 示 し、 そのフ ァ イ ルを 使 用 できない 理 由 を 示 し ます。2.4.4 パフ ォーマンスに 関 する 問 題 点ヘ ッ ダ フ ァ イルが 大 き い 場 合 で も 、 作 成 さ れた PCH ファイルが 使 用 されない場 合 で も、 通 常 、 PCH フ ァ イルの 作 成 と 読 み 出 し にそれほどのオーバーヘ ッドはかかりません。 また、 PCH ファイルが 使 用 されると、 一 般 的 にはコンパイル 時 間 がかな り 短 縮 さ れます。 ただし、 PCH ファイルのサイズは 250KB 程度 から 数 メ ガバイ ト 以 上 と まちまちであ るため、 数 多 く の PCH ファイルを 作成 する のは 望 ま し く あ り ません。例 えば、 統 一 さ れていないプ リ プ ロ セ ッ シングデ ィ レ ク テ ィ ブの 初 期 シーケンスを 含 むファイル 群 がある 場 合 など、 PCH 処 理 が 必 ずし も 適 し ていない ことがあります。2-26 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方PCH 処 理 は、 複 数 の ソ ース フ ァ イルで 1 つの PCH ファイルを 共 有 できる 場 合に 有 益 です。 多 く のフ ァ イルで 共 有 すればする ほど、 デ ィ ス ク 容 量 を 節 約 できます。 共 有 する こ と に よ り 、 コ ンパ イ ル 時 間 を 大 幅 に 短 縮 で き る と い う 利点 を 享 受 しながら、 PCH フ ァ イルのサイ ズが 大 きい と い う 欠 点 を 最 小 限 に 抑えることができます。し たがって、 ヘ ッ ダフ ァ イルのプ リ コ ンパ イルを 最 大 限 に 利 用 する には、ソースファイルの #include セ ク シ ョ ン を 並 べ 替 え る か、 頻 繁 に 使 用 さ れるヘッダファイル 内 の #include デ ィ レ ク テ ィ ブをグループ 化 する 必 要 があ り ます。環 境 やプ ロ ジ ェ ク ト が 異 なれば、 要 件 も 異 な る 可 能 性 があ り ます。 ただし、PCH のサポー ト を 最 大 限 に 利 用 する には、 あ る 程 度 の 試 行 錯 誤 と 、 ソ ースコー ド の 若 干 の 変 更 が 必 要 にな る こ と に 注 意 し て 下 さ い。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-27ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方2.5 タ ーゲ ッ ト プ ロセ ッ サまたはアーキテ ク チ ャの 指 定RVCT では、 <strong>ARM</strong>v4 以 降 のすべての <strong>ARM</strong> アーキテクチャがサポー ト されます。 こ れには <strong>ARM</strong> NEON Technology も 含 まれます。 <strong>ARM</strong>v4 よ り 前 のすべてのアーキテクチャ 名 は 使 用 されな く なったため、 サポー ト されていません。ターゲッ ト プロセッサまたはアーキテクチャを 指 定 する と、 コンパイラは、選 択 さ れたプ ロ セ ッ サま たはアーキテ ク チャ 固 有 の 追 加 機 能 を 利 用 で き ます。これらの 機 能 を 有 効 にするには、--cpu および --fpu オプシ ョ ンを 使 用 し ます。さらに、--arm オプシ ョ ンまたは --thumb オプシ ョ ン を 使 用 し て、 起 動 命 令 セ ットを 指 定 できます。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 「NEON Technology」• 「ターゲッ ト CPU の 選 択 」 (ページ 5-4)• 『デベロ ッ パガ イ ド 』 の 第 5 章 <strong>ARM</strong> と Thumb のインターワーク『コンパイ ラ リ ファレンスガイ ド』 も 参 照 して 下 さい。• 「--arm」 (ページ 2-9)• 「--cpu=list」 (ページ 2-34)• 「--cpu=name」 (ページ 2-35)• 「--fpu=list」 (ページ 2-69)• 「--fpu=name」 (ページ 2-70)• 「--thumb」 (ページ 2-136)2.5.1 NEON TechnologyNEON Technology としても 知 られる <strong>ARM</strong> Advanced SIMD (Single InstructionMultiple Data、 単 一 命 令 で 複 数 のデータ を 並 列 処 理 ) 拡 張 機 能 は、 マルチ メデ ィ アアプ リ ケーシ ョ ンおよび 信 号 処 理 アプ リ ケーシ ョ ンのパフ ォーマン スを 向 上 させるために <strong>ARM</strong> が 開 発 し た 64 ビット と 128 ビッ トのハイブリッドSIMD アーキテクチャです。 NEON はプロセ ッサの 一 部 と し て 実 装 されますが、 独 自 の 実 行 パイプラ イ ン と 、 <strong>ARM</strong> のレジスタバンク とは 別 のレジスタバンクを 持 ちます。 主 な 機 能 には、 境 界 整 列 および 非 境 界 整 列 データ ア ク セス、整 数 、 浮 動 小 数 点 、 および 単 精 度 浮 動 小 数 点 データ 型 のサポー ト 、 <strong>ARM</strong> コアへの 密 結 合 、 および 複 数 のビ ューのあ る 大 き な レ ジ ス タ フ ァ イルな どがあ ります。 NEON 命 令 は、 <strong>ARM</strong> と Thumb-2 の 両 方 で 使 用 で き ます。2-28 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方<strong>ARM</strong> コンパイラでは NEON ユニッ ト を 備 えた Cortex プロセッサがサポートされています。 NEON 命 令 を 生 成 するには、 コマン ド ラ インで NEONTechnology を 含 む Cortex プ ロ セ ッ サを 指 定 する 必 要 があ り ます (--cpuCortex-A8 など)。 <strong>ARM</strong>v7 以 前 のアーキテ ク チ ャ では NEON はサポー ト されていません。『コンパイ ラ リ ファレンスガイ ド』 の 付 録 E NEON サポー ト の 使 用 を 参 照 して下 さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-29ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方2.6 使 用 する プ ロシージ ャ コール 標 準 (AAPCS) の 指 定<strong>ARM</strong> アーキテ クチャ 向 けプロシージャ コール 標 準 (AAPCS) は、 BaseStandard Application Binary Interface for the <strong>ARM</strong> Architecture (BSABI) 仕 様 の 一部 です。 AAPCS に 準 拠 し た コー ド を 記 述 する と 、 別 々に コ ンパイルおよびアセンブル し たモジ ュールを 連 動 さ せる こ と がで き ます。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 「イ ン ターワー ク 修 飾 子 」• 「 位 置 非 依 存 修 飾 子 」• 「ターゲ ッ ト プ ロ セ ッ サま たはアーキテ ク チャ の 指 定 」 (ページ 2-26)• install_directory\Documentation\Specifications\.... にある <strong>ARM</strong> アーキテクチャ 向 けプロシージャコール 標 準 仕 様 (aapcs.pdf)2.6.1 インターワーク 修 飾 子以 下 の --apcs 修 飾 子 を 使 用 し て、 イ ン ターワー ク を 制 御 で き ます。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の「--apcs=qualifer...qualifier」 (ページ 2-4)• 『デベロ ッ パガ イ ド 』 の 第 5 章 <strong>ARM</strong> と Thumb のインターワーク• 『リンカユーザガイド』 の 第 3 章 基 本 リ ンカ 機 能 の 使 用2.6.2 位 置 非 依 存 修 飾 子以 下 の --apcs 修 飾 子 を 使 用 し て、 位 置 に 依 存 する かど う かを 制 御 で き ます。 これら の 修 飾 子 は、 再 入 可 能 でス レ ッ ド セーフな コー ド の 作 成 に も 影 響 し ます。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の「--apcs=qualifer...qualifier」 (ページ 2-4)• 「 位 置 非 依 存 コー ド およびデータ の 制 限 」 (ページ 2-29)• 『ライブラ リガイ ド』 の 「 再 入 可 能 およびス レ ッ ド セーフ コー ド の 記 述 」(ページ 2-5)• 『リンカリファレンスガイド』 の 第 4 章 BPABI および SysV の 共 有 ラ イブラ リ と 実 行 可 能 フ ァ イル2-30 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方位 置 非 依 存 コー ド およびデー タの 制 限/ropi、 /rwpi、 /fpic のいずれかを 指 定 してコードをコンパイルする 場 合 、 いくつかの 制 限 が 適 用 されます。 主 な 制 限 を 以 下 に 示 し ます。• C++ をコンパイルするとき、--apcs /ropi は 使 用 でき ません。 /ropi を 使 用してコンパイルできるのは、 C++ の C サブセッ ト のみです。• 正 規 の C の 一 部 の 構 造 を --apcs=/ropi または --apcs=/rwpi でコンパイルする と、 正 し く 機 能 し ません。 以 下 に 例 を 示 し ます。int i;// rwint *p1 = &i; // this static initialization does not work// with --apcs=/rwpi --no_lower_rwpiextern const int ci; // roconst int *p2 = &ci; // this static initialization does not work// with --apcs=/ropi上 記 の よ う な 静 的 初 期 化 を 実 行 するには、--lower_rwpi オプシ ョ ン と--lower_ropi オプシ ョ ンを 使 用 し ます。こ の コー ド を コ ンパイルするには、 以 下 の よ う に 入 力 し ます。armcc --apcs=/rwpi/ropi --lower_ropi--lower_rwpi はデフ ォル ト であ る ため、 指 定 する 必 要 はあ り ません。• C++ をコンパイルするときには、--apcs=/fpic の 使 用 がサポー ト されます。 こ の 場 合 、 仮 想 テーブル 関 数 と typeinfo は、 PC 相 対 でア ク セスで きるように 読 み 出 し- 書 き 込 み 領 域 に 配 置 さ れます。• --apcs=/fpic を 使 用 した 場 合 、 コンパイ ラは __declspec(dllexport) としてマーク された 関 数 とデータのみをエク スポー ト し ます。• --no_hide_all を 使 用 した 場 合 、 コンパイ ラはすべての extern 変 数 および関 数 の 可 視 性 と し て STV_DEFAULT を 使 用 し ます (これら の 変 数 や 関 数が __declspec(dll*) を 使 用 していない 場 合 )。 可 視 性 が STV_DEFAULT の場 合 、 関 数 の 自 動 イ ン ラ イ ン 展 開 は 無 効 にな り ます。例 えば、 System V または <strong>ARM</strong> Linux 共 有 ラ イ ブ ラ リ を ビル ド する 場 合には、 --no_hide_all と --apcs /fpic を 一 緒 に 使 用 し ます。__declspec キーワードの 詳 細 については、 『コンパイ ラ リ ファレンスガイ ド』の 「__declspec 属 性 」 (ページ 4-27) を 参 照 して 下 さい。シンボル 可 視 性 の 詳 細 については、 『リンカリファレンスガイド』 の 「シンボルの 可 視 性 」 (ページ 4-4) を 参 照 して 下 さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-31ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方2.7 リ ン カのフ ィ ー ド バ ッ クの 使 用リ ンカは 以 下 を 実 現 する フ ィ ー ド バ ッ ク 機 能 を 備 えています。• 未 使 用 関 数 の 効 率 的 な 削 除• インターワークに 必 要 なコンパイルの 削 減2.7.1 未 使 用 関 数 の 削 除未 使 用 の 関 数 コー ド は 以 下 の 状 況 で 発 生 する 場 合 があ り ます。• ソース コー ド で 使 用 さ れな く なった 古 い 関 数 があ る 場 合 。 リンカのフィードバックを 使 用 すると、 ソースコードから 未 使 用 の 関 数 コードを手 動 で 削 除 する 代 わ り に、 最 終 イ メ ージか ら 未 使 用 のオブジ ェ ク ト コード を 自 動 的 に 削 除 で き ます。• 関 数 が イ ン ラ イ ン 関 数 の 場 合 。 インライン 関 数 が static として 宣 言 されていない 場 合 、 ア ウ ト オブ ラ イ ン 関 数 コー ド がオブジ ェ ク ト フ ァ イル 内に 存 在 し ていて も、 その コー ド の 呼 び 出 し が 行 われる こ と はあ り ません。未 使 用 関 数 をオブジ ェ ク ト フ ァ イルか ら 削 除 する には、1. ソースコードをコンパイルします。2. リンカオプション --feedback=filename を 使 用 して、 フ ィードバッ ク フ ァイルを 作 成 します。 デフ ォル ト では、 未 使 用 関 数 の 削 除 に 関 する フ ィ ードバックが 生 成 されます。3. コンパイラオプション --feedback=filename を 使 用 して、 フ ィードバッ クファイルをコンパイラに 送 ります。コ ンパイ ラ は リ ンカが 生 成 し たフ ィ ー ド バ ッ ク フ ァ イルを 使 用 し て、 リ ンカが 後 で 未 使 用 関 数 を 破 棄 で き る よ う に ソース コー ド を コ ンパイルし ます。注リ ン カのフ ィ ー ド バ ッ ク を 最 大 限 に 活 用 する には、 完 全 な コ ンパ イ ル と リ ンクを 2 回 以 上 実 行 し ます。 通 常 は、 前 回 のビル ド 時 のフ ィ ー ド バ ッ ク を 使 用 して 1 回 コンパイルして リ ンクすれば 十 分 です。フィードバックファイルが 存 在 しない 場 合 でも、--feedback=filename オプシ ョンを 指 定 できます。 こ れに よ り 、 フ ィ ー ド バ ッ ク フ ァ イルが 存 在 する かど うかに 関 係 なく、 同 じビルドファイルまたはメークファイルを 使 用 できます。以 下 に 例 を 示 し ます。2-32 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方armcc -c --feedback=unused.txt test.c -o test.oarmlink --feedback=unused.txt test.o -o test.axf初 めてアプ リ ケーシ ョ ンをビルドする 際 、 アプ リ ケーシ ョ ンは 正 常 にコンパイルされますが、 コンパイラによって、 指 定 したフ ィードバッ クファイルが存 在 し ないために 読 み 出 すこ と がで き ない と い う 警 告 メ ッ セージが 表 示 さ れます。 その 後 、 リ ン ク コ マン ド に よ って、 フ ィ ー ド バ ッ ク フ ァ イ ルが 作 成 され、 イ メ ージがビル ド されます。 2 回 目 以 降 のコ ンパ イル 時 には、 前 の リ ン ク手 順 のフ ィ ー ド バ ッ ク フ ァ イルを 使 用 し て、 特 定 さ れた 未 使 用 の 関 数 を 削 除します。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の 「--feedback=filename」(ページ 2-63)• 『リンカリファレンスガイド』 の 「--feedback_type=type」 (ページ 2-25)• 『リンカユーザガイド』 の 「フ ィードバッ ク」 (ページ 3-16)2.7.2 イ ン タ ーワークに 必 要 な コ ンパイルの 削 減注インターワークに 必 要 なコンパイルの 削 減 は、 <strong>ARM</strong>v4T アーキテクチャにのみ 該 当 し ます。 <strong>ARM</strong>v5T 以 降 のプ ロ セ ッ サではイ ン ターワー ク に よ るペナルティは 発 生 しません。リンカでは、<strong>ARM</strong> 関 数 がいつ Thumb 状 態 か ら 呼 び 出 さ れ、 Thumb 関 数 がいつ <strong>ARM</strong> 状 態 か ら 呼 び 出 さ れる のかを 検 出 し ます。 リンカのフィードバックを使 用 する と 、 イ ン ターワー ク の コ ンテキ ス ト で 使 用 さ れない 関 数 が イ ン ターワーク 用 にコンパイルされる こ と を 回 避 できます。イ ン ターワー ク に 必 要 な コ ンパ イ ルを 削 減 する には1. ソースコードをコンパイルします。2. リンカオプション --feedback=filename および --feedback_type=iw を 使 用 して、 インターワークのサポー ト が 必 要 な 関 数 を 報 告 するフ ィードバッ クファイルを 作 成 します。3. コンパイラオプション --feedback=filename を 使 用 して、 フ ィードバッ クファイルをコンパイラに 送 ります。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-33ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方コ ンパイ ラ は リ ンカが 生 成 し たフ ィ ー ド バ ッ ク フ ァ イルを 使 用 し て、 イ ンターワークのコンテキス ト で 使 用 されない 関 数 を 後 でコンパイルしないよ うな 方 法 で、 ソース コード を コ ンパイルし ます。注リ ン カ フ ィ ー ド バ ッ ク フ ァ イルを 使 用 する 直 前 に、 完 全 な ク リ ーン ビル ド を必 ず 実 行 し て 下 さ い。 これに よ り 、 生 成 に 使 用 し た ソース コー ド が 原 因 で 古 いフ ィ ー ド バ ッ ク フ ァ イルを 使 用 する リ ス ク を 最 小 限 に 抑 え る こ と がで き ます。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の 「--feedback=filename」(ページ 2-63)• 『リンカリファレンスガイド』 の 「--feedback_type=type」 (ページ 2-25)• 『リンカユーザガイド』 の 「フ ィードバッ ク」 (ページ 3-16)2-34 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


<strong>ARM</strong> コンパイラの 使 い 方2.8 シンボルバージ ョ ンの 追 加コンパイラと リンカでは、 GNU 拡 張 シンボルバージ ョ ン 管 理 モデルがサポートされます。C または C++ コードでシンボルバージ ョ ンが 含 まれた 関 数 を 作 成 するには、アセンブラ ラベルの GNU 拡 張 を 使 用 して、 function のデフ ォル ト の ver の 場合 は 関 数 シンボルの 名 前 を function@@ver に 変 更 し、function のデフ ォル ト 以 外の ver の 場 合 は function@ver に 変 更 する 必 要 があ り ます。例 えば、 デフ ォル ト のバージ ョ ンは 以 下 の よ う に 定 義 し ます。int new_function(void) __asm__("versioned_fun@@ver2");int new_function(void){return 2;}デフ ォル ト 以 外 のバージ ョ ンは 以 下 の よ う に 定 義 し ます。int old_function(void) __asm__("versioned_fun@ver1");int old_function(void){return 1;}詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の 「アセンブラ ラベル」 (ページ3-22)• 『リンカユーザガイド』 の 「シンボルのバージ ョ ン 管 理 」 (ページ 4-17)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 2-35ID 100419Non-Confidential,


<strong>ARM</strong> コンパイラの 使 い 方2-36 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


第 3 章NEON ベ ク ト ル 化 コ ンパイ ラの 使 用本 章 では、 NEON ユニ ッ ト と 、 自 動 ベ ク ト ル 化 機 能 の 使 用 方 法 について 説 明します。 以 下 のセ ク シ ョ ンか ら 構 成 さ れています。• 「NEON ユニッ ト 」 (ページ 3-2)• 「NEON コー ド の 記 述 」 (ページ 3-3)• 「 自 動 ベ ク ト ル 化 の 動 作 」 (ページ 3-5)• 「パフ ォーマン スの 向 上 」 (ページ 3-7)• 「サンプル」 (ページ 3-19)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 3-1ID 100419Non-Confidential,


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用3.1 NEON ユニッ トNEON ユニッ ト は 32 個 のベクタレジスタを 備 えており、 レジスタはそれぞれが 16 バイ トの 情 報 を 保 持 します。 これらの 16 バイ トのレジスタは、NEON ユニッ ト 内 で 同 時 に 操 作 できます。 例 えば、 1 つのベク タ 加 算 命 令 で 8 個 の 16ビ ッ ト 整 数 を 他 の 8 個 の 16 ビット 整 数 に 加 算 して、8 個 の 16 ビ ッ ト の 結 果 を得 るこ とができます。NEON ユニッ ト では、 8 ビッ ト、 16 ビッ ト、 および 32 ビ ッ ト の 整 数 演 算 と 一部 の 64 ビッ ト 演 算 をサポートし、32 ビ ッ ト の 浮 動 小 数 点 演 算 も サポー ト し ています。注浮 動 小 数 点 コー ド は 常 に 自 動 的 にベ ク ト ル 化 さ れる と は 限 り ません。 例 えば、再 関 連 付 けが 必 要 なループは、--fpmode fast を 使 用 したコンパイル 時 にのみベクトル 化 されます。 --fpmode fast を 使 用 してコンパイルする と、 結 果 に 影 響 を及 ぼすこ と のあ る 変 換 を 実 行 でき ます (『コンパイ ラ リ ファレンスガイ ド』の 「--fpmode=model」 (ページ 2-67) を 参 照 して 下 さい)。NEON ユニッ ト は、 1 つの 命 令 でベク タ レジス タの 複 数 の 要 素 を 処 理 するベクタ SIMD ユニッ ト と して 分 類 されます。例 えば、 配 列 A は 16 ビット 整 数 の 配 列 で 8 つの 要 素 から な り ます。1 2 3 4 5 6 7 8表 3-1 配 列 A配 列 B には 次 の 8 つの 要 素 があ り ます。80 70 60 50 40 30 20 10表 3-2 配 列 Bこ れら の 配 列 ど う し を 加 算 するには、 各 ベ ク タ をベク タ レ ジ ス タ にフ ェ ッ チし、 1 つのベク タ SIMD 命 令 を 使 用 し て 結 果 を 算 出 し ます。81 72 63 54 45 36 27 18表 3-3 結 果3-2 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用3.2 NEON コー ド の 記 述このセクショ ンでは、 NEON ユニ ッ ト の コー ド の 記 述 方 法 について 概 説 し ます。 NEON 上 で コー ド を 実 行 するには、 以 下 の 方 法 があ り ます。• アセンブ リ 言 語 で 記 述 するか、 C の 組 み 込 みアセンブ リ 言 語 を 使 用 し、NEON 命 令 を 直 接 使 用 し ます。• NEON の C 言 語 の 拡 張 機 能 を 使 用 し て、 C または C++ で 記 述 し ます。• NEON 命 令 を 使 用 する ために 最 適 化 さ れた ラ イ ブ ラ リ ルーチン を 呼 び 出します。• 自 動 ベ ク ト ル 化 を 使 用 し て、 ループを NEON 用 にベク ト ル 化 し ます。3.2.1 NEON の C 拡 張 機 能NEON の C 拡 張 機 能 は、 C から NEON ユニ ッ ト へのア ク セス を 可 能 にするために <strong>ARM</strong> に よ って 定 義 さ れた 新 し いデータ 型 およびコ ンパイ ラ 組 み 込 み 関数 のセ ッ ト です。 ベ ク タ 関 数 の 大 部 分 は NEON ユニ ッ ト で 使 用 可 能 なベ ク タ命 令 に 直 接 マ ッ ピ ング さ れ、 NEON 拡 張 <strong>ARM</strong> C コンパイラによってインラインでコンパイルされます。 こ れら の 拡 張 機 能 では、 C レベルのパフォーマンスを 達 成 でき、 アセンブリ 言 語 のコーディ ングによって 得 られるパフォーマンスに 匹 敵 します。『コンパイ ラ リ ファレンスガイ ド』 の 「 付 録 E NEON サポー ト の 使 用 」 を 参 照して 下 さい。3.2.2 自 動 ベ ク ト ル 化明 示 的 な NEON 命 令 を 記 述 する 代 わ り にベ ク ト ル 化 可 能 なループを コーデ ィングする と、 プロセ ッ サ 間 のコード の 移 植 性 が 保 たれます。 手 作 業 で コーデ ィ ング し たベク ト ル 化 と 同 等 のパフ ォーマン ス レベルを よ り 簡 単 に 達 成 できます。例 3-1 は、 Cortex-A8 プ ロ セ ッ サで 自 動 ベ ク ト ル 化 を 行 う コ マン ド ラ イ ンオプションの 例 を 示 しています。例 3-1 自 動 ベク ト ル 化armcc --vectorize --cpu=Cortex-A8 -O3 -Otime -c file.c<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 3-3ID 100419Non-Confidential,


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用注-O2 -Otime を 指 定 してコンパイルする こ と もできますが、 コードのパフォーマン ス を 最 大 にする こ と ができ ません。3.2.3 パフォーマンスの 目 標多 く のアプ リ ケーシ ョ ンでは、 ベク ト ル 化 によ って 最 高 のパフ ォーマン ス を得 るために 調 整 を 行 う 必 要 があ り ます。 多 少 のオーバーヘ ッ ド は 常 に 存 在 するため、 理 論 的 な 最 大 パフ ォーマン スは 達 成 でき ません。 例 えば、 NEON ユニッ トは、 同 時 に 4 つの 単 精 度 浮 動 小 数 点 を 処 理 で き ます。 つま り 、 浮 動 小 数点 アプリ ケーシ ョ ンの 理 論 的 な 最 大 パフォーマンスは、 ベク トル 化 されていない 元 のスカラ コードの 4 倍 です。 標 準 的 なオーバーヘ ッ ド を 仮 定 する と 、 浮動 小 数 点 アプ リ ケーシ ョ ン 全 体 の 妥 当 な 目 標 は、 ス カ ラ コー ド のパフ ォーマンスを 50% 向 上 させる こ と です。 完 全 にベ ク ト ル 化 で き ない 大 規 模 なアプ リケーシ ョ ンでは、 スカラ コードのパフォーマンスを 25% 向 上 させる こ と が 妥当 な 目 標 です。 ただし、 この 目 標 はアプ リ ケーシ ョ ンに 大 き く 依 存 し ます。詳 細 については、 「パフ ォーマン スの 向 上 」 (ページ 3-7) を 参 照 して 下 さい。3-4 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用3.3 自 動 ベク ト ル 化 の 動 作このセクションでは、 自 動 ベクトル 化 の 概 要 について 説 明 し、ベクトル 化 の処 理 および 生 成 される コード のパフ ォーマン スに 影 響 を 与 え る 要 因 について説 明 し ます。3.3.1 自 動 ベ ク ト ル 化 の 概 要自 動 ベ ク ト ル 化 では、 ユーザコー ド のループの 高 度 な 分 析 が 行 われます。 これは、 標 準 の コー ド の 大 部 分 を NEON ユニッ ト の 機 能 にマップする 最 も 効 果的 な 方 法 です。 多 く の コー ド では、 アルゴ リ ズムに 依 存 する 小 規 模 の 並 列 処理 に よ る 利 点 は、 その よ う な 並 列 処 理 が 可 能 な 場 合 の 自 動 分 析 のコ ス ト に 比べて 非 常 に 小 さ な も のです。 このため、 NEON ユニッ ト は、 ループベースの並 列 処 理 対 象 と し て 設 計 さ れています。ベ ク ト ル 化 は、 最 適 化 さ れた コー ド か ら 得 られる 結 果 がベ ク ト ル 化 さ れないコー ド の 結 果 と 同 じ にな る よ う に 実 行 さ れます。 場 合 に よ っ ては、 不 正 な 結果 が 生 じ る 可 能 性 を 排 除 するために、 ループのベク ト ル 化 は 実 行 されません。こ の よ う な 場 合 は 次 善 の コー ド にな る ため、 自 動 ベ ク ト ル 化 に 適 する よ う に手 作 業 でコー ド を 調 整 する 必 要 があ り ます。 詳 細 については、 「パフ ォーマンスの 向 上 」 (ページ 3-7) を 参 照 して 下 さい。3.3.2 ベク ト ル 化 の 概 念こ のセ ク シ ョ ンでは、 コー ド のベ ク ト ル 化 を 検 討 する 際 に 通 常 使 用 さ れる 概念 のい く つかを 説 明 し ます。データ 参 照コード 内 のデータ 参 照 は、 次 の 3 種 類 のいずれかに 分 類 で き ます。スカラループのすべての 繰 り 返 し を 通 し て 変 化 し ない 1 つの 場 所 です。インデクス ループの 1 パス ご と に 一 定 量 イ ン ク リ メ ン ト さ れる 整 数 量 です。ベクタ連 続 する 要 素 間 に 一 定 のス ト ラ イ ド を 持 つ メ モ リ 位 置 の 範 囲 です。例 3-2 (ページ 3-6) に、 ループ 内 の 次 の 変 数 の 分 類 を 示 し ます。i、 j インデクス 変 数a、 b ベクタxスカラ<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 3-5ID 100419Non-Confidential,


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用例 3-2 ベク ト ル 化 可 能 なループの 分 類float *a, *b;int i, j, n;...for (i = 0; i < n; i++){*(a+j) = x +b[i];j += 2;};ベ ク ト ル 化 する には、 コ ンパイ ラ がベク タ ア ク セスパターンで 変 数 を 識 別 する 必 要 があ り ます。 また、 ループの 繰 り 返 しの 間 でデータの 依 存 関 係 が 生 じないよ う にする 必 要 もあ り ます。ストライドパターンとデータアクセスループ 内 のデータ ア ク セスのス ト ラ イ ド パターン と は、 シーケンシ ャルなループの 繰 り 返 しの 間 にデータ 要 素 がア ク セス されるパターンです。 例 えば、配 列 の 各 要 素 を 直 線 的 にア ク セスするループは、 1 つのス ト ラ イ ド を 持 っています。 別 の 例 と し ては、 使 用 さ れる 各 要 素 間 を 一 定 のオフセ ッ ト で 配 列 にアクセスするループは、 一 定 のスト ライドを 持 つという ことになります。例 3-2 では、b には 1 のス ト ライ ドでアクセスし、a には 2 のス ト ライ ドでアクセスしています。3.3.3 ベク トル 化 によるパフォーマンスに 影 響 を 与 える 要 因自 動 ベ ク ト ル 化 処 理 および 生 成 さ れる コー ド のパフ ォーマン スは、 以 下 の ものに 影 響 を 受 け ます。ループの 構 成最 高 のパフ ォーマン ス を 得 るには、 ネス ト し たループの 最 深 部のループは 1 つのス ト ラ イ ド で 配 列 にア ク セスする 必 要 があ り ます。データ の 構 造また、 データ 型 は NEON レ ジ ス タ で 保 持 で き るデータ 要 素 の 数に も 影 響 を 与 え、 そのために 並 列 に 実 行 で き る オペレーシ ョ ンの 数 に 影 響 が 及 びます。3-6 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用3.3.4 パフ ォーマンスの 向 上ループの 繰 り 返 し 回 数一 般 的 に、 繰 り 返 し 回 数 が 多 い 場 合 は、 ループのオーバーヘ ッド は 繰 り 返 しの 中 に 吸 収 されるので、 繰 り 返 し 回 数 が 多 いほ うが 有 利 です。 2 つか 3 つの 要 素 な ど、 非 常 に 繰 り 返 し 回 数 が 少 ない 場 合 は、 ベク ト ル 化 し ない 処 理 のほ う が 早 く なる こ と があ ります。配 列 のデータ 型一 例 と し て、 NEON では 倍 精 度 浮 動 小 数 点 の 配 列 が 使 用 さ れている 場 合 はパフォーマンスは 向 上 しません。メモリ 階 層 の 使 用現 在 のプ ロ セ ッ サの 大 部 分 では、 メ モ リ の 帯 域 幅 と プ ロ セ ッ サの 容 量 と のバラ ン スが 相 対 的 に 取 れていません。 例 えば、 メ イ ンメ モ リ か ら 取 得 し た 大 規 模 なデータ セ ッ ト 上 で 比 較 的 少 ない 算術 演 算 を 実 行 する こ と は、 シ ス テムの メ モ リ 帯 域 幅 に よ っ て 制限 されます。多 くのアプリケーションでは、 NEON から 最 適 な 結 果 を 得 るために、 プログラ ムの 一 部 を 調 整 する 必 要 があ り ます。 このセクションでは、 さまざまなタイプのループについて 説 明 します。 正 常 にベ ク ト ル 化 さ れるループ と 、 ベ クト ル 化 でき ないループについて 説 明 し ます。 また、 ベク トル 化 されたコードか ら 最 高 のパフ ォーマン ス を 得 る ための コー ド の 変 更 方 法 について も 説 明 します。パフ ォーマンスに 関 する 一 般 的 な 問 題 点コマンドラインオプショ ンの -O3 および -Otime を 使 用 する と 、 ベク ト ル 化 に よるパフ ォーマン スの 向 上 のほかにさ らに 大 き く パフ ォーマン スが 向 上 し ます。パフ ォーマン スの 最 適 化 を 行 う 際 には、 ハ イ レベルのアルゴ リ ズム 構 造 、データ 要 素 のサ イ ズ、 配 列 の 構 成 、 正 し く 構 成 さ れた 繰 り 返 しループ、 演 算の 削 減 、 およびデータ の 依 存 関 係 について 考 慮 する 必 要 があ り ます。 パフ ォーマン ス を 最 適 化 する には、 プ ロ グ ラ ム 内 で 多 く の 時 間 を 浪 費 し てい る場 所 を 知 る 必 要 があ り ます。 パフ ォーマン ス を 最 大 限 に 向 上 さ せる には、 現実 的 な 条 件 の も と で コー ド のプ ロ フ ァ イ リ ングおよびベンチマー ク を 行 う こと が 必 要 です。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 3-7ID 100419Non-Confidential,


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用多 く の 場 合 、 ソース コー ド や 複 雑 な 配 列 ア ク セスの 手 作 業 に よ るループ 展 開など、 手 作 業 に よ る 事 前 の コー ド の 最 適 化 が 自 動 ベク ト ル 化 を 妨 げる 要 因 になります。 最 適 な 結 果 を 得 る ための 最 善 の 方 法 は、 単 純 なループを 使 用 し てコー ド を 記 述 する こ と です。 それに よ って、 コ ンパ イ ラ はすべての 最 適 化 を実 行 で き ます。 手 作 業 によ る 最 適 化 が 行 われた 従 来 のコード では、 元 のアルゴ リ ズムに 基 づいて、 単 純 なループを 使 用 し て コー ド の 問 題 部 分 を 書 き 直 すほうが 容 易 であることがあります。『コンパイ ラ リ ファレンスガイ ド』 の 以 下 のセ ク シ ョ ンを 参 照 し て 下 さい。• 『コンパイ ラ リ ファレンスガイ ド』 の 「--vectorize,--no_vectorize」 (ページ 2-146)• 『コンパイ ラ リ ファレンスガイ ド』 の 「-Onum」 (ページ 2-108)• 『コンパイ ラ リ ファレンスガイ ド』 の 「-Otime」 (ページ 2-111)デー タの 依 存 関 係1 回 の 繰 り 返 しから 同 じループの 将 来 の 繰 り 返 しにフ ィ ード バッ クする 結 果が 得 られるループは、 データ の 依 存 関 係 に よ る 競 合 があ る と 言 います。 競 合し てい る 値 は、 配 列 要 素 や 累 算 の よ う な ス カ ラ の 場 合 があ り ます。データ の 依 存 関 係 に よ る 競 合 があ るループは、 完 全 に 最 適 化 さ れない 場 合 があります。 配 列 やポ イ ン タ が 関 係 するデータ の 依 存 関 係 を 検 出 するには、 各ループのネ ス ト で 使 用 さ れてい る 配 列 を 広 範 囲 に 解 析 し、 ループ 内 で 使 用 され 格 納 さ れる 配 列 の 次 元 と 共 にオフセ ッ ト および 要 素 へのア ク セ スのス ト ライ ド を 調 べる 必 要 があ り ます。 配 列 の 使 用 や 格 納 がループの 異 な る 繰 り 返 しのと きにオーバーラ ップしている 可 能 性 がある 場 合 は、 データの 依 存 関 係 の問 題 が 存 在 し ます。 オペレーシ ョ ンのベク タ 順 序 によ って 結 果 が 変 化 する 可能 性 があ る 場 合 は、 ループを 安 全 にベ ク ト ル 化 する こ と はで き ません。 このよ うな 場 合 は、 コンパイラによって 問 題 が 検 出 され、 ループが 元 の 形 式 のまま 残 されるかループの 部 分 的 なベク ト ル 化 が 実 行 されます。 最 適 なパフ ォーマン ス を 得 る には、 こ の よ う なデータ の 依 存 関 係 を コー ド か ら 取 り 除 く 必 要があ り ます。例 3-3 に 示 すループでは、 ループの 最 初 にあ る a[i-2] がループの 最 後 の a[i]への 格 納 と 競 合 し ています。 こ のループを 最 適 化 する と 異 な る 結 果 が 得 ら れるので、 これは 元 の 形 式 のままになり ます。例 3-3 ベク ト ル 化 できないデー タの 依 存 関 係float a[99], b[99], t;int i;for (i = 3; i < 99; i++)3-8 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用{};t = a[i-1] + a[i-2];b[i] = t + 3.0 + a[i];a[i] = sqrt(b[i]) - 5.0;他 の 配 列 の 添 え 字 に よ る 情 報 は、 依 存 関 係 の 解 析 の 一 部 と し て 使 用 さ れます。n は n+1 に 等 し く ないので 繰 り 返 しの 間 にフ ィ ード バッ ク が 生 じ る こ と がなく、 配 列 a を 参 照 するベク タでない 添 え 字 が 等 し く なる こ とはないので、例 3-4 のループはベク ト ル 化 されます。 配 列 a の 参 照 は 配 列 の 2 つの 異 な る 部分 を 使 用 しているので、 データは 共 有 されません。例 3-4 ベ ク ト ル 化 可 能 なデー タの 依 存 関 係float a[99][99], b[99], c[99];int i, n, m;...for (i = 1; i < m; i++) a[n][i] = a[n+1][i-1] * b[i] + c[i];スカラ 変 数NEON ループ 内 で 使 用 されるが 設 定 されないスカラ 変 数 は、 ベクタ 計 算 で 使用 さ れるベ ク タ レ ジ ス タおよび 結 果 内 の 各 位 置 で 複 製 さ れます。設 定 さ れ、 ループ 内 で 使 用 さ れる ス カ ラ は、 ベ ク タ に 昇 格 されます。 一 般 的に、 こ れら の 変 数 はループ 内 で 一 時 的 な ス カ ラ 値 を 保 持 し、 一 時 的 なベ ク タ値 を 保 持 する 必 要 があ り ます。 例 3-5 内 で、 x は 使 用 されたスカラであり、y は昇 格 されたスカラです。例 3-5 ベ ク ト ル 化 可 能 なループfloat a[99], b[99], x, y;int i, n;...for (i = 0; i < n; i++){y = x + b[i];a[i] = y + 1/y;};<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 3-9ID 100419Non-Confidential,


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用使 用 さ れ、 ループ 内 で 設 定 さ れる ス カ ラ は、 持 ち 運 びスカラと 呼 ばれます。これらの 変 数 は、 ループの 1 つのパスで 計 算 された 値 が 次 のパスに 繰 り 越 されるのでベク ト ル 化 に と って 問 題 にな り ます。 例 3-6 の x は、 持 ち 運 びス カ ラです。例 3-6 ベク トル 化 できないループfloat a[99], b[99], x;int i, n;...for (i = 0; i < n; i++){a[i] = x + b[i];x = a[i] + 1/x;};縮 小 演 算ループ 内 のス カ ラ の 使 用 方 法 の 特 別 なカテゴ リ は 縮 小 演 算 です。 このカテゴリには、 スカラ 結 果 まで 値 のベクタを 減 らしていくことが 含 まれます。 最 も一 般 的 な 縮 小 は、 ベ ク タ のすべての 要 素 を 合 計 する こ と です。 その 他 の 縮 小には、 2 つのベクタのドット 積 、ベクタの 最 大 値 、ベクタの 最 小 値 、すべてのベ ク タ 要 素 の 積 、 およびベ ク タ 内 の 最 大 値 の 要 素 と 最 小 値 の 要 素 の 位 置 があります。例 3-7 に、 ド ッ ト 積 によ る 縮 小 を 示 し ます。 こ こで、 x は 縮 小 ス カ ラ です。例 3-7 ドット 積 による 縮 小float a[99], b[99], x;int i, n;...for (i = 0; i < n; i++) x += a[i] * b[i];縮 小 演 算 は 多 数 使 用 さ れる ので、 ベ ク ト ル 化 が 効 果 的 です。 一 般 的 に、 縮 小演 算 は 部 分 的 に 縮 小 したベク タを 作 成 してベク ト ル 化 を 行 い、 最 終 的 にスカラに 縮 小 します。3-10 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用ポインタの 使 用配 列 にア ク セスする 際 、 多 く の 場 合 は、 メ モ リ ア ク セスがオーバーラ ッ プ しない こ と を コ ンパ イ ラ 側 で 検 証 で き ます。 しかし、 ポインタを 使 用 すると、こ の 可 能 性 は 低 下 し、 ラ ン タ イ ムテ ス ト を 実 行 する か、 restrict を 使 用 する 必要 が 生 じ ます。コ ンパイ ラは、 ループが 安 全 であ る と 判 断 でき る 場 合 はポ イ ン タ を 含 んでいるループをベク トル 化 できます。 ループ 内 の 配 列 参 照 およびポ イ ン タ 参 照 は、メ モ リ へのベク タ ア ク セスがあ るかど う かを 判 断 するために 解 析 されます。場 合 によっては、 コンパイラはランタイムテストを 作 成 し、テストの 結 果 によってループのベクタバージョンかスカラバージョンを 実 行 します。関 数 の 引 数 はポ イ ン タ と し て 渡 さ れる 場 合 があ り ます。 複 数 のポ イ ン タ 変 数を 関 数 に 渡 す 場 合 は、 メ モ リ のオーバーラ ッ プ し てい る セ ク シ ョ ン をポ イ ントすることが 可 能 です。 実 行 時 に こ の よ う にな る こ と はほ と んど あ り ませんが、 コ ンパイ ラ は 常 に 安 全 な 方 法 に 従 い、 代 入 演 算 子 の 左 辺 および 右 辺 にポイ ン タ があ るループの 最 適 化 は 回 避 し ます。 例 えば、 例 3-8 の 関 数 を 参 照 して下 さい。例 3-8 ポイ ン タの 条 件 付 きベク ト ル 化void func (int *pa, int *pb, int x){int i;for (i = 0; i < 100; i++) *(pa + i) = *(pb + i) + x;};この 例 では、 1 つのループパスの 結 果 によ って 次 のループパスにフ ィ ードバックされるよ うにメモリ 内 で pa と pb がオーバーラ ップしている と、 ループのベ ク ト ル 化 に よ って 不 正 な 結 果 が 得 ら れる こ と があ り ます。 以 下 の 引 数 で関 数 が 呼 び 出 さ れた 場 合 は、 ベ ク ト ル 化 はあいまいな も のにな り ます。int *a;func (a, a-1);コンパイラはランタイムテストを 実 行 して、 ポインタのエイ リアスの 生 成 が行 われるかど う かを 調 べます。 ポ イ ン タ のエ イ リ ア ス 生 成 が 発 生 し ない 場 合は、 コー ド のベク ト ル 化 バージ ョ ンを 実 行 し ます。 ポインタのエイ リアス 生成 が 発 生 する 場 合 は、 元 のベク トル 化 されていないコードが 代 わりに 実 行 されます。 これによって、 ランタイムの 効 率 が 良 くなり コードサイズが 小 さ くなります。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 3-11ID 100419Non-Confidential,


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用実 際 には、 関 数 の 引 数 に よ ってデータ の 依 存 関 係 が 生 じ る こ と はほ と んど ありません。 ベク トル 化 の 問 題 は 別 にして、 オーバーラップしたポインタを 渡すプロ グ ラ ムは 理 解 とデバッ グが 困 難 です。『コンパイ ラ リ ファレンスガイ ド』 の 「restrict」 (ページ 3-9) を 参 照 して下 さい。 例 3-8 (ページ 3-11) では、 restrict を pa に 追 加 するだけで、 ラ ン タイ ムテ ス ト を 回 避 で き ます。間 接 ア ド レス 指 定間 接 ア ド レ ス 指 定 は、 配 列 が 値 のベ ク タ に よ っ てア ク セ ス さ れる 場 合 に 発 生します。 配 列 が メ モ リ か ら フ ェ ッ チ さ れてい る 場 合 、 その 操 作 は 収 集 と 呼 ばれます。 配 列 が メ モ リ に 格 納 さ れる 場 合 は、 その 操 作 は 分 散 と 呼 ばれます。例 3-9 では、 a は 分 散 され、 b は 収 集 されています。例 3-9 ベク ト ル 化 できない 間 接 ア ド レス 指 定float a[99], b[99];int ia[99], ib[99], i, n, j;...for (i = 0; i < n; i++) a[ia[i]] = b[j + ib[i]];間 接 ア ド レ ス 指 定 に よ って 処 理 で き る のは メ モ リ 内 に 連 続 し て 格 納 さ れるベクタだけなので、NEON ユニッ ト ではベク ト ル 化 できません。 ループ 内 に 間接 ア ド レ ス 指 定 および 重 要 な 計 算 が 存 在 する 場 合 は、 間 接 ア ド レ ス 指 定 を 別のベ ク タ 以 外 のループに 移 動 する と 効 率 性 が 増 し ます。 これによって、 計 算を 効 率 的 にベ ク ト ル 化 で き ます。ループ 構 造ベク ト ル 化 によ って 最 適 なパフ ォーマン ス を 得 るには、 ループの 全 体 的 な 構造 が 重 要 です。 一 般 的 に、 ループの 開 始 時 に 繰 り 返 し 回 数 を 定 め、 複 雑 な 条件 付 き ス テー ト メ ン ト や 条 件 付 き 終 了 を 含 ま ない 単 純 なループを 記 述 する ことが 最 善 です。 コードのベク トル 化 によるパフォーマンスを 向 上 させるには、ループを 書 き 直 す 必 要 があ る 場 合 があ り ます。ループの 終 了例 3-10 (ページ 3-13) も、 ループか ら の 終 了 が 含 まれているのでベク ト ル 化できません。 このよ う な 場 合 、 ベク ト ル 化 を 可 能 にするためにループを 書 き直 す 必 要 があ り ます。3-12 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用例 3-10 ベク トル 化 できないループint a[99], b[99], c[99], i, n;...for (i = 0; i < n; i++){a[i] = b[i] + c[i];if (a[i] > 5) break;};ループの 繰 り 返 し 回 数ループの 開 始 時 には、 繰 り 返 し 回 数 が 定 ま ってい る 必 要 があ り ます。 例 3-11は、 繰 り 返 し 回 数 の n がループの 過 程 で 変 更 されていないこ と を 示 し ています。例 3-11 ベ ク ト ル 化 可 能 なループint a[99], b[99], c[99],i, n;...for (i = 0; i < n; i++) a[i] = b[i] + c[i];例 3-12 には、 定 め られた 繰 り 返 し 回 数 がないので、 自 動 的 にベ ク ト ル 化 で きません。例 3-12 ベク トル 化 できないループint a[99], b[99], c[99], i, n;...while (i < n){a[i] = b[i] + c[i];i += a[i];};NEON ユニッ ト は、 2、 4、 8、 16 のグループの 要 素 に 対 し て 演 算 を 実 行 で きます。 ループの 開 始 時 に 繰 り 返 し 回 数 がわかっている 場 合 は、 コ ンパイ ラはランタイムテス ト を 追 加 して、 繰 り 返 し 回 数 が NEON レ ジ ス タ 内 の 適 切 な<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 3-13ID 100419Non-Confidential,


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用データ 型 に 使 用 で き る レーンの 倍 数 でない こ と を 確 認 し ます。 こ の 場 合 、余 ったループの 繰 り 返 しを 実 行 するためにベク ト ル 化 されないコードが 生 成されて 追 加 されるので、 コードサイズが 増 加 します。繰 り 返 し 回 数 が NEON でサポー ト される 繰 り 返 し 回 数 のいずれかである こ とがわかっている 場 合 は、 それをコ ンパイ ラに 指 示 でき ます。 このためには、呼 び 出 し 元 で 繰 り 返 し 回 数 を 4 で 除 算 し、ベ ク ト ル 化 し よ う と する 関 数 内 で 4倍 する のが 最 も 有 効 な 方 法 です。 すべての 呼 び 出 し 関 数 を 変 更 で き ない 場 合は、 ループ リ ミ ッ ト テ ス ト に 適 切 な 式 を 使 用 し て、 繰 り 返 し 回 数 が 適 切 な 倍数 であ る こ と を 示 すこ と ができ ます。 例 えば、ループが 4 の 倍 数 の 繰 り 返 しであ る こ と を 示 すには、 次 のコー ド を 使 用 し ます。for(i = 0; i < (n >> 2


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用関 数 呼 び 出 し と イ ン ラ イ ン 展 開ループ 内 で 非 イ ン ラ イ ン 関 数 を 呼 び 出 す と 、 ベ ク ト ル 化 で き ません。わか り やす く する ための 一 般 的 な 手 段 と し て、 複 雑 な 演 算 を 複 数 の 関 数 に 分割 します。 このよ う な 関 数 をベク ト ル 化 の 対 象 にするには、 __inline キーワードか __forceinline キーワードでマーク を 付 ける 必 要 があ り ます。 これらの 関数 は、 ベク ト ル 化 のためにイ ン ラ イ ン 展 開 されます。 『コンパイ ラ リ ファレンスガイド』 の 「__inline」 (ページ 4-10) および「__forceinline」(ページ 4-7) を 参 照 して 下 さい。条 件 付 き ステー ト メ ン トベ ク ト ル 化 を 効 率 的 に 行 う には、 ループを 主 に 代 入 式 で 構 成 し、 if ステートメントおよび switch ス テー ト メ ン ト の 使 用 を 制 限 する 必 要 があ り ます。ループの 繰 り 返 しの 間 に 変 化 し ない 単 純 な 条 件 は、 ループ 不 変 と いわれます。これらは、 コンパイラによってループの 前 に 移 動 され、 ループの 繰 り 返 し 時に 実 行 する 必 要 がな く な り ます。 よ り 複 雑 な 条 件 オペレーションは、ベクタモードですべてのパスを 計 算 し、 結 果 をマージしてベク ト ル 化 されます。 条件 付 き の 実 行 で 大 量 の 計 算 が 行 われる 場 合 は、 かな り の 時 間 が 浪 費 さ れます。例 3-15 に、 許 容 さ れる 条 件 付 き ス テー ト メ ン ト の 使 用 方 法 を 示 し ます。例 3-15 ベ ク ト ル 化 可 能 な 条 件float a[99], b[99], c[i];int i, n;...for (i = 0; i < n; i++){if (c[i] > 0) a[i] = b[i] - 5.0;else a[i] = b[i] * 2.0;};構 造 体NEON 構 造 体 を ロー ド する には、 構 造 体 の メ ンバすべてが 同 じ 長 さ であ る 必要 があ り ます。 したがって、 コンパイラは、 例 3-16 (ページ 3-16) に 示 すコー ド ではベ ク タ ロー ド を 使 用 し ません。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 3-15ID 100419Non-Confidential,


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用例 3-16 デー タ 型 の 一 貫 性 に 欠 けるためベク ト ル 化 できない コー ドstruct foo{short a;int b;short c;} n[10];例 3-16 に 示 すコー ド は、 構 造 体 全 体 で 同 じデータ 型 を 使 用 する よ う に 修 正 すると、ベクトル 化 できます。 例 えば、b が 整 数 型 であ る 場 合 は、 a と c を 整 数 型に 置 き 換 えます。構 造 体 にパデ ィ ングを 挿 入 する と 、 ベク ト ル 化 で き ません。 例 3-17 で、NEON ユニ ッ ト では 非 境 界 整 列 構 造 体 の ロー ド に よ るペナルテ ィ が 生 じ ないので、 各 a コンポーネントを 整 列 させる 必 要 はありません。例 3-17 境 界 整 列 パデ ィ ングによ り ベク ト ル 化 できない コー ドstruct aligned_data{char a;char b;char c;char not_used;} n[10];例 3-17 に 示 すコード は、 not_used パデ ィ ングを 削 除 する よ う に 修 正 する と 、ベク トル 化 できます。ソース コー ド の 調 整 によ るパフ ォーマンス 向 上 の 例コ ンパイ ラから、 ベク ト ル 化 によ る 最 適 化 が 適 用 された 場 所 およびベク ト ル化 を 適 用 で き なかった 場 所 を 示 す 診 断 情 報 が 提 供 さ れます。 『コンパイ ラ リファレンスガイド』 の 「--diag_suppress=optimizations」 (ページ2-53) および 「--diag_warning=optimizations」 (ページ 2-55) を 参 照して 下 さい。例 3-18 (ページ 3-17) に、 配 列 に 単 純 な 累 計 演 算 を 実 装 し た 2 つの 関 数 を 示します。 このコードはベク トル 化 されません。3-16 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用例 3-18 ベク トル 化 できないコードint addition(int a, int b){return a + b;}void add_int(int *pa, int *pb, unsigned int n, int x){unsigned int i;for(i = 0; i < n; i++) *(pa + i) = addition(*(pb + i),x);}--diag_warnings=optimization オプシ ョ ンを 使 用 する と、 addition() 関 数 の 最 適化 の 警 告 メ ッ セージが 表 示 さ れます。__inline 修 飾 子 を addition() の 定 義 に 追 加 する と こ のコード をベク ト ル 化 できますが、 まだ 最 適 化 されていません。 --diag_warnings=optimization オプシ ョ ンを 再 度 使 用 する と 、 ループがベ ク ト ル 化 さ れたがポ イ ン タ のエ イ リ ア スの 生成 の 問 題 が 存 在 する 可 能 性 があ る と い う 最 適 化 の 警 告 メ ッ セージが 表 示 さ れます。コ ンパ イ ラ は、 エ イ リ ア ス 生 成 の ラ ン タ イ ムテ ス ト を 生 成 し、 コー ド のベ クト ル 化 されたコ ピーと スカ ラのコ ピーの 両 方 を 出 力 する 必 要 があ り ます。例 3-19 に、 ポイ ン ト のエイ リ アスが 生 成 されていないこ と がわかっている 場合 に restrict キーワー ド を 使 用 し て 改 善 で き る 方 法 を 示 し ます。例 3-19 restrict を 使 用 し たベ ク ト ル 化 パフ ォーマンスの 向 上__inline int addition(int a, int b){return a + b;}void add_int(int * __restrict pa, int * __restrict pb, unsigned int n, int x){unsigned int i;for(i = 0; i < n; i++) *(pa + i) = addition(*(pb + i),x);}最 終 的 な 改 善 は、 ループの 繰 り 返 し 回 数 に 対 する 改 善 です。 例 3-19 では、 繰り 返 し 回 数 は 定 まっておらず、 NEON レ ジ ス タ に 正 確 に 適 合 する 倍 数 でない可 能 性 があ り ます。 すなわち、 ベク ト ル 化 されていないコード を 使 用 して 実行 する ために 残 り の 繰 り 返 し をテ ス ト する 必 要 があ り ます。 繰 り 返 し 回 数 が<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 3-17ID 100419Non-Confidential,


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用NEON でサポー ト される 繰 り 返 し 回 数 のいずれかである こ とがわかっている場 合 は、 その こ と を コ ンパ イ ラ に 指 示 で き ます。 例 3-20 に、 ベク ト ル 化 によって 最 高 のパフォーマンスを 得 るための 最 終 的 な 改 善 を 示 します。例 3-20 ベク ト ル 化 のパフ ォーマンスを 最 適 にするために 調 整 された コー ド__inline int addition(int a, int b){return a + b;}void add_int(int * __restrict pa, int * __restrict pb, unsigned int n, int x){unsigned int i;for(i = 0; i < (n & ~3); i++) *(pa + i) = addition(*(pb + i),x);/* n is a multiple of 4 */}__promise を 使 用 し たベク ト ル 化 の 向 上__promise(expr) コ ンパイ ラ 組 み 込 み 関 数 は、 式 の 結 果 がゼ ロ 以 外 にな る こ とがコンパイラに 対 して 保 証 されます。 この 保 証 に 基 づいて 冗 長 なコードを 除去 し て 最 適 化 する こ と に よ り 、 コ ンパ イ ラ はベ ク ト ル 化 を 向 上 で き ます。例 3-21 の 逆 アセンブルされた 出 力 は、 __promise を 使 用 した 場 合 の 違 いを 示 しています。 修 正 されたス カ ラループの 除 去 によ り 、 ループは 単 純 にベク ト ル化 されアセンブリが 少 なくなっています。例 3-21 __promise(expr) を 使 用 し たベク ト ル 化 コー ド の 向 上void f(int *x, int n){int i;__promise((n > 0) && ((n&7)==0));for (i=0; i


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用3.4 サンプル以 下 に、 ベ ク ト ル 化 可 能 な コー ド のサンプルを 示 し ます。 例 3-22 および例 3-23 (ページ 3-21) を 参 照 して 下 さい。例 3-22 ベク トル 化 コード/** Vectorizable example code.* Copyright 2006 <strong>ARM</strong> Limited. All rights reserved.** Includes embedded assembly to initialize cpu; link using '--entry=init_cpu'.** Build using:* armcc --vectorize -c vector_example.c --cpu Cortex-A8 -Otime* armlink -o vector_example.axf vector_example.o --entry=init_cpu*/#include void fir(short *__restrict y, const short *x, const short *h, int n_out, int n_coefs){int n;for (n = 0; n < n_out; n++){int k, sum = 0;for (k = 0; k < n_coefs; k++){sum += h[k] * x[n - n_coefs + 1 + k];}y[n] = ((sum>>15) + 1) >> 1;}}int main(){static const short x[128] ={0x0000, 0x0647, 0x0c8b, 0x12c8, 0x18f8, 0x1f19, 0x2528, 0x2b1f,0x30fb, 0x36ba, 0x3c56, 0x41ce, 0x471c, 0x4c3f, 0x5133, 0x55f5,0x5a82, 0x5ed7, 0x62f2, 0x66cf, 0x6a6d, 0x6dca, 0x70e2, 0x73b5,0x7641, 0x7884, 0x7a7d, 0x7c29, 0x7d8a, 0x7e9d, 0x7f62, 0x7fd8,0x8000, 0x7fd8, 0x7f62, 0x7e9d, 0x7d8a, 0x7c29, 0x7a7d, 0x7884,0x7641, 0x73b5, 0x70e2, 0x6dca, 0x6a6d, 0x66cf, 0x62f2, 0x5ed7,0x5a82, 0x55f5, 0x5133, 0x4c3f, 0x471c, 0x41ce, 0x3c56, 0x36ba,0x30fb, 0x2b1f, 0x2528, 0x1f19, 0x18f8, 0x12c8, 0x0c8b, 0x0647,0x0000, 0xf9b9, 0xf375, 0xed38, 0xe708, 0xe0e7, 0xdad8, 0xd4e1,0xcf05, 0xc946, 0xc3aa, 0xbe32, 0xb8e4, 0xb3c1, 0xaecd, 0xaa0b,0xa57e, 0xa129, 0x9d0e, 0x9931, 0x9593, 0x9236, 0x8f1e, 0x8c4b,0x89bf, 0x877c, 0x8583, 0x83d7, 0x8276, 0x8163, 0x809e, 0x8028,<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 3-19ID 100419Non-Confidential,


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用0x8000, 0x8028, 0x809e, 0x8163, 0x8276, 0x83d7, 0x8583, 0x877c,0x89bf, 0x8c4b, 0x8f1e, 0x9236, 0x9593, 0x9931, 0x9d0e, 0xa129,0xa57e, 0xaa0b, 0xaecd, 0xb3c1, 0xb8e4, 0xbe32, 0xc3aa, 0xc946,0xcf05, 0xd4e1, 0xdad8, 0xe0e7, 0xe708, 0xed38, 0xf375, 0xf9b9,};static const short coeffs[8] ={0x0800, 0x1000, 0x2000, 0x4000,0x4000, 0x2000, 0x1000, 0x0800};int i, ok = 1;short y[128];static const short expected[128] ={0x1474, 0x1a37, 0x1fe9, 0x2588, 0x2b10, 0x307d, 0x35cc, 0x3afa,0x4003, 0x44e5, 0x499d, 0x4e27, 0x5281, 0x56a9, 0x5a9a, 0x5e54,0x61d4, 0x6517, 0x681c, 0x6ae1, 0x6d63, 0x6fa3, 0x719d, 0x7352,0x74bf, 0x6de5, 0x66c1, 0x5755, 0x379e, 0x379e, 0x5755, 0x66c1,0x6de5, 0x74bf, 0x7352, 0x719d, 0x6fa3, 0x6d63, 0x6ae1, 0x681c,0x6517, 0x61d4, 0x5e54, 0x5a9a, 0x56a9, 0x5281, 0x4e27, 0x499d,0x44e5, 0x4003, 0x3afa, 0x35cc, 0x307d, 0x2b10, 0x2588, 0x1fe9,0x1a37, 0x1474, 0x0ea5, 0x08cd, 0x02f0, 0xfd10, 0xf733, 0xf15b,0xeb8c, 0xe5c9, 0xe017, 0xda78, 0xd4f0, 0xcf83, 0xca34, 0xc506,0xbffd, 0xbb1b, 0xb663, 0xb1d9, 0xad7f, 0xa957, 0xa566, 0xa1ac,0x9e2c, 0x9ae9, 0x97e4, 0x951f, 0x929d, 0x905d, 0x8e63, 0x8cae,0x8b41, 0x8a1b, 0x893f, 0x88ab, 0x8862, 0x8862, 0x88ab, 0x893f,0x8a1b, 0x8b41, 0x8cae, 0x8e63, 0x905d, 0x929d, 0x951f, 0x97e4,0x9ae9, 0x9e2c, 0xa1ac, 0xa566, 0xa957, 0xad7f, 0xb1d9, 0xb663,0xbb1b, 0xbffd, 0xc506, 0xca34, 0xcf83, 0xd4f0, 0xda78, 0xe017,0xe5c9, 0xebcc, 0xf229, 0xf96a, 0x02e9, 0x0dd8, 0x1937, 0x24ce,};fir(y, x + 7, coeffs, 128, 8);for (i = 0; i < sizeof(y)/sizeof(*y); ++i){if (y[i] != expected[i]){printf("mismatch: y[%d] = 0x%04x; expected[%d] = 0x%04x\n", i, y[i], i, expected[i]);ok = 0;break;}}if (ok) printf("** TEST PASSED OK **\n");return ok ? 0 : 1;}#ifdef __TARGET_ARCH_7_A__asm void init_cpu() {// Set up CPU stateMRC p15,0,r4,c1,c0,0ORR r4,r4,#0x00400000 // enable unaligned mode (U=1)3-20 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用BIC r4,r4,#0x00000002 // disable alignment faults (A=0)// MMU not enabled: no page tablesMCR p15,0,r4,c1,c0,0#ifdef __BIG_ENDIANSETEND BE#endifMRC p15,0,r4,c1,c0,2 // Enable VFP access in the CAR -ORR r4,r4,#0x00f00000 // must be done before any VFP instructionsMCR p15,0,r4,c1,c0,2MOV r4,#0x40000000 // Set EN bit in FPEXCMSR FPEXC,r4IMPORT __mainB __main}#endif例 3-23 DSP ベク トル 化 コード/** DSP Vectorizable example code.* Copyright 2006 <strong>ARM</strong> Limited. All rights reserved.** Includes embedded assembly to initialize cpu; link using '--entry=init_cpu'.** Build using:* armcc -c dsp_vector_example.c --cpu Cortex-A8 -Otime --vectorize* armlink -o dsp_vector_example.axf dsp_vector_example.o --entry=init_cpu*/#include #include "dspfns.h"void fn(short *__restrict r, int n, const short *__restrict a, const short *__restrict b){int i;for (i = 0; i < n; ++i){r[i] = add(a[i], b[i]);}}int main(){static const short x[128] ={0x0000, 0x0647, 0x0c8b, 0x12c8, 0x18f8, 0x1f19, 0x2528, 0x2b1f,0x30fb, 0x36ba, 0x3c56, 0x41ce, 0x471c, 0x4c3f, 0x5133, 0x55f5,0x5a82, 0x5ed7, 0x62f2, 0x66cf, 0x6a6d, 0x6dca, 0x70e2, 0x73b5,0x7641, 0x7884, 0x7a7d, 0x7c29, 0x7d8a, 0x7e9d, 0x7f62, 0x7fd8,<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 3-21ID 100419Non-Confidential,


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用0x8000, 0x7fd8, 0x7f62, 0x7e9d, 0x7d8a, 0x7c29, 0x7a7d, 0x7884,0x7641, 0x73b5, 0x70e2, 0x6dca, 0x6a6d, 0x66cf, 0x62f2, 0x5ed7,0x5a82, 0x55f5, 0x5133, 0x4c3f, 0x471c, 0x41ce, 0x3c56, 0x36ba,0x30fb, 0x2b1f, 0x2528, 0x1f19, 0x18f8, 0x12c8, 0x0c8b, 0x0647,0x0000, 0xf9b9, 0xf375, 0xed38, 0xe708, 0xe0e7, 0xdad8, 0xd4e1,0xcf05, 0xc946, 0xc3aa, 0xbe32, 0xb8e4, 0xb3c1, 0xaecd, 0xaa0b,0xa57e, 0xa129, 0x9d0e, 0x9931, 0x9593, 0x9236, 0x8f1e, 0x8c4b,0x89bf, 0x877c, 0x8583, 0x83d7, 0x8276, 0x8163, 0x809e, 0x8028,0x8000, 0x8028, 0x809e, 0x8163, 0x8276, 0x83d7, 0x8583, 0x877c,0x89bf, 0x8c4b, 0x8f1e, 0x9236, 0x9593, 0x9931, 0x9d0e, 0xa129,0xa57e, 0xaa0b, 0xaecd, 0xb3c1, 0xb8e4, 0xbe32, 0xc3aa, 0xc946,0xcf05, 0xd4e1, 0xdad8, 0xe0e7, 0xe708, 0xed38, 0xf375, 0xf9b9,};static const short y[128] ={0x8000, 0x7fd8, 0x7f62, 0x7e9d, 0x7d8a, 0x7c29, 0x7a7d, 0x7884,0x7641, 0x73b5, 0x70e2, 0x6dca, 0x6a6d, 0x66cf, 0x62f2, 0x5ed7,0x5a82, 0x55f5, 0x5133, 0x4c3f, 0x471c, 0x41ce, 0x3c56, 0x36ba,0x30fb, 0x2b1f, 0x2528, 0x1f19, 0x18f8, 0x12c8, 0x0c8b, 0x0647,0x0000, 0xf9b9, 0xf375, 0xed38, 0xe708, 0xe0e7, 0xdad8, 0xd4e1,0xcf05, 0xc946, 0xc3aa, 0xbe32, 0xb8e4, 0xb3c1, 0xaecd, 0xaa0b,0xa57e, 0xa129, 0x9d0e, 0x9931, 0x9593, 0x9236, 0x8f1e, 0x8c4b,0x89bf, 0x877c, 0x8583, 0x83d7, 0x8276, 0x8163, 0x809e, 0x8028,0x8000, 0x8028, 0x809e, 0x8163, 0x8276, 0x83d7, 0x8583, 0x877c,0x89bf, 0x8c4b, 0x8f1e, 0x9236, 0x9593, 0x9931, 0x9d0e, 0xa129,0xa57e, 0xaa0b, 0xaecd, 0xb3c1, 0xb8e4, 0xbe32, 0xc3aa, 0xc946,0xcf05, 0xd4e1, 0xdad8, 0xe0e7, 0xe708, 0xed38, 0xf375, 0xf9b9,0x0000, 0x0647, 0x0c8b, 0x12c8, 0x18f8, 0x1f19, 0x2528, 0x2b1f,0x30fb, 0x36ba, 0x3c56, 0x41ce, 0x471c, 0x4c3f, 0x5133, 0x55f5,0x5a82, 0x5ed7, 0x62f2, 0x66cf, 0x6a6d, 0x6dca, 0x70e2, 0x73b5,0x7641, 0x7884, 0x7a7d, 0x7c29, 0x7d8a, 0x7e9d, 0x7f62, 0x7fd8,};short r[128];static const short expected[128] ={0x8000, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff,0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff,0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff,0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff,0x8000, 0x7991, 0x72d7, 0x6bd5, 0x6492, 0x5d10, 0x5555, 0x4d65,0x4546, 0x3cfb, 0x348c, 0x2bfc, 0x2351, 0x1a90, 0x11bf, 0x08e2,0x0000, 0xf71e, 0xee41, 0xe570, 0xdcaf, 0xd404, 0xcb74, 0xc305,0xbaba, 0xb29b, 0xaaab, 0xa2f0, 0x9b6e, 0x942b, 0x8d29, 0x866f,0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,0x8000, 0x866f, 0x8d29, 0x942b, 0x9b6e, 0xa2f0, 0xaaab, 0xb29b,0xbaba, 0xc305, 0xcb74, 0xd404, 0xdcaf, 0xe570, 0xee41, 0xf71e,0x0000, 0x08e2, 0x11bf, 0x1a90, 0x2351, 0x2bfc, 0x348c, 0x3cfb,3-22 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用0x4546, 0x4d65, 0x5555, 0x5d10, 0x6492, 0x6bd5, 0x72d7, 0x7991,};int i, ok = 1;fn(r, sizeof(r)/sizeof(*r), x, y);for (i = 0; i < sizeof(r)/sizeof(*r); ++i){if (r[i] != expected[i]){printf("mismatch: r[%d] = 0x%04x; expected[%d] = 0x%04x\n", i, r[i], i, expected[i]);ok = 0;break;}}if (ok) printf("** TEST PASSED OK **\n");return ok ? 0 : 1;}#ifdef __TARGET_ARCH_7_A__asm void init_cpu(){// Set up CPU stateMRC p15,0,r4,c1,c0,0ORR r4,r4,#0x00400000 // enable unaligned mode (U=1)BIC r4,r4,#0x00000002 // disable alignment faults (A=0)// MMU not enabled: no page tablesMCR p15,0,r4,c1,c0,0#ifdef __BIG_ENDIANSETEND BE#endifMRC p15,0,r4,c1,c0,2 // Enable VFP access in the CAR -ORR r4,r4,#0x00f00000 // must be done before any VFP instructionsMCR p15,0,r4,c1,c0,2MOV r4,#0x40000000 // Set EN bit in FPEXCMSR FPEXC,r4IMPORT __mainB __main}#endif<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 3-23ID 100419Non-Confidential,


NEON ベ ク ト ル 化 コ ンパイ ラの 使 用3-24 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


第 4 章コンパイラの 機 能本 章 では、 コ ンパイ ラ の <strong>ARM</strong> 固 有 の 機 能 の 概 要 について 説 明 し ます。 以 下 のセクションから 構 成 されています。• 「コ ンパイ ラ 組 み 込 み 関 数 」 (ページ 4-2)• 「プ ラ グマ」 (ページ 4-15)• 「ビ ッ ト バンディ ング」 (ページ 4-17)• 「スレ ッ ド ローカルス ト レージ」 (ページ 4-21)• 「8 バイ ト 境 界 整 列 機 能 」 (ページ 4-22)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 4-1ID 100419Non-Confidential,


コンパイラの 機 能4.1 コ ンパイ ラ 組 み 込 み 関 数コ ンパイ ラ は、 以 下 を 含 むコ ンパイ ラ 組 み 込 み 関 数 フ ァ ミ リ をサポー ト し ています。• C および C++ コードから <strong>ARM</strong>、 Thumb、 および NEON 命 令 を 実 行 するための コ ンパイ ラ 組 み 込 み 関 数• ETSI の 基 本 操 作 を 実 行 する コ ンパイ ラ 組 み 込 み 関 数• TI C55x コ ンパイ ラ にあ る 組 み 込 み 関 数 をエ ミ ュ レー ト する コ ンパイ ラ組 み 込 み 関 数• NEON ベク トル 化 コンパイラで 使 用 する NEON コ ンパイ ラ 組 み 込 み 関 数こ のセ ク シ ョ ンでは、 上 記 の コ ンパイ ラ 組 み 込 み 関 数 フ ァ ミ リ について 説 明します。4.1.1 コ ンパイ ラ 組 み 込 み 関 数 についてC および C++ は、 広 範 囲 に 及 ぶタ ス クに 適 し ていますが、 例 えば DigitalSignal Processing (DSP) などのアプリ ケーシ ョ ンの 特 定 エリ アのサポートは組 み 込 まれていません。特 定 のアプ リ ケーシ ョ ン ド メ イ ン 内 には、 通 常 、 頻 繁 に 実 行 する 必 要 のあ るド メ イ ン 固 有 の さ ま ざ ま な 演 算 があ り ます。 ただし、 これらの 演 算 は C または C++ では 効 率 的 に 実 装 で き ない 場 合 も よ く あ り ます。 代 表 的 な 例 と し ては、通 常 DSP プログラ ミ ングで 使 用 する 2 の 補 数 によ る 2 つの 32 ビ ッ ト 符 号 付 き整 数 のサチ ュ レー ト 加 算 があ り ます。 例 4-1 は、 C によるその 実 装 を 示 しています。例 4-1 サチ ュ レー ト 加 算 演 算 の C 実 装#include int L_add(const int a, const int b){int c;c = a + b;if (((a ^ b) & INT_MIN) == 0){if ((c ^ a) & INT_MIN){c = (a < 0) ? INT_MIN : INT_MAX;}4-2 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コンパイラの 機 能}}return c;コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 組 み 込 みアセンブ ラやイ ン ラ イ ンアセンブ ラ な どでの 複 雑 な 実 装 手 段 を と ら ずに、 C および C++ ソースコードでド メ イ ン 固 有 の 演 算 を 簡 単 に 組 み 込 むこ と がで き ます。 コ ンパ イ ラ 組 み 込 み関 数 は、 C または C++ の 関 数 呼 び 出 しのよ う に 見 えますが、 コ ンパイル 時 に特 定 のシーケン スの ローレベルの 命 令 に よ って 置 換 さ れます。 例 4-1 (ページ4-2) のサチュ レー ト 加 算 関 数 の よ う に、 コ ンパ イ ラ 組 み 込 み 関 数 を 使 用 し て実 装 し た 場 合 は、 以 下 の 形 式 が 使 用 さ れます。#include /* Include ETSI intrinsics */...int a, b, result;...result = L_add(a, b); /* Saturated add of a and b */コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 以 下 の よ う なパフ ォーマン ス 上 の 利点 が 得 られます。• コ ンパイ ラ 組 み 込 み 関 数 を ローレベルの コ ンパイ ラ 組 み 込 み 関 数 に 置 き換 える と、 C または C++ での 対 応 する 実 装 よ り も 効 率 が 良 く な り 、 命 令数 と サ イ ク ル 数 の 両 方 が 削 減 さ れます。 コ ンパイ ラ 組 み 込 み 関 数 を 実 装するために、 コンパイラでは 指 定 されたターゲッ ト アーキテクチャに 対し て 最 適 な 命 令 のシーケ ン スが 自 動 的 に 生 成 さ れます。 例 えば L_add コンパイ ラ 組 み 込 み 関 数 は、 <strong>ARM</strong> v5TE アセンブ リ 言 語 命 令 qadd に 直 接 対応 します。QADD r0, r0, r1 /* Assuming r0 = a, r1 = b on entry */• コンパイラには、 ベースとなっている C および C++ 言 語 の 伝 達 能 力 を超 えた 多 く の 情 報 が 渡 されます。 これによ り、 コンパイラは 通 常 であれば 実 行 不 可 能 な 最 適 化 を 実 行 し、 命 令 シーケン ス を 生 成 し ます。パフォーマンス 上 のこれらの 利 点 は、 リ アルタイム 処 理 アプ リ ケーシ ョ ンにとっては 重 要 です。 ただ し、 コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と コー ド の移 植 性 が 低 下 する ため、 注 意 し て 使 用 する 必 要 があ り ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 4-3ID 100419Non-Confidential,


コンパイラの 機 能4.1.2 命 令 のコ ンパイ ラ 組 み 込 み 関 数<strong>ARM</strong> コンパイラには、 C または C++ コード 内 から <strong>ARM</strong> アセンブ リ 言 語 命 令を 実 行 する ための さ ま ざ ま な 命 令 の コ ンパイ ラ 組 み 込 み 関 数 が 用 意 さ れています。 こ れら の コ ンパイ ラ 組 み 込 み 関 数 は、 C コー ド と 命 令 のコ ンパ イ ラ 組 み込 み 関 数 を 組 み 合 わせて 使 用 する こ と に よ り 、 イ ン ラ イ ンアセンブ リ コー ドをエ ミ ュ レー ト する こ と を 可 能 に し ます。汎 用 のコ ンパイ ラ 組 み 込 み 関 数『コンパイ ラ リ ファレンスガイ ド』 では、 ISO C および C++ 標 準 規 格 の <strong>ARM</strong>言 語 拡 張 機 能 であ る 以 下 の 汎 用 の コ ンパイ ラ 組 み 込 み 関 数 について 説 明 し ています。• 「__breakpoint」 (ページ 4-80)• 「__current_pc」 (ページ 4-83)• 「__current_sp」 (ページ 4-84)• 「__nop」 (ページ 4-95)• 「__return_address」 (ページ 4-101)• 「__semihost」 (ページ 4-104)『コンパイ ラ リ ファレンスガイ ド』 の 「GNU 組 み 込 み 関 数 」 (ページ 4-126)も 参 照 して 下 さい。こ れら の コ ンパイ ラ 組 み 込 み 関 数 の 実 装 は、 すべてのアーキテ ク チ ャ で 可 能です。IRQ 割 り 込 みと FIQ の 割 り 込 みの 制 御 のためのコ ンパイ ラ 組 み 込 み 関 数『コンパイ ラ リ ファレンスガイ ド』 では、 IRQ 割 り 込 みや FIQ 割 り 込 みを 制 御で き る 以 下 の コ ンパイ ラ 組 み 込 み 関 数 について 説 明 し ています。• 「__disable_irq」 (ページ 4-85)• 「__enable_irq」 (ページ 4-87)• 「__disable_fiq」 (ページ 4-84)• 「__enable_fiq」 (ページ 4-87)コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し て、 モー ド 、 状 態 、 不 正 確 なデータ アボート 設 定 を 含 むその 他 の CPSR ビ ッ ト を 変 更 する こ と はで き ません。 これは、ユーザモー ド では CPSR および SPSR の 制 御 ビ ッ ト を 変 更 する こ と はで き ないので、 コ ンパ イ ラ 組 み 込 み 関 数 を 使 用 で き る のは、 プ ロ セ ッ サが 既 に 特 権 モード の 場 合 のみであ る こ と を 意 味 し ます。4-4 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コンパイラの 機 能こ れら のコ ンパ イ ラ 組 み 込 み 関 数 は、 <strong>ARM</strong> と Thumb のどちらの 状 態 でも、すべてのプ ロ セ ッ サアーキテ ク チャ に 使 用 で き ます。• <strong>ARM</strong>v6 以 降 をサポー ト する プ ロ セ ッ サ 用 にコ ンパ イルし てい る 場 合 、CPS 命 令 が こ れら の 関 数 に 対 し て イ ン ラ イ ンで 生 成 さ れます。 以 下 に 例を 示 し ます。CPSID i• <strong>ARM</strong> 状 態 で <strong>ARM</strong>v4 または <strong>ARM</strong>v5 をサポートするプロセッサ 用 にコンパイルしている 場 合 、 コンパイラによって、MRS および MSR 命 令 のシーケンスがインラ イン 展 開 されます。 以 下 に 例 を 示 します。MRS r0, CPSRORR r0, r0, #0x80MSR CPSR_c, r0• Thumb 状 態 で <strong>ARM</strong>v4 または <strong>ARM</strong>v5 をサポートするプロセッサ 用 にコンパイルしている 場 合 、 コンパイ ラによって、 ヘルパ 関 数 が 呼 び 出 されます。 以 下 に 例 を 示 し ます。BL __<strong>ARM</strong>_disable_irqこれらの 命 令 の 詳 細 については、 『アセンブラガイ ド』 を 参 照 して 下 さい。最 適 化 バ リ アの 挿 入 のためのコ ンパイ ラ 組 み 込 み 関 数<strong>ARM</strong> コ ンパイ ラ では、 命 令 の 順 序 変 更 や 演 算 の 結 合 など、 さ ま ざ ま な 最 適 化を 実 行 できます。 メモリが 複 数 のプロセッサから 同 時 にアクセスされるシステムレベルのプロ グ ラ ミ ングのよ う に、 命 令 の 順 序 変 更 を 無 効 にし て メ モ リを 強 制 的 に 更 新 する こ と が 必 要 にな る 場 合 も あ り ます。以 下 の 最 適 化 バ リ ア コ ンパイ ラ 組 み 込 み 関 数 では、 コー ド は 生 成 さ れませんが、 コー ド サイ ズがわずかに 増 加 し、 追 加 の メ モ リ ア ク セスが 生 じ る 場 合 があります。 『コンパイ ラ リ ファレンスガイ ド』 の 以 下 のセ ク シ ョ ン を 参 照 して 下 さい。• 「__schedule_barrier」 (ページ 4-103)• 「__force_stores」 (ページ 4-89)• 「__memory_changed」 (ページ 4-94)注シ ス テムに よ っては、 メ モ リ バ リ ア コ ンパ イ ラ 組 み 込 み 関 数 を 使 用 し て も、メモ リ の 整 合 性 を 確 保 できないこ とがあ り ます。 例 えば、 __memory_changed() コンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 レ ジ ス タ で 保 持 さ れてい る 値 が メ モ リに 書 き 出 されますが、 データ の 書 き 込 み 先 がバ ッ フ ァ 可 能 な 領 域 にあ る 場 合 、<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 4-5ID 100419Non-Confidential,


コンパイラの 機 能データ が 書 き 込 みバ ッ フ ァ で 待 機 する こ と があ り ます。 こ の 場 合 、 CP15 にデータ を 書 き 込 むか、 メ モ リ バ リ ア 命 令 を 使 用 し て 書 き 込 みバ ッ フ ァ を ド レイ ンする 必 要 も あ り ます。 詳 細 については、 <strong>ARM</strong> プロセッサのテクニカルリファレンスマニュアルを 参 照 して 下 さい。ネイ テ ィ ブ 命 令 の 挿 入 のためのコ ンパイ ラ 組 み 込 み 関 数以 下 の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 コ ンパイ ラ に よ って 生 成 さ れる 命 令 ス ト リームに <strong>ARM</strong> プロセッサ 命 令 を 挿 入 できます。 『コンパイ ラ リファレンスガイド』 の 以 下 のセ ク シ ョ ンを 参 照 し て 下 さい。• 「__cdp」 (ページ 4-81)• 「__clrex」 (ページ 4-82)• 「__ldrex」 (ページ 4-89)• 「__ldrt」 (ページ 4-92)• 「__pld」 (ページ 4-95)• 「__pli」 (ページ 4-97)• 「__rbit」 (ページ 4-100)• 「__rev」 (ページ 4-101)• 「__ror」 (ページ 4-103)• 「__sev」 (ページ 4-105)• 「__strex」 (ページ 4-108)• 「__strt」 (ページ 4-111)• 「__swp」 (ページ 4-113)• 「__wfe」 (ページ 4-115)• 「__wfi」 (ページ 4-115)• 「__yield」 (ページ 4-116)デジ タル 信 号 処 理 のためのコ ンパイ ラ 組 み 込 み 関 数『コンパイ ラ リ ファレンスガイ ド』 で 説 明 さ れてい る 以 下 の コ ンパ イ ラ 組 み 込み 関 数 は、 DSP アルゴ リ ズムの 実 装 で 役 立 ちます。• 「__clz」 (ページ 4-83)• 「__fabs」 (ページ 4-88)• 「__fabsf」 (ページ 4-89)• 「__qadd」 (ページ 4-98)• 「__qdbl」 (ページ 4-99)4-6 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コンパイラの 機 能• 「__qsub」 (ページ 4-100)• 「__sqrt」 (ページ 4-106)• 「__sqrtf」 (ページ 4-107)• 「__ssat」 (ページ 4-107)• 「__usat」 (ページ 4-114)『コンパイ ラ リ ファレンスガイ ド』 の 「<strong>ARM</strong>v6 SIMD コ ンパイ ラ 組 み 込 み 関数 」 (ページ 4-117) も 参 照 して 下 さい。上 記 の コ ンパイ ラ 組 み 込 み 関 数 には、 以 下 に 対 する 適 切 な ターゲ ッ ト 命 令 が含 まれます。• <strong>ARM</strong> v5TE 以 降 の <strong>ARM</strong> アーキテクチャ• M バリアントを 除 く Thumb-2 アーキテクチャすべての 命 令 にそれ と 対 応 する コ ンパイ ラ 組 み 込 み 関 数 があ るわけではあ りません。 コ ンパイ ラ は 複 数 の コ ンパイ ラ 組 み 込 み 関 数 、 ま たはコ ンパイ ラ 組み 込 み 関 数 と C の 演 算 子 の 組 み 合 わせで、 さ ら に 強 力 な 命 令 を 生 成 で き ます。例 えば、 <strong>ARM</strong>5TE QDADD 命 令 は、 __qadd と __qdbl の 組 み 合 わせに よ っ て 実 行 されます。4.1.3 ETSI の 基 本 操 作European Telecommunications Standard Institute (ETSI) は、 G.723.1 勧 告 やG.729 勧 告 な ど、 音 声 符 号 化 に 関 する 提 言 をい く つも 行 っています。 これらの勧 告 には、 コーデ ッ ク の リ フ ァ レ ン ス 実 装 のための ソ ース コー ド およびテ ストシーケンスが 含 まれます。ETSI に よ って 提 供 さ れた ス ピーチコーデ ッ ク のモデル 実 装 は、 ETSI の 基 本 操作 として 知 られる C 関 数 のコ レ ク シ ョ ンに 基 づいています。 ETSI の 基 本 操 作には、 サチ ュ レー ト 算 術 の 場 合 は 16 ビッ ト、 32 ビッ ト、 および 40 ビットの演 算 が、 データ 型 変 換 の 場 合 は 16 ビッ トおよび 32 ビットの 演 算 が 含 まれます。注『ITU-T Software Tool Library 2005 User's manual』 に 記 載 されている よ う に、ETSI の 基 本 操 作 コレクションのバージョン 2.0 では、 16 ビット、 32 ビット、および 40 ビ ッ ト の 新 しい 演 算 が 加 わ り ま し た。 RVCT ではこれらの 演 算 はサポー ト されていません。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 4-7ID 100419Non-Confidential,


コンパイラの 機 能ETSI の 基 本 操 作 は、 C または C++ で コーデ ッ ク を 実 装 する 開 発 者 が 使 用 するライブラリというよりは、 コーデックアルゴリズムを 公 開 する 開 発 者 のためのプ リ ミ テ ィ ブのセッ ト と して 機 能 し ます。 RVCT は、 ヘッ ダフ ァ イルdspfns.h を 介 して ETSI の 基 本 操 作 をサポー ト し ています。RVCT での ETSI の 演 算dspfns.h ヘッダファイルには、 ETSI の 基 本 操 作 の 定 義 が C コードおよびコンパイ ラ 組 み 込 み 関 数 の 組 み 合 わせ と し て 含 まれています。 RVCT では、 ETSIG.729 勧 告 、 『8kbit/s CS-ACELP を 用 いた 音 声 符 号 化 方 式 (CS-ACELP)』 で 説明 されている 元 の ETSI フ ァ ミ リ の 基 本 操 作 をサポー ト し ています。 それら の基 本 操 作 には 以 下 が 含 まれます。• add および sub などの 16 ビッ トおよび 32 ビッ トのサチュレート 算 術 演算 。 例 えば、 add(v1, v2) は、 オーバーフ ロー 制 御 およびサチュ レーシ ョンによ り 2 つの 16 ビッ ト 数 値 v1 と v2 を 加 算 し、16 ビットの 結 果 を 返 します。• mult および L_mult などの 16 ビッ トおよび 32 ビ ッ ト の 乗 算 演 算 。 例 えば、mult(v1, v2) は、 2 つの 16 ビット 数 値 v1 と v2 を 乗 算 し、 スケー リ ングした 16 ビ ッ ト の 結 果 を 返 し ます。• shl および shr などの 16 ビ ッ ト 算 術 シ フ ト 演 算 。 例 えば、 サチュ レー ト左 シフ ト 演 算 shl(v1, v2) は 16 ビ ッ ト の 入 力 値 v1 を 左 に v2 の 分 だけ 算 術的 にシフ ト し ます。 負 のシフ ト 数 の 場 合 は v1 を 右 に v2 の 分 だけシフ ト します。• extract_l、 extract_h、 round などの 16 ビット データ 変 換 演 算 。 例 えば、round(L_v1) は 32 ビ ッ ト の 入 力 値 L_v1 の 下 位 の 16 ビットをサチュレーシ ョ ンに よ り 上 位 の 16 ビットに 丸 めます。注dspfns.h ヘッダファイルと ISO C99 ヘッダファイル math.h はどちら も( 異 な るバージ ョ ンの) 関 数 round() を 定 義 する ので 注 意 し て 下 さ い。 競合 を 避 ける よ う に 気 を 付 けて 下 さい。RVCT でサポー ト される ETSI の 基 本 操 作 の 全 リ ス ト については、 ヘ ッ ダフ ァイル dspfns.h を 参 照 して 下 さい。4-8 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コンパイラの 機 能また、 以 下 も 参 照 して 下 さい。• 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)これらの 文 書 はすべて ITU-T (ITU の 総 合 通 信 基 盤 局 ) の Web サイ ト(http://www.itu.int) から 入 手 できます。オーバーフローとキャ リーdspfns.h での ETSI の 基 本 操 作 の 実 装 に よ り 、 ス テータ ス フ ラ グ Overflow とCarry が 公 開 されます。 これらのフラグは、 C または C++ プ ロ グ ラ ムで 使 用 する グ ローバル 変 数 と し て 使 用 可 能 です。 以 下 に 例 を 示 し ます。#include /* include ETSI intrinsics */#include ...const int BUFLEN=255;int a[BUFLEN], b[BUFLEN], c[BUFLEN];...Overflow = 0; /* clear overflow flag */for (i = 0; i < BUFLEN; ++i) {c[i] = L_add(a[i], b[i]); /* saturated add of a[i] and b[i] */}if (Overflow){fprintf(stderr, "Overflow on saturated addition\n");}通 常 、 サチュ レー ト 関 数 には、 オーバーフ ローについて 固 定 作 用 があ り ます。すなわち、 オーバーフ ローフ ラ グの 設 定 は、 明 示 的 に ク リ ア さ れる まで 保 持されます。 詳 細 については、 ヘ ッ ダ フ ァ イル dspfns.h を 参 照 して 下 さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 4-9ID 100419Non-Confidential,


コンパイラの 機 能4.1.4 TI C55x コ ンパイ ラ 組 み 込 み 関 数Texas Instruments (TI) C55x コンパイラでは、 C コードの 最 適 化 のために 複 数の コ ンパイ ラ 組 み 込 み 関 数 が 認 識 さ れます。 RVCT では、 ヘッ ダフ ァ イルc55x.h を 使 用 して、 選 択 した TI C55x コ ンパ イ ラ 組 み 込 み 関 数 のエ ミ ュ レーションがサポートされます。 c55x.h でエ ミ ュ レー ト される TI C55x コンパイラ組 み 込 み 関 数 には 以 下 があ り ます。• _sadd や _ssub な ど、 加 算 、 減 算 、 否 定 、 および 絶 対 値 な どのコ ンパ イ ラ組 み 込 み 関 数 。 例 えば、_sadd(v1, v2) は v1 および v2 の 16 ビッ トのサチュレー ト 和 を 返 します。• _smpy や _sshl な ど、 乗 算 およびシ フ ト のコ ンパ イ ラ 組 み 込 み 関 数 。 例 えば、_smpy(v1, v2) は v1 および v2 のサチュ レー ト 小 数 部 モー ド の 積 を 返 します。• _round や _count な ど、 丸 め、 サチュ レーシ ョ ン、 ビ ッ ト 数 、 極 値 。 例 えば、 _round(v1) は 非 サチュレー ト 算 術 を 使 用 して、 215 を 加 算 し、 下 位 の16 ビットをクリアすることにより、 丸 めた 値 v1 を 返 し ます。c55x.h では、 以 下 の TI C55x 命 令 はサポー ト さ れていません。• 加 算 および 積 和 のコ ンパ イ ラ 組 み 込 み 関 数 の 関 連 バ リ アン ト 。 これには_a_sadd および _a_smac など、 接 頭 辞 _a_ の 付 いたすべての TI C55x コンパイ ラ 組 み 込 み 関 数 が 含 まれます。• _smacr および _smasr な ど、 乗 算 およびシフ ト の コ ンパイ ラ 組 み 込 み 関 数の 丸 めバ リ アン ト 。• コ ンパイ ラ 組 み 込 み 関 数 のすべての longlong バリアント。 これには_llsadd および _llshl な ど、 接 頭 辞 _ll の 付 いたすべての TI C55x コンパイ ラ 組 み 込 み 関 数 が 含 まれます。 コ ンパ イ ラ 組 み 込 み 関 数 の long long バリアントは 40 ビットデータで 動 作 するため、RVCT ではサポー ト されていません。• 副 作 用 のあ るすべての 算 術 コ ンパイ ラ 組 み 込 み 関 数 。 例 えば、TI C55x コンパ イ ラ 組 み 込 み 関 数 _firs および _lms は、 c55x.h では 定 義 されていません。• L_add_c および L_sub_c などの、 ETSI サポー ト 関 数 の コ ンパイ ラ 組 み 込 み関 数 。4-10 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コンパイラの 機 能注サチュ レー ト 除 算 の ETSI サポー ト 関 数 divs は 例 外 です。 このコンパイラ 組 み 込 み 関 数 は、 c55x.h でサポー ト されています。RVCT でエ ミ ュレー ト される TI C55x コ ンパイ ラ 組 み 込 み 関 数 の 全 リ ス ト については、 ヘッダフ ァ イル c55x.h を 参 照 して 下 さい。TI コ ンパイ ラ 組 み 込 み 関 数 の 詳 細 については、 http://www.ti.com を 参 照 して 下さい。4.1.5 名 前 付 き レジス タ 変 数コ ンパイ ラ を 使 用 する と 、 名 前 付 き レ ジ ス タ 変 数 を 使 用 し て、 <strong>ARM</strong> アーキテクチャベースのプロセッサのレジスタにアクセスできます。名 前 付 き レ ジ ス タ 変 数 は register キーワード と __asm キーワード を 組 み 合 わせて 宣 言 されます。 __asm キーワードは、 レジスタの 名 前 を 示 す 文 字 列 からなるパラ メータを 1 つ 使 用 し ます。 以 下 に 例 を 示 し ます。register int R0 __asm("r0");上 記 の 例 では、 R0 をレジスタ r0 の 名 前 付 き レ ジ ス タ 変 数 と し て 宣 言 し ています。 名 前 付 き レ ジ ス タ 変 数 を 使 用 し てア ク セスで き る <strong>ARM</strong> アーキテクチャベースのプ ロ セ ッ サのレ ジ ス タ の 詳 細 については、 『コンパイルリ ファレンスガイド』 の 「 名 前 付 き レ ジ ス タ 変 数 」 (ページ 4-122) を 参 照 して 下 さい。名 前 付 き レ ジ ス タ 変 数 の 代 表 的 な 用 途 は、 アプ リ ケーシ ョ ンプログラムステータ ス レジス タ (APSR) 内 のビッ トにアクセスするこ とです (『アセンブラガイド』 の 「アプ リ ケーシ ョ ンプログラ ム 状 態 レジス タ (APSR)」 (ページ2-8) を 参 照 して 下 さい)。 例 3-3 は、 名 前 付 き レ ジ ス タ 変 数 を 使 用 し て、APSR にサチュ レーシ ョ ンフ ラ グ Q を 設 定 する 方 法 を 示 しています。例 4-2 名 前 付 き レ ジス タ 変 数 を 使 用 し て APSR 内 にビ ッ ト を 設 定 する#ifndef __BIG_ENDIAN // bitfield layout of APSR is sensitive to endiannesstypedef union{struct{int mode:5;int T:1;int F:1;int I:1;<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 4-11ID 100419Non-Confidential,


コンパイラの 機 能int _dnm:19;int Q:1;int V:1;int C:1;int Z:1;int N:1;} b;unsigned int word;} PSR;#else /* __BIG_ENDIAN */typedef union{struct{int N:1;int Z:1;int C:1;int V:1;int Q:1;int _dnm:19;int I:1;int F:1;int T:1;int mode:5;} b;unsigned int word;} PSR;#endif /* __BIG_ENDIAN */register PSR apsr __asm("apsr");void set_Q(void){apsr.b.Q = 1;}4.1.6 NEON コ ンパイ ラ 組 み 込 み 関 数<strong>ARM</strong> コンパイラには、 ベク トル 化 コンパイラとアセンブラコード 記 述 との 中間 に 位 置 する、 SIMD コード 生 成 用 の NEON コ ンパ イ ラ 組 み 込 み 関 数 が 用 意されています。 こ の 機 能 を 使 用 する と 、 アセンブ ラ を 直 接 記 述 する 場 合 に 比べ、 NEON アーキテ ク チ ャ を 利 用 する コー ド を 記 述 しやす く な り ます。NEON コ ンパ イ ラ 組 み 込 み 関 数 は、 ヘ ッ ダフ ァ イル arm_neon.h で 定 義 されています。 こ のヘ ッ ダフ ァ イルには、 コ ンパイ ラ 組 み 込 み 関 数 と 一 連 のベ ク タ型 の 両 方 が 定 義 されています。 NEON コ ンパ イ ラ 組 み 込 み 関 数 の 詳 細 については、 『コンパイ ラ リ ファレンスガイ ド』 の 付 録 E NEON サポー ト の 使 用 を 参照 して 下 さい。4-12 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コンパイラの 機 能例 4-3 に、 NEON コ ンパ イ ラ 組 み 込 み 関 数 を 使 用 し た 簡 潔 なサンプルを 示 します。 サンプルを ビル ド する には、 以 下 の 手 順 に 従 います。1. 次 のオプシ ョ ンを 指 定 し て C ファイル neon_example.c をコンパイルします。armcc -c --debug --cpu=Cortex-A8 neon_example.c2. 以 下 の コ マン ド を 使 用 し て、 イ メ ージを リ ン ク し ます。armlink neon_example.o -o neon_example.axf3. <strong>RealView</strong> Debugger な どの 互 換 性 のあ るデバ ッ ガを 使 用 し て、 イ メ ージを ロー ド し て 実 行 し ます。例 4-3 NEON コ ンパイ ラ 組 み 込 み 関 数/* neon_example.c - Neon intrinsics example program */#include #include #include #include /* fill array with increasing integers beginning with 0 */void fill_array(int16_t *array, int size){ int i;for (i = 0; i < size; i++){array[i] = i;}}/* return the sum of all elements in an array. This works by calculating 4totals (one for each lane) and adding those at the end to get the final total */int sum_array(int16_t *array, int size){/* initialize the accumulator vector to zero */int16x4_t acc = vdup_n_s16(0);int32x2_t acc1;int64x1_t acc2;/* this implementation assumes the size of the array is a multiple of 4 */assert((size % 4) == 0);/* counting backwards gives better code */for (; size != 0; size -= 4){int16x4_t vec;/* load 4 values in parallel from the array */vec = vld1_s16(array);/* increment the array pointer to the next element */array += 4;/* add the vector to the accumulator vector */acc = vadd_s16(acc, vec);<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 4-13ID 100419Non-Confidential,


コンパイラの 機 能}/* calculate the total */acc1 = vpaddl_s16(acc);acc2 = vpaddl_s32(acc1);/* return the total as an integer */return (int)vget_lane_s64(acc2, 0);}/* main function */int main(){int16_t my_array[100];fill_array(my_array, 100);printf("Sum was %d\n", sum_array(my_array, 100));return 0;}NEON の 詳 細 については、 以 下 を 参 照 し て 下 さい。• 「NEON Technology」 (ページ 2-28)• 『RVCT アセンブラガイ ド』4-14 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コンパイラの 機 能4.2 プラグマ<strong>ARM</strong> コ ンパイ ラ は、 以 下 の 形 式 のプ ラ グマを 認 識 し ます。#pragma no_feature-name#pragma feature_name注プラグマによって、 関 連 するコマンドラインオプションはオーバーライドされます。 例 えば、 #pragma arm を 指 定 する と、--thumb コマンド ラインオプショ ンがオーバーラ イ ド されます。詳 細 については、 『コンパイ ラ リ ファレンスガイ ド』 の 関 連 セ ク シ ョ ンを 参 照して 下 さい。プ ラ グマ 状 態 を 保 存 および 復 元 する プ ラ グマ以 下 のプ ラ グマを 使 用 し て、 プ ラ グマ 状 態 を 保 存 および 復 元 できます。• 「#pragma pop」 (ページ 4-75)• 「#pragma push」 (ページ 4-75)最 適 化 の 目 標 を 制 御 する プ ラ グマこ れら のプ ラ グマを 使 用 する と 、 各 関 数 に 最 適 化 の 目 標 を 割 り当 てる こ とができ ます。 プ ラ グマは 関 数 の 外 部 に 配 置 する 必 要 があります。 最 適 化 を 制 御 する には 以 下 のプ ラ グマを 使 用 し ます。• 「#pragma Onum」 (ページ 4-72)• 「#pragma Ospace」 (ページ 4-73)• 「#pragma Otime」 (ページ 4-73)コー ド 生 成 を 制 御 する プ ラ グマ以 下 のプ ラ グマを 使 用 し て、 コー ド の 生 成 方 法 を 制 御 で き ます。• 「#pragma arm」 (ページ 4-63)• 「#pragma thumb」 (ページ 4-79)• 「#pragma exceptions_unwind, #pragmano_exceptions_unwind」 (ページ 4-69)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 4-15ID 100419Non-Confidential,


コンパイラの 機 能ループの 展 開 を 制 御 する プ ラ グマ以 下 のプ ラ グマを 使 用 し て、 ループの 展 開 方 法 を 制 御 で き ます。• 「#pragma unroll [(n)]」 (ページ 4-76)• 「#pragma unroll_completely」 (ページ 4-78)プリコンパイルヘッダ (PCH) 処 理 を 制 御 する プ ラ グマ以 下 のプ ラ グマを 使 用 し て、 PCH 処 理 を 制 御 で き ます。• 「#pragma hdrstop」 (ページ 4-70)• 「#pragma no_pch」 (ページ 4-72)匿 名 の 構 造 体 と 共 用 体 を 制 御 する プ ラ グマ以 下 のプ ラ グマを 使 用 し て、 匿 名 構 造 体 と 匿 名 共 用 体 の 使 用 を制 御 で き ます。• 「#pragma anon_unions, #pragma no_anon_unions」(ページ 4-62)診 断 メ ッ セージを 制 御 する プ ラ グマ以 下 のプ ラ グマを 使 用 し て、 メ ッ セージ 番 号 が -D で 終 わる 診 断メ ッセージの 出 力 を 制 御 できます。• 「#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)• 「#pragma diag_warning tag[, tag, ...]」 (ページ4-68)その 他 のプラグマ• 「#pragma arm section [section_sort_list]」(ページ 4-63)• 「#pragma import(__use_full_stdio)」 (ページ4-71)• 「#pragma inline, #pragma no_inline」 (ページ 4-71)• 「#pragma once」 (ページ 4-72)4-16 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コンパイラの 機 能• 「#pragma pack(n)」 (ページ 4-73)• 「#pragma softfp_linkage, #pragmano_softfp_linkage」 (ページ 4-76)• 「#pragma import symbol_name」 (ページ 4-70)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 4-17ID 100419Non-Confidential,


コンパイラの 機 能4.3 ビットバンディングこのセクションでは、 コンパイラがビッ トバンディング 機 能 をサポートする方 法 について 説 明 し ます。注ビットバンディングは、 Cortex-M3 プ ロ セ ッ サおよび 一 部 の 派 生 製 品 の 機 能です。 他 の <strong>ARM</strong> プロセッサでは、 この 機 能 を 使 用 するこ とはできません。ビットバンディングのアーキテクチャサポートの 詳 細 については、 該 当 するプロセッサのテクニカルリファレンスマニュアルを 参 照 して 下 さい。ビ ッ ト バンデ ィ ン グは 次 の 方 法 でサポー ト さ れます。• __attribute__((bitband)) 言 語 拡 張 機 能• --bitband コマンドラインオプショ ン4.3.1 __attribute__((bitband)) の 使 用__attribute__((bitband)) は、 構 造 体 のビ ッ ト バン ド 型 定 義 に 使 用 さ れる 型 属 性です。 例 4-4 および 例 4-5 (ページ 4-18) を 参 照 して 下 さい。例 4-4 未 配 置 のオブジ ェ ク ト/* foo.c */typedef struct {int i : 1;int j : 2;int k : 3;} BB __attribute__((bitband));BB value; // Unplaced objectvoid update_value(void){value.i = 1;value.j = 0;}/* end of foo.c */4-18 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コンパイラの 機 能例 4-4 (ページ 4-17) では、 未 配 置 のビットバンドオブジェクトを、ビットバン ド 領 域 内 に 再 配 置 する 必 要 があ り ます。 再 配 置 する には、 適 切 な ス キ ャ ッタ ロー ド 記 述 フ ァ イ ルを 使 用 する か、 --rw_base リンカコマンドラインオプションを 使 用 します。 詳 細 については、 『リンカリファレンスガイド』 を 参 照して 下 さい。または、__attribute__((at())) を 使 用 し て、 ビ ッ ト バン ド 領 域 内 の 特 定 のア ドレ スにビ ッ ト バン ド オブジ ェ ク ト を 配 置 する こ と も で き ます。 詳 細 については、 例 4-5 を 参 照 して 下 さい。例 4-5 配 置 済 みのオブジ ェ ク ト/* foo.c */typedef struct {int i : 1;int j : 2;int k : 3;} BB __attribute__((bitband));BB value __attribute__((at(0x20000040))); // Placed objectvoid update_value(void){value.i = 1;value.j = 0;}/* end of foo.c */詳 細 については、 『コンパイ ラ リ ファレンスガイ ド』 の「__attribute__((bitband))」 (ページ 4-47) および「__attribute__((at(address)))」 (ページ 4-54) を 参 照 して 下 さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 4-19ID 100419Non-Confidential,


コンパイラの 機 能4.3.2 コマンドラインにおける --bitband の 使 用--bitband コマンドラインオプショ ンは、const 以 外 のすべてのグ ローバル 構 造体 オブジェ ク ト のビ ッ ト バンデ ィ ングを 実 行 し ます。--bitband が 例 4-6 の foo.c に 適 用 さ れる 場 合 、 value.i への 書 き 込 みがビ ッ トバンディ ングされます。 すなわち、 value.i がビッ トバンド 領 域 にマップするビットバンドエイリアスワードに、 値 0x00000001 が 書 き 込 まれます。value.j および value.k へのア ク セスは、 ビ ッ ト バンデ ィ ング されません。例 4-6 --bitband コ マン ド ラ イ ンオプシ ョ ンの 使 用/* foo.c */typedef struct {int i : 1;int j : 2;int k : 3;} BB;BB value __attribute__((at(0x20000040))); // Placed objectvoid update_value(void){value.i = 1;value.j = 0;}/* end of foo.c */armcc は、 絶 対 ア ド レ スでア ク セス されるオブジ ェ ク ト のビ ッ ト バンデ ィ ングをサポート します。 --bitband が 例 4-7 (ページ 4-20) の foo.c に 適 用 される 場合 、 rts へのア ク セスがビ ッ ト バンデ ィ ング されます。4-20 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コンパイラの 機 能例 4-7 絶 対 アド レスでアクセスされるオブジェ ク トのビッ トバンディ ング/* foo.c */typedef struct {int rts : 1;int cts : 1;unsigned int data;} uart;#define com2 (*((volatile uart *)0x20002000))void put_com2(int n){com2.rts = 1;com2.data = n;}/* end of foo.c */詳 細 については、 『コンパイ ラ リ ファレンスガイ ド』 の 「--bitband」(ページ 2-20) を 参 照 して 下 さい。4.3.3 制 限次 の 使 用 制 限 があ り ます。• ビッ トバンディングは struct 型 でのみ 使 用 で き ます。 共 用 体 型 、 ま たは共 用 体 を メ ンバ と し て 持 つその 他 の 集 合 型 はビ ッ ト バン ド 化 でき ません。• 構 造 体 の メ ンバは 個 別 にビ ッ ト バン ド 化 でき ません。• ビッ トバンドアクセスは、 シングルビッ トのビッ トフィールドにのみ 生成 されます。• ビッ トバンドアクセスは、const オブジェ ク ト 、 ポインタ、 およびローカルオブジェ ク ト については 生 成 されません。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 4-21ID 100419Non-Confidential,


コンパイラの 機 能4.4 スレッ ドローカルスト レージスレッドローカルス トレージ (TLS) は、 ス タ ッ ク の よ う に、 各 実 行 ス レ ッド に 固 有 の 静 的 な ス ト レージです。 プロセス 内 の 各 スレッ ドには、 スレッ ド固 有 のデータ を 格 納 で き る 場 所 があ り ます。 変 数 の 割 り 当 ては、 既 存 の 各 スレッドに 対 して 変 数 のインスタンスが 1 つにな る よ う に 行 われます。各 ス レ ッ ド は 終 了 前 にその 動 的 な メ モ リ を 解 放 する ため、 そのス レ ッ ド 内 のス レ ッ ド ローカル 変 数 へのすべてのポ イ ン タ が 無 効 にな り ます。『コンパイ ラ リ ファレンスガイ ド』 の 「__declspec(thread)」 (ページ4-33) を 参 照 して 下 さい。4-22 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コンパイラの 機 能4.5 8 バイ ト 境 界 整 列 機 能<strong>ARM</strong> コンパイラには、 以 下 の 8 バ イ ト 境 界 整 列 機 能 があ り ます。• <strong>ARM</strong> アーキテクチャ 向 けプロシージャ コール 標 準 (AAPCS) では、 すべての 外 部 イ ンタ フ ェースでス タ ッ ク を 8 バイ ト 境 界 で 整 列 させる 必 要があ り ます。 <strong>ARM</strong> コンパイラおよび C ライブラリでは、スタックの 8 バイ ト 境 界 整 列 の 状 態 が 維 持 さ れます。 また、 デフォルトの C ライブラリメモリモデルでも、 ヒープが 8 バイ ト 境 界 で 整 列 されます。• コードは、 外 部 インタフェースで 8 バイ ト 整 列 制 約 を 必 要 と し、 それを保 持 する よ う にコ ンパ イル さ れます。• プロジェク トにアセンブリ ファイル、 レガシーオブジェク ト、 またはライブラ リがある 場 合 、 それらが 8 バ イ ト 境 界 で 整 列 さ れてい る かど う かを 確 認 し、 必 要 に 応 じて 修 正 する 必 要 があ り ます。 『アセンブラガイド』 および 『リンカユーザガイド』 を 参 照 して 下 さい。• RVCT 2.0 以 降 では、double 型 と long long 型 が 8 バイ ト 境 界 で 整 列 されます。 このため、 <strong>ARM</strong>v5TE 以 降 では LDRD 命 令 と STRD 命 令 を 効 率 的 に 使 用できます。• malloc()、 realloc()、 calloc() のデフ ォル ト の 実 装 では、 8 バイ ト 境 界 で整 列 さ れた ヒ ープが 保 持 さ れます。• alloca() のデフ ォル ト の 実 装 では、 8 バイ ト 境 界 で 整 列 されたメモリブロックが 返 されます。 この C ラ イ ブ ラ リ の 拡 張 機 能 の 詳 細 については、『ライブラ リガイ ド』 の 「alloca()」 (ページ 2-81) を 参 照 して 下 さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 4-23ID 100419Non-Confidential,


コンパイラの 機 能4-24 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


第 5 章コーディング 慣 行<strong>ARM</strong> コンパイラ armcc は、 ISO C および C++ に 対 応 し た 成 熟 度 の 高 い 強 力 なコ ンパイ ラであ り 、 高 度 に 最 適 化 された 高 品 質 のマシン コード を 生 成 でき ます。 ただし、 <strong>ARM</strong> コアなどの RISC プロセッサに 対 応 したプログラ ミ ング 方法 やテ ク ニ ッ ク を 用 い る と 、 C および C++ ソース コー ド の 移 植 性 、 効 率 性 、および 堅 牢 性 を 高 め る こ と がで き ます。 この 章 では、 これらのプログラ ミング 方 法 について 説 明 する と 共 に、 <strong>ARM</strong> プロセッサに 固 有 のプログラ ミングテクニックについても 説 明 します。以 下 のセ ク シ ョ ンか ら 構 成 さ れています。• 「コー ド の 最 適 化 」 (ページ 5-2)• 「コード メ ト リ ッ ク」 (ページ 5-11)• 「 関 数 」 (ページ 5-15)• 「 関 数 の イ ン ラ イ ン 展 開 」 (ページ 5-20)• 「データ の 境 界 整 列 」 (ページ 5-29)• 「 浮 動 小 数 点 演 算 の 使 用 」 (ページ 5-36)• 「ゼ ロ 除 算 エ ラーの ト ラ ッ プ と 識 別 」 (ページ 5-46)• 「C99 の 新 機 能 」 (ページ 5-51)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-1ID 100419Non-Confidential,


コーディング 慣 行5.1 コー ド の 最 適 化<strong>ARM</strong> コ ンパイ ラ は、 コー ド サ イ ズを 縮 小 しパフ ォーマン ス を 向 上 させる 高 度な 最 適 化 機 能 を 備 えています。 このコンパイラは、 他 の 最 適 化 コンパイラと共 通 の 最 適 化 を 実 行 し ます。 その 例 と し ては、 共 通 部 分 式 の 削 除 な どのデータ フ ロー 最 適 化 やループの 結 合 と 分 割 な どのループ 最 適 化 が 挙 げ られます。また、 <strong>ARM</strong> アーキテクチャベースのプロセッサに 固 有 のさ まざまな 最 適 化 も実 行 し ます。こ のコ ンパ イ ラ は 高 度 な 最 適 化 機 能 を 備 えていますが、 正 し い 最 適 化 条 件 、ターゲッ ト プロセッサとアーキテクチャ、 およびインラ イン 展 開 オプシ ョ ンを 選 択 する と 、 C コード または C++ コードのパフォーマンスをさ らに 大 幅 に向 上 でき る 場 合 が 少 な く あ り ません。5.1.1 サイズの 最 適 化 と 処 理 速 度 の 最 適 化<strong>ARM</strong> コ ンパイ ラ には、 コー ド サ イ ズ と パフ ォーマン ス を 最 適 化 する ための、次 の 2 つのオプシ ョ ンが 用 意 されています。-Ospace-Otimeこのオプションを 選 択 すると、 コンパイラは 主 にコードサイズを 最 適 化 する よ う にな り ます。 これはデフォルトオプショ ンです。こ のオプシ ョ ン を 選 択 する と 、 コ ンパ イ ラ は 主 に 処 理 速 度 を 最適 化 する よ う にな り ます。最 良 の 結 果 を 得 るには、 最 も 適 切 な コ マン ド ラ イ ンオプシ ョ ン を 使 用 し て、アプ リ ケーシ ョ ンを 構 築 する 必 要 があ り ます。注これらのコマンド ラインオプショ ンは、 大 半 の 状 況 で 望 ましい 効 果 をもたらす 最 適 化 を 使 用 する よ う に コ ンパイ ラ に 指 示 し ますが、 -Otime が 必 ず 実 行 速 度の 速 いコー ド を 生 成 し た り 、 -Ospace が 必 ずサイ ズの 小 さいコード を 生 成 し たりするとは 限 りません。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の 「-Ospace」 (ページ 2-110)• 『コンパイ ラ リ ファレンスガイ ド』 の 「-Otime」 (ページ 2-111)5-2 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行5.1.2 最 適 化 レベルと デバ ッ グビ ューコ ンパ イ ラ に よ っ て 正 確 な 最 適 化 を 実 行 で き る かど う かは、 どの 最 適 化 レベルを 選 択 するかだけでな く、 パフォーマンス と コードサイズのどちらを 最 適化 しよ う と しているかによっても 決 ま り ます。こ の コ ンパイ ラ では、 以 下 の 最 適 化 レベルがサポー ト さ れています。-O0 最 小 限 の 最 適 化 。 デバ ッ グ ビ ューに 支 障 を き た さ ない 単 純 な 最 適化 が 実 行 さ れます。デバッ グ 機 能 が 有 効 になっている 場 合 に、 このオプシ ョ ンを 選択 する と、 最 良 のデバッ グビ ューが 実 現 し ます。-O1 制 限 さ れた 最 適 化 。デバッ グ 機 能 が 有 効 になっている 場 合 に、 このオプシ ョ ンを 選択 する と 、 十 分 満 足 で き るデバ ッ グ ビ ュー と 優 れた コー ド 密 度を 実 現 できます。-O2 高 度 な 最 適 化 。 これがデフ ォル ト の 最 適 化 レベルです。デバッ グ 機 能 が 有 効 になっている 場 合 に、 このオプシ ョ ンを 選択 する と 、 デバ ッ グ ビ ューは 満 足 度 の 低 い も のにな る 可 能 性 があります。-O3 最 大 限 の 最 適 化 。 利 用 可 能 な 最 適 化 の 中 で 最 も 強 力 な 形 式 の も のです。 このオプションを 指 定 すると、 マルチファイルのコンパイルがデフ ォル ト で 有 効 にな り 、 コマン ド ラ イ ンで 複 数 のフ ァ イルを 指 定 できるようになります。デバッ グ 機 能 が 有 効 になっている 場 合 に、 このオプシ ョ ンを 選択 する と 、 質 の 低 いデバ ッ グ ビ ューにな り ます。最 適 化 は、 オブジ ェ ク ト コー ド と ソース コー ド 間 のマ ッ ピ ングに 影 響 を 与 えます。 そのため、 最 適 化 レベルと して 何 を 選 択 し、 -Ospace と -Otime のどちらを 選 択 するかによって、 デバッグビューの 質 は 左 右 されます。 --debug を 使 用してデバッグ 機 能 を 有 効 にした 場 合 は、-Onum コマンド ラインオプショ ンを 使用 し て、 最 も 適 切 な 最 適 化 レベルを 明 示 的 に 指 定 し ます。オプシ ョ ン -O0 は、 単 純 なデバッ グビ ューが 必 要 な 場 合 に 最 良 のオプシ ョ ンです。 通 常 、-O0 を 選 択 する と 、ELF イ メージのサイズが 7 ~ 15% 増 大 し ます。デバ ッ グテーブルのサ イ ズを 縮 小 する には、 --no_debug_macros オプシ ョ ンを 使用 します。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-3ID 100419Non-Confidential,


コーディング 慣 行詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の 「--debug, --no_debug」 (ページ 2-41)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--debug_macros,--no_debug_macros」 (ページ 2-42)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--dwarf2」 (ページ 2-58)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--dwarf3」 (ページ 2-58)• 『コンパイ ラ リ ファレンスガイ ド』 の 「-Onum」 (ページ 2-108)5.1.3 ターゲッ ト CPU の 選 択通 常 、 新 規 バージ ョ ンの <strong>ARM</strong> アーキテ ク チ ャ では、 追 加 の 命 令 と 演 算 モード 、 パイ プ ラ イ ンの 差 分 、 およびレ ジ ス タ の 名 前 変 更 がサポー ト さ れています。• コンパイルされたプログラムを 特 定 の <strong>ARM</strong> アーキテクチャベースのプロ セ ッ サで 実 行 する 場 合 は、 --cpu コマンド ラインオプショ ンを 使 用 して ターゲ ッ ト プ ロ セ ッ サを 選 択 する こ と をお 勧 め し ます。 これによ り、コンパイ ラは、 プロセッサによってサポー ト されている 命 令 を 最 大 限 に利 用 できるだけでなく、 命 令 スケジューリ ングなどのプロセッサ 固 有 の最 適 化 も 実 行 で き る よ う にな り ます。• コンパイルされたプログラムを 種 類 の 異 なるさまざまな <strong>ARM</strong> プロセッサで 実 行 する 場 合 は、 --cpu コマンド ラインオプショ ンを 使 用 して、 アプ リ ケーシ ョ ンに 適 し た 最 大 公 約 数 と な る アーキテ ク チャ を 選 択 する 必要 があ り ます。 例 えば、 <strong>ARM</strong> v6 アーキテ クチャ をサポー ト するプロセッサ 用 のコードをコンパイルするには、 コマンドラインオプション--cpu 6 を 使 用 します。注コマンド ラインオプショ ン --cpu list を 使 用 する と 、 コ ンパイ ラ に よ ってサポー ト さ れてい る プ ロ セ ッ サ と アーキテ ク チ ャ を 列 挙 で き ます。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 「ターゲ ッ ト プ ロ セ ッ サま たはアーキテ ク チャ の 指 定 」 (ページ 2-28)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--cpu=list」 (ページ 2-34)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--cpu=name」 (ページ 2-35)5-4 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行5.1.4 ループの 最 適 化ループは、 大 半 のプ ロ グ ラ ムに 含 まれてい る 一 般 的 な 構 文 の 1 つです。 ループの 実 行 には 多 大 な 時 間 が 費 やされる こ と が 多 いので、 時 間 制 限 の 厳 しいループに 注 意 を 払 う こ と をお 勧 めし ます。ループ 終 了ループ 終 了 条 件 は、 多 大 なオーバーヘ ッ ド の 原 因 と な り かねないので、 その作 成 にあたっては 注 意 が 必 要 です。 可 能 な 限 り 以 下 を 実 践 し て 下 さ い。• ゼ ロ までカ ウ ン ト ダ ウ ンするループを 常 に 作 成 し、 単 純 な 終 了 条 件 を 使用 します。• unsigned int 型 のカウンタを 常 に 使 用 し、 ゼロ と 等 し くないかど うかをテス ト します。表 5-1 に、 n! を 計 算 するルーチンの 実 装 例 を 2 つ 示 し ます。 こ れ ら の 例 は 共に、 ループ 終 了 のオーバーヘッ ド を 示 し ています。 最 初 の 実 装 では、 イ ン クリメントループを 使 用 して n! が 計 算 されるのに 対 し、 2 番 目 の 実 装 では、 デクリメントループを 使 用 して n! が 計 算 されます。表 5-1 インクリメントループとデクリメントループを 表 す C コードインクリメントループint fact1(int n){int i, fact = 1;for (i = 1; i


コーディング 慣 行表 5-2 は、 コ ンパイ ラによ って 生 成 されたマシン コー ド が 表 5-1 (ページ5-5) の 各 実 装 例 でどの よ う に 逆 アセンブル さ れる かを 示 し た も のです。 いずれの 実 装 の C コード も、オプシ ョ ン -O2 -Otime を 使 用 してコンパイルされています。表 5-2 インクリメントループとデクリメントループを 表 す C 逆 アセンブ リ コードインクリメントループfact1 PROCMOV r2, r0MOV r0, #1CMP r2, #1MOV r1, r0BXLT lr|L1.20|MUL r0, r1, r0ADD r1, r1, #1CMP r1, r2BLE |L1.20|BX lrENDPデクリメントループfact2 PROCMOVS r1, r0MOV r0, #1BXEQ lr|L1.12|MUL r0, r1, r0SUBS r1, r1, #1BNE |L1.12|BX lrENDP表 5-2 の 逆 アセンブ リ を 比 較 する と 、 イ ン ク リ メ ン ト ループ 逆 アセンブ リ の命 令 ペア ADD/CMP が、 デク リ メ ン ト ループ 逆 アセンブ リ の 単 一 の SUBS 命 令 で 置換 されているこ とがわかり ます。 これは、 最 適 化 に よ り ゼ ロ と の 比 較 を な くせるためです。ループ 内 で 命 令 を 節 約 し た こ と に 加 えて、 変 数 n をループをまたがって 保 存する 必 要 はあ り ません。 そのため、 デク リ メ ン トループ 逆 アセンブリではレジスタの 使 用 も 節 約 され、 レ ジ ス タ の 割 り 当 てが 容 易 にな り ます。ループカ ウ ン タ を 必 要 な 繰 り 返 し 数 に 初 期 化 し て、 ゼ ロ にデ ク リ メ ン ト するテクニックは、while ステート メン ト と do ステート メン トにも 適 用 されます。ループの 展 開小 規 模 なループを 展 開 する と、 コード サイ ズが 増 大 し ますが、 パフ ォーマンスを 向 上 できます。 ループが 展 開 さ れる と 、 ループカ ウ ン タ の 更 新 頻 度 が 低く な り 、 実 行 さ れる 分 岐 数 が 少 な く な り ます。 ループが 数 回 しか 繰 り 返 されない 場 合 は、 ループを 完 全 に 展 開 し て、 ループオーバーヘ ッ ド を 完 全 にな くすこ とができます。 <strong>ARM</strong> コンパイラは、-O3 -Otime で 自 動 的 にループを 展 開 します。 それ 以 外 の 場 合 は、 何 らかの 展 開 を ソース コード で 行 う 必 要 があ り ます。5-6 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行注ループを 手 動 で 展 開 する と 、 ループの 自 動 再 展 開 をはじ め、 コ ンパイ ラ に よるループ 最 適 化 を 妨 げる 場 合 があ り ます。ループ 展 開 のメリットとデメリットは、 表 5-3 に 示 す 2 つのサンプルルーチン を 使 用 し て 説 明 で き ます。 ど ち ら のルーチン も、 最 下 位 ビ ッ ト を 抽 出 し てカウント し、 シフ トアウ ト させることによ り、 シングルビッ トを 効 率 的 にテストします。最 初 のルーチンでは、 ビ ッ ト をカウ ン ト するためにループが 使 用 されます。 2番 目 のルーチンは、 最 初 のルーチン を 4 回 展 開 し、 n の 4 シフ ト 分 を 1 つにまと めて 最 適 化 が 適 用 さ れた も のです。 頻 繁 に 展 開 する と 、 最 適 化 の 機 会 が 増えます。表 5-3 未 展 開 および 展 開 されたビ ッ ト カウン ト ループ を 表 す C コードビ ッ ト カウン ト ループint countbit1(unsigned int n){int bits = 0;while (n != 0){if (n & 1) bits++;n >>= 1;}return bits;}展 開 されたビ ッ ト カウン ト ループint countbit2(unsigned int n){int bits = 0;while (n != 0){if (n & 1) bits++;if (n & 2) bits++;if (n & 4) bits++;if (n & 8) bits++;n >>= 4;}return bits;}<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-7ID 100419Non-Confidential,


コーディング 慣 行表 5-4 は、 コ ンパイ ラによ って 生 成 されたマシン コー ド が 表 5-3 (ページ5-7) の 各 実 装 例 でどの よ う に 逆 アセンブル さ れる かを 示 し た も のです。 いずれの 実 装 の C コード も、 オプシ ョ ン -O2 を 使 用 してコンパイルされています。表 5-4 未 展 開 および 展 開 されたビ ッ ト カウン ト ループ を 表 す 逆 アセンブ リ コー ドビ ッ ト カウン ト ループcountbit1 PROCMOV r1, #0B |L1.20||L1.8|TST r0, #1ADDNE r1, r1, #1LSR r0, r0, #1|L1.20|CMP r0, #0BNE |L1.8|MOV r0, r1BX lrENDP展 開 されたビ ッ ト カウン ト ループcountbit2 PROCMOV r1, r0MOV r0, #0B |L1.48||L1.12|TST r1, #1ADDNE r0, r0, #1TST r1, #2ADDNE r0, r0, #1TST r1, #4ADDNE r0, r0, #1TST r1, #8ADDNE r0, r0, #1LSR r1, r1, #4|L1.48|CMP r1, #0BNE |L1.12|BX lrENDP<strong>ARM</strong>7 では、 シングルビ ッ ト をチェ ッ クする ために、 一 番 左 の 列 に 示 すビ ットカウントループの 逆 アセンブリで 6 サイクルが 必 要 となり ます。 コードサイズはわずか 9 命 令 です。 このビッ トカウン トループの 展 開 バージョ ンは、 1ビット 当 たりわずか 平 均 3 サイクルのペースで、 一 度 に 4 ビッ トをチェックします。 ただし、 その 代 わ り にコードサイズは 増 大 し、 15 命 令 にな り ます。5.1.5 volatile の 使 用高 度 な 最 適 化 レベル -O2 および -O3 でコードをコンパイルすると、 問 題 が 発 生する 場 合 があ り ます。 例 えば、 ハード ウ ェアをポー リ ングする 際 にループから 抜 けられなくなったり、 マルチスレッ ド コードによって 異 常 な 動 作 が 示 された り する 場 合 があ り ます。 このよ うな 場 合 は、 通 常 、 一 部 の 変 数 を volatileと し て 宣 言 する こ と が 必 要 と な り ます。変 数 を volatile と し て 宣 言 する と 、 その 変 数 を 実 装 の 外 部 で ( 例 えばオペレーテ ィ ングシステムまたはハード ウェアによって) いつでも 変 更 でき る ことが、 コンパイラに 伝 達 されます。 volatile で 修 飾 された 変 数 の 値 はいつでも変 化 する 可 能 性 があ る ので、 変 数 が コー ド で 参 照 さ れる たびに、 メ モ リ 内 の5-8 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行変 数 の 物 理 ア ド レ スにア ク セスする 必 要 があ り ます。 つま り、 コンパイ ラは、変 数 を ローカルレ ジ ス タ にキ ャ ッ シ ュ し て メ モ リ ア ク セス を 防 ぐ な ど、 変 数に 対 する 最 適 化 を 実 行 でき ません。一 方 、 変 数 が volatile として 宣 言 されていない 場 合 、 コンパイラはその 値 を実 装 の 外 部 で 変 更 で き ない も の と 見 なすこ と がで き ます。 そのため、 コンパイ ラ は 変 数 に 対 する 最 適 化 を 実 行 で き ます。表 5-5 の 2 つのサンプルルーチンは、 volatile キーワードの 用 法 を 示 しています。 いずれのルーチン も、 ス テータ ス フ ラ グ buffer_full が True に 設 定 されるまで、 バ ッ フ ァ の 読 み 出 し を 続 け ます。 いずれのルーチンの 場 合 も、buffer_full の 状 態 がプ ロ グ ラ ム フ ロー と は 非 同 期 に 変 化 する 可 能 性 があ る ものと 見 なされます。最 初 のルーチンは、 ループのネ イ テ ィ ブ 実 装 を 示 し ています。 この 実 装 では、変 数 buffer_full に volatile が 指 定 されていません。 一 方 、 2 番 目 のルーチンは、 同 じループを 示 していますが、 この 実 装 では、buffer_full に volatile が正 し く 指 定 されています。表 5-5 非 揮 発 バ ッ フ ァループ と 揮 発 バ ッ フ ァループ を 表 す C コードバ ッ フ ァループの 非 揮 発 バージ ョ ンint buffer_full;int read_stream(void){int count = 0;while (!buffer_full){count++;}return count;}バ ッ フ ァループの 揮 発 バージ ョ ンvolatile int buffer_full;int read_stream(void){int count = 0;while (!buffer_full){count++;}return count;}<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-9ID 100419Non-Confidential,


コーディング 慣 行表 5-6 は、 コ ンパイ ラによ って 生 成 されたマシン コー ド が 表 5-1 (ページ5-5) の 各 実 装 例 でどの よ う に 逆 アセンブル さ れる かを 示 し た も のです。 いずれの 実 装 の C コード も、 オプシ ョ ン -O2 を 使 用 してコンパイルされています。表 5-6 非 揮 発 バ ッ フ ァループ と 揮 発 バ ッ フ ァループ を 表 す 逆 アセンブ リ コー ドバ ッ フ ァループの 非 揮 発 バージ ョ ンread_stream PROCLDR r1, |L1.28|MOV r0, #0LDR r1, [r1, #0]|L1.12|CMP r1, #0ADDEQ r0, r0, #1BEQ |L1.12| ; infinite loopBX lrENDP|L1.28|DCD ||.data||AREA ||.data||, DATA, ALIGN=2buffer_fullDCD 0x00000000バ ッ フ ァループの 揮 発 バージ ョ ンread_stream PROCLDR r1, |L1.28|MOV r0, #0|L1.8|LDR r2, [r1, #0]; ; buffer_fullCMP r2, #0ADDEQ r0, r0, #1BEQ |L1.8|BX lrENDP|L1.28|DCD ||.data||AREA ||.data||, DATA, ALIGN=2buffer_fullDCD 0x00000000表 5-6 に 示 すバッ フ ァループの 非 揮 発 バージ ョ ンの 逆 アセンブ リ では、 ステートメント LDR r0, [r0, #0] によって、|L1.8| というループ 外 部 のレジスタ r0 にbuffer_full の 値 がロード されます。 buffer_full は volatile として 宣 言 されていないので、 コ ンパイ ラはその 値 をプロ グ ラ ムの 外 部 で 変 更 できないもの と 見 な します。 コンパイラは、buffer_full の 値 を r0 に 既 に 読 み 込 んでお り 、 こ の 変 数 の値 が 変 化 する 可 能 性 はないので、 最 適 化 が 有 効 に されている 場 合 は、 変 数 の 再ロードを 省 略 します。 その 結 果 、 |L1.8| という 無 限 ループが 生 成 されます。それ と は 逆 に、 バッ フ ァループの 揮 発 バージ ョ ンの 逆 アセンブ リ では、buffer_full の 値 がプロ グ ラ ムの 外 部 で 変 化 する 可 能 性 があ る もの と コ ンパイラ に よ って 見 な さ れ、 最 適 化 は 実 行 さ れません。 その 結 果 、 buffer_full の 値は、|L1.4| というループの 内 部 にあるレジスタ r0 にロード され、 ループ |L1.4|がアセンブ リ コードで 正 し く 実 装 されます。プ ロ グ ラ ムの 状 態 が 実 装 の 外 部 で 変 更 さ れた こ と に 起 因 する 最 適 化 の 問 題 を防 ぐには、 実 装 で 認 識 さ れていない 方 法 で 変 数 の 値 が 予 期 せず 変 化 する 可 能性 があ る 場 合 は 必 ず、 変 数 を volatile と し て 宣 言 する 必 要 があ り ます。 実 際 の環 境 では、 以 下 の 場 合 に 変 数 を volatile と し て 宣 言 する 必 要 があ り ます。• メ モ リ マ ッ プ さ れた 周 辺 装 置 にア ク セスする 場 合• グ ローバル 変 数 を 複 数 のス レ ッ ド 間 で 共 有 する 場 合• 割 り 込 みルーチンでグ ローバル 変 数 にア ク セスする 場 合5-10 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行5.2 コード メ ト リ ックコード メ ト リ ッ ク を 使 用 する と、 コード 品 質 を 客 観 的 に 評 価 できます。 <strong>ARM</strong>コンパイラ、 リンカ、 およびプロファイラには、 単 純 なコード メ ト リ ックを生 成 し、 コー ド 品 質 を 向 上 させる ための 機 能 がい く つか 用 意 さ れています。こ れら の 機 能 を 使 用 する と 、 以 下 を 実 行 で き ます。• コードサイズとデータサイズの 測 定• スタティックコールグラフの 生 成• ス タ ッ ク 使 用 量 の 測 定• オブジェ ク ト およびラ イブラ リ におけるデバッ グ 情 報 の 削 減<strong>ARM</strong> Profiler の 詳 細 については、 『<strong>ARM</strong> Profiler ユーザガイ ド』 を 参 照 して 下さい。5.2.1 コー ド サイズ と デー タサイズの 測 定アプリケーションのコードサイズとデータサイズは、 さまざまなオプションを 使 用 して 測 定 できます。 詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の 「--info=totals」 (ページ2-82)• 『ユーテ ィ リ テ ィ ガイ ド』 の 「--info=topic[,topic,...]」 (ページ 2-33)• 『リンカリファレンスガイド』 の 「--[no_]callgraph」 (ページ 2-8)• 『リンカリファレンスガイド』 の 「--[no_]map」 (ページ 2-43)• 『リンカリファレンスガイド』 の 「--[no_]symbols」 (ページ 2-64)• 『リンカリファレンスガイド』 の 「--[no_]xref」 (ページ 2-71)5.2.2 ス タ ッ ク 使 用 量 の 測 定C と C++ では、 いずれ も ス タ ッ ク が 多 く 使 用 さ れます。 例 えば、 ス タ ッ クは以 下 の 項 目 を 格 納 する ために 使 用 さ れます。• 関 数 の 復 帰 ア ド レ ス• 保 持 する 必 要 があ る レ ジ ス タ (AAPCS によって 決 定 される)• ローカル 変 数 (ローカル 配 列 を 含 む)、 構 造 体 、 および ク ラ ス (C++ の場 合 )<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-11ID 100419Non-Confidential,


コーディング 慣 行通 常 、 ス タ ッ ク の 使 用 量 を 自 動 的 に 測 定 する 方 法 はあ り ません。 ただし、 スタ ッ ク 使 用 率 の 程 度 を 手 動 で 推 定 する こ と は 可 能 です。 これには、 以 下 の 方法 があ り ます。• --callgraph でリンクすることによって、 スタティックコールグラフを 生成 します。 これに よ り 、 ス タ ッ ク の 使 用 量 をは じ め と し た、 すべての 関数 に 関 する 情 報 が 示 されます。• --info=stack または --info=summarystack でリンクすることによって、すべてのグ ローバルシンボルのス タ ッ ク 消 費 量 の リ ス ト を 表 示 し ます。• デバッガを 使 用 して、 ス タ ッ ク 内 の 最 後 の 使 用 可 能 な 場 所 にウ ォ ッチポイ ン ト を 設 定 し、 そのウ ォ ッ チポ イ ン ト が ヒ ッ ト さ れる かど う かを 調 べます。• デバ ッ ガは、 以 下 の よ う に 使 用 し ます。1. 想 定 を 大 幅 に 上 回 るサイズの 領 域 をスタ ッ クに 割 り 当 てます。2. ゼロや 0xDEADDEAD などの 既 知 の 値 でスタッ クを 埋 めます。3. アプ リ ケーシ ョ ン ま たはその 固 定 部 分 を 実 行 し ます。 テス ト 実 行 では、 スタックの 可 能 な 限 り 多 くの 部 分 を 使 用 するようにして 下 さい。 例 えば、 できる 限 り 多 くのコードの 分 岐 を 実 行 して、 必 要 に 応じ て 割 り 込 みを 生 成 し、 分 岐 や 割 り 込 みがス タ ッ ク ト レースに 記録 されるよ うにします。4. アプ リ ケーシ ョ ンの 実 行 が 完 了 した 後 で、 メモ リ のスタ ッ クエ リアを 検 証 して、 上 書 きされた 既 知 の 値 (ゼロまたは0xDEADDEAD) の 数 を 調 べます。 ス タ ッ ク の 使 用 済 み 部 分 にはゴミ が 表 示 さ れ、 残 り の 部 分 にはゼ ロ ま たは 0xDEADDEAD という値 が 示 されます。5. 既 知 のエン ト リ の 数 を 数 えて、 8 で 乗 算 し ます。 これによ り、 メモリ 内 でス タ ッ ク がどの 程 度 増 大 し たかがバイ ト 単 位 で 示 さ れます。• RVISS の 場 合 は、 マ ッ プフ ァ イルを 使 用 し て、 ア ク セスが 許 可 されていないメモ リ 領 域 を 定 義 し ます。 この 領 域 は、 メモリ 内 でスタックのすぐ下 に 配 置 し て 下 さい。 アクセスが 禁 止 された 領 域 にスタックがオーバーフローする と、 データアボートが 発 生 し、 デバッガによって ト ラ ップされる 可 能 性 があり ます。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 「コードサイズとデータサイズの 測 定 」 (ページ 5-11)• 『リンカリファレンスガイド』 の 「--[no_]callgraph」 (ページ 2-8)5-12 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行5.2.3 オブジ ェ ク ト およびラ イ ブ ラ リ におけるデバ ッ グ 情 報 の 削 減オブジ ェ ク ト と ラ イ ブ ラ リ に 含 まれてい るデバ ッ グ 情 報 の 量 を 削 減 する と 、有 益 な 場 合 が 多 々あ り ます。 デバ ッ グ 情 報 のレベルを 下 げる と 、 以 下 の メリットがもたらされます。• オブジェ ク ト と ラ イブラ リ のサイズを 縮 小 する こ とによ り、 オブジェ クト と ラ イ ブ ラ リ の 格 納 に 必 要 なデ ィ ス ク 容 量 を 削 減 で き ます。• リ ン ク 時 間 を 高 速 化 し ます。 コ ンパイルサイ クルでは、 リ ン ク 時 間 のほと んどが、 全 デバ ッ グセ ク シ ョ ンの 読 み 出 し と 重 複 の 除 去 に 費 や さ れます。• 最 終 イ メ ージのサ イ ズを 最 小 化 し ます。 これによ り、 デバッガによるデバ ッ グシンボルの ロー ド と 処 理 が 迅 速 化 さ れます。ソースファイルごとに 生 成 されるデバッグ 情 報 の 量 は、 いくつかの 方 法 で 削減 でき ます。 以 下 はその 例 です。• ヘッダファイルにおいて #define を 条 件 付 き で 使 用 し ない よ う に し ます。使 用 する と 、 リ ンカで 重 複 情 報 を 容 易 に 削 除 で き な く な り ます。• ヘッダファイルが 同 じ 順 序 でインクルード (#include) されるよ うに Cまたは C++ のソースファイルを 変 更 します。• ヘッダ 情 報 を 小 さなブロッ クに 細 分 化 します。 つま り、 サイズの 大 きなヘ ッ ダフ ァ イルを 少 数 使 用 する のではな く 、 サ イ ズの 小 さ なヘ ッ ダ フ ァイルを 多 数 使 用 し ます。 こ うすることにより、 リンカによって 除 去 される 共 通 ブ ロ ッ ク の 数 を 増 やすこ と がで き ます。• ヘッダファイルは 必 要 な 場 合 に 限 り、 C または C++ のソースファイルにインクルードします。• ヘッダファイルを 複 数 のインクルードから 保 護 します。 例 えば、 foo.h とい う ヘ ッ ダ フ ァ イ ルがあ る 場 合 は、 以 下 を 追 加 し ます。#ifndef foo_h#define foo_h...// rest of header file as before...#endif /* foo_h */コンパイラオプション --remarks を 使 用 する と、 保 護 されていないヘッダフ ァ イルに 関 する 警 告 を 表 示 で き ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-13ID 100419Non-Confidential,


コーディング 慣 行• プリプロセッサのマクロ 定 義 をデバッグテーブルから 破 棄 するには、--no_debug_macros コマンド ラインオプショ ンを 使 用 してコードをコンパイルします。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の 「--debug_macros,--no_debug_macros」 (ページ 2-42)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--remarks」 (ページ 2-125)5-14 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行5.3 関 数通 常 、 コ ンパイ ラ に よ る 最 適 化 の 実 行 を 効 率 化 する には、 関 数 を 小 規 模 かつ単 純 な も のにする こ と が 賢 明 です。 これを 達 成 する 方 法 はいくつかあり ます。以 下 はその 例 です。• 関 数 と の 間 で 受 け 渡 さ れるパ ラ メ ータ の 数 を 最 小 限 に し ます。• __value_in_regs を 使 用 して、 関 数 からレジスタに 複 数 の 値 を 返 します。• 可 能 な 場 合 は、 関 数 を __pure として 修 飾 します。5.3.1 パラ メ ー タ 受 け 渡 し に 伴 う オーバーヘ ッ ド の 最 小 化関 数 のパラ メータ 受 け 渡 しに 伴 うオーバーヘッ ドは、 いくつかの 方 法 で 最 小限 にでき ます。 以 下 に 例 を 示 し ます。• 関 数 の 各 引 数 のサ イ ズが 1 ワー ド 以 下 の 場 合 、 引 数 を 4 個 以 下 に し ます。 C++ では、 通 常 は 暗 黙 の this ポインタ 引 数 が R0 で 渡 されるため、 非ス タ テ ィ ッ ク メ ンバ 関 数 に 使 用 する 引 数 を 3 個 以 下 に し ます。• 関 数 で 5 個 以 上 の 引 数 が 必 要 な 場 合 は、 ス タ ッ ク し た 引 数 の 受 け 渡 し コストをカバーできるように、 その 関 数 で 相 当 な 量 の 処 理 を 行 うようにして 下 さい。• 関 連 性 のあ る 引 数 を 1 つの 構 造 体 にま と め、 その 構 造 体 を 指 すポ イ ン タを 関 数 呼 び 出 し で 受 け 渡 し ます。 こ うすることにより、パラメータ 数 を減 ら し、 読 みやすさ を 高 め る こ と がで き ます。• long long パ ラ メ ータ では、 偶 数 レ ジ ス タ イ ンデク スで 整 列 する 必 要 のある 引 数 ワードが 2 個 使 用 さ れる ため、 こ れ ら のパ ラ メ ータ の 数 を 最 小 限にします。• ソ フ ト ウ ェ ア 浮 動 小 数 点 が 有 効 になってい る 場 合 は、 double パラ メータの 数 を 最 小 限 に し ます。• 可 変 数 のパ ラ メ ータ を 持 つ 関 数 を 使 用 し ない よ う に し ます。 可 変 数 の 引数 を 使 用 する 関 数 では、 事 実 上 すべての 引 数 がス タ ッ ク で 受 け 渡 さ れます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-15ID 100419Non-Confidential,


コーディング 慣 行5.3.2 __value_in_regsC および C++ では、 構 造 体 を 使 用 する と、 1 つの 関 数 から 複 数 の 値 を 返 すことができます。 通 常 、 構 造 体 はス タ ッ ク を 使 用 し て 返 さ れ、 それに 伴 う コ ストも 発 生 します。メモリ ト ラフィックを 削 減 し、 コードサイズを 縮 小 するため、 <strong>ARM</strong> コンパイラには、 1 つの 関 数 か ら レ ジ ス タ に 複 数 の 値 を 返 す 機 能 が 用 意 さ れています。関 数 を __value_in_regs で 修 飾 する と 、 その 関 数 か ら 最 大 4 ワードを struct で返 す こ と がで き ます。 以 下 に 例 を 示 し ます。typedef struct s_coord { int x; int y; } coord;coord reflect(int x1, int y1) __value_in_regs;複 数 の 値 を 1 つの 関 数 か ら 返 す 必 要 があ る 場 合 は、 いつで も __value_in_regsを 使 用 できます。 以 下 はその 例 です。• C 関 数 および C++ 関 数 か ら 複 数 の 値 を 返 す 場 合• 組 み 込 みアセンブ リ 言 語 関 数 か ら 複 数 の 値 を 返 す 場 合• スーパーバイザコールを 行 う 場 合• __user_initial_stackheap を 再 実 装 する 場 合__value_in_regs の 詳 細 については、 『コンパイ ラ リ ファレンスガイ ド』 の「__value_in_regs」 (ページ 4-22) を 参 照 して 下 さい。5.3.3 __pure純 関 数 は、 同 じ 引 数 を 使 用 し て 呼 び 出 さ れた 場 合 に 常 に 同 じ 結 果 を 返 す 関 数です。定 義 上 、 純 関 数 に 対 する 特 定 の 呼 び 出 し は 1 度 だけ 評 価 すれば 十 分 です。 純 関数 の 呼 び 出 し の 結 果 は 同 一 の 呼 び 出 し の 場 合 に 常 に 同 じ にな る こ と が 保 証 されているので、 コード 内 の 2 回 目 以 降 の 関 数 呼 び 出 し は、 1 回 目 の 呼 び 出 し の結 果 で 置 換 で き ます。関 数 が 純 関 数 であ る こ と を コ ンパイ ラ に 通 知 する には、 関 数 を __pure として宣 言 し ます。__pure キーワー ド の 使 用 法 を、 表 5-7 (ページ 5-17) の 2 つのサンプルルーチンに 示 します。 いずれのルーチン も、 関 数 fact を 呼 び 出 して、 n! と n! の 合 計を 計 算 し ます。 fact 関 数 は、 n! の 計 算 に 入 力 引 数 し か 使 用 し ません。 そのため、 fact は 純 関 数 であ る と 言 えます。5-16 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行最 初 のルーチンは、 関 数 fact のネ イ テ ィ ブ 実 装 を 示 し ています。 こ こ で、fact は __pure として 宣 言 されていません。 2 番 目 のルーチンでは、 関 数 fact が純 関 数 であ る こ と を コ ンパイ ラ に 通 知 する ために、 関 数 が __pure として 修 飾されています。表 5-7 純 関 数 および 非 純 関 数 を 表 す C コード__pure と し て 宣 言 されていない 純 関 数int fact(int n){int f = 1;while (n > 0)f *= n--;return f;}int foo(int n){return fact(n)+fact(n);}__pure と し て 宣 言 されている 純 関 数int fact(int n) __pure{int f = 1;while (n > 0)f *= n--;return f;}int foo(int n){return fact(n)+fact(n);}表 5-8 は、 コ ンパイ ラ によ って 生 成 されたマシン コー ド が 表 5-7 の 各 実 装 例でどのよ うに 逆 アセンブルされるかを 示 したものです。 いずれの 実 装 の Cコード も、 オプシ ョ ン -O2 を 使 用 してコンパイルされています。表 5-8 純 関 数 および 非 純 関 数 を 表 す 逆 アセンブ リ コー ド__pure と し て 宣 言 されていない 純 関 数__pure と し て 宣 言 されている 純 関 数fact PROC...foo PROCMOVPUSHBLMOVMOVBLADDPOPENDPr3, r0{lr}factr2, r0r0, r3factr0, r0, r2{pc}fact PROC...foo PROCPUSHBLLSLPOPENDP{lr}factr0,r0,#1{pc}表 4-8 に 示 す 関 数 foo の 逆 アセンブ リ では、 fact が __pure として 修 飾 されていません。 コンパイ ラは 関 数 fact が CSE の 対 象 であ る こ と を 認 識 し ないので、こ の 関 数 は 2 回 呼 び 出 さ れます。 一 方 、 表 4-8 に 示 す foo の 逆 アセンブ リ では、<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-17ID 100419Non-Confidential,


コーディング 慣 行fact が __pure として 修 飾 されています。コンパイラは fact(n) + fact(n) の 追 加時 に CSE を 実 行 する こ と に 成 功 し てい る ので、 fact は 1 度 しか 呼 び 出 されません。純 関 数 は、 定 義 上 、 副 作 用 を 伴 う こ と はで き ません。 例 えば、 グローバル 状態 にア ク セ スする と 、 同 じ パ ラ メ ータ を 使 用 し て 関 数 が 2 回 呼 び 出 さ れた 場合 に 同 じ 値 を 返 す 必 要 があ る と い う 規 則 に 違 反 する 可 能 性 があ り ます。 そのため、 純 関 数 は、 グ ローバル 変 数 の 使 用 ま たはポ イ ン タ 経 由 の 間 接 指 定 によって、 グローバル 状 態 を 読 み 出 した り、 書 き 込 んだりする こ とができません。 したがって、 プログラムで __pure を 使 用 する 際 は 注 意 が 必 要 です。 しかし、 関 数 を __pure と し て 宣 言 で き る 場 合 は、 コ ンパ イ ラ に よ っ て CSE などの強 力 な 最 適 化 が 実 行 さ れる こ と が 少 な く あ り ません。純 関 数 の 詳 細 については、 『コンパイ ラ リ ファレンスガイ ド』 の 「__pure」(ページ 4-15) を 参 照 して 下 さい。5.3.4 <strong>ARM</strong> 関 数 修 飾 子 の 配 置関 数 の 動 作 ま たは 呼 び 出 し シーケン ス を 変 更 する <strong>ARM</strong> キーワード 拡 張 は 多数 あ り ます。 例 えば、 __pure、 __irq、 __swi、 __swi_indirect、 __softfp、__value_in_regs は、 いずれも 関 数 の 動 作 や 呼 び 出 し シーケン ス を 変 更 し ます。こ れら 関 数 修 飾 子 の 構 文 は、 すべて 共 通 です。 __pure な どの 関 数 修 飾 子 は、 以下 のいずれかの 場 所 で 関 数 宣 言 を 修 飾 で き ます。• 関 数 宣 言 の 前 。 以 下 に 例 を 示 し ます。__pure int foo(int);• パラ メータ リ ス トの 閉 じ 括 弧 の 後 。 以 下 に 例 を 示 し ます。int foo(int) __pure;単 純 な 関 数 宣 言 の 場 合 、 各 構 文 はあいまいではあ り ません。 ただし、 戻 り 値の 型 ま たは 引 数 が 関 数 ポ イ ン タ であ る 関 数 の 場 合 は、 前 置 構 文 があいまいになります。 例 えば、 次 の 関 数 は 関 数 ポイ ンタを 返 し ますが、 __pure によって 関数 自 体 が 修 飾 されるのか、 返 されるポインタの 型 が 修 飾 されるのかは 明 白 でありません。__pure int (*foo(int)) (int); /* declares 'foo' as a (pure?) function thatreturns a pointer to a (pure?) function.It is ambiguous which of the two functiontypes is pure. */実 際 、 foo の 宣 言 の 前 にあ る 単 一 の __pure キーワードは、 foo そのものだけでなく、foo によって 返 される 関 数 ポインタの 型 も 修 飾 しています。5-18 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行一 方 、 後 置 構 文 の 場 合 は、 引 数 と 戻 り 値 の 型 が 関 数 ポ イ ン タ であ る 関 数 を 宣言 する と き に、 __pure が 引 数 、 戻 り 値 の 型 、 ま たはベース 関 数 のいずれに 適用 されるかを 明 白 に 区 別 できます。 以 下 に 例 を 示 し ます。int (*foo1(int) __pure) (int); /* foo1 is a pure function returninga pointer to a normal function */int (*foo2(int)) (int) __pure; /* foo2 is a function returninga pointer to a pure function */int (*foo3(int) __pure) (int) __pure; /* foo3 is a pure function returninga pointer to a pure function */この 例 では、 以 下 のよ うになり ます。• foo1 と foo3 自 体 が 修 飾 さ れています。• foo2 と foo3 は、 修 飾 さ れた 関 数 を 指 すポ イ ン タ を 返 し ます。• 関 数 foo3 と foo は 同 一 です。後 置 構 文 は 前 置 構 文 よ り 明 白 なので、 <strong>ARM</strong> 関 数 修 飾 子 を 使 用 し て 関 数 を 修 飾する 場 合 は、 可 能 な 限 り 後 置 構 文 を 使 用 する こ と をお 勧 め し ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-19ID 100419Non-Confidential,


コーディング 慣 行5.4 関 数 のイ ン ラ イ ン 展 開関 数 のインライン 展 開 を 行 う と、 コードサイズとパフォーマンスのト レードオフをと るこ とができます。 デフ ォル ト で、 コー ド を イ ン ラ イ ン 展 開 すべきかど うかは、 コンパイ ラによって 自 動 的 に 決 定 されます。 原 則 と し て、 コ ンパ イ ラ は、 最 小 サ イ ズの コー ド を 生 成 する と い う 観 点 か ら、 イ ン ラ イ ン 展 開に 関 し て 適 切 な 判 断 を 下 し ます。 これは、 組 み 込 みシ ス テムに と って、 基 本的 にコード サイ ズが 重 要 であ るためです。ほ と んどの 場 合 、 特 定 の 関 数 を イ ン ラ イ ン 展 開 すべき かど う かの 判 断 は、 コンパイ ラに 任 せるのが 賢 明 です。 ただし、 適 切 なインラ インキーワード を 使用 し て、 特 定 の 関 数 を イ ン ラ イ ン 展 開 する 必 要 があ る こ と を コ ンパイ ラに 示すこ とは 可 能 です。 コ ンパ イ ラ には、 イ ン ラ イ ン 展 開 に 関 する 動 作 を 変 更 する ための、 さ ま ざ ま な 機 能 も 用 意 さ れています。 これらの 機 能 を 使 用 すべきかど う か、 ま たはそ も そ も 関 数 を イ ン ラ イ ン 展 開 すべき かど う かを 決 定 する際 は、 い く つかの 要 素 を 考 慮 に 入 れる 必 要 があ り ます。__inline、 inline、 または __forceinline で 修 飾 されている 関 数 は、 イ ン ラ イ ン関 数 と 呼 ばれます。 C++ では、 ク ラ ス、 構 造 体 、 ま たは 共 用 体 内 で 定 義 さ れてい る メ ンバ 関 数 も イ ン ラ イ ン 関 数 です。注プロフ ァ イルを 利 用 した 最 適 化 は 関 数 のインラ イン 展 開 に 影 響 を 及 ぼす 場 合がある こ とに 注 意 して 下 さい。 『コンパイ ラ リ ファレンスガイ ド』 の「--profile=filename」 (ページ 2-120) を 参 照 して 下 さい。5.4.1 コ ンパイ ラがイ ン ラ イ ン 展 開 の 是 非 を 決 定 する 仕 組 みインライン 展 開 が 有 効 になっている 場 合 、 コンパイラは 複 雑 なデシジョンツリ ーを 使 用 し て、 関 数 をいつイ ン ラ イ ン 展 開 する かを 決 定 し ます。 コンパイラ は、 次 に 示 す 簡 略 化 さ れたアルゴ リ ズムに 基 づいて、 関 数 を イ ン ラ イ ン 展開 する かど う かを 決 定 し ます。1. 関 数 が __forceinline で 修 飾 さ れてい る 場 合 は、 関 数 を イ ン ラ イ ン 展 開 する こ と が 可 能 な 場 合 に、 関 数 がイ ン ラ イ ン 展 開 されます。2. 関 数 が __inline で 修 飾 され、 オプシ ョ ン --forceinline が 選 択 されている場 合 は、 関 数 を イ ン ラ イ ン 展 開 する こ と が 可 能 な 場 合 に、 関 数 が イ ン ライン 展 開 されます。関 数 が __inline で 修 飾 され、 オプシ ョ ン --forceinline が 選 択 されていない 場 合 は、 関 数 を イ ン ラ イ ン 展 開 する こ と が 実 際 的 な 場 合 に、 関 数 が インライン 展 開 されます。5-20 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行3. 最 適 化 レベルが -O2 以 上 であ る か、 --autoinline が 選 択 されている 場 合は、 関 数 を イ ン ラ イ ン 展 開 する こ と が 実 際 的 であ り 、 かつそれが 可 能 であ る 場 合 に、 関 数 が イ ン ラ イ ン 展 開 さ れます。関 数 を イ ン ラ イ ン 展 開 する こ と が 実 際 的 であ る かど う かを コ ンパ イ ラ が 判 断する 際 は、-Ospace と -Otime のどちらが 選 択 されるかなど、 その 他 の 基 準 も 考慮 に 入 れられます。 --Otime を 選 択 する と 、 関 数 が イ ン ラ イ ン 展 開 さ れる 可 能性 が 高 く な り ます。 詳 細 については、 「コンパイ ラによるインラ イン 展 開 はどの よ う な 場 合 に 実 際 的 か ?」 を 参 照 して 下 さい。どの よ う な 場 合 に 関 数 を イ ン ラ イ ン 展 開 する と 実 際 的 であ る かに 関 し て コ ンパイラが 下 した 判 断 は、 オーバーライドできません。 例 えば、 イ ン ラ イ ン 展開 する こ と が 不 適 切 であ る と コ ンパ イ ラ に よ って 見 な さ れた 関 数 を 強 制 的 にインライン 展 開 することはできません。5.4.2 コ ンパイ ラ によ る イ ン ラ イ ン 展 開 はどのよ う な 場 合 に 実 際 的 か ?コ ンパイ ラ は、 以 下 をはじ め と し た 多 数 の 条 件 に 基 づいて、 関 数 を イ ン ラ イン 展 開 する こ と が 実 際 的 であ る かど う かを 自 動 的 に 判 断 し ます。• 関 数 のサ イ ズ と 呼 び 出 し 回 数• 現 在 の 最 適 化 レベル• 処 理 速 度 (-Otime) とサイズ (-Ospace) のど ち ら が 最 適 化 さ れてい る か• 外 部 リ ンケージ と 静 的 リ ンケージのど ち ら が 関 数 に 含 まれてい る か• 関 数 にい く つのパ ラ メ ータ が 含 まれてい る か• 関 数 の 戻 り 値 が 使 用 されるかど う かコンパイラは、 関 数 が __forceinline によって 修 飾 されている 場 合 でも、 その関 数 を イ ン ラ イ ン 展 開 し ない よ う に 決 定 する こ と があ り ます。 以 下 の 一 般 規則 が 適 用 さ れます。• 規 模 の 小 さ い 関 数 ほど イ ン ラ イ ン 展 開 さ れる 可 能 性 が 高 く な り ます。• -Otime を 使 用 し て コ ンパ イ ルする と 、 関 数 が イ ン ラ イ ン 展 開 さ れる 可 能性 が 高 く な り ます。• 大 き な 関 数 は、 コー ド 密 度 と パフ ォーマン スに 悪 影 響 を 及 ぼす 可 能 性 があ る ので、 一 般 的 に イ ン ラ イ ン 展 開 さ れません。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-21ID 100419Non-Confidential,


コーディング 慣 行5.4.3 イ ン ラ イ ン 展 開 の 管 理__forceinline キーワー ド を 使 用 する と 、 コ ンパ イ ラ に 関 数 の イ ン ラ イ ン 展 開を 強 制 的 に 試 行 させる こ と がで き ます。 コンパイラは、 問 題 の 原 因 とならない 限 り 、 関 数 を イ ン ラ イ ンに 配 置 し ます。 例 えば、 再 帰 関 数 は 一 度 し か イ ンライン 展 開 できません。 __inline のマー ク が 付 いたすべての 関 数 の イ ン ラ イ ン展 開 を コ ンパ イ ラ に 強 制 的 に 試 行 さ せる には、 --forceinline コマンド ラインオプシ ョ ン を 使 用 し て コー ド を コ ンパ イ ルし ます。最 高 の 最 適 化 レベル (-O2 および -O3) を 指 定 する と、 コンパイラは、 ユーザか ら 明 示 的 に 指 定 さ れなかった 場 合 で も、 関 数 を イ ン ラ イ ン 展 開 する こ と が適 切 であれば、 自 動 的 に イ ン ラ イ ン 展 開 で き ます。 詳 細 については、 「 関 数 のstatic 化 」 (ページ 5-26) を 参 照 して 下 さい。--no_autoinline および --autoinline 最 高 の 最 適 化 レベルにおいて、 コ マン ド ラインオプションを 使 用 することで、 関 数 の 自 動 インライン 展 開 を 制 御 できます。 通 常 、 自 動 イ ン ラ イ ン 展 開 が 有 効 に さ れてい る 場 合 、 コ ンパイ ラ はイ ンラ イ ン 展 開 する こ と が 適 切 であ るすべての 関 数 を イ ン ラ イ ン 展 開 し ます。 自動 イ ン ラ イ ン 展 開 が 無 効 に さ れてい る 場 合 は、 __inline でマーク された 関 数 しかインライン 展 開 の 対 象 となり ません。--no_inline および --inline キーワード を 使 用 する こ とで、 イン ラ イン 展 開 を実 行 する かど う かを 制 御 で き ます。 デフォル ト で、 関 数 のインラ イン 展 開 は有 効 に さ れています。 --no_inline コマンド ラインオプショ ンを 使 用 して 関 数のインラ イン 展 開 を 無 効 にした 場 合 、 コンパイ ラは、 __forceinline で 明 示 的に 修 飾 さ れた 関 数 だけを イ ン ラ イ ン 展 開 し よ う と し ます。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の 「--autoinline,--no_autoinline」 (ページ 2-19)• 『コンパイラ リ ファレンスガイ ド』 の 「--forceinline」 (ページ2-66)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--inline, --no_inline」(ページ 2-83)• 『コンパイ ラ リ ファレンスガイ ド』 の 「__forceinline」 (ページ 4-7)• 『コンパイ ラ リ ファレンスガイ ド』 の 「__inline」 (ページ 4-10)5-22 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行5.4.4 自 動 イ ン ラ イ ン 展 開最 適 化 の -O2 および -O3 レベルでは、 コンパイ ラは、 インラ イン 関 数 ではな く定 義 さ れてい る 関 数 の イ ン ラ イ ン 呼 び 出 し を 検 討 し ます。 これは、 スタティ ック 関 数 のすべての 使 用 を イ ン ラ イ ン 展 開 で き る 場 合 にはア ウ ト オブ ラ イ ン コピーが 必 要 ないので、 ス タ テ ィ ッ ク 関 数 に 適 し ています。 非 インライン 関 数が 定 義 さ れてい る 変 換 単 位 の 外 部 で 使 用 さ れない 場 合 は、 すべての 非 イ ン ライ ン 関 数 を static としてマークして 下 さい。 変 換 単 位 は、 ソース フ ァ イルのプリプロセッサ 出 力 と、#include ディレクティブの 結 果 としてインクルードされるすべてのヘッダおよびソースファ イルを 合 わせたものです。 通 常 、 非 イ ンラ イ ン 関 数 の 定 義 はヘッ ダフ ァ イル 内 には 配 置 し ません。-O3 レベルでデフォル ト によ り 有 効 になっている --multifile オプシ ョ ン、 または --ltcg を 使 用 し て コ ンパ イルする 場 合 、 コ ンパ イ ラ は 他 の 変 換 単 位 に 定義 さ れてい る 関 数 への 呼 び 出 し を 自 動 的 に イ ン ラ イ ン 展 開 で き ます。--multifile を 使 用 する 場 合 は、 両 方 の 変 換 単 位 を コ ンパ イ ラ の 1 回 の 呼 び 出しでコンパイルする 必 要 があり ます。 --ltcg を 使 用 する 場 合 、 こ れらは 一 緒 にリンクするだけでかまいません。--no_inline は 自 動 イ ン ラ イ ン 展 開 を 無 効 に し ます。5.4.5 C++、 C90、 C99、 および GNU C90 コ ンパイ ラ モー ド の 動 作 の 相 違イ ン ラ イ ン 展 開 の 効 果 は、 コ ンパイ ラ がどの 言 語 を コ ンパ イルする かに よ って、 一 部 の 領 域 で 異 な り ます。__forceinline は __inline と 同 様 に 動 作 し ますが、 コ ンパイ ラがイ ン ラ イ ン 展開 を 優 先 する とい う 点 で 異 な り ます。C++ および C90 モードinline キーワードは C90 では 使 用 でき ません。C90 での __inline の 効 果 と C++ での __inline および inline の 効 果 は 同 じです。extern 関 数 を イ ン ラ イ ン 展 開 の 対 象 と し て 宣 言 する には、 使 用 さ れるすべての 変 換 単 位 でその 関 数 を 定 義 する 必 要 があ り ます。 ま た、 各 変 換 単 位 では 同じ 定 義 を 使 用 する 必 要 があ り ます。すべての 変 換 単 位 で 関 数 を 定 義 する と い う 要 件 は、 外 部 リ ンケージがあ る 場合 にも 適 用 されます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-23ID 100419Non-Confidential,


コーディング 慣 行イ ン ラ イ ン 関 数 が 複 数 のフ ァ イ ルで 使 用 さ れる 場 合 、 その 定 義 は 通 常 はヘ ッダ フ ァ イ ルに 配 置 さ れます。非 イ ン ラ イ ン 関 数 の 定 義 をヘ ッ ダ フ ァ イ ルに 配 置 し ないで 下 さ い。 変 換 単 位ご と に 関 数 が 作 成 さ れる こ と があ り ます。 非 インライン 関 数 が extern 関 数 であ る 場 合 は、 リ ン ク 時 にシンボルの 重 複 が 生 じ ます。 非 インライン 関 数 がstatic であ る 場 合 は、 不 要 な コー ド の 重 複 が 生 じ る 場 合 があ り ます。C++ の 構 造 体 、 ク ラ ス、 ま たは 共 用 体 の 宣 言 で 定 義 さ れた メ ンバ 関 数 は、 暗黙 的 に イ ン ラ イ ン 展 開 さ れます。 これらは inline キーワード または __inlineキーワー ド を 使 用 し て 宣 言 さ れた 場 合 と 同 様 に 処 理 さ れます。インライン 関 数 は、 明 示 的 に static として 宣 言 されていない 限 り、extern リンケージを 持 っています。 インライン 関 数 を static と し て 宣 言 する 場 合 は、 関数 のア ウ ト オブラ イ ン コ ピーがその 変 換 単 位 で 一 意 にな る よ う にする 必 要 があるため、 インライン 関 数 を static と し て 宣 言 する と 、 不 要 な コー ド の 重 複 が生 じる 場 合 があ り ます。コンパイラは、 関 数 をインライン 展 開 できない 場 合 、 およびインライン 展 開し ない 場 合 に、 関 数 のア ウ ト オブラ イ ン コ ピーへの 通 常 の 呼 び 出 し を 生 成 します。関 数 を 使 用 するすべての 変 換 単 位 で 関 数 を 定 義 する とい う 要 件 は、 つま り、コンパイラがすべての extern インライン 関 数 のアウトオブラインコピーを 生成 する 必 要 がない こ と を 意 味 し ます。 コンパイラが extern インライン 関 数 のア ウ ト オブ ラ イ ン コ ピーを 生 成 する 場 合 は 共 通 グループを 使 用 する ため、 リンカは 重 複 を 削 除 して、 異 なるオブジェ ク ト フ ァ イルの 同 じアウ ト オブラ イン 関 数 に 1 つのコ ピーのみを 保 持 し ます (『リンカユーザガイド』 の 「 共 通 グループま たは 共 通 セ ク シ ョ ンの 削 除 」 (ページ 3-12) を 参 照 し て 下 さ い)。C99 モード外 部 リ ン ケージ を 持 つ C99 インライン 関 数 の 規 則 は C++ の 規 則 と は 異 な り ます。 C99 は イ ン ラ イ ン 定 義 と 外 部 定 義 を 区 別 し ます。 インライン 関 数 が 定 義 されてい る 任 意 の 変 換 単 位 において、 イ ン ラ イ ン 関 数 が extern ではな く inlineを 使 用 して 常 に 宣 言 されている 場 合 、 それはインラ イン 定 義 にな り ます。 それ 以 外 の 場 合 は 外 部 定 義 にな り ます。 これらのインライン 定 義 は、--no_inlineが 使 用 されている 場 合 であってもアウ トオブラインコピーの 生 成 には 使 用 されません。各 イ ン ラ イ ン 関 数 を 使 用 する 場 合 は、 同 じ 変 換 単 位 の 定 義 (イ ン ラ イ ン 定 義ま たは 外 部 定 義 ) を 使 用 し て イ ン ラ イ ン 展 開 さ れる か、 外 部 定 義 の 呼 び 出 しが 行 われます。 イ ン ラ イ ン 関 数 を 使 用 する 場 合 、 変 換 単 位 に 1 つの 外 部 定 義 の5-24 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行みを 含 め る 必 要 があ り ます。 これは 外 部 関 数 を 使 用 した 場 合 に 適 用 される 規則 と 同 じです。 実 際 には、 使 用 するすべての イ ン ラ イ ン 関 数 が イ ン ラ イ ン 展開 さ れる 場 合 、 外 部 定 義 が 含 まれていな く て も エ ラーは 発 生 し ません。--no_inline を 使 用 し た 場 合 は、 外 部 定 義 のみが 使 用 されます。通 常 は、 extern ではな く inline を 使 用 して、 外 部 リ ンケージを 含 むインラ イン 関 数 を イ ン ラ イ ン 定 義 と し てヘ ッ ダフ ァ イルに 配 置 し ます。 ソースファイルに も 外 部 定 義 があ り ます。 以 下 に 例 を 示 し ます。例 5-1 C99 での 関 数 のイ ン ラ イ ン 展 開/* example_header.h */inline int my_function (int i){return i + 42; // inline definition}/* file1.c */#include “example_header.h”... // uses of my_function()/* file2.c */#include “example_header.h”... // uses of my_function()/* myfile.c */#include “example_header.h”extern inline int my_function(int); // causes external definition.これは C++ に 通 常 使 用 さ れる も の と 同 じ 方 法 ですが、 C++ では 特 別 な 外 部 定義 はな く 、 それに 対 する 要 件 も あ り ません。イ ン ラ イ ン 関 数 の 定 義 は 変 換 単 位 ご と に 異 な る も のを 使 用 で き ます。 ただし、通 常 は 「「C99 での 関 数 の イ ン ラ イ ン 展 開 」」 のよ うに 同 じものが 使 用 されます。--multifile または --ltcg を 使 用 し て コ ンパ イルする 場 合 、 あ る 変 換 単 位 での呼 び 出 し が 別 の 変 換 単 位 の 外 部 定 義 を 使 用 し て イ ン ラ イ ン 展 開 さ れる こ と があります。C99 ではイ ン ラ イ ン 定 義 にい く つかの 制 限 があ り ます。 変 更 可 能 な ローカルのス タ テ ィ ッ ク オブジェ ク ト は 定 義 でき ません。 また 静 的 リ ンケージでは 識 別子 の 参 照 ができ ません。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-25ID 100419Non-Confidential,


コーディング 慣 行C99 モード では、 その 他 のモード と 同 様 に、 __inline と inline は 同 一 です。静 的 リ ン ケージ を 含 むイ ン ラ イ ン 関 数 の C99 での 動 作 は C++ と 同 じです。GNU C90 モードインライン 展 開 に 関 する GNU C90 の 規 則 は 他 のコ ンパイ ラモード での 規 則 とは 異 な り ます。 http://gcc.gnu.org にある GNU ドキュメントを 参 照 して 下 さい。5.4.6 リンカのインライン 展 開リ ンカは 非 常 に 短 い 関 数 呼 び 出 し を 関 数 の 本 体 に 置 き 換 え る こ と がで き ます。『リンカリファレンスガイド』 の 「--[no_]inline」 (ページ 2-32) を 参 照して 下 さい。5.4.7 データ と --no_inline および --inline コマンドラインオプションのデバッグ一 般 的 に、 イ ン ラ イ ン 関 数 の 使 用 によ り 生 成 されるデバッ グビ ューに 問 題 はありませんが、 イ ン ラ イ ン 展 開 されない 方 がデバッ グ しやすい 場 合 があ り 、そのよ う な 場 合 はインラ イン 関 数 を 避 ける こ とが 望 まれます。 関 数 の イ ン ライ ン 展 開 を 有 効 ま たは 無 効 にする には、 --no_inline および --inline コマンドラインオプションを 使 用 します。 『コンパイ ラ リ ファレンスガイ ド』 の「--inline, --no_inline」 (ページ 2-83) を 参 照 して 下 さい。5.4.8 関 数 の static 化最 適 化 レベル -O2 および -O3 の 場 合 、 コ ンパイ ラは、 関 数 が __inline またはinline と し て 宣 言 さ れていない 場 合 で も、 関 数 を イ ン ラ イ ン 展 開 する こ と が実 際 的 であれば、 自 動 的 に 関 数 を イ ン ラ イ ン 展 開 で き ます。注高 度 な 最 適 化 レベルにおけ る 関 数 の 自 動 イ ン ラ イ ン 展 開 を 制 御 するには、--no_autoinline および --autoinline コマンド ラインオプショ ンを 使 用 します。5-26 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行関 数 が static (または __inline) と して 明 示 的 に 宣 言 されていない 限 り、 コンパ イ ラ は、 他 のモジ ュールか ら 呼 び 出 さ れた 場 合 に 備 え、 関 数 のア ウ ト オブラインバージョンを 保 持 する 必 要 があります。 以 下 のいずれかの 方 法 を 使 用し て 未 使 用 のア ウ ト オブ ラ イ ン 関 数 が 独 自 のセ ク シ ョ ンに 配 置 さ れない 場 合 、リ ンカはこれらの 関 数 をオブジェ ク ト から 削 除 でき ません。• 『コンパイ ラ リ ファレンスガイ ド』 の 「--split_sections」 (ページ2-132)• 『コンパイ ラ リ ファレンスガイ ド』 の「__attribute__((section("name")))」 (ページ 4-57)• 『コンパイ ラ リ ファレンスガイ ド』 の 「#pragma arm section[section_sort_list]」 (ページ 4-63)• リンカのフィードバックモジ ュールの 外 部 か ら 呼 び 出 さ れない 関 数 を static として 宣 言 しなかった 場合 、 コー ド が 悪 影 響 を 受 け る こ と があ り ます。 具 体 的 には 以 下 のデ メ リ ッ トが 挙 げられます。• コードサイズの 拡 大 ( 関 数 のアウ ト オブラ インバージ ョ ンはイ メージ 内に 保 持 される ため)。関 数 が 自 動 的 に イ ン ラ イ ン 展 開 さ れる と 、 関 数 が static として 宣 言 されていなければ、 そのイ ン ラ イ ンバージ ョ ン と ア ウ ト オブ ラ イ ンバージ ョンの 両 方 が 最 終 イ メ ージに 含 まれる 可 能 性 があ り ます。 これは、 コードサイズ 増 大 の 原 因 になる 場 合 があり ます。• 無 駄 に 複 雑 化 し たデバ ッ グ ビ ュー ( 関 数 の イ ン ラ イ ンバージ ョ ン と ア ウト オブ ラ イ ンバージ ョ ンの 両 方 が 表 示 さ れる ため)関 数 のインラインコピーとアウトオブラインコピーの 両 方 をコード 内 に保 持 する と 、 ブレー ク ポ イ ン ト の 設 定 時 ま たはデバ ッ グ ビ ューでのシングルステ ッ プ 実 行 時 に 混 乱 を 招 きかねません。 デバ ッ ガは、 ユーザが イン ラ イ ンバージ ョ ン と ア ウ ト オブ ラ イ ンバージ ョ ンのいずれかを ス テ ップ 実 行 する 際 に 何 が 起 こっているかを 確 認 できるように、 インターリーブされたソースビューでインラインバージョンとアウ トオブラインバージ ョ ンの 両 方 を 表 示 する 必 要 があ り ます。このよ うな 問 題 のため、 別 のモジュールから 呼 び 出 されるこ とが 決 してないと 確 信 できる 非 インライン 関 数 については、static と し て 宣 言 する こ と が 重要 です。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-27ID 100419Non-Confidential,


コーディング 慣 行5.4.9 ROM イ メ ージのイ ン ラ イ ン 関 数 へのブ レークポイ ン ト の 設 定イ ン ラ イ ン 関 数 にブレー ク ポ イ ン ト を 設 定 する と 、 <strong>RealView</strong> Debugger はその関 数 のインライン 展 開 したインスタンスごとにブレークポイントを 設 定 しようとします。 <strong>RealView</strong> ICE を 使 用 して ROM イ メージをデバッグするときに、インライン 展 開 されたインスタンス 数 が 使 用 可 能 なハードウェアブレークポイン ト の 数 を 上 回 っている 場 合 、 デバッガはそれ 以 上 ブレークポイン ト を 設定 でき ない こ と があ り ます。 この 場 合 、 デバッガはエラーを 返 します。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の 「--autoinline,--no_autoinline」 (ページ 2-19)• 『コンパイラ リ ファレンスガイ ド』 の 「--forceinline」 (ページ2-66)• 『コンパイ ラ リ ファレンスガイ ド』 の 「--inline, --no_inline」(ページ 2-83)• 『コンパイ ラ リ ファレンスガイ ド』 の 「__forceinline」 (ページ 4-7)• 『コンパイ ラ リ ファレンスガイ ド』 の 「__inline」 (ページ 4-10)5-28 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行5.5 デー タの 境 界 整 列使 用 可 能 な ス ト レージを 最 大 に し、 <strong>ARM</strong> 命 令 セ ッ ト に よ る 高 速 で 効 率 的 な メモ リ ア ク セス を 実 現 する ために、 さ ま ざ ま な C データ 型 が 特 定 のバイ ト 境 界で 整 列 されます。 例 えば、 4 の 倍 数 のア ド レ スにオブジェ ク ト が 保 存 されている 場 合 、 すなわち 4 バイトオブジェクトが 4 バイ ト 境 界 に 配 置 されている 場合 、 <strong>ARM</strong> アーキテクチャは 1 つの 命 令 を 使 用 するだけで 4 バイ ト 変 数 にアクセスできます。デフォル ト では、 表 5-9 に 示 すよ う に、 コ ンパイ ラがデータオブジェ ク ト を保 存 し ます。表 5-9 コ ンパイ ラがバイ ト 境 界 整 列 によ り 、 デー タ オブジ ェ ク ト を 保 存 し ます型 バイ ト 境 界 整 列char 1 任 意 のバイ ト ア ド レ スに 配 置 さ れます。short 2 2 の 倍 数 のア ド レ スに 配 置 されます。float, int,long,pointerlong longdouble4 4 の 倍 数 のア ド レ スに 配 置 されます。8 4 の 倍 数 のア ド レ スに 配 置 されます。データ の 境 界 整 列 は、 コ ンパ イ ラ が 変 数 を 物 理 メ モ リ ア ド レ スに 配 置 する 場合 に 関 係 し て き ます。 例 えば、 次 の 構 造 体 では、 bmem と cmem の 間 に 3 バイ トの間 隔 が 必 要 です。struct example_st {int amem;char bmem;int cmem;};<strong>ARM</strong> と Thumb の 処 理 では、 自 然 境 界 整 列 データ、 つま り 、 4 の 倍 数 と な る アドレス 上 に 存 在 するダブルワード、4 の 倍 数 と な る ア ド レ ス 上 に 存 在 するワード、 2 の 倍 数 と な る ア ド レ ス 上 に 存 在 するハーフ ワー ド 、 および 任 意 のバイ ト ア ド レ ス 上 に 存 在 するシングルバイ ト に 効 率 的 にア ク セスでき る よ うに 設 計 されています。 これら のデータは、 データ 自 身 と 同 じ サ イ ズの 境 界 上に 配 置 されます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-29ID 100419Non-Confidential,


コーディング 慣 行5.5.1 デー タ 境 界 整 列 の 種 類メ モ リ 内 のデータへのア ク セスはすべて、 以 下 のカテゴ リ に 分 類 でき ます。• 自 然 境 界 整 列 (0x1000 の ワー ド 境 界 上 な ど)。 通 常 、 <strong>ARM</strong> コンパイラは、 LDR 命 令 と STR 命 令 を 使 用 し て 変 数 に 効 率 的 にア ク セスで き る よ うに、 こ れら の 変 数 を 境 界 整 列 し、 構 造 体 にパデ ィ ングを 挿 入 し ます。• 既 知 の 非 自 然 境 界 整 列 (ア ド レ ス 0x1001 のワードなど)。 このタイプの境 界 整 列 は、 一 般 的 に、 不 要 なパデ ィ ングを 除 去 する ために 構 造 体 がパ ッ ク さ れてい る 場 合 に 生 じ ます。 C および C++ では、 構 造 体 がパッ クされているこ とを 示 すために __packed 修 飾 子 ま たは #pragma pack(n) プラグマが 使 用 されます。• 不 明 な 境 界 整 列 ( 任 意 のア ド レ スのワー ド な ど)。 こ の タ イ プの 境 界 整列 は、 参 照 先 ワー ド のア ド レ スが 任 意 のポ イ ン タ を 定 義 する 際 に 一 般 的に 生 じ ます。 C および C++ では、 ポ イ ン タ が 自 然 境 界 整 列 以 外 の 境 界 上にあるワードにアクセスでき る こ と を 示 すために、 __packed 修 飾 子 ま たは #pragma pack(n) プラグマが 使 用 されます。__packed 修 飾 子 、 パ ッ ク 構 造 体 、 および 非 境 界 整 列 型 ポ イ ン タ の 詳 細 については、 「__packed 修 飾 子 と 非 境 界 整 列 型 のデータ ア ク セス」 (ページ 5-31) を参 照 し て 下 さ い。#pragma pack(n) の 詳 細 については、 『コンパイ ラ リ ファレンスガイ ド』 の「#pragma pack(n)」 (ページ 4-73) を 参 照 して 下 さい。5.5.2 非 境 界 整 列 デー タ ア ク セス命 令 を 使 用 し て メ モ リ 内 の 非 境 界 整 列 データ に 直 接 ア ク セスで き る CISCアーキテ ク チャ か ら レガシーコー ド を 移 植 する 場 合 な ど、 メ モ リ 内 の 非 境 界整 列 データ にア ク セスする こ と が 必 要 と な る 場 合 があ り ます。<strong>ARM</strong>v4 アーキテクチャ、 <strong>ARM</strong>v5 アーキテクチャ、 および <strong>ARM</strong>v6 アーキテクチャ ( 一 部 の 設 定 ) では、 メ モ リ 内 の 非 境 界 整 列 データ にア ク セスする 際 に、予 期 し ない 結 果 が 返 さ れない よ う に 注 意 が 必 要 です。 例 えば、 C または C++の ソース コー ド 内 のワー ド を 読 み 出 すために 従 来 のポ イ ン タ を 使 用 する 場 合 、<strong>ARM</strong> コンパイラは、LDR 命 令 を 使 用 してそのワード を 読 み 出 すアセンブ リ 言語 コードを 生 成 します。 こ の 命 令 は、 ア ド レ スが 4 の 倍 数 であ る 場 合 ( 例 えばワー ド 境 界 上 にあ る 場 合 ) には、 期 待 どお り に 実 行 さ れます。 しかし、 アドレスが 4 の 倍 数 でない 場 合 、 LDR では 本 来 の 非 境 界 整 列 ワードのロードが 実 行されず、 ローテート された 結 果 が 返 されます。 通 常 、 こ の ローテー ト はプ ログ ラ マの 予 想 に 反 する 処 理 です。5-30 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行<strong>ARM</strong>v6 以 降 のアーキテ ク チ ャ では、 非 境 界 整 列 ア ク セスは 完 全 にサポー ト されています。5.5.3 __packed 修 飾 子 と 非 境 界 整 列 型 のデー タ ア ク セス__packed 修 飾 子 を 指 定 する と 、 すべての 有 効 な 型 の 境 界 整 列 が 1 に 設 定 されます。 こ れに よ り 、 非 境 界 整 列 型 ア ク セス を 使 用 し て、 パ ッ ク 型 オブジ ェ ク トの 読 み 出 し と 書 き 込 みを 行 え る よ う にな り ます。パックできるオブジェク トの 例 は 以 下 のとおりです。• 構 造 体• 共 用 体• ポインタ__packed 修 飾 子 の 詳 細 については、 『コンパイ ラ リ ファレンスガイ ド』 の「__packed」 (ページ 4-12) を 参 照 して 下 さい。構 造 体 に 含 まれる 非 境 界 整 列 型 フ ィ ール ド効 率 性 を 高 め る ため、 構 造 体 内 のフ ィ ール ド は、 データ 自 身 と 同 じ サ イ ズの境 界 上 に 配 置 さ れます。 そのため、 多 く の 場 合 、 コ ンパ イ ラ では、 フ ィ ールド を 境 界 整 列 する ために、 フ ィ ール ド 間 にパデ ィ ングが 挿 入 さ れます。容 量 が 重 視 さ れる 場 合 は、 __packed 修 飾 子 を 使 用 し て、 フ ィ ール ド 間 にパデ ィングが 挿 入 されていない 構 造 体 を 作 成 できます。 構 造 体 は 次 の 2 とおりの 方 法でパッ クでき ます。• struct 全 体 を __packed として 宣 言 できます。 以 下 に 例 を 示 し ます。__packed struct mystruct{char c;short s;} // not recommended構 造 体 の 各 フ ィ ール ド は、 __packed 修 飾 子 を 継 承 し ます。通 常 、 struct 全 体 を __packed と し て 宣 言 する と 、 コー ド サ イ ズが 増 大 するだけでなく、 パフォーマンスも 低 下 します。 詳 細 については、 「パ ック 構 造 体 と 個 別 パッ クフ ィールド」 (ページ 5-33) を 参 照 して 下 さい。• struct 内 の 個 々の 非 境 界 整 列 型 フ ィ ール ド は、 __packed として 宣 言 できます。 以 下 に 例 を 示 し ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-31ID 100419Non-Confidential,


コーディング 慣 行struct mystruct{char c;__packed short s; // recommended}こ れは、 構 造 体 をパ ッ クする 際 に 推 奨 さ れる 方 法 です。 「パ ッ ク 構 造 体と 個 別 パックフィールド」 (ページ 5-33) を 参 照 して 下 さい。注同 じ 原 則 が 共 用 体 に も 当 てはま り ます。 共 用 体 全 体 を __packed と し て 宣 言 するか、 __packed 属 性 を 使 用 する と 、 メ モ リ 内 で 境 界 整 列 さ れていない 共 用 体 の 要素 を 識 別 できます。__packed で 修 飾 さ れた 構 造 体 の 読 み 出 し と 書 き 込 みを 行 う には、 非 境 界 整 列型 ア ク セスが 必 要 であ る ため、 パフ ォーマン スが 低 下 する 可 能 性 があ り ます。詳 細 については、 「パ ッ ク 構 造 体 と 個 別 パ ッ ク フ ィ ール ド 」 (ページ 5-33) を参 照 し て 下 さ い。非 境 界 整 列 型 ポイ ン タデフォル ト で、 <strong>ARM</strong> コンパイラは、 境 界 整 列 されたメモリ 内 のワードへの Cポインタを 期 待 し ます。 この 方 がコンパイ ラは 効 率 的 なコード を 生 成 でき るためです。任 意 のア ド レ スにあ る ワー ド を 参 照 で き る ポ イ ン タ を 定 義 する には、 ポ イ ンタを 定 義 するときに、__packed 修 飾 子 を 使 用 し て こ の こ と を 指 定 する 必 要 があります。 以 下 に 例 を 示 し ます。__packed int *pi; // pointer to unaligned intポインタが __packed と し て 宣 言 さ れてい る 場 合 、 <strong>ARM</strong> コンパイラは、 ポインタ の 境 界 整 列 にかかわ らず、 その 被 参 照 値 に 正 し く ア ク セスする ための コードを 生 成 します。 生 成 さ れた コー ド は、 一 連 のバイ ト ア ク セスで 構 成 さ れるか、 単 純 な LDR 命 令 ではな く 変 数 の 境 界 整 列 に 依 存 する シフ ト 命 令 と マス ク命 令 で 構 成 さ れます。 その 結 果 、 ポインタを __packed と し て 宣 言 する と 、 パフ ォーマン スが 低 下 するだけでな く 、 コー ド サ イ ズ も 増 大 し ます。5-32 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行ハーフワー ド にア ク セスするための 非 境 界 整 列 型 LDR 命 令状 況 に よ っては、 非 境 界 整 列 型 LDR 命 令 がコ ンパ イ ラ に よ って 意 図 的 に 生 成される 場 合 があり ます。 特 に、 ハーフ ワード を ロードする ための 専 用 の 命 令がアーキテクチャでサポー ト されている 場 合 でも、 このよ う にして メモ リ からハーフワードをロードする 場 合 があり ます。例 えば、 __packed 構 造 体 内 の 非 境 界 整 列 型 short にア ク セ スする 場 合 、 コ ンパイ ラ は 必 要 なハーフ ワー ド を レ ジ ス タ の 上 位 半 分 に ロー ド し、 その 後 で 下 位半 分 にシフ ト し ます。 この 処 理 には 1 回 の メ モ リ ア ク セス しか 必 要 と な ら ないのに 対 し、 LDRB 命 令 を 使 用 して 同 じ 処 理 を 行 う 場 合 には、 2 回 の メ モ リ ア ク セスに 加 え、 2 バ イ ト をマージする 命 令 が 必 要 と な り ます。5.5.4 パ ッ ク 構 造 体 と 個 別 パ ッ ク フ ィ ール ドパックされた struct を 最 適 化 する 場 合 、 コ ンパイ ラ は、 各 フ ィ ール ド の 境 界整 列 を 推 測 し て、 ア ク セ ス 効 率 の 向 上 を 図 り ます。 ただし、 コンパイ ラが__packed struct 内 の 各 フ ィ ール ド の 境 界 整 列 をいつも 推 測 で き る と は 限 り ません。 一 方 、 struct 内 の 個 々のフ ィ ール ド が __packed として 宣 言 されている 場 合は、 struct 内 の 自 然 境 界 整 列 型 メ ンバへの 高 速 ア ク セスが 保 証 さ れています。そのため、 パ ッ ク 構 造 体 の 使 用 が 必 要 な 場 合 は、 構 造 体 自 体 をパ ッ クする のではな く 、 必 ず 構 造 体 の 個 々のフ ィ ール ド をパ ッ ク し て 下 さ い。注struct の 個 々の 非 境 界 整 列 フ ィ ール ド を __packed と し て 宣 言 する と 、 struct のどのフ ィ ール ド が 非 境 界 整 列 型 であ る かをプ ロ グ ラ マに 明 示 で き る と い う メリットもあります。表 5-10 (ページ 5-34) は、 struct をパッ ク しなかった 場 合 、 struct 全 体 をパ ック し た 場 合 、 および struct の 個 々のフ ィ ール ド をパッ ク し た 場 合 のそれぞれの 違 いを、 struct の 3 種 類 の 実 装 で 示 し た も のです。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-33ID 100419Non-Confidential,


コーディング 慣 行最 初 の 実 装 では、 struct がパッ ク されていません。 2 番 目 の 実 装 では、 構 造 体mystruct の 全 体 が __packed として 修 飾 されています。 3 番 目 の 実 装 では、__packed 属 性 が mystruct 構 造 体 か ら 削 除 さ れ、 個 々の 非 境 界 整 列 フ ィ ール ド が__packed として 宣 言 されています。表 5-10 パックされていない struct、 パックされた struct、 および 個 々のフ ィ ール ドがパ ッ ク された struct を 表 す C コードパックされていないstructstruct foo{char one;short two;char three;int four;} c;パックされた struct__packed struct foo{char one;short two;char three;int four;} c;パックされたフ ィールドstruct foo{char one;__packed short two;char three;int four;} c;表 5-11 (ページ 5-35) は、 コ ンパイ ラ によ って 生 成 されたマシン コー ド が表 5-10 の 各 実 装 例 でどのよ う に 逆 アセンブルされるかを 示 し た ものです。 いずれの 実 装 の C コード も、 オプシ ョ ン -O2 を 使 用 してコンパイルされています。注非 境 界 整 列 要 素 へのア ク セス を イ ン ラ イ ン と 関 数 呼 び 出 し のど ち ら で 行 う かは、 -Ospace および -Otime の 各 コ ンパ イ ラ オプシ ョ ンに よ って 制 御 さ れます。-Otime を 使 用 する と 、 イ ン ラ イ ンの 非 境 界 整 列 ア ク セスが 行 われ、 -Ospace を使 用 する と 、 関 数 呼 び 出 し に よ る 非 境 界 整 列 ア ク セスが 行 われます。5-34 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行表 5-11 パックされていない struct、 パックされた struct、 および 個 々のフ ィ ール ドがパ ッ ク された struct を 表 す 逆 アセンブリ コードパックされていないstruct; r0 contains address of c; char oneLDRB r1, [r0, #0]; short twoLDRSH r2, [r0, #2]; char threeLDRB r3, [r0, #4]; int fourLDR r12, [r0, #8]パックされた struct; r0 contains address of c; char oneLDRB r1, [r0, #0]; short twoLDRB r2, [r0, #1]LDRSB r12, [r0, #2]ORR r2, r12, r2, LSL #8; char threeLDRB r3, [r0, #3]; int fourADD r0, r0, #4BL __aeabi_uread4パックされたフ ィールド; r0 contains address of c; char oneLDRB r1, [r0, #0]; short twoLDRB r2, [r0, #1]LDRSB r12, [r0, #2]ORR r2, r12, r2, LSL #8; char threeLDRB r3, [r0, #3]; int fourLDR r12, [r0, #4]表 5-11 に 示 すパッ ク されていない struct の 逆 アセンブ リ の 場 合 、 コ ンパイ ラは、 境 界 整 列 型 ワー ド ま たはハーフ ワー ド のア ド レ ス 上 にあ るデータ に 必 ずアクセスします。 コンパイラがこれを 行 う ことができるのは、struct の 全 メ ンバがデータ 自 身 と 同 じ サ イ ズの 境 界 上 に 配 置 さ れる よ う に、 struct にパッ ドが 挿 入 されている ためです。表 5-11 に 示 す __packed struct の 逆 アセンブ リ では、フ ィ ール ド one と three は、データ 自 身 と 同 じ サ イ ズの 境 界 にデフ ォル ト で 境 界 整 列 さ れてい る ので、 コンパイ ラ は 境 界 整 列 型 ア ク セス を 行 います。 コンパイラは、 境 界 整 列 されてい る こ と が 識 別 で き る フ ィ ール ド に 対 し て、 境 界 整 列 型 のワー ド ア ク セス またはハーフ ワー ド ア ク セス を 必 ず 実 行 し ます。 非 境 界 整 列 型 フ ィ ール ド two に対 し ては、 複 数 の 境 界 整 列 メ モ リ ア ク セス (LDR/STR/LDM/STM) を 特 定 のシフ ト命 令 およびマス ク 命 令 と 組 み 合 わせて 使 用 し、 メ モ リ 内 の 正 し いバイ ト にアクセスします。 コ ンパイ ラは、 フ ィ ール ド がデータ 自 身 と 同 じサイ ズの 境 界上 にあ る かど う かを 判 定 で き ないので、 不 明 な 境 界 整 列 の 符 号 な し ワー ド を読 み 出 すための AEABI ランタイムルーチン __aeabi_uread4 を 呼 び 出 して、フィールド four にアクセスします。表 5-11 に 示 す、 フ ィ ール ド が 個 々にパ ッ ク さ れた struct の 逆 アセンブ リ では、 struct 全 体 が __packed として 修 飾 されている 場 合 と 同 様 に、 フィールドone、 two、 および three がアクセス されます。 しかし、struct 全 体 がパ ッ ク さ れる 場 合 と 異 な り 、 構 造 体 内 の __packed short の 存 在 に 基 づいてフ ィ ール ド fourがデータ 自 身 と 同 じ サ イ ズの 境 界 上 にあ る こ と を 判 定 で き る ので、 コ ンパイラはフィールド four に 対 し て ワー ド 境 界 整 列 型 のア ク セス を 行 います。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-35ID 100419Non-Confidential,


コーディング 慣 行5.6 浮 動 小 数 点 演 算 の 使 用<strong>ARM</strong> コ ンパイ ラ には、 ソ フ ト ウ ェ ア と ハー ド ウ ェ アの 両 方 で 浮 動 小 数 点 演 算を 管 理 する ための 機 能 が 多 く 用 意 さ れています。 例 えば、 ソ フ ト ウ ェアまたはハー ド ウ ェ アの 浮 動 小 数 点 サポー ト 、 特 定 のハー ド ウ ェ アアーキテ ク チ ャ、IEEE 浮 動 小 数 点 規 格 の 準 拠 レベルな ど を 指 定 で き ます。浮 動 小 数 点 オプシ ョ ン を 選 択 する と 、 浮 動 小 数 点 パフ ォーマン ス、 シ ス テムコ ス ト 、 およびシステムの 柔 軟 性 の 間 でさ まざまな 釣 り 合 いを と る こ と ができます。 パフ ォーマン ス、 コ ス ト 、 および 柔 軟 性 の 間 で 最 良 の ト レー ド オフを と る には、 適 切 な 浮 動 小 数 点 オプシ ョ ン を 選 択 する 必 要 があ り ます。5.6.1 浮 動 小 数 点 演 算 のサポー ト<strong>ARM</strong> プロセッサコアには、 浮 動 小 数 点 ハード ウェアが 含 まれていません。 浮動 小 数 点 演 算 は、 以 下 の よ う に 別 途 サポー ト する 必 要 があ り ます。• ソ フ ト ウ ェ アでは、 浮 動 小 数 点 ラ イ ブ ラ リ fplib を 使 用 し ます。 このライ ブ ラ リ には、 追 加 のハー ド ウ ェ ア を 使 用 する こ と な く 、 浮 動 小 数 点 演算 を 実 行 する ために 呼 び 出 すこ と がで き る 関 数 が 含 まれています。 『ライブラ リガイド』 の 「ソ フ ト ウ ェ ア 浮 動 小 数 点 ラ イ ブ ラ リ fplib」 (ページ 4-2) を 参 照 して 下 さい。• ハー ド ウ ェ アでは、 <strong>ARM</strong> プロセッサコアに 含 まれるハードウェア VFPコ プ ロ セ ッ サを 使 用 し て、 必 要 な 浮 動 小 数 点 演 算 を 実 行 し ます。 VFPは、 IEEE 浮 動 小 数 点 を 実 装 する コ プ ロ セ ッ サアーキテ ク チャ であ り 、単 精 度 と 倍 精 度 をサポー ト し ますが、 拡 張 精 度 には 対 応 し ていません。注実 践 では、 VFP の 浮 動 小 数 点 演 算 を 実 行 する ために、 一 般 的 な 事 例 を 処理 するハー ド ウ ェ ア、 通 常 外 の 事 例 および 例 外 を 起 こす 事 例 を 処 理 するソ フ ト ウ ェ アの 組 み 合 わせで 実 装 さ れています。 詳 細 については、 「VFPサポー ト 」 (ページ 5-39) を 参 照 して 下 さい。ソ フ ト ウ ェ ア と ハー ド ウ ェ アの 浮 動 小 数 点 演 算 サポー ト の 違 いは、 例 5-2(ページ 5-37) に 示 す と お り です。 こ の 例 では、 浮 動 小 数 点 演 算 を C で 実 行 する 関 数 が 使 用 されています。5-36 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行例 5-2 浮 動 小 数 点 演 算float foo(float num1, float num2){float temp, temp2;temp = num1 + num2;temp2 = num2 * num2;return temp2-temp;}例 5-2 の C コードがコマンド ラ インオプシ ョ ン --cpu 5TE --fpu softvfp と 組 み合 わされる と、 コ ンパイ ラは 例 5-3 の 逆 アセンブ リ を 使 用 し てマシン コードを 生 成 し ます。 この 例 では、__aeabi_fmul などのライブラ リルーチンを 呼 び 出し て、 浮 動 小 数 点 演 算 が ソ フ ト ウ ェ アで 実 行 さ れます。例 5-3 ソ フ ト ウ ェ アによ る 浮 動 小 数 点 演 算 のサポー ト||foo|| PROCPUSHMOVBLMOVMOVMOVBLMOVPOPBENDP{r4-r6, lr}r4, r1__aeabi_faddr5, r0r1, r4r0, r4__aeabi_fmulr1, r5{r4-r6, lr}__aeabi_fsub例 5-2 の C コードがコマンド ラ インオプシ ョ ン --fpu vfp と 組 み 合 わされると、コンパイラは 例 5-4 の 逆 アセンブ リ を 使 用 し てマシン コー ド を 生 成 し ます。この 例 では、VMUL.F32 な どの 浮 動 小 数 点 演 算 命 令 を 使 用 し て、 浮 動 小 数 点 演 算がハード ウ ェアで 実 行 されます。例 5-4 ハー ド ウ ェ アによ る 浮 動 小 数 点 演 算 のサポー ト||foo|| PROCVADD.F32 s2, s0, s1VMUL.F32 s0, s1, s1<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-37ID 100419Non-Confidential,


コーディング 慣 行VSUB.F32 s0, s0, s2BX lrENDP実 践 では、 浮 動 小 数 点 演 算 にハー ド ウ ェ アサポー ト を 利 用 する コー ド の 方 が、ソ フ ト ウ ェ アで 浮 動 小 数 点 演 算 を 行 う コー ド よ り 小 型 であ り 、 パフ ォーマンスも 優 れています。 ただ し、 浮 動 小 数 点 演 算 のハー ド ウ ェ アサポー ト を 利 用するには、 VFP コプロセッサが 必 要 です。デフォル ト では、 VFP コプロセッサが 存 在 する 場 合 、 VFP 命 令 が 生 成 さ れます。 VFP コプロセッサが 存 在 しない 場 合 、 コンパイラはソフ ト ウェア 浮 動 小数 点 ラ イ ブ ラ リ fplib を 呼 び 出 すコー ド を 生 成 し て 浮 動 小 数 点 演 算 を 実 行 し ます。 fplib は、 <strong>RealView</strong> Development Suite の 標 準 配 布 パ ッ ケージの C ライブラリに 含 まれています。5.6.2 VFP アーキテクチャVFP は、 単 精 度 と 倍 精 度 の 両 方 の 演 算 をサポー ト する、 浮 動 小 数 点 アーキテクチャです。 多 く の 演 算 がス カ ラ 形 式 とベク タ 形 式 のいずれで も 実 行 でき ます。 こ のアーキテ ク チャ の 複 数 のバージ ョ ンがサポー ト さ れています。 以 下はその 例 です。• VFPv2 は 以 下 で 実 装 されています。— VFP10 リビジョン 1 (<strong>ARM</strong>10200E に よ っ て 提 供 )— VFP9-S (<strong>ARM</strong>926E/946E/966E の 別 ラ イセン スオプシ ョ ン と し て 入手 可 能 )— VFP11 (<strong>ARM</strong>1136JF-S、 <strong>ARM</strong>1176JZF-S、 および <strong>ARM</strong>11 MPCoreに 付 属 )• VFPv3 は、 Cortex-A8 など、 <strong>ARM</strong> アーキテクチャバージ ョ ン 7 以 降 で 実装 されています。 VFPv3 は、 浮 動 小 数 点 の 例 外 を ト ラ ッ プで き ない こ とを 除 いては、 VFPv2 と 下 位 互 換 性 があ り ます。 ソフトウェアサポートコー ド は 一 切 不 要 です。 VFPv3 には 32 ビッ ト 倍 精 度 レジスタが 備 わっています。• VFPv3 は 半 精 度 拡 張 機 能 に よ り 拡 張 さ れます (オプシ ョ ン)。 これらの拡 張 機 能 は 半 精 度 浮 動 小 数 点 数 と 単 精 度 浮 動 小 数 点 数 間 の 双 方 向 の 変 換を 行 います。 単 精 度 浮 動 小 数 点 数 をサポー ト し てい るすべての AdvancedSIMD および VFP で 実 装 でき ます。5-38 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行• VFPv3-D16 は 16 ビッ ト 倍 精 度 レジスタを 備 えた VFPv3 の 実 装 です。 これは NEON を 使 用 せずに VFP をサポート している <strong>ARM</strong> アーキテクチャv7 プ ロ セ ッ サで 実 装 さ れます。• VFPv3U は、 浮 動 小 数 点 例 外 の ト ラ ッ プが 可 能 な VFPv3 の 実 装 の 1 つです。 ソ フ ト ウ ェ アサポー ト コー ド が 必 要 と な り ます。注VFP アーキテ ク チャ の 一 部 の 実 装 では、 実 装 に 固 有 の 追 加 機 能 が 提 供 さ れる場 合 があ り ます。 例 えば、 VFP コプロセッサハードウェアには、 例 外 条 件 を記 述 する ための 追 加 のレ ジ ス タ が 含 まれてい る こ と があ り ます。 こ の 追 加 機能 は、 サブアーキテクチャ 機 能 と 呼 ばれます。 サブアーキテ クチャ 機 能 の 詳細 については、 『<strong>ARM</strong> Application Note 133 - Using VFP with RVDS』 を 参 照 して下 さい。 このアプリケーショ ンノートは、install_directory\RVDS\Examples\...\vfpsupport にある <strong>RealView</strong> DevelopmentSuite 配 布 パ ッ ケージの Examples ディレク ト リ 内 、vfpsupport サブディ レ ク ト リにあ り ます。5.6.3 VFP サポー ト<strong>ARM</strong> VFP コ プ ロ セ ッ サは、 明 確 に 定 義 さ れた 浮 動 小 数 点 コー ド をハー ド ウ ェアで 処 理 する よ う に 最 適 化 さ れています。 発 生 頻 度 が 極 度 に 低 い 演 算 や 複 雑すぎる 演 算 は、 ハード ウ ェアで 処 理 されません。 このよ うな 場 合 は、 代 わりに ソ フ ト ウ ェ アで 処 理 する 必 要 があ り ます。 こ うすることにより、 必 要 なコプ ロ セ ッ サハー ド ウ ェ アの 量 を 最 小 限 に し、 コ ス ト を 削 減 で き ます。VFP ハー ド ウ ェ アが 対 応 し ていない 事 例 を 処 理 する ための コー ド は、 VFP サポー ト コード と 呼 ばれます。 VFP ハー ド ウ ェ アが 直 接 処 理 で き ない 状 況 においては、 VFP サポー ト コー ド に 処 理 が 引 き 継 がれます。 例 えば、 VFP サポート コー ド は、 以 下 の 項 目 を 処 理 する ために 呼 び 出 さ れる 場 合 があ り ます。• NaN ( 非 数 ) を 伴 う 浮 動 小 数 点 演 算• 非 正 規 数 を 伴 う 浮 動 小 数 点 演 算• 浮 動 小 数 点 オーバーフ ロー• 浮 動 小 数 点 アンダーフ ロー• 不 正 確 な 結 果• ゼ ロ 除 算 エ ラー• 無 効 な 演 算サポー ト コードが 配 置 される と、 IEEE 754 に 完 全 に 準 拠 し た 浮 動 小 数 点 モデルが VFP でサポー ト されます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-39ID 100419Non-Confidential,


コーディング 慣 行VFP サポー ト の 使 用お 使 いのシ ス テムで 使 用 可 能 な VFP サポー ト コードの 実 装 は、 RVCT のインス ト ール 時 に 付 属 し て 提 供 さ れます。 サポー ト コー ド は、 以 下 の 項 目 で 構 成されます。• ハー ド ウ ェ アか ら 戻 さ れた VFP 演 算 をエ ミ ュ レー ト する ための ラ イ ブラリ vfpsupport.l および vfpsupport.b。これらのファイルは、 インス トールした RVCT の \lib\armlib サブディ レクトリにあります。• 最 上 位 レベル、 第 2 レベル、 およびユーザレベルの 割 り 込 みハン ド ラを実 装 する、 C のソースコード とアセンブリ 言 語 のソースコード。これらのファイルは、install_directory\RVDS\Examples\...\vfpsupport にある <strong>RealView</strong> Development Suite 配 布 パ ッ ケージの Examples ディレク ト リ内 、 vfpsupport サブディ レ ク ト リ にあ り ます。VFP サポー ト をオペレーテ ィ ングシステムに 統 合 するには、 これらのファ イルを 変 更 する 必 要 が 生 じる 場 合 があ り ます。• VFP コ プ ロ セ ッ サのサブアーキテ ク チ ャ 機 能 にア ク セ スする ための、 Cのソースコード とアセンブリ 言 語 のソースコード。これらのファイルは、install_directory\RVDS\Examples\...\vfpsupport にある <strong>RealView</strong> Development Suite 配 布 パ ッ ケージの Examples ディレク ト リ内 、 vfpsupport サブディ レ ク ト リ にあ り ます。VFP コ プ ロ セ ッ サに よ って 命 令 がバウ ン ス さ れる と 、 未 定 義 命 令 例 外 がプ ロセ ッ サに 対 し て 通 知 さ れ、 未 定 義 命 令 ベ ク タ を 使 用 し て VFP サポー ト コードの 処 理 が 開 始 されます。 最 上 位 レベル と 第 2 レベルの 割 り 込 みハン ド ラは、 例外 の 原 因 が 無 効 な 命 令 にあ る こ と を 確 認 する な ど、 通 知 の 初 期 処 理 を 実 行 します。 次 に、 ユーザレベルの 割 り 込 みハン ド ラが、 ラ イブラ リ vfpsupport.l または vfpsupport.b の 適 切 な ラ イブラ リ 関 数 を 呼 び 出 し、 ソ フ ト ウ ェ アで VFP演 算 をエ ミ ュ レー ト し ます。注以 下 の 場 合 は、 VFP サポー ト コー ド を 使 用 する 必 要 があ り ません。• 通 常 外 ま たは 例 外 的 な 事 例 の ト ラ ッ プが 不 要 な 場 合• VFP コプロセッサが RunFast モー ド で 動 作 し ている 場 合• ハー ド ウ ェ ア コプ ロ セ ッ サが VFPv3 ベースのシ ス テムであ る 場 合5-40 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行RVCT の イ ン ス ト ールに 付 属 し て 提 供 さ れる VFP サポー ト コードの 使 用 法 の詳 細 については、 『<strong>ARM</strong> Application Note 133 - Using VFP with RVDS』 を 参 照 して 下 さい。 このアプリケーショ ンノートは、install_directory\RVDS\Examples\...\vfpsupport にある <strong>RealView</strong> DevelopmentSuite 配 布 パ ッ ケージの Examples ディレク ト リ 内 、vfpsupport サブディ レ ク ト リにあ り ます。5.6.4 半 精 度 浮 動 小 数 点 数 のサポー ト半 精 度 浮 動 小 数 点 数 は、 VFPv3 アーキテ ク チャ のオプシ ョ ンの 拡 張 機 能 と して 提 供 されています。 VFPv3 コ プ ロ セ ッ サを 使 用 で き ない 場 合 、 ま たは、 この 拡 張 機 能 を 持 たない VFPv3 コ プ ロ セ ッ サを 使 用 し てい る 場 合 は、 浮 動 小 数点 ライブラ リ fplib を 経 由 してサポー ト されます。半 精 度 浮 動 小 数 点 数 は、 fp16_format コマンド ラインオプショ ンを 使 用 して 選択 し た 場 合 にのみ 使 用 で き ます。 『コンパイ ラ リ ファレンスガイ ド』 の「--fp16_format=format」 (ページ 2-67) を 参 照 して 下 さい。使 用 可 能 な 半 精 度 浮 動 小 数 点 形 式 は、 ieee と alternative です。 どちらの 形 式でも、 16 ビ ッ ト 数 値 の 基 本 的 な レ イ ア ウ ト は 同 じ です。 詳 細 については、図 5-1 を 参 照 して 下 さい。15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0S E T各 パラ メ ータには 以 下 の 意 味 があ り ます。図 5-1 半 精 度 浮 動 小 数 点 形 式S (bit[15]):E (bits[14:10]):T (bits[9:0]):Sign bitBiased exponentMantissa.こ れら のフ ィ ール ド の 意 味 は、 選 択 さ れてい る 形 式 に よ り 異 な り ます。IEEE 半 精 度IF E==31:IF T==0: Value = Signed infinityIF T!=0: Value = NanT[9] determines Quiet or Signalling:0: Quiet NaN1: Signalling NaN<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-41ID 100419Non-Confidential,


コーディング 慣 行IF 0


コーディング 慣 行名 前 の 符 号 化半 精 度 データ 型 の C++ の 名 前 の 符 号 化 は、 C++ の 汎 用 ABI で 指 定 し ます。『C++ ABI for the <strong>ARM</strong> Architecture』 を 参 照 して 下 さい。5.6.5 浮 動 小 数 点 の 計 算 と リ ンケージ浮 動 小 数 点 計 算 と 浮 動 小 数 点 リ ンケージの 違 いを 理 解 する こ と が 重 要 です。浮 動 小 数 点 計 算 は、 ハー ド ウ ェ ア コ プ ロ セ ッ サ 命 令 ま たは ラ イ ブ ラ リ 関 数 によって 実 行 されます。 浮 動 小 数 点 リ ンケージは 浮 動 小 数 点 変 数 を 使 用 する 関数 間 で 引 数 を 渡 す 方 法 に 関 与 し ます。浮 動 小 数 点 リ ンケージの 種 類 は 以 下 の と お り です。• ソ フ ト ウ ェ ア 浮 動 小 数 点 リ ンケージ• ハー ド ウ ェ ア 浮 動 小 数 点 リ ンケージソ フ ト ウ ェ ア 浮 動 小 数 点 リ ンケージは、 関 数 のパ ラ メ ータ と 戻 り 値 が r0 ~ r3の <strong>ARM</strong> 整 数 レ ジ ス タおよびス タ ッ ク を 使 用 し て 渡 さ れる こ と を 意 味 し ます。ハー ド ウ ェ ア 浮 動 小 数 点 リ ンケージは、 VFP コプロセッサレジスタを 使 用 して 引 数 と 戻 り 値 を 渡 し ます。 VFP コプロセ ッ サレジス タの 詳 細 については、『<strong>ARM</strong> アーキテ クチャ 向 けプロシージャ コール 標 準 』 (<strong>ARM</strong> IHI0042J) を 参 照して 下 さい。ソ フ ト ウ ェ ア 浮 動 小 数 点 リ ンケージを 使 用 する 利 点 は、 VFP コプロセッサの使 用 にかかわらず、 結 果 のコード を コ アで 実 行 でき る こ と です。 VFP ハー ドウ ェ ア コ プ ロ セ ッ サには 依 存 せず、 VFP コプロセッサの 存 在 にかかわらず 使用 でき ます。ハー ド ウ ェ ア 浮 動 小 数 点 リ ンケージを 使 用 する 利 点 は、 ソ フ ト ウ ェ ア 浮 動 小数 点 リ ンケージ よ り も 効 率 が よ い こ と ですが、VFP コプロセッサが 必 要 です。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-43ID 100419Non-Confidential,


コーディング 慣 行表 5-12 は、 必 要 な 浮 動 小 数 点 リ ンケージの 種 類 と 浮 動 小 数 点 計 算 の 種 類 に 使用 可 能 な コ ンパ イ ラ オプシ ョ ン を 示 し ています。表 5-12 浮 動 小 数 点 リ ンケージ と 浮 動 小 数 点 計 算 のコ ンパイ ラ オプシ ョ ンリンケージ計 算ハー ド ウ ェ ア 浮動 小 数 点 リ ンケージソフトウェア 浮動 小 数 点 リ ンケージハー ド ウ ェ ア 浮動 小 数 点 コ プ ロセッサソフトウェア 浮 動小 数 点 ラ イ ブ ラ リ(fplib)コンパイラオプションいいえ はい いいえ はい --fpu=softvfpいいえ はい はい いいえ --fpu=softvfp+vfpv2--fpu=softvfp+vfpv3--fpu=softvfp+vfpv3_fp16--fpu=softvfp+vfpv3_d16--fpu=softvfp+vfp3_d16_fp16はい いいえ はい いいえ --fpu=vfp--fpu=vfpv2--fpu=vfpv3--fpu=vfpv3_fp16--fpu=vfpv3_dp16--fpu=vfpv3_d16_fp16softvfp は、 ソ フ ト ウ ェ ア 浮 動 小 数 点 リ ンケージを 指 定 し ます。 ソフトウェア浮 動 小 数 点 リ ンケージが 使 用 さ れる 場 合 は、 以 下 のいずれかが 必 要 と な り ます。• 呼 び 出 し 元 関 数 と 呼 び 出 し 先 関 数 は、 --softvfp、 --fpu softvfp+vfpv2、--fpu softvfp+vfpv3、 --fpu softvfp+vfpv3_fp16、 softvfp+vfpv3_d16、 またはsoftvfp+vfpv3_d16_fp16 のいずれかのオプシ ョ ンを 使 用 してコンパイルする 必 要 があ り ます。• __softfp キーワー ド を 使 用 し て、 呼 び 出 し 元 関 数 と 呼 び 出 し 先 関 数 を 宣言 する 必 要 があ り ます。--fpu softvfp、 --fpu softvfp+vfpv2、 --fpu softvfp+vfpv3、 --fpusoftvfp+vfpv3_fp16、 --fpu softvfpv3_d16、 および --fpu softvfpv3_d16_fp16 の 各 オプシ ョ ンは、 フ ァ イル 全 体 の ソ フ ト ウ ェ ア 浮 動 小 数 点 リ ンケージを 指 定 し ます。 一 方 、 __softfp キーワー ド を 使 用 する と 、 関 数 単 位 で ソ フ ト ウ ェ ア 浮 動 小数 点 リ ン ケージ を 指 定 で き ます。5-44 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行注個 別 の コ ンパイ ラ オプシ ョ ン を 使 用 し て 必 要 な 浮 動 小 数 点 リ ンケージの 種 類と 浮 動 小 数 点 計 算 の 種 類 を 選 択 し な く て も、 1 つのコ ンパイ ラオプシ ョ ン--fpu を 使 用 して 両 方 を 一 度 に 選 択 できます ( 表 5-12 (ページ 5-44) を 参照 )。 例 えば、 --fpu=softvfp+vfpv2 は ソフトウェア 浮 動 小 数 点 リ ンケージ、 および 計 算 用 にハー ド ウ ェ ア コプロセッサを 選 択 します。 softvfp を 使 用 した 場 合は、 ソ フ ト ウ ェ ア 浮 動 小 数 点 リ ンケージが 指 定 さ れます。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 『コンパイ ラ リ ファレンスガイ ド』 の 「--fpu=name」 (ページ 2-70)• 『コンパイ ラ リ ファレンスガイ ド』 の 「__softfp」 (ページ 4-17)• 『コンパイ ラ リ ファレンスガイ ド』 の 「#pragma softfp_linkage,#pragma no_softfp_linkage」 (ページ 4-76)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-45ID 100419Non-Confidential,


コーディング 慣 行5.7 ゼロ 除 算 エ ラーの ト ラ ッ プ と 識 別組 み 込 みシステムの 場 合 は 特 に、 ゼロ 除 算 エ ラーを 容 易 に 修 復 でき る と は 限ら ないので、 こ れら のエ ラーを コー ド か ら 除 去 する こ と が 重 要 と な り ます。<strong>ARM</strong> プ ロ セ ッ サ コ アの 場 合 、 ゼ ロ 除 算 エ ラーは 次 のカテゴ リ に 分 類 さ れます。• ゼロによる 整 数 除 算 エラー• (ソ フ ト ウ ェ ア) ゼ ロ に よ る 浮 動 小 数 点 除 算 エ ラーいずれの 場 合 も、 こ れら のエ ラーを ト ラ ッ プ し て 識 別 する ために、 別 々のテクニックが 必 要 となります。5.7.1 整 数 除 算ゼ ロ に よ る 整 数 除 算 エ ラーは、 適 切 な C ライブラリヘルパ 関 数 を 再 実 装 するこ と に よ って ト ラ ッ プおよび 識 別 で き ます。シグナル 関 数 の 使 用 時 、 あ るいは __rt_raise または __aeabi_idiv0 が 再 実 装 されてい る と き にゼ ロ に よ る 除 算 が 発 生 し た 場 合 、 デフ ォル ト では__aeabi_idiv0 が 呼 び 出 されます。 それ 以 外 の 場 合 は、 除 算 関 数 に よ り ゼ ロ が 返されます。__aeabi_idiv0 は、 追 加 の 引 数 DIVBYZERO と 共 に SIGFPE を 生 成 し ます。ゼロ 除 算 エラーのコードでのト ラ ップゼ ロ に よ る 整 数 除 算 エ ラーは 以 下 の 方 法 で ト ラ ッ プで き ます。• C ライブラリヘルパ 関 数 __aeabi_idiv0 を 再 実 装 し て、 ゼ ロ に よ る 除 算 時にゼ ロ な どの 標 準 的 な 結 果 が 返 さ れる よ う に し ます。整 数 除 算 は、 C ライブラリヘルパ 関 数 __aeabi_idiv および __aeabi_uidivを 使 用 してコードに 実 装 されます。 ど ち ら の 関 数 で も ゼ ロ 除 算 の 有 無 がチェッ ク されます。ゼ ロ に よ る 整 数 除 算 が 検 出 さ れる と 、 __aeabi_idiv0 への 分 岐 が 作 成 されます。 そのため、 __aeabi_idiv0 上 にブレー ク ポ イ ン ト を 設 定 するだけで、ゼロ 除 算 を ト ラップできます。AEABI 関 数 __aeabi_idiv、 __aeabi_uidiv、 および __aeabi_idiv0 の 詳 細 については、 『Run-time ABI for the <strong>ARM</strong> Architecture』 を 参 照 して 下 さい。 このドキュメントは http://www.arm.com/products/Dev<strong>Tools</strong>/ABI.html で 入 手 できます。5-46 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行• C ライブラリヘルパ 関 数 __rt_raise を 再 実 装 し て、 シグナルを 処 理 し ます。ゼロによる 整 数 除 算 では、 シグナルが 1 つデフ ォル ト で 発 生 し ます。 ゼロ 除 算 をインターセプトするには、__rt_raise を 再 実 装 し ます。 この 関 数のプロ ト タ イプは 以 下 の とおり です。void __rt_raise(int signal, int type)ゼロ 除 算 エラーが 発 生 すると、__aeabi_idiv0 によって __rt_raise(2, 2) が呼 び 出 さ れます。 そのため、 __rt_raise の 実 装 では、 ゼ ロ 除 算 が 発 生 し たかど うかを 判 断 する 際 に (signal == 2) && (type == 2) をチェ ッ クする 必 要があ り ます。詳 細 については、 以 下 を 参 照 し て 下 さ い。— 『ライブラ リガイ ド』 の 「 整 数 および 浮 動 小 数 点 ヘルパ 関 数 」(ページ 2-30)— 『ライブラ リガイ ド』 の 「C ライブラリの 利 用 」 (ページ 2-32)— 『ライブラ リガイ ド』 の 「エ ラー 通 知 、 エ ラー 処 理 、 プ ロ グ ラ ム 終了 処 理 のカ ス タ マ イ ズ」 (ページ 2-70)— 『ライブラ リガイ ド』 の 「__rt_raise()」 (ページ 2-75)• シグナル 関 数 を 使 用 して、SIGFPE のハン ド ラ を イ ンス ト ールし ます。 この 方 法 はこ こ で 記 述 し た 他 の 方 法 よ り も 移 植 性 があ り ますが、 効 率 は 低下 します。ゼロ 除 算 エ ラーのコー ド での 識 別__aeabi_idiv0 の 呼 び 出 し 時 、 リ ン ク レ ジ ス タ LR には、 アプ リ ケーシ ョ ン コードの __aeabi_uidiv 除 算 ルーチンの 呼 び 出 し の 後 に 命 令 のア ド レ スが 含 まれています。 ソースコードで 問 題 のある 行 を 識 別 するには、LR によって 指 定 されたアド レスにある C コード 行 をデバッガで 参 照 し ます。パラ メータの 検 証パ ラ メ ータ を 検 証 し、 事 後 分 析 デバ ッ グ 用 に 保 存 する には、 __aeabi_idiv0 をトラップします。 __aeabi_idiv0 のすべての 呼 び 出 しに 割 り 込 むには、 $Super$$および $Sub$$ のメカニズムを 使 用 します。$Super$$パッチを 適 用 していない 元 の 関 数 __aeabi_idiv0 を 識 別 するには、__aeabi_idiv0 に 接 頭 辞 $Super$$ を 付 けます。 このパターンを 使 用して、 元 の 関 数 を 直 接 呼 び 出 します。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-47ID 100419Non-Confidential,


コーディング 慣 行$Sub$$__aeabi_idiv0 の 元 のバージ ョ ンの 代 わ り に 呼 び 出 す 新 しい 関 数 を識 別 する には、 __aeabi_idiv0 に 接 頭 辞 $Sub$$ を 付 けます。 このパターンを 使 用 して、 元 の 関 数 __aeabi_idiv0 の 前 または 後 に 処 理を 追 加 し ます。例 5-5 は、 $Super$$ および $Sub$$ のメカニズムを 使 用 して __aeabi_div0 をインターセプ ト する 仕 組 みを 示 し ています。 『リンカユーザガイド』 の 「$Super$$と $Sub$$ を 使 用 したシンボル 定 義 のオーバーラ イ ド」 (ページ 4-16) を 参 照して 下 さい。例 5-5 $Super$$ および $Sub$$ を 使 用 した __aeabi_div0 のインターセプ トextern void $Super$$__aeabi_idiv0(void);/* this function is called instead of the original __aeabi_idiv0() */void $Sub$$__aeabi_idiv0(){// insert code to process a divide by zero...// call the original __aeabi_idiv0 function$Super$$__aeabi_idiv0();}5.7.2 (ソ フ ト ウ ェ ア) 浮 動 小 数 点 除 算ソ フ ト ウ ェ アでのゼ ロ に よ る 浮 動 小 数 点 除 算 エ ラーは、 コ ンパイ ラ 組 み 込 み関 数 と C ラ イ ブ ラ リ ヘルパ 関 数 を 組 み 合 わせて 使 用 する こ と に よ って ト ラ ップおよび 識 別 でき ます。ゼロ 除 算 エラーのコードでのト ラ ップゼ ロ に よ る 浮 動 小 数 点 除 算 エ ラーを コー ド で ト ラ ッ プするには、 次 の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 し ます。__ieee_status(FE_IEEE_MASK_ALL_EXCEPT, FE_IEEE_MASK_DIVBYZERO);これによ り、 例 5-6 で 示 すよ う に、 コード 内 のゼロ 除 算 が ト ラ ッ プされ、 その 他 の 例 外 の ト ラ ッ プが 無 効 にな り ます。例 5-6 ゼロ 除 算 エ ラー#include #include 5-48 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行int main(void){float a, b, c;// Trap the Invalid Operation exception and untrap all other exceptions:__ieee_status(FE_IEEE_MASK_ALL_EXCEPT, FE_IEEE_MASK_DIVBYZERO);c = 0;a = b / c;printf("b / c = %f, ", a); // trap division-by-zero errorreturn 0;}ゼロ 除 算 エ ラーのコー ド での 識 別C ライブラリヘルパ 関 数 _fp_trapveneer は、 例 外 が 発 生 する たびに 呼 び 出 さ れます。 こ の 関 数 の 呼 び 出 し 時 、 レ ジ ス タ の 状 態 は、 例 外 が 発 生 し た と き か ら変 更 さ れていません。 そのため、 ブレークポイン ト を 関 数 _fp_trapveneer に 設定 して LR を 参 照 する と 、 例 外 を 返 し た 演 算 が 含 まれてい る 関 数 のア ド レ ス をアプ リ ケーシ ョ ンコードで 見 つける こ とができます。例 えば、 例 5-6 (ページ 5-48) の C コー ド は、 次 の 文 字 列 を 使 用 し て コ マン ドラインからコンパイルされます。armcc --fpmode ieee_fullコンパイ ラによって 生 成 されるアセンブ リ 言 語 コードが 逆 アセンブルされると、 <strong>RealView</strong> Debugger によって 例 5-7 に 示 す 出 力 が 生 成 さ れます。例 5-7 ゼロ 除 算 エラーの 逆 アセンブリmain:00008080 E92D4010 PUSH {r4,lr}00008084 E3A01C02 MOV r1,#0x20000008088 E3A00C9F MOV r0,#0x9f000000808C EB000F1A BL __ieee_status 00008090 E59F0020 LDR r0,0x80b800008094 E3A01000 MOV r1,#000008098 EB000DEA BL _fdiv 0000809C EB000DBD BL _f2d 000080A0 E1A02000 MOV r2,r0000080A4 E1A03001 MOV r3,r1000080A8 E28F000C ADR r0,{pc}+0x14 ; 0x80bc000080AC EB000006 BL __0printf 000080B0 E3A00000 MOV r0,#0000080B4 E8BD8010 POP {r4,pc}<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-49ID 100419Non-Confidential,


コーディング 慣 行000080B8 40A00000 000080BC 202F2062 000080C0 203D2063 000080C4 202C6625 000080C8 00000000 0x00 0x00 0xA0 '@''b' ' ' '/' ' ''c' ' ' '=' ' ''%' 'f' ',' ' '0x00 0x00 0x00 0x00_fp_trapveneer にブレークポイ ン ト を 設 定 し、 デバッ グモニタで 逆 アセンブ リを 実 行 する と 、 以 下 が 生 成 さ れます。> goStopped at 0x0000BF6C due to SW Instruction BreakpointStopped at 0x0000BF6C:TRAPV_S\_fp_trapveneer次 に、 レジス タ を 調 べる と、 以 下 が 示 されます。r0: 0x40A00000 r1: 0x00000000 r2: 0x00000000 r3: 0x00000000r4: 0x0000C1DC r5: 0x0000C1CC r6: 0x00000000 r7: 0x00000000r8: 0x00000000 r9: 0x00000000 r10: 0x0000C0D4 r11: 0x00000000r12: 0x08000004 SP: 0x07FFFFF8 LR: 0x0000809C PC: 0x0000BF6CCPSR: nzcvIFtSVCリンクレジスタ LR に 含 まれている ア ド レ スは、 0x809c ( 例 外 の 原 因 と なった命 令 BL _fdiv の 後 の 命 令 のア ド レ ス) に 設 定 されます。パラ メータの 検 証事 後 分 析 デバ ッ グ 用 のパ ラ メ ータ を 保 存 する には、 _fp_trapveneer をインターセプ ト する 必 要 があ り ます。 _fp_trapveneer のすべての 呼 び 出 し に 割 り 込 むには、 $Super$$ および $Sub$$ のメカニズムを 使 用 します。 以 下 に 例 を 示 し ます。AREA foo, CODEIMPORT |$Super$$_fp_trapveneer|EXPORT |$Sub$$_fp_trapveneer||$Sub$$_fp_trapveneer|;; Add code to save whatever registers you require here;; Take care not to corrupt any needed registersB |$Super$$_fp_trapveneer|END詳 細 については、 以 下 を 参 照 し て 下 さ い。• 「 整 数 除 算 」 (ページ 5-46)• 『リンカユーザガイド』 の 「$Super$$ と $Sub$$ を 使 用 したシンボル 定 義のオーバーラ イ ド」 (ページ 4-16)5-50 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行5.8 C99 の 新 機 能1999 C 標 準 では、 以 下 のよ う な さ まざまな 新 機 能 が C に 追 加 されています。• 既 存 の C90 言 語 の 拡 張 構 文 に 加 えて、 新 し いキーワー ド および 識 別 子 など を 含 む 新 し い 言 語 機 能 。• 新 し い ラ イ ブ ラ リ 、 および 既 存 の C90 ライブラリのための 新 しいマクロや 関 数 を 含 む 新 し い ラ イ ブ ラ リ 機 能以 下 のセ ク シ ョ ンでは、 C99 を 初 めて 使 用 する 開 発 者 に 役 立 つ C99 の 新 しい機 能 を 選 択 して 説 明 します。注特 殊 なケース を 除 き、 標 準 で 指 定 さ れた 言 語 が C++ のサブセッ ト である と いう 意 味 で、C90 には 標 準 C++ との 互 換 性 があります。 この 意 味 で、C99 標 準 の新 しい 機 能 は、 C99 と C++ と の 互 換 性 がな く な った こ と を 意 味 し ます。5.8.1 言 語 機 能 のサポー トC99 標 準 では、 以 下 のよ う な 新 しい 言 語 機 能 が 導 入 されま し た。• 使 用 する 引 数 の 数 が 可 変 のマ ク ロ など、 GNU コンパイラで 提 供 されるC90 の 拡 張 と 同 様 な 一 部 の 機 能注GNU コンパイラにおける C90 の 拡 張 の 実 装 は、 C99 におけ る 同 様 な 機能 の 実 装 と は 必 ずし も 対 応 し ません。• // コ メント、および 宣 言 とコードを 混 合 する 機 能 など、C++ で 使 用 可 能な 一 部 の 機 能• 複 素 数 、 制 限 付 き ポ イ ン タ、 指 定 済 みの イ ニシ ャ ラ イ ザな ど、 ま った く新 しい 一 部 の 機 能以 下 のセ ク シ ョ ンでは、 C99 の 新 し い 言 語 機 能 を 選 択 し て 説 明 し ます。// コメントC++ での 場 合 と 同 様 に、// を 使 用 して、 1 行 のコ メ ン ト の 開 始 を 示 すこ と ができます。 『コンパイ ラ リ ファレンスガイ ド』 の 「// コ メント」 (ページ 3-5)を 参 照 して 下 さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-51ID 100419Non-Confidential,


コーディング 慣 行複 合 リ テ ラルISO C99 は、 複 合 リ テ ラルをサポー ト し ています。 複 合 リ テ ラ ルは、 後 に イ ニシャライザが 続 くキャス トのよ うなものです。 複 合 リ テ ラ ルの 値 はキ ャ ス トで 指 定 された 型 のオブジェ ク ト で、 イ ニシ ャ ラ イザで 指 定 された 要 素 が 含 まれています。 ま た、 複 合 リ テ ラ ルは 左 辺 値 です。 以 下 に 例 を 示 し ます。int y[] = (int []) {1, 2, 3};int z[] = (int [3]) {1};指 定 済 みのイ ニシ ャ ラ イザC90 には、 配 列 、 構 造 、 ま た 共 用 体 の 特 定 の メ ンバを 初 期 化 する 方 法 があ りません。 C99 では、 指 定 済 みの イ ニシ ャ ラ イ ザを 使 用 する こ とによ り、 配 列 、構 造 、 ま たは 共 用 体 の 特 定 の メ ンバの 名 前 ま たは 添 え 字 に よ る 初 期 化 がサポー ト されています。 以 下 に 例 を 示 し ます。typedef struct{char *name;int rank;} data;data vars[10] = { [0].name = "foo", [0].rank = 1,[1].name = "bar", [1].rank = 2,[2].name = "baz",[3].name = "gazonk" };明 示 的 に 初 期 化 さ れていない 集 合 の メ ンバは、 デフ ォル ト でゼ ロ に 初 期 化 されます。16 進 浮 動 小 数 点 数C99 は、 16 進 形 式 で 記 述 で き る 浮 動 小 数 点 数 をサポー ト し ています。 以 下 に例 を 示 し ます。float hex_floats(void){return 0x1.fp3; // 1 15/16 * 2^3}16 進 形 式 では、 指 数 は、 重 要 な 部 分 を 乗 算 する 2 の 累 乗 を 示 す 10 進 数 です。したがって 0x1.fp3 = 1.9375 * 8 = 1.55e1 となります。5-52 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行フレキシブル 配 列 メンバ複 数 の メ ンバを 持 つ struct では、 struct の 最 後 の メ ンバは、 不 完 全 な 配 列 型にする こ と ができ ます。 そのよ う な メ ンバは、 struct のフレキシブル 配 列 メンバ と 呼 ばれます。注struct にフ レ キシブル 配 列 メ ンバが 含 まれる 場 合 、 struct 全 体 が 不 完 全 な 型 になります。フ レ キシブル 配 列 メ ンバを 使 用 する と 、 配 列 サ イ ズの 指 定 を ラ ン タ イ ム まで保 留 する こ と がで き る と い う 意 味 で C の 動 的 型 指 定 を 模 倣 する こ と がで き ます。 以 下 に 例 を 示 し ます。extern const int n;typedef struct{int len;char p[];} str;void foo(void){size_t str_size = sizeof(str); // equivalent to offsetoff(str, p)str *s = malloc(str_size + (sizeof(char) * n));}__func__ 定 義 済 み 識 別 子__func__ 定 義 済 み 識 別 子 は、 現 在 の 関 数 の 名 前 を 取 得 する 手 段 を 提 供 し ます。以 下 に 例 を 示 し ます。void foo(void){printf("This function is called '%s'.\n", __func__);}上 記 の 関 数 は、 以 下 を 出 力 し ます。This function is called 'foo'.inline 関 数C99 のキーワード inline は、inline で 修 飾 さ れる 関 数 の 呼 び 出 し を イ ン ラ イ ン展 開 する こ と を コ ンパ イ ラ に 示 し ます。 以 下 に 例 を 示 し ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-53ID 100419Non-Confidential,


コーディング 慣 行inline int max(int a, int b){return (a > b) ? a : b;}コンパイラは、 必 要 な 場 合 にのみ inline で 修 飾 さ れる 関 数 を イ ン ラ イ ン 展 開します。 関 数 の イ ン ラ イ ン 展 開 がパフ ォーマン スに 悪 影 響 を 及 ぼす 場 合 は、コンパイラではこのキーワードを 無 視 できます。 詳 細 については、 「 関 数 の イン ラ イ ン 展 開 」 (ページ 5-20) を 参 照 して 下 さい。注C99 での inline のセマンテ ィ ク スは、 標 準 C++ での inline キーワードのセマンティ クスとは 異 なり ます。long long データ 型C99 では、 整 数 データ 型 long long がサポー ト されます。 RVCT では、 この 型 は64 ビット 幅 です。 以 下 に 例 を 示 し ます。long long int j = 25902068371200;// length of light day, metersunsigned long long int i = 94607304725808000ULL; // length of light year, meters『コンパイ ラ リ ファレンスガイ ド』 の 「long long」 (ページ 3-8) を 参 照 して 下さい。使 用 する 引 数 の 数 が 一 定 でないマ ク ロC99 では、 引 数 の 数 の 変 化 を 許 可 するマ ク ロ を 宣 言 でき ます。 このよ うなマクロ を 定 義 する ための 構 文 は、 関 数 を 定 義 する ための 構 文 に 似 ています。 以 下に 例 を 示 し ます。#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)void Variadic_Macros_0(){debug ("a test string is printed out along with %x %x %x\n", 12, 14, 20);}宣 言 と コー ド の 混 合C99 では、 C++ での 場 合 と 同 様 に、 複 合 ステー ト メ ン ト 内 で 宣 言 と コード を混 合 で き ます。 以 下 に 例 を 示 し ます。5-54 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行void foo(float i){i = (i > 0) ? -i : i;float j = sqrt(i);}// illegal in C90選 択 および 反 復 ステー ト メ ン ト の 新 し いブ ロ ッ ク 有 効 範 囲for ループでは、 C++ での 場 合 と 同 様 に、 最 初 の 式 が 宣 言 であ る 場 合 があ り ます。 宣 言 の 有 効 範 囲 はループの 本 体 までです。 以 下 に 例 を 示 し ます。extern int max;for (int n = max - 1; n >= 0; n--){// body of loop}上 記 のコマン ド は、 以 下 のコマン ド と 同 じ 意 味 です。extern int max;{int n = max - 1;for (; n >= 0; n--){// body of loop }}注C++ とは 異 なり、for-test、 if-test、 または switch-expression では 新 しい 宣 言 を使 用 で き ません。_Pragma 処 理 命 令C90 では、 マク ロ 拡 張 の 結 果 と して #pragma デ ィ レ ク テ ィ ブを 生 成 する こ と はできません。 C99 _Pragma 演 算 子 に よ り 、 プ ラ グマデ ィ レ ク テ ィ ブにプ ロ セ ッサマ ク ロ を 組 み 込 むこ と がで き ます。 以 下 に 例 を 示 し ます。# define RWDATA(X) PRAGMA(arm section rwdata=#X)# define PRAGMA(X) _Pragma(#X)RWDATA(foo) // same as #pragma arm section rwdata="foo"int y = 1; // y is placed in section "foo"<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-55ID 100419Non-Confidential,


コーディング 慣 行制 限 付 きポイ ン タC99 のキーワード restrict を 使 用 する と、 さ まざまなオブジェ ク ト のポインタ 型 や 関 数 パ ラ メ ータ 配 列 が 重 複 する メ モ リ 領 域 を 指 さ ない よ う にする こ とができ ます。 したがってコンパイラは、 エイ リアスが 生 成 されるために 行 われなかった 最 適 化 を 実 行 できます。以 下 の 例 では、 ポ イ ン タ a は、 ポ イ ン タ b と 同 じ メモ リ 領 域 を 指 し ません。void copy_array(int n, int *restrict a, int *restrict b){while (n-- > 0)*a++ = *b++;}void test(void){extern int array[100];copy_array(50, array + 50, array); // validcopy_array(50, array + 1, array); // undefined behavior}ただし、 restrict で 修 飾 さ れたポ イ ン タは、 異 な る 配 列 や、 配 列 内 の 異 な る 領域 を 指 すこ と がで き ます。5.8.2 ライブラリ 機 能C99 標 準 では、 プ ロ グ ラ マに 役 立 つ 以 下 の よ う な 新 し い ラ イ ブ ラ リ 機 能 を 複数 導 入 し ています。• snprintf の 関 数 フ ァ ミ リ など、 UNIX 標 準 ラ イ ブ ラ リ で 提 供 さ れる C90標 準 ラ イ ブ ラ リ の 拡 張 と 同 様 な 一 部 の 機 能• で 提 供 さ れる 標 準 化 さ れた 浮 動 小 数 点 環 境 な ど、 ま った く 新 しい 一 部 のラ イブ ラ リ 機 能以 下 のセ ク シ ョ ンでは、 C99 の 新 しいライブラ リ 機 能 を 選 択 して 説 明 します。 の 追 加 の 数 学 ラ イ ブ ラ リ 関 数C99 では、 対 応 する C90 標 準 ヘ ッ ダにはない 追 加 のマ ク ロ、 型 、 および 関 数を 標 準 ヘ ッ ダ でサポー ト しています。C90 にない C99 の 新 規 マ ク ロには 以 下 のものがあ り ます。INFINITY // positive infinityNAN // IEEE not-a-number5-56 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行C90 にない C99 の 新 規 汎 用 関 数 には 以 下 の も のがあ り ます。#define isinf(x) // non-zero only if x is positive or negative infinity#define isnan(x) // non-zero only if x is NaN#define isless(x, y) // 1 only if x < y and x and y are not NaN, and 0 otherwise#define isunordered(x, y) // 1 only if either x or y is NaN, and 0 otherwiseC90 にない C99 の 新 規 数 学 関 数 には 以 下 の も のがあ り ます。double acosh(double x); // hyperbolic arccosine of xdouble asinh(double x); // hyperbolic arcsine of xdouble atanh(double x); // hyperbolic arctangent of xdouble erf(double x); // returns the error function of xdouble round(double x); // returns x rounded to the nearest integerdouble tgamma(double x); // returns the gamma function of xC99 では、 すべての 実 浮 動 小 数 点 型 の 新 し い 数 学 関 数 がサポー ト さ れます。既 存 のすべての 関 数 の 単 精 度 バージ ョ ン も サポー ト さ れます。複 素 数C99 モー ド では、 コ ンパイ ラ は 複 素 数 および 虚 数 をサポー ト し ています。GNU モー ド では、 コ ンパ イ ラ は 複 素 数 のみをサポー ト し ています。以 下 に 例 を 示 し ます。#include #include int main(void){complex float z = 64.0 + 64.0*I;printf( “z = %f + %fI\n” , creal(z), cimag(z));return 0;}複 素 数 の 種 類 は 以 下 の と お り です。• float 複 素 数• double 複 素 数• long double 複 素 数<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-57ID 100419Non-Confidential,


コーディング 慣 行ブール 型 と C99 ではネイテ ィ ブ 型 の _Bool が 導 入 されています。 関 連 する 標 準 ヘ ッ ダ には、 ブールテス ト のためにマク ロ bool、 true、 および false が 含まれています。 以 下 に 例 を 示 し ます。#include bool foo(FILE *str){bool err = false;...if (!fflush(str)){err = true;}...return err;}注C99 でのブールのセマンテ ィ ク スは、 C++ と 一 致 するよ うになっています。 および の 拡 張 整 数 型 と 関 数C90 では、 long データ 型 は 最 大 の 整 数 型 および 32 ビッ トコンテナの 両 方 として 機 能 でき ます。 C99 では、 新 しい 標 準 ラ イブラ リ ヘッ ダフ ァ イル および によ り このあいまいさを 解 消 しています。ヘッダファイル では 以 下 の 新 し い 型 が 使 用 さ れています。• intmax_t および uintmax_t。 最 大 幅 の 符 号 付 きおよび 符 号 な し 整 数 型 です。• intptr_t および unintptr_t。 符 号 付 きおよび 符 号 な し のオブジ ェ ク ト ポ イン タ を 格 納 でき る 整 数 型 です。ヘッダファイル は、 以 下 を 含 む intmax_t 型 の 値 を 操 作 する ためのライブラリ 関 数 を 提 供 します。intmax_t imaxabs(intmax_t x); // absolute value of ximaxdiv_t imaxdiv(intmax_t x, intmax_t y) // returns the quotient and remainder// of x / y5-58 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


コーディング 慣 行 の 浮 動 小 数 点 環 境 ア ク セスC99 標 準 ヘ ッ ダ フ ァ イ ル は、 数 値 プロ グ ラ ミ ングのために IEEE 754対 応 の 浮 動 小 数 点 環 境 へのア ク セス を 提 供 し ます。 ラ イ ブ ラ リ では、 浮 動 小数 点 の 状 態 を 管 理 し、 制 御 する ために 2 つの 型 および 多 数 のマ ク ロ と 関 数 が提 供 さ れています。サポー ト さ れる 新 し い 型 は 以 下 の と お り です。• fenv_t。 浮 動 小 数 点 環 境 全 体 を 表 し ます。• fexcept_t。 浮 動 小 数 点 状 態 を 表 し ます。サポー ト される 新 しいマク ロは 以 下 のとおり です。• FE_DIVBYZERO, FE_INEXACT、 FE_INVALID、 FE_OVERFLOW、 および FE_UNDERFLOW。 浮動 小 数 点 の 例 外 を 管 理 し ます。• FE_DOWNWARD、 FE_TONEAREST、 FE_TOWARDZERO、 FE_UPWARD。 指 定 された 方 向 の 丸めを 管 理 します。• FE_DFL_ENV。 デフ ォル ト の 浮 動 小 数 点 環 境 を 表 し ます。新 しい 関 数 には 以 下 が 含 まれます。int feclearexcept(int ex); // clear floating-point exceptions selected by exint feraiseexcept(int ex); // raise floating point exceptions selected by exint fetestexcept(int ex); // test floating point exceptions selected by xint fegetround(void); // return the current rounding modeint fesetround(int mode); // set the current rounding mode given by modeint fegetenv(fenv_t *penv); return the floating-point environment in penvint fesetenv(const fenv_t *penv); // set the floating-point environment to penv の snprintf 関 数 フ ァ ミ リC90 標 準 ヘ ッ ダ にある sprintf 関 数 フ ァ ミ リ の 使 用 は 危 険 な 場 合 があります。 以 下 のス テー ト メ ン トsprintf(buffer, size, "Error %d: Cannot open file '%s'", errno, filename);では、 変 数 size は buffer に 挿 入 する 文 字 の 最 小 値 を 指 定 し ます。 その 結 果 、文 字 列 に 割 り 当 て ら れた メ モ リ に 収 ま る 文 字 数 よ り も 多 く の 文 字 数 が 出 力 される 場 合 があ り ます。 の C99 バージ ョ ンにあ る snprintf 関 数 は、 sprintf 関 数 の 安 全 なバージョンであり、バッファのオーバーランを 防 ぎます。 以 下 のス テー ト メ ン トsnprintf(buffer, size, "Error %d: Cannot open file '%s'", errno, filename);<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 5-59ID 100419Non-Confidential,


コーディング 慣 行では、 変 数 size は buffer に 挿 入 でき る 文 字 の 最 大 値 を 指 定 します。 バッファのサイズが size で 指 定 されたサイ ズよ り も 常 に 大 きければ、 バッ フ ァオーバーラ ンが 発 生 する こ と はあ り ません。 の 型 汎 用 数 学 マ ク ロ新 しい 標 準 ヘッダ は、 複 数 の 数 学 関 数 のフ ァ ミ リ を 定 義 し ます。こ れら の 関 数 は、 浮 動 小 数 点 型 でオーバーロー ド さ れてい る と い う 意 味 で 型汎 用 です。 例 えば、 三 角 関 数 cos は、 次 のよ う にオーバーロード された 宣 言 があるかのよ うに 機 能 します。extern float cos(float x);extern double cos(double x);extern long double cos(long double x);...例 えば、 ステー ト メ ン トp = cos(0.78539f); // p = cos(pi / 4)は、 リ テ ラル 0.78539f の 型 で 定 義 された と お り 、 cos 関 数 の 単 精 度 バージ ョ ンを 呼 び 出 し ます。注型 汎 用 数 学 関 数 フ ァ ミ リ は、 演 算 子 オーバーロー ド メ カニズム を 使 用 し てC++ で 定 義 でき ます。 C++ で 演 算 子 オーバーロー ド を 使 用 し て 定 義 さ れた 型汎 用 関 数 フ ァ ミ リ のセマンテ ィ ク スは、 で 定 義 された 対 応 する 型 汎用 関 数 フ ァ ミ リ のセマンテ ィ ク ス と は 異 な り ます。 のワイ ド 文 字 I/O 関 数C99 にはワ イ ド 文 字 I/O 関 数 が 導 入 さ れています。 こ れら の 関 数 を 使 用 すると 、 通 常 の 文 字 と 同 じ よ う にフ ァ イル 内 でワ イ ド 文 字 の 読 み 出 し と 書 き 込 みができ ます。 <strong>ARM</strong> C ライブラリは、wchar.h で 定 義 されているすべての C99 関数 をサポー ト し ます。 『ISO/IEC 9899:TC2』 のセクシ ョ ン 7.24 を 参 照 して 下 さい。5-60 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


第 6 章診 断 メ ッ セージ<strong>ARM</strong> コ ンパイ ラ は、 潜 在 的 な 移 植 性 の 問 題 やその 他 の 問 題 点 に 関 する メ ッセージを 生 成 し ます。 このセクショ ンで 説 明 するコンパイラオプショ ンを 使用 する と 、 以 下 の 設 定 を 行 う こ と がで き ます。• 特 定 の メ ッ セージを 非 表 示 にで き ます。 例 えば、 古 い 形 式 の C 言 語 のプロ グ ラ ム を 移 植 する 初 期 段 階 では、 警 告 を 非 表 示 に し てお く こ と がで きます。 ただ し、 一 般 的 には、 メ ッ セージを 非 表 示 にする よ り も コー ド をチェッ クするこ とをお 勧 めします。• 特 定 の メ ッ セージの 重 大 度 を 変 更 で き ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 6-1ID 100419Non-Confidential,


診 断 メ ッ セージこ のセ ク シ ョ ンは 以 下 のサブセ ク シ ョ ンか ら 構 成 さ れています。• 「 診 断 結 果 の 転 送 」 (ページ 6-3)• 「 診 断 メ ッ セージの 重 大 度 」 (ページ 6-4)• 「 診 断 メ ッ セージの 出 力 の 制 御 」 (ページ 6-5)• 「 診 断 メ ッ セージの 重 大 度 の 変 更 」 (ページ 6-6)• 「 診 断 メ ッ セージの 非 表 示 」 (ページ 6-7)• 「 診 断 メ ッ セージの 接 頭 文 字 」 (ページ 6-8)• 「- W オプシ ョ ン を 使 用 し た 警 告 メ ッ セージの 非 表 示 」 (ページ 6-9)• 「 終 了 ス テータ ス コー ド と 終 了 メ ッ セージ」 (ページ 6-10)• 「データ フ ロー 警 告 」 (ページ 6-11)6-2 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


診 断 メ ッ セージ6.1 診 断 結 果 の 転 送--errors=filename オプシ ョ ン を 使 用 する と 、 コ ンパイ ラ に よ る 診 断 結 果 がフ ァイルに 転 送 されます。 コ マン ド オプシ ョ ンに 関 連 する 診 断 情 報 は 転 送 さ れません。詳 細 については、 「 診 断 メ ッ セージの 出 力 の 制 御 」 (ページ 6-5) を 参 照 して下 さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 6-3ID 100419Non-Confidential,


診 断 メ ッ セージ6.2 診 断 メ ッ セージの 重 大 度診 断 メ ッ セージには、 表 6-1 に 示 す 重 大 度 が 付 け られています。表 6-1 診 断 メ ッ セージの 重 大 度重 大 度内 部 エ ラーエ ラー警 告注 釈説 明コ ンパイ ラ で 内 部 的 な 問 題 が 発 生 し てい る こ と を 示 し ます。xiii ページの 「<strong>RealView</strong> <strong>Compilation</strong> <strong>Tools</strong> に 関 する フ ィ ードバ ッ ク 」 に リ ス ト さ れた 情 報 を 用 意 し て 購 入 元 にお 問 い 合 わせ 下 さ い。コ ンパイルが 停 止 する 原 因 と な る 問 題 があ る こ と を 示 し ます。 このエラーには、 コマンド ラインエラー、 内 部 エラー、イ ン ク ルー ド フ ァ イルの 検 出 不 能 、 C 言 語 ま たは C++ 言 語の 構 文 規 則 あ る いは 意 味 上 の 規 則 への 違 反 な どが 含 まれます。 複 数 の ソ ース フ ァ イルが 指 定 さ れてい る 場 合 には、 それ以 降 のソースファイルのコンパイルは 行 われません。コー ド に 問 題 を 引 き 起 こす 可 能 性 のあ る 例 外 的 な 状 況 を 示 す警 告 です。 重 大 度 がエ ラーの 問 題 が 検 出 さ れない 限 り 、 コ ンパイルは 引 き 続 き 実 行 され、 オブジェク ト コードが 生 成 されます。C 言 語 ま たは C++ 言 語 の 使 用 方 法 が、 一 般 的 ではあ る が 場合 に よ っては 特 殊 であ る こ と を 示 し ます。 こ の 診 断 情 報 はデフォルトでは 表 示 されません。 重 大 度 がエ ラーの 問 題 が 検 出されない 限 り、 コンパイルは 引 き 続 き 実 行 され、 オブジェクトコードが 生 成 されます。6-4 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


診 断 メ ッ セージ6.3 診 断 メ ッ セージの 出 力 の 制 御以 下 のオプシ ョ ン を 使 用 し て、 診 断 メ ッ セージの 出 力 を 制 御 で き ます。--no_brief_diagnostics?--brief_diagnosticsこ のオプシ ョ ン を 使 用 する と 、 診 断 出 力 の 短 縮 形 を 使 用 するモード を 有 効 または 無 効 にする こ と ができ ます。 有 効 にする と 、元 のソース 行 は 表 示 されず、 1 行 に 収 ま ら ないエラー メ ッ セージは 折 り 返 されません。 デフォル ト は --no_brief_diagnostics です。--diag_style={arm|ide|gnu}--errors=filenameこ のオプシ ョ ン を 使 用 する と 、 診 断 メ ッ セージの 表 示 に 使 用 する 形 式 を 指 定 できます。こ のオプシ ョ ン を 使 用 する と 、 診 断 メ ッ セージの 出 力 を、 stderrから 指 定 されたエラーファイル filename に 転 送 でき ます。 このオプシ ョ ンは、 フ ァ イルの 出 力 の 転 送 がサポー ト されていないシステムで 有 用 です。--remarksこ のオプシ ョ ン を 使 用 する と 、 構 造 内 のパデ ィ ン グに 関 する 警告 な どの 注 釈 メ ッ セージが 表 示 さ れる よ う に コ ンパイ ラ を 設 定できます。 デフ ォル ト では、 注 釈 は 表 示 されません。--no_wrap_diagnostics?--wrap_diagnosticsこのオプションを 使 用 すると、 1 行 に 収 ま ら ないエラー メ ッ セージテキ ス ト を 折 り 返 すかど う かを 指 定 で き ます。『コンパイ ラ リ ファレンスガイ ド』 の 「コマンド ラ インオプシ ョ ン」 (ページ2-2) を 参 照 して 下 さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 6-5ID 100419Non-Confidential,


診 断 メ ッ セージ6.4 診 断 メ ッ セージの 重 大 度 の 変 更以 下 のオプシ ョ ン を 使 用 し て、 すべての 注 釈 と 警 告 、 およびい く つかのエラーの 重 大 度 を 変 更 できます。--diag_error=tag[, tag, ...]指 定 さ れた タ グ を 含 む 診 断 メ ッ セージの 重 大 度 をエ ラーに 設 定します。--diag_remark=tag[, tag, ...]指 定 さ れた タ グ を 含 む 診 断 メ ッ セージの 重 大 度 を 注 釈 に 設 定 します。--diag_warning=tag[, tag, ...]こ のプ ラ グマを 使 用 する と 、 指 定 さ れた タ グ を 含 む 診 断 メ ッセージの 重 大 度 を 警 告 に 設 定 で き ます。こ れ ら のオプシ ョ ンには、 変 更 する 必 要 があ る エ ラー メ ッ セージの コ ンマで区 切 っ た リ ス ト を 指 定 する 必 要 があ り ます。 例 えば、 注 釈 はデフォル ト で 表示 されないので、 番 号 が #1293 の 警 告 メ ッセージの 重 大 度 を 注 釈 に 変 更 するとします。こ れを 行 う には、 以 下 のコ マン ド を 使 用 し ます。armcc --diag_remark=1293 ...注プラグマにも 同 等 の 機 能 を 持 つオプシ ョ ンがあ り ます。 詳 細 については、 「プラグマ」 (ページ 4-15) を 参 照 して 下 さい。以 下 の 診 断 メ ッ セージは 変 更 可 能 です。• 番 号 の 形 式 が #nnnn-D のメッセージ• 番 号 の 形 式 が CnnnnW の 警 告 メ ッ セージ6-6 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


診 断 メ ッ セージ6.5 診 断 メ ッ セージの 非 表 示タ グが 指 定 さ れてい るすべての 診 断 メ ッ セージを 非 表 示 にする には、 オプション --diag_suppress=tag[, tag, ...] を 使 用 し ます。以 下 も 参 照 し て 下 さ い。• 「プ ラ グマ」 (ページ 4-15)• 『コンパイ ラ リ ファレンスガイ ド』 の「--diag_suppress=tag[,tag,...]」 (ページ 2-53)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 6-7ID 100419Non-Confidential,


診 断 メ ッ セージ6.6 診 断 メ ッ セージの 接 頭 文 字RVCT ツールは、 表 6-2 に 示 す 識 別 文 字 を 自 動 的 に 診 断 メ ッ セージに 挿 入 し ます。 これら の 接 頭 文 字 を 使 用 する こ と に よ り 、 RVCT ツールは 重 複 した メ ッセージ 範 囲 を 使 用 できます。表 6-2 診 断 メ ッ セージの 識 別接 頭 文 字CALQRVCT ツールarmccarmasmarmlink または armarfromelf以 下 の 規 則 が 適 用 さ れます。• すべての RVCT ツールは、 接 頭 文 字 が 含 まれていない メ ッ セージ 番 号 の影 響 を 受 けます。• 接 頭 文 字 が 含 まれた メ ッ セージ 番 号 は、 その 接 頭 文 字 に 該 当 する ツールのみに 作 用 し ます。• ツールは、 一 致 し ない 接 頭 文 字 が 含 まれてい る メ ッ セージの 影 響 は 受 けません。このため、--diag_error、--diag_remark、 および --diag_warning を 指 定 した り、メ ッ セージを 非 表 示 にし た り する 場 合 は、 以 下 のよ う にし て コ ンパイ ラ 接 頭文 字 C を 使 用 できます。armcc --diag_suppress=C1287,C3017 ...接 頭 文 字 は、 コ ンパイ ラ か ら 他 のツールに 渡 さ れる オプシ ョ ン を 制 御 するのに 使 用 し ます。 例 えば、 リ ン カの メ ッ セージ 番 号 を 指 定 する には、 接 頭 文 字L を 使 用 し ます。6-8 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


診 断 メ ッ セージ6.7 -W オプシ ョ ン を 使 用 し た 警 告 メ ッ セージの 非 表 示-W オプシ ョ ン を 指 定 する と 、 すべての 警 告 が 非 表 示 にな り ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 6-9ID 100419Non-Confidential,


診 断 メ ッ セージ6.8 終 了 ステー タ ス コー ド と 終 了 メ ッ セージコ ンパイ ラ は、 コ ンパイル 中 に 警 告 やエ ラーを 検 出 する と 、 stderr にさまざまなメ ッセージを 書 き 込 みます。 メ ッ セージの 最 後 に、 検 出 さ れた メ ッ セージの 種 類 ご と の 合 計 数 を 以 下 の 形 式 で 示 す 概 要 メ ッ セージが 表 示 さ れます。filename: n warnings, n errorsn は、 検 出 さ れた 警 告 ま たはエ ラーの 数 を 示 し ます。注デフ ォル ト では、 注 釈 は 表 示 されません。 注 釈 を 表 示 する には、--remarks コンパイラオプシ ョ ンを 使 用 します。 注 釈 メ ッ セージのみが 生 成 さ れた 場 合 、 概要 メ ッセージは 表 示 されません。こ のセ ク シ ョ ンには、 以 下 の 情 報 も 記 載 さ れています。• 「 信 号 への 応 答 」• 「 終 了 ス テータ ス」6.8.1 信 号 への 応 答信 号 SIGINT (^C な どのユーザ 割 り 込 みに よ っ て 発 生 し ます) と SIGTERM(UNIX の kill コ マン ド に よ って 発 生 し ます) は、 コ ンパイ ラ に よ って ト ラ ップ さ れ、 コ ンパイルが 異 常 終 了 し ます。6.8.2 終 了 ステー タ スコ ンパイ ラ はエ ラーを 検 出 する と 、 コ ンパイルの 完 了 時 に 0 よ り 大 きい 値 を返 します。 エ ラーが 検 出 さ れない 場 合 は、 ゼ ロ の 値 が 返 さ れます。各 レベルの 診 断 メ ッセージがコンパイラによってどのよ うに 処 理 されるかの詳 細 については、 「 診 断 メ ッ セージの 重 大 度 」 (ページ 6-4) を 参 照 して 下 さい。6-10 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


診 断 メ ッ セージ6.9 データ フ ロー 警 告コ ンパイ ラ は、 最 適 化 処 理 の 一 環 と し てデータ フ ロー 分 析 を 実 行 し ます。 この 情 報 を 使 用 し て、 コー ド 内 の 潜 在 的 な 問 題 点 を 識 別 で き ます。 例 えば、 この 情 報 を 使 用 し て、 初 期 化 さ れていない 変 数 が 使 用 さ れた と き に 警 告 を 生 成できます。データ フ ロー 分 析 で 生 成 さ れる 警 告 は、 プ ロ セ ッ サレ ジ ス タ で 保 持 さ れているローカル 変 数 に 関 するものだけであり、 メモリで 保 持 されているグローバル 変 数 や、 ス タ ッ ク で 保 持 さ れてい る 変 数 ま たは 構 造 体 に 対 し ては 警 告 を 生成 しません。以 下 の 点 に 注 意 し て 下 さ い。• データ フ ロー 警 告 はデフ ォル ト で 生 成 さ れます (RVCT v2.0 以 前 では、-fa オプシ ョ ンが 指 定 さ れた 場 合 のみデータ フ ロー 警 告 が 生 成 さ れました)。• -O0 を 指 定 する と、-fa オプシ ョ ンが 指 定 されているかど う かにかかわらずデータ フ ロー 分 析 が 無 効 にな り ます。こ の 分 析 結 果 は、 使 用 する 最 適 化 レベルに よ って 異 な り ます。 つま り、 よ り高 い 最 適 化 レベルを 使 用 する と 、 低 い 最 適 化 レベルでは 表 示 さ れない 多 数 の警 告 が 表 示 さ れます。 例 えば、 以 下 の ソース コー ド を 使 用 する と 、 コ ンパ イラは -O2 で 警 告 "C3017W: i may be used before being set" を 生 成 し ます。int f(void){int i;return i++;}データ フ ロー 分 析 では、 問 題 があ る コー ド を 正 確 に 識 別 で き ません。 コ ンパイラによって 生 成 される C3017W 警 告 の 目 的 は、 発 生 する 可 能 性 があ る 問 題 を示 すこ と だけです。 コードを 正 確 に 分 析 するには、--diag_suppress=C3017 を 指 定し て こ の 警 告 を 非 表 示 に し、 Lint などのサー ド パーテ ィ 製 分 析 ツールを 使 用して 下 さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 6-11ID 100419Non-Confidential,


診 断 メ ッ セージ6-12 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


第 7 章インラインアセンブラと 組 み 込 みアセンブラの 使 用本 章 では、 <strong>ARM</strong> コンパイラ armcc の 最 適 化 イ ン ラ イ ンアセンブ ラ と 非 最 適 化組 み 込 みアセンブ ラ について 説 明 し ます。 以 下 のセ ク シ ョ ンか ら 構 成 さ れています。• 「インラインアセンブラ」 (ページ 7-2)• 「 組 み 込 みアセンブ ラ」 (ページ 7-19)• 「sp、 lr、 または pc にアクセスする 従 来 のインラ インアセンブラ」 (ページ 7-30)• 「イ ン ラ イ ンアセンブ リ コー ド と 組 み 込 みアセンブ リ コー ド の 相 違 点 」(ページ 7-32)<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-1ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用7.1 インラインアセンブラ<strong>ARM</strong> コ ンパイ ラ の イ ン ラ イ ンアセンブ ラ を 使 用 する こ と に よ り 、 最 適 なアセンブ リ 言 語 ルーチン を 記 述 し、 C または C++ で 利 用 でき ないターゲ ッ ト プロセ ッ サの 機 能 にア ク セスで き ます。このセクションでは、 以 下 の 内 容 について 説 明 します。• 「インラインアセンブラのサポート」• 「インラインアセンブラ 構 文 」 (ページ 7-3)• 「インラインアセンブリ 演 算 の 制 限 」 (ページ 7-6)• 「 仮 想 レ ジ ス タ」 (ページ 7-9)• 「 定 数 」 (ページ 7-10)• 「 命 令 の 展 開 」 (ページ 7-10)• 「 条 件 フ ラ グ」 (ページ 7-11)• 「オペラ ン ド」 (ページ 7-12)• 「 関 数 呼 び 出 し と 分 岐 」 (ページ 7-14)• 「ラベル」 (ページ 7-16)• 「 旧 バージ ョ ンの <strong>ARM</strong> C/C++ コ ンパイ ラ と の 相 違 点 」 (ページ 7-16)以 下 も 参 照 し て 下 さ い。• C および C++ ソ ース コー ド におけ る イ ン ラ イ ンアセンブ ラ の 使 用 方 法と 、 イ ン ラ イ ンアセンブ リ 言 語 の 制 限 については、 『デベロ ッ パガ イ ド 』の 第 4 章 C、 C++、 およびアセンブリ 言 語 の 混 用 を 参 照 して 下 さい。• <strong>ARM</strong> プロセ ッ サ 用 のアセンブ リ 言 語 の 記 述 については、 『アセンブラガイド』 を 参 照 して 下 さい。7.1.1 イ ン ラ イ ンアセン ブ ラのサポー トインラインアセンブラは、 <strong>ARM</strong> アセンブ リ 言 語 のみをサポート しており、 以下 のものはサポー ト し ていません。• Thumb アセンブ リ 言 語• Thumb-2 アセンブ リ 言 語• <strong>ARM</strong>v7 命 令• VFP 命 令• NEON 命 令Thumb および Thumb2 アセンブ リ 言 語 をサポートするには、 組 み 込 みアセンブラを 使 用 します。7-2 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用<strong>ARM</strong>v6 SIMD 命 令 の 完 全 なセ ッ ト な ど、 ほ と んどの <strong>ARM</strong>v6 命 令 は、 イ ン ラインアセンブラによってサポート されています。 インラインアセンブラによってサポート されていない <strong>ARM</strong>v6 命 令 は、 SETEND と 一 部 のシ ス テム 拡 張 機能 です。汎 用 コ プ ロ セ ッ サ 命 令 な ど、 ほ と んどの <strong>ARM</strong>v5 命 令 は、 イ ン ラ イ ンアセンブラによってサポート されています。 インラインアセンブラによってサポートされていない <strong>ARM</strong>v5 命 令 は、 BX、 BLX、 および BXJ です。7.1.2 インラインアセンブラ 構 文<strong>ARM</strong> コンパイラは、asm キーワード (C++) または __asm キーワード (C および C++) で 開 始 される 拡 張 インラインアセンブラ 構 文 をサポートしています。こ れ ら のキーワー ド の 構 文 については、 以 下 のセ ク シ ョ ンで 説 明 し ます。• 「__asm キーワード を 使 用 したイン ラ インアセンブ リ 」• 「asm キーワード を 使 用 したイ ン ラ イ ンアセンブ リ 」 (ページ 7-4)• 「__asm および asm の 使 用 規 則 」 (ページ 7-4)asm または __asm ステート メン トは、 ステート メン ト を 記 述 できる 場 所 であればどこでも 使 用 できます。__asm キーワード を 使 用 したインラ インアセンブ リイ ン ラ イ ンアセンブ ラ はアセンブ ラ 指 定 子 で 呼 び 出 さ れ、 その 後 には 中 括 弧または 括 弧 で 囲 まれたアセンブラ 命 令 のリ ス トが 配 置 されます。 インラインアセンブラ コードは 次 の 形 式 で 指 定 できます。• 1 行 で 記 述 する 場 合 の 例 :__asm("instruction[;instruction]"); // Must be a single string__asm{instruction[;instruction]}コメントを 含 めることはできません。• 複 数 行 で 記 述 する 場 合 の 例 :__asm{...instruction...}C または C++ のコ メン トは、 インラインアセンブリ 言 語 ブロッ ク 内 の 任意 の 場 所 に 使 用 でき ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-3ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用「__asm および asm の 使 用 規 則 」 も 参 照 して 下 さい。asm キーワー ド を 使 用 したイン ラ インアセンブ リC++ をコンパイルするとき、<strong>ARM</strong> コンパイラは ISO C++ 標 準 で 提 案 さ れている asm 構 文 をサポー ト し ます。 インラインアセンブラコードは 次 の 形 式 で 指 定できます。• 1 行 で 記 述 する 場 合 の 例 :asm("instruction[;instruction]"); // Must be a single stringasm{instruction[;instruction]}コメントを 含 めることはできません。• 複 数 行 で 記 述 する 場 合 の 例 :asm{}...instruction...C または C++ のコ メン トは、 インラインアセンブリ 言 語 ブロッ ク 内 の 任意 の 場 所 に 使 用 でき ます。__asm および asm の 使 用 規 則__asm キーワードおよび asm キーワード を 使 用 する と きは、 以 下 の 規 則 に 従 って 下 さい。• 同 一 行 に 複 数 の 命 令 を 含 める 場 合 、 個 々の 命 令 をセ ミ コ ロ ン (;) で 区切 る 必 要 があ り ます。 ま た、 二 重 引 用 符 を 使 用 する 場 合 は、 1 組 の 二 重引 用 符 (") ですべての 命 令 を 囲 む 必 要 があ り ます。• 1 つの 命 令 が 複 数 行 に 及 ぶ 場 合 、 バ ッ ク ス ラ ッ シ ュ (\) を 使 用 して 行 が継 続 する こ と を 指 定 する 必 要 があ り ます。• 命 令 を 複 数 行 に 記 述 する 形 式 では、 イ ン ラ イ ンアセンブ リ 言 語 ブ ロ ッ ク内 の 任 意 の 場 所 に C または C++ のコ メン ト を 使 用 できます。 ただし、 1行 に 複 数 の 命 令 が 含 まれている 場 合 、 その 行 にコ メ ン ト を 含 める こ と はできません。• アセンブ リ 言 語 ではコンマ (,) を 区 切 り 文 字 と し て 使 用 する ので、 コンマ 演 算 子 が 含 まれた C 言 語 の 式 は、 式 であ る こ と を 区 別 する ために 丸括 弧 で 囲 む 必 要 があ り ます。7-4 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用__asm{ADD x, y, (f(), z)}• asm ステート メン トは C++ 関 数 内 に 配 置 する 必 要 があ り ます。 asm ステートメントは、C++ ステート メン トが 記 述 されるべき 場 所 であればどこでも 使 用 できます。• インラインアセンブラ 内 のレジスタ 名 は、 C または C++ の 変 数 と し て 処理 されます。 それらのレジス タ 名 は、 必 ずし も 同 名 の 物 理 的 なレジス タと 関 連 する わけではあ り ません (「 仮 想 レ ジ ス タ」 (ページ 7-9) を 参照 )。 レジスタを C または C++ の 変 数 として 宣 言 していないと、 コンパイラにより 警 告 が 表 示 されます。• イ ン ラ イ ンアセンブ ラ にレ ジ ス タ を 保 存 および 復 元 し ないで 下 さ い。 レジ ス タ の 保 存 および 復 元 は、 コ ンパ イ ラ に よ り 行 われます。 また、 インラインアセンブラは 物 理 レジスタに 直 接 アクセスできません。 詳 細 については、 「 仮 想 レ ジ ス タ」 (ページ 7-9) を 参 照 して 下 さい。CPSR と SPSR を 除 く レ ジ ス タ が、 書 き 込 まれていないのに 読 み 出 さ れた 場合 、 エ ラー メ ッ セージが 表 示 さ れます。 以 下 に 例 を 示 し ます。int f(int x){__asm{STMFD sp!, {r0}ADD r0, x, 1EOR x, r0, xLDMFD sp!, {r0}}return x;}// save r0 - illegal: read before write// restore r0 - not needed.上 記 の 関 数 は 以 下 の よ う に 記 述 する 必 要 があ り ます。int f(int x){int r0;__asm{ADD r0, x, 1EOR x, r0, x}return x;}詳 細 については、 「インラインアセンブリ 演 算 の 制 限 」 を 参 照 して 下 さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-5ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用7.1.3 イ ン ラ イ ンアセンブ リ 演 算 の 制 限イ ン ラ イ ンアセンブ リ コード で 実 行 でき る 演 算 には、 多 く の 制 限 があ り ます。こ の 制 限 に よ り 、 一 定 の 安 全 性 が 確 保 さ れるだけでな く 、 コ ンパイル さ れたC および C++ のコードの 前 提 が、 アセンブルされたアセンブリ コードで 破 られるこ とがあ り ません。種 々の 制 限イ ン ラ イ ンアセンブ ラ には、 以 下 の 制 限 があ り ます。• インラインアセンブラはハイレベルのアセンブラなので、 人 間 が 記 述 したとおりのコードが 生 成 されない 場 合 もあります。 コンパイラにより 生成 さ れる コー ド よ り 効 率 的 な コー ド を 生 成 する 目 的 に、 イ ン ラ イ ンアセンブラを 使 用 しないで 下 さい。 その よ う な 目 的 には、 組 み 込 みアセンブラまたは <strong>ARM</strong> アセンブラ armasm を 使 用 して 下 さい。• プ ロ グ ラ ムカ ウ ン タへの 分 岐 や 書 き 込 みな ど、 <strong>ARM</strong> アセンブラ armasmで 使 用 でき る ローレベルの 機 能 の 一 部 はサポー ト されません。• ラベル 式 はサポート されません。• ドット 記 法 (.) または {PC} を 使 用 して、 現 在 の 命 令 のア ド レスを 取 得するこ とはできません。• & 演 算 子 を 使 用 し て、 16 進 定 数 を 表 す こ と はで き ません。 16 進 定 数 を 表すには、 接 頭 文 字 0x を 使 用 し ます。 以 下 に 例 を 示 し ます。__asm { AND x, y, 0xF00 }• インラインアセンブリ 言 語 では、 8 ビ ッ ト 定 数 の 実 際 の ロ テー ト を 指 定する 表 記 法 を 使 用 できません。 つま り、 シフ ト した 8 ビッ ト 定 数 を 使 用する と、 NZCV フラグが 更 新 される 場 合 に、 C フラグが 壊 れていると 見なされます。• スタックを 変 更 しないで 下 さい。 作 業 レ ジ ス タ は 必 要 に 応 じ て 自 動 的 にス タ ッ ク さ れた り 復 元 さ れた り する ので、 ス タ ッ ク の 変 更 は 不 要 です。作 業 レ ジ ス タ を 明 示 的 にス タ ッ ク し た り 復 元 し た り する こ と はコ ンパイラでは 容 認 されていません。7-6 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用レジスタr0-r3、 sp、 lr などのレジスタ、 および CPSR の NZCV フラグを 使 用 する 場 合は、 注 意 が 必 要 です。 C または C++ の 式 を 使 用 する 場 合 、 こ れら のレ ジ ス タが 一 時 的 なレジスタと して 使 用 され、 式 を 評 価 するときにコンパイラによって NZCV フ ラ グが 壊 さ れる 場 合 があ り ます。 詳 細 については、 「 仮 想 レ ジ スタ」 (ページ 7-9) を 参 照 して 下 さい。物 理 レ ジ ス タ に 直 接 ア ク セスで き ないため、 イ ン ラ イ ンアセンブ リ コー ド を使 用 し て、 レ ジ ス タ pc、 lr、 および sp を 明 示 的 に 読 み 出 し た り 変 更 し た り することはできません。 ただし、 『コンパイ ラ リ ファレンスガイ ド』 で 説 明 されてい る 以 下 の コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する と 、 こ れら のレ ジ ス タ にアクセスできます。• 「__current_pc」 (ページ 4-83)• 「__current_sp」 (ページ 4-84)• 「__return_address」 (ページ 4-101)プロセッサモードユーザは、 プロセ ッサモード の 変 更 またはコプロセ ッ サ 状 態 の 変 更 が 可 能 ですが、 コ ンパイ ラではこれらの 変 更 が 認 識 されません。 プロセッサモードを変 更 する 場 合 、 プロセッサモードを 元 のモードに 戻 してから、 C または C++の 式 を 使 用 する 必 要 があ り ます。 こ れを 行 わない 場 合 、 新 し いプ ロ セ ッ サモード が 原 因 でレジス タがコ ンパイ ラによ って 壊 されます。同 様 に、 浮 動 小 数 点 命 令 を 実 行 する こ と で、 浮 動 小 数 点 コ プ ロ セ ッ サの 状 態を 変 更 する 場 合 、 状 態 を 元 に 戻 し てか ら 浮 動 小 数 点 式 を 使 用 する 必 要 があ ります。Thumb 命 令 セ ッ トC または C++ を Thumb 状 態 で コ ンパイルする と きは イ ン ラ イ ンアセンブ ラ を使 用 で き ません。 ま た、 イ ン ラ イ ンアセンブ ラ は Thumb 命 令 を アセンブル しません。 代 わ り に、 自 動 的 にコ ンパイ ラが <strong>ARM</strong> 状 態 に 切 り 替 わ り ます。Thumb 命 令 に コ ンパ イ ルする コー ド を 含 む ソ ース フ ァ イ ルに イ ン ラ イ ンアセンブ リ を 含 め る 場 合 、 イ ン ラ イ ン アセンブ ラ コー ド を 含 む 関 数 を #pragma armステート メン ト と #pragma thumb ステート メン トで 囲 んで 下 さい。 以 下 に 例 を 示します。... // Thumb code#pragma arm // <strong>ARM</strong> code. Switch code generation to the <strong>ARM</strong> instruction set so// that the inline assembler is available.<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-7ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用int add(int i, int j){int res;__asm{ADD res, i, j // add here}return res;}#pragma thumb// Thumb code. Switch back to the Thumb instruction set.// The inline assembler is no longer available.また、コードをコンパイルする 際 は、--apcs /interwork コンパイラオプションを 使 用する 必 要 があ り ます。詳 細 については、 以 下 を 参 照 し て 下 さ い。• 「イ ン ターワー ク 修 飾 子 」 (ページ 2-30)• 『コンパイ ラ リ ファレンスガイ ド』 の 「プラ グマ」 (ページ 4-62)VFP コプロセッサインラインアセンブラは、 VFP 命 令 を 直 接 サポー ト し ません。 ただし、 汎 用コプロセッサ 命 令 を 使 用 して VFP 命 令 を 指 定 で き ます。インラインアセンブリコードを 使 用 して VFP ベクタモードを 変 更 しないで 下さい。 インラインアセンブリには、 コンパイラにより 生 成 された VFP コードを 使 用 し て 評 価 する 浮 動 小 数 点 式 のオペラ ン ド を 含 め る こ と がで き ます。 したがって、 VFP の 状 態 がコ ンパイ ラによ ってのみ 変 更 される こ と が 重 要 です。サポート されていない 命 令イ ン ラ イ ンアセンブラでは、 以 下 の 命 令 がサポー ト されていません。• BKPT、 BX、 BXJ、 および BLX 命 令 。注__breakpoint() コ ンパイ ラ 組 み 込 み 関 数 を 使 用 する こ と で、C および C++のコードに BKPT 命 令 を 挿 入 で き ます。• LDR Rn, =expression 疑 似 命 令 。 代 わ り に、 MOV Rn, expression を 使 用 して 下さい (ただし、 リ テラルプールからのロード が 発 生 し ます)。• LDRT、 LDRBT、 STRT、 および STRBT 命 令 。7-8 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用• MUL、 MLA、 UMULL、 UMLAL、 SMULL、 および SMLAL フ ラ グ 設 定 命 令 。• 第 2 オペ ラ ン ド が 定 数 であ る MOV または MVN フ ラ グ 設 定 命 令 。• ユーザモード の LDM 命 令 。• ADR 疑 似 命 令 および ADRL 疑 似 命 令 。『コンパイ ラ リ ファレンスガイ ド』 の 「__breakpoint」 (ページ 4-80) を 参照 して 下 さい。7.1.4 仮 想 レ ジス タインラインアセンブラでは、 <strong>ARM</strong> プロセッサの 物 理 レジスタに 直 接 アクセスできません。 <strong>ARM</strong> レジスタの 名 前 がインラインアセンブラ 命 令 のオペランドとして 使 用 されている 場 合 、その 名 前 は 物 理 <strong>ARM</strong> レ ジ ス タへの 参 照 ではなく 、 同 じ 名 前 を 使 用 する 仮 想 レ ジ ス タへの 参 照 と な り ます。コ ンパイ ラ は、 最 適 化 と コー ド 生 成 の 間 に、 必 要 に 応 じ て 物 理 レ ジ ス タ を 各仮 想 レ ジ ス タ に 割 り 当 て ます。 ただし、 アセンブルされる コード 内 で 使 用 される 物 理 レ ジ ス タ が、 命 令 内 で 指 定 さ れてい る 物 理 レ ジ ス タ と 異 な る 場 合 があります。 これら の 仮 想 レ ジ ス タは、 通 常 の C 変 数 ま たは C++ 変 数 と し て 明示 的 に 定 義 で き ます。 仮 想 レ ジ ス タ が 定 義 さ れていない 場 合 、 コ ンパイ ラ によ ってそれら の 仮 想 レ ジ ス タは 暗 黙 に 定 義 さ れます。コ ンパイ ラ に よ って 定 義 さ れた 仮 想 レ ジ ス タ には 関 数 の ローカル 有 効 範 囲 が割 り 当 てられます。 つまり、 1 つの 関 数 内 で、 同 じ 仮 想 レ ジ ス タ 名 を 参 照 する 複 数 の asm ス テー ト メ ン ト ま たは 宣 言 が、 同 じ 仮 想 レ ジ ス タ にア ク セス します。sp (r13)、 lr (r14)、 および pc (r15) の 各 レジスタに 対 しては、 仮 想 レジスタは 作 成 されません。 そのため、 これらのレジスタに 対 しては、 インラインアセンブ リ コー ド 内 で 読 み 出 しや 直 接 変 更 を 行 う こ と はで き ません。 ソースコー ド の 変 更 方 法 の 詳 細 については、 「sp、 lr、 または pc にアクセスする 従 来のインラインアセンブラ」 (ページ 7-30) を 参 照 して 下 さい。仮 想 プロセッサ 状 態 レジスタ (PSR) は 存 在 し ません。 PSR への 参 照 は、 常 に物 理 PSR への 参 照 と な り ます。以 前 のガ イ ド ラ イ ンに 準 拠 し てい る 既 存 の イ ン ラ イ ンアセンブ ラ コー ド では、古 いバージ ョ ンのコ ンパイ ラ と 同 じ 機 能 が 実 行 されますが、 各 命 令 で 使 用 される 実 際 のレ ジ ス タ が、 異 な る 場 合 があ り ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-9ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用各 仮 想 レ ジ ス タ の 初 期 値 は 予 測 不 能 です。 仮 想 レ ジ ス タ を 読 み 出 すには、 その 前 に 書 き 込 みを 行 う 必 要 があ り ます。 仮 想 レ ジ ス タへの 書 き 込 みの 前 に 読み 出 しを 行 うと、コンパイラによりエラーが 生 成 されます。 例 えば、 変 数 r1に 関 連 付 け られた 仮 想 レ ジ ス タ を 読 み 出 し た 場 合 などです。C または C++ の コー ド 内 で 変 数 名 を 明 示 的 に 宣 言 する 必 要 があ り ます。 命 令のオペラ ン ドには C または C++ の 変 数 を 使 用 する こ と をお 勧 め し ます。 各 変換 ユニ ッ ト で、 仮 想 レジス タ または 物 理 レジス タの 名 前 が 初 めて 使 用 されるときに 1 回 のみ 警 告 が コ ンパ イ ラ に よ り 表 示 さ れます。 例 えば、 レジス タ r3を 指 定 し た 場 合 、 警 告 が 表 示 さ れます。7.1.5 定 数定 数 式 の 指 定 子 # は 省 略 可 能 です。 こ の 指 定 子 を 使 用 する 場 合 、 直 後 の 式 を 定数 にする 必 要 があ り ます。7.1.6 命 令 の 展 開インラインアセンブリコードの <strong>ARM</strong> 命 令 は、 コ ンパイル さ れたオブジ ェ クト 内 でいくつかの 命 令 に 展 開 されることがあります。 この 展 開 は、 命 令 の 種類 、 命 令 の 中 で 指 定 さ れる オペ ラ ン ド の 数 、 および 各 オペラ ン ド の 型 と 値 によって 異 なります。定 数 を 使 用 する 命 令定 数 オペラ ン ド を 伴 う 命 令 で 使 用 さ れる 定 数 は、 その 命 令 で 許 容 さ れてい る値 に 制 限 されません。 代 わ り に、 コ ンパ イ ラ に よ り 、 命 令 は 同 等 の 効 果 がある 命 令 のシーケンスに 変 換 されます。 以 下 に 例 を 示 し ます。ADD r0,r0,#1023上 記 の 命 令 は、 以 下 の よ う に 変 換 さ れます。ADD r0,r0,#1024SUB r0,r0,#1コ プ ロ セ ッ サ 命 令 を 除 き、 定 数 オペラ ン ド を 伴 う すべての <strong>ARM</strong> 命 令 は 命 令の 展 開 をサポー ト し ます。 また、MUL 命 令 は、 第 3 オペラ ン ド が 定 数 であ る 場合 、 加 算 と シ フ ト のシーケン スに 展 開 で き ます。7-10 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用展 開 し た 命 令 で CPSR を 更 新 する と 、 以 下 の 効 果 があ り ます。• 算 術 命 令 で、 NZCV フラグが 正 しく 設 定 されます。• 論 理 命 令 で、 以 下 の こ と が 行 われます。— NZ フラグが 正 しく 設 定 されます。— V フラグが 変 更 されません。— C フラグが 壊 されます。ロード / ストア 命 令LDM、 STM、 LDRD、 および STRD の 各 命 令 は、 同 じ 働 き の <strong>ARM</strong> 命 令 に 置 き 換 わ ることがあります。 こ の 場 合 、 コ ンパイ ラ に よ り 命 令 の 展 開 が 行 われる 可 能 性があ る こ と を 通 知 する 警 告 メ ッ セージが 表 示 さ れます。イ ン ラ イ ンアセンブ リ コー ド は、 見 込 まれる 命 令 の 数 や、 指 定 し た 各 命 令 の予 想 実 行 時 間 に 左 右 さ れない よ う に 記 述 する 必 要 があ り ます。LDRD、 STRD な ど、 一 般 的 にオペラ ン ド レ ジ ス タ の 対 に 制 約 があ る 命 令 は、 機 能が 同 じで 制 約 がない 命 令 のシーケン スに 置 き 換 わ り ます。 ただし、 これらの命 令 が、 LDRD 命 令 および STRD 命 令 に 再 連 結 さ れる こ と があ り ます。LDM 命 令 と STM 命 令 はすべて、 効 果 が 同 じ LDR 命 令 と STR 命 令 のシーケ ン スに 展開 されます。 ただ し、 後 で 最 適 化 する と き に、 個 々の 命 令 が LDM 命 令 ま たはSTM 命 令 に 再 連 結 さ れる こ と があ り ます。7.1.7 条 件 フ ラ グイ ン ラ イ ンアセンブ リ 命 令 に よ って、 プ ロ セ ッ サ 条 件 フ ラ グの 更 新 が 明 示 的または 暗 黙 に 試 行 される 場 合 があり ます。 仮 想 レ ジ ス タ オペラ ン ド ま たは 単純 式 オペラ ン ド (「「オペラ ン ド」 (ページ 7-12)」 を 参 照 ) のみが 使 用 さ れるイ ン ラ イ ンアセンブ リ 命 令 の 動 作 は 予 測 で き ます。 暗 黙 ま たは 明 示 的 な 更 新が 指 定 されている 場 合 には、 条 件 フ ラ グは 命 令 によ ってセ ッ ト されます。 更新 が 指 定 されていなければ、 条 件 フ ラ グは 変 更 されません。 命 令 オペラ ン ドのいずれかが 単 純 オペラ ン ド ではない 場 合 には、 その 命 令 に よ っ て 条 件 フ ラグが 更 新 さ れない 限 り 、 条 件 フ ラ グが 壊 れる 可 能 性 があ り ます。 通 常 、 コ ンパイ ラ では 条 件 フ ラ グが 壊 れる 可 能 性 を 簡 単 には 診 断 でき ません。 ただし、C++ の 一 時 領 域 を 構 成 し、 その 後 それを 破 棄 する 必 要 のあ る オペラ ン ド がある 場 合 は、 命 令 によって 条 件 フラグの 更 新 が 試 行 される と、 コンパイ ラによって 警 告 が 生 成 されます。 こ れは、 一 時 領 域 の 破 棄 に よ っ て 条 件 フ ラ グが壊 れる 可 能 性 があ る ためです。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-11ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用7.1.8 オペラン ドオペラ ン ド にはい く つかの 型 があ り ます。仮 想 レ ジス タインラインアセンブリ 命 令 で 指 定 したレジスタは、 物 理 <strong>ARM</strong> 整 数 レ ジ ス タではな く 、 常 に 仮 想 レジス タ を 表 し ます。 仮 想 レ ジ ス タ に 宣 言 は 必 要 あ り ません。 ま た、 仮 想 レ ジ ス タ のサ イ ズは 物 理 レ ジ ス タ と 同 一 です。 ただし、 アセンブルされるコード 内 で 使 用 される 物 理 レジスタが、 命 令 内 で 指 定 されてい る 物 理 レ ジ ス タ と 異 な る 場 合 があ り ます。 詳 細 については、 「 仮 想 レ ジ スタ」 (ページ 7-9) を 参 照 して 下 さい。式 オペラ ン ドイ ン ラ イ ンアセンブ リ 命 令 のレ ジ ス タ オペラ ン ド と し て、 関 数 の 引 数 、 C または C++ の 変 数 、 およびその 他 C または C++ の 式 を 指 定 でき ます。<strong>ARM</strong> 整 数 レ ジ ス タ の 代 わ り に 使 用 する 式 は、 long long を 除 く 整 数 型 (char、short、 int、 long のいずれか)、 ま たはポ イ ン タ 型 にする 必 要 があ り ます。 char型 または short 型 に 対 する 符 号 拡 張 は 実 行 さ れません。 そのため、 この 2 つの型 には、 明 示 的 に 符 号 拡 張 を 実 行 する 必 要 があ り ます。 これらの 式 を 評 価 してレジスタに 割 り 当 てるため、 コンパイラによってコードが 追 加 される 場 合があ り ます。デステ ィネーシ ョ ン と してオペラン ドが 使 用 されている と き、 レジスタを 修正 する 場 合 にオペラ ン ド と し て 使 用 する 式 は 修 正 可 能 な 左 辺 値 でなければなりません。 例 えば、 デス テ ィ ネーシ ョ ン レ ジ ス タ ま たはベース レ ジ ス タ が 更新 されるベースレジスタがこれに 当 たり ます。複 数 の 式 オペラ ン ド を 含 む 命 令 において、 式 オペラ ン ド が 評 価 さ れる 順 序 は決 まっていません。条 件 付 き 命 令 の 式 オペラ ン ド は、 命 令 の 条 件 が 真 であ る 場 合 に 限 り 評 価 さ れます。インラインアセンブラのオペランドとして C または C++ の 式 を 使 用 する と 、1 つの 命 令 が 複 数 の 命 令 に 展 開 さ れる 場 合 があ り ます。 展 開 は、 式 の 値 が、『<strong>ARM</strong> アーキテクチャ リ フ ァ レンスマニュアル』 に 記 載 されている 命 令 オペラン ドの 制 約 を 満 たしていない 場 合 に 行 われます。オペラ ン ド と し て 使 用 さ れる 式 に よ り 一 時 領 域 が 作 成 さ れ、 そのレ ジ ス タ を破 棄 する 必 要 があ る 場 合 、 イ ン ラ イ ンアセンブ リ 命 令 を 実 行 し た 後 で 破 棄 が行 われます。 こ れは、 一 時 領 域 を 破 棄 する C++ の 規 則 に 似 ています。7-12 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用単 純 式 オペラ ン ド は 以 下 のいずれかにな り ます。• 変 数 の 値• 変 数 のア ド レ ス• ポ イ ン タ 変 数 の 間 接 参 照• コンパイル 時 の 定 数以 下 のいずれかを 含 む 式 は、 単 純 式 オペラ ン ド ではあ り ません。• 除 算 などでの 暗 黙 の 関 数 呼 び 出 し、 ま たは 明 示 的 な 関 数 呼 び 出 し• C++ 一 時 領 域 の 構 築• 算 術 演 算 ま たは 論 理 演 算レジスタリストレジスタ リ ス トには 最 大 16 個 のオペラ ン ド を 列 挙 で き ます。 列 挙 で き る のは、仮 想 レ ジ ス タ ま たは 式 のレ ジ ス タ オペラ ン ド です。レ ジ ス タ リ ス ト 内 で 仮 想 レ ジ ス タ と 式 オペラ ン ド を 指 定 する 順 番 は 重 要 です。レジス タ リ ス ト のオペラ ン ド の 読 み 出 し と 書 き 込 みは、 左 から 右 に 行 われます。 最 初 のオペラ ン ド は 最 下 位 ア ド レ ス を 使 用 し、 後 続 のオペラ ン ド は 前 のアドレスを 4 ずつイ ン ク リ メ ン ト し て 得 られる ア ド レ ス を 使 用 し ます。 LDM 命令 または STM 命 令 の 通 常 の 演 算 では、 最 も 番 号 が 小 さ い 物 理 レ ジ ス タ が 最 下位 ア ド レ スに 常 に 保 存 されますが、 それ と は 逆 の 新 しい 動 作 です。 この 動 作の 違 いは、 レ ジ ス タ の 仮 想 化 に よ る も のです。式 オペラ ン ド や 仮 想 レ ジ ス タは、 レ ジ ス タ リ ス ト に 複 数 回 列 挙 で き ます。 それらは 指 定 されているごとに 使 用 されます。ベース レ ジ ス タ の 更 新 は、 指 定 し た 場 合 に 行 われます。 更 新 に よ っ て、 ベース レ ジ ス タ に ロー ド さ れてい る 値 は メ モ リ ロー ド の と き に 上 書 き さ れます。レジスタ リ ス トの 後 に ^ を 指 定 してユーザモードのレジス タを 特 権 モードで動 作 させる こ と は、 イ ン ラ イ ンアセンブ ラ ではサポー ト さ れていません。イミディエートオペランド整 数 型 の C または C++ の 定 数 式 を、 イ ン ラ イ ンアセンブ リ 命 令 の イ ミ デ ィエー ト 値 と し て 使 用 する こ と があ り ます。イ ミ デ ィ エー ト シ フ ト を 指 定 する ための 定 数 式 は、 『<strong>ARM</strong> アーキテクチャ リファレンスマニュアル』 に 定 め ら れた、 そのシ フ ト 演 算 に 適 し た 範 囲 内 に 収め る 必 要 があ り ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-13ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用メ モ リ ま たはコ プ ロ セ ッ サのデータ 転 送 命 令 で 使 用 する イ ミ デ ィ エー ト オフセ ッ ト を 指 定 する ための 定 数 式 には、 適 切 に 境 界 整 列 さ れる 値 を 使 用 する 必要 があ り ます。7.1.9 関 数 呼 び 出 し と 分 岐インラインアセンブラで 記 述 された BL 命 令 と SVC 命 令 を 使 用 し て、 通 常 の 命令 フ ィールドの 後 に 3 つのオプシ ョ ン リ ス ト を 指 定 でき ます。 こ れ ら の 命 令 の形 式 は 以 下 の と お り です。SVC{cond} svc_num, {input_param_list}, {output_value_list}, {corrupt_reg_list}BL{cond} function, {input_param_list}, {output_value_list}, {corrupt_reg_list}注SVC 命 令 は 以 前 は SWI という 名 前 でした。 インラインアセンブラは 引 き 続 き、SVC の 代 わ り に SWI を 受 け 入 れます。以 下 のセ ク シ ョ ンでは、 こ れ ら の リ ス ト について 説 明 し ます。• 「 リ ス ト が 指 定 さ れていない 場 合 」• 「 入 力 パ ラ メ ータ リ ス ト 」 (ページ 7-15)• 「 出 力 値 リ ス ト 」 (ページ 7-15)• 「 破 壊 レ ジ ス タ リ ス ト 」 (ページ 7-16)注• インラインアセンブラでは、BX、 BLX、 および BXJ 命 令 がサポー ト さ れていません。• 入 力 レジスタリスト、 出 力 レジスタリスト、 破 壊 レジスタリストのいずれにおいて も、 lr、 sp、 pc のどのレジスタ も 指 定 できません。• sp レジスタは、SVC 命 令 ま たは 関 数 呼 び 出 し で 変 更 し ないで 下 さ い。リス トが 指 定 されていない 場 合リ ス ト が 指 定 さ れていない 場 合 は、 以 下 の よ う に 処 理 さ れます。• r0-r3 が 入 力 パラ メ ータ と し て 使 用 されます。• r0 が 出 力 値 と し て 使 用 されます。• r12 および r14 は 破 損 し てい る 可 能 性 があ り ます。7-14 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用入 力 パラ メ ー タ リ ス ト入 力 パ ラ メ ータ リ ス ト では、 関 数 呼 び 出 し ま たは SVC 命 令 への 入 力 パ ラ メ ータとなる、 式 または 変 数 と、 その 式 または 変 数 を 保 持 する 物 理 レジスタが 指定 されます。 こ れらは 物 理 レ ジ ス タへの 引 数 ま たは 物 理 レ ジ ス タ 名 と し て 指定 されます。 1 つの リ ス ト の 中 で、 入 力 レジス タ を この 2 種 類 の 方 法 で 指 定 できます。イ ン ラ イ ンアセンブ ラ を 使 用 する こ と に よ り 、BL または SVC 命 令 が 開 始 さ れる前 に、 指 定 された 物 理 レジス タ 内 に 正 しい 値 が 保 持 されます。 引 数 を 取 らない 物 理 レジスタ 名 が 指 定 される こ とで、 同 じ 名 前 の 仮 想 レジスタ 内 の 値 が、その 物 理 レ ジ ス タ 内 に 渡 さ れます。 これによって 既 存 のインラインアセンブラ コー ド と の 下 位 互 換 性 が 保 たれます。例 えば、 以 下 の 命 令BL foo, { r0=expression1, r1=expression2, r2 }からは、 以 下 の 疑 似 コード が 生 成 されます。MOV (physical) r0, expression1MOV (physical) r1, expression2MOV (physical) r2, (virtual) r2BL foo出 力 値 リ ス ト出 力 値 リ ス ト では、 BL または SVC 命 令 か ら の 出 力 値 を 保 持 する 物 理 レ ジ ス タと 、 それら の 出 力 値 を ス ト アする 場 所 が 指 定 さ れます。 こ れら の 出 力 値 は、物 理 レ ジ ス タ か ら 修 正 可 能 な 左 辺 値 式 への 引 数 と し て、 ま たは 個 々の 物 理 レジスタの 名 前 と して 指 定 されます。インラ インアセンブラは、 指 定 された 物 理 レジスタから 値 を 取 得 し、 指 定 された 式 にそれらの 値 を 代 入 し ます。 引 数 な し で 物 理 レ ジ ス タ 名 が 指 定 さ れている と、 同 じ 名 前 の 仮 想 レジスタが、 その 物 理 レジスタから 取 得 した 値 で 更新 されます。例 えば、 以 下 の 命 令BL foo, { }, { result1=r0, r1 }からは、 以 下 の 疑 似 コード が 生 成 されます。BL fooMOV result1, (physical) r0MOV (virtual) r1, (physical) r1<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-15ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用破 壊 レ ジス タ リ ス ト破 壊 レ ジ ス タ リ ス ト では、 呼 び 出 さ れる 側 の 関 数 に よ り 破 壊 さ れる 物 理 レ ジスタが 指 定 されます。 呼 び 出 される 側 の 関 数 によ り 条 件 フラグが 変 更 される場 合 、 破 壊 レ ジ ス タ リ ス ト に PSR を 指 定 する 必 要 があ り ます。BL 命 令 と SVC 命 令 は、 常 に lr を 壊 し ます。このリ ス トを 省 略 した 場 合 に、BL 命 令 と SVC 命 令 を 使 用 する と 、 レ ジ ス タr0-r3、 pc、 lr、 および PSR が 壊 れます。分 岐 命 令 B は、 C または C++ の 単 一 の 関 数 内 で ラベルにジ ャ ンプする 場 合 にのみ 使 用 し て 下 さ い。7.1.10 ラベルイ ン ラ イ ンアセンブ リ コー ド で 定 義 さ れる ラベルは、 分 岐 の ターゲ ッ ト 、 または C や C++ の goto ステート メン トのターゲッ ト として 使 用 できます。 C および C++ で 定 義 される ラベルは、 以 下 の 形 式 で、 イ ン ラ イ ンアセンブ リ コード 内 の 分 岐 命 令 の ターゲ ッ ト と し て 使 用 で き ます。BL{cond} label7.1.11 旧 バージ ョ ンの <strong>ARM</strong> C/C++ コ ンパイ ラ との 相 違 点<strong>ARM</strong> コンパイラのインラインアセンブラと、 旧 バージョンの <strong>ARM</strong> C/C++ コンパイ ラのインラ インアセンブラ との 間 には、 大 きな 違 いがあ り ます。 このセクションでは、 その 主 な 違 いについて 説 明 します。 インラインアセンブラ用 の 既 存 のアセンブ リ コー ド の 使 用 方 法 については、 <strong>RealView</strong> <strong>Compilation</strong><strong>Tools</strong> の 『デベロ ッ パガ イ ド 』 を 参 照 して 下 さい。<strong>ARM</strong>v6 命 令すべての <strong>ARM</strong>v6 命 令 の う ち、 イ ン ラ イ ンアセンブ ラ でサポー ト さ れるのは<strong>ARM</strong>v6 メディア 命 令 のみです。仮 想 レ ジス タコンパイラのインラインアセンブリ コードでは、 常 に 仮 想 レジスタが 指 定 されます。 コー ド 生 成 時 に、 各 命 令 に 使 用 する 物 理 レ ジ ス タ が 選 択 さ れ、 アセンブ リ コード と 周 辺 の C コード または C++ コー ド が 完 全 に 最 適 化 さ れます。7-16 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用pc (r15)、 lr (r14)、 sp (r13) のレジスタにはアクセスできません。 これらのレジス タへのア ク セスが 試 行 される と、 エラー メ ッ セージが 生 成 されます。仮 想 レ ジ ス タ の 初 期 値 は 定 義 さ れていません。 したがって、 仮 想 レジスタを読 み 出 すには、 その 前 に 書 き 込 みを 行 う 必 要 があ り ます。 コードによって 仮想 レジス タへの 書 き 込 みの 前 に 読 み 出 しが 行 われる と 、 コ ンパイ ラによ り 警告 が 生 成 さ れます。 また、 インラインアセンブリ コードの 最 初 で 物 理 レジスタ 内 の 特 定 の 値 に 依 存 する 従 来 のコード について も、 コ ンパイ ラは 同 様 の 警告 を 生 成 します。 以 下 に 例 を 示 し ます。int add(int i, int j){int res;__asm{ADD res, r0, r1}return res;}// relies on i passed in r0 and j passed in r1上 記 の コー ド を 実 行 する と 、 警 告 と エ ラー メ ッ セージが 表 示 さ れます。これらのエラーの 原 因 は、 仮 想 レジスタ r0 および r1 が 書 き 込 み 前 に 読 み 出 されるためです。 また、 これらの 警 告 の 原 因 は、r0 および r1 が C または C++ の変 数 と し て 定 義 さ れる 必 要 があ る ためです。 正 しいコードを 以 下 に 示 します。int add(int i, int j){int res;__asm{ADD res, i, j}return res;}命 令 の 展 開コンパイラのインラインアセンブラは、LDM、 STM、 LDRD、 STRD の 各 命 令 を、 同じ 機 能 を 実 行 する 単 一 レ ジ ス タ メ モ リ 演 算 命 令 のシーケ ン スに 展 開 し ます。単 一 レ ジ ス タ メ モ リ 演 算 命 令 のシーケン ス を 多 重 レ ジ ス タ メ モ リ 演 算 命 令 に戻 し て 最 適 化 する 場 合 があ り ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-17ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用レジスタリストLDM 命 令 ま たは STM 命 令 のレ ジ ス タ リ ス ト 内 では、 オペラ ン ド の 順 序 が 重 要 です。 オペラ ン ド は 指 定 された 順 序 で、 つま り 左 から 右 の 順 序 で 使 用 され、 最初 のオペラ ン ド は 生 成 さ れた 最 下 位 メ モ リ ア ド レ ス を 参 照 し ます。 この 動 作は、 命 令 に よ って 生 成 さ れる 最 下 位 メ モ リ ア ド レ ス を 最 も 番 号 が 小 さ いレ ジス タが 常 に 参 照 する、 以 前 のコ ンパイ ラの 動 作 と は 異 な り ます。レジスタ リ ス ト 内 では、 仮 想 レジスタだけでなく、 式 オペランド も 使 用 できる よ う になったため、 こ の 動 作 が 変 更 さ れま し た。 コンパイラは、 仮 想 レジスタしか 含 まれないレジスタ リ ス ト を 検 出 し、 新 しい 順 序 付 けによる 結 果 が以 前 の <strong>ARM</strong> C/C++ コ ンパイ ラ と は 異 な る 場 合 に、 警 告 メ ッ セージを 生 成 し ます。Thumb 命 令コンパイラのインラインアセンブラは Thumb ® 命 令 セ ッ ト をサポー ト し ません。 また、Thumb 命 令 を アセンブルする こ と も で き ません。 #pragma arm プラグマおよび #pragma thumb プラグマを 使 用 しない 限 り、 Thumb 状 態 で C またはC++ を コ ンパ イルする 場 合 に も イ ン ラ イ ンアセンブ ラ を 使 用 する こ と はで きません (「Thumb 命 令 セ ッ ト 」 (ページ 7-7) を 参 照 )。7-18 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用7.2 組 み 込 みアセン ブ ラ<strong>ARM</strong> コ ンパ イ ラ を 使 用 し て、 C または C++ で 記 述 し た 1 つまたは 複 数 の 関 数定 義 内 に、 ア ウ ト オブ ラ イ ンアセンブ リ コー ド を 含 め る こ と がで き ます。 組み 込 みアセンブ ラ では、 ターゲ ッ ト プ ロ セ ッ サへの 低 レベルのア ク セス を 無制 限 に 実 行 で き ます。 ま た、 こ のアセンブ ラ に よ り 、 C および C++ のプ リ プロ セ ッ サデ ィ レ ク テ ィ ブを 使 用 で き る よ う にな る ため、 構 造 体 メ ンバのオフセッ トに 簡 単 にアクセスできます。<strong>ARM</strong> プ ロ セ ッ サ 用 のアセンブ リ 言 語 の 記 述 については、 『アセンブラガイ ド』を 参 照 して 下 さい。7.2.1 組 み 込 みアセンブ ラ 構 文組 み 込 みアセンブ リ 関 数 定 義 は、 関 数 修 飾 子 __asm (C および C++) またはasm (C++) によ ってマーク され、 以 下 に 対 し て 使 用 でき ます。• メンバ 関 数• 非 メンバ 関 数• テンプレート 関 数• テンプレート ク ラス メンバ 関 数__asm または asm で 宣 言 される 関 数 は 引 数 を 取 る こ と ができ、 型 を 返 し ます。これらの 関 数 は、 C や C++ の 通 常 の 関 数 と 同 じ よ う に、 C や C++ か ら 呼 び 出されます。 組 み 込 みアセンブ リ 関 数 の 構 文 は 以 下 の と お り です。__asm return-type function-name(parameter-list){// <strong>ARM</strong>/Thumb/Thumb-2 assembler codeinstruction{;comment}...instruction}組 み 込 みアセンブ ラ の 初 期 状 態 (<strong>ARM</strong> か Thumb か) は、 コマン ド ラ イ ンで指 定 し た コ ンパ イ ラ の 初 期 状 態 に よ って 決 ま り ます。 つま り、 以 下 のこ と を意 味 し ます。• コンパイラが <strong>ARM</strong> 状 態 で 起 動 し た 場 合 、 組 み 込 みアセンブ ラ では --armが 使 用 されます。• コンパイラが Thumb 状 態 で 起 動 し た 場 合 、 組 み 込 みアセンブ ラ では--thumb が 使 用 されます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-19ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用各 関 数 の 先 頭 にあ る 組 み 込 みアセンブ ラ の 状 態 は、 #pragma arm プラグマおよび #pragma thumb プラ グマで 変 更 された よ う に、 コ ンパイ ラの 呼 び 出 しで 設 定されています。組 み 込 みアセンブ ラ の 状 態 は、 関 数 内 部 で も 変 更 で き ます。 こ れを 行 う には、組 み 込 みアセンブ ラ 関 数 で、 <strong>ARM</strong>、 THUMB、 または CODE16 ディレクティブを 明 示的 に 使 用 し ます。 これらのディレクティブを __asm 関 数 内 で 使 用 し て も、 後 続の __asm 関 数 の 状 態 (<strong>ARM</strong> か Thumb か) には 影 響 し ません。Thumb-2 対 応 のプ ロ セ ッ サ 用 にコ ンパ イルを 実 行 し てい る 場 合 は、 Thumb 状態 で Thumb-2 命 令 を 使 用 で き ます。注パ ラ メ ータ リ ス ト 内 に 引 数 名 を 指 定 する こ と がで き ますが、 こ れら の 引 数 名は 組 み 込 みアセンブ リ 関 数 の 本 体 内 では 使 用 で き ません。 例 えば、 以 下 の 関数 では、 関 数 の 本 体 で 整 数 i が 使 用 されていますが、 アセンブ リ ではこの 整数 は 無 効 と な り ます。__asm int f(int i){ADD i, i, #1 // error}例 えば、 このよ う な 場 合 は、 i の 代 わ り に r0 を 使 用 する こ とができますC や C++ の ソース 内 で 使 用 する 組 み 込 みアセンブ リ 言 語 の 詳 細 については、『デベロ ッ パガ イ ド 』 の C、 C++、 およびアセンブリ 言 語 の 混 用 に 関 する 章 を参 照 し て 下 さ い。組 み 込 みアセンブ ラの 例例 7-1 に、 組 み 込 みアセンブ ラルーチン と し ての 文 字 列 コ ピールーチン を 示します。例 7-1 組 み 込 みセンブ ラ を 使 用 し た 文 字 列 のコ ピー#include __asm void my_strcpy(const char *src, char *dst){loopLDRB r2, [r0], #1STRB r2, [r1], #1CMP r2, #07-20 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用BNE loopBX lr}int main(void){const char *a = "Hello world!";char b[20];my_strcpy (a, b);printf("Original string: '%s'\n", a);printf("Copied string: '%s'\n", b);return 0;}7.2.2 組 み 込 みアセンブ リ の 制 限組 み 込 みアセンブ リ 関 数 には 以 下 の 制 約 条 件 があ り ます。• 前 処 理 の 後 に __asm 関 数 が 保 持 でき るのは、 以 下 の 識 別 子 を 除 く アセンブリコードのみです (「 関 連 ベース ク ラ スのキーワー ド 」 (ページ 7-25)および 「メンバ 関 数 クラスのキーワード」 (ページ 7-26) を 参 照 )。__cpp(expr)__offsetof_base(D, B)__mcall_is_virtual(D, f)__mcall_is_in_vbase(D, f)__mcall_offsetof_base(D, f)__mcall_this_offset(D, f)__vcall_offsetof_vfunc(D, f)• __asm 関 数 に 関 し ては、 コ ンパイ ラ に よ って 生 成 さ れる 復 帰 命 令 はあ りません。 __asm 関 数 か ら 復 帰 する には、 復 帰 命 令 を アセンブ リ コー ド で 記述 し、 この 関 数 の 本 体 内 に 含 める 必 要 があ り ます。注組 み 込 みアセンブ ラ では、 __asm 関 数 が 必 ず 定 義 さ れた 順 序 で 発 行 さ れるため、 上 記 の 処 理 によって 1 つの 関 数 か ら 次 の 関 数 へ 移 る こ と が 可 能にな り ます。 ただし、 インラ イン 関 数 とテンプレー ト 関 数 では 動 作 が 異なります (「 組 み 込 みアセンブ リ 関 数 の 生 成 」 (ページ 7-22) を 参 照 )。• 適 用 さ れる AAPCS 規 則 が __asm 関 数 に よ って 変 更 さ れる こ と はあ り ません。 つま り、 __asm 関 数 が 使 用 で き る アセンブ リ コー ド ( 状 態 変 更 な ど)に 制 限 がな く て も、 __asm 関 数 と 通 常 の C/C++ 関 数 と の 間 のすべての 呼び 出 し は、 AAPCS に 準 拠 し ている 必 要 があ り ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-21ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用7.2.3 組 み 込 みアセンブ リ と C/C++ との 式 の 相 違 点組 み 込 みアセンブ リ と C/C++ には 以 下 の 違 いがあ り ます。• アセンブラ 式 は 常 に 符 号 なしです。 同 じ 式 でも、 アセンブラ と C またはC++ では、 値 が 異 な る 場 合 があ り ます。 以 下 に 例 を 示 し ます。MOV r0, #(-33554432 / 2)MOV r0, #__cpp(-33554432 / 2)// result is 0x7f000000// result is 0xff000000• 先 行 ゼ ロ を 伴 う アセンブ ラ の 数 値 は 10 進 数 です。 以 下 に 例 を 示 し ます。MOV r0, #0700 // decimal 700MOV r0, #__cpp(0700) // octal 0700 == decimal 448• アセンブ ラ の 演 算 子 の 優 先 順 位 は、 C/C++ での 優 先 順 位 と 異 な り ます。以 下 に 例 を 示 し ます。MOV r0, #(0x23 :AND: 0xf + 1) // ((0x23 & 0xf) + 1) => 4MOV r0, #__cpp(0x23 & 0xf + 1) // (0x23 & (0xf + 1)) => 0• アセンブ ラ で 記 述 さ れる 文 字 列 の 終 端 は NULL ではあ り ません。DCB "Hello world!"DCB __cpp("Hello world!")// 12 bytes (no trailing null)// 13 bytes (trailing null)注アセンブ ラ の 規 則 は __cpp の 外 で 適 用 され、C または C++ の 規 則 は __cpp. S の中 で 適 用 されます。 詳 細 については、 「__cpp キーワード」 (ページ 7-24) を参 照 し て 下 さ い。7.2.4 組 み 込 みアセンブ リ 関 数 の 生 成1 つの 変 換 ユニ ッ ト 内 のすべての __asm 関 数 の 本 体 は、 <strong>ARM</strong> アセンブラに 渡される 1 つのフ ァ イルに 結 合 されるかのよ う にアセンブルされます。 アセンブラに 渡 されるアセンブリ ファイル 内 の __asm 関 数 の 順 序 は、 テンプレー ト の インスタンスを 使 用 して 生 成 される 関 数 を 除 き、 ソースファイル 内 での 順 序 と同 じになり ます。注復 帰 命 令 を 省 略 し た 場 合 、 フ ァ イル 内 の 1 つの __asm 関 数 の 最 後 から 次 の 関 数に 移 る こ と によ り 、 __asm 関 数 同 士 で 制 御 を 受 け 渡 すこ と が 可 能 です。7-22 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用armcc を 呼 び 出 す 場 合 、 アセンブ ラ に よ って 生 成 さ れたオブジ ェ ク ト フ ァ イルが コ ンパ イ ラ のオブジ ェ ク ト フ ァ イ ルに 結 合 さ れます。 こ の 結 合 に 使 用 さ れる 部 分 リ ンクによって 1 つのオブジェ ク ト フ ァ イルが 生 成 されます。コンパイラは、 各 __asm 関 数 に 1 つの AREA デ ィ レ ク テ ィ ブを 生 成 し ます。例 7-2 にこの 例 を 示 します。例 7-2 __asm 関 数#include struct X{int x,y;void addto_y(int);};__asm void X::addto_y(int){LDR r2, [r0, #__cpp(offsetof(X, y))]ADD r1, r2, r1STR r1, [r0, #__cpp(offsetof(X, y))]BX lr}以 下 が 生 成 さ れます。AREA ||.emb_text||, CODE, READONLYEXPORT |_ZN1X7addto_yEi|#line num "file"|_ZN1X7addto_yEi| PROCLDR r2, [r0, #4]ADD r1, r2, r1STR r1, [r0, #4]BX lrENDPENDoffsetof は、cstddef ヘッダファイルから 取 得 される 通 常 の offsetof マクロであるため、__cpp() の 中 で 使 用 する 必 要 があ り ます。通 常 の __asm 関 数 は、 .emb_text という 名 前 の ELF セクションに 配 置 されます。つま り 、 組 み 込 みアセンブ リ 関 数 が イ ン ラ イ ン 展 開 さ れる こ と はあ り ません。ただし、 暗 黙 にインス タンス 生 成 されたテンプレー ト 関 数 と、 インラ イン 関数 のア ウ ト オブラ イ ン コ ピーは、 その 関 数 の 名 前 が 付 いた、 共 通 であ る こ とを 示 す 特 別 な 属 性 が 設 定 さ れたエ リ アに 配 置 さ れます。 これによ り、 この 種の 関 数 の 特 別 なセマンテ ィ ク スが 維 持 さ れます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-23ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用注イ ン ラ イ ン 関 数 と テンプレー ト 関 数 のア ウ ト オブ ラ イ ン コ ピーは、 使 用 さ れるエ リ アの 命 名 が 特 殊 であ るため、 定 義 された 順 序 ではな く 、 任 意 の 順 序 で配 置 さ れます。 したがって、 コード 実 行 は 必 ずしもインライン 関 数 またはテンプレート 関 数 から 別 の __asm 関 数 に 移 る と は 限 り ません。7.2.5 __cpp キーワー ド__cpp キーワー ド を 使 用 する と 、 外 部 リ ンケージを 使 用 するデータ ま たは 関 数のア ド レスなど、 C または C++ のコ ンパイル 時 の 定 数 式 にアセンブ リ コードからアクセスできます。 __cpp 内 の 式 には、 C++ のスタティ ッ クな 初 期 化 で 使用 する のに 適 し た 定 数 式 を 指 定 する 必 要 があ り ます。 ISO/IEC 14882:2003 の「3.6.2 Initialization of non-local objects」 および 「5.19 Constant expressions」 を 参照 して 下 さい。例 7-3 に、 __cpp(expr) に 置 き 換 え る こ と がで き る 定 数 を 示 し ます。例 7-3 __cpp(expr)LDR r0, =__cpp(&some_variable)LDR r1, =__cpp(some_function)BL __cpp(some_function)MOV r0, #__cpp(some_constant_expr)__cpp 式 で 使 用 さ れてい る 名 前 は、 __asm 関 数 の C++ コンテキストでルックアップされます。 __cpp 式 で 得 ら れる 名 前 はすべて 必 要 に 応 じ て 符 号 化 され、その 名 前 に 生 成 された IMPORT ステート メン トが 自 動 的 に 割 り 当 てられます。7-24 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用7.2.6 手 動 によ る 多 重 定 義 の 解 決例 7-4 に、 C++ のキ ャ ス ト を 使 用 し た、 非 仮 想 関 数 呼 び 出 し の 多 重 定 義 の 解決 を 示 し ます。例 7-4 C++ のキャ ス トvoid g(int);void g(long);struct T{int mf(int);int mf(int,int);};__asm void f(T*, int, int){BL __cpp(static_cast(&T::mf)) // calls T::mf(int, int)BL __cpp(static_cast(g)) // calls g(int)BX lr}7.2.7 関 連 ベース ク ラ スのキーワー ド以 下 のキーワー ド を 使 用 し て、 オブジ ェ ク ト の 開 始 位 置 か ら、 そのオブジ ェク ト 内 のベース ク ラ スサブオブジ ェ ク ト までのオフセ ッ ト を 決 定 で き ます。__offsetof_base(D, B)B は、 D の 明 白 な 非 仮 想 ベース ク ラ スであ る 必 要 があ り ます。D オブジ ェ ク ト の 開 始 位 置 か ら、 そのオブジ ェ ク ト 内 の B ベースサブオブジェ ク ト の 開 始 位 置 までのオフセッ ト を 返 し ます。 結 果がゼロになる こ と も あ り ます。 例 7-5 (ページ 7-26) に、static_cast(p) と 等 価 な コー ド を 実 装 する ために D* p に 加 算する 必 要 のあ る オフセ ッ ト (バ イ ト 単 位 ) を 示 し ます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-25ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用例 7-5 static_cast(p)__asm B* my_static_base_cast(D* /*p*/){if __offsetof_base(D, B) 0 // optimize zero offset caseADD r0, r0, #__offsetof_base(D, B)endifBX lr}こ れ ら のキーワー ド は、 アセンブ ラ ソ ース 内 で 整 数 定 数 ま たは 論 理 定 数 に 変換 されます。 これらのキーワードは、__asm 関 数 内 でのみ 使 用 で き、 __cpp 式 内では 使 用 でき ません。7.2.8 メ ンバ 関 数 ク ラ スのキーワー ド以 下 のキーワー ド を 使 用 し て、 __asm 関 数 か ら 仮 想 メ ンバ 関 数 と 非 仮 想 メ ンバ関 数 を 容 易 に 呼 び 出 せます。 __mcall で 始 ま る キーワー ド は、 仮 想 関 数 と 非 仮想 関 数 のどち らにも 使 用 でき ますが、 __vcall で 始 ま る キーワー ド は、 仮 想 関数 にしか 使 用 でき ません。 これらのキーワードは、 スタティ ッ ク メンバ 関 数の 呼 び 出 し には、 あ ま り 役 立 ち ません。これらのキーワー ド の 使 用 方 法 の 例 については、 「 非 ス タ テ ィ ッ ク メ ンバ 関 数の 呼 び 出 し」 (ページ 7-28) を 参 照 して 下 さい。__mcall_is_virtual(D, f)__mcall_is_in_vbase(D, f)f が D 内 で 見 つか る 仮 想 メ ンバ 関 数 の 場 合 、 ま たは D のベース クラスの 場 合 は、{TRUE} を 返 し ます。 それ 以 外 の 場 合 は、 {FALSE} を返 します。 {TRUE} を 返 す 場 合 は、 仮 想 デ ィ スパ ッ チを 使 用 し て 呼び 出 すこ と がで き ますが、 それ 以 外 の 場 合 は 直 接 呼 び 出 す 必 要があ り ます。f が D の 仮 想 ベース ク ラ ス 内 で 見 つかる 非 ス タテ ィ ッ ク メ ンバ 関数 の 場 合 は {TRUE} を 返 し ます。 それ 以 外 の 場 合 は {FALSE} を 返 します。 {TRUE} を 返 す 場 合 は、 __mcall_offsetof_vbase(D, f) を 使 用 して this 調 整 を 行 う 必 要 があ り ます。 それ 以 外 の 場 合 は、__mcall_this_offset(D, f) を 使 用 して 行 う 必 要 があ り ます。7-26 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用__mcall_offsetof_vbase(D, f)こ の 場 合 、 D はクラス 型 で、f は D の 仮 想 ベース ク ラ スで 定 義 さ れた 非 ス タテ ィ ッ ク メ ンバ 関 数 です。 つま り 、__mcall_is_in_vbase(D,f) は true を 返 し ます。D オブジ ェ ク ト の 開 始 位 置 か ら f が 定 義 さ れてい るベースの 開 始位 置 までのベースオフセ ッ ト を 保 持 する、 仮 想 関 数 テーブルスロットの 仮 想 関 数 テーブル 内 の 負 のオフセ ッ ト を 返 し ます。D へのポ イ ン タ を 使 用 する f への 呼 び 出 し を 行 う には、 this を 調整 する 必 要 があ り ます。注正 のオフセ ッ ト を 返 す 場 合 は、 その 値 を 仮 想 関 数 テーブルポ イン タ か ら 減 算 する 必 要 があ り ます。__mcall_this_offset(D, f)こ の 場 合 、 D はクラス 型 で、f は D で 定 義 された 非 ス タ テ ィ ッ ク メンバ 関 数 ま たは D の 非 仮 想 ベース ク ラ スです。D オブジ ェ ク ト の 開 始 位 置 か ら、 f が 定 義 されているベースの 開始 位 置 までのオフセ ッ ト を 返 し ます。 D へのポ イ ン タ を 使 用 するf への 呼 び 出 し を 行 う には、this を 調 整 する 必 要 があ り ます。 f がD 内 で 見 つかるか、B が f を 含 む D の 非 仮 想 ベース ク ラ スの 場 合 の__offsetof_base(D,B) と 同 じになる 場 合 は、 この 値 はゼロになります。f が D の 仮 想 ベース ク ラ ス 内 で 見 つか る 場 合 に__mcall_this_offset(D,f) を 使 用 する と、 有 効 であればアセンブ リエラーを 発 生 させる 任 意 の 値 を 返 し ます。 そのため、__mcall_this_offset を 正 し く 使 用 しないと、 スキップするアセンブ リ コー ド を 含 むセ ク シ ョ ンで こ の よ う な 状 態 が 発 生 する 可 能性 があ り ます。__vcall_offsetof_vfunc(D, f)こ の 場 合 、 D はクラスで、f は D で 定 義 さ れた 仮 想 関 数 か、 D のベース ク ラ スです。関 数 はベースオフセ ッ ト を 保 持 する 仮 想 関 数 テーブル 内 のスロットの 負 のオフセットを 返 します。 ベースオフセ ッ ト は、 D オブジェ ク ト と f が 定 義 さ れてい るベースの 開 始 位 置 と の 間 の 距 離として 計 算 されます。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-27ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用f が 仮 想 メ ンバ 関 数 ではない 場 合 に __vcall_offsetof_vfunc(D, f)を 使 用 する と 、 有 効 であればアセンブ リ エ ラーを 発 生 させる 任意 の 値 を 返 し ます。7.2.9 非 ス タ テ ィ ッ ク メ ンバ 関 数 の 呼 び 出 し__mcall および __vcall で 始 ま る キーワード を 使 用 し て、 __asm 関 数 か ら 非 仮 想関 数 と 仮 想 関 数 を 呼 び 出 せます。 詳 細 については、 「メンバ 関 数 クラスのキーワード」 (ページ 7-26) を 参 照 して 下 さい。 スタティックメンバ 関 数 は 異 なるパラ メータを 受 け 取 るため (this がないなど)、 ス タテ ィ ッ ク メ ンバ 関 数 を 検出 する __mcall_is_static はあ り ません。 し たがっ て、 呼 び 出 し 側 は 既 にス タテ ィ ッ ク メ ンバ 関 数 の 呼 び 出 し に 特 化 さ れてい る と 考 え ら れます。非 仮 想 メ ンバ 関 数 の 呼 び 出 し例 7-6 に、 仮 想 ベース ま たは 非 仮 想 ベースのいずれかで 非 仮 想 関 数 を 呼 び 出すことができるコードを 示 します。例 7-6 非 仮 想 関 数 の 呼 び 出 し// rp contains a D* and we want to do the equivalent of rp->f() where f is a// nonvirtual function// all arguments other than the this pointer are already setup// assumes f does not return a structif __mcall_is_in_vbase(D, f)LDR r12, [rp]// fetch vtable pointerLDR r0, [r12, #-__mcall_offsetof_vbase(D, f)] // fetch the vbase offsetADD r0, r0, rp// do this adjustmentelseADD r0, rp, #__mcall_this_offset(D, f)endifBL __cpp(&D::f)// set up and adjust this// pointer for D*// call D::f仮 想 メ ンバ 関 数 の 呼 び 出 し例 7-7 (ページ 7-29) に、 仮 想 ベース ま たは 非 仮 想 ベースのいずれかで 仮 想 関数 を 呼 び 出 すこ と がで き る コー ド を 示 し ます。7-28 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用例 7-7 仮 想 関 数 の 呼 び 出 し// rp contains a D* and we want to do the equivalent of rp->f() where f is a// virtual function// all arguments other than the this pointer are already setup// assumes f does not return a structif __mcall_is_in_vbase(D, f)LDR r12, [rp]// fetch vtable pointerLDR r0, [r12, #-__mcall_offsetof_vbase(D, f)] // fetch the base offsetADD r0, r0, rp// do this adjustmentLDR r12, [r0]// fetch vbase vtable pointerelseMOV r0, rp // set up this pointer for D*LDR r12, [rp]// fetch vtable pointerADD r0, r0, #__mcall_this_offset(D, f) // do this adjustmentendifMOV lr, pc// prepare lrLDR pc, [r12, #__vcall_offsetof_vfunc(D, f)] // calls rp->f()<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-29ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用7.3 sp、 lr、 または pc にア ク セスする 従 来 のイ ン ラ イ ンアセン ブ ラ<strong>ARM</strong> Developer Suite (ADS) v1.2 以 前 の コ ンパ イ ラ では、 イ ン ラ イ ンアセンブリコードから sp (r13)、 lr (r14)、 および pc (r15) にアクセスできました(「インラインアセンブラ」 (ページ 7-2) を 参 照 )。 例 7-8 は、 lr を 使 用 する 従来 のイ ン ラ イ ンアセンブ リ コー ド を 示 し ています。例 7-8 lr を 使 用 する 従 来 のイ ン ラ イ ンアセンブ リ コー ドvoid func(){int var;__asm{mov var, lr /* get the return address of func() */}}従 来 の コー ド の イ ン ラ イ ンアセンブ リ で lr を 使 用 し てい る 場 合 、 関 数 の 復 帰アドレスが 含 まれる 保 証 はありません。 例 えば、 他 の 目 的 で lr を 使 用 するビル ド オプシ ョ ンや 最 適 化 があ り ます。 RVCT v2.0 以 降 の コ ンパイ ラ では、 こ のような 方 法 で lr、 sp、 または pc を 使 用 する と、 次 のよ う なエラーが 発 生 し ます。C または C++ のソースファイル 内 からこのよ うなレジスタにアクセスする 必要 があ る 場 合 は、 以 下 の 方 法 を 使 用 で き ます。• 組 み 込 みアセンブ リ を 使 用 し ます (「 組 み 込 みアセンブ ラ」 (ページ7-19) を 参 照 )。• イ ン ラ イ ンアセンブ リ で 以 下 のコ ンパ イ ラ 組 み 込 み 関 数 を 使 用 し ます。__current_pc() pc レジスタにアクセスする 場 合 。__current_sp() sp レジスタにアクセスする 場 合 。__return_address() lr レジスタにアクセスする 場 合 。以 下 も 参 照 し て 下 さ い。• 「 従 来 の コー ド での sp (r13)、 lr (r14)、 および pc (r15) へのアクセス」(ページ 7-31)• 『コンパイ ラ リ ファレンスガイ ド』 の 「 命 令 コ ンパイ ラ 組 み 込 み 関 数 」(ページ 4-80)7-30 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用7.3.1 従 来 のコ ー ド での sp (r13)、 lr (r14)、 および pc (r15) へのアクセス以 下 の 方 法 を 使 用 し て、 ソ ース コー ド 内 か ら sp、 lr、 および pc の 各 レジス タに 正 し く ア ク セスでき ます。方 法 1方 法 2イ ン ラ イ ンアセンブ リ で 以 下 の よ う に コ ンパイ ラ 組 み 込 み 関 数を 使 用 し ます。void printReg(){unsigned int spReg, lrReg, pcReg;__asm{MOV spReg, __current_sp()MOV pcReg, __current_pc()MOV lrReg, __return_address()}printf("SP = 0x%X\n",spReg);printf("PC = 0x%X\n",pcReg);printf("LR = 0x%X\n",lrReg);}C または C++ ソースファイル 内 から、 以 下 のよ うに 組 み 込 みアセンブリ を 使 用 して 物 理 <strong>ARM</strong> レジスタにアクセスできます。__asm void func(){MOV r0, lr...BX lr}この 方 法 を 使 用 する と、 例 えばデバッグ 目 的 でコールツ リーを表 示 する ために、 関 数 の 復 帰 ア ド レ ス を キ ャ プチ ャ し て 表 示 できます。詳 細 については、 「 組 み 込 みアセンブ ラ」 (ページ 7-19) を 参 照して 下 さい。注あ る 関 数 が、 コ ンパイ ラ に よ って 呼 び 出 し 側 関 数 で イ ン ラ イ ン 展 開 さ れる 場合 があ り ます。 関 数 が イ ン ラ イ ン 展 開 さ れる と 、 キ ャ プチャ さ れる リ ターンア ド レ スは、 その イ ン ラ イ ン 関 数 を 呼 び 出 し た 関 数 の リ ターンア ド レ スになります。 ま た、 関 数 は 末 尾 呼 び 出 し さ れる こ と があ り ます。『コンパイ ラ リ ファレンスガイ ド』 の 「__return_address」 (ページ4-101) を 参 照 して 下 さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-31ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用7.4 イ ン ラ イ ンアセンブ リ コー ド と 組 み 込 みアセン ブ リ コー ド の 相 違 点インラインアセンブリ と 組 み 込 みアセンブリではコンパイル 方 法 が 異 なります。• イ ン ラ イ ンアセンブ リ コー ド ではハイ レベルなプ ロ セ ッ サ 抽 象 化 が 使 用され、 コード 生 成 中 に C および C++ コードに 統 合 されます。 そのため、コンパイラでは C および C++ コード とアセンブリ コードが 同 時 に 最 適化 されます。• 組 み 込 みアセンブ リ コー ド は、 イ ン ラ イ ンアセンブ リ コー ド と は 異 なり、 C および C++ コード とは 別 にアセンブルされます。 生 成 されたコンパイル 済 みオブジェク トは、 C または C++ ソースをコンパイルして 生 成されたオブジェク ト と 結 合 されます。• インラインアセンブリコードは、 コンパイラによってインライン 展 開 でき ますが、 組 み 込 みアセンブ リ コー ド は 暗 黙 に も 明 示 的 に も イ ン ラ イ ン展 開 する こ と はで き ません。表 7-1 は、 イ ン ラ イ ンアセンブラ と 組 み 込 みアセンブラの 主 な 相 違 点 について 説 明 しています。表 7-1 イ ン ラ イ ンアセンブ ラ と 組 み 込 みアセンブ ラの 相 違 点機 能 組 み 込 みアセンブ ラ イ ン ラ イ ンアセンブ ラ命 令 セ ッ ト <strong>ARM</strong> および Thumb。 <strong>ARM</strong> のみ。<strong>ARM</strong> アセンブラディ レクティブ<strong>ARM</strong>v6 命 令<strong>ARM</strong>v7 命 令すべてサポー ト さ れています。すべてサポー ト さ れています。すべてサポー ト さ れています。サポー ト されていません。SETEND や 一 部 のシ ス テム 拡 張 機 能 などの 一 部 の 例 外 を 除 き、 ほ と んどの 命 令 がサポー ト されています。 また <strong>ARM</strong>v6 SIMD 命 令 の 完 全 なセ ットがサポートされています。サポー ト されていません。C または C++ の 式 定 数 式 のみ。 C または C++ のすべての 式 。アセンブ リ コー ド の 最 適 化 最 適 化 さ れません。 完 全 に 最 適 化 さ れます。イ ン ラ イ ン 展 開 不 可 。 可 。7-32 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用表 7-1 イ ン ラ イ ンアセンブ ラ と 組 み 込 みアセンブ ラの 相 違 点 ( 続 き)機 能 組 み 込 みアセンブ ラ イ ン ラ イ ンアセンブ ラレ ジ ス タへのア ク セス復 帰 命 令BKPT 命 令指 定 し た 物 理 レ ジ ス タ が使 用 さ れます。 PC、 LR、および SP も 使 用 できます。コー ド に 追 加 する 必 要 があります。直 接 サポー ト さ れています。仮 想 レ ジ ス タ を 使 用 し ます (「 仮 想レジスタ」 (ページ 7-9) を 参 照 )。sp (r13)、 lr (r14)、 および pc(r15) を 使 用 する と 、 エ ラーが 発 生します。 詳 細 については、 「sp、 lr、または pc にアクセスする 従 来 のインラインアセンブラ」 (ページ7-30) を 参 照 して 下 さい。自 動 的 に 生 成 さ れます (BX、 BXJ、および BLX 命 令 はサポー ト さ れていません)。サポー ト されていません。「 組 み 込 みアセンブ リ と C/C++ と の 式 の 相 違 点 」 (ページ 7-22) も 参 照 して 下さい。<strong>ARM</strong> DUI 0205IJ Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. 7-33ID 100419Non-Confidential,


イ ン ラ イ ンアセン ブ ラ と 組 み 込 みアセン ブ ラの 使 用7-34 Copyright © 2002-2010 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0205IJNon-Confidential, ID 100419

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

Saved successfully!

Ooh no, something went wrong!