1/* { dg-do run } */
2/* { dg-require-effective-target sse2 } */
3/* { dg-options "-O2 -msse2" } */
4
5#ifndef CHECK_H
6#define CHECK_H "sse2-check.h"
7#endif
8
9#ifndef TEST
10#define TEST sse2_test
11#endif
12
13#include CHECK_H
14
15#include <emmintrin.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
27static void
28TEST (void)
29{
30  union
31    {
32      __m128i x;
33      unsigned int i[4];
34      unsigned short s[8];
35    } res [8], val, tmp;
36  int masks[8];
37  unsigned short ins[4] = { 3, 4, 5, 6 };
38  int i;
39
40  val.i[0] = 0x35251505;
41  val.i[1] = 0x75655545;
42  val.i[2] = 0xB5A59585;
43  val.i[3] = 0xF5E5D5C5;
44
45  /* Check pinsrw imm8, r32, xmm.  */
46  res[0].x = _mm_insert_epi16 (val.x, ins[0], msk0);
47  res[1].x = _mm_insert_epi16 (val.x, ins[0], msk1);
48  res[2].x = _mm_insert_epi16 (val.x, ins[0], msk2);
49  res[3].x = _mm_insert_epi16 (val.x, ins[0], msk3);
50  res[4].x = _mm_insert_epi16 (val.x, ins[0], msk4);
51  res[5].x = _mm_insert_epi16 (val.x, ins[0], msk5);
52  res[6].x = _mm_insert_epi16 (val.x, ins[0], msk6);
53  res[7].x = _mm_insert_epi16 (val.x, ins[0], msk7);
54
55  masks[0] = msk0;
56  masks[1] = msk1;
57  masks[2] = msk2;
58  masks[3] = msk3;
59  masks[4] = msk4;
60  masks[5] = msk5;
61  masks[6] = msk6;
62  masks[7] = msk7;
63
64  for (i = 0; i < 8; i++)
65    {
66      tmp.x = val.x;
67      tmp.s[masks[i]] = ins[0];
68      if (memcmp (&tmp, &res[i], sizeof (tmp)))
69	abort ();
70    }
71
72  /* Check pinsrw imm8, m16, xmm.  */
73  for (i = 0; i < 8; i++)
74    {
75      res[i].x = _mm_insert_epi16 (val.x, ins[i % 2], msk0);
76      masks[i] = msk0;
77    }
78
79  for (i = 0; i < 8; i++)
80    {
81      tmp.x = val.x;
82      tmp.s[masks[i]] = ins[i % 2];
83      if (memcmp (&tmp, &res[i], sizeof (tmp)))
84	abort ();
85    }
86}
87