arm-none-eabi-gcc不从代码推断浮点乘累加

时间:2019-05-02 18:47:50

标签: gcc arm compiler-optimization cortex-m

ARM fpv5指令集支持双精度浮点运算,包括ISA文档中详细介绍的单周期乘法累加指令(VMLA / VMLS)。

不幸的是,我无法在任何C应用程序中使用我的代码来使用此指令。

这是一个简单的示例:

float64_t a=0, b=0, c=0;

while(1)
{
        b += 1.643;
        c += 3.901;
        a += b * c; // multiply accumulate???

        do_stuff(a) // use the MAC result

}

上面的代码为MAC操作(我认为应该是)生成了以下程序集

170               a += b * c;
00000efe:   vldr    d6, [r7, #64]   ; 0x40
00000f02:   vldr    d7, [r7, #56]   ; 0x38
00000f06:   vmul.f64        d7, d6, d7
00000f0a:   vldr    d6, [r7, #72]   ; 0x48
00000f0e:   vadd.f64        d7, d6, d7
00000f12:   vstr    d7, [r7, #72]   ; 0x48

如您所见,它分别执行乘法和加法步骤。 编译器在此处不能使用VMLA.f64指令有充分的理由吗?

  • 目标:ARM Cortex M7(NXP iMXRT1051)
  • 工具链:arm-none-eabi-gcc(用于Arm嵌入式处理器的GNU工具8-2018-q4-major)8.2.1 20181213(版本)[gcc-8-branch修订版267074]

1 个答案:

答案 0 :(得分:1)

已解决。这是优化级别。设置为-O3时,指令已更改为正确使用MAC。

我认为利用硬件加速(例如FPU)将不会依赖于优化级别,因为它实质上是“免费的”,但是我想我错了。