Я играю с SIMD и задаюсь вопросом, почему нет аналога _mm_cvtsd_f64 для извлечения чисел с плавающей запятой высшего порядка из __m128d.
GCC 4.6+ имеет расширение, которое позволяет добиться этого:
__m128d a = ...;
double d1 = a[0];
double d2 = a[1];
Но в более старом GCC (например, 4.4.) Единственный способ получить это - это определить мою собственную функцию-аналог, используя __builtin_ia32_vec_ext_v2df, то есть:
extern __inline double __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_cvtsd_f64_h (__m128d __A)
{
return __builtin_ia32_vec_ext_v2df (__A, 1);
}
__m128d a = ...;
double d1 = _mm_cvtsd_f64(a);
double d2 = _mm_cvtsd_f64_h(a);
Это действительно путь? Есть ли альтернатива, которая не использует потенциально специфичный для компилятора материал __builtin? И снова - почему нет предопределенного _mm_cvtsd_f64_h или аналогичного?
Эта альтернатива, которую я мог бы придумать, намного медленнее, кстати:
_mm_cvtsd_f64_h(__m128d __A) {
double d[2];
_mm_store_pd(d, __A);
return d[1];
}