ADI SHARC C/C++ 编译器指令优化
流水线依赖条件
- 代码无法使用内联函数调用。
- 迭代之间有依赖关系,如 N+1 的操作依赖 N 中的操作。
- 不能确定输入和输出缓冲区指针不会指向同一数组。
- 处理器外部内存不支持 SIMD 访问。
- 代码包含 asm 语句:编译器无法知道 asm 语句执行的指令,因此无法自动判断这些指令在 SIMD 模式下是否安全。除非使用
-annotate-loop-instr开关告诉编译器某条 asm 语句在 SIMD 模式下是安全的(具体说明见-asms-safe-in-simd-for-loops)。

优化指令
循环与向量化控制
#pragma SIMD_for- 必须在 for、while 或 do...while 中使用。
- 要求连续迭代中内存不会相互混叠。
- 环形缓存必须是偶数个元素,指针初始值必须对齐。
#pragma all_aligned- 适用于后续循环,所有指针变量双字节对齐。
- 后面可跟一个参数,代表指定 n 次迭代后参数对齐。
#pragma loop_count(min, max, modulo)- 描述循环迭代最小值、最大值,并且是 modulo 的倍数。
#pragma loop_unroll N- 将代码循环展开 N 次。
#pragma no_alias- 下面的循环中加载或者存储操作不会引用彼此相同的内存。
#pragma vector_for- 编译器认为循环所有迭代可以相互并行运行。

性能与空间优化
#pragma optimize_for_speed- 提高代码运行速度高于减少代码大小。
#pragma optimize_for_space- 优先减少代码大小。
#pragma alignment_region(2)/#pragma alignment_region_end- 定义对齐区域。

精度与内联控制
#pragma FX_CONTRACT {ON|OFF}- 当开启时,中间结果没有存储回命名变量,编译器会将中间结果保持在比 ISO/IEC C 报告 18037 要求的更高精度,能够生成更高效的代码。
#pragma inline#pragma never_inline#pragma always_inline

核绑定与内存管理
#pragma core- 指定代码在那个核。
#pragma compatible_pm_dm_params- 将 pm 和 dm 限定的指针视为赋值兼容。
#pragma section/#pragma default_section- 指定变量在哪个段。

下面函数默认是用 40bit 精度进行计算的。

内存定义

异常处理
#pragma generate_exceptions_tables- 使用此 pragma 的替代方法是使用
-eh(启用异常处理)选项编译 C 文件,对于 C 文件来说,这相当于在每个函数定义之前使用该 pragma。
- 使用此 pragma 的替代方法是使用

ASM 约束表
asm() 操作数约束表字母和寄存器对应关系。

