В моей программе есть функция, которая выполняет простое сложение векторов 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), но он не отражается в самом коде функции. можно ли добавить этот атрибут в параметры функции?