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

传统内在函数

在 c6x.h 中定义的 C6000 内在函数名称与任何 C7x 内在函数名称并不冲突。因此,同时包含迁移头文件 c6x_migration.h 以及 c7x.h 不会导致出现问题。每个 C6000 内在函数都映射到单个 C7000 指令或一组执行或模拟相同行为的 C7000 指令。

  • 如果 C6000 内在函数映射到单个 C7000 指令,则在 c7x.h 中搜索该指令的 C7000 C 习语。
  • 如果 C6000 内在函数映射到一组指令,则 c7x.h 中将提供 C7000 C 习语示例。

例如,在 c6x_migration.h 中,声明了 _dadd 内在函数,并且在声明上方的注释中指示了映射的 C7000 指令 VADDW

/* VADDW */
long long __BUILTIN _dadd(long long, long long);

c7x.h 中,显示了相同的指令及其支持的 C 习语,无论是 C 内在函数还是运算符:

VADDW
int = int + int;
int2 = int2 + int2;
int4 = int4 + int4;
int8 = int8 + int8;
int16 = int16 + int16;
cint = cint + cint;
cint2 = cint2 + cint2;
cint4 = cint4 + cint4;
cint8 = cint8 + cint8;
uint = uint + uint;
uint2 = uint2 + uint2;
uint4 = uint4 + uint4;
uint8 = uint8 + uint8;
uint16 = uint16 + uint16;

再举一例,声明了 _unpkbu4 内在函数,但没有与之对应的单个 C7000 指令。因此,c7x.h 显示的 C7000 C 习语如下所示:

/*---------------------------------------------------------------------------*/
/* _unpkbu4 使用 VUNPKLUB 和 VUNPKHUB 解包      */
/* 参数的低和高 2 个字节,然后构造结果。等效 C7X  */
/* 代码段如下所示:                                            */
/*                                                                           */
/* ushort4 _unpkbu4(uchar4 src)                                              */
/* {                                                                         */
/*   ushort4 dst;                                                            */
/*   dst.lo = __unpack_low(src);                                             */
/*   dst.hi = __unpack_high(src);                                            */
/*   return dst;                                                             */
/* }                                                                         */
/*---------------------------------------------------------------------------*/
long long __BUILTIN _unpkbu4(unsigned)

C7000 编译器工具不支持以下已弃用的 C6000 内在函数。请改用 long long 变体:

  • _mpy2 不受支持,请改用 _mpy2ll
  • _mpyhi 不受支持,请改用 _mpyhill
  • _mpyli 不受支持,请改用 _mpylill
  • _mpyid 不受支持,请改用 _mpyidll
  • _mpysu4 不受支持,请改用 _mpysu4ll
  • _mpyu4 不受支持,请改用 _mpyu4ll
  • _smpy2 不受支持,请改用 _smpy2ll

以下对齐的内存访问内在函数不会对齐输入地址:

  • amem2 不会对齐地址
  • amem2_const 不会对齐地址
  • amem4 不会对齐地址
  • amem4_const 不会对齐地址
  • amem8 不会对齐地址
  • amem8_const 不会对齐地址
  • amemd8 不会对齐地址
  • amemd8_const 不会对齐地址