2010-06-28 12 views
5

Piszę kod SSE do splotu 2D, ale dokumentacja SSE jest bardzo rzadka. Wyliczam iloczyn kropki z _mm_dp_ps i używam _mm_extract_ps, aby uzyskać wynik produktu dot, ale _mm_extract_ps zwraca heks reprezentujący float i nie mogę wymyślić, jak przekonwertować ten pływający hex do zwykłego float. Mógłbym użyć __builtin_ia32_vec_ext_v4sf, który zwraca float, ale chcę zachować kompatybilność z innymi kompilatorami.Jak przekonwertować float sześciokątny na zmiennoprzecinkowy w C/C++ za pomocą _mm_extract_ps SSE GCC instrinc function

_mm_extract_ps (__m128 __X, const int __N) 
{ 
    union { int i; float f; } __tmp; 
    __tmp.f = __builtin_ia32_vec_ext_v4sf ((__v4sf)__X, __N); 
    return __tmp.i; 
} 

Po co mi brakuje?

Niewielka pomoc zostanie doceniona, dzięki.

OpenSUSE 11,2
GCC 4.4.1
C++
Opcje kompilatora
-fopenmp -Wall -O3 -msse4.1 -march = Core 2
opcje Linker
-lgomp -Wall -O3 -msse4. 1 -march = core2

Odpowiedz

5

Powinieneś być w stanie używać _MM_EXTRACT_FLOAT.

Nawiasem mówiąc wygląda mi jakby _mm_extract_ps i _MM_EXTRACT_FLOAT powinno być na odwrót, tzn _mm_extract_ps powinien powrócić pływaka i _MM_EXTRACT_FLOAT powinna zwracać int reprezentacji, ale co ja wiem.

+2

Też tak pomyślałem. –

+0

Sądzę, że to zależy od sposobu, w jaki Intel opisuje instrukcję w ich dokumentacji, co może, ale nie musi być błędem - nagłówki gcc po prostu implementują to, co jest w dokumentacji. –

1

_mm_cvtss_f32(_mm_shuffle_ps(__X, __X, __N)) wykona zadanie.

0

extern void _mm_store_ss (float *, __m128);

Zobacz "xmmintrin.h".