ZHCUAQ1F july   2015  – april 2023

 

  1.   请先阅读
    1.     关于本手册
    2.     标记规则
    3.     相关文档
    4.     德州仪器 (TI) 提供的相关文档
    5.     商标
  2. 软件开发工具简介
    1. 1.1 软件开发工具概述
    2. 1.2 编译器接口
    3. 1.3 ANSI/ISO 标准
    4. 1.4 输出文件
    5. 1.5 实用程序
  3. 开始使用代码生成工具
    1. 2.1 Code Composer Studio 项目如何使用编译器
    2. 2.2 从命令行编译
  4. 使用 C/C++ 编译器
    1. 3.1  关于编译器
    2. 3.2  调用 C/C++ 编译器
    3. 3.3  使用选项更改编译器的行为
      1. 3.3.1  链接器选项
      2. 3.3.2  常用选项
      3. 3.3.3  其他有用的选项
      4. 3.3.4  运行时模型选项
      5. 3.3.5  选择目标 CPU 版本(--silicon_version 选项)
      6. 3.3.6  符号调试和分析选项
      7. 3.3.7  指定文件名
      8. 3.3.8  更改编译器解释文件名的方式
      9. 3.3.9  更改编译器处理 C 文件的方式
      10. 3.3.10 更改编译器解释和命名扩展名的方式
      11. 3.3.11 指定目录
      12. 3.3.12 汇编器选项
    4. 3.4  通过环境变量控制编译器
      1. 3.4.1 设置默认编译器选项 (C6X_C_OPTION)
      2. 3.4.2 命名一个或多个备用目录 (C6X_C_DIR)
    5. 3.5  控制预处理器
      1. 3.5.1  预先定义的宏名称
      2. 3.5.2  #include 文件的搜索路径
        1. 3.5.2.1 在 #include 文件搜索路径(--include_path 选项)中新增目录
      3. 3.5.3  支持#warning 和 #warn 指令
      4. 3.5.4  生成预处理列表文件(--preproc_only 选项)
      5. 3.5.5  预处理后继续编译(--preproc_with_compile 选项)
      6. 3.5.6  生成带有注释的预处理列表文件(--preproc_with_comment 选项)
      7. 3.5.7  生成带有行控制详细信息的预处理列表(--preproc_with_line 选项)
      8. 3.5.8  为 Make 实用程序生成预处理输出(--preproc_dependency 选项)
      9. 3.5.9  生成包含#include在内的文件列表(--preproc_includes 选项)
      10. 3.5.10 在文件中生成宏列表(--preproc_macros 选项)
    6. 3.6  将参数传递给 main()
    7. 3.7  了解诊断消息
      1. 3.7.1 控制诊断消息
      2. 3.7.2 如何使用诊断抑制选项
    8. 3.8  其他消息
    9. 3.9  生成交叉参考列表信息(--gen_cross_reference_listing 选项)
    10. 3.10 生成原始列表文件(--gen_preprocessor_listing 选项)
    11. 3.11 使用内联函数扩展
      1. 3.11.1 内联内在函数运算符
      2. 3.11.2 内联限制
      3. 3.11.3 不受保护定义控制的内联
        1. 3.11.3.1 使用内联关键字
      4. 3.11.4 保护内联和 _INLINE 预处理器符号
        1. 3.11.4.1 头文件 string.h
        2. 3.11.4.2 库定义文件
    12. 3.12 中断灵活性选项(--interrupt_threshold 选项)
    13. 3.13 使用交叉列出功能
    14. 3.14 生成和使用性能建议
    15. 3.15 关于应用程序二进制接口
    16. 3.16 启用入口挂钩和出口挂钩函数
  5. 优化您的代码
    1. 4.1  调用优化
    2. 4.2  控制代码大小与速度
    3. 4.3  执行文件级优化(--opt_level=3 选项)
      1. 4.3.1 创建优化信息文件(--gen_opt_info 选项)
    4. 4.4  程序级优化(--program_level_compile 和 --opt_level=3 选项)
      1. 4.4.1 控制程序级优化(--call_assumptions 选项)
      2. 4.4.2 混合 C/C++ 和汇编代码时的优化注意事项
    5. 4.5  自动内联扩展(--auto_inline 选项)
    6. 4.6  优化软件流水线
      1. 4.6.1 关闭软件流水线(--disable_software_pipeline 选项)
      2. 4.6.2 软件流水线信息
        1. 4.6.2.1 软件流水线信息
        2. 4.6.2.2 软件流水线信息术语
        3. 4.6.2.3 不符合软件流水线的循环的消息循环
        4. 4.6.2.4 流水线故障消息
        5. 4.6.2.5 由 --debug_software_pipeline 选项生成寄存器使用表
      3. 4.6.3 折叠 序言和结语以改善性能和代码大小
        1. 4.6.3.1 推测执行
        2. 4.6.3.2 选择最佳阈值
    7. 4.7  冗余循环
    8. 4.8  通过 SPLOOP 使用循环缓冲区
    9. 4.9  减小代码大小(--opt_for_space(或 -ms)选项)
    10. 4.10 使用反馈制导优化
      1. 4.10.1 反馈向导优化
        1. 4.10.1.1 第 1 阶段 - 收集程序分析信息
        2. 4.10.1.2 第 2 阶段 - 使用应用程序分析信息进行优化
        3. 4.10.1.3 生成和使用配置文件信息
        4. 4.10.1.4 反馈制导优化的应用示例
        5. 4.10.1.5 .ppdata 段
        6. 4.10.1.6 反馈制导优化和代码大小调整
        7. 4.10.1.7 检测程序执行开销
        8. 4.10.1.8 无效的分析数据
      2. 4.10.2 分析数据解码器
      3. 4.10.3 反馈制导优化 API
      4. 4.10.4 反馈制导优化总结
    11. 4.11 使用配置文件信息获得更好的程序缓存布局并分析代码覆盖率
      1. 4.11.1 背景和动机
      2. 4.11.2 代码覆盖
        1. 4.11.2.1 第 1 阶段 - 收集程序分析信息
        2. 4.11.2.2 第 2 阶段 -- 生成代码覆盖信息报告
      3. 4.11.3 您期待看到哪些性能改进?
        1. 4.11.3.1 评估 L1P 缓存性能
      4. 4.11.4 程序缓存布局相关的特征和功能
        1. 4.11.4.1 路径分析器
        2. 4.11.4.2 分析选项
        3. 4.11.4.3 环境变量
        4. 4.11.4.4 程序缓存布局工具 clt6x
        5. 4.11.4.5 连接器
        6. 4.11.4.6 链接器命令文件运算符 unordered()
      5. 4.11.5 程序指令缓存布局开发流程
        1. 4.11.5.1 收集动态分析信息
        2. 4.11.5.2 从动态分析信息中生成首选功能顺序
        3. 4.11.5.3 在重新构建的应用程序中使用首选函数顺序
      6. 4.11.6 带有加权调用图 (WCG) 信息的逗号分隔值 (CSV) 文件
      7. 4.11.7 链接器命令文件运算符 - unordered()
        1. 4.11.7.1 unordered() 运算符的输出段
        2.       124
        3. 4.11.7.2 为 生成的链接器映射文件
        4. 4.11.7.3 关于 Dot (.)出现 unordered() 的表达式
          1. 4.11.7.3.1 关于a位置表达式
          2.        128
        5. 4.11.7.4 GROUP 和 UNION
          1. 4.11.7.4.1 将 unordered()应用于GROUP
        6.       131
      8. 4.11.8 注意事项
    12. 4.12 指示是否使用了某些别名技术
      1. 4.12.1 采用某些别名时使用 --aliased_variables 选项
      2. 4.12.2 使用 --no_bad_aliases 选项来指示未采用这些技术
      3. 4.12.3 将 --no_bad_aliases 选项与汇编优化器一起使用
    13. 4.13 防止重新排列关联浮点运算
    14. 4.14 在优化代码中谨慎使用 asm 语句
    15. 4.15 使用性能建议优化您的代码
      1. 4.15.1  Advice #27000
      2. 4.15.2  Advice #27001 提高优化级别
      3. 4.15.3  Advice #27002 不要关闭软件流水线
      4. 4.15.4  Advice #27003 避免使用调试选项进行编译
      5. 4.15.5  Advice #27004 未生成性能建议
      6. 4.15.6  Advice #30000 防止由于调用导致循环不合格
      7. 4.15.7  Advice #30001 防止由于 rts 调用导致循环不合格
      8. 4.15.8  Advice #30002 防止由于 asm 语句导致循环不合格
      9. 4.15.9  Advice #30003 防止复杂条件导致的循环不合格
      10. 4.15.10 Advice #30004 防止由于 switch 语句导致循环不合格
      11. 4.15.11 Advice #30005 防止因算术运算导致循环不合格
      12. 4.15.12 Advice #30006 防止由于调用导致循环不合格 (2)
      13. 4.15.13 Advice #30007 防止由于 rts 调用导致循环不合格 (2)
      14. 4.15.14 Advice #30008 改进循环;使用 restrict 进行限定
      15. 4.15.15 Advice #30009 改进循环;添加 MUST_ITERATE pragma
      16. 4.15.16 Advice #30010 改进循环;添加 MUST_ITERATE pragma (2)
      17. 4.15.17 Advice #30011 改进循环;添加 _nasssert()
    16. 4.16 通过优化使用交叉列出特性
    17. 4.17 调试和分析优化代码
      1. 4.17.1 分析优化的代码
    18. 4.18 正在执行什么类型的优化?
      1. 4.18.1  基于成本的寄存器分配
      2. 4.18.2  别名消歧
      3. 4.18.3  分支优化和控制流简化
      4. 4.18.4  数据流优化
      5. 4.18.5  表达式简化
      6. 4.18.6  函数的内联扩展
      7. 4.18.7  函数符号别名
      8. 4.18.8  归纳变量和强度降低
      9. 4.18.9  循环不变量代码运动
      10. 4.18.10 循环旋转
      11. 4.18.11 向量化 (SIMD)
      12. 4.18.12 指令排程
      13. 4.18.13 寄存器变量
      14. 4.18.14 寄存器跟踪/定位
      15. 4.18.15 软件流水线
  6. 使用汇编优化器
    1. 5.1 可提高性能的代码开发流程
    2. 5.2 关于汇编优化器
    3. 5.3 编写线性汇编需要了解的内容
      1. 5.3.1 线性汇编源语句格式
      2. 5.3.2 线性汇编的寄存器规格
        1. 5.3.2.1 用于计算点积的线性汇编代码
        2.       183
        3. 5.3.2.2 用于计算点积的 C 代码
        4.       185
        5. 5.3.2.3 指定寄存器对
        6.       187
        7. 5.3.2.4 指定四倍字寄存器(仅限 C6600)
        8.       189
      3. 5.3.3 线性汇编的功能单元规格
      4. 5.3.4 使用线性汇编源代码注释
        1. 5.3.4.1 显示注释的 Lmac 函数代码
      5. 5.3.5 汇编文件保留您的符号寄存器名称
    4. 5.4 汇编优化器指令
      1.      .call
      2.      .circ
      3.      .cproc/.endproc
      4.      .map
      5.      .mdep
      6.      .mptr
      7.      .no_mdep
      8.      .pref
      9.      .proc/.endproc
      10.      .reg
      11.      .rega/.regb
      12.      .reserve
      13.      .return
      14.      .trip
      15.      .volatile
      16. 5.4.1 过程中不允许使用的指令
    5. 5.5 避免与汇编优化器发生存储器组冲突
      1. 5.5.1 防止存储器组冲突
        1. 5.5.1.1 指定存储器组信息的加载和存储指令
      2. 5.5.2 避免存储器组冲突的点积示例
        1. 5.5.2.1 点积的 C 代码
        2. 5.5.2.2 点积的线性汇编
        3. 5.5.2.3 点积软件流水线内核
        4.       218
        5. 5.5.2.4 中的点积展开以防止存储器组冲突
        6.       220
        7. 5.5.2.5 从 展开的点积内核
        8.       222
      3. 5.5.3 索引指针的存储器组冲突
        1. 5.5.3.1 对索引指针使用 .mptr
      4. 5.5.4 存储器组冲突算法
    6. 5.6 存储器别名消歧
      1. 5.6.1 汇编优化器如何处理存储器引用(默认)
      2. 5.6.2 使用 --no_bad_aliases 选项处理存储器引用
      3. 5.6.3 使用 .no_mdep 指令
      4. 5.6.4 使用 .mdep 指令来识别特定的存储器依赖关系
        1. 5.6.4.1 对存储器引用进行批注
        2.       232
        3. 5.6.4.2 使用 .mdep ld1、st1 的软件流水线
        4.       234
        5. 5.6.4.3 使用 .mdep st1、ld1 和 .mdep ld1、st1 的软件流水线
        6.       236
      5. 5.6.5 存储器别名示例
  7. 链接 C/C++ 代码
    1. 6.1 通过编译器调用链接器(-z 选项)
      1. 6.1.1 单独调用链接器
      2. 6.1.2 调用链接器作为编译步骤的一部分
      3. 6.1.3 禁用链接器(--compile_only 编译器选项)
    2. 6.2 链接器代码优化
      1. 6.2.1 条件链接
      2. 6.2.2 生成函数子段(--gen_func_subsections 编译器选项)
      3. 6.2.3 生成聚合数据子段(--gen_data_subsections 编译器选项)
    3. 6.3 控制链接过程
      1. 6.3.1 包含运行时支持库
        1. 6.3.1.1 自动选择运行时支持库
          1. 6.3.1.1.1 使用 --issue_remarks 选项
        2. 6.3.1.2 手动选择运行时支持库
        3. 6.3.1.3 用于搜索符号的库顺序
      2. 6.3.2 运行时初始化
      3. 6.3.3 全局对象构造函数
      4. 6.3.4 指定全局变量初始化类型
      5. 6.3.5 指定在内存中分配段的位置
      6. 6.3.6 链接器命令文件示例
  8. C/C++ 语言实现
    1. 7.1  TMS320C6000 C 的特征
      1. 7.1.1 实现定义的行为
    2. 7.2  TMS320C6000 C++ 的特征
    3. 7.3  数据类型
      1. 7.3.1 枚举类型大小
      2. 7.3.2 矢量数据类型
    4. 7.4  文件编码和字符集
    5. 7.5  关键字
      1. 7.5.1 complex 关键字
      2. 7.5.2 const 关键字
      3. 7.5.3 __cregister 关键字
        1. 7.5.3.1 定义和使用控制寄存器
      4. 7.5.4 __interrupt 关键字
      5. 7.5.5 __near 和 __far 关键字
        1. 7.5.5.1 near 和 far 数据对象
        2. 7.5.5.2 near 和 far 函数调用
      6. 7.5.6 restrict 关键字
      7. 7.5.7 volatile 关键字
    6. 7.6  C++ 异常处理
    7. 7.7  寄存器变量和参数
    8. 7.8  __asm 语句
    9. 7.9  pragma 指令
      1. 7.9.1  CALLS Pragma
      2. 7.9.2  CODE_ALIGN Pragma
      3. 7.9.3  CODE_SECTION Pragma
      4. 7.9.4  DATA_ALIGN Pragma
      5. 7.9.5  DATA_MEM_BANK Pragma
        1. 7.9.5.1 使用 DATA_MEM_BANK Pragma
      6. 7.9.6  DATA_SECTION Pragma
        1. 7.9.6.1 使用 DATA_SECTION Pragma C 源文件
        2. 7.9.6.2 使用 DATA_SECTION Pragma C++ 源文件
        3. 7.9.6.3 使用 DATA_SECTION Pragma 汇编源文件
      7. 7.9.7  诊断消息 Pragma
      8. 7.9.8  FORCEINLINE Pragma
      9. 7.9.9  FORCEINLINE_RECURSIVE Pragma
      10. 7.9.10 FUNC_ALWAYS_INLINE Pragma
      11. 7.9.11 FUNC_CANNOT_INLINE Pragma
      12. 7.9.12 FUNC_EXT_CALLED Pragma
      13. 7.9.13 FUNC_INTERRUPT_THRESHOLD Pragma
      14. 7.9.14 FUNC_IS_PURE Pragma
      15. 7.9.15 FUNC_IS_SYSTEM Pragma
      16. 7.9.16 FUNC_NEVER_RETURNS Pragma
      17. 7.9.17 FUNC_NO_GLOBAL_ASG Pragma
      18. 7.9.18 FUNC_NO_IND_ASG Pragma
      19. 7.9.19 FUNCTION_OPTIONS Pragma
      20. 7.9.20 INTERRUPT Pragma
      21. 7.9.21 LOCATION Pragma
      22. 7.9.22 MUST_ITERATE Pragma
        1. 7.9.22.1 MUST_ITERATE Pragma 语法
        2. 7.9.22.2 使用 MUST_ITERATE 扩展编译器对循环的了解
      23. 7.9.23 NMI_INTERRUPT Pragma
      24. 7.9.24 NOINIT 和 PERSISTENT Pragma
      25. 7.9.25 NOINLINE Pragma
      26. 7.9.26 NO_HOOKS Pragma
      27. 7.9.27 once Pragma
      28. 7.9.28 pack Pragma
      29. 7.9.29 PROB_ITERATE Pragma
      30. 7.9.30 RETAIN Pragma
      31. 7.9.31 SET_CODE_SECTION 和 SET_DATA_SECTION Pragma
      32. 7.9.32 STRUCT_ALIGN Pragma
      33. 7.9.33 UNROLL Pragma
    10. 7.10 _Pragma 运算符
    11. 7.11 应用程序二进制接口
    12. 7.12 目标文件符号命名规则(链接名)
    13. 7.13 更改 ANSI/ISO C/C++ 语言模式
      1. 7.13.1 C99 支持 (--c99)
      2. 7.13.2 C11 支持 (--c11)
      3. 7.13.3 严格 ANSI 模式和宽松 ANSI 模式(--strict_ansi 和 --relaxed_ansi)
    14. 7.14 GNU 和 Clang 语言扩展
      1. 7.14.1 扩展
      2. 7.14.2 函数属性
      3. 7.14.3 For 循环属性
      4. 7.14.4 变量属性
      5. 7.14.5 类型属性
      6. 7.14.6 内置函数
    15. 7.15 向量数据类型的运算和函数
      1. 7.15.1 向量字面量和串联
      2. 7.15.2 向量的一元和二进制运算符
      3. 7.15.3 矢量的混合运算符
      4. 7.15.4 向量的转换函数
      5. 7.15.5 矢量的重新解释函数
      6. 7.15.6 使用 printf() 设置矢量
      7. 7.15.7 内置矢量函数
  9. 运行时环境
    1. 8.1  存储器模型
      1. 8.1.1
      2. 8.1.2 C/C++ 系统堆栈
      3. 8.1.3 动态存储器分配
      4. 8.1.4 数据内存模型
        1. 8.1.4.1 确定数据地址模型
        2. 8.1.4.2 DP 相对寻址与绝对寻址
        3. 8.1.4.3 远常量对象
      5. 8.1.5 函数调用的蹦床生成
      6. 8.1.6 位置无关数据
    2. 8.2  对象表示
      1. 8.2.1 数据类型存储
        1. 8.2.1.1 char 和 short 数据类型(有符号和无符号)
        2. 8.2.1.2 enum、int 和 long 数据类型(有符号和无符号)
        3. 8.2.1.3 浮点数据类型
        4. 8.2.1.4 __int40_t 数据类型(有符号和无符号)
        5. 8.2.1.5 long long 数据类型(有符号和无符号)
        6. 8.2.1.6 double 和 long double 数据类型
        7. 8.2.1.7 指向数据成员类型的指针
        8. 8.2.1.8 指向成员函数类型的指针
        9. 8.2.1.9 结构和数组
      2. 8.2.2 位字段
      3. 8.2.3 字符串常量
      4.      366
    3. 8.3  寄存器惯例
    4. 8.4  函数结构和调用惯例
      1. 8.4.1 函数如何进行调用
      2. 8.4.2 被调用函数如何响应
      3. 8.4.3 访问参数和局部变量
    5. 8.5  访问 C 和 C++ 中的链接器符号
    6. 8.6  将 C 和 C++ 与汇编语言相连
      1. 8.6.1  使用汇编语言模块与 C/C++ 代码
      2. 8.6.2  从 C/C++ 访问汇编语言函数
        1. 8.6.2.1 从 C/C++ 程序调用汇编语言函数
        2. 8.6.2.2 由 调用的汇编语言程序
        3.       378
      3. 8.6.3  从 C/C++ 访问汇编语言变量
        1. 8.6.3.1 访问汇编语言全局变量
          1. 8.6.3.1.1 汇编语言变量程序
          2. 8.6.3.1.2 C 程序从 中访问汇编语言
        2.       383
        3. 8.6.3.2 访问汇编语言常量
          1. 8.6.3.2.1 从 C 语言访问汇编语言常量
          2. 8.6.3.2.2 的汇编语言程序
          3.        387
      4. 8.6.4  与汇编源代码共享 C/C++ 头文件
      5. 8.6.5  使用内联汇编语言
      6. 8.6.6  使用内在函数访问汇编语言语句
      7. 8.6.7  __x128_t 容器类型
        1. 8.6.7.1 __x128_t 容器类型
        2.       393
      8. 8.6.8  __float2_t 容器类型
      9. 8.6.9  使用内在函数进行中断控制和原子代码段
      10. 8.6.10 使用未对齐的数据和 64 位值
        1. 8.6.10.1 使用 _mem8 内在函数
      11. 8.6.11 通过 MUST_ITERATE 和 _nassert 来启用 SIMD 并扩展编译器对循环的了解
      12. 8.6.12 对齐数据的方法
        1. 8.6.12.1 数组的基址
        2. 8.6.12.2 相对于数组基址的偏移
        3. 8.6.12.3 动态存储器分配
        4. 8.6.12.4 结构体或类的成员
          1. 8.6.12.4.1 结构中的数组
          2. 8.6.12.4.2 类中的数组
          3.        406
      13. 8.6.13 SAT 位副作用
      14. 8.6.14 IRP 和 AMR 规则
      15. 8.6.15 浮点和饱和控制寄存器副作用
    7. 8.7  中断处理
      1. 8.7.1 保存 SGIE 位
      2. 8.7.2 在中断期间保存寄存器
      3. 8.7.3 使用 C/C++ 中断例程
      4. 8.7.4 使用汇编语言中断例程
    8. 8.8  运行时支持算术例程
    9. 8.9  系统初始化
      1. 8.9.1 用于系统预初始化的引导挂钩函数
      2. 8.9.2 变量的自动初始化
        1. 8.9.2.1 零初始化变量
        2. 8.9.2.2 的直接初始化
        3. 8.9.2.3 运行时变量自动初始化
        4. 8.9.2.4 的自动初始化表
          1. 8.9.2.4.1 数据格式遵循的长度
          2. 8.9.2.4.2 零初始化格式
          3. 8.9.2.4.3 行程编码 (RLE) 格式
          4. 8.9.2.4.4 Lempel-Ziv-Storer-Szymanski 压缩 (LZSS) 格式
          5. 8.9.2.4.5 用于处理 C 自动初始化表的 C 代码示例
        5. 8.9.2.5 在加载时初始化变量
        6. 8.9.2.6 全局构造函数
    10. 8.10 支持多线程应用
      1. 8.10.1 使用 OpenMP 进行编译
      2. 8.10.2 多线程运行时支持
        1. 8.10.2.1 运行时线程安全
        2. 8.10.2.2 线程创建、初始化和终止
        3. 8.10.2.3 线程局部存储 (TLS)
        4. 8.10.2.4 访问共享数据
  10. 使用运行时支持函数并构建库
    1. 9.1 C 和 C++ 运行时支持库
      1. 9.1.1 将代码与对象库链接
      2. 9.1.2 头文件
      3. 9.1.3 修改库函数
      4. 9.1.4 支持字符串处理
      5. 9.1.5 极少支持国际化
      6. 9.1.6 时间和时钟函数支持
      7. 9.1.7 允许打开的文件数量
      8. 9.1.8 库命名规则
    2. 9.2 C I/O 函数
      1. 9.2.1 高级别 I/O 函数
        1. 9.2.1.1 格式化和格式转换缓冲区
      2. 9.2.2 低级 I/O 实现概述
        1.       open
        2.       close
        3.       read
        4.       write
        5.       lseek
        6.       unlink
        7.       rename
      3. 9.2.3 器件驱动程序级别 I/O 函数
        1.       DEV_open
        2.       DEV_close
        3.       DEV_read
        4.       DEV_write
        5.       DEV_lseek
        6.       DEV_unlink
        7.       DEV_rename
      4. 9.2.4 为 C I/O 添加用户定义的器件驱动程序
        1. 9.2.4.1 将默认流映射到器件
      5. 9.2.5 器件前缀
        1.       add_device
        2.       470
        3. 9.2.5.1 为 C I/O 器件编程
    3. 9.3 处理可重入性(_register_lock() 和 _register_unlock() 函数)
    4. 9.4 库构建流程
      1. 9.4.1 所需的非德州仪器 (TI) 软件
      2. 9.4.2 使用库构建流程
        1. 9.4.2.1 通过链接器自动重建标准库
        2. 9.4.2.2 手动调用 mklib
          1. 9.4.2.2.1 构建标准库
          2. 9.4.2.2.2 共享或只读库目录
          3. 9.4.2.2.3 使用自定义选项构建库
          4. 9.4.2.2.4 mklib 程序选项摘要
      3. 9.4.3 扩展 mklib
        1. 9.4.3.1 底层机制
        2. 9.4.3.2 来自其他供应商的库
  11. 10C++ 名称还原器
    1. 10.1 调用 C++ 名称还原器
    2. 10.2 C++ 名称还原器的示例用法
  12.   A 术语表
    1.     A.1 术语
  13.   B 修订历史记录
  14.   491
  15.   492
  16.   B 早期修订版本

使用内在函数访问汇编语言语句

C6000 编译器可识别多种内在函数运算符。一些汇编语句难以或无法用 C/C++ 表达,而内在函数能够表达这类语句的含义。内在函数的用法与函数类似;可将 C/C++ 变量与这些内在函数结合使用,就像在任何普通函数中一样。

内在函数通过前导下划线指定,可像调用函数一样进行访问。例如:

int x1, x2, y;
y = _sadd(x1, x2);
注: C 语言与汇编语言中的内在函数指令

在某些情况下,编译器可能不会使用与内在函数完全对应的汇编语言指令。在这类情况下,程序的含义不会改变。

列举内在函数的表格适用于以下器件系列:

表 8-3 器件系列和内在函数表
系列表 8-5表 8-6表 8-7
C6400+
C6740
C6600

表 8-4 对 C6000 内在函数进行了汇总,并说明了哪个器件支持哪个内在函数。

表 8-4 各器件对 C6000 C/C++ 内在函数的支持
内在函数C6400+C6740C6600
_abs
_abs2
_add2
_add4
_addsub
_addsub2
_amem2
_amem2_const
_amem4
_amem4_const
_amem8
_amem8_const
_amem8_f2
_amem8_f2_const
_amemd8
_amemd8_const
_avg2
_avgu4
_bitc4
_bitr
_ccmatmpy
_ccmatmpyr1
_ccmpy32r1
_clr
_clrr
_cmatmpy
_cmatmpyr1
_cmpeq2
_cmpeg4
_cmpgt2
_cmpgtu4
_cmplt2
_cmpltu4
_cmpy
_cmpy32r1
_cmpyr
_cmpyr1
_cmpysp
_complex_conjugate_mpysp
_complex_mpysp
_crot270
_crot90
_dadd
_dadd2
_daddsp
_dadd_c
_dapys2
_davg2
_davgnr2
_davgnru4
_davgu4
_dccmpyr1
_dcmpeq2
_dcmpeq4
_dcmpgt2
_dcmpgtu4
_dccmpy
_dcmpy
_dcmpyr1
_dcrot90
_dcrot270
_ddotp4
_ddotp4h
_ddotph2
_ddotph2r
_ddotpl2
_ddotpl2r
_ddotpsu4h
_deal
_dinthsp
_dinthspu
_dintsp
_dintspu
_dmax2
_dmaxu4
_dmin2
_dminu4
_dmpy2
_dmpysp
_dmpysu4
_dmpyu2
_dmpyu4
_dmv
_dmvd
_dotp2
_dotp4h
_dotp4hll
_dotpn2
_dotpnrsu2
_dotpnrus2
_dotprsu2
_dotpsu4
_dotpus4
_dotpsu4h
_dotpsu4hll
_dotpu4
_dpack2
_dpackh2
_dpackh4
_dpacklh2
_dpacklh4
_dpackl2
_dpackl4
_dpackx2
_dpint
_dsadd
_dsadd2
_dshl
_dshl2
_dshr
_dshr2
_dshru
_dshru2
_dsmpy2
_dspacku4
_dspint
_dspinth
_dssub
_dssub2
_dsub
_dsub2
_dsubsp
_dtol
_dtoll
_dxpnd2
_dxpnd4
_ext
_extr
_extu
_extur
_f2tol
_f2toll
_fabs
_fabsf
_fdmvd_f2
_fdmv_f2
_ftoi
_gmpy
_gmpy4
_hi
_hill
_itod
_itof
_itoll
_labs
_land
_landn
_ldotp2
_lmbd
_lnorm
_lo
_loll
_lor
_lsadd
_lssub
_ltod
_lltod
_lltof2
_ltof2
_max2
_maxu4
_mfence
_min2
_minu4
_mem2
_mem2_const
_mem4
_mem4_const
_mem8
_mem8_const
_mem8_f2
_mem8_f2_const
_memd8
_memd8_const
_mpy
_mpy2ir
_mpy2ll
_mpy32
_mpy32ll
_mpy32su
_mpy32u
_mpy32us
_mpyh
_mpyhill
_mpyihll
_mpyilll
_mpyhir
_mpyihr
_mpyilr
_mpyhl
_mpyhlu
_mpyhslu
_mpyhsu
_myphu
_mpyhuls
_mpyhus
_mpyidll
_mpylh
_mpylhu
_mpylill
_mpylir
_mpylshu
_mpyluhs
_mpysp2dp
_mpyspdp
_mpysu
_mpysu4ll
_mpyus4ll
_mpyu
_mpyu2
_mpyu4ll
_mpyus
_mvd
_nassert
_norm
_pack2
_packh2
_packh4
_packhl2
_packl4
_packlh2
_qmpy32
_qmpysp
_qsmpy32r1
_rcpdp
_rcpsp
_rsqrdp
_rsqrsp
_rotl
_rpack2
_sadd
_sadd2
_saddsub
_saddsub2
_saddu4
_saddus2
_saddsu2
_sat
_set
_setr
_shfl
_shfl3
_shl2
_shlmb
_shr2
_shrmb
_shru2
_smpy
_smpy2ll
_smpy32
_smpyh
_smpyhl
_smpylh
_spack2
_spacku4
_spint
_sshl
_sshvl
_sshvr
_ssub
_ssub2
_sub2
_sub4
_subabs4
_subc
_swap2
_swap4
_unpkbu4
_unpkh2
_unpkhu2
_unpkhu4
_unpklu4
_xorll_c
_xormpy
_xpnd2
_xpnd4

表 8-5 中列出的内在函数能够在所有 C6000 器件上使用。它们对应于所示的 C6000 汇编语言指令。更多信息,请参阅TMS320C6000 CPU 和指令集参考指南

如需特定于 C6740 和 C6600 的内在函数列表,请参阅表 8-6。如需特定于 C6600 的内在函数列表,请参阅表 8-7

以下表格中列出的某些项目实际上已作为指向内在函数的宏命令在 c6x.h 头文件中定义。此头文件位于编译器的“include”目录中。您的代码必须包含此头文件,才能使用所述的宏命令。

表 8-5 TMS320C6000 C/C++ 编译器内在函数
C/C++ 编译器内在函数汇编
指令
说明
int _abs (int src);
__int40_t _labs (__int40_t src);
ABS返回 src 的饱和绝对值
int _abs2 (int src);ABS2计算每个 16 位值的绝对值
int _add2 (int src1, int src2);ADD2将 src1 的上半部分和下半部分加到 src2 的上半部分和下半部分并返回结果。下半部分相加的任何溢出均不影响上半部分相加。
int _add4 (int src1, int src2);ADD4对几对打包的 8 位数字执行二进制补码加法
long long _addsub (int src1, int src2);ADDSUB并行执行加法和减法。
long long _addsub2 (int src1, int src2);ADDSUB2并行执行 ADD2 和 SUB2。
ushort & _amem2 (void *ptr);LDHU
STH
允许对齐加载 2 个字节并将其存储至存储器。指针必须与两字节边界对齐。(1)
const ushort & _amem2_const (const void *ptr);LDHU允许从存储器对齐加载 2 个字节。指针必须与两字节边界对齐。(1)
unsigned & _amem4 (void *ptr);LDW
STW
允许对齐加载 4 个字节并将其存储至存储器。指针必须与四字节边界对齐。(1)
const unsigned & _amem4_const (const void *ptr);LDW允许从存储器对齐加载 4 个字节。指针必须与四字节边界对齐。(1)
long long & _amem8 (void *ptr);LDDW
STDW
允许对齐加载 8 个字节并将其存储至存储器。指针必须与八字节边界对齐。将使用 LDDW 或 STDW 指令。
const long long & _amem8_const (const void *ptr);LDW/LDW
LDDW
允许从存储器对齐加载 8 个字节。指针必须与八字节边界对齐。(2)
__float2_t & _amem8_f2(void * ptr);LDDW
STDW
允许对齐加载 8 个字节并将其存储至存储器。指针必须与八字节边界对齐。这被定义为一个宏命令。必须包含 c6x.h。(2)(1)
const __float2_t & _amem8_f2_const(void * ptr);LDDW允许从存储器对齐加载 8 个字节。指针必须与八字节边界对齐。这被定义为一个宏命令。必须包含 c6x.h。(2)(1)
double & _amemd8 (void *ptr);LDDW
STDW
允许对齐加载 8 个字节并将其存储至存储器。指针必须与八字节边界对齐。(1)(2)
将使用 LDDW 或 STDW 指令。
const double & _amemd8_const (const void *ptr);LDW/LDW
LDDW
允许从存储器对齐加载 8 个字节。指针必须与八字节边界对齐。(1)(2)
int _avg2 (int src1, int src2);AVG2计算每对有符号 16 位值的平均值
unsigned _avgu4 (unsigned src1, unsigned src2);AVGU4计算每对无符号 8 位值的平均值
unsigned _bitc4 (unsigned src);BITC4对于 src 中的每个 8 位数量,该数目的 1 位会写入返回值中的对应位置
unsigned _bitr (unsigned src);BITR反转位的顺序
unsigned _clr (unsigned src2, unsigned csta,
unsigned cstb);
CLR清除 src2 中的指定字段。要清除字段的起始位和结束位分别由 csta 和 cstb 指定。
unsigned _clrr (unsigned src2, int src1);CLR清除 src2 中的指定字段。要清除字段的起始位和结束位由 src1 的低 10 位指定。
int _cmpeq2 (int src1, int src2);CMPEQ2对每对 16 位值执行等式比较。等式结果被打包至返回值的两个最低有效位。
int _cmpeq4 (int src1, int src2);CMPEQ4对每对 8 位值执行等式比较。等式结果被打包至返回值的四个最低有效位。
int _cmpgt2 (int src1, int src2);CMPGT2比较每对有符号 16 位值。结果被打包至返回值的两个最低有效位。
unsigned _cmpgtu4 (unsigned src1, unsigned src2);CMPGTU4比较每对无符号 8 位值。结果被打包至返回值的四个最低有效位。
int _cmplt2 (int src1, int src2);CMPLT2交换操作数并调用 _cmpgt2。这被定义为一个宏命令。必须包含 c6x.h。
unsigned _cmpltu4 (unsigned src1, unsigned src2);CMPLTU4交换操作数并调用 _cmpgtu4。这被定义为一个宏命令。必须包含 c6x.h。
long long _cmpy (unsigned src1, unsigned src2);
unsigned _cmpyr (unsigned src1, unsigned src2);
unsigned _cmpyr1 (unsigned src1, unsigned src2 );
CMPY
CMPYR
CMPYR1
执行各种复数乘法运算。
long long _ddotp4 (unsigned src1, unsigned src2);DDOTP4同时执行两个 DOTP2 运算。
long long _ddotph2 (long long src1, unsigned src2);
long long _ddotpl2 (long long src1, unsigned src2);
unsigned _ddotph2r (long long src1, unsigned src2);
unsigned _ddotpl2r (long long src1, unsigned src2);
DDOTPH2
DDOTPL2
DDOTPH2R
DDOTPL2
对两对有符号 16 位打包值执行各种双点积运算。
unsigned _deal (unsigned src);DEAL将 src 的偶数位和奇数位分别提取到两个 16 位值中。
long long _dmv (int src1, int src2);DMV将 src1 置于超长整型值的 32 个 MSB 中,将 src2 置于超长整型值的 32 个 LSB 中。另请参阅 _itoll()。
int _dotp2 (int src1, int src2);
__int40_t _ldotp2 (int src1, int src2);
DOTP2
DOTP2
src1 和 src2 的有符号低 16 位值之积加上 src1 和 src2 的有符号高 16 位值之积。在使用 _dotp2 的情况下,有符号结果会被写入单个 32 位寄存器。在使用 _ldotp2 的情况下,有符号结果会被写入一个 64 位寄存器对。
int _dotpn2 (int src1, int src2);DOTPN2src1 和 src2 的有符号高 16 位值之积减去 src1 和 src2 的有符号低 16 位值之积。
int _dotpnrsu2 (int src1, unsigned src2);DOTPNRSU2src1 和 src2 的高 16 位值之积减去 src1 和 src2 的低 16 位值之积。src1 中的值被视为有符号打包数量;src2 中的值被视为无符号打包数量。2^15 相加,结果为向右移 16 位的符号。
int _dotpnrus2 (unsigned src1, int src2);DOTPNRUS2交换操作数并调用 _dotpnrsu2。这被定义为一个宏命令。必须包含 c6x.h。
int _dotprsu2 (int src1, unsigned src2);DOTPRSU2src1 和 src2 的低 16 位值之积加上 src1 和 src2 的高 16 位值之积。src1 中的值被视为有符号打包数量;src2 中的值被被视为无符号打包数量。2^15 相加,结果为移动 16 位的符号。
int _dotpsu4 (int src1, unsigned src2);
int _dotpus4 (unsigned src1, int src2);
unsigned _dotpu4 (unsigned src1, unsigned src2);
DOTPSU4
DOTPUS4
DOTPU4
对于 src1 和 src2 中的每对 8 位值,将 src1 中的 8 位值乘以 src2 中的 8 位值。将四个乘积相加。
_dotpus4 被定义为一个宏命令。必须包含 c6x.h。
long long _dpack2 (unsigned src1, unsigned src2);DPACK2并行执行 PACK2 和 PACKH2 运算。
long long _dpackx2 (unsigned src1, unsigned src2);DPACKX2并行执行 PACKLH2 和 PACKX2 运算。
__int40_t _dtol (double src);将双精度寄存器对重新解释为一个 __int40_t(存储为寄存器对)。
long long _dtoll (double src);将双精度寄存器对 src 重新解释为一个超长整型寄存器对。
int _ext (int src2, unsigned csta, unsigned cstb);EXT提取 src2 中的指定字段,并加符号扩展至 32 位。提取操作通过先向左移位再有符号向右移位来执行;csta 和 cstb 分别为向左移位和向右移位的位数。
int _extr (int src2, int src1);EXT提取 src2 中的指定字段,并加符号扩展至 32 位。提取操作通过先向左移位再有符号向右移位来执行;向左移位和向右移位的位数由 src1 的低 10 位指定。
unsigned _extu (unsigned src2, unsigned csta ,
unsigned cstb);
EXTU提取 src2 中的指定字段,并加零扩展至 32 位。提取操作通过先向左移位再无符号向右移位来执行;csta 和 cstb 分别为向左移位和向右移位的位数。
unsigned _extur (unsigned src2, int src1);EXTU提取 src2 中的指定字段,并加零扩展至 32 位。提取操作通过先向左移位再无符号向右移位来执行;向左移位和向右移位的位数由 src1 的低 10 位指定。
__float2_t _fdmv_f2(float src1, float src2);DMV将 src1 置于 __float2_t 的 32 个 LSB 中并将 src2 置于 __float2_t 的 32 个 MSB 中。另请参阅 _itoll()。这被定义为一个宏命令。必须包含 c6x.h。
unsigned _ftoi (float src);将浮点型中的位重新解释为无符号值。例如:
_ftoi (1.0) == 1065353216U
unsigned _gmpy (unsigned src1, unsigned src2);GMPY执行伽罗瓦域乘法。
int _gmpy4 (int src1, int src2);GMPY4对 src1 中的四个值与 src2 中的四个并行值执行伽罗瓦域乘法。四个乘积被打包至返回值中。
unsigned _hi (double src);返回双精度寄存器对的高位(奇数)寄存器
unsigned _hill (long long src);返回超长整型寄存器对的高位(奇数)寄存器
double _itod (unsigned src2, unsigned src1);通过重新解释两个无符号值来构建一个新的双精度寄存器对,其中 src2 为高位(奇数)寄存器,而 src1 为低位(偶数)寄存器
float _itof (unsigned src);将无符号型中的位重新解释为浮点值。例如:
_itof (0x3f800000) = 1.0
long long _itoll (unsigned src2, unsigned src1);通过重新解释两个无符号值来构建一个新的超长整型寄存器对,其中 src2 为高位(奇数)寄存器,而 src1 为低位(偶数)寄存器
unsigned _lmbd (unsigned src1, unsigned src2);LMBD搜索 src2 的最左侧 1 或 0,具体由 src1 的 LSB 决定。返回最多到变更位的位数。
unsigned _lo (double src);返回一个双精度寄存器对的低位(偶数)寄存器
unsigned _loll (long long src);返回超长整型寄存器对的低位(偶数)寄存器
double _ltod (__int40_t src);将一个 __int40_t 寄存器对 src 重新解释为一个双精度寄存器对。
double _lltod (long long src);将超长整型寄存器对 src 重新解释为一个双精度寄存器对。
int _max2 (int src1, int src2);
int _min2 (int src1, int src2);
unsigned _maxu4 (unsigned src1, unsigned src2);
unsigned _minu4 (unsigned src1, unsigned src2);
MAX2
MIN2
MAXU4
MINU4
将每对值中的较大值/较小值置于返回值中的相应位置。值可以是 16 位有符号值或 8 位无符号值。
ushort & _mem2 (void * ptr);LDB/LDB
STB/STB
允许未对齐加载 2 个字节并将其存储至存储器(1)
const ushort & _mem2_const (const void * ptr);LDB/LDB允许将 2 个字节未对齐加载到存储器(1)
unsigned & _mem4 (void * ptr);LDNW
STNW
允许未对齐加载 4 个字节并将其存储至存储器(1)
const unsigned & _mem4_const (const void * ptr);LDNW允许从存储器未对齐加载 4 个字节(1)
long long & _mem8 (void * ptr);LDNDW
STNDW
允许未对齐加载 8 个字节并将其存储至存储器(1)
const long long & _mem8_const (const void * ptr);LDNDW允许从存储器未对齐加载 8 个字节(1)
double & _memd8 (void * ptr);LDNDW
STNDW
允许未对齐加载 8 个字节并将其存储至存储器(2)(1)
const double & _memd8_const (const void * ptr);LDNDW允许从存储器未对齐加载 8 个字节(2)(1)
int _mpy (int src1, int src2);
int _mpyus (unsigned src1, int src2);
int _mpysu (int src1, unsigned src2);
unsigned _mpyu (unsigned src1, unsigned src2);
MPY
MPYUS
MPYSU
MPYU
将 src1 的 16 个 LSB 乘以 src2 的 16 个 LSB 并返回结果。值可以为有符号值或无符号值。
long long _mpy2ir (int src1, int src2);MPY2IR执行两个 16 x 32 乘法。两个结果都向右移 15 位以得到舍入结果。
long long _mpy2ll (int src1, int src2);MPY2返回 src1 和 src2 中低 16 位值和高 16 位值之积
int _mpy32 (int src1, int src2);MPY32返回 32 x 32 乘法的 32 个 LSB。
long long _mpy32ll (int src1, int src2);
long long _mpy32su (int src1, int src2);
long long _mpy32us (unsigned src1, int src2);
long long _mpy32u (unsigned src1, unsigned src2);
MPY32
MPY32SU
MPY32US
MPY32U
返回 32 x 32 乘法的全部 64 位。值可以为有符号值或无符号值。
int _mpyh (int src1, int src2);
int _mpyhus (unsigned src1, int src2);
int _mpyhsu (int src1, unsigned src2);
unsigned _mpyhu (unsigned src1, unsigned src2);
MPYH
MPYHUS
MPYHSU
MPYHU
将 src1 的 16 个 MSB 乘以 src2 的 16 个 MSB 并返回结果。值可以为有符号值或无符号值。
long long _mpyhill (int src1, int src2);
long long _mpylill (int src1, int src2);

MPYHI
MPYLI
生成有符号 16 x 32 乘法。结果将保存在返回类型的低 48 位中。可以使用 src1 的高或低 16 位。
int _mpyhir (int src1, int src2);
int _mpylir (int src1, int src2);
MPYHIR
MPYLIR
生成有符号 16 x 32 乘法。结果会向右移 15 位。可以使用 src1 的高或低 16 位。
int _mpyhl (int src1, int src2);
int _mpyhuls (unsigned src1, int src2);
int _mpyhslu (int src1, unsigned src2);
unsigned _mpyhlu (unsigned src1, unsigned src2);
MPYHL
MPYHULS
MPYHSLU
MPYHLU
将 src1 的 16 个 MSB 乘以 src2 的 16 个 LSB 并返回结果。值可以为有符号值或无符号值。
long long _mpyihll (int src1, int src2);
long long _mpyilll (int src1, int src2);

MPYIH
MPYIL
交换操作数并调用 _mpyhill。这被定义为一个宏命令。必须包含 c6x.h。
交换操作数并调用 _mpylill。这被定义为一个宏命令。必须包含 c6x.h。
int _mpyihr (int src1, int src2);
int _mpyilr (int src1, int src2);
MPYIHR
MPYILR
交换操作数并调用 _mpyhir。这被定义为一个宏命令。必须包含 c6x.h。
交换操作数并调用 _mpylir。这被定义为一个宏命令。必须包含 c6x.h。
int _mpylh (int src1, int src2);
int _mpyluhs (unsigned src1, int src2);
int _mpylshu (int src1, unsigned src2);
unsigned _mpylhu (unsigned src1, unsigned src2);
MPYLH
MPYLUHS
MPYLSHU
MPYLHU
将 src1 的 16 个 LSB 乘以 src2 的 16 个 MSB 并返回结果。值可以为有符号值或无符号值。
long long _mpysu4ll (int src1, unsigned src2);
long long _mpyus4ll (unsigned src1, int src2);
long long _mpyu4ll (unsigned src1, unsigned src2);
MPYSU4
MPYUS4
MPYU4
对于 src1 和 src2 中的每个 8 位数值,执行 8 位 x 8 位乘法。四个 16 位结果被打包至一个 64 位结果。结果可以是有符号值或无符号值。
_mpyus4ll 被定义为一个宏命令。必须包含 c6x.h。
int _mvd (int src2);MVD使用乘法器流水线在四个周期内将数据从 src2 移到返回值
void _nassert (int src);不生成任何代码。告诉优化器,通过 assert 函数声明的表达式为 true;这可以提示优化器什么样的优化可能有效。
unsigned _norm (int src);
unsigned _lnorm (__int40_t src);
NORM返回最多到 src 第一个非冗余符号位的位数。
unsigned _pack2 (unsigned src1, unsigned src2);
unsigned _packh2 (unsigned src1, unsigned src2);
PACK2
PACKH2
src1 和 src2 的下半字/上半字将保存在返回值中。
unsigned _packh4 (unsigned src1, unsigned src2);
unsigned _packl4 (unsigned src1, unsigned src2);
PACKH4
PACKL4
将备用字节打包至返回值。可以打包高位或低位字节。
unsigned _packhl2 (unsigned src1, unsigned src2);
unsigned _packlh2 (unsigned src1, unsigned src2);
PACKHL2
PACKLH2
src1 的上半字/下半字将保存在返回值的上半字中。src2 的下半字/上半字将保存在返回值的下半字中。
unsigned _rotl (unsigned src1, unsigned src2);ROTL将 src1 向左旋转 src2 中指定的量
int _rpack2 (int src1, int src2);RPACK2将 src1 和 src2 向左移 1 位并进行饱和处理。移位后 src1 的 16 个 MSB 将保存在 32 位输出的 16 个 MSB 中。移位后 src2 的 16 个 MSB 将保存在 32 位输出的 16 个 LSB 中。
int _sadd (int src1, int src2);
__int40_t _lsadd (int src1, __int40_t src2);
SADD将 src1 和 src2 相加并对结果进行饱和处理。返回结果。
int _sadd2 (int src1, int src2);
int _saddus2 (unsigned src1, int src2);
int _saddsu2 (int src1, unsigned src2);
SADD2
SADDUS2
SADDSU2
在 src1 和 src2 中的 16 位值对之间执行饱和加法。src1 的值可以是有符号值或无符号值。
_saddsu2 被定义为一个宏命令。必须包含 c6x.h。
long long _saddsub (unsigned src1, unsigned src2);SADDSUB并行执行饱和加法与饱和减法。
long long _saddsub2 (unsigned src1, unsigned src2);SADDSUB2并行执行 SADD2 和 SSUB2。
unsigned _saddu4 (unsigned src1, unsigned src2);SADDU4在 src1 和 src2 中的 8 位无符号值对之间执行饱和加法。
int _sat (__int40_t src2);SAT将 40 位长整型值转换为 32 位有符号整型值并在必要时使其饱和。
unsigned _set (unsigned src2, unsigned csta ,
unsigned cstb);
SET将 src2 中的指定字段全部设置位 1 并返回 src2 值。要设置字段的起始位和结束位分别由 csta 和 cstb 指定。
unsigned _setr (unit src2, int src1); SET将 src2 中的指定字段全部设置位 1 并返回 src2 值。要设置字段的起始位和结束位由 src1 的低 10 位指定。
unsigned _shfl (unsigned src2);SHFLsrc2 的低 16 位将保存在偶数位处,而 src 的高 16 位将保存在奇数位处。
long long _shfl3 (unsigned src1, unsigned src2);SHFL3从 src1 取出两个 16 位值并从 src2 取出 16 个 LSB 来执行 3 路交错,从而得到一个 48 位结果。
unsigned _shlmb (unsigned src1, unsigned src2);
unsigned _shrmb (unsigned src1, unsigned src2);
SHLMB
SHRMB
将 src2 向左/向右移动一个字节,并且 src1 的最高/最低有效字节会合并到最低/最高有效字节位置。
int _shr2 (int src1, unsigned src2);
unsigned _shru2 (unsigned src1, unsigned src2);
SHR2
SHRU2
对于 src1 中的每个 16 位数,该数均会以算术或逻辑方法向右移动 src2 位数。src1 可以包含有符号值或无符号值。
int _smpy (int src1, int src2);
int _smpyh (int src1, int src2);
int _smpyhl (int src1, int src2);
int _smpylh (int src1, int src2);
SMPY
SMPYH
SMPYHL
SMPYLH
将 src1 乘以 src2,再将结果向左移 1 位并返回结果。如果结果为 0x80000000,则将结果饱和处理为 0x7FFFFFFF
long long _smpy2ll (int src1, int src2);SMPY2对几对有符号打包 16 位值执行 16 位乘法,再向左多移动 1 位,并饱和处理为 64 位结果。
int _smpy32 (int src1, int src2);SMPY32返回 32 x 32 乘法向左移 1 位后的 32 个 MSB。
int _spack2 (int src1, int src2);SPACK2将两个有符号 32 位值饱和处理为 16 位值并打包到返回值
unsigned _spacku4 (int src1, int src2);SPACKU4将四个有符号 16 位值饱和处理为 8 位值并打包到返回值
int _sshl (int src2, unsigned src1);SSHL将 src2 向左移动 src1 中所含内容对应的位数,将结果饱和处理为 32 位,然后返回结果
int _sshvl (int src2, int src1);
int _sshvr (int src2, int src1);
SSHVL
SSHVR
将 src2 向左/向右移动 src1 位。如果移动后的值大于 MAX_INT 或小于 MIN_INT,则对结果进行饱和处理。
int _ssub (int src1, int src2);
__int40_t _lssub (int src1, __int40_t src2);
SSUB从 src1 中减去 src2,对结果进行饱和处理,然后返回结果。
int _ssub2 (int src1, int src2);SSUB2从 src1 的上半部分和下半部分中减去 src2 的上半部分和下半部分并对每个结果进行饱和处理。
int _sub4 (int src1, int src2);SUB4对几对打包的 8 位值执行二进制补码减法
int _subabs4 (int src1, int src2);SUBABS4计算每对打包无符号 8 位值之差的绝对值
unsigned _subc (unsigned src1, unsigned src2);SUBC条件减法除法步骤
int _sub2 (int src1, int src2);SUB2从 src1 的上半部分和下半部分中减去 src2 的上半部分和下半部分并返回结果。下半部分减法中的借位不影响上半部分减法。
unsigned _swap4 (unsigned src);SWAP4交换每个 16 位值内的字节对(字节序交换)。
unsigned _swap2 (unsigned src);SWAP2调用 _packlh2。这被定义为一个宏命令。必须包含 c6x.h。
unsigned _unpkhu4 (unsigned src);UNPKHU4将两个高位无符号 8 位值解压到无符号打包 16 位值
unsigned _unpklu4 (unsigned src);UNPKLU4将两个低位无符号 8 位值解压到无符号打包 16 位值
unsigned _xormpy (unsigned src1, unsigned src2);XORMPY执行伽罗瓦域乘法
unsigned _xpnd2 (unsigned src);XPND2src 的位 1 和位 0 会分别复制到结果的上半字和下半字。
unsigned _xpnd4 (unsigned src);XPND4src 的位 3 和位 0 会复制到结果的字节 3 至 0。
更多信息,请参阅TMS320C6000 编程指南
有关操控 8 字节数据量的详细信息,请参阅节 8.6.10

表 8-6 中列出的内在函数适用于 C6740 和 C6600 器件,但不适用于 C6400+ 器件。所列内在函数对应于所示的 C6000 汇编语言指令。更多信息,请参阅TMS320C6000 CPU 和指令集参考指南

如需通用 C6000 内在函数列表,请参阅表 8-5。如需特定于 C6600 的内在函数列表,请参阅表 8-7

表 8-6 TMS320C6740 和 C6600 C/C++ 编译器内在函数
C/C++ 编译器内在函数汇编指令说明
int _dpint (double src);DPINT使用由 CSR 寄存器设置的舍入模式,将 64 位双精度值转换为 32 位有符号整型值。
__int40_t _f2tol(__float2_t src);将一个 __float2_t 寄存器对 src 重新解释为一个 __int40_t(存储为寄存器对)。这被定义为一个宏命令。必须包含 c6x.h。
__float2_t _f2toll(__float2_t src);将一个 __float2_t 寄存器对重新解释为一个超长整型寄存器对。这被定义为一个宏命令。必须包含 c6x.h。
double _fabs (double src);
float _fabsf (float src);
ABSDP
ABSSP
返回 src 的绝对值。
__float2_t _lltof2(long long src);将一个超长整型寄存器对重新解释为一个 __float2_t 寄存器对。这被定义为一个宏命令。必须包含 c6x.h。
__float2_t _ltof2(__int40_t src);将一个 __int40_t 寄存器对重新解释为一个 __float2_t 寄存器对。这被定义为一个宏命令。必须包含 c6x.h。
__float2_t & _mem8_f2(void * ptr);LDNDW
STNDW
允许未对齐加载 8 个字节并将其存储至存储器。(1)这被定义为一个宏命令。必须包含 c6x.h。
const __float2_t & _mem8_f2_const(void * ptr);LDNDW
STNDW
允许从存储器未对齐加载 8 个字节。(1)这被定义为一个宏命令。必须包含 c6x.h。
long long _mpyidll (int src1, int src2);MPYID生成有符号整数乘法。结果被保存在一个寄存器对中。
double_mpysp2dp (float src1, float src2);MPYSP2DP生成双精度浮点乘法。结果被保存在一个寄存器对中。
double_mpyspdp (float src1, double src2);MPYSPDP生成双精度浮点乘法。结果被保存在一个寄存器对中。
double _rcpdp (double src);RCPDP计算近似的 64 位双精度倒数。
float _rcpsp (float src);RCPSP计算近似的 32 位浮点倒数。
double _rsqrdp (double src);RSQRDP计算近似的 64 位双精度平方根倒数。
float _rsqrsp (float src);RSQRSP计算近似的 32 位浮点平方根倒数。
int _spint (float src);SPINT使用由 CSR 寄存器设置的舍入模式,将 32 位浮点值转换为 32 位有符号整型值。
有关操控 8 字节数据量的详细信息,请参阅节 8.6.10

仅 C6600 器件支持表 8-7中列出的内在函数。这些内在函数是对表 8-5表 8-6所列内在函数的补充。所列内在函数对应于所示的汇编语言指令。更多信息,请参阅TMS320C6000 CPU 和指令集参考指南

表 8-7 TMS320C6600 C/C++ 编译器内在函数
C/C++ 编译器内在函数汇编指令说明
ADDDP不存在内在函数。使用 C 语言原生函数 a + b,其中 a 和 b 为双精度值。
ADDSP不存在内在函数。使用 C 语言原生函数 a + b,其中 a 和 b 为浮点值。
AND不存在内在函数:使用 C 语言原生函数"a & b",其中 a 和 b 为超长整型值。
ANDN不存在内在函数:使用 C 语言原生函数"a & ~b",其中 a 和 b 为超长整型值。
FMPYDP不存在内在函数。使用 C 语言原生函数 a * b,其中 a 和 b 为双精度值。
OR不存在内在函数:使用 C 语言原生函数"a | b",其中 a 和 b 为超长整型值。
SUBDP不存在内在函数。使用 C 语言原生函数 a - b,其中 a 和 b 为双精度值。
SUBSP不存在内在函数。使用 C 语言原生函数 a - b,其中 a 和 b 为浮点值。
XOR不存在内在函数:使用 C 语言原生函数"a ^ b",其中 a 和 b 为超长整型值。另请参阅 _xorll_c()。
__x128_t _ccmatmpy (long long src1, __x128_t src2);CCMATMPY将共轭的 1x2 复数向量乘以 2x2 复数矩阵,生成两个 64 位结果。有关 __x128_t 容器类型的详细信息,请参阅节 8.6.7
long long _ccmatmpyr1 (long long src1,
__x128_t src2);
CCMATMPYR1将复共轭的 1x2 复数向量乘以 2x2 复数矩阵,生成两个 32 位复数结果。
long long _ccmpy32r1 (long long src1, long long src2);CCMPY32R132 位共轭复数乘以 Q31 数并进行舍入处理。
__x128_t _cmatmpy (long long src1, __x128_t src2);CMATMPY将 1x2 向量乘以 2x2 复数矩阵,生成两个 64 位复数结果。
long long _cmatmpyr1 (long long src1, __x128_t src2);CMATMPYR1将 1x2 复数向量乘以 2x2 复数矩阵,生成两个 32 位复数结果。
long long _cmpy32r1 (long long src1, long long src2);CMPY32R132 位复数乘以 Q31 数字并进行舍入处理。
__x128_t _cmpysp (__float2_t src1, __float2_t src2);CMPYSP对两个复数的复数乘法执行乘法运算(另请参阅 _complex_mpysp 和 _complex_conjugate_mpysp。)
double _complex_conjugate_mpysp (double src1,
double src2);
CMPYSP
DSUBSP
通过执行 CMPYSP 和 DSUBSP 来执行复数共轭乘法。
double _complex_mpysp (double src1, double src2);CMPYSP
DADDSP
通过执行 CMPYSP 和 DADDSP 来执行复数乘法。
int _crot90 (int src);CROT90将复数旋转 90 度。
int _crot270 (int src);CROT270将复数旋转 270 度。
long long _dadd (long long src1, long long src2);DADD对有符号 32 位值进行两路 SIMD 加法,生成两个有符号 32 位结果。
long long _dadd2 (long long src1, long long src2);DADD2对打包的有符号 16 位值进行四路 SIMD 加法,生成四个有符号 16 位结果。(两路 _add2)
__float2_t _daddsp (__float2_t src1, __float2_t src2);DADDSP对 32 位单精度数字进行两路 SIMD 加法。
long long _dadd_c (scst5 immediate src1,
long long src2);
DADD将两个有符号 32 位值与 src2 中的一个常数(-16 至 15)相加,生成两个有符号 32 位结果。
long long _dapys2 (long long src1, long long src2);DAPYS2使用 src1 的符号位确定是将 src2 中的四个 16 位值乘以 1 还是 -1。产生四个有符号 16 位结果。(如果 src1 和 src2 是同一寄存器对,则相当于两路 _abs2。)
long long _davg2 (long long src1, long long src2);DAVG2对有符号 16 位值求四路 SIMD 平均值并进行舍入处理。(两路 _avg2)
long long _davgnr2 (long long src1, long long src2);DAVGNR2对有符号 16 位值求四路 SIMD 平均值但不进行舍入处理。
long long _davgnru4 (long long src1, long long src2);DAVGNRU4对无符号 8 位值求八路 SIMD 平均值但不进行舍入处理。
long long _davgu4 (long long src1, long long src2);DAVGU4对无符号 8 位值求八路 SIMD 平均值并进行舍入处理。(两路 _avgu4)
long long _dccmpyr1 (long long src1, long long src2);DCCMPYR1对 src2 的共轭复数进行两路 SIMD 复数乘法并进行舍入处理 (_cmpyr1)。
unsigned _dcmpeq2 (long long src1, long long src2);DCMPEQ2对有符号 16 位值进行四路 SIMD 比较。结果被打包至返回值的四个最低有效位。(两路 _cmpeq2)
unsigned _dcmpeq4 (long long src1, long long src2);DCMPEQ4对无符号 8 位值进行八路 SIMD 比较。结果被打包至返回值的八个最低有效位。(两路 _cmpeq4)
unsigned _dcmpgt2 (long long src1, long long src2);DCMPGT2对有符号 16 位值进行四路 SIMD 比较。结果被打包至返回值的四个最低有效位。(两路 _cmpgt2)
unsigned _dcmpgtu4 (long long src1, long long src2);DCMPGTU4对无符号 8 位值进行八路 SIMD 比较。结果被打包至返回值的八个最低有效位。(两路 _cmpgtu4)
__x128_t _dccmpy (long long src1, long long src2);DCCMPY对两组打包的复数与 src2 的共轭复数执行两个复数乘法运算。
__x128_t _dcmpy (long long src1, long long src2);DCMPY对两组打包的复数执行两个复数乘法运算。(两路 SIMD _cmpy)
long long _dcmpyr1 (long long src1, long long src2);DCMPYR1两路 SIMD 复数乘法并进行舍入处理 (_cmpyr1)。
long long _dcrot90 (long long src);DCROT90_crot90 的两路 SIMD 版本。
long long _dcrot270 (long long src);DCROT270_crot270 的两路 SIMD 版本。
long long _ddotp4h (__x128_t src1, __x128_t src2 );DDOTP4H对四组打包的 16 位值执行两个点积运算。(两路 _dotp4h)
long long _ddotpsu4h (__x128_t src1, __x128_t src2 );DDOTPSU4H对四组打包的 16 位值执行两个点积运算。(两路 _dotpsu4h)
__float2_t _dinthsp (int src);DINTHSP将两个打包的有符号 16 位值转换为两个单精度浮点值。
__float2_t _dinthspu (unsigned src);DINTHSPU将两个打包的无符号 16 位值转换为两个单精度浮点值。
__float2_t _dintsp(long long src);DINTSP将两个 32 位有符号整数转换为两个单精度浮点值。
__float2_t _dintspu(long long src);DINTSPU将两个 32 位无符号整数转换为两个单精度浮点值。
long long _dmax2 (long long src1, long long src2);DMAX2对 16 位有符号值进行四路 SIMD 取最大值,生成四个有符号 16 位结果。(两路 _max2)
long long _dmaxu4 (long long src1, long long src2);DMAXU4对无符号 8 位值进行 8 路 SIMD 取最大值,生成八个无符号 8 位结果。(两路 _maxu4)
long long _dmin2 (long long src1, long long src2);DMIN2对 16 位有符号值进行四路 SIMD 取最小值,生成四个有符号 16 位结果。(两路 _min2)
long long _dminu4 (long long src1, long long src2);DMINU4对无符号 8 位值进行 8 路 SIMD 取最小值,生成八个无符号 8 位结果。(两路 _minu4)
__x128_t _dmpy2 (long long src1, long long src2);DMPY2对 16 位有符号值进行四路 SIMD 乘法,生成四个有符号 32 位结果。(两路 _mpy2)
__float2_t _dmpysp (__float2_t src1, __float2_t src2);DMPYSP两路单精度浮点乘法,生成两个单精度结果。
__x128_t _dmpysu4 (long long src1, long long src2);DMPYSU4对 8 位有符号值与 8 位无符号值执行八路 SIMD 乘法,生成八个有符号 16 位结果。(两路 _mpysu4)
__x128_t _dmpyu2 (long long src1, long long src2);DMPYU2对 16 位无符号值进行四路 SIMD 乘法,生成四个无符号 32 位结果。(两路 _mpyu2)
__x128_t _dmpyu4 (long long src1, long long src2);DMPYU4对 8 位有符号值进行八路 SIMD 乘法,生成八个有符号 16 位结果。(两路 _mpyu4)
long long _dmvd (int src1, int src2 );DMVD将 src1 置于超长整型低位寄存器中,将 src2 置于超长整型高位寄存器中。执行四个周期。另请参阅 _dmv()、_fdmv_f2 和 _itoll()。
int _dotp4h (long long src1, long long src2 );DOTP4H将两组四个有符号 16 位值相乘并返回 32 位和。
long long _dotp4hll (long long src1, long long src2 );DOTP4H将两组四个有符号 16 位值相乘并返回 64 位和。
int _dotpsu4h (long long src1, long long src2);DOTPSU4H将四个有符号 16 位值与四个无符号 16 值相乘并返回 32 位和。
long long _dotpsu4hll (long long src1, long long src2);DOTPSU4H将四个有符号 16 位值与四个无符号 16 值相乘并返回 64 位和。
long long _dpackh2 (long long src1, long long src2);DPACKH2两路 _packh2。
long long _dpackh4 (long long src1, long long src2);DPACKH4两路 _packh4。
long long _dpacklh2 (long long src1, long long src2);DPACKLH2两路 _packlh2。
long long _dpacklh4 (unsigned src1, unsigned src2);DPACKLH4执行 _packl4 和 _packh4。_packl4 的输出保存在结果的低位寄存器中,而 _packh4 的输出保存在结果的高位寄存器中。
long long _dpackl2 (long long src1, long long src2);DPACKL2两路 _packl2。
long long _dpackl4 (long long src1, long long src2);DPACKL4两路 _packl4。
long long _dsadd (long long src1, long long src2);DSADD对有符号 32 位值进行两路 SIMD 饱和加法,生成两个有符号 32 位结果。(两路 _sadd)
long long _dsadd2 (long long src1, long long src2);DSADD2对有符号 16 位值进行四路 SIMD 饱和加法,生成四个有符号 16 位结果。(两路 _sadd2)
long long _dshl (long long src1, unsigned src2);DSHL使两个有符号 32 位值向左移位,位数等于 src2 参数中的单个值。
long long _dshl2 (long long src1, unsigned src2);DSHL2使四个有符号 16 位值向左移位,位数等于 src2 参数中的单个值。(两路 _shl2)
long long _dshr (long long src1, unsigned src2);DSHR使两个有符号 32 位值向右移位,位数等于 src2 参数中的单个值。
long long _dshr2 (long long src1, unsigned src2);DSHR2使四个有符号 16 位值向右移位,位数等于 src2 参数中的单个值。(两路 _shr2)
long long _dshru (long long src1, unsigned src2);DSHRU使两个无符号 32 位值向右移位,位数等于 src2 参数中的单个值。
long long _dshru2 (long long src1, unsigned src2);DSHRU2使四个无符号 16 位值向右移位,位数等于 src2 参数中的单个值。(两路 _shru2)
__x128_t _dsmpy2 (long long src1, long long src2);DSMPY2对有符号 16 位值执行四路 SIMD 乘法,再向左移 1 位并进行饱和处理,生成四个有符号 32 位结果。(两路 _smpy2)
long long _dspacku4 (long long src1, long long src2);DSPACKU4两路 _spacku4。
long long _dspint (__float2_t src);DSPINT将两个打包的单精度浮点值转换为两个有符号 32 位值。
unsigned _dspinth (__float2_t src);DSPINTH将两个打包的单精度浮点值转换为两个打包的有符号 16 位值。
long long _dssub (long long src1, long long src2);DSSUB对 32 位有符号值进行两路 SIMD 饱和减法,生成两个有符号 32 位结果。
long long _dssub2 (long long src1, long long src2);DSSUB2对有符号 16 位值进行四路 SIMD 饱和减法,生成四个有符号 16 位结果。(两路 _ssub2)
long long _dsub (long long src1, long long src2);DSUB对 32 位有符号值进行两路 SIMD 减法,生成两个有符号 32 位结果。
long long _dsub2 (long long src1, long long src2);DSUB2对有符号 16 位值进行四路 SIMD 减法,生成四个有符号 16 位结果。(两路 _sub2)
__float2_t _dsubsp (__float2_t src1, __float2_t src2);DSUBSP对 32 位单精度数进行两路 SIMD 减法。
long long _dxpnd2 (unsigned src);DXPND2将四个低位展开到四个 16 位字段。
long long _dxpnd4 (unsigned src);DXPND4将八个低位展开到八个 8 位字段。
__float2_t _fdmvd_f2(float src1, float src2);DMVD将 src1 置于 __float2_t 的低位寄存器中并将 src2 置于 __float2_t 的高位寄存器中。执行四个周期。另请参阅 _dmv()、_dmvd() 和 _itoll()。这被定义为一个宏命令。必须包含 c6x.h。
int _land (int src1, int src2);LAND对 src1 和 src2 进行逻辑与运算。
int _landn (int src1, int src2);LANDN对 src1 进行逻辑与运算并对 src2 进行逻辑非运算;例如,src1 AND ~src2。
int _lor (int src1, int src2);LOR对 src1 和 src2 进行逻辑或运算。
void _mfence();MFENCE在存储器系统繁忙期间使 CPU 停顿。
long long _mpyu2 (unsigned src1, unsigned src2 );MPYU2对 16 位无符号值进行两路 SIMD 乘法,生成两个无符号 32 位结果。
__x128_t _qmpy32 (__x128_t src1, __x128_t src2);QMPY32对 32 位有符号值进行四路 SIMD 乘法,生成四个 32 位结果。(四路 _mpy32)
__x128_t _qmpysp (__x128_t src1, __x128_t src2);QMPYSP进行四路 SIMD 32 位单精度乘法,生成四个 32 位单精度结果。
__x128_t _qsmpy32r1 (__x128_t src1, __x128_t src2);QSMPY32R1进行 4 路 SIMD 小数 32 位 x 32 位乘法,其中每个结果值均会向右移 31 位并进行舍入处理。在 Q31 小数体系中,这会将结果归一化到 -1 和 1 之间。
unsigned _shl2 (unsigned src1, unsigned src2);SHL2将两个有符号 16 位值向左移位,位数等于 src2 参数中的单个值。
long long _unpkbu4 (unsigned src);UNPKBU4将四个 8 位无符号值解压到四个 16 位无符号值。(另请参阅 _unpklu4 和 _unpkhu4)
long long _unpkh2 (unsigned src);UNPKH2将两个有符号 16 位值解压到两个有符号 32 位值。
long long _unpkhu2 (unsigned src);UNPKHU2将两个无符号 16 位值解压到两个无符号 32 位值。
long long _xorll_c (scst5 immediate src1, long long src2);XOR对 src1 与 src2 的高 32 位和低 32 位部分执行异或运算(对常数执行 SIMD 异或运算)。