PR inline-asm/84742
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / sse2-pinsrw.c
blob16167437c6dca5fecd90f1bfa95e1ab834cec239
1 /* { dg-do run } */
2 /* { dg-require-effective-target sse2 } */
3 /* { dg-options "-O2 -msse2" } */
5 #ifndef CHECK_H
6 #define CHECK_H "sse2-check.h"
7 #endif
9 #ifndef TEST
10 #define TEST sse2_test
11 #endif
13 #include CHECK_H
15 #include <emmintrin.h>
16 #include <string.h>
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
27 static void
28 TEST (void)
30 union
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;
40 val.i[0] = 0x35251505;
41 val.i[1] = 0x75655545;
42 val.i[2] = 0xB5A59585;
43 val.i[3] = 0xF5E5D5C5;
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);
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;
64 for (i = 0; i < 8; i++)
66 tmp.x = val.x;
67 tmp.s[masks[i]] = ins[0];
68 if (memcmp (&tmp, &res[i], sizeof (tmp)))
69 abort ();
72 /* Check pinsrw imm8, m16, xmm. */
73 for (i = 0; i < 8; i++)
75 res[i].x = _mm_insert_epi16 (val.x, ins[i % 2], msk0);
76 masks[i] = msk0;
79 for (i = 0; i < 8; i++)
81 tmp.x = val.x;
82 tmp.s[masks[i]] = ins[i % 2];
83 if (memcmp (&tmp, &res[i], sizeof (tmp)))
84 abort ();