ZHCU876Z July 2001 – October 2023 SM320F28335-EP
如果编译器将 C 语言语句识别为 DMAC 机会,并且编译器可以验证所操作的数据地址是 32 位对齐的,则编译器会自动生成 DMAC 指令。这是最好的方案,因为除了数据对齐 pragma 之外,不需要修改任何代码。下面是一个示例:
int src1[N], src2[N];
#pragma DATA_ALIGN(src1,2); // int arrays must be 32-bit aligned
#pragma DATA_ALIGN(src2,2);
{...}
int i;
long res = 0;
for (i = 0; i < N; i++) // N must be a known even constant
res += (long)src1[i] * src2[i]; // Arrays must be accessed via array indices
在优化级别 >= -O2 时,如果 N 是已知偶数常数,则编译器会为上述示例代码生成一条RPT || DMAC 指令。
DMAC 指令还可以在累加之前将乘积向左移动 1 或向右移动 1 到 6。例如:
for (i = 0; i < N; i++)
res += (long)src1[i] * src2[i] >> 1; // product shifted right by 1