Cześć. Ostatnio przy okazji pisania pewnego programu natknąłem się na problem - jak obsługiwać wielkie liczby korzystając z SSE2?
Przykładowo, kod:
#include <stdio.h>
#include <emmintrin.h>
int main( ) {
__m128i i, j, x;
int r;
i = _mm_set1_epi16( 5 );
j = _mm_set1_epi16( 10 );
x = _mm_add_epi16( i, j );
r = _mm_extract_epi16( x, 0 );
printf( "%i\n", r );
}
Daje spodziewany wynik - 15. Wszystko pięknie jeśli zostajemy przy zwykłym int.
Co jednak zrobić aby móc stosować wielkie liczby (powiedzmy: unsigned long long)?
Normalnie podstawiając dużą liczbę kompilator stwierdzi że tak się nie da, wypluwając "warning #69: integer conversion resulted in truncation".
"Podzielenie" wielkiej liczby na 4 części nie wchodzi w grę, _mm_set1 używam tylko jako przykład - docelowo oczywiście chcę robić działania na czterech liczbach jednocześnie.
Swoją drogą, dziwi mnie że w SSE2 istnieją mm*_epi32, ale _mm_extract_epi32 pojawia się dopiero przy SSE4... jest na to jakieś wyjaśnienie? Niestety nawet nie mogę przetestować epi32 bo mam w procesorze obsługę tylko SSE2 ...