1 /* { dg-do run } */
2 /* { dg-require-effective-target vsx_hw } */
3 /* { dg-options "-O2 -mvsx" } */
4
5 #define NO_WARN_X86_INTRINSICS 1
6 #include <smmintrin.h>
7
8 #define VEC_T __m128d
9 #define FP_T double
10
11 #define ROUND_INTRIN(x, ignored, mode) _mm_round_pd (x, mode)
12
13 #include "sse4_1-round-data.h"
14
15 struct data2 data[] = {
16 { .value1 = { .f = { 0.00, 0.25 } } },
17 { .value1 = { .f = { 0.50, 0.75 } } },
18
19 { .value1 = { .f = { 0x1.ffffffffffffcp+50, 0x1.ffffffffffffdp+50 } } },
20 { .value1 = { .f = { 0x1.ffffffffffffep+50, 0x1.fffffffffffffp+50 } } },
21 { .value1 = { .f = { 0x1.0000000000000p+51, 0x1.0000000000001p+51 } } },
22 { .value1 = { .f = { 0x1.0000000000002p+51, 0x1.0000000000003p+51 } } },
23
24 { .value1 = { .f = { 0x1.ffffffffffffep+51, 0x1.fffffffffffffp+51 } } },
25 { .value1 = { .f = { 0x1.0000000000000p+52, 0x1.0000000000001p+52 } } },
26
27 { .value1 = { .f = { -0x1.0000000000001p+52, -0x1.0000000000000p+52 } } },
28 { .value1 = { .f = { -0x1.fffffffffffffp+51, -0x1.ffffffffffffep+51 } } },
29
30 { .value1 = { .f = { -0x1.0000000000004p+51, -0x1.0000000000002p+51 } } },
31 { .value1 = { .f = { -0x1.0000000000001p+51, -0x1.0000000000000p+51 } } },
32 { .value1 = { .f = { -0x1.ffffffffffffcp+50, -0x1.ffffffffffffep+50 } } },
33 { .value1 = { .f = { -0x1.ffffffffffffdp+50, -0x1.ffffffffffffcp+50 } } },
34
35 { .value1 = { .f = { -1.00, -0.75 } } },
36 { .value1 = { .f = { -0.50, -0.25 } } }
37 };
38
39 union value answers_NEAREST_INT[] = {
40 { .f = { 0.00, 0.00 } },
41 { .f = { 0.00, 1.00 } },
42
43 { .f = { 0x1.ffffffffffffcp+50, 0x1.ffffffffffffcp+50 } },
44 { .f = { 0x1.0000000000000p+51, 0x1.0000000000000p+51 } },
45 { .f = { 0x1.0000000000000p+51, 0x1.0000000000000p+51 } },
46 { .f = { 0x1.0000000000002p+51, 0x1.0000000000004p+51 } },
47
48 { .f = { 0x1.ffffffffffffep+51, 0x1.0000000000000p+52 } },
49 { .f = { 0x1.0000000000000p+52, 0x1.0000000000001p+52 } },
50
51 { .f = { -0x1.0000000000001p+52, -0x1.0000000000000p+52 } },
52 { .f = { -0x1.0000000000000p+52, -0x1.ffffffffffffep+51 } },
53
54 { .f = { -0x1.0000000000004p+51, -0x1.0000000000002p+51 } },
55 { .f = { -0x1.0000000000000p+51, -0x1.0000000000000p+51 } },
56 { .f = { -0x1.ffffffffffffcp+50, -0x1.0000000000000p+51 } },
57 { .f = { -0x1.ffffffffffffcp+50, -0x1.ffffffffffffcp+50 } },
58
59 { .f = { -1.00, -1.00 } },
60 { .f = { 0.00, 0.00 } }
61 };
62
63 union value answers_NEG_INF[] = {
64 { .f = { 0.00, 0.00 } },
65 { .f = { 0.00, 0.00 } },
66
67 { .f = { 0x1.ffffffffffffcp+50, 0x1.ffffffffffffcp+50 } },
68 { .f = { 0x1.ffffffffffffcp+50, 0x1.ffffffffffffcp+50 } },
69 { .f = { 0x1.0000000000000p+51, 0x1.0000000000000p+51 } },
70 { .f = { 0x1.0000000000002p+51, 0x1.0000000000002p+51 } },
71
72 { .f = { 0x1.ffffffffffffep+51, 0x1.ffffffffffffep+51 } },
73 { .f = { 0x1.0000000000000p+52, 0x1.0000000000001p+52 } },
74
75 { .f = { -0x1.0000000000001p+52, -0x1.0000000000000p+52 } },
76 { .f = { -0x1.0000000000000p+52, -0x1.ffffffffffffep+51 } },
77
78 { .f = { -0x1.0000000000004p+51, -0x1.0000000000002p+51 } },
79 { .f = { -0x1.0000000000002p+51, -0x1.0000000000000p+51 } },
80 { .f = { -0x1.ffffffffffffcp+50, -0x1.0000000000000p+51 } },
81 { .f = { -0x1.0000000000000p+51, -0x1.ffffffffffffcp+50 } },
82
83 { .f = { -1.00, -1.00 } },
84 { .f = { -1.00, -1.00 } }
85 };
86
87 union value answers_POS_INF[] = {
88 { .f = { 0.00, 1.00 } },
89 { .f = { 1.00, 1.00 } },
90
91 { .f = { 0x1.ffffffffffffcp+50, 0x1.0000000000000p+51 } },
92 { .f = { 0x1.0000000000000p+51, 0x1.0000000000000p+51 } },
93 { .f = { 0x1.0000000000000p+51, 0x1.0000000000002p+51 } },
94 { .f = { 0x1.0000000000002p+51, 0x1.0000000000004p+51 } },
95
96 { .f = { 0x1.ffffffffffffep+51, 0x1.0000000000000p+52 } },
97 { .f = { 0x1.0000000000000p+52, 0x1.0000000000001p+52 } },
98
99 { .f = { -0x1.0000000000001p+52, -0x1.0000000000000p+52 } },
100 { .f = { -0x1.ffffffffffffep+51, -0x1.ffffffffffffep+51 } },
101
102 { .f = { -0x1.0000000000004p+51, -0x1.0000000000002p+51 } },
103 { .f = { -0x1.0000000000000p+51, -0x1.0000000000000p+51 } },
104 { .f = { -0x1.ffffffffffffcp+50, -0x1.ffffffffffffcp+50 } },
105 { .f = { -0x1.ffffffffffffcp+50, -0x1.ffffffffffffcp+50 } },
106
107 { .f = { -1.00, 0.00 } },
108 { .f = { 0.00, 0.00 } }
109 };
110
111 union value answers_ZERO[] = {
112 { .f = { 0.00, 0.00 } },
113 { .f = { 0.00, 0.00 } },
114
115 { .f = { 0x1.ffffffffffffcp+50, 0x1.ffffffffffffcp+50 } },
116 { .f = { 0x1.ffffffffffffcp+50, 0x1.ffffffffffffcp+50 } },
117 { .f = { 0x1.0000000000000p+51, 0x1.0000000000000p+51 } },
118 { .f = { 0x1.0000000000002p+51, 0x1.0000000000002p+51 } },
119
120 { .f = { 0x1.ffffffffffffep+51, 0x1.ffffffffffffep+51 } },
121 { .f = { 0x1.0000000000000p+52, 0x1.0000000000001p+52 } },
122
123 { .f = { -0x1.0000000000001p+52, -0x1.0000000000000p+52 } },
124 { .f = { -0x1.ffffffffffffep+51, -0x1.ffffffffffffep+51 } },
125
126 { .f = { -0x1.0000000000004p+51, -0x1.0000000000002p+51 } },
127 { .f = { -0x1.0000000000000p+51, -0x1.0000000000000p+51 } },
128 { .f = { -0x1.ffffffffffffcp+50, -0x1.ffffffffffffcp+50 } },
129 { .f = { -0x1.ffffffffffffcp+50, -0x1.ffffffffffffcp+50 } },
130
131 { .f = { -1.00, 0.00 } },
132 { .f = { 0.00, 0.00 } }
133 };
134
135 union value *answers[] = {
136 answers_NEAREST_INT,
137 answers_NEG_INF,
138 answers_POS_INF,
139 answers_ZERO,
140 0 /* CUR_DIRECTION answers depend on current rounding mode. */
141 };
142
143 #include "sse4_1-round3.h"