В нашей встроенной архитектуре мы имеем 64-битный IAB (Buffing Alignment Buffer). Чтобы оптимизировать последовательность выборки, требуется, чтобы тело цикла начало выравниваться с 8-байтной границей.
Это легко сделать в сборке с использованием директивы .balign
, но я не могу найти синтаксис, который .balign
компилятору C для выравнивания кода.
Попытка предшествовать циклу for с встроенной сборкой с директивой .balign
не работает, поскольку она выравнивает prolog for (setup) for, а не сам цикл.
Выполняя то же самое, когда строка asm()
находится внутри цикла, добавляет nop
-s в тело цикла, которое затрачивает драгоценные циклы.
EDIT 1: введите код:
__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]; }
Я хочу, чтобы первый c=a+b
был выровнен по 8-байтовому адресу. Я могу добавить nop
-s, как указано выше, после предварительной компиляции, но это ad-hoc решение, которое сломается с изменением первого кода.
EDIT 2: Благодаря @R .., решение заключается в использовании -falign-loops=8
компилятора.
Умм, разве это не вариант GCC -falign-loops
?