- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello there,
I have no idea how _mm_shuffleXXXXX works. Does anyone out there know?
I especially having problem with the _mm_shuffle_epi32(), _mm_shufflehi_epi16() and _mm_shufflelo_epi16(). I have read numerous explaination on those instrinsics on the net, but they seem to be too difficult for me to understand including this one, the most comprehensive one that I have found. http://www.tommesani.com/SSE2MMX.html
Regards,
Kennant
Link Copied
1 Reply
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Kennant,
I found your question when searching for code examples on shuffle. It has been more than 6 years, and I hope this can still be helpful.
_mm_shuffle_epi32() shuffles a 128bit vector that consists for 4 signed/unsigned integers. It usually works together with the _MM_SHUFFLE() macro. You can view _MM_SHUFFLE() as a permutation, that is, it permutes elements based the operands of _MM_SHUFFLE().
Here is a code snippet that better explains how it works:
_MM_SHUFFLE(2, 3, 0, 1) permutes [a3, a2, a1, a0] to [a2, a3, a0, a1].
LC
I found your question when searching for code examples on shuffle. It has been more than 6 years, and I hope this can still be helpful.
_mm_shuffle_epi32() shuffles a 128bit vector that consists for 4 signed/unsigned integers. It usually works together with the _MM_SHUFFLE() macro. You can view _MM_SHUFFLE() as a permutation, that is, it permutes elements based the operands of _MM_SHUFFLE().
Here is a code snippet that better explains how it works:
[cpp]void test(int32_t *Y, int32_t *X)
{
__m128i *v1, *v2;
__m128i v3, v4;
int32_t * rslt;
int64_t * rslt64;
v1 = (__m128i *) X;
v2 = (__m128i *) Y;
rslt = (int32_t * ) v1;
printf("In test, V1 after MUL SHUFFLE: %dt%dt%dt%dtn", rslt[0], rslt[1], rslt[2], rslt[3]);
rslt = (int32_t * ) v2;
printf("In test, V2 before MUL SHUFFLE: %dt%dt%dt%dtn", rslt[0], rslt[1], rslt[2], rslt[3]);
v3 = _mm_mul_epi32(*v1, *v2);
v4 = _mm_mul_epi32(_mm_shuffle_epi32(*v1, _MM_SHUFFLE(2, 3, 0, 1)), _mm_shuffle_epi32(*v2, _MM_SHUFFLE(2, 3, 0, 1))); rslt64 = (int64_t * ) &v3;
printf("In REDC, product before SHUFFLE: %ldt%ldn", rslt64[0], rslt64[1]); rslt64 = (int64_t * ) &v4; printf("In REDC, product after SHUFFLE: %ldt%ldn", rslt64[0], rslt64[1]);
rslt = (int32_t * ) v1; printf("In REDC, 4-way vect before SHUFFLE: %dt%dt%dt%dtn", rslt[0], rslt[1], rslt[2], rslt[3]); *v1 = _mm_shuffle_epi32(*v1, _MM_SHUFFLE(2, 3, 0, 1)); rslt = (int32_t * ) v1; printf("In REDC, 4-way vect after SHUFFLE: %dt%dt%dt%dtn", rslt[0], rslt[1], rslt[2], rslt[3]); }[/cpp]
_MM_SHUFFLE(2, 3, 0, 1) permutes [a3, a2, a1, a0] to [a2, a3, a0, a1].
LC
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page