arm-none-eabi-gcc 不从代码中推断浮点乘法累加
arm-none-eabi-gcc not inferring floating point multiply-accumulate from code
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
指令是否有充分的理由?
- 目标:ARM Cortex M7 (NXP iMXRT1051)
- 工具链:arm-none-eabi-gcc(Arm 嵌入式处理器的 GNU 工具 8-2018-q4-major)8.2.1 20181213(发布)[gcc-8-branch 修订版 267074]
已解决。这是优化级别。当设置为 -O3 时,指令更改为正确使用 MAC。
我认为利用硬件加速(例如 FPU)不会依赖于优化级别,因为它本质上是 "free",但我想我错了。
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
指令是否有充分的理由?
- 目标:ARM Cortex M7 (NXP iMXRT1051)
- 工具链:arm-none-eabi-gcc(Arm 嵌入式处理器的 GNU 工具 8-2018-q4-major)8.2.1 20181213(发布)[gcc-8-branch 修订版 267074]
已解决。这是优化级别。当设置为 -O3 时,指令更改为正确使用 MAC。
我认为利用硬件加速(例如 FPU)不会依赖于优化级别,因为它本质上是 "free",但我想我错了。