1 /* { dg-do run } */
2 /* { dg-require-effective-target sse4 } */
3 /* { dg-options "-O2 -msse4.1" } */
4 
5 #ifndef CHECK_H
6 #define CHECK_H "sse4_1-check.h"
7 #endif
8 
9 #ifndef TEST
10 #define TEST sse4_1_test
11 #endif
12 
13 #include CHECK_H
14 
15 #include <smmintrin.h>
16 #include <string.h>
17 
18 #define msk0 0x00
19 #define msk1 0x01
20 #define msk2 0x02
21 #define msk3 0x03
22 #define msk4 0x04
23 #define msk5 0x05
24 #define msk6 0x06
25 #define msk7 0x07
26 #define msk8 0x08
27 #define msk9 0x09
28 #define mskA 0x0A
29 #define mskB 0x0B
30 #define mskC 0x0C
31 #define mskD 0x0D
32 #define mskE 0x0E
33 #define mskF 0x0F
34 
35 static void
TEST(void)36 TEST (void)
37 {
38   union
39     {
40       __m128i x;
41       unsigned int i[4];
42       unsigned char c[16];
43     } res [16], val, tmp;
44   int masks[16];
45   unsigned char ins[4] = { 3, 4, 5, 6 };
46   int i;
47 
48   val.i[0] = 0x35251505;
49   val.i[1] = 0x75655545;
50   val.i[2] = 0xB5A59585;
51   val.i[3] = 0xF5E5D5C5;
52 
53   /* Check pinsrb imm8, r32, xmm.  */
54   res[0].x = _mm_insert_epi8 (val.x, ins[0], msk0);
55   res[1].x = _mm_insert_epi8 (val.x, ins[0], msk1);
56   res[2].x = _mm_insert_epi8 (val.x, ins[0], msk2);
57   res[3].x = _mm_insert_epi8 (val.x, ins[0], msk3);
58   res[4].x = _mm_insert_epi8 (val.x, ins[0], msk4);
59   res[5].x = _mm_insert_epi8 (val.x, ins[0], msk5);
60   res[6].x = _mm_insert_epi8 (val.x, ins[0], msk6);
61   res[7].x = _mm_insert_epi8 (val.x, ins[0], msk7);
62   res[8].x = _mm_insert_epi8 (val.x, ins[0], msk8);
63   res[9].x = _mm_insert_epi8 (val.x, ins[0], msk9);
64   res[10].x = _mm_insert_epi8 (val.x, ins[0], mskA);
65   res[11].x = _mm_insert_epi8 (val.x, ins[0], mskB);
66   res[12].x = _mm_insert_epi8 (val.x, ins[0], mskC);
67   res[13].x = _mm_insert_epi8 (val.x, ins[0], mskD);
68   res[14].x = _mm_insert_epi8 (val.x, ins[0], mskE);
69   res[15].x = _mm_insert_epi8 (val.x, ins[0], mskF);
70 
71   masks[0] = msk0;
72   masks[1] = msk1;
73   masks[2] = msk2;
74   masks[3] = msk3;
75   masks[4] = msk4;
76   masks[5] = msk5;
77   masks[6] = msk6;
78   masks[7] = msk7;
79   masks[8] = msk8;
80   masks[9] = msk9;
81   masks[10] = mskA;
82   masks[11] = mskB;
83   masks[12] = mskC;
84   masks[13] = mskD;
85   masks[14] = mskE;
86   masks[15] = mskF;
87 
88   for (i = 0; i < 16; i++)
89     {
90       tmp.x = val.x;
91       tmp.c[masks[i]] = ins[0];
92       if (memcmp (&tmp, &res[i], sizeof (tmp)))
93 	abort ();
94     }
95 
96   /* Check pinsrb imm8, m8, xmm.  */
97   for (i = 0; i < 16; i++)
98     {
99       res[i].x = _mm_insert_epi8 (val.x, ins[i % 4], msk0);
100       masks[i] = msk0;
101     }
102 
103   for (i = 0; i < 16; i++)
104     {
105       tmp.x = val.x;
106       tmp.c[masks[i]] = ins[i % 4];
107       if (memcmp (&tmp, &res[i], sizeof (tmp)))
108 	abort ();
109     }
110 }
111