arm-none-eabi-gcc не выводит число с плавающей запятой, многократно накапливаемое из кода - PullRequest
0 голосов
/ 02 мая 2019

Набор инструкций 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]

1 Ответ

1 голос
/ 03 мая 2019

решаемая.Это был уровень оптимизации.Когда установлено значение -O3, инструкции изменились, чтобы правильно использовать MAC.

Я подумал, что использование аппаратного ускорения (например, FPU) не будет зависеть от уровня оптимизации, поскольку оно по сути "бесплатно", но, думаю, я ошибся.

...