Нет причин, по которым нужно использовать встроенные функции для этого. ОП просто хочет сделать трансляцию. Это такая же базовая операция SIMD, как добавление SIMD. Любая приличная библиотека / расширение SIMD должна поддерживать трансляции. Вектор класса Agner Fog, безусловно, делает, OpenCL делает, документация GCC ясно показывает, что это так.
a = b + 1; /* a = b + {1,1,1,1}; */
a = 2 * b; /* a = {2,2,2,2} * b; */
Следующий код компилируется просто отлично
#include <stdio.h>
int main() {
typedef float float4 __attribute__ ((vector_size (16)));
float4 x = {1,2,3,4};
float4 y = (25.0f/216.0f)*x;
printf("%f %f %f %f\n", y[0], y[1], y[2], y[3]);
//0.115741 0.231481 0.347222 0.462963
}
Вы можете увидеть результаты на http://coliru.stacked -crooked.com / a / de79cca2fb5d4b11
Сравните этот код с внутренним кодом, и станет понятно, какой из них более читабелен. Мало того, что он более читабелен, его легче переносить, например. АРМ Неон. Он также очень похож на код OpenCL C.