Robiąc pierwsze kroki z SSE starłem się z instrukcją _mm_shuffle. Dokumentacja od microsoftu umiarkowanie rozjaśniła jak się tego używa, ale dalej nie wszystko rozumiałem. Naskrobałem więc prosty programik, którym można sprawdzić jak się zachowa _mm_shuffle dla zadanej maski:
Programik wykorzystuje .NET / WPF / C# / XAML. Sorry, ale wine tego raczej nie pociągnie.
W oryginale _mm_shuffle_ps używa 2 zmiennych typu m128 zawierajacych po 4 floaty, zaś tutaj są inty, ale to nie zmienia zasady działania. Przecież chodzi tylko o przetasowanie wartości!
Kod referencyjny w C: __m128 a,b,c; a.m128_f32[0]=10; a.m128_f32[1]=11; a.m128_f32[2]=12; a.m128_f32[3]=13;
Dokumentacja od microsoftu Dokładne wyjaśnienie działania shuffle’a
b.m128_f32[0]=20; b.m128_f32[1]=21; b.m128_f32[2]=22; b.m128_f32[3]=23;
c=_mm_shuffle_ps(a,b,_MM_SHUFFLE(3,2,1,0));
std::cout<< "3 2 1 0 "<<std::endl
<<c.m128_f32[3]<<" "
<<c.m128_f32[2]<<" "
<<c.m128_f32[1]<<" "
<<c.m128_f32[0]<<" ";