PR inline-asm/84742
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / sse4_1-dpps-2.c
blob48483b6c824b35e36d9056f489aa2bc600a888c2
1 /* { dg-do run } */
2 /* { dg-require-effective-target sse4 } */
3 /* { dg-options "-O2 -msse4.1" } */
5 #ifndef CHECK_H
6 #define CHECK_H "sse4_1-check.h"
7 #endif
9 #ifndef TEST
10 #define TEST sse4_1_test
11 #endif
13 #include CHECK_H
15 #include <smmintrin.h>
17 #include <string.h>
19 #define lmskN 0x00
20 #define lmsk0 0x01
21 #define lmsk1 0x02
22 #define lmsk2 0x04
23 #define lmsk3 0x08
24 #define lmsk01 0x03
25 #define lmsk02 0x05
26 #define lmsk03 0x09
27 #define lmsk12 0x06
28 #define lmsk13 0x0A
29 #define lmsk23 0x0C
30 #define lmskA 0x0F
32 #define hmskN 0x00
33 #define hmskA 0xF0
34 #define hmsk0 0x10
35 #define hmsk1 0x20
36 #define hmsk2 0x40
37 #define hmsk3 0x80
38 #define hmsk01 0x30
39 #define hmsk02 0x50
40 #define hmsk03 0x90
41 #define hmsk12 0x60
42 #define hmsk13 0xA0
43 #define hmsk23 0xC0
45 #ifndef HIMASK
46 #define HIMASK hmskA
47 #endif
49 #ifndef LOMASK
50 #define LOMASK lmskA
51 #endif
53 static void
54 TEST (void)
56 union
58 __m128 x;
59 float f[4];
60 } val1[16], val2[16], res[16], chk[16];
61 int i,j;
62 float tmp;
64 for (i = 0; i < 16; i++)
66 val1[i].f[0] = 2.;
67 val1[i].f[1] = 3.;
68 val1[i].f[2] = 4.;
69 val1[i].f[3] = 5.;
71 val2[i].f[0] = 10.;
72 val2[i].f[1] = 100.;
73 val2[i].f[2] = 1000.;
74 val2[i].f[3] = 10000.;
76 tmp = 0.;
77 for (j = 0; j < 4; j++)
78 if ((HIMASK & (0x10 << j)))
79 tmp += val1[i].f [j] * val2[i].f [j];
81 for (j = 0; j < 4; j++)
82 if ((LOMASK & (1 << j)))
83 chk[i].f[j] = tmp;
86 for (i = 0; i < 16; i++)
88 res[i].x = _mm_dp_ps (val1[i].x, val2[i].x, HIMASK | LOMASK);
89 if (memcmp (&res[i], &chk[i], sizeof (chk[i])))
90 abort ();