Подтвердить что ты не робот

Как выровнять тело C для цикла с GCC?

В нашей встроенной архитектуре мы имеем 64-битный IAB (Buffing Alignment Buffer). Чтобы оптимизировать последовательность выборки, требуется, чтобы тело цикла начало выравниваться с 8-байтной границей.

Это легко сделать в сборке, используя директиву .balign, но я не могу найти синтаксис, который подскажет компилятору C., чтобы выровнять код.

Попытка предшествовать циклу for с встроенной сборкой с директивой .balign не работает, поскольку она выравнивает пролог for (setup), а не тело цикла.

Выполняя то же самое, когда строка 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 для компилятора.

4b9b3361

Ответ 1

Умм, разве это не опция GCC -falign-loops?