Это ошибка GCC при использовании опции -falign-loops? - PullRequest
1 голос
/ 27 марта 2012

Я играл с этой опцией, чтобы оптимизировать цикл 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__ по мере необходимости для создания смещенного тела цикла.

1 Ответ

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

Используйте gcc -S -o foo.s foo.c для создания выходных данных сборки без их сборки. Я подозреваю, что вы увидите директиву .balign или .p2align в ассемблере. Предполагая, что эта директива предназначена для работы, я думаю, что это ошибка в ассемблере. Также возможно, что вы поместили код в раздел не по умолчанию (то есть не .text) либо намеренно, либо случайно (например, с неуместным .data или .section в некотором другом встроенном ассемблере); обычно площадки ассемблера с правильным размером и количеством nop инструкций для разделов, которые содержат код, и 0 байтов для разделов, которые содержат данные.

...