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

arm none eabi gcc不从代码推断浮点乘法累加,gcc,arm,compiler-optimization,cortex-m,Gcc,Arm,Compiler Optimization,Cortex M,ARM fpv5指令集支持双精度浮点运算,包括单周期乘法累加指令(VMLA/VMLS),详见ISA文档 不幸的是,我无法让我的代码在任何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

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

不幸的是,我无法让我的代码在任何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
指令的原因是否充分?

  • 目标:手臂皮质M7(NXP iMXRT1051)
  • 工具链:arm none eabi gcc(arm嵌入式处理器GNU工具8-2018-q4-major)8.2.1 20181213(发布)[gcc-8-branch修订版267074]

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


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

      在这方面不是很了解,但从逻辑上讲,确保MAC是您想要的要困难得多。只进行乘法然后进行加法可能更安全,成本也不会太高。请注意,由于精度上的细微差异,您可能需要使用-ffast math来获得乘法累加之类的融合指令。