OSDN Git Service

2007-05-24 H.J. Lu <hongjiu.lu@intel.com>
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / i386 / sse4_1-dppd-2.c
1 /* { dg-do run { target i?86-*-* x86_64-*-* } } */
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 #include <string.h>
9
10 #define lmskN  0x00
11 #define lmsk0  0x01
12 #define lmsk1  0x02
13 #define lmsk01 0x03
14
15 #define hmskA  0x30
16 #define hmsk0  0x10
17 #define hmsk1  0x20
18 #define hmsk01 0x30
19 #define hmskN  0x00
20
21 #ifndef HIMASK
22 #define HIMASK hmskA
23 #endif
24
25 #ifndef LOMASK
26 #define LOMASK lmsk01
27 #endif
28
29 static void
30 sse4_1_test (void)
31 {
32   union
33     {
34       __m128d x;
35       double d[2];
36     } val1[4], val2[4], res[4], chk[4];
37   int i, j;
38   double tmp;
39
40   for (i = 0; i < 4; i++)
41     {
42       val1[i].d [0] = 2.;
43       val1[i].d [1] = 3.;
44
45       val2[i].d [0] = 10.;
46       val2[i].d [1] = 100.;
47
48       tmp = 0.;
49       for (j = 0; j < 2; j++)
50         if ((HIMASK & (0x10 << j)))
51           tmp += val1[i].d [j] * val2[i].d [j];
52
53       for (j = 0; j < 2; j++)
54         if ((LOMASK & (1 << j)))
55           chk[i].d[j] = tmp;
56     }
57
58   for (i = 0; i < 4; i++)
59     {
60       res[i].x = _mm_dp_pd (val1[i].x, val2[i].x, HIMASK | LOMASK); 
61       if (memcmp (&res[i], &chk[i], sizeof (chk[i])))
62         abort ();
63     }
64 }