STM32CUBEIDE编译器产生效率低下的代码。
int16_t OscPhase[NumOsc];
int32_t OscInc[NumOsc];
int32_t OscVol[NumOsc];
int32_t Sine[65536];
int64_t OscTotal;
and then in main() :
OscTotal = 0;
for (i = 0; i < NumOsc; i++)
{
OscPhase[i] = OscPhase[i] + OscInc[i];
OscTotal = OscTotal + Sine[OscPhase[i]] * OscVol[i];
}
我期望H7使用SMLAL指令进行最后的乘法和累加,但是它执行的MUL.W仅给出32位结果,然后使用ADD.W和ADC.W将这32位相加进入最终的64位结果。
关于如何强制其使用正确代码的任何建议?
答案 0 :(得分:3)
已经对godbolt(该代码)进行了一些实验
#include <stdint.h>
int64_t mac (int64_t sum, int32_t x, int32_t y) {
return sum + ((int64_t)x*y);
}
发射
mac:
smlal r0, r1, r3, r2
bx lr
使用ARM GCC 7.2.1和标志-march=armv7e-m -mcpu=cortex-m7 -O3
进行编译时,如果未指定-O1
或未指定优化级别,则不会生成SMLAL
指令。
如果不执行强制转换,它不会生成SMLAL
,因为它执行的是32 x 32 => 32乘法,而SMLAL
却执行32 x 32 => 64。
mac
函数如果在循环中使用,似乎确实会内联,因此没有多余的分支。