Update concepts branch to revision 131834
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / sse4_1-mpsadbw.c
blobc47d95b8c9e0321a0631203d8171811d32cb5833
1 /* { dg-do run } */
2 /* { dg-require-effective-target sse4 } */
3 /* { dg-options "-O2 -msse4.1" } */
5 #include "sse4_1-check.h"
7 #include <smmintrin.h>
8 #include <string.h>
10 #define msk0 0xC0
11 #define msk1 0x01
12 #define msk2 0xF2
13 #define msk3 0x03
14 #define msk4 0x84
15 #define msk5 0x05
16 #define msk6 0xE6
17 #define msk7 0x67
19 static __m128i
20 compute_mpsadbw (unsigned char *v1, unsigned char *v2, int mask)
22 union
24 __m128i x;
25 unsigned short s[8];
26 } ret;
27 unsigned char s[4];
28 int i, j;
29 int offs1, offs2;
31 offs2 = 4 * (mask & 3);
32 for (i = 0; i < 4; i++)
33 s[i] = v2[offs2 + i];
35 offs1 = 4 * ((mask & 4) >> 2);
36 for (j = 0; j < 8; j++)
38 ret.s[j] = 0;
39 for (i = 0; i < 4; i++)
40 ret.s[j] += abs (v1[offs1 + j + i] - s[i]);
43 return ret.x;
46 static void
47 sse4_1_test (void)
49 union
51 __m128i x;
52 unsigned int i[4];
53 unsigned char c[16];
54 } val1, val2, val3 [8];
55 __m128i res[8], tmp;
56 unsigned char masks[8];
57 int i;
59 val1.i[0] = 0x35251505;
60 val1.i[1] = 0x75655545;
61 val1.i[2] = 0xB5A59585;
62 val1.i[3] = 0xF5E5D5C5;
64 val2.i[0] = 0x31211101;
65 val2.i[1] = 0x71615141;
66 val2.i[2] = 0xB1A19181;
67 val2.i[3] = 0xF1E1D1C1;
69 for (i=0; i < 8; i++)
70 switch (i % 3)
72 case 1:
73 val3[i].i[0] = 0xF1E1D1C1;
74 val3[i].i[1] = 0xB1A19181;
75 val3[i].i[2] = 0x71615141;
76 val3[i].i[3] = 0x31211101;
77 break;
78 default:
79 val3[i].x = val2.x;
80 break;
83 /* Check mpsadbw imm8, xmm, xmm. */
84 res[0] = _mm_mpsadbw_epu8 (val1.x, val2.x, msk0);
85 res[1] = _mm_mpsadbw_epu8 (val1.x, val2.x, msk1);
86 res[2] = _mm_mpsadbw_epu8 (val1.x, val2.x, msk2);
87 res[3] = _mm_mpsadbw_epu8 (val1.x, val2.x, msk3);
88 res[4] = _mm_mpsadbw_epu8 (val1.x, val2.x, msk4);
89 res[5] = _mm_mpsadbw_epu8 (val1.x, val2.x, msk5);
90 res[6] = _mm_mpsadbw_epu8 (val1.x, val2.x, msk6);
91 res[7] = _mm_mpsadbw_epu8 (val1.x, val2.x, msk7);
93 masks[0] = msk0;
94 masks[1] = msk1;
95 masks[2] = msk2;
96 masks[3] = msk3;
97 masks[4] = msk4;
98 masks[5] = msk5;
99 masks[6] = msk6;
100 masks[7] = msk7;
102 for (i=0; i < 8; i++)
104 tmp = compute_mpsadbw (val1.c, val2.c, masks[i]);
105 if (memcmp (&tmp, &res[i], sizeof (tmp)))
106 abort ();
109 /* Check mpsadbw imm8, m128, xmm. */
110 for (i=0; i < 8; i++)
112 res[i] = _mm_mpsadbw_epu8 (val1.x, val3[i].x, msk4);
113 masks[i] = msk4;
116 for (i=0; i < 8; i++)
118 tmp = compute_mpsadbw (val1.c, val3[i].c, masks[i]);
119 if (memcmp (&tmp, &res[i], sizeof (tmp)))
120 abort ();