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
35static void
36TEST (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