OSDN Git Service

gcc/
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / i386 / sse4_1-dppd-1.c
1 /* { dg-do run } */
2 /* { dg-require-effective-target sse4 } */
3 /* { dg-options "-O2 -msse4.1" } */
4
5 #include "sse4_1-check.h"
6
7 #include <smmintrin.h>
8
9 #define lmskN  0x00
10 #define lmsk0  0x01
11 #define lmsk1  0x02
12 #define lmsk01 0x03
13
14 #define hmskA  0x30
15 #define hmsk0  0x10
16 #define hmsk1  0x20
17 #define hmsk01 0x30
18 #define hmskN  0x00
19
20 #ifndef HIMASK
21 #define HIMASK hmskA
22 #endif
23
24 static void
25 sse4_1_test (void)
26 {
27   union
28     {
29       __m128d x;
30       double d[2];
31     } val1, val2, res[4];
32   int masks[4];
33   int i, j;
34
35   val1.d[0] = 2.;
36   val1.d[1] = 3.;
37
38   val2.d[0] = 10.;
39   val2.d[1] = 100.;
40
41   res[0].x = _mm_dp_pd (val1.x, val2.x, HIMASK | lmskN);
42   res[1].x = _mm_dp_pd (val1.x, val2.x, HIMASK | lmsk0);
43   res[2].x = _mm_dp_pd (val1.x, val2.x, HIMASK | lmsk1);
44   res[3].x = _mm_dp_pd (val1.x, val2.x, HIMASK | lmsk01);
45
46   masks[0] = HIMASK | lmskN;
47   masks[1] = HIMASK | lmsk0;
48   masks[2] = HIMASK | lmsk1;
49   masks[3] = HIMASK | lmsk01; 
50
51   for (i = 0; i < 4; i++)
52     {
53       double tmp = 0.;
54
55       for (j = 0; j < 2; j++)
56         if (HIMASK & (0x10 << j))
57           tmp = tmp + (val1.d[j] * val2.d[j]);
58
59       for (j = 0; j < 2; j++)
60         if ((masks[i] & (1 << j)) && res[i].d[j] != tmp)
61           abort ();
62    }
63