Update concepts branch to revision 131834
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / sse4_1-pinsrb.c
blobdd5ee0355ddb89cf0fa3ad716b342b143bd265f2
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 0x00
11 #define msk1 0x01
12 #define msk2 0x02
13 #define msk3 0x03
14 #define msk4 0x04
15 #define msk5 0x05
16 #define msk6 0x06
17 #define msk7 0x07
18 #define msk8 0x08
19 #define msk9 0x09
20 #define mskA 0x0A
21 #define mskB 0x0B
22 #define mskC 0x0C
23 #define mskD 0x0D
24 #define mskE 0x0E
25 #define mskF 0x0F
27 static void
28 sse4_1_test (void)
30 union
32 __m128i x;
33 unsigned int i[4];
34 unsigned char c[16];
35 } res [16], val, tmp;
36 int masks[16];
37 unsigned char ins[4] = { 3, 4, 5, 6 };
38 int i;
40 val.i[0] = 0x35251505;
41 val.i[1] = 0x75655545;
42 val.i[2] = 0xB5A59585;
43 val.i[3] = 0xF5E5D5C5;
45 /* Check pinsrb imm8, r32, xmm. */
46 res[0].x = _mm_insert_epi8 (val.x, ins[0], msk0);
47 res[1].x = _mm_insert_epi8 (val.x, ins[0], msk1);
48 res[2].x = _mm_insert_epi8 (val.x, ins[0], msk2);
49 res[3].x = _mm_insert_epi8 (val.x, ins[0], msk3);
50 res[4].x = _mm_insert_epi8 (val.x, ins[0], msk4);
51 res[5].x = _mm_insert_epi8 (val.x, ins[0], msk5);
52 res[6].x = _mm_insert_epi8 (val.x, ins[0], msk6);
53 res[7].x = _mm_insert_epi8 (val.x, ins[0], msk7);
54 res[8].x = _mm_insert_epi8 (val.x, ins[0], msk8);
55 res[9].x = _mm_insert_epi8 (val.x, ins[0], msk9);
56 res[10].x = _mm_insert_epi8 (val.x, ins[0], mskA);
57 res[11].x = _mm_insert_epi8 (val.x, ins[0], mskB);
58 res[12].x = _mm_insert_epi8 (val.x, ins[0], mskC);
59 res[13].x = _mm_insert_epi8 (val.x, ins[0], mskD);
60 res[14].x = _mm_insert_epi8 (val.x, ins[0], mskE);
61 res[15].x = _mm_insert_epi8 (val.x, ins[0], mskF);
63 masks[0] = msk0;
64 masks[1] = msk1;
65 masks[2] = msk2;
66 masks[3] = msk3;
67 masks[4] = msk4;
68 masks[5] = msk5;
69 masks[6] = msk6;
70 masks[7] = msk7;
71 masks[8] = msk8;
72 masks[9] = msk9;
73 masks[10] = mskA;
74 masks[11] = mskB;
75 masks[12] = mskC;
76 masks[13] = mskD;
77 masks[14] = mskE;
78 masks[15] = mskF;
80 for (i = 0; i < 16; i++)
82 tmp.x = val.x;
83 tmp.c[masks[i]] = ins[0];
84 if (memcmp (&tmp, &res[i], sizeof (tmp)))
85 abort ();
88 /* Check pinsrb imm8, m8, xmm. */
89 for (i = 0; i < 16; i++)
91 res[i].x = _mm_insert_epi8 (val.x, ins[i % 4], msk0);
92 masks[i] = msk0;
95 for (i = 0; i < 16; i++)
97 tmp.x = val.x;
98 tmp.c[masks[i]] = ins[i % 4];
99 if (memcmp (&tmp, &res[i], sizeof (tmp)))
100 abort ();