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
指令有充分的理由吗?
答案 0 :(得分:1)
已解决。这是优化级别。设置为-O3时,指令已更改为正确使用MAC。
我认为利用硬件加速(例如FPU)将不会依赖于优化级别,因为它实质上是“免费的”,但是我想我错了。