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