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 
17 #include <string.h>
18 
19 #define lmskN  0x00
20 #define lmsk0  0x01
21 #define lmsk1  0x02
22 #define lmsk01 0x03
23 
24 #define hmskA  0x30
25 #define hmsk0  0x10
26 #define hmsk1  0x20
27 #define hmsk01 0x30
28 #define hmskN  0x00
29 
30 #ifndef HIMASK
31 #define HIMASK hmskA
32 #endif
33 
34 #ifndef LOMASK
35 #define LOMASK lmsk01
36 #endif
37 
38 static void
TEST(void)39 TEST (void)
40 {
41   union
42     {
43       __m128d x;
44       double d[2];
45     } val1[4], val2[4], res[4], chk[4];
46   int i, j;
47   double tmp;
48 
49   for (i = 0; i < 4; i++)
50     {
51       val1[i].d [0] = 2.;
52       val1[i].d [1] = 3.;
53 
54       val2[i].d [0] = 10.;
55       val2[i].d [1] = 100.;
56 
57       tmp = 0.;
58       for (j = 0; j < 2; j++)
59 	if ((HIMASK & (0x10 << j)))
60 	  tmp += val1[i].d [j] * val2[i].d [j];
61 
62       for (j = 0; j < 2; j++)
63         if ((LOMASK & (1 << j)))
64 	  chk[i].d[j] = tmp;
65     }
66 
67   for (i = 0; i < 4; i++)
68     {
69       res[i].x = _mm_dp_pd (val1[i].x, val2[i].x, HIMASK | LOMASK);
70       if (memcmp (&res[i], &chk[i], sizeof (chk[i])))
71 	abort ();
72     }
73 }
74