STMCUBEIDE-H7系列强制使用SMLAL(带符号累加(32×32 + 64),64位结果)

时间:2019-05-02 09:52:10

标签: arm stm32

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位结果。

关于如何强制其使用正确代码的任何建议?

1 个答案:

答案 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函数如果在循环中使用,似乎确实会内联,因此没有多余的分支。