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