我最近在 Atmel Studio 中为ATmega1284P编译了一些 C++ 代码,并正在使用我的示波器分析一些例程的时序。令我惊讶的是,我认为我已经优化的循环花费的时间比预期的要长。
看了一眼汇编代码后,我注意到编译器编译了以下乘法:
word *= 10;
重复添加:
add r28, r28
adc r29, r29
add r18, r18
adc r19, r19
add r18, r18
adc r19, r19
add r18, r18
adc r19, r19
add r18, r28
adc r19, r29
现在虽然我很欣赏这种重复加法的优化,但当芯片有可用的硬件乘法指令时,没有理由这样做,比如mul
.
为什么 gcc 会以这种方式运行,我如何告诉它使用硬件乘法指令?请注意,我已经设置了乘法,所以溢出不是问题。word
是一个 uint16_t。