ZHCU876Z July 2001 – October 2023 SM320F28335-EP
在某些情况下,编译器可能会识别 C 语言语句中的 DMAC 机会,但无法验证传递给计算的数据地址是否均为 32 位对齐。在这种情况下,放入代码中的断言可以使编译器生成 DMAC 指令。下面是一个示例:
int *src1, *src2; // src1 and src2 are pointers to int arrays of at least size N
// You must ensure that both are 32-bit aligned addresses
{...}
int i;
long res = 0;
_nassert((long)src1 % 2 == 0);
_nassert((long)src2 % 2 == 0);
for (i = 0; i < N; i++) // N must be a known even constant
res += (long)src1[i] * src2[i]; // src1 and src2 must be accessed via array indices
在优化级别 >= -O2 时,如果 N 是已知偶数常数,则编译器会为上述示例代码生成一条RPT || DMAC 指令。
_nassert 内在函数不会生成任何代码,因此不是表 7-6 中列出的编译器内在函数。相反,该函数告诉优化器使用 assert 函数声明的表达式成立。这可以用来提示优化器哪些优化可能有效的。在本示例中,_nassert 用于断言由 src1 和 src2 指针表示的数据地址是 32 位对齐的。请务必确保只有 32 位对齐的数据地址通过这些指针传递。如果断言的条件不成立,代码将导致运行时失败。
DMAC 指令还可以在累加之前将乘积向左移动 1 或向右移动 1 到 6。例如:
for (i = 0; i < N; i++)
res += (long)src1[i] * src2[i] >> 1; // product shifted right by 1