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

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

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

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

То же самое, когда строка asm()находится внутри цикла, добавляет nop-s к телу цикла, что стоит драгоценных циклов.

РЕДАКТИРОВАТЬ 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, как указано выше, после предварительной компиляции, но это специальное решение, которое сломается при первом изменении кода.

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

12
задан ysap 26 March 2012 в 22:38
поделиться