Я хочу векторизовать код для Core2. Я думаю, я могу использовать встроенные функции из gcc или icc, и разрешены инструкции SSE, SSE2, SSE3, SSSE3.
Мой код работает с массивами из 8 элементов uint32_t, и он такой (здесь только точка доступа):
const uint32_t p[8] = {2147483743, 2147483713, 2147483693, 2147483659,
2147483647, 2147483629, 2147483587, 2147483579};
void vector_mod_add(uint32_t *a /* a[8] */, uint32_t *b /* b[8] */) {
int n;
for(n=0;n<8;n++)
a[n]+=b[n];
for(n=0;n<8;n++)
if(a[n]>=p[n])
a[n]-=p[n];
}
Сложение довольно просто, но я не знаю, как можно сделать условное вычитание.
Также у меня нет опыта ручной векторизации с SSE2, поэтому, пожалуйста, подскажите, как мне определить здесь все типы.