ZHCUA98E january   2018  – march 2023 TDA4VM , TDA4VM-Q1

 

  1.   摘要
  2. 1关于本文档
    1. 1.1 相关文档
    2. 1.2 商标
  3. 2将 C 源代码从 C6000 迁移到 C7000
    1. 2.1  编译器选项
    2. 2.2  原生矢量数据类型
    3. 2.3  类型限定符:near 和 far
    4. 2.4  64 位 long 类型
    5. 2.5  对控制寄存器的引用
    6. 2.6  存储器映射外设
    7. 2.7  运行时支持
    8. 2.8  迁移头文件 c6x_migration.h 的内容
      1. 2.8.1 支持的宏
      2. 2.8.2 不受支持的宏
      3. 2.8.3 传统数据类型
      4. 2.8.4 传统内在函数
    9. 2.9  伽罗瓦域乘法指令
    10. 2.10 有关迁移代码的性能注意事项
      1. 2.10.1 UNROLL Pragma
      2. 2.10.2 子矢量访问
      3. 2.10.3 16x16 和 16x32 位乘法
      4. 2.10.4 __x128_t 类型
      5. 2.10.5 无符号数组偏移
      6. 2.10.6 流引擎和流地址生成器
      7. 2.10.7 其他优化指南
  4. 3主机仿真
  5. 4修订历史记录
    1.     29
    2.     30

子矢量访问

在 C6000 器件上访问矢量类型的一部分可能是“无阻碍的”,但在 C7000 器件上则需要额外的指令。

例如,在 C6000 上访问 int4 元素的子矢量可能是无阻碍的,因为 C6000 上的一个 int4 由四个 32 位寄存器组成。因此,编译器可以通过使用适当的 32 位寄存器来访问 int4 的一个元素。但是,在 C7000 器件上,int4 元素位于单个矢量寄存器中。因此,访问 int4 的一个元素需要编译器使用指令(例如 VGETW)来提取该数据。

类似地,在 C6000 器件上打包一个 int4 矢量可能是无阻碍的或基本无阻碍,而在 C7000 器件上则可能需要一系列指令(例如 VPUTW)。

如果 C7000 编译器能够进一步矢量化代码,则在某些情况下可能会减轻性能损失。例如,通过 _loll() 访问 64 位的低 32 位可以矢量化成 VDEAL2W。