Я играл с этой опцией, чтобы оптимизировать цикл for в нашей встроенной архитектуре ( здесь ).Однако я заметил, что, когда для выравнивания требуется добавить более одной инструкции nop
, компилятор генерирует один nop
, за которым следуют нули столько, сколько требуется (0000
).
Я подозреваю, что это ошибка в нашем компиляторе, но кто-то может подтвердить, что это не ошибка в GCC?
Вот фрагмент кода:
__asm__ volatile("nop");
__asm__ volatile("nop");
for (j0=0; j0<N; j0+=4)
{
c[j0+ 0] = a[j0+ 0] + b[j0+ 0];
c[j0+ 1] = a[j0+ 1] + b[j0+ 1];
c[j0+ 2] = a[j0+ 2] + b[j0+ 2];
c[j0+ 3] = a[j0+ 3] + b[j0+ 3];
}
Скомпилировать с -falign-loops=8
(илилюбое число, соответствующее вашей архитектуре, которое больше требуемого минимального выравнивания).Вы можете добавлять или удалять строки __asm__
по мере необходимости для создания смещенного тела цикла.