12.07.2015 Views

RealView 编译工具编译器参考指南 - ARM Information Center

RealView 编译工具编译器参考指南 - ARM Information Center

RealView 编译工具编译器参考指南 - ARM Information Center

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

®<strong>RealView</strong>编 译 工 具4.0 版编 译 器 参 考 指 南Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved.<strong>ARM</strong> DUI 0348BC (ID090708)


<strong>RealView</strong> 编 译 工 具编 译 器 参 考 指 南Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved.版 本 信 息本 手 册 进 行 了 以 下 更 改 。更 改 历 史 记 录日 期发 行号保 密 性变 更2007 年 3 月 A 非 保 密 <strong>RealView</strong> Development Suite v3.1 3.1 版2008 年 9 月 B 非 保 密 <strong>RealView</strong> Development Suite v4.0 4.0 版2009 年 1 月 23 日 B 非 保 密 <strong>RealView</strong> Development Suite 4.0 版 的 文 档 更 新2009 年 3 月 2 日 B 非 保 密 <strong>RealView</strong> Development Suite 4.0 版 的 文 档 更 新 2所 有 权 声 明除 非 本 所 有 权 声 明 在 下 面 另 有 说 明 , 否 则 带 有 ® 或 标 记 的 词 语 和 徽 标 是 <strong>ARM</strong> ® Limited 在 欧 盟 和 其他 国 家 / 地 区 的 注 册 商 标 或 商 标 。 此 处 提 及 的 其 他 品 牌 和 名 称 可 能 是 其 各 自 所 有 者 的 商 标 。除 非 事 先 得 到 版 权 所 有 人 的 书 面 许 可 , 否 则 不 得 以 任 何 形 式 修 改 或 复 制 本 文 档 包 含 的 部 分 或 全 部 信息 以 及 产 品 说 明 。本 文 档 描 述 的 产 品 还 将 不 断 发 展 和 完 善 。 <strong>ARM</strong> Limited 将 如 实 提 供 本 文 档 所 述 产 品 的 所 有 特 性 及 其使 用 方 法 。 但 是 , 所 有 暗 示 或 明 示 的 担 保 , 包 括 但 不 限 于 对 特 定 用 途 适 销 性 或 适 用 性 的 担 保 , 均 不包 括 在 内 。本 文 档 的 目 的 仅 在 于 帮 助 读 者 使 用 产 品 。 对 于 因 使 用 本 文 档 中 的 任 何 信 息 、 文 档 信 息 出 现 任 何 错 误或 遗 漏 或 者 错 误 使 用 产 品 造 成 的 任 何 损 失 或 损 害 , <strong>ARM</strong> 公 司 概 不 负 责 。使 用 <strong>ARM</strong> 一 词 时 , 它 表 示 “<strong>ARM</strong> 或 其 任 何 相 应 的 子 公 司 ”。保 密 状 态本 文 档 的 内 容 是 非 保 密 的 。 根 据 <strong>ARM</strong> 与 <strong>ARM</strong> 将 本 文 档 交 予 的 参 与 方 的 协 议 条 款 , 使 用 、 复 制 和公 开 本 文 档 内 容 的 权 利 可 能 会 受 到 许 可 限 制 的 制 约 。受 限 访 问 是 一 种 <strong>ARM</strong> 内 部 分 类 。产 品 状 态本 文 档 的 信 息 是 开 发 的 产 品 的 最 新 信 息 。网 址http://www.arm.comii Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


目 录<strong>RealView</strong> 编 译 工 具编 译 器 参 考 指 南前 言关 于 本 手 册 ..................................................................................................... vi反 馈 ................................................................................................................ x第 1 章第 2 章第 3 章简 介1.1 关 于 <strong>ARM</strong> 编 译 器 ........................................................................................ 1-21.2 源 语 言 模 式 .................................................................................................. 1-31.3 语 言 扩 展 和 语 言 遵 从 性 ................................................................................ 1-51.4 C 和 C++ 库 ................................................................................................ 1-7编 译 器 命 令 行 选 项2.1 命 令 行 选 项 .................................................................................................. 2-2语 言 扩 展3.1 预 处 理 器 扩 展 .............................................................................................. 3-23.2 C90 中 提 供 的 C99 语 言 功 能 ....................................................................... 3-43.3 C++ 和 C90 中 提 供 的 C99 语 言 功 能 ........................................................... 3-63.4 标 准 C 语 言 扩 展 .......................................................................................... 3-93.5 标 准 C++ 语 言 扩 展 .................................................................................... 3-143.6 标 准 C 和 标 准 C++ 语 言 扩 展 .................................................................... 3-18<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. iiiID7/8/09Non-Confidential, Unrestricted Access


3.7 GNU 语 言 扩 展 .......................................................................................... 3-23第 4 章第 5 章附 录 A附 录 B附 录 C附 录 D附 录 E编 译 器 特 有 的 功 能4.1 关 键 字 和 运 算 符 .......................................................................................... 4-24.2 __declspec 属 性 ....................................................................................... 4-244.3 函 数 属 性 ................................................................................................... 4-314.4 类 型 属 性 ................................................................................................... 4-424.5 变 量 属 性 ................................................................................................... 4-464.6 编 译 指 示 ................................................................................................... 4-554.7 指 令 内 在 函 数 ............................................................................................ 4-714.8 VFP 状 态 内 在 函 数 .................................................................................. 4-1114.9 GNU 内 置 函 数 ........................................................................................ 4-1124.10 编 译 器 预 定 义 .......................................................................................... 4-115C 和 C++ 实 现 细 节5.1 C 和 C++ 实 现 细 节 ..................................................................................... 5-25.2 C++ 实 现 细 节 ........................................................................................... 5-13via 文 件 语 法A.1 via 文 件 概 述 ................................................................................................ A-2A.2 语 法 ............................................................................................................ A-3标 准 C 实 现 定 义B.1 实 现 定 义 ..................................................................................................... B-2B.2 被 视 为 ISO C 标 准 未 定 义 的 行 为 ................................................................ B-9标 准 C++ 实 现 定 义C.1 整 型 转 换 ..................................................................................................... C-2C.2 调 用 纯 虚 函 数 .............................................................................................. C-3C.3 主 要 的 语 言 支 持 特 性 ................................................................................... C-4C.4 标 准 C++ 库 实 现 定 义 .................................................................................. C-5C 和 C++ 编 译 器 实 现 限 制D.1 C++ ISO/IEC 标 准 限 制 ............................................................................... D-2D.2 整 数 限 制 ..................................................................................................... D-4D.3 浮 点 数 限 制 .................................................................................................. D-5使 用 NEON 支 持E.1 简 介 ............................................................................................................ E-2E.2 向 量 数 据 类 型 .............................................................................................. E-3E.3 内 在 函 数 ..................................................................................................... E-4iv Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID7/8/09


前 言本 前 言 介 绍 了 《<strong>RealView</strong> 编 译 工 具 编 译 器 参 考 指 南 》。 它 分 为 以 下 几 节 :• 第 vi 页 的 关 于 本 手 册• 第 x 页 的 反 馈<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. vID090708Non-Confidential, Unrestricted Access


前 言关 于 本 手 册本 手 册 提 供 有 关 <strong>RealView</strong> 编 译 工 具 (RVCT) 的 参 考 信 息 , 并 介 绍 了 <strong>ARM</strong> 编 译 器的 命 令 行 选 项 。 本 手 册 也 提 供 有 关 <strong>ARM</strong> 如 何 在 编 译 器 中 实 现 C 和 C++ 的 参 考材 料 。 有 关 使 用 和 控 制 <strong>ARM</strong> 编 译 器 的 一 般 信 息 , 请 参 阅 《RVCT 编 译 器 用 户指 南 》。适 用 对 象本 手 册 是 为 所 有 使 用 RVCT 编 写 应 用 程 序 的 开 发 者 编 写 的 。 本 手 册 假 定 您 是 一位 经 验 丰 富 的 软 件 开 发 人 员 。 有 关 RVCT 附 带 的 <strong>ARM</strong> 开 发 工 具 的 概 述 , 请 参阅 《<strong>RealView</strong> 编 译 工 具 要 点 指 南 》。使 用 本 手 册本 手 册 由 以 下 章 节 和 附 录 组 成 :第 1 章 简 介阅 读 本 章 后 , 可 以 大 致 了 解 <strong>ARM</strong> 编 译 器 、 标 准 一 致 性 以 及 C 和C++ 库 。第 2 章 编 译 器 命 令 行 选 项本 章 列 出 了 <strong>ARM</strong> 编 译 器 接 受 的 所 有 命 令 行 选 项 。第 3 章 语 言 扩 展本 章 介 绍 了 <strong>ARM</strong> 编 译 器 提 供 的 语 言 扩 展 , 并 提 供 了 标 准 遵 从 性 和实 现 方 法 的 详 细 信 息 。第 4 章 编 译 器 特 有 的 功 能本 章 详 细 列 出 了 <strong>ARM</strong> 特 有 的 关 键 字 、 运 算 符 、 编 译 指 示 、 内 在 函数 、 宏 和 半 主 机 超 级 用 户 调 用 (SVC)。第 5 章 C 和 C++ 实 现 细 节本 章 介 绍 了 <strong>ARM</strong> 编 译 器 的 语 言 实 现 详 细 信 息 。附 录 A via 文 件 语 法本 附 录 介 绍 了 via 文 件 的 语 法 。 您 可 以 使 用 via 文 件 为 很 多 <strong>ARM</strong> 工具 指 定 命 令 行 参 数 。vi Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


前 言附 录 B 标 准 C 实 现 定 义本 附 录 提 供 有 关 <strong>ARM</strong> C 实 现 的 信 息 , 该 实 现 直 接 与 ISO C 要 求 相关 。附 录 C 标 准 C++ 实 现 定 义本 附 录 提 供 了 有 关 <strong>ARM</strong> C++ 实 现 的 信 息 。附 录 D C 和 C++ 编 译 器 实 现 限 制本 附 录 提 供 了 有 关 <strong>ARM</strong> 编 译 器 中 C 和 C++ 实 现 的 限 制 。附 录 E 使 用 NEON 支 持本 附 录 介 绍 了 此 版 本 的 RVCT 所 支 持 的 NEON 内 在 函 数 的 相 关 信息 。本 手 册 假 定 <strong>ARM</strong> 软 件 安 装 在 缺 省 位 置 。 例 如 , 在 Windows 上 , 这 可 能 是volume:\Program Files\<strong>ARM</strong>。 引 用 路 径 名 时 , 假 定 安 装 位 置 为 install_directory, 如install_directory\Documentation\...。 如 果 将 <strong>ARM</strong> 软 件 安 装 在 其 他 位 置 , 则 可能 需 要 更 改 此 位 置 。印 刷 约 定本 手 册 使 用 以 下 印 刷 约 定 :monospace 表 示 可 以 从 键 盘 输 入 的 文 本 , 如 命 令 、 文 件 和 程 序 名 以 及 源 代 码 。monospace表 示 允 许 的 命 令 或 选 项 缩 写 。 可 只 输 入 下 划 线 标 记 的 文 本 , 无 需输 入 命 令 或 选 项 的 全 名 。monospace italic表 示 此 处 的 命 令 和 函 数 的 变 量 可 用 特 定 值 代 替 。等 宽 粗 体 表 示 在 示 例 代 码 以 外 使 用 的 语 言 关 键 字 。斜 体 突 出 显 示 重 要 注 释 、 介 绍 特 殊 术 语 以 及 表 示 内 部 交 叉 引 用 和 引 文 。粗 体突 出 显 示 界 面 元 素 , 如 菜 单 名 称 。 有 时 候 也 用 在 描 述 性 列 表 中 以示 强 调 , 以 及 表 示 <strong>ARM</strong> 处 理 器 信 号 名 称 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. viiID090708Non-Confidential, Unrestricted Access


前 言更 多 参 考 出 版 物本 部 分 列 出 了 <strong>ARM</strong> 公 司 和 第 三 方 发 布 的 、 可 提 供 有 关 <strong>ARM</strong> 系 列 处 理 器 开 发 代码 的 附 加 信 息 的 出 版 物 。<strong>ARM</strong> 公 司 将 定 期 对 其 文 档 进 行 更 新 和 更 正 。 有 关 最 新 勘 误 表 、 附 录 和 <strong>ARM</strong> 常见 问 题 (FAQ), 请 访 问 http://infocenter.arm.com/help/index.jsp。<strong>ARM</strong> 公 司 出 版 物本 手 册 包 含 的 参 考 信 息 专 用 于 随 RVCT 提 供 的 开 发 工 具 。 该 套 件 中 包 含 的 其 他出 版 物 有 :• 《RVCT 要 点 指 南 》 (<strong>ARM</strong> DUI 0202)• 《RVCT 编 译 器 用 户 指 南 》 (<strong>ARM</strong> DUI 0205)• 《RVCT 库 和 浮 点 支 持 指 南 》 (<strong>ARM</strong> DUI 0349)• 《RVCT 链 接 器 用 户 指 南 》 (<strong>ARM</strong> DUI 0206)• 《RVCT 链 接 器 参 考 指 南 》 (<strong>ARM</strong> DUI 0381)• 《RVCT 实 用 程 序 指 南 》 (<strong>ARM</strong> DUI 0382)• 《RVCT 汇 编 器 指 南 》 (<strong>ARM</strong> DUI 0204)• 《RVCT 开 发 指 南 》 (<strong>ARM</strong> DUI 0203)有 关 基 本 标 准 、 软 件 接 口 和 <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 0406)• 《<strong>ARM</strong>7-M 体 系 结 构 参 考 手 册 》 (<strong>ARM</strong> DDI 0403)• 《<strong>ARM</strong>6-M 体 系 结 构 参 考 手 册 》 (<strong>ARM</strong> DDI 0419)• 您 的 硬 件 设 备 的 <strong>ARM</strong> 数 据 手 册 或 技 术 参 考 手 册 。viii Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


前 言其 他 出 版 物以 下 出 版 物 提 供 了 有 关 ETSI 基 本 运 算 的 信 息 。 要 获 取 这 些 信 息 , 请 访 问 国 际 电信 联 盟 (ITU) 无 线 电 通 信 局 的 网 站 http://www.itu.int。• ETSI 建 议 G.191:《 语 音 和 音 频 编 码 标 准 化 软 件 工 具 》 (Software tools forspeech and audio coding standardization)• 《ITU-T 软 件 工 具 库 2005 用 户 手 册 》, 收 录 为 ETSI 建 议 书 G.191 的 一 部 分• ETSI 建 议 G723.1:《 传 输 速 率 为 5.3 和 6.3 Kb/s 的 多 媒 体 通 信 双 速 率 语 音编 码 器 》 (Dual rate speech coder for multimedia communications transmittingat 5.3 and 6.3 kbit/s)• ETSI 建 议 G.729:《 使 用 共 轭 结 构 代 数 码 激 励 线 性 预 测 (CS-ACELP) 的 8Kb/s 语 音 编 码 》 (Coding of speech at 8 kbit/s using conjugate-structurealgebraic-code-excited linear prediction (CS-ACELP))。德 州 仪 器 公 司 的 网 站 http://www.ti.com 上 提 供 有 关 TI 编 译 器 内 在 函 数 信 息 的 出版 物 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. ixID090708Non-Confidential, Unrestricted Access


前 言反 馈<strong>ARM</strong> Limited 欢 迎 提 供 有 关 <strong>RealView</strong> 编 译 工 具 与 文 档 的 反 馈 。对 <strong>RealView</strong> 编 译 工 具 的 反 馈如 果 您 有 关 于 RVCT 的 任 何 问 题 , 请 与 您 的 供 应 商 联 系 。 为 便 于 供 应 商 快 速 提供 有 用 的 答 复 , 请 提 供 :• 您 的 姓 名 和 公 司• 产 品 序 列 号• 您 所 用 版 本 的 详 细 信 息• 您 运 行 的 平 台 的 详 细 信 息 , 如 硬 件 平 台 、 操 作 系 统 类 型 和 版 本• 能 重 现 问 题 的 一 小 段 独 立 的 程 序• 您 预 期 发 生 和 实 际 发 生 的 情 况 的 详 细 说 明• 您 使 用 的 命 令 , 包 括 所 有 命 令 行 选 项• 能 说 明 问 题 的 示 例 输 出• 工 具 的 版 本 字 符 串 , 包 括 版 本 号 和 内 部 版 本 号 。关 于 本 手 册 的 反 馈如 果 您 发 现 本 手 册 有 任 何 错 误 或 遗 漏 之 处 , 请 发 送 电 子 邮 件 到 errata@arm.com,并 提 供 :• 文 档 标 题• 文 档 编 号• 您 有 疑 问 的 页 码• 问 题 的 简 要 说 明我 们 还 欢 迎 您 对 需 要 增 加 和 改 进 之 处 提 出 建 议 。x Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


第 1 章简 介本 章 介 绍 随 <strong>RealView</strong> 编 译 工 具 (RVCT) 一 起 提 供 的 <strong>ARM</strong> 编 译 器 。 它 将 介 绍 遵 循的 标 准 , 并 概 述 RVCT 附 带 的 运 行 时 库 。 本 附 录 分 为 以 下 几 节 :• 第 1-2 页 的 关 于 <strong>ARM</strong> 编 译 器• 第 1-3 页 的 源 语 言 模 式• 第 1-5 页 的 语 言 扩 展 和 语 言 遵 从 性• 第 1-7 页 的 C 和 C++ 库<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 1-1ID090708Non-Confidential, Unrestricted Access


简 介1.1 关 于 <strong>ARM</strong> 编 译 器利 用 <strong>ARM</strong> 编 译 器 armcc 可 以 编 译 C 和 C++ 代 码 。编 译 器 :• 是 一 种 成 熟 的 编 译 器 。 利 用 命 令 行 选 项 , 可 以 控 制 优 化 级 别 。• 可 以 将 :— ISO 标 准 C:1990 源 代 码— ISO 标 准 C:1999 源 代 码— ISO 标 准 C++:2003 源 代 码编 译 为 :— 32 位 <strong>ARM</strong> 代 码— 16/32 位 Thumb-2 代 码— 16 位 Thumb 代 码 。• 遵 循 <strong>ARM</strong> 体 系 结 构 的 基 础 标 准 应 用 程 序 二 进 制 接 口 (BSABI)。 特 别 是 ,编 译 器 可 以 :— 生 成 ELF 格 式 的 输 出 对 象 。— 生 成 DWARF 调 试 标 准 版 本 3 (DWARF 3) 调 试 信 息 。 RVCT 还 支 持DWARF 2 调 试 表 。有 关 详 细 信 息 , 请 参 阅 《 库 和 浮 点 支 持 指 南 》 中 第 1-3 页 的 <strong>ARM</strong> 体 系 结 构ABI 遵 从 性 。• 可 以 生 成 输 出 代 码 的 汇 编 语 言 列 表 , 并 且 可 以 交 叉 存 取 源 代 码 的 汇 编 语 言列 表 。如 果 是 从 先 前 的 版 本 升 级 到 RVCT 或 者 是 初 次 使 用 RVCT, 请 务 必 阅 读《<strong>RealView</strong> 编 译 工 具 要 点 指 南 》 以 了 解 最 新 信 息 。1-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


简 介1.2 源 语 言 模 式<strong>ARM</strong> 编 译 器 有 三 种 不 同 的 源 语 言 模 式 可 用 于 编 译 不 同 种 类 的 C 和 C++ 源 代 码 。这 些 模 式 是 :• ISO C90• ISO C99• ISO C++。1.2.1 ISO C90<strong>ARM</strong> 编 译 器 根 据 1990 C 标 准 和 附 录 的 定 义 编 译 C 代 码 :• ISO/IEC 9899:1990。 1990 C 国 际 标 准 。• ISO/IEC 9899 AM1。1995 标 准 附 录 1, 通 过 wchar.h 和 wtype.h 增 加 了 对 国际 字 符 的 支 持 。<strong>ARM</strong> 编 译 器 还 支 持 几 种 ISO C90 扩 展 。 有 关 详 细 信 息 , 请 参 阅 第 1-5 页 的 语 言扩 展 和 语 言 遵 从 性 。在 整 篇 文 档 中 , 术 语 :C90 是 指 ISO C90, 以 及 <strong>ARM</strong> 扩 展 。使 用 编 译 器 选 项 --c90 可 编 译 C90 代 码 。 这 是 缺 省 设 置 。严 格 C90 是 指 根 据 1990 C 标 准 和 附 录 定 义 的 C。另 请 参 阅• 第 2-22 页 的 --c90• 第 1-5 页 的 语 言 扩 展 和 语 言 遵 从 性• 附 录 B 标 准 C 实 现 定 义1.2.2 ISO C99<strong>ARM</strong> 编 译 器 编 译 根 据 1999 C 标 准 和 附 录 定 义 的 C 代 码 :• ISO/IEC 9899:1999。 1999 C 国 际 标 准 。<strong>ARM</strong> 编 译 器 还 支 持 几 种 ISO C99 扩 展 。 有 关 详 细 信 息 , 请 参 阅 第 1-5 页 的 语 言扩 展 和 语 言 遵 从 性 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 1-3ID090708Non-Confidential, Unrestricted Access


简 介在 整 篇 文 档 中 , 术 语 :C99 是 指 ISO C99, 以 及 <strong>ARM</strong> 和 GNU 扩 展 。要 编 译 C99 代 码 , 可 使 用 编 译 器 选 项 --c99。严 格 C99 是 指 根 据 1999 C 标 准 和 附 录 定 义 的 C。标 准 C 是 指 C90 或 C99 ( 视 具 体 情 况 )。C 是 指 C90、 严 格 C90、 C99 和 标 准 C 中 的 任 何 一 种 。另 请 参 阅• 第 2-22 页 的 --c99• 第 1-5 页 的 语 言 扩 展 和 语 言 遵 从 性• 附 录 B 标 准 C 实 现 定 义1.2.3 ISO C++<strong>ARM</strong> 编 译 器 编 译 根 据 2003 标 准 而 定 义 的 C++, 宽 流 和 导 出 模 板 除 外 :• ISO/IEC 14822:2003。 2003 C++ 国 际 标 准 。<strong>ARM</strong> 编 译 器 还 支 持 几 种 ISO C++ 扩 展 。 有 关 详 细 信 息 , 请 参 阅 第 1-5 页 的 语 言扩 展 和 语 言 遵 从 性 。在 整 篇 文 档 中 , 术 语 :严 格 C++ 是 指 ISO C++, 宽 流 和 导 出 模 板 除 外 。标 准 C++C++是 指 严 格 C++。是 指 ISO C++ ( 宽 流 和 导 出 模 板 除 外 ), 含 有 或 不 含 <strong>ARM</strong>扩 展 。要 编 译 C++ 代 码 , 可 使 用 编 译 器 选 项 --cpp。另 请 参 阅• 第 2-30 页 的 --cpp• 第 1-5 页 的 语 言 扩 展 和 语 言 遵 从 性• 附 录 C 标 准 C++ 实 现 定 义 .1-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


简 介1.3 语 言 扩 展 和 语 言 遵 从 性编 译 器 支 持 大 量 对 各 种 源 语 言 的 扩 展 。 它 还 提 供 几 个 命 令 行 选 项 , 以 控 制 与 可用 源 语 言 的 遵 从 性 。1.3.1 语 言 扩 展编 译 器 支 持 的 语 言 扩 展 按 如 下 分 类 :C99 功 能 编 译 器 可 以 使 用 C99 的 某 些 语 言 功 能 :• 严 格 C90 的 扩 展 , 如 // 样 式 的 注 释• 标 准 C++ 和 严 格 C90 的 扩 展 , 如 restrict 指 针 。有 关 详 细 信 息 , 请 参 阅 :• 第 3-4 页 的 C90 中 提 供 的 C99 语 言 功 能• 第 3-6 页 的 C++ 和 C90 中 提 供 的 C99 语 言 功 能标 准 C 扩 展标 准 C++ 扩 展编 译 器 支 持 多 个 严 格 C99 扩 展 , 例 如 , 重 写 旧 式 非 原 型 定 义的 函 数 原 型 。 有 关 详 细 信 息 , 请 参 阅 第 3-9 页 的 标 准 C 语 言扩 展 。C90 中 也 提 供 了 这 些 标 准 C 扩 展 。编 译 器 支 持 多 个 严 格 C++ 扩 展 , 例 如 , 类 成 员 声 明 中 的 限定 名 称 。 有 关 详 细 信 息 , 请 参 阅 第 3-14 页 的 标 准 C++ 语 言扩 展 。标 准 C 和 C90 中 都 不 提 供 这 些 扩 展 。标 准 C 和 标 准 C++ 扩 展编 译 器 支 持 严 格 C++ 和 严 格 C90 特 有 的 某 些 扩 展 , 如 匿 名类 、 结 构 和 联 合 。 有 关 详 细 信 息 , 请 参 阅 第 3-18 页 的 标 准 C和 标 准 C++ 语 言 扩 展 。GNU 扩 展编 译 器 支 持 GNU 编 译 器 提 供 的 某 些 扩 展 , 例 如 GNU 样 式的 扩 展 左 值 和 GNU 内 置 函 数 。 有 关 详 细 信 息 , 请 参 阅 :• 第 1-6 页 的 语 言 遵 从 性• 第 3-23 页 的 GNU 语 言 扩 展• 第 4 章 编 译 器 特 有 的 功 能<strong>ARM</strong> 特 有 的 扩 展 编 译 器 支 持 <strong>ARM</strong> 编 译 器 特 有 的 一 系 列 扩 展 , 例 如 指 令 内 在函 数 和 其 他 内 置 函 数 。 有 关 详 细 信 息 , 请 参 阅 第 4 章 编 译器 特 有 的 功 能 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 1-5ID090708Non-Confidential, Unrestricted Access


简 介1.3.2 语 言 遵 从 性编 译 器 有 几 种 模 式 , 在 这 些 模 式 中 , 有 的 模 式 要 求 必 须 遵 从 源 语 言 , 有 的 模 式则 不 做 硬 性 规 定 :Strict 模 式GNU 模 式在 strict 模 式 下 , 编 译 器 强 制 与 源 语 言 的 语 言 标 准 保 持 一 致 。 例如 , 编 译 严 格 C90 时 若 使 用 // 样 式 的 注 释 , 将 导 致 错 误 。若 要 在 strict 模 式 下 进 行 编 译 , 请 使 用 命 令 行 选 项 --strict。在 GNU 模 式 下 , 相 关 源 语 言 的 所 有 GNU 编 译 器 扩 展 都 可 用 。 例如 , 在 GNU 模 式 中 :• 源 语 言 是 C90、 C99 或 非 严 格 C++ 中 的 任 何 一 种 时 , 可 以 在switch 语 句 中 使 用 条 件 范 围• 源 语 言 是 C90 或 非 严 格 C++ 时 , 可 以 使 用 C99 样 式 的 指 定 初始 值 设 定 项若 要 在 GNU 模 式 下 进 行 编 译 , 请 使 用 编 译 器 选 项 --gnu。注 意在 非 严 格 模 式 下 时 还 可 以 使 用 某 些 GNU 扩 展 。示 例以 下 示 例 说 明 如 何 将 源 语 言 模 式 与 语 言 遵 从 模 式 结 合 使 用 :• 使 用 命 令 行 选 项 --strict 编 译 .cpp 文 件 时 将 编 译 标 准 C++• 使 用 命 令 行 选 项 --gnu 编 译 C 源 文 件 将 编 译 GNU 模 式 C90• 使 用 命 令 行 选 项 --strict 和 --gnu 编 译 .c 文 件 会 出 错 。另 请 参 阅• 第 2-66 页 的 --gnu• 第 2-115 页 的 --strict, --no_strict• 第 3-23 页 的 GNU 语 言 扩 展• 《 编 译 器 用 户 指 南 》 中 第 2-13 页 的 文 件 命 名 约 定 。1-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


简 介1.4 C 和 C++ 库RVCT 提 供 以 下 运 行 时 C 和 C++ 库 :<strong>ARM</strong> C 库<strong>ARM</strong> C 库 提 供 标 准 C 函 数 以 及 C 和 C++ 库 使 用 的 辅 助 函 数 。C 库还 提 供 依 赖 于 目 标 的 函 数 , 此 类 函 数 用 于 在 半 主 机 环 境 中 实 现 标准 C 库 函 数 , 如 printf。 C 库 经 过 结 构 化 , 以 便 您 可 以 在 自 己 的 代码 中 重 新 定 义 依 赖 于 目 标 的 函 数 来 删 除 半 主 机 相 关 性 。<strong>ARM</strong> 库 符 合 :• 《<strong>ARM</strong> 体 系 结 构 的 C 库 ABI》 (CLIBABI)• 《<strong>ARM</strong> 体 系 结 构 的 C++ ABI》 (CPPABI)有 关 详 细 信 息 , 请 参 阅 《 库 和 浮 点 支 持 指 南 》 中 第 1-3 页 的 <strong>ARM</strong>体 系 结 构 ABI 遵 从 性 。Rogue Wave 标 准 C++ 库 2.02.03 版由 Rogue Wave Software, Inc. 提 供 的 Rogue Wave 标 准 C++ 库 可 提 供标 准 C++ 函 数 和 对 象 , 如 cout。 这 个 库 包 含 称 为 标 准 模 板 库 (STL)的 数 据 结 构 和 算 法 。 C++ 库 使 用 C 库 来 提 供 目 标 特 定 的 支 持 。Rogue Wave 标 准 C++ 库 是 在 启 用 C++ 异 常 的 情 况 下 提 供 的 。有 关 Rogue Wave 库 的 详 细 信 息 , 请 参 阅 Rogue Wave HTML 文 档 ,也 可 以 访 问 Rogue Wave 网 站 :http://www.roguewave.com支 持 库<strong>ARM</strong> C 库 提 供 其 他 组 件 以 支 持 C++, 以 及 为 不 同 体 系 结 构 和 处 理器 编 译 代 码 。C 和 C++ 库 仅 以 二 进 制 形 式 提 供 。 对 于 主 要 构 建 选 项 的 每 一 种 组 合 , 都 有 一 个1990 ISO 标 准 C 库 的 变 体 , 例 如 目 标 系 统 的 字 节 顺 序 、 是 否 选 中 交 互 操 作 以 及是 否 选 中 浮 点 支 持 。有 关 详 细 信 息 , 请 参 阅 《 库 和 浮 点 支 持 指 南 》 中 第 2 章 C 和 C++ 库 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 1-7ID090708Non-Confidential, Unrestricted Access


简 介1-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


第 2 章编 译 器 命 令 行 选 项本 章 列 出 了 <strong>ARM</strong> 编 译 器 armcc 所 支 持 的 命 令 行 选 项 。 它 包 括 下 面 一 节 :• 第 2-2 页 的 命 令 行 选 项<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-1ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1 命 令 行 选 项本 节 按 字 母 顺 序 列 出 了 编 译 器 所 支 持 的 命 令 行 选 项 。2.1.1 -Aopt此 选 项 指 定 一 些 命 令 行 选 项 , 如 果 编 译 器 在 汇 编 .s 输 入 文 件 或 嵌 入 式 汇 编 语 言函 数 时 调 用 这 些 命 令 行 选 项 , 它 们 将 传 递 给 汇 编 器 。语 法-Aopt其 中 :opt 是 要 传 递 给 汇 编 器 的 命 令 行 选 项 。注 意有 些 编 译 器 命 令 行 选 项 只 要 由 编 译 器 调 用 , 就 会 自 动 传 递 给 汇 编器 。 例 如 , 如 果 在 编 译 器 命 令 行 中 指 定 了 --cpu 选 项 , 则 在 汇 编 .s文 件 或 嵌 入 式 汇 编 器 时 只 要 调 用 了 此 选 项 , 就 会 将 此 选 项 传 递 给汇 编 器 。若 要 查 看 编 译 器 传 递 给 汇 编 器 的 编 译 器 命 令 行 选 项 , 请 使 用 编 译器 命 令 行 选 项 -A--show_cmdline。示 例armcc -A--predefine="NEWVERSION SETL {TRUE}" main.c限 制如 果 使 用 -A 传 递 了 不 受 支 持 的 选 项 , 则 会 生 成 错 误 。另 请 参 阅• 第 2-30 页 的 --cpu=name• 第 2-77 页 的 -Lopt• 第 2-112 页 的 --show_cmdline2-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.2 --allow_null_this, --no_allow_this此 选 项 允 许 或 禁 止 在 空 对 象 指 针 上 调 用 成 员 函 数 。缺 省 设 置缺 省 选 项 为 --no_allow_null_this。2.1.3 --alternative_tokens, --no_alternative_tokens此 选 项 启 用 或 禁 用 C 和 C++ 中 备 选 标 记 的 识 别 功 能 。用 法在 C 和 C++ 中 , 使 用 此 选 项 可 控 制 连 字 的 识 别 。 在 C++ 中 , 使 用 此 选 项 可 控 制运 算 符 关 键 字 ( 如 and 和 bitand) 的 识 别 。缺 省 设 置缺 省 选 项 为 --alternative_tokens。2.1.4 --anachronisms, --no_anachronisms此 选 项 启 用 或 禁 用 C++ 中 的 过 时 特 性 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 选 项 为 --no_anachronisms。示 例typedef enum { red, white, blue } tricolor;inline tricolor operator++(tricolor c, int){int i = static_cast(c) + 1;return static_cast(i);}void foo(void){tricolor c = red;<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-3ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项}c++; // okay++c; // anachronism如 果 使 用 --anachronisms 选 项 编 译 此 代 码 , 则 会 生 成 一 条 警 告 消 息 。如 果 在 编 译 此 代 码 时 未 使 用 --anachronisms 选 项 , 则 会 生 成 一 条 错 误 消 息 。另 请 参 阅• 第 2-30 页 的 --cpp• 第 2-115 页 的 --strict, --no_strict• 第 2-116 页 的 --strict_warnings• 第 5-14 页 的 过 时 功 能2.1.5 --apcs=qualifer...qualifier此 选 项 控 制 生 成 代 码 时 的 交 互 操 作 和 位 置 无 关 性 。通 过 为 --apcs 命 令 行 选 项 指 定 限 定 符 , 可 以 定 义 编 译 器 所 使 用 的 《<strong>ARM</strong> 体 系 结构 的 过 程 调 用 标 准 》 (AAPCS) 的 变 体 。语 法--apcs=qualifer...qualifier其 中 , qualifier...qualifier 表 示 限 定 符 的 列 表 。 该 列 表 必 须 符 合 下 列 条 件 :• 至 少 包 含 一 个 限 定 符• 其 中 的 各 限 定 符 之 间 没 有 空 格 分 隔 。qualifier 的 每 个 实 例 必 须 为 下 列 值 之 一 :/interwork、 /nointerwork/ropi、 /noropi/rwpi、 /norwpi在 支 持 或 不 支 持 <strong>ARM</strong>/Thumb 交 互 操 作 的 情 况 下 生 成 代码 。 缺 省 值 为 /nointerwork ( 缺 省 值 为 /interwork 的 <strong>ARM</strong>v6及 更 高 版 本 除 外 )。允 许 或 禁 止 生 成 只 读 位 置 无 关 (ROPI) 代 码 。 缺 省 为/noropi。/[no]pic 是 /[no]ropi 的 别 名 。允 许 或 禁 止 生 成 读 写 且 与 位 置 无 关 (RWPI) 的 代 码 。 缺 省 为/norwpi。/[no]pid 是 /[no]rwpi 的 别 名 。2-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项/fpic、 /nofpic允 许 或 禁 止 生 成 其 相 对 地 址 引 用 与 程 序 的 加 载 位 置 无 关 的 只读 且 与 位 置 无 关 的 代 码 。注 意您 也 可 以 指 定 多 个 限 定 符 。 例 如 , --apcs=/nointerwork/noropi/norwpi 与--apcs=/nointerwork --apcs=noropi/norwpi 是 等 效 的 。缺 省 设 置如 果 未 指 定 --apcs 选 项 , 则 编 译 器 采 用--apcs=/nointerwork/noropi/norwpi/nofpic。用 法/interwork, /nointerwork缺 省 情 况 下 , 按 下 列 方 式 生 成 代 码 :• 不 支 持 交 互 操 作 ( 即 /nointerwork), 除 非 指 定 与 体 系结 构 <strong>ARM</strong>v5T 或 更 高 版 本 相 对 应 的 --cpu 选 项• 支 持 交 互 操 作 ( 即 /interwork), 适 用 于 <strong>ARM</strong>v5T 和更 高 版 本 。 交 互 操 作 在 <strong>ARM</strong>v5T 和 更 高 版 本 的 <strong>ARM</strong>体 系 结 构 上 自 动 执 行 。/ropi, /noropi如 果 选 择 使 用 /ropi 限 定 符 生 成 ROPI 代 码 , 则 编 译 器 将 执行 下 列 操 作 :• 确 定 只 读 代 码 和 与 pc 相 关 的 数 据 的 地 址• 在 只 读 输 出 节 上 设 置 与 位 置 无 关 (PI) 属 性 。注 意在 编 译 C++ 时 , 不 支 持 --apcs=/ropi。/rwpi, /norwpi如 果 选 择 使 用 /rwpi 限 定 符 生 成 RWPI 代 码 , 则 编 译 器 将 执行 下 列 操 作 :• 使 用 相 对 于 静 态 基 址 寄 存 器 sb 的 偏 移 量 确 定 可 写 数 据的 地 址 。 这 意 味 着 :— 可 以 在 运 行 时 固 定 RW 数 据 区 域 的 基 址— 数 据 可 具 有 多 个 实 例— 数 据 可 以 是 与 位 置 无 关 的 , 但 这 并 不 是 必 需 的 。• 在 读 写 输 出 节 上 设 置 PI 属 性 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-5ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项注 意由 于 --lower_rwpi 选 项 是 缺 省 选 项 , 因 此 非 RWPI 代 码 会 自动 转 换 为 等 效 的 RWPI 代 码 。 这 种 静 态 初 始 化 将 在 运 行 时 由C++ 构 造 函 数 机 制 完 成 , 即 使 在 C 语 言 中 也 是 如 此 。/fpic, /nofpic 如 果 选 择 此 选 项 , 则 编 译 器 将 执 行 下 列 操 作 :• 使 用 PC 相 对 的 寻 址 访 问 所 有 静 态 数 据• 使 用 链 接 器 所 创 建 的 全 局 偏 移 表 (GOT) 条 目 访 问 所 有导 入 或 导 出 的 读 写 数 据• 访 问 与 pc 相 关 的 所 有 只 读 数 据 。如 果 代 码 使 用 了 共 享 对 象 , 则 您 必 须 用 /fpic 编 译 代 码 。 这是 因 为 仅 当 代 码 使 用 了 System V 共 享 库 时 才 实 现 相 对 寻 址 。在 构 建 静 态 映 像 或 静 态 库 时 , 无 需 用 /fpic 进 行 编 译 。在 编 译 C++ 时 支 持 使 用 /fpic。 在 这 种 情 况 下 , 将 把 虚 拟 函数 表 和 typeinfo 放 在 读 写 区 域 中 , 以 便 相 对 于 PC 的 位 置 对其 进 行 访 问 。注 意在 生 成 System V 或 <strong>ARM</strong> Linux 共 享 库 时 结 合 使 用 --apcs/fpic 和 --no_hide_all。限 制使 用 /ropi、 /rwpi 或 /fpic 编 译 代 码 时 存 在 一 些 限 制 。/ropi 用 /ropi 进 行 编 译 时 , 主 要 存 在 下 列 限 制 :• 在 编 译 C++ 时 不 支 持 使 用 --apcs=/ropi。• 在 用 --apcs=/ropi 进 行 编 译 时 , 一 些 合 法 的 C 结 构 体 不 起 作用 。 例 如 :extern const int ci; // roconst int *p2 = &ci; // this static initialization// does not work with --apcs=/ropi若 要 使 此 类 静 态 初 始 化 有 效 , 请 使 用 --lower_ropi 选 项 编 译代 码 。 例 如 :armcc --apcs=/ropi --lower_ropi2-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项/rwpi 用 /rwpi 进 行 编 译 时 , 主 要 存 在 下 列 限 制 :• 在 用 --apcs=/rwpi 进 行 编 译 时 , 一 些 合 法 的 C 结 构 体 不 起 作用 。 例 如 :int i;// rwint *p1 = &i; // this static initialization// does not work with --apcs=/rwpi// --no_lower_rwpi若 要 使 此 类 静 态 初 始 化 有 效 , 请 使 用 --lower_rwpi 选 项 编 译代 码 。 例 如 :armcc --apcs=/rwpi注 意因 为 --lower_rwpi 是 缺 省 选 项 , 所 以 不 必 另 行 指 定 。/fpic 用 /fpic 进 行 编 译 时 , 主 要 存 在 下 列 限 制 :• 如 果 使 用 --apcs=/fpic, 则 编 译 器 只 导 出 标 有__declspec(dllexport) 的 函 数 和 数 据 。• 如 果 在 同 一 命 令 行 中 使 用 --apcs=/fpic 和 --no_hide_all, 则 编译 器 将 对 所 有 不 使 用 __declspec(dll*) 的 所 有 extern 变 量 和 函数 使 用 缺 省 ELF 动 态 可 见 性 。 编 译 器 将 对 使 用 缺 省 ELF 可 见性 的 函 数 禁 用 自 动 内 联 功 能 。• 如 果 在 GNU 模 式 下 使 用 --apcs=/fpic, 还 必 须 使 用--no_hide_all。另 请 参 阅• 第 2-69 页 的 --hide_all, --no_hide_all• 第 2-85 页 的 --lower_ropi, --no_lower_ropi• 第 2-85 页 的 --lower_rwpi, --no_lower_rwpi• 第 4-24 页 的 __declspec(dllexport)• 《 库 和 浮 点 支 持 指 南 》 中 第 2-5 页 的 编 写 可 重 入 且 线 程 安 全 的 代 码• 《 链 接 器 用 户 指 南 》 中 第 3-17 页 的 中 间 代 码• 《 链 接 器 参 考 指 南 》 中 的 第 4 章 BPABI 和 SysV 共 享 库 和 可 执 行 文 件• install_directory\Documentation\Specifications\... 中 的 《<strong>ARM</strong> 体 系 结 构的 过 程 调 用 标 准 》<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-7ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.6 --arm此 选 项 表 示 请 求 编 译 器 以 <strong>ARM</strong> 指 令 集 为 目 标 。 编 译 器 可 以 生 成 <strong>ARM</strong> 和 Thumb代 码 , 但 首 选 识 别 <strong>ARM</strong> 代 码 。注 意此 选 项 不 适 用 于 只 支 持 Thumb 的 处 理 器 ( 如 Cortex-M3)。缺 省 设 置这 是 支 持 <strong>ARM</strong> 指 令 集 的 目 标 的 缺 省 选 项 。另 请 参 阅• 第 2-14 页 的 --arm_only• 第 2-30 页 的 --cpu=list• 第 2-30 页 的 --cpu=name• 第 2-118 页 的 --thumb• 第 4-56 页 的 #pragma arm• 《 编 译 器 用 户 指 南 》 中 第 2-23 页 的 指 定 目 标 处 理 器 或 体 系 结 构 。2.1.7 --arm_linux此 选 项 以 适 用 于 <strong>ARM</strong> Linux 编 译 的 缺 省 值 配 置 一 组 其 他 选 项 。用 法当 使 用 以 下 某 个 <strong>ARM</strong> Linux 选 项 时 , 这 些 缺 省 值 会 自 动 启 用 :• --arm_linux_paths• 完 整 GCC 仿 真 模 式 中 的 --translate_gcc• 完 整 GCC 仿 真 模 式 中 的 --translate_g++• 完 整 GCC 仿 真 模 式 中 的 --translate_gld此 选 项 通 常 用 于 帮 助 移 植 旧 代 码 。 它 用 于 简 化 现 有 makefile 中 使 用 的 编 译 器 选项 , 同 时 保 留 对 所 用 头 文 件 和 库 搜 索 路 径 的 全 面 显 式 控 制 。2-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项从 RVCT 4.0 版 之 前 的 版 本 移 植 时 , 您 可 以 将 所 有 这 些 提 供 给 编 译 器 的 选 项 替 换为 一 个 --arm_linux 选 项 。缺 省 设 置缺 省 情 况 下 , 配 置 的 这 组 选 项 包 括 :• --apcs=/interwork• --enum_is_int• --gnu• --library_interface=aeabi_glibc• --no_hide_all• --preinclude=linux_rvct.h• --wchar32示 例若 要 应 用 缺 省 选 项 集 , 请 使 用 --arm_linux。若 要 覆 盖 任 何 缺 省 选 项 , 请 分 别 进 行 指 定 。 例 如 ,--arm_linux --hide_all。在 后 面 的 示 例 中 , 前 面 带 有 --arm_linux 的 --hide_all 覆 盖 了 --no_hide_all。另 请 参 阅• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-13 页 的 --arm_linux_paths• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-27 页 的 --configure_gcc=path• 第 2-28 页 的 --configure_gld=path• 第 2-29 页 的 --configure_sysroot=path• 第 2-111 页 的 --shared• 第 2-118 页 的 --translate_g++• 第 2-120 页 的 --translate_gcc• 第 2-121 页 的 --translate_gld• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-9ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2.1.8 --arm_linux_config_file=path此 选 项 指 定 为 <strong>ARM</strong> Linux 生 成 而 创 建 的 配 置 文 件 的 位 置 。 它 允 许 在 编 译 代 码 时使 用 标 准 Linux 配 置 设 置 。语 法--arm_linux_config_file=path其 中 path 是 配 置 文 件 的 路 径 和 文 件 名 。限 制必 须 在 生 成 配 置 文 件 时 以 及 在 编 译 和 链 接 期 间 使 用 配 置 时 都 使 用 此 选 项 。如 果 在 命 令 行 中 指 定 <strong>ARM</strong> Linux 配 置 文 件 并 使 用--translate_gcc、--translate_g++ 或 --translate_gld, 则 会 影 响 某 些 其 他 选 项 的 缺省 设 置 。--bss_threshold 的 缺 省 值 变 为 零 ,--signed_bitfields 和--unsigned_bitfields 的 缺 省 值 变 为 --signed_bitfields, 并 启 用 --enum_is_int 和--wchar32。另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-11 页 的 --arm_linux_configure• 第 2-13 页 的 --arm_linux_paths• 第 2-20 页 的 --bss_threshold=num• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-27 页 的 --configure_gcc=path• 第 2-28 页 的 --configure_gld=path• 第 2-29 页 的 --configure_sysroot=path2-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项• 第 2-52 页 的 --enum_is_int• 第 2-111 页 的 --shared• 第 2-112 页 的 --signed_bitfields, --unsigned_bitfields• 第 2-118 页 的 --translate_g++• 第 2-120 页 的 --translate_gcc• 第 2-121 页 的 --translate_gld• 第 2-131 页 的 --wchar32• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2.1.9 --arm_linux_configure此 选 项 通 过 创 建 描 述 包 含 路 径 、 库 路 径 和 GNU C 库 glibc 的 标 准 库 的 配 置 文 件 ,来 配 置 用 于 <strong>ARM</strong> Linux 的 RVCT。 生 成 代 码 时 将 使 用 创 建 的 配 置 文 件 。用 法应 用 自 动 和 手 动 配 置 方 法 。 自 动 配 置 尝 试 自 动 在 PATH 环 境 变 量 中 查 找 GNU 工具 链 的 安 装 , 并 对 其 进 行 查 询 以 确 定 要 使 用 的 配 置 设 置 。 手 动 配 置 可 用 于 自 行指 定 头 文 件 和 库 的 位 置 。 如 果 未 安 装 完 整 的 GNU 工 具 链 , 可 以 使 用 手 动 配 置 。执 行 自 动 配 置 :• armcc --arm_linux_configure --arm_linux_config_file=config_file_path--configure_gcc=path --configure_gld=path其 中 config_file_path 是 所 创 建 的 配 置 文 件 的 路 径 和 文 件 名 。 您 可 以 选 择指 定 GNU 编 译 器 集 合 (GCC) 驱 动 程 序 的 位 置 , 也 可 以 选 择 指 定 GNU 链 接器 的 位 置 , 来 覆 盖 系 统 PATH 环 境 变 量 确 定 的 位 置 。执 行 手 动 配 置 :• armcc --arm_linux_configure --arm_linux_config_file=path--configure_cpp_headers=path --configure_sysroot=path其 中 指 定 了 GNU libstdc++ 标 准 模 板 库 (STL) 头 文 件 的 路 径 , 以 及 库 和 头文 件 所 在 的 系 统 根 路 径 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-11ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项限 制系 统 中 必 须 存 在 GNU 工 具 链 才 能 使 用 自 动 配 置 。如 果 使 用 自 动 配 置 方 法 , 则 必 须 使 用 系 统 PATH 环 境 变 量 来 查 找 <strong>ARM</strong> LinuxGCC。 如 果 系 统 路 径 中 没 有 合 适 的 GCC, 可 以 在 路 径 中 添 加 一 个 , 也 可 以 使 用--configure_gcc ( 并 选 择 使 用 --configure_gld) 手 动 指 定 合 适 的 GCC 的 位 置 。缺 省 设 置除 非 使 用 其 他 选 项 指 定 GCC 或 GNU 链 接 器 的 位 置 , 否 则 会 应 用 自 动 配 置 。 也就 是 说 , 除 非 使 用 其 他 选 项 指 定 <strong>ARM</strong> Linux GCC 的 位 置 , 否 则 编 译 器 会 尝 试 使用 系 统 路 径 环 境 变 量 查 找 <strong>ARM</strong> Linux GCC。另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-13 页 的 --arm_linux_paths• 第 2-27 页 的 --configure_gcc=path• 第 2-28 页 的 --configure_gld=path• 第 2-29 页 的 --configure_sysroot=path• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-111 页 的 --shared• 第 2-118 页 的 --translate_g++• 第 2-120 页 的 --translate_gcc• 第 2-121 页 的 --translate_gld• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2-12 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.10 --arm_linux_paths使 用 此 选 项 可 以 为 <strong>ARM</strong> Linux 生 成 代 码 。用 法配 置 了 用 于 <strong>ARM</strong> Linux 的 RVCT 后 , 可 以 使 用 此 选 项 。这 只 是 编 译 器 选 项 。 它 遵 循 典 型 的 GCC 使 用 模 型 , 即 编 译 器 驱 动 程 序 用 于 标 准系 统 对 象 文 件 和 库 的 直 接 链 接 和 选 择 。此 选 项 还 可 用 于 帮 助 从 RVCT 4.0 版 之 前 的 RVCT 版 本 进 行 迁 移 。 使 用--arm_linux_configure 创 建 件 配 置 文 件 后 , 可 以 通 过 替 换 标 准 选 项 列 表 来 修 改 现有 生 成 , 并 用 --arm_linux_paths 选 项 搜 索 路 径 。 也 就 是 说 ,--arm_linux_paths 可用 于 替 换 :• 为 --arm_linux 列 出 的 所 有 缺 省 选 项• 头 文 件 路 径• 库 路 径• 标 准 库 。限 制必 须 使 用 --arm_linux_config_file=filename 指 定 配 置 文 件 的 位 置 。示 例编 译 并 链 接 应 用 程 序 代 码 :armcc --arm_linux_paths --arm_linux_config_file=my_config_file -o hello -O2-Otime -g hello.c编 译 源 文 件 source.c 以 便 在 共 享 库 中 使 用 :armcc --arm_linux_paths --arm_linux_config_file=my_config_file --apcs=/fpic -csource.c使 用 编 译 器 将 两 个 对 象 文 件 obj1 和 obj2 链 接 到 共 享 库 my_shared_lib.so 中 :armcc --arm_linux_paths --arm_linux_config_file=my_config_file --shared -omy_shared_lib.so obj1.o obj2.o<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-13ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-27 页 的 --configure_gcc=path• 第 2-28 页 的 --configure_gld=path• 第 2-29 页 的 --configure_sysroot=path• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-111 页 的 --shared• 第 2-118 页 的 --translate_g++• 第 2-120 页 的 --translate_gcc• 第 2-121 页 的 --translate_gld• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2.1.11 --arm_only此 选 项 强 制 只 编 译 <strong>ARM</strong> 代 码 。 编 译 器 就 当 目 标 体 系 结 构 中 没 有 Thumb 一 样 进行 工 作 。编 译 器 将 --arm_only 选 项 传 播 到 汇 编 器 和 链 接 器 。示 例armcc --arm_only myprog.c注 意如 果 指 定 armcc --arm_only --thumb myprog.c, 并 不 意 味 着 编 译 器 会 检 查 代 码 以 确保 不 存 在 Thumb 代 码 。 这 意 味 着 --thumb 将 覆 盖 --arm_only。2-14 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-8 页 的 --arm• 第 2-118 页 的 --thumb• 有 关 --16 和 --32 的 信 息 , 请 参 阅 《 汇 编 器 指 南 》 中 第 3-2 页 的 命 令 语 法 。2.1.12 --asm此 选 项 指 示 编 译 器 将 列 表 写 入 编 译 器 所 生 成 的 机 器 代 码 的 反 汇 编 文 件 中 。如 果 选 择 此 选 项 , 则 会 生 成 对 象 代 码 。 此 外 , 除 非 选 择 了 -c 选 项 , 否 则 还 会 执行 链 接 步 骤 。注 意若 要 在 不 生 成 对 象 代 码 的 情 况 下 对 编 译 器 生 成 的 机 器 代 码 执 行 反 汇 编 , 请 选 择-S 而 不 是 --asm。用 法--asm 的 操 作 以 及 所 生 成 的 反 汇 编 文 件 的 完 整 名 称 因 所 使 用 的 选 项 组 合 而 异 :表 2-1 用 --asm 选 项 进 行 编 译编 译 器 选 项操 作--asm 将 一 个 列 表 写 入 编 译 源 的 反 汇 编 文 件 。此 外 , 除 非 使 用 了 c 选 项 , 否 则 还 会 执 行 链 接 步 骤 。反 汇 编 代 码 将 写 入 一 个 文 本 文 件 中 , 其 缺 省 名 称 为 具 有 文 件扩 展 名 .s 的 输 入 文 件 的 名 称 。--asm -c 与 --asm 类 似 , 但 不 执 行 链 接 步 骤 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-15ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项表 2-1 用 --asm 选 项 进 行 编 译 ( 续 )编 译 器 选 项操 作--asm --interleave 与 --asm 类 似 , 但 源 代 码 将 与 反 汇 编 代 码 进 行 交 叉 存 取 。反 汇 编 代 码 将 写 入 一 个 文 本 文 件 中 , 其 缺 省 名 称 为 具 有 文 件扩 展 名 .txt 的 输 入 文 件 的 名 称 。--asm --multifile--asm -o filename与 --asm 类 似 , 但 编 译 器 将 为 合 并 到 主 文 件 中 的 文 件 生 成 空 对象 文 件 。与 --asm 类 似 , 但 对 象 文 件 将 命 名 为 filename。反 汇 编 代 码 将 写 入 文 件 filename.s 中 。对 象 文 件 的 名 称 中 不 能 包 含 文 件 扩 展 名 .s。 如 果 对 象 文 件 的文 件 扩 展 名 为 .s, 则 会 将 反 汇 编 代 码 写 入 对 象 文 件 的 最 上 方 。这 可 能 会 导 致 不 可 预 知 的 结 果 。另 请 参 阅• 第 2-21 页 的 -c• 第 2-75 页 的 --interleave• 第 2-90 页 的 --multifile, --no_multifile• 第 2-92 页 的 -o filename• 第 2-110 页 的 -S• 《 编 译 器 用 户 指 南 》 中 第 2-13 页 的 文 件 命 名 约 定 。2.1.13 --autoinline, --no_autoinline此 选 项 启 用 或 禁 用 函 数 的 自 动 内 联 。编 译 器 会 在 合 理 的 情 况 下 针 对 较 高 优 化 级 别 自 动 内 联 函 数 。-Ospace 和 -Otime 选项 以 及 其 他 某 些 因 素 ( 如 函 数 大 小 ) 会 对 编 译 器 自 动 内 联 函 数 的 方 式 产 生 影响 。通 过 选 择 -Otime 并 结 合 各 种 其 他 因 素 , 会 增 加 内 联 函 数 的 可 能 性 。缺 省 设 置对 于 优 化 级 别 -O0 和 -O1, 缺 省 为 --no_autoinline。对 于 优 化 级 别 -O2 和 -O3, 缺 省 为 --autoinline。2-16 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-58 页 的 --forceinline• 第 2-73 页 的 --inline, --no_inline• 第 2-94 页 的 -Onum• 第 2-96 页 的 -Ospace• 第 2-96 页 的 -Otime2.1.14 --bigend此 选 项 指 示 编 译 器 使 用 大 端 内 存 为 <strong>ARM</strong> 处 理 器 生 成 代 码 。<strong>ARM</strong> 体 系 结 构 定 义 以 下 两 种 不 同 的 大 端 模 式 :BE8 字 节 固 定 寻 址 模 式 (<strong>ARM</strong>v6 及 更 高 版 本 )。BE32 旧 大 端 模 式 。在 链 接 时 指 定 是 选 择 BE8 还 是 BE32。缺 省 设 置除 非 显 式 指 定 --bigend, 否 则 编 译 器 将 采 用 --littleend。另 请 参 阅• 第 2-83 页 的 --littleend• 《 开 发 指 南 》 中 第 2-13 页 的 端 支 持• 《 链 接 器 参 考 指 南 》 中 第 2-4 页 的 --be8• 《 链 接 器 参 考 指 南 》 中 第 2-5 页 的 --be322.1.15 --bitband此 选 项 将 对 所 有 非 const 全 局 结 构 对 象 执 行 位 处 理 操 作 。 使 用 此 选 项 , 可 以 将 一个 内 存 字 映 射 到 位 处 理 操 作 区 中 的 单 个 位 。 这 将 实 现 对 内 存 体 系 结 构 的 SRAM和 外 设 区 中 的 单 个 位 值 进 行 有 效 的 原 子 访 问 。对 于 区 分 内 存 访 问 宽 度 的 外 设 , 分 别 为 位 处 理 操 作 结 构 的 位 域 的 char、short 和int 类 型 生 成 存 储 或 加 载 到 别 名 空 间 的 字 节 、 半 字 和 字 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-17ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项限 制应 用 的 限 制 如 下 :• 此 选 项 只 影 响 struct 类 型 。 任 何 联 合 类 型 或 其 他 带 有 联 合 成 员 的 聚 合 类 型都 不 能 进 行 位 处 理 操 作 。• 结 构 中 的 成 员 无 法 单 独 进 行 位 处 理 操 作 。• 仅 为 包 含 单 个 位 的 位 域 生 成 位 处 理 操 作 访 问 。• 不 对 const 对 象 、 指 针 和 局 部 对 象 生 成 位 处 理 操 作 访 问 。示 例在 示 例 2-1 中 , 当 使 用 --bitband 命 令 行 选 项 进 行 编 译 时 , 将 在 写 入 位 域 i 和 k时 执 行 位 处 理 操 作 。示 例 2-1 位 处 理 操 作 示 例typedef struct {int i : 1;int j : 2;int k : 1;} BB;BB value;void update_value(void){value.i = 1;value.k = 1;}另 请 参 阅• 第 4-42 页 的 __attribute__((bitband))• 《 编 译 器 用 户 指 南 》 中 第 4-15 页 的 位 处 理 操 作• 处 理 器 的 《 技 术 参 考 手 册 》 (Technical Reference Manual)。2-18 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.16 --brief_diagnostics, --no_brief_diagnostics此 选 项 允 许 或 禁 止 输 出 编 译 器 所 生 成 的 简 短 诊 断 消 息 。如 果 启 用 此 选 项 , 则 不 显 示 原 始 源 代 码 行 , 并 且 当 错 误 消 息 文 本 太 长 而 在 一 行放 不 下 时 也 不 换 行 。缺 省 设 置缺 省 选 项 为 --no_brief_diagnostics。示 例/* main.c */#include int main(void){printf(" “Hello, world\n");return 0;}用 --brief_diagnostics 选 项 编 译 此 代 码 时 会 生 成 一 条 警 告 消 息 。另 请 参 阅• 第 2-44 页 的 --diag_error=tag[,tag,...]• 第 2-45 页 的 --diag_remark=tag[,tag,... ]• 第 2-45 页 的 --diag_style={arm|ide|gnu}• 第 2-46 页 的 --diag_suppress=tag[,tag,...]• 第 2-48 页 的 --diag_warning=tag[,tag,...]• 第 2-52 页 的 --errors=filename• 第 2-108 页 的 --remarks• 第 2-129 页 的 -W• 第 2-133 页 的 --wrap_diagnostics, --no_wrap_diagnostics• 《 编 译 器 用 户 指 南 》 中 的 第 6 章 诊 断 消 息 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-19ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.17 --bss_threshold=num此 选 项 控 制 小 型 全 局 ZI 数 据 项 在 节 中 的 放 置 。 小 型 全 局 ZI 数 据 项 是 小 于 或 等于 八 字 节 的 未 初 始 化 数 据 项 。语 法--bss_threshold=num其 中 :num 是 下 列 值 之 一 :0 将 小 型 全 局 ZI 数 据 项 放 在 ZI 数 据 节 中8 将 小 型 全 局 ZI 数 据 项 放 在 RW 数 据 节 中 。用 法在 RVCT 的 当 前 版 本 中 , 编 译 器 可 在 优 化 时 将 小 型 全 局 ZI 数 据 项 放 置 在 RW 数据 节 中 。 在 RVCT 2.0.1 及 更 低 版 本 中 , 缺 省 情 况 下 会 将 小 型 全 局 ZI 数 据 项 放 置在 ZI 数 据 节 中 。使 用 此 选 项 可 模 拟 RVCT 2.0.1 及 更 低 版 本 中 与 小 型 全 局 ZI 数 据 项 在 ZI 数 据 节中 的 放 置 有 关 的 行 为 。注 意选 择 --bss_threshold=0 选 项 时 , 可 指 示 编 译 器 将 所 有 小 型 全 局 ZI 数 据 项 放 置 在ZI 数 据 节 的 当 前 编 译 模 块 中 。 若 要 将 特 定 变 量 放 置 在 :• 某 一 ZI 数 据 节 中 , 请 使 用 __attribute__((zero_init))• 特 定 的 ZI 数 据 节 中 , 请 组 合 使 用 __attribute__((section)) 和__attribute__((zero_init))。缺 省 设 置如 果 未 指 定 --bss_threshold 选 项 , 编 译 器 将 采 用 --bss_threshold=8。如 果 在 命 令 行 中 指 定 <strong>ARM</strong> Linux 配 置 文 件 并 使 用 --translate_gcc 或--translate_g++, 编 译 器 将 采 用 --bss_threshold=0。2-20 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项示 例int glob1; /* ZI (.bss) in RVCT 2.0.1 and earlier *//* RW (.data) in RVCT 2.1 and later */使 用 --bss_threshold=0 编 译 此 代 码 时 , 会 将 glob1 放 置 在 ZI 数 据 节 中 。另 请 参 阅• 第 4-56 页 的 #pragma arm section [section_sort_list]• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 4-50 页 的 __attribute__((section("name")))• 第 4-54 页 的 __attribute__((zero_init))2.1.18 -c此 选 项 指 示 编 译 器 执 行 编 译 步 骤 , 但 不 执 行 链 接 步 骤 。注 意此 选 项 不 同 于 大 写 的 -C 选 项 。用 法建 议 在 包 含 多 个 源 文 件 的 项 目 中 使 用 -c 选 项 。另 请 参 阅• 第 2-15 页 的 --asm• 第 2-80 页 的 --list• 第 2-92 页 的 -o filename• 第 2-110 页 的 -S2.1.19 -C此 选 项 指 示 编 译 器 在 预 处 理 程 序 输 出 中 保 留 注 释 。选 择 此 选 项 会 隐 式 选 择 -E 选 项 。注 意此 选 项 不 同 于 小 写 的 -c 选 项 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-21ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-51 页 的 -E2.1.20 --c90此 选 项 启 用 C90 源 代 码 的 编 译 。缺 省 设 置系 统 会 为 具 有 .c、 .ac 或 .tc 后 缀 的 文 件 隐 式 选 择 此 选 项 。注 意不 再 使 用 文 件 扩 展 名 .ac 和 .tc。另 请 参 阅• --c99• 第 2-66 页 的 --gnu• 第 2-115 页 的 --strict, --no_strict• 第 1-3 页 的 源 语 言 模 式• 《 编 译 器 用 户 指 南 》 中 第 2-13 页 的 文 件 命 名 约 定 。2.1.21 --c99此 选 项 启 用 C99 源 代 码 的 编 译 。另 请 参 阅• --c90• 第 2-66 页 的 --gnu• 第 2-115 页 的 --strict, --no_strict• 第 1-3 页 的 源 语 言 模 式2.1.22 --code_gen, --no_code_gen此 选 项 允 许 或 禁 止 生 成 对 象 代 码 。如 果 禁 止 生 成 对 象 代 码 , 则 编 译 器 只 执 行 语 法 检 查 , 而 不 创 建 对 象 文 件 。2-22 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项缺 省 设 置缺 省 选 项 为 --code_gen。2.1.23 --compatible=name此 选 项 可 让 编 译 器 生 成 与 多 种 处 理 器 或 体 系 结 构 兼 容 的 代 码 。表 2-2 中 显 示 了 这 些 有 效 组 合 。 您 可 以 将 组 1 中 的 任 意 处 理 器 或 体 系 结 构 与 组 2中 的 任 意 处 理 器 或 体 系 结 构 匹 配 。表 2-2 兼 容 的 处 理 器 或 体 系 结 构 组 合组 1组 2<strong>ARM</strong>7TDMI, 4TCortex-M1, Cortex-M3, 7-M, 6-M, 6S-M语 法--compatible=name其 中 :name是 处 理 器 或 体 系 结 构 的 名 称 , 或 NONE。 处 理 器 和 体 系 结 构 名 称 都不 区 分 大 小 写 。如 果 命 令 行 中 存 在 此 选 项 的 多 个 实 例 , 则 最 后 指 定 的 实 例 会 覆 盖前 面 的 实 例 。在 命 令 行 末 尾 指 定 --compatible=NONE 可 关 闭 此 选 项 的 所 有 其 他 实例 。示 例armcc --cpu=arm7tdmi --compatible=cortex-m3 myprog.c另 请 参 阅• 第 2-30 页 的 --cpu=name2.1.24 --compile_all_input, --no_compile_all_input此 选 项 启 用 或 禁 用 文 件 扩 展 名 处 理 的 禁 止 行 为 。如 果 启 用 该 禁 止 行 为 , 则 编 译 器 将 完 全 禁 止 文 件 扩 展 名 的 处 理 , 同 时 将 所 有 输入 文 件 视 为 具 有 后 缀 .c。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-23ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项缺 省 设 置缺 省 选 项 为 --no_compile_all_input。另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 2-13 页 的 文 件 命 名 约 定 。2.1.25 --configure_cpp_headers=path当 配 置 要 用 于 <strong>ARM</strong> Linux 的 RVCT 时 , 此 选 项 指 定 GNU libstdc++ STL 头 文 件的 路 径 。语 法--configure_cpp_headers=path其 中 :path 是 GNU C++ STL 头 文 件 的 路 径 。用 法此 选 项 会 覆 盖 自 动 检 测 到 的 任 何 路 径 。 它 可 作 为 手 动 方 法 的 一 部 分 来 配 置 用 于<strong>ARM</strong> Linux 的 RVCT。另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-13 页 的 --arm_linux_paths• 第 2-27 页 的 --configure_gcc=path• 第 2-28 页 的 --configure_gld=path• 第 2-29 页 的 --configure_sysroot=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-111 页 的 --shared• 第 2-118 页 的 --translate_g++• 第 2-120 页 的 --translate_gcc• 第 2-121 页 的 --translate_gld2-24 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2.1.26 --configure_extra_includes=paths当 配 置 要 用 于 <strong>ARM</strong> Linux 的 RVCT 时 , 此 选 项 指 定 所 有 附 加 系 统 包 含 路 径 。语 法--configure_extra_includes=paths其 中 :paths 是 以 逗 号 分 隔 的 路 径 名 列 表 , 表 示 附 加 系 统 包 含 路 径 的 位 置 。另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-13 页 的 --arm_linux_paths• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-27 页 的 --configure_gcc=path• 第 2-28 页 的 --configure_gld=path• 第 2-29 页 的 --configure_sysroot=path• 第 2-111 页 的 --shared• 第 2-118 页 的 --translate_g++• 第 2-120 页 的 --translate_gcc• 第 2-121 页 的 --translate_gld• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-25ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2.1.27 --configure_extra_libraries=paths当 配 置 要 用 于 <strong>ARM</strong> Linux 的 RVCT 时 , 此 选 项 指 定 所 有 附 加 系 统 库 路 径 。语 法--configure_extra_libraries=paths其 中 :paths 是 以 逗 号 分 隔 的 路 径 名 列 表 , 表 示 附 加 系 统 库 路 径 的 位 置 。另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-13 页 的 --arm_linux_paths• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-27 页 的 --configure_gcc=path• 第 2-28 页 的 --configure_gld=path• 第 2-29 页 的 --configure_sysroot=path• 第 2-111 页 的 --shared• 第 2-118 页 的 --translate_g++• 第 2-120 页 的 --translate_gcc• 第 2-121 页 的 --translate_gld• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2-26 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.28 --configure_gcc=path当 配 置 要 用 于 <strong>ARM</strong> Linux 的 RVCT 时 , 此 选 项 指 定 GCC 驱 动 程 序 的 位 置 。语 法--configure_gcc=path其 中 :path 是 GCC 驱 动 程 序 的 路 径 和 文 件 名 。用 法如 果 要 覆 盖 配 置 时 指 定 的 GCC 驱 动 程 序 缺 省 位 置 , 或 者 --arm_linux_configure的 自 动 配 置 方 法 无 法 找 到 驱 动 程 序 , 可 以 使 用 此 选 项 。另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-13 页 的 --arm_linux_paths• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-28 页 的 --configure_gld=path• 第 2-29 页 的 --configure_sysroot=path• 第 2-111 页 的 --shared• 第 2-118 页 的 --translate_g++• 第 2-120 页 的 --translate_gcc• 第 2-121 页 的 --translate_gld• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-27ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.29 --configure_gld=path此 选 项 指 定 GNU 链 接 器 ld 的 位 置 。语 法--configure_gld=path其 中 :path 是 GNU 链 接 器 的 路 径 和 文 件 名 。用 法配 置 时 , 编 译 器 会 尝 试 确 定 GCC 使 用 的 GNU 链 接 器 的 位 置 。 如 果 编 译 器 无 法确 定 位 置 , 或 者 要 覆 盖 GNU 链 接 器 的 常 规 路 径 , 可 以 使 用 --configure_gld=path选 项 指 定 其 位 置 。 该 路 径 是 GNU ld 二 进 制 文 件 的 完 整 路 径 和 文 件 名 。另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-13 页 的 --arm_linux_paths• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-27 页 的 --configure_gcc=path• 第 2-29 页 的 --configure_sysroot=path• 第 2-111 页 的 --shared• 第 2-118 页 的 --translate_g++• 第 2-120 页 的 --translate_gcc• 第 2-121 页 的 --translate_gld• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries2-28 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2.1.30 --configure_sysroot=path当 配 置 要 用 于 <strong>ARM</strong> Linux 的 RVCT 时 , 此 选 项 指 定 要 使 用 的 系 统 根 路 径 。语 法--configure_sysroot=path其 中 path 是 要 使 用 的 系 统 根 路 径 。用 法此 选 项 会 覆 盖 自 动 检 测 到 的 任 何 系 统 根 路 径 。 如 果 要 使 用 其 他 路 径 作 为 常 规 系统 根 路 径 , 它 可 作 为 手 动 方 法 的 一 部 分 来 配 置 用 于 <strong>ARM</strong> Linux 的 RVCT。系 统 根 路 径 是 通 常 存 放 库 和 头 文 件 的 基 准 路 径 。 在 标 准 Linux 系 统 上 , 这 通 常是 文 件 系 统 的 根 。 在 交 叉 编 译 GNU 工 具 链 中 , 它 通 常 是 GNU C 库 安 装 的 父 目录 。 此 目 录 包 含 存 放 C 库 和 头 文 件 的 lib、 usr/lib 和 usr/include 子 目 录 。另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-13 页 的 --arm_linux_paths• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-27 页 的 --configure_gcc=path• 第 2-28 页 的 --configure_gld=path• 第 2-111 页 的 --shared• 第 2-118 页 的 --translate_g++• 第 2-120 页 的 --translate_gcc• 第 2-121 页 的 --translate_gld• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-29ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2.1.31 --cpp此 选 项 启 用 C++ 源 代 码 的 编 译 。缺 省 设 置系 统 会 为 具 有 .cpp、 .cxx、 .c++、 .cc 或 .CC 后 缀 的 文 件 隐 式 选 择 此 选 项 。另 请 参 阅• 第 2-3 页 的 --anachronisms, --no_anachronisms• 第 2-22 页 的 --c90• 第 2-22 页 的 --c99• 第 2-66 页 的 --gnu• 第 2-115 页 的 --strict, --no_strict• 第 1-3 页 的 源 语 言 模 式2.1.32 --cpu=list此 选 项 列 出 可 用 于 --cpu=name 选 项 的 受 支 持 体 系 结 构 和 处 理 器 的 名 称 。另 请 参 阅• --cpu=name2.1.33 --cpu=name此 选 项 为 所 选 的 <strong>ARM</strong> 处 理 器 或 体 系 结 构 启 用 代 码 生 成 。语 法--cpu=name其 中 :name 是 处 理 器 或 体 系 结 构 的 名 称 。2-30 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项如 果 name 是 处 理 器 的 名 称 , 则 按 <strong>ARM</strong> 数 据 手 册 中 所 示 的 形 式 输 入该 名 称 ; 例 如 , <strong>ARM</strong>7TDMI、 <strong>ARM</strong>1176JZ-S、 MPCore。如 果 name 是 体 系 结 构 的 名 称 , 则 该 名 称 必 须 包 含 在 表 2-3 中 所 示 的体 系 结 构 列 表 内 。处 理 器 和 体 系 结 构 名 称 都 不 区 分 大 小 写 。不 接 受 通 配 符 。表 2-3 支 持 的 <strong>ARM</strong> 体 系 结 构 和 示 例 处 理 器体 系 结 构 说 明 示 例 处 理 器4 没 有 Thumb 的 <strong>ARM</strong>v4 SA-11004T 具 有 Thumb 的 <strong>ARM</strong>v4 <strong>ARM</strong>7TDMI、<strong>ARM</strong>9TDMI、<strong>ARM</strong>720T、<strong>ARM</strong>740T、<strong>ARM</strong>920T、<strong>ARM</strong>922T、<strong>ARM</strong>940T、 SC1005T具 有 Thumb 和 交 互 操 作 的 <strong>ARM</strong>v55TE 具 有 Thumb、 交 互 操 作 、 DSP 乘 法 以 及 双 字 指 令 的 <strong>ARM</strong>v5 <strong>ARM</strong>9E、<strong>ARM</strong>946E-S、<strong>ARM</strong>966E-S5TEJ具 有 Thumb、 交 互 操 作 、 DSP 乘 法 、 双 字 指 令 以 及 Jazelle ® 扩 展 a的 <strong>ARM</strong>v5<strong>ARM</strong>926EJ-S、<strong>ARM</strong>1026EJ-S、 SC2006 具 有 Thumb、 交 互 操 作 、 DSP 乘 法 、 双 字 指 令 、 未 对 齐 和 混 合 端支 持 、 Jazelle 扩 展 以 及 多 媒 体 扩 展 的 <strong>ARM</strong>v6<strong>ARM</strong>1136J-S、<strong>ARM</strong>1136JF-S6-M <strong>ARM</strong>v6 微 控 制 器 规 格 , 仅 具 有 Thumb 并 增 加 了 处 理 器 状 态 指 令 无 操 作 系 统 扩 展 的Cortex-M16S-M<strong>ARM</strong>v6 微 控 制 器 规 格 , 仅 具 有 Thumb 并 增 加 了 处 理 器 状 态 指 令 和操 作 系 统 扩 展具 有 操 作 系 统 扩 展 的Cortex-M16K 具 有 SMP 扩 展 的 <strong>ARM</strong>v6 MPCore6T2 具 有 Thumb-2 的 <strong>ARM</strong>v6 <strong>ARM</strong>1156T2-S、<strong>ARM</strong>1156T2F-S<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-31ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项6Z 具 有 安 全 扩 展 的 <strong>ARM</strong>v6 <strong>ARM</strong>1176JZF-S、<strong>ARM</strong>1176JZ-S7 仅 具 有 Thumb-2 且 没 有 硬 件 除 法 器 的 <strong>ARM</strong>v7表 2-3 支 持 的 <strong>ARM</strong> 体 系 结 构 和 示 例 处 理 器 ( 续 )体 系 结 构 说 明 示 例 处 理 器7-A 支 持 基 于 虚 拟 MMU 的 内 存 系 统 的 <strong>ARM</strong>v7 应 用 程 序 规 格 , 具 有<strong>ARM</strong>、Thumb-2 和 Thumb-2EE 指 令 集 、DSP 支 持 以 及 32 位 SIMD支 持7-R <strong>ARM</strong>v7 实 时 规 格 , 具 有 <strong>ARM</strong>、 Thumb-2、 DSP 支 持 以 及 32 位SIMD 支 持Cortex-A8、 Cortex-A9Cortex-R4、 Cortex-R4F7-M <strong>ARM</strong>v7 微 控 制 器 规 格 , 仅 具 有 Thumb-2 且 具 有 硬 件 除 法 器 Cortex-M3、 SC300a. <strong>ARM</strong> 编 译 器 不 能 生 成 Java 字 节 代 码 。注 意<strong>ARM</strong>v7 不 是 实 际 的 <strong>ARM</strong> 体 系 结 构 。--cpu=7 指 的 是 所 有 <strong>ARM</strong>v7-A、<strong>ARM</strong>v7-R和 <strong>ARM</strong>v7-M 体 系 结 构 都 具 有 的 功 能 。 根 据 定 义 , --cpu=7 选 项 所 具 有 的 任 何 给定 功 能 在 所 有 <strong>ARM</strong>v7-A、 <strong>ARM</strong>v7-R 和 <strong>ARM</strong>v7-M 体 系 结 构 中 都 存 在 。缺 省 设 置如 果 未 指 定 --cpu 选 项 , 编 译 器 将 采 用 --cpu=<strong>ARM</strong>7TDMI。若 要 获 取 CPU 体 系 结 构 和 处 理 器 的 完 整 列 表 , 请 使 用 --cpu=list 选 项 。用 法以 下 主 要 的 几 点 适 用 于 处 理 器 和 体 系 结 构 选 项 :处 理 器• 选 择 处 理 器 时 需 要 选 择 适 当 的 体 系 结 构 、 浮 点 单 元 (FPU) 以及 内 存 组 织 。• 受 支 持 的 --cpu 值 包 括 所 有 当 前 的 <strong>ARM</strong> 产 品 名 称 或 体 系 结 构版 本 。此 外 , 还 支 持 其 他 基 于 <strong>ARM</strong> 体 系 结 构 的 处 理 器 , 如 MarvellFeroceon 和 Intel XScale。2-32 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项• 如 果 为 --cpu 选 项 指 定 了 处 理 器 , 则 将 针 对 该 处 理 器 优 化 已编 译 的 代 码 。 这 使 得 编 译 器 可 使 用 特 定 的 协 处 理 器 或 指 令 调度 来 优 化 性 能 。体 系 结 构 • 如 果 为 --cpu 选 项 指 定 了 体 系 结 构 名 称 , 则 会 编 译 代 码 , 使其 可 在 支 持 该 体 系 结 构 的 任 何 处 理 器 上 运 行 。 例如 ,--cpu=5TE 所 生 成 的 代 码 可 由 <strong>ARM</strong>926EJ-S ® 使 用 。FPU • 有 些 --cpu 规 范 中 隐 含 --fpu 的 选 择 。 例 如 , 在 用 --arm 选 项进 行 编 译 时 ,--cpu=<strong>ARM</strong>1136JF-S 隐 含 了 --fpu=vfpv2。 类 似 地 ,--cpu=Cortex-R4F 隐 含 了 --fpu=vfpv3_d16。注 意在 命 令 行 中 用 --fpu 设 置 的 任 意 显 式 FPU 都 将 覆 盖 隐 式 FPU。• 如 果 既 未 指 定 --fpu 选 项 也 未 指 定 --cpu 选 项 , 则 会 使 用--fpu=softvfp。<strong>ARM</strong>/Thumb• 指 定 支 持 Thumb 指 令 的 处 理 器 或 体 系 结 构 ( 如--cpu=<strong>ARM</strong>7TDMI) 时 , 并 不 会 使 编 译 器 生 成 Thumb 代 码 。 该 操作 只 启 用 要 使 用 的 处 理 器 的 功 能 , 如 长 乘 法 。 使 用 --thumb 选项 可 生 成 Thumb 代 码 , 除 非 处 理 器 是 仅 支 持 Thumb 的 处 理器 , 如 Cortex-M3。 在 此 情 况 下 , --thumb 不 是 必 需 的 。注 意指 定 目 标 处 理 器 或 体 系 结 构 时 , 可 能 会 导 致 编 译 器 所 生 成 的对 象 代 码 与 其 他 <strong>ARM</strong> 处 理 器 不 兼 容 。 例 如 , 如 果 为 体 系 结构 <strong>ARM</strong>v6 编 译 的 代 码 包 含 <strong>ARM</strong>v6 特 有 的 指 令 , 则 这 些 代 码可 能 无 法 在 <strong>ARM</strong>920T 处 理 器 上 运 行 。 因 此 , 必 须 选 择 同 时符 合 您 各 种 需 要 的 处 理 器 。• 如 果 要 为 支 持 <strong>ARM</strong>v4T 或 <strong>ARM</strong>v5T 的 处 理 器 编 译 专 用 于<strong>ARM</strong>/Thumb 混 合 系 统 的 代 码 , 则 必 须 指 定 交 互 操 作 选 项--apcs=/interwork。 缺 省 情 况 下 , 将 为 支 持 <strong>ARM</strong>v5T 或 更 高版 本 的 处 理 器 启 用 此 选 项 。• 如 果 要 为 Thumb 编 译 代 码 ( 即 在 命 令 行 中 使 用 --thumb 选 项进 行 编 译 ), 则 编 译 器 会 尽 可 能 多 地 使 用 Thumb 指 令 集 编 译代 码 。 但 编 译 器 可 能 会 在 编 译 过 程 中 生 成 <strong>ARM</strong> 代 码 。 例 如 ,如 果 要 为 Thumb-1 处 理 器 编 译 代 码 并 使 用 了 VFP, 则 将 为<strong>ARM</strong> 编 译 包 含 浮 点 运 算 的 任 何 函 数 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-33ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项• 如 果 要 为 <strong>ARM</strong>v7-M ( 如 --cpu=Cortex-M3) 编 译 代 码 , 则 无需 在 命 令 行 中 指 定 --thumb, 因 为 <strong>ARM</strong>v7-M 仅 支 持Thumb-2。限 制不 能 在 同 一 命 令 行 中 同 时 指 定 处 理 器 和 体 系 结 构 。另 请 参 阅• 第 2-4 页 的 --apcs=qualifer...qualifier• 第 2-30 页 的 --cpu=list• 第 2-61 页 的 --fpu=name• 第 2-118 页 的 --thumb2.1.34 --create_pch=filename此 选 项 指 示 编 译 器 创 建 一 个 具 有 指 定 文 件 名 的 预 编 译 头 文 件 (PCH) 文 件 。此 选 项 优 先 于 所 有 其 他 的 PCH 选 项 。语 法--create_pch=filename其 中 :filename 是 要 创 建 的 PCH 文 件 的 名 称 。另 请 参 阅• 第 2-98 页 的 --pch• 第 2-98 页 的 --pch_dir=dir• 第 2-99 页 的 --pch_messages, --no_pch_messages• 第 2-99 页 的 --pch_verbose, --no_pch_verbose• 第 2-125 页 的 --use_pch=filename• 第 4-62 页 的 #pragma hdrstop• 第 4-63 页 的 #pragma no_pch• 《 编 译 器 用 户 指 南 》 中 第 2-18 页 的 预 编 译 的 头 文 件2-34 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.35 -Dname[(parm-list)][=def]此 选 项 定 义 宏 name。语 法-Dname[(parm-list)][=def]其 中 :name 是 要 定 义 的 宏 的 名 称 。parm-list是 以 逗 号 分 隔 的 宏 参 数 的 可 选 列 表 。 通 过 将 宏 参 数 列 表 追 加 到 宏名 称 中 , 可 以 定 义 函 数 风 格 的 宏 。参 数 列 表 必 须 括 在 括 号 内 。 指 定 多 个 参 数 时 , 不 能 在 列 表 中 的 逗号 和 参 数 名 称 之 间 留 有 空 格 。注 意在 UNIX 系 统 上 , 括 号 可 能 需 要 转 义 。=def 是 一 个 可 选 的 宏 定 义 。如 果 省 略 =def, 则 编 译 器 会 将 name 定 义 为 值 1。若 要 在 命 令 行 中 包 含 识 别 为 标 记 的 字 符 , 请 将 宏 定 义 括 号 双 引 号内 。用 法指 定 -Dname 与 将 文 本 #define name 放 在 每 个 源 文 件 的 开 头 的 作 用 相 同 。限 制编 译 器 按 以 下 顺 序 定 义 和 取 消 定 义 宏 :1. 编 译 器 预 定 义 的 宏2. 使 用 -Dname 显 式 定 义 的 宏3. 使 用 -Uname 显 式 取 消 定 义 的 宏 。示 例在 命 令 行 中 指 定 以 下 选 项 :-DMAX(X,Y)="((X > Y) ? X : Y)"<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-35ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项相 当 于 在 每 个 源 文 件 开 头 定 义 以 下 宏 :#define MAX(X, Y) ((X > Y) ? X : Y)二 者 效 果 相 同 。另 请 参 阅• 第 2-21 页 的 -C• 第 2-51 页 的 -E• 第 2-123 页 的 -Uname• 第 4-115 页 的 编 译 器 预 定 义2.1.36 --data_reorder, --no_data_reorder此 选 项 允 许 或 禁 止 对 顶 级 数 据 项 ( 如 全 局 变 量 ) 进 行 自 动 重 新 排 序 。编 译 器 可 通 过 消 除 数 据 项 之 间 的 多 余 空 格 来 节 省 内 存 。 但 如 果 旧 代 码 对 有 关 编译 器 执 行 的 数 据 排 序 的 假 定 无 效 , 则 --data_reorder 可 能 会 破 坏 该 代 码 。ISO C 标 准 不 保 证 数 据 顺 序 , 因 此 必 须 避 免 编 写 依 赖 于 任 何 假 定 排 序 的 代 码 。如 果 需 要 数 据 排 序 , 则 应 将 数 据 项 放 入 结 构 中 。缺 省 设 置缺 省 选 项 为 --data_reorder。2.1.37 --debug, --no_debug此 选 项 允 许 或 禁 止 在 当 前 编 译 过 程 中 生 成 调 试 表 。无 论 是 否 使 用 --debug, 编 译 器 都 会 生 成 相 同 的 代 码 。 唯 一 差 别 就 是 调 试 表 存 在与 否 。缺 省 设 置缺 省 选 项 为 --no_debug。使 用 --debug 不 会 影 响 优 化 设 置 。 缺 省 情 况 下 , 单 独 使 用 --debug 选 项 相 当 于 使用 以 下 选 项 :--debug --dwarf3 --debug_macros2-36 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项另 请 参 阅• --debug_macros, --no_debug_macros• 第 2-51 页 的 --dwarf2• 第 2-51 页 的 --dwarf3• 第 2-94 页 的 -Onum2.1.38 --debug_macros, --no_debug_macros此 选 项 允 许 或 禁 止 生 成 预 处 理 程 序 宏 定 义 的 调 试 表 条 目 。用 法使 用 --no_debug_macros 可 减 少 调 试 映 像 的 大 小 。此 选 项 必 须 与 --debug 选 项 结 合 使 用 。缺 省 设 置缺 省 选 项 为 --debug_macros。另 请 参 阅• 第 2-36 页 的 --debug, --no_debug2.1.39 --default_extension=ext此 选 项 使 您 可 以 将 对 象 文 件 的 扩 展 名 从 缺 省 扩 展 名 (.o) 更 改 为 所 选 扩 展 名 。语 法--default_extension=ext其 中 :ext 是 所 选 的 文 件 扩 展 名 。示 例以 下 示 例 创 建 一 个 名 为 test.obj 而 不 是 test.o 的 对 象 文 件 :armcc --default_extension=obj -c test.c<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-37ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项注 意-o filename 选 项 可 覆 盖 此 文 件 名 。 例 如 , 以 下 命 令 将 产 生 一 个 名 为 test.o 的 对象 文 件 :armcc --default_extension=obj -o test.o -c test.c2.1.40 --dep_name, --no_dep_name此 选 项 启 用 或 禁 用 C++ 中 的 从 属 名 称 处 理 。C++ 标 准 规 定 应 在 下 列 情 况 下 在 模 板 中 执 行 名 称 查 找 :• 在 分 析 模 板 时 ( 如 果 名 称 不 是 从 属 的 )• 在 分 析 模 板 或 实 例 化 模 板 时 ( 如 果 名 称 是 从 属 的 )。如 果 选 择 了 选 项 --no_dep_name, 则 只 能 在 实 例 化 模 板 时 在 模 板 中 执 行 从 属 名 称查 找 。 也 就 是 说 , 不 能 在 分 析 模 板 时 执 行 从 属 名 称 查 找 。注 意--no_dep_name 选 项 仅 作 为 不 符 合 C++ 标 准 的 旧 式 源 代 码 的 迁 移 辅 助 选 项 。 不 建议 使 用 此 选 项 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 为 --dep_name。限 制--dep_name 选 项 不 能 与 --no_parse_templates 选 项 结 合 使 用 , 因 为 在 启 用 从 属 名 称处 理 时 , 缺 省 情 况 下 将 执 行 分 析 。错 误如 果 将 --dep_name 选 项 与 --no_parse_templates 结 合 使 用 , 编 译 器 将 会 生 成 错 误 。2-38 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-97 页 的 --parse_templates, --no_parse_templates• 第 5-14 页 的 模 板 实 例 化2.1.41 --depend=filename此 选 项 指 示 编 译 器 在 编 译 期 间 将 makefile 相 关 性 行 写 入 文 件 中 。语 法--depend=filename其 中 :filename 是 要 输 出 的 相 关 性 文 件 的 名 称 。限 制如 果 在 命 令 行 中 指 定 了 多 个 源 文 件 , 则 将 忽 略 任 何 --depend 选 项 。 在 这 种 情 况下 , 不 会 生 成 任 何 相 关 性 文 件 。用 法输 出 文 件 适 合 由 make 实 用 程 序 使 用 。 若 要 将 输 出 格 式 更 改 为 与 UNIX make 实用 程 序 兼 容 的 格 式 , 请 使 用 --depend_format 选 项 。另 请 参 阅• 第 2-40 页 的 --depend_format=string• 第 2-41 页 的 --depend_system_headers,--no_depend_system_headers• 第 2-42 页 的 --depend_target=target• 第 2-70 页 的 --ignore_missing_headers• 第 2-80 页 的 --list• 第 2-86 页 的 -M• 第 2-87 页 的 --md• 第 2-101 页 的 --phony_targets<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-39ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.42 --depend_format=string此 选 项 更 改 输 出 相 关 性 文 件 的 格 式 , 以 便 与 某 些 UNIX make 程 序 兼 容 。语 法--depend_format=string其 中 , string 是 下 列 值 之 一 :unix 使 用 UNIX 风 格 的 路 径 分 隔 符 生 成 相 关 性 文 件 条 目 。unix_escaped 与 unix 相 同 , 但 将 空 格 转 义 为 \。unix_quoted 与 unix 相 同 , 但 路 径 名 用 双 引 号 括 起 。用 法unixunix_escapedunix_quoted在 Windows 系 统 上 ,--depend_format=unix 强 制 使 用 UNIX 风格 的 路 径 名 。 也 就 是 说 , 将 使 用 UNIX 风 格 的 路 径 分 隔 符 /替 代 \。在 UNIX 系 统 上 , --depend_format=unix 无 效 。在 Windows 系 统 上 , --depend_format=unix_escaped 强 制 使 用Unix 风 格 的 路 径 名 , 并 将 空 格 转 义 为 \。在 UNIX 系 统 上 , --depend_format=unix_escaped 将 空 格 转 义为 \。在 Windows 系 统 上 , --depend_format=unix_quoted 强 制 使 用Unix 风 格 的 路 径 名 , 并 用 "" 括 起 这 些 路 径 名 。在 UNIX 系 统 上 ,--depend_format=unix_quoted 用 "" 括 起 路 径名 。缺 省 设 置如 果 未 指 定 --depend_format 选 项 , 则 输 出 相 关 性 文 件 的 格 式 将 因 所 选 的 操 作 系统 而 异 :WindowsUNIX在 Windows 系 统 上 , 缺 省 情 况 下 使 用 Windows 风 格 的 路 径或 UNIX 风 格 的 路 径 ( 以 指 定 的 为 准 )。在 UNIX 系 统 上 , 缺 省 为 --depend_format=unix。2-40 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项示 例在 Windows 系 统 上 , 编 译 包 含 以 下 一 行 的 main.c 文 件 :#include "..\include\header files\common.h"上 述 编 译 是 使 用 --depend=depend.txt --depend_format=unix_escaped 选 项 执 行 的 ,这 会 生 成 一 个 包 含 下 列 条 目 的 相 关 性 文 件 depend.txt:main.axf: main.cmain.axf: ../include/header\ files/common.h另 请 参 阅• 第 2-39 页 的 --depend=filename• --depend_system_headers, --no_depend_system_headers• 第 2-42 页 的 --depend_target=target• 第 2-70 页 的 --ignore_missing_headers• 第 2-86 页 的 -M• 第 2-87 页 的 --md• 第 2-101 页 的 --phony_targets2.1.43 --depend_system_headers, --no_depend_system_headers使 用 -M 选 项 或 --md 选 项 生 成 makefile 相 关 性 信 息 时 , 此 选 项 用 于 启 用 或 禁 用 系统 包 含 相 关 性 行 的 输 出 。缺 省 设 置缺 省 选 项 为 --depend_system_headers。示 例/* hello.c */#include int main(void){printf("Hello, world!\n");return 0;}用 -M 选 项 编 译 此 代 码 时 , 所 生 成 的 结 果 如 下 :__image.axf: hello.c__image.axf: ...\include\...\stdio.h<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-41ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项使 用 -M --no_depend_system_headers 选 项 编 译 此 代 码 时 , 所 生 成 的 结 果 如 下 :__image.axf: hello.c另 请 参 阅• 第 2-39 页 的 --depend=filename• 第 2-40 页 的 --depend_format=string• --depend_target=target• 第 2-70 页 的 --ignore_missing_headers• 第 2-86 页 的 -M• 第 2-87 页 的 --md• 第 2-101 页 的 --phony_targets2.1.44 --depend_target=target此 选 项 为 生 成 makefile 相 关 性 设 置 目 标 。用 法使 用 此 选 项 可 覆 盖 缺 省 目 标 。限 制此 选 项 的 行 为 与 GCC 中 的 -MT 类 似 。 但 是 , 在 指 定 多 个 目 标 时 , 行 为 会 有 所 不同 。 例 如 , gcc -M -MT target1 -MT target2 file.c 得 出 的 结 果 可 能 为 target1target2: file.c header.h, 而 --depend_target=target1 --depend_target=target2 将target2 视 为 目 标 。另 请 参 阅• 第 2-39 页 的 --depend=filename• 第 2-40 页 的 --depend_format=string• 第 2-41 页 的 --depend_system_headers,--no_depend_system_headers• 第 2-70 页 的 --ignore_missing_headers• 第 2-86 页 的 -M• 第 2-87 页 的 --md• 第 2-101 页 的 --phony_targets2-42 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.45 --device=list此 选 项 列 出 可 用 于 --device=name 选 项 的 受 支 持 的 设 备 名 称 。另 请 参 阅• --device=name2.1.46 --device=name使 用 此 选 项 可 以 为 特 定 微 控 制 器 或 芯 片 上 系 统 (SoC) 设 备 编 译 代 码 。语 法--device=name其 中 :name 是 目 标 微 控 制 器 或 SoC 设 备 的 名 称 。用 法指 定 特 定 设 备 名 称 时 , 设 备 会 从 相 应 的 CPU 继 承 缺 省 端 标 记 和 浮 点 体 系 结 构 。您 可 以 使 用 --bi、--li 和 --fpu 选 项 来 改 变 端 标 记 和 目 标 浮 点 体 系 结 构 的 缺 省 设置 。另 请 参 阅• 第 2-17 页 的 --bigend• --device=list• 第 2-61 页 的 --fpu=name• 第 2-83 页 的 --littleend• 《 链 接 器 参 考 指 南 》 中 第 2-14 页 的 --device=list• 《 链 接 器 参 考 指 南 》 中 第 2-14 页 的 --device=name• 《 汇 编 器 指 南 》 中 第 3-43 页 的 使 用 C 预 处 理 程 序<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-43ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.47 --diag_error=tag[,tag,...]此 选 项 将 具 有 指 定 标 签 的 诊 断 消 息 设 置 为 “ 错 误 ” 严 重 性 。注 意此 选 项 使 #pragma 等 效 于 #pragma diag_error。语 法--diag_error=tag[,tag,...]其 中 :tag[,tag,...]是 一 个 以 逗 号 分 隔 的 诊 断 消 息 编 号 列 表 , 用 于 指 定 要 更 改 其严 重 性 的 消 息 。必 须 至 少 指 定 一 个 诊 断 消 息 编 号 。指 定 多 个 诊 断 消 息 编 号 时 , 不 能 在 列 表 中 的 逗 号 和 参 数 名 称之 间 留 有 空 格 。用 法可 更 改 下 列 类 型 的 诊 断 消 息 的 严 重 性 :• 具 有 编 号 格 式 #nnnn-D 的 消 息 。• 编 号 格 式 为 CnnnnW 的 警 告 消 息 。另 请 参 阅• 第 2-45 页 的 --diag_remark=tag[,tag,... ]• 第 2-46 页 的 --diag_suppress=tag[,tag,...]• 第 2-48 页 的 --diag_warning=tag[,tag,...]• 第 4-59 页 的 #pragma diag_error tag[,tag,...]• 《 编 译 器 用 户 指 南 》 中 第 6-5 页 的 更 改 诊 断 消 息 的 严 重 性 。2-44 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.48 --diag_remark=tag[,tag,...]此 选 项 将 具 有 指 定 标 记 的 诊 断 消 息 设 置 为 “ 备 注 ” 严 重 性 。--diag_remark 选 项 的 行 为 与 --diag_errors 类 似 , 只 不 过 编 译 器 将 具 有 指 定 标 签的 诊 断 消 息 设 置 为 “ 备 注 ” 严 重 性 , 而 不 是 “ 错 误 ” 严 重 性 。注 意缺 省 情 况 下 不 显 示 备 注 。 要 查 看 备 注 消 息 , 请 使 用 编 译 器 选 项 --remarks。注 意此 选 项 使 #pragma 等 效 于 #pragma diag_remark。语 法--diag_remark=tag[,tag,...]其 中 :tag[,tag,...]是 一 个 以 逗 号 分 隔 的 诊 断 消 息 编 号 列 表 , 用 于 指 定 要 更 改 其严 重 性 的 消 息 。另 请 参 阅• 第 2-44 页 的 --diag_error=tag[,tag,...]• 第 2-46 页 的 --diag_suppress=tag[,tag,...]• 第 2-48 页 的 --diag_warning=tag[,tag,...]• 第 2-108 页 的 --remarks• 第 4-59 页 的 #pragma diag_remark tag[,tag,...]• 《 编 译 器 用 户 指 南 》 中 第 6-5 页 的 更 改 诊 断 消 息 的 严 重 性 。2.1.49 --diag_style={arm|ide|gnu}此 选 项 指 定 用 于 显 示 诊 断 消 息 的 样 式 。语 法--diag_style=string其 中 , string 是 下 列 值 之 一 :arm 使 用 <strong>ARM</strong> 编 译 器 样 式 显 示 消 息 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-45ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项ide 包 含 任 意 出 错 行 的 行 号 和 字 符 计 数 。 这 些 值 将 显 示 在 括 号 中 。gnu 用 gcc 所 使 用 的 格 式 显 示 消 息 。缺 省 设 置如 果 未 指 定 --diag_style 选 项 , 编 译 器 将 采 用 --diag_style=arm。用 法选 择 --diag_style=ide 选 项 会 隐 式 选 择 --brief_diagnostics 选 项 。 在 命 令 行 中 显式 选 择 --no_brief_diagnostics 会 覆 盖 --diag_style=ide 隐 式 选 择 的--brief_diagnostics。选 择 --diag_style=arm 选 项 或 --diag_style=gnu 选 项 不 会 隐 式 选 择 任 何--brief_diagnostics。另 请 参 阅• 第 2-44 页 的 --diag_error=tag[,tag,...]• 第 2-45 页 的 --diag_remark=tag[,tag,... ]• --diag_suppress=tag[,tag,...]• 第 2-48 页 的 --diag_warning=tag[,tag,...]• 《 编 译 器 用 户 指 南 》 中 第 6-5 页 的 更 改 诊 断 消 息 的 严 重 性 。2.1.50 --diag_suppress=tag[,tag,...]此 选 项 禁 用 具 有 指 定 标 签 的 诊 断 消 息 。--diag_suppress 选 项 的 行 为 与 --diag_errors 类 似 , 只 不 过 编 译 器 将 禁 用 具 有 指定 标 签 的 诊 断 消 息 , 而 不 是 将 其 设 置 为 “ 错 误 ” 严 重 性 。注 意此 选 项 使 #pragma 等 效 于 #pragma diag_suppress。语 法--diag_suppress=tag[,tag,...]2-46 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项其 中 :tag[,tag,...]是 一 个 以 逗 号 分 隔 的 诊 断 消 息 编 号 列 表 , 用 于 指 定 要 禁 止 的消 息 。另 请 参 阅• 第 2-44 页 的 --diag_error=tag[,tag,...]• 第 2-45 页 的 --diag_remark=tag[,tag,... ]• 第 2-48 页 的 --diag_warning=tag[,tag,...]• 第 4-60 页 的 #pragma diag_suppress tag[,tag,...]• 《 编 译 器 用 户 指 南 》 中 第 6-6 页 的 禁 止 显 示 诊 断 消 息 。2.1.51 --diag_suppress=optimizations使 用 此 选 项 将 禁 止 高 级 优 化 的 诊 断 消 息 。缺 省 设 置缺 省 情 况 下 , 优 化 消 息 具 有 “ 备 注 ” 严 重 性 。 指 定--diag_suppress=optimizations 会 禁 止 显 示 优 化 消 息 。注 意使 用 --remarks 选 项 可 查 看 具 有 “ 备 注 ” 严 重 性 的 优 化 消 息 。用 法编 译 器 在 优 化 级 别 -O3 ( 如 循 环 展 开 ) 进 行 编 译 时 , 会 执 行 某 些 高 级 向 量 和 标量 优 化 。 使 用 此 选 项 可 以 禁 止 与 这 些 高 级 优 化 有 关 的 诊 断 消 息 。示 例int factorial(int n){int result=1;while (n > 0)result *= n--;return result;}用 -O3 -Otime --remarks --diag_suppress=optimizations 选 项 编 译 此 代 码 时 , 将 禁 止显 示 优 化 消 息 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-47ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-46 页 的 --diag_suppress=tag[,tag,...]• --diag_warning=optimizations• 第 2-94 页 的 -Onum• 第 2-96 页 的 -Otime• 第 2-108 页 的 --remarks2.1.52 --diag_warning=tag[,tag,...]此 选 项 将 具 有 指 定 标 签 的 诊 断 消 息 设 置 为 “ 警 告 ” 严 重 性 。--diag_warning 选 项 的 行 为 与 --diag_errors 类 似 , 只 不 过 编 译 器 将 具 有 指 定 标 签的 诊 断 消 息 设 置 为 “ 警 告 ” 严 重 性 , 而 不 是 “ 错 误 ” 严 重 性 。注 意此 选 项 使 #pragma 等 效 于 #pragma diag_warning。语 法--diag_warning=tag[,tag,...]其 中 :tag[,tag,...]是 一 个 以 逗 号 分 隔 的 诊 断 消 息 编 号 列 表 , 用 于 指 定 要 更 改 其严 重 性 的 消 息 。另 请 参 阅• 第 2-44 页 的 --diag_error=tag[,tag,...]• 第 2-45 页 的 --diag_remark=tag[,tag,... ]• 第 2-46 页 的 --diag_suppress=tag[,tag,...]• 第 4-61 页 的 #pragma diag_warning tag[, tag, ...]• 《 编 译 器 用 户 指 南 》 中 第 6-5 页 的 更 改 诊 断 消 息 的 严 重 性2.1.53 --diag_warning=optimizations此 选 项 可 将 高 级 优 化 诊 断 消 息 设 置 为 “ 警 告 ” 严 重 性 。缺 省 设 置缺 省 情 况 下 , 优 化 消 息 具 有 “ 备 注 ” 严 重 性 。2-48 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项用 法编 译 器 在 优 化 级 别 -O3 -Otime ( 如 循 环 展 开 ) 进 行 编 译 时 , 会 执 行 某 些 高 级 向 量和 标 量 优 化 。 使 用 此 选 项 可 显 示 与 这 些 高 级 优 化 相 关 的 诊 断 消 息 。示 例int factorial(int n){int result=1;while (n > 0)result *= n--;return result;}用 --vectorize --cpu=Cortex-A8 -O3 -Otime --diag_warning=optimizations 选 项 编 译此 代 码 时 , 会 生 成 优 化 警 告 消 息 。另 请 参 阅• 第 2-47 页 的 --diag_suppress=optimizations• 第 2-48 页 的 --diag_warning=tag[,tag,...]• 第 2-94 页 的 -Onum• 第 2-96 页 的 -Otime2.1.54 --dllexport_all, --no_dllexport_all此 选 项 使 您 可 以 控 制 生 成 DLL 时 的 符 号 可 见 性 。缺 省 设 置缺 省 为 --no_dllexport_all。用 法使 用 --dllexport_all 选 项 可 将 所 有 extern 定 义 标 记 为 __declspec(dllexport)。另 请 参 阅• 第 2-4 页 的 --apcs=qualifer...qualifier• 第 4-24 页 的 __declspec(dllexport)<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-49ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.55 --dllimport_runtime, --no_dllimport_runtime此 选 项 用 于 控 制 在 运 行 时 库 用 作 共 享 库 时 的 符 号 可 见 性 。缺 省 设 置缺 省 为 --no_dllimport_runtime。用 法使 用 --dllimport_runtime 选 项 可 以 :• 将 所 有 内 置 符 号 标 记 为 __declspec(dllimport)• 标 记 cpprt 运 行 时 库 中 生 成 的 运 行 时 类 型 信 息 (RTTI) 以 便 执 行 导 入• 在 将 原 函 数 标 记 为 __declspec(dllimport) 的 前 提 下 , 标 记 任 何 优 化 的printf() 和 __hardfp_ 函 数 以 便 执 行 导 入 。另 请 参 阅• 第 2-68 页 的 --guiding_decls, --no_guiding_decls• 第 2-110 页 的 --rtti, --no_rtti• 第 4-26 页 的 __declspec(dllimport)2.1.56 --dollar, --no_dollar此 选 项 指 示 编 译 器 在 标 识 符 中 接 受 或 拒 绝 美 元 符 号 $。缺 省 设 置如 果 未 指 定 --strict 选 项 , 则 缺 省 为 --dollar。如 果 指 定 了 --strict 选 项 , 则 缺 省 为 --no_dollar。另 请 参 阅• 第 3-12 页 的 标 识 符 中 的 美 元 符 号• 第 2-115 页 的 --strict, --no_strict2-50 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.57 --dwarf2此 选 项 指 示 编 译 器 使 用 DWARF 2 调 试 表 格 式 。缺 省 设 置除 非 显 式 指 定 --dwarf2, 否 则 编 译 器 将 采 用 --dwarf3。另 请 参 阅• --dwarf32.1.58 --dwarf3此 选 项 指 示 编 译 器 使 用 DWARF 3 调 试 表 格 式 。缺 省 设 置除 非 显 式 指 定 --dwarf2, 否 则 编 译 器 将 采 用 --dwarf3。另 请 参 阅• --dwarf22.1.59 -E此 选 项 指 示 编 译 器 仅 执 行 预 处 理 程 序 步 骤 。缺 省 情 况 下 , 预 处 理 程 序 的 输 出 将 发 送 到 标 准 输 出 流 , 并 且 可 以 用 标 准 UNIX和 MS-DOS 记 号 重 定 向 到 文 件 。也 可 以 使 用 -o 选 项 指 定 用 于 存 放 预 处 理 输 出 的 文 件 。 缺 省 情 况 下 , 将 从 输 出 中删 除 注 释 。 预 处 理 程 序 接 受 带 有 任 何 扩 展 名 ( 如 .o、 .s 和 .txt) 的 源 文 件 。示 例armcc -E source.c > raw.c另 请 参 阅• 第 2-21 页 的 -C• 第 2-92 页 的 -o filename<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-51ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.60 --emit_frame_directives, --no_emit_frame_directives此 选 项 指 示 编 译 器 将 DWARF FRAME 指 令 放 置 在 反 汇 编 输 出 中 。缺 省 设 置缺 省 选 项 为 --no_emit_frame_directives。示 例armcc --asm --emit_frame_directives foo.carmcc -S emit_frame_directives foo.c另 请 参 阅• 第 2-15 页 的 --asm• 第 2-110 页 的 -S• 《 汇 编 器 指 南 》 中 第 2-50 页 的 使 用 框 架 指 令 。2.1.61 --enum_is_int此 选 项 将 所 有 枚 举 类 型 的 大 小 强 制 设 置 为 至 少 四 字 节 。缺 省 情 况 下 禁 用 此 选 项 , 并 使 用 可 存 放 所 有 枚 举 器 的 值 的 最 小 数 据 类 型 。如 果 在 命 令 行 中 指 定 <strong>ARM</strong> Linux 配 置 文 件 , 缺 省 情 况 下 会 启 用 此 选 项 。注 意建 议 尽 量 少 用 --enum_is_int 选 项 。另 请 参 阅• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-73 页 的 --interface_enums_are_32_bit2.1.62 --errors=filename此 选 项 将 诊 断 消 息 的 输 出 从 stderr 重 定 向 到 指 定 的 错 误 文 件 。2-52 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项语 法--errors=filename其 中 :filename 是 要 将 错 误 重 定 向 到 的 文 件 的 名 称 。在 某 些 情 况 下 ( 例 如 , 错 误 地 键 入 了 选 项 名 称 ), 不 会 重 定 向 与 命 令 选 项 问 题相 关 的 诊 断 。 不 过 , 如 果 为 选 项 指 定 了 无 效 参 数 ( 如 --cpu=999), 就 会 将 相 关的 诊 断 重 定 向 到 指 定 的 filename。另 请 参 阅• 第 2-19 页 的 --brief_diagnostics, --no_brief_diagnostics• 第 2-44 页 的 --diag_error=tag[,tag,...]• 第 2-45 页 的 --diag_remark=tag[,tag,... ]• 第 2-45 页 的 --diag_style={arm|ide|gnu}• 第 2-46 页 的 --diag_suppress=tag[,tag,...]• 第 2-48 页 的 --diag_warning=tag[,tag,...]• 第 2-108 页 的 --remarks• 第 2-129 页 的 -W• 第 2-133 页 的 --wrap_diagnostics, --no_wrap_diagnostics• 《 编 译 器 用 户 指 南 》 中 的 第 6 章 诊 断 消 息 。2.1.63 --exceptions, --no_exceptions此 选 项 启 用 或 禁 用 异 常 处 理 。在 C++ 中 , --exceptions 选 项 允 许 使 用 throw 和 try/catch, 以 便 遵 守 函 数 异 常 规范 , 并 使 编 译 器 发 布 展 开 表 以 支 持 运 行 时 的 异 常 传 播 。在 C++ 中 , 如 果 指 定 了 --no_exceptions 选 项 , 则 不 允 许 在 源 代 码 中 使 用 throw和 try/catch。 但 是 , 仍 会 分 析 函 数 异 常 规 范 , 不 过 将 忽 略 其 大 部 分 意 义 。在 C 中 , 如 果 通 过 已 编 译 的 函 数 抛 出 了 异 常 , 则 用 --no_exceptions 编 译 的 代 码行 为 将 被 取 消 定 义 。 如 果 希 望 通 过 C 函 数 正 确 传 播 异 常 , 必 须 使 用--exceptions。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-53ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项缺 省 设 置缺 省 为 --no_exceptions。 但 是 , 如 果 在 命 令 行 中 指 定 <strong>ARM</strong> Linux 配 置 文 件 并 使用 --translate_g++, 缺 省 值 将 更 改 为 --exceptions。另 请 参 阅• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• --exceptions_unwind, --no_exceptions_unwind2.1.64 --exceptions_unwind, --no_exceptions_unwind此 选 项 启 用 或 禁 用 针 对 识 别 异 常 的 代 码 来 展 开 函 数 。 仅 当 启 用 --exceptions 时 ,此 选 项 才 有 效 。如 果 使 用 --no_exceptions_unwind 和 --exceptions, 则 不 能 通 过 已 编 译 函 数 传 播 异常 , 而 应 调 用 std::terminate。缺 省 设 置缺 省 选 项 为 --exceptions_unwind。另 请 参 阅• 第 2-53 页 的 --exceptions, --no_exceptions• 第 5-17 页 的 运 行 时 的 函 数 展 开2.1.65 --export_all_vtbl, --no_export_all_vtbl此 选 项 控 制 在 C++ 中 导 出 动 态 符 号 的 方 式 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 为 --no_export_all_vtbl。2-54 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项用 法使 用 选 项 --export_all_vtbl 可 导 出 具 有 关 键 函 数 的 类 的 所 有 虚 拟 函 数 表 和RTTI。 关 键 函 数 是 类 中 按 非 内 联 的 声 明 顺 序 列 出 的 第 一 个 虚 拟 函 数 , 它 不 是 纯虚 拟 函 数 。注 意可 以 通 过 使 用 __declspec(notshared) 来 禁 用 特 定 类 的 导 出 。另 请 参 阅• 第 4-29 页 的 __declspec(notshared)2.1.66 --export_defs_implicitly, --no_export_defs_implicitly此 选 项 控 制 导 出 动 态 符 号 的 方 式 。缺 省 设 置缺 省 选 项 为 --no_export_defs_implicitly。用 法使 用 --export_defs_implicitly 选 项 可 以 导 出 其 原 型 标 记 为 __declspec(dllimport)的 定 义 。另 请 参 阅• 第 4-26 页 的 __declspec(dllimport)2.1.67 --extended_initializers, --no_extended_initializers这 些 选 项 启 用 和 禁 用 使 用 扩 展 常 数 初 始 值 设 定 项 , 甚 至 使 用 --strict 或--strict_warnings 进 行 编 译 也 是 如 此 。当 使 用 某 些 不 可 移 植 但 受 到 广 泛 支 持 的 常 数 初 始 值 设 定 项 ( 如 地 址 到 整 数 类 型的 类 型 转 换 ) 时 ,--extended_initializers 使 编 译 器 生 成 相 同 的 常 规 警 告 ( 与 通常 在 非 严 格 模 式 下 生 成 的 常 数 初 始 值 设 定 项 有 关 ), 而 不 是 生 成 特 定 错 误 来 指出 表 达 式 必 须 具 有 常 数 值 或 算 术 类 型 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-55ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项缺 省 设 置如 果 用 --strict 或 --strict_warnings 进 行 编 译 , 则 缺 省 选 项 为--no_extended_initializers。如 果 在 非 严 格 模 式 下 进 行 编 译 , 则 缺 省 选 项 为 --extended_initializers。另 请 参 阅• 第 2-115 页 的 --strict, --no_strict• 第 2-116 页 的 --strict_warnings• 第 3-9 页 的 常 数 表 达 式2.1.68 --feedback=filename此 选 项 可 有 效 消 除 未 使 用 的 函 数 , 在 <strong>ARM</strong>v4T 体 系 结 构 上 , 可 以 减 少 交 互 操 作所 需 的 编 译 。语 法--feedback=filename其 中 :filename 是 由 <strong>ARM</strong> 链 接 器 在 上 次 执 行 时 创 建 的 反 馈 文 件 。用 法可 以 使 用 同 一 反 馈 文 件 执 行 多 次 编 译 。 编 译 器 将 反 馈 文 件 中 标 识 的 每 个 未 使 用函 数 放 入 对 应 对 象 文 件 中 其 自 身 的 ELF 节 中 。反 馈 文 件 包 含 上 次 编 译 的 相 关 信 息 。 这 是 因 为 :• 反 馈 文 件 可 能 已 过 期 。 也 就 是 说 , 当 前 源 代 码 中 可 能 使 用 了 以 前 标 识 为 未使 用 的 函 数 。 仅 当 未 使 用 函 数 也 未 用 于 当 前 源 代 码 时 , 链 接 器 才 会 删 除 其代 码 。注 意— 因 此 , 使 用 链 接 器 反 馈 消 除 未 使 用 函 数 是 安 全 的 优 化 , 但 对 代 码 大小 的 影 响 不 大 。— 对 于 交 互 操 作 而 言 , 缩 减 编 译 的 使 用 要 求 比 消 除 未 使 用 函 数 要 严 格的 多 。 如 果 要 缩 减 交 互 操 作 编 译 , 一 定 要 确 保 反 馈 文 件 以 及 生 成 该文 件 的 源 代 码 保 持 为 最 新 , 这 一 点 非 常 重 要 。2-56 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项• 若 要 从 链 接 器 反 馈 获 得 最 大 益 处 , 必 须 至 少 执 行 两 次 完 全 编 译 和 链 接 。 不过 , 通 常 使 用 上 次 编 译 中 的 反 馈 执 行 单 次 编 译 和 链 接 就 足 够 了 。另 请 参 阅• 第 2-114 页 的 --split_sections• 《 链 接 器 参 考 指 南 》 中 第 2-22 页 的 --feedback_type=type• 《 编 译 器 用 户 指 南 》 中 第 2-26 页 的 使 用 链 接 器 反 馈 。2.1.69 --force_new_nothrow, --no_force_new_nothrow此 选 项 控 制 C++ 中 new 表 达 式 的 行 为 。C++ 标 准 规 定 只 允 许 用 throw() 声 明 的 无 抛 出 operator new 在 失 败 时 返 回 NULL。从 不 允 许 任 何 其 他 operator new 在 失 败 时 返 回 NULL, 并 且 缺 省 的 operator new 在失 败 时 将 抛 出 异 常 。如 果 使 用 --force_new_nothrow, 则 编 译 器 会 将 使 用 全 局 ::operator new 或::operator new[] 的 表 达 式 ( 如 new T(...args...)) 视 为 new (std::nothrow)T(...args...)。此 外 ,--force_new_nothrow 还 会 使 编 译 器 将 类 特 定 的 任 何 operator new 或 任 何 重载 的 全 局 operator new 视 为 无 抛 出 。注 意--force_new_nothrow 选 项 仅 作 为 不 符 合 C++ 标 准 的 旧 式 源 代 码 的 迁 移 辅 助 选项 。 不 建 议 使 用 此 选 项 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 为 --no_force_new_nothrow。示 例struct S{void* operator new(std::size_t);<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-57ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项void* operator new[](std::size_t);};void *operator new(std::size_t, int);如 果 启 用 --force_new_nothrow 选 项 , 则 上 述 示 例 将 被 视 为 :struct S{void* operator new(std::size_t) throw();void* operator new[](std::size_t) throw();};void *operator new(std::size_t, int) throw();另 请 参 阅• 第 5-13 页 的 使 用 ::operator new 函 数2.1.70 --forceinline此 选 项 强 制 所 有 内 联 函 数 被 视 为 用 __forceinline 进 行 限 定 。内 联 函 数 是 用 inline 或 __inline 限 定 的 函 数 。 在 C++ 中 , 内 联 函 数 是 在 结 构 、类 或 联 合 定 义 内 部 定 义 的 函 数 。如 果 使 用 --forceinline, 编 译 器 总 是 尽 量 尝 试 内 联 这 些 函 数 。 但 如 果 对 函 数 进 行内 联 时 出 现 问 题 , 则 编 译 器 将 不 再 内 联 。 例 如 , 递 归 函 数 仅 内 联 到 本 身 一 次 。另 请 参 阅• 第 2-16 页 的 --autoinline, --no_autoinline• 第 2-73 页 的 --inline, --no_inline• 第 4-6 页 的 __forceinline• 第 4-9 页 的 __inline• 《 编 译 器 用 户 指 南 》 中 第 5-17 页 的 管 理 内 联 。2-58 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.71 --fp16_format=format此 选 项 将 半 精 度 浮 点 数 作 为 VFPv3 体 系 结 构 的 可 选 扩 展 。 如 果 未 指 定 格 式 , 使用 __fp16 数 据 类 型 会 被 编 译 器 视 为 错 误 。语 法--fp16_format=format其 中 , format 是 下 列 值 之 一 :alternative ieee 的 替 代 值 , 可 提 供 附 加 范 围 , 但 不 含 非 数 字 或 无 穷 大 值 。ieee IEEE 754r 定 义 的 半 精 度 二 进 制 浮 点 格 式 , IEEE 754r 是 IEEE 754标 准 的 修 订 版 。none这 是 缺 省 设 置 。 这 相 当 于 未 指 定 格 式 , 意 味 着 编 译 器 会 将 使 用__fp16 数 据 类 型 视 为 错 误 。另 请 参 阅• 第 E-4 页 的 内 在 函 数• 《 编 译 器 用 户 指 南 》 中 第 5-33 页 的 半 精 度 浮 点 数 支 持 。2.1.72 --fpmode=model此 选 项 指 定 浮 点 遵 从 性 , 并 设 置 库 属 性 和 浮 点 优 化 。语 法--fpmode=model其 中 , model 是 下 列 值 之 一 :ieee_full由 IEEE 标 准 保 证 的 所 有 工 具 、 操 作 和 表 示 对 单 精 度 和 双 精 度 都 可用 。 可 在 运 行 时 动 态 选 择 操 作 模 式 。此 选 项 定 义 下 列 符 号 :__FP_IEEE__FP_FENV_EXCEPTIONS__FP_FENV_ROUNDING__FP_INEXACT_EXCEPTION<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-59ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项ieee_fixed 使 用 舍 入 到 最 接 近 的 数 且 无 不 精 确 异 常 的 IEEE 标 准 。此 选 项 定 义 下 列 符 号 :__FP_IEEE__FP_FENV_EXCEPTIONSieee_no_fenv使 用 舍 入 到 最 接 近 的 数 且 无 异 常 的 IEEE 标 准 。 此 模 式 是 无 状 态的 , 并 与 Java 浮 点 算 术 模 型 兼 容 。此 选 项 定 义 符 号 __FP_IEEE。std 使 用 非 正 规 数 清 零 、 舍 入 到 最 接 近 的 数 且 无 异 常 的 IEEE 有 限 值 。此 选 项 与 标 准 C 和 C++ 兼 容 , 并 且 是 缺 省 选 项 。将 根 据 IEEE 标 准 预 测 标 准 有 限 值 。 但 存 在 下 列 限 制 :• 可 能 无 法 在 IEEE 模 型 定 义 的 所 有 环 境 中 生 成 非 数 字 和 无 穷大 。 即 使 生 成 了 , 它 们 的 符 号 也 可 能 有 所 不 同 。• 零 符 号 可 能 不 是 IEEE 模 型 预 测 的 符 号 。fast执 行 会 对 精 度 产 生 较 小 损 失 的 更 积 极 的 浮 点 优 化 , 以 显 著 提 高 性能 。 此 选 项 定 义 符 号 __FP_FAST。此 选 项 会 导 致 与 ISO C 或 C++ 标 准 不 完 全 兼 容 的 行 为 。 但 数 字 稳健 的 浮 点 程 序 的 行 为 应 该 是 正 确 的 。可 执 行 许 多 转 换 , 其 中 包 括 :• 如 果 所 有 浮 点 参 数 都 可 完 全 以 单 精 度 值 形 式 表 示 , 则 双 精 度数 学 函 数 可 转 换 为 等 效 的 单 精 度 函 数 , 并 且 会 直 接 将 结 果 转换 为 单 精 度 值 。仅 当 所 选 库 包 含 等 效 的 单 精 度 函 数 ( 例 如 , 所 选 库 为 rvct 或aeabi_glibc) 时 , 才 会 执 行 此 转 换 。例 如 :float f(float a){return sqrt(a);}将 转 换 为float f(float a){return sqrtf(a);}.2-60 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项• 对 于 限 定 为 单 精 度 的 双 精 度 浮 点 表 达 式 , 如 果 比 较 有 利 , 会用 单 精 度 进 行 计 算 。 例 如 , float y = (float)(x + 1.0) 将 以float y = (float)x + 1.0f 形 式 计 算 。• 将 除 以 浮 点 常 数 替 换 为 乘 以 其 倒 数 。 例 如 , x / 3.0 将 以 x *(1.0 / 3.0) 形 式 计 算 。• 在 调 用 数 学 函 数 后 , 不 能 保 证 errno 的 值 与 ISO C 或 C++ 标准 兼 容 。 这 使 编 译 器 可 以 对 VFP 平 方 根 指 令 进 行 内 联 , 而 不是 调 用 sqrt() 或 sqrtf()。注 意可 能 需 要 初 始 化 代 码 来 启 用 VFP。 有 关 详 细 信 息 , 请 参 阅 《 编 译 器 用 户 指 南 》中 第 5-32 页 的 VFP 支 持 。另 请 参 阅• install_directory\RVDS\Examples\...\vfpsupport 中 的 《<strong>ARM</strong> 应 用 程 序 注 释133 - 在 RVDS 中 使 用 VFP》2.1.73 --fpu=list此 选 项 列 出 可 与 --fpu=name 选 项 结 合 使 用 的 受 支 持 的 FPU 体 系 结 构 名 称 。未 列 出 已 被 弃 用 的 选 项 。另 请 参 阅• --fpu=name2.1.74 --fpu=name此 选 项 使 您 可 以 确 定 目 标 FPU 体 系 结 构 。如 果 指 定 此 选 项 , 则 在 某 些 情 况 下 ( 例 如 , 使 用 --cpu 选 项 时 ), 它 将 覆 盖 显 示在 命 令 行 中 的 所 有 隐 式 FPU 选 项 。若 要 获 取 FPU 体 系 结 构 的 完 整 列 表 , 请 使 用 --fpu=list 选 项 。语 法--fpu=name<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-61ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项其 中 , name 是 下 列 值 之 一 :none选 择 无 浮 点 选 项 。 这 样 不 会 使 用 浮 点 代 码 。 如 果 代 码 包 含 float 类型 , 则 会 生 成 错 误 。vfpv 这 是 vfpv2 的 同 义 词 。vfpv2 选 择 符 合 VFPv2 体 系 结 构 的 硬 件 向 量 浮 点 单 元 。注 意如 果 在 命 令 行 中 输 入 armcc --thumb --fpu=vfpv2, 则 编 译 器 会 尽 可 能使 用 Thumb 指 令 集 编 译 代 码 , 但 会 将 与 硬 件 浮 点 有 关 的 函 数 编 译为 <strong>ARM</strong> 代 码 。 在 这 种 情 况 下 , 预 定 义 __thumb 的 值 是 不 正 确 的 。如 果 用 --arm 选 项 为 <strong>ARM</strong> C 代 码 指 定 了 vfp 或 vfpv2, 则 必 须 使 用__softfp 关 键 字 确 保 将 交 互 操 作 的 <strong>ARM</strong> 代 码 编 译 为 使 用 软 件 浮 点链 接 。vfpv3vfpv3_fp16vfpv3_d16选 择 符 合 VFPv3 体 系 结 构 的 硬 件 向 量 浮 点 单 元 。 VFPv3 能 向 后 兼容 VFPv2, 但 VFPv3 不 能 捕 获 浮 点 异 常 。 只 有 <strong>RealView</strong>Development Suite 3.0 及 更 高 版 本 才 提 供 vpfv3。选 择 符 合 VFPv3 体 系 结 构 的 硬 件 向 量 浮 点 单 元 , 该 体 系 结 构 也 提供 半 精 度 扩 展 。 只 有 <strong>RealView</strong> Development Suite 4.0 及 更 高 版 本 才提 供 vfpv3_fp16。选 择 符 合 VFPv3-D16 体 系 结 构 的 硬 件 向 量 浮 点 单 元 。 只 有<strong>RealView</strong> Development Suite 4.0 及 更 高 版 本 才 提 供 vfpv3_d16。vfpv3_d16_fp16选 择 符 合 VFPv3-D16 体 系 结 构 的 硬 件 向 量 浮 点 单 元 , 该 体 系 结 构也 提 供 半 精 度 扩 展 。 只 有 <strong>RealView</strong> Development Suite 4.0 及 更 高 版本 才 提 供 vfpv3_d16_fp16。softvfp选 择 软 件 浮 点 库 fplib。 如 果 未 指 定 --fpu 选 项 或 者 选 择 了 不 带 FPU的 CPU, 则 此 选 项 为 缺 省 选 项 。在 早 期 版 本 的 RVCT 中 , 如 果 指 定 了 --fpu=softvfp 和 具 有 隐 式VFP 硬 件 的 CPU, 则 链 接 器 会 选 择 使 用 VFP 指 令 实 现 软 浮 点 调 用的 库 。 但 现 在 此 行 为 已 不 再 有 效 。 如 果 需 要 这 一 旧 式 行 为 , 请 使用 --fpu=softvfp+vfp。2-62 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项softvfp+vfpv2选 择 浮 点 库 , 该 库 具 有 可 以 使 用 VFPv2 指 令 的 软 件 浮 点 链 接 。 若要 在 实 现 VFP 单 元 的 系 统 上 对 Thumb 代 码 与 <strong>ARM</strong> 代 码 进 行 交 互操 作 , 请 选 择 此 选 项 。如 果 选 择 此 选 项 , 则 :• 用 --thumb 进 行 编 译 的 行 为 与 --fpu=softvfp 类 似 , 只 不 过 前 者与 使 用 VFP 指 令 的 浮 点 库 相 链 接 。• 用 --arm 编 译 的 行 为 与 --fpu=vfpv2 类 似 , 只 不 过 前 者 为 所 有函 数 指 定 了 软 浮 点 链 接 。 这 意 味 着 函 数 传 递 及 返 回 浮 点 参 数和 结 果 的 方 式 与 --fpu=softvfp 相 同 , 只 不 过 前 者 是 在 内 部 使用 VFP 指 令 。注 意如 果 用 --arm 或 --thumb 选 项 为 C 代 码 指 定 了 softvfp+vfpv2, 则 应 确保 将 交 互 操 作 的 浮 点 代 码 编 译 为 使 用 软 浮 点 链 接 。softvfp+vfpv3选 择 浮 点 库 , 该 库 具 有 以 VFPv3 体 系 结 构 为 目 标 的 软 件 浮 点 链接 。 若 要 在 实 现 VFPv3 单 元 的 系 统 上 对 Thumb 代 码 与 <strong>ARM</strong> 代 码进 行 交 互 操 作 , 请 选 择 此 选 项 。 只 有 <strong>RealView</strong> Development Suite3.0 及 更 高 版 本 才 提 供 softvfp+vfpv3。softvfp+vfpv3_fp16选 择 浮 点 库 , 该 库 具 有 以 支 持 半 精 度 浮 点 扩 展 的 VFPv3 体 系 结 构为 目 标 的 软 件 浮 点 链 接 。 只 有 <strong>RealView</strong> Development Suite 4.0 及 更高 版 本 才 提 供 softvfp+vfpv3_fp16。softvfp+vfpv3_d16选 择 浮 点 库 , 该 库 具 有 以 VFPv3-D16 体 系 结 构 为 目 标 的 软 件 浮 点链 接 。 只 有 <strong>RealView</strong> Development Suite 4.0 及 更 高 版 本 才 提 供softvfp+vfpv3_d16。softvfp+vfpv3_d16_fp16选 择 浮 点 库 , 该 库 具 有 以 支 持 半 精 度 浮 点 扩 展 的 VFPv3-D16 体 系结 构 为 目 标 的 软 件 浮 点 链 接 。 只 有 <strong>RealView</strong> Development Suite 4.0及 更 高 版 本 才 提 供 softvfp+vfpv3_d16_fp16。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-63ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项限 制使 用 --fpu 选 项 显 式 选 择 的 任 何 FPU 始 终 覆 盖 使 用 --cpu 选 项 隐 式 选 定 的 任 何FPU。 例 如 , 即 使 对 CPU 的 选 择 隐 含 了 使 用 体 系 结 构 VFPv2, 选 项--cpu=<strong>ARM</strong>1136JF-S --fpu=softvfp 也 将 生 成 使 用 软 件 浮 点 库 fplib 的 代 码 。如 果 使 用 --cpu 选 项 隐 式 指 定 的 FPU 与 使 用 --fpu 显 式 选 择 的 FPU 不 兼 容 , 则 编译 器 将 生 成 错 误 。编 译 器 只 生 成 标 量 浮 点 运 算 。 如 果 要 使 用 VFP 向 量 运 算 , 必 须 使 用 汇 编 代 码 来实 现 。已 对 softvfp 禁 用 NEON 支 持 。缺 省 设 置如 果 存 在 VFP 协 处 理 器 , 则 会 生 成 VFP 指 令 。 如 果 不 存 在 VFP 协 处 理 器 , 编译 器 生 成 调 用 软 件 浮 点 库 fplib 的 代 码 , 用 于 执 行 浮 点 运 算 。注 意缺 省 情 况 下 , 选 择 某 些 处 理 器 或 体 系 结 构 会 隐 式 选 择 特 定 浮 点 单 元 。 例 如 , 选项 --cpu <strong>ARM</strong>1136JF-S 隐 含 了 选 项 --fpu vfpv2。另 请 参 阅• 第 2-8 页 的 --arm• 第 2-30 页 的 --cpu=name• 第 2-118 页 的 --thumb• 第 4-15 页 的 __softfp• 《 编 译 器 用 户 指 南 》 中 第 5-35 页 的 浮 点 计 算 和 链 接• 《 开 发 指 南 》 中 第 2-5 页 的 浮 点 生 成 选 项 。2.1.75 --friend_injection, --no_friend_injection此 选 项 控 制 C++ 中 friend 声 明 的 可 见 性 。在 C++ 中 , 此 选 项 控 制 使 用 标 准 查 找 机 制 时 , 仅 在 friend 声 明 中 声 明 的 类 或 函数 的 名 称 是 否 可 见 。2-64 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项声 明 friend 名 称 后 , 它 们 对 这 些 查 找 是 可 见 的 。 如 果 未 按 标 准 要 求 声 明 friend名 称 , 则 仅 当 使 用 参 数 相 关 查 找 并 且 类 名 从 不 可 见 时 , 函 数 名 称 才 可 见 。注 意--friend_injection 选 项 仅 作 为 不 符 合 C++ 标 准 的 旧 式 源 代 码 的 迁 移 辅 助 选 项 。不 建 议 使 用 此 选 项 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 选 项 为 --no_friend_injection。另 请 参 阅• 第 3-14 页 的 friend2.1.76 -g此 选 项 用 于 在 当 前 编 译 过 程 中 生 成 调 试 表 。无 论 是 否 使 用 -g, 编 译 器 都 会 生 成 相 同 的 代 码 。 唯 一 差 别 就 是 调 试 表 存 在 与否 。使 用 -g 不 会 影 响 优 化 设 置 。 缺 省 情 况 下 , 单 独 使 用 -g 选 项 相 当 于 使 用 以 下 选项 :-g --dwarf3 --debug_macros另 请 参 阅• 第 2-36 页 的 --debug, --no_debug• 第 2-37 页 的 --debug_macros, --no_debug_macros• 第 2-51 页 的 --dwarf2• 第 2-51 页 的 --dwarf3• 第 2-94 页 的 -Onum<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-65ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.77 --global_reg=reg_name[,reg_name,...]此 选 项 将 指 定 的 寄 存 器 名 称 视 为 固 定 寄 存 器 。语 法--global_reg=reg_name[,reg_name,...]其 中 , reg_name 是 寄 存 器 的 APCS 或 TPCS 名 称 , 由 1 到 8 的 整 数 值 表 示 。寄 存 器 名 称 1 到 8 按 顺 序 映 射 到 寄 存 器 r4 到 r11。限 制此 选 项 与 __global_reg 存 储 类 说 明 符 具 有 相 同 的 限 制 。示 例--global_reg=1,4,5 // 分 别 保 留 寄 存 器 r4、 r7 和 r8。另 请 参 阅• 第 4-7 页 的 __global_reg• 《<strong>ARM</strong> 软 件 开 发 工 具 包 参 考 指 南 》 (<strong>ARM</strong> Software Development ToolkitReference Guide)。2.1.78 --gnu此 选 项 启 用 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。 通 过 检 查 预 定 义 宏 __GNUC__和 __GNUC_MINOR__ 可 以 确 定 这 些 扩 展 所 兼 容 的 GCC 版 本 。另 请 参 阅• 第 2-22 页 的 --c90• 第 2-22 页 的 --c99• 第 2-30 页 的 --cpp• 第 2-115 页 的 --strict, --no_strict• 第 3-23 页 的 GNU 语 言 扩 展• 第 4-115 页 的 编 译 器 预 定 义2-66 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.79 --gnu_instrument, --no_gnu_instrument此 选 项 插 入 GCC 样 式 的 检 查 。另 请 参 阅• --gnu_instrument, --no_gnu_instrument2.1.80 --gnu_version=version此 选 项 尝 试 使 编 译 器 与 特 定 版 本 的 GCC 兼 容 。语 法--gnu_version=version其 中 version 是 十 进 制 数 , 表 示 尝 试 使 编 译 器 兼 容 的 GCC 版 本 。模 式此 选 项 在 使 用 GNU 兼 容 模 式 时 才 适 用 。用 法此 选 项 供 专 业 人 员 使 用 。 它 用 于 处 理 旧 代 码 。 您 通 常 无 需 使 用 此 选 项 。缺 省 设 置在 RVCT v4.0 中 , 缺 省 值 为 40200。 这 对 应 于 GCC 4.2.0 版 。示 例--gnu_version=30401 使 编 译 器 尽 量 与 GCC 3.4.1 兼 容 。另 请 参 阅• 第 2-66 页 的 --gnu<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-67ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.81 --guiding_decls, --no_guiding_decls此 选 项 为 C++ 中 的 模 板 函 数 启 用 或 禁 用 定 向 声 明 的 识 别 功 能 。定 向 声 明 是 一 种 函 数 声 明 , 它 与 函 数 模 板 实 例 相 匹 配 , 但 因 其 定 义 从 函 数 模 板派 生 而 没 有 显 式 定 义 。如 果 将 --no_guiding_decls 与 --old_specializations 结 合 使 用 , 则 无 法 识 别 非 成员 模 板 函 数 的 特 化 。 它 将 被 视 为 独 立 函 数 的 定 义 。注 意--guiding_decls 选 项 仅 作 为 不 符 合 C++ 标 准 的 旧 式 源 代 码 的 迁 移 辅 助 选 项 。 不建 议 使 用 此 选 项 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 选 项 为 --no_guiding_decls。示 例template void f(T){...}void f(int);如 果 被 视 为 定 向 声 明 , 则 f(int) 是 模 板 实 例 。 否 则 , 它 将 是 独 立 函 数 , 因 此 必须 为 其 提 供 定 义 。另 请 参 阅• 第 2-4 页 的 --apcs=qualifer...qualifier• 第 2-95 页 的 --old_specializations,--no_old_specializations2-68 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.82 --help此 选 项 汇 总 显 示 主 要 的 命 令 行 选 项 。如 果 未 指 定 任 何 选 项 或 源 文 件 , 则 它 是 缺 省 选 项 。另 请 参 阅• 第 2-112 页 的 --show_cmdline• 第 2-129 页 的 --vsn2.1.83 --hide_all, --no_hide_all此 选 项 用 于 控 制 生 成 SVr4 共 享 对 象 时 的 符 号 可 见 性 。用 法使 用 --no_hide_all 可 强 制 编 译 器 对 所 有 不 使 用 __declspec(dll*) 的 extern 变 量 和函 数 使 用 STV_DEFAULT 可 见 性 。 这 也 会 强 制 这 些 变 量 和 函 数 在 运 行 时 通 过 动态 装 入 程 序 成 为 可 预 占 的 。在 生 成 System V 或 <strong>ARM</strong> Linux 共 享 库 时 , 请 结 合 使 用 --no_hide_all 和 --apcs/fpic。缺 省 设 置缺 省 为 --hide_all。另 请 参 阅• 第 2-4 页 的 --apcs=qualifer...qualifier• 第 4-24 页 的 __declspec(dllexport)• 第 4-26 页 的 __declspec(dllimport)• 《 链 接 器 参 考 指 南 》 中 第 4-4 页 的 符 号 可 见 性• 《 链 接 器 参 考 指 南 》 中 第 2-57 页 的 --symver_script=file2.1.84 -Idir[,dir,...]此 选 项 将 指 定 的 目 录 或 以 逗 号 分 隔 的 目 录 列 表 添 加 到 用 于 查 找 所 包 含 文 件 的 搜索 位 置 列 表 。如 果 指 定 了 多 个 目 录 , 则 按 -I 选 项 指 定 它 们 的 相 同 顺 序 搜 索 这 些 目 录 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-69ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项语 法-Idir[,dir,...]其 中 :dir[,dir,...] 是 要 搜 索 所 包 含 文 件 的 以 逗 号 分 隔 的 目 录 列 表 。必 须 至 少 指 定 一 个 目 录 。指 定 多 个 目 录 时 , 不 能 在 列 表 中 的 逗 号 和 目 录 名 称 之 间 留 有空 格 。另 请 参 阅• 第 2-76 页 的 -Jdir[,dir,...]• 第 2-76 页 的 --kandr_include• 第 2-102 页 的 --preinclude=filename• 第 2-117 页 的 --sys_include• 《 编 译 器 用 户 指 南 》 中 第 2-15 页 的 头 文 件2.1.85 --ignore_missing_headers此 选 项 指 示 编 译 器 输 出 头 文 件 的 相 关 性 行 , 即 使 缺 少 头 文 件 也 是 如 此 。禁 止 对 缺 少 头 文 件 显 示 警 告 消 息 和 错 误 消 息 , 在 此 情 况 下 , 编 译 将 继 续 , 而 在其 他 情 况 下 将 失 败 。用 法此 选 项 用 于 自 动 更 新 makefile。 它 与 GCC -MG 命 令 行 选 项 类 似 。另 请 参 阅• 第 2-39 页 的 --depend=filename• 第 2-40 页 的 --depend_format=string• 第 2-41 页 的 --depend_system_headers,--no_depend_system_headers• 第 2-42 页 的 --depend_target=target• 第 2-86 页 的 -M• 第 2-87 页 的 --md• 第 2-101 页 的 --phony_targets2-70 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.86 --implicit_include, --no_implicit_include此 选 项 控 制 将 源 文 件 的 隐 式 包 含 用 作 查 找 要 在 C++ 中 实 例 化 的 模 板 实 体 定 义 的方 法 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 选 项 为 --implicit_include。另 请 参 阅• --implicit_include_searches,--no_implicit_include_searches• 第 5-15 页 的 隐 式 包 含2.1.87 --implicit_include_searches, --no_implicit_include_searches此 选 项 控 制 编 译 器 搜 索 C++ 模 板 中 隐 式 包 含 文 件 的 方 式 。如 果 选 择 --implicit_include_searches 选 项 , 则 编 译 器 将 根 据 filename.* 形 式 的部 分 名 称 使 用 搜 索 路 径 查 找 隐 式 包 含 文 件 。 搜 索 路 径 由 -I、-J 和 RVCT40INC 环 境变 量 确 定 。如 果 选 择 --no_implicit_include_searches 选 项 , 则 编 译 器 将 根 据 文 件 的 完 整 名 称( 包 括 路 径 名 ) 查 找 隐 式 包 含 文 件 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 选 项 为 --no_implicit_include_searches。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-71ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-69 页 的 -Idir[,dir,...]• 第 2-71 页 的 --implicit_include, --no_implicit_include• 第 2-76 页 的 -Jdir[,dir,...]• 第 5-15 页 的 隐 式 包 含• 《 编 译 器 用 户 指 南 》 中 第 2-16 页 的 搜 索 路 径 。2.1.88 --implicit_typename, --no_implicit_typename此 选 项 控 制 根 据 上 下 文 来 隐 式 确 定 C++ 中 的 模 板 参 数 从 属 名 称 是 类 型 还 是 非 类型 。注 意--implicit_typename 选 项 仅 作 为 不 符 合 C++ 标 准 的 旧 式 源 代 码 的 迁 移 辅 助 选 项 。不 建 议 使 用 此 选 项 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 为 --no_implicit_typename。注 意除 非 指 定 --no_parse_templates, 否 则 --implicit_typename 选 项 将 无 效 。另 请 参 阅• 第 2-38 页 的 --dep_name, --no_dep_name• 第 2-97 页 的 --parse_templates, --no_parse_templates• 第 5-14 页 的 模 板 实 例 化2-72 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.89 --info=totals此 选 项 指 示 编 译 器 为 每 个 对 象 文 件 提 供 对 象 代 码 和 数 据 大 小 的 总 和 。如 果 以 类 似 格 式 使 用 fromelf -z, 则 编 译 器 会 返 回 与 fromelf 相 同 的 总 和 。 当 源代 码 中 存 在 嵌 入 式 汇 编 代 码 时 , 这 些 总 和 将 包 括 嵌 入 式 汇 编 器 大 小 。示 例Code (inc. data) RO Data RW Data ZI Data Debug File Name3308 1556 0 44 10200 8402 dhry_1.oCode (inc. data) RO Data RW Data ZI Data Debug File Name416 28 0 0 0 7722 dhry_2.o(inc. data) 列 提 供 了 作 为 代 码 组 成 部 分 的 常 数 、 字 符 串 及 其 他 数 据 项 的 大 小 。此 示 例 中 所 示 的 Code 列 包 括 此 值 。另 请 参 阅• 第 2-80 页 的 --list• 《 链 接 器 参 考 指 南 》 中 第 2-25 页 的 --info=topic[,topic,...]• 《 编 译 器 用 户 指 南 》 中 第 5-9 页 的 代 码 度 量• 《 实 用 程 序 指 南 》 中 第 2-2 页 的 使 用 命 令 行 选 项 。2.1.90 --inline, --no_inline此 选 项 启 用 或 禁 用 函 数 的 内 联 。 禁 用 函 数 内 联 有 助 于 增 强 调 试 模 拟 效 果 。如 果 选 择 了 --inline 选 项 , 则 编 译 器 会 考 虑 为 每 个 函 数 进 行 内 联 。 用 --inline编 译 代 码 并 不 会 保 证 内 联 所 有 函 数 。 有 关 编 译 器 如 何 确 定 对 函 数 进 行 内 联 的 详细 信 息 , 请 参 阅 《 编 译 器 用 户 指 南 》 中 第 5-17 页 的 什 么 时 候 才 适 合 编 译 器 执 行内 联 ?。如 果 选 择 了 --no_inline 选 项 , 则 编 译 器 不 会 尝 试 内 联 用 __forceinline 限 定 的 函数 以 外 的 函 数 。缺 省 设 置缺 省 选 项 为 --inline。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-73ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-16 页 的 --autoinline, --no_autoinline• 第 2-58 页 的 --forceinline• 第 2-94 页 的 -Onum• 第 2-96 页 的 -Ospace• 第 2-96 页 的 -Otime• 第 4-6 页 的 __forceinline• 第 4-9 页 的 __inline• 《 编 译 器 用 户 指 南 》 中 第 2-26 页 的 使 用 链 接 器 反 馈• 《 编 译 器 用 户 指 南 》 中 第 5-16 页 的 函 数 内 联 。2.1.91 --interface_enums_are_32_bit此 选 项 有 助 于 在 外 部 代 码 接 口 间 提 供 兼 容 性 , 这 与 枚 举 类 型 的 大 小 有 关 。用 法无 法 将 使 用 --enum_is_int 编 译 的 对 象 文 件 与 另 一 个 不 使 用 --enum_is_int 编 译 的对 象 文 件 进 行 链 接 。 链 接 器 无 法 确 定 是 否 以 影 响 外 部 接 口 的 方 式 使 用 了 枚 举 类型 , 因 此 在 检 测 这 些 生 成 差 异 时 , 它 将 会 生 成 警 告 或 错 误 信 息 。 使 用--interface_enums_are_32_bit 进 行 编 译 可 避 免 此 情 况 。 这 样 , 可 将 结 果 对 象 文 件与 任 何 其 他 对 象 文 件 进 行 链 接 , 而 链 接 器 不 会 检 测 到 因 不 同 枚 举 类 型 大 小 引 起的 冲 突 。注 意如 果 使 用 此 选 项 , 即 表 示 您 向 编 译 器 保 证 外 部 接 口 中 使 用 的 所 有 枚 举 类 型 均 为32 位 宽 。 例 如 , 如 果 确 保 声 明 的 每 个 enum 都 包 含 至 少 一 个 大 于 2 到 16 的 幂 的值 , 则 不 论 是 否 使 用 --enum_is_int, 都 会 强 制 编 译 器 令 enum 为 32 位 宽 。 向 编 译器 提 供 的 保 证 是 否 真 实 完 全 取 决 于 您 。( 另 一 种 满 足 此 条 件 的 方 法 是 确 保 外 部接 口 中 没 有 enums。)另 请 参 阅• 第 2-52 页 的 --enum_is_int2-74 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.92 --interleave此 选 项 以 注 释 形 式 逐 行 交 叉 存 取 使 用 --asm 或 -S 选 项 所 生 成 的 汇 编 列 表 中 的 C或 C++ 源 代 码 。用 法--interleave 的 操 作 取 决 于 所 使 用 的 选 项 组 合 :表 2-4 用 ---interleave 选 项 进 行 编 译编 译 器 选 项--asm --interleave操 作将 汇 编 列 表 写 入 已 编 译 源 代 码 的 反 汇 编 文 件 中 , 从 而 使 源 代码 与 反 汇 编 代 码 交 叉 存 取 。此 外 , 还 会 执 行 链 接 步 骤 , 除 非 使 用 了 -c 选 项 。反 汇 编 代 码 将 写 入 一 个 文 本 文 件 中 , 其 缺 省 名 称 为 具 有 文 件扩 展 名 .txt 的 输 入 文 件 的 名 称-S --interleave 将 汇 编 列 表 写 入 已 编 译 源 代 码 的 反 汇 编 文 件 中 , 从 而 使 源 代码 与 反 汇 编 代 码 交 叉 存 取 。反 汇 编 代 码 将 写 入 一 个 文 本 文 件 中 , 其 缺 省 名 称 为 具 有 文 件扩 展 名 .txt 的 输 入 文 件 的 名 称限 制• 不 能 重 新 汇 编 用 --asm --interleave 或 -S --interleave 生 成 的 汇 编 列 表 。• 预 处 理 源 文 件 包 含 #line 指 令 。 在 使 用 --asm --interleave 或 -S --interleave编 译 预 处 理 文 件 时 , 编 译 器 将 搜 索 任 意 #line 指 令 所 指 示 的 原 始 文 件 , 并使 用 这 些 文 件 中 适 当 的 行 。 这 样 可 以 确 保 编 译 预 处 理 文 件 与 编 译 原 始 文 件的 输 出 和 行 为 完 全 相 同 。如 果 编 译 器 找 不 到 原 始 文 件 , 就 无 法 交 叉 存 取 源 。 因 此 , 如 果 用 #line 指令 预 处 理 了 源 文 件 , 但 未 经 预 处 理 的 源 文 件 不 存 在 , 则 必 须 先 删 除 所 有#line 指 令 , 然 后 再 用 --interleave 进 行 编 译 。另 请 参 阅• 第 2-15 页 的 --asm• 第 2-110 页 的 -S<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-75ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.93 -Jdir[,dir,...]此 选 项 将 指 定 的 目 录 或 以 逗 号 分 隔 的 目 录 列 表 添 加 到 系 统 包 含 列 表 中 。即 便 使 用 --diag_error, 也 会 禁 止 显 示 警 告 和 备 注 。RVCT40INC 环 境 变 量 将 设 置 为 缺 省 系 统 包 含 路 径 , 除 非 使 用 -J 覆 盖 了 该 变 量 。 在系 统 包 含 列 表 中 先 搜 索 带 尖 括 号 的 包 含 文 件 , 然 后 再 搜 索 用 -I 选 项 指 定 的 任 何包 含 列 表 。注 意在 Windows 系 统 上 , 如 果 在 命 令 行 中 指 定 了 RVCT40INC, 则 必 须 用 双 引 号 括 起 此环 境 变 量 , 这 是 因 为 该 变 量 所 定 义 的 缺 省 路 径 会 包 含 空 格 。 例 如 :armcc -J"%RVCT40INC%" -c main.c语 法-Jdir[,dir,...]其 中 :dir[,dir,...] 是 要 添 加 到 系 统 包 含 列 表 中 的 以 逗 号 分 隔 的 目 录 列 表 。必 须 至 少 指 定 一 个 目 录 。指 定 多 个 目 录 时 , 不 能 在 列 表 中 的 逗 号 和 目 录 名 称 之 间 留 有空 格 。另 请 参 阅• 第 2-69 页 的 -Idir[,dir,...]• --kandr_include• 第 2-102 页 的 --preinclude=filename• 第 2-117 页 的 --sys_include• 《 编 译 器 用 户 指 南 》 中 第 2-15 页 的 头 文 件2.1.94 --kandr_include此 选 项 确 保 使 用 Kernighan 和 Ritchie 搜 索 规 则 查 找 所 包 含 的 文 件 。当 前 位 置 由 初 始 源 文 件 定 义 并 且 不 进 入 堆 栈 。 如 果 未 使 用 此 选 项 , 则 将 使 用Berkeley 式 搜 索 。2-76 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-69 页 的 -Idir[,dir,...]• 第 2-76 页 的 -Jdir[,dir,...]• 第 2-102 页 的 --preinclude=filename• 第 2-117 页 的 --sys_include• 《 编 译 器 用 户 指 南 》 中 第 2-15 页 的 头 文 件• 《 编 译 器 用 户 指 南 》 中 第 2-15 页 的 当 前 位 置 。2.1.95 -Lopt此 选 项 指 定 在 编 译 后 执 行 链 接 步 骤 时 要 传 递 给 链 接 器 的 命 令 行 选 项 。 可 在 创 建部 分 链 接 的 对 象 或 可 执 行 映 像 时 传 递 命 令 行 选 项 。语 法-Lopt其 中 :opt 是 要 传 递 给 链 接 器 的 命 令 行 选 项 。限 制如 果 使 用 -L 向 链 接 器 传 递 了 不 受 支 持 的 链 接 器 选 项 , 则 会 生 成 错 误 。示 例armcc main.c -L--map另 请 参 阅• 第 2-2 页 的 -Aopt• 第 2-112 页 的 --show_cmdline2.1.96 --library_interface=lib此 选 项 启 用 与 所 选 库 类 型 兼 容 的 代 码 的 生 成 。语 法--library_interface=lib<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-77ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项其 中 , lib 是 下 列 值 之 一 :rvct 指 定 编 译 器 输 出 使 用 RVCT 运 行 时 库 。rvct_c90aeabi_clib90aeabi_clib99aeabi_clib其 行 为 与 --library_interface=rvct 类 似 。 区 别 在 于 编 译 器 不修 改 输 入 源 代 码 中 引 用 的 未 由 C90 保 留 的 函 数 名 。 否 则 , 某些 C99 math.h 函 数 名 可 能 以 __hardfp_ 为 前 缀 , 例 如__hardfp_tgamma。指 定 编 译 器 输 出 使 用 符 合 <strong>ARM</strong> 嵌 入 式 应 用 程 序 二 进 制 接 口(AEABI) 的 任 何 ISO C90 库 。指 定 编 译 器 输 出 使 用 符 合 <strong>ARM</strong> 嵌 入 式 应 用 程 序 二 进 制 接 口(AEABI) 的 任 何 ISO C99 库 。指 定 编 译 器 输 出 使 用 符 合 <strong>ARM</strong> 嵌 入 式 应 用 程 序 二 进 制 接 口(AEABI) 的 任 何 ISO C 库 。选 择 --library_interface=aeabi_clib 选 项 相 当 于 指 定--library_interface=aeabi_clib90 或--library_interface=aeabi_clib99, 具 体 取 决 于 所 使 用 的 源 语言 选 项 。源 语 言 的 选 项 将 因 所 选 的 命 令 行 选 项 以 及 所 使 用 的 文 件 名 后缀 而 异 。aeabi_glibc 指 定 编 译 器 输 出 使 用 符 合 AEABI 版 本 的 GNU C 库 。缺 省 设 置如 果 未 指 定 --library_interface, 编 译 器 将 采 用 --library_interface=rvct。用 法• 使 用 --library_interface=rvct 选 项 可 在 链 接 时 利 用 全 套 的 编 译 器 和 库 优化 。• 在 链 接 到 符 合 ABI 的 C 库 时 , 使 用 --library_interface=aeabi_* 形 式 的 选项 。 --library_interface=aeabi_* 形 式 的 选 项 可 确 保 编 译 器 不 会 生 成 对RVCT C 库 所 提 供 的 任 何 已 优 化 函 数 的 调 用 。2-78 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项示 例当 代 码 调 用 嵌 入 式 操 作 系 统 所 提 供 的 函 数 时 , 如 果 该 操 作 系 统 取 代 了 RVCT C库 所 提 供 的 函 数 , 则 将 用 --library_interface=aeabi_clib 编 译 代 码 , 以 禁 止 调 用由 该 操 作 系 统 替 换 的 库 函 数 的 任 何 特 殊 RVCT 变 体 。另 请 参 阅• 《 库 和 浮 点 支 持 指 南 》 中 第 1-3 页 的 <strong>ARM</strong> 体 系 结 构 ABI 遵 从 性 。2.1.97 --library_type=lib此 选 项 启 用 要 在 链 接 时 使 用 的 所 选 库 。注 意将 此 选 项 与 链 接 器 一 起 使 用 可 覆 盖 所 有 其 他 --library_type 选 项 。语 法--library_type=lib其 中 , lib 是 下 列 值 之 一 :standardlib 指 定 在 链 接 时 选 择 完 整 的 RVCT 运 行 时 库 。使 用 此 选 项 可 在 链 接 时 利 用 全 套 的 编 译 器 和 库 优 化 。microlib指 定 在 链 接 时 选 择 C 微 型 库 (microlib)。缺 省 设 置如 果 未 指 定 --library_type, 编 译 器 将 采 用 --library_type=standardlib。另 请 参 阅• 《 库 和 浮 点 支 持 指 南 》 中 第 3-4 页 的 使 用 microlib 构 建 应 用 程 序 。• 《 链 接 器 参 考 指 南 》 中 第 2-34 页 的 --library_type=lib。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-79ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.98 --licretry如 果 使 用 的 是 浮 动 许 可 证 , 此 选 项 会 在 调 用 armcc 时 最 多 尝 试 10 次 来 获 得 许 可证 。用 法典 型 的 生 成 过 程 ( 例 如 通 宵 生 成 ) 可 能 包 含 数 以 千 计 的 <strong>ARM</strong> 编 译 工 具 调 用 。每 次 工 具 调 用 都 需 要 在 客 户 端 ( 生 成 ) 计 算 机 与 许 可 证 服 务 器 之 间 进 行 网 络 通信 。 但 是 , 如 果 当 编 译 计 算 机 尝 试 从 许 可 证 服 务 器 获 得 许 可 证 时 发 生 临 时 性 网络 故 障 , 工 具 可 能 无 法 获 得 许 可 证 。 因 此 , 可 以 使 用 --licretry 来 尝 试 解 决 此类 问 题 。建 议 将 此 选 项 放 入 RVCT40_CCOPT 系 统 变 量 中 。 这 样 便 无 需 修 改 生 成 文 件 。注 意只 有 在 解 决 了 与 网 络 或 许 可 证 服 务 器 设 置 有 关 的 所 有 其 他 问 题 后 , 才 能 使 用 此选 项 。另 请 参 阅• 《 链 接 器 参 考 指 南 》 中 第 2-35 页 的 --licretry• 《 汇 编 器 指 南 》 中 第 3-2 页 的 命 令 语 法• 《 实 用 程 序 指 南 》 中 第 2-32 页 的 --licretry• 《<strong>RealView</strong> 编 译 工 具 要 点 指 南 》 中 第 1-6 页 的 RVCT 使 用 的 环 境 变 量• 《<strong>ARM</strong> 工 具 FLEXnet 许 可 证 管 理 指 南 》2.1.99 --list此 选 项 指 示 编 译 器 为 源 文 件 生 成 原 始 列 表 信 息 。 缺 省 情 况 下 , 原 始 列 表 文 件 的名 称 为 具 有 文 件 扩 展 名 .lst 的 输 入 文 件 的 名 称 。如 果 在 命 令 行 中 指 定 了 多 个 源 文 件 , 则 仅 为 指 定 的 前 几 个 文 件 生 成 原 始 列 表 信息 。2-80 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项用 法原 始 列 表 信 息 通 常 用 于 生 成 带 格 式 的 列 表 。 原 始 列 表 文 件 包 含 原 始 源 代 码 行 、包 含 文 件 转 入 转 出 信 息 以 及 由 编 译 器 生 成 的 诊 断 消 息 。 列 表 文 件 的 每 一 行 都 由以 下 标 识 行 类 型 的 关 键 字 母 开 头 :N 常 规 源 代 码 行 。 该 行 的 其 余 部 分 是 源 代 码 行 的 文 本 。X常 规 源 代 码 行 的 扩 展 格 式 。 该 行 的 余 下 部 分 是 文 本 。 该 行 出 现 在 N行 后 面 , 并 且 仅 当 该 行 包 含 非 细 微 修 改 时 才 出 现 。 注 释 被 视 为 细微 修 改 , 而 宏 扩 展 、 行 接 合 以 及 三 元 组 则 被 视 为 非 细 微 修 改 。 在扩 展 格 式 行 中 使 用 单 一 空 格 代 替 注 释 。S 通 过 #if 或 类 似 语 句 跳 过 的 源 代 码 行 。 该 行 的 余 下 部 分 是 文 本 。注 意用 N 标 记 出 结 束 跳 跃 的 #else、 #elseif 或 #endif。L指 示 源 位 置 中 的 变 更 。 即 该 行 的 格 式 类 似 于 标 识 预 处 理 程 序 的 指令 输 出 的 # 行 :L line-number "filename" key其 中 key 可 以 为 :1 用 于 进 入 包 含 文 件 。2 用 于 从 包 含 文 件 退 出 。否 则 , 将 省 略 key。 原 始 列 表 文 件 中 的 第 一 行 始 终 是 标 识 主 输 入 文件 的 L 行 。 L 行 也 是 #line 指 令 的 输 出 , 其 中 省 略 了 key。 L 行 指 示以 下 源 代 码 行 在 原 始 列 表 文 件 中 的 源 位 置 。R/W/E 表 示 诊 断 消 息 , 其 中 :R 表 示 备 注 。W 表 示 警 告 。E 表 示 错 误 。该 行 的 格 式 为 :type "filename" line-number column-number message-text其 中 type 可 以 为 R、 W 或 E。文 件 末 尾 处 的 错 误 指 示 主 源 文 件 的 最 后 一 行 和 0 列 号 。命 令 行 错 误 是 文 件 名 为 "" 的 错 误 。 行 号 或 列 号 不 作为 错 误 消 息 的 一 部 分 显 示 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-81ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项内 部 错 误 照 常 是 带 有 位 置 信 息 的 错 误 , 并 且 消 息 文 本 以 (Internalfault) 开 头 。当 诊 断 消 息 显 示 一 个 列 表 ( 例 如 , 重 载 调 用 不 明 确 时 的 所 有 竞 争例 程 ) 时 , 初 始 诊 断 行 将 后 跟 具 有 相 同 完 整 格 式 的 一 行 或 多 行 。但 代 码 字 母 是 初 始 行 中 代 码 字 母 的 小 写 版 本 。 这 些 行 中 的 源 位 置与 相 应 的 初 始 行 相 同 。示 例/* main.c */#include int main(void){return(true);}用 --list 选 项 编 译 此 代 码 会 生 成 原 始 列 表 文 件 :L 1 "main.c"N#include L 1 "...\include\...\stdbool.h" 1N/* stdbool.h */N...N #ifndef __cplusplus /* In C++, 'bool', 'true' and 'false' and keywords */N #define bool _BoolN #define true 1N #define false 0N #endif...L 2 "main.c" 2NNint main(void)N{N return(true);X return(1);N}另 请 参 阅• 第 2-15 页 的 --asm• 第 2-21 页 的 -c• 第 2-39 页 的 --depend=filename• 第 2-40 页 的 --depend_format=string• 第 2-72 页 的 --info=totals2-82 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项• 第 2-75 页 的 --interleave• 第 2-87 页 的 --md• 第 2-110 页 的 -S• 《 编 译 器 用 户 指 南 》 中 第 6-3 页 的 诊 断 消 息 的 严 重 性 。2.1.100 --list_macros此 选 项 用 于 在 处 理 指 定 源 文 件 后 通 过 stdout 列 出 宏 定 义 。 列 出 的 输 出 中 包 含 命令 行 上 使 用 、 编 译 器 预 定 义 以 及 在 头 文 件 和 源 文 件 中 找 到 的 宏 定 义 , 具 体 取 决于 用 法 。用 法要 列 出 命 令 行 上 已 定 义 、 编 译 器 预 定 义 以 及 在 头 文 件 和 源 文 件 中 找 到 的 宏 , 请将 --list_macros 与 非 空 源 文 件 一 起 使 用 。要 仅 列 出 由 编 译 器 预 定 义 和 在 命 令 行 上 指 定 的 宏 , 请 将 --list_macros 与 空 的 源文 件 一 起 使 用 。限 制禁 止 代 码 生 成 。另 请 参 阅• 第 4-115 页 的 编 译 器 预 定 义• 第 2-35 页 的 -Dname[(parm-list)][=def]• 第 2-51 页 的 -E• 第 2-112 页 的 --show_cmdline• 第 2-128 页 的 --via=filename2.1.101 --littleend此 选 项 指 示 编 译 器 使 用 小 端 内 存 为 <strong>ARM</strong> 处 理 器 生 成 代 码 。在 小 端 内 存 中 , 字 的 最 低 有 效 字 节 具 有 最 低 地 址 。缺 省 设 置除 非 显 式 指 定 --bigend, 否 则 编 译 器 将 采 用 --littleend。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-83ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-17 页 的 --bigend2.1.102 --locale=lang_country此 选 项 可 将 源 文 件 的 缺 省 语 言 环 境 切 换 为 在 lang_country 中 指 定 的 语 言 环 境 。语 法--locale=lang_country其 中 :lang_country 是 新 的 缺 省 语 言 环 境 。请 将 此 选 项 与 --multibyte_chars 结 合 使 用 。限 制语 言 环 境 名 称 可 能 区 分 大 小 写 , 具 体 因 主 机 平 台 而 异 。由 主 机 平 台 确 定 允 许 的 语 言 环 境 设 置 。确 保 安 装 了 对 主 机 平 台 的 适 当 语 言 环 境 支 持 。示 例例 如 , 若 要 在 基 于 英 语 的 Windows 工 作 站 上 编 译 日 语 源 文 件 , 请 使 用 :--multibyte_chars --locale=japanese若 要 在 基 于 英 语 的 UNIX 工 作 站 上 编 译 日 语 源 文 件 , 请 使 用 :--multibyte_chars --locale=ja_JP另 请 参 阅• 第 2-87 页 的 --message_locale=lang_country[.codepage]• 第 2-89 页 的 --multibyte_chars, --no_multibyte_chars2-84 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.103 --loose_implicit_cast此 选 项 使 非 法 隐 式 类 型 转 换 成 为 合 法 , 如 非 零 整 数 到 指 针 的 隐 式 类 型 转 换 。示 例int *p = 0x8000;如 果 在 编 译 此 示 例 时 未 使 用 --loose_implicit_cast 选 项 , 则 会 生 成 错 误 。如 果 用 --loose_implicit_cast 选 项 编 译 此 示 例 , 则 会 生 成 一 条 可 禁 止 显 示 的 警 告消 息 。2.1.104 --lower_ropi, --no_lower_ropi此 选 项 在 使 用 --apcs=/ropi 进 行 编 译 时 启 用 或 禁 用 限 制 较 少 的 C 代 码 。缺 省 设 置缺 省 为 --no_lower_ropi。注 意如 果 用 --lower_ropi 进 行 编 译 , 则 在 C 和 C++ 代 码 中 , 这 种 静 态 初 始 化 在 运 行时 由 C++ 构 造 函 数 机 制 完 成 。 这 使 得 这 些 静 态 初 始 化 可 使 用 ROPI 代 码 。另 请 参 阅• 第 2-4 页 的 --apcs=qualifer...qualifier• --lower_rwpi, --no_lower_rwpi• 《 编 译 器 用 户 指 南 》 中 第 2-24 页 的 位 置 无 关 限 定 符 。2.1.105 --lower_rwpi, --no_lower_rwpi此 选 项 在 使 用 --apcs=/rwpi 进 行 编 译 时 启 用 或 禁 用 限 制 较 少 的 C 和 C++ 代 码 。缺 省 设 置缺 省 为 --lower_rwpi。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-85ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项注 意如 果 用 --lower_rwpi 进 行 编 译 , 则 这 种 静 态 初 始 化 在 运 行 时 由 C++ 构 造 函 数 机制 完 成 , 即 使 在 C 代 码 中 也 是 如 此 。 这 使 得 这 些 静 态 初 始 化 可 以 使 用 RWPI 代码 。另 请 参 阅• 第 2-4 页 的 --apcs=qualifer...qualifier• 第 2-85 页 的 --lower_ropi, --no_lower_ropi• 《 编 译 器 用 户 指 南 》 中 第 2-24 页 的 位 置 无 关 限 定 符 。2.1.106 --ltcg此 选 项 指 示 编 译 器 以 中 间 格 式 创 建 对 象 , 以 便 执 行 链 接 时 代 码 生 成 优 化 。 应 用的 优 化 包 括 用 于 提 高 性 能 的 跨 模 块 内 联 , 以 及 用 于 减 少 代 码 大 小 的 基 址 共 享 。注 意此 选 项 可 能 会 显 著 增 加 链 接 时 间 和 内 存 请 求 。 对 于 大 型 应 用 程 序 , 建 议 在 对 象子 集 的 部 分 链 接 步 骤 中 生 成 代 码 。示 例下 面 的 示 例 演 示 如 何 使 用 --ltcg 选 项 。armcc -c --ltcg file1.carmcc -c --ltcg file2.carmlink --ltcg file1.o file2.o -o prog.axf另 请 参 阅• 第 2-90 页 的 --multifile, --no_multifile• 第 2-94 页 的 -Onum• 《 链 接 器 参 考 指 南 》 中 第 2-36 页 的 --ltcg2.1.107 -M此 选 项 指 示 编 译 器 生 成 适 合 make 实 用 程 序 使 用 的 makefile 相 关 性 行 列 表 。编 译 器 仅 执 行 编 译 的 预 处 理 程 序 步 骤 。 缺 省 情 况 下 , 输 出 位 于 标 准 输 出 流 上 。如 果 指 定 多 个 源 文 件 , 则 将 创 建 单 个 相 关 性 文 件 。2-86 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项如 果 指 定 -o filename 选 项 , 则 在 标 准 输 出 上 生 成 的 相 关 性 行 引 用 的 是 filename.o而 不 是 source.o。 不 过 , 使 用 -M -o filename 组 合 时 不 会 生 成 对 象 文 件 。使 用 --md 选 项 可 以 为 每 个 源 文 件 生 成 相 关 性 行 和 对 象 文 件 。示 例可 使 用 标 准 UNIX 和 MS-DOS 记 号 将 输 出 重 定 向 到 文 件 , 例 如 :armcc -M source.c > Makefile另 请 参 阅• 第 2-21 页 的 -C• 第 2-39 页 的 --depend=filename• 第 2-41 页 的 --depend_system_headers,--no_depend_system_headers• 第 2-51 页 的 -E• --md• 第 2-92 页 的 -o filename2.1.108 --md此 选 项 指 示 编 译 器 编 译 源 文 件 并 将 makefile 相 关 性 行 写 入 文 件 中 。输 出 文 件 适 合 由 make 实 用 程 序 使 用 。编 译 器 将 源 文 件 命 名 为 filename.d, 其 中 filename 是 源 文 件 的 名 称 。 如 果 指 定 多个 源 文 件 , 则 会 为 每 个 源 文 件 创 建 一 个 相 关 性 文 件 。另 请 参 阅• 第 2-39 页 的 --depend=filename• 第 2-40 页 的 --depend_format=string• 第 2-41 页 的 --depend_system_headers,--no_depend_system_headers• 第 2-86 页 的 -M• 第 2-92 页 的 -o filename<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-87ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.109 --message_locale=lang_country[.codepage]此 选 项 可 将 错 误 消 息 和 警 告 消 息 的 缺 省 显 示 语 言 切 换 为 在 lang_country 或lang_country.codepage 中 所 指 定 的 语 言 。语 法--message_locale=lang_country[.codepage]其 中 :lang_country[.codepage]是 错 误 消 息 和 警 告 消 息 的 缺 省 显 示 语 言 。允 许 的 语 言 与 主 机 平 台 无 关 。支 持 下 列 设 置 :• en_US• zh_CN• ko_KR• ja_JP。缺 省 设 置如 果 未 指 定 --message_locale, 编 译 器 将 采 用 --message_locale=en_US。限 制确 保 安 装 了 对 主 机 平 台 的 适 当 语 言 环 境 支 持 。语 言 环 境 名 称 可 能 区 分 大 小 写 , 具 体 因 主 机 平 台 而 异 。根 据 主 机 平 台 的 不 同 , 能 够 指 定 代 码 页 及 其 含 义 。错 误如 果 指 定 了 不 受 支 持 的 设 置 , 编 译 器 会 生 成 一 条 错 误 消 息 。示 例若 要 用 日 语 显 示 消 息 , 请 使 用 :--message_locale=ja_JP2-88 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-84 页 的 --locale=lang_country• 第 2-89 页 的 --multibyte_chars, --no_multibyte_chars2.1.110 --min_array_alignment=opt此 选 项 使 您 可 以 指 定 数 组 的 最 低 对 齐 要 求 。语 法--min_array_alignment=opt其 中 :opt 指 定 数 组 的 最 低 对 齐 要 求 。 opt 的 值 为 :1 字 节 对 齐 或 未 对 齐2 双 字 节 ( 半 字 ) 对 齐4 四 字 节 ( 字 ) 对 齐8 八 字 节 ( 双 字 ) 对 齐 。缺 省 设 置如 果 未 指 定 --min_array_alignment 选 项 , 编 译 器 将 采 用 --min_array_alignment=1。示 例使 用 --min_array_alignment=8 编 译 以 下 代 码 时 , 将 提 供 注 释 中 所 述 的 对 齐 方 式 :char arr_c1[1]; // alignment == 8char c1; // alignment == 1另 请 参 阅• 第 4-2 页 的 __align• 第 4-4 页 的 __ALIGNOF__2.1.111 --mm此 选 项 与 -M --no_depend_system_headers 的 作 用 相 同 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-89ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-41 页 的 --depend_system_headers,--no_depend_system_headers• 第 2-86 页 的 -M2.1.112 --multibyte_chars, --no_multibyte_chars此 选 项 启 用 或 禁 用 注 释 、 字 符 串 以 及 字 符 常 数 中 多 字 节 字 符 序 列 的 处 理 。缺 省 设 置缺 省 为 --no_multibyte_chars。用 法多 字 节 编 码 适 用 于 日 语 Shift-Japanese Industrial Standard (Shift-JIS) 之 类 的 字 符集 。另 请 参 阅• 第 2-84 页 的 --locale=lang_country• 第 2-87 页 的 --message_locale=lang_country[.codepage]2.1.113 --multifile, --no_multifile此 选 项 启 用 或 禁 用 多 文 件 编 译 。如 果 选 择 --multifile, 则 编 译 器 将 对 命 令 行 中 指 定 的 所 有 文 件 ( 而 不 是 单 个 文件 ) 执 行 优 化 。 会 将 指 定 的 文 件 编 译 成 一 个 对 象 文 件 。在 命 令 行 中 指 定 的 第 一 个 源 文 件 之 后 命 名 组 合 对 象 文 件 。 若 要 为 组 合 对 象 文 件指 定 其 他 名 称 , 请 使 用 -o filename 选 项 。为 满 足 标 准 make 系 统 的 要 求 , 将 为 命 令 行 中 指 定 的 每 个 后 续 源 文 件 创 建 一 个 空对 象 文 件 。注 意如 果 在 命 令 行 中 指 定 了 单 个 源 文 件 , 则 用 --multifile 进 行 编 译 将 无 效 。2-90 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项缺 省 设 置如 果 未 指 定 -O3, 则 缺 省 为 --no_multifile。如 果 指 定 了 -O3 选 项 , 则 缺 省 为 --multifile。用 法如 果 选 择 --multifile, 则 编 译 器 可 通 过 编 译 多 个 源 文 件 来 执 行 额 外 优 化 。虽 然 对 可 在 命 令 行 中 指 定 的 源 文 件 数 没 有 限 制 , 但 一 般 不 要 超 过 10 个 文 件 , 因为 --multifile 在 编 译 时 需 要 占 用 大 量 内 存 。 若 要 获 得 最 佳 优 化 效 果 , 请 选 择 在功 能 上 相 关 的 一 小 组 源 文 件 。示 例armcc -c --multifile test1.c ... testn.c -o test.o所 生 成 的 对 象 文 件 将 被 命 名 为 test.o 而 不 是 test1.c, 并 将 为 命 令 行 中 指 定 的 每个 源 文 件 test1.c ... testn.c 创 建 对 应 的 空 对 象 文 件 test2.o 到 testn.o。另 请 参 阅• 第 2-21 页 的 -c• 第 2-37 页 的 --default_extension=ext• 第 2-86 页 的 --ltcg• 第 2-92 页 的 -o filename• 第 2-94 页 的 -Onum• 第 2-132 页 的 --whole_program2.1.114 --multiply_latency=cycles此 选 项 将 向 编 译 器 提 示 硬 件 乘 法 器 所 使 用 的 周 期 数 。语 法--multiply_latency=cycles其 中 , cycles 是 使 用 的 周 期 数 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-91ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项用 法使 用 此 选 项 可 向 编 译 器 通 知 MUL 指 令 使 用 乘 法 器 块 和 芯 片 的 相 关 部 件 的 周 期数 。 在 该 指 令 完 成 之 前 , 芯 片 的 这 些 部 件 将 无 法 用 于 其 他 指 令 , 要 使 用 的 任 何后 续 指 令 也 无 法 使 用 MUL 的 结 果 。处 理 器 可 能 具 有 两 个 或 更 多 个 为 给 定 硬 件 实 现 而 设 置 的 乘 法 器 选 项 。 例 如 , 可能 将 一 个 实 现 配 置 为 需 要 一 个 周 期 来 执 行 。 另 一 实 现 可 能 需 要 33 个 周 期 来 执行 。 此 选 项 用 于 为 给 定 处 理 器 传 达 正 确 的 周 期 数 。示 例--multiply_latency=33另 请 参 阅• 《Cortex -M1 技 术 参 考 手 册 》。2.1.115 --nonstd_qualifier_deduction, --no_nonstd_qualifier_deduction此 选 项 控 制 是 否 要 在 C++ 中 限 定 名 的 限 定 符 部 分 内 执 行 非 标 准 模 板 自 变 量 推算 。如 果 启 用 此 功 能 , 则 可 在 类 似 A::B 或 T::B 的 上 下 文 中 推 算 模 板 参 数 T 的 模 板自 变 量 。 标 准 推 算 机 制 将 它 们 视 为 以 下 非 推 算 上 下 文 : 所 用 值 属 于 显 式 指 定 模板 参 数 或 在 别 处 推 算 的 模 板 参 数 。注 意--nonstd_qualifier_deduction 仅 作 为 不 符 合 C++ 标 准 的 旧 式 源 代 码 的 迁 移 辅 助 选项 。 不 建 议 使 用 此 选 项 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 为 --no_nonstd_qualifier_deduction。2.1.116 -o filename此 选 项 指 定 输 出 文 件 的 名 称 。 所 生 成 的 输 出 文 件 的 完 整 名 称 因 所 使 用 的 组 合 选项 而 异 , 具 体 说 明 详 见 第 2-92 页 的 表 2-5 和 第 2-93 页 的 表 2-6。2-92 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项语 法如 果 指 定 了 -o 选 项 , 则 编 译 器 将 根 据 表 2-5 的 约 定 命 名 输 出 文 件 。表 2-5 用 -o 选 项 进 行 编 译编 译 器 选 项 操 作 使 用 说 明-o- 将 输 出 写 入 标 准 输 出 流 filename 是 -。 除 非指 定 了 -E, 否 则 将采 用 -S。-o filename 生 成 名 为 filename 的 可 执 行 映 像-c -o filename 生 成 名 为 filename 的 对 象 文 件-S -o filename 生 成 名 为 filename 的 汇 编 语 言 文 件-E -o filename 生 成 包 含 预 处 理 程 序 输 出 的 名 为filename 的 文 件如 果 未 指 定 -o 选 项 , 则 编 译 器 将 根 据 表 2-6 的 约 定 命 名 输 出 文 件 。表 2-6 编 译 时 未 使 用 -o 选 项编 译 器 选 项 操 作 使 用 说 明-c 生 成 一 个 对 象 名 称 , 其 缺 省 名 称 是 具 有文 件 扩 展 名 .o 的 输 入 文 件 名 称 。-S 生 成 一 个 输 出 文 件 , 其 缺 省 名 称 是 具 有文 件 扩 展 名 .s 的 输 入 文 件 名 称 。-E 将 预 处 理 程 序 的 输 出 写 入 标 准 输 出 流( 无 选 项 ) 生 成 缺 省 名 称 为 __image.axf 的 可 执 行映 像-o、 -c、 -E 和 -S 都不 在 命 令 行 中 指 定注 意此 选 项 将 覆 盖 --default_extension 选 项 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-93ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-15 页 的 --asm• 第 2-21 页 的 -c• 第 2-37 页 的 --default_extension=ext• 第 2-39 页 的 --depend=filename• 第 2-40 页 的 --depend_format=string• 第 2-51 页 的 -E• 第 2-75 页 的 --interleave• 第 2-80 页 的 --list• 第 2-87 页 的 --md• 第 2-110 页 的 -S2.1.117 -Onum此 选 项 指 定 要 在 编 译 源 文 件 时 使 用 的 优 化 级 别 。语 法-Onum其 中 num 是 下 列 值 之 一 :0 最 低 优 化 。 关 闭 大 多 数 优 化 。 它 提 供 可 能 的 最 佳 调 试 视 图 和 最 低优 化 级 别 。1 受 限 优 化 。 删 除 未 使 用 的 内 联 函 数 和 未 使 用 的 静 态 函 数 关 闭 严 重影 响 调 试 视 图 的 优 化 。 如 果 与 --debug 一 起 使 用 , 则 此 选 项 将 提 供具 有 良 好 代 码 密 度 且 令 人 满 意 的 调 试 视 图 。2 高 度 优 化 。 如 果 与 --debug 一 起 使 用 , 则 调 试 视 图 可 能 不 会 令 人 满意 , 因 为 对 象 代 码 到 源 代 码 的 映 射 有 时 会 不 清 晰 。这 是 缺 省 设 置 。3 最 大 优 化 。-O3 执 行 与 -O2 相 同 的 优 化 , 但 与 -O2 相 比 , 前 者 生 成 的代 码 中 空 间 与 时 间 优 化 之 间 的 平 衡 更 侧 重 于 空 间 或 时 间 。 也 就 是说 :• -O3 -Otime 旨 在 比 -O2 -Otime 更 快 速 地 生 成 代 码 , 但 这 是 以 增加 映 像 大 小 作 为 代 价 的• -O3 -Ospace 旨 在 比 -O2 -Ospace 生 成 更 少 的 代 码 , 但 可 能 会 降低 性 能 。2-94 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项此 外 ,-O3 还 会 执 行 更 积 极 的 额 外 优 化 , 如 :• 高 级 标 量 优 化 , 其 中 包 括 -O3 -Otime 的 循 环 展 开 。 这 以 很 小 的代 码 大 小 开 销 就 会 获 得 显 著 的 性 能 , 但 编 译 时 间 会 较 长 。• -O3 -Otime 的 更 积 极 的 内 联 和 自 动 内 联 。• 缺 省 情 况 下 的 多 文 件 编 译 。注 意如 果 使 用 --fpmode 选 项 选 择 适 当 的 数 值 模 型 , 则 可 能 会 影 响 浮 点 代 码 的 性 能 。注 意不 要 依 赖 这 些 优 化 的 实 现 细 节 , 因 为 在 将 来 的 版 本 中 它 们 可 能 会 发 生 变 化 。缺 省 设 置如 果 未 指 定 -Onum, 则 编 译 器 将 采 用 -O2。另 请 参 阅• 第 2-16 页 的 --autoinline, --no_autoinline• 第 2-36 页 的 --debug, --no_debug• 第 2-58 页 的 --forceinline• 第 2-59 页 的 --fpmode=model• 第 2-73 页 的 --inline, --no_inline• 第 2-86 页 的 --ltcg• 第 2-90 页 的 --multifile, --no_multifile• 第 2-96 页 的 -Ospace• 第 2-96 页 的 -Otime• 《 编 译 器 用 户 指 南 》 中 第 5-2 页 的 优 化 代 码<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-95ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.118 --old_specializations, --no_old_specializations此 选 项 控 制 是 否 接 受 C++ 中 的 旧 式 模 板 特 化 。旧 式 模 板 特 化 不 使 用 template 语 法 。注 意--old_specializations 选 项 仅 作 为 不 符 合 C++ 标 准 的 旧 式 源 代 码 的 迁 移 辅 助 选项 。 不 建 议 使 用 此 选 项 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 为 --no_old_specializations。2.1.119 -Ospace此 选 项 指 示 编 译 器 执 行 减 小 映 像 大 小 的 优 化 , 这 是 以 可 能 延 长 执 行 时 间 为 代 价的 。如 果 代 码 大 小 比 性 能 更 重 要 , 请 使 用 此 选 项 。 例 如 , 如 果 选 择 -Ospace 选 项 , 则将 由 外 联 函 数 调 用 而 非 内 联 代 码 执 行 大 型 结 构 副 本 。如 果 需 要 , 则 可 以 使 用 -Otime 编 译 对 时 间 要 求 严 格 的 代 码 部 分 , 而 使 用 -Ospace编 译 其 余 部 分 。缺 省 设 置如 果 未 指 定 -Ospace 或 -Otime, 编 译 器 将 采 用 -Ospace。另 请 参 阅• 第 2-96 页 的 -Otime• 第 2-94 页 的 -Onum• 第 4-64 页 的 #pragma Onum• 第 4-65 页 的 #pragma Ospace• 第 4-65 页 的 #pragma Otime2-96 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.120 -Otime此 选 项 指 示 编 译 器 执 行 减 少 执 行 时 间 的 优 化 , 这 是 以 可 能 增 加 映 像 大 小 为 代 价的 。如 果 执 行 时 间 比 代 码 大 小 更 重 要 , 请 使 用 此 选 项 。 如 果 需 要 , 则 可 以 使 用-Otime 编 译 对 时 间 要 求 严 格 的 代 码 部 分 , 而 使 用 -Ospace 编 译 其 余 部 分 。缺 省 设 置如 果 未 指 定 -Otime, 编 译 器 将 采 用 -Ospace。示 例如 果 选 择 -Otime 选 项 , 则 编 译 器 会 将 以 下 代 码 :while (expression) body;编 译 为 :if (expression){do body;while (expression);}另 请 参 阅• 第 2-90 页 的 --multifile, --no_multifile• 第 2-94 页 的 -Onum• 第 2-96 页 的 -Ospace• 第 4-64 页 的 #pragma Onum• 第 4-65 页 的 #pragma Ospace• 第 4-65 页 的 #pragma Otime<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-97ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.121 --parse_templates, --no_parse_templates此 选 项 启 用 或 禁 用 C++ 中 通 用 格 式 ( 即 在 定 义 模 板 时 和 对 其 进 行 实 例 化 之 前 )的 非 类 模 板 的 分 析 。注 意. --no_parse_templates 选 项 仅 作 为 不 符 合 C++ 标 准 的 旧 式 源 代 码 的 迁 移 辅 助 选项 。 不 建 议 使 用 此 选 项 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 为 --parse_templates。注 意--no_parse_templates 不 能 与 --dep_name 一 起 使 用 , 因 为 如 果 启 用 从 属 名 称 处 理 ,则 缺 省 情 况 下 将 执 行 分 析 。 如 果 一 起 使 用 这 两 个 选 项 , 则 会 生 成 错 误 。另 请 参 阅• 第 2-38 页 的 --dep_name, --no_dep_name• 第 5-14 页 的 模 板 实 例 化2.1.122 --pch此 选 项 指 示 编 译 器 在 PCH 文 件 存 在 的 情 况 下 使 用 该 文 件 , 在 该 文 件 不 存 在 的 情况 下 创 建 一 个 这 样 的 文 件 。如 果 指 定 --pch 选 项 , 则 编 译 器 将 搜 索 名 为 filename.pch 的 PCH 文 件 , 其 中filename.* 是 主 源 文 件 的 名 称 。 如 果 PCH 文 件 filename.pch 存 在 , 则 编 译 器 将 使用 该 文 件 ; 否 则 , 将 在 主 源 文 件 所 在 的 同 一 目 录 中 创 建 名 为 filename.pch 的PCH 文 件 。限 制如 果 在 同 一 命 令 行 中 包 含 --use_pch=filename 选 项 或 --create_pch=filename 选 项 ,则 此 选 项 将 无 效 。2-98 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-34 页 的 --create_pch=filename• --pch_dir=dir• 第 2-99 页 的 --pch_messages, --no_pch_messages• 第 2-99 页 的 --pch_verbose, --no_pch_verbose• 第 2-125 页 的 --use_pch=filename• 第 4-62 页 的 #pragma hdrstop• 第 4-63 页 的 #pragma no_pch• 《 编 译 器 用 户 指 南 》 中 第 2-18 页 的 预 编 译 的 头 文 件 。2.1.123 --pch_dir=dir此 选 项 用 于 指 定 PCH 文 件 的 存 储 目 录 。 每 次 创 建 或 访 问 PCH 文 件 时 , 都 可 以访 问 此 目 录 。可 在 自 动 或 手 动 PCH 模 式 下 使 用 此 选 项 。语 法--pch_dir=dir其 中 :dir 是 PCH 文 件 的 存 储 目 录 的 名 称 。错 误如 果 指 定 的 目 录 dir 不 存 在 , 则 编 译 器 会 生 成 错 误 。另 请 参 阅• 第 2-34 页 的 --create_pch=filename• 第 2-98 页 的 --pch• 第 2-99 页 的 --pch_messages, --no_pch_messages• 第 2-99 页 的 --pch_verbose, --no_pch_verbose• 第 2-125 页 的 --use_pch=filename• 第 4-62 页 的 #pragma hdrstop• 第 4-63 页 的 #pragma no_pch• 《 编 译 器 用 户 指 南 》 中 第 2-18 页 的 预 编 译 的 头 文 件 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-99ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.124 --pch_messages, --no_pch_messages此 选 项 允 许 或 禁 止 显 示 特 定 消 息 , 此 类 消 息 指 出 在 当 前 编 译 中 使 用 了 PCH 文 件 。缺 省 设 置缺 省 为 --pch_messages。另 请 参 阅• 第 2-34 页 的 --create_pch=filename• 第 2-98 页 的 --pch• 第 2-98 页 的 --pch_dir=dir• --pch_verbose, --no_pch_verbose• 第 2-125 页 的 --use_pch=filename• 第 4-62 页 的 #pragma hdrstop• 第 4-63 页 的 #pragma no_pch• 《 编 译 器 用 户 指 南 》 中 第 2-18 页 的 预 编 译 的 头 文 件 。2.1.125 --pch_verbose, --no_pch_verbose此 选 项 允 许 或 禁 止 显 示 特 定 消 息 , 此 类 消 息 指 明 不 能 预 编 译 文 件 的 原 因 。在 自 动 PCH 模 式 中 , 此 选 项 可 确 保 对 于 每 个 不 能 用 于 当 前 编 译 的 PCH 文 件 ,都 显 示 一 条 消 息 来 指 明 不 能 使 用 该 文 件 的 原 因 。缺 省 设 置缺 省 为 --no_pch_verbose。另 请 参 阅• 第 2-34 页 的 --create_pch=filename• 第 2-98 页 的 --pch• 第 2-98 页 的 --pch_dir=dir• --pch_messages, --no_pch_messages• 第 2-125 页 的 --use_pch=filename• 第 4-62 页 的 #pragma hdrstop• 第 4-63 页 的 #pragma no_pch• 《 编 译 器 用 户 指 南 》 中 第 2-18 页 的 预 编 译 的 头 文 件 。2-100 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.126 --pending_instantiations=n此 选 项 指 定 C++ 中 模 板 的 最 大 并 发 实 例 化 数 。语 法--pending_instantiations=n其 中 :n 是 允 许 的 最 大 并 发 实 例 化 数 。如 果 n 为 零 , 则 没 有 限 制 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置如 果 未 指 定 --pending_instantations 选 项 , 编 译 器 将 采 用--pending_instantiations=64。用 法使 用 此 选 项 可 检 测 失 控 递 归 实 例 化 。2.1.127 --phony_targets此 选 项 指 示 编 译 器 生 成 虚 拟 makefile 规 则 。 如 果 删 除 头 文 件 而 未 对 makefile 进行 相 应 更 新 , 则 这 些 规 则 可 清 除 make 错 误 。此 选 项 与 GCC 命 令 行 选 项 -MP 类 似 。示 例示 例 输 出 :source.o: source.csource.o: header.hheader.h:<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-101ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-39 页 的 --depend=filename• 第 2-40 页 的 --depend_format=string• 第 2-41 页 的 --depend_system_headers,--no_depend_system_headers• 第 2-42 页 的 --depend_target=target• 第 2-70 页 的 --ignore_missing_headers• 第 2-86 页 的 -M• 第 2-87 页 的 --md2.1.128 --pointer_alignment=num此 选 项 指 定 应 用 程 序 所 需 的 未 对 齐 指 针 支 持 。语 法--pointer_alignment=num其 中 num 是 下 列 值 之 一 :1 将 经 由 指 针 的 访 问 视 为 具 有 对 齐 方 式 1, 即 字 节 对 齐 或 未 对 齐 。2 将 经 由 指 针 的 访 问 视 为 具 有 不 超 过 2 的 对 齐 方 式 , 即 最 多 半 字 对齐 。4 将 经 由 指 针 的 访 问 视 为 有 不 超 过 4 的 对 齐 方 式 , 即 最 多 字 对 齐 。8 经 由 指 针 的 访 问 具 有 常 规 对 齐 , 即 最 多 双 字 对 齐 。用 法此 选 项 可 在 不 需 要 对 齐 的 情 况 下 , 帮 助 移 植 为 体 系 结 构 编 写 的 源 代 码 。 使 用__packed 限 定 符 可 更 精 细 地 控 制 对 未 对 齐 数 据 的 访 问 , 并 且 对 所 生 成 代 码 的 质量 影 响 较 小 。限 制即 使 在 支 持 未 对 齐 访 问 的 CPU 上 , 不 对 齐 指 针 也 可 能 增 加 代 码 大 小 。 这 是 因 为只 有 加 载 和 存 储 指 令 的 子 集 才 会 从 未 对 齐 访 问 支 持 中 受 益 。 编 译 器 不 能 直 接 对未 对 齐 内 存 对 象 使 用 多 字 传 送 或 协 处 理 器 内 存 传 送 , 包 括 硬 件 浮 点 加 载 和 存储 。2-102 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项注 意• 当 对 不 具 备 未 对 齐 访 问 的 硬 件 支 持 的 CPU ( 如 v6 以 前 版 本 的 体 系 结 构 )进 行 编 译 时 , 代 码 大 小 可 能 会 显 著 增 加 。• 此 选 项 既 不 影 响 对 象 在 内 存 中 的 放 置 , 也 不 影 响 结 构 的 布 局 与 填 充 。另 请 参 阅• 第 4-11 页 的 __packed• 第 4-65 页 的 #pragma pack(n)• 《 编 译 器 用 户 指 南 》 中 第 5-23 页 的 对 齐 数 据 。2.1.129 --preinclude=filename此 选 项 指 示 编 译 器 在 编 译 开 头 包 括 指 定 文 件 的 源 代 码 。语 法--preinclude=filename其 中 :filename 是 要 包 含 其 源 代 码 的 文 件 的 名 称 。用 法此 选 项 可 用 于 建 立 标 准 宏 定 义 。 在 包 含 搜 索 列 表 上 的 目 录 中 搜 索 filename。可 以 在 命 令 行 上 重 复 指 定 此 选 项 。 此 结 果 按 照 指 定 的 顺 序 预 先 包 括 在 文 件 中 。示 例armcc --preinclude file1.h --preinclude file2.h -c source.c另 请 参 阅• 第 2-69 页 的 -Idir[,dir,...]• 第 2-76 页 的 -Jdir[,dir,...]• 第 2-76 页 的 --kandr_include• 第 2-117 页 的 --sys_include• 《 编 译 器 用 户 指 南 》 中 第 2-15 页 的 头 文 件<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-103ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.130 --preprocessed此 选 项 强 制 预 处 理 程 序 像 处 理 已 被 替 换 的 宏 那 样 处 理 文 件 扩 展 名 为 .i 的 文 件 。用 法此 选 项 为 您 提 供 了 使 用 不 同 预 处 理 程 序 的 机 会 。 生 成 经 过 预 处 理 的 代 码 , 然 后将 这 些 代 码 以 filename.i 的 形 式 提 供 给 编 译 器 , 同 时 使 用 --preprocessed 通 知 编译 器 该 文 件 已 被 预 处 理 。限 制此 选 项 仅 适 用 于 宏 。 三 元 组 、 行 连 接 、 注 释 和 所 有 其 他 预 处 理 程 序 项 目 都 由 预处 理 程 序 按 正 常 方 式 进 行 预 处 理 。如 果 您 使 用 --compile_all_input, .i 文 件 将 被 视 为 .c 文 件 。 预 处 理 程 序 就 当 事先 未 进 行 任 何 预 处 理 一 样 工 作 。示 例armcc --preprocessed foo.i -c -o foo.o另 请 参 阅• 第 2-23 页 的 --compile_all_input, --no_compile_all_input• 第 2-51 页 的 -E2.1.131 --profile=filename此 选 项 指 示 编 译 器 使 用 <strong>ARM</strong> Profiler 的 反 馈 , 以 生 成 更 小 且 性 能 更 高 的 代 码 。语 法--profile=filename其 中 :filename 是 <strong>ARM</strong> Profiler 分 析 文 件 的 名 称 。示 例本 示 例 使 用 生 成 hello.c 的 代 码 时 在 hello_001.apa 中 提 供 的 <strong>ARM</strong> Profiler 反 馈 。armcc -c -O3 -Otime --profile=hello_001.apa hello.c2-104 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项另 请 参 阅• 《<strong>ARM</strong> Profiler 用 户 指 南 》。2.1.132 --project=filename, --no_project=filename--project=filename 选 项 指 示 编 译 器 加 载 filename 所 指 定 的 项 目 模 板 文 件 。注 意若 要 使 用 filename 作 为 缺 省 项 目 文 件 , 请 将 RVDS_PROJECT 环 境 变 量 设 置 为filename。--no_project 选 项 禁 止 使 用 环 境 变 量 RVDS_PROJECT 所 指 定 的 缺 省 项 目 模 板 文 件 。语 法--project=filename--no_project其 中 :filename 是 项 目 模 板 文 件 的 名 称 。限 制仅 当 项 目 模 板 文 件 中 的 选 项 与 命 令 行 中 已 设 置 的 选 项 不 发 生 冲 突 时 , 才 会 设 置前 者 。 如 果 项 目 模 板 文 件 中 的 选 项 与 现 有 命 令 行 选 项 发 生 冲 突 , 则 后 者 优 先 。示 例请 考 虑 以 下 项 目 模 板 文 件 :--cpu=<strong>ARM</strong>926EJ-S--fpu=vfpv2当 将 RVDS_PROJECT 环 境 变 量 设 置 为 指 向 此 文 件 时 , 以 下 命 令 :armcc -c foo.c<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-105ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项将 生 成 以 下 实 际 命 令 行 :armcc --cpu=<strong>ARM</strong>926EJ-S --fpu=VFPv2 -c foo.c另 请 参 阅• 第 2-107 页 的 --reinitialize_workdir• 第 2-132 页 的 --workdir=directory2.1.133 --reassociate-saturation此 选 项 通 过 允 许 重 新 关 联 饱 和 算 法 , 在 向 量 化 使 用 饱 和 相 加 的 循 环 时 启 用 更 积极 的 优 化 。限 制饱 和 相 加 不 具 关 联 性 , 因 此 启 用 重 新 关 联 将 会 导 致 准 确 度 降 低 。示 例除 非 指 定 了 --reassociate-saturation, 否 则 , 下 列 代 码 将 不 执 行 向 量 化 。#include int f(short *a, short *b){int i;int r = 0;for (i = 0; i < 100; i++)r=L_mac(r,a[i],b[i]);return r;}2.1.134 --reduce_paths, --no_reduce_paths此 选 项 允 许 或 禁 止 删 除 文 件 路 径 中 的 冗 余 路 径 名 信 息 。如 果 允 许 删 除 冗 余 路 径 名 信 息 , 则 编 译 器 会 从 传 递 给 操 作 系 统 的 目 录 中 删 除xyz\.. 格 式 的 序 列 。 这 包 括 编 译 器 在 执 行 #include 搜 索 等 操 作 时 自 身 构 建 的 系统 路 径 。注 意如 果 xyz 为 链 接 , 则 xyz\.. 格 式 序 列 的 删 除 可 能 无 效 。2-106 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项模 式此 选 项 仅 在 Windows 系 统 中 有 效 。用 法Windows 系 统 对 文 件 路 径 有 260 个 字 符 的 限 制 。 如 果 存 在 其 绝 对 路 径 名 长 度 超过 260 个 字 符 的 路 径 名 , 则 可 以 使 用 --reduce_paths 选 项 , 该 选 项 通 过 将 目 录 与对 应 的 .. 实 例 相 匹 配 并 成 对 删 除 directory/.. 序 列 , 可 以 缩 短 绝 对 路 径 名 的 长度 。注 意建 议 优 先 使 用 --reduce_paths 选 项 来 尽 量 缩 短 路 径 长 度 , 并 避 免 使 用 长 文 件 路 径和 深 层 嵌 套 文 件 路 径 。缺 省 设 置缺 省 为 --no_reduce_paths。示 例编 译 以 下 文 件..\..\..\xyzzy\xyzzy\objects\file.c该 文 件 位 于 以 下 目 录 中\foo\bar\baz\gazonk\quux\bop这 会 生 成 以 下 实 际 的 路 径\foo\bar\baz\gazonk\quux\bop\..\..\..\xyzzy\xyzzy\objects\file.o如 果 使 用 option --reduce_paths 选 项 从 同 一 目 录 中 编 译 同 一 文 件 , 则 会 生 成 以 下一 个 实 际 的 路 径\foo\bar\baz\xyzzy\xyzzy\objects\file.c2.1.135 --reinitialize_workdir此 选 项 使 您 可 以 使 用 --workdir 重 新 初 始 化 项 目 模 板 工 作 目 录 。当 使 用 --workdir 设 置 的 目 录 引 用 包 含 已 修 改 项 目 模 板 文 件 的 现 有 工 作 目 录 时 ,指 定 此 选 项 时 会 导 致 删 除 该 工 作 目 录 并 用 原 始 项 目 模 板 文 件 的 新 副 本 重 新 创 建该 目 录 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-107ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项限 制此 选 项 必 须 与 --workdir 选 项 结 合 使 用 。另 请 参 阅• 第 2-104 页 的 --project=filename, --no_project=filename• 第 2-132 页 的 --workdir=directory2.1.136 --relaxed_ref_def, --no_relaxed_ref_def此 选 项 允 许 多 个 对 象 文 件 使 用 全 局 变 量 的 试 验 定 义 。 某 些 传 统 程 序 是 用 此 声 明样 式 编 写 的 。用 法此 选 项 主 要 是 为 了 实 现 与 GNU C, 不 建 议 用 于 新 应 用 程 序 代 码 。缺 省 设 置缺 省 为 严 格 引 用 和 定 义 。( 每 个 全 局 变 量 只 能 在 一 个 对 象 文 件 中 声 明 。) 但 是 ,如 果 在 命 令 行 中 指 定 <strong>ARM</strong> Linux 配 置 文 件 并 使 用 --translate_gcc, 则 缺 省 为--relaxed_ref_def。限 制此 选 项 在 C++ 中 无 效 。另 请 参 阅• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-120 页 的 --translate_gcc• 《 国 际 标 准 原 理 - 编 程 语 言 - C》 (Rationale for International Standard -Programming Languages - C)。2.1.137 --remarks此 选 项 指 示 编 译 器 发 出 备 注 消 息 , 如 结 构 中 的 填 充 警 告 。注 意缺 省 情 况 下 , 编 译 器 不 发 出 备 注 。2-108 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-19 页 的 --brief_diagnostics, --no_brief_diagnostics• 第 2-44 页 的 --diag_error=tag[,tag,...]• 第 2-45 页 的 --diag_remark=tag[,tag,... ]• 第 2-45 页 的 --diag_style={arm|ide|gnu}• 第 2-46 页 的 --diag_suppress=tag[,tag,...]• 第 2-48 页 的 --diag_warning=tag[,tag,...]• 第 2-52 页 的 --errors=filename• 第 2-129 页 的 -W• 第 2-133 页 的 --wrap_diagnostics, --no_wrap_diagnostics2.1.138 --restrict, --no_restrict此 选 项 允 许 或 禁 止 使 用 C99 关 键 字 restrict。注 意支 持 将 备 选 关 键 字 __restrict 和 __restrict__ 作 为 restrict 的 同 义 词 。 无 论 是 否使 用 --restrict 选 项 , 这 些 备 选 关 键 字 都 始 终 可 用 。缺 省 设 置当 编 译 ISO C99 源 代 码 时 , 缺 省 选 项 将 允 许 使 用 C99 关 键 字 restrict。当 编 译 ISO C90 或 ISO C++ 源 代 码 时 , 缺 省 情 况 下 , 将 禁 止 使 用 C99 关 键 字restrict。另 请 参 阅• 第 3-7 页 的 restrict2.1.139 --retain=option使 用 此 选 项 可 以 限 制 编 译 器 执 行 的 优 化 , 并 且 在 执 行 验 证 、 调 试 和 覆 盖 率 测 试时 可 能 会 有 用 。语 法--retain=option<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-109ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项其 中 , option 是 下 列 值 之 一 :fnsinlinefns防 止 删 除 未 使 用 的 函 数防 止 删 除 未 使 用 的 内 联 函 数noninlinefns 防 止 删 除 未 使 用 的 非 内 联 函 数paths防 止 进 行 路 径 删 除 优 化 , 如 a||b 转 换 为 a|b。 它 支 持 修 正 条 件 判 定覆 盖 (MCDC) 测 试 。calls 防 止 通 过 内 联 或 尾 调 用 等 删 除 调 用 。calls:distinct防 止 通 过 交 叉 跳 转 等 合 并 调 用 ( 即 通 用 尾 路 径 合 并 )。libcalls 防 止 通 过 内 联 扩 展 等 删 除 对 库 函 数 的 调 用 。数 据 防 止 删 除 数 据 。rodata 防 止 删 除 只 读 数 据 。rwdata 防 止 删 除 读 写 数 据 。data:order 防 止 对 数 据 重 新 排 序 。另 请 参 阅• 第 4-35 页 的 __attribute__((nomerge))• 第 4-37 页 的 __attribute__((notailcall))2.1.140 --rtti, --no_rtti此 选 项 控 制 对 C++ 中 RTTI 功 能 dynamic_cast 和 typeid 的 支 持 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 选 项 为 --rtti。另 请 参 阅• 第 2-50 页 的 --dllimport_runtime, --no_dllimport_runtime2-110 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.141 -S此 选 项 指 示 编 译 器 将 其 生 成 的 机 器 代 码 的 反 汇 编 输 出 到 文 件 中 。与 --asm 选 项 不 同 的 是 , 此 选 项 不 生 成 对 象 模 块 。 汇 编 输 出 文 件 的 缺 省 名 称 为 当前 目 录 中 的 filename.s, 其 中 filename 是 去 掉 任 何 前 导 目 录 名 的 源 文 件 名 称 。 用-o 选 项 可 覆 盖 该 缺 省 文 件 名 。可 以 使 用 armasm 汇 编 输 出 文 件 并 生 成 对 象 代 码 。 编 译 器 会 为 AAPCS 变 体 以 及 字节 顺 序 等 命 令 行 选 项 添 加 ASSERT 指 令 , 以 确 保 在 重 新 汇 编 输 出 时 使 用 兼 容 的 编译 器 选 项 和 汇 编 器 选 项 。 为 汇 编 器 和 编 译 器 指 定 的 AAPCS 设 置 必 须 相 同 。另 请 参 阅• 第 2-4 页 的 --apcs=qualifer...qualifier• 第 2-15 页 的 --asm• 第 2-21 页 的 -c• 第 2-72 页 的 --info=totals• 第 2-75 页 的 --interleave• 第 2-80 页 的 --list• 第 2-92 页 的 -o filename• 《 汇 编 器 指 南 》。2.1.142 --shared此 选 项 允 许 在 使 用 --arm_linux_paths 选 项 为 <strong>ARM</strong> Linux 进 行 编 译 时 生 成 共 享库 。 它 允 许 根 据 <strong>ARM</strong> Linux 配 置 , 选 择 适 于 在 共 享 库 中 使 用 的 库 和 初 始 化 代码 。限 制此 选 项 必 须 与 --arm_linux_paths 和 --apcs=/fpic 结 合 使 用 。示 例将 两 个 对 象 文 件 obj1.o 和 obj2.o 链 接 到 共 享 库 libexample.o 中 :armcc --arm_linux_paths --arm_linux_config_file=my_config_file --shared -olibexample.so obj1.o obj2.o<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-111ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-13 页 的 --arm_linux_paths• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-27 页 的 --configure_gcc=path• 第 2-28 页 的 --configure_gld=path• 第 2-29 页 的 --configure_sysroot=path• 第 2-118 页 的 --translate_g++• 第 2-120 页 的 --translate_gcc• 第 2-121 页 的 --translate_gld• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2.1.143 --show_cmdline此 选 项 显 示 处 理 命 令 行 选 项 的 方 式 。命 令 以 其 首 选 形 式 显 示 , 并 展 开 所 有 via 文 件 的 内 容 。另 请 参 阅• 第 2-2 页 的 -Aopt• 第 2-77 页 的 -Lopt• 第 2-128 页 的 --via=filename2-112 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.144 --signed_bitfields, --unsigned_bitfields此 选 项 使 类 型 为 int 的 位 域 带 符 号 或 无 符 号 。C 标 准 规 定 : 如 果 在 声 明 位 域 时 所 使 用 的 类 型 说 明 符 是 int, 或 者 是 定 义 为 int的 typedef 名 称 , 则 位 域 是 带 符 号 还 是 无 符 号 将 取 决 于 实 现 情 况 。缺 省 设 置缺 省 为 --unsigned_bitfields。 但 是 , 如 果 在 命 令 行 中 指 定 <strong>ARM</strong> Linux 配 置 文 件并 使 用 --translate_gcc 或 --tranlsate_g++, 则 缺 省 为 --signed_bitfields。注 意在 AAPCS 标 准 的 2.03 版 中 , 放 松 了 对 <strong>ARM</strong> 上 位 域 缺 省 情 况 下 无 符 号 的 要 求 。示 例typedef int integer;struct{integer x : 1;} bf;用 --signed_bitfields 编 译 此 代 码 会 将 位 域 视 为 有 符 号 位 域 。另 请 参 阅• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure2.1.145 --signed_chars, --unsigned_chars此 选 项 使 char 类 型 带 符 号 或 无 符 号 。如 果 char 带 符 号 , 则 编 译 器 将 定 义 宏 __FEATURE_SIGNED_CHAR。注 意如 果 要 混 合 分 别 使 用 和 不 使 用 此 选 项 编 译 的 转 换 单 元 , 并 且 转 换 单 元 共 用 接 口或 数 据 结 构 , 则 必 须 格 外 小 心 。<strong>ARM</strong> ABI 将 char 定 义 为 无 符 号 字 节 , 这 是 RVCT 附 带 提 供 的 C++ 库 使 用 的 解释 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-113ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项缺 省 设 置缺 省 选 项 为 --unsigned_chars。另 请 参 阅• 第 4-115 页 的 预 定 义 宏2.1.146 --split_ldm此 选 项 指 示 编 译 器 将 LDM 和 STM 指 令 分 别 拆 分 为 两 个 或 更 多 的 LDM 或 STM 指 令 。如 果 选 择 --split_ldm, 则 LDM 或 STM 指 令 的 最 大 寄 存 器 传 送 数 将 根 据 下 列 情 况 限定 为 相 应 的 值 :• 对 于 所 有 STM, 为 5• 对 于 未 加 载 PC 的 LDM, 为 5• 对 于 加 载 PC 的 LDM, 为 4。如 果 所 需 的 寄 存 器 传 送 数 超 过 上 述 这 些 限 制 , 则 应 使 用 多 个 LDM 或 STM 指 令 。用 法使 用 --split_ldm 选 项 可 在 满 足 下 列 条 件 的 <strong>ARM</strong> 系 统 上 缩 短 中 断 等 待 时 间 :• 没 有 高 速 缓 存 或 写 缓 冲 器 ( 如 没 有 高 速 缓 存 的 <strong>ARM</strong>7TDMI)• 使 用 零 等 待 状 态 , 并 具 有 32 位 内 存 。注 意使 用 --split_ldm 会 增 加 代 码 大 小 , 并 且 会 使 性 能 略 微 有 所 降 低 。限 制• 使 用 --split_ldm 时 , 缺 省 情 况 下 将 拆 分 内 联 汇 编 器 的 LDM 和 STM 指 令 。 但编 译 器 以 后 可 能 会 将 这 些 单 独 的 指 令 重 新 合 并 为 一 条 LDM 或 STM 指 令 。• 使 用 --split_ldm 时 , 仅 拆 分 LDM 和 STM 指 令 。• 有 些 目 标 硬 件 无 法 从 用 --split_ldm 编 译 的 代 码 中 获 益 。 例 如 :— 对 高 速 缓 存 系 统 或 具 有 写 缓 冲 器 的 处 理 器 没 有 明 显 好 处 。2-114 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项— 对 具 有 非 零 等 待 状 态 内 存 的 系 统 或 具 有 慢 速 外 围 设 备 的 系 统 没 有 好处 。 在 此 类 系 统 中 , 中 断 等 待 时 间 是 由 速 度 最 慢 的 内 存 或 外 设 访 问所 需 的 周 期 数 决 定 的 。 这 一 延 迟 时 间 一 般 远 大 于 由 多 个 寄 存 器 传 送产 生 的 延 迟 时 间 。另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 7-9 页 的 指 令 扩 展 。2.1.147 --split_sections此 选 项 指 示 编 译 器 为 源 文 件 中 的 每 个 函 数 分 别 生 成 一 个 ELF 节 。按 生 成 输 出 节 的 函 数 的 名 称 命 名 输 出 节 , 且 带 有 i. 前 缀 。注 意如 果 要 将 特 定 的 数 据 项 或 结 构 放 在 单 独 的 节 中 , 请 用__attribute__((section(...))) 分 别 对 其 进 行 标 记 。如 果 要 删 除 未 使 用 的 函 数 , 建 议 对 此 选 项 优 先 使 用 链 接 器 反 馈 优 化 。 这 是 因 为链 接 器 反 馈 通 过 避 免 产 生 拆 分 所 有 节 的 开 销 , 可 生 成 较 短 的 代 码 。限 制此 选 项 降 低 了 在 函 数 之 间 共 享 地 址 、 数 据 和 字 符 串 的 可 能 性 。 因 此 , 可 能 会 使某 些 函 数 的 代 码 大 小 略 有 增 加 。示 例int f(int x){return x+1;}用 --split_sections 编 译 此 代 码 会 生 成 以 下 结 果 :f PROCAREA ||i.f||, CODE, READONLY, ALIGN=2ADD r0,r0,#1BX lrENDP<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-115ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-36 页 的 --data_reorder, --no_data_reorder• 第 2-56 页 的 --feedback=filename• 第 2-90 页 的 --multifile, --no_multifile• 第 4-38 页 的 __attribute__((section("name")))• 第 4-56 页 的 #pragma arm section [section_sort_list]• 《 编 译 器 用 户 指 南 》 中 第 2-26 页 的 使 用 链 接 器 反 馈2.1.148 --strict, --no_strict此 选 项 根 据 所 使 用 的 源 语 言 选 项 , 强 制 实 施 或 放 宽 严 格 C 或 严 格 C++。如 果 选 择 --strict, 则 会 执 行 下 列 操 作 :• 禁 用 与 ISO C 或 ISO C++ 发 生 冲 突 的 功 能• 在 使 用 非 标 准 功 能 时 返 回 错 误 消 息 。缺 省 设 置缺 省 选 项 为 --no_strict。用 法--strict 强 制 遵 循 下 列 标 准 :ISO C90 • ISO/IEC 9899:1990, 1990 C 国 际 标 准 。• ISO/IEC 9899 AM1, 1995 标 准 附 录 1。ISO C99 ISO/IEC 9899:1999, 1999 C 国 际 标 准 。ISO C++ ISO/IEC 14822:2003, 2003 C++ 国 际 标 准 。错 误当 --strict 生 效 时 , 如 果 违 反 了 相 关 的 ISO 标 准 , 则 编 译 器 会 发 出 错 误 消 息 。可 以 用 常 规 方 式 控 制 诊 断 消 息 的 严 重 性 。2-116 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项示 例void foo(void){long long i; /* okay in nonstrict C90 */}用 --strict 编 译 此 代 码 时 会 生 成 错 误 。另 请 参 阅• 第 2-22 页 的 --c90• 第 2-22 页 的 --c99• 第 2-30 页 的 --cpp• 第 2-66 页 的 --gnu• --strict_warnings• 第 3-12 页 的 标 识 符 中 的 美 元 符 号• 《 编 译 器 用 户 指 南 》 中 第 1-4 页 的 源 语 言 模 式 。2.1.149 --strict_warnings--strict 模 式 中 是 错 误 的 诊 断 将 在 可 能 时 降 级 为 警 告 。 有 时 , 编 译 器 无 法 降 级某 一 严 格 错 误 , 例 如 , 无 法 构 造 要 恢 复 的 合 法 程 序 时 。错 误当 --strict_warnings 生 效 时 , 如 果 违 反 了 相 关 ISO 标 准 , 则 编 译 器 通 常 会 发 出警 告 消 息 。可 以 用 常 规 方 式 控 制 诊 断 消 息 的 严 重 性 。注 意在 某 些 情 况 下 , 如 果 编 译 器 检 测 到 严 重 非 法 行 为 , 则 会 发 出 错 误 消 息 而 不 是 警告 , 并 会 终 止 编 译 。 例 如 :#ifdef $Super$extern void $Super$$__aeabi_idiv0(void); /* intercept __aeabi_idiv0 */#endif如 果 不 使 用 --dollar 选 项 , 则 使 用 --strict_warnings 编 译 此 代 码 时 会 生 成 错 误 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-117ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项示 例void foo(void){long long i; /* okay in nonstrict C90 */}用 --strict_warnings 编 译 此 代 码 时 会 生 成 警 告 消 息 。编 译 会 继 续 执 行 , 即 使 表 达 式 long long 严 重 非 法 也 是 如 此 。另 请 参 阅• 第 1-3 页 的 源 语 言 模 式• 第 3-12 页 的 标 识 符 中 的 美 元 符 号• 第 2-22 页 的 --c90• 第 2-22 页 的 --c99• 第 2-30 页 的 --cpp• 第 2-66 页 的 --gnu• 第 2-115 页 的 --strict, --no_strict2.1.150 --sys_include此 选 项 从 包 含 搜 索 路 径 中 删 除 当 前 位 置 。带 引 号 的 包 含 文 件 的 处 理 方 式 与 带 尖 括 号 的 包 含 文 件 类 似 , 但 前 者 总 是 先 在 -I指 定 的 目 录 中 搜 索 , 而 后 者 先 在 -J 目 录 中 搜 索 。另 请 参 阅• 第 2-69 页 的 -Idir[,dir,...]• 第 2-76 页 的 -Jdir[,dir,...]• 第 2-76 页 的 --kandr_include• 第 2-102 页 的 --preinclude=filename• 《 编 译 器 用 户 指 南 》 中 第 2-15 页 的 当 前 位 置• 《 编 译 器 用 户 指 南 》 中 第 2-16 页 的 搜 索 路 径 。2-118 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.151 --thumb此 选 项 将 编 译 器 配 置 为 以 Thumb 指 令 集 为 目 标 。缺 省 设 置这 是 不 支 持 <strong>ARM</strong> 指 令 集 的 目 标 的 缺 省 选 项 。另 请 参 阅• 第 2-8 页 的 --arm• 第 4-56 页 的 #pragma arm• 第 4-70 页 的 #pragma thumb• 《 编 译 器 用 户 指 南 》 中 第 2-23 页 的 指 定 目 标 处 理 器 或 体 系 结 构• 《 编 译 器 用 户 指 南 》 中 第 5-3 页 的 选 择 目 标 CPU。2.1.152 --translate_g++此 选 项 通 过 启 用 GNU 工 具 的 命 令 行 转 换 , 有 助 于 在 C++ 模 式 中 仿 真 GNU 编 译器 。用 法您 可 以 使 用 此 选 项 来 提 供 以 下 任 意 项 :• 以 <strong>ARM</strong> Linux 为 目 标 的 完 整 GCC 仿 真 。• 完 整 GCC 仿 真 的 子 集 , 表 现 形 式 为 将 各 个 GCC 命 令 行 参 数 转 换 为 其RVCT 等 效 项 。要 提 供 完 整 的 <strong>ARM</strong> Linux GCC 仿 真 , 还 必 须 使 用 --arm_linux_config_file。 此选 项 组 合 可 选 择 配 置 文 件 指 定 的 相 应 GNU 头 文 件 和 库 , 并 包 括 对 某 些 缺 省 行 为的 更 改 。要 将 GCC 命 令 行 参 数 转 换 为 其 RVCT 等 效 项 而 不 以 完 整 的 GCC 仿 真 为 目 标 ,请 使 用 --translate_g++ 仿 真 g++, 但 不 要 与 --arm_linux_config_file 一 起 使 用 。由 于 使 用 此 方 法 时 不 以 完 整 的 GCC 仿 真 为 目 标 , 因 此 将 保 留 RVCT 缺 省 行 为 ,并 且 不 以 <strong>ARM</strong> Linux 为 目 标 设 置 任 何 缺 省 值 。 RVCT 库 路 径 和 选 项 缺 省 值 保 持不 变 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-119ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项限 制如 果 在 命 令 行 中 指 定 <strong>ARM</strong> Linux 配 置 文 件 并 使 用 --translate_g++, 则 会 改 变--exceptions、 --no_exceptions、--bss_threshold、--relaxed_ref_def、--no_relaxed_ref_def、--signed_bitfields 和 --unsigned_bitfields 缺 省 设 置 。另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-13 页 的 --arm_linux_paths• 第 2-20 页 的 --bss_threshold=num• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-27 页 的 --configure_gcc=path• 第 2-28 页 的 --configure_gld=path• 第 2-29 页 的 --configure_sysroot=path• 第 2-53 页 的 --exceptions, --no_exceptions• 第 2-107 页 的 --relaxed_ref_def, --no_relaxed_ref_def• 第 2-111 页 的 --shared• 第 2-112 页 的 --signed_bitfields, --unsigned_bitfields• 第 2-120 页 的 --translate_gcc• 第 2-121 页 的 --translate_gld• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2-120 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.153 --translate_gcc此 选 项 通 过 启 用 GNU 工 具 的 命 令 行 转 换 , 有 助 于 仿 真 gcc。用 法您 可 以 使 用 此 选 项 来 提 供 以 下 任 意 项 :• 以 <strong>ARM</strong> Linux 为 目 标 的 完 整 GCC 仿 真• 完 整 GCC 仿 真 的 子 集 , 表 现 形 式 为 将 各 个 GCC 命 令 行 参 数 转 换 为 其RVCT 等 效 项 。要 提 供 完 整 的 GCC 仿 真 , 还 必 须 使 用 --arm_linux_config_file。 此 选 项 组 合 可 选择 配 置 文 件 指 定 的 相 应 GNU 头 文 件 和 库 , 并 包 括 对 某 些 缺 省 行 为 的 更 改 。要 将 各 个 GCC 命 令 行 参 数 转 换 为 其 RVCT 等 效 项 而 不 以 完 整 的 GCC 仿 真 为 目标 , 请 使 用 --translate_gcc 仿 真 gcc, 但 不 要 与 --arm_linux_config_file 一 起 使用 。 由 于 使 用 此 方 法 时 不 以 完 整 的 GCC 仿 真 为 目 标 , 因 此 将 保 留 RVCT 缺 省 行为 , 并 且 不 以 <strong>ARM</strong> Linux 为 目 标 设 置 任 何 缺 省 值 。 RVCT 库 路 径 和 选 项 缺 省 值保 持 不 变 。限 制如 果 在 命 令 行 中 指 定 <strong>ARM</strong> Linux 配 置 文 件 并 使 用 --translate_gcc, 则 会 改 变--bss_threshold、--relaxed_ref_def、 --no_relaxed_ref_def、--signed_bitfields 和--unsigned_bitfields 的 缺 省 设 置 。另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-13 页 的 --arm_linux_paths• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-27 页 的 --configure_gcc=path• 第 2-28 页 的 --configure_gld=path• 第 2-29 页 的 --configure_sysroot=path• 第 2-107 页 的 --relaxed_ref_def, --no_relaxed_ref_def<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-121ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项• 第 2-111 页 的 --shared• 第 2-112 页 的 --signed_bitfields, --unsigned_bitfields• 第 2-118 页 的 --translate_g++• --translate_gld• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2.1.154 --translate_gld此 选 项 通 过 启 用 GNU 工 具 的 命 令 行 转 换 , 有 助 于 仿 真 GNU ld。用 法您 可 以 使 用 此 选 项 来 提 供 以 下 任 意 项 :• 以 <strong>ARM</strong> Linux 为 目 标 的 完 整 GNU ld 仿 真• 完 整 GNU ld 仿 真 的 子 集 , 表 现 形 式 为 将 各 个 GNU ld 命 令 行 参 数 转 换 为 其RVCT 等 效 项 。要 提 供 完 整 的 GNU ld 仿 真 , 还 必 须 使 用 --arm_linux_config_file。 此 选 项 组 合可 选 择 配 置 文 件 指 定 的 相 应 GNU 头 文 件 和 库 , 并 包 括 对 某 些 缺 省 行 为 的 更 改 。要 将 各 个 GNU ld 命 令 行 参 数 转 换 为 其 RVCT 等 效 项 而 不 以 完 整 的 GNU ld 仿 真为 目 标 , 请 使 用 --translate_gld 仿 真 GNU ld, 但 不 要 与 --arm_linux_config_file一 起 使 用 。 由 于 使 用 此 方 法 时 不 以 完 整 的 GNU ld 仿 真 为 目 标 , 因 此 将 保 留RVCT 缺 省 行 为 , 并 且 不 以 <strong>ARM</strong> Linux 为 目 标 设 置 任 何 缺 省 值 。 RVCT 库 路 径和 选 项 缺 省 值 保 持 不 变 。注 意• 调 用 armcc 时 会 使 用 --translate_gld, 就 像 它 是 GNU 链 接 器 一 样 。 它 仅 用于 直 接 涉 及 GNU 链 接 器 的 现 有 生 成 脚 本 。• 在 gcc 和 g++ 模 式 中 , armcc 使 用 --translate_gld 将 自 身 报 告 为 自 己 所 用 的链 接 器 。 例 如 gcc -print-file-name=ld。2-122 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-13 页 的 --arm_linux_paths• 第 2-24 页 的 --configure_cpp_headers=path• 第 2-25 页 的 --configure_extra_includes=paths• 第 2-26 页 的 --configure_extra_libraries=paths• 第 2-27 页 的 --configure_gcc=path• 第 2-28 页 的 --configure_gld=path• 第 2-29 页 的 --configure_sysroot=path• 第 2-111 页 的 --shared• 第 2-118 页 的 --translate_g++• 第 2-120 页 的 --translate_gcc• 《 链 接 器 参 考 指 南 》 中 第 2-3 页 的 --arm_linux• 《 链 接 器 参 考 指 南 》 中 第 2-33 页 的 --library=name• 《 链 接 器 参 考 指 南 》 中 第 2-51 页的 --[no_]search_dynamic_libraries• 《 应 用 程 序 注 释 212 - 使 用 RVCT 4.0 版 以 及 GNU 工 具 和 库 生 成 Linux 应用 程 序 》(Application Note 212 - Building Linux applications using RVCT v4.0and the GNU Tools and Libraries)。2.1.155 --trigraphs, --no_trigraphs此 选 项 启 用 和 禁 用 三 元 组 识 别 。缺 省 设 置缺 省 选 项 为 --trigraphs ( 在 GNU 模 式 中 缺 省 为 --no_trigraphs)。另 请 参 阅• ISO/IEC 9899:TC2。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-123ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.156 -Uname此 选 项 删 除 宏 name 的 任 何 初 始 定 义 。宏 name 可 为 以 下 任 一 类 型• 预 定 义 宏• 使 用 -D 选 项 指 定 的 宏 。注 意并 非 所 有 的 编 译 器 预 定 义 宏 都 可 以 取 消 定 义 。语 法-Uname其 中 :name 是 要 取 消 定 义 的 宏 的 名 称 。用 法指 定 -Uname 与 将 文 本 #undef name 放 在 每 个 源 文 件 的 开 头 的 作 用 相 同 。限 制编 译 器 按 以 下 顺 序 定 义 和 取 消 定 义 宏 :1. 编 译 器 预 定 义 的 宏2. 使 用 -Dname 显 式 定 义 的 宏3. 使 用 -Uname 显 式 取 消 定 义 的 宏 。另 请 参 阅• 第 2-21 页 的 -C• 第 2-35 页 的 -Dname[(parm-list)][=def]• 第 2-51 页 的 -E• 第 2-86 页 的 -M• 第 4-115 页 的 编 译 器 预 定 义2-124 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.157 --unaligned_access, --no_unaligned_access此 选 项 启 用 或 禁 用 基 于 <strong>ARM</strong> 体 系 结 构 的 处 理 器 上 的 未 对 齐 数 据 访 问 。缺 省 设 置对 于 支 持 未 对 齐 数 据 访 问 的 基 于 <strong>ARM</strong> 体 系 结 构 的 处 理 器 , 缺 省 为--unaligned_access。 这 包 括 :• 基 于 <strong>ARM</strong>v6 体 系 结 构 的 所 有 处 理 器• 基 于 <strong>ARM</strong>v7-A 和 <strong>ARM</strong>v7-R 体 系 结 构 的 处 理 器 。对 于 不 支 持 未 对 齐 数 据 访 问 的 基 于 <strong>ARM</strong> 体 系 结 构 的 处 理 器 , 缺 省 为--no_unaligned_access。 这 包 括 :• 基 于 <strong>ARM</strong>v6 以 前 版 本 的 体 系 结 构 的 所 有 处 理 器• 基 于 <strong>ARM</strong>v7-M 体 系 结 构 的 处 理 器 。用 法--unaligned_access在 支 持 未 对 齐 数 据 访 问 的 处 理 器 ( 如 --cpu=<strong>ARM</strong>1136J-S) 上 使 用--unaligned_access 可 加 快 对 压 缩 结 构 的 访 问 速 度 。若 要 启 用 未 对 齐 支 持 , 必 须 执 行 下 列 操 作 :• 在 初 始 化 代 码 中 清 除 CP15 寄 存 器 1 的 A 位 ( 即 位 1)。• 在 初 始 化 代 码 中 设 置 CP15 寄 存 器 1 的 U 位 ( 即 位 22)。U 位 的 初 始 值 由 内 核 的 UBITINIT 输 入 确 定 。RVCT 库 包 含 旨 在 利 用 未 对 齐 访 问 的 某 些 库 函 数 的 特 殊 版 本 。 在 启用 未 对 齐 访 问 支 持 的 情 况 下 ,RVCT 工 具 将 使 用 这 些 库 函 数 从 未 对齐 访 问 中 获 益 。--no_unaligned_access使 用 --no_unaligned_access 可 在 <strong>ARM</strong>v6 处 理 器 上 禁 止 生 成 未 对 齐字 和 半 字 访 问 。若 要 在 不 使 用 未 对 齐 访 问 的 情 况 下 在 <strong>ARM</strong>v6 目 标 上 启 用 对 四 字 节求 模 的 对 齐 检 查 , 必 须 执 行 下 列 操 作 :• 在 初 始 化 代 码 中 设 置 CP15 寄 存 器 1 的 A 位 ( 即 位 1)。• 在 初 始 化 代 码 中 设 置 CP15 寄 存 器 1 的 U 位 ( 即 位 22)。U 位 的 初 始 值 由 内 核 的 UBITINIT 输 入 确 定 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-125ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项注 意<strong>ARM</strong> 处 理 器 内 核 不 支 持 未 对 齐 双 字 访 问 , 例 如 对 long long 整 数 的未 对 齐 访 问 。 双 字 访 问 必 须 是 八 字 节 或 四 字 节 对 齐 的 。编 译 器 不 支 持 对 八 字 节 求 模 的 对 齐 检 查 。 也 就 是 说 , 编 译 器 ( 或更 具 体 地 说 是 RVCT 工 具 集 ) 不 支 持 CP15 寄 存 器 1 中 的 配 置 U =0、 A = 1。RVCT 库 包 含 旨 在 利 用 未 对 齐 访 问 的 某 些 库 函 数 的 特 殊 版 本 。 若 要在 禁 用 未 对 齐 访 问 支 持 的 情 况 下 禁 止 使 用 这 些 高 级 库 函 数 , 则 在编 译 C 和 C++ 源 文 件 以 及 汇 编 语 言 源 文 件 组 合 的 情 况 下 , 需 要 同时 在 编 译 器 命 令 行 和 汇 编 器 命 令 行 中 指 定 --no_unaligned_access。限 制仅 当 软 件 中 的 对 齐 支 持 选 项 与 处 理 器 内 核 中 的 对 齐 支 持 选 项 相 匹 配 时 , 针 对 支持 未 对 齐 数 据 访 问 的 处 理 器 而 编 译 的 代 码 才 能 正 确 运 行 。另 请 参 阅• 第 2-30 页 的 --cpu=name• 《 汇 编 器 指 南 》 中 第 3-2 页 的 命 令 语 法• 《 开 发 指 南 》 中 第 2-12 页 的 对 齐 支 持 。2.1.158 --use_pch=filename此 选 项 指 示 编 译 器 在 当 前 编 译 中 包 含 具 有 指 定 文 件 名 的 PCH 文 件 。如 果 在 相 同 的 命 令 行 中 包 括 --pch 和 此 选 项 , 则 后 者 优 先 。语 法--use_pch=filename其 中 :filename 是 要 包 含 在 当 前 编 译 中 的 PCH 文 件 。限 制如 果 在 相 同 的 命 令 行 包 括 --create_pch=filename 和 此 选 项 , 则 后 者 将 不 起 作 用 。2-126 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项错 误如 果 指 定 的 文 件 不 存 在 或 者 是 无 效 的 PCH 文 件 , 则 编 译 器 会 生 成 错 误 。另 请 参 阅• 第 2-34 页 的 --create_pch=filename• 第 2-98 页 的 --pch• 第 2-98 页 的 --pch_dir=dir• 第 2-99 页 的 --pch_messages, --no_pch_messages• 第 2-99 页 的 --pch_verbose, --no_pch_verbose• 《 编 译 器 用 户 指 南 》 中 第 2-18 页 的 预 编 译 的 头 文 件2.1.159 --using_std, --no_using_std当 C++ 中 包 含 标 准 头 文 件 时 , 此 选 项 允 许 或 禁 止 隐 式 使 用 std 命 名 空 间 。注 意此 选 项 仅 作 为 不 符 合 C++ 标 准 的 旧 式 源 代 码 的 迁 移 辅 助 选 项 。 不 建 议 使 用 此 选项 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。缺 省 设 置缺 省 选 项 为 --no_using_std。另 请 参 阅• 第 5-15 页 的 命 名 空 间2.1.160 --vectorize, --no_vectorize使 用 此 选 项 可 允 许 或 禁 止 直 接 从 C 或 C++ 代 码 生 成 NEON 向 量 指 令 。缺 省 设 置缺 省 为 --no_vectorize。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-127ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项限 制必 须 为 要 向 量 化 的 循 环 指 定 以 下 选 项 :--cpu=name 目 标 处 理 器 必 须 具 有 NEON 功 能 。-Otime 缩 短 执 行 时 间 的 优 化 类 型 。-Onum 优 化 级 别 。 必 须 使 用 以 下 选 项 之 一 :• -O2 高 度 优 化 。 这 是 缺 省 设 置 。• -O3 最 大 优 化 。注 意NEON 是 <strong>ARM</strong> 高 级 单 指 令 多 数 据 (SIMD) 扩 展 的 实 现 。若 要 启 用 向 量 化 , 需 要 单 独 的 FLEXnet 许 可 证 。 该 许 可 证 随 RVDS 4.0Professional 一 起 提 供 。示 例armcc --vectorize --cpu=Cortex-A8 -O3 -Otime -c file.c另 请 参 阅• 第 2-30 页 的 --cpu=name• 第 2-94 页 的 -Onum• 第 2-96 页 的 -Otime2.1.161 --vfe, --no_vfe此 选 项 启 用 或 禁 用 C++ 中 的 虚 拟 函 数 删 除 (VFE)。使 用 VFE 可 以 将 未 使 用 的 虚 拟 函 数 从 代 码 中 删 除 。 启 用 VFE 时 , 编 译 器 会 将 信息 放 在 带 有 前 缀 .arm_vfe_ 的 特 殊 节 中 。 不 识 别 VFE 的 链 接 器 将 忽 略 这 些 节 , 因为 其 余 代 码 部 分 不 会 引 用 这 些 节 。 因 此 , 这 些 节 不 会 增 加 可 执 行 文 件 的 大 小 ,但 会 增 加 对 象 文 件 的 大 小 。模 式仅 当 源 语 言 为 C++ 时 , 此 选 项 才 有 效 。2-128 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项缺 省 设 置缺 省 为 --vfe ( 用 RVCT v2.1 以 前 版 本 的 编 译 器 编 译 的 旧 对 象 文 件 不 包 含 VFE信 息 的 情 况 除 外 )。另 请 参 阅• 第 C-3 页 的 调 用 纯 虚 函 数• 《 链 接 器 用 户 指 南 》 中 第 3-11 页 的 未 使 用 虚 函 数 删 除 。2.1.162 --via=filename此 选 项 指 示 编 译 器 从 指 定 的 文 件 中 读 取 其 他 命 令 行 选 项 。 从 文 件 中 读 取 的 选 项将 添 加 到 当 前 命 令 行 中 。Via 命 令 可 嵌 套 在 via 文 件 中 。语 法--via=filename其 中 :filename 是 via 文 件 的 名 称 , 该 文 件 包 含 要 包 括 在 命 令 行 中 的 选 项 。示 例假 设 有 一 个 源 文 件 main.c、 一 个 包 含 以 下 一 行 的 via 文 件 apcs.txt:--apcs=/rwpi --no_lower_rwpi --via=L_apcs.txt以 及 另 一 个 包 含 以 下 一 行 的 via 文 件 L_apcs.txt:-L--rwpi -L--callgraph用 以 下 命 令 行 编 译 main.c 时 :armcc main.c -L-o”main.axf" --via=apcs.txt使 用 以 下 命 令 行 编 译 main.c:armcc --no_lower_rwpi --apcs=/rwpi -L--rwpi -L--callgraph -L-o"main.axf" main.c另 请 参 阅• 附 录 A via 文 件 语 法• 《 编 译 器 用 户 指 南 》 中 第 2-12 页 的 从 文 件 读 取 编 译 器 选 项 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-129ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.163 --vla, --no_vla此 编 译 启 用 或 禁 用 对 可 变 长 度 数 组 的 支 持 。缺 省 设 置缺 省 情 况 下 , C90 和 标 准 C++ 不 支 持 可 变 长 度 数 组 。 选 择 --vla 选 项 可 启 用 对C90 或 标 准 C++ 中 可 变 长 度 数 组 的 支 持 。标 准 C 和 GNU 编 译 器 扩 展 均 支 持 可 变 长 度 数 组 。 如 果 源 语 言 是 C99 或 者 指 定了 --gnu 选 项 , 则 将 隐 式 选 择 --vla 选 项 。示 例size_t arr_size(int n){char array[n];return sizeof array;}// variable length array, dynamically allocated// evaluated at runtime另 请 参 阅• 第 2-22 页 的 --c90• 第 2-22 页 的 --c99• 第 2-30 页 的 --cpp• 第 2-66 页 的 --gnu2.1.164 --vsn此 选 项 显 示 版 本 信 息 和 许 可 证 详 细 信 息 。另 请 参 阅• 第 2-69 页 的 --help2.1.165 -W此 选 项 指 示 编 译 器 禁 止 显 示 所 有 警 告 消 息 。2-130 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-19 页 的 --brief_diagnostics, --no_brief_diagnostics• 第 2-44 页 的 --diag_error=tag[,tag,...]• 第 2-45 页 的 --diag_remark=tag[,tag,... ]• 第 2-45 页 的 --diag_style={arm|ide|gnu}• 第 2-46 页 的 --diag_suppress=tag[,tag,...]• 第 2-48 页 的 --diag_warning=tag[,tag,...]• 第 2-52 页 的 --errors=filename• 第 2-108 页 的 --remarks• 第 2-133 页 的 --wrap_diagnostics, --no_wrap_diagnostics2.1.166 --wchar, --no_wchar此 选 项 允 许 或 禁 止 使 用 wchar_t。 只 要 这 些 选 项 未 被 使 用 , 则 不 必 是 错 误 声 明 。用 法使 用 此 选 项 可 创 建 与 wchar_t 大 小 无 关 的 对 象 文 件 。限 制如 果 指 定 了 --no_wchar:• 编 译 器 将 把 结 构 声 明 中 的 wchar_t 域 视 为 错 误 , 而 与 是 否 使 用 该 结 构 无 关• 编 译 器 将 typedef 中 的 wchar_t 视 为 错 误 , 而 与 是 否 使 用 该 typedef 无 关 。缺 省 设 置缺 省 选 项 为 --wchar。另 请 参 阅• 第 2-131 页 的 --wchar16• 第 2-131 页 的 --wchar32<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-131ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项2.1.167 --wchar16此 选 项 将 wchar_t 的 类 型 更 改 为 unsigned short。选 择 此 选 项 会 同 时 修 改 C 中 已 定 义 类 型 wchar_t 的 类 型 以 及 C++ 中 本 机 类 型wchar_t 的 类 型 。 此 外 , 还 会 影 响 WCHAR_MIN 和 WCHAR_MAX 的 值 。缺 省 设 置除 非 显 式 指 定 --wchar32, 否 则 编 译 器 将 采 用 --wchar16。另 请 参 阅• 第 2-130 页 的 --wchar, --no_wchar• --wchar32• 第 4-115 页 的 预 定 义 宏2.1.168 --wchar32此 选 项 将 wchar_t 的 类 型 更 改 为 unsigned int。选 择 此 选 项 会 同 时 修 改 C 中 已 定 义 类 型 wchar_t 的 类 型 以 及 C++ 中 本 机 类 型wchar_t 的 类 型 。 此 外 , 还 会 影 响 WCHAR_MIN 和 WCHAR_MAX 的 值 。缺 省 设 置除 非 显 式 指 定 --wchar32 或 在 命 令 行 中 指 定 <strong>ARM</strong> Linux 配 置 文 件 , 否 则 编 译 器 将采 用 --wchar16。 在 命 令 行 中 指 定 <strong>ARM</strong> Linux 配 置 文 件 将 启 用 --wchar32。另 请 参 阅• 第 2-10 页 的 --arm_linux_config_file=path• 第 2-11 页 的 --arm_linux_configure• 第 2-130 页 的 --wchar, --no_wchar• --wchar16• 第 4-115 页 的 预 定 义 宏2-132 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 命 令 行 选 项2.1.169 --whole_program此 选 项 向 编 译 器 保 证 整 个 程 序 由 命 令 行 中 指 定 的 源 文 件 构 成 。 这 样 , 编 译 器 将能 够 基 于 它 看 到 的 源 代 码 就 是 要 编 译 的 程 序 的 完 整 源 代 码 集 这 一 信 息 来 应 用 优化 。 没 有 此 信 息 , 编 译 器 将 在 对 代 码 应 用 优 化 时 更 加 保 守 。用 法使 用 此 选 项 可 在 编 译 小 程 序 时 获 得 最 佳 性 能 。限 制如 果 您 不 能 向 编 译 器 提 供 所 有 源 代 码 , 则 不 要 使 用 此 选 项 。另 请 参 阅• 第 2-90 页 的 --multifile, --no_multifile2.1.170 --workdir=directory此 选 项 用 于 为 项 目 模 板 提 供 工 作 目 录 。注 意项 目 模 板 在 包 含 文 件 ( 如 RVD 配 置 文 件 ) 时 仅 需 要 工 作 目 录 。语 法--workdir=directory其 中 :directory 是 项 目 目 录 的 名 称 。限 制如 果 使 用 --workdir 指 定 项 目 工 作 目 录 , 则 必 须 使 用 --project 指 定 项 目 文 件 。错 误如 果 要 尝 试 使 用 不 带 --workdir 的 --project, 而 --workdir 又 是 必 需 的 , 则 会 生 成错 误 消 息 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 2-133ID090708Non-Confidential, Unrestricted Access


编 译 器 命 令 行 选 项另 请 参 阅• 第 2-104 页 的 --project=filename, --no_project=filename• 第 2-107 页 的 --reinitialize_workdir2.1.171 --wrap_diagnostics, --no_wrap_diagnostics此 选 项 允 许 或 禁 止 在 错 误 消 息 文 本 太 长 而 在 一 行 中 放 不 下 时 , 对 错 误 消 息 文 本进 行 换 行 。缺 省 设 置缺 省 选 项 为 --no_wrap_diagnostics。另 请 参 阅• 第 2-19 页 的 --brief_diagnostics, --no_brief_diagnostics• 第 2-44 页 的 --diag_error=tag[,tag,...]• 第 2-45 页 的 --diag_remark=tag[,tag,... ]• 第 2-45 页 的 --diag_style={arm|ide|gnu}• 第 2-46 页 的 --diag_suppress=tag[,tag,...]• 第 2-48 页 的 --diag_warning=tag[,tag,...]• 第 2-52 页 的 --errors=filename• 第 2-108 页 的 --remarks• 第 2-129 页 的 -W• 《 编 译 器 用 户 指 南 》 中 第 6 章 诊 断 消 息 。2-134 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


第 3 章语 言 扩 展本 章 介 绍 <strong>ARM</strong> 编 译 器 支 持 的 语 言 扩 展 , 包 括 :• 第 3-2 页 的 预 处 理 器 扩 展• 第 3-4 页 的 C90 中 提 供 的 C99 语 言 功 能• 第 3-6 页 的 C++ 和 C90 中 提 供 的 C99 语 言 功 能• 第 3-9 页 的 标 准 C 语 言 扩 展• 第 3-14 页 的 标 准 C++ 语 言 扩 展• 第 3-18 页 的 标 准 C 和 标 准 C++ 语 言 扩 展• 第 3-23 页 的 GNU 语 言 扩 展有 关 <strong>ARM</strong> 编 译 器 的 其 他 参 考 材 料 , 另 请 参 阅 :• 附 录 B 标 准 C 实 现 定 义• 附 录 C 标 准 C++ 实 现 定 义• 附 录 D C 和 C++ 编 译 器 实 现 限 制<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-1ID090708Non-Confidential, Unrestricted Access


语 言 扩 展3.1 预 处 理 器 扩 展编 译 器 支 持 几 种 预 处 理 器 扩 展 , 包 括 System V 版 本 4 的 #assert 预 处 理 扩 展 。3.1.1 #assert允 许 使 用 System V 版 本 4 的 #assert 预 处 理 扩 展 。 这 些 扩 展 可 以 定 义 和 测 试 谓 词名 称 。此 类 名 称 位 于 与 所 有 其 他 名 称 ( 包 括 宏 名 称 ) 不 同 的 命 名 空 间 中 。语 法#assert name#assert name[(token-sequence)]其 中 :name是 一 个 谓 词 名 称token-sequence 是 一 个 可 选 的 标 记 序 列 。如 果 省 略 标 记 序 列 , 则 不 会 为 name 指 定 值 。如 果 包 含 标 记 序 列 , 则 会 为 name 指 定 值 token-sequence。示 例可 以 在 #if 表 达 式 中 测 试 使 用 #assert 定 义 的 谓 词 名 称 , 例 如 :#if #name(token-sequence)如 果 具 有 标 记 序 列 token-sequence 的 名 称 name 的 #assert 已 出 现 , 则 此 值 为 1,否 则 为 0。 可 以 在 给 定 时 间 为 给 定 谓 词 指 定 多 个 值 。另 请 参 阅• 第 3-3 页 的 #unassert3.1.2 #include_next此 预 处 理 器 指 令 是 #include 指 令 的 变 体 。 它 仅 在 搜 索 路 径 中 当 前 源 文 件 ( 即 包含 #include_next 指 令 的 文 件 ) 所 在 目 录 后 面 的 目 录 中 搜 索 已 命 名 文 件 。3-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展注 意此 预 处 理 程 序 指 令 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。3.1.3 #unassert可 以 使 用 #unassert 预 处 理 指 令 删 除 谓 词 名 称 。语 法#unassert name#unassert name[(token-sequence)]其 中 :name是 一 个 谓 词 名 称token-sequence 是 一 个 可 选 的 标 记 序 列 。如 果 省 略 标 记 序 列 , 则 会 删 除 name 的 所 有 定 义 。如 果 包 含 标 记 序 列 , 则 只 删 除 指 示 的 定 义 。 所 有 其 他 定 义 保持 不 变 。另 请 参 阅• 第 3-2 页 的 #assert3.1.4 #warning支 持 预 处 理 指 令 #warning。 与 #error 指 令 一 样 , 此 指 令 在 编 译 时 生 成 用 户 定 义的 警 告 。 但 不 会 暂 停 编 译 。限 制如 果 指 定 --strict 选 项 , 则 无 法 使 用 #warning 指 令 。 如 果 使 用 该 指 令 , 则 会 生成 错 误 。另 请 参 阅• 第 2-116 页 的 --strict, --no_strict<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-3ID090708Non-Confidential, Unrestricted Access


语 言 扩 展3.2 C90 中 提 供 的 C99 语 言 功 能编 译 器 支 持 多 种 ISO C90 标 准 扩 展 , 例 如 , C99 样 式 的 // 注 释 。如 果 源 语 言 是 C90, 并 且 是 在 非 strict 模 式 下 进 行 编 译 , 则 可 以 使 用 这 些 扩 展 。如 果 源 语 言 是 C90, 并 且 使 用 --strict 编 译 器 选 项 将 编 译 器 限 制 为 编 译 严 格C90, 则 无 法 使 用 这 些 扩 展 。注 意标 准 C 和 标 准 C++ 的 语 言 功 能 ( 如 C++ 样 式 的 // 注 释 ) 可 能 与 本 节 中 介 绍 的C90 语 言 扩 展 类 似 。 如 果 使 用 --strict 编 译 器 选 项 编 译 严 格 标 准 C 或 严 格 标 准C++, 则 可 以 继 续 使 用 这 些 功 能 。3.2.1 // 注 释字 符 序 列 // 开 始 一 行 注 释 , 就 像 在 C99 或 C++ 中 一 样 。C90 中 的 // 注 释 与 C99 中 的 // 注 释 具 有 相 同 的 语 义 。示 例// this is a comment另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 5-43 页 的 C99 的 新 功 能 。3.2.2 下 标 结 构在 C90 中 , 不 是 左 值 的 数 组 仍 会 降 级 为 指 针 , 并 且 可 以 加 下 标 。 但 是 , 在 下 一序 列 点 后 不 能 修 改 或 使 用 它 们 , 并 且 不 能 为 其 应 用 一 元 & 运 算 符 。 可 以 在 C90中 为 这 种 数 组 加 下 标 , 但 它 们 在 C99 模 式 以 外 不 会 降 级 为 指 针 。示 例struct Subscripting_Struct{int a[4];};extern struct Subscripting_Struct Subscripting_0(void);int Subscripting_1 (int index)3-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展{}return Subscripting_0().a[index];3.2.3 可 变 数 组 成 员struct 的 最 后 一 个 成 员 可 以 具 有 不 完 整 的 数 组 类 型 。 最 后 一 个 成 员 不 能 是 struct的 唯 一 成 员 , 否 则 struct 的 大 小 为 零 。示 例typedef struct{int len;char p[]; // incomplete array type, for use in a malloced data structure} str;另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 5-43 页 的 C99 的 新 功 能 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-5ID090708Non-Confidential, Unrestricted Access


语 言 扩 展3.3 C++ 和 C90 中 提 供 的 C99 语 言 功 能编 译 器 支 持 多 种 ISO C++ 标 准 和 C90 语 言 扩 展 , 例 如 , 覆 盖 旧 式 非 原 型 定 义 的函 数 原 型 。如 果 以 下 条 件 成 立 , 则 可 以 使 用 这 些 扩 展 :• 源 语 言 是 C++, 并 且 在 非 strict 模 式 下 进 行 编 译• 源 语 言 是 C90, 并 且 在 非 strict 模 式 下 进 行 编 译 。如 果 以 下 条 件 成 立 , 则 无 法 使 用 这 些 扩 展 :• 源 语 言 是 C++, 并 且 使 用 --strict 编 译 器 选 项 将 编 译 器 限 制 为 编 译 严 格C90。• 源 语 言 是 C90, 并 且 使 用 --strict 编 译 器 选 项 将 编 译 器 限 制 为 编 译 严 格 标准 C。注 意标 准 C 的 语 言 功 能 ( 如 long long 整 数 ) 可 能 与 本 节 中 介 绍 的 语 言 扩 展 类 似 。 如果 使 用 --strict 编 译 器 选 项 编 译 严 格 标 准 C++ 或 严 格 C90, 则 可 以 继 续 使 用 这些 功 能 。3.3.1 可 变 参 数 宏在 C90 和 C++ 中 , 可 以 将 宏 声 明 为 接 受 可 变 数 量 的 自 变 量 。C90 和 C++ 中 用 于 声 明 可 变 参 数 宏 的 语 法 遵 循 用 于 声 明 可 变 参 数 宏 的 C99 语法 , 除 非 选 择 了 --gnu 选 项 。 如 果 指 定 了 --gnu 选 项 , 则 该 语 法 遵 循 可 变 参 数 宏的 GNU 语 法 。示 例#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)void variadic_macros(void){debug ("a test string is printed out along with %x %x %x\n", 12, 14, 20);}另 请 参 阅• 第 2-66 页 的 --gnu• 《 编 译 器 用 户 指 南 》 中 第 5-43 页 的 C99 的 新 功 能 。3-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展3.3.2 long long<strong>ARM</strong> 编 译 器 通 过 类 型 说 明 符 long long 和 unsigned long long 支 持 64 位 整 型 。 就通 常 的 算 术 转 换 而 言 , 它 们 的 行 为 类 似 于 long 和 unsigned long。__int64 是 longlong 的 同 义 词 。整 型 常 数 可 以 具 有 :• ll 后 缀 , 用 于 将 常 数 类 型 转 换 为 long long ( 如 果 合 适 ), 或 者 转 换 为unsigned long long ( 如 果 不 合 适 )• ull 或 llu 后 缀 , 用 于 将 常 数 的 类 型 转 换 为 unsigned long long。printf() 和 scanf() 的 格 式 说 明 符 可 以 包 含 ll, 以 指 定 随 后 的 转 换 应 用 于 longlong 自 变 量 , 如 在 %lld 或 %llu 中 。同 样 , 如 果 普 通 整 型 常 数 的 值 足 够 大 , 则 该 常 数 的 类 型 为 long long 或 unsignedlong long。 编 译 器 将 生 成 一 条 警 告 消 息 以 指 示 这 一 变 化 。 例 如 , 在 严 格 1990ISO 标 准 C 中 , 2147483648 的 类 型 为 unsigned long。 在 <strong>ARM</strong> C 和 C++ 中 , 其类 型 为 long long。 这 种 情 况 产 生 的 一 个 后 果 可 以 在 表 达 式 值 中 体 现 出 来 , 例如 :2147483648 > – 1在 严 格 C 和 C++ 中 , 该 表 达 式 的 计 算 结 果 为 0; 而 在 <strong>ARM</strong> C 和 C++ 中 , 该 表达 式 的 计 算 结 果 为 1。long long 类 型 适 用 于 通 常 的 算 术 转 换 。另 请 参 阅• 第 4-9 页 的 __int643.3.3 restrictrestrict 关 键 字 是 一 种 C99 功 能 , 用 于 确 保 不 同 的 对 象 指 针 类 型 和 函 数 参 数 数组 不 会 指 向 重 叠 的 内 存 区 域 。 因 此 , 编 译 器 可 以 执 行 优 化 , 而 不 会 由 于 可 能 的混 淆 而 将 优 化 禁 止 。限 制要 在 C90 或 C++ 中 启 用 restrict 关 键 字 , 必 须 指 定 --restrict 选 项 。支 持 将 __restrict 和 __restrict__ 关 键 字 作 为 restrict 的 同 义 词 , 无 论 是 否 指 定了 --restrict, 始 终 可 以 使 用 这 些 关 键 字 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-7ID090708Non-Confidential, Unrestricted Access


语 言 扩 展示 例void copy_array(int n, int *restrict a, int *restrict b){while (n-- > 0)*a++ = *b++;}另 请 参 阅• 第 2-109 页 的 --restrict, --no_restrict• 《 编 译 器 用 户 指 南 》 中 第 5-43 页 的 C99 的 新 功 能 。3.3.4 十 六 进 制 浮 点C90 和 C++ 支 持 可 以 按 十 六 进 制 格 式 写 入 的 浮 点 数 。示 例float hex_floats(void){return 0x1.fp3; // 1.55e1}另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 5-43 页 的 C99 的 新 功 能 。3-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展3.4 标 准 C 语 言 扩 展编 译 器 支 持 多 种 ISO C99 标 准 扩 展 , 例 如 , 覆 盖 旧 式 非 原 型 定 义 的 函 数 原 型 。如 果 以 下 条 件 成 立 , 则 可 以 使 用 这 些 扩 展 :• 源 语 言 是 C99, 并 且 在 非 strict 模 式 下 进 行 编 译• 源 语 言 是 C90, 并 且 在 非 strict 模 式 下 进 行 编 译 。如 果 以 下 条 件 成 立 , 则 无 法 使 用 其 中 的 任 何 扩 展 :• 源 语 言 是 C90, 并 且 使 用 --strict 编 译 器 选 项 将 编 译 器 限 制 为 编 译 严 格C90。• 源 语 言 是 C99, 并 且 使 用 --strict 编 译 器 选 项 将 编 译 器 限 制 为 编 译 严 格 标准 C。• 源 语 言 是 C++。3.4.1 常 数 表 达 式初 始 值 设 定 项 中 支 持 扩 展 的 常 数 表 达 式 。 以 下 示 例 说 明 了 缺省 、--strict_warnings 和 --strict 编 译 器 模 式 下 的 编 译 器 行 为 。示 例 1, 分 配 变 量 地 址代 码 可 能 包 含 在 文 件 范 围 内 分 配 变 量 地 址 的 常 数 表 达 式 , 例 如 :int i;int j = (int)&i; /* but not allowed by ISO */为 C 语 言 进 行 编 译 时 , 这 会 出 现 以 下 行 为 :• 在 缺 省 模 式 下 , 生 成 警 告 。• 在 --strict_warnings 模 式 下 , 生 成 警 告 。• 在 --strict 模 式 下 , 生 成 错 误 。示 例 2, 常 数 初 始 值 设 定 项以 下 示 例 简 要 说 明 C 代 码 中 具 有 包 含 常 数 值 的 表 达 式 时 的 编 译 器 行 为 :/* Std RVCT v3.1 */extern int const c = 10; /* ok ok */extern int const x = c + 10; /* error ext */static int y = c + 10; /* error ext */static int const z = c + 10; /* error ext */<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-9ID090708Non-Confidential, Unrestricted Access


语 言 扩 展extern int *const cp = (int*)0x100; /* ok ok */extern int *const xp = cp + 0x100; /* error ext */static int * yp = cp + 0x100; /* error ext */static int *const zp = cp + 0x100; /* error ext */这 指 示 由 ISO C 标 准 Std 定 义 的 行 为 以 及 RVCT 中 的 行 为 :• ok 表 明 在 所 有 C 模 式 下 均 接 受 该 语 句 。• ext 是 ISO C 标 准 的 扩 展 。 此 行 为 取 决 于 编 译 C 时 使 用 的 strict 模 式 :非 严 格接 受 , 不 会 发 出 警 告 。--strict_warnings接 受 , 但 会 发 出 警 告 。--strict符 合 ISO C 标 准 , 但 会 生 成 错 误 。另 请 参 阅• 第 2-55 页 的 --extended_initializers,--no_extended_initializers• 第 2-116 页 的 --strict, --no_strict• 第 2-117 页 的 --strict_warnings3.4.2 数 组 和 指 针 扩 展支 持 以 下 数 组 和 指 针 扩 展 :• 对 于 可 互 换 但 不 完 全 相 同 的 类 型 , 允 许 指 针 之 间 存 在 分 配 和 指 针 差 别 , 例如 , unsigned char * 和 char *。 这 包 括 指 向 相 同 大 小 的 整 型 的 指 针 , 通 常为 int * 和 long *。 将 发 出 警 告 。允 许 将 字 符 串 常 数 分 配 给 指 向 任 何 类 型 字 符 的 指 针 , 而 不 会 发 出 警 告 。• 如 果 目 标 类 型 添 加 了 非 顶 级 的 类 型 限 定 符 , 则 允 许 分 配 指 针 类 型 ; 例 如 ,将 int ** 分 配 给 const int **。 这 些 指 针 类 型 对 也 允 许 存 在 比 较 和 指 针 差别 。 将 发 出 警 告 。• 在 指 针 运 算 中 , 如 果 需 要 , 则 始 终 将 指 向 void 的 指 针 隐 式 转 换 为 其 他 类型 。 同 样 , 如 果 需 要 , 始 终 将 空 指 针 常 数 隐 式 转 换 为 正 确 类 型 的 空 指 针 。在 ISO C 中 , 某 些 运 算 符 允 许 这 样 转 换 , 而 其 他 运 算 符 不 允 许 。3-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展• 可 以 分 配 指 向 不 同 函 数 类 型 的 指 针 , 或 者 进 行 相 等 (==) 或 不 相 等 (!=) 比较 , 而 无 需 进 行 显 式 类 型 转 换 。 发 出 警 告 或 错 误 。在 C++ 模 式 下 , 禁 止 使 用 该 扩 展 。• 可 以 将 指 向 void 的 指 针 隐 式 转 换 为 指 向 函 数 类 型 的 指 针 , 反 之 亦 然 。• 在 初 始 值 设 定 项 中 , 如 果 整 型 足 够 大 以 包 含 某 个 指 针 常 数 值 , 则 可 以 将 其转 换 为 整 型 。• 如 果 数 组 带 有 下 标 或 以 类 似 方 式 使 用 , 则 会 将 非 左 值 的 数 组 表 达 式 转 换 为指 向 数 组 中 的 第 一 个 元 素 的 指 针 。3.4.3 块 范 围 函 数 声 明支 持 以 下 两 个 块 范 围 函 数 声 明 扩 展 :• 块 范 围 函 数 声 明 还 在 文 件 范 围 内 声 明 函 数 名 称• 块 范 围 函 数 声 明 可 能 具 有 静 态 存 储 类 , 因 而 导 致 产 生 的 声 明 缺 省 具 有 内 部链 接 。示 例void f1(void){static void g(void); /* static function declared in local scope *//* use of static keyword is illegal in strict ISO C */}void f2(void){g(); /* uses previous local declaration */}static void g(int i){ } /* error - conflicts with previous declaration of g */<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-11ID090708Non-Confidential, Unrestricted Access


语 言 扩 展3.4.4 标 识 符 中 的 美 元 符 号标 识 符 中 允 许 使 用 美 元 符 号 ($)。注 意使 用 --strict 选 项 进 行 编 译 时 , 可 通 过 --dollar 命 令 行 选 项 允 许 在 标 识 符 中 使用 美 元 符 号 。示 例#define DOLLAR$另 请 参 阅• 第 2-50 页 的 --dollar, --no_dollar• 第 2-116 页 的 --strict, --no_strict3.4.5 顶 级 声 明C 输 入 文 件 可 能 不 包 含 顶 级 声 明 。错 误如 果 C 输 入 文 件 不 包 含 顶 级 声 明 , 则 会 发 出 备 注 消 息 。注 意缺 省 情 况 下 不 显 示 备 注 。 要 查 看 备 注 消 息 , 请 使 用 编 译 器 选 项 --remarks。另 请 参 阅• 第 2-108 页 的 --remarks3.4.6 良 性 重 声 明允 许 对 typedef 名 称 进 行 良 性 重 声 明 。 也 就 是 说 , 可 以 在 同 一 范 围 内 将 typedef名 称 重 新 声 明 为 同 一 类 型 。示 例typedef int INT;typedef int INT; /* redeclaration */3-12 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展3.4.7 外 部 实 体在 其 他 范 围 内 声 明 的 外 部 实 体 是 可 见 的 。错 误如 果 在 其 他 范 围 内 声 明 的 外 部 实 体 是 可 见 的 , 编 译 器 将 生 成 警 告 。示 例void f1(void){extern void f();}void f2(void){f(); /* Out of scope declaration */}3.4.8 函 数 原 型编 译 器 可 以 识 别 覆 盖 在 代 码 后 面 位 置 出 现 的 旧 式 非 原 型 定 义 的 函 数 原 型 , 例如 :错 误如 果 使 用 旧 式 函 数 原 型 , 编 译 器 将 生 成 一 条 警 告 消 息 。示 例int function_prototypes(char);// Old-style function definition.int function_prototypes(x)char x;{return x == 0;}<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-13ID090708Non-Confidential, Unrestricted Access


语 言 扩 展3.5 标 准 C++ 语 言 扩 展编 译 器 支 持 多 种 ISO C++ 标 准 扩 展 , 例 如 , 类 成 员 声 明 中 的 限 定 名 称 。如 果 源 语 言 是 C++, 并 且 是 在 非 strict 模 式 下 进 行 编 译 , 则 可 以 使 用 这 些 扩 展 。如 果 源 语 言 是 C++, 并 且 使 用 --strict 编 译 器 选 项 将 编 译 器 限 制 为 编 译 严 格 标准 C++, 则 无 法 使 用 这 些 扩 展 。3.5.1 ? 运 算 符如 果 ? 运 算 符 的 第 二 个 和 第 三 个 操 作 数 为 字 符 串 文 字 或 宽 字 符 串 文 字 , 则 可 以将 其 隐 式 转 换 为 char * 或 wchar_t *。 在 C++ 中 , 字 符 串 文 字 是 const。 可 通 过 隐式 转 换 将 字 符 串 文 字 转 换 为 char * 或 wchar_t *, 从 而 删 除 const。 但 是 , 这 种 转换 仅 适 用 于 简 单 字 符 串 文 字 。 一 种 扩 展 是 允 许 将 其 作 为 ? 运 算 结 果 。示 例char *p = x ? "abc" : "def";3.5.2 类 成 员 声 明可 以 在 类 成 员 声 明 中 使 用 限 定 名 称 。错 误如 果 在 类 成 员 声 明 中 使 用 限 定 名 称 , 则 会 发 出 警 告 。示 例struct A{int A::f(); // is the same as int f();};3.5.3 friendclass 的 friend 声 明 可 以 省 略 class 关 键 字 。缺 省 情 况 下 , 不 会 在 friend 声 明 中 执 行 访 问 检 查 。 可 以 使 用 --strict 命 令 行 选项 强 制 进 行 访 问 检 查 。3-14 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展示 例class B;class A{friend B; // is the same as "friend class B"};另 请 参 阅• 第 2-116 页 的 --strict, --no_strict3.5.4 读 / 写 常 数外 部 常 数 的 链 接 说 明 指 示 , 常 数 可 以 动 态 初 始 化 或 具 有 可 变 成 员 。注 意使 用 "C++:read/write" 链 接 仅 对 通 过 --apcs /rwpi 编 译 的 代 码 是 必 需 的 。 如 果 使用 此 选 项 重 新 编 译 现 有 代 码 , 则 必 须 更 改 动 态 初 始 化 或 具 有 可 变 成 员 的 外 部 常数 的 链 接 说 明 。使 用 --apcs /rwpi 选 项 编 译 C++ 不 符 合 ISO C++ 标 准 。 示 例 3-1 中 的 声 明 假 定 x在 只 读 段 中 。示 例 3-1 外 部 访 问extern const T x;extern "C++" const T x;extern "C" const T x;无 法 为 常 数 动 态 初 始 化 x ( 包 括 用 户 定 义 的 构 造 函 数 ), 并 且 T 不 能 包 含 可 变 成员 。 示 例 3-2 中 的 新 链 接 说 明 声 明 x 位 于 读 / 写 段 中 , 即 使 使 用 常 数 对 其 初 始 化 。允 许 动 态 初 始 化 x, 并 且 T 可 以 包 含 可 变 成 员 。 其 他 文 件 中 的 x、y 和 z 定 义 必 须具 有 相 同 的 链 接 说 明 。示 例 3-2 链 接 说 明extern const int z; /* in read-only segment, cannot *//* be dynamically initialized */extern "C++:read/write" const int y; /* in read/write segment *//* can be dynamically initialized */extern "C++:read/write"<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-15ID090708Non-Confidential, Unrestricted Access


语 言 扩 展{}const int i=5; /* placed in read-only segment, *//* not extern because implicitly static */extern const T x=6; /* placed in read/write segment */struct S{static const T T x; /* placed in read/write segment */};不 能 使 用 其 他 链 接 重 新 声 明 常 数 对 象 。 示 例 3-3 中 的 代 码 生 成 编 译 器 错 误 。示 例 3-3 编 译 器 错 误extern "C++" const T x;extern "C++:read/write" const T x; /* error */注 意由 于 C 没 有 链 接 说 明 , 因 此 , 不 能 将 C++ 中 声 明 的 const 对 象 用 作 C 的 extern"C++:read/write"。另 请 参 阅• 第 2-4 页 的 --apcs=qualifer...qualifier3.5.5 标 量 类 型 常 数可 以 在 类 内 部 定 义 标 量 类 型 的 常 数 。 这 是 一 种 旧 格 式 , 新 格 式 使 用 初 始 化 的 静态 数 据 成 员 。错 误如 果 在 类 内 部 定 义 整 型 常 数 的 成 员 , 则 会 发 出 警 告 。示 例class A{const int size = 10; // must be static const int size = 10;int a[size];};3-16 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展3.5.6 非 成 员 函 数 模 板 的 特 化作 为 一 种 扩 展 , 允 许 在 非 成 员 函 数 模 板 的 特 化 上 指 定 存 储 类 。3.5.7 类 型 转 换允 许 在 指 向 extern "C" 函 数 的 指 针 和 指 向 extern "C++" 函 数 的 指 针 之 间 进 行 类 型转 换 。示 例extern "C" void f(); // f’ s type has extern "C" linkagevoid (*pf)() = &f; // pf points to an extern "C++" function// error unless implicit conversion is allowed<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-17ID090708Non-Confidential, Unrestricted Access


语 言 扩 展3.6 标 准 C 和 标 准 C++ 语 言 扩 展编 译 器 支 持 多 种 ISO C99 和 ISO C++ 标 准 扩 展 , 如 各 种 整 型 扩 展 、 各 种 浮 点 扩展 、 十 六 进 制 浮 点 常 数 以 及 匿 名 类 、 结 构 和 联 合 。如 果 以 下 条 件 成 立 , 则 可 以 使 用 这 些 扩 展 :• 源 语 言 是 C++, 并 且 在 非 strict 模 式 下 进 行 编 译• 源 语 言 是 C99, 并 且 在 非 strict 模 式 下 进 行 编 译• 源 语 言 是 C90, 并 且 在 非 strict 模 式 下 进 行 编 译 。如 果 以 下 条 件 成 立 , 则 无 法 使 用 这 些 扩 展 :• 源 语 言 是 C++, 并 且 使 用 --strict 编 译 器 选 项 将 编 译 器 限 制 为 编 译 严 格C++。• 源 语 言 是 C99, 并 且 使 用 --strict 编 译 器 选 项 将 编 译 器 限 制 为 编 译 严 格 标准 C。• 源 语 言 是 C90, 并 且 使 用 --strict 编 译 器 选 项 将 编 译 器 限 制 为 编 译 严 格C90。3.6.1 寄 存 器 变 量 地 址可 以 获 取 register 存 储 类 变 量 的 地 址 。错 误如 果 获 取 register 存 储 类 变 量 的 地 址 , 编 译 器 将 生 成 警 告 。示 例void foo(void){register int i;int *j = &i;}3.6.2 函 数 自 变 量可 以 为 顶 级 函 数 声 明 以 外 的 函 数 参 数 指 定 缺 省 自 变 量 。 例 如 , 可 以 在 typedef 声明 以 及 指 向 函 数 的 指 针 和 指 向 成 员 函 数 的 指 针 声 明 中 接 受 这 些 参 数 。3-18 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展3.6.3 匿 名 类 、 结 构 和 联 合支 持 将 匿 名 类 、 结 构 和 联 合 作 为 扩 展 。 C 和 C++ 中 支 持 匿 名 结 构 和 联 合 。缺 省 情 况 下 , 可 以 在 C++ 中 使 用 匿 名 联 合 。 但 是 , 如 果 要 使 用 以 下 内 容 , 则 必须 指 定 anon_unions 编 译 指 示 :• C 中 的 匿 名 联 合 和 结 构• C++ 中 的 匿 名 类 和 结 构 。可 通 过 typedef 名 称 将 匿 名 联 合 引 入 到 包 含 类 中 。 与 真 正 的 匿 名 联 合 不 同 , 不 必直 接 对 其 进 行 声 明 。 例 如 :typedef union{int i, j;} U; // U identifies a reusable anonymous union.#pragma anon_unionsclass A{U; // Okay -- references to A::i and A::j are allowed.};扩 展 也 可 以 实 现 匿 名 类 和 匿 名 结 构 , 但 前 提 是 它 们 没 有 C++ 特 性 。 例 如 , 不 允许 在 匿 名 类 和 匿 名 结 构 中 使 用 静 态 数 据 成 员 或 成 员 函 数 、 非 公 共 成 员 以 及 嵌 套类 型 ( 匿 名 类 、 结 构 或 联 合 除 外 )。 例 如 :#pragma anon_unionsstruct A{struct{int i, j;}; // Okay -- references to A::i and A::j are allowed.};另 请 参 阅• 第 3-30 页 的 未 命 名 的 字 段• 第 4-56 页 的 #pragma anon_unions, #pragma no_anon_unions<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-19ID090708Non-Confidential, Unrestricted Access


语 言 扩 展3.6.4 汇 编 器 标 签汇 编 器 标 签 指 定 用 于 C 符 号 的 汇 编 器 名 称 。 例 如 , 可 以 让 汇 编 器 代 码 和 C 代 码使 用 相 同 的 符 号 名 称 , 如 counter。 因 此 , 可 以 导 出 不 同 的 名 称 供 汇 编 器 使 用 。int counter __asm__("counter_v1") = 0;这 会 导 出 符 号 counter_v1, 而 不 是 导 出 符 号 counter。另 请 参 阅• 第 4-5 页 的 __asm3.6.5 空 声 明允 许 使 用 空 声 明 , 即 分 号 前 面 没 有 任 何 内 容 。示 例; // do nothing3.6.6 十 六 进 制 浮 点 常 数<strong>ARM</strong> 编 译 器 实 现 了 C 中 数 字 常 数 的 语 法 扩 展 , 以 便 将 浮 点 常 数 显 式 指 定 为IEEE 位 模 式 。语 法用 于 将 浮 点 常 数 指 定 为 IEEE 位 模 式 的 语 法 是 :0f_n 将 8 位 十 六 进 制 数 n 解 释 为 float 常 数 。 必 须 恰 好 是 8 位 。0d_nn 将 16 位 十 六 进 制 数 nn 解 释 为 double 常 数 。 必 须 恰 好 是 16 位 。3.6.7 不 完 整 的 枚 举支 持 enum 的 正 向 声 明 。示 例enum Incomplete_Enums_0;int Incomplete_Enums_2 (enum Incomplete_Enums_0 * passon){return 0;}3-20 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展int Incomplete_Enums_1 (enum Incomplete_Enums_0 * passon){return Incomplete_Enums_2(passon);}enum Incomplete_Enums_0 { ALPHA, BETA, GAMMA };3.6.8 整 型 扩 展在 整 型 常 数 表 达 式 中 , 可 以 将 整 型 常 数 转 换 为 指 针 类 型 , 然 后 再 转 换 回 整 型 。3.6.9 标 签 定 义在 标 准 C 和 标 准 C++ 中 , 语 句 必 须 在 标 签 定 义 后 面 。 在 C 和 C++ 中 , 标 签 定 义可 以 紧 靠 右 花 括 号 前 面 放 置 。错 误如 果 标 签 定 义 紧 靠 右 花 括 号 前 面 放 置 , 编 译 器 将 生 成 警 告 。示 例void foo(char *p){if (p){/* ... */label:}}3.6.10 long floatlong float 被 视 为 double 的 同 义 词 。3.6.11 非 静 态 局 部 变 量可 以 在 非 求 值 表 达 式 中 引 用 包 含 函 数 的 非 静 态 局 部 变 量 , 例 如 , 局 部 类 中 的sizeof 表 达 式 。 将 发 出 警 告 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-21ID090708Non-Confidential, Unrestricted Access


语 言 扩 展3.6.12 结 构 、 联 合 、 枚 举 和 位 域 扩 展支 持 以 下 结 构 、 联 合 、 枚 举 和 位 域 扩 展 :• 在 C 中 , 文 件 范 围 数 组 的 元 素 类 型 可 以 是 不 完 整 的 struct 或 union 类 型 。在 需 要 使 用 元 素 类 型 大 小 之 前 , 元 素 类 型 必 须 是 完 整 的 , 例 如 , 如 果 为 数组 加 下 标 。 如 果 数 组 不 是 extern, 则 元 素 类 型 在 编 译 结 束 时 必 须 是 完 整的 。• 可 以 忽 略 struct 或 union 说 明 符 的 右 花 括 号 } 前 面 的 最 后 一 个 分 号 。 将 发出 警 告 。• 不 需 要 使 用 花 括 号 将 用 于 初 始 化 整 个 静 态 数 组 struct 或 union 的 初 始 值 设定 项 单 值 表 达 式 括 起 来 。 ISO C 要 求 使 用 花 括 号 。• 支 持 一 种 扩 展 以 实 现 类 似 于 C++ 匿 名 联 合 的 结 构 , 其 中 包 括 以 下 内 容 :— 不 仅 允 许 使 用 匿 名 联 合 , 而 且 还 允 许 使 用 匿 名 结 构 。 匿 名 结 构 的 成员 将 升 级 为 包 含 struct 的 范 围 , 并 且 像 普 通 成 员 一 样 对 其 进 行 查 找 。— 可 通 过 typedef 名 称 将 其 引 入 到 包 含 struct 中 。 即 , 不 需 要 像 真 正 匿名 联 合 那 样 直 接 对 其 进 行 声 明 。— 可 以 声 明 标 签 , 但 只 能 在 C 模 式 下 进 行 声 明 。要 能 够 支 持 匿 名 结 构 和 联 合 , 必 须 使 用 anon_unions 编 译 指 示 。• 允 许 在 enum 列 表 末 尾 附 加 一 个 逗 号 , 但 会 发 出 备 注 消 息 。• enum 标 签 可 以 是 不 完 整 的 。 通 过 指 定 用 花 括 号 括 起 来 的 列 表 , 可 以 定 义 标签 名 称 并 在 以 后 对 其 进 行 解 析 。• 可 以 由 计 算 结 果 为 无 符 号 量 的 表 达 式 给 出 枚 举 常 数 值 , 无 符 号 量 适 用 于unsigned int 范 围 , 而 不 适 用 于 int 范 围 。 例 如 :/* When ints are 32 bits: */enum a { w = -2147483648 }; /* No error */enum b { x = 0x80000000 }; /* No error */enum c { y = 0x80000001 }; /* No error */enum d { z = 2147483649 }; /* Error */• 位 域 可 以 具 有 基 础 类 型 , 即 enum 类 型 或 整 型 ( 含 int 和 unsigned int)。另 请 参 阅• 第 4-55 页 的 编 译 指 示• 结 构 、 联 合 、 枚 举 和 位 域 扩 展• 《 编 译 器 用 户 指 南 》 中 第 5-43 页 的 C99 的 新 功 能 。3-22 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展3.7 GNU 语 言 扩 展本 节 介 绍 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。 仅 在 GNU 模 式 下 支 持 这 些 扩展 , 即 , 使 用 --gnu 选 项 编 译 源 代 码 时 。 有 关 详 细 信 息 , 请 参 阅 第 1-6 页 的 语 言遵 从 性 和 第 2-66 页 的 --gnu。注 意并 非 所 有 语 言 都 支 持 各 种 GNU 编 译 器 扩 展 。 例 如 , C++ 不 支 持 扩 展 的 指 针 算法 。有 关 使 用 GNU 扩 展 的 详 细 信 息 , 请 参 阅 http://gcc.gnu.org 上 的 在 线 GNU 编 译器 文 档 。有 关 <strong>ARM</strong> 编 译 器 的 其 他 参 考 材 料 , 另 请 参 阅 :• 附 录 B 标 准 C 实 现 定 义• 附 录 C 标 准 C++ 实 现 定 义• 附 录 D C 和 C++ 编 译 器 实 现 限 制3.7.1 替 代 关 键 字编 译 器 可 识 别 __keyword__ 形 式 的 替 代 关 键 字 。 这 些 替 代 关 键 字 具 有 与 原 始 关 键字 相 同 的 行 为 。示 例__const__ int pi = 3.14; // same as const int pi = 3.143.7.2 asm 关 键 字此 关 键 字 是 __asm 关 键 字 的 同 义 词 。模 式仅 在 C90 和 C99 的 GNU 模 式 下 支 持 。另 请 参 阅• 第 4-5 页 的 __asm<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-23ID090708Non-Confidential, Unrestricted Access


语 言 扩 展3.7.3 条 件 范 围可 以 在 switch 语 句 中 指 定 值 范 围 。示 例int Case_Ranges_0(int arg){int aLocal;int bLocal =arg;switch (bLocal){case 0 ... 10:aLocal= 1;break;case 11 ... 100:aLocal =2;break;default:aLocal=-1;}return aLocal;}3.7.4 union 类 型 转 换到 union 类 型 的 转 换 类 似 于 其 他 类 型 转 换 , 只 不 过 指 定 的 类 型 是 union 类 型 。 可以 使 用 union 标 签 或 typedef 名 称 指 定 类 型 。模 式仅 在 C90 和 C99 的 GNU 模 式 下 支 持 。示 例typedef union{double d;int i;} foo_t;int Cast_to_Union_0(int a, double b){foo_t u;if (a>100)u = (foo_t) a ; // automatically equivalent to u.i=a;else3-24 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展}u = (foo_t) b ; // automatically equivalent to u.d=b;return u.i;3.7.5 字 符 转 义 序 列在 字 符 串 中 , 转 义 序 列 ‘\e’ 被 视 为 转 义 字 符 (ASCII 27)。示 例void foo(void){printf("Escape sequence is: \e\n");}3.7.6 复 合 文 字与 在 C99 中 一 样 , 支 持 复 合 文 字 。 所 有 复 合 文 字 都 是 左 值 。示 例int y[] = (int []) {1, 2, 3}; // error in strict C99, okay in C99 --gnuint z[] = (int [3]) {1};模 式仅 在 C90 和 C99 的 GNU 模 式 下 支 持 。注 意也 可 以 在 C99 中 将 复 合 文 字 用 作 初 始 值 设 定 项 。 但 是 , 编 译 器 对 在 GNU 模 式 下视 为 初 始 值 设 定 项 的 复 合 文 字 的 要 求 比 编 译 C99 源 代 码 时 的 要 求 宽 松 一 些 。3.7.7 条 件 语 句如 果 结 果 与 测 试 相 同 , 则 条 件 语 句 中 的 中 间 操 作 数 可 以 忽 略 。例 如 :示 例以 下 语 句 是 等 效 的 :c = i ? : j; // middle operand omittedc = i ? i : j;<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-25ID090708Non-Confidential, Unrestricted Access


语 言 扩 展if (i) c = i; else c = j; // expanded in full如 果 测 试 以 某 种 方 式 修 改 了 值 , 这 是 非 常 有 用 的 , 例 如 :i++ ? : j;其 中 , i++ 来 自 宏 。 如 果 以 这 种 方 式 编 写 代 码 , 则 只 计 算 i++ 一 次 。如 果 i 的 原 始 值 不 为 零 , 则 结 果 为 i 的 原 始 值 。 无 论 此 结 果 如 何 ,i 都 会 增 加 一次 。模 式仅 在 GNU 模 式 下 支 持 。 支 持 的 语 言 为 C90、 C99 和 C++。3.7.8 指 定 的 初 始 值 设 定 项与 在 C99 中 一 样 , 支 持 指 定 的 初 始 值 设 定 项 。示 例int a[6] = { [4] = 29, [2] = 15 };int b[6] = { 0,0,15,0,29,0 }; // a[] is equivalent to b[]模 式仅 在 C90 和 C++ 的 GNU 模 式 下 支 持 。另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 5-43 页 的 C99 的 新 功 能 。3.7.9 扩 展 的 左 值在 GNU 模 式 下 , 在 查 看 逗 号 表 达 式 和 ?: 结 构 时 对 构 成 左 值 的 内 容 的 定 义 较 为宽 松 。 可 以 使 用 复 合 表 达 式 、 条 件 表 达 式 和 类 型 转 换 , 如 下 所 示 :• 可 以 指 定 复 合 表 达 式 :(a++, b) += x;这 相 当 于 :temp = (a++,b);b = temp + x• 可 以 获 取 复 合 表 达 式 &(a, b) 的 地 址 。 这 相 当 于 (a, &b)。3-26 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展• 可 以 使 用 条 件 表 达 式 , 例 如 :(a ? b : c) = a;这 会 选 取 b 或 c 作 为 目 标 , 具 体 取 决 于 a。模 式仅 在 C90 和 C99 的 GNU 模 式 下 支 持 。3.7.10 初 始 值 设 定 项与 在 标 准 C++ 和 ISO C99 中 一 样 , 自 动 变 量 的 聚 合 初 始 值 设 定 项 元 素 不 需 要 是常 数 表 达 式 。模 式仅 在 C90 的 GNU 模 式 下 支 持 。示 例float Initializers_0 (float f, float g){float beat_freqs[2] = { f-g, f+g };float aLocal;int i=0;for (; i


语 言 扩 展在 非 GNU 模 式 下 , 忽 略 extern, 并 且 功 能 与 C++ 的 inline foo() 相同 。 在 C 中 , 必 须 使 用 __inline。 有 关 详 细 信 息 , 请 参 阅 第 5-18 页的 外 部 内 联 函 数 。模 式仅 在 C90 的 GNU 模 式 下 支 持 。3.7.12 标 签 用 作 值编 译 器 支 持 使 用 && 运 算 符 将 GCC 用 作 值 。模 式在 C 和 C++ 的 GNU 模 式 下 支 持 。示 例标 签 表 :int f(int n){void *const table[] = { &&a1, &&a2};goto *table[n];a1: return 1;a2: return 2;}用 于 表 示 继 续 的 标 签 :void *toggle(void *lab, int *x){if (lab) goto *lab;a1: *x = 1; return &&a2;a2: *x = 0; return &&a1;}3.7.13 指 针 算 法可 以 执 行 有 关 void 指 针 和 函 数 指 针 的 算 法 。void 类 型 或 函 数 类 型 的 大 小 被 定 义 为 1。3-28 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


语 言 扩 展模 式仅 在 C90 和 C99 的 GNU 模 式 下 支 持 。错 误如 果 编 译 器 检 测 到 有 关 void 指 针 或 函 数 指 针 的 算 法 , 则 会 生 成 警 告 。示 例int ptr_arith_0(void){void * pointer;return sizeof *pointer;}int ptr_arith_1(void){static int diff;diff = ptr_arith_0 - ptr_arith_1;return sizeof ptr_arith_0;}3.7.14 语 句 表 达 式语 句 表 达 式 允 许 将 包 括 声 明 在 内 的 整 段 代 码 放 在 花 括 号 ({ }) 中 。语 句 表 达 式 的 结 果 是 语 句 列 表 中 的 最 后 一 项 。限 制不 允 许 使 用 以 语 句 表 达 式 为 目 标 的 跳 转 。在 C++ 模 式 中 , 还 不 允 许 跳 转 出 去 。 在 语 句 表 达 式 中 , 不 允 许 使 用 变 长 数 组 、可 析 构 的 实 体 、 try 语 句 、 捕 获 、 局 部 非 POD 类 定 义 以 及 动 态 初 始 化 的 局 部 静态 变 量 。示 例int bar(int b, int foo){if (({int y = foo;int z;if (y > 0) z = y;else z = -y;z>b;<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 3-29ID090708Non-Confidential, Unrestricted Access


语 言 扩 展}}))b++;return b;3.7.15 未 命 名 的 字 段将 结 构 或 联 合 嵌 入 到 另 一 个 结 构 或 联 合 中 时 , 不 需 要 命 名 内 部 结 构 。 可 以 访 问未 命 名 结 构 的 内 容 , 而 无 需 使 用 .name 引 用 它 。未 命 名 的 字 段 与 匿 名 联 合 和 结 构 相 同 。模 式仅 在 C90 和 C99 的 GNU 模 式 下 支 持 。示 例struct{int a;union{int b;float c;};int d;} Unnamed_Fields_0;int Unnamed_Fields_1(){return Unnamed_Fields_0.b;}另 请 参 阅• 第 3-19 页 的 匿 名 类 、 结 构 和 联 合3-30 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


第 4 章编 译 器 特 有 的 功 能本 章 介 绍 <strong>ARM</strong> 编 译 器 特 有 的 功 能 , 包 括 :• 第 4-2 页 的 关 键 字 和 运 算 符• 第 4-24 页 的 __declspec 属 性• 第 4-31 页 的 函 数 属 性• 第 4-42 页 的 类 型 属 性• 第 4-46 页 的 变 量 属 性• 第 4-55 页 的 编 译 指 示• 第 4-71 页 的 指 令 内 在 函 数• 第 4-111 页 的 VFP 状 态 内 在 函 数• 第 4-112 页 的 GNU 内 置 函 数• 第 4-115 页 的 编 译 器 预 定 义<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-1ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.1 关 键 字 和 运 算 符本 节 介 绍 <strong>ARM</strong> 编 译 器 armcc 支 持 的 函 数 关 键 字 和 运 算 符 。表 4-1 列 出 的 关 键 字 是 <strong>ARM</strong> 对 C 和 C++ 标 准 的 扩 展 。 表 中 没 有 介 绍 不 具 备<strong>ARM</strong> 编 译 器 特 有 的 行 为 或 限 制 的 标 准 C 和 C++ 关 键 字 。关 键 字__align __int64 __svc表 4-1 <strong>ARM</strong> 编 译 器 支 持 的 关 键 字 扩 展__ALIGNOF__ __INTADDR__ __svc_indirect__asm __irq __svc_indirect_r7__declspec __packed __value_in_regs__forceinline __pure __weak__global_reg __softfp __writeonly__inline__smc4.1.1 __align__align 关 键 字 指 示 编 译 器 在 n 字 节 边 界 上 对 齐 变 量 。__align 是 一 个 存 储 类 修 饰 符 。 它 不 影 响 函 数 的 类 型 。语 法__align(n)其 中 :n 是 对 齐 边 界 。对 于 局 部 变 量 , n 值 可 为 1、 2、 4 或 8。对 于 全 局 变 量 ,n 可 以 具 有 最 大 为 2 的 0x80000000 次 幂 的 任 何 值 。__align 关 键 字 紧 靠 变 量 名 称 前 面 放 置 。4-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能用 法如 果 声 明 的 变 量 的 常 规 对 齐 边 界 小 于 n, __align(n) 是 非 常 有 用 的 。 八 字 节 对 齐方 式 可 以 显 著 提 高 VFP 指 令 的 性 能 。可 以 将 __align 与 extern 和 static 一 起 使 用 。限 制由 于 __align 是 存 储 类 修 饰 符 , 因 此 不 能 将 其 用 于 :• 类 型 , 包 括 typedef 和 结 构 定 义• 函 数 参 数 。只 能 进 行 过 对 齐 。 也 就 是 说 , 可 以 将 两 个 字 节 的 对 象 按 4 个 字 节 对 齐 , 而 不 能将 4 个 字 节 的 对 象 按 两 个 字 节 对 齐 。示 例__align(8) char buffer[128]; // buffer starts on eight-byte boundaryvoid foo(void){...__align(16) int i; // this alignment value is not permitted for// a local variable...}__align(16) int i; // permitted as a global variable.另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 2-89 页 的 --min_array_alignment=opt4.1.2 __alignof__可 以 使 用 __alignof__ 关 键 字 查 询 有 关 类 型 或 变 量 的 对 齐 信 息 。注 意此 关 键 字 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。语 法__alignof__(type)<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-3ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能__alignof__(expr)其 中 :type 是 类 型expr 是 左 值 。返 回 值__alignof__(type) 返 回 类 型 type 的 对 齐 要 求 ; 如 果 没 有 对 齐 要 求 , 则 返 回 1。__alignof__(expr) 返 回 左 值 expr 的 类 型 的 对 齐 要 求 ; 如 果 没 有 对 齐 要 求 , 则 返回 1。示 例int Alignment_0(void){return __alignof__(int);}另 请 参 阅• __ALIGNOF__4.1.3 __ALIGNOF____ALIGNOF__ 关 键 字 返 回 指 定 类 型 的 对 齐 要 求 , 或 者 返 回 指 定 对 象 的 类 型 的 对 齐要 求 。语 法__ALIGNOF__(type)__ALIGNOF__(expr)其 中 :type 是 类 型expr 是 左 值 。返 回 值__ALIGNOF__(type) 返 回 类 型 type 的 对 齐 要 求 ; 如 果 没 有 对 齐 要 求 , 则 返 回 1。4-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能__ALIGNOF__(expr) 返 回 左 值 expr 的 类 型 的 对 齐 要 求 ; 如 果 没 有 对 齐 要 求 , 则 返回 1。 不 会 计 算 左 值 本 身 的 结 果 。示 例typedef struct s_foo { int i; short j; } foo;typedef __packed struct s_bar { int i; short j; } bar;return __ALIGNOF(struct s_foo); // returns 4return __ALIGNOF(foo); // returns 4return __ALIGNOF(bar); // returns 1另 请 参 阅• 第 4-3 页 的 __alignof__4.1.4 __asm此 关 键 字 用 于 将 信 息 从 编 译 器 传 递 到 <strong>ARM</strong> 汇 编 器 armasm。此 关 键 字 执 行 的 精 确 操 作 取 决 于 其 用 法 。用 法嵌 入 式 汇 编 器可 以 使 用 __asm 关 键 字 声 明 或 定 义 嵌 入 式 汇 编 函 数 。 例 如 :__asm void my_strcpy(const char *src, char *dst);有 关 详 细 信 息 , 请 参 阅 《 编 译 器 用 户 指 南 》 中 第 7-16 页 的 嵌 入 式汇 编 器 。内 联 汇 编 器可 以 使 用 __asm 关 键 字 将 内 联 汇 编 合 并 到 函 数 中 。 例 如 :int qadd(int i, int j){int res;__asm{QADD res, i, j}return res;}有 关 详 细 信 息 , 请 参 阅 《 编 译 器 用 户 指 南 》 中 第 7-2 页 的 内 联 汇 编器 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-5ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能汇 编 器 标 签可 以 使 用 __asm 关 键 字 为 C 符 号 指 定 汇 编 器 标 签 。 例 如 :int count __asm__("count_v1"); // export count_v1, not count有 关 详 细 信 息 , 请 参 阅 第 3-20 页 的 汇 编 器 标 签 。已 命 名 的 寄 存 器 变 量可 以 使 用 __asm 关 键 字 声 明 已 命 名 的 寄 存 器 变 量 。 例 如 :register int foo __asm("r0");有 关 详 细 信 息 , 请 参 阅 第 4-108 页 的 已 命 名 的 寄 存 器 变 量 。另 请 参 阅• 第 3-23 页 的 asm 关 键 字4.1.5 __forceinline__forceinline 关 键 字 强 制 编 译 器 内 联 编 译 C 或 C++ 函 数 。__forceinline 的 语 义 与 C++ inline 关 键 字 的 语 义 完 全 相 同 。 编 译 器 尝 试 内 联 限定 为 __forceinline 的 函 数 , 而 不 考 虑 其 特 性 。 但 是 , 如 果 这 样 做 导 致 出 现 问题 , 编 译 器 将 不 内 联 函 数 。 例 如 , 递 归 函 数 仅 内 联 到 本 身 一 次 。__forceinline 是 一 个 存 储 类 限 定 符 。 它 不 影 响 函 数 的 类 型 。注 意此 关 键 字 具 有 等 效 的 函 数 属 性 __attribute__((always_inline))。示 例__forceinline static int max(int x, in y){return x > y ? x : y; // always inline if possible}另 请 参 阅• 第 2-58 页 的 --forceinline• 第 4-33 页 的 __attribute__((always_inline))4-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.1.6 __global_reg__global_reg 存 储 类 说 明 符 将 声 明 的 变 量 分 配 给 全 局 变 量 寄 存 器 。语 法__global_reg(n) type varName其 中 :n 是 1 到 8 之 间 的 整 数 。type 是 以 下 类 型 之 一 :• 除 long long 之 外 的 任 何 整 型• 任 何 字 符 类 型• 任 何 指 针 类 型 。varName 是 变 量 名 称 。限 制如 果 使 用 此 存 储 类 , 则 无 法 使 用 任 何 其 他 存 储 类 , 如 extern、 static 或typedef。在 C 中 , 不 能 在 声 明 时 限 定 或 初 始 化 全 局 寄 存 器 变 量 。 在 C++ 中 , 任 何 初 始 化均 被 视 为 动 态 初 始 化 。可 用 寄 存 器 的 数 量 因 所 使 用 的 AAPCS 变 体 而 异 , 有 5 到 7 个 寄 存 器 可 用 作 全 局变 量 寄 存 器 。实 际 上 , 使 用 全 局 寄 存 器 变 量 时 , 建 议 :• <strong>ARM</strong> 或 Thumb-2 中 不 要 超 过 三 个 全 局 寄 存 器 变 量• Thumb-1 中 不 要 超 过 一 个 全 局 寄 存 器 变 量• 全 局 浮 点 寄 存 器 变 量 不 要 超 过 可 用 浮 点 寄 存 器 数 量 的 一 半 。如 果 声 明 的 全 局 变 量 太 多 , 代 码 大 小 会 显 著 增 加 。 在 某 些 情 况 下 , 程 序 可 能 无法 进 行 编 译 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-7ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能小 心在 使 用 全 局 寄 存 器 变 量 时 必 须 小 心 , 原 因 如 下 :• 在 链 接 时 不 进 行 检 查 , 因 而 无 法 保 证 不 同 编 译 单 元 之 间 的 直 接 调 用 是 合 理的 。 如 果 可 能 , 请 在 程 序 的 每 个 编 译 单 元 内 定 义 程 序 中 使 用 的 全 局 寄 存 器变 量 。 通 常 , 最 好 将 定 义 放 在 全 局 头 文 件 中 。 在 使 用 全 局 寄 存 器 之 前 , 必须 及 早 在 代 码 中 设 置 寄 存 器 内 的 值 。• 全 局 寄 存 器 变 量 映 射 到 由 被 调 用 方 保 存 的 寄 存 器 , 因 此 , 对 于 未 将 该 变 量用 作 全 局 寄 存 器 变 量 的 编 译 单 元 , 将 通 过 函 数 调 用 来 保 存 和 恢 复 它 的 值 ,例 如 , 库 函 数 。• 回 调 使 用 全 局 寄 存 器 变 量 的 编 译 单 元 是 很 危 险 的 。 例 如 , 如 果 从 未 声 明 某个 全 局 寄 存 器 变 量 的 编 译 单 元 中 调 用 使 用 该 全 局 寄 存 器 的 函 数 , 函 数 将 从其 假 定 的 全 局 寄 存 器 变 量 中 读 取 错 误 的 值 。• 只 能 在 文 件 范 围 内 使 用 此 存 储 类 。示 例示 例 4-1 声 明 一 个 分 配 给 r5 的 全 局 变 量 寄 存 器 。示 例 4-1 声 明 全 局 整 数 寄 存 器 变 量__global_reg(2) int x; v2 is the synonym for r5示 例 4-2 将 生 成 错 误 , 因 为 必 须 在 同 一 变 量 的 所 有 声 明 中 指 定 全 局 寄 存 器 。示 例 4-2 全 局 寄 存 器 - 声 明 错 误int x;__global_reg(1) int x; // error在 C 中 , 无 法 在 定 义 时 初 始 化 __global_reg 变 量 。 第 4-9 页 的 示 例 4-3 在 C 中 生成 错 误 , 而 在 C++ 中 不 生 成 错 误 。4-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能示 例 4-3 全 局 寄 存 器 - 初 始 化 错 误__global_reg(1) int x=1; // error in C, OK in C++另 请 参 阅• 第 2-66 页 的 --global_reg=reg_name[,reg_name,...]4.1.7 __inline__inline 关 键 字 提 示 编 译 器 在 合 理 的 情 况 下 内 联 编 译 C 或 C++ 函 数 。__inline 的 语 义 与 inline 关 键 字 的 语 义 完 全 相 同 。 但 C90 中 不 提 供 inline。__inline 是 一 个 存 储 类 限 定 符 。 它 不 影 响 函 数 的 类 型 。示 例__inline int f(int x){return x*5+1;}int g(int x, int y){return f(x) + f(y);}另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 5-16 页 的 函 数 内 联 。4.1.8 __int64__int64 关 键 字 是 关 键 字 序 列 long long 的 同 义 词 。即 使 在 使 用 --strict 时 , 也 接 受 __int64。另 请 参 阅• 第 2-116 页 的 --strict, --no_strict• 第 3-7 页 的 long long<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-9ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.1.9 __INTADDR____INTADDR__ 运 算 将 包 含 的 表 达 式 作 为 常 数 表 达 式 处 理 , 并 将 其 转 换 为 整 型 常数 。注 意它 用 于 offsetof 宏 。语 法__INTADDR(expr)其 中 :expr 是 整 型 常 数 表 达 式 。返 回 值__INTADDR__(expr) 返 回 一 个 与 expr 等 效 的 整 型 常 数 。另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 7-18 页 的 嵌 入 式 汇 编 程 序 的 限 制 。4.1.10 __irq通 过 使 用 __irq 关 键 字 , 可 以 将 C 或 C++ 函 数 用 作 中 断 例 程 。__irq 是 一 个 函 数 限 定 符 。 它 影 响 函 数 的 类 型 。限 制将 保 留 所 有 损 坏 的 寄 存 器 ( 浮 点 寄 存 器 除 外 ), 而 不 仅 限 于 通 常 在 AAPCS 中保 留 的 寄 存 器 。 必 须 使 用 缺 省 AAPCS 模 式 。通 过 将 程 序 计 数 器 设 置 为 lr-4 并 将 CPSR 设 置 为 SPSR 中 的 值 , 可 以 退 出 该 函 数 。__irq 函 数 不 能 使 用 任 何 参 数 或 返 回 值 。注 意针 对 纯 Thumb 指 令 模 式 的 处 理 器 进 行 编 译 时 , 代 码 将 被 编 译 为 Thumb 代 码 , 因为 在 Thumb 状 态 中 进 入 中 断 处 理 程 序 。 否 则 , 即 使 使 用 --thumb 选 项 或 #pragmathumb 来 编 译 Thumb 指 令 , 指 定 为 __irq 的 任 何 函 数 都 将 被 编 译 为 <strong>ARM</strong> 代 码 。4-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能另 请 参 阅• 第 2-119 页 的 --thumb• 第 4-70 页 的 #pragma thumb• 《 开 发 指 南 》 中 的 第 6 章 处 理 处 理 器 异 常 。4.1.11 __packed__packed 限 定 符 将 所 有 有 效 类 型 的 对 齐 边 界 设 置 为 1。 这 就 意 味 着 :• 不 会 插 入 填 充 以 对 齐 压 缩 对 象• 使 用 未 对 齐 的 访 问 读 取 或 写 入 压 缩 类 型 的 对 象 。使 用 __packed 限 定 符 声 明 结 构 或 联 合 后 ,__packed 将 应 用 于 该 结 构 或 联 合 的 所 有成 员 。 成 员 之 间 或 结 构 末 尾 均 没 有 填 充 。 必 须 使 用 __packed 声 明 压 缩 结 构 的 所有 子 结 构 。 可 以 单 独 压 缩 非 压 缩 结 构 的 整 型 子 字 段 。用 法若 要 将 结 构 映 射 到 外 部 数 据 结 构 或 访 问 未 对 齐 数 据 , __packed 限 定 符 非 常 有 用; 但 由 于 访 问 开 销 相 对 较 高 , 通 常 对 节 省 数 据 大 小 并 没 有 什 么 帮 助 。 通 过 仅 对需 要 压 缩 的 结 构 中 的 字 段 进 行 压 缩 , 可 以 减 少 未 对 齐 访 问 的 数 量 。注 意在 硬 件 中 不 支 持 未 对 齐 访 问 的 <strong>ARM</strong> 处 理 器 ( 例 如 , <strong>ARM</strong>v6 之 前 的 处 理 器 )上 , 访 问 未 对 齐 的 数 据 时 可 能 会 在 代 码 大 小 和 执 行 速 度 方 面 产 生 较 高 的 成 本 。必 须 最 大 限 度 减 少 通 过 压 缩 结 构 进 行 的 数 据 访 问 , 以 避 免 增 加 代 码 大 小 和 降 低性 能 。限 制以 下 限 制 适 用 于 使 用 __packed 的 场 合 :• __packed 限 定 符 不 能 用 于 以 前 未 使 用 __packed 声 明 的 结 构 。• 与 其 他 类 型 限 定 符 不 同 , 不 能 同 时 具 有 同 一 结 构 类 型 的 __packed 版 本 和 非__packed 版 本 。• __packed 限 定 符 不 影 响 整 型 局 部 变 量 。• 压 缩 结 构 或 联 合 与 相 应 的 非 压 缩 结 构 的 分 配 不 兼 容 。 由 于 这 些 结 构 具 有 不同 的 内 存 布 局 , 因 此 , 将 压 缩 结 构 分 配 给 非 压 缩 结 构 的 唯 一 办 法 是 逐 个 字段 进 行 复 制 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-11ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能• 没 有 定 义 对 __packed 进 行 类 型 转 换 所 产 生 的 影 响 。 也 没 有 定 义 将 非 压 缩 结构 类 型 转 换 为 压 缩 结 构 类 型 所 产 生 的 影 响 。 可 以 合 法 地 将 指 向 整 型 的 指 针类 型 显 式 或 隐 式 转 换 为 指 向 压 缩 整 型 的 指 针 类 型 。 也 可 以 对 char 类 型 进 行__packed 类 型 转 换 。• 不 存 在 压 缩 数 组 类 型 。 压 缩 数 组 是 指 具 有 压 缩 类 型 的 对 象 数 组 。 数 组 中 没有 进 行 填 充 。示 例示 例 4-4 说 明 指 针 可 以 指 向 压 缩 类 型 。示 例 4-4 指 向 压 缩 类 型 的 指 针typedef __packed int* PpI; /* pointer to a __packed int */__packed int *p; /* pointer to a __packed int */PpI p2; /* 'p2' has the same type as 'p' *//* __packed is a qualifier *//* like 'const' or 'volatile' */typedef int *PI; /* pointer to int */__packed PI p3; /* a __packed pointer to a normal int *//* -- not the same type as 'p' and 'p2' */int *__packed p4; /* 'p4' has the same type as 'p3' */示 例 4-5 说 明 了 使 用 指 针 访 问 压 缩 对 象 时 , 编 译 器 可 生 成 有 效 代 码 , 并 且 代 码与 指 针 对 齐 方 式 无 关 。示 例 4-5 压 缩 结 构typedef __packed struct{char x;// all fields inherit the __packed qualifierint y;} X; // 5 byte structure, natural alignment = 1int f(X *p){return p->y;// does an unaligned read}typedef struct{short x;char y;__packed int z;// only pack this fieldchar a;4-12 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能} Y; // 8 byte structure, natural alignment = 2int g(Y *p){return p->z + p->x; // only unaligned read for z}另 请 参 阅• 第 4-50 页 的 __attribute__((packed))• 第 4-65 页 的 #pragma pack(n)• 第 5-10 页 的 压 缩 结 构• 《 编 译 器 用 户 指 南 》 中 第 5-25 页 的 __packed 限 定 符 和 未 对 齐 的 数 据 访 问• 《 编 译 器 用 户 指 南 》 中 第 5-27 页 的 __packed 结 构 与 单 个 __packed 字 段4.1.12 __pure__pure 关 键 字 指 明 声 明 的 函 数 为 纯 函 数 。只 有 在 以 下 情 况 下 , 函 数 才 是 纯 函 数 :• 结 果 仅 取 决 于 其 自 变 量 值• 函 数 没 有 副 作 用 。__pure 是 一 个 函 数 限 定 符 。 它 影 响 函 数 的 类 型 。注 意此 关 键 字 具 有 等 效 的 函 数 属 性 __attribute__((const))。缺 省 设 置缺 省 情 况 下 , 假 定 函 数 不 是 纯 函 数 。用 法可 以 选 择 纯 函 数 来 删 除 公 共 子 表 达 式 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-13ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能限 制声 明 为 纯 函 数 的 函 数 可 能 没 有 副 作 用 。 例 如 , 纯 函 数 :• 无 法 调 用 非 纯 函 数• 无 法 使 用 全 局 变 量 或 解 除 引 用 的 指 针 , 因 为 编 译 器 假 定 函 数 无 法 访 问 内 存( 堆 栈 内 存 除 外 )• 使 用 相 同 参 数 两 次 调 用 纯 函 数 时 , 每 次 必 须 返 回 相 同 的 值 。示 例int factr(int n) __pure{int f = 1;while (n > 0)f *= n--;return f;}另 请 参 阅• 第 4-33 页 的 __attribute__((const))• 《 编 译 器 用 户 指 南 》 中 第 5-13 页 的 __pure• 《 编 译 器 用 户 指 南 》 中 第 5-14 页 的 放 置 <strong>ARM</strong> 函 数 限 定 符4.1.13 __smc__smc 关 键 字 声 明 SMC ( 安 全 监 控 调 用 ) 函 数 。 SMC 函 数 调 用 在 编 译 器 生 成 的指 令 流 中 插 入 一 个 SMC 指 令 ( 在 函 数 调 用 位 置 )。注 意SMC 指 令 替 代 以 前 版 本 的 <strong>ARM</strong> 汇 编 语 言 中 使 用 的 SMI 指 令 。__smc 是 一 个 函 数 限 定 符 。 它 影 响 函 数 的 类 型 。4-14 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能语 法__smc(int smc_num) return-type function-name([argument-list]);其 中 :smc_num 是 SMC 指 令 中 使 用 的 4 位 立 即 值 。<strong>ARM</strong> 处 理 器 忽 略 smc_num 值 , 但 SMC 异 常 处 理 程 序 可 以 使用 它 来 确 定 所 请 求 的 服 务 。限 制如 果 所 选 的 基 于 <strong>ARM</strong> 体 系 结 构 的 处 理 器 具 有 安 全 扩 展 , 则 它 们 可 以 使 用 SMC 指令 。 有 关 详 细 信 息 , 请 参 阅 《 汇 编 器 指 南 》 中 第 4-136 页 的 SMC。如 果 针 对 不 支 持 SMC 指 令 的 体 系 结 构 编 译 包 含 __smc 关 键 字 的 源 代 码 , 编 译 器 将生 成 错 误 。示 例__smc(5) void mycall(void); /* declare a name by which SMC #5 can be called */...mycall(); /* invoke the function */另 请 参 阅• 《 汇 编 器 指 南 》 中 第 4-136 页 的 SMC。4.1.14 __softfp__softfp 关 键 字 指 明 函 数 使 用 软 件 浮 点 链 接 。__softfp 是 一 个 函 数 限 定 符 。 它 影 响 函 数 的 类 型 。注 意此 关 键 字 具 有 等 效 的 #pragma #pragma __softfp_linkage。用 法对 该 函 数 的 调 用 将 在 整 数 寄 存 器 中 传 递 浮 点 自 变 量 。 如 果 结 果 是 浮 点 值 , 则 在整 数 寄 存 器 中 返 回 该 值 。 这 与 针 对 软 件 浮 点 的 编 译 行 为 是 相 同 的 。该 关 键 字 允 许 编 译 的 源 代 码 使 用 相 同 的 库 , 以 便 使 用 硬 件 和 软 件 浮 点 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-15ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能注 意在 C++ 中 , 如 果 要 覆 盖 使 用 __softfp 关 键 字 限 定 的 虚 拟 函 数 , 还 必 须 将 覆 盖 函数 声 明 为 __softfp。 如 果 这 些 函 数 不 匹 配 , 编 译 器 将 生 成 错 误 。另 请 参 阅• 第 2-61 页 的 --fpu=name• 第 4-67 页 的 #pragma softfp_linkage, #pragmano_softfp_linkage• 《 编 译 器 用 户 指 南 》 中 第 5-35 页 的 浮 点 计 算 和 链 接 。4.1.15 __svc__svc 关 键 字 声 明 超 级 用 户 调 用 (SVC) 函 数 , 该 函 数 最 多 使 用 四 个 类 似 于 整 数 的参 数 , 并 通 过 value_in_regs 结 构 最 多 返 回 四 个 结 果 。__svc 是 一 个 函 数 限 定 符 。 它 影 响 函 数 的 类 型 。语 法__svc(int svc_num) return-type function-name([argument-list]);其 中 :svc_num 是 在 SVC 指 令 中 使 用 的 立 即 值 。它 是 一 个 表 达 式 , 其 计 算 结 果 为 以 下 范 围 内 的 整 数 :• 在 <strong>ARM</strong> 指 令 中 为 0 到 2 24 –1 (24 位 值 )• 在 16 位 Thumb 指 令 中 为 0-255 (8 位 值 )。用 法这 导 致 将 函 数 调 用 作 为 与 AAPCS 兼 容 的 运 算 进 行 内 联 编 译 , 此 运 算 的 行 为 与普 通 函 数 调 用 类 似 。__value_in_regs 限 定 符 可 用 于 指 定 在 寄 存 器 中 最 多 返 回 16 个 字 节 的 小 型 结 构 ,而 不 是 由 AAPCS 中 定 义 的 常 用 结 构 传 递 机 制 返 回 。4-16 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能示 例__svc(42) void terminate_1(int procnum); // terminate_1 returns no results__svc(42) int terminate_2(int procnum); // terminate_2 returns one resulttypedef struct res_type{int res_1;int res_2;int res_3;int res_4;} res_type;__svc(42) __value_in_regs res_type terminate_3(int procnum);// terminate_3 returns more than// one result错 误在 命 令 行 中 使 用 --cpu 选 项 指 定 不 支 持 SVC 指 令 的 <strong>ARM</strong> 体 系 结 构 版 本 或 基 于<strong>ARM</strong> 体 系 结 构 的 处 理 器 时 , 编 译 器 将 生 成 错 误 。另 请 参 阅• 第 2-30 页 的 --cpu=name• 第 4-19 页 的 __value_in_regs• 《 汇 编 器 指 南 》 中 第 4-129 页 的 SVC。4.1.16 __svc_indirect__svc_indirect 关 键 字 在 r12 中 向 SVC 处 理 程 序 传 递 操 作 码 。__svc_indirect 是 一 个 函 数 限 定 符 。 它 影 响 函 数 的 类 型 。语 法__svc_indirect(int svc_num)return-type function-name(int real_num[, argument-list]);其 中 :svc_num 是 在 SVC 指 令 中 使 用 的 立 即 值 。它 是 一 个 表 达 式 , 其 计 算 结 果 为 以 下 范 围 内 的 整 数 :• 在 <strong>ARM</strong> 指 令 中 为 0 到 2 24 –1 (24 位 值 )• 在 16 位 Thumb 指 令 中 为 0-255 (8 位 值 )。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-17ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能real_num 是 在 r12 中 传 递 给 处 理 程 序 的 值 , 用 于 确 定 要 执 行 的 函 数 。要 使 用 间 接 机 制 , 系 统 处 理 程 序 必 须 使 用 r12 值 选 择 所 需 的 运 算 。用 法可 以 使 用 此 功 能 实 现 间 接 SVC。示 例int __svc_indirect(0) ioctl(int svcino, int fn, void *argp);调 用 :ioctl(IOCTL+4, RESET, NULL);可 编 译 为 SVC #0, r12 中 为 IOCTL+4。错 误在 命 令 行 中 使 用 --cpu 选 项 指 定 不 支 持 SVC 指 令 的 <strong>ARM</strong> 体 系 结 构 版 本 或 基 于<strong>ARM</strong> 体 系 结 构 的 处 理 器 时 , 编 译 器 将 生 成 错 误 。另 请 参 阅• 第 2-30 页 的 --cpu=name• 第 4-19 页 的 __value_in_regs• 《 汇 编 器 指 南 》 中 第 4-129 页 的 SVC。4.1.17 __svc_indirect_r7__svc_indirect_r7 关 键 字 的 行 为 与 __svc_indirect 类 似 , 但 它 使 用 的 是 r7 而 不 是r12。__svc_indirect_r7 是 一 个 函 数 限 定 符 。 它 影 响 函 数 的 类 型 。语 法__svc_indirect_r7(int svc_num)return-type function-name(int real_num[, argument-list]);4-18 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能其 中 :svc_num 是 在 SVC 指 令 中 使 用 的 立 即 值 。它 是 一 个 表 达 式 , 其 计 算 结 果 为 以 下 范 围 内 的 整 数 :• 在 <strong>ARM</strong> 指 令 中 为 0 到 2 24 –1 (24 位 值 )• 在 16 位 Thumb 指 令 中 为 0-255 (8 位 值 )。real_num 是 在 r7 中 传 递 给 处 理 程 序 的 值 , 用 于 确 定 要 执 行 的 函 数 。用 法<strong>ARM</strong> Linux 上 的 Thumb 应 用 程 序 使 用 __svc_indirect_r7 进 行 内 核 系 统 调 用 。也 可 以 使 用 此 功 能 实 现 间 接 SVC。示 例long __svc_indirect_r7(0) \SVC_write(unsigned, int fd, const char * buf, size_t count);#define write(fd, buf, count) SVC_write(4, (fd), (buf), (count))调 用 :write(fd, buf, count);可 编 译 为 SVC #0, r0 = fd、 r1 = buf、 r2 = count 以 及 r7 = 4。错 误在 命 令 行 中 使 用 --cpu 选 项 指 定 不 支 持 SVC 指 令 的 <strong>ARM</strong> 体 系 结 构 版 本 或 基 于<strong>ARM</strong> 体 系 结 构 的 处 理 器 时 , 编 译 器 将 生 成 错 误 。另 请 参 阅• 第 4-19 页 的 __value_in_regs• 第 2-30 页 的 --cpu=name• 《 汇 编 器 指 南 》 中 第 4-129 页 的 SVC。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-19ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.1.18 __value_in_regs__value_in_regs 限 定 符 指 示 编 译 器 在 整 数 寄 存 器 中 最 多 返 回 四 个 整 型 字 的 结构 , 或 者 在 浮 点 寄 存 器 中 最 多 返 回 四 个 浮 点 或 双 精 度 值 , 而 不 是 使 用 内 存 。__value_in_regs 是 一 个 函 数 限 定 符 。 它 影 响 函 数 的 类 型 。语 法__value_in_regs return-type function-name([argument-list]);其 中 :return-type 是 大 小 最 多 为 四 个 字 的 结 构 类 型 。用 法调 用 返 回 多 个 结 果 的 函 数 时 , 使 用 __value_in_regs 声 明 函 数 是 非 常 有 用 的 。限 制如 果 __value_in_regs 结 构 需 要 复 制 构 造 , C++ 函 数 将 无 法 返 回 该 结 构 。如 果 要 覆 盖 声 明 为 __value_in_regs 的 虚 拟 函 数 , 还 必 须 将 覆 盖 函 数 声 明 为__value_in_regs。 如 果 这 些 函 数 不 匹 配 , 编 译 器 将 生 成 错 误 。错 误如 果 由 __value_in_regs 限 定 的 函 数 中 返 回 的 结 构 太 大 , 则 会 生 成 警 告 并 忽 略__value_in_regs 结 构 。示 例typedef struct int64_struct{unsigned int lo;unsigned int hi;} int64_struct;__value_in_regs externint64_struct mul64(unsigned a, unsigned b);另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 5-12 页 的 __value_in_regs。4-20 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.1.19 __weak此 关 键 字 指 示 编 译 器 弱 导 出 符 号 。可 以 将 __weak 关 键 字 应 用 于 函 数 和 变 量 声 明 以 及 函 数 定 义 。用 法函 数 和 变 量 声 明对 于 声 明 , 此 存 储 类 指 定 一 个 extern 对 象 声 明 , 即 使 不 存 在 , 也不 会 导 致 链 接 器 将 未 解 析 的 引 用 作 为 错 误 处 理 。例 如 :__weak void f(void);...f(); // call f weakly如 果 从 编 译 为 跳 转 或 跳 转 链 接 指 令 的 代 码 中 对 缺 少 的 弱 函 数 进 行引 用 , 则 会 :• 将 该 引 用 解 析 为 下 一 条 指 令 的 跳 转 。 这 实 际 上 将 跳 转 变 为NOP。• 将 该 跳 转 替 换 为 NOP 指 令 。函 数 定 义使 用 __weak 定 义 的 函 数 将 弱 导 出 其 符 号 。 除 非 将 相 同 名 称 的 非 弱定 义 函 数 链 接 到 相 同 映 像 上 , 否 则 弱 定 义 函 数 的 行 为 与 正 常 定 义的 函 数 类 似 。 如 果 非 弱 定 义 函 数 和 弱 定 义 函 数 位 于 相 同 映 像 中 ,则 会 将 对 弱 定 义 函 数 的 所 有 调 用 解 析 为 对 非 弱 函 数 的 调 用 。 如 果有 多 个 可 用 的 弱 定 义 , 链 接 器 将 选 择 其 中 的 一 个 弱 定 义 供 所 有 调用 使 用 。如 果 使 用 __weak 声 明 函 数 , 但 随 后 没 有 使 用 __weak 对 其 进 行 定 义 ,则 此 函 数 与 非 弱 函 数 的 行 为 相 同 。限 制使 用 __weak 限 定 函 数 和 变 量 声 明 以 及 函 数 定 义 时 , 存 在 一 些 限 制 。函 数 和 变 量 声 明在 同 一 编 译 中 , 不 能 既 弱 使 用 又 非 弱 使 用 函 数 或 变 量 。 例 如 , 以下 代 码 从 g() 和 h() 中 弱 使 用 f():void f(void);void g(){<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-21ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能f();}__weak void f(void);void h(){f();}无 法 从 定 义 某 个 函 数 或 变 量 的 同 一 编 译 中 弱 使 用 该 函 数 或 变 量 。以 下 代 码 从 h() 中 非 弱 使 用 f():__weak void f(void);void h(){f();}void f() {}链 接 器 不 会 从 库 中 加 载 函 数 或 变 量 , 除 非 其 他 编 译 非 弱 使 用 该 函数 或 变 量 。 如 果 一 直 没 有 解 析 引 用 , 则 假 定 其 值 为 NULL。 但 是 ,如 果 引 用 是 指 从 代 码 中 对 位 置 无 关 节 或 缺 少 的 __weak 函 数 的 引 用 ,则 未 解 析 的 引 用 不 是 NULL。函 数 定 义无 法 内 联 弱 定 义 的 函 数 。示 例__weak const int c;// assume 'c' is not present in final linkconst int *f1() { return &c; } // '&c' returns non-NULL if// compiled and linked /ropi__weak int i;// assume 'i' is not present in final linkint *f2() { return &i; } // '&i' returns non-NULL if// compiled and linked /rwpi__weak void f(void);// assume 'f' is not present in final linktypedef void (*FP)(void);FP g() { return f; }// 'g' returns non-NULL if// compiled and linked /ropi另 请 参 阅• 《 实 用 程 序 指 南 》 中 的 第 3 章 使 用 armar, 以 了 解 有 关 库 搜 索 的 详 细 信息 。4-22 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.1.20 __writeonly__writeonly 类 型 限 定 符 指 示 不 能 从 中 读 取 数 据 对 象 。在 C 和 C++ 类 型 系 统 中 , 其 行 为 与 const 或 volatile 之 类 的 cv 限 定 符 相 同 。 它产 生 的 特 定 结 果 是 , 无 法 将 类 型 为 __writeonly 的 左 值 转 换 为 右 值 。如 果 赋 值 是 按 读 改 写 的 方 式 实 现 的 , 则 不 允 许 为 __writeonly 位 域 赋 值 。 这 取 决于 实 现 。示 例void foo(__writeonly int *ptr){*ptr = 0;// allowedprintf("ptr value = %d\n", *ptr); // error}<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-23ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.2 __declspec 属 性可 以 使 用 __declspec 关 键 字 指 定 对 象 和 函 数 的 特 殊 属 性 。 例 如 , 可 以 使 用__declspec 关 键 字 声 明 已 导 入 或 导 出 的 函 数 和 变 量 , 或 者 声 明 线 程 局 部 存 储(TLS) 对 象 。__declspec 关 键 字 必 须 放 在 声 明 规 范 前 面 。 例 如 :__declspec(noreturn) void overflow(void);__declspec(thread) int i;表 4-2 简 要 说 明 了 可 用 __declspec 属 性 。 __declspec 属 性 是 存 储 类 修 饰 符 。 它 们不 影 响 函 数 或 变 量 的 类 型 。表 4-2 编 译 器 支 持 的 __declspec 属 性 及 其 等 效 项__declspec 属 性非 __declspec 等 效 项__declspec(dllexport) -__declspec(dllimport) -__declspec(noinline)__declspec(noreturn)__attribute__((noinline))__attribute__((noreturn))__declspec(nothrow) -__declspec(notshared) -__declspec(thread) -4.2.1 __declspec(dllexport)构 建 DLL 库 时 , __declspec(dllexport) 属 性 通 过 动 态 符 号 表 导 出 符 号 定 义 。 在类 上 , 它 用 于 控 制 类 障 碍 的 可 见 性 , 如 vtable、 构 造 vtable 和 RTTI, 并 设 置 成员 函 数 和 静 态 数 据 成 员 的 缺 省 可 见 性 。用 法您 可 在 函 数 、 类 或 单 个 类 成 员 上 使 用 __declspec(dllexport)。如 果 将 某 个 内 联 函 数 标 记 为 __declspec(dllexport), 则 可 能 内 联 该 函 数 定 义 , 但始 终 使 用 与 非 内 联 函 数 相 同 的 方 法 生 成 和 导 出 该 函 数 的 外 联 实 例 。4-24 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能如 果 将 某 个 类 标 记 为 __declspec(dllexport) ( 如class __declspec(dllexport) S { ... };), 则 将 导 出 该 类 的 全 部 静 态 数 据 成 员 和成 员 函 数 。 如 果 将 单 个 静 态 数 据 成 员 和 成 员 函 数 都 标 记 为__declspec(dllexport), 则 只 导 出 这 些 成 员 。 vtable、 构 造 vtable 表 和 RTTI 也 将被 导 出 。注 意以 下 声 明 是 正 确 的 :class __declspec(dllexport) S { ... };以 下 声 明 是 错 误 的 :__declspec(dllexport) class S { ... };结 合 使 用 --export_all_vtbl 和 __declspec(notshared), 可 避 免 导 出 某 一 个 类 或 结构 的 vtable、 构 造 vtable 表 和 RTTI。 --export_all_vtbl 和 __declspec(dllexport)一 般 不 同 时 使 用 。限 制如 果 将 一 个 类 标 记 为 __declspec(dllexport), 则 不 能 将 该 类 的 单 个 成 员 标 记 为__declspec(dllexport)。如 果 将 一 个 类 标 记 为 __declspec(dllexport), 则 确 保 将 该 类 的 所 有 基 类 都 标 记 为__declspec(dllexport)。如 果 要 导 出 一 个 类 中 的 虚 拟 函 数 , 则 确 保 导 出 该 类 的 所 有 虚 拟 函 数 , 或 者 将 它们 定 义 为 内 联 以 对 客 户 端 可 见 。示 例声 明 中 所 需 的 __declspec() 取 决 于 该 定 义 是 否 位 于 同 一 共 享 库 中 。/* This is the declaration for use in the same shared library as the *//* definition */__declspec(dllexport) extern int mymod_get_version(void);/* Translation unit containing the definition */__declspec(dllexport) extern int mymod_get_version(void){return 42;}<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-25ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能/* This is the declaration for use in a shared library that does not contain *//* the definition */__declspec(dllimport) extern int mymod_get_version(void);运 行 下 列 宏 后 , 定 义 链 接 单 元 中 的 非 定 义 转 换 单 元 将 会 看 到__declspec(dllexport)。/* mymod.h - interface to my module */#ifdef BUILDING_MYMOD#define MYMOD_API __declspec(dllexport)#else /* not BUILDING_MYMOD */#define MYMOD_API __declspec(dllimport)#endifMYMOD_API int mymod_get_version(void);另 请 参 阅• __declspec(dllimport)• 第 4-29 页 的 __declspec(notshared)• 第 2-54 页 的 --export_all_vtbl, --no_export_all_vtbl4.2.2 __declspec(dllimport)生 成 DLL 库 时 , __declspec(dllimport) 属 性 通 过 动 态 符 号 表 导 入 符 号 。用 法如 果 将 内 联 函 数 标 记 为 __declspec(dllimport), 则 可 能 内 联 此 编 译 单 元 中 的 函 数定 义 , 但 不 会 外 联 生 成 该 定 义 。 外 联 调 用 或 地 址 引 用 使 用 导 入 的 符 号 。您 只 能 在 extern 函 数 和 变 量 以 及 类 上 使 用 __declspec(dllimport)。如 果 将 某 个 类 标 记 为 __declspec(dllimport), 则 将 导 入 该 类 的 所 有 静 态 数 据 成 员和 成 员 函 数 。 如 果 将 单 个 静 态 数 据 成 员 和 成 员 函 数 标 记 为__declspec(dllimport), 则 只 导 入 这 些 成 员 。限 制如 果 将 一 个 类 标 记 为 __declspec(dllimport), 则 不 能 将 该 类 的 单 个 成 员 标 记 为__declspec(dllimport)。4-26 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能示 例__declspec(dllimport) int i;class __declspec(dllimport) X{void f();};另 请 参 阅• 第 4-24 页 的 __declspec(dllexport)4.2.3 __declspec(noinline)__declspec(noinline) 属 性 禁 止 在 函 数 调 用 点 处 内 联 函 数 。注 意此 __declspec 属 性 具 有 等 效 的 函 数 属 性 __attribute__((noinline))。另 请 参 阅• 第 4-63 页 的 #pragma inline, #pragma no_inline• 第 4-35 页 的 __attribute__((noinline))4.2.4 __declspec(noreturn)__declspec(noreturn) 属 性 指 明 函 数 从 不 返 回 值 。注 意此 属 性 具 有 等 效 的 函 数 __attribute((noreturn))。 但 是 , __attribute((noreturn))和 __declspec(noreturn) 的 不 同 之 处 在 于 , 在 编 译 函 数 定 义 时 , 如 果 函 数 到 达 显式 或 隐 式 返 回 , 则 __attribute((noreturn)) 将 被 忽 略 , 同 时 编 译 器 生 成 警 告 消息 。 而 __declspec(noreturn) 不 会 被 忽 略 。用 法可 以 使 用 此 属 性 减 少 调 用 从 不 返 回 值 的 函 数 ( 如 exit()) 所 产 生 的 开 销 。 如 果noreturn 函 数 将 值 返 回 到 其 调 用 方 , 则 该 行 为 是 未 定 义 的 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-27ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能限 制在 调 用 noreturn 函 数 时 , 不 会 保 留 返 回 地 址 。 这 会 限 制 调 试 器 显 示 调 用 堆 栈 的功 能 。示 例__declspec(noreturn) void overflow(void); // never return on overflowint negate(int x){if (x == 0x80000000) overflow();return -x;}另 请 参 阅• 第 4-36 页 的 __attribute__((noreturn))4.2.5 __declspec(nothrow)__declspec(nothrow) 属 性 指 明 函 数 调 用 从 不 导 致 将 C++ 异 常 从 调 用 传 播 到 调 用方 。<strong>ARM</strong> 库 头 自 动 将 此 限 定 符 添 加 到 C 函 数 声 明 中 , 依 照 ISO C 标 准 , 这 些 函 数 从不 抛 出 异 常 。用 法如 果 编 译 器 知 道 函 数 从 不 抛 出 异 常 , 它 或 许 可 以 为 该 函 数 的 调 用 方 生 成 较 小 的异 常 处 理 表 。限 制如 果 函 数 调 用 导 致 将 C++ 异 常 从 调 用 传 播 到 调 用 方 , 则 该 行 为 是 未 定 义 的 。如 果 在 不 启 用 异 常 的 情 况 下 进 行 编 译 , 则 会 忽 略 此 修 饰 符 。示 例struct S{~S();};__declspec(nothrow) extern void f(void);void g(void)4-28 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能{}S s;f();另 请 参 阅• 第 2-57 页 的 --force_new_nothrow, --no_force_new_nothrow• 第 5-13 页 的 使 用 ::operator new 函 数4.2.6 __declspec(notshared)__declspec(notshared) 属 性 可 防 止 从 特 定 类 导 出 虚 拟 函 数 表 和 RTTI。 这 将 一 直保 持 为 真 , 而 与 应 用 的 其 他 选 项 无 关 。 例 如 , 使 用 --export_all_vtbl 不 会 覆 盖__declspec(notshared)。示 例struct __declspec(notshared) X{virtual int f();}; // do not export thisint X::f(){return 1;}struct Y : X{virtual int g();}; // do export thisint Y::g(){return 1;}4.2.7 __declspec(thread)__declspec(thread) 属 性 指 明 变 量 是 线 程 局 部 变 量 并 具 有 线 程 存 储 时 限 , 以 便 链接 器 安 排 在 创 建 线 程 时 自 动 分 配 的 存 储 。注 意支 持 将 __thread 关 键 字 作 为 __declspec(thread) 的 同 义 词 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-29ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能限 制无 法 动 态 初 始 化 文 件 范 围 的 线 程 局 部 变 量 。示 例__declspec(thread) int i;__thread int j; // same as __decspec(thread) int j;4-30 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.3 函 数 属 性可 以 使 用 __attribute__ 关 键 字 指 定 变 量 或 结 构 字 段 、 函 数 和 类 型 的 特 殊 属 性 。此 关 键 字 的 格 式 为 :__attribute__ ((attribute1, attribute2, ...))__attribute__ ((__attribute1__, __attribute2__, ...))例 如 :void * Function_Attributes_malloc_0(int b) __attribute__ ((malloc));static int b __attribute__ ((__unused__));表 4-3 简 要 说 明 了 可 用 函 数 属 性 。表 4-3 编 译 器 支 持 的 函 数 属 性 及 其 等 效 项函 数 属 性非 属 性 等 效 项__attribute__((alias)) -__attribute__((always_inline))__attribute__((const))__forceinline__pure__attribute__((deprecated)) -__attribute__((malloc)) -__attribute__((noinline))__declspec(noinline)__attribute__((no_instrument_function))__attribute__((nomerge)) -__attribute__((nonnull))__attribute__((noreturn))__declspec(noreturn))__attribute__((notailcall)) -__attribute__((pure)) -__attribute__((unused)) -__attribute__((used)) -__attribute__((visibility("visibility_type")))__attribute__((weak))__weak<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-31ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.3.1 __attribute__((alias))可 以 使 用 此 函 数 属 性 为 函 数 指 定 多 个 别 名 。如 果 函 数 是 在 当 前 转 换 单 元 中 定 义 的 , 则 会 将 别 名 调 用 替 换 为 函 数 调 用 , 并 将别 名 与 原 始 名 称 一 起 发 出 。 如 果 函 数 不 是 在 当 前 转 换 单 元 中 定 义 的 , 则 会 将 别名 调 用 替 换 为 对 真 实 函 数 的 调 用 。 如 果 将 某 个 函 数 定 义 为 static, 则 会 将 函 数名 称 替 换 为 别 名 ; 如 果 将 别 名 声 明 为 外 部 别 名 , 则 会 将 该 函 数 声 明 为 外 部 函数 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。注 意也 可 以 使 用 相 应 变 量 属 性 __attribute__((alias)) 为 变 量 名 称 指 定 别 名 。语 法return-type newname([argument-list]) __attribute__((alias("oldname")));其 中 :oldname 是 要 指 定 别 名 的 函 数 的 名 称newname 是 已 指 定 别 名 的 函 数 的 新 名 称 。示 例#include void foo(void){printf("%s\n", __FUNCTION__);}void bar(void) __attribute__((alias("foo")));void gazonk(void){bar(); // calls foo}另 请 参 阅• 第 4-47 页 的 __attribute__((alias))4-32 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.3.2 __attribute__((always_inline))此 函 数 属 性 指 示 必 须 内 联 函 数 。编 译 器 将 尝 试 内 联 函 数 , 而 不 考 虑 函 数 的 特 性 。 但 是 , 如 果 这 样 做 导 致 出 现 问题 , 编 译 器 将 不 内 联 函 数 。 例 如 , 递 归 函 数 仅 内 联 到 本 身 一 次 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。 它 具 有 等 效 的 关 键 字__forceinline。示 例static int max(int x, int y) __attribute__((always_inline)){return x > y ? x : y; // always inline if possible}另 请 参 阅• 第 2-58 页 的 --forceinline• 第 4-6 页 的 __forceinline4.3.3 __attribute__((const))很 多 函 数 只 检 查 传 递 给 它 们 的 参 数 , 并 且 只 影 响 返 回 值 。 这 是 一 个 比__attribute__((pure)) 严 格 得 多 的 类 , 因 为 不 允 许 函 数 读 取 全 局 内 存 。 如 果 已 知函 数 只 能 依 靠 其 自 变 量 起 作 用 , 则 可 以 对 其 进 行 公 共 子 表 达 式 删 除 和 循 环 优化 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。 它 具 有 等 效 的 关 键 字__pure。示 例int Function_Attributes_const_0(int b) __attribute__ ((const));int Function_Attributes_const_2(int b){int aLocal=0;aLocal += Function_Attributes_const_0(b);<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-33ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能}aLocal += Function_Attributes_const_0(b);return aLocal;在 此 代 码 中 , 只 能 调 用 一 次 Function_Attributes_const_0, 并 将 结 果 加 倍 以 获 得正 确 的 返 回 值 。另 请 参 阅• 第 4-37 页 的 __attribute__((pure))• 《 编 译 器 用 户 指 南 》 中 第 5-13 页 的 __pure。4.3.4 __attribute__((deprecated))此 函 数 属 性 指 示 存 在 某 个 函 数 , 但 如 果 使 用 这 个 不 提 倡 使 用 的 函 数 , 编 译 器 必须 生 成 警 告 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。示 例int Function_Attributes_deprecated_0(int b) __attribute__ ((deprecated));4.3.5 __attribute__((malloc))此 函 数 属 性 指 示 可 以 像 malloc 一 样 处 理 函 数 , 并 且 可 执 行 关 联 的 优 化 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。示 例void * Function_Attributes_malloc_0(int b) __attribute__ ((malloc));4-34 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.3.6 __attribute__((noinline))此 函 数 属 性 禁 止 在 函 数 调 用 点 处 内 联 函 数 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。 它 具 有 等 效 的 __declspec__declspec(noinline)。示 例int fn(void) __attribute__((noinline));int fn(void){return 42;}另 请 参 阅• 第 4-63 页 的 #pragma inline, #pragma no_inline• 第 4-27 页 的 __declspec(noinline)4.3.7 __attribute__((no_instrument_function))此 函 数 属 性 将 指 示 在 使 用 --gnu_instrument 进 行 检 测 时 不 包 括 该 函 数 。另 请 参 阅• 第 2-67 页 的 --gnu_instrument, --no_gnu_instrument4.3.8 __attribute__((nomerge))此 函 数 属 性 防 止 源 代 码 中 对 该 函 数 的 不 同 调 用 在 对 象 代 码 中 合 并 。另 请 参 阅• 第 4-37 页 的 __attribute__((notailcall))• 第 2-109 页 的 --retain=option<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-35ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.3.9 __attribute__((nonnull))此 函 数 属 性 指 定 不 假 定 为 空 指 针 的 函 数 参 数 。 这 将 使 编 译 器 在 遇 到 此 类 参 数 时生 成 警 告 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。语 法__attribute__((nonnull(arg-index, ...)))其 中 , arg-index, ... 表 示 参 数 索 引 列 表 。如 果 未 指 定 参 数 索 引 列 表 , 则 所 有 指 针 参 数 都 被 标 记 为 非 零 。示 例以 下 声 明 是 等 效 的 :void * my_memcpy (void *dest, const void *src, size_t len)__attribute__((nonnull (1, 2)));void * my_memcpy (void *dest, const void *src, size_t len)__attribute__((nonnull));4.3.10 __attribute__((noreturn))此 函 数 属 性 指 示 编 译 器 函 数 不 返 回 值 。 随 后 , 编 译 器 可 通 过 删 除 从 不 会 到 达 的代 码 来 执 行 优 化 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。 它 具 有 等 效 的 __declspec__declspec(noreturn)。 但 是 , __attribute((noreturn)) 和 __declspec(noreturn) 的不 同 之 处 在 于 , 在 编 译 函 数 定 义 时 , 如 果 函 数 到 达 显 式 或 隐 式 返 回 , 则__attribute((noreturn)) 将 被 忽 略 , 同 时 编 译 器 生 成 警 告 消 息 , 而__declspec(noreturn) 不 会 被 忽 略 。示 例int Function_Attributes_NoReturn_0(void) __attribute__ ((noreturn));4-36 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能另 请 参 阅• 第 4-27 页 的 __declspec(noreturn)4.3.11 __attribute__((notailcall))此 函 数 属 性 防 止 函 数 的 尾 调 用 。 也 就 是 说 , 即 使 可 由 普 通 跳 转 传 送 ( 因 为 调 用发 生 在 函 数 的 结 尾 ), 也 始 终 通 过 跳 转 并 链 接 的 方 式 调 用 函 数 。另 请 参 阅• 第 4-35 页 的 __attribute__((nomerge))• 第 2-109 页 的 --retain=option4.3.12 __attribute__((pure))很 多 函 数 只 影 响 返 回 值 , 并 且 返 回 值 仅 取 决 于 参 数 和 全 局 变 量 。 可 以 对 此 类 函数 进 行 数 据 流 分 析 , 并 且 可 以 将 其 删 除 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。虽 然 此 函 数 属 性 与 __pure 关 键 字 有 关 , 但 它 们 并 不 等 效 。 __pure 的 等 效 函 数 属性 是 __attribute__((const))。示 例int Function_Attributes_pure_0(int b) __attribute__ ((pure));int Function_Attributes_pure_0(int b){static int aStatic;aStatic++;return b++;}int Function_Attributes_pure_2(int b){int aLocal=0;aLocal += Function_Attributes_pure_0(b);return 0;}在 此 示 例 中 , 由 于 不 使 用 Function_Attributes_pure_0 调 用 的 结 果 , 因 此 可 以 删除 该 调 用 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-37ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.3.13 __attribute__((section("name")))可 以 使 用 section 函 数 属 性 将 代 码 放 在 映 像 的 不 同 节 中 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。示 例在 以 下 示 例 中 , 将 Function_Attributes_section_0 放 在 RO 节 new_section 中 , 而不 是 放 在 .text 中 。void Function_Attributes_section_0 (void)__attribute__ ((section ("new_section")));void Function_Attributes_section_0 (void){static int aStatic =0;aStatic++;}在 以 下 示 例 中 , section 函 数 属 性 覆 盖 #pragma arm section 设 置 。#pragma arm section code="foo"int f2(){return 1;} // into the 'foo' area__attribute__ ((section ("bar"))) int f3(){return 1;} // into the 'bar' areaint f4(){return 1;} // into the 'foo' area#pragma arm section另 请 参 阅• 第 4-56 页 的 #pragma arm section [section_sort_list]4-38 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.3.14 __attribute__((unused))unused 函 数 属 性 禁 止 编 译 器 在 未 引 用 该 函 数 时 生 成 警 告 。 这 不 会 更 改 删 除 未 使用 函 数 的 过 程 的 行 为 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。示 例static int Function_Attributes_unused_0(int b) __attribute__ ((unused));4.3.15 __attribute__((used))此 函 数 属 性 指 示 编 译 器 在 对 象 文 件 中 保 留 静 态 函 数 , 即 使 将 该 函 数 解 除 引 用 也是 如 此 。标 记 为 已 使 用 的 静 态 函 数 将 按 照 其 声 明 顺 序 发 出 到 单 个 节 。 可 以 使 用__attribute__((section)) 指 定 将 函 数 放 置 到 的 节 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。注 意也 可 以 使 用 __attribute__((used)) 将 静 态 变 量 标 记 为 已 使 用 。示 例static int lose_this(int);static int keep_this(int) __attribute__((used)); // retained in object filestatic int keep_this_too(int) __attribute__((used)); // retained in object file另 请 参 阅• 第 4-38 页 的 __attribute__((section("name")))• 第 4-52 页 的 __attribute__((used))<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-39ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.3.16 __attribute__((visibility("visibility_type")))此 函 数 属 性 影 响 ELF 符 号 的 可 见 性 。注 意此 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。语 法__attribute__((visibility("visibility_type")))其 中 , visibility_type 是 下 列 值 之 一 :defaulthiddeninternalprotected假 定 的 符 号 可 见 性 可 通 过 其 他 选 项 进 行 更 改 。 缺 省 可 见 性 将 覆 盖此 类 更 改 。 缺 省 可 见 性 与 外 部 链 接 对 应 。该 符 号 不 存 放 在 动 态 符 号 表 中 , 因 此 , 其 他 可 执 行 文 件 或 共 享 库都 无 法 直 接 引 用 它 。 使 用 函 数 指 针 可 进 行 间 接 引 用 。除 非 由 特 定 于 处 理 器 的 应 用 二 进 制 接 口 (psABI) 指 定 , 否 则 , 内 部可 见 性 意 味 着 不 允 许 从 另 一 模 块 调 用 该 函 数 。该 符 号 存 放 在 动 态 符 号 表 中 , 但 定 义 模 块 内 的 引 用 将 与 局 部 符 号绑 定 。 也 就 是 说 , 另 一 模 块 无 法 覆 盖 该 符 号 。用 法除 指 定 default 可 见 性 外 , 此 属 性 都 可 与 在 这 些 情 况 下 具 有 外 部 链 接 的 声 明 结 合使 用 。您 可 在 C 和 C++ 中 使 用 此 属 性 。 在 C++ 中 , 还 可 将 它 应 用 于 类 型 、 成 员 函 数 和命 名 空 间 声 明 。示 例void __attribute__((visibility( “internal” ))) foo(){...}4-40 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 4-53 页 的__attribute__((visibility("visibility_type")))4.3.17 __attribute__((weak))使 用 __attribute__((weak)) 定 义 的 函 数 将 弱 导 出 其 符 号 。如 果 使 用 __attribute__((weak)) 声 明 函 数 , 但 随 后 没 有 使 用__attribute__((weak)) 对 其 进 行 定 义 , 则 此 函 数 与 弱 函 数 的 行 为 相 同 。 它 与__weak 关 键 字 的 行 为 不 同 。注 意此 函 数 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。示 例extern int Function_Attributes_weak_0 (int b) __attribute__ ((weak));另 请 参 阅• 第 4-20 页 的 __weak<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-41ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.4 类 型 属 性可 以 使 用 __attribute__ 关 键 字 指 定 变 量 或 结 构 字 段 、 函 数 和 类 型 的 特 殊 属 性 。此 关 键 字 的 格 式 为 :__attribute__ ((attribute1, attribute2, ...))__attribute__ ((__attribute1__, __attribute2__, ...))例 如 :void * Function_Attributes_malloc_0(int b) __attribute__ ((malloc));static int b __attribute__ ((__unused__));表 4-4 简 要 说 明 了 可 用 类 型 属 性 。表 4-4 编 译 器 支 持 的 类 型 属 性 及 其 等 效 项类 型 属 性非 属 性 等 效 项__attribute__((bitband)) -__attribute__((aligned))__attribute__((packed))__align__packed a__attribute__((transparent_union)) -a. 在 GNU 模 式 下 , __packed 限 定 符 不 影 响 类 型 。4.4.1 __attribute__((bitband))__attribute__((bitband)) 是 一 种 类 型 属 性 , 可 允 许 对 内 存 体 系 结 构 的 SRAM 和外 设 区 中 的 单 个 位 值 进 行 有 效 的 原 子 访 问 。 使 用 此 属 性 , 可 在 特 定 内 存 区 中 通过 一 次 内 存 访 问 直 接 设 置 或 清 除 单 个 位 , 而 无 需 使 用 传 统 的 读 取 、 修 改 、 写 入方 式 。 此 外 , 还 可 以 直 接 读 取 单 个 位 而 不 必 使 用 传 统 的 读 取 然 后 移 位 和 屏 蔽 操作 。 示 例 4-6 演 示 了 __attribute__((bitband)) 的 用 法 。示 例 4-6 使 用 __attribute__((bitband))typedef struct {int i: 1;int j: 2;int k: 3;} BB __attribute__((bitband));BB bb __attribute__((at(0x20000004)));4-42 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能void foo(void){bb.i = 1;}对 于 区 分 宽 度 的 外 设 , 分 别 为 位 处 理 操 作 结 构 的 位 域 的 char、 short 和 int 类 型生 成 存 储 或 加 载 到 别 名 空 间 的 字 节 、 半 字 和 字 。在 示 例 4-7 中 , 将 为 bb.i 生 成 位 处 理 操 作 访 问 。示 例 4-7 位 域 位 处 理 操 作 访 问typedef struct {char i: 1;int j: 2;int k: 3;} BB __attribute__((bitband));BB bb __attribute__((at(0x20000004)));void foo(){bb.i = 1;}如 果 您 未 使 用 __attribute__((at())) 将 位 处 理 操 作 变 量 存 放 到 位 处 理 操 作 区 , 则必 须 使 用 其 他 方 法 对 它 进 行 重 新 定 位 。 您 可 使 用 相 应 的 分 散 加 载 描 述 文 件 或--rw_base 链 接 器 命 令 行 选 项 来 进 行 重 定 位 。 有 关 详 细 信 息 , 请 参 阅 《 链 接 器 参考 指 南 》。限 制应 用 的 限 制 如 下 :• 此 类 型 属 性 仅 可 与 struct 一 起 使 用 。 任 何 联 合 类 型 或 其 他 带 有 联 合 成 员 的聚 合 类 型 都 不 能 进 行 位 处 理 操 作 。• 结 构 中 的 成 员 无 法 单 独 进 行 位 处 理 操 作 。• 仅 为 包 含 单 个 位 的 位 域 生 成 位 处 理 操 作 访 问 。• 不 对 const 对 象 、 指 针 和 局 部 对 象 生 成 位 处 理 操 作 访 问 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-43ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能另 请 参 阅• 第 4-48 页 的 __attribute__((at(address)))• 《 编 译 器 用 户 指 南 》 中 第 4-15 页 的 位 处 理 操 作• 处 理 器 的 《 技 术 参 考 手 册 》 (Technical Reference Manual)。4.4.2 __attribute__((aligned))aligned 类 型 属 性 指 定 类 型 的 最 低 对 齐 要 求 。注 意此 类 型 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。4.4.3 __attribute((packed))packed 类 型 属 性 指 定 类 型 必 须 具 有 最 小 的 可 能 对 齐 要 求 。注 意此 类 型 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。错 误如 果 在 typedef 中 使 用 此 属 性 , 编 译 器 将 生 成 警 告 消 息 。另 请 参 阅• 第 4-11 页 的 __packed• 第 4-65 页 的 #pragma pack(n)• 第 5-10 页 的 压 缩 结 构• 《 编 译 器 用 户 指 南 》 中 第 5-25 页 的 __packed 限 定 符 和 未 对 齐 的 数 据 访 问• 《 编 译 器 用 户 指 南 》 中 第 5-27 页 的 __packed 结 构 与 单 个 __packed 字 段 。4.4.4 __attribute__((transparent_union))可 以 使 用 transparent_union 类 型 属 性 指 定 transparent_union 类 型 , 即 使 用__attribute__((transparent_union))__ 限 定 的 联 合 数 据 类 型 。4-44 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能使 用 具 有 透 明 联 合 类 型 的 参 数 定 义 函 数 时 , 如 果 函 数 调 用 使 用 的 自 变 量 具 有 联合 中 的 任 何 类 型 , 则 会 导 致 初 始 化 具 有 以 下 成 员 的 联 合 对 象 : 成 员 具 有 传 递 的自 变 量 类 型 , 并 将 其 值 设 置 为 传 递 的 自 变 量 值 。使 用 __attribute__((transparent_union)) 限 定 联 合 数 据 类 型 时 , 透 明 联 合 将 应 用于 所 有 具 有 该 类 型 的 函 数 参 数 。注 意此 类 型 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。注 意也 可 以 使 用 相 应 __attribute__((transparent_union)) 变 量 属 性 限 定 各 个 函 数 参数 。示 例typedef union { int i; float f; } U __attribute__((transparent_union));void foo(U u){static int s;s += u.i; /* Use the 'int' field */}void caller(void){foo(1); /* u.i is set to 1 */foo(1.0f); /* u.f is set to 1.0f */}模 式仅 在 GNU 模 式 下 支 持 。另 请 参 阅• 第 4-51 页 的 __attribute__((transparent_union))<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-45ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.5 变 量 属 性可 以 使 用 __attribute__ 关 键 字 指 定 变 量 或 结 构 字 段 、 函 数 和 类 型 的 特 殊 属 性 。此 关 键 字 的 格 式 为 :__attribute__ ((attribute1, attribute2, ...))__attribute__ ((__attribute1__, __attribute2__, ...))例 如 :void * Function_Attributes_malloc_0(int b) __attribute__ ((malloc));static int b __attribute__ ((__unused__));第 4-31 页 的 表 4-3 简 要 说 明 了 可 用 变 量 属 性 。表 4-5 编 译 器 支 持 的 变 量 属 性 及 其 等 效 项变 量 属 性非 属 性 等 效 项__attribute__((alias)) -__attribute__((at(address))) -__attribute__((aligned)) -__attribute__((deprecated)) -__attribute__((packed)) -__attribute__((section(“name”))) -__attribute__((transparent_union)) -__attribute__((unused)) -__attribute__((used)) -__attribute__((weak))__weak__attribute__((visibility("visibility_type")))__attribute__((zeroinit)) -4-46 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.5.1 __attribute__((alias))可 以 使 用 此 变 量 属 性 为 变 量 指 定 多 个 别 名 。如 果 变 量 是 在 当 前 转 换 单 元 中 定 义 的 , 则 会 将 别 名 引 用 替 换 为 变 量 引 用 , 并 将别 名 与 原 始 名 称 一 起 发 出 。 如 果 变 量 不 是 在 当 前 转 换 单 元 中 定 义 的 , 则 会 将 别名 引 用 替 换 为 对 真 实 变 量 的 引 用 。 如 果 将 某 个 变 量 定 义 为 static, 则 会 将 变 量名 称 替 换 为 别 名 ; 如 果 将 别 名 声 明 为 外 部 别 名 , 则 会 将 该 变 量 声 明 为 外 部 变量 。注 意也 可 以 使 用 相 应 函 数 属 性 __attribute__((alias)) 为 函 数 名 称 指 定 别 名 。语 法type newname __attribute__((alias("oldname")));其 中 :oldname 是 要 指 定 别 名 的 变 量 的 名 称newname 是 已 指 定 别 名 的 变 量 的 新 名 称 。示 例#include int oldname = 1;extern int newname __attribute__((alias("oldname"))); // declarationvoid foo(void){printf("newname = %d\n", newname); // prints 1}另 请 参 阅• 第 4-32 页 的 __attribute__((alias))<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-47ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.5.2 __attribute__((at(address)))可 以 使 用 此 变 量 属 性 指 定 变 量 的 绝 对 地 址 。变 量 放 在 其 自 己 的 节 中 , 编 译 器 将 为 包 含 变 量 的 节 指 定 适 当 的 类 型 :• 只 读 变 量 放 在 RO 类 型 的 节 中 。• 已 初 始 化 的 读 写 变 量 放 在 RW 类 型 的 节 中 。特 别 地 , 显 式 初 始 化 为 零 的 变 量 放 在 RW 中 , 而 不 是 放 在 ZI 中 。 此 类 变量 不 适 合 编 译 器 的 ZI 到 RW 优 化 。• 未 初 始 化 的 变 量 放 在 ZI 类 型 的 节 中 。注 意GNU 编 译 器 不 支 持 此 变 量 属 性 。语 法__attribute__((at(address)))其 中 :address 是 所 需 的 变 量 地 址 。限 制链 接 器 并 非 始 终 能 够 放 置 at 变 量 属 性 生 成 的 节 。错 误如 果 无 法 将 节 放 置 在 指 定 地 址 , 链 接 器 将 显 示 一 条 错 误 消 息 。示 例const int x1 __attribute__((at(0x10000))) = 10; /* RO */int x2 __attribute__((at(0x12000))) = 10; /* RW */int x3 __attribute__((at(0x14000))) = 0; /* RW, not ZI */int x4 __attribute__((at(0x16000))); /* ZI */另 请 参 阅• 《 链 接 器 用 户 指 南 》 中 第 5-16 页 的 使 用 __at 节 将 节 放 在 特 定 地 址 中 。4-48 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.5.3 __attribute__((aligned))aligned 变 量 属 性 指 定 变 量 或 结 构 字 段 的 最 低 对 齐 要 求 ( 按 字 节 计 算 )。注 意此 变 量 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。示 例int Variable_Attributes_aligned_0 __attribute__ ((aligned (16)));/* aligned on 16 byte boundary */short Variable_Attributes_aligned_1[3] __attribute__ ((aligned));/* aligns on 4 byte boundary for <strong>ARM</strong> */另 请 参 阅• 第 4-2 页 的 __align4.5.4 __attribute__((deprecated))可 以 使 用 deprecated 变 量 属 性 声 明 不 提 倡 使 用 的 变 量 , 而 不 会 导 致 编 译 器 发 出任 何 警 告 或 错 误 。 但 是 , 对 deprecated 变 量 的 任 何 访 问 都 会 生 成 警 告 , 但 仍 会进 行 编 译 。 警 告 指 出 了 使 用 和 定 义 变 量 的 位 置 。 这 有 助 于 确 定 不 提 倡 使 用 特 定定 义 的 原 因 。注 意此 变 量 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。示 例extern int Variable_Attributes_deprecated_0 __attribute__ ((deprecated));extern int Variable_Attributes_deprecated_1 __attribute__ ((deprecated));void Variable_Attributes_deprecated_2(){Variable_Attributes_deprecated_0=1;Variable_Attributes_deprecated_1=2;}编 译 此 示 例 时 , 将 生 成 两 条 警 告 消 息 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-49ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.5.5 __attribute__((packed))packed 变 量 属 性 指 定 变 量 或 结 构 字 段 具 有 最 小 的 可 能 对 齐 要 求 。 即 , 除 非 使 用aligned 属 性 指 定 更 大 的 值 , 否 则 , 变 量 为 一 个 字 节 , 字 段 为 一 位 。注 意此 变 量 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。示 例struct{char a;int b __attribute__ ((packed));} Variable_Attributes_packed_0;另 请 参 阅• 第 4-65 页 的 #pragma pack(n)• 第 5-10 页 的 压 缩 结 构• 《 编 译 器 用 户 指 南 》 中 第 5-25 页 的 __packed 限 定 符 和 未 对 齐 的 数 据 访 问• 《 编 译 器 用 户 指 南 》 中 第 5-27 页 的 __packed 结 构 与 单 个 __packed 字 段 。4.5.6 __attribute__((section("name")))通 常 , <strong>ARM</strong> 编 译 器 将 它 生 成 的 对 象 放 在 节 中 , 如 data 和 bss。 但 是 , 您 可 能 需要 使 用 其 他 数 据 节 , 或 者 希 望 变 量 出 现 在 特 殊 节 中 , 例 如 , 便 于 映 射 到 特 殊 硬件 。 section 属 性 指 定 变 量 必 须 放 在 特 定 数 据 节 中 。 如 果 使 用 section 属 性 , 则将 只 读 变 量 放 在 RO 数 据 节 中 , 而 将 读 写 变 量 放 在 RW 数 据 节 中 , 除 非 您 使 用zero_init 属 性 。 在 这 种 情 况 下 , 变 量 被 放 在 ZI 节 中 。注 意此 变 量 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。示 例/* in RO section */const int descriptor[3] __attribute__ ((section ("descr"))) = { 1,2,3 };/* in RW section */4-50 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能long long rw[10] __attribute__ ((section ("RW")));/* in ZI section *long long altstack[10] __attribute__ ((section ("STACK"), zero_init));/4.5.7 __attribute__((transparent_union))如 果 将 transparent_union 变 量 属 性 附 加 到 具 有 联 合 类 型 的 函 数 参 数 中 , 则 表 示相 应 自 变 量 可 具 有 任 何 联 合 成 员 的 类 型 , 但 传 递 自 变 量 时 就 好 像 其 类 型 是 第 一个 联 合 成 员 的 类 型 一 样 。注 意C 规 范 规 定 , 如 果 将 联 合 作 为 一 种 类 型 写 入 并 以 另 一 种 类 型 回 读 , 则 返 回 的 值是 未 定 义 的 。 因 此 , 区 分 transparent_union 以 哪 种 类 型 写 入 的 方 法 也 必 须 作 为自 变 量 传 递 。注 意此 变 量 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。注 意也 可 以 在 typedef 上 将 此 属 性 用 于 联 合 数 据 类 型 。 在 这 种 情 况 下 , 它 应 用 于 所 有该 类 型 的 函 数 参 数 。模 式仅 在 GNU 模 式 下 支 持 。示 例typedef union{int myint;float myfloat;} transparent_union_t;void Variable_Attributes_transparent_union_0(transparent_union_t aUnion__attribute__ ((transparent_union))){static int aStatic;aStatic +=aUnion.myint;}void Variable_Attributes_transparent_union_1(){int aLocal =0;<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-51ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能}float bLocal =0;Variable_Attributes_transparent_union_0(aLocal);Variable_Attributes_transparent_union_0(bLocal);另 请 参 阅• 第 4-44 页 的 __attribute__((transparent_union))4.5.8 __attribute__((unused))通 常 , 如 果 声 明 了 某 个 变 量 , 但 从 未 对 其 进 行 引 用 , 编 译 器 将 发 出 警 告 。 此 属性 指 示 编 译 器 您 预 计 不 会 使 用 某 个 变 量 , 并 指 示 它 在 未 使 用 该 变 量 时 不 要 发 出警 告 。注 意此 变 量 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。示 例void Variable_Attributes_unused_0(){static int aStatic =0;int aUnused __attribute__ ((unused));int bUnused;aStatic++;}在 此 示 例 中 , 编 译 器 发 出 已 声 明 但 从 未 引 用 bUnused 的 警 告 , 但 不 会 发 出 有 关aUnused 的 警 告 。注 意GNU 编 译 器 不 会 生 成 任 何 警 告 。4.5.9 __attribute__((used))此 变 量 属 性 指 示 编 译 器 在 对 象 文 件 中 保 留 某 个 静 态 变 量 , 即 使 解 除 了 对 该 变 量的 引 用 也 是 如 此 。标 记 为 已 使 用 的 静 态 变 量 将 按 照 其 声 明 顺 序 发 出 到 单 个 节 。 可 以 使 用__attribute__((section)) 指 定 将 变 量 放 置 到 的 节 。4-52 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能注 意此 变 量 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。注 意也 可 以 使 用 __attribute__((used)) 将 静 态 函 数 标 记 为 已 使 用 。用 法可 以 使 用 __attribute__((used)) 在 对 象 中 生 成 表 。示 例static int lose_this = 1;static int keep_this __attribute__((used)) = 2; // retained in object filestatic int keep_this_too __attribute__((used)) = 3; // retained in object file另 请 参 阅• 第 4-50 页 的 __attribute__((section("name")))• 第 4-39 页 的 __attribute__((used))4.5.10 __attribute__((visibility("visibility_type")))此 变 量 属 性 影 响 ELF 符 号 的 可 见 性 。注 意此 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。visibility_type 的 可 能 值 与 为 同 名 的 函 数 属 性 指 定 的 值 相 同 。示 例int i __attribute__((visibility( “hidden” )));另 请 参 阅• 第 2-8 页 的 --arm_linux• 第 4-40 页 的__attribute__((visibility("visibility_type")))<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-53ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.5.11 __attribute__((weak))允 许 声 明 弱 变 量 , 使 用 的 方 法 与 __weak 类 似 。• 在 GNU 模 式 下 :extern int Variable_Attributes_weak_1 __attribute__((weak));• 非 GNU 模 式 下 的 等 效 项 为 :__weak int Variable_Attributes_weak_compare;注 意在 GNU 模 式 下 , 需 要 使 用 extern 限 定 符 。 在 非 GNU 模 式 下 , 编 译 器 假 定 , 如果 变 量 不 是 extern, 则 像 任 何 其 他 非 弱 变 量 一 样 进 行 处 理 。注 意此 变 量 属 性 是 <strong>ARM</strong> 编 译 器 支 持 的 GNU 编 译 器 扩 展 。另 请 参 阅• 第 4-20 页 的 __weak4.5.12 __attribute__((zero_init))section 属 性 指 定 变 量 必 须 放 在 特 定 数 据 节 中 。 zero_init 属 性 指 定 将 没 有 初 始 值设 定 项 的 变 量 放 在 ZI 数 据 节 中 。 如 果 指 定 了 初 始 值 设 定 项 , 则 会 报 告 错 误 。示 例__attribute__((zero_init)) int x; /* in section ".bss" */__attribute__((section("mybss"), zero_init)) int y; /* in section "mybss" */另 请 参 阅• 第 4-50 页 的 __attribute__((section("name")))4-54 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.6 编 译 指 示<strong>ARM</strong> 编 译 器 可 识 别 很 多 <strong>ARM</strong> 特 定 的 编 译 指 示 。 表 4-6 简 要 说 明 了 可 用 编 译 指示 。注 意编 译 指 示 优 先 于 相 关 的 命 令 行 选 项 。 例 如 , #pragma arm 覆 盖 --thumb 命 令 行 选项 。编 译 指 示表 4-6 编 译 器 支 持 的 编 译 指 示#pragma anon_unions,#pragma no_anon_unions#pragma hdrstop#pragma Otime#pragma arm #pragma import symbol_name #pragma pack(n)#pragma arm section[section_sort_list]#pragma diag_defaulttag[,tag,...]#pragma diag_errortag[,tag,...]#pragma diag_remarktag[,tag,...]#pragma diag_suppresstag[,tag,...]#pragma diag_warningtag[,tag,...]#pragma[no_]exceptions_unwind#pragmaimport(__use_full_stdio)#pragma inline,#pragma no_inline#pragma no_pch#pragma Onum#pragma once#pragma hdrstop#pragma Ospace#pragma pop#pragma push#pragma softfp_linkage,no_softfp_linkage#pragma unroll [(n)]#pragma unroll_completely#pragma thumb<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-55ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.6.1 #pragma anon_unions, #pragma no_anon_unions这 些 编 译 指 示 启 用 和 禁 用 对 匿 名 结 构 和 联 合 的 支 持 。缺 省 设 置缺 省 值 为 #pragma no_anon_unions。另 请 参 阅• 第 3-19 页 的 匿 名 类 、 结 构 和 联 合• 第 4-44 页 的 __attribute__((transparent_union))4.6.2 #pragma arm此 编 译 指 示 将 代 码 生 成 切 换 为 <strong>ARM</strong> 指 令 集 。 它 覆 盖 --thumb 编 译 器 选 项 。另 请 参 阅• 第 2-8 页 的 --arm• 第 2-119 页 的 --thumb• 第 4-70 页 的 #pragma thumb4.6.3 #pragma arm section [section_sort_list]此 编 译 指 示 指 定 要 用 于 后 续 函 数 或 对 象 的 节 名 称 。 这 包 括 编 译 器 为 进 行 初 始 化而 创 建 的 匿 名 对 象 的 定 义 。注 意可 以 将 __attribute__((section(..))) 用 于 函 数 或 变 量 以 替 代 #pragma arm section。语 法#pragma arm section [section_sort_list]其 中 :section_sort_list 指 定 要 用 于 后 续 函 数 或 对 象 的 节 名 称 的 可 选 列 表 。section_sort_list 的 语 法 为 :section_type[[=]"name"] [,section_type="name"]*4-56 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能有 效 的 节 类 型 是 :• code• rodata• rwdata• zidata。用 法可 以 将 分 散 加 载 描 述 文 件 与 <strong>ARM</strong> 链 接 器 配 合 使 用 , 以 控 制 将 已 命 名 的 节 放 在特 定 内 存 地 址 的 方 式 。限 制此 选 项 对 以 下 内 容 无 效 :• 内 联 函 数 及 其 局 部 静 态 变 量 。• 模 板 实 例 化 及 其 局 部 静 态 变 量 。• 删 除 未 使 用 的 变 量 和 函 数 。 但 是 , 可 通 过 使 用 #pragma arm section, 使 链 接器 能 够 删 除 本 来 可 能 会 保 留 的 函 数 或 变 量 , 因 为 它 与 使 用 的 函 数 或 变 量 位于 相 同 的 节 中 。• 将 定 义 写 入 对 象 文 件 的 顺 序 。示 例int x1 = 5;// in .data (default)int y1[100];// in .bss (default)int const z1[3] = {1,2,3}; // in .constdata (default)#pragma arm section rwdata = "foo", rodata = "bar"int x2 = 5;// in foo (data part of region)int y2[100];// in .bssint const z2[3] = {1,2,3}; // in barchar *s2 = "abc";// s2 in foo, "abc" in .conststring#pragma arm section rodataint x3 = 5;// in fooint y3[100];// in .bssint const z3[3] = {1,2,3}; // in .constdatachar *s3 = "abc";// s3 in foo, "abc" in .conststring#pragma arm section code = "foo"int add1(int x)// in foo (code part of region){return x+1;}#pragma arm section code<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-57ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能另 请 参 阅• 第 4-38 页 的 __attribute__((section("name")))• 《 链 接 器 用 户 指 南 》 中 第 5 章 使 用 分 散 加 载 描 述 文 件 。4.6.4 #pragma diag_default tag[,tag,...]此 编 译 指 示 将 具 有 指 定 标 签 的 诊 断 消 息 的 严 重 性 恢 复 为 在 发 出 任 何 编 译 指 示 之前 有 效 的 严 重 性 。语 法#pragma diag_default tag[,tag,...]其 中 :tag[,tag,...]是 一 个 以 逗 号 分 隔 的 诊 断 消 息 编 号 列 表 , 用 于 指 定 要 更 改 其严 重 性 的 消 息 。必 须 至 少 指 定 一 个 诊 断 消 息 编 号 。示 例// not #included deliberately#pragma diag_error 223void hello(void){printf("Hello ");}#pragma diag_default 223void world(void){printf("world!\n");}使 用 --diag_warning=223 选 项 编 译 此 代 码 时 , 将 生 成 一 些 诊 断 消 息 以 报 告printf() 函 数 是 隐 式 声 明 的 。#pragma diag_default 223 的 作 用 是 将 诊 断 消 息 223 的 严 重 性 恢 复 为 警 告 严 重 性( 由 --diag_warning 命 令 行 选 项 指 定 )。另 请 参 阅• 第 2-48 页 的 --diag_warning=tag[,tag,...]• 第 4-59 页 的 #pragma diag_error tag[,tag,...]• 第 4-59 页 的 #pragma diag_remark tag[,tag,...]4-58 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能• 第 4-60 页 的 #pragma diag_suppress tag[,tag,...]• 第 4-61 页 的 #pragma diag_warning tag[, tag, ...]• 《 编 译 器 用 户 指 南 》 中 第 6-4 页 的 控 制 诊 断 消 息 的 输 出 。4.6.5 #pragma diag_error tag[,tag,...]此 编 译 指 示 将 具 有 指 定 标 签 的 诊 断 消 息 设 置 为 错 误 严 重 性 。语 法#pragma diag_error tag[,tag,...]其 中 :tag[,tag,...]是 一 个 以 逗 号 分 隔 的 诊 断 消 息 编 号 列 表 , 用 于 指 定 要 更 改 其严 重 性 的 消 息 。必 须 至 少 指 定 一 个 诊 断 消 息 编 号 。另 请 参 阅• 第 2-44 页 的 --diag_error=tag[,tag,...]• 第 4-58 页 的 #pragma diag_default tag[,tag,...]• #pragma diag_remark tag[,tag,...]• 第 4-60 页 的 #pragma diag_suppress tag[,tag,...]• 第 4-61 页 的 #pragma diag_warning tag[, tag, ...]• 《 编 译 器 用 户 指 南 》 中 第 6-5 页 的 更 改 诊 断 消 息 的 严 重 性 。4.6.6 #pragma diag_remark tag[,tag,...]此 编 译 指 示 将 具 有 指 定 标 签 的 诊 断 消 息 设 置 为 备 注 严 重 性 。#pragma diag_remark 的 行 为 与 #pragma diag_errors 类 似 , 只 不 过 编 译 器 将 具 有 指定 标 签 的 诊 断 消 息 设 置 为 备 注 严 重 性 , 而 不 是 设 置 为 错 误 严 重 性 。注 意缺 省 情 况 下 不 显 示 备 注 。 可 以 使 用 --remarks 编 译 器 选 项 来 查 看 备 注 消 息 。语 法#pragma diag_remark tag[,tag,...]<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-59ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能其 中 :tag[,tag,...]是 一 个 以 逗 号 分 隔 的 诊 断 消 息 编 号 列 表 , 用 于 指 定 要 更 改 其严 重 性 的 消 息 。另 请 参 阅• 第 2-45 页 的 --diag_remark=tag[,tag,... ]• 第 2-108 页 的 --remarks• 第 4-58 页 的 #pragma diag_default tag[,tag,...]• 第 4-59 页 的 #pragma diag_error tag[,tag,...]• #pragma diag_suppress tag[,tag,...]• 第 4-61 页 的 #pragma diag_warning tag[, tag, ...]• 《 编 译 器 用 户 指 南 》 中 第 6-5 页 的 更 改 诊 断 消 息 的 严 重 性 。4.6.7 #pragma diag_suppress tag[,tag,...]此 编 译 指 示 禁 用 所 有 具 有 指 定 标 签 的 诊 断 消 息 。#pragma diag_suppress 的 行 为 与 #pragma diag_errors 类 似 , 只 不 过 编 译 器 禁 止 具有 指 定 标 签 的 诊 断 消 息 , 而 不 是 将 其 设 置 为 具 有 错 误 严 重 性 。语 法#pragma diag_suppress tag[,tag,...]其 中 :tag[,tag,...]是 一 个 以 逗 号 分 隔 的 诊 断 消 息 编 号 列 表 , 用 于 指 定 要 禁 止 的消 息 。另 请 参 阅• 第 2-46 页 的 --diag_suppress=tag[,tag,...]• 第 4-58 页 的 #pragma diag_default tag[,tag,...]• 第 4-59 页 的 #pragma diag_error tag[,tag,...]• 第 4-59 页 的 #pragma diag_remark tag[,tag,...]• 第 4-61 页 的 #pragma diag_warning tag[, tag, ...]• 《 编 译 器 用 户 指 南 》 中 第 6-6 页 的 禁 止 显 示 诊 断 消 息 。4-60 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.6.8 #pragma diag_warning tag[, tag, ...]此 编 译 指 示 将 具 有 指 定 标 签 的 诊 断 消 息 设 置 为 警 告 严 重 性 。#pragma diag_remark 的 行 为 与 #pragma diag_errors 类 似 , 只 不 过 编 译 器 将 具 有 指定 标 签 的 诊 断 消 息 设 置 为 备 注 严 重 性 , 而 不 是 设 置 为 错 误 严 重 性 。语 法#pragma diag_warning tag[,tag,...]其 中 :tag[,tag,...]是 一 个 以 逗 号 分 隔 的 诊 断 消 息 编 号 列 表 , 用 于 指 定 要 更 改 其严 重 性 的 消 息 。另 请 参 阅• 第 2-48 页 的 --diag_warning=tag[,tag,...]• 第 4-58 页 的 #pragma diag_default tag[,tag,...]• 第 4-59 页 的 #pragma diag_error tag[,tag,...]• 第 4-59 页 的 #pragma diag_remark tag[,tag,...]• 第 4-60 页 的 #pragma diag_suppress tag[,tag,...]• 《 编 译 器 用 户 指 南 》 中 第 6-5 页 的 更 改 诊 断 消 息 的 严 重 性 。4.6.9 #pragma exceptions_unwind, #pragma no_exceptions_unwind此 编 译 指 示 在 运 行 时 启 用 和 禁 用 函 数 展 开 。缺 省 设 置缺 省 值 为 #pragma exceptions_unwind。另 请 参 阅• 第 2-53 页 的 --exceptions, --no_exceptions• 第 2-54 页 的 --exceptions_unwind, --no_exceptions_unwind• 第 5-17 页 的 运 行 时 的 函 数 展 开<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-61ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.6.10 #pragma hdrstop可 以 使 用 此 编 译 指 示 指 定 预 编 译 头 文 件 集 的 结 束 位 置 。此 编 译 指 示 必 须 位 于 第 一 个 不 属 于 预 处 理 指 令 的 标 记 前 面 。另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 2-18 页 的 预 编 译 的 头 文 件 。4.6.11 #pragma import symbol_name此 编 译 指 示 生 成 对 symbol_name 的 导 入 引 用 。 它 与 以 下 汇 编 器 指 令 相 同 :IMPORT symbol_name语 法#pragma import symbol_name其 中 :symbol_name 是 一 个 要 导 入 的 符 号 。用 法可 以 使 用 此 编 译 指 示 选 择 C 库 的 某 些 功 能 , 如 堆 实 现 或 实 时 除 法 。 如 果 本 手 册中 介 绍 的 功 能 要 求 导 入 符 号 引 用 , 则 会 指 定 所 需 的 符 号 。另 请 参 阅• 《 库 和 浮 点 支 持 指 南 》 中 第 2-18 页 的 使 用 C 库 构 建 应 用 程 序 。4.6.12 #pragma import(__use_full_stdio)此 编 译 指 示 选 择 一 个 microlib 的 扩 展 版 本 , 该 版 本 使 用 完 整 的 标 准 ANSI C 输 入和 输 出 功 能 。将 产 生 以 下 异 常 :• feof() 和 ferror() 始 终 返 回 0• setvbuf() 和 setbuf() 必 定 失 败 。feof() 和 ferror() 始 终 返 回 0 是 因 为 错 误 指 示 符 和 文 件 末 尾 指 示 符 不 受 支 持 。setvbuf() 和 setbuf() 必 定 失 败 是 因 为 所 有 流 都 没 有 缓 冲 。4-62 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能microlib stdio 的 这 个 版 本 可 使 用 与 standardlib stdio 函 数 相 同 的 方 法 重 定 向 目标 。另 请 参 阅• 第 2-79 页 的 --library_type=lib• 《 库 和 浮 点 支 持 指 南 》 中 的 第 3 章 C 微 型 库• 《 库 和 浮 点 支 持 指 南 》 中 第 2-76 页 的 调 整 输 入 / 输 出 函 数 。4.6.13 #pragma inline, #pragma no_inline这 些 编 译 指 示 控 制 内 联 操 作 , 与 --inline 和 --no_inline 命 令 行 选 项 类 似 。 按 照#pragma no_inline 定 义 的 函 数 不 会 内 联 到 其 他 函 数 , 并 且 不 会 内 联 其 自 己 的 调用 。也 可 以 通 过 将 函 数 标 记 为 __declspec(noinline) 或 __attribute__((noinline)), 实现 禁 止 内 联 到 其 他 函 数 。缺 省 设 置缺 省 值 为 #pragma inline。另 请 参 阅• 第 2-73 页 的 --inline, --no_inline• 第 4-27 页 的 __declspec(noinline)• 第 4-35 页 的 __attribute__((noinline))4.6.14 #pragma no_pch此 编 译 指 示 禁 止 对 给 定 源 文 件 进 行 PCH 处 理 。另 请 参 阅• 第 2-98 页 的 --pch• 《 编 译 器 用 户 指 南 》 中 第 2-18 页 的 预 编 译 的 头 文 件 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-63ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.6.15 #pragma Onum此 编 译 指 示 更 改 优 化 级 别 。语 法#pragma Onum其 中 :num 是 新 的 优 化 级 别 。num 的 值 为 0、 1、 2 或 3。另 请 参 阅• 第 2-94 页 的 -Onum4.6.16 #pragma once此 编 译 指 示 允 许 编 译 器 跳 过 该 头 文 件 的 后 续 包 含 语 句 。#pragma once 是 可 接 受 的 , 以 便 与 其 他 编 译 器 保 持 兼 容 , 并 且 允 许 使 用 其 他 形 式的 头 文 件 保 护 编 码 。 但 是 , 最 好 使 用 #ifndef 和 #define 编 码 , 因 为 这 更 便 于 进行 移 植 。示 例以 下 示 例 说 明 了 将 #ifndef 保 护 放 在 文 件 体 周 围 并 将 保 护 变 量 的 #define 放 在#ifndef 后 面 的 情 形 。#ifndef FILE_H#define FILE_H#pragma once// optional ... body of the header file ...#endif在 此 示 例 中 , 将 #pragma once 标 记 为 可 选 。 这 是 因 为 编 译 器 可 识 别 #ifndef 头 文件 保 护 编 码 并 跳 过 后 续 包 含 , 即 使 缺 少 #pragma once 也 是 如 此 。4-64 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.6.17 #pragma Ospace此 编 译 指 示 指 示 编 译 器 执 行 优 化 以 减 小 映 像 大 小 , 但 可 能 会 以 延 长 执 行 时 间 为代 价 。另 请 参 阅• #pragma Otime• 第 2-96 页 的 -Ospace4.6.18 #pragma Otime此 编 译 指 示 指 示 编 译 器 执 行 优 化 以 缩 短 执 行 时 间 , 但 可 能 会 以 增 加 映 像 大 小 为代 价 。另 请 参 阅• #pragma Ospace• 第 2-97 页 的 -Otime4.6.19 #pragma pack(n)此 编 译 指 示 将 结 构 成 员 对 齐 到 n 和 这 些 成 员 的 自 然 对 齐 边 界 中 的 较 小 值 。 压 缩对 象 是 通 过 未 对 齐 访 问 读 取 和 写 入 的 。语 法#pragma pack(n)其 中 :n 是 以 字 节 为 单 位 的 对 齐 , 有 效 的 对 齐 值 为 1、 2、 4 和 8。缺 省 设 置缺 省 值 为 #pragma pack(8)。示 例该 示 例 演 示 pack(2) 如 何 将 整 数 变 量 b 对 齐 到 2 字 节 边 界 。typedef struct{char a;int b;<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-65ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能} S;#pragma pack(2)typedef struct{char a;int b;} SP;S var = { 0x11, 0x44444444 };SP pvar = { 0x11, 0x44444444 };图 4-1 是 S 的 布 局 ; 图 4-2 是 SP 的 布 局 。 在 图 4-2 中 , x 表 示 单 字 节 填 充 。注 意SP 是 一 个 6 字 节 结 构 。 b 之 后 没 有 填 充 。0 1 2 3a padding4 5 6 7b b b b图 4-1 非 压 缩 结 构 S0 1 2 3a x b b4b5b图 4-2 压 缩 结 构 SP另 请 参 阅• 第 4-11 页 的 __packed• 第 4-50 页 的 __attribute__((packed))• 第 5-10 页 的 压 缩 结 构• 《 编 译 器 用 户 指 南 》 中 第 5-25 页 的 __packed 限 定 符 和 未 对 齐 的 数 据 访 问• 《 编 译 器 用 户 指 南 》 中 第 5-27 页 的 __packed 结 构 与 单 个 __packed 字 段 。4-66 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.6.20 #pragma pop此 编 译 指 示 恢 复 以 前 保 存 的 编 译 指 示 状 态 。另 请 参 阅• #pragma push4.6.21 #pragma push此 编 译 指 示 保 存 当 前 编 译 指 示 状 态 。另 请 参 阅• #pragma pop4.6.22 #pragma softfp_linkage, #pragma no_softfp_linkage这 些 编 译 指 示 控 制 软 件 浮 点 链 接 。#pragma softfp_linkage 指 明 到 下 一 个 #pragma no_softfp_linkage 之 前 的 所 有 函 数声 明 描 述 了 使 用 软 件 浮 点 链 接 的 函 数 。注 意此 编 译 指 示 具 有 等 效 的 关 键 字 __softfp。用 法若 要 应 用 于 整 个 接 口 说 明 ( 位 于 头 文 件 中 ) 而 不 改 变 该 文 件 , 此 编 译 指 示 可 能非 常 有 用 。缺 省 设 置缺 省 值 为 #pragma no_softfp_linkage。另 请 参 阅• 第 4-15 页 的 __softfp• 《 编 译 器 用 户 指 南 》 中 第 5-35 页 的 浮 点 计 算 和 链 接 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-67ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.6.23 #pragma unroll [(n)]此 编 译 指 示 指 示 编 译 器 通 过 n 次 迭 代 展 开 循 环 。注 意使 用 #pragma unroll [(n)] 可 以 展 开 向 量 化 和 非 向 量 化 的 循 环 。 即 , #pragmaunroll [(n)] 同 时 适 用 于 --vectorize 和 --no_vectorize。语 法#pragma unroll#pragma unroll (n)其 中 :n 是 一 个 可 选 值 , 用 于 指 示 要 展 开 的 迭 代 次 数 。缺 省 设 置如 果 没 有 指 定 n 的 值 , 则 编 译 器 假 定 为 #pragma unroll (4)。用 法使 用 -O3 -Otime 进 行 编 译 时 , 如 果 编 译 器 认 为 展 开 循 环 比 较 有 利 , 则 会 自 动 将 其展 开 。 可 以 使 用 此 编 译 指 示 请 求 编 译 器 展 开 未 自 动 展 开 的 循 环 。注 意仅 当 有 证 据 表 明 ( 例 如 , 从 --diag_warning=optimizations 中 ), 编 译 器 本 身 没 有以 最 优 方 式 展 开 循 环 时 , 才 应 使 用 此 #pragma。限 制只 能 在 for 循 环 、 while 循 环 或 do ... while 循 环 的 紧 前 面 使 用 #pragma unroll[(n)]。示 例void matrix_multiply(float ** __restrict dest, float ** __restrict src1,float ** __restrict src2, unsigned int n){unsigned int i, j, k;for (i = 0; i < n; i++)4-68 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能}{}for (k = 0; k < n; k++){float sum = 0.0f;/* #pragma unroll */for(j = 0; j < n; j++)sum += src1[i][j] * src2[j][k];dest[i][k] = sum;}在 此 示 例 中 , 编 译 器 没 有 正 常 完 成 其 循 环 分 析 , 因 为 src2 是 以 src2[j][k] 进 行索 引 的 , 而 循 环 是 按 相 反 顺 序 嵌 套 的 , 即 , j 位 于 k 内 部 。 如 果 在 示 例 中 取 消#pragma unroll 注 释 , 编 译 器 将 继 续 展 开 循 环 四 次 。如 果 目 的 是 增 加 大 小 不 是 4 的 倍 数 的 矩 阵 ( 例 如 n * n 矩 阵 ), 则 可 以 改 用#pragma unroll (m), 其 中 , m 是 某 个 值 , 以 使 n 是 m 的 整 数 倍 。另 请 参 阅• 第 2-48 页 的 --diag_warning=optimizations• 第 2-94 页 的 -Onum• 第 2-97 页 的 -Otime• 第 2-127 页 的 --vectorize, --no_vectorize• #pragma unroll_completely• 《 编 译 器 用 户 指 南 》 中 第 5-4 页 的 优 化 循 环 。4.6.24 #pragma unroll_completely此 编 译 指 示 指 示 编 译 器 完 全 展 开 循 环 。 仅 当 编 译 器 可 以 确 定 循 环 包 含 的 迭 代 次数 时 , 它 才 有 效 。注 意使 用 #pragma unroll_completely 可 以 展 开 向 量 化 和 非 向 量 化 循 环 。 即 , #pragmaunroll_completely 适 用 于 --no_vectorize 和 --vectorize。用 法使 用 -O3 -Otime 进 行 编 译 时 , 如 果 编 译 器 认 为 展 开 循 环 比 较 有 利 , 则 会 自 动 将 其展 开 。 可 以 使 用 此 编 译 指 示 请 求 编 译 器 完 全 展 开 未 自 动 完 全 展 开 的 循 环 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-69ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能注 意仅 当 有 证 据 表 明 ( 例 如 , 从 --diag_warning=optimizations 中 ), 编 译 器 本 身 没 有以 最 优 方 式 展 开 循 环 时 , 才 应 使 用 此 #pragma。限 制只 能 在 for 循 环 、 while 循 环 或 do ... while 循 环 的 紧 前 面 使 用 #pragmaunroll_completely。在 外 部 循 环 中 使 用 #pragma unroll_completely 可 防 止 向 量 化 。 另 一 方 面 , 在 某 些情 况 下 , 在 内 部 循 环 中 使 用 #pragma unroll_completely 可 能 会 有 所 帮 助 。另 请 参 阅• 第 2-48 页 的 --diag_warning=optimizations• 第 2-94 页 的 -Onum• 第 2-97 页 的 -Otime• 第 2-127 页 的 --vectorize, --no_vectorize• 第 4-68 页 的 #pragma unroll [(n)]• 《 编 译 器 用 户 指 南 》 中 第 5-4 页 的 优 化 循 环 。4.6.25 #pragma thumb此 编 译 指 示 将 代 码 生 成 切 换 为 Thumb 指 令 集 。 它 覆 盖 --arm 编 译 器 选 项 。如 果 要 针 对 Thumb 2 以 前 的 处 理 器 使 用 VFP 编 译 代 码 , 则 会 为 <strong>ARM</strong> 编 译 所 有包 含 浮 点 运 算 的 函 数 。另 请 参 阅• 第 2-8 页 的 --arm• 第 2-119 页 的 --thumb• 第 4-56 页 的 #pragma arm4-70 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.7 指 令 内 在 函 数本 节 介 绍 C 或 C++ 代 码 中 用 于 实 现 <strong>ARM</strong> 机 器 语 言 指 令 的 指 令 内 在 函 数 。 表 4-7简 要 说 明 了 可 用 内 在 函 数 。指 令 内 在 函 数表 4-7 <strong>ARM</strong> 编 译 器 支 持 的 指 令 内 在 函 数__breakpoint __ldrt __schedule_barrier__cdp __memory_changed __semihost__clrex __nop __sev__clz __pld __sqrt__current_pc __pldw __sqrtf__current_sp __pli __ssat__disable_fiq __promise __strex__disable_irq __qadd __strexd__enable_fiq __qdbl __strt__enable_irq __qsub __swp__fabs __rbit __usat__fabsf __rev __wfe__force_stores __return_address __wfi__ldrex __ror __yield__ldrexd另 请 参 阅 第 4-112 页 的 GNU 内 置 函 数 。4.7.1 __breakpoint此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 BKPT 指 令 。 它 允 许 在 C 或 C++ 代 码 中包 含 断 点 指 令 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-71ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能语 法void __breakpoint(int val)其 中 :val 是 编 译 时 常 数 整 数 , 其 范 围 是 :0 ... 65535 如 果 要 将 源 代 码 编 译 为 <strong>ARM</strong> 代 码0 ... 255 如 果 要 将 源 代 码 编 译 为 Thumb 代 码 。错 误为 不 支 持 BKPT 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __breakpoint 内 在 函 数 。在 这 种 情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。如 果 在 不 支 持 BKPT 指 令 的 体 系 结 构 上 执 行 该 指 令 , 则 会 生 成 未 定 义 的 指 令 陷阱 。示 例void func(void){...__breakpoint(0xF02C);...}另 请 参 阅• 《 汇 编 器 指 南 》 中 第 4-128 页 的 BKPT。4.7.2 __cdp此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 CDP 或 CDP2 指 令 。 它 允 许 在 C 或 C++代 码 中 包 含 协 处 理 器 数 据 运 算 。语 法__cdp(unsigned int coproc, unsigned int opcode1, unsigned int opcode2)其 中 :coproc 确 定 指 令 适 用 的 协 处 理 器 。coproc 必 须 是 一 个 在 0 到 15 范 围 内 的 整 数 。4-72 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能opcode1 是 一 个 协 处 理 器 特 定 的 操 作 码 。将 0x100 添 加 到 操 作 码 中 以 生 成 CDP2 指 令 。opcode2 是 一 个 协 处 理 器 特 定 的 操 作 码 。用 法这 些 指 令 的 具 体 用 法 取 决 于 协 处 理 器 。 有 关 详 细 信 息 , 请 参 阅 协 处 理 器 文 档 。另 请 参 阅• 《 汇 编 器 指 南 》 中 第 4-120 页 的 CDP 和 CDP2。4.7.3 __clrex此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 CLREX 指 令 。 它 允 许 在 C 或 C++ 代 码中 包 含 CLREX 指 令 。语 法void __clrex(void)错 误为 不 支 持 CLREX 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __clrex 内 在 函 数 。 在这 种 情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。另 请 参 阅• 《 汇 编 器 指 南 》 中 第 4-37 页 的 CLREX。4.7.4 __clz此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 CLZ 指 令 或 等 效 的 代 码 序 列 。 它 允 许在 C 或 C++ 代 码 中 计 算 数 据 值 的 前 导 零 个 数 。语 法unsigned char __clz(unsigned int val)其 中 :val是 一 个 unsigned int。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-73ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能返 回 值__clz 内 在 函 数 返 回 val 中 的 前 导 零 个 数 。另 请 参 阅• 第 4-114 页 的 其 他 内 置 函 数• 《 汇 编 器 指 南 》 中 第 4-52 页 的 CLZ。4.7.5 __current_pc通 过 使 用 此 内 在 函 数 , 可 以 确 定 程 序 中 使 用 该 内 在 函 数 的 位 置 处 的 程 序 计 数 器的 当 前 值 。语 法unsigned int __current_pc(void)返 回 值__current_pc 内 在 函 数 返 回 程 序 中 使 用 该 内 在 函 数 的 位 置 处 的 程 序 计 数 器 的 当 前值 。另 请 参 阅• __current_sp• 第 4-89 页 的 __return_address• 《 编 译 器 用 户 指 南 》 中 第 7-25 页 的 访 问 sp、 lr 或 pc 的 旧 内 联 汇 编 器4.7.6 __current_sp此 内 在 函 数 返 回 程 序 中 当 前 位 置 的 堆 栈 指 针 值 。语 法unsigned int __current_sp(void)返 回 值__current_sp 内 在 函 数 返 回 程 序 中 使 用 该 内 在 函 数 的 位 置 处 的 堆 栈 指 针 的 当 前值 。4-74 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能另 请 参 阅• 第 4-114 页 的 其 他 内 置 函 数• 第 4-74 页 的 __current_pc• 第 4-89 页 的 __return_address• 《 编 译 器 用 户 指 南 》 中 第 7-25 页 的 访 问 sp、 lr 或 pc 的 旧 内 联 汇 编 器4.7.7 __disable_fiq此 内 在 函 数 禁 用 FIQ 中 断 。注 意通 常 , 此 内 在 函 数 通 过 设 置 CPSR 中 的 F 位 禁 用 FIQ 中 断 。 但 对 于 v7-M, 它 设置 故 障 掩 码 寄 存 器 (FAULTMASK)。 v6-M 中 不 支 持 FIQ 中 断 。语 法int __disable_fiq(void)注 意在 M-profile 上 , __disable_fiq 内 在 函 数 具 有 以 下 原 型 :void __disable_fiq(void)返 回 值__disable_fiq 返 回 在 禁 用 FIQ 中 断 之 前 FIQ 中 断 掩 码 在 PSR 中 包 含 的 值 。限 制只 能 在 特 权 模 式 ( 即 非 用 户 模 式 ) 下 执 行 __disable_fiq 内 在 函 数 。 在 用 户 模 式下 , 此 内 在 函 数 不 会 更 改 CPSR 中 的 中 断 标 记 。示 例void foo(void){int was_masked = __disable_fiq();/* ... */if (!was_masked)__enable_fiq();}<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-75ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能另 请 参 阅• 第 4-77 页 的 __enable_fiq4.7.8 __disable_irq此 内 在 函 数 禁 用 IRQ 中 断 。注 意通 常 , 此 内 在 函 数 通 过 设 置 CPSR 中 的 I 位 禁 用 IRQ 中 断 。 但 对 于 M-profile,它 设 置 异 常 掩 码 寄 存 器 (PRIMASK)。语 法int __disable_irq(void)注 意在 M-profile 上 , __disable_irq 内 在 函 数 具 有 以 下 原 型 :void __disable_irq(void)返 回 值__disable_irq() 返 回 在 禁 用 IRQ 中 断 之 前 IRQ 中 断 掩 码 在 PSR 中 包 含 的 值 。示 例void foo(void){int was_masked = __disable_irq();/* ... */if (!was_masked)__enable_irq();}限 制只 能 在 特 权 模 式 ( 即 非 用 户 模 式 ) 下 执 行 __disable_irq 内 在 函 数 。 在 用 户 模 式下 , 此 内 在 函 数 不 会 更 改 CPSR 中 的 中 断 标 记 。另 请 参 阅• 第 4-77 页 的 __enable_irq4-76 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.7.9 __enable_fiq此 内 在 函 数 启 用 FIQ 中 断 。注 意通 常 , 此 内 在 函 数 通 过 清 除 CPSR 中 的 F 位 启 用 FIQ 中 断 。 但 对 于 v7-M, 它 清除 故 障 掩 码 寄 存 器 (FAULTMASK)。 v6-M 中 不 支 持 FIQ 中 断 。语 法void __enable_fiq(void)限 制只 能 在 特 权 模 式 ( 即 非 用 户 模 式 ) 下 执 行 __enable_fiq 内 在 函 数 。 在 用 户 模 式下 , 此 内 在 函 数 不 会 更 改 CPSR 中 的 中 断 标 记 。另 请 参 阅• 第 4-75 页 的 __disable_fiq4.7.10 __enable_irq此 内 在 函 数 启 用 IRQ 中 断 。注 意通 常 , 此 内 在 函 数 通 过 清 除 CPSR 中 的 I 位 启 用 IRQ 中 断 。 但 对 于 CortexM-profile 处 理 器 , 它 清 除 异 常 掩 码 寄 存 器 (PRIMASK)。语 法void __enable_irq(void)限 制只 能 在 特 权 模 式 ( 即 非 用 户 模 式 ) 下 执 行 __enable_irq 内 在 函 数 。 在 用 户 模 式下 , 此 内 在 函 数 不 会 更 改 CPSR 中 的 中 断 标 记 。另 请 参 阅• 第 4-76 页 的 __disable_irq<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-77ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.7.11 __fabs此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 VABS 指 令 或 等 效 的 代 码 序 列 。 通 过 使用 此 内 在 函 数 , 可 以 从 C 或 C++ 代 码 中 获 取 双 精 度 浮 点 值 的 绝 对 值 。注 意__fabs 内 在 函 数 类 似 于 标 准 C 库 函 数 fabs。 它 在 以 下 方 面 不 同 于 标 准 库 函 数 :可 确 保 在 基 于 <strong>ARM</strong> 体 系 结 构 且 配 备 VFP 协 处 理 器 的 处 理 器 上 将 __fabs 调 用 编译 为 单 个 内 联 机 器 指 令 。语 法double __fabs(double val)其 中 :val 是 一 个 双 精 度 浮 点 值 。返 回 值__fabs 内 在 函 数 以 double 形 式 返 回 val 的 绝 对 值 。另 请 参 阅• __fabsf• 《 汇 编 器 指 南 》 中 第 5-98 页 的 VABS、 VNEG 和 VSQRT。4.7.12 __fabsf此 内 在 函 数 是 __fabs 内 在 函 数 的 单 精 度 版 本 。 它 与 __fabs 的 功 能 相 当 , 只 不过 :• 它 使 用 float 类 型 的 自 变 量 , 而 不 是 double 类 型 的 自 变 量• 它 返 回 float 值 , 而 不 是 double 值 。另 请 参 阅• __fabs• 《 汇 编 器 指 南 》 中 第 5-59 页 的 V{Q}ABS 和 V{Q}NEG。4-78 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.7.13 __force_stores此 内 在 函 数 导 致 将 在 当 前 函 数 外 部 可 见 的 所 有 变 量 写 回 到 内 存 中 ( 如 果 它 们 已更 改 ), 如 将 其 指 针 传 递 到 该 函 数 或 从 该 函 数 中 传 出 的 变 量 。此 内 在 函 数 还 用 作 调 度 屏 障 。语 法void __force_stores(void)另 请 参 阅• 第 4-83 页 的 __memory_changed• 第 4-91 页 的 __schedule_barrier4.7.14 __ldrex此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 LDREX[size] 格 式 的 指 令 。 它 允 许 在 C或 C++ 代 码 中 使 用 LDREX 指 令 从 内 存 中 加 载 数 据 。 LDREX[size] 中 的 size 是 B( 代 表 字 节 存 储 ) 或 H ( 代 表 半 字 存 储 )。 如 果 没 有 指 定 大 小 , 则 执 行 字 存 储 。语 法unsigned int __ldrex(volatile void *ptr)其 中 :ptr 指 向 要 从 内 存 中 加 载 的 数 据 的 地 址 。 若 要 指 定 要 加 载 的 数 据 类 型 ,请 将 参 数 类 型 转 换 为 相 应 的 指 针 类 型 。指 令 加 载 的 数 据 大 小 C 类 型 转 换LDREXB 无 符 号 字 节 (unsigned char *)LDREXB 有 符 号 字 节 (signed char *)LDREXH 无 符 号 半 字 (unsigned short *)LDREXH 有 符 号 半 字 (short *)LDREX 字 (int *)表 4-8 __ldrex 内 在 函 数 支 持 的 访 问 宽 度<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-79ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能返 回 值__ldrex 内 在 函 数 返 回 从 ptr 指 向 的 内 存 地 址 中 加 载 的 数 据 。错 误为 不 支 持 LDREX 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __ldrex 内 在 函 数 。 在这 种 情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。__ldrex 内 在 函 数 不 支 持 对 双 字 数 据 的 访 问 。 如 果 指 定 了 不 支 持 的 访 问 宽 度 , 编译 器 将 生 成 错 误 。示 例int foo(void){int loc = 0xff;return __ldrex((volatile char *)loc);}使 用 命 令 行 选 项 --cpu=6k 编 译 此 代 码 时 , 将 生 成 以 下 内 容 :||foo|| PROCMOVLDREXBBXENDPr0,#0xffr0,[r0]lr另 请 参 阅• __ldrexd• 第 4-95 页 的 __strex• 第 4-97 页 的 __strexd• 《 汇 编 器 指 南 》 中 第 4-34 页 的 LDREX 和 STREX。4.7.15 __ldrexd此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 LDREXD 指 令 。 它 允 许 在 C 或 C++ 代 码中 使 用 LDREXD 指 令 从 内 存 中 加 载 数 据 。 它 支 持 对 双 字 数 据 的 访 问 。语 法unsigned long long __ldrexd(volatile void *ptr)4-80 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能其 中 :ptr 指 向 要 从 内 存 中 加 载 的 数 据 的 地 址 。 若 要 指 定 要 加 载 的 数 据 类 型 ,请 将 参 数 类 型 转 换 为 相 应 的 指 针 类 型 。指 令 加 载 的 数 据 大 小 C 类 型 转 换LDREXD 无 符 号 long long (unsigned long long *)LDREXD 有 符 号 long long (signed long long *)表 4-9 __ldrex 内 在 函 数 支 持 的 访 问 宽 度返 回 值__ldrexd 内 在 函 数 返 回 从 ptr 指 向 的 内 存 地 址 中 加 载 的 数 据 。错 误为 不 支 持 LDREXD 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __ldrexd 内 在 函 数 。在 这 种 情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。__ldrexd 内 在 函 数 仅 支 持 对 双 字 数 据 的 访 问 。 如 果 指 定 了 不 支 持 的 访 问 宽 度 ,编 译 器 将 生 成 错 误 。另 请 参 阅• 第 4-79 页 的 __ldrex• 第 4-95 页 的 __strex• 第 4-97 页 的 __strexd• 《 汇 编 器 指 南 》 中 第 4-34 页 的 LDREX 和 STREX。4.7.16 __ldrt此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 LDR{size}T 格 式 的 汇 编 语 言 指 令 。 它允 许 在 C 或 C++ 代 码 中 使 用 LDRT 指 令 从 内 存 中 加 载 数 据 。语 法unsigned int __ldrt(const volatile void *ptr)<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-81ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能其 中 :ptr 指 向 要 从 内 存 中 加 载 的 数 据 的 地 址 。 要 指 定 所 加 载 的 数 据 大 小 ,请 将 参 数 类 型 转 换 为 相 应 的 整 型 。表 4-10 __ldrt 内 在 函 数 支 持 的 访 问 宽 度指 令 a加 载 的 数 据 大 小C 类 型 转 换LDRSBT 有 符 号 字 节 (signed char *)LDRBT 无 符 号 字 节 (char *)LDRSHT 有 符 号 半 字 (signed short int *)LDRHT 无 符 号 半 字 (short int *)LDRT 字 (int *)a. 或 等 效 。返 回 值__ldrt 内 在 函 数 返 回 从 ptr 指 向 的 内 存 地 址 中 加 载 的 数 据 。错 误为 不 支 持 LDRT 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __ldrt 内 在 函 数 。 在 这种 情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。__ldrt 内 在 函 数 不 支 持 对 双 字 数 据 的 访 问 。 如 果 指 定 了 不 支 持 的 访 问 宽 度 , 编译 器 将 生 成 错 误 。示 例int foo(void){int loc = 0xff;return __ldrt((const volatile int *)loc);}使 用 缺 省 选 项 编 译 此 代 码 时 , 将 生 成 以 下 内 容 :||foo|| PROCMOVLDRBTMOVr0,#0xffr1,[r0],#0r2,#0x1004-82 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能LDRBT r0,[r2],#0ORR r0,r1,r0,LSL #8BX lrENDP另 请 参 阅• 第 2-119 页 的 --thumb• 《 汇 编 器 指 南 》 中 第 4-17 页 的 LDR 和 STR ( 用 户 模 式 )。4.7.17 __memory_changed此 内 在 函 数 导 致 将 在 当 前 函 数 外 部 可 见 的 所 有 变 量 写 回 到 内 存 中 ( 如 果 它 们 已更 改 ), 然 后 从 内 存 中 重 新 读 取 , 如 将 其 指 针 传 递 到 该 函 数 或 从 该 函 数 中 传 出的 变 量 。此 内 在 函 数 还 用 作 调 度 屏 障 。语 法void __memory_changed(void)另 请 参 阅• 第 4-79 页 的 __force_stores• 第 4-91 页 的 __schedule_barrier4.7.18 __nop此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 NOP 指 令 或 等 效 的 代 码 序 列 。 将 为 源代 码 中 的 每 个 __nop 内 在 函 数 生 成 一 个 NOP 指 令 。除 了 正 常 删 除 不 会 到 达 的 代 码 之 外 , 编 译 器 不 会 优 化 删 除 NOP 指 令 。 __nop 内 在函 数 还 用 作 编 译 器 中 的 指 令 调 度 屏 障 。 即 , 不 会 由 于 优 化 而 将 指 令 从 NOP 一 侧移 到 另 一 侧 。注 意可 以 使 用 __schedule_barrier 内 在 函 数 插 入 调 度 屏 障 , 而 无 需 生 成 NOP 指 令 。语 法void __nop(void)<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-83ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能另 请 参 阅• 第 4-93 页 的 __sev• 第 4-91 页 的 __schedule_barrier• 第 4-101 页 的 __wfe• 第 4-102 页 的 __wfi• 第 4-102 页 的 __yield• 《 汇 编 器 指 南 》 中 第 4-138 页 的 NOP、 SEV、 WFE、 WFI 和 YIELD• 《 编 译 器 用 户 指 南 》 中 第 4-3 页 的 通 用 内 在 函 数 。4.7.19 __pld此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 数 据 预 取 , 例 如 PLD。 它 允 许 从 C 或C++ 程 序 中 发 信 号 通 知 内 存 系 统 , 此 后 不 久 可 能 会 从 某 个 地 址 中 加 载 数 据 。语 法void __pld(...)其 中 :... 表 示 任 意 数 量 的 指 针 或 整 数 自 变 量 , 用 于 指 定 要 预 取 的 内 存 地 址 。限 制如 果 目 标 体 系 结 构 不 支 持 数 据 预 取 , 则 此 内 在 函 数 无 效 。示 例extern int data1;extern int data2;volatile int* interrupt = (volatile int *)0x8000;volatile int* uart = (volatile int *)0x9000;void get(void){__pld(data1, data2);while (!*interrupt);*uart = data1; // trigger uart as soon as interrupt occurs*(uart+1) = data2;}4-84 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能另 请 参 阅• __pldw• 第 4-86 页 的 __pli• 《 汇 编 器 指 南 》 中 第 4-23 页 的 PLD、 PLDW 和 PLI。4.7.20 __pldw此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 PLDW 指 令 。 它 允 许 从 C 或 C++ 程 序 中发 信 号 通 知 内 存 系 统 , 此 后 不 久 可 能 会 从 某 个 要 写 入 的 地 址 中 加 载 数 据 。语 法void __pldw(...)其 中 :... 表 示 任 意 数 量 的 指 针 或 整 数 自 变 量 , 用 于 指 定 要 预 取 的 内 存 地 址 。限 制如 果 目 标 体 系 结 构 不 支 持 数 据 预 取 , 则 此 内 在 函 数 无 效 。此 内 在 函 数 只 在 提 供 多 重 处 理 扩 展 的 <strong>ARM</strong>v7 及 更 高 版 本 的 体 系 结 构 中 有 效 。即 , 在 定 义 了 预 定 义 的 宏 __TARGET_FEATURE_MULTIPROCESSING 时 。示 例void foo(int *bar){__pldw(bar);}另 请 参 阅• 第 4-115 页 的 编 译 器 预 定 义• 第 4-84 页 的 __pld• 第 4-86 页 的 __pli• 《 汇 编 器 指 南 》 中 第 4-23 页 的 PLD、 PLDW 和 PLI。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-85ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.7.21 __pli此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 指 令 预 取 , 例 如 PLI。 它 允 许 从 C 或C++ 程 序 中 发 信 号 通 知 内 存 系 统 , 此 后 不 久 可 能 会 从 某 个 地 址 中 加 载 指 令 。语 法void __pli(...)其 中 :... 表 示 任 意 数 量 的 指 针 或 整 数 自 变 量 , 用 于 指 定 要 预 取 的 指 令 地 址 。限 制如 果 目 标 体 系 结 构 不 支 持 指 令 预 取 , 则 此 内 在 函 数 无 效 。另 请 参 阅• 第 4-84 页 的 __pld• 第 4-85 页 的 __pldw• 《 汇 编 器 指 南 》 中 第 4-23 页 的 PLD、 PLDW 和 PLI。4.7.22 __promise此 内 在 函 数 向 编 译 器 保 证 给 定 的 表 达 式 是 非 零 的 。 这 就 允 许 编 译 器 在 向 量 化 代码 时 执 行 更 积 极 的 优 化 。语 法void __promise(expr)其 中 , expr 是 一 个 具 有 非 零 值 的 表 达 式 。另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 3-16 页 的 使 用 __promise 改 善 向 量 化 性 能 。4-86 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.7.23 __qadd此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 QADD 指 令 或 等 效 的 代 码 序 列 。 它 允 许从 C 或 C++ 代 码 中 获 取 两 个 整 数 的 饱 和 相 加 结 果 。语 法int __qadd(int val1, int val2)其 中 :val1 是 饱 和 相 加 运 算 的 第 一 个 被 加 数val2 是 饱 和 相 加 运 算 的 第 二 个 被 加 数 。返 回 值__qadd 内 在 函 数 返 回 val1 和 val2 的 饱 和 相 加 结 果 。另 请 参 阅• __qdbl• 第 4-88 页 的 __qsub• 《 汇 编 器 指 南 》 中 第 4-90 页 的 QADD、 QSUB、 QDADD 和 QDSUB。4.7.24 __qdbl此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 等 效 于 整 数 与 其 本 身 的 饱 和 相 加 的 指令 。 它 允 许 从 C 或 C++ 代 码 中 获 取 整 数 的 饱 和 加 倍 结 果 。语 法int __qdbl(int val)其 中 :val 是 要 加 倍 的 数 据 值 。返 回 值__qdbl 内 在 函 数 返 回 val 与 其 自 身 的 饱 和 相 加 结 果 , 或 等 效 于 __qadd(val, val)。另 请 参 阅• __qadd<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-87ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.7.25 __qsub此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 QSUB 指 令 或 等 效 的 代 码 序 列 。 它 允 许从 C 或 C++ 代 码 中 获 取 两 个 整 数 的 饱 和 相 减 结 果 。语 法int __qsub(int val1, int val2)其 中 :val1 是 饱 和 相 减 运 算 的 被 减 数val2 是 饱 和 相 减 运 算 的 减 数 。返 回 值__qsub 内 在 函 数 返 回 val1 和 val2 的 饱 和 相 减 结 果 。另 请 参 阅• 第 4-87 页 的 __qadd• 《 汇 编 器 指 南 》 中 第 4-90 页 的 QADD、 QSUB、 QDADD 和 QDSUB。4.7.26 __rbit此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 RBIT 指 令 。 它 允 许 从 C 或 C++ 代 码 中颠 倒 32 位 字 中 的 位 顺 序 。语 法unsigned int __rbit(unsigned int val)其 中 :val 是 要 颠 倒 位 顺 序 的 数 据 值 。返 回 值__rbit 内 在 函 数 通 过 颠 倒 val 位 顺 序 返 回 从 中 获 取 的 值 。另 请 参 阅• 《 汇 编 器 指 南 》 中 第 4-63 页 的 REV、 REV16、 REVSH 和 RBIT。4-88 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.7.27 __rev此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 REV 指 令 或 等 效 的 代 码 序 列 。 它 允 许从 C 或 C++ 代 码 中 将 32 位 大 端 数 据 值 转 换 为 小 端 数 据 值 , 或 者 将 32 位 小 端 数据 值 转 换 为 大 端 数 据 值 。注 意当 编 译 器 识 别 某 些 表 达 式 后 , 将 自 动 引 入 REV。语 法unsigned int __rev(unsigned int val)其 中 :val是 一 个 unsigned int。返 回 值__rev 内 在 函 数 通 过 颠 倒 val 字 节 顺 序 返 回 从 中 获 取 的 值 。另 请 参 阅• 《 汇 编 器 指 南 》 中 第 4-63 页 的 REV、 REV16、 REVSH 和 RBIT。4.7.28 __return_address此 内 在 函 数 返 回 当 前 函 数 的 返 回 地 址 。语 法unsigned int __return_address(void)返 回 值__return_address 内 在 函 数 返 回 在 从 当 前 函 数 返 回 时 使 用 的 链 接 寄 存 器 的 值 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-89ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能限 制__return_address 内 在 函 数 不 影 响 编 译 器 执 行 优 化 的 功 能 , 如 内 联 、 尾 调 用 和 代码 共 享 。 如 果 进 行 了 优 化 , __return_address 返 回 的 值 将 反 映 所 执 行 的 优 化 :不 优 化内 联 优 化如 果 未 执 行 任 何 优 化 , __return_address 从 函 数 foo 中 返 回 的 值 是foo 的 返 回 地 址 。如 果 函 数 foo 已 内 联 到 函 数 bar, 则 __return_address 从 foo 中 返 回的 值 是 bar 的 返 回 地 址 。尾 调 用 优 化 如 果 从 函 数 bar 中 尾 调 用 函 数 foo, 则 __return_address 从 foo 中 返回 的 值 是 bar 的 返 回 地 址 。另 请 参 阅• 第 4-114 页 的 其 他 内 置 函 数• 第 4-74 页 的 __current_pc• 第 4-74 页 的 __current_sp• 《 编 译 器 用 户 指 南 》 中 第 7-25 页 的 访 问 sp、 lr 或 pc 的 旧 内 联 汇 编 器4.7.29 __ror此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 ROR 指 令 或 操 作 数 循 环 移 位 。 它 允 许从 C 或 C++ 代 码 中 将 值 向 右 循 环 移 指 定 的 位 数 。注 意当 编 译 器 识 别 某 些 表 达 式 后 , 将 自 动 引 入 ROR。语 法unsigned int __ror(unsigned int val, unsigned int shift)其 中 :val 是 要 向 右 移 的 值shift 是 在 范 围 1-31 内 移 位 的 常 数 。返 回 值__ror 内 在 函 数 返 回 向 右 循 环 移 shift 位 的 val 值 。4-90 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能另 请 参 阅• 《 汇 编 器 指 南 》 中 第 4-65 页 的 ASR、 LSL、 LSR、 ROR 和 RRX。4.7.30 __schedule_barrier此 内 在 函 数 创 建 一 个 序 列 点 , 编 译 器 没 有 合 并 序 列 点 前 后 的 运 算 。 调 度 屏 障 不会 导 致 更 新 内 存 。 如 果 变 量 保 存 在 寄 存 器 中 , 则 会 对 其 进 行 原 位 更 新 , 而 不 会将 其 写 出 。此 内 在 函 数 类 似 于 __nop 内 在 函 数 , 只 不 过 不 生 成 NOP 指 令 。语 法void schedule_barrier(void)另 请 参 阅• 第 4-83 页 的 __nop4.7.31 __semihost此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 SVC 或 BKPT 指 令 。 它 允 许 从 C 或 C++中 进 行 与 目 标 体 系 结 构 无 关 的 半 主 机 调 用 。语 法int __semihost(int val, const void *ptr)其 中 :val 是 半 主 机 请 求 的 请 求 代 码 。有 关 详 细 信 息 , 请 参 阅 《 开 发 指 南 》 中 的 第 8 章 半 主 机 。ptr 是 一 个 指 向 参 数 / 结 果 块 的 指 针 。有 关 详 细 信 息 , 请 参 阅 《 开 发 指 南 》 中 的 第 8 章 半 主 机 。返 回 值有 关 半 主 机 调 用 结 果 的 详 细 信 息 , 请 参 阅 《 开 发 指 南 》 中 的 第 8 章 半 主 机 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-91ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能用 法可 以 从 C 或 C++ 中 使 用 此 内 在 函 数 为 目 标 和 指 令 集 生 成 相 应 的 半 主 机 调 用 :SVC 0x123456 对 于 所 有 体 系 结 构 , 在 <strong>ARM</strong> 状 态 下 。SVC 0xABBKPT 0xAB在 Thumb 状 态 下 , 不 包 括 <strong>ARM</strong>v7-M。 不 能 保 证 来 自 <strong>ARM</strong>或 第 三 方 的 所 有 调 试 目 标 上 均 会 出 现 这 种 行 为 。对 于 <strong>ARM</strong>v7-M, 仅 限 Thumb-2。限 制<strong>ARM</strong>v7 之 前 的 <strong>ARM</strong> 处 理 器 使 用 SVC 指 令 进 行 半 主 机 调 用 。 不 过 , 如 果 为Cortex M-profile 处 理 器 进 行 编 译 , 则 会 使 用 BKPT 指 令 实 现 半 主 机 。示 例char buffer[100];...void foo(void){__semihost(0x01, (const void *)buf); // equivalent in thumb state to// int __svc(0xAB) my_svc(int, int *);// result = my_svc(0x1, &buffer);}使 用 选 项 --thumb 编 译 此 代 码 时 , 将 生 成 以 下 内 容 :||foo|| PROC...LDR r1,|L1.12|MOVS r0,#1SVC #0xab...|L1.12|...buffer% 4004-92 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能另 请 参 阅• 第 2-30 页 的 --cpu=list• 第 2-119 页 的 --thumb• 第 4-16 页 的 __svc• 《 汇 编 器 指 南 》 中 第 4-128 页 的 BKPT• 《 汇 编 器 指 南 》 中 第 4-129 页 的 SVC• 《 开 发 指 南 》 中 的 第 8 章 半 主 机 。4.7.32 __sev此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 SEV 指 令 。语 法void __sev(void)错 误为 不 支 持 SEV 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __sev 内 在 函 数 。 在 这 种情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。另 请 参 阅• 第 4-83 页 的 __nop• 第 4-101 页 的 __wfe• 第 4-102 页 的 __wfi• 第 4-102 页 的 __yield• 《 汇 编 器 指 南 》 中 第 4-138 页 的 NOP、 SEV、 WFE、 WFI 和 YIELD。4.7.33 __sqrt此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 VFP VSQRT 指 令 。 它 允 许 从 C 或 C++代 码 中 获 取 双 精 度 浮 点 值 的 平 方 根 。注 意__sqrt 内 在 函 数 类 似 于 标 准 C 库 函 数 sqrt。 它 在 以 下 方 面 不 同 于 标 准 库 函 数 :可 确 保 在 基 于 <strong>ARM</strong> 体 系 结 构 且 配 备 VFP 协 处 理 器 的 处 理 器 上 将 __sqrt 调 用 编译 为 单 个 内 联 机 器 指 令 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-93ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能语 法double __sqrt(double val)其 中 :val 是 一 个 双 精 度 浮 点 值 。返 回 值__sqrt 内 在 函 数 以 double 形 式 返 回 val 的 平 方 根 。错 误为 没 有 配 备 VFP 协 处 理 器 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __sqrt 内 在 函数 。 在 这 种 情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。另 请 参 阅• __sqrtf• 《 汇 编 器 指 南 》 中 第 5-98 页 的 VABS、 VNEG 和 VSQRT。4.7.34 __sqrtf此 内 在 函 数 是 __sqrtf 内 在 函 数 的 单 精 度 版 本 。 它 与 __sqrt 的 功 能 相 当 , 只 不过 :• 它 使 用 float 类 型 的 自 变 量 , 而 不 是 double 类 型 的 自 变 量• 它 返 回 float 值 , 而 不 是 double 值 。另 请 参 阅• 第 4-93 页 的 __sqrt• 《 汇 编 器 指 南 》 中 第 5-98 页 的 VABS、 VNEG 和 VSQRT。4.7.35 __ssat此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 SSAT 指 令 。 它 允 许 从 C 或 C++ 代 码 中饱 和 有 符 号 值 。语 法int __ssat(int val, unsigned int sat)4-94 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能其 中 :val 是 要 饱 和 的 值 。sat 是 要 饱 和 到 的 位 位 置 。sat 必 须 在 1 到 32 之 间 。返 回 值__ssat 内 在 函 数 返 回 饱 和 到 有 符 号 范 围 –2 sat–1 ≤ x ≤ 2 sat–1 –1 的 val。错 误为 不 支 持 SSAT 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __ssat 内 在 函 数 。 在 这种 情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。另 请 参 阅• 第 4-100 页 的 __usat• 《 汇 编 器 指 南 》 中 第 4-92 页 的 SSAT 和 USAT。4.7.36 __strex此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 STREX[size] 格 式 的 指 令 。 它 允 许 在 C或 C++ 代 码 中 使 用 STREX 指 令 将 数 据 存 储 到 内 存 中 。语 法int __strex(unsigned int val, volatile void *ptr)其 中 :val 是 要 写 入 到 内 存 中 的 值 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-95ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能ptr指 向 要 写 入 到 内 存 中 的 数 据 的 地 址 。 若 要 指 定 要 写 入 的 数 据 的 大小 , 请 将 参 数 类 型 转 换 为 相 应 的 整 型 。表 4-11 __strex 内 在 函 数 支 持 的 访 问 宽 度指 令 存 储 的 数 据 大 小 C 类 型 转 换STREXB 无 符 号 字 节 (char *)STREXH 无 符 号 半 字 (short *)STREX 字 (int *)返 回 值__strex 内 在 函 数 返 回 以 下 内 容 :0 如 果 STREX 指 令 执 行 成 功1 如 果 STREX 指 令 已 锁 定 。错 误为 不 支 持 STREX 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __strex 内 在 函 数 。 在这 种 情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。__strex 内 在 函 数 不 支 持 对 双 字 数 据 的 访 问 。 如 果 指 定 了 不 支 持 的 访 问 宽 度 , 编译 器 将 生 成 错 误 。示 例int foo(void){int loc=0xff;return(!__strex(0x20, (volatile char *)loc));}使 用 命 令 行 选 项 --cpu=6k 编 译 此 代 码 时 , 将 生 成 以 下 内 容 :||foo|| PROCMOVMOVSTREXBRSBSMOVCCBXENDPr0,#0xffr2,#0x20r1,r2,[r0]r0,r1,#1r0,#0lr4-96 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能另 请 参 阅• 第 4-79 页 的 __ldrex• 第 4-80 页 的 __ldrexd• __strexd• 《 汇 编 器 指 南 》 中 第 4-34 页 的 LDREX 和 STREX。4.7.37 __strexd此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 STREXD 指 令 。 它 允 许 在 C 或 C++ 代 码中 使 用 STREXD 指 令 将 数 据 存 储 到 内 存 中 。 它 支 持 双 字 数 据 到 内 存 的 独 占 存 储 。语 法int __strexd(unsigned long long val, volatile void *ptr)其 中 :val 是 要 写 入 到 内 存 中 的 值 。ptr指 向 要 写 入 到 内 存 中 的 数 据 的 地 址 。 若 要 指 定 要 写 入 的 数 据 的 大小 , 请 将 参 数 类 型 转 换 为 相 应 的 整 型 。表 4-12 __strexd 内 在 函 数 支 持 的 访 问 宽 度指 令 存 储 的 数 据 大 小 C 类 型 转 换STREXD 无 符 号 long long (unsigned long long *)STREXD 有 符 号 long long (signed long long *)返 回 值__strexd 内 在 函 数 返 回 以 下 内 容 :0 如 果 STREXD 指 令 执 行 成 功1 如 果 STREXD 指 令 已 锁 定 。错 误为 不 支 持 STREXD 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __strexd 内 在 函 数 。在 这 种 情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。__strexd 内 在 函 数 仅 支 持 对 双 字 数 据 的 访 问 。 如 果 指 定 了 不 支 持 的 访 问 宽 度 ,编 译 器 将 生 成 错 误 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-97ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能另 请 参 阅• 第 4-79 页 的 __ldrex• 第 4-80 页 的 __ldrexd• 第 4-95 页 的 __strex• 《 汇 编 器 指 南 》 中 第 4-34 页 的 LDREX 和 STREX。4.7.38 __strt此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 STR{size}T 格 式 的 汇 编 语 言 指 令 。 它允 许 在 C 或 C++ 代 码 中 使 用 STRT 指 令 将 数 据 存 储 到 内 存 中 。语 法void __strt(unsigned int val, volatile void *ptr)其 中 :val 是 要 写 入 到 内 存 中 的 值 。ptr指 向 要 写 入 到 内 存 中 的 数 据 的 地 址 。 若 要 指 定 要 写 入 的 数 据 的 大小 , 请 将 参 数 类 型 转 换 为 相 应 的 整 型 。表 4-13 __strt 内 在 函 数 支 持 的 访 问 宽 度指 令 加 载 的 数 据 大 小 C 类 型 转 换STRBT 无 符 号 字 节 (char *)STRHT 无 符 号 半 字 (short int *)STRT 字 (int *)错 误为 不 支 持 STRT 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __strt 内 在 函 数 。 在 这种 情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。__strt 内 在 函 数 不 支 持 对 有 符 号 数 据 或 双 字 数 据 的 访 问 。 如 果 指 定 了 不 支 持 的访 问 宽 度 , 编 译 器 将 生 成 错 误 。4-98 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能示 例void foo(void){int loc=0xff;__strt(0x20, (volatile char *)loc);}编 译 此 代 码 时 , 将 生 成 以 下 内 容 :||foo|| PROCMOVMOVSTRBTBXENDPr0,#0xffr1,#0x20r1,[r0],#0lr另 请 参 阅• 第 2-119 页 的 --thumb• 《 汇 编 器 指 南 》 中 第 4-17 页 的 LDR 和 STR ( 用 户 模 式 )。4.7.39 __swp此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 SWP{size} 指 令 。 它 允 许 从 C 或 C++ 代码 中 在 内 存 位 置 之 间 交 换 数 据 。注 意在 <strong>ARM</strong>v6 和 更 高 版 本 中 , 不 提 倡 使 用 SWP 和 SWPB。语 法unsigned int __swp(unsigned int val, volatile void *ptr)其 中 :val 是 要 写 入 到 内 存 中 的 数 据 值 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-99ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能ptr指 向 要 写 入 到 内 存 中 的 数 据 的 地 址 。 若 要 指 定 要 写 入 的 数 据 的 大小 , 请 将 参 数 类 型 转 换 为 相 应 的 整 型 。表 4-14 __swp 内 在 函 数 支 持 的 访 问 宽 度指 令 加 载 的 数 据 大 小 C 类 型 转 换SWPB 无 符 号 字 节 (char *)SWP 字 (int *)返 回 值在 val 覆 盖 以 前 位 于 ptr 所 指 向 的 内 存 地 址 中 的 数 据 值 之 前 , __swp 内 在 函 数 将返 回 该 值 。示 例int foo(void){int loc=0xff;return(__swp(0x20, (volatile int *)loc));}编 译 此 代 码 时 , 将 生 成 以 下 内 容 :||foo|| PROCMOV r1, #0xffMOV r0, #0x20SWP r0, r0, [r1]BX lrENDP另 请 参 阅• 《 汇 编 器 指 南 》 中 第 4-38 页 的 SWP 和 SWPB。4.7.40 __usat此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 USAT 指 令 。 它 允 许 从 C 或 C++ 代 码 中饱 和 无 符 号 值 。语 法int __usat(unsigned int val, unsigned int sat)4-100 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能其 中 :val 是 要 饱 和 的 值 。sat 是 要 饱 和 到 的 位 位 置 。usat 必 须 在 0 到 31 之 间 。返 回 值__usat 内 在 函 数 返 回 饱 和 到 无 符 号 范 围 0 ≤ x ≤ 2 sat–1 –1 的 val。错 误为 不 支 持 USAT 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __usat 内 在 函 数 。 在 这种 情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。另 请 参 阅• 第 4-94 页 的 __ssat• 《 汇 编 器 指 南 》 中 第 4-92 页 的 SSAT 和 USAT。4.7.41 __wfe此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 WFE 指 令 。在 v6T2 体 系 结 构 上 , WFE 指 令 作 为 NOP 指 令 进 行 执 行 。语 法void __wfe(void)错 误为 不 支 持 WFE 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __wfe 内 在 函 数 。 在 这 种情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。另 请 参 阅• 第 4-102 页 的 __wfi• 第 4-83 页 的 __nop• 第 4-93 页 的 __sev• 第 4-102 页 的 __yield• 《 汇 编 器 指 南 》 中 第 4-138 页 的 NOP、 SEV、 WFE、 WFI 和 YIELD。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-101ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.7.42 __wfi此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 WFI 指 令 。在 v6T2 体 系 结 构 上 , WFI 指 令 作 为 NOP 指 令 进 行 执 行 。语 法void __wfi(void)错 误为 不 支 持 WFI 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __wfi 内 在 函 数 。 在 这 种情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。另 请 参 阅• __yield• 第 4-83 页 的 __nop• 第 4-93 页 的 __sev• 第 4-101 页 的 __wfe• 《 汇 编 器 指 南 》 中 第 4-138 页 的 NOP、 SEV、 WFE、 WFI 和 YIELD。4.7.43 __yield此 内 在 函 数 在 编 译 器 生 成 的 指 令 流 中 插 入 YIELD 指 令 。语 法void __yield(void)错 误为 不 支 持 YIELD 指 令 的 目 标 进 行 编 译 时 , 编 译 器 无 法 识 别 __yield 内 在 函 数 。 在这 种 情 况 下 , 编 译 器 将 生 成 警 告 或 错 误 。4-102 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能另 请 参 阅• 第 4-83 页 的 __nop• 第 4-93 页 的 __sev• 第 4-101 页 的 __wfe• 第 4-102 页 的 __wfi• 《 汇 编 器 指 南 》 中 第 4-138 页 的 NOP、 SEV、 WFE、 WFI 和 YIELD。4.7.44 <strong>ARM</strong>v6 SIMD 内 在 函 数<strong>ARM</strong> 体 系 结 构 v6 指 令 集 体 系 结 构 在 <strong>ARM</strong>v6 中 添 加 了 60 多 条 SIMD 指 令 , 以便 通 过 软 件 有 效 地 实 现 高 性 能 的 媒 体 应 用 程 序 。<strong>ARM</strong> 编 译 器 支 持 映 射 到 <strong>ARM</strong>v6 SIMD 指 令 的 内 在 函 数 。 为 <strong>ARM</strong>v6 体 系 结 构 或处 理 器 编 译 代 码 时 , 可 以 使 用 这 些 内 在 函 数 。 以 下 列 表 给 出 了 这 些 内 在 函 数 的函 数 原 型 。 列 表 中 给 出 的 函 数 原 型 描 述 了 内 在 函 数 实 现 的 原 始 或 基 本 形 式 的<strong>ARM</strong>v6 指 令 。 要 获 取 某 个 内 在 函 数 实 现 的 基 本 指 令 名 称 , 请 删 除 内 在 函 数 名 称前 面 的 下 划 线 (__)。 例 如 , __qadd16 内 在 函 数 对 应 于 <strong>ARM</strong>v6 QADD16 指 令 。注 意可 以 确 保 针 对 <strong>ARM</strong> v6 体 系 结 构 或 处 理 器 将 每 个 <strong>ARM</strong>v6 SIMD 内 在 函 数 编 译 为单 个 内 联 机 器 指 令 。 但 是 , 编 译 器 检 测 到 需 要 执 行 此 操 作 的 场 合 时 , 可 能 会 使用 优 化 形 式 的 基 本 指 令 。<strong>ARM</strong>v6 SIMD 指 令 可 以 在 应 用 程 序 状 态 寄 存 器 (APSR) 中 设 置 GE[3:0] 位 。SIMD 指 令 可 以 更 新 这 些 标 记 以 指 示 SIMD 运 算 的 每 个 8/16 位 片 的 “ 大 于 或 等于 ” 状 态 。<strong>ARM</strong> 编 译 器 将 GE[3:0] 位 视 为 全 局 变 量 。 要 从 C 或 C++ 程 序 中 访 问 这 些 位 , 请执 行 以 下 任 一 操 作 :• 通 过 已 命 名 的 寄 存 器 变 量 访 问 APSR 的 第 16-19 位• 使 用 __sel 内 在 函 数 控 制 SEL 指 令 。unsigned int __qadd16(unsigned int, unsigned int)unsigned int __qadd8(unsigned int, unsigned int)unsigned int __qasx(unsigned int, unsigned int)unsigned int __qsax(unsigned int, unsigned int)unsigned int __qsub16(unsigned int, unsigned int)unsigned int __qsub8(unsigned int, unsigned int)unsigned int __sadd16(unsigned int, unsigned int)unsigned int __sadd8(unsigned int, unsigned int)unsigned int __sasx(unsigned int, unsigned int)unsigned int __sel(unsigned int, unsigned int)<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-103ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能unsigned int __shadd16(unsigned int, unsigned int)unsigned int __shadd8(unsigned int, unsigned int)unsigned int __shasx(unsigned int, unsigned int)unsigned int __shsax(unsigned int, unsigned int)unsigned int __shsub16(unsigned int, unsigned int)unsigned int __shsub8(unsigned int, unsigned int)unsigned int __smlad(unsigned int, unsigned int, unsigned int)unsigned long long __smlald(unsigned int, unsigned int, unsigned long long)unsigned int __smlsd(unsigned int, unsigned int, unsigned int)unsigned long long __smlsld(unsigned int, unsigned int, unsigned long long)unsigned int __smuad(unsigned int, unsigned int)unsigned int __smusd(unsigned int, unsigned int)unsigned int __ssat16(unsigned int, unsigned int)unsigned int __ssax(unsigned int, unsigned int)unsigned int __ssub16(unsigned int, unsigned int)unsigned int __ssub8(unsigned int, unsigned int)unsigned int __sxtab16(unsigned int, unsigned int)unsigned int __sxtb16(unsigned int, unsigned int)unsigned int __uadd16(unsigned int, unsigned int)unsigned int __uadd8(unsigned int, unsigned int)unsigned int __uasx(unsigned int, unsigned int)unsigned int __uhadd16(unsigned int, unsigned int)unsigned int __uhadd8(unsigned int, unsigned int)unsigned int __uhasx(unsigned int, unsigned int)unsigned int __uhsax(unsigned int, unsigned int)unsigned int __uhsub16(unsigned int, unsigned int)unsigned int __uhsub8(unsigned int, unsigned int)unsigned int __uqadd16(unsigned int, unsigned int)unsigned int __uqadd8(unsigned int, unsigned int)unsigned int __uqasx(unsigned int, unsigned int)unsigned int __uqsax(unsigned int, unsigned int)unsigned int __uqsub16(unsigned int, unsigned int)unsigned int __uqsub8(unsigned int, unsigned int)unsigned int __usad8(unsigned int, unsigned int)unsigned int __usada8(unsigned int, unsigned int, unsigned int)unsigned int __usax(unsigned int, unsigned int)unsigned int __usat16(unsigned int, unsigned int)unsigned int __usub16(unsigned int, unsigned int)unsigned int __usub8(unsigned int, unsigned int)unsigned int __uxtab16(unsigned int, unsigned int)unsigned int __uxtb16(unsigned int, unsigned int)另 请 参 阅• 第 4-108 页 的 已 命 名 的 寄 存 器 变 量• 《 汇 编 器 指 南 》 中 第 2-6 页 的 寄 存 器• 《 汇 编 器 指 南 》 中 第 4-61 页 的 SEL• 《 汇 编 器 指 南 》 中 的 第 5 章 NEON 和 VFP 编 程 。4-104 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.7.45 ETSI 基 本 运 算RVCT 支 持 原 始 ETSI 基 本 运 算 系 列 ( 如 ETSI G.729 建 议 :《 使 用 共 轭 结 构 代 数码 激 励 线 性 预 测 (CS-ACELP) 的 8 Kb/s 语 音 编 码 》(Coding of speech at 8 kbit/s usingconjugate-structure algebraic-code-excited linear prediction (CS-ACELP)) 所 述 )。要 在 您 自 己 的 代 码 中 使 用 ETSI 基 本 运 算 , 请 包 含 标 准 头 文 件 dspfns.h。 表 4-15列 出 了 dspfns.h 中 提 供 的 内 在 函 数 。内 在 函 数表 4-15 RVCT 中 支 持 的 ETSI 基 本 运 算abs_s L_add_c L_mult L_sub_c norm_ladd L_deposit_h L_negate mac_r rounddiv_s L_deposit_l L_sat msu_r saturateextract_h L_mac L_shl mult shlextract_l L_macNs L_shr mult_r shrL_abs L_msu L_shr_r negate shr_rL_add L_msuNs L_sub norm_s sub头 文 件 dspfns.h 还 将 某 些 状 态 标 记 作 为 全 局 变 量 公 开 , 以 便 在 C 或 C++ 程 序 中使 用 。 表 4-16 列 出 了 dspfns.h 公 开 的 状 态 标 记 。表 4-16 RVCT 中 公 开 的 ETSI 状 态 标 记状 态 标 记说 明Overflow 溢 出 状 态 标 记 。通 常 , 饱 和 函 数 对 溢 出 具 有 粘 着 效 果 。Carry 进 位 状 态 标 记 。示 例#include #include #include // include ETSI basic operationsint32_t C_L_add(int32_t a, int32_t b){<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-105ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能int32_t c = a + b;if (((a ^ b) & INT_MIN) == 0){if ((c ^ a) & INT_MIN){c = (a < 0) ? INT_MIN : INT_MAX;}}return c;}__asm int32_t asm_L_add(int32_t a, int32_t b){qadd r0, r0, r1bx lr}int32_t foo(int32_t a, int32_t b){int32_t c, d, e, f;Overflow = 0;// set global overflow flagc = C_L_add(a, b); // C saturating addd = asm_L_add(a, b); // assembly language saturating adde = __qadd(a, b); // <strong>ARM</strong> intrinsic saturating addf = L_add(a, b); // ETSI saturating addreturn Overflow ? -1 : c == d == e == f; // returns 1, unless overflow}另 请 参 阅• 头 文 件 dspfns.h 中 的 ETSI 基 本 运 算 定 义 , 其 形 式 为 C 代 码 和 内 在 函 数 的组 合• 《 编 译 器 用 户 指 南 》 中 第 4-6 页 的 ETSI 基 本 运 算• ETSI 建 议 G.191:《 语 音 和 音 频 编 码 标 准 化 软 件 工 具 》 (Software tools forspeech and audio coding standardization)• 《ITU-T 软 件 工 具 库 2005 用 户 手 册 》, 收 录 为 ETSI 建 议 书 G.191 的 一 部 分• ETSI 建 议 G723.1:《 传 输 速 率 为 5.3 和 6.3 Kb/s 的 多 媒 体 通 信 双 速 率 语 音编 码 器 》 (Dual rate speech coder for multimedia communications transmittingat 5.3 and 6.3 kbit/s)• ETSI 建 议 G.729:《 使 用 共 轭 结 构 代 数 码 激 励 线 性 预 测 (CS-ACELP) 的 8Kb/s 语 音 编 码 》 (Coding of speech at 8 kbit/s using conjugate-structurealgebraic-code-excited linear prediction (CS-ACELP))。4-106 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.7.46 C55x 内 在 函 数<strong>ARM</strong> 编 译 器 支 持 某 些 TI C55x 编 译 器 内 在 函 数 的 仿 真 。要 在 您 自 己 的 代 码 中 使 用 TI C55x 内 在 函 数 , 请 包 含 标 准 头 文 件 c55x.h。 表 4-17列 出 了 c55x.h 中 提 供 的 内 在 函 数 。内 在 函 数表 4-17 RVCT 中 支 持 的 TI C55x 内 在 函 数_abss _lshrs _rnd _smas_count _lsadd _norm _smpy_divs _lsmpy _round _sneg_labss _lsneg _roundn _sround_lmax _lsshl _sadd _sroundn_lmin _lssub _shl _sshl_lnorm _max _shrs _ssub_lshl _min _smac示 例#include #include #include // include TI C55x intrinsics__asm int32_t asm_lsadd(int32_t a, int32_t b){qadd r0, r0, r1bx lr}int32_t foo(int32_t a, int32_t b){int32_t c, d, e;c = asm_lsadd(a, b); // assembly language saturating addd = __qadd(a, b); // <strong>ARM</strong> intrinsic saturating adde = _lsadd(a, b); // TI C55x saturating addreturn c == d == e; // returns 1}<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-107ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能另 请 参 阅• 头 文 件 c55x.h, 以 了 解 有 关 <strong>ARM</strong> 的 C55x 内 在 函 数 实 现 的 详 细 信 息• 德 州 仪 器 公 司 的 网 站 http://www.ti.com 上 提 供 有 关 TI 编 译 器 内 在 函 数 信 息的 出 版 物 。4.7.47 已 命 名 的 寄 存 器 变 量通 过 使 用 编 译 器 , 您 可 以 使 用 已 命 名 的 寄 存 器 变 量 访 问 基 于 <strong>ARM</strong> 体 系 结 构 的处 理 器 的 寄 存 器 。 支 持 的 已 命 名 寄 存 器 变 量 为 :• 位 于 文 件 范 围 内• 位 于 局 部 范 围 内 , 但 不 在 函 数 参 数 中 。语 法register type var-name __asm(reg);其 中 :type 是 已 命 名 寄 存 器 变 量 的 类 型 。在 已 命 名 的 寄 存 器 变 量 声 明 中 , 可 以 使 用 与 已 命 名 的 寄 存 器 大 小相 同 的 任 何 类 型 。 该 类 型 可 以 为 结 构 , 但 要 注 意 位 域 布 局 区 分 端标 记 。var-name 是 已 命 名 寄 存 器 变 量 的 名 称 。reg是 一 个 字 符 串 , 表 示 基 于 <strong>ARM</strong> 体 系 结 构 的 处 理 器 上 的 寄 存 器 名称 。表 4-18 中 显 示 了 基 于 <strong>ARM</strong> 体 系 结 构 的 处 理 器 上 可 用 于 已 命 名 寄存 器 变 量 的 寄 存 器 。表 4-18 基 于 <strong>ARM</strong> 体 系 结 构 的 处 理 器 上 提 供 的 已 命 名 寄 存 器寄 存 器 用 于 __asm 的 字 符 串 处 理 器CPSR "cpsr" 或 "apsr" 所 有 处 理 器BASEPRI "basepri" Cortex-M3BASEPRI_MAX "basepri_max" Cortex-M3CONTROL "control" Cortex-M1、 Cortex-M3EAPSR "eapsr" Cortex-M1、 Cortex-M34-108 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能表 4-18 基 于 <strong>ARM</strong> 体 系 结 构 的 处 理 器 上 提 供 的 已 命 名 寄 存 器 ( 续 )寄 存 器 用 于 __asm 的 字 符 串 处 理 器EPSR "epsr" Cortex-M1、 Cortex-M3FAULTMASK "faultmask" Cortex-M3IAPSR "iapsr" Cortex-M1、 Cortex-M3IEPSR "iepsr" Cortex-M1、 Cortex-M3IPSR "ipsr" Cortex-M1、 Cortex-M3MSP "msp" Cortex-M1、 Cortex-M3PRIMASK "primask" Cortex-M1、 Cortex-M3PSP "psp" Cortex-M1、 Cortex-M3r0 到 r12 "r0" 至 "r12" 所 有 处 理 器r13 或 sp "r13" 或 "sp" 所 有 处 理 器r14 或 lr "r14" or "lr" 所 有 处 理 器r15 或 pc "r15" or "pc" 所 有 处 理 器SPSR "spsr" 所 有 处 理 器XPSR "xpsr" Cortex-M1、 Cortex-M3在 包 含 VFP 的 目 标 上 , 表 4-19 中 的 寄 存 器 还 可 用 于 已 命 名 的 寄 存器 变 量 。表 4-19 包 含 VFP 的 目 标 上 提 供 的 已 命 名 寄 存 器寄 存 器用 于 __asm 的 字 符 串FPSID "fpsid"FPSCR "fpscr"FPEXC "fpexc"<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-109ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能示 例void foo(void){register int foo __asm("r0");}在 此 示 例 中 , 将 foo 声 明 为 寄 存 器 r0 的 已 命 名 寄 存 器 变 量 。另 请 参 阅• 《 编 译 器 用 户 指 南 》 中 第 4-9 页 的 已 命 名 的 寄 存 器 变 量 。4-110 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.8 VFP 状 态 内 在 函 数编 译 器 提 供 了 用 于 读 取 浮 点 状 态 和 控 制 寄 存 器 (FPSCR) 的 内 在 函 数 。注 意最 好 使 用 已 命 名 寄 存 器 变 量 的 方 法 代 替 直 接 读 取 此 寄 存 器 。 这 种 方 法 使 得 访 问更 为 有 效 。 请 参 阅 第 4-108 页 的 已 命 名 的 寄 存 器 变 量 。4.8.1 __vfp_status此 内 在 函 数 将 读 取 FPSCR。语 法unsigned int __vfp_status(unsigned int mask, unsigned int flags);错 误如 果 试 图 在 为 没 有 VFP 的 目 标 进 行 编 译 时 使 用 此 内 在 函 数 , 编 译 器 将 生 成 错误 。另 请 参 阅• 有 关 FPSCR 寄 存 器 的 信 息 , 请 参 阅 《<strong>ARM</strong> 体 系 结 构 参 考 手 册 》<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-111ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4.9 GNU 内 置 函 数这 些 函 数 提 供 了 与 GNU 库 头 文 件 的 兼 容 性 。4.9.1 非 标 准 函 数__builtin_alloca(), __builtin_bcmp(), __builtin_exit(), __builtin_gamma(),__builtin_gammaf(), __builtin_gammal(), __builtin_index(), __builtin_rindex(),__builtin_strcasecmp(), __builtin_strncasecmp().4.9.2 C99 函 数__builtin_Exit(), __builtin_acoshf(), __builtin_acoshl(), __builtin_acosh(),__builtin_asinhf(), __builtin_asinhl(), __builtin_asinh(), __builtin_atanhf(),__builtin_atanhl(), __builtin_atanh(), __builtin_cabsf(), __builtin_cabsl(),__builtin_cabs(), __builtin_cacosf(), __builtin_cacoshf(), __builtin_cacoshl(),__builtin_cacosh(), __builtin_cacosl(), __builtin_cacos(), __builtin_cargf(),__builtin_cargl(), __builtin_carg(), __builtin_casinf(), __builtin_casinhf(),__builtin_casinhl(), __builtin_casinh(), __builtin_casinl(), __builtin_casin(),__builtin_catanf(), __builtin_catanhf(), __builtin_catanhl(),__builtin_catanh(), __builtin_catanl(), __builtin_catan(), __builtin_cbrtf(),__builtin_cbrtl(), __builtin_cbrt(), __builtin_ccosf(), __builtin_ccoshf(),__builtin_ccoshl(), __builtin_ccosh(), __builtin_ccosl(), __builtin_ccos(),__builtin_cexpf(), __builtin_cexpl(), __builtin_cexp(), __builtin_cimagf(),__builtin_cimagl(), __builtin_cimag(), __builtin_clogf(), __builtin_clogl(),__builtin_clog(), __builtin_conjf(), __builtin_conjl(), __builtin_conj(),__builtin_copysignf(), __builtin_copysignl(), __builtin_copysign(),__builtin_cpowf(), __builtin_cpowl(), __builtin_cpow(), __builtin_cprojf(),__builtin_cprojl(), __builtin_cproj(), __builtin_crealf(), __builtin_creall(),__builtin_creal(), __builtin_csinf(), __builtin_csinhf(), __builtin_csinhl(),__builtin_csinh(), __builtin_csinl(), __builtin_csin(), __builtin_csqrtf(),__builtin_csqrtl(), __builtin_csqrt(), __builtin_ctanf(), __builtin_ctanhf(),__builtin_ctanhl(), __builtin_ctanh(), __builtin_ctanl(), __builtin_ctan(),__builtin_erfcf(), __builtin_erfcl(), __builtin_erfc(), __builtin_erff(),__builtin_erfl(), __builtin_erf(), __builtin_exp2f(), __builtin_exp2l(),__builtin_exp2(), __builtin_expm1f(), __builtin_expm1l(), __builtin_expm1(),__builtin_fdimf(), __builtin_fdiml(), __builtin_fdim(), __builtin_fmaf(),__builtin_fmal(), __builtin_fmaxf(), __builtin_fmaxl(), __builtin_fmax(),__builtin_fma(), __builtin_fminf(), __builtin_fminl(), __builtin_fmin(),__builtin_hypotf(), __builtin_hypotl(), __builtin_hypot(), __builtin_ilogbf(),__builtin_ilogbl(), __builtin_ilogb(), __builtin_imaxabs(), __builtin_isblank(),__builtin_isfinite(), __builtin_isinf(), __builtin_isnan(), __builtin_isnanf(),__builtin_isnanl(), __builtin_isnormal(), __builtin_iswblank(),__builtin_lgammaf(), __builtin_lgammal(), __builtin_lgamma(), __builtin_llabs(),__builtin_llrintf(), __builtin_llrintl(), __builtin_llrint(),__builtin_llroundf(), __builtin_llroundl(), __builtin_llround(),__builtin_log1pf(), __builtin_log1pl(), __builtin_log1p(), __builtin_log2f(),__builtin_log2l(), __builtin_log2(), __builtin_logbf(), __builtin_logbl(),4-112 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能__builtin_logb(), __builtin_lrintf(), __builtin_lrintl(), __builtin_lrint(),__builtin_lroundf(), __builtin_lroundl(), __builtin_lround(),__builtin_nearbyintf(), __builtin_nearbyintl(), __builtin_nearbyint(),__builtin_nextafterf(), __builtin_nextafterl(), __builtin_nextafter(),__builtin_nexttowardf(), __builtin_nexttowardl(), __builtin_nexttoward(),__builtin_remainderf(), __builtin_remainderl(), __builtin_remainder(),__builtin_remquof(), __builtin_remquol(), __builtin_remquo(), __builtin_rintf(),__builtin_rintl(), __builtin_rint(), __builtin_roundf(), __builtin_roundl(),__builtin_round(), __builtin_scalblnf(), __builtin_scalblnl(),__builtin_scalbln(), __builtin_scalbnf(), __builtin_calbnl(),__builtin_scalbn(), __builtin_signbit(), __builtin_signbitf(),__builtin_signbitl(), __builtin_snprintf(), __builtin_tgammaf(),__builtin_tgammal(), __builtin_tgamma(), __builtin_truncf(), __builtin_truncl(),__builtin_trunc(), __builtin_vfscanf(), __builtin_vscanf(),__builtin_vsnprintf(), __builtin_vsscanf().4.9.3 C90 保 留 命 名 空 间 中 的 C99 函 数__builtin_acosf(), __builtin_acosl(), __builtin_asinf(), __builtin_asinl(),__builtin_atan2f(), __builtin_atan2l(), __builtin_atanf(), __builtin_atanl(),__builtin_ceilf(), __builtin_ceill(), __builtin_cosf(), __builtin_coshf(),__builtin_coshl(), __builtin_cosl(), __builtin_expf(), __builtin_expl(),__builtin_fabsf(), __builtin_fabsl(), __builtin_floorf(), __builtin_floorl(),__builtin_fmodf(), __builtin_fmodl(), __builtin_frexpf(), __builtin_frexpl(),__builtin_ldexpf(), __builtin_ldexpl(), __builtin_log10f(), __builtin_log10l(),__builtin_logf(), __builtin_logl(), __builtin_modfl(), __builtin_modf(),__builtin_powf(), __builtin_powl(), __builtin_sinf(), __builtin_sinhf(),__builtin_sinhl(), __builtin_sinl(), __builtin_sqrtf(), sqrtl, __builtin_tanf(),__builtin_tanhf(), __builtin_tanhl(), __builtin_tanl().4.9.4 C94 函 数__builtin_swalnum(), __builtin_iswalpha(), __builtin_iswcntrl(),__builtin_iswdigit(), __builtin_iswgraph(), __builtin_iswlower(),__builtin_iswprint(), __builtin_iswpunct(), __builtin_iswspace(),__builtin_iswupper(), __builtin_iswxdigit(), __builtin_towlower(),__builtin_towupper().4.9.5 C90 函 数__builtin_abort(), __builtin_abs(), __builtin_acos(), __builtin_asin(),__builtin_atan2(), __builtin_atan(), __builtin_calloc(), __builtin_ceil(),__builtin_cosh(), __builtin_cos(), __builtin_exit(), __builtin_exp(),__builtin_fabs(), __builtin_floor(), __builtin_fmod(), __builtin_fprintf(),__builtin_fputc(), __builtin_fputs(), __builtin_frexp(), __builtin_fscanf(),__builtin_isalnum(), __builtin_isalpha(), __builtin_iscntrl(),__builtin_isdigit(), __builtin_isgraph(), __builtin_islower(),__builtin_isprint(), __builtin_ispunct(), __builtin_isspace(),<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-113ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能__builtin_isupper(), __builtin_isxdigit(), __builtin_tolower(),__builtin_toupper(), __builtin_labs(), __builtin_ldexp(), __builtin_log10(),__builtin_log(), __builtin_malloc(), __builtin_memchr(), __builtin_memcmp(),__builtin_memcpy(), __builtin_memset(), __builtin_modf(), __builtin_pow(),__builtin_printf(), __builtin_putchar(), __builtin_puts(), __builtin_scanf(),__builtin_sinh(), __builtin_sin(), __builtin_snprintf(), __builtin_sprintf(),__builtin_sqrt(), __builtin_sscanf(), __builtin_strcat(), __builtin_strchr(),__builtin_strcmp(), __builtin_strcpy(), __builtin_strcspn(),__builtin_strlen(), __builtin_strncat(), __builtin_strncmp(),__builtin_strncpy(), __builtin_strpbrk(), __builtin_strrchr(),__builtin_strspn(), __builtin_strstr(), __builtin_tanh(), __builtin_tan(),__builtin_vfprintf(), __builtin_vprintf(), __builtin_vsprintf().4.9.6 C99 浮 点 函 数__builtin_huge_val(), __builtin_huge_valf(), __builtin_huge_vall(),__builtin_inf(), __builtin_nan(), __builtin_nanf(), __builtin_nanl(),__builtin_nans(), __builtin_nansf(), __builtin_nansl().4.9.7 其 他 内 置 函 数__builtin_clz(), __builtin_constant_p(), __builtin_ctz(), builtin_ctzl(),__builtin_ctzll(), __builtin_expect(), __builtin_ffs(), __builtin_ffsl(),__builtin_ffsll(), __builtin_frame_address(), __builtin_return_address(),__builtin_popcount(), __builtin_signbit().4-114 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能4.10 编 译 器 预 定 义本 节 介 绍 <strong>ARM</strong> 编 译 器 的 预 定 义 宏 。4.10.1 预 定 义 宏表 4-20 列 出 了 <strong>ARM</strong> 编 译 器 为 C 和 C++ 预 定 义 的 宏 名 称 。 如 果 值 字 段 为 空 , 则表 明 只 定 义 了 符 号 。名 称 值 定 义 时 间__arm__ – 始 终 为 <strong>ARM</strong> 编 译 器 定 义 , 即 使 指 定 了 --thumb 选 项 。另 请 参 阅 __<strong>ARM</strong>CC_VERSION表 4-20 预 定 义 宏__<strong>ARM</strong>CC_VERSION ver 始 终 定 义 。 它 是 一 个 十 进 制 数 字 , 可 确 保 随 着 版 本 的 更 新 而 增加 。 格 式 为 PVbbbb, 其 中 :• P 是 主 版 本• V 是 次 版 本• bbbb 是 内 部 版 本 号 。注 意可 以 使 用 此 编 号 区 别 RVCT 和 用 于 定 义 __arm__ 的 其 他 工 具 。__APCS_INTERWORK – 指 定 --apcs /interwork 选 项 或 将 CPU 体 系 结 构 设 置 为 <strong>ARM</strong>v5T或 更 高 版 本 时 。__APCS_ROPI – 指 定 --apcs /ropi 选 项 时 。__APCS_RWPI – 指 定 --apcs /rwpi 选 项 时 。__APCS_FPIC – 指 定 --apcs /fpic 选 项 时 。__ARRAY_OPERATORS – 在 C++ 编 译 器 模 式 下 指 定 启 用 数 组 新 建 和 删 除 。__BASE_FILE__ name 始 终 定 义 。 类 似 于 __FILE__, 但 指 示 的 是 主 源 文 件 而 不 是 当 前 文件 ( 即 , 当 前 文 件 是 所 包 含 的 文 件 时 )。__BIG_ENDIAN – 如 果 为 大 端 目 标 进 行 编 译 。_BOOL – 在 C++ 编 译 器 模 式 下 , 将 bool 指 定 为 关 键 字 。__cplusplus – 在 C++ 编 译 器 模 式 下 。__CC_<strong>ARM</strong> 1 对 于 <strong>ARM</strong> 编 译 器 , 始 终 设 置 为 1, 即 使 指 定 了 --thumb 选 项 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-115ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能表 4-20 预 定 义 宏 ( 续 )名 称 值 定 义 时 间__CHAR_UNSIGNED__ – 在 GNU 模 式 下 。 当 且 仅 当 char 为 无 符 号 类 型 时 , 才 会 对 其 进 行定 义 。__DATE__ date 始 终 定 义 。__EDG__ – 始 终 定 义 。__EDG_IMPLICIT_USING_STD – 在 C++ 模 式 下 指 定 --implicit_using_std 选 项 时 。__EDG_VERSION__ – 始 终 设 置 为 整 型 值 , 它 表 示 Edison Design Group (EDG) 前 端 的 版本 号 。 例 如 , 将 3.8 版 表 示 为 308。EDG 前 端 的 版 本 号 不 必 与 RVCT 或 <strong>RealView</strong> Development Suite 版本 号 相 匹 配 。__EXCEPTIONS 1 在 C++ 模 式 下 指 定 --exceptions 选 项 时 。__FEATURE_SIGNED_CHAR – 指 定 --signed_chars 选 项 ( 由 CHAR_MIN 和 CHAR_MAX 使 用 ) 时 。__FILE__ name 始 终 定 义 为 字 符 串 文 字 。__FP_FAST – 指 定 --fpmode=fast 选 项 时 。__FP_FENV_EXCEPTIONS – 指 定 --fpmode=ieee_full 或 --fpmode=ieee_fixed 选 项 时 。__FP_FENV_ROUNDING – 指 定 --fpmode=ieee_full 选 项 时 。__FP_IEEE – 指 定 --fpmode=ieee_full、--fpmode=ieee_fixed 或--fpmode=ieee_no_fenv 选 项 时 。__FP_INEXACT_EXCEPTION – 指 定 --fpmode=ieee_full 选 项 时 。__GNUC__ ver 指 定 --gnu 选 项 时 。 它 是 一 个 整 数 , 用 于 显 示 所 使 用 的 GNU 模 式的 当 前 主 版 本 。__GNUC_MINOR__ ver 指 定 --gnu 选 项 时 。 它 是 一 个 整 数 , 用 于 显 示 所 使 用 的 GNU 模 式的 当 前 次 版 本 。__GNUG__ ver 在 GNU 模 式 下 指 定 --cpp 选 项 时 。 它 具 有 与 __GNUC__ 相 同 的 值 。__IMPLICIT_INCLUDE – 指 定 --implicit_include 选 项 时 。__INTMAX_TYPE__ – 在 GNU 模 式 下 。 它 为 intmax_t typedef 定 义 正 确 的 基 础 类 型 。__LINE__ num 始 终 设 置 。 它 是 包 含 此 宏 的 源 代 码 行 的 行 号 。4-116 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能表 4-20 预 定 义 宏 ( 续 )名 称 值 定 义 时 间__MODULE__ mod 包 含 __FILE__ 值 的 文 件 名 部 分 。__NO_INLINE__ – 在 GNU 模 式 下 指 定 --no_inline 选 项 时 。__OPTIMISE_LEVEL num 缺 省 情 况 下 , 始 终 设 置 为 2, 除 非 使 用 -Onum 选 项 更 改 了 优 化 级别 。__OPTIMISE_SPACE – 指 定 -Ospace 选 项 时 。__OPTIMISE_TIME – 指 定 -Otime 选 项 时 。__OPTIMIZE__ – 在 GNU 模 式 下 指 定 -O1、-O2 或 -O3 时 。__OPTIMIZE_SIZE__ – 在 GNU 模 式 下 指 定 -Ospace 时 。__PLACEMENT_DELETE – 在 C++ 模 式 下 指 定 启 用 位 置 删 除 ( 即 , 在 构 造 函 数 抛 出 异 常 时调 用 的 与 位 置 运 算 符 new 对 应 的 运 算 符 delete)。 这 仅 适 用 于 使用 异 常 的 情 况 。__PTRDIFF_TYPE__ – 在 GNU 模 式 下 。 它 为 ptrdiff_t typedef 定 义 正 确 的 基 础 类 型 。__RTTI – 在 C++ 模 式 下 启 用 RTTI 时 。__sizeof_int 4 用 于 sizeof(int), 但 在 预 处 理 程 序 表 达 式 中 可 用 。__sizeof_long 4 用 于 sizeof(long), 但 在 预 处 理 程 序 表 达 式 中 可 用 。__sizeof_ptr 4 用 于 sizeof(void *), 但 在 预 处 理 程 序 表 达 式 中 可 用 。__SIZE_TYPE__ – 在 GNU 模 式 下 。 它 为 size_t typedef 定 义 正 确 的 基 础 类 型 。__SOFTFP__ – 如 果 编 译 为 使 用 软 件 浮 点 调 用 标 准 和 库 。 为 <strong>ARM</strong> 或 Thumb 指 定--fpu=softvfp 选 项 或 者 为 Thumb 指 定 --fpu=softvfp+vfpv2 时 设置 。__STDC__ – 在 所 有 编 译 器 模 式 下 。__STDC_VERSION__ – 标 准 版 本 信 息 。__STRICT_ANSI__ – 指 定 --strict 选 项 时 。__SUPPORT_SNAN__ – 指 定 --fpmode=ieee_fixed 或 --fpmode=ieee_full 时 支 持 信 号 NaN。__TARGET_ARCH_<strong>ARM</strong> num 目 标 CPU 的 <strong>ARM</strong> 基 本 体 系 结 构 编 号 , 与 编 译 器 为 <strong>ARM</strong> 还 是 为Thumb 进 行 编 译 无 关 。 若 要 了 解 与 <strong>ARM</strong> 体 系 结 构 版 本 有 关 的__TARGET_ARCH_<strong>ARM</strong> 可 能 值 , 请 参 阅 第 4-121 页 的 表 4-21。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-117ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能表 4-20 预 定 义 宏 ( 续 )名 称 值 定 义 时 间__TARGET_ARCH_THUMB num 目 标 CPU 的 Thumb 基 本 体 系 结 构 编 号 , 与 编 译 器 为 <strong>ARM</strong> 还 是为 Thumb 进 行 编 译 无 关 。 如 果 目 标 不 支 持 Thumb, 则 将 该 值 定义 为 零 。 若 要 了 解 与 <strong>ARM</strong> 体 系 结 构 版 本 有 关 的__TARGET_ARCH_THUMB 可 能 值 , 请 参 阅 第 4-121 页 的 表 4-21。__TARGET_ARCH_XX – XX 表 示 目 标 体 系 结 构 , 它 的 值 取 决 于 目 标 体 系 结 构 。 例 如 , 如 果指 定 编 译 器 选 项 --cpu=4T 或 --cpu=<strong>ARM</strong>7TDMI, 则 会 定 义__TARGET_ARCH_4T。__TARGET_CPU_XX – XX 表 示 目 标 CPU。 XX 值 是 从 --cpu 编 译 器 选 项 中 获 取 的 , 如 果没 有 指 定 任 何 选 项 , 则 使 用 缺 省 值 。 例 如 , 如 果 指 定 编 译 器 选 项--cpu=<strong>ARM</strong>7TM, 则 会 定 义 __TARGET_CPU_<strong>ARM</strong>7TM, 而 不 会 定 义 以__TARGET_CPU_ 开 头 的 任 何 其 他 符 号 。如 果 指 定 了 目 标 体 系 结 构 , 则 会 定 义 __TARGET_CPU_generic。如 果 处 理 器 名 称 包 含 连 字 符 (-), 则 会 将 其 映 射 为 下 划 线 (_)。 例如 , 将 --cpu=<strong>ARM</strong>1136JF-S 映 射 为 __TARGET_CPU_<strong>ARM</strong>1136JF_S。__TARGET_FEATURE_DOUBLEWORD – <strong>ARM</strong>v5T 和 更 高 版 本 。__TARGET_FEATURE_DSPMUL – 如 果 可 以 使 用 DSP 增 强 的 乘 法 器 , 例 如 <strong>ARM</strong>v5TE。__TARGET_FEATURE_MULTIPLY – 如 果 目 标 体 系 结 构 支 持 长 整 型 乘 法 指 令 MULL 和 MULAL。__TARGET_FEATURE_DIVIDE – 如 果 目 标 体 系 结 构 支 持 硬 件 除 法 指 令 ( 即 , <strong>ARM</strong>v7-M 或<strong>ARM</strong>v7-R)。__TARGET_FEATURE_MULTIPROCESSING – 指 定 以 下 任 一 选 项 时 :• --cpu=Cortex-A9• --cpu=Cortex-A9.no_neon• --cpu=Cortex-A9.no_neon.no_vfp__TARGET_FEATURE_THUMB – 如 果 目 标 体 系 结 构 支 持 Thumb、 <strong>ARM</strong>v4T 或 更 高 版 本 。4-118 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能表 4-20 预 定 义 宏 ( 续 )名 称 值 定 义 时 间__TARGET_FPU_xx – 设 置 以 下 宏 之 一 以 指 示 使 用 FPU 的 情 形 :• __TARGET_FPU_NONE• __TARGET_FPU_VFP• __TARGET_FPU_SOFTVFP此 外 , 如 果 使 用 以 下 --fpu 选 项 进 行 编 译 , 则 相 应 的 目 标 名 称 设置 为 :• --fpu=softvfp+vfpv2, __TARGET_FPU_SOFTVFP_VFPV2• --fpu=softvfp+vfpv3, __TARGET_FPU_SOFTVFP_VFPV3• --fpu=softvfp+vfpv3_fp16, __TARGET_FPU_SOFTVFP_VFPV3_FP16• --fpu=softvfp+vfpv3_d16, __TARGET_FPU_SOFTVFP_VFPV3_D16• --fpu=softvfp+vfpv3_d16_fp16,__TARGET_FPU_SOFTVFP_VFPV3_D16_FP16• --fpu=vfpv2, __TARGET_FPU_VFPV2• --fpu=vfpv3, __TARGET_FPU_VFPV3• --fpu=vfpv3_fp16, __TARGET_FPU_VFPV3_FP16• --fpu=vfpv3_d16, __TARGET_FPU_VFPV3_D16• --fpu=vfpv3_d16_fp16, __TARGET_FPU_VFPV3_D16_FP16有 关 详 细 信 息 , 请 参 阅 第 2-61 页 的 --fpu=name。__TARGET_PROFILE_A 指 定 --cpu=7-A 选 项 时 。__TARGET_PROFILE_R 指 定 --cpu=7-R 选 项 时 。__TARGET_PROFILE_M 指 定 以 下 任 一 选 项 时 :• --cpu=6-M• --cpu=6S-M• --cpu=7-M<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-119ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能表 4-20 预 定 义 宏 ( 续 )名 称 值 定 义 时 间__thumb__ – 编 译 器 处 于 Thumb 模 式 时 。 即 , 在 命 令 行 指 定 了 --thumb 选 项 或在 源 代 码 中 指 定 了 #pragma thumb。注 意• 即 使 为 Thumb 进 行 编 译 , 编 译 器 也 可 能 会 生 成 某 些 <strong>ARM</strong>代 码 。• 在 使 用 #pragma thumb 或 #pragma arm 时 , 将 会 定 义 或 不 定 义__thumb 或 __thumb__, 但 在 作 为 <strong>ARM</strong> 代 码 生 成 Thumb 函 数的 情 况 下 , 它 们 不 会 由 于 其 他 原 因 ( 例 如 , 将 函 数 指 定 为__irq) 而 发 生 改 变 。__TIME__ time 始 终 定 义 。__UINTMAX_TYPE__ – 在 GNU 模 式 下 。 它 为 uintmax_t typedef 定 义 正 确 的 基 础 类 型 。__USER_LABEL_PREFIX__在 GNU 模 式 下 。 它 定 义 空 字 符 串 。 此 宏 由 一 些 Linux 头 文 件 使用 。__VERSION__ ver 指 定 --gnu 选 项 时 。 它 是 一 个 字 符 串 , 用 于 显 示 所 使 用 的 GNU 模式 的 当 前 版 本 。_WCHAR_T – 在 C++ 模 式 下 , 将 wchar_t 指 定 为 关 键 字 。__WCHAR_TYPE__ – 在 GNU 模 式 下 。 它 为 wchar_t typedef 定 义 正 确 的 基 础 类 型 。__WCHAR_UNSIGNED__ – 在 GNU 模 式 下 指 定 --cpp 选 项 时 。 仅 当 wchar_t 为 无 符 号 类 型时 , 才 会 对 其 进 行 定 义 。__WINT_TYPE__ – 在 GNU 模 式 下 。 它 为 wint_t typedef 定 义 正 确 的 基 础 类 型 。4-120 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


编 译 器 特 有 的 功 能表 4-21 显 示 了 __TARGET_ARCH_THUMB 的 可 能 值 ( 请 参 阅 第 4-115 页 的 表 4-20),以 及 这 些 值 与 <strong>ARM</strong> 体 系 结 构 版 本 之 间 的 关 系 。表 4-21 Thumb 体 系 结 构 版 本 与 <strong>ARM</strong> 体 系 结 构 版 本 的 关 系<strong>ARM</strong> 体 系 结 构 __TARGET_ARCH_<strong>ARM</strong> __TARGET_ARCH_THUMBv4 4 0v4T 4 1v5T、 v5TE、v5TEJ5 2v6、 v6K、 v6Z 6 3v6T2 6 4v6-M、 v6S-M 0 3v7-A、 v7-R 7 4v7-M 0 44.10.2 函 数 名 称表 4-22 列 出 了 <strong>ARM</strong> 编 译 器 为 C 和 C++ 支 持 的 内 置 变 量 。表 4-22 内 置 变 量名 称值__FUNCTION__ 保 留 函 数 名 称 , 它 与 源 代 码 中 显 示 的 名 称 相 同 。__FUNCTION__ 是 一 个 常 数 字 符 串 文 字 。 无 法 通 过 使 用 预 处 理 程 序 , 将 内 容 与 其 他文 本 合 并 在 一 起 以 组 成 新 的 标 记 。__PRETTY_FUNCTION__ 保 留 函 数 名 称 , 它 基 本 上 是 以 语 言 特 定 的 方 式 输 出 的 。__PRETTY_FUNCTION__ 是 一 个 常 数 字 符 串 文 字 。 无 法 通 过 使 用 预 处 理 程 序 , 将 内 容与 其 他 文 本 合 并 在 一 起 以 组 成 新 的 标 记 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 4-121ID090708Non-Confidential, Unrestricted Access


编 译 器 特 有 的 功 能4-122 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


第 5 章C 和 C++ 实 现 细 节本 章 介 绍 <strong>ARM</strong> 编 译 器 的 语 言 实 现 细 节 。 本 章 内 容 如 下 :• 第 5-2 页 的 C 和 C++ 实 现 细 节• 第 5-13 页 的 C++ 实 现 细 节<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-1ID090708Non-Confidential, Unrestricted Access


C 和 C++ 实 现 细 节5.1 C 和 C++ 实 现 细 节本 节 介 绍 适 用 于 C 和 C++ 的 语 言 实 现 细 节 。5.1.1 字 符 集 和 标 识 符以 下 内 容 适 用 于 编 译 器 所 需 的 字 符 集 和 标 识 符 :• 在 所 有 内 部 和 外 部 标 识 符 中 , 大 写 和 小 写 字 符 是 不 同 的 。 除 非 指 定--strict 编 译 器 选 项 , 否 则 , 标 识 符 还 可 能 包 含 美 元 ($) 字 符 。 在 使 用--strict 选 项 的 情 况 下 , 要 允 许 标 识 符 中 包 含 美 元 符 号 , 还 应 使 用--dollar 命 令 行 选 项 。• 通 过 调 用 setlocale(LC_CTYPE, "ISO8859-1"), 可 使 isupper() 和 islower() 函数 按 预 期 方 式 使 用 完 整 8 位 Latin-1 字 符 集 , 而 不 是 使 用 7 位 ASCII 子 集 。必 须 在 链 接 时 选 择 语 言 环 境 。• 源 文 件 会 根 据 当 前 所 选 的 语 言 环 境 进 行 编 译 。 如 果 源 文 件 包 含 非 ASCII 字符 , 则 可 能 需 要 使 用 --locale 命 令 行 选 项 选 择 其 他 语 言 环 境 。 有 关 详 细 信息 , 请 参 阅 《 编 译 器 用 户 指 南 》 中 第 2-2 页 的 调 用 <strong>ARM</strong> 编 译 器 。• <strong>ARM</strong> 编 译 器 支 持 多 字 节 字 符 集 , 例 如 Unicode。• 源 代 码 字 符 集 的 其 他 属 性 因 主 机 而 异 。执 行 字 符 集 的 属 性 因 目 标 而 异 。 <strong>ARM</strong> C 和 C++ 库 支 持 ISO 8859-1 (Latin-1 字母 表 ) 字 符 集 , 并 产 生 以 下 结 果 :• 执 行 字 符 集 与 源 代 码 字 符 集 完 全 相 同 。• 执 行 字 符 集 中 的 字 符 有 8 位 。• int 中 有 4 个 字 符 ( 字 节 )。 如 果 内 存 系 统 为 :小 端字 节 的 排 列 顺 序 是 : 最 低 有 效 位 在 最 低 地 址 , 最 高 有效 位 在 最 高 地 址 。大 端字 节 的 排 列 顺 序 是 : 最 低 有 效 位 在 最 高 地 址 , 最 高 有效 位 在 最 低 地 址 。• 在 C 中 , 所 有 字 符 常 数 的 类 型 都 为 int。 在 C++ 中 , 包 含 一 个 字 符 的 字 符常 数 的 类 型 为 char, 包 含 多 个 字 符 的 字 符 常 数 的 类 型 为 int。 整 型 值 最 多可 以 表 示 4 个 常 数 字 符 。 常 数 中 的 最 后 一 个 字 符 占 用 整 型 值 的 最 低 顺 序 字节 。 前 面 最 多 三 个 字 符 放 在 更 高 顺 序 的 字 节 。 将 使 用 NULL (\0) 字 符 填 充 未用 字 节 。5-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


C 和 C++ 实 现 细 节• 表 5-1 列 出 了 包 含 单 个 字 符 或 字 符 转 义 序 列 的 所 有 整 型 字 符 常 数 , 并 用 源代 码 和 执 行 字 符 集 表 示 它 们 。转 义 序 列 字 符 值 说 明\a 7 注 意 ( 铃 声 )\b 8 退 格 符\t 9 水 平 制 表 符\n 10 换 行 符\v 11 垂 直 制 表 符\f 12 换 页 符\r 13 回 车 符表 5-1 字 符 转 义 码\xnn 0xnn 十 六 进 制 的 ASCII 码\nnn 0nnn 八 进 制 的 ASCII 码• 字 符 串 文 字 和 字 符 常 数 中 的 源 代 码 字 符 集 字 符 等 同 地 映 射 到 执 行 字 符 集 。• 缺 省 情 况 下 , char 类 型 的 数 据 项 没 有 符 号 。 可 以 显 式 地 将 它 们 声 明 为signed char 或 unsigned char:— 可 以 使 用 --signed_chars 选 项 将 char 变 为 有 符 号 的 数 据 。— 可 以 使 用 --unsigned_chars 选 项 将 char 变 为 无 符 号 的 数 据 。注 意如 果 要 混 合 已 使 用 和 未 使 用 --signed_chars 和 --unsigned_chars 选 项 编 译 的转 换 单 元 , 并 且 它 们 使 用 相 同 的 接 口 或 数 据 结 构 , 则 必 须 格 外 小 心 。<strong>ARM</strong> ABI 将 char 定 义 为 无 符 号 字 节 , 这 是 RVCT 附 带 提 供 的 C++ 库 使 用的 解 释 。• 不 使 用 任 何 语 言 环 境 将 多 字 节 字 符 转 换 为 宽 字 符 常 数 的 相 应 宽 字 符 。 这 与通 常 的 实 现 无 关 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-3ID090708Non-Confidential, Unrestricted Access


C 和 C++ 实 现 细 节5.1.2 基 本 数 据 类 型本 节 介 绍 了 如 何 在 <strong>ARM</strong> C 和 C++ 中 实 现 基 本 数 据 类 型 。基 本 数 据 类 型 的 大 小 和 对 齐表 5-2 列 出 了 基 本 数 据 类 型 的 大 小 和 自 然 对 齐 。表 5-2 数 据 类 型 的 大 小 和 对 齐类 型 大 小 ( 位 ) 自 然 对 齐 ( 字 节 )char 8 1 ( 字 节 对 齐 )short 16 2 ( 半 字 对 齐 )int 32 4 ( 字 对 齐 )long 32 4 ( 字 对 齐 )long long 64 8 ( 双 字 对 齐 )float 32 4 ( 字 对 齐 )double 64 8 ( 双 字 对 齐 )long double 64 8 ( 双 字 对 齐 )所 有 指 针 32 4 ( 字 对 齐 )bool ( 仅 适 用 于 C++) 8 1 ( 字 节 对 齐 )_Bool ( 仅 适 用 于 C a )8 1 ( 字 节 对 齐 )wchar_t ( 仅 适 用 于 C++) 16 2 ( 半 字 对 齐 )a. 可 以 使 用 stdbool.h 在 C 中 定 义 bool 宏 。类 型 对 齐 因 上 下 文 而 异 :• 局 部 变 量 通 常 保 存 在 寄 存 器 中 , 但 在 局 部 变 量 溢 出 到 堆 栈 中 时 , 它 们 始 终是 字 对 齐 的 。 例 如 , 溢 出 的 局 部 变 量 char 以 4 为 边 界 对 齐 。• 压 缩 类 型 的 自 然 对 齐 边 界 为 1。有 关 详 细 信 息 , 请 参 阅 第 5-7 页 的 结 构 、 联 合 、 枚 举 和 位 域 。5-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


C 和 C++ 实 现 细 节整 数整 数 以 2 的 补 码 形 式 表 示 。 在 小 端 模 式 下 , long long 的 低 字 位 于 低 位 地 址 ; 在大 端 模 式 下 , 其 低 字 位 于 高 位 地 址 。浮 点浮 点 量 以 IEEE 格 式 进 行 存 储 :• float 值 由 IEEE 单 精 度 值 表 示• double 和 long double 值 由 IEEE 双 精 度 值 表 示 。对 于 double 和 long double 量 : 在 大 端 模 式 下 , 包 含 符 号 、 指 数 和 尾 数 的 最 有 效部 分 的 字 存 储 在 低 机 器 地 址 中 ; 在 小 端 模 式 下 , 则 存 储 在 高 机 器 地 址 中 。 有 关详 细 信 息 , 请 参 阅 第 5-6 页 的 浮 点 类 型 运 算 。数 组 和 指 针以 下 说 明 适 用 于 C 和 C++ 中 的 所 有 指 向 对 象 的 指 针 , 而 不 适 用 于 指 向 成 员 的 指针 :• 相 邻 字 节 的 地 址 相 差 1。• 宏 NULL 扩 展 为 值 0。• 整 数 和 指 针 之 间 的 类 型 转 换 不 会 改 变 表 示 形 式 。• 对 于 指 向 函 数 的 指 针 和 指 向 数 据 的 指 针 之 间 的 类 型 转 换 , 编 译 器 将 会 发 出警 告 。• size_t 类 型 被 定 义 为 unsigned int。• ptrdiff_t 类 型 被 定 义 为 signed int。5.1.3 基 本 数 据 类 型 运 算<strong>ARM</strong> 编 译 器 执 行 ISO C99 和 ISO C++ 标 准 的 相 关 部 分 中 介 绍 的 常 见 算 术 转 换 。以 下 几 个 小 节 介 绍 了 与 算 术 运 算 有 关 的 其 他 内 容 。另 请 参 阅 第 B-7 页 的 表 达 式 求 值 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-5ID090708Non-Confidential, Unrestricted Access


C 和 C++ 实 现 细 节整 型 运 算以 下 说 明 适 用 于 整 型 运 算 :• 所 有 有 符 号 的 整 型 算 法 使 用 2 的 补 码 表 示 形 式 。• 有 符 号 整 型 的 位 运 算 遵 循 根 据 2 的 补 码 表 示 形 式 自 然 形 成 的 规 则 。 不 会 进行 符 号 扩 展 。• 有 符 号 量 的 右 移 是 算 术 移 位 。• 对 于 int 类 型 的 值 ,— 没 有 定 义 在 范 围 0 到 127 以 外 的 移 位 。— 超 过 31 位 的 左 移 结 果 为 零 。— 无 符 号 值 或 有 符 号 正 值 超 过 31 位 的 右 移 结 果 为 零 。 有 符 号 负 值 的 移位 结 果 为 –1。• 对 于 long long 类 型 的 值 , 没 有 定 义 在 范 围 0 到 63 以 外 的 移 位 。• 按 照 ISO C99 标 准 的 规 定 , 整 数 除 法 余 数 的 符 号 与 被 除 数 相 同 。• 如 果 整 型 值 被 截 断 为 较 短 的 有 符 号 整 型 , 可 通 过 丢 弃 适 当 数 量 的 最 高 有 效位 来 获 得 结 果 。 对 于 新 类 型 来 说 , 如 果 原 始 数 是 太 大 的 正 或 负 数 , 则 无 法保 证 结 果 的 符 号 与 原 始 数 相 同 。• 整 型 之 间 的 转 换 不 会 产 生 异 常 。• 整 数 溢 出 不 会 产 生 异 常 。• 缺 省 情 况 下 , 整 数 被 零 除 将 返 回 零 。浮 点 类 型 运 算以 下 说 明 适 用 于 浮 点 类 型 运 算 :• 标 准 IEEE 754 规 则 适 用 。• 缺 省 情 况 下 , 舍 入 到 最 接 近 的 可 表 示 的 值 。• 缺 省 情 况 下 , 禁 用 浮 点 异 常 。另 请 参 阅 第 2-59 页 的 --fpmode=model。5-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


C 和 C++ 实 现 细 节注 意适 用 于 浮 点 处 理 的 IEEE 754 标 准 规 定 , 对 异 常 执 行 的 缺 省 操 作 是 继 续 运 行 而 不进 行 捕 获 。 可 通 过 调 整 fenv.h 中 的 函 数 和 定 义 来 修 改 浮 点 错 误 处 理 方 式 。 有 关详 细 信 息 , 请 参 阅 第 2-58 页 的 调 整 错 误 信 号 、 错 误 处 理 和 程 序 退 出 。指 针 减 法以 下 说 明 适 用 于 C 中 的 所 有 指 针 。 它 们 也 适 用 于 C++ 中 除 指 向 成 员 的 指 针 之 外的 其 他 指 针 :• 从 一 个 指 针 中 减 去 另 一 个 指 针 时 , 它 们 的 差 是 以 下 表 达 式 的 结 果 :((int)a - (int)b) / (int)sizeof(type pointed to)• 如 果 指 针 指 向 的 对 象 的 对 齐 边 界 与 其 大 小 相 同 , 这 种 对 齐 方 式 可 保 证 除 法的 准 确 性 。• 如 果 指 针 指 向 的 对 象 的 对 齐 边 界 小 于 其 大 小 ( 如 压 缩 类 型 和 大 多 数struct), 则 两 个 指 针 必 须 指 向 相 同 数 组 的 元 素 。5.1.4 结 构 、 联 合 、 枚 举 和 位 域本 节 介 绍 了 结 构 化 数 据 类 型 union、enum 和 struct 实 现 ; 还 讨 论 了 结 构 填 充 和 位域 实 现 。有 关 详 细 信 息 , 请 参 阅 第 3-19 页 的 匿 名 类 、 结 构 和 联 合 。联 合使 用 其 他 类 型 的 成 员 访 问 union 的 成 员 时 , 可 以 从 原 始 类 型 的 表 示 形 式 预 测 产 生的 值 。 不 会 生 成 任 何 错 误 。枚 举enum 类 型 的 对 象 是 使 用 包 含 enum 范 围 的 最 小 整 型 实 现 的 。 根 据 enum 中 的 枚 举 器范 围 , enum 的 存 储 类 型 为 以 下 内 容 的 前 者 :• unsigned char, 如 果 未 使 用 --enum_is_int• signed char, 如 果 未 使 用 --enum_is_int• unsigned short, 如 果 未 使 用 --enum_is_int• signed short, 如 果 未 使 用 --enum_is_int• signed int<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-7ID090708Non-Confidential, Unrestricted Access


C 和 C++ 实 现 细 节• unsigned int, C 使 用 --strict 时 除 外• signed long long, C 使 用 --strict 时 除 外• unsigned long long, C 使 用 --strict 时 除 外通 过 按 这 种 方 式 实 现 enum, 可 以 减 小 数 据 大 小 。 命 令 行 选 项 --enum_is_int 强 制将 enum 的 基 础 类 型 设 置 为 至 少 与 int 一 样 宽 。有 关 详 细 信 息 , 请 参 阅 《<strong>ARM</strong> 体 系 结 构 的 过 程 调 用 标 准 》 规 范 中 的 C 语 言 映射 说 明 。注 意如 果 要 混 合 已 使 用 和 未 使 用 --enum_is_int 选 项 编 译 的 转 换 单 元 , 并 且 它 们 使 用相 同 的 接 口 或 数 据 结 构 , 则 必 须 格 外 小 心 。处 理 超 出 范 围 的 值在 严 格 C 中 , 必 须 能 够 将 枚 举 器 值 表 示 为 int, 例 如 , 它 们 必 须 在 -2147483648到 +2147483647 范 围 内 ( 含 这 两 个 值 )。 在 早 期 版 本 的 RVCT 中 , 超 出 范 围 的值 将 转 换 为 int, 而 不 会 发 出 警 告 ( 除 非 指 定 了 --strict 选 项 )。在 RVCT 2.2 版 和 更 高 版 本 中 , 枚 举 器 值 超 出 范 围 时 , 将 会 发 出 警 告 :#66: enumeration value is out of "int" range这 些 值 的 处 理 方 式 与 C++ 相 同 , 即 , 将 它 们 作 为 unsigned int、 long long 或unsigned long long 进 行 处 理 。要 确 保 报 告 超 出 范 围 的 警 告 , 请 使 用 以 下 命 令 将 它 们 更 改 为 错 误 :armcc --diag_error=66 ...结 构以 下 内 容 适 用 于 :• 所 有 C 结 构• 所 有 不 使 用 虚 拟 函 数 或 基 类 的 C++ 结 构 和 类 。结 构 对 齐非 压 缩 结 构 的 对 齐 边 界 是 其 任 何 字 段 所 需 的 最 大 对 齐 边 界 。5-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


C 和 C++ 实 现 细 节字 段 对 齐结 构 的 排 列 方 式 为 : 将 第 一 个 已 命 名 组 件 放 在 最 低 地 址 中 。 字 段按 以 下 方 式 进 行 对 齐 :• char 类 型 的 字 段 与 下 一 个 可 用 字 节 对 齐 。• short 类 型 的 字 段 与 下 一 个 偶 数 地 址 的 字 节 对 齐 。• 在 RVCT 2.0 和 更 高 版 本 中 ,double 和 long long 数 据 类 型 为 8字 节 对 齐 。 这 样 , 便 可 有 效 地 使 用 <strong>ARM</strong>v5TE 和 更 高 版 本 中的 LDRD 和 STRD 指 令 。• 位 域 对 齐 取 决 于 位 域 的 声 明 方 式 。 有 关 详 细 信 息 , 请 参 阅第 5-12 页 的 压 缩 结 构 中 的 位 域 。• 所 有 其 他 类 型 按 字 边 界 对 齐 。结 构 可 以 包 含 填 充 以 确 保 正 确 对 齐 字 段 以 及 结 构 本 身 。 图 5-1 是 一 个 常 规 非 压缩 结 构 的 示 例 。 它 填 充 了 第 1、 第 2 和 第 3 个 字 节 以 确 保 正 确 对 齐 字 段 。 它 还 填充 了 第 11 和 第 12 个 字 节 以 确 保 正 确 对 齐 结 构 。 sizeof() 函 数 返 回 结 构 大 小( 包 括 填 充 )。struct {char c; int x; short s} ex1;0 1 2 3cspadding4 5 7 8x9 10 11 12padding根 据 结 构 的 定 义 方 式 , 编 译 器 使 用 以 下 方 式 之 一 填 充 结 构 :• 用 零 填 充 定 义 为 static 或 extern 的 结 构 。图 5-1 常 规 非 压 缩 结 构 示 例• 使 用 以 前 存 储 在 堆 栈 或 堆 中 的 任 何 内 容 填 充 这 些 内 存 位 置 上 的 结 构 , 例如 , 使 用 malloc() 或 auto 定 义 的 结 构 。 不 能 使 用 memcmp() 比 较 以 这 种 方 式定 义 的 填 充 结 构 ( 请 参 阅 图 5-1)。可 以 使 用 --remarks 选 项 查 看 编 译 器 在 struct 中 插 入 填 充 时 生 成 的 消 息 。C++ 中 允 许 使 用 带 有 空 初 始 值 设 定 项 的 结 构 :struct{int x;} X = { };<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-9ID090708Non-Confidential, Unrestricted Access


C 和 C++ 实 现 细 节然 而 , 如 果 使 用 -cpp 和 --c90 选 项 编 译 C 或 C++, 则 会 生 成 错 误 。压 缩 结 构压 缩 结 构 是 一 种 结 构 对 齐 边 界 和 内 部 字 段 对 齐 边 界 始 终 为 1 的 结 构 。可 以 使 用 __packed 限 定 符 压 缩 特 定 结 构 。 或 者 , 也 可 以 使 用 #pragma pack(n) 确 保压 缩 任 何 包 含 未 对 齐 数 据 的 结 构 。 无 法 使 用 命 令 行 选 项 更 改 结 构 的 缺 省 压 缩 方式 。位 域在 非 压 缩 结 构 中 , <strong>ARM</strong> 编 译 器 在 容 器 中 分 配 位 域 。 容 器 是 已 声 明 类 型 的 正 确对 齐 的 对 象 。分 配 位 域 时 , 应 确 保 指 定 的 第 一 个 字 段 占 用 字 的 最 低 地 址 位 , 具 体 取 决 于 配置 :小 端 最 低 地 址 为 最 低 有 效 位 。大 端 最 低 地 址 为 最 高 有 效 位 。位 域 容 器 可 以 是 任 何 整 型 。注 意在 严 格 1990 ISO 标 准 C 中 , 只 允 许 将 int、 signed int 和 unsigned int 类 型 用 于位 域 。 对 于 非 int 位 域 , 编 译 器 会 显 示 错 误 。没 有 使 用 signed 或 unsigned 限 定 符 声 明 的 普 通 位 域 按 unsigned 处 理 。 例 如 ,intx:10 分 配 10 位 无 符 号 整 数 。位 域 将 分 配 给 第 一 个 具 有 足 够 未 分 配 位 数 的 正 确 类 型 的 容 器 , 例 如 :struct X{int x:10;int y:20;};第 一 个 声 明 创 建 一 个 整 数 容 器 , 并 为 x 分 配 10 位 。 在 第 二 个 声 明 中 , 编 译 器 查找 具 有 足 够 未 分 配 位 数 的 现 有 整 数 容 器 , 并 在 与 x 相 同 的 容 器 中 分 配 y。位 域 完 全 包 含 在 其 容 器 中 。 如 果 无 法 将 位 域 放 入 某 个 容 器 中 , 则 会 将 其 放 在 下一 个 相 同 类 型 的 容 器 中 。 例 如 , 如 果 为 结 构 声 明 了 其 他 位 域 , z 声 明 将 溢 出 容器 :5-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


C 和 C++ 实 现 细 节struct X{int x:10;int y:20;int z:5;};编 译 器 填 充 第 一 个 容 器 的 剩 余 两 位 , 并 为 z 分 配 一 个 新 的 整 数 容 器 。位 域 容 器 可 以 相 互 重 叠 , 例 如 :struct X{int x:10;char y:2;};第 一 个 声 明 创 建 一 个 整 数 容 器 , 并 为 x 分 配 10 位 。 这 10 位 占 用 该 整 数 容 器 的 第1 个 字 节 以 及 第 2 个 字 节 的 两 位 。 在 第 二 个 声 明 中 , 编 译 器 检 查 char 类 型 的 容器 。 由 于 没 有 适 合 的 容 器 , 因 此 , 编 译 器 分 配 一 个 正 确 对 齐 的 新 char 容 器 。由 于 char 的 自 然 对 齐 边 界 为 1, 因 此 , 编 译 器 搜 索 包 含 足 够 未 分 配 位 数 的 第 一个 字 节 , 以 便 完 全 包 含 该 位 域 。 在 示 例 结 构 中 , int 容 器 的 第 二 个 字 节 为 x 分 配了 两 位 , 有 六 位 没 有 分 配 。 编 译 器 分 配 一 个 char 容 器 ( 从 前 一 个 int 容 器 的 第二 个 字 节 开 始 ), 跳 过 分 配 给 x 的 前 两 位 , 然 后 为 y 分 配 两 位 。如 果 将 y 声 明 为 char y:8, 则 编 译 器 填 充 第 二 个 字 节 , 然 后 为 第 三 个 字 节 分 配 一个 新 的 char 容 器 , 因 为 位 域 不 能 溢 出 其 容 器 。 图 5-2 显 示 了 以 下 示 例 结 构 的 位域 分 配 情 况 :struct X{int x:10;char y:8;};Bit number31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0unallocatedypaddingx图 5-2 位 域 分 配 1注 意相 同 的 基 本 规 则 适 用 于 具 有 不 同 容 器 类 型 的 位 域 声 明 。 例 如 , 要 为 示 例 结 构 添加 int 位 域 , 请 使 用 以 下 代 码 :<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-11ID090708Non-Confidential, Unrestricted Access


C 和 C++ 实 现 细 节struct X{int x:10;char y:8;int z:5;}编 译 器 分 配 一 个 int 容 器 ( 该 容 器 的 起 始 位 置 与 int x:10 容 器 相 同 ), 并 分 配 一个 字 节 对 齐 的 char 和 一 个 5 位 的 位 域 , 请 参 阅 图 5-3。Bit number31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0freezypaddingx图 5-3 位 域 分 配 2通 过 声 明 零 大 小 的 未 命 名 位 域 , 可 以 显 式 地 填 充 位 域 容 器 。 如 果 容 器 不 为 空 ,则 使 用 零 大 小 的 位 域 填 充 容 器 , 直 至 末 尾 。 后 续 位 域 声 明 开 始 一 个 新 的 空 容器 。压 缩 结 构 中 的 位 域压 缩 结 构 中 的 位 域 容 器 的 对 齐 边 界 为 1。 因 此 , 压 缩 结 构 中 位 域 的 最 大 位 填 充是 7 位 。 对 于 非 压 缩 结 构 , 最 大 填 充 是 8*sizeof(container-type)–1 位 。5-12 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


C 和 C++ 实 现 细 节5.2 C++ 实 现 细 节本 节 介 绍 了 C++ 特 定 的 语 言 实 现 细 节 。5.2.1 使 用 ::operator new 函 数根 据 ISO C++ 标 准 , 在 内 存 分 配 失 败 时 , ::operator new(std::size_t) 将 抛 出 异常 , 而 不 是 发 出 信 号 。 如 果 未 捕 获 到 异 常 , 则 会 调 用 std::terminate()。编 译 器 选 项 --force_new_nothrow 将 编 译 中 的 所 有 新 调 用 转 变 为 ::operatornew(std::size_t, std::nothrow_t&) 或 :operator new[](std::size_t,std::nothrow_t&) 调 用 。 但 是 , 这 并 不 影 响 库 中 的 operator new 调 用 , 也 不 影 响 对任 何 类 特 定 的 operator new 的 调 用 。 有 关 详 细 信 息 , 请 参 阅 第 2-57 页 的--force_new_nothrow, --no_force_new_nothrow。旧 对 象 支 持在 RVCT 2.0 版 中 , 当 ::operator new 函 数 出 现 内 存 不 足 时 , 它 将 发 出 信 号SIGOUTOFHEAP, 而 不 是 引 发 C++ 异 常 。 请 参 阅 《 库 和 浮 点 支 持 指 南 》 中第 2-95 页 的 ISO C 库 实 现 定 义 。在 当 前 版 本 中 , 可 以 安 装 new_handler 以 发 出 信 号 , 从 而 恢 复 RVCT 2.0 版 行 为 。注 意不 要 依 赖 此 行 为 的 实 现 细 节 , 因 为 它 在 将 来 版 本 中 可 能 会 发 生 变 化 。5.2.2 试 验 数 组ADS 1.2 和 RVCT 1.2 版 C++ 编 译 器 可 以 使 用 试 验 ( 即 不 完 整 ) 数 组 声 明 , 例 如int a[]。 使 用 RVCT 2.x 或 更 高 版 本 的 编 译 器 编 译 C++ 时 , 不 能 使 用 试 验 数 组 。5.2.3 C++ 函 数 中 的 旧 式 C 参 数ADS 1.2 和 RVCT 1.2 版 C++ 编 译 器 允 许 在 C++ 函 数 中 使 用 旧 式 C 参 数 。 即 ,void f(x) int x; { }在 RVCT 2.x 或 更 高 版 本 的 编 译 器 中 , 如 果 代 码 在 函 数 中 包 含 任 何 旧 式 参 数 , 则必 须 使 用 --anachronisms 编 译 器 选 项 。 如 果 编 译 器 发 现 任 何 实 例 , 则 会 发 出 警 告 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-13ID090708Non-Confidential, Unrestricted Access


C 和 C++ 实 现 细 节5.2.4 过 时 功 能使 用 --anachronisms 选 项 启 用 过 时 功 能 后 , 可 以 接 受 以 下 过 时 功 能 :• 允 许 在 函 数 声 明 中 使 用 overload。 将 接 受 并 忽 略 重 载 。• 可 使 用 缺 省 初 始 化 进 行 初 始 化 的 静 态 数 据 成 员 不 需 要 定 义 。 过 时 功 能 不 适用 于 模 板 类 的 静 态 数 据 成 员 , 因 为 必 须 始 终 定 义 这 些 成 员 。• 可 以 在 数 组 删 除 操 作 中 指 定 数 组 中 的 元 素 个 数 。 将 忽 略 该 值 。• 可 以 使 用 单 个 operator++() 和 operator--() 函 数 重 载 前 缀 和 后 缀 操 作 。• 如 果 只 有 一 个 直 接 基 类 , 则 可 以 在 基 类 初 始 值 设 定 项 中 省 略 基 类 名 称 。• 允 许 在 构 造 函 数 和 析 构 函 数 中 分 配 this 指 针 。• 可 以 将 边 界 函 数 指 针 ( 即 指 向 给 定 对 象 的 成 员 函 数 的 指 针 ) 转 换 为 指 向某 个 函 数 的 指 针 。• 嵌 套 的 类 名 可 以 用 作 非 嵌 套 的 类 名 , 但 前 提 是 尚 未 声 明 具 有 该 名 称 的 其 他类 。 过 时 功 能 不 适 用 于 模 板 类 。• 可 以 通 过 其 他 类 型 的 值 初 始 化 非 const 类 型 的 引 用 。 将 创 建 一 个 临 时 变量 , 通 过 转 换 的 初 始 值 对 其 进 行 初 始 化 , 然 后 将 引 用 设 置 为 该 临 时 变 量 。• 可 以 通 过 非 const 类 类 型 的 右 值 或 从 该 类 类 型 派 生 类 的 值 初 始 化 对 该 类 类型 的 引 用 。 不 需 要 使 用 额 外 的 临 时 变 量 。• 允 许 使 用 带 有 旧 式 参 数 声 明 的 函 数 , 该 函 数 可 以 参 与 函 数 重 载 , 就 好 像 它是 原 型 函 数 一 样 。 进 行 兼 容 性 检 查 时 , 不 会 对 此 类 函 数 的 参 数 类 型 应 用 缺省 自 变 量 升 级 , 因 此 以 下 代 码 声 明 了 两 个 名 为 f 的 函 数 的 重 载 :int f(int);int f(x) char x; { return x; }注 意在 C 中 , 此 代 码 是 合 法 的 , 但 具 有 不 同 的 含 义 。 f 试 验 声 明 的 后 面 是 其 定义 。5.2.5 模 板 实 例 化<strong>ARM</strong> 编 译 器 自 动 进 行 所 有 模 板 实 例 化 , 并 确 保 链 接 后 每 个 模 板 实 体 只 保 留 一 个定 义 。 编 译 器 通 过 在 已 命 名 公 共 节 中 发 出 模 板 实 体 来 实 现 此 功 能 。 因 此 , 链 接器 将 删 除 所 有 重 复 的 公 共 节 ( 即 具 有 相 同 名 称 的 公 共 节 )。5-14 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


C 和 C++ 实 现 细 节注 意可 以 使 用 --pending_instantiations 编 译 器 选 项 限 制 给 定 模 板 的 并 发 实 例 化 次 数 。有 关 详 细 信 息 , 另 请 参 阅 第 2-101 页 的 --pending_instantiations=n。隐 式 包 含启 用 隐 式 包 含 后 , 编 译 器 假 定 , 如 果 它 需 要 定 义 来 实 例 化 在 .h 文 件 中 声 明 的 模板 实 体 , 则 可 以 隐 式 地 包 含 相 应 的 .cc 文 件 以 获 取 该 定 义 的 源 代 码 。 例 如 , 如果 在 xyz.h 文 件 中 声 明 了 模 板 实 体 ABC::f, 并 且 在 编 译 中 需 要 实 例 化 ABC::f, 但是 编 译 处 理 的 源 代 码 中 没 有 出 现 ABC::f 定 义 , 编 译 器 将 检 查 xyz.cc 文 件 是 否 存在 。 如 果 该 文 件 存 在 , 编 译 器 将 处 理 该 文 件 , 就 像 将 该 文 件 包 含 在 主 源 文 件 末尾 一 样 。要 查 找 给 定 模 板 实 体 的 模 板 定 义 文 件 , 编 译 器 必 须 知 道 用 于 声 明 模 板 的 文 件 的完 整 路 径 名 , 以 及 是 否 使 用 系 统 包 含 语 法 ( 例 如 , #include ) 包 含 了该 文 件 。 对 于 包 含 #line 指 令 的 预 处 理 源 代 码 , 该 信 息 不 可 用 。 因 此 , 编 译 器 不会 尝 试 隐 式 包 含 含 有 #line 指 令 的 源 代 码 。编 译 器 查 找 定 义 文 件 后 缀 .cc 和 .CC。可 以 使 用 命 令 行 选 项 --implicit_include 和 --no_implicit_include 打 开 或 关 闭 隐式 包 含 模 式 。仅 在 正 常 文 件 编 译 期 间 执 行 隐 式 包 含 , 即 在 未 使 用 -E 命 令 行 选 项 时 。有 关 详 细 信 息 , 请 参 阅 第 2-2 页 的 命 令 行 选 项 。5.2.6 命 名 空 间在 模 板 实 例 化 中 进 行 名 称 查 找 时 , 必 须 在 模 板 定 义 的 上 下 文 中 查 找 某 些 名 称 ,可 以 在 模 板 实 例 化 的 上 下 文 中 查 找 其 他 名 称 。 编 译 器 实 现 两 种 不 同 的 实 例 化 查找 算 法 :• 标 准 规 定 的 算 法 , 这 种 算 法 称 为 相 关 名 称 查 找 。• 在 实 现 相 关 名 称 查 找 之 前 存 在 的 算 法 。相 关 名 称 查 找 是 在 strict 模 式 下 进 行 的 , 除 非 其 他 命 令 行 选 项 显 式 地 将 其 禁 用 ,或 者 由 配 置 标 记 或 命 令 行 选 项 启 用 相 关 名 称 处 理 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-15ID090708Non-Confidential, Unrestricted Access


C 和 C++ 实 现 细 节相 关 名 称 查 找 处 理在 进 行 相 关 名 称 查 找 时 , 编 译 器 将 实 现 标 准 中 规 定 的 实 例 化 名 称 查 找 规 则 。 该处 理 要 求 进 行 非 类 原 型 实 例 化 。 而 这 又 需 要 使 用 标 准 要 求 的 类 型 名 称 和 模 板 关键 字 编 写 代 码 。使 用 引 用 上 下 文 进 行 查 找在 不 使 用 相 关 名 称 查 找 时 , 编 译 器 使 用 与 标 准 的 两 阶 段 查 找 规 则 近 似 的 名 称 查找 算 法 , 但 在 某 种 程 度 上 , 它 与 现 有 代 码 和 现 有 编 译 器 更 兼 容 。如 果 将 某 个 名 称 作 为 模 板 实 例 化 一 部 分 进 行 查 找 , 但 在 实 例 化 的 局 部 上 下 文 中找 不 到 该 名 称 , 则 在 综 合 实 例 化 上 下 文 中 进 行 查 找 。 该 综 合 实 例 化 上 下 文 包 括模 板 定 义 上 下 文 中 的 名 称 以 及 实 例 化 上 下 文 中 的 名 称 。 例 如 :namespace N{int g(int);int x = 0;template struct A{T f(T t) { return g(t); }T f() { return x; }};}namespace M {int x = 99;double g(double);N::A ai;int i = ai.f(0); // N::A::f(int) calls N::g(int)int i2 = ai.f(); // N::A::f() returns 0 (= N::x)N::A ad;double d = ad.f(0); // N::A::f(double) calls M::g(double)double d2 = ad.f(); // N::A::f() also returns 0 (= N::x)}模 板 实 例 化 中 的 名 称 查 找 在 以 下 几 个 方 面 并 不 符 合 标 准 中 的 规 则 :• 虽 然 只 有 模 板 定 义 上 下 文 中 的 名 称 被 视 为 不 是 函 数 的 名 称 , 但 是 查 找 并 不限 于 在 定 义 模 板 处 可 见 的 那 些 名 称 。• 对 于 模 板 中 的 所 有 函 数 调 用 , 将 考 虑 引 用 模 板 的 上 下 文 中 的 函 数 。 引 用 上下 文 中 的 函 数 只 对 相 关 函 数 调 用 可 见 。5-16 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


C 和 C++ 实 现 细 节与 自 变 量 相 关 的 查 找启 用 与 自 变 量 相 关 的 查 找 后 , 通 过 与 自 变 量 相 关 的 查 找 显 示 的 函 数 可 能 与 通 过正 常 查 找 显 示 的 函 数 发 生 重 载 。 标 准 要 求 即 使 在 正 常 查 找 发 现 的 名 称 为 块extern 声 明 时 , 也 要 进 行 这 种 重 载 。 编 译 器 可 实 现 这 种 重 载 , 但 在 缺 省 模 式 下 ,在 正 常 查 找 发 现 块 extern 时 禁 止 与 自 变 量 相 关 的 查 找 。这 意 味 着 , 即 使 程 序 不 使 用 命 名 空 间 , 程 序 也 可 能 具 有 不 同 的 行 为 , 具 体 取 决于 是 否 使 用 与 自 变 量 相 关 的 查 找 对 其 进 行 编 译 。 例 如 :struct A { };A operator+(A, double);void f(){A a1;A operator+(A, int);a1 + 1.0;// calls operator+(A, double) with arg-dependent lookup} // enabled but otherwise calls operator+(A, int);5.2.7 C++ 异 常 处 理RVCT 中 完 全 支 持 C++ 异 常 处 理 。 但 是 , 在 缺 省 情 况 下 , 编 译 器 不 支 持 此 功能 。 您 必 须 使 用 --exceptions 选 项 启 用 C++ 异 常 处 理 。 有 关 详 细 信 息 , 请 参 阅第 2-53 页 的 --exceptions, --no_exceptions。注 意Rogue Wave 标 准 C++ 库 是 在 启 用 C++ 异 常 的 情 况 下 提 供 的 。您 可 以 对 异 常 表 生 成 进 行 有 限 的 控 制 。运 行 时 的 函 数 展 开缺 省 情 况 下 , 可 以 在 运 行 时 展 开 使 用 --exceptions 编 译 的 函 数 。 有 关 详 细 信 息 ,请 参 阅 第 2-53 页 的 --exceptions, --no_exceptions。 函 数 展 开 包 括 破 坏C++ 自 动 变 量 并 恢 复 在 堆 栈 帧 中 保 存 的 寄 存 器 值 。 函 数 展 开 是 通 过 发 出 描 述 要执 行 的 操 作 的 异 常 表 实 现 的 。可 以 使 用 编 译 指 示 #pragma exceptions_unwind 和 #pragma no_exceptions_unwind 为 特定 函 数 启 用 或 禁 用 展 开 。 有 关 详 细 信 息 , 请 参 阅 第 4-55 页 的 编 译 指示 。--exceptions_unwind 选 项 设 置 此 编 译 指 示 的 初 始 值 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. 5-17ID090708Non-Confidential, Unrestricted Access


C 和 C++ 实 现 细 节为 函 数 禁 用 函 数 展 开 操 作 产 生 以 下 结 果 :• 在 运 行 时 无 法 通 过 该 函 数 抛 出 异 常 , 并 且 该 抛 出 不 会 展 开 堆 栈 。 如 果 抛 出语 言 为 C++, 则 会 调 用 std::terminate。• 可 以 使 用 很 小 的 异 常 表 表 示 形 式 来 描 述 函 数 , 这 可 帮 助 智 能 链 接 器 进 行 表优 化 。• 由 于 调 用 方 和 被 调 用 方 必 须 正 确 地 进 行 交 互 , 函 数 内 联 将 受 到 限 制 。因 此 , 可 以 使 用 #pragma no_exceptions_unwind, 以 一 种 不 需 要 额 外 源 代 码 装 饰 的方 式 强 制 禁 止 展 开 。与 此 相 反 , 在 C++ 中 , 空 函 数 异 常 规 范 允 许 进 行 函 数 展 开 ( 包 括 受 保 护 的 函数 ), 然 后 根 据 ISO C++ 标 准 调 用 std::unexpected()。5.2.8 外 部 内 联 函 数ISO C++ 标 准 要 求 每 次 使 用 内 联 函 数 时 都 要 对 其 进 行 定 义 。 为 防 止 内 联 函 数 的多 个 外 联 副 本 之 间 发 生 冲 突 , C++ 编 译 器 在 公 共 节 中 发 出 外 联 extern 函 数 。外 联 的 内 联 函 数在 以 下 情 况 下 , 编 译 器 以 外 联 方 式 发 出 内 联 函 数 :• 获 取 函 数 的 地 址 , 例 如 :inline int g(){return 1;}int (*fp)() = &g;• 无 法 内 联 函 数 , 例 如 , 递 归 函 数 :inline unsigned int fact(unsigned int n) {return n < 2 ? 1 : n * fact(n - 1);}• 编 译 器 使 用 试 探 法 判 定 最 好 不 要 内 联 该 函 数 。 这 种 试 探 法 受 -Ospace 和-Otime 的 影 响 。 如 果 使 用 -Otime, 编 译 器 将 内 联 更 多 的 函 数 。 通 过 使 用__forceinline 声 明 函 数 , 可 以 忽 略 这 种 试 探 法 。 例 如 :__forceinline int g(){return 1;}有 关 详 细 信 息 , 另 请 参 阅 第 2-58 页 的 --forceinline。5-18 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


附 录 Avia 文 件 语 法本 附 录 介 绍 所 有 <strong>ARM</strong> 开 发 工 具 都 接 受 的 via 文 件 的 语 法 。 它 分 为 以 下 几 节 :• 第 A-2 页 的 via 文 件 概 述• 第 A-3 页 的 语 法<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. A-1ID090708Non-Confidential, Unrestricted Access


via 文 件 语 法A.1 via 文 件 概 述via 文 件 是 无 格 式 文 本 文 件 , 包 含 <strong>ARM</strong> 开 发 工 具 的 命 令 行 参 数 和 选 项 。 可 以 通过 所 有 <strong>ARM</strong> 命 令 行 工 具 使 用 via 文 件 , 也 就 是 说 , 可 以 将 --via 命 令 行 选 项 和以 下 命 令 结 合 使 用 , 从 命 令 行 指 定 via 文 件 :• armcc• armasm• armlink• fromelf• armar。有 关 详 细 信 息 , 请 参 阅 各 个 工 具 的 文 档 。注 意在 通 常 情 况 下 , 可 以 使 用 via 文 件 对 工 具 指 定 任 意 命 令 行 选 项 , 包 括 --via。 这意 味 着 可 以 在 via 文 件 内 调 用 多 重 嵌 套 的 via 文 件 。本 节 包 括 以 下 内 容 :• via 文 件 求 值A.1.1via 文 件 求 值调 用 支 持 via 文 件 的 工 具 后 :1. 使 用 从 via 文 件 中 提 取 的 自 变 量 字 序 列 , 替 换 最 初 指 定 的 --via via_file 自变 量 , 包 括 递 归 处 理 via 文 件 中 的 所 有 嵌 套 --via 命 令 。2. 以 相 同 的 方 式 , 按 参 数 出 现 的 顺 序 处 理 所 有 后 续 --via via_file 参 数 。也 就 是 说 , 按 照 指 定 的 顺 序 处 理 via 文 件 , 并 且 在 完 全 处 理 每 一 个 via 文 件 ( 包括 处 理 嵌 套 的 via 文 件 ) 后 , 再 处 理 下 一 个 via 文 件 。A-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


via 文 件 语 法A.2 语 法via 文 件 必 须 符 合 以 下 语 法 规 则 :• via 文 件 是 包 含 字 序 列 的 文 本 文 件 。 该 文 本 文 件 中 的 每 个 字 都 被 转 换 为 自变 量 字 符 串 , 然 后 传 递 给 工 具 。• 这 些 字 由 空 格 或 行 末 分 隔 , 已 分 隔 字 符 串 除 外 。 例 如 :--c90 --strict ( 两 个 字 )--c90--strict ( 一 个 字 )• 行 末 当 作 空 格 进 行 处 理 。 例 如 :--c90--strict等 效 于 :--c90 --strict• 括 在 双 引 号 (") 或 单 引 号 (') 中 的 字 符 串 按 照 单 个 字 处 理 。 在 用 双 引 号 括 起来 的 字 内 , 单 引 号 按 照 普 通 字 符 处 理 。 在 用 单 引 号 分 隔 的 字 内 , 双 引 号 按照 普 通 字 符 处 理 。双 引 号 用 于 分 隔 包 含 空 格 的 文 件 名 或 路 径 名 。 例 如 :-I C:\My Project\includes( 三 个 字 )-I "C:\My Project\includes"( 两 个 字 )单 引 号 可 用 于 分 隔 包 含 双 引 号 的 字 。 例 如 :-DNAME='"<strong>RealView</strong> Compilation Tools"' ( 一 个 字 )• 用 括 号 括 起 来 的 字 符 按 照 单 个 字 处 理 。 例 如 :--option(x, y, z) ( 一 个 字 )--option (x, y, z) ( 两 个 字 )• 在 用 双 引 号 或 单 引 号 分 隔 的 字 符 串 内 , 可 以 使 用 反 斜 杠 (\) 字 符 对 双 引 号 、单 引 号 和 反 斜 杠 字 符 进 行 转 义 。• 如 果 分 隔 的 字 旁 边 紧 靠 着 另 一 个 字 , 则 按 照 单 个 字 处 理 。 例 如 :-I"C:\Project\includes"按 照 单 个 字 处 理 :-IC:\Project\includes<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. A-3ID090708Non-Confidential, Unrestricted Access


via 文 件 语 法• 以 分 号 (;) 或 井 字 (#) 字 符 作 为 第 一 个 非 空 格 字 符 开 头 的 行 是 注 释 行 。 如 果分 号 或 井 字 字 符 出 现 在 行 中 的 任 何 其 他 位 置 , 则 不 将 其 看 作 注 释 行 的 开头 。 例 如 :-o objectname.axf ;this is not a comment注 释 以 行 末 或 文 件 尾 结 束 。 注 释 不 能 跨 多 行 , 也 不 能 是 行 中 的 一 部 分 。• 包 含 预 处 理 程 序 选 项 -Dsymbol="value" 的 行 必 须 用 单 引 号 分 隔 , 可 表 示 为'-Dsymbol="value"' 或 -Dsymbol='"value"'。 例 如 :-c -DFOO_VALUE='"FOO_VALUE"'A-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


附 录 B标 准 C 实 现 定 义本 附 录 提 供 ISO C 标 准 所 规 定 的 符 合 条 件 的 C 实 现 的 信 息 。 它 分 为 以 下 几 节 :• 第 B-2 页 的 实 现 定 义• 第 B-9 页 的 被 视 为 ISO C 标 准 未 定 义 的 行 为<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. B-1ID090708Non-Confidential, Unrestricted Access


标 准 C 实 现 定 义B.1 实 现 定 义ISO C 标 准 (ISO/IEC 9899:1990 (E)) 的 附 录 G 整 理 了 有 关 可 移 植 性 的 信 息 。 子 节G3 列 出 了 每 一 执 行 必 须 记 录 的 行 为 。注 意本 附 录 不 重 复 介 绍 第 4 章 编 译 器 特 有 的 功 能 中 的 信 息 。 本 附 录 在 适 当 之 处 提 供了 引 用 。以 下 各 小 节 对 应 于 子 节 G3 的 相 关 各 节 。 这 些 小 节 介 绍 了 <strong>ARM</strong> C 编 译 器 和 C 库等 方 面 的 内 容 , 这 些 内 容 不 是 由 ISO C 标 准 定 义 的 , 而 是 由 执 行 定 义 的 :注 意对 wctype.h 和 wchar.h 头 文 件 的 支 持 不 包 括 宽 文 件 操 作 。B-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


标 准 C 实 现 定 义B.1.1转 换编 译 器 生 成 的 诊 断 消 息 的 格 式 如 下 :source-file, line-number: severity: error-code: explanation其 中 , severity 是 下 列 值 之 一 :[blank]如 果 严 重 性 为 空 , 则 这 是 一 个 备 注 , 表 示 对 C 或 C++ 的 常 见 ( 但有 时 是 非 约 定 的 ) 用 法 。 缺 省 情 况 下 不 显 示 备 注 。 可 使 用--remarks 选 项 来 显 示 备 注 消 息 。 有 关 详 细 信 息 , 请 参 阅 第 6-4 页 的控 制 诊 断 消 息 的 输 出 。 继 续 编 译 。Warning 标 记 代 码 中 表 示 可 能 出 现 问 题 的 异 常 情 形 。 继 续 编 译 。Error指 示 导 致 编 译 停 止 的 问 题 。 例 如 , 违 反 了 C 或 C++ 语 言 的 语 法 或语 义 规 则 。Internal fault其 中 :指 示 编 译 器 的 内 部 问 题 。 请 与 您 的 供 应 商 联 系 , 并 准 备 好 如 第 x 页的 反 馈 所 列 的 信 息 。error-code 是 标 识 错 误 类 型 的 编 号 。explanation 是 对 错 误 的 文 字 描 述 。有 关 详 细 信 息 , 请 参 阅 《 编 译 器 用 户 指 南 》 中 第 6 章 诊 断 消 息 。B.1.2环 境基 于 <strong>ARM</strong> 体 系 结 构 的 环 境 的 命 令 行 到 main() 中 参 数 的 映 射 是 与 执 行 相 关 的 。通 用 的 <strong>ARM</strong> C 库 支 持 以 下 内 容 :• main()• 第 B-4 页 的 交 互 设 备• 第 B-4 页 的 重 定 向 标 准 输 入 、 输 出 和 错 误 流main()赋 予 main() 的 参 数 是 该 命 令 行 中 一 些 不 包 括 输 入 / 输 出 重 定 向 的 字 , 字 与 字 之 间用 空 格 分 隔 , 但 包 含 在 双 引 号 中 的 空 格 除 外 。注 意• 在 isspace() 结 果 为 true 的 情 况 下 , 空 格 字 符 是 任 意 字 符 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. B-3ID090708Non-Confidential, Unrestricted Access


标 准 C 实 现 定 义• 双 引 号 或 双 引 号 之 内 的 反 斜 杠 字 符 \ 的 前 面 必 须 有 一 个 反 斜 杠 字 符 。• 输 入 / 输 出 重 定 向 在 双 引 号 之 内 不 会 被 识 别 。交 互 设 备在 <strong>ARM</strong> C 库 的 非 主 机 执 行 中 , 术 语 交 互 设 备 可 能 无 意 义 。 通 用 的 <strong>ARM</strong> C 库 支持 两 个 都 称 为 :tt 的 一 对 设 备 , 它 们 用 于 处 理 键 盘 输 入 和 VDU 屏 幕 输 出 。 在 通用 执 行 中 :• 除 非 输 入 / 输 出 重 定 向 已 发 生 , 否 则 在 连 接 :tt 的 任 何 流 中 都 不 进 行 缓 冲 处理• 如 果 输 入 / 输 出 已 重 定 向 到 :tt 以 外 的 地 方 , 则 使 用 整 个 文 件 缓 冲 处 理 , 但如 果 stdout 和 stderr 都 被 重 定 向 到 同 一 个 文 件 , 则 使 用 行 缓 冲 处 理 。重 定 向 标 准 输 入 、 输 出 和 错 误 流使 用 通 用 的 <strong>ARM</strong> C 库 , 可 以 在 运 行 时 重 定 向 标 准 输 入 、 输 出 和 错 误 流 。 例 如 ,如 果 mycopy 是 一 个 运 行 在 主 机 调 试 器 上 的 程 序 , 该 程 序 将 标 准 输 入 复 制 到 标 准输 出 , 则 使 用 以 下 行 运 行 该 程 序 :mycopy < infile > outfile 2> errfile并 按 如 下 方 式 重 定 向 文 件 :stdinstdoutstderr标 准 输 入 流 重 定 向 至 infile。标 准 输 出 流 重 定 向 至 outfile。标 准 错 误 流 重 定 向 至 errfile。允 许 的 重 定 向 为 :0< filename 从 filename 读 取 stdin。< filename 从 filename 读 取 stdin。1> filename 将 stdout 写 入 filename。> filename 将 stdout 写 入 filename。2> filename 将 stderr 写 入 filename。2>&1 将 stderr 写 入 与 stdout 相 同 的 位 置 。B-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


标 准 C 实 现 定 义>& file将 stdout 和 stderr 都 写 入 filename。>> filename 将 stdout 附 加 至 filename。>>& filename 将 stdout 和 stderr 都 附 加 至 filename。要 重 定 向 目 标 上 的 stdin、 stdout 和 stderr, 必 须 进 行 以 下 定 义 :#pragma import(_main_redirection)仅 在 以 下 两 种 情 况 下 进 行 文 件 重 定 向 :• 调 用 操 作 系 统 支 持 文 件 重 定 向• 程 序 读 写 字 符 而 并 不 替 换 C 库 函 数 fputc() 和 fgetc()。B.1.3标 识 符有 关 详 细 信 息 , 请 参 阅 第 5-2 页 的 字 符 集 和 标 识 符 。B.1.4字 符有 关 详 细 信 息 , 请 参 阅 第 5-2 页 的 字 符 集 和 标 识 符 。B.1.5整 数有 关 详 细 信 息 , 请 参 阅 第 5-5 页 的 整 数 。B.1.6浮 点 数有 关 详 细 信 息 , 请 参 阅 第 5-5 页 的 浮 点 。B.1.7数 组 和 指 针有 关 详 细 信 息 , 请 参 阅 第 5-5 页 的 数 组 和 指 针 。B.1.8寄 存 器使 用 <strong>ARM</strong> 编 译 器 , 您 可 以 声 明 任 意 数 目 的 具 有 存 储 类 register 的 局 部 对 象 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. B-5ID090708Non-Confidential, Unrestricted Access


标 准 C 实 现 定 义B.1.9结 构 、 联 合 、 枚 举 和 位 域ISO/IEC C 标 准 要 求 为 结 构 化 数 据 类 型 记 录 以 下 执 行 的 详 细 信 息 :• 使 用 其 他 类 型 的 成 员 访 问 联 合 成 员 时 的 结 果• 结 构 成 员 的 填 充 和 对 齐• 普 通 int 位 域 是 按 照 signed int 位 域 处 理 还 是 按 照 unsigned int 位 域 处 理• 单 元 内 位 域 的 分 配 顺 序• 位 域 是 否 可 以 跨 越 存 储 单 元 的 边 界• 选 定 为 表 示 枚 举 类 型 值 的 整 数 类 型 。有 关 详 细 信 息 , 请 参 阅 第 5 章 C 和 C++ 实 现 细 节 。联 合有 关 信 息 , 请 参 阅 第 5-7 页 的 联 合 。枚 举有 关 信 息 , 请 参 阅 第 5-7 页 的 枚 举 。结 构 的 填 充 和 对 齐有 关 信 息 , 请 参 阅 第 5-8 页 的 结 构 。位 域有 关 信 息 , 请 参 阅 第 5-10 页 的 位 域 。B.1.10限 定 符具 有 volatile 限 定 类 型 的 对 象 作 为 字 、 半 字 或 字 节 进 行 访 问 , 具 体 访 问 方 式 由 该对 象 的 大 小 和 对 齐 情 况 确 定 。 对 于 大 于 一 个 字 的 volatile 对 象 , 对 该 对 象 的 各 部分 的 访 问 顺 序 是 未 定 义 的 。 对 volatile 位 域 的 更 新 通 常 需 要 进 行 读 取 - 修 改 - 写入 。 对 对 齐 的 字 、 半 字 和 字 节 类 型 的 访 问 是 原 子 访 问 。 其 他 volatile 访 问 不 一 定是 原 子 访 问 。否 则 , 对 于 volatile 限 定 对 象 的 读 取 和 写 入 根 据 源 代 码 的 直 接 指 示 发 生 , 并 按 源代 码 指 示 的 顺 序 执 行 。B-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


标 准 C 实 现 定 义B.1.11表 达 式 求 值编 译 器 可 以 对 仅 涉 及 同 等 优 先 级 关 联 运 算 符 和 交 换 运 算 符 的 表 达 式 ( 甚 至 是 含有 括 号 的 表 达 式 ) 进 行 重 新 排 序 。 例 如 , 如 果 a、 b 和 c 是 整 数 表 达 式 , 则 a +(b + c) 可 以 按 照 (a + b) + c 进 行 求 值 。在 序 列 点 之 间 , 编 译 器 可 以 按 照 任 意 顺 序 对 表 达 式 求 值 , 而 不 考 虑 括 号 。 因此 , 在 序 列 点 之 间 的 表 达 式 无 论 以 何 种 顺 序 出 现 , 都 有 可 能 出 现 副 作 用 。编 译 器 可 以 按 照 任 意 顺 序 对 函 数 参 数 求 值 。相 关 标 准 未 规 定 的 有 关 求 值 顺 序 的 所 有 方 面 , 可 能 因 以 下 情 况 而 有 所 不 同 :• 编 译 时 的 优 化 级 别• 所 使 用 的 编 译 器 的 版 本 。B.1.12预 处 理 指 令ISO 标 准 C 头 文 件 可 以 按 照 标 准 中 所 描 述 的 方 式 引 用 , 例 如 #include 。支 持 可 包 括 的 源 文 件 的 带 括 号 名 称 。 编 译 器 接 受 主 机 文 件 名 或 UNIX 文 件 名 。对 于 非 UNIX 主 机 上 的 UNIX 文 件 名 , 编 译 器 会 尝 试 将 该 文 件 名 翻 译 为 等 价 的本 地 文 件 名 。第 4-55 页 的 编 译 指 示 中 显 示 了 可 识 别 的 #pragma 指 令 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. B-7ID090708Non-Confidential, Unrestricted Access


标 准 C 实 现 定 义B.1.13库 函 数《 库 和 浮 点 支 持 指 南 》 中 第 1-2 页 的 关 于 运 行 时 库 中 列 出 了 ISO C 库 变 体 。每 一 C 库 的 准 确 性 质 对 特 定 实 现 来 说 是 唯 一 的 。 通 用 的 <strong>ARM</strong> C 库 具 有 或 支 持 以下 功 能 :• 宏 NULL 扩 展 为 整 型 常 数 0。• 如 果 程 序 重 新 定 义 保 留 的 外 部 识 别 符 ( 例 如 printf), 则 在 该 程 序 与 标 准库 链 接 时 可 能 会 出 错 。 如 果 该 程 序 未 与 标 准 库 链 接 , 则 检 测 不 到 错 误 。• __aeabi_assert() 函 数 输 出 有 关 stderr 失 败 诊 断 的 详 细 信 息 , 然 后 调 用abort() 函 数 :*** assertion failed: expression, file name, line number注 意assert 宏 的 行 为 取 决 于 最 近 出 现 的 #include 的 运 行 条 件 。 有 关详 细 信 息 , 请 参 阅 《 库 和 浮 点 支 持 指 南 》 中 第 2-36 页 的 从 程 序 中 退 出 。有 关 数 学 函 数 、 宏 、 语 言 环 境 、 信 号 和 输 入 / 输 出 的 实 现 细 节 , 请 参 阅 《 库 和 浮点 支 持 指 南 》 中 的 第 2 章 C 和 C++ 库 。B-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


标 准 C 实 现 定 义B.2 被 视 为 ISO C 标 准 未 定 义 的 行 为以 下 行 为 被 视 为 ISO C 标 准 未 定 义 的 行 为 :• 在 字 符 和 字 符 串 转 义 中 , 如 果 跟 随 在 \ 后 面 的 字 符 没 有 特 殊 意 义 , 则 转 义值 是 字 符 本 身 。 例 如 , 如 果 使 用 \s, 则 会 生 成 一 个 警 告 , 因 为 它 与 s 相同 。• 在 缺 省 情 况 下 , 没 有 命 名 字 段 但 至 少 有 一 个 未 命 名 字 段 的 struct 是 可 接 受的 , 但 在 严 格 的 1990 ISO 标 准 C 中 , 则 会 生 成 一 个 错 误 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. B-9ID090708Non-Confidential, Unrestricted Access


标 准 C 实 现 定 义B-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


附 录 C标 准 C++ 实 现 定 义在 编 译 C++ 时 ,<strong>ARM</strong> 编 译 器 支 持 ISO/IEC C++ 标 准 中 介 绍 的 大 多 数 语 言 功 能 。本 附 录 列 出 在 标 准 中 定 义 的 C++ 语 言 功 能 , 并 指 明 <strong>ARM</strong> C++ 是 否 支 持 某 一 语言 功 能 。 它 分 为 以 下 几 节 :• 第 C-2 页 的 整 型 转 换• 第 C-3 页 的 调 用 纯 虚 函 数• 第 C-4 页 的 主 要 的 语 言 支 持 特 性• 第 C-5 页 的 标 准 C++ 库 实 现 定 义注 意本 附 录 不 重 复 介 绍 属 于 标 准 C 实 现 的 信 息 。 请 参 阅 附 录 B 标 准 C 实 现 定 义 。在 ISO C 模 式 下 编 译 C++ 时 ,<strong>ARM</strong> 编 译 器 与 <strong>ARM</strong> C 编 译 器 相 同 。 在 涉 及 C 或C++ 特 有 的 实 现 特 性 的 位 置 , 本 文 将 予 以 指 明 。 有 关 标 准 C++ 扩 展 的 信 息 , 请参 阅 :• 第 3-14 页 的 标 准 C++ 语 言 扩 展• 第 3-6 页 的 C++ 和 C90 中 提 供 的 C99 语 言 功 能• 第 3-18 页 的 标 准 C 和 标 准 C++ 语 言 扩 展<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. C-1ID090708Non-Confidential, Unrestricted Access


标 准 C++ 实 现 定 义C.1 整 型 转 换在 整 型 转 换 过 程 中 , 如 果 目 标 类 型 有 符 号 , 在 该 值 可 按 照 目 标 类 型 和 位 域 宽 度表 示 时 , 该 值 保 持 不 变 。 否 则 , 该 值 将 被 截 断 以 适 合 目 标 类 型 的 大 小 。注 意本 节 内 容 与 ISO/IEC 标 准 的 4.7 节 “ 整 型 转 换 ” 相 关 。C-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


标 准 C++ 实 现 定 义C.2 调 用 纯 虚 函 数调 用 纯 虚 函 数 是 非 法 的 。 如 果 代 码 调 用 纯 虚 函 数 , 则 编 译 器 将 包 含 对 库 函 数__cxa_pure_virtual 的 调 用 。__cxa_pure_virtual 发 出 信 号 SIGPVFN。 缺 省 的 信 号 处 理 程 序 输 出 错 误 消 息 , 然后 退 出 。 有 关 详 细 信 息 , 请 参 阅 《 库 和 浮 点 支 持 指 南 》 中 第 2-61 页 的__default_signal_handler()。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. C-3ID090708Non-Confidential, Unrestricted Access


标 准 C++ 实 现 定 义C.3 主 要 的 语 言 支 持 特 性表 C-1 列 出 了 此 版 本 <strong>ARM</strong> C++ 支 持 的 主 要 语 言 功 能 。主 要 特 性 ISO/IEC 标 准 部 分 支 持内 核 语 言 1 至 13 是 。模 板 14 是 , 但 导 出 模 板 除 外 。异 常 15 是 。表 C-1 主 要 的 语 言 功 能 支 持库 17 到 27 请 参 阅 第 C-5 页 的 标 准 C++ 库 实 现 定 义 和《 库 和 浮 点 支 持 指 南 》。C-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


标 准 C++ 实 现 定 义C.4 标 准 C++ 库 实 现 定 义2.02.03 版 Rogue Wave 库 提 供 了 标 准 中 定 义 的 库 子 集 , 与 1999 ISO C 标 准 稍 有不 同 。 有 关 实 现 定 义 的 信 息 , 请 参 阅 《 库 和 浮 点 支 持 指 南 》 中 第 2-101 页 的 标准 C++ 库 实 现 定 义 。库 可 以 与 用 户 定 义 的 函 数 一 起 使 用 , 生 成 与 目 标 相 关 的 应 用 程 序 。 请 参 阅 《 库和 浮 点 支 持 指 南 》 中 第 1-2 页 的 关 于 运 行 时 库 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. C-5ID090708Non-Confidential, Unrestricted Access


标 准 C++ 实 现 定 义C-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


附 录 DC 和 C++ 编 译 器 实 现 限 制本 附 录 列 出 了 使 用 <strong>ARM</strong> 编 译 器 编 译 C 和 C++ 代 码 时 的 实 现 限 制 。 本 附 录 分 为以 下 几 节 :• 第 D-2 页 的 C++ ISO/IEC 标 准 限 制• 第 D-4 页 的 整 数 限 制• 第 D-5 页 的 浮 点 数 限 制<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. D-1ID090708Non-Confidential, Unrestricted Access


C 和 C++ 编 译 器 实 现 限 制D.1 C++ ISO/IEC 标 准 限 制ISO/IEC C++ 标 准 推 荐 了 符 合 标 准 的 编 译 器 必 须 接 受 的 最 低 限 制 。 在 编 译 器 之间 移 植 应 用 程 序 时 , 一 定 要 注 意 这 些 限 制 。 表 D-1 简 要 说 明 了 这 些 限 制 。在 该 表 中 ,memory 的 限 制 指 示 <strong>ARM</strong> 编 译 器 没 有 施 加 任 何 限 制 , 可 用 内 存 施 加 的限 制 除 外 。表 D-1 实 现 限 制说 明 推 荐 <strong>ARM</strong>复 合 语 句 、 迭 代 控 制 结 构 和 选 择 控 制 结 构 的 嵌 套 层 数 。 256 内 存条 件 包 含 的 嵌 套 层 数 。 256 内 存修 改 声 明 中 的 算 法 、 结 构 、 联 合 或 不 完 整 类 型 的 指 针 、 数 组 和函 数 声 明 符 个 数 ( 任 意 组 合 )。256 内 存完 整 表 达 式 中 的 括 号 表 达 式 的 嵌 套 层 数 。 256 内 存内 部 标 识 符 或 宏 名 中 的 初 始 字 符 数 。 1024 内 存外 部 标 识 符 中 的 初 始 字 符 数 。 1024 内 存一 个 转 换 单 元 中 的 外 部 标 识 符 数 。 65536 内 存在 一 个 块 中 声 明 的 具 有 块 范 围 的 标 识 符 数 。 1024 内 存在 一 个 转 换 单 元 中 同 时 定 义 的 宏 标 识 符 数 。 65536 内 存一 个 函 数 声 明 中 的 参 数 个 数 。 256 内 存一 个 函 数 调 用 中 的 自 变 量 个 数 。 256 内 存一 个 宏 定 义 中 的 参 数 个 数 。 256 内 存一 个 宏 调 用 中 的 自 变 量 个 数 。 256 内 存一 行 逻 辑 源 代 码 中 的 字 符 数 。 65536 内 存字 符 串 文 字 或 连 接 后 生 成 的 宽 字 符 串 文 字 中 的 字 符 数 。 65536 内 存C 或 C++ 对 象 ( 包 括 数 组 ) 的 大 小 。 262144 4294967296#include 文 件 的 嵌 套 层 数 。 256 内 存switch 语 句 的 case 标 签 数 , 不 包 括 任 何 嵌 套 switch 语 句 的 case标 签 。16384 内 存单 个 类 、 结 构 或 联 合 中 的 数 据 成 员 数 。 16384 内 存D-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


C 和 C++ 编 译 器 实 现 限 制表 D-1 实 现 限 制 ( 续 )说 明 推 荐 <strong>ARM</strong>单 个 枚 举 中 的 枚 举 常 数 个 数 。 4096 内 存单 个 struct 声 明 列 表 中 的 嵌 套 类 、 结 构 或 联 合 定 义 层 数 。 256 内 存atexit() 注 册 的 函 数 个 数 。 32 33直 接 和 间 接 基 类 数 。 16384 内 存单 个 类 的 直 接 基 类 数 。 1024 内 存在 单 个 类 中 声 明 的 成 员 数 。 4096 内 存类 中 的 最 终 覆 盖 虚 拟 函 数 个 数 ( 包 括 可 访 问 和 无 法 访 问 的 函数 )。16384 内 存类 的 直 接 和 间 接 虚 拟 基 址 数 。 1024 内 存类 的 静 态 成 员 数 。 1024 内 存类 的 友 元 声 明 数 。 4096 内 存类 中 的 访 问 控 制 声 明 数 。 4096 内 存构 造 函 数 定 义 中 的 成 员 初 始 值 设 定 项 数 。 6144 内 存一 个 标 识 符 的 范 围 限 定 数 。 256 内 存嵌 套 的 外 部 说 明 数 。 1024 内 存模 板 声 明 中 的 模 板 自 变 量 个 数 。 1024 内 存递 归 嵌 套 的 模 板 实 例 化 次 数 。 17 内 存每 个 测 试 块 的 处 理 程 序 数 。 256 内 存单 个 函 数 声 明 中 的 抛 出 说 明 数 。 256 内 存<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. D-3ID090708Non-Confidential, Unrestricted Access


C 和 C++ 编 译 器 实 现 限 制D.2 整 数 限 制表 D-2 给 出 了 <strong>ARM</strong> C 和 C++ 中 的 整 数 范 围 。 该 表 的 Endpoint 列 给 出 了 范 围 端 点的 数 值 。 Hex value 列 给 出 了 位 模 式 ( 十 六 进 制 ), 即 <strong>ARM</strong> 编 译 器 对 此 值 的 解释 。 这 些 常 数 是 在 limits.h 包 含 文 件 中 定 义 的 。输 入 常 数 时 , 应 注 意 选 择 大 小 和 符 号 。 在 十 进 制 以 及 十 六 进 制 / 八 进 制 中 , 对 常数 的 解 释 是 不 同 的 。 有 关 详 细 信 息 , 请 参 阅 相 应 C 或 C++ 标 准 或 任 何 推 荐 的 C和 C++ 教 科 书 , 如 第 viii 页 的 更 多 参 考 出 版 物 中 所 述 。表 D-2 整 数 范 围常 数 含 义 值 十 六 进 制 值CHAR_MAX char 的 最 大 值 255 0xFFCHAR_MIN char 的 最 小 值 0 0x00SCHAR_MAX signed char 的 最 大 值 127 0x7FSCHAR_MIN signed char 的 最 小 值 –128 0x80UCHAR_MAX unsigned char 的 最 大 值 255 0xFFSHRT_MAX short 的 最 大 值 32767 0x7FFFSHRT_MIN short 的 最 小 值 –32768 0x8000USHRT_MAX unsigned short 的 最 大 值 65535 0xFFFFINT_MAX int 的 最 大 值 2147483647 0x7FFFFFFFINT_MIN int 的 最 小 值 –2147483648 0x80000000LONG_MAX long 的 最 大 值 2147483647 0x7FFFFFFFLONG_MIN long 的 最 小 值 –2147483648 0x80000000ULONG_MAX unsigned long 的 最 大 值 4294967295 0xFFFFFFFFLLONG_MAX long long 的 最 大 值 9.2E+18 0x7FFFFFFFFFFFFFFFLLONG_MIN long long 的 最 小 值 –9.2E+18 0x8000000000000000ULLONG_MAX unsigned long long 的 最 大 值 1.8E+19 0xFFFFFFFFFFFFFFFFD-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


C 和 C++ 编 译 器 实 现 限 制D.3 浮 点 数 限 制本 节 介 绍 了 浮 点 数 的 特 征 。表 D-3 给 出 了 浮 点 数 的 特 征 、 范 围 和 限 制 。 这 些 常 数 是 在 float.h 包 含 文 件 中 定义 的 。表 D-3 浮 点 限 制常 数 含 义 值FLT_MAX float 的 最 大 值 3.40282347e+38FFLT_MIN float 的 最 小 标 准 化 正 浮 点 数 值 1.175494351e–38FDBL_MAX double 的 最 大 值 1.79769313486231571e+308DBL_MIN double 的 最 小 标 准 化 正 浮 点 数 值 2.22507385850720138e–308LDBL_MAX long double 的 最 大 值 1.79769313486231571e+308LDBL_MIN long double 的 最 小 标 准 化 正 浮 点 数 值 2.22507385850720138e–308FLT_MAX_EXP float 类 型 以 2 为 底 的 指 数 的 最 大 值 128FLT_MIN_EXP float 类 型 以 2 为 底 的 指 数 的 最 小 值 –125DBL_MAX_EXP double 类 型 以 2 为 底 的 指 数 的 最 大 值 1024DBL_MIN_EXP double 类 型 以 2 为 底 的 指 数 的 最 小 值 –1021LDBL_MAX_EXP long double 类 型 以 2 为 底 的 指 数 的 最 大 值 1024LDBL_MIN_EXP long double 类 型 以 2 为 底 的 指 数 的 最 小 值 –1021FLT_MAX_10_EXP float 类 型 以 10 为 底 的 指 数 的 最 大 值 38FLT_MIN_10_EXP float 类 型 以 10 为 底 的 指 数 的 最 小 值 –37DBL_MAX_10_EXP double 类 型 以 10 为 底 的 指 数 的 最 大 值 308DBL_MIN_10_EXP double 类 型 以 10 为 底 的 指 数 的 最 小 值 –307LDBL_MAX_10_EXP long double 类 型 以 10 为 底 的 指 数 的 最 大 值 308LDBL_MIN_10_EXP long double 类 型 以 10 为 底 的 指 数 的 最 小 值 –307<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. D-5ID090708Non-Confidential, Unrestricted Access


C 和 C++ 编 译 器 实 现 限 制表 D-4 介 绍 了 浮 点 数 的 其 他 特 征 。 这 些 常 数 也 是 在 float.h 包 含 文 件 中 定 义 的 。表 D-4 其 他 浮 点 特 征常 数 含 义 值FLT_RADIX <strong>ARM</strong> 浮 点 数 表 示 法 的 底 ( 基 数 ) 2FLT_ROUNDS 浮 点 数 的 舍 入 模 式 ( 最 接 近 的 ) 1FLT_DIG float 精 度 的 十 进 制 位 数 6DBL_DIG double 精 度 的 十 进 制 位 数 15LDBL_DIG long double 精 度 的 十 进 制 位 数 15FLT_MANT_DIG float 精 度 的 二 进 制 位 数 24DBL_MANT_DIG double 精 度 的 二 进 制 位 数 53LDBL_MANT_DIG long double 类 型 的 精 度 的 二 进 制 位 数 53FLT_EPSILON 对 于 float 类 型 , 1.0 + x != 1.0 中 x 的 最 小 正 值 1.19209290e–7FDBL_EPSILON 对 于 double 类 型 , 1.0 + x != 1.0 中 x 的 最 小 正 值 2.2204460492503131e–16LDBL_EPSILON 对 于 long double 类 型 , 1.0 + x != 1.0 中 x 的 最 小 正 值 2.2204460492503131e–16L注 意• 将 某 个 浮 点 数 转 换 为 更 短 的 浮 点 数 时 , 它 将 舍 入 到 最 接 近 的 可 表 示 数 。• 浮 点 算 法 符 合 IEEE 754。D-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


附 录 E使 用 NEON 支 持本 附 录 介 绍 此 版 本 的 <strong>RealView</strong> 编 译 工 具 (RVCT) 对 NEON 内 在 函 数 的 支 持 。它 分 为 以 下 几 节 :• 第 E-2 页 的 简 介• 第 E-3 页 的 向 量 数 据 类 型• 第 E-4 页 的 内 在 函 数<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-1ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持E.1 简 介RVCT 提 供 在 <strong>ARM</strong> 和 Thumb 状 态 下 为 Cortex-A8 处 理 器 生 成 NEON 代 码 的 内 在函 数 。 NEON 内 在 函 数 在 头 文 件 arm_neon.h 中 定 义 。 头 文 件 既 定 义 内 在 函 数 ,也 定 义 一 组 向 量 类 型 。<strong>ARM</strong>v7 之 前 的 体 系 结 构 不 支 持 NEON 内 在 函 数 。 构 建 较 早 版 本 的 体 系 结 构 时 ,或 者 构 建 不 包 括 NEON 的 <strong>ARM</strong>v7 体 系 结 构 配 置 文 件 时 , 编 译 器 将 NEON 内 在函 数 视 为 普 通 函 数 调 用 。 这 会 导 致 链 接 时 出 现 错 误 。E-2 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持E.2 向 量 数 据 类 型定 义 了 以 下 类 型 来 表 示 向 量 。 NEON 向 量 数 据 类 型 是 根 据 以 下 模 式 命 名 的 :x_t例 如 ,int16x4_t 是 一 个 包 含 四 条 向 量 线 的 向 量 , 每 条 向 量 线 包 含 一 个 有 符 号 16位 整 数 。 表 E-1 列 出 了 向 量 数 据 类 型 。表 E-1 向 量 数 据 类 型int8x8_tint16x4_tint32x2_tint64x1_tuint8x8_tuint16x4_tuint32x2_tuint64x1_tfloat16x4_tfloat32x2_tpoly8x8_tpoly16x4_tint8x16_tint16x8_tint32x4_tint64x2_tuint8x16_tuint16x8_tuint32x4_tuint64x2_tfloat16x8_tfloat32x4_tpoly8x16_tpoly16x8_t某 些 内 在 函 数 使 用 以 下 格 式 的 向 量 类 型 数 组 :xx_t这 些 类 型 被 视 为 包 含 名 为 val 的 单 个 元 素 的 普 通 C 结 构 。以 下 是 一 个 结 构 定 义 示 例 :struct int16x4x2_t{int16x4_t val[2];};为 长 度 为 2 至 4 的 数 组 定 义 了 数 组 类 型 , 其 向 量 类 型 为 表 E-1 列 出 的 任 何 一 种 。<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-3ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持E.3 内 在 函 数本 节 介 绍 的 内 在 函 数 紧 密 映 射 至 NEON 指 令 。 每 节 开 头 是 函 数 原 型 列 表 , 并 包含 指 定 等 效 汇 编 器 指 令 的 注 释 。 编 译 器 会 选 择 一 条 具 有 所 需 语 义 的 指 令 , 但 不保 证 编 译 器 会 生 成 列 出 的 指 令 。内 在 函 数 使 用 类 似 于 NEON 统 一 汇 编 器 语 法 的 命 名 方 案 。 即 , 每 个 内 在 函 数 的格 式 如 下 :_另 外 提 供 q 标 记 来 指 定 内 在 函 数 对 128 位 向 量 进 行 运 算 。例 如 :• vmul_s16, 表 示 两 个 有 符 号 16 位 值 的 向 量 相 乘 。这 编 译 为 VMUL.I16 d2, d0, d1。• vaddl_u8, 是 指 两 个 包 含 无 符 号 8 位 值 的 64 位 向 量 按 长 型 相 加 , 结 果 为 无符 号 16 位 值 的 128 位 向 量 。这 编 译 为 VADDL.U8 q1, d0, d1。注 意本 手 册 中 的 内 在 函 数 原 型 使 用 以 下 类 型 注 释 :__const(n)参 数 n 必 须 是 编 译 时 常 数__constrange(min, max)参 数 必 须 是 编 译 时 常 数 , 范 围 为 min 至 max__transfersize(n)内 在 函 数 从 此 指 针 加 载 n 个 字 节 。注 意使 用 __fp16 的 NEON 内 在 函 数 原 型 仅 可 用 于 具 有 NEON 半 精 度 VFP 扩 展 的 目标 。 若 要 启 用 __fp16, 请 使 用 --fp16_format 命 令 行 选 项 。 请 参 阅 第 2-59 页的 --fp16_format=format。E-4 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持E.3.1加 法以 下 内 在 函 数 对 向 量 进 行 加 法 运 算 。 结 果 中 的 每 条 向 量 线 都 是 对 每 个 操 作 数 向量 中 的 相 应 向 量 线 执 行 加 法 运 算 的 结 果 。 执 行 的 运 算 如 下 :• 向 量 加 法 :vadd -> Vr[i]:=Va[i]+Vb[i]• 向 量 长 型 加 法 :vadd -> Vr[i]:=Va[i]+Vb[i]• 第 E-6 页 的 向 量 宽 型 加 法 :vadd -> Vr[i]:=Va[i]+Vb[i]• 第 E-6 页 的 向 量 半 加 :vhadd -> Vr[i]:=(Va[i]+Vb[i])>>1• 第 E-6 页 的 向 量 舍 入 半 加 :vrhadd -> Vr[i]:=(Va[i]+Vb[i]+1)>>1• 第 E-7 页 的 向 量 饱 和 加 法 :vqadd -> Vr[i]:=sat(Va[i]+Vb[i])• 第 E-7 页 的 高 位 半 部 分 向 量 加 法 :- > Vr[i]:=Va[i]+Vb[i]• 第 E-7 页 的 高 位 半 部 分 向 量 舍 入 加 法向 量 加 法 :vadd -> Vr[i]:=Va[i]+Vb[i]Vr、 Va、 Vb 具 有 相 等 的 向 量 线 大 小 。int8x8_t vadd_s8(int8x8_t a, int8x8_t b); // VADD.I8 d0,d0,d0int16x4_t vadd_s16(int16x4_t a, int16x4_t b); // VADD.I16 d0,d0,d0int32x2_t vadd_s32(int32x2_t a, int32x2_t b); // VADD.I32 d0,d0,d0int64x1_t vadd_s64(int64x1_t a, int64x1_t b); // VADD.I64 d0,d0,d0float32x2_t vadd_f32(float32x2_t a, float32x2_t b); // VADD.F32 d0,d0,d0uint8x8_t vadd_u8(uint8x8_t a, uint8x8_t b); // VADD.I8 d0,d0,d0uint16x4_t vadd_u16(uint16x4_t a, uint16x4_t b); // VADD.I16 d0,d0,d0uint32x2_t vadd_u32(uint32x2_t a, uint32x2_t b); // VADD.I32 d0,d0,d0uint64x1_t vadd_u64(uint64x1_t a, uint64x1_t b); // VADD.I64 d0,d0,d0int8x16_t vaddq_s8(int8x16_t a, int8x16_t b); // VADD.I8 q0,q0,q0int16x8_t vaddq_s16(int16x8_t a, int16x8_t b); // VADD.I16 q0,q0,q0int32x4_t vaddq_s32(int32x4_t a, int32x4_t b); // VADD.I32 q0,q0,q0int64x2_t vaddq_s64(int64x2_t a, int64x2_t b); // VADD.I64 q0,q0,q0float32x4_t vaddq_f32(float32x4_t a, float32x4_t b); // VADD.F32 q0,q0,q0uint8x16_t vaddq_u8(uint8x16_t a, uint8x16_t b); // VADD.I8 q0,q0,q0uint16x8_t vaddq_u16(uint16x8_t a, uint16x8_t b); // VADD.I16 q0,q0,q0uint32x4_t vaddq_u32(uint32x4_t a, uint32x4_t b); // VADD.I32 q0,q0,q0uint64x2_t vaddq_u64(uint64x2_t a, uint64x2_t b); // VADD.I64 q0,q0,q0向 量 长 型 加 法 :vadd -> Vr[i]:=Va[i]+Vb[i]Va、 Vb 具 有 相 等 的 向 量 线 大 小 , 结 果 为 向 量 线 宽 度 变 成 两 倍 的 128 位 向 量 。int16x8_t vaddl_s8(int8x8_t a, int8x8_t b);int32x4_t vaddl_s16(int16x4_t a, int16x4_t b);int64x2_t vaddl_s32(int32x2_t a, int32x2_t b);// VADDL.S8 q0,d0,d0// VADDL.S16 q0,d0,d0// VADDL.S32 q0,d0,d0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-5ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持uint16x8_t vaddl_u8(uint8x8_t a, uint8x8_t b); // VADDL.U8 q0,d0,d0uint32x4_t vaddl_u16(uint16x4_t a, uint16x4_t b); // VADDL.U16 q0,d0,d0uint64x2_t vaddl_u32(uint32x2_t a, uint32x2_t b); // VADDL.U32 q0,d0,d0向 量 宽 型 加 法 :vadd -> Vr[i]:=Va[i]+Vb[i]int16x8_t vaddw_s8(int16x8_t a, int8x8_t b); // VADDW.S8 q0,q0,d0int32x4_t vaddw_s16(int32x4_t a, int16x4_t b); // VADDW.S16 q0,q0,d0int64x2_t vaddw_s32(int64x2_t a, int32x2_t b); // VADDW.S32 q0,q0,d0uint16x8_t vaddw_u8(uint16x8_t a, uint8x8_t b); // VADDW.U8 q0,q0,d0uint32x4_t vaddw_u16(uint32x4_t a, uint16x4_t b); // VADDW.U16 q0,q0,d0uint64x2_t vaddw_u32(uint64x2_t a, uint32x2_t b); // VADDW.U32 q0,q0,d0向 量 半 加 :vhadd -> Vr[i]:=(Va[i]+Vb[i])>>1int8x8_t vhadd_s8(int8x8_t a, int8x8_t b); // VHADD.S8 d0,d0,d0int16x4_t vhadd_s16(int16x4_t a, int16x4_t b); // VHADD.S16 d0,d0,d0int32x2_t vhadd_s32(int32x2_t a, int32x2_t b); // VHADD.S32 d0,d0,d0uint8x8_t vhadd_u8(uint8x8_t a, uint8x8_t b); // VHADD.U8 d0,d0,d0uint16x4_t vhadd_u16(uint16x4_t a, uint16x4_t b); // VHADD.U16 d0,d0,d0uint32x2_t vhadd_u32(uint32x2_t a, uint32x2_t b); // VHADD.U32 d0,d0,d0int8x16_t vhaddq_s8(int8x16_t a, int8x16_t b); // VHADD.S8 q0,q0,q0int16x8_t vhaddq_s16(int16x8_t a, int16x8_t b); // VHADD.S16 q0,q0,q0int32x4_t vhaddq_s32(int32x4_t a, int32x4_t b); // VHADD.S32 q0,q0,q0uint8x16_t vhaddq_u8(uint8x16_t a, uint8x16_t b); // VHADD.U8 q0,q0,q0uint16x8_t vhaddq_u16(uint16x8_t a, uint16x8_t b); // VHADD.U16 q0,q0,q0uint32x4_t vhaddq_u32(uint32x4_t a, uint32x4_t b); // VHADD.U32 q0,q0,q0向 量 舍 入 半 加 :vrhadd -> Vr[i]:=(Va[i]+Vb[i]+1)>>1int8x8_t vrhadd_s8(int8x8_t a, int8x8_t b); // VRHADD.S8 d0,d0,d0int16x4_t vrhadd_s16(int16x4_t a, int16x4_t b); // VRHADD.S16 d0,d0,d0int32x2_t vrhadd_s32(int32x2_t a, int32x2_t b); // VRHADD.S32 d0,d0,d0uint8x8_t vrhadd_u8(uint8x8_t a, uint8x8_t b); // VRHADD.U8 d0,d0,d0uint16x4_t vrhadd_u16(uint16x4_t a, uint16x4_t b); // VRHADD.U16 d0,d0,d0uint32x2_t vrhadd_u32(uint32x2_t a, uint32x2_t b); // VRHADD.U32 d0,d0,d0int8x16_t vrhaddq_s8(int8x16_t a, int8x16_t b); // VRHADD.S8 q0,q0,q0int16x8_t vrhaddq_s16(int16x8_t a, int16x8_t b); // VRHADD.S16 q0,q0,q0int32x4_t vrhaddq_s32(int32x4_t a, int32x4_t b); // VRHADD.S32 q0,q0,q0uint8x16_t vrhaddq_u8(uint8x16_t a, uint8x16_t b); // VRHADD.U8 q0,q0,q0uint16x8_t vrhaddq_u16(uint16x8_t a, uint16x8_t b); // VRHADD.U16 q0,q0,q0uint32x4_t vrhaddq_u32(uint32x4_t a, uint32x4_t b); // VRHADD.U32 q0,q0,q0E-6 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持向 量 饱 和 加 法 :vqadd -> Vr[i]:=sat(Va[i]+Vb[i])int8x8_t vqadd_s8(int8x8_t a, int8x8_t b); // VQADD.S8 d0,d0,d0int16x4_t vqadd_s16(int16x4_t a, int16x4_t b); // VQADD.S16 d0,d0,d0int32x2_t vqadd_s32(int32x2_t a, int32x2_t b); // VQADD.S32 d0,d0,d0int64x1_t vqadd_s64(int64x1_t a, int64x1_t b); // VQADD.S64 d0,d0,d0uint8x8_t vqadd_u8(uint8x8_t a, uint8x8_t b); // VQADD.U8 d0,d0,d0uint16x4_t vqadd_u16(uint16x4_t a, uint16x4_t b); // VQADD.U16 d0,d0,d0uint32x2_t vqadd_u32(uint32x2_t a, uint32x2_t b); // VQADD.U32 d0,d0,d0uint64x1_t vqadd_u64(uint64x1_t a, uint64x1_t b); // VQADD.U64 d0,d0,d0int8x16_t vqaddq_s8(int8x16_t a, int8x16_t b); // VQADD.S8 q0,q0,q0int16x8_t vqaddq_s16(int16x8_t a, int16x8_t b); // VQADD.S16 q0,q0,q0int32x4_t vqaddq_s32(int32x4_t a, int32x4_t b); // VQADD.S32 q0,q0,q0int64x2_t vqaddq_s64(int64x2_t a, int64x2_t b); // VQADD.S64 q0,q0,q0uint8x16_t vqaddq_u8(uint8x16_t a, uint8x16_t b); // VQADD.U8 q0,q0,q0uint16x8_t vqaddq_u16(uint16x8_t a, uint16x8_t b); // VQADD.U16 q0,q0,q0uint32x4_t vqaddq_u32(uint32x4_t a, uint32x4_t b); // VQADD.U32 q0,q0,q0uint64x2_t vqaddq_u64(uint64x2_t a, uint64x2_t b); // VQADD.U64 q0,q0,q0高 位 半 部 分 向 量 加 法 :- > Vr[i]:=Va[i]+Vb[i]int8x8_t vaddhn_s16(int16x8_t a, int16x8_t b); // VADDHN.I16 d0,q0,q0int16x4_t vaddhn_s32(int32x4_t a, int32x4_t b); // VADDHN.I32 d0,q0,q0int32x2_t vaddhn_s64(int64x2_t a, int64x2_t b); // VADDHN.I64 d0,q0,q0uint8x8_t vaddhn_u16(uint16x8_t a, uint16x8_t b); // VADDHN.I16 d0,q0,q0uint16x4_t vaddhn_u32(uint32x4_t a, uint32x4_t b); // VADDHN.I32 d0,q0,q0uint32x2_t vaddhn_u64(uint64x2_t a, uint64x2_t b); // VADDHN.I64 d0,q0,q0高 位 半 部 分 向 量 舍 入 加 法int8x8_t vraddhn_s16(int16x8_t a, int16x8_t b); // VRADDHN.I16 d0,q0,q0int16x4_t vraddhn_s32(int32x4_t a, int32x4_t b); // VRADDHN.I32 d0,q0,q0int32x2_t vraddhn_s64(int64x2_t a, int64x2_t b); // VRADDHN.I64 d0,q0,q0uint8x8_t vraddhn_u16(uint16x8_t a, uint16x8_t b); // VRADDHN.I16 d0,q0,q0uint16x4_t vraddhn_u32(uint32x4_t a, uint32x4_t b); // VRADDHN.I32 d0,q0,q0uint32x2_t vraddhn_u64(uint64x2_t a, uint64x2_t b); // VRADDHN.I64 d0,q0,q0E.3.2乘 法以 下 内 在 函 数 提 供 包 含 乘 法 的 运 算 。向 量 乘 法 :vmul -> Vr[i] := Va[i] * Vb[i]int8x8_t vmul_s8(int8x8_t a, int8x8_t b); // VMUL.I8 d0,d0,d0int16x4_t vmul_s16(int16x4_t a, int16x4_t b); // VMUL.I16 d0,d0,d0int32x2_t vmul_s32(int32x2_t a, int32x2_t b); // VMUL.I32 d0,d0,d0float32x2_t vmul_f32(float32x2_t a, float32x2_t b); // VMUL.F32 d0,d0,d0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-7ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持uint8x8_t vmul_u8(uint8x8_t a, uint8x8_t b); // VMUL.I8 d0,d0,d0uint16x4_t vmul_u16(uint16x4_t a, uint16x4_t b); // VMUL.I16 d0,d0,d0uint32x2_t vmul_u32(uint32x2_t a, uint32x2_t b); // VMUL.I32 d0,d0,d0poly8x8_t vmul_p8(poly8x8_t a, poly8x8_t b); // VMUL.P8 d0,d0,d0int8x16_t vmulq_s8(int8x16_t a, int8x16_t b); // VMUL.I8 q0,q0,q0int16x8_t vmulq_s16(int16x8_t a, int16x8_t b); // VMUL.I16 q0,q0,q0int32x4_t vmulq_s32(int32x4_t a, int32x4_t b); // VMUL.I32 q0,q0,q0float32x4_t vmulq_f32(float32x4_t a, float32x4_t b); // VMUL.F32 q0,q0,q0uint8x16_t vmulq_u8(uint8x16_t a, uint8x16_t b); // VMUL.I8 q0,q0,q0uint16x8_t vmulq_u16(uint16x8_t a, uint16x8_t b); // VMUL.I16 q0,q0,q0uint32x4_t vmulq_u32(uint32x4_t a, uint32x4_t b); // VMUL.I32 q0,q0,q0poly8x16_t vmulq_p8(poly8x16_t a, poly8x16_t b); // VMUL.P8 q0,q0,q0向 量 乘 加 :vmla -> Vr[i] := Va[i] + Vb[i] * Vc[i]int8x8_t vmla_s8(int8x8_t a, int8x8_t b, int8x8_t c); // VMLA.I8 d0,d0,d0int16x4_t vmla_s16(int16x4_t a, int16x4_t b, int16x4_t c); // VMLA.I16 d0,d0,d0int32x2_t vmla_s32(int32x2_t a, int32x2_t b, int32x2_t c); // VMLA.I32 d0,d0,d0float32x2_t vmla_f32(float32x2_t a, float32x2_t b, float32x2_t c); // VMLA.F32 d0,d0,d0uint8x8_t vmla_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); // VMLA.I8 d0,d0,d0uint16x4_t vmla_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c); // VMLA.I16 d0,d0,d0uint32x2_t vmla_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c); // VMLA.I32 d0,d0,d0int8x16_t vmlaq_s8(int8x16_t a, int8x16_t b, int8x16_t c); // VMLA.I8 q0,q0,q0int16x8_t vmlaq_s16(int16x8_t a, int16x8_t b, int16x8_t c); // VMLA.I16 q0,q0,q0int32x4_t vmlaq_s32(int32x4_t a, int32x4_t b, int32x4_t c); // VMLA.I32 q0,q0,q0float32x4_t vmlaq_f32(float32x4_t a, float32x4_t b, float32x4_t c); // VMLA.F32 q0,q0,q0uint8x16_t vmlaq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c); // VMLA.I8 q0,q0,q0uint16x8_t vmlaq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c); // VMLA.I16 q0,q0,q0uint32x4_t vmlaq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c); // VMLA.I32 q0,q0,q0向 量 长 型 乘 加 :vmla -> Vr[i] := Va[i] + Vb[i] * Vc[i]int16x8_t vmlal_s8(int16x8_t a, int8x8_t b, int8x8_t c); // VMLAL.S8 q0,d0,d0int32x4_t vmlal_s16(int32x4_t a, int16x4_t b, int16x4_t c); // VMLAL.S16 q0,d0,d0int64x2_t vmlal_s32(int64x2_t a, int32x2_t b, int32x2_t c); // VMLAL.S32 q0,d0,d0uint16x8_t vmlal_u8(uint16x8_t a, uint8x8_t b, uint8x8_t c); // VMLAL.U8 q0,d0,d0uint32x4_t vmlal_u16(uint32x4_t a, uint16x4_t b, uint16x4_t c); // VMLAL.U16 q0,d0,d0uint64x2_t vmlal_u32(uint64x2_t a, uint32x2_t b, uint32x2_t c); // VMLAL.U32 q0,d0,d0向 量 乘 减 :vmls -> Vr[i] := Va[i] - Vb[i] * Vc[i]int8x8_t vmls_s8(int8x8_t a, int8x8_t b, int8x8_t c); // VMLS.I8 d0,d0,d0int16x4_t vmls_s16(int16x4_t a, int16x4_t b, int16x4_t c); // VMLS.I16 d0,d0,d0int32x2_t vmls_s32(int32x2_t a, int32x2_t b, int32x2_t c); // VMLS.I32 d0,d0,d0float32x2_t vmls_f32(float32x2_t a, float32x2_t b, float32x2_t c); // VMLS.F32 d0,d0,d0uint8x8_t vmls_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); // VMLS.I8 d0,d0,d0uint16x4_t vmls_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c); // VMLS.I16 d0,d0,d0uint32x2_t vmls_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c); // VMLS.I32 d0,d0,d0E-8 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持int8x16_t vmlsq_s8(int8x16_t a, int8x16_t b, int8x16_t c); // VMLS.I8 q0,q0,q0int16x8_t vmlsq_s16(int16x8_t a, int16x8_t b, int16x8_t c); // VMLS.I16 q0,q0,q0int32x4_t vmlsq_s32(int32x4_t a, int32x4_t b, int32x4_t c); // VMLS.I32 q0,q0,q0float32x4_t vmlsq_f32(float32x4_t a, float32x4_t b, float32x4_t c); // VMLS.F32 q0,q0,q0uint8x16_t vmlsq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c); // VMLS.I8 q0,q0,q0uint16x8_t vmlsq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c); // VMLS.I16 q0,q0,q0uint32x4_t vmlsq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c); // VMLS.I32 q0,q0,q0向 量 长 型 乘 减int16x8_t vmlsl_s8(int16x8_t a, int8x8_t b, int8x8_t c); // VMLSL.S8 q0,d0,d0int32x4_t vmlsl_s16(int32x4_t a, int16x4_t b, int16x4_t c); // VMLSL.S16 q0,d0,d0int64x2_t vmlsl_s32(int64x2_t a, int32x2_t b, int32x2_t c); // VMLSL.S32 q0,d0,d0uint16x8_t vmlsl_u8(uint16x8_t a, uint8x8_t b, uint8x8_t c); // VMLSL.U8 q0,d0,d0uint32x4_t vmlsl_u16(uint32x4_t a, uint16x4_t b, uint16x4_t c); // VMLSL.U16 q0,d0,d0uint64x2_t vmlsl_u32(uint64x2_t a, uint32x2_t b, uint32x2_t c); // VMLSL.U32 q0,d0,d0向 量 高 位 饱 和 加 倍 乘 法int16x4_t vqdmulh_s16(int16x4_t a, int16x4_t b); // VQDMULH.S16 d0,d0,d0int32x2_t vqdmulh_s32(int32x2_t a, int32x2_t b); // VQDMULH.S32 d0,d0,d0int16x8_t vqdmulhq_s16(int16x8_t a, int16x8_t b); // VQDMULH.S16 q0,q0,q0int32x4_t vqdmulhq_s32(int32x4_t a, int32x4_t b); // VQDMULH.S32 q0,q0,q0向 量 高 位 饱 和 舍 入 加 倍 乘 法int16x4_t vqrdmulh_s16(int16x4_t a, int16x4_t b); // VQRDMULH.S16 d0,d0,d0int32x2_t vqrdmulh_s32(int32x2_t a, int32x2_t b); // VQRDMULH.S32 d0,d0,d0int16x8_t vqrdmulhq_s16(int16x8_t a, int16x8_t b); // VQRDMULH.S16 q0,q0,q0int32x4_t vqrdmulhq_s32(int32x4_t a, int32x4_t b); // VQRDMULH.S32 q0,q0,q0向 量 长 型 饱 和 加 倍 乘 加int32x4_t vqdmlal_s16(int32x4_t a, int16x4_t b, int16x4_t c); // VQDMLAL.S16 q0,d0,d0int64x2_t vqdmlal_s32(int64x2_t a, int32x2_t b, int32x2_t c); // VQDMLAL.S32 q0,d0,d0向 量 长 型 饱 和 加 倍 乘 减int32x4_t vqdmlsl_s16(int32x4_t a, int16x4_t b, int16x4_t c); // VQDMLSL.S16 q0,d0,d0int64x2_t vqdmlsl_s32(int64x2_t a, int32x2_t b, int32x2_t c); // VQDMLSL.S32 q0,d0,d0向 量 长 型 乘 法int16x8_t vmull_s8(int8x8_t a, int8x8_t b);int32x4_t vmull_s16(int16x4_t a, int16x4_t b);int64x2_t vmull_s32(int32x2_t a, int32x2_t b);uint16x8_t vmull_u8(uint8x8_t a, uint8x8_t b);// VMULL.S8 q0,d0,d0// VMULL.S16 q0,d0,d0// VMULL.S32 q0,d0,d0// VMULL.U8 q0,d0,d0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-9ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持uint32x4_t vmull_u16(uint16x4_t a, uint16x4_t b); // VMULL.U16 q0,d0,d0uint64x2_t vmull_u32(uint32x2_t a, uint32x2_t b); // VMULL.U32 q0,d0,d0poly16x8_t vmull_p8(poly8x8_t a, poly8x8_t b); // VMULL.P8 q0,d0,d0向 量 长 型 饱 和 加 倍 乘 法int32x4_t vqdmull_s16(int16x4_t a, int16x4_t b); // VQDMULL.S16 q0,d0,d0int64x2_t vqdmull_s32(int32x2_t a, int32x2_t b); // VQDMULL.S32 q0,d0,d0E.3.3减 法以 下 内 在 函 数 提 供 包 含 减 法 的 运 算 。向 量 减 法int8x8_t vsub_s8(int8x8_t a, int8x8_t b); // VSUB.I8 d0,d0,d0int16x4_t vsub_s16(int16x4_t a, int16x4_t b); // VSUB.I16 d0,d0,d0int32x2_t vsub_s32(int32x2_t a, int32x2_t b); // VSUB.I32 d0,d0,d0int64x1_t vsub_s64(int64x1_t a, int64x1_t b); // VSUB.I64 d0,d0,d0float32x2_t vsub_f32(float32x2_t a, float32x2_t b); // VSUB.F32 d0,d0,d0uint8x8_t vsub_u8(uint8x8_t a, uint8x8_t b); // VSUB.I8 d0,d0,d0uint16x4_t vsub_u16(uint16x4_t a, uint16x4_t b); // VSUB.I16 d0,d0,d0uint32x2_t vsub_u32(uint32x2_t a, uint32x2_t b); // VSUB.I32 d0,d0,d0uint64x1_t vsub_u64(uint64x1_t a, uint64x1_t b); // VSUB.I64 d0,d0,d0int8x16_t vsubq_s8(int8x16_t a, int8x16_t b); // VSUB.I8 q0,q0,q0int16x8_t vsubq_s16(int16x8_t a, int16x8_t b); // VSUB.I16 q0,q0,q0int32x4_t vsubq_s32(int32x4_t a, int32x4_t b); // VSUB.I32 q0,q0,q0int64x2_t vsubq_s64(int64x2_t a, int64x2_t b); // VSUB.I64 q0,q0,q0float32x4_t vsubq_f32(float32x4_t a, float32x4_t b); // VSUB.F32 q0,q0,q0uint8x16_t vsubq_u8(uint8x16_t a, uint8x16_t b); // VSUB.I8 q0,q0,q0uint16x8_t vsubq_u16(uint16x8_t a, uint16x8_t b); // VSUB.I16 q0,q0,q0uint32x4_t vsubq_u32(uint32x4_t a, uint32x4_t b); // VSUB.I32 q0,q0,q0uint64x2_t vsubq_u64(uint64x2_t a, uint64x2_t b); // VSUB.I64 q0,q0,q0向 量 长 型 减 法 :vsub -> Vr[i]:=Va[i]+Vb[i]int16x8_t vsubl_s8(int8x8_t a, int8x8_t b); // VSUBL.S8 q0,d0,d0int32x4_t vsubl_s16(int16x4_t a, int16x4_t b); // VSUBL.S16 q0,d0,d0int64x2_t vsubl_s32(int32x2_t a, int32x2_t b); // VSUBL.S32 q0,d0,d0uint16x8_t vsubl_u8(uint8x8_t a, uint8x8_t b); // VSUBL.U8 q0,d0,d0uint32x4_t vsubl_u16(uint16x4_t a, uint16x4_t b); // VSUBL.U16 q0,d0,d0uint64x2_t vsubl_u32(uint32x2_t a, uint32x2_t b); // VSUBL.U32 q0,d0,d0E-10 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持向 量 宽 型 减 法 :vsub -> Vr[i]:=Va[i]+Vb[i]int16x8_t vsubw_s8(int16x8_t a, int8x8_t b); // VSUBW.S8 q0,q0,d0int32x4_t vsubw_s16(int32x4_t a, int16x4_t b); // VSUBW.S16 q0,q0,d0int64x2_t vsubw_s32(int64x2_t a, int32x2_t b); // VSUBW.S32 q0,q0,d0uint16x8_t vsubw_u8(uint16x8_t a, uint8x8_t b); // VSUBW.U8 q0,q0,d0uint32x4_t vsubw_u16(uint32x4_t a, uint16x4_t b); // VSUBW.U16 q0,q0,d0uint64x2_t vsubw_u32(uint64x2_t a, uint32x2_t b); // VSUBW.U32 q0,q0,d0向 量 饱 和 减 法int8x8_t vqsub_s8(int8x8_t a, int8x8_t b); // VQSUB.S8 d0,d0,d0int16x4_t vqsub_s16(int16x4_t a, int16x4_t b); // VQSUB.S16 d0,d0,d0int32x2_t vqsub_s32(int32x2_t a, int32x2_t b); // VQSUB.S32 d0,d0,d0int64x1_t vqsub_s64(int64x1_t a, int64x1_t b); // VQSUB.S64 d0,d0,d0uint8x8_t vqsub_u8(uint8x8_t a, uint8x8_t b); // VQSUB.U8 d0,d0,d0uint16x4_t vqsub_u16(uint16x4_t a, uint16x4_t b); // VQSUB.U16 d0,d0,d0uint32x2_t vqsub_u32(uint32x2_t a, uint32x2_t b); // VQSUB.U32 d0,d0,d0uint64x1_t vqsub_u64(uint64x1_t a, uint64x1_t b); // VQSUB.U64 d0,d0,d0int8x16_t vqsubq_s8(int8x16_t a, int8x16_t b); // VQSUB.S8 q0,q0,q0int16x8_t vqsubq_s16(int16x8_t a, int16x8_t b); // VQSUB.S16 q0,q0,q0int32x4_t vqsubq_s32(int32x4_t a, int32x4_t b); // VQSUB.S32 q0,q0,q0int64x2_t vqsubq_s64(int64x2_t a, int64x2_t b); // VQSUB.S64 q0,q0,q0uint8x16_t vqsubq_u8(uint8x16_t a, uint8x16_t b); // VQSUB.U8 q0,q0,q0uint16x8_t vqsubq_u16(uint16x8_t a, uint16x8_t b); // VQSUB.U16 q0,q0,q0uint32x4_t vqsubq_u32(uint32x4_t a, uint32x4_t b); // VQSUB.U32 q0,q0,q0uint64x2_t vqsubq_u64(uint64x2_t a, uint64x2_t b); // VQSUB.U64 q0,q0,q0向 量 半 减int8x8_t vhsub_s8(int8x8_t a, int8x8_t b); // VHSUB.S8 d0,d0,d0int16x4_t vhsub_s16(int16x4_t a, int16x4_t b); // VHSUB.S16 d0,d0,d0int32x2_t vhsub_s32(int32x2_t a, int32x2_t b); // VHSUB.S32 d0,d0,d0uint8x8_t vhsub_u8(uint8x8_t a, uint8x8_t b); // VHSUB.U8 d0,d0,d0uint16x4_t vhsub_u16(uint16x4_t a, uint16x4_t b); // VHSUB.U16 d0,d0,d0uint32x2_t vhsub_u32(uint32x2_t a, uint32x2_t b); // VHSUB.U32 d0,d0,d0int8x16_t vhsubq_s8(int8x16_t a, int8x16_t b); // VHSUB.S8 q0,q0,q0int16x8_t vhsubq_s16(int16x8_t a, int16x8_t b); // VHSUB.S16 q0,q0,q0int32x4_t vhsubq_s32(int32x4_t a, int32x4_t b); // VHSUB.S32 q0,q0,q0uint8x16_t vhsubq_u8(uint8x16_t a, uint8x16_t b); // VHSUB.U8 q0,q0,q0uint16x8_t vhsubq_u16(uint16x8_t a, uint16x8_t b); // VHSUB.U16 q0,q0,q0uint32x4_t vhsubq_u32(uint32x4_t a, uint32x4_t b); // VHSUB.U32 q0,q0,q0高 位 半 部 分 向 量 减 法int8x8_t vsubhn_s16(int16x8_t a, int16x8_t b); // VSUBHN.I16 d0,q0,q0int16x4_t vsubhn_s32(int32x4_t a, int32x4_t b); // VSUBHN.I32 d0,q0,q0int32x2_t vsubhn_s64(int64x2_t a, int64x2_t b); // VSUBHN.I64 d0,q0,q0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-11ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持uint8x8_t vsubhn_u16(uint16x8_t a, uint16x8_t b); // VSUBHN.I16 d0,q0,q0uint16x4_t vsubhn_u32(uint32x4_t a, uint32x4_t b); // VSUBHN.I32 d0,q0,q0uint32x2_t vsubhn_u64(uint64x2_t a, uint64x2_t b); // VSUBHN.I64 d0,q0,q0高 位 半 部 分 向 量 舍 入 减 法int8x8_t vrsubhn_s16(int16x8_t a, int16x8_t b); // VRSUBHN.I16 d0,q0,q0int16x4_t vrsubhn_s32(int32x4_t a, int32x4_t b); // VRSUBHN.I32 d0,q0,q0int32x2_t vrsubhn_s64(int64x2_t a, int64x2_t b); // VRSUBHN.I64 d0,q0,q0uint8x8_t vrsubhn_u16(uint16x8_t a, uint16x8_t b); // VRSUBHN.I16 d0,q0,q0uint16x4_t vrsubhn_u32(uint32x4_t a, uint32x4_t b); // VRSUBHN.I32 d0,q0,q0uint32x2_t vrsubhn_u64(uint64x2_t a, uint64x2_t b); // VRSUBHN.I64 d0,q0,q0E.3.4比 较提 供 一 系 列 比 较 内 在 函 数 。 如 果 对 于 一 条 向 量 线 比 较 结 果 为 true, 则 该 向 量 线的 结 果 为 将 所 有 位 设 置 为 一 。 如 果 对 于 一 条 向 量 线 比 较 结 果 为 false, 则 将 所 有位 设 置 为 零 。 返 回 类 型 是 无 符 号 整 数 类 型 。 这 意 味 着 可 以 将 比 较 结 果 用 作 vbsl内 在 函 数 的 第 一 个 参 数 。向 量 比 较 等 于uint8x8_t vceq_s8(int8x8_t a, int8x8_t b);// VCEQ.I8 d0, d0, d0uint16x4_t vceq_s16(int16x4_t a, int16x4_t b); // VCEQ.I16 d0, d0, d0uint32x2_t vceq_s32(int32x2_t a, int32x2_t b); // VCEQ.I32 d0, d0, d0uint32x2_t vceq_f32(float32x2_t a, float32x2_t b); // VCEQ.F32 d0, d0, d0uint8x8_t vceq_u8(uint8x8_t a, uint8x8_t b); // VCEQ.I8 d0, d0, d0uint16x4_t vceq_u16(uint16x4_t a, uint16x4_t b); // VCEQ.I16 d0, d0, d0uint32x2_t vceq_u32(uint32x2_t a, uint32x2_t b); // VCEQ.I32 d0, d0, d0uint8x8_t vceq_p8(poly8x8_t a, poly8x8_t b); // VCEQ.I8 d0, d0, d0uint8x16_t vceqq_s8(int8x16_t a, int8x16_t b); // VCEQ.I8 q0, q0, q0uint16x8_t vceqq_s16(int16x8_t a, int16x8_t b); // VCEQ.I16 q0, q0, q0uint32x4_t vceqq_s32(int32x4_t a, int32x4_t b); // VCEQ.I32 q0, q0, q0uint32x4_t vceqq_f32(float32x4_t a, float32x4_t b); // VCEQ.F32 q0, q0, q0uint8x16_t vceqq_u8(uint8x16_t a, uint8x16_t b); // VCEQ.I8 q0, q0, q0uint16x8_t vceqq_u16(uint16x8_t a, uint16x8_t b); // VCEQ.I16 q0, q0, q0uint32x4_t vceqq_u32(uint32x4_t a, uint32x4_t b); // VCEQ.I32 q0, q0, q0uint8x16_t vceqq_p8(poly8x16_t a, poly8x16_t b); // VCEQ.I8 q0, q0, q0向 量 比 较 大 于 或 等 于uint8x8_t vcge_s8(int8x8_t a, int8x8_t b);// VCGE.S8 d0, d0, d0uint16x4_t vcge_s16(int16x4_t a, int16x4_t b); // VCGE.S16 d0, d0, d0uint32x2_t vcge_s32(int32x2_t a, int32x2_t b); // VCGE.S32 d0, d0, d0uint32x2_t vcge_f32(float32x2_t a, float32x2_t b); // VCGE.F32 d0, d0, d0uint8x8_t vcge_u8(uint8x8_t a, uint8x8_t b); // VCGE.U8 d0, d0, d0uint16x4_t vcge_u16(uint16x4_t a, uint16x4_t b); // VCGE.U16 d0, d0, d0E-12 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持uint32x2_t vcge_u32(uint32x2_t a, uint32x2_t b); // VCGE.U32 d0, d0, d0uint8x16_t vcgeq_s8(int8x16_t a, int8x16_t b); // VCGE.S8 q0, q0, q0uint16x8_t vcgeq_s16(int16x8_t a, int16x8_t b); // VCGE.S16 q0, q0, q0uint32x4_t vcgeq_s32(int32x4_t a, int32x4_t b); // VCGE.S32 q0, q0, q0uint32x4_t vcgeq_f32(float32x4_t a, float32x4_t b); // VCGE.F32 q0, q0, q0uint8x16_t vcgeq_u8(uint8x16_t a, uint8x16_t b); // VCGE.U8 q0, q0, q0uint16x8_t vcgeq_u16(uint16x8_t a, uint16x8_t b); // VCGE.U16 q0, q0, q0uint32x4_t vcgeq_u32(uint32x4_t a, uint32x4_t b); // VCGE.U32 q0, q0, q0向 量 比 较 小 于 或 等 于uint8x8_t vcle_s8(int8x8_t a, int8x8_t b);// VCGE.S8 d0, d0, d0uint16x4_t vcle_s16(int16x4_t a, int16x4_t b); // VCGE.S16 d0, d0, d0uint32x2_t vcle_s32(int32x2_t a, int32x2_t b); // VCGE.S32 d0, d0, d0uint32x2_t vcle_f32(float32x2_t a, float32x2_t b); // VCGE.F32 d0, d0, d0uint8x8_t vcle_u8(uint8x8_t a, uint8x8_t b); // VCGE.U8 d0, d0, d0uint16x4_t vcle_u16(uint16x4_t a, uint16x4_t b); // VCGE.U16 d0, d0, d0uint32x2_t vcle_u32(uint32x2_t a, uint32x2_t b); // VCGE.U32 d0, d0, d0uint8x16_t vcleq_s8(int8x16_t a, int8x16_t b); // VCGE.S8 q0, q0, q0uint16x8_t vcleq_s16(int16x8_t a, int16x8_t b); // VCGE.S16 q0, q0, q0uint32x4_t vcleq_s32(int32x4_t a, int32x4_t b); // VCGE.S32 q0, q0, q0uint32x4_t vcleq_f32(float32x4_t a, float32x4_t b); // VCGE.F32 q0, q0, q0uint8x16_t vcleq_u8(uint8x16_t a, uint8x16_t b); // VCGE.U8 q0, q0, q0uint16x8_t vcleq_u16(uint16x8_t a, uint16x8_t b); // VCGE.U16 q0, q0, q0uint32x4_t vcleq_u32(uint32x4_t a, uint32x4_t b); // VCGE.U32 q0, q0, q0向 量 比 较 大 于uint8x8_t vcgt_s8(int8x8_t a, int8x8_t b);// VCGT.S8 d0, d0, d0uint16x4_t vcgt_s16(int16x4_t a, int16x4_t b); // VCGT.S16 d0, d0, d0uint32x2_t vcgt_s32(int32x2_t a, int32x2_t b); // VCGT.S32 d0, d0, d0uint32x2_t vcgt_f32(float32x2_t a, float32x2_t b); // VCGT.F32 d0, d0, d0uint8x8_t vcgt_u8(uint8x8_t a, uint8x8_t b); // VCGT.U8 d0, d0, d0uint16x4_t vcgt_u16(uint16x4_t a, uint16x4_t b); // VCGT.U16 d0, d0, d0uint32x2_t vcgt_u32(uint32x2_t a, uint32x2_t b); // VCGT.U32 d0, d0, d0uint8x16_t vcgtq_s8(int8x16_t a, int8x16_t b); // VCGT.S8 q0, q0, q0uint16x8_t vcgtq_s16(int16x8_t a, int16x8_t b); // VCGT.S16 q0, q0, q0uint32x4_t vcgtq_s32(int32x4_t a, int32x4_t b); // VCGT.S32 q0, q0, q0uint32x4_t vcgtq_f32(float32x4_t a, float32x4_t b); // VCGT.F32 q0, q0, q0uint8x16_t vcgtq_u8(uint8x16_t a, uint8x16_t b); // VCGT.U8 q0, q0, q0uint16x8_t vcgtq_u16(uint16x8_t a, uint16x8_t b); // VCGT.U16 q0, q0, q0uint32x4_t vcgtq_u32(uint32x4_t a, uint32x4_t b); // VCGT.U32 q0, q0, q0向 量 比 较 小 于uint8x8_t vclt_s8(int8x8_t a, int8x8_t b);uint16x4_t vclt_s16(int16x4_t a, int16x4_t b);uint32x2_t vclt_s32(int32x2_t a, int32x2_t b);// VCGT.S8 d0, d0, d0// VCGT.S16 d0, d0, d0// VCGT.S32 d0, d0, d0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-13ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持uint32x2_t vclt_f32(float32x2_t a, float32x2_t b); // VCGT.F32 d0, d0, d0uint8x8_t vclt_u8(uint8x8_t a, uint8x8_t b); // VCGT.U8 d0, d0, d0uint16x4_t vclt_u16(uint16x4_t a, uint16x4_t b); // VCGT.U16 d0, d0, d0uint32x2_t vclt_u32(uint32x2_t a, uint32x2_t b); // VCGT.U32 d0, d0, d0uint8x16_t vcltq_s8(int8x16_t a, int8x16_t b); // VCGT.S8 q0, q0, q0uint16x8_t vcltq_s16(int16x8_t a, int16x8_t b); // VCGT.S16 q0, q0, q0uint32x4_t vcltq_s32(int32x4_t a, int32x4_t b); // VCGT.S32 q0, q0, q0uint32x4_t vcltq_f32(float32x4_t a, float32x4_t b); // VCGT.F32 q0, q0, q0uint8x16_t vcltq_u8(uint8x16_t a, uint8x16_t b); // VCGT.U8 q0, q0, q0uint16x8_t vcltq_u16(uint16x8_t a, uint16x8_t b); // VCGT.U16 q0, q0, q0uint32x4_t vcltq_u32(uint32x4_t a, uint32x4_t b); // VCGT.U32 q0, q0, q0向 量 绝 对 值 比 较 大 于 或 等 于uint32x2_t vcage_f32(float32x2_t a, float32x2_t b); // VACGE.F32 d0, d0, d0uint32x4_t vcageq_f32(float32x4_t a, float32x4_t b); // VACGE.F32 q0, q0, q0向 量 绝 对 值 比 较 小 于 或 等 于uint32x2_t vcale_f32(float32x2_t a, float32x2_t b); // VACGE.F32 d0, d0, d0uint32x4_t vcaleq_f32(float32x4_t a, float32x4_t b); // VACGE.F32 q0, q0, q0向 量 绝 对 值 比 较 大 于uint32x2_t vcagt_f32(float32x2_t a, float32x2_t b); // VACGT.F32 d0, d0, d0uint32x4_t vcagtq_f32(float32x4_t a, float32x4_t b); // VACGT.F32 q0, q0, q0向 量 绝 对 值 比 较 小 于uint32x2_t vcalt_f32(float32x2_t a, float32x2_t b); // VACGT.F32 d0, d0, d0uint32x4_t vcaltq_f32(float32x4_t a, float32x4_t b); // VACGT.F32 q0, q0, q0向 量 测 试 位uint8x8_t vtst_s8(int8x8_t a, int8x8_t b); // VTST.8 d0, d0, d0uint16x4_t vtst_s16(int16x4_t a, int16x4_t b); // VTST.16 d0, d0, d0uint32x2_t vtst_s32(int32x2_t a, int32x2_t b); // VTST.32 d0, d0, d0uint8x8_t vtst_u8(uint8x8_t a, uint8x8_t b); // VTST.8 d0, d0, d0uint16x4_t vtst_u16(uint16x4_t a, uint16x4_t b); // VTST.16 d0, d0, d0uint32x2_t vtst_u32(uint32x2_t a, uint32x2_t b); // VTST.32 d0, d0, d0uint8x8_t vtst_p8(poly8x8_t a, poly8x8_t b); // VTST.8 d0, d0, d0uint8x16_t vtstq_s8(int8x16_t a, int8x16_t b); // VTST.8 q0, q0, q0uint16x8_t vtstq_s16(int16x8_t a, int16x8_t b); // VTST.16 q0, q0, q0uint32x4_t vtstq_s32(int32x4_t a, int32x4_t b); // VTST.32 q0, q0, q0uint8x16_t vtstq_u8(uint8x16_t a, uint8x16_t b); // VTST.8 q0, q0, q0E-14 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持uint16x8_t vtstq_u16(uint16x8_t a, uint16x8_t b); // VTST.16 q0, q0, q0uint32x4_t vtstq_u32(uint32x4_t a, uint32x4_t b); // VTST.32 q0, q0, q0uint8x16_t vtstq_p8(poly8x16_t a, poly8x16_t b); // VTST.8 q0, q0, q0E.3.5差 值 绝 对 值以 下 内 在 函 数 提 供 包 含 差 值 绝 对 值 的 运 算 。参 数 间 的 差 值 绝 对 值 :Vr[i] = | Va[i] - Vb[i] |int8x8_t vabd_s8(int8x8_t a, int8x8_t b); // VABD.S8 d0,d0,d0int16x4_t vabd_s16(int16x4_t a, int16x4_t b); // VABD.S16 d0,d0,d0int32x2_t vabd_s32(int32x2_t a, int32x2_t b); // VABD.S32 d0,d0,d0uint8x8_t vabd_u8(uint8x8_t a, uint8x8_t b); // VABD.U8 d0,d0,d0uint16x4_t vabd_u16(uint16x4_t a, uint16x4_t b); // VABD.U16 d0,d0,d0uint32x2_t vabd_u32(uint32x2_t a, uint32x2_t b); // VABD.U32 d0,d0,d0float32x2_t vabd_f32(float32x2_t a, float32x2_t b); // VABD.F32 d0,d0,d0int8x16_t vabdq_s8(int8x16_t a, int8x16_t b); // VABD.S8 q0,q0,q0int16x8_t vabdq_s16(int16x8_t a, int16x8_t b); // VABD.S16 q0,q0,q0int32x4_t vabdq_s32(int32x4_t a, int32x4_t b); // VABD.S32 q0,q0,q0uint8x16_t vabdq_u8(uint8x16_t a, uint8x16_t b); // VABD.U8 q0,q0,q0uint16x8_t vabdq_u16(uint16x8_t a, uint16x8_t b); // VABD.U16 q0,q0,q0uint32x4_t vabdq_u32(uint32x4_t a, uint32x4_t b); // VABD.U32 q0,q0,q0float32x4_t vabdq_f32(float32x4_t a, float32x4_t b); // VABD.F32 q0,q0,q0差 值 绝 对 值 - 长 型int16x8_t vabdl_s8(int8x8_t a, int8x8_t b); // VABDL.S8 q0,d0,d0int32x4_t vabdl_s16(int16x4_t a, int16x4_t b); // VABDL.S16 q0,d0,d0int64x2_t vabdl_s32(int32x2_t a, int32x2_t b); // VABDL.S32 q0,d0,d0uint16x8_t vabdl_u8(uint8x8_t a, uint8x8_t b); // VABDL.U8 q0,d0,d0uint32x4_t vabdl_u16(uint16x4_t a, uint16x4_t b); // VABDL.U16 q0,d0,d0uint64x2_t vabdl_u32(uint32x2_t a, uint32x2_t b); // VABDL.U32 q0,d0,d0差 值 绝 对 值 累 加 :Vr[i] = Va[i] + | Vb[i] - Vc[i] |int8x8_t vaba_s8(int8x8_t a, int8x8_t b, int8x8_t c); // VABA.S8 d0,d0,d0int16x4_t vaba_s16(int16x4_t a, int16x4_t b, int16x4_t c); // VABA.S16 d0,d0,d0int32x2_t vaba_s32(int32x2_t a, int32x2_t b, int32x2_t c); // VABA.S32 d0,d0,d0uint8x8_t vaba_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); // VABA.U8 d0,d0,d0uint16x4_t vaba_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c); // VABA.U16 d0,d0,d0uint32x2_t vaba_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c); // VABA.U32 d0,d0,d0int8x16_t vabaq_s8(int8x16_t a, int8x16_t b, int8x16_t c); // VABA.S8 q0,q0,q0int16x8_t vabaq_s16(int16x8_t a, int16x8_t b, int16x8_t c); // VABA.S16 q0,q0,q0int32x4_t vabaq_s32(int32x4_t a, int32x4_t b, int32x4_t c); // VABA.S32 q0,q0,q0uint8x16_t vabaq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c); // VABA.U8 q0,q0,q0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-15ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持uint16x8_t vabaq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c); // VABA.U16 q0,q0,q0uint32x4_t vabaq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c); // VABA.U32 q0,q0,q0差 值 绝 对 值 累 加 - 长 型int16x8_t vabal_s8(int16x8_t a, int8x8_t b, int8x8_t c); // VABAL.S8 q0,d0,d0int32x4_t vabal_s16(int32x4_t a, int16x4_t b, int16x4_t c); // VABAL.S16 q0,d0,d0int64x2_t vabal_s32(int64x2_t a, int32x2_t b, int32x2_t c); // VABAL.S32 q0,d0,d0uint16x8_t vabal_u8(uint16x8_t a, uint8x8_t b, uint8x8_t c); // VABAL.U8 q0,d0,d0uint32x4_t vabal_u16(uint32x4_t a, uint16x4_t b, uint16x4_t c); // VABAL.U16 q0,d0,d0uint64x2_t vabal_u32(uint64x2_t a, uint32x2_t b, uint32x2_t c); // VABAL.U32 q0,d0,d0E.3.6最 大 值 / 最 小 值以 下 内 在 函 数 提 供 最 大 值 和 最 小 值 运 算 。vmax -> Vr[i] := (Va[i] >= Vb[i]) ?Va[i] :Vb[i]int8x8_t vmax_s8(int8x8_t a, int8x8_t b); // VMAX.S8 d0,d0,d0int16x4_t vmax_s16(int16x4_t a, int16x4_t b); // VMAX.S16 d0,d0,d0int32x2_t vmax_s32(int32x2_t a, int32x2_t b); // VMAX.S32 d0,d0,d0uint8x8_t vmax_u8(uint8x8_t a, uint8x8_t b); // VMAX.U8 d0,d0,d0uint16x4_t vmax_u16(uint16x4_t a, uint16x4_t b); // VMAX.U16 d0,d0,d0uint32x2_t vmax_u32(uint32x2_t a, uint32x2_t b); // VMAX.U32 d0,d0,d0float32x2_t vmax_f32(float32x2_t a, float32x2_t b); // VMAX.F32 d0,d0,d0int8x16_t vmaxq_s8(int8x16_t a, int8x16_t b); // VMAX.S8 q0,q0,q0int16x8_t vmaxq_s16(int16x8_t a, int16x8_t b); // VMAX.S16 q0,q0,q0int32x4_t vmaxq_s32(int32x4_t a, int32x4_t b); // VMAX.S32 q0,q0,q0uint8x16_t vmaxq_u8(uint8x16_t a, uint8x16_t b); // VMAX.U8 q0,q0,q0uint16x8_t vmaxq_u16(uint16x8_t a, uint16x8_t b); // VMAX.U16 q0,q0,q0uint32x4_t vmaxq_u32(uint32x4_t a, uint32x4_t b); // VMAX.U32 q0,q0,q0float32x4_t vmaxq_f32(float32x4_t a, float32x4_t b); // VMAX.F32 q0,q0,q0vmin -> Vr[i] := (Va[i] >= Vb[i]) ?Vb[i] :Va[i]int8x8_t vmin_s8(int8x8_t a, int8x8_t b); // VMIN.S8 d0,d0,d0int16x4_t vmin_s16(int16x4_t a, int16x4_t b); // VMIN.S16 d0,d0,d0int32x2_t vmin_s32(int32x2_t a, int32x2_t b); // VMIN.S32 d0,d0,d0uint8x8_t vmin_u8(uint8x8_t a, uint8x8_t b); // VMIN.U8 d0,d0,d0uint16x4_t vmin_u16(uint16x4_t a, uint16x4_t b); // VMIN.U16 d0,d0,d0uint32x2_t vmin_u32(uint32x2_t a, uint32x2_t b); // VMIN.U32 d0,d0,d0float32x2_t vmin_f32(float32x2_t a, float32x2_t b); // VMIN.F32 d0,d0,d0int8x16_t vminq_s8(int8x16_t a, int8x16_t b); // VMIN.S8 q0,q0,q0int16x8_t vminq_s16(int16x8_t a, int16x8_t b); // VMIN.S16 q0,q0,q0int32x4_t vminq_s32(int32x4_t a, int32x4_t b); // VMIN.S32 q0,q0,q0uint8x16_t vminq_u8(uint8x16_t a, uint8x16_t b); // VMIN.U8 q0,q0,q0E-16 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持uint16x8_t vminq_u16(uint16x8_t a, uint16x8_t b); // VMIN.U16 q0,q0,q0uint32x4_t vminq_u32(uint32x4_t a, uint32x4_t b); // VMIN.U32 q0,q0,q0float32x4_t vminq_f32(float32x4_t a, float32x4_t b); // VMIN.F32 q0,q0,q0E.3.7按 对 加以 下 内 在 函 数 提 供 按 对 加 运 算 。按 对 加int8x8_t vpadd_s8(int8x8_t a, int8x8_t b); // VPADD.I8 d0,d0,d0int16x4_t vpadd_s16(int16x4_t a, int16x4_t b); // VPADD.I16 d0,d0,d0int32x2_t vpadd_s32(int32x2_t a, int32x2_t b); // VPADD.I32 d0,d0,d0uint8x8_t vpadd_u8(uint8x8_t a, uint8x8_t b); // VPADD.I8 d0,d0,d0uint16x4_t vpadd_u16(uint16x4_t a, uint16x4_t b); // VPADD.I16 d0,d0,d0uint32x2_t vpadd_u32(uint32x2_t a, uint32x2_t b); // VPADD.I32 d0,d0,d0float32x2_t vpadd_f32(float32x2_t a, float32x2_t b); // VPADD.F32 d0,d0,d0长 型 按 对 加int16x4_t vpaddl_s8(int8x8_t a); // VPADDL.S8 d0,d0int32x2_t vpaddl_s16(int16x4_t a); // VPADDL.S16 d0,d0int64x1_t vpaddl_s32(int32x2_t a); // VPADDL.S32 d0,d0uint16x4_t vpaddl_u8(uint8x8_t a); // VPADDL.U8 d0,d0uint32x2_t vpaddl_u16(uint16x4_t a); // VPADDL.U16 d0,d0uint64x1_t vpaddl_u32(uint32x2_t a); // VPADDL.U32 d0,d0int16x8_t vpaddlq_s8(int8x16_t a); // VPADDL.S8 q0,q0int32x4_t vpaddlq_s16(int16x8_t a); // VPADDL.S16 q0,q0int64x2_t vpaddlq_s32(int32x4_t a); // VPADDL.S32 q0,q0uint16x8_t vpaddlq_u8(uint8x16_t a); // VPADDL.U8 q0,q0uint32x4_t vpaddlq_u16(uint16x8_t a); // VPADDL.U16 q0,q0uint64x2_t vpaddlq_u32(uint32x4_t a); // VPADDL.U32 q0,q0长 型 按 对 加 并 累 加int16x4_t vpadal_s8(int16x4_t a, int8x8_t b); // VPADAL.S8 d0,d0int32x2_t vpadal_s16(int32x2_t a, int16x4_t b); // VPADAL.S16 d0,d0int64x1_t vpadal_s32(int64x1_t a, int32x2_t b); // VPADAL.S32 d0,d0uint16x4_t vpadal_u8(uint16x4_t a, uint8x8_t b); // VPADAL.U8 d0,d0uint32x2_t vpadal_u16(uint32x2_t a, uint16x4_t b); // VPADAL.U16 d0,d0uint64x1_t vpadal_u32(uint64x1_t a, uint32x2_t b); // VPADAL.U32 d0,d0int16x8_t vpadalq_s8(int16x8_t a, int8x16_t b); // VPADAL.S8 q0,q0int32x4_t vpadalq_s16(int32x4_t a, int16x8_t b); // VPADAL.S16 q0,q0int64x2_t vpadalq_s32(int64x2_t a, int32x4_t b); // VPADAL.S32 q0,q0uint16x8_t vpadalq_u8(uint16x8_t a, uint8x16_t b); // VPADAL.U8 q0,q0uint32x4_t vpadalq_u16(uint32x4_t a, uint16x8_t b); // VPADAL.U16 q0,q0uint64x2_t vpadalq_u32(uint64x2_t a, uint32x4_t b); // VPADAL.U32 q0,q0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-17ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持E.3.8折 叠 最 大 值vpmax -> 获 取 相 邻 对 的 最 大 值int8x8_t vpmax_s8(int8x8_t a, int8x8_t b); // VPMAX.S8 d0,d0,d0int16x4_t vpmax_s16(int16x4_t a, int16x4_t b); // VPMAX.S16 d0,d0,d0int32x2_t vpmax_s32(int32x2_t a, int32x2_t b); // VPMAX.S32 d0,d0,d0uint8x8_t vpmax_u8(uint8x8_t a, uint8x8_t b); // VPMAX.U8 d0,d0,d0uint16x4_t vpmax_u16(uint16x4_t a, uint16x4_t b); // VPMAX.U16 d0,d0,d0uint32x2_t vpmax_u32(uint32x2_t a, uint32x2_t b); // VPMAX.U32 d0,d0,d0float32x2_t vpmax_f32(float32x2_t a, float32x2_t b); // VPMAX.F32 d0,d0,d0E.3.9折 叠 最 小 值vpmin -> 获 取 相 邻 对 的 最 小 值int8x8_t vpmin_s8(int8x8_t a, int8x8_t b); // VPMIN.S8 d0,d0,d0int16x4_t vpmin_s16(int16x4_t a, int16x4_t b); // VPMIN.S16 d0,d0,d0int32x2_t vpmin_s32(int32x2_t a, int32x2_t b); // VPMIN.S32 d0,d0,d0uint8x8_t vpmin_u8(uint8x8_t a, uint8x8_t b); // VPMIN.U8 d0,d0,d0uint16x4_t vpmin_u16(uint16x4_t a, uint16x4_t b); // VPMIN.U16 d0,d0,d0uint32x2_t vpmin_u32(uint32x2_t a, uint32x2_t b); // VPMIN.U32 d0,d0,d0float32x2_t vpmin_f32(float32x2_t a, float32x2_t b); // VPMIN.F32 d0,d0,d0E.3.10倒 数 / 平 方 根近 似 倒 数 / 步 进 和 1/ 近 似 平 方 根 / 步 进float32x2_t vrecps_f32(float32x2_t a, float32x2_t b); // VRECPS.F32 d0, d0, d0float32x4_t vrecpsq_f32(float32x4_t a, float32x4_t b); // VRECPS.F32 q0, q0, q0float32x2_t vrsqrts_f32(float32x2_t a, float32x2_t b); // VRSQRTS.F32 d0, d0, d0float32x4_t vrsqrtsq_f32(float32x4_t a, float32x4_t b); // VRSQRTS.F32 q0, q0, q0E.3.11按 有 符 号 变 量 移 位以 下 内 在 函 数 提 供 包 含 按 有 符 号 变 量 移 位 的 运 算 。向 量 左 移 :Vr[i] := Va[i]


使 用 NEON 支 持int8x16_t vshlq_s8(int8x16_t a, int8x16_t b); // VSHL.S8 q0,q0,q0int16x8_t vshlq_s16(int16x8_t a, int16x8_t b); // VSHL.S16 q0,q0,q0int32x4_t vshlq_s32(int32x4_t a, int32x4_t b); // VSHL.S32 q0,q0,q0int64x2_t vshlq_s64(int64x2_t a, int64x2_t b); // VSHL.S64 q0,q0,q0uint8x16_t vshlq_u8(uint8x16_t a, int8x16_t b); // VSHL.U8 q0,q0,q0uint16x8_t vshlq_u16(uint16x8_t a, int16x8_t b); // VSHL.U16 q0,q0,q0uint32x4_t vshlq_u32(uint32x4_t a, int32x4_t b); // VSHL.U32 q0,q0,q0uint64x2_t vshlq_u64(uint64x2_t a, int64x2_t b); // VSHL.U64 q0,q0,q0向 量 饱 和 左 移 :( 负 值 右 移 )int8x8_t vqshl_s8(int8x8_t a, int8x8_t b); // VQSHL.S8 d0,d0,d0int16x4_t vqshl_s16(int16x4_t a, int16x4_t b); // VQSHL.S16 d0,d0,d0int32x2_t vqshl_s32(int32x2_t a, int32x2_t b); // VQSHL.S32 d0,d0,d0int64x1_t vqshl_s64(int64x1_t a, int64x1_t b); // VQSHL.S64 d0,d0,d0uint8x8_t vqshl_u8(uint8x8_t a, int8x8_t b); // VQSHL.U8 d0,d0,d0uint16x4_t vqshl_u16(uint16x4_t a, int16x4_t b); // VQSHL.U16 d0,d0,d0uint32x2_t vqshl_u32(uint32x2_t a, int32x2_t b); // VQSHL.U32 d0,d0,d0uint64x1_t vqshl_u64(uint64x1_t a, int64x1_t b); // VQSHL.U64 d0,d0,d0int8x16_t vqshlq_s8(int8x16_t a, int8x16_t b); // VQSHL.S8 q0,q0,q0int16x8_t vqshlq_s16(int16x8_t a, int16x8_t b); // VQSHL.S16 q0,q0,q0int32x4_t vqshlq_s32(int32x4_t a, int32x4_t b); // VQSHL.S32 q0,q0,q0int64x2_t vqshlq_s64(int64x2_t a, int64x2_t b); // VQSHL.S64 q0,q0,q0uint8x16_t vqshlq_u8(uint8x16_t a, int8x16_t b); // VQSHL.U8 q0,q0,q0uint16x8_t vqshlq_u16(uint16x8_t a, int16x8_t b); // VQSHL.U16 q0,q0,q0uint32x4_t vqshlq_u32(uint32x4_t a, int32x4_t b); // VQSHL.U32 q0,q0,q0uint64x2_t vqshlq_u64(uint64x2_t a, int64x2_t b); // VQSHL.U64 q0,q0,q0向 量 舍 入 左 移 :( 负 值 右 移 )int8x8_t vrshl_s8(int8x8_t a, int8x8_t b); // VRSHL.S8 d0,d0,d0int16x4_t vrshl_s16(int16x4_t a, int16x4_t b); // VRSHL.S16 d0,d0,d0int32x2_t vrshl_s32(int32x2_t a, int32x2_t b); // VRSHL.S32 d0,d0,d0int64x1_t vrshl_s64(int64x1_t a, int64x1_t b); // VRSHL.S64 d0,d0,d0uint8x8_t vrshl_u8(uint8x8_t a, int8x8_t b); // VRSHL.U8 d0,d0,d0uint16x4_t vrshl_u16(uint16x4_t a, int16x4_t b); // VRSHL.U16 d0,d0,d0uint32x2_t vrshl_u32(uint32x2_t a, int32x2_t b); // VRSHL.U32 d0,d0,d0uint64x1_t vrshl_u64(uint64x1_t a, int64x1_t b); // VRSHL.U64 d0,d0,d0int8x16_t vrshlq_s8(int8x16_t a, int8x16_t b); // VRSHL.S8 q0,q0,q0int16x8_t vrshlq_s16(int16x8_t a, int16x8_t b); // VRSHL.S16 q0,q0,q0int32x4_t vrshlq_s32(int32x4_t a, int32x4_t b); // VRSHL.S32 q0,q0,q0int64x2_t vrshlq_s64(int64x2_t a, int64x2_t b); // VRSHL.S64 q0,q0,q0uint8x16_t vrshlq_u8(uint8x16_t a, int8x16_t b); // VRSHL.U8 q0,q0,q0uint16x8_t vrshlq_u16(uint16x8_t a, int16x8_t b); // VRSHL.U16 q0,q0,q0uint32x4_t vrshlq_u32(uint32x4_t a, int32x4_t b); // VRSHL.U32 q0,q0,q0uint64x2_t vrshlq_u64(uint64x2_t a, int64x2_t b); // VRSHL.U64 q0,q0,q0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-19ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持向 量 饱 和 舍 入 左 移 :( 负 值 右 移 )int8x8_t vqrshl_s8(int8x8_t a, int8x8_t b); // VQRSHL.S8 d0,d0,d0int16x4_t vqrshl_s16(int16x4_t a, int16x4_t b); // VQRSHL.S16 d0,d0,d0int32x2_t vqrshl_s32(int32x2_t a, int32x2_t b); // VQRSHL.S32 d0,d0,d0int64x1_t vqrshl_s64(int64x1_t a, int64x1_t b); // VQRSHL.S64 d0,d0,d0uint8x8_t vqrshl_u8(uint8x8_t a, int8x8_t b); // VQRSHL.U8 d0,d0,d0uint16x4_t vqrshl_u16(uint16x4_t a, int16x4_t b); // VQRSHL.U16 d0,d0,d0uint32x2_t vqrshl_u32(uint32x2_t a, int32x2_t b); // VQRSHL.U32 d0,d0,d0uint64x1_t vqrshl_u64(uint64x1_t a, int64x1_t b); // VQRSHL.U64 d0,d0,d0int8x16_t vqrshlq_s8(int8x16_t a, int8x16_t b); // VQRSHL.S8 q0,q0,q0int16x8_t vqrshlq_s16(int16x8_t a, int16x8_t b); // VQRSHL.S16 q0,q0,q0int32x4_t vqrshlq_s32(int32x4_t a, int32x4_t b); // VQRSHL.S32 q0,q0,q0int64x2_t vqrshlq_s64(int64x2_t a, int64x2_t b); // VQRSHL.S64 q0,q0,q0uint8x16_t vqrshlq_u8(uint8x16_t a, int8x16_t b); // VQRSHL.U8 q0,q0,q0uint16x8_t vqrshlq_u16(uint16x8_t a, int16x8_t b); // VQRSHL.U16 q0,q0,q0uint32x4_t vqrshlq_u32(uint32x4_t a, int32x4_t b); // VQRSHL.U32 q0,q0,q0uint64x2_t vqrshlq_u64(uint64x2_t a, int64x2_t b); // VQRSHL.U64 q0,q0,q0E.3.12按 常 数 移 位以 下 内 在 函 数 提 供 按 常 数 移 位 的 运 算 。向 量 按 常 数 右 移int8x8_t vshr_n_s8(int8x8_t a, __constrange(1,8) int b); // VSHR.S8 d0,d0,#8int16x4_t vshr_n_s16(int16x4_t a, __constrange(1,16) int b); // VSHR.S16 d0,d0,#16int32x2_t vshr_n_s32(int32x2_t a, __constrange(1,32) int b); // VSHR.S32 d0,d0,#32int64x1_t vshr_n_s64(int64x1_t a, __constrange(1,64) int b); // VSHR.S64 d0,d0,#64uint8x8_t vshr_n_u8(uint8x8_t a, __constrange(1,8) int b); // VSHR.U8 d0,d0,#8uint16x4_t vshr_n_u16(uint16x4_t a, __constrange(1,16) int b); // VSHR.U16 d0,d0,#16uint32x2_t vshr_n_u32(uint32x2_t a, __constrange(1,32) int b); // VSHR.U32 d0,d0,#32uint64x1_t vshr_n_u64(uint64x1_t a, __constrange(1,64) int b); // VSHR.U64 d0,d0,#64int8x16_t vshrq_n_s8(int8x16_t a, __constrange(1,8) int b); // VSHR.S8 q0,q0,#8int16x8_t vshrq_n_s16(int16x8_t a, __constrange(1,16) int b); // VSHR.S16 q0,q0,#16int32x4_t vshrq_n_s32(int32x4_t a, __constrange(1,32) int b); // VSHR.S32 q0,q0,#32int64x2_t vshrq_n_s64(int64x2_t a, __constrange(1,64) int b); // VSHR.S64 q0,q0,#64uint8x16_t vshrq_n_u8(uint8x16_t a, __constrange(1,8) int b); // VSHR.U8 q0,q0,#8uint16x8_t vshrq_n_u16(uint16x8_t a, __constrange(1,16) int b); // VSHR.U16 q0,q0,#16uint32x4_t vshrq_n_u32(uint32x4_t a, __constrange(1,32) int b); // VSHR.U32 q0,q0,#32uint64x2_t vshrq_n_u64(uint64x2_t a, __constrange(1,64) int b); // VSHR.U64 q0,q0,#64向 量 按 常 数 左 移int8x8_t vshl_n_s8(int8x8_t a, __constrange(0,7) int b); // VSHL.I8 d0,d0,#0int16x4_t vshl_n_s16(int16x4_t a, __constrange(0,15) int b); // VSHL.I16 d0,d0,#0int32x2_t vshl_n_s32(int32x2_t a, __constrange(0,31) int b); // VSHL.I32 d0,d0,#0int64x1_t vshl_n_s64(int64x1_t a, __constrange(0,63) int b); // VSHL.I64 d0,d0,#0E-20 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持uint8x8_t vshl_n_u8(uint8x8_t a, __constrange(0,7) int b); // VSHL.I8 d0,d0,#0uint16x4_t vshl_n_u16(uint16x4_t a, __constrange(0,15) int b); // VSHL.I16 d0,d0,#0uint32x2_t vshl_n_u32(uint32x2_t a, __constrange(0,31) int b); // VSHL.I32 d0,d0,#0uint64x1_t vshl_n_u64(uint64x1_t a, __constrange(0,63) int b); // VSHL.I64 d0,d0,#0int8x16_t vshlq_n_s8(int8x16_t a, __constrange(0,7) int b); // VSHL.I8 q0,q0,#0int16x8_t vshlq_n_s16(int16x8_t a, __constrange(0,15) int b); // VSHL.I16 q0,q0,#0int32x4_t vshlq_n_s32(int32x4_t a, __constrange(0,31) int b); // VSHL.I32 q0,q0,#0int64x2_t vshlq_n_s64(int64x2_t a, __constrange(0,63) int b); // VSHL.I64 q0,q0,#0uint8x16_t vshlq_n_u8(uint8x16_t a, __constrange(0,7) int b); // VSHL.I8 q0,q0,#0uint16x8_t vshlq_n_u16(uint16x8_t a, __constrange(0,15) int b); // VSHL.I16 q0,q0,#0uint32x4_t vshlq_n_u32(uint32x4_t a, __constrange(0,31) int b); // VSHL.I32 q0,q0,#0uint64x2_t vshlq_n_u64(uint64x2_t a, __constrange(0,63) int b); // VSHL.I64 q0,q0,#0向 量 舍 入 按 常 数 右 移int8x8_t vrshr_n_s8(int8x8_t a, __constrange(1,8) int b); // VRSHR.S8 d0,d0,#8int16x4_t vrshr_n_s16(int16x4_t a, __constrange(1,16) int b); // VRSHR.S16 d0,d0,#16int32x2_t vrshr_n_s32(int32x2_t a, __constrange(1,32) int b); // VRSHR.S32 d0,d0,#32int64x1_t vrshr_n_s64(int64x1_t a, __constrange(1,64) int b); // VRSHR.S64 d0,d0,#64uint8x8_t vrshr_n_u8(uint8x8_t a, __constrange(1,8) int b); // VRSHR.U8 d0,d0,#8uint16x4_t vrshr_n_u16(uint16x4_t a, __constrange(1,16) int b); // VRSHR.U16 d0,d0,#16uint32x2_t vrshr_n_u32(uint32x2_t a, __constrange(1,32) int b); // VRSHR.U32 d0,d0,#32uint64x1_t vrshr_n_u64(uint64x1_t a, __constrange(1,64) int b); // VRSHR.U64 d0,d0,#64int8x16_t vrshrq_n_s8(int8x16_t a, __constrange(1,8) int b); // VRSHR.S8 q0,q0,#8int16x8_t vrshrq_n_s16(int16x8_t a, __constrange(1,16) int b); // VRSHR.S16 q0,q0,#16int32x4_t vrshrq_n_s32(int32x4_t a, __constrange(1,32) int b); // VRSHR.S32 q0,q0,#32int64x2_t vrshrq_n_s64(int64x2_t a, __constrange(1,64) int b); // VRSHR.S64 q0,q0,#64uint8x16_t vrshrq_n_u8(uint8x16_t a, __constrange(1,8) int b); // VRSHR.U8 q0,q0,#8uint16x8_t vrshrq_n_u16(uint16x8_t a, __constrange(1,16) int b); // VRSHR.U16 q0,q0,#16uint32x4_t vrshrq_n_u32(uint32x4_t a, __constrange(1,32) int b); // VRSHR.U32 q0,q0,#32uint64x2_t vrshrq_n_u64(uint64x2_t a, __constrange(1,64) int b); // VRSHR.U64 q0,q0,#64向 量 按 常 数 右 移 并 累 加int8x8_t vsra_n_s8(int8x8_t a, int8x8_t b, __constrange(1,8) int c); // VSRA.S8 d0,d0,#8int16x4_t vsra_n_s16(int16x4_t a, int16x4_t b, __constrange(1,16) int c); // VSRA.S16 d0,d0,#16int32x2_t vsra_n_s32(int32x2_t a, int32x2_t b, __constrange(1,32) int c); // VSRA.S32 d0,d0,#32int64x1_t vsra_n_s64(int64x1_t a, int64x1_t b, __constrange(1,64) int c); // VSRA.S64 d0,d0,#64uint8x8_t vsra_n_u8(uint8x8_t a, uint8x8_t b, __constrange(1,8) int c); // VSRA.U8 d0,d0,#8uint16x4_t vsra_n_u16(uint16x4_t a, uint16x4_t b, __constrange(1,16) int c); // VSRA.U16 d0,d0,#16uint32x2_t vsra_n_u32(uint32x2_t a, uint32x2_t b, __constrange(1,32) int c); // VSRA.U32 d0,d0,#32uint64x1_t vsra_n_u64(uint64x1_t a, uint64x1_t b, __constrange(1,64) int c); // VSRA.U64 d0,d0,#64int8x16_t vsraq_n_s8(int8x16_t a, int8x16_t b, __constrange(1,8) int c); // VSRA.S8 q0,q0,#8int16x8_t vsraq_n_s16(int16x8_t a, int16x8_t b, __constrange(1,16) int c); // VSRA.S16 q0,q0,#16int32x4_t vsraq_n_s32(int32x4_t a, int32x4_t b, __constrange(1,32) int c); // VSRA.S32 q0,q0,#32int64x2_t vsraq_n_s64(int64x2_t a, int64x2_t b, __constrange(1,64) int c); // VSRA.S64 q0,q0,#64uint8x16_t vsraq_n_u8(uint8x16_t a, uint8x16_t b, __constrange(1,8) int c); // VSRA.U8 q0,q0,#8uint16x8_t vsraq_n_u16(uint16x8_t a, uint16x8_t b, __constrange(1,16) int c); // VSRA.U16 q0,q0,#16<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-21ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持uint32x4_t vsraq_n_u32(uint32x4_t a, uint32x4_t b, __constrange(1,32) int c); // VSRA.U32 q0,q0,#32uint64x2_t vsraq_n_u64(uint64x2_t a, uint64x2_t b, __constrange(1,64) int c); // VSRA.U64 q0,q0,#64向 量 舍 入 按 常 数 右 移 并 累 加int8x8_t vrsra_n_s8(int8x8_t a, int8x8_t b, __constrange(1,8) int c); // VRSRA.S8 d0,d0,#8int16x4_t vrsra_n_s16(int16x4_t a, int16x4_t b, __constrange(1,16) int c); // VRSRA.S16 d0,d0,#16int32x2_t vrsra_n_s32(int32x2_t a, int32x2_t b, __constrange(1,32) int c); // VRSRA.S32 d0,d0,#32int64x1_t vrsra_n_s64(int64x1_t a, int64x1_t b, __constrange(1,64) int c); // VRSRA.S64 d0,d0,#64uint8x8_t vrsra_n_u8(uint8x8_t a, uint8x8_t b, __constrange(1,8) int c); // VRSRA.U8 d0,d0,#8uint16x4_t vrsra_n_u16(uint16x4_t a, uint16x4_t b, __constrange(1,16) int c); // VRSRA.U16 d0,d0,#16uint32x2_t vrsra_n_u32(uint32x2_t a, uint32x2_t b, __constrange(1,32) int c); // VRSRA.U32 d0,d0,#32uint64x1_t vrsra_n_u64(uint64x1_t a, uint64x1_t b, __constrange(1,64) int c); // VRSRA.U64 d0,d0,#64int8x16_t vrsraq_n_s8(int8x16_t a, int8x16_t b, __constrange(1,8) int c); // VRSRA.S8 q0,q0,#8int16x8_t vrsraq_n_s16(int16x8_t a, int16x8_t b, __constrange(1,16) int c); // VRSRA.S16 q0,q0,#16int32x4_t vrsraq_n_s32(int32x4_t a, int32x4_t b, __constrange(1,32) int c); // VRSRA.S32 q0,q0,#32int64x2_t vrsraq_n_s64(int64x2_t a, int64x2_t b, __constrange(1,64) int c); // VRSRA.S64 q0,q0,#64uint8x16_t vrsraq_n_u8(uint8x16_t a, uint8x16_t b, __constrange(1,8) int c); // VRSRA.U8 q0,q0,#8uint16x8_t vrsraq_n_u16(uint16x8_t a, uint16x8_t b, __constrange(1,16) int c); // VRSRA.U16 q0,q0,#16uint32x4_t vrsraq_n_u32(uint32x4_t a, uint32x4_t b, __constrange(1,32) int c); // VRSRA.U32 q0,q0,#32uint64x2_t vrsraq_n_u64(uint64x2_t a, uint64x2_t b, __constrange(1,64) int c); // VRSRA.U64 q0,q0,#64向 量 饱 和 按 常 数 左 移int8x8_t vqshl_n_s8(int8x8_t a, __constrange(0,7) int b); // VQSHL.S8 d0,d0,#0int16x4_t vqshl_n_s16(int16x4_t a, __constrange(0,15) int b); // VQSHL.S16 d0,d0,#0int32x2_t vqshl_n_s32(int32x2_t a, __constrange(0,31) int b); // VQSHL.S32 d0,d0,#0int64x1_t vqshl_n_s64(int64x1_t a, __constrange(0,63) int b); // VQSHL.S64 d0,d0,#0uint8x8_t vqshl_n_u8(uint8x8_t a, __constrange(0,7) int b); // VQSHL.U8 d0,d0,#0uint16x4_t vqshl_n_u16(uint16x4_t a, __constrange(0,15) int b); // VQSHL.U16 d0,d0,#0uint32x2_t vqshl_n_u32(uint32x2_t a, __constrange(0,31) int b); // VQSHL.U32 d0,d0,#0uint64x1_t vqshl_n_u64(uint64x1_t a, __constrange(0,63) int b); // VQSHL.U64 d0,d0,#0int8x16_t vqshlq_n_s8(int8x16_t a, __constrange(0,7) int b); // VQSHL.S8 q0,q0,#0int16x8_t vqshlq_n_s16(int16x8_t a, __constrange(0,15) int b); // VQSHL.S16 q0,q0,#0int32x4_t vqshlq_n_s32(int32x4_t a, __constrange(0,31) int b); // VQSHL.S32 q0,q0,#0int64x2_t vqshlq_n_s64(int64x2_t a, __constrange(0,63) int b); // VQSHL.S64 q0,q0,#0uint8x16_t vqshlq_n_u8(uint8x16_t a, __constrange(0,7) int b); // VQSHL.U8 q0,q0,#0uint16x8_t vqshlq_n_u16(uint16x8_t a, __constrange(0,15) int b); // VQSHL.U16 q0,q0,#0uint32x4_t vqshlq_n_u32(uint32x4_t a, __constrange(0,31) int b); // VQSHL.U32 q0,q0,#0uint64x2_t vqshlq_n_u64(uint64x2_t a, __constrange(0,63) int b); // VQSHL.U64 q0,q0,#0向 量 有 符 号 - > 无 符 号 饱 和 按 常 数 左 移uint8x8_t vqshlu_n_s8(int8x8_t a, __constrange(0,7) int b); // VQSHLU.S8 d0,d0,#0uint16x4_t vqshlu_n_s16(int16x4_t a, __constrange(0,15) int b); // VQSHLU.S16 d0,d0,#0uint32x2_t vqshlu_n_s32(int32x2_t a, __constrange(0,31) int b); // VQSHLU.S32 d0,d0,#0uint64x1_t vqshlu_n_s64(int64x1_t a, __constrange(0,63) int b); // VQSHLU.S64 d0,d0,#0uint8x16_t vqshluq_n_s8(int8x16_t a, __constrange(0,7) int b); // VQSHLU.S8 q0,q0,#0E-22 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持uint16x8_t vqshluq_n_s16(int16x8_t a, __constrange(0,15) int b); // VQSHLU.S16 q0,q0,#0uint32x4_t vqshluq_n_s32(int32x4_t a, __constrange(0,31) int b); // VQSHLU.S32 q0,q0,#0uint64x2_t vqshluq_n_s64(int64x2_t a, __constrange(0,63) int b); // VQSHLU.S64 q0,q0,#0向 量 窄 型 饱 和 按 常 数 右 移int8x8_t vshrn_n_s16(int16x8_t a, __constrange(1,8) int b); // VSHRN.I16 d0,q0,#8int16x4_t vshrn_n_s32(int32x4_t a, __constrange(1,16) int b); // VSHRN.I32 d0,q0,#16int32x2_t vshrn_n_s64(int64x2_t a, __constrange(1,32) int b); // VSHRN.I64 d0,q0,#32uint8x8_t vshrn_n_u16(uint16x8_t a, __constrange(1,8) int b); // VSHRN.I16 d0,q0,#8uint16x4_t vshrn_n_u32(uint32x4_t a, __constrange(1,16) int b); // VSHRN.I32 d0,q0,#16uint32x2_t vshrn_n_u64(uint64x2_t a, __constrange(1,32) int b); // VSHRN.I64 d0,q0,#32向 量 有 符 号 - > 无 符 号 窄 型 饱 和 按 常 数 右 移uint8x8_t vqshrun_n_s16(int16x8_t a, __constrange(1,8) int b); // VQSHRUN.S16 d0,q0,#8uint16x4_t vqshrun_n_s32(int32x4_t a, __constrange(1,16) int b); // VQSHRUN.S32 d0,q0,#16uint32x2_t vqshrun_n_s64(int64x2_t a, __constrange(1,32) int b); // VQSHRUN.S64 d0,q0,#32向 量 有 符 号 - > 无 符 号 舍 入 窄 型 饱 和 按 常 数 右 移uint8x8_t vqrshrun_n_s16(int16x8_t a, __constrange(1,8) int b); // VQRSHRUN.S16 d0,q0,#8uint16x4_t vqrshrun_n_s32(int32x4_t a, __constrange(1,16) int b); // VQRSHRUN.S32 d0,q0,#16uint32x2_t vqrshrun_n_s64(int64x2_t a, __constrange(1,32) int b); // VQRSHRUN.S64 d0,q0,#32向 量 窄 型 饱 和 按 常 数 右 移int8x8_t vqshrn_n_s16(int16x8_t a, __constrange(1,8) int b); // VQSHRN.S16 d0,q0,#8int16x4_t vqshrn_n_s32(int32x4_t a, __constrange(1,16) int b); // VQSHRN.S32 d0,q0,#16int32x2_t vqshrn_n_s64(int64x2_t a, __constrange(1,32) int b); // VQSHRN.S64 d0,q0,#32uint8x8_t vqshrn_n_u16(uint16x8_t a, __constrange(1,8) int b); // VQSHRN.U16 d0,q0,#8uint16x4_t vqshrn_n_u32(uint32x4_t a, __constrange(1,16) int b); // VQSHRN.U32 d0,q0,#16uint32x2_t vqshrn_n_u64(uint64x2_t a, __constrange(1,32) int b); // VQSHRN.U64 d0,q0,#32向 量 舍 入 窄 型 按 常 数 右 移int8x8_t vrshrn_n_s16(int16x8_t a, __constrange(1,8) int b); // VRSHRN.I16 d0,q0,#8int16x4_t vrshrn_n_s32(int32x4_t a, __constrange(1,16) int b); // VRSHRN.I32 d0,q0,#16int32x2_t vrshrn_n_s64(int64x2_t a, __constrange(1,32) int b); // VRSHRN.I64 d0,q0,#32uint8x8_t vrshrn_n_u16(uint16x8_t a, __constrange(1,8) int b); // VRSHRN.I16 d0,q0,#8uint16x4_t vrshrn_n_u32(uint32x4_t a, __constrange(1,16) int b); // VRSHRN.I32 d0,q0,#16uint32x2_t vrshrn_n_u64(uint64x2_t a, __constrange(1,32) int b); // VRSHRN.I64 d0,q0,#32<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-23ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持向 量 舍 入 窄 型 饱 和 按 常 数 右 移int8x8_t vqrshrn_n_s16(int16x8_t a, __constrange(1,8) int b); // VQRSHRN.S16 d0,q0,#8int16x4_t vqrshrn_n_s32(int32x4_t a, __constrange(1,16) int b); // VQRSHRN.S32 d0,q0,#16int32x2_t vqrshrn_n_s64(int64x2_t a, __constrange(1,32) int b); // VQRSHRN.S64 d0,q0,#32uint8x8_t vqrshrn_n_u16(uint16x8_t a, __constrange(1,8) int b); // VQRSHRN.U16 d0,q0,#8uint16x4_t vqrshrn_n_u32(uint32x4_t a, __constrange(1,16) int b); // VQRSHRN.U32 d0,q0,#16uint32x2_t vqrshrn_n_u64(uint64x2_t a, __constrange(1,32) int b); // VQRSHRN.U64 d0,q0,#32向 量 扩 大 按 常 数 左 移int16x8_t vshll_n_s8(int8x8_t a, __constrange(0,8) int b); // VSHLL.S8 q0,d0,#0int32x4_t vshll_n_s16(int16x4_t a, __constrange(0,16) int b); // VSHLL.S16 q0,d0,#0int64x2_t vshll_n_s32(int32x2_t a, __constrange(0,32) int b); // VSHLL.S32 q0,d0,#0uint16x8_t vshll_n_u8(uint8x8_t a, __constrange(0,8) int b); // VSHLL.U8 q0,d0,#0uint32x4_t vshll_n_u16(uint16x4_t a, __constrange(0,16) int b); // VSHLL.U16 q0,d0,#0uint64x2_t vshll_n_u32(uint32x2_t a, __constrange(0,32) int b); // VSHLL.U32 q0,d0,#0E.3.13移 位 并 插 入以 下 内 在 函 数 提 供 包 含 移 位 并 插 入 的 运 算 。向 量 右 移 并 插 入int8x8_t vsri_n_s8(int8x8_t a, int8x8_t b, __constrange(1,8) int c); // VSRI.8 d0,d0,#8int16x4_t vsri_n_s16(int16x4_t a, int16x4_t b, __constrange(1,16) int c); // VSRI.16 d0,d0,#16int32x2_t vsri_n_s32(int32x2_t a, int32x2_t b, __constrange(1,32) int c); // VSRI.32 d0,d0,#32int64x1_t vsri_n_s64(int64x1_t a, int64x1_t b, __constrange(1,64) int c); // VSRI.64 d0,d0,#64uint8x8_t vsri_n_u8(uint8x8_t a, uint8x8_t b, __constrange(1,8) int c); // VSRI.8 d0,d0,#8uint16x4_t vsri_n_u16(uint16x4_t a, uint16x4_t b, __constrange(1,16) int c); // VSRI.16 d0,d0,#16uint32x2_t vsri_n_u32(uint32x2_t a, uint32x2_t b, __constrange(1,32) int c); // VSRI.32 d0,d0,#32uint64x1_t vsri_n_u64(uint64x1_t a, uint64x1_t b, __constrange(1,64) int c); // VSRI.64 d0,d0,#64poly8x8_t vsri_n_p8(poly8x8_t a, poly8x8_t b, __constrange(1,8) int c); // VSRI.8 d0,d0,#8poly16x4_t vsri_n_p16(poly16x4_t a, poly16x4_t b, __constrange(1,16) int c); // VSRI.16 d0,d0,#16int8x16_t vsriq_n_s8(int8x16_t a, int8x16_t b, __constrange(1,8) int c); // VSRI.8 q0,q0,#8int16x8_t vsriq_n_s16(int16x8_t a, int16x8_t b, __constrange(1,16) int c); // VSRI.16 q0,q0,#16int32x4_t vsriq_n_s32(int32x4_t a, int32x4_t b, __constrange(1,32) int c); // VSRI.32 q0,q0,#32int64x2_t vsriq_n_s64(int64x2_t a, int64x2_t b, __constrange(1,64) int c); // VSRI.64 q0,q0,#64uint8x16_t vsriq_n_u8(uint8x16_t a, uint8x16_t b, __constrange(1,8) int c); // VSRI.8 q0,q0,#8uint16x8_t vsriq_n_u16(uint16x8_t a, uint16x8_t b, __constrange(1,16) int c); // VSRI.16 q0,q0,#16uint32x4_t vsriq_n_u32(uint32x4_t a, uint32x4_t b, __constrange(1,32) int c); // VSRI.32 q0,q0,#32uint64x2_t vsriq_n_u64(uint64x2_t a, uint64x2_t b, __constrange(1,64) int c); // VSRI.64 q0,q0,#64poly8x16_t vsriq_n_p8(poly8x16_t a, poly8x16_t b, __constrange(1,8) int c); // VSRI.8 q0,q0,#8poly16x8_t vsriq_n_p16(poly16x8_t a, poly16x8_t b, __constrange(1,16) int c); // VSRI.16 q0,q0,#16E-24 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持向 量 左 移 并 插 入int8x8_t vsli_n_s8(int8x8_t a, int8x8_t b, __constrange(0,7) int c); // VSLI.8 d0,d0,#0int16x4_t vsli_n_s16(int16x4_t a, int16x4_t b, __constrange(0,15) int c); // VSLI.16 d0,d0,#0int32x2_t vsli_n_s32(int32x2_t a, int32x2_t b, __constrange(0,31) int c); // VSLI.32 d0,d0,#0int64x1_t vsli_n_s64(int64x1_t a, int64x1_t b, __constrange(0,63) int c); // VSLI.64 d0,d0,#0uint8x8_t vsli_n_u8(uint8x8_t a, uint8x8_t b, __constrange(0,7) int c); // VSLI.8 d0,d0,#0uint16x4_t vsli_n_u16(uint16x4_t a, uint16x4_t b, __constrange(0,15) int c); // VSLI.16 d0,d0,#0uint32x2_t vsli_n_u32(uint32x2_t a, uint32x2_t b, __constrange(0,31) int c); // VSLI.32 d0,d0,#0uint64x1_t vsli_n_u64(uint64x1_t a, uint64x1_t b, __constrange(0,63) int c); // VSLI.64 d0,d0,#0poly8x8_t vsli_n_p8(poly8x8_t a, poly8x8_t b, __constrange(0,7) int c); // VSLI.8 d0,d0,#0poly16x4_t vsli_n_p16(poly16x4_t a, poly16x4_t b, __constrange(0,15) int c); // VSLI.16 d0,d0,#0int8x16_t vsliq_n_s8(int8x16_t a, int8x16_t b, __constrange(0,7) int c); // VSLI.8 q0,q0,#0int16x8_t vsliq_n_s16(int16x8_t a, int16x8_t b, __constrange(0,15) int c); // VSLI.16 q0,q0,#0int32x4_t vsliq_n_s32(int32x4_t a, int32x4_t b, __constrange(0,31) int c); // VSLI.32 q0,q0,#0int64x2_t vsliq_n_s64(int64x2_t a, int64x2_t b, __constrange(0,63) int c); // VSLI.64 q0,q0,#0uint8x16_t vsliq_n_u8(uint8x16_t a, uint8x16_t b, __constrange(0,7) int c); // VSLI.8 q0,q0,#0uint16x8_t vsliq_n_u16(uint16x8_t a, uint16x8_t b, __constrange(0,15) int c); // VSLI.16 q0,q0,#0uint32x4_t vsliq_n_u32(uint32x4_t a, uint32x4_t b, __constrange(0,31) int c); // VSLI.32 q0,q0,#0uint64x2_t vsliq_n_u64(uint64x2_t a, uint64x2_t b, __constrange(0,63) int c); // VSLI.64 q0,q0,#0poly8x16_t vsliq_n_p8(poly8x16_t a, poly8x16_t b, __constrange(0,7) int c); // VSLI.8 q0,q0,#0poly16x8_t vsliq_n_p16(poly16x8_t a, poly16x8_t b, __constrange(0,15) int c); // VSLI.16 q0,q0,#0E.3.14加 载 并 存 储 单 个 向 量加 载 并 存 储 某 类 型 的 单 个 向 量 。uint8x16_t vld1q_u8(__transfersize(16) uint8_t const * ptr);// VLD1.8 {d0, d1}, [r0]uint16x8_t vld1q_u16(__transfersize(8) uint16_t const * ptr);// VLD1.16 {d0, d1}, [r0]uint32x4_t vld1q_u32(__transfersize(4) uint32_t const * ptr);// VLD1.32 {d0, d1}, [r0]uint64x2_t vld1q_u64(__transfersize(2) uint64_t const * ptr);// VLD1.64 {d0, d1}, [r0]int8x16_t vld1q_s8(__transfersize(16) int8_t const * ptr);// VLD1.8 {d0, d1}, [r0]int16x8_t vld1q_s16(__transfersize(8) int16_t const * ptr);// VLD1.16 {d0, d1}, [r0]int32x4_t vld1q_s32(__transfersize(4) int32_t const * ptr);// VLD1.32 {d0, d1}, [r0]int64x2_t vld1q_s64(__transfersize(2) int64_t const * ptr);// VLD1.64 {d0, d1}, [r0]float16x8_t vld1q_f16(__transfersize(8) __fp16 const * ptr);// VLD1.16 {d0, d1}, [r0]float32x4_t vld1q_f32(__transfersize(4) float32_t const * ptr);// VLD1.32 {d0, d1}, [r0]poly8x16_t vld1q_p8(__transfersize(16) poly8_t const * ptr);// VLD1.8 {d0, d1}, [r0]<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-25ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持poly16x8_t vld1q_p16(__transfersize(8) poly16_t const * ptr);// VLD1.16 {d0, d1}, [r0]uint8x8_t vld1_u8(__transfersize(8) uint8_t const * ptr);// VLD1.8 {d0}, [r0]uint16x4_t vld1_u16(__transfersize(4) uint16_t const * ptr);// VLD1.16 {d0}, [r0]uint32x2_t vld1_u32(__transfersize(2) uint32_t const * ptr);// VLD1.32 {d0}, [r0]uint64x1_t vld1_u64(__transfersize(1) uint64_t const * ptr);// VLD1.64 {d0}, [r0]int8x8_t vld1_s8(__transfersize(8) int8_t const * ptr);// VLD1.8 {d0}, [r0]int16x4_t vld1_s16(__transfersize(4) int16_t const * ptr);// VLD1.16 {d0}, [r0]int32x2_t vld1_s32(__transfersize(2) int32_t const * ptr);// VLD1.32 {d0}, [r0]int64x1_t vld1_s64(__transfersize(1) int64_t const * ptr);// VLD1.64 {d0}, [r0]float16x4_t vld1_f16(__transfersize(4) __fp16 const * ptr);// VLD1.16 {d0}, [r0]float32x2_t vld1_f32(__transfersize(2) float32_t const * ptr);// VLD1.32 {d0}, [r0]poly8x8_t vld1_p8(__transfersize(8) poly8_t const * ptr);// VLD1.8 {d0}, [r0]poly16x4_t vld1_p16(__transfersize(4) poly16_t const * ptr);// VLD1.16 {d0}, [r0]uint8x16_t vld1q_lane_u8(__transfersize(1) uint8_t const * ptr, uint8x16_t vec, __constrange(0,15) intlane);// VLD1.8 {d0[0]}, [r0]uint16x8_t vld1q_lane_u16(__transfersize(1) uint16_t const * ptr, uint16x8_t vec, __constrange(0,7)int lane);// VLD1.16 {d0[0]}, [r0]uint32x4_t vld1q_lane_u32(__transfersize(1) uint32_t const * ptr, uint32x4_t vec, __constrange(0,3)int lane);// VLD1.32 {d0[0]}, [r0]uint64x2_t vld1q_lane_u64(__transfersize(1) uint64_t const * ptr, uint64x2_t vec, __constrange(0,1)int lane);// VLD1.64 {d0}, [r0]int8x16_t vld1q_lane_s8(__transfersize(1) int8_t const * ptr, int8x16_t vec, __constrange(0,15) intlane);// VLD1.8 {d0[0]}, [r0]int16x8_t vld1q_lane_s16(__transfersize(1) int16_t const * ptr, int16x8_t vec, __constrange(0,7) intlane);// VLD1.16 {d0[0]}, [r0]int32x4_t vld1q_lane_s32(__transfersize(1) int32_t const * ptr, int32x4_t vec, __constrange(0,3) intlane);// VLD1.32 {d0[0]}, [r0]float16x4_t vld1q_lane_f16(__transfersize(1) __fp16 const * ptr, float16x4_t vec, __constrange(0,3) intlane);E-26 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持// VLD1.16 {d0[0]}, [r0]float16x8_t vld1q_lane_f16(__transfersize(1) __fp16 const * ptr, float16x8_t vec, __constrange(0,7) intlane);// VLD1.16 {d0[0]}, [r0]float32x4_t vld1q_lane_f32(__transfersize(1) float32_t const * ptr, float32x4_t vec, __constrange(0,3)int lane);// VLD1.32 {d0[0]}, [r0]int64x2_t vld1q_lane_s64(__transfersize(1) int64_t const * ptr, int64x2_t vec, __constrange(0,1) intlane);// VLD1.64 {d0}, [r0]poly8x16_t vld1q_lane_p8(__transfersize(1) poly8_t const * ptr, poly8x16_t vec, __constrange(0,15) intlane);// VLD1.8 {d0[0]}, [r0]poly16x8_t vld1q_lane_p16(__transfersize(1) poly16_t const * ptr, poly16x8_t vec, __constrange(0,7)int lane);// VLD1.16 {d0[0]}, [r0]uint8x8_t vld1_lane_u8(__transfersize(1) uint8_t const * ptr, uint8x8_t vec, __constrange(0,7) intlane);// VLD1.8 {d0[0]}, [r0]uint16x4_t vld1_lane_u16(__transfersize(1) uint16_t const * ptr, uint16x4_t vec, __constrange(0,3) intlane);// VLD1.16 {d0[0]}, [r0]uint32x2_t vld1_lane_u32(__transfersize(1) uint32_t const * ptr, uint32x2_t vec, __constrange(0,1) intlane);// VLD1.32 {d0[0]}, [r0]uint64x1_t vld1_lane_u64(__transfersize(1) uint64_t const * ptr, uint64x1_t vec, __constrange(0,0) intlane);// VLD1.64 {d0}, [r0]int8x8_t vld1_lane_s8(__transfersize(1) int8_t const * ptr, int8x8_t vec, __constrange(0,7) int lane);int16x4_tlane);// VLD1.8 {d0[0]}, [r0]vld1_lane_s16(__transfersize(1) int16_t const * ptr, int16x4_t vec, __constrange(0,3) int// VLD1.16 {d0[0]}, [r0]int32x2_t vld1_lane_s32(__transfersize(1) int32_t const * ptr, int32x2_t vec, __constrange(0,1) intlane);// VLD1.32 {d0[0]}, [r0]float32x2_t vld1_lane_f32(__transfersize(1) float32_t const * ptr, float32x2_t vec, __constrange(0,1)int lane);// VLD1.32 {d0[0]}, [r0]int64x1_t vld1_lane_s64(__transfersize(1) int64_t const * ptr, int64x1_t vec, __constrange(0,0) intlane);// VLD1.64 {d0}, [r0]poly8x8_t vld1_lane_p8(__transfersize(1) poly8_t const * ptr, poly8x8_t vec, __constrange(0,7) intlane);// VLD1.8 {d0[0]}, [r0]poly16x4_t vld1_lane_p16(__transfersize(1) poly16_t const * ptr, poly16x4_t vec, __constrange(0,3) intlane);// VLD1.16 {d0[0]}, [r0]uint8x16_t vld1q_dup_u8(__transfersize(1) uint8_t const * ptr);<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-27ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持// VLD1.8 {d0[]}, [r0]uint16x8_t vld1q_dup_u16(__transfersize(1) uint16_t const * ptr);// VLD1.16 {d0[]}, [r0]uint32x4_t vld1q_dup_u32(__transfersize(1) uint32_t const * ptr);// VLD1.32 {d0[]}, [r0]uint64x2_t vld1q_dup_u64(__transfersize(1) uint64_t const * ptr);// VLD1.64 {d0}, [r0]int8x16_t vld1q_dup_s8(__transfersize(1) int8_t const * ptr);// VLD1.8 {d0[]}, [r0]int16x8_t vld1q_dup_s16(__transfersize(1) int16_t const * ptr);// VLD1.16 {d0[]}, [r0]int32x4_t vld1q_dup_s32(__transfersize(1) int32_t const * ptr);// VLD1.32 {d0[]}, [r0]int64x2_t vld1q_dup_s64(__transfersize(1) int64_t const * ptr);// VLD1.64 {d0}, [r0]float16x8_t vld1q_dup_f16(__transfersize(1) __fp16 const * ptr);// VLD1.16 {d0[]}, [r0]float32x4_t vld1q_dup_f32(__transfersize(1) float32_t const * ptr);// VLD1.32 {d0[]}, [r0]poly8x16_t vld1q_dup_p8(__transfersize(1) poly8_t const * ptr);// VLD1.8 {d0[]}, [r0]poly16x8_t vld1q_dup_p16(__transfersize(1) poly16_t const * ptr);// VLD1.16 {d0[]}, [r0]uint8x8_t vld1_dup_u8(__transfersize(1) uint8_t const * ptr);// VLD1.8 {d0[]}, [r0]uint16x4_t vld1_dup_u16(__transfersize(1) uint16_t const * ptr);// VLD1.16 {d0[]}, [r0]uint32x2_t vld1_dup_u32(__transfersize(1) uint32_t const * ptr);// VLD1.32 {d0[]}, [r0]uint64x1_t vld1_dup_u64(__transfersize(1) uint64_t const * ptr);// VLD1.64 {d0}, [r0]int8x8_t vld1_dup_s8(__transfersize(1) int8_t const * ptr);// VLD1.8 {d0[]}, [r0]int16x4_t vld1_dup_s16(__transfersize(1) int16_t const * ptr);// VLD1.16 {d0[]}, [r0]int32x2_t vld1_dup_s32(__transfersize(1) int32_t const * ptr);// VLD1.32 {d0[]}, [r0]int64x1_t vld1_dup_s64(__transfersize(1) int64_t const * ptr);// VLD1.64 {d0}, [r0]float16x4_t vld1_dup_f16(__transfersize(1) __fp16 const * ptr);// VLD1.16 {d0[]}, [r0]float32x2_t vld1_dup_f32(__transfersize(1) float32_t const * ptr);// VLD1.32 {d0[]}, [r0]poly8x8_t vld1_dup_p8(__transfersize(1) poly8_t const * ptr);// VLD1.8 {d0[]}, [r0]poly16x4_t vld1_dup_p16(__transfersize(1) poly16_t const * ptr);// VLD1.16 {d0[]}, [r0]void vst1q_u8(__transfersize(16) uint8_t * ptr, uint8x16_t val);// VST1.8 {d0, d1}, [r0]E-28 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持void vst1q_u16(__transfersize(8) uint16_t * ptr, uint16x8_t val);// VST1.16 {d0, d1}, [r0]void vst1q_u32(__transfersize(4) uint32_t * ptr, uint32x4_t val);// VST1.32 {d0, d1}, [r0]void vst1q_u64(__transfersize(2) uint64_t * ptr, uint64x2_t val);// VST1.64 {d0, d1}, [r0]void vst1q_s8(__transfersize(16) int8_t * ptr, int8x16_t val);// VST1.8 {d0, d1}, [r0]void vst1q_s16(__transfersize(8) int16_t * ptr, int16x8_t val);// VST1.16 {d0, d1}, [r0]void vst1q_s32(__transfersize(4) int32_t * ptr, int32x4_t val);// VST1.32 {d0, d1}, [r0]void vst1q_s64(__transfersize(2) int64_t * ptr, int64x2_t val);// VST1.64 {d0, d1}, [r0]void vst1q_f16(__transfersize(8) __fp16 * ptr, float16x8_t val);// VST1.16 {d0, d1}, [r0]void vst1q_f32(__transfersize(4) float32_t * ptr, float32x4_t val);// VST1.32 {d0, d1}, [r0]void vst1q_p8(__transfersize(16) poly8_t * ptr, poly8x16_t val);// VST1.8 {d0, d1}, [r0]void vst1q_p16(__transfersize(8) poly16_t * ptr, poly16x8_t val);// VST1.16 {d0, d1}, [r0]void vst1_u8(__transfersize(8) uint8_t * ptr, uint8x8_t val);// VST1.8 {d0}, [r0]void vst1_u16(__transfersize(4) uint16_t * ptr, uint16x4_t val);// VST1.16 {d0}, [r0]void vst1_u32(__transfersize(2) uint32_t * ptr, uint32x2_t val);// VST1.32 {d0}, [r0]void vst1_u64(__transfersize(1) uint64_t * ptr, uint64x1_t val);// VST1.64 {d0}, [r0]void vst1_s8(__transfersize(8) int8_t * ptr, int8x8_t val);// VST1.8 {d0}, [r0]void vst1_s16(__transfersize(4) int16_t * ptr, int16x4_t val);// VST1.16 {d0}, [r0]void vst1_s32(__transfersize(2) int32_t * ptr, int32x2_t val);// VST1.32 {d0}, [r0]void vst1_s64(__transfersize(1) int64_t * ptr, int64x1_t val);// VST1.64 {d0}, [r0]void vst1_f16(__transfersize(4) __fp16 * ptr, float16x4_t val);// VST1.16 {d0}, [r0]void vst1_f32(__transfersize(2) float32_t * ptr, float32x2_t val);// VST1.32 {d0}, [r0]void vst1_p8(__transfersize(8) poly8_t * ptr, poly8x8_t val);// VST1.8 {d0}, [r0]void vst1_p16(__transfersize(4) poly16_t * ptr, poly16x4_t val);// VST1.16 {d0}, [r0]void vst1q_lane_u8(__transfersize(1) uint8_t * ptr, uint8x16_t val, __constrange(0,15) int lane);// VST1.8 {d0[0]}, [r0]void vst1q_lane_u16(__transfersize(1) uint16_t * ptr, uint16x8_t val, __constrange(0,7) int lane);<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-29ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持// VST1.16 {d0[0]}, [r0]void vst1q_lane_u32(__transfersize(1) uint32_t * ptr, uint32x4_t val, __constrange(0,3) int lane);// VST1.32 {d0[0]}, [r0]void vst1q_lane_u64(__transfersize(1) uint64_t * ptr, uint64x2_t val, __constrange(0,1) int lane);// VST1.64 {d0}, [r0]void vst1q_lane_s8(__transfersize(1) int8_t * ptr, int8x16_t val, __constrange(0,15) int lane);// VST1.8 {d0[0]}, [r0]void vst1q_lane_s16(__transfersize(1) int16_t * ptr, int16x8_t val, __constrange(0,7) int lane);// VST1.16 {d0[0]}, [r0]void vst1q_lane_s32(__transfersize(1) int32_t * ptr, int32x4_t val, __constrange(0,3) int lane);// VST1.32 {d0[0]}, [r0]void vst1q_lane_s64(__transfersize(1) int64_t * ptr, int64x2_t val, __constrange(0,1) int lane);// VST1.64 {d0}, [r0]void vst1q_lane_f16(__transfersize(1) __fp16 * ptr, float16x8_t val, __constrange(0,7) int lane);// VST1.16 {d0[0]}, [r0]void vst1q_lane_f32(__transfersize(1) float32_t * ptr, float32x4_t val, __constrange(0,3) int lane);// VST1.32 {d0[0]}, [r0]void vst1q_lane_p8(__transfersize(1) poly8_t * ptr, poly8x16_t val, __constrange(0,15) int lane);// VST1.8 {d0[0]}, [r0]void vst1q_lane_p16(__transfersize(1) poly16_t * ptr, poly16x8_t val, __constrange(0,7) int lane);// VST1.16 {d0[0]}, [r0]void vst1_lane_u8(__transfersize(1) uint8_t * ptr, uint8x8_t val, __constrange(0,7) int lane);// VST1.8 {d0[0]}, [r0]void vst1_lane_u16(__transfersize(1) uint16_t * ptr, uint16x4_t val, __constrange(0,3) int lane);// VST1.16 {d0[0]}, [r0]void vst1_lane_u32(__transfersize(1) uint32_t * ptr, uint32x2_t val, __constrange(0,1) int lane);// VST1.32 {d0[0]}, [r0]void vst1_lane_u64(__transfersize(1) uint64_t * ptr, uint64x1_t val, __constrange(0,0) int lane);// VST1.64 {d0}, [r0]void vst1_lane_s8(__transfersize(1) int8_t * ptr, int8x8_t val, __constrange(0,7) int lane);// VST1.8 {d0[0]}, [r0]void vst1_lane_s16(__transfersize(1) int16_t * ptr, int16x4_t val, __constrange(0,3) int lane);// VST1.16 {d0[0]}, [r0]void vst1_lane_s32(__transfersize(1) int32_t * ptr, int32x2_t val, __constrange(0,1) int lane);// VST1.32 {d0[0]}, [r0]void vst1_lane_s64(__transfersize(1) int64_t * ptr, int64x1_t val, __constrange(0,0) int lane);// VST1.64 {d0}, [r0]void vst1_lane_f16(__transfersize(1) __fp16 * ptr, float16x4_t val, __constrange(0,3) int lane);// VST1.16 {d0[0]}, [r0]void vst1_lane_f32(__transfersize(1) float32_t * ptr, float32x2_t val, __constrange(0,1) int lane);// VST1.32 {d0[0]}, [r0]void vst1_lane_p8(__transfersize(1) poly8_t * ptr, poly8x8_t val, __constrange(0,7) int lane);// VST1.8 {d0[0]}, [r0]void vst1_lane_p16(__transfersize(1) poly16_t * ptr, poly16x4_t val, __constrange(0,3) int lane);// VST1.16 {d0[0]}, [r0]E-30 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持E.3.15加 载 并 存 储 N 元 素 结 构以 下 内 在 函 数 加 载 或 存 储 n- 元 素 结 构 。 数 组 结 构 的 定 义 方 式 类 似 , 例 如int16x4x2_t 结 构 定 义 如 下 :struct int16x4x2_t{int16x4_t val[2];};uint8x16x2_t vld2q_u8(__transfersize(32) uint8_t const * ptr);// VLD2.8 {d0, d2}, [r0]uint16x8x2_t vld2q_u16(__transfersize(16) uint16_t const * ptr);// VLD2.16 {d0, d2}, [r0]uint32x4x2_t vld2q_u32(__transfersize(8) uint32_t const * ptr);// VLD2.32 {d0, d2}, [r0]int8x16x2_t vld2q_s8(__transfersize(32) int8_t const * ptr);// VLD2.8 {d0, d2}, [r0]int16x8x2_t vld2q_s16(__transfersize(16) int16_t const * ptr);// VLD2.16 {d0, d2}, [r0]int32x4x2_t vld2q_s32(__transfersize(8) int32_t const * ptr);// VLD2.32 {d0, d2}, [r0]float16x8x2_t vld2q_f16(__transfersize(16) __fp16 const * ptr);// VLD2.16 {d0, d2}, [r0]float32x4x2_t vld2q_f32(__transfersize(8) float32_t const * ptr);// VLD2.32 {d0, d2}, [r0]poly8x16x2_t vld2q_p8(__transfersize(32) poly8_t const * ptr);// VLD2.8 {d0, d2}, [r0]poly16x8x2_t vld2q_p16(__transfersize(16) poly16_t const * ptr);// VLD2.16 {d0, d2}, [r0]uint8x8x2_t vld2_u8(__transfersize(16) uint8_t const * ptr);// VLD2.8 {d0, d1}, [r0]uint16x4x2_t vld2_u16(__transfersize(8) uint16_t const * ptr);// VLD2.16 {d0, d1}, [r0]uint32x2x2_t vld2_u32(__transfersize(4) uint32_t const * ptr);// VLD2.32 {d0, d1}, [r0]uint64x1x2_t vld2_u64(__transfersize(2) uint64_t const * ptr);// VLD1.64 {d0, d1}, [r0]int8x8x2_t vld2_s8(__transfersize(16) int8_t const * ptr);// VLD2.8 {d0, d1}, [r0]int16x4x2_t vld2_s16(__transfersize(8) int16_t const * ptr);// VLD2.16 {d0, d1}, [r0]int32x2x2_t vld2_s32(__transfersize(4) int32_t const * ptr);// VLD2.32 {d0, d1}, [r0]int64x1x2_t vld2_s64(__transfersize(2) int64_t const * ptr);// VLD1.64 {d0, d1}, [r0]float16x4x2_t vld2_f16(__transfersize(8) __fp16 const * ptr);// VLD2.16 {d0, d1}, [r0]float32x2x2_t vld2_f32(__transfersize(4) float32_t const * ptr);// VLD2.32 {d0, d1}, [r0]<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-31ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持poly8x8x2_t vld2_p8(__transfersize(16) poly8_t const * ptr);// VLD2.8 {d0, d1}, [r0]poly16x4x2_t vld2_p16(__transfersize(8) poly16_t const * ptr);// VLD2.16 {d0, d1}, [r0]uint8x16x3_t vld3q_u8(__transfersize(48) uint8_t const * ptr);// VLD3.8 {d0, d2, d4}, [r0]uint16x8x3_t vld3q_u16(__transfersize(24) uint16_t const * ptr);// VLD3.16 {d0, d2, d4}, [r0]uint32x4x3_t vld3q_u32(__transfersize(12) uint32_t const * ptr);// VLD3.32 {d0, d2, d4}, [r0]int8x16x3_t vld3q_s8(__transfersize(48) int8_t const * ptr);// VLD3.8 {d0, d2, d4}, [r0]int16x8x3_t vld3q_s16(__transfersize(24) int16_t const * ptr);// VLD3.16 {d0, d2, d4}, [r0]int32x4x3_t vld3q_s32(__transfersize(12) int32_t const * ptr);// VLD3.32 {d0, d2, d4}, [r0]float16x8x3_t vld3q_f16(__transfersize(24) __fp16 const * ptr);// VLD3.16 {d0, d2, d4}, [r0]float32x4x3_t vld3q_f32(__transfersize(12) float32_t const * ptr);// VLD3.32 {d0, d2, d4}, [r0]poly8x16x3_t vld3q_p8(__transfersize(48) poly8_t const * ptr);// VLD3.8 {d0, d2, d4}, [r0]poly16x8x3_t vld3q_p16(__transfersize(24) poly16_t const * ptr);// VLD3.16 {d0, d2, d4}, [r0]uint8x8x3_t vld3_u8(__transfersize(24) uint8_t const * ptr);// VLD3.8 {d0, d1, d2}, [r0]uint16x4x3_t vld3_u16(__transfersize(12) uint16_t const * ptr);// VLD3.16 {d0, d1, d2}, [r0]uint32x2x3_t vld3_u32(__transfersize(6) uint32_t const * ptr);// VLD3.32 {d0, d1, d2}, [r0]uint64x1x3_t vld3_u64(__transfersize(3) uint64_t const * ptr);// VLD1.64 {d0, d1, d2}, [r0]int8x8x3_t vld3_s8(__transfersize(24) int8_t const * ptr);// VLD3.8 {d0, d1, d2}, [r0]int16x4x3_t vld3_s16(__transfersize(12) int16_t const * ptr);// VLD3.16 {d0, d1, d2}, [r0]int32x2x3_t vld3_s32(__transfersize(6) int32_t const * ptr);// VLD3.32 {d0, d1, d2}, [r0]int64x1x3_t vld3_s64(__transfersize(3) int64_t const * ptr);// VLD1.64 {d0, d1, d2}, [r0]float16x4x3_t vld3_f16(__transfersize(12) __fp16 const * ptr);// VLD3.16 {d0, d1, d2}, [r0]float32x2x3_t vld3_f32(__transfersize(6) float32_t const * ptr);// VLD3.32 {d0, d1, d2}, [r0]poly8x8x3_t vld3_p8(__transfersize(24) poly8_t const * ptr);// VLD3.8 {d0, d1, d2}, [r0]poly16x4x3_t vld3_p16(__transfersize(12) poly16_t const * ptr);// VLD3.16 {d0, d1, d2}, [r0]uint8x16x4_t vld4q_u8(__transfersize(64) uint8_t const * ptr);E-32 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持// VLD4.8 {d0, d2, d4, d6}, [r0]uint16x8x4_t vld4q_u16(__transfersize(32) uint16_t const * ptr);// VLD4.16 {d0, d2, d4, d6}, [r0]uint32x4x4_t vld4q_u32(__transfersize(16) uint32_t const * ptr);// VLD4.32 {d0, d2, d4, d6}, [r0]int8x16x4_t vld4q_s8(__transfersize(64) int8_t const * ptr);// VLD4.8 {d0, d2, d4, d6}, [r0]int16x8x4_t vld4q_s16(__transfersize(32) int16_t const * ptr);// VLD4.16 {d0, d2, d4, d6}, [r0]int32x4x4_t vld4q_s32(__transfersize(16) int32_t const * ptr);// VLD4.32 {d0, d2, d4, d6}, [r0]float16x8x4_t vld4q_f16(__transfersize(32) __fp16 const * ptr);// VLD4.16 {d0, d2, d4, d6}, [r0]float32x4x4_t vld4q_f32(__transfersize(16) float32_t const * ptr);// VLD4.32 {d0, d2, d4, d6}, [r0]poly8x16x4_t vld4q_p8(__transfersize(64) poly8_t const * ptr);// VLD4.8 {d0, d2, d4, d6}, [r0]poly16x8x4_t vld4q_p16(__transfersize(32) poly16_t const * ptr);// VLD4.16 {d0, d2, d4, d6}, [r0]uint8x8x4_t vld4_u8(__transfersize(32) uint8_t const * ptr);// VLD4.8 {d0, d1, d2, d3}, [r0]uint16x4x4_t vld4_u16(__transfersize(16) uint16_t const * ptr);// VLD4.16 {d0, d1, d2, d3}, [r0]uint32x2x4_t vld4_u32(__transfersize(8) uint32_t const * ptr);// VLD4.32 {d0, d1, d2, d3}, [r0]uint64x1x4_t vld4_u64(__transfersize(4) uint64_t const * ptr);// VLD1.64 {d0, d1, d2, d3}, [r0]int8x8x4_t vld4_s8(__transfersize(32) int8_t const * ptr);// VLD4.8 {d0, d1, d2, d3}, [r0]int16x4x4_t vld4_s16(__transfersize(16) int16_t const * ptr);// VLD4.16 {d0, d1, d2, d3}, [r0]int32x2x4_t vld4_s32(__transfersize(8) int32_t const * ptr);// VLD4.32 {d0, d1, d2, d3}, [r0]int64x1x4_t vld4_s64(__transfersize(4) int64_t const * ptr);// VLD1.64 {d0, d1, d2, d3}, [r0]float16x4x4_t vld4_f16(__transfersize(16) __fp16 const * ptr);// VLD4.16 {d0, d1, d2, d3}, [r0]float32x2x4_t vld4_f32(__transfersize(8) float32_t const * ptr);// VLD4.32 {d0, d1, d2, d3}, [r0]poly8x8x4_t vld4_p8(__transfersize(32) poly8_t const * ptr);// VLD4.8 {d0, d1, d2, d3}, [r0]poly16x4x4_t vld4_p16(__transfersize(16) poly16_t const * ptr);// VLD4.16 {d0, d1, d2, d3}, [r0]uint8x8x2_t vld2_dup_u8(__transfersize(2) uint8_t const * ptr);// VLD2.8 {d0[], d1[]}, [r0]uint16x4x2_t vld2_dup_u16(__transfersize(2) uint16_t const * ptr);// VLD2.16 {d0[], d1[]}, [r0]uint32x2x2_t vld2_dup_u32(__transfersize(2) uint32_t const * ptr);// VLD2.32 {d0[], d1[]}, [r0]<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-33ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持uint64x1x2_t vld2_dup_u64(__transfersize(2) uint64_t const * ptr);// VLD1.64 {d0, d1}, [r0]int8x8x2_t vld2_dup_s8(__transfersize(2) int8_t const * ptr);// VLD2.8 {d0[], d1[]}, [r0]int16x4x2_t vld2_dup_s16(__transfersize(2) int16_t const * ptr);// VLD2.16 {d0[], d1[]}, [r0]int32x2x2_t vld2_dup_s32(__transfersize(2) int32_t const * ptr);// VLD2.32 {d0[], d1[]}, [r0]int64x1x2_t vld2_dup_s64(__transfersize(2) int64_t const * ptr);// VLD1.64 {d0, d1}, [r0]float16x4x2_t vld2_dup_f16(__transfersize(2) __fp16 const * ptr);// VLD2.16 {d0[], d1[]}, [r0]float32x2x2_t vld2_dup_f32(__transfersize(2) float32_t const * ptr);// VLD2.32 {d0[], d1[]}, [r0]poly8x8x2_t vld2_dup_p8(__transfersize(2) poly8_t const * ptr);// VLD2.8 {d0[], d1[]}, [r0]poly16x4x2_t vld2_dup_p16(__transfersize(2) poly16_t const * ptr);// VLD2.16 {d0[], d1[]}, [r0]uint8x8x3_t vld3_dup_u8(__transfersize(3) uint8_t const * ptr);// VLD3.8 {d0[], d1[], d2[]}, [r0]uint16x4x3_t vld3_dup_u16(__transfersize(3) uint16_t const * ptr);// VLD3.16 {d0[], d1[], d2[]}, [r0]uint32x2x3_t vld3_dup_u32(__transfersize(3) uint32_t const * ptr);// VLD3.32 {d0[], d1[], d2[]}, [r0]uint64x1x3_t vld3_dup_u64(__transfersize(3) uint64_t const * ptr);// VLD1.64 {d0, d1, d2}, [r0]int8x8x3_t vld3_dup_s8(__transfersize(3) int8_t const * ptr);// VLD3.8 {d0[], d1[], d2[]}, [r0]int16x4x3_t vld3_dup_s16(__transfersize(3) int16_t const * ptr);// VLD3.16 {d0[], d1[], d2[]}, [r0]int32x2x3_t vld3_dup_s32(__transfersize(3) int32_t const * ptr);// VLD3.32 {d0[], d1[], d2[]}, [r0]int64x1x3_t vld3_dup_s64(__transfersize(3) int64_t const * ptr);// VLD1.64 {d0, d1, d2}, [r0]float16x4x3_t vld3_dup_f16(__transfersize(3) __fp16 const * ptr);// VLD3.16 {d0[], d1[], d2[]}, [r0]float32x2x3_t vld3_dup_f32(__transfersize(3) float32_t const * ptr);// VLD3.32 {d0[], d1[], d2[]}, [r0]poly8x8x3_t vld3_dup_p8(__transfersize(3) poly8_t const * ptr);// VLD3.8 {d0[], d1[], d2[]}, [r0]poly16x4x3_t vld3_dup_p16(__transfersize(3) poly16_t const * ptr);// VLD3.16 {d0[], d1[], d2[]}, [r0]uint8x8x4_t vld4_dup_u8(__transfersize(4) uint8_t const * ptr);// VLD4.8 {d0[], d1[], d2[], d3[]}, [r0]uint16x4x4_t vld4_dup_u16(__transfersize(4) uint16_t const * ptr);// VLD4.16 {d0[], d1[], d2[], d3[]}, [r0]uint32x2x4_t vld4_dup_u32(__transfersize(4) uint32_t const * ptr);// VLD4.32 {d0[], d1[], d2[], d3[]}, [r0]uint64x1x4_t vld4_dup_u64(__transfersize(4) uint64_t const * ptr);E-34 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持// VLD1.64 {d0, d1, d2, d3}, [r0]int8x8x4_t vld4_dup_s8(__transfersize(4) int8_t const * ptr);// VLD4.8 {d0[], d1[], d2[], d3[]}, [r0]int16x4x4_t vld4_dup_s16(__transfersize(4) int16_t const * ptr);// VLD4.16 {d0[], d1[], d2[], d3[]}, [r0]int32x2x4_t vld4_dup_s32(__transfersize(4) int32_t const * ptr);// VLD4.32 {d0[], d1[], d2[], d3[]}, [r0]int64x1x4_t vld4_dup_s64(__transfersize(4) int64_t const * ptr);// VLD1.64 {d0, d1, d2, d3}, [r0]float16x4x4_t vld4_dup_f16(__transfersize(4) __fp16 const * ptr);// VLD4.16 {d0[], d1[], d2[], d3[]}, [r0]float32x2x4_t vld4_dup_f32(__transfersize(4) float32_t const * ptr);// VLD4.32 {d0[], d1[], d2[], d3[]}, [r0]poly8x8x4_t vld4_dup_p8(__transfersize(4) poly8_t const * ptr);// VLD4.8 {d0[], d1[], d2[], d3[]}, [r0]poly16x4x4_t vld4_dup_p16(__transfersize(4) poly16_t const * ptr);// VLD4.16 {d0[], d1[], d2[], d3[]}, [r0]uint16x8x2_t vld2q_lane_u16(__transfersize(2) uint16_t const * ptr, uint16x8x2_t src,__constrange(0,7) int lane);// VLD2.16 {d0[0], d2[0]}, [r0]uint32x4x2_t vld2q_lane_u32(__transfersize(2) uint32_t const * ptr, uint32x4x2_t src,__constrange(0,3) int lane);// VLD2.32 {d0[0], d2[0]}, [r0]int16x8x2_t vld2q_lane_s16(__transfersize(2) int16_t const * ptr, int16x8x2_t src, __constrange(0,7)int lane);// VLD2.16 {d0[0], d2[0]}, [r0]int32x4x2_t vld2q_lane_s32(__transfersize(2) int32_t const * ptr, int32x4x2_t src, __constrange(0,3)int lane);// VLD2.32 {d0[0], d2[0]}, [r0]float16x8x2_t vld2q_lane_f16(__transfersize(2) __fp16 const * ptr, float16x8x2_t src, __constrange(0,7)int lane);// VLD2.16 {d0[0], d2[0]}, [r0]float32x4x2_t vld2q_lane_f32(__transfersize(2) float32_t const * ptr, float32x4x2_t src,__constrange(0,3) int lane);// VLD2.32 {d0[0], d2[0]}, [r0]poly16x8x2_t vld2q_lane_p16(__transfersize(2) poly16_t const * ptr, poly16x8x2_t src,__constrange(0,7) int lane);// VLD2.16 {d0[0], d2[0]}, [r0]uint8x8x2_t vld2_lane_u8(__transfersize(2) uint8_t const * ptr, uint8x8x2_t src, __constrange(0,7) intlane);// VLD2.8 {d0[0], d1[0]}, [r0]uint16x4x2_t vld2_lane_u16(__transfersize(2) uint16_t const * ptr, uint16x4x2_t src, __constrange(0,3)int lane);// VLD2.16 {d0[0], d1[0]}, [r0]uint32x2x2_t vld2_lane_u32(__transfersize(2) uint32_t const * ptr, uint32x2x2_t src, __constrange(0,1)int lane);// VLD2.32 {d0[0], d1[0]}, [r0]int8x8x2_t vld2_lane_s8(__transfersize(2) int8_t const * ptr, int8x8x2_t src, __constrange(0,7) intlane);// VLD2.8 {d0[0], d1[0]}, [r0]<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-35ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持int16x4x2_t vld2_lane_s16(__transfersize(2) int16_t const * ptr, int16x4x2_t src, __constrange(0,3) intlane);// VLD2.16 {d0[0], d1[0]}, [r0]int32x2x2_t vld2_lane_s32(__transfersize(2) int32_t const * ptr, int32x2x2_t src, __constrange(0,1) intlane);// VLD2.32 {d0[0], d1[0]}, [r0]float16x4x2_t vld2_lane_f32(__transfersize(2) __fp16 const * ptr, float16x4x2_t src, __constrange(0,3)int lane);// VLD2.16 {d0[0], d1[0]}, [r0]float32x2x2_t vld2_lane_f32(__transfersize(2) float32_t const * ptr, float32x2x2_t src,__constrange(0,1) int lane);// VLD2.32 {d0[0], d1[0]}, [r0]poly8x8x2_t vld2_lane_p8(__transfersize(2) poly8_t const * ptr, poly8x8x2_t src, __constrange(0,7) intlane);// VLD2.8 {d0[0], d1[0]}, [r0]poly16x4x2_t vld2_lane_p16(__transfersize(2) poly16_t const * ptr, poly16x4x2_t src, __constrange(0,3)int lane);// VLD2.16 {d0[0], d1[0]}, [r0]uint16x8x3_t vld3q_lane_u16(__transfersize(3) uint16_t const * ptr, uint16x8x3_t src,__constrange(0,7) int lane);// VLD3.16 {d0[0], d2[0], d4[0]}, [r0]uint32x4x3_t vld3q_lane_u32(__transfersize(3) uint32_t const * ptr, uint32x4x3_t src,__constrange(0,3) int lane);// VLD3.32 {d0[0], d2[0], d4[0]}, [r0]int16x8x3_t vld3q_lane_s16(__transfersize(3) int16_t const * ptr, int16x8x3_t src, __constrange(0,7)int lane);// VLD3.16 {d0[0], d2[0], d4[0]}, [r0]int32x4x3_t vld3q_lane_s32(__transfersize(3) int32_t const * ptr, int32x4x3_t src, __constrange(0,3)int lane);// VLD3.32 {d0[0], d2[0], d4[0]}, [r0]float16x8x3_t vld3q_lane_f32(__transfersize(3) __fp16 const * ptr, float16x8x3_t src, __constrange(0,7)int lane);// VLD3.16 {d0[0], d2[0], d4[0]}, [r0]float32x4x3_t vld3q_lane_f32(__transfersize(3) float32_t const * ptr, float32x4x3_t src,__constrange(0,3) int lane);// VLD3.32 {d0[0], d2[0], d4[0]}, [r0]poly16x8x3_t vld3q_lane_p16(__transfersize(3) poly16_t const * ptr, poly16x8x3_t src,__constrange(0,7) int lane);// VLD3.16 {d0[0], d2[0], d4[0]}, [r0]uint8x8x3_t vld3_lane_u8(__transfersize(3) uint8_t const * ptr, uint8x8x3_t src, __constrange(0,7) intlane);// VLD3.8 {d0[0], d1[0], d2[0]}, [r0]uint16x4x3_t vld3_lane_u16(__transfersize(3) uint16_t const * ptr, uint16x4x3_t src, __constrange(0,3)int lane);// VLD3.16 {d0[0], d1[0], d2[0]}, [r0]uint32x2x3_t vld3_lane_u32(__transfersize(3) uint32_t const * ptr, uint32x2x3_t src, __constrange(0,1)int lane);// VLD3.32 {d0[0], d1[0], d2[0]}, [r0]int8x8x3_t vld3_lane_s8(__transfersize(3) int8_t const * ptr, int8x8x3_t src, __constrange(0,7) intE-36 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持lane);// VLD3.8 {d0[0], d1[0], d2[0]}, [r0]int16x4x3_t vld3_lane_s16(__transfersize(3) int16_t const * ptr, int16x4x3_t src, __constrange(0,3) intlane);// VLD3.16 {d0[0], d1[0], d2[0]}, [r0]int32x2x3_t vld3_lane_s32(__transfersize(3) int32_t const * ptr, int32x2x3_t src, __constrange(0,1) intlane);// VLD3.32 {d0[0], d1[0], d2[0]}, [r0]float16x4x3_t vld3_lane_f16(__transfersize(3) __fp16 const * ptr, float16x4x3_t src, __constrange(0,3)int lane);// VLD3.16 {d0[0], d1[0], d2[0]}, [r0]float32x2x3_t vld3_lane_f32(__transfersize(3) float32_t const * ptr, float32x2x3_t src,__constrange(0,1) int lane);// VLD3.32 {d0[0], d1[0], d2[0]}, [r0]poly8x8x3_t vld3_lane_p8(__transfersize(3) poly8_t const * ptr, poly8x8x3_t src, __constrange(0,7) intlane);// VLD3.8 {d0[0], d1[0], d2[0]}, [r0]poly16x4x3_t vld3_lane_p16(__transfersize(3) poly16_t const * ptr, poly16x4x3_t src, __constrange(0,3)int lane);// VLD3.16 {d0[0], d1[0], d2[0]}, [r0]uint16x8x4_t vld4q_lane_u16(__transfersize(4) uint16_t const * ptr, uint16x8x4_t src,__constrange(0,7) int lane);// VLD4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0]uint32x4x4_t vld4q_lane_u32(__transfersize(4) uint32_t const * ptr, uint32x4x4_t src,__constrange(0,3) int lane);// VLD4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0]int16x8x4_t vld4q_lane_s16(__transfersize(4) int16_t const * ptr, int16x8x4_t src, __constrange(0,7)int lane);// VLD4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0]int32x4x4_t vld4q_lane_s32(__transfersize(4) int32_t const * ptr, int32x4x4_t src, __constrange(0,3)int lane);// VLD4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0]float16x8x4_t vld4q_lane_f32(__transfersize(4) __fp16 const * ptr, float16x8x4_t src, __constrange(0,7)int lane);// VLD4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0]float32x4x4_t vld4q_lane_f32(__transfersize(4) float32_t const * ptr, float32x4x4_t src,__constrange(0,3) int lane);// VLD4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0]poly16x8x4_t vld4q_lane_p16(__transfersize(4) poly16_t const * ptr, poly16x8x4_t src,__constrange(0,7) int lane);// VLD4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0]uint8x8x4_t vld4_lane_u8(__transfersize(4) uint8_t const * ptr, uint8x8x4_t src, __constrange(0,7) intlane);// VLD4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0]uint16x4x4_t vld4_lane_u16(__transfersize(4) uint16_t const * ptr, uint16x4x4_t src, __constrange(0,3)int lane);// VLD4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0]uint32x2x4_t vld4_lane_u32(__transfersize(4) uint32_t const * ptr, uint32x2x4_t src, __constrange(0,1)int lane);<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-37ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持// VLD4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0]int8x8x4_t vld4_lane_s8(__transfersize(4) int8_t const * ptr, int8x8x4_t src, __constrange(0,7) intlane);// VLD4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0]int16x4x4_t vld4_lane_s16(__transfersize(4) int16_t const * ptr, int16x4x4_t src, __constrange(0,3) intlane);// VLD4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0]int32x2x4_t vld4_lane_s32(__transfersize(4) int32_t const * ptr, int32x2x4_t src, __constrange(0,1) intlane);// VLD4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0]float16x4x4_t vld4_lane_f16(__transfersize(4) __fp16 const * ptr, float16x4x4_t src, __constrange(0,3)int lane);// VLD4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0]float32x2x4_t vld4_lane_f32(__transfersize(4) float32_t const * ptr, float32x2x4_t src,__constrange(0,1) int lane);// VLD4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0]poly8x8x4_t vld4_lane_p8(__transfersize(4) poly8_t const * ptr, poly8x8x4_t src, __constrange(0,7) intlane);// VLD4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0]poly16x4x4_t vld4_lane_p16(__transfersize(4) poly16_t const * ptr, poly16x4x4_t src, __constrange(0,3)int lane);// VLD4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0]void vst2q_u8(__transfersize(32) uint8_t * ptr, uint8x16x2_t val);// VST2.8 {d0, d2}, [r0]void vst2q_u16(__transfersize(16) uint16_t * ptr, uint16x8x2_t val);// VST2.16 {d0, d2}, [r0]void vst2q_u32(__transfersize(8) uint32_t * ptr, uint32x4x2_t val);// VST2.32 {d0, d2}, [r0]void vst2q_s8(__transfersize(32) int8_t * ptr, int8x16x2_t val);// VST2.8 {d0, d2}, [r0]void vst2q_s16(__transfersize(16) int16_t * ptr, int16x8x2_t val);// VST2.16 {d0, d2}, [r0]void vst2q_s32(__transfersize(8) int32_t * ptr, int32x4x2_t val);// VST2.32 {d0, d2}, [r0]void vst2q_f16(__transfersize(16) __fp16 * ptr, float16x8x2_t val);// VST2.16 {d0, d2}, [r0]void vst2q_f32(__transfersize(8) float32_t * ptr, float32x4x2_t val);// VST2.32 {d0, d2}, [r0]void vst2q_p8(__transfersize(32) poly8_t * ptr, poly8x16x2_t val);// VST2.8 {d0, d2}, [r0]void vst2q_p16(__transfersize(16) poly16_t * ptr, poly16x8x2_t val);// VST2.16 {d0, d2}, [r0]void vst2_u8(__transfersize(16) uint8_t * ptr, uint8x8x2_t val);// VST2.8 {d0, d1}, [r0]void vst2_u16(__transfersize(8) uint16_t * ptr, uint16x4x2_t val);// VST2.16 {d0, d1}, [r0]void vst2_u32(__transfersize(4) uint32_t * ptr, uint32x2x2_t val);// VST2.32 {d0, d1}, [r0]void vst2_u64(__transfersize(2) uint64_t * ptr, uint64x1x2_t val);E-38 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持// VST1.64 {d0, d1}, [r0]void vst2_s8(__transfersize(16) int8_t * ptr, int8x8x2_t val);// VST2.8 {d0, d1}, [r0]void vst2_s16(__transfersize(8) int16_t * ptr, int16x4x2_t val);// VST2.16 {d0, d1}, [r0]void vst2_s32(__transfersize(4) int32_t * ptr, int32x2x2_t val);// VST2.32 {d0, d1}, [r0]void vst2_s64(__transfersize(2) int64_t * ptr, int64x1x2_t val);// VST1.64 {d0, d1}, [r0]void vst2_f16(__transfersize(8) __fp16 * ptr, float16x4x2_t val);// VST2.16 {d0, d1}, [r0]void vst2_f32(__transfersize(4) float32_t * ptr, float32x2x2_t val);// VST2.32 {d0, d1}, [r0]void vst2_p8(__transfersize(16) poly8_t * ptr, poly8x8x2_t val);// VST2.8 {d0, d1}, [r0]void vst2_p16(__transfersize(8) poly16_t * ptr, poly16x4x2_t val);// VST2.16 {d0, d1}, [r0]void vst3q_u8(__transfersize(48) uint8_t * ptr, uint8x16x3_t val);// VST3.8 {d0, d2, d4}, [r0]void vst3q_u16(__transfersize(24) uint16_t * ptr, uint16x8x3_t val);// VST3.16 {d0, d2, d4}, [r0]void vst3q_u32(__transfersize(12) uint32_t * ptr, uint32x4x3_t val);// VST3.32 {d0, d2, d4}, [r0]void vst3q_s8(__transfersize(48) int8_t * ptr, int8x16x3_t val);// VST3.8 {d0, d2, d4}, [r0]void vst3q_s16(__transfersize(24) int16_t * ptr, int16x8x3_t val);// VST3.16 {d0, d2, d4}, [r0]void vst3q_s32(__transfersize(12) int32_t * ptr, int32x4x3_t val);// VST3.32 {d0, d2, d4}, [r0]void vst3q_f16(__transfersize(24) __fp16 * ptr, float16x8x3_t val);// VST3.16 {d0, d2, d4}, [r0]void vst3q_f32(__transfersize(12) float32_t * ptr, float32x4x3_t val);// VST3.32 {d0, d2, d4}, [r0]void vst3q_p8(__transfersize(48) poly8_t * ptr, poly8x16x3_t val);// VST3.8 {d0, d2, d4}, [r0]void vst3q_p16(__transfersize(24) poly16_t * ptr, poly16x8x3_t val);// VST3.16 {d0, d2, d4}, [r0]void vst3_u8(__transfersize(24) uint8_t * ptr, uint8x8x3_t val);// VST3.8 {d0, d1, d2}, [r0]void vst3_u16(__transfersize(12) uint16_t * ptr, uint16x4x3_t val);// VST3.16 {d0, d1, d2}, [r0]void vst3_u32(__transfersize(6) uint32_t * ptr, uint32x2x3_t val);// VST3.32 {d0, d1, d2}, [r0]void vst3_u64(__transfersize(3) uint64_t * ptr, uint64x1x3_t val);// VST1.64 {d0, d1, d2}, [r0]void vst3_s8(__transfersize(24) int8_t * ptr, int8x8x3_t val);// VST3.8 {d0, d1, d2}, [r0]void vst3_s16(__transfersize(12) int16_t * ptr, int16x4x3_t val);// VST3.16 {d0, d1, d2}, [r0]<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-39ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持void vst3_s32(__transfersize(6) int32_t * ptr, int32x2x3_t val);// VST3.32 {d0, d1, d2}, [r0]void vst3_s64(__transfersize(3) int64_t * ptr, int64x1x3_t val);// VST1.64 {d0, d1, d2}, [r0]void vst3_f16(__transfersize(12) __fp16 * ptr, float16x4x3_t val);// VST3.16 {d0, d1, d2}, [r0]void vst3_f32(__transfersize(6) float32_t * ptr, float32x2x3_t val);// VST3.32 {d0, d1, d2}, [r0]void vst3_p8(__transfersize(24) poly8_t * ptr, poly8x8x3_t val);// VST3.8 {d0, d1, d2}, [r0]void vst3_p16(__transfersize(12) poly16_t * ptr, poly16x4x3_t val);// VST3.16 {d0, d1, d2}, [r0]void vst4q_u8(__transfersize(64) uint8_t * ptr, uint8x16x4_t val);// VST4.8 {d0, d2, d4, d6}, [r0]void vst4q_u16(__transfersize(32) uint16_t * ptr, uint16x8x4_t val);// VST4.16 {d0, d2, d4, d6}, [r0]void vst4q_u32(__transfersize(16) uint32_t * ptr, uint32x4x4_t val);// VST4.32 {d0, d2, d4, d6}, [r0]void vst4q_s8(__transfersize(64) int8_t * ptr, int8x16x4_t val);// VST4.8 {d0, d2, d4, d6}, [r0]void vst4q_s16(__transfersize(32) int16_t * ptr, int16x8x4_t val);// VST4.16 {d0, d2, d4, d6}, [r0]void vst4q_s32(__transfersize(16) int32_t * ptr, int32x4x4_t val);// VST4.32 {d0, d2, d4, d6}, [r0]void vst4q_f16(__transfersize(32) __fp16 * ptr, float16x8x4_t val);// VST4.16 {d0, d2, d4, d6}, [r0]void vst4q_f32(__transfersize(16) float32_t * ptr, float32x4x4_t val);// VST4.32 {d0, d2, d4, d6}, [r0]void vst4q_p8(__transfersize(64) poly8_t * ptr, poly8x16x4_t val);// VST4.8 {d0, d2, d4, d6}, [r0]void vst4q_p16(__transfersize(32) poly16_t * ptr, poly16x8x4_t val);// VST4.16 {d0, d2, d4, d6}, [r0]void vst4_u8(__transfersize(32) uint8_t * ptr, uint8x8x4_t val);// VST4.8 {d0, d1, d2, d3}, [r0]void vst4_u16(__transfersize(16) uint16_t * ptr, uint16x4x4_t val);// VST4.16 {d0, d1, d2, d3}, [r0]void vst4_u32(__transfersize(8) uint32_t * ptr, uint32x2x4_t val);// VST4.32 {d0, d1, d2, d3}, [r0]void vst4_u64(__transfersize(4) uint64_t * ptr, uint64x1x4_t val);// VST1.64 {d0, d1, d2, d3}, [r0]void vst4_s8(__transfersize(32) int8_t * ptr, int8x8x4_t val);// VST4.8 {d0, d1, d2, d3}, [r0]void vst4_s16(__transfersize(16) int16_t * ptr, int16x4x4_t val);// VST4.16 {d0, d1, d2, d3}, [r0]void vst4_s32(__transfersize(8) int32_t * ptr, int32x2x4_t val);// VST4.32 {d0, d1, d2, d3}, [r0]void vst4_s64(__transfersize(4) int64_t * ptr, int64x1x4_t val);// VST1.64 {d0, d1, d2, d3}, [r0]void vst4_f16(__transfersize(16) __fp16 * ptr, float16x4x4_t val);E-40 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持// VST4.16 {d0, d1, d2, d3}, [r0]void vst4_f32(__transfersize(8) float32_t * ptr, float32x2x4_t val);// VST4.32 {d0, d1, d2, d3}, [r0]void vst4_p8(__transfersize(32) poly8_t * ptr, poly8x8x4_t val);// VST4.8 {d0, d1, d2, d3}, [r0]void vst4_p16(__transfersize(16) poly16_t * ptr, poly16x4x4_t val);// VST4.16 {d0, d1, d2, d3}, [r0]void vst2q_lane_u16(__transfersize(2) uint16_t * ptr, uint16x8x2_t val, __constrange(0,7) int lane);// VST2.16 {d0[0], d2[0]}, [r0]void vst2q_lane_u32(__transfersize(2) uint32_t * ptr, uint32x4x2_t val, __constrange(0,3) int lane);// VST2.32 {d0[0], d2[0]}, [r0]void vst2q_lane_s16(__transfersize(2) int16_t * ptr, int16x8x2_t val, __constrange(0,7) int lane);// VST2.16 {d0[0], d2[0]}, [r0]void vst2q_lane_s32(__transfersize(2) int32_t * ptr, int32x4x2_t val, __constrange(0,3) int lane);// VST2.32 {d0[0], d2[0]}, [r0]void vst2q_lane_f16(__transfersize(2) __fp16 * ptr, float16x8x2_t val, __constrange(0,7) int lane);// VST2.16 {d0[0], d2[0]}, [r0]void vst2q_lane_f32(__transfersize(2) float32_t * ptr, float32x4x2_t val, __constrange(0,3) int lane);// VST2.32 {d0[0], d2[0]}, [r0]void vst2q_lane_p16(__transfersize(2) poly16_t * ptr, poly16x8x2_t val, __constrange(0,7) int lane);// VST2.16 {d0[0], d2[0]}, [r0]void vst2_lane_u8(__transfersize(2) uint8_t * ptr, uint8x8x2_t val, __constrange(0,7) int lane);// VST2.8 {d0[0], d1[0]}, [r0]void vst2_lane_u16(__transfersize(2) uint16_t * ptr, uint16x4x2_t val, __constrange(0,3) int lane);// VST2.16 {d0[0], d1[0]}, [r0]void vst2_lane_u32(__transfersize(2) uint32_t * ptr, uint32x2x2_t val, __constrange(0,1) int lane);// VST2.32 {d0[0], d1[0]}, [r0]void vst2_lane_s8(__transfersize(2) int8_t * ptr, int8x8x2_t val, __constrange(0,7) int lane);// VST2.8 {d0[0], d1[0]}, [r0]void vst2_lane_s16(__transfersize(2) int16_t * ptr, int16x4x2_t val, __constrange(0,3) int lane);// VST2.16 {d0[0], d1[0]}, [r0]void vst2_lane_s32(__transfersize(2) int32_t * ptr, int32x2x2_t val, __constrange(0,1) int lane);// VST2.32 {d0[0], d1[0]}, [r0]void vst2_lane_f16(__transfersize(2) __fp16 * ptr, float16x4x2_t val, __constrange(0,3) int lane);// VST2.16 {d0[0], d1[0]}, [r0]void vst2_lane_f32(__transfersize(2) float32_t * ptr, float32x2x2_t val, __constrange(0,1) int lane);// VST2.32 {d0[0], d1[0]}, [r0]void vst2_lane_p8(__transfersize(2) poly8_t * ptr, poly8x8x2_t val, __constrange(0,7) int lane);// VST2.8 {d0[0], d1[0]}, [r0]void vst2_lane_p16(__transfersize(2) poly16_t * ptr, poly16x4x2_t val, __constrange(0,3) int lane);// VST2.16 {d0[0], d1[0]}, [r0]void vst3q_lane_u16(__transfersize(3) uint16_t * ptr, uint16x8x3_t val, __constrange(0,7) int lane);// VST3.16 {d0[0], d2[0], d4[0]}, [r0]void vst3q_lane_u32(__transfersize(3) uint32_t * ptr, uint32x4x3_t val, __constrange(0,3) int lane);// VST3.32 {d0[0], d2[0], d4[0]}, [r0]void vst3q_lane_s16(__transfersize(3) int16_t * ptr, int16x8x3_t val, __constrange(0,7) int lane);// VST3.16 {d0[0], d2[0], d4[0]}, [r0]void vst3q_lane_s32(__transfersize(3) int32_t * ptr, int32x4x3_t val, __constrange(0,3) int lane);// VST3.32 {d0[0], d2[0], d4[0]}, [r0]<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-41ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持void vst3q_lane_f16(__transfersize(3) __fp16 * ptr, float16x8x3_t val, __constrange(0,7) int lane);// VST3.16 {d0[0], d2[0], d4[0]}, [r0]void vst3q_lane_f32(__transfersize(3) float32_t * ptr, float32x4x3_t val, __constrange(0,3) int lane);// VST3.32 {d0[0], d2[0], d4[0]}, [r0]void vst3q_lane_p16(__transfersize(3) poly16_t * ptr, poly16x8x3_t val, __constrange(0,7) int lane);// VST3.16 {d0[0], d2[0], d4[0]}, [r0]void vst3_lane_u8(__transfersize(3) uint8_t * ptr, uint8x8x3_t val, __constrange(0,7) int lane);// VST3.8 {d0[0], d1[0], d2[0]}, [r0]void vst3_lane_u16(__transfersize(3) uint16_t * ptr, uint16x4x3_t val, __constrange(0,3) int lane);// VST3.16 {d0[0], d1[0], d2[0]}, [r0]void vst3_lane_u32(__transfersize(3) uint32_t * ptr, uint32x2x3_t val, __constrange(0,1) int lane);// VST3.32 {d0[0], d1[0], d2[0]}, [r0]void vst3_lane_s8(__transfersize(3) int8_t * ptr, int8x8x3_t val, __constrange(0,7) int lane);// VST3.8 {d0[0], d1[0], d2[0]}, [r0]void vst3_lane_s16(__transfersize(3) int16_t * ptr, int16x4x3_t val, __constrange(0,3) int lane);// VST3.16 {d0[0], d1[0], d2[0]}, [r0]void vst3_lane_s32(__transfersize(3) int32_t * ptr, int32x2x3_t val, __constrange(0,1) int lane);// VST3.32 {d0[0], d1[0], d2[0]}, [r0]void vst3_lane_f16(__transfersize(3) __fp16 * ptr, float16x4x3_t val, __constrange(0,3) int lane);// VST3.16 {d0[0], d1[0], d2[0]}, [r0]void vst3_lane_f32(__transfersize(3) float32_t * ptr, float32x2x3_t val, __constrange(0,1) int lane);// VST3.32 {d0[0], d1[0], d2[0]}, [r0]void vst3_lane_p8(__transfersize(3) poly8_t * ptr, poly8x8x3_t val, __constrange(0,7) int lane);// VST3.8 {d0[0], d1[0], d2[0]}, [r0]void vst3_lane_p16(__transfersize(3) poly16_t * ptr, poly16x4x3_t val, __constrange(0,3) int lane);// VST3.16 {d0[0], d1[0], d2[0]}, [r0]void vst4q_lane_u16(__transfersize(4) uint16_t * ptr, uint16x8x4_t val, __constrange(0,7) int lane);// VST4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0]void vst4q_lane_u32(__transfersize(4) uint32_t * ptr, uint32x4x4_t val, __constrange(0,3) int lane);// VST4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0]void vst4q_lane_s16(__transfersize(4) int16_t * ptr, int16x8x4_t val, __constrange(0,7) int lane);// VST4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0]void vst4q_lane_s32(__transfersize(4) int32_t * ptr, int32x4x4_t val, __constrange(0,3) int lane);// VST4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0]void vst4q_lane_f16(__transfersize(4) __fp16 * ptr, float16x8x4_t val, __constrange(0,7) int lane);// VST4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0]void vst4q_lane_f32(__transfersize(4) float32_t * ptr, float32x4x4_t val, __constrange(0,3) int lane);// VST4.32 {d0[0], d2[0], d4[0], d6[0]}, [r0]void vst4q_lane_p16(__transfersize(4) poly16_t * ptr, poly16x8x4_t val, __constrange(0,7) int lane);// VST4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0]void vst4_lane_u8(__transfersize(4) uint8_t * ptr, uint8x8x4_t val, __constrange(0,7) int lane);// VST4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0]void vst4_lane_u16(__transfersize(4) uint16_t * ptr, uint16x4x4_t val, __constrange(0,3) int lane);// VST4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0]void vst4_lane_u32(__transfersize(4) uint32_t * ptr, uint32x2x4_t val, __constrange(0,1) int lane);// VST4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0]void vst4_lane_s8(__transfersize(4) int8_t * ptr, int8x8x4_t val, __constrange(0,7) int lane);// VST4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0]void vst4_lane_s16(__transfersize(4) int16_t * ptr, int16x4x4_t val, __constrange(0,3) int lane);E-42 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持// VST4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0]void vst4_lane_s32(__transfersize(4) int32_t * ptr, int32x2x4_t val, __constrange(0,1) int lane);// VST4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0]void vst4_lane_f16(__transfersize(4) __fp16 * ptr, float16x4x4_t val, __constrange(0,3) int lane);// VST4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0]void vst4_lane_f32(__transfersize(4) float32_t * ptr, float32x2x4_t val, __constrange(0,1) int lane);// VST4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0]void vst4_lane_p8(__transfersize(4) poly8_t * ptr, poly8x8x4_t val, __constrange(0,7) int lane);// VST4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0]void vst4_lane_p16(__transfersize(4) poly16_t * ptr, poly16x4x4_t val, __constrange(0,3) int lane);// VST4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0]E.3.16从 向 量 提 取 向 量 线以 下 内 在 函 数 从 向 量 提 取 单 条 向 量 线 ( 元 素 )。uint8_t vget_lane_u8(uint8x8_t vec, __constrange(0,7) int lane); // VMOV.U8 r0, d0[0]uint16_t vget_lane_u16(uint16x4_t vec, __constrange(0,3) int lane); // VMOV.U16 r0, d0[0]uint32_t vget_lane_u32(uint32x2_t vec, __constrange(0,1) int lane); // VMOV.32 r0, d0[0]int8_t vget_lane_s8(int8x8_t vec, __constrange(0,7) int lane); // VMOV.S8 r0, d0[0]int16_t vget_lane_s16(int16x4_t vec, __constrange(0,3) int lane); // VMOV.S16 r0, d0[0]int32_t vget_lane_s32(int32x2_t vec, __constrange(0,1) int lane); // VMOV.32 r0, d0[0]poly8_t vget_lane_p8(poly8x8_t vec, __constrange(0,7) int lane); // VMOV.U8 r0, d0[0]poly16_t vget_lane_p16(poly16x4_t vec, __constrange(0,3) int lane); // VMOV.U16 r0, d0[0]float32_t vget_lane_f32(float32x2_t vec, __constrange(0,1) int lane); // VMOV.32 r0, d0[0]uint8_t vgetq_lane_u8(uint8x16_t vec, __constrange(0,15) int lane); // VMOV.U8 r0, d0[0]uint16_t vgetq_lane_u16(uint16x8_t vec, __constrange(0,7) int lane); // VMOV.U16 r0, d0[0]uint32_t vgetq_lane_u32(uint32x4_t vec, __constrange(0,3) int lane); // VMOV.32 r0, d0[0]int8_t vgetq_lane_s8(int8x16_t vec, __constrange(0,15) int lane); // VMOV.S8 r0, d0[0]int16_t vgetq_lane_s16(int16x8_t vec, __constrange(0,7) int lane); // VMOV.S16 r0, d0[0]int32_t vgetq_lane_s32(int32x4_t vec, __constrange(0,3) int lane); // VMOV.32 r0, d0[0]poly8_t vgetq_lane_p8(poly8x16_t vec, __constrange(0,15) int lane); // VMOV.U8 r0, d0[0]poly16_t vgetq_lane_p16(poly16x8_t vec, __constrange(0,7) int lane); // VMOV.U16 r0, d0[0]float32_t vgetq_lane_f32(float32x4_t vec, __constrange(0,3) int lane); // VMOV.32 r0, d0[0]int64_t vget_lane_s64(int64x1_t vec, __constrange(0,0) int lane); // VMOV r0,r0,d0uint64_t vget_lane_u64(uint64x1_t vec, __constrange(0,0) int lane); // VMOV r0,r0,d0int64_t vgetq_lane_s64(int64x2_t vec, __constrange(0,1) int lane); // VMOV r0,r0,d0uint64_t vgetq_lane_u64(uint64x2_t vec, __constrange(0,1) int lane); // VMOV r0,r0,d0E.3.17在 向 量 内 设 置 向 量 线以 下 内 在 函 数 在 向 量 内 设 置 单 条 向 量 线 ( 元 素 )。uint8x8_t vset_lane_u8(uint8_t value, uint8x8_t vec, __constrange(0,7) int lane);// VMOV.8 d0[0],r0uint16x4_t vset_lane_u16(uint16_t value, uint16x4_t vec, __constrange(0,3) int lane);// VMOV.16 d0[0],r0uint32x2_t vset_lane_u32(uint32_t value, uint32x2_t vec, __constrange(0,1) int lane);// VMOV.32 d0[0],r0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-43ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持int8x8_t vset_lane_s8(int8_t value, int8x8_t vec, __constrange(0,7) int lane);// VMOV.8 d0[0],r0int16x4_t vset_lane_s16(int16_t value, int16x4_t vec, __constrange(0,3) int lane);// VMOV.16 d0[0],r0int32x2_t vset_lane_s32(int32_t value, int32x2_t vec, __constrange(0,1) int lane);// VMOV.32 d0[0],r0poly8x8_t vset_lane_p8(poly8_t value, poly8x8_t vec, __constrange(0,7) int lane);// VMOV.8 d0[0],r0poly16x4_t vset_lane_p16(poly16_t value, poly16x4_t vec, __constrange(0,3) int lane);// VMOV.16 d0[0],r0float32x2_t vset_lane_f32(float32_t value, float32x2_t vec, __constrange(0,1) int lane);// VMOV.32 d0[0],r0uint8x16_t vsetq_lane_u8(uint8_t value, uint8x16_t vec, __constrange(0,15) int lane);// VMOV.8 d0[0],r0uint16x8_t vsetq_lane_u16(uint16_t value, uint16x8_t vec, __constrange(0,7) int lane);// VMOV.16 d0[0],r0uint32x4_t vsetq_lane_u32(uint32_t value, uint32x4_t vec, __constrange(0,3) int lane);// VMOV.32 d0[0],r0int8x16_t vsetq_lane_s8(int8_t value, int8x16_t vec, __constrange(0,15) int lane);// VMOV.8 d0[0],r0int16x8_t vsetq_lane_s16(int16_t value, int16x8_t vec, __constrange(0,7) int lane);// VMOV.16 d0[0],r0int32x4_t vsetq_lane_s32(int32_t value, int32x4_t vec, __constrange(0,3) int lane);// VMOV.32 d0[0],r0poly8x16_t vsetq_lane_p8(poly8_t value, poly8x16_t vec, __constrange(0,15) int lane);// VMOV.8 d0[0],r0poly16x8_t vsetq_lane_p16(poly16_t value, poly16x8_t vec, __constrange(0,7) int lane);// VMOV.16 d0[0],r0float32x4_t vsetq_lane_f32(float32_t value, float32x4_t vec, __constrange(0,3) int lane);// VMOV.32 d0[0],r0int64x1_t vset_lane_s64(int64_t value, int64x1_t vec, __constrange(0,0) int lane);// VMOV d0,r0,r0uint64x1_t vset_lane_u64(uint64_t value, uint64x1_t vec, __constrange(0,0) int lane);// VMOV d0,r0,r0int64x2_t vsetq_lane_s64(int64_t value, int64x2_t vec, __constrange(0,1) int lane);// VMOV d0,r0,r0uint64x2_t vsetq_lane_u64(uint64_t value, uint64x2_t vec, __constrange(0,1) int lane);// VMOV d0,r0,r0E.3.18从 位 模 式 初 始 化 向 量以 下 内 在 函 数 从 文 字 位 模 式 创 建 向 量 。int8x8_t vcreate_s8(uint64_t a); // VMOV d0,r0,r0int16x4_t vcreate_s16(uint64_t a); // VMOV d0,r0,r0int32x2_t vcreate_s32(uint64_t a); // VMOV d0,r0,r0float16x4_t vcreate_f16(uint64_t a); // VMOV d0,r0,r0float32x2_t vcreate_f32(uint64_t a); // VMOV d0,r0,r0uint8x8_t vcreate_u8(uint64_t a); // VMOV d0,r0,r0E-44 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持uint16x4_t vcreate_u16(uint64_t a); // VMOV d0,r0,r0uint32x2_t vcreate_u32(uint64_t a); // VMOV d0,r0,r0uint64x1_t vcreate_u64(uint64_t a); // VMOV d0,r0,r0poly8x8_t vcreate_p8(uint64_t a); // VMOV d0,r0,r0poly16x4_t vcreate_p16(uint64_t a); // VMOV d0,r0,r0int64x1_t vcreate_s64(uint64_t a); // VMOV d0,r0,r0E.3.19将 所 有 向 量 线 设 置 为 相 同 的 值以 下 内 在 函 数 将 所 有 向 量 线 设 置 为 相 同 的 值 。将 所 有 向 量 线 设 置 为 相 同 的 值uint8x8_t vdup_n_u8(uint8_t value); // VDUP.8 d0,r0uint16x4_t vdup_n_u16(uint16_t value); // VDUP.16 d0,r0uint32x2_t vdup_n_u32(uint32_t value); // VDUP.32 d0,r0int8x8_t vdup_n_s8(int8_t value); // VDUP.8 d0,r0int16x4_t vdup_n_s16(int16_t value); // VDUP.16 d0,r0int32x2_t vdup_n_s32(int32_t value); // VDUP.32 d0,r0poly8x8_t vdup_n_p8(poly8_t value); // VDUP.8 d0,r0poly16x4_t vdup_n_p16(poly16_t value); // VDUP.16 d0,r0float32x2_t vdup_n_f32(float32_t value); // VDUP.32 d0,r0uint8x16_t vdupq_n_u8(uint8_t value); // VDUP.8 q0,r0uint16x8_t vdupq_n_u16(uint16_t value); // VDUP.16 q0,r0uint32x4_t vdupq_n_u32(uint32_t value); // VDUP.32 q0,r0int8x16_t vdupq_n_s8(int8_t value); // VDUP.8 q0,r0int16x8_t vdupq_n_s16(int16_t value); // VDUP.16 q0,r0int32x4_t vdupq_n_s32(int32_t value); // VDUP.32 q0,r0poly8x16_t vdupq_n_p8(poly8_t value); // VDUP.8 q0,r0poly16x8_t vdupq_n_p16(poly16_t value); // VDUP.16 q0,r0float32x4_t vdupq_n_f32(float32_t value); // VDUP.32 q0,r0int64x1_t vdup_n_s64(int64_t value); // VMOV d0,r0,r0uint64x1_t vdup_n_u64(uint64_t value); // VMOV d0,r0,r0int64x2_t vdupq_n_s64(int64_t value); // VMOV d0,r0,r0uint64x2_t vdupq_n_u64(uint64_t value); // VMOV d0,r0,r0uint8x8_t vmov_n_u8(uint8_t value); // VDUP.8 d0,r0uint16x4_t vmov_n_u16(uint16_t value); // VDUP.16 d0,r0uint32x2_t vmov_n_u32(uint32_t value); // VDUP.32 d0,r0int8x8_t vmov_n_s8(int8_t value); // VDUP.8 d0,r0int16x4_t vmov_n_s16(int16_t value); // VDUP.16 d0,r0int32x2_t vmov_n_s32(int32_t value); // VDUP.32 d0,r0poly8x8_t vmov_n_p8(poly8_t value); // VDUP.8 d0,r0poly16x4_t vmov_n_p16(poly16_t value); // VDUP.16 d0,r0float32x2_t vmov_n_f32(float32_t value); // VDUP.32 d0,r0uint8x16_t vmovq_n_u8(uint8_t value); // VDUP.8 q0,r0uint16x8_t vmovq_n_u16(uint16_t value); // VDUP.16 q0,r0uint32x4_t vmovq_n_u32(uint32_t value); // VDUP.32 q0,r0int8x16_t vmovq_n_s8(int8_t value); // VDUP.8 q0,r0int16x8_t vmovq_n_s16(int16_t value); // VDUP.16 q0,r0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-45ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持int32x4_t vmovq_n_s32(int32_t value); // VDUP.32 q0,r0poly8x16_t vmovq_n_p8(poly8_t value); // VDUP.8 q0,r0poly16x8_t vmovq_n_p16(poly16_t value); // VDUP.16 q0,r0float32x4_t vmovq_n_f32(float32_t value); // VDUP.32 q0,r0int64x1_t vmov_n_s64(int64_t value); // VMOV d0,r0,r0uint64x1_t vmov_n_u64(uint64_t value); // VMOV d0,r0,r0int64x2_t vmovq_n_s64(int64_t value); // VMOV d0,r0,r0uint64x2_t vmovq_n_u64(uint64_t value); // VMOV d0,r0,r0将 向 量 的 所 有 向 量 线 设 置 为 一 条 向 量 线 的 值uint8x8_t vdup_lane_u8(uint8x8_t vec, __constrange(0,7) int lane); // VDUP.8 d0,d0[0]uint16x4_t vdup_lane_u16(uint16x4_t vec, __constrange(0,3) int lane); // VDUP.16 d0,d0[0]uint32x2_t vdup_lane_u32(uint32x2_t vec, __constrange(0,1) int lane); // VDUP.32 d0,d0[0]int8x8_t vdup_lane_s8(int8x8_t vec, __constrange(0,7) int lane); // VDUP.8 d0,d0[0]int16x4_t vdup_lane_s16(int16x4_t vec, __constrange(0,3) int lane); // VDUP.16 d0,d0[0]int32x2_t vdup_lane_s32(int32x2_t vec, __constrange(0,1) int lane); // VDUP.32 d0,d0[0]poly8x8_t vdup_lane_p8(poly8x8_t vec, __constrange(0,7) int lane); // VDUP.8 d0,d0[0]poly16x4_t vdup_lane_p16(poly16x4_t vec, __constrange(0,3) int lane); // VDUP.16 d0,d0[0]float32x2_t vdup_lane_f32(float32x2_t vec, __constrange(0,1) int lane); // VDUP.32 d0,d0[0]uint8x16_t vdupq_lane_u8(uint8x8_t vec, __constrange(0,7) int lane); // VDUP.8 q0,d0[0]uint16x8_t vdupq_lane_u16(uint16x4_t vec, __constrange(0,3) int lane); // VDUP.16 q0,d0[0]uint32x4_t vdupq_lane_u32(uint32x2_t vec, __constrange(0,1) int lane); // VDUP.32 q0,d0[0]int8x16_t vdupq_lane_s8(int8x8_t vec, __constrange(0,7) int lane); // VDUP.8 q0,d0[0]int16x8_t vdupq_lane_s16(int16x4_t vec, __constrange(0,3) int lane); // VDUP.16 q0,d0[0]int32x4_t vdupq_lane_s32(int32x2_t vec, __constrange(0,1) int lane); // VDUP.32 q0,d0[0]poly8x16_t vdupq_lane_p8(poly8x8_t vec, __constrange(0,7) int lane); // VDUP.8 q0,d0[0]poly16x8_t vdupq_lane_p16(poly16x4_t vec, __constrange(0,3) int lane); // VDUP.16 q0,d0[0]float32x4_t vdupq_lane_f32(float32x2_t vec, __constrange(0,1) int lane); // VDUP.32 q0,d0[0]int64x1_t vdup_lane_s64(int64x1_t vec, __constrange(0,0) int lane); // VMOV d0,d0uint64x1_t vdup_lane_u64(uint64x1_t vec, __constrange(0,0) int lane); // VMOV d0,d0int64x2_t vdupq_lane_s64(int64x1_t vec, __constrange(0,0) int lane); // VMOV q0,q0uint64x2_t vdupq_lane_u64(uint64x1_t vec, __constrange(0,0) int lane); // VMOV q0,q0E.3.20组 合 向 量以 下 内 在 函 数 将 两 个 64 位 向 量 组 合 为 单 个 128 位 向 量 。int8x16_t vcombine_s8(int8x8_t low, int8x8_t high); // VMOV d0,d0int16x8_t vcombine_s16(int16x4_t low, int16x4_t high); // VMOV d0,d0int32x4_t vcombine_s32(int32x2_t low, int32x2_t high); // VMOV d0,d0int64x2_t vcombine_s64(int64x1_t low, int64x1_t high); // VMOV d0,d0float16x8_t vcombine_f16(float16x4_t low, float16x4_t high); // VMOV d0,d0float32x4_t vcombine_f32(float32x2_t low, float32x2_t high); // VMOV d0,d0uint8x16_t vcombine_u8(uint8x8_t low, uint8x8_t high); // VMOV d0,d0uint16x8_t vcombine_u16(uint16x4_t low, uint16x4_t high); // VMOV d0,d0uint32x4_t vcombine_u32(uint32x2_t low, uint32x2_t high); // VMOV d0,d0E-46 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持uint64x2_t vcombine_u64(uint64x1_t low, uint64x1_t high);poly8x16_t vcombine_p8(poly8x8_t low, poly8x8_t high);poly16x8_t vcombine_p16(poly16x4_t low, poly16x4_t high);// VMOV d0,d0// VMOV d0,d0// VMOV d0,d0E.3.21拆 分 向 量以 下 内 在 函 数 将 一 个 128 位 向 量 拆 分 为 2 个 64 位 向 量 。int8x8_t vget_high_s8(int8x16_t a); // VMOV d0,d0int16x4_t vget_high_s16(int16x8_t a); // VMOV d0,d0int32x2_t vget_high_s32(int32x4_t a); // VMOV d0,d0int64x1_t vget_high_s64(int64x2_t a); // VMOV d0,d0float16x4_t vget_high_f16(float16x8_t a); // VMOV d0,d0float32x2_t vget_high_f32(float32x4_t a); // VMOV d0,d0uint8x8_t vget_high_u8(uint8x16_t a); // VMOV d0,d0uint16x4_t vget_high_u16(uint16x8_t a); // VMOV d0,d0uint32x2_t vget_high_u32(uint32x4_t a); // VMOV d0,d0uint64x1_t vget_high_u64(uint64x2_t a); // VMOV d0,d0poly8x8_t vget_high_p8(poly8x16_t a); // VMOV d0,d0poly16x4_t vget_high_p16(poly16x8_t a); // VMOV d0,d0int8x8_t vget_low_s8(int8x16_t a); // VMOV d0,d0int16x4_t vget_low_s16(int16x8_t a); // VMOV d0,d0int32x2_t vget_low_s32(int32x4_t a); // VMOV d0,d0int64x1_t vget_low_s64(int64x2_t a); // VMOV d0,d0float16x4_t vget_low_f16(float16x8_t a); // VMOV d0,d0float32x2_t vget_low_f32(float32x4_t a); // VMOV d0,d0uint8x8_t vget_low_u8(uint8x16_t a); // VMOV d0,d0uint16x4_t vget_low_u16(uint16x8_t a); // VMOV d0,d0uint32x2_t vget_low_u32(uint32x4_t a); // VMOV d0,d0uint64x1_t vget_low_u64(uint64x2_t a); // VMOV d0,d0poly8x8_t vget_low_p8(poly8x16_t a); // VMOV d0,d0poly16x4_t vget_low_p16(poly16x8_t a); // VMOV d0,d0E.3.22转 换 向 量以 下 内 在 函 数 用 于 转 换 向 量 。从 浮 点 转 换int32x2_t vcvt_s32_f32(float32x2_t a);// VCVT.S32.F32 d0, d0uint32x2_t vcvt_u32_f32(float32x2_t a);// VCVT.U32.F32 d0, d0int32x4_t vcvtq_s32_f32(float32x4_t a);// VCVT.S32.F32 q0, q0uint32x4_t vcvtq_u32_f32(float32x4_t a);// VCVT.U32.F32 q0, q0int32x2_t vcvt_n_s32_f32(float32x2_t a, __constrange(1,32) int b); // VCVT.S32.F32 d0, d0, #32uint32x2_t vcvt_n_u32_f32(float32x2_t a, __constrange(1,32) int b); // VCVT.U32.F32 d0, d0, #32int32x4_t vcvtq_n_s32_f32(float32x4_t a, __constrange(1,32) int b); // VCVT.S32.F32 q0, q0, #32uint32x4_t vcvtq_n_u32_f32(float32x4_t a, __constrange(1,32) int b); // VCVT.U32.F32 q0, q0, #32<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-47ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持转 换 为 浮 点float32x2_t vcvt_f32_s32(int32x2_t a);// VCVT.F32.S32 d0, d0float32x2_t vcvt_f32_u32(uint32x2_t a);// VCVT.F32.U32 d0, d0float32x4_t vcvtq_f32_s32(int32x4_t a);// VCVT.F32.S32 q0, q0float32x4_t vcvtq_f32_u32(uint32x4_t a);// VCVT.F32.U32 q0, q0float32x2_t vcvt_n_f32_s32(int32x2_t a, __constrange(1,32) int b); // VCVT.F32.S32 d0, d0, #32float32x2_t vcvt_n_f32_u32(uint32x2_t a, __constrange(1,32) int b); // VCVT.F32.U32 d0, d0, #32float32x4_t vcvtq_n_f32_s32(int32x4_t a, __constrange(1,32) int b); // VCVT.F32.S32 q0, q0, #32float32x4_t vcvtq_n_f32_u32(uint32x4_t a, __constrange(1,32) int b); // VCVT.F32.U32 q0, q0, #32在 浮 点 之 间 转 换float16x4_t vcvt_f16_f32(float32x4_t a); // VCVT.F16.F32 d0, q0float32x4_t vcvt_f32_f16(float16x4_t a); // VCVT.F32.F16 q0, d0向 量 窄 型 整 数int8x8_t vmovn_s16(int16x8_t a); // VMOVN.I16 d0,q0int16x4_t vmovn_s32(int32x4_t a); // VMOVN.I32 d0,q0int32x2_t vmovn_s64(int64x2_t a); // VMOVN.I64 d0,q0uint8x8_t vmovn_u16(uint16x8_t a); // VMOVN.I16 d0,q0uint16x4_t vmovn_u32(uint32x4_t a); // VMOVN.I32 d0,q0uint32x2_t vmovn_u64(uint64x2_t a); // VMOVN.I64 d0,q0向 量 长 移int16x8_t vmovl_s8(int8x8_t a); // VMOVL.S8 q0,d0int32x4_t vmovl_s16(int16x4_t a); // VMOVL.S16 q0,d0int64x2_t vmovl_s32(int32x2_t a); // VMOVL.S32 q0,d0uint16x8_t vmovl_u8(uint8x8_t a); // VMOVL.U8 q0,d0uint32x4_t vmovl_u16(uint16x4_t a); // VMOVL.U16 q0,d0uint64x2_t vmovl_u32(uint32x2_t a); // VMOVL.U32 q0,d0向 量 饱 和 窄 型 整 数int8x8_t vqmovn_s16(int16x8_t a); // VQMOVN.S16 d0,q0int16x4_t vqmovn_s32(int32x4_t a); // VQMOVN.S32 d0,q0int32x2_t vqmovn_s64(int64x2_t a); // VQMOVN.S64 d0,q0uint8x8_t vqmovn_u16(uint16x8_t a); // VQMOVN.U16 d0,q0uint16x4_t vqmovn_u32(uint32x4_t a); // VQMOVN.U32 d0,q0uint32x2_t vqmovn_u64(uint64x2_t a); // VQMOVN.U64 d0,q0E-48 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持向 量 饱 和 窄 型 整 数 有 符 号 - > 无 符 号 的 转 换uint8x8_t vqmovun_s16(int16x8_t a); // VQMOVUN.S16 d0,q0uint16x4_t vqmovun_s32(int32x4_t a); // VQMOVUN.S32 d0,q0uint32x2_t vqmovun_s64(int64x2_t a); // VQMOVUN.S64 d0,q0E.3.23表 查 找uint8x8_t vtbl1_u8(uint8x8_t a, uint8x8_t b); // VTBL.8 d0, {d0}, d0int8x8_t vtbl1_s8(int8x8_t a, int8x8_t b); // VTBL.8 d0, {d0}, d0poly8x8_t vtbl1_p8(poly8x8_t a, uint8x8_t b); // VTBL.8 d0, {d0}, d0uint8x8_t vtbl2_u8(uint8x8x2_t a, uint8x8_t b); // VTBL.8 d0, {d0, d1}, d0int8x8_t vtbl2_s8(int8x8x2_t a, int8x8_t b); // VTBL.8 d0, {d0, d1}, d0poly8x8_t vtbl2_p8(poly8x8x2_t a, uint8x8_t b); // VTBL.8 d0, {d0, d1}, d0uint8x8_t vtbl3_u8(uint8x8x3_t a, uint8x8_t b); // VTBL.8 d0, {d0, d1, d2}, d0int8x8_t vtbl3_s8(int8x8x3_t a, int8x8_t b); // VTBL.8 d0, {d0, d1, d2}, d0poly8x8_t vtbl3_p8(poly8x8x3_t a, uint8x8_t b); // VTBL.8 d0, {d0, d1, d2}, d0uint8x8_t vtbl4_u8(uint8x8x4_t a, uint8x8_t b); // VTBL.8 d0, {d0, d1, d2, d3}, d0int8x8_t vtbl4_s8(int8x8x4_t a, int8x8_t b); // VTBL.8 d0, {d0, d1, d2, d3}, d0poly8x8_t vtbl4_p8(poly8x8x4_t a, uint8x8_t b); // VTBL.8 d0, {d0, d1, d2, d3}, d0E.3.24扩 展 表 查 找 内 在 函 数uint8x8_t vtbx1_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); // VTBX.8 d0, {d0}, d0int8x8_t vtbx1_s8(int8x8_t a, int8x8_t b, int8x8_t c); // VTBX.8 d0, {d0}, d0poly8x8_t vtbx1_p8(poly8x8_t a, poly8x8_t b, uint8x8_t c); // VTBX.8 d0, {d0}, d0uint8x8_t vtbx2_u8(uint8x8_t a, uint8x8x2_t b, uint8x8_t c); // VTBX.8 d0, {d0, d1}, d0int8x8_t vtbx2_s8(int8x8_t a, int8x8x2_t b, int8x8_t c); // VTBX.8 d0, {d0, d1}, d0poly8x8_t vtbx2_p8(poly8x8_t a, poly8x8x2_t b, uint8x8_t c); // VTBX.8 d0, {d0, d1}, d0uint8x8_t vtbx3_u8(uint8x8_t a, uint8x8x3_t b, uint8x8_t c); // VTBX.8 d0, {d0, d1, d2}, d0int8x8_t vtbx3_s8(int8x8_t a, int8x8x3_t b, int8x8_t c); // VTBX.8 d0, {d0, d1, d2}, d0poly8x8_t vtbx3_p8(poly8x8_t a, poly8x8x3_t b, uint8x8_t c); // VTBX.8 d0, {d0, d1, d2}, d0uint8x8_t vtbx4_u8(uint8x8_t a, uint8x8x4_t b, uint8x8_t c); // VTBX.8 d0, {d0, d1, d2, d3}, d0int8x8_t vtbx4_s8(int8x8_t a, int8x8x4_t b, int8x8_t c); // VTBX.8 d0, {d0, d1, d2, d3}, d0poly8x8_t vtbx4_p8(poly8x8_t a, poly8x8x4_t b, uint8x8_t c); // VTBX.8 d0, {d0, d1, d2, d3}, d0E.3.25针 对 标 量 值 的 运 算仅 当 标 量 参 数 为 常 数 或 用 于 vget_lane 内 在 函 数 之 一 时 , 才 能 保 证 以 下 内 在 函 数生 成 有 效 的 代 码 。向 量 与 标 量 进 行 的 乘 加int16x4_tint32x2_tvmla_lane_s16(int16x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l);// VMLA.I16 d0, d0, d0[0]vmla_lane_s32(int32x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l);// VMLA.I32 d0, d0, d0[0]<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-49ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持uint16x4_t vmla_lane_u16(uint16x4_t a, uint16x4_t b, uint16x4_t v, __constrange(0,3) int l);// VMLA.I16 d0, d0, d0[0]uint32x2_t vmla_lane_u32(uint32x2_t a, uint32x2_t b, uint32x2_t v, __constrange(0,1) int l);// VMLA.I32 d0, d0, d0[0]float32x2_t vmla_lane_f32(float32x2_t a, float32x2_t b, float32x2_t v, __constrange(0,1) int l);// VMLA.F32 d0, d0, d0[0]int16x8_t vmlaq_lane_s16(int16x8_t a, int16x8_t b, int16x4_t v, __constrange(0,3) int l);// VMLA.I16 q0, q0, d0[0]int32x4_t vmlaq_lane_s32(int32x4_t a, int32x4_t b, int32x2_t v, __constrange(0,1) int l);// VMLA.I32 q0, q0, d0[0]uint16x8_t vmlaq_lane_u16(uint16x8_t a, uint16x8_t b, uint16x4_t v, __constrange(0,3) int l);// VMLA.I16 q0, q0, d0[0]uint32x4_t vmlaq_lane_u32(uint32x4_t a, uint32x4_t b, uint32x2_t v, __constrange(0,1) int l);// VMLA.I32 q0, q0, d0[0]float32x4_t vmlaq_lane_f32(float32x4_t a, float32x4_t b, float32x2_t v, __constrange(0,1) int l);// VMLA.F32 q0, q0, d0[0]向 量 与 标 量 进 行 的 扩 大 乘 加int32x4_t vmlal_lane_s16(int32x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l);// VMLAL.S16 q0, d0, d0[0]int64x2_t vmlal_lane_s32(int64x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l);// VMLAL.S32 q0, d0, d0[0]uint32x4_t vmlal_lane_u16(uint32x4_t a, uint16x4_t b, uint16x4_t v, __constrange(0,3) int l);// VMLAL.U16 q0, d0, d0[0]uint64x2_t vmlal_lane_u32(uint64x2_t a, uint32x2_t b, uint32x2_t v, __constrange(0,1) int l);// VMLAL.U32 q0, d0, d0[0]向 量 与 标 量 进 行 的 扩 大 饱 和 加 倍 乘 加int32x4_tint64x2_tvqdmlal_lane_s16(int32x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l);// VQDMLAL.S16 q0, d0, d0[0]vqdmlal_lane_s32(int64x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l);// VQDMLAL.S32 q0, d0, d0[0]向 量 与 标 量 进 行 的 乘 减int16x4_t vmls_lane_s16(int16x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l);// VMLS.I16 d0, d0, d0[0]int32x2_t vmls_lane_s32(int32x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l);// VMLS.I32 d0, d0, d0[0]uint16x4_t vmls_lane_u16(uint16x4_t a, uint16x4_t b, uint16x4_t v, __constrange(0,3) int l);// VMLS.I16 d0, d0, d0[0]uint32x2_t vmls_lane_u32(uint32x2_t a, uint32x2_t b, uint32x2_t v, __constrange(0,1) int l);// VMLS.I32 d0, d0, d0[0]float32x2_t vmls_lane_f32(float32x2_t a, float32x2_t b, float32x2_t v, __constrange(0,1) int l);// VMLS.F32 d0, d0, d0[0]int16x8_t vmlsq_lane_s16(int16x8_t a, int16x8_t b, int16x4_t v, __constrange(0,3) int l);E-50 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持// VMLS.I16 q0, q0, d0[0]int32x4_t vmlsq_lane_s32(int32x4_t a, int32x4_t b, int32x2_t v, __constrange(0,1) int l);// VMLS.I32 q0, q0, d0[0]uint16x8_t vmlsq_lane_u16(uint16x8_t a, uint16x8_t b, uint16x4_t v, __constrange(0,3) int l);// VMLS.I16 q0, q0, d0[0]uint32x4_t vmlsq_lane_u32(uint32x4_t a, uint32x4_t b, uint32x2_t v, __constrange(0,1) int l);// VMLS.I32 q0, q0, d0[0]float32x4_t vmlsq_lane_f32(float32x4_t a, float32x4_t b, float32x2_t v, __constrange(0,1) int l);// VMLS.F32 q0, q0, d0[0]向 量 与 标 量 进 行 的 扩 大 乘 减int32x4_t vmlsl_lane_s16(int32x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l);// VMLSL.S16 q0, d0, d0[0]int64x2_t vmlsl_lane_s32(int64x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l);// VMLSL.S32 q0, d0, d0[0]uint32x4_t vmlsl_lane_u16(uint32x4_t a, uint16x4_t b, uint16x4_t v, __constrange(0,3) int l);// VMLSL.U16 q0, d0, d0[0]uint64x2_t vmlsl_lane_u32(uint64x2_t a, uint32x2_t b, uint32x2_t v, __constrange(0,1) int l);// VMLSL.U32 q0, d0, d0[0]向 量 与 标 量 进 行 的 扩 大 饱 和 加 倍 乘 减int32x4_tint64x2_tvqdmlsl_lane_s16(int32x4_t a, int16x4_t b, int16x4_t v, __constrange(0,3) int l);// VQDMLSL.S16 q0, d0, d0[0]vqdmlsl_lane_s32(int64x2_t a, int32x2_t b, int32x2_t v, __constrange(0,1) int l);// VQDMLSL.S32 q0, d0, d0[0]向 量 乘 以 标 量int16x4_t vmul_n_s16(int16x4_t a, int16_t b); // VMUL.I16 d0,d0,d0[0]int32x2_t vmul_n_s32(int32x2_t a, int32_t b); // VMUL.I32 d0,d0,d0[0]float32x2_t vmul_n_f32(float32x2_t a, float32_t b); // VMUL.F32 d0,d0,d0[0]uint16x4_t vmul_n_u16(uint16x4_t a, uint16_t b); // VMUL.I16 d0,d0,d0[0]uint32x2_t vmul_n_u32(uint32x2_t a, uint32_t b); // VMUL.I32 d0,d0,d0[0]int16x8_t vmulq_n_s16(int16x8_t a, int16_t b); // VMUL.I16 q0,q0,d0[0]int32x4_t vmulq_n_s32(int32x4_t a, int32_t b); // VMUL.I32 q0,q0,d0[0]float32x4_t vmulq_n_f32(float32x4_t a, float32_t b); // VMUL.F32 q0,q0,d0[0]uint16x8_t vmulq_n_u16(uint16x8_t a, uint16_t b); // VMUL.I16 q0,q0,d0[0]uint32x4_t vmulq_n_u32(uint32x4_t a, uint32_t b); // VMUL.I32 q0,q0,d0[0]向 量 与 标 量 进 行 的 长 型 乘 法int32x4_t vmull_n_s16(int16x4_t vec1, int16_t val2); // VMULL.S16 q0,d0,d0[0]int64x2_t vmull_n_s32(int32x2_t vec1, int32_t val2); // VMULL.S32 q0,d0,d0[0]uint32x4_t vmull_n_u16(uint16x4_t vec1, uint16_t val2); // VMULL.U16 q0,d0,d0[0]uint64x2_t vmull_n_u32(uint32x2_t vec1, uint32_t val2); // VMULL.U32 q0,d0,d0[0]<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-51ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持向 量 与 标 量 进 行 的 长 型 乘 法int32x4_t vmull_lane_s16(int16x4_t vec1, int16x4_t val2, __constrange(0, 3) int val3);// VMULL.S16 q0,d0,d0[0]int64x2_tvmull_lane_s32(int32x2_t vec1, int32x2_t val2, __constrange(0, 1) int val3);// VMULL.S32 q0,d0,d0[0]uint32x4_tvmull_lane_u16(uint16x4_t vec1, uint16x4_t val2, __constrange(0, 3) int val3);// VMULL.U16 q0,d0,d0[0]uint64x2_tvmull_lane_u32(uint32x2_t vec1, uint32x2_t val2, __constrange(0, 1) int val3);// VMULL.U32 q0,d0,d0[0]向 量 与 标 量 进 行 的 饱 和 加 倍 长 型 乘 法int32x4_t vqdmull_n_s16(int16x4_t vec1, int16_t val2);int64x2_t vqdmull_n_s32(int32x2_t vec1, int32_t val2);// VQDMULL.S16 q0,d0,d0[0]// VQDMULL.S32 q0,d0,d0[0]向 量 与 标 量 进 行 的 饱 和 加 倍 长 型 乘 法int32x4_t vqdmull_lane_s16(int16x4_t vec1, int16x4_t val2, __constrange(0, 3) int val3);// VQDMULL.S16 q0,d0,d0[0]int64x2_t vqdmull_lane_s32(int32x2_t vec1, int32x2_t val2, __constrange(0, 1) int val3);// VQDMULL.S32 q0,d0,d0[0]向 量 与 标 量 进 行 的 高 位 饱 和 加 倍 乘 法int16x4_t vqdmulh_n_s16(int16x4_t vec1, int16_t val2);int32x2_t vqdmulh_n_s32(int32x2_t vec1, int32_t val2);int16x8_t vqdmulhq_n_s16(int16x8_t vec1, int16_t val2);int32x4_t vqdmulhq_n_s32(int32x4_t vec1, int32_t val2);// VQDMULH.S16 d0,d0,d0[0]// VQDMULH.S32 d0,d0,d0[0]// VQDMULH.S16 q0,q0,d0[0]// VQDMULH.S32 q0,q0,d0[0]向 量 与 标 量 进 行 的 高 位 饱 和 加 倍 乘 法int16x4_t vqdmulh_lane_s16(int16x4_t vec1, int16x4_t val2, __constrange(0, 3) int val3);// VQDMULH.S16 d0,d0,d0[0]int32x2_t vqdmulh_lane_s32(int32x2_t vec1, int32x2_t val2, __constrange(0, 1) int val3);// VQDMULH.S32 d0,d0,d0[0]int16x8_t vqdmulhq_lane_s16(int16x8_t vec1, int16x4_t val2, __constrange(0, 3) int val3);// VQDMULH.S16 q0,q0,d0[0]int32x4_t vqdmulhq_lane_s32(int32x4_t vec1, int32x2_t val2, __constrange(0, 1) int val3);// VQDMULH.S32 q0,q0,d0[0]向 量 与 标 量 进 行 的 高 位 饱 和 舍 入 加 倍 乘 法int16x4_t vqrdmulh_n_s16(int16x4_t vec1, int16_t val2);int32x2_t vqrdmulh_n_s32(int32x2_t vec1, int32_t val2);int16x8_t vqrdmulhq_n_s16(int16x8_t vec1, int16_t val2);int32x4_t vqrdmulhq_n_s32(int32x4_t vec1, int32_t val2);// VQRDMULH.S16 d0,d0,d0[0]// VQRDMULH.S32 d0,d0,d0[0]// VQRDMULH.S16 q0,q0,d0[0]// VQRDMULH.S32 q0,q0,d0[0]E-52 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持向 量 与 标 量 进 行 的 高 位 舍 入 饱 和 加 倍 乘 法int16x4_t vqrdmulh_lane_s16(int16x4_t vec1, int16x4_t val2, __constrange(0, 3) int val3);// VQRDMULH.S16 d0,d0,d0[0]int32x2_t vqrdmulh_lane_s32(int32x2_t vec1, int32x2_t val2, __constrange(0, 1) int val3);// VQRDMULH.S32 d0,d0,d0[0]int16x8_t vqrdmulhq_lane_s16(int16x8_t vec1, int16x4_t val2, __constrange(0, 3) int val3);// VQRDMULH.S16 q0,q0,d0[0]int32x4_t vqrdmulhq_lane_s32(int32x4_t vec1, int32x2_t val2, __constrange(0, 1) int val3);// VQRDMULH.S32 q0,q0,d0[0]向 量 与 标 量 进 行 的 乘 加int16x4_t vmla_n_s16(int16x4_t a, int16x4_t b, int16_t c); // VMLA.I16 d0, d0, d0[0]int32x2_t vmla_n_s32(int32x2_t a, int32x2_t b, int32_t c); // VMLA.I32 d0, d0, d0[0]uint16x4_t vmla_n_u16(uint16x4_t a, uint16x4_t b, uint16_t c); // VMLA.I16 d0, d0, d0[0]uint32x2_t vmla_n_u32(uint32x2_t a, uint32x2_t b, uint32_t c); // VMLA.I32 d0, d0, d0[0]float32x2_t vmla_n_f32(float32x2_t a, float32x2_t b, float32_t c); // VMLA.F32 d0, d0, d0[0]int16x8_t vmlaq_n_s16(int16x8_t a, int16x8_t b, int16_t c); // VMLA.I16 q0, q0, d0[0]int32x4_t vmlaq_n_s32(int32x4_t a, int32x4_t b, int32_t c); // VMLA.I32 q0, q0, d0[0]uint16x8_t vmlaq_n_u16(uint16x8_t a, uint16x8_t b, uint16_t c); // VMLA.I16 q0, q0, d0[0]uint32x4_t vmlaq_n_u32(uint32x4_t a, uint32x4_t b, uint32_t c); // VMLA.I32 q0, q0, d0[0]float32x4_t vmlaq_n_f32(float32x4_t a, float32x4_t b, float32_t c); // VMLA.F32 q0, q0, d0[0]向 量 与 标 量 进 行 的 扩 大 乘 加int32x4_t vmlal_n_s16(int32x4_t a, int16x4_t b, int16_t c); // VMLAL.S16 q0, d0, d0[0]int64x2_t vmlal_n_s32(int64x2_t a, int32x2_t b, int32_t c); // VMLAL.S32 q0, d0, d0[0]uint32x4_t vmlal_n_u16(uint32x4_t a, uint16x4_t b, uint16_t c); // VMLAL.U16 q0, d0, d0[0]uint64x2_t vmlal_n_u32(uint64x2_t a, uint32x2_t b, uint32_t c); // VMLAL.U32 q0, d0, d0[0]向 量 与 标 量 进 行 的 扩 大 饱 和 加 倍 乘 加int32x4_t vqdmlal_n_s16(int32x4_t a, int16x4_t b, int16_t c); // VQDMLAL.S16 q0, d0, d0[0]int64x2_t vqdmlal_n_s32(int64x2_t a, int32x2_t b, int32_t c); // VQDMLAL.S32 q0, d0, d0[0]向 量 与 标 量 进 行 的 乘 减int16x4_t vmls_n_s16(int16x4_t a, int16x4_t b, int16_t c); // VMLS.I16 d0, d0, d0[0]int32x2_t vmls_n_s32(int32x2_t a, int32x2_t b, int32_t c); // VMLS.I32 d0, d0, d0[0]uint16x4_t vmls_n_u16(uint16x4_t a, uint16x4_t b, uint16_t c); // VMLS.I16 d0, d0, d0[0]uint32x2_t vmls_n_u32(uint32x2_t a, uint32x2_t b, uint32_t c); // VMLS.I32 d0, d0, d0[0]float32x2_t vmls_n_f32(float32x2_t a, float32x2_t b, float32_t c); // VMLS.F32 d0, d0, d0[0]int16x8_t vmlsq_n_s16(int16x8_t a, int16x8_t b, int16_t c); // VMLS.I16 q0, q0, d0[0]int32x4_t vmlsq_n_s32(int32x4_t a, int32x4_t b, int32_t c); // VMLS.I32 q0, q0, d0[0]uint16x8_t vmlsq_n_u16(uint16x8_t a, uint16x8_t b, uint16_t c); // VMLS.I16 q0, q0, d0[0]uint32x4_t vmlsq_n_u32(uint32x4_t a, uint32x4_t b, uint32_t c); // VMLS.I32 q0, q0, d0[0]float32x4_t vmlsq_n_f32(float32x4_t a, float32x4_t b, float32_t c); // VMLS.F32 q0, q0, d0[0]<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-53ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持向 量 与 标 量 进 行 的 扩 大 乘 减int32x4_t vmlsl_n_s16(int32x4_t a, int16x4_t b, int16_t c); // VMLSL.S16 q0, d0, d0[0]int64x2_t vmlsl_n_s32(int64x2_t a, int32x2_t b, int32_t c); // VMLSL.S32 q0, d0, d0[0]uint32x4_t vmlsl_n_u16(uint32x4_t a, uint16x4_t b, uint16_t c); // VMLSL.U16 q0, d0, d0[0]uint64x2_t vmlsl_n_u32(uint64x2_t a, uint32x2_t b, uint32_t c); // VMLSL.U32 q0, d0, d0[0]向 量 与 标 量 进 行 的 扩 大 饱 和 加 倍 乘 减int32x4_t vqdmlsl_n_s16(int32x4_t a, int16x4_t b, int16_t c); // VQDMLSL.S16 q0, d0, d0[0]int64x2_t vqdmlsl_n_s32(int64x2_t a, int32x2_t b, int32_t c); // VQDMLSL.S32 q0, d0, d0[0]E.3.26向 量 提 取int8x8_t vext_s8(int8x8_t a, int8x8_t b, __constrange(0,7) int c); // VEXT.8 d0,d0,d0,#0uint8x8_t vext_u8(uint8x8_t a, uint8x8_t b, __constrange(0,7) int c); // VEXT.8 d0,d0,d0,#0poly8x8_t vext_p8(poly8x8_t a, poly8x8_t b, __constrange(0,7) int c); // VEXT.8 d0,d0,d0,#0int16x4_t vext_s16(int16x4_t a, int16x4_t b, __constrange(0,3) int c); // VEXT.16 d0,d0,d0,#0uint16x4_t vext_u16(uint16x4_t a, uint16x4_t b, __constrange(0,3) int c); // VEXT.16 d0,d0,d0,#0poly16x4_t vext_p16(poly16x4_t a, poly16x4_t b, __constrange(0,3) int c); // VEXT.16 d0,d0,d0,#0int32x2_t vext_s32(int32x2_t a, int32x2_t b, __constrange(0,1) int c); // VEXT.32 d0,d0,d0,#0uint32x2_t vext_u32(uint32x2_t a, uint32x2_t b, __constrange(0,1) int c); // VEXT.32 d0,d0,d0,#0int64x1_t vext_s64(int64x1_t a, int64x1_t b, __constrange(0,0) int c); // VEXT.64 d0,d0,d0,#0uint64x1_t vext_u64(uint64x1_t a, uint64x1_t b, __constrange(0,0) int c); // VEXT.64 d0,d0,d0,#0int8x16_t vextq_s8(int8x16_t a, int8x16_t b, __constrange(0,15) int c); // VEXT.8 q0,q0,q0,#0uint8x16_t vextq_u8(uint8x16_t a, uint8x16_t b, __constrange(0,15) int c); // VEXT.8 q0,q0,q0,#0poly8x16_t vextq_p8(poly8x16_t a, poly8x16_t b, __constrange(0,15) int c); // VEXT.8 q0,q0,q0,#0int16x8_t vextq_s16(int16x8_t a, int16x8_t b, __constrange(0,7) int c); // VEXT.16 q0,q0,q0,#0uint16x8_t vextq_u16(uint16x8_t a, uint16x8_t b, __constrange(0,7) int c); // VEXT.16 q0,q0,q0,#0poly16x8_t vextq_p16(poly16x8_t a, poly16x8_t b, __constrange(0,7) int c); // VEXT.16 q0,q0,q0,#0int32x4_t vextq_s32(int32x4_t a, int32x4_t b, __constrange(0,3) int c); // VEXT.32 q0,q0,q0,#0uint32x4_t vextq_u32(uint32x4_t a, uint32x4_t b, __constrange(0,3) int c); // VEXT.32 q0,q0,q0,#0int64x2_t vextq_s64(int64x2_t a, int64x2_t b, __constrange(0,1) int c); // VEXT.64 q0,q0,q0,#0uint64x2_t vextq_u64(uint64x2_t a, uint64x2_t b, __constrange(0,1) int c); // VEXT.64 q0,q0,q0,#0E.3.27 反 转 向 量 元 素 ( 交 换 端 标 记 )VREVn.m 反 转 n 位 宽 的 集 合 内 m 位 向 量 线 的 顺 序 。int8x8_t vrev64_s8(int8x8_t vec); // VREV64.8 d0,d0int16x4_t vrev64_s16(int16x4_t vec); // VREV64.16 d0,d0int32x2_t vrev64_s32(int32x2_t vec); // VREV64.32 d0,d0uint8x8_t vrev64_u8(uint8x8_t vec); // VREV64.8 d0,d0uint16x4_t vrev64_u16(uint16x4_t vec); // VREV64.16 d0,d0uint32x2_t vrev64_u32(uint32x2_t vec); // VREV64.32 d0,d0poly8x8_t vrev64_p8(poly8x8_t vec); // VREV64.8 d0,d0poly16x4_t vrev64_p16(poly16x4_t vec); // VREV64.16 d0,d0float32x2_t vrev64_f32(float32x2_t vec); // VREV64.32 d0,d0E-54 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持int8x16_t vrev64q_s8(int8x16_t vec); // VREV64.8 q0,q0int16x8_t vrev64q_s16(int16x8_t vec); // VREV64.16 q0,q0int32x4_t vrev64q_s32(int32x4_t vec); // VREV64.32 q0,q0uint8x16_t vrev64q_u8(uint8x16_t vec); // VREV64.8 q0,q0uint16x8_t vrev64q_u16(uint16x8_t vec); // VREV64.16 q0,q0uint32x4_t vrev64q_u32(uint32x4_t vec); // VREV64.32 q0,q0poly8x16_t vrev64q_p8(poly8x16_t vec); // VREV64.8 q0,q0poly16x8_t vrev64q_p16(poly16x8_t vec); // VREV64.16 q0,q0float32x4_t vrev64q_f32(float32x4_t vec); // VREV64.32 q0,q0int8x8_t vrev32_s8(int8x8_t vec); // VREV32.8 d0,d0int16x4_t vrev32_s16(int16x4_t vec); // VREV32.16 d0,d0uint8x8_t vrev32_u8(uint8x8_t vec); // VREV32.8 d0,d0uint16x4_t vrev32_u16(uint16x4_t vec); // VREV32.16 d0,d0poly8x8_t vrev32_p8(poly8x8_t vec); // VREV32.8 d0,d0int8x16_t vrev32q_s8(int8x16_t vec); // VREV32.8 q0,q0int16x8_t vrev32q_s16(int16x8_t vec); // VREV32.16 q0,q0uint8x16_t vrev32q_u8(uint8x16_t vec); // VREV32.8 q0,q0uint16x8_t vrev32q_u16(uint16x8_t vec); // VREV32.16 q0,q0poly8x16_t vrev32q_p8(poly8x16_t vec); // VREV32.8 q0,q0int8x8_t vrev16_s8(int8x8_t vec); // VREV16.8 d0,d0uint8x8_t vrev16_u8(uint8x8_t vec); // VREV16.8 d0,d0poly8x8_t vrev16_p8(poly8x8_t vec); // VREV16.8 d0,d0int8x16_t vrev16q_s8(int8x16_t vec); // VREV16.8 q0,q0uint8x16_t vrev16q_u8(uint8x16_t vec); // VREV16.8 q0,q0poly8x16_t vrev16q_p8(poly8x16_t vec); // VREV16.8 q0,q0E.3.28其 他 单 操 作 数 算 法以 下 内 在 函 数 提 供 其 他 单 操 作 数 算 法 。绝 对 值 :Vd[i] = |Va[i]|int8x8_t vabs_s8(int8x8_t a); // VABS.S8 d0,d0int16x4_t vabs_s16(int16x4_t a); // VABS.S16 d0,d0int32x2_t vabs_s32(int32x2_t a); // VABS.S32 d0,d0float32x2_t vabs_f32(float32x2_t a); // VABS.F32 d0,d0int8x16_t vabsq_s8(int8x16_t a); // VABS.S8 q0,q0int16x8_t vabsq_s16(int16x8_t a); // VABS.S16 q0,q0int32x4_t vabsq_s32(int32x4_t a); // VABS.S32 q0,q0float32x4_t vabsq_f32(float32x4_t a); // VABS.F32 q0,q0饱 和 绝 对 值 :Vd[i] = sat(|Va[i]|)int8x8_t vqabs_s8(int8x8_t a);int16x4_t vqabs_s16(int16x4_t a);int32x2_t vqabs_s32(int32x2_t a);// VQABS.S8 d0,d0// VQABS.S16 d0,d0// VQABS.S32 d0,d0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-55ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持int8x16_t vqabsq_s8(int8x16_t a); // VQABS.S8 q0,q0int16x8_t vqabsq_s16(int16x8_t a); // VQABS.S16 q0,q0int32x4_t vqabsq_s32(int32x4_t a); // VQABS.S32 q0,q0求 反 :Vd[i] = - Va[i]int8x8_t vneg_s8(int8x8_t a); // VNEG.S8 d0,d0int16x4_t vneg_s16(int16x4_t a); // VNEG.S16 d0,d0int32x2_t vneg_s32(int32x2_t a); // VNEG.S32 d0,d0float32x2_t vneg_f32(float32x2_t a); // VNEG.F32 d0,d0int8x16_t vnegq_s8(int8x16_t a); // VNEG.S8 q0,q0int16x8_t vnegq_s16(int16x8_t a); // VNEG.S16 q0,q0int32x4_t vnegq_s32(int32x4_t a); // VNEG.S32 q0,q0float32x4_t vnegq_f32(float32x4_t a); // VNEG.F32 q0,q0饱 和 求 反 :sat(Vd[i] = - Va[i])int8x8_t vqneg_s8(int8x8_t a); // VQNEG.S8 d0,d0int16x4_t vqneg_s16(int16x4_t a); // VQNEG.S16 d0,d0int32x2_t vqneg_s32(int32x2_t a); // VQNEG.S32 d0,d0int8x16_t vqnegq_s8(int8x16_t a); // VQNEG.S8 q0,q0int16x8_t vqnegq_s16(int16x8_t a); // VQNEG.S16 q0,q0int32x4_t vqnegq_s32(int32x4_t a); // VQNEG.S32 q0,q0计 算 前 导 符 号 位 数 目int8x8_t vcls_s8(int8x8_t a); // VCLS.S8 d0,d0int16x4_t vcls_s16(int16x4_t a); // VCLS.S16 d0,d0int32x2_t vcls_s32(int32x2_t a); // VCLS.S32 d0,d0int8x16_t vclsq_s8(int8x16_t a); // VCLS.S8 q0,q0int16x8_t vclsq_s16(int16x8_t a); // VCLS.S16 q0,q0int32x4_t vclsq_s32(int32x4_t a); // VCLS.S32 q0,q0计 算 前 导 零 数 目int8x8_t vclz_s8(int8x8_t a); // VCLZ.I8 d0,d0int16x4_t vclz_s16(int16x4_t a); // VCLZ.I16 d0,d0int32x2_t vclz_s32(int32x2_t a); // VCLZ.I32 d0,d0uint8x8_t vclz_u8(uint8x8_t a); // VCLZ.I8 d0,d0uint16x4_t vclz_u16(uint16x4_t a); // VCLZ.I16 d0,d0uint32x2_t vclz_u32(uint32x2_t a); // VCLZ.I32 d0,d0int8x16_t vclzq_s8(int8x16_t a); // VCLZ.I8 q0,q0int16x8_t vclzq_s16(int16x8_t a); // VCLZ.I16 q0,q0int32x4_t vclzq_s32(int32x4_t a); // VCLZ.I32 q0,q0uint8x16_t vclzq_u8(uint8x16_t a); // VCLZ.I8 q0,q0uint16x8_t vclzq_u16(uint16x8_t a); // VCLZ.I16 q0,q0uint32x4_t vclzq_u32(uint32x4_t a); // VCLZ.I32 q0,q0E-56 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持计 算 设 置 位 数uint8x8_t vcnt_u8(uint8x8_t a); // VCNT.8 d0,d0int8x8_t vcnt_s8(int8x8_t a); // VCNT.8 d0,d0poly8x8_t vcnt_p8(poly8x8_t a); // VCNT.8 d0,d0uint8x16_t vcntq_u8(uint8x16_t a); // VCNT.8 q0,q0int8x16_t vcntq_s8(int8x16_t a); // VCNT.8 q0,q0poly8x16_t vcntq_p8(poly8x16_t a); // VCNT.8 q0,q0近 似 倒 数float32x2_t vrecpe_f32(float32x2_t a); // VRECPE.F32 d0,d0uint32x2_t vrecpe_u32(uint32x2_t a); // VRECPE.U32 d0,d0float32x4_t vrecpeq_f32(float32x4_t a); // VRECPE.F32 q0,q0uint32x4_t vrecpeq_u32(uint32x4_t a); // VRECPE.U32 q0,q0近 似 平 方 根 倒 数float32x2_t vrsqrte_f32(float32x2_t a); // VRSQRTE.F32 d0,d0uint32x2_t vrsqrte_u32(uint32x2_t a); // VRSQRTE.U32 d0,d0float32x4_t vrsqrteq_f32(float32x4_t a); // VRSQRTE.F32 q0,q0uint32x4_t vrsqrteq_u32(uint32x4_t a); // VRSQRTE.U32 q0,q0E.3.29逻 辑 运 算以 下 内 在 函 数 提 供 按 位 逻 辑 运 算 。按 位 非int8x8_t vmvn_s8(int8x8_t a); // VMVN d0,d0int16x4_t vmvn_s16(int16x4_t a); // VMVN d0,d0int32x2_t vmvn_s32(int32x2_t a); // VMVN d0,d0uint8x8_t vmvn_u8(uint8x8_t a); // VMVN d0,d0uint16x4_t vmvn_u16(uint16x4_t a); // VMVN d0,d0uint32x2_t vmvn_u32(uint32x2_t a); // VMVN d0,d0poly8x8_t vmvn_p8(poly8x8_t a); // VMVN d0,d0int8x16_t vmvnq_s8(int8x16_t a); // VMVN q0,q0int16x8_t vmvnq_s16(int16x8_t a); // VMVN q0,q0int32x4_t vmvnq_s32(int32x4_t a); // VMVN q0,q0uint8x16_t vmvnq_u8(uint8x16_t a); // VMVN q0,q0uint16x8_t vmvnq_u16(uint16x8_t a); // VMVN q0,q0uint32x4_t vmvnq_u32(uint32x4_t a); // VMVN q0,q0poly8x16_t vmvnq_p8(poly8x16_t a); // VMVN q0,q0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-57ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持按 位 与int8x8_t vand_s8(int8x8_t a, int8x8_t b); // VAND d0,d0,d0int16x4_t vand_s16(int16x4_t a, int16x4_t b); // VAND d0,d0,d0int32x2_t vand_s32(int32x2_t a, int32x2_t b); // VAND d0,d0,d0int64x1_t vand_s64(int64x1_t a, int64x1_t b); // VAND d0,d0,d0uint8x8_t vand_u8(uint8x8_t a, uint8x8_t b); // VAND d0,d0,d0uint16x4_t vand_u16(uint16x4_t a, uint16x4_t b); // VAND d0,d0,d0uint32x2_t vand_u32(uint32x2_t a, uint32x2_t b); // VAND d0,d0,d0uint64x1_t vand_u64(uint64x1_t a, uint64x1_t b); // VAND d0,d0,d0int8x16_t vandq_s8(int8x16_t a, int8x16_t b); // VAND q0,q0,q0int16x8_t vandq_s16(int16x8_t a, int16x8_t b); // VAND q0,q0,q0int32x4_t vandq_s32(int32x4_t a, int32x4_t b); // VAND q0,q0,q0int64x2_t vandq_s64(int64x2_t a, int64x2_t b); // VAND q0,q0,q0uint8x16_t vandq_u8(uint8x16_t a, uint8x16_t b); // VAND q0,q0,q0uint16x8_t vandq_u16(uint16x8_t a, uint16x8_t b); // VAND q0,q0,q0uint32x4_t vandq_u32(uint32x4_t a, uint32x4_t b); // VAND q0,q0,q0uint64x2_t vandq_u64(uint64x2_t a, uint64x2_t b); // VAND q0,q0,q0按 位 或int8x8_t vorr_s8(int8x8_t a, int8x8_t b); // VORR d0,d0,d0int16x4_t vorr_s16(int16x4_t a, int16x4_t b); // VORR d0,d0,d0int32x2_t vorr_s32(int32x2_t a, int32x2_t b); // VORR d0,d0,d0int64x1_t vorr_s64(int64x1_t a, int64x1_t b); // VORR d0,d0,d0uint8x8_t vorr_u8(uint8x8_t a, uint8x8_t b); // VORR d0,d0,d0uint16x4_t vorr_u16(uint16x4_t a, uint16x4_t b); // VORR d0,d0,d0uint32x2_t vorr_u32(uint32x2_t a, uint32x2_t b); // VORR d0,d0,d0uint64x1_t vorr_u64(uint64x1_t a, uint64x1_t b); // VORR d0,d0,d0int8x16_t vorrq_s8(int8x16_t a, int8x16_t b); // VORR q0,q0,q0int16x8_t vorrq_s16(int16x8_t a, int16x8_t b); // VORR q0,q0,q0int32x4_t vorrq_s32(int32x4_t a, int32x4_t b); // VORR q0,q0,q0int64x2_t vorrq_s64(int64x2_t a, int64x2_t b); // VORR q0,q0,q0uint8x16_t vorrq_u8(uint8x16_t a, uint8x16_t b); // VORR q0,q0,q0uint16x8_t vorrq_u16(uint16x8_t a, uint16x8_t b); // VORR q0,q0,q0uint32x4_t vorrq_u32(uint32x4_t a, uint32x4_t b); // VORR q0,q0,q0uint64x2_t vorrq_u64(uint64x2_t a, uint64x2_t b); // VORR q0,q0,q0按 位 异 或 (EOR 或 XOR)int8x8_t veor_s8(int8x8_t a, int8x8_t b); // VEOR d0,d0,d0int16x4_t veor_s16(int16x4_t a, int16x4_t b); // VEOR d0,d0,d0int32x2_t veor_s32(int32x2_t a, int32x2_t b); // VEOR d0,d0,d0int64x1_t veor_s64(int64x1_t a, int64x1_t b); // VEOR d0,d0,d0uint8x8_t veor_u8(uint8x8_t a, uint8x8_t b); // VEOR d0,d0,d0uint16x4_t veor_u16(uint16x4_t a, uint16x4_t b); // VEOR d0,d0,d0uint32x2_t veor_u32(uint32x2_t a, uint32x2_t b); // VEOR d0,d0,d0uint64x1_t veor_u64(uint64x1_t a, uint64x1_t b); // VEOR d0,d0,d0int8x16_t veorq_s8(int8x16_t a, int8x16_t b); // VEOR q0,q0,q0E-58 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持int16x8_t veorq_s16(int16x8_t a, int16x8_t b); // VEOR q0,q0,q0int32x4_t veorq_s32(int32x4_t a, int32x4_t b); // VEOR q0,q0,q0int64x2_t veorq_s64(int64x2_t a, int64x2_t b); // VEOR q0,q0,q0uint8x16_t veorq_u8(uint8x16_t a, uint8x16_t b); // VEOR q0,q0,q0uint16x8_t veorq_u16(uint16x8_t a, uint16x8_t b); // VEOR q0,q0,q0uint32x4_t veorq_u32(uint32x4_t a, uint32x4_t b); // VEOR q0,q0,q0uint64x2_t veorq_u64(uint64x2_t a, uint64x2_t b); // VEOR q0,q0,q0位 清 零int8x8_t vbic_s8(int8x8_t a, int8x8_t b); // VBIC d0,d0,d0int16x4_t vbic_s16(int16x4_t a, int16x4_t b); // VBIC d0,d0,d0int32x2_t vbic_s32(int32x2_t a, int32x2_t b); // VBIC d0,d0,d0int64x1_t vbic_s64(int64x1_t a, int64x1_t b); // VBIC d0,d0,d0uint8x8_t vbic_u8(uint8x8_t a, uint8x8_t b); // VBIC d0,d0,d0uint16x4_t vbic_u16(uint16x4_t a, uint16x4_t b); // VBIC d0,d0,d0uint32x2_t vbic_u32(uint32x2_t a, uint32x2_t b); // VBIC d0,d0,d0uint64x1_t vbic_u64(uint64x1_t a, uint64x1_t b); // VBIC d0,d0,d0int8x16_t vbicq_s8(int8x16_t a, int8x16_t b); // VBIC q0,q0,q0int16x8_t vbicq_s16(int16x8_t a, int16x8_t b); // VBIC q0,q0,q0int32x4_t vbicq_s32(int32x4_t a, int32x4_t b); // VBIC q0,q0,q0int64x2_t vbicq_s64(int64x2_t a, int64x2_t b); // VBIC q0,q0,q0uint8x16_t vbicq_u8(uint8x16_t a, uint8x16_t b); // VBIC q0,q0,q0uint16x8_t vbicq_u16(uint16x8_t a, uint16x8_t b); // VBIC q0,q0,q0uint32x4_t vbicq_u32(uint32x4_t a, uint32x4_t b); // VBIC q0,q0,q0uint64x2_t vbicq_u64(uint64x2_t a, uint64x2_t b); // VBIC q0,q0,q0按 位 或 补int8x8_t vorn_s8(int8x8_t a, int8x8_t b); // VORN d0,d0,d0int16x4_t vorn_s16(int16x4_t a, int16x4_t b); // VORN d0,d0,d0int32x2_t vorn_s32(int32x2_t a, int32x2_t b); // VORN d0,d0,d0int64x1_t vorn_s64(int64x1_t a, int64x1_t b); // VORN d0,d0,d0uint8x8_t vorn_u8(uint8x8_t a, uint8x8_t b); // VORN d0,d0,d0uint16x4_t vorn_u16(uint16x4_t a, uint16x4_t b); // VORN d0,d0,d0uint32x2_t vorn_u32(uint32x2_t a, uint32x2_t b); // VORN d0,d0,d0uint64x1_t vorn_u64(uint64x1_t a, uint64x1_t b); // VORN d0,d0,d0int8x16_t vornq_s8(int8x16_t a, int8x16_t b); // VORN q0,q0,q0int16x8_t vornq_s16(int16x8_t a, int16x8_t b); // VORN q0,q0,q0int32x4_t vornq_s32(int32x4_t a, int32x4_t b); // VORN q0,q0,q0int64x2_t vornq_s64(int64x2_t a, int64x2_t b); // VORN q0,q0,q0uint8x16_t vornq_u8(uint8x16_t a, uint8x16_t b); // VORN q0,q0,q0uint16x8_t vornq_u16(uint16x8_t a, uint16x8_t b); // VORN q0,q0,q0uint32x4_t vornq_u32(uint32x4_t a, uint32x4_t b); // VORN q0,q0,q0uint64x2_t vornq_u64(uint64x2_t a, uint64x2_t b); // VORN q0,q0,q0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-59ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持按 位 选 择注 意此 内 在 函 数 可 以 根 据 寄 存 器 的 分 配 编 译 为 VBSL/VBIF/VBIT 中 的 任 意 一 个 。int8x8_t vbsl_s8(uint8x8_t a, int8x8_t b, int8x8_t c); // VBSL d0,d0,d0int16x4_t vbsl_s16(uint16x4_t a, int16x4_t b, int16x4_t c); // VBSL d0,d0,d0int32x2_t vbsl_s32(uint32x2_t a, int32x2_t b, int32x2_t c); // VBSL d0,d0,d0int64x1_t vbsl_s64(uint64x1_t a, int64x1_t b, int64x1_t c); // VBSL d0,d0,d0uint8x8_t vbsl_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c); // VBSL d0,d0,d0uint16x4_t vbsl_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c); // VBSL d0,d0,d0uint32x2_t vbsl_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c); // VBSL d0,d0,d0uint64x1_t vbsl_u64(uint64x1_t a, uint64x1_t b, uint64x1_t c); // VBSL d0,d0,d0float32x2_t vbsl_f32(uint32x2_t a, float32x2_t b, float32x2_t c); // VBSL d0,d0,d0poly8x8_t vbsl_p8(uint8x8_t a, poly8x8_t b, poly8x8_t c); // VBSL d0,d0,d0poly16x4_t vbsl_p16(uint16x4_t a, poly16x4_t b, poly16x4_t c); // VBSL d0,d0,d0int8x16_t vbslq_s8(uint8x16_t a, int8x16_t b, int8x16_t c); // VBSL q0,q0,q0int16x8_t vbslq_s16(uint16x8_t a, int16x8_t b, int16x8_t c); // VBSL q0,q0,q0int32x4_t vbslq_s32(uint32x4_t a, int32x4_t b, int32x4_t c); // VBSL q0,q0,q0int64x2_t vbslq_s64(uint64x2_t a, int64x2_t b, int64x2_t c); // VBSL q0,q0,q0uint8x16_t vbslq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c); // VBSL q0,q0,q0uint16x8_t vbslq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c); // VBSL q0,q0,q0uint32x4_t vbslq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c); // VBSL q0,q0,q0uint64x2_t vbslq_u64(uint64x2_t a, uint64x2_t b, uint64x2_t c); // VBSL q0,q0,q0float32x4_t vbslq_f32(uint32x4_t a, float32x4_t b, float32x4_t c); // VBSL q0,q0,q0poly8x16_t vbslq_p8(uint8x16_t a, poly8x16_t b, poly8x16_t c); // VBSL q0,q0,q0poly16x8_t vbslq_p16(uint16x8_t a, poly16x8_t b, poly16x8_t c); // VBSL q0,q0,q0E.3.30转 置 运 算这 些 内 在 函 数 提 供 转 置 运 算 。转 置 元 素int8x8x2_t vtrn_s8(int8x8_t a, int8x8_t b); // VTRN.8 d0,d0int16x4x2_t vtrn_s16(int16x4_t a, int16x4_t b); // VTRN.16 d0,d0int32x2x2_t vtrn_s32(int32x2_t a, int32x2_t b); // VTRN.32 d0,d0uint8x8x2_t vtrn_u8(uint8x8_t a, uint8x8_t b); // VTRN.8 d0,d0uint16x4x2_t vtrn_u16(uint16x4_t a, uint16x4_t b); // VTRN.16 d0,d0uint32x2x2_t vtrn_u32(uint32x2_t a, uint32x2_t b); // VTRN.32 d0,d0float32x2x2_t vtrn_f32(float32x2_t a, float32x2_t b); // VTRN.32 d0,d0poly8x8x2_t vtrn_p8(poly8x8_t a, poly8x8_t b); // VTRN.8 d0,d0poly16x4x2_t vtrn_p16(poly16x4_t a, poly16x4_t b); // VTRN.16 d0,d0int8x16x2_t vtrnq_s8(int8x16_t a, int8x16_t b); // VTRN.8 q0,q0int16x8x2_t vtrnq_s16(int16x8_t a, int16x8_t b); // VTRN.16 q0,q0int32x4x2_t vtrnq_s32(int32x4_t a, int32x4_t b); // VTRN.32 q0,q0uint8x16x2_t vtrnq_u8(uint8x16_t a, uint8x16_t b); // VTRN.8 q0,q0E-60 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708


使 用 NEON 支 持uint16x8x2_t vtrnq_u16(uint16x8_t a, uint16x8_t b); // VTRN.16 q0,q0uint32x4x2_t vtrnq_u32(uint32x4_t a, uint32x4_t b); // VTRN.32 q0,q0float32x4x2_t vtrnq_f32(float32x4_t a, float32x4_t b); // VTRN.32 q0,q0poly8x16x2_t vtrnq_p8(poly8x16_t a, poly8x16_t b); // VTRN.8 q0,q0poly16x8x2_t vtrnq_p16(poly16x8_t a, poly16x8_t b); // VTRN.16 q0,q0交 叉 存 取 元 素int8x8x2_t vzip_s8(int8x8_t a, int8x8_t b); // VZIP.8 d0,d0int16x4x2_t vzip_s16(int16x4_t a, int16x4_t b); // VZIP.16 d0,d0uint8x8x2_t vzip_u8(uint8x8_t a, uint8x8_t b); // VZIP.8 d0,d0uint16x4x2_t vzip_u16(uint16x4_t a, uint16x4_t b); // VZIP.16 d0,d0float32x2x2_t vzip_f32(float32x2_t a, float32x2_t b); // VZIP.32 d0,d0poly8x8x2_t vzip_p8(poly8x8_t a, poly8x8_t b); // VZIP.8 d0,d0poly16x4x2_t vzip_p16(poly16x4_t a, poly16x4_t b); // VZIP.16 d0,d0int8x16x2_t vzipq_s8(int8x16_t a, int8x16_t b); // VZIP.8 q0,q0int16x8x2_t vzipq_s16(int16x8_t a, int16x8_t b); // VZIP.16 q0,q0int32x4x2_t vzipq_s32(int32x4_t a, int32x4_t b); // VZIP.32 q0,q0uint8x16x2_t vzipq_u8(uint8x16_t a, uint8x16_t b); // VZIP.8 q0,q0uint16x8x2_t vzipq_u16(uint16x8_t a, uint16x8_t b); // VZIP.16 q0,q0uint32x4x2_t vzipq_u32(uint32x4_t a, uint32x4_t b); // VZIP.32 q0,q0float32x4x2_t vzipq_f32(float32x4_t a, float32x4_t b); // VZIP.32 q0,q0poly8x16x2_t vzipq_p8(poly8x16_t a, poly8x16_t b); // VZIP.8 q0,q0poly16x8x2_t vzipq_p16(poly16x8_t a, poly16x8_t b); // VZIP.16 q0,q0反 向 交 叉 存 取 元 素int8x8x2_t vuzp_s8(int8x8_t a, int8x8_t b); // VUZP.8 d0,d0int16x4x2_t vuzp_s16(int16x4_t a, int16x4_t b); // VUZP.16 d0,d0int32x2x2_t vuzp_s32(int32x2_t a, int32x2_t b); // VUZP.32 d0,d0uint8x8x2_t vuzp_u8(uint8x8_t a, uint8x8_t b); // VUZP.8 d0,d0uint16x4x2_t vuzp_u16(uint16x4_t a, uint16x4_t b); // VUZP.16 d0,d0uint32x2x2_t vuzp_u32(uint32x2_t a, uint32x2_t b); // VUZP.32 d0,d0float32x2x2_t vuzp_f32(float32x2_t a, float32x2_t b); // VUZP.32 d0,d0poly8x8x2_t vuzp_p8(poly8x8_t a, poly8x8_t b); // VUZP.8 d0,d0poly16x4x2_t vuzp_p16(poly16x4_t a, poly16x4_t b); // VUZP.16 d0,d0int8x16x2_t vuzpq_s8(int8x16_t a, int8x16_t b); // VUZP.8 q0,q0int16x8x2_t vuzpq_s16(int16x8_t a, int16x8_t b); // VUZP.16 q0,q0int32x4x2_t vuzpq_s32(int32x4_t a, int32x4_t b); // VUZP.32 q0,q0uint8x16x2_t vuzpq_u8(uint8x16_t a, uint8x16_t b); // VUZP.8 q0,q0uint16x8x2_t vuzpq_u16(uint16x8_t a, uint16x8_t b); // VUZP.16 q0,q0uint32x4x2_t vuzpq_u32(uint32x4_t a, uint32x4_t b); // VUZP.32 q0,q0float32x4x2_t vuzpq_f32(float32x4_t a, float32x4_t b); // VUZP.32 q0,q0poly8x16x2_t vuzpq_p8(poly8x16_t a, poly8x16_t b); // VUZP.8 q0,q0poly16x8x2_t vuzpq_p16(poly16x8_t a, poly16x8_t b); // VUZP.16 q0,q0<strong>ARM</strong> DUI 0348BC Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. E-61ID090708Non-Confidential, Unrestricted Access


使 用 NEON 支 持E.3.31向 量 重 新 解 释 类 型 转 换 运 算在 某 些 情 况 下 , 可 能 希 望 将 向 量 视 为 另 一 类 型 而 不 更 改 其 值 。 提 供 了 一 组 内 在函 数 以 执 行 此 类 型 的 转 换 。语 法vreinterpret{q}_dsttype_srctype其 中 :q指 定 对 128 位 向 量 执 行 转 换 。 如 果 不 存 在 128 位 向 量 , 则 对 64 位向 量 执 行 转 换 。dsttype 表 示 要 转 换 成 的 类 型 。srctype 表 示 被 转 换 的 类 型 。示 例以 下 内 在 函 数 将 四 个 有 符 号 16 位 整 数 组 成 的 向 量 重 新 解 释 为 四 个 无 符 号 整 数 组成 的 向 量 :uint16x4_t vreinterpret_u16_s16(int16x4_t a);以 下 内 在 函 数 将 四 个 32 位 浮 点 值 整 数 组 成 的 向 量 重 新 解 释 为 四 个 有 符 号 整 数 组成 的 向 量 。int8x16_t vreinterpretq_s8_f32(float32x4_t a);这 些 转 换 不 会 更 改 向 量 所 表 示 的 位 模 式 。E-62 Copyright © 2007-2009 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DUI 0348BCNon-Confidential, Unrestricted AccessID090708

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

Saved successfully!

Ooh no, something went wrong!