Набор инструкций 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 (Инструменты GNU для встроенных процессоров Arm 8-2018-q4-major) 8.2.1 20181213 (выпуск) [редакция gcc-8-branch 267074]