Как сообщить GCC, что аргумент-указатель всегда выравнивается по двойному слову?

В моей программе есть функция, которая выполняет простое сложение векторов c[0:15] = a[0:15] + b[0:15]. Прототип функции:

void vecadd(float * restrict a, float * restrict b, float * restrict c);

В нашей 32-битной встроенной архитектуре есть опция загрузки/сохранения для загрузки/сохранения двойных слов, например:

r16 = 0x4000  ;
strd r0,[r16] ; stores r0 in [0x4000] and r1 in [0x4004]

Оптимизатор GCC распознает векторный характер цикла и генерирует две ветви код - один для случая, когда 3 массива выровнены по двойному слову (поэтому он использует двойные инструкции загрузки/сохранения), а другой для случая, когда массивы выровнены по слову (где используется одинарная опция загрузки/сохранения).

Проблема в том, что проверка выравнивания адресов является дорогостоящей по сравнению с частью добавления, и я хочу устранить ее, намекнув компилятору, что a, b и c всегда выравниваются по 8. Есть ли модификатор, который нужно добавить к объявлению указателя, чтобы сообщить об этом компилятору?

Массивы, которые используются для вызова этой функции, имеют атрибутalign(8), но он не отражается в самом коде функции. можно ли добавить этот атрибут в параметры функции?

25
задан ysap 8 March 2012 в 02:08
поделиться