Как выровнять C для петли тела с GCC? - PullRequest
12 голосов
/ 27 марта 2012

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

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

Попытка предшествовать циклу for со встроенной сборкой с помощью директивы .balign не работает, так как выравнивает пролог цикла 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 -ы, как указано выше, после предварительной компиляции, но это специальное решение, которое порвет с первым изменением кода.

РЕДАКТИРОВАТЬ 2: Благодаря @R ..,Решением является использование опции компилятора -falign-loops=8.

1 Ответ

3 голосов
/ 27 марта 2012

Умм, разве для этого не используется опция -falign-loops в GCC?

...