Merge -r 127928:132243 from trunk
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / sse5-permpX.c
blobcae30772531ac50e89b33f1ac57e854dfc8ff813
1 /* { dg-do run } */
2 /* { dg-require-effective-target sse5 } */
3 /* { dg-options "-O2 -msse5" } */
5 #include "sse5-check.h"
7 #include <bmmintrin.h>
8 #include <string.h>
10 union
12 __m128 x[2];
13 __m128d y[2];
14 __m128i z[2];
15 float f[8];
16 double d[4];
17 int i[8];
18 long li[4];
19 } dst, res, src1, src2, src3;
22 static void
23 init_ddata ()
25 int i;
26 for (i = 0; i < 4; i++)
28 src1.d[i] = i;
29 src2.d[i] = i + 2;
32 src3.li[0] = 3;
33 src3.li[1] = 0;
34 src3.li[2] = 1;
35 src3.li[3] = 2;
37 res.d[0] = 3.0;
38 res.d[1] = 0.0;
39 res.d[2] = 3.0;
40 res.d[3] = 4.0;
44 static void
45 init_fdata ()
47 int i;
48 for (i = 0; i < 8; i++)
50 src1.f[i] = i;
51 src2.f[i] = i + 2;
54 src3.i[0] = 7;
55 src3.i[1] = 5;
56 src3.i[2] = 1;
57 src3.i[3] = 2;
58 src3.i[4] = 0;
59 src3.i[5] = 4;
60 src3.i[6] = 3;
61 src3.i[7] = 6;
63 res.f[0] = 5.0;
64 res.f[1] = 3.0;
65 res.f[2] = 1.0;
66 res.f[3] = 2.0;
67 res.f[4] = 4.0;
68 res.f[5] = 6.0;
69 res.f[6] = 7.0;
70 res.f[7] = 8.0;
73 static int
74 check_permpd ()
76 int i, check_fails = 0;
78 for (i = 0; i < 4; i++)
80 if (res.d[i] != dst.d[i])
81 check_fails++;
83 return check_fails++;
86 static int
87 check_permps ()
89 int i, check_fails = 0;
91 for (i = 0; i < 8; i++)
93 if (res.f[i] != dst.f[i])
94 check_fails++;
96 return check_fails++;
99 static void
100 sse5_test (void)
102 int i;
103 init_ddata();
105 for (i = 0; i < 2; i++)
106 dst.y[i] = _mm_perm_pd (src1.y[i], src2.y[i], src3.z[i]);
108 if (check_permpd ())
109 abort ();
111 init_fdata();
113 for (i = 0; i < 2; i++)
114 dst.x[i] = _mm_perm_ps (src1.x[i], src2.x[i], src3.z[i]);
116 if (check_permps ())
117 abort ();