[testsuite] require sqrt_insn effective target where needed
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / sse4_1-round3.h
blobde6cbf7be438c4bcbd0a1b661b8dc233624cb6d4
1 #include <smmintrin.h>
2 #include <fenv.h>
3 #include "sse4_1-check.h"
5 #define DIM(a) (sizeof (a) / sizeof (a)[0])
7 static int roundings[] =
9 _MM_FROUND_TO_NEAREST_INT,
10 _MM_FROUND_TO_NEG_INF,
11 _MM_FROUND_TO_POS_INF,
12 _MM_FROUND_TO_ZERO,
13 _MM_FROUND_CUR_DIRECTION
16 static int modes[] =
18 FE_TONEAREST,
19 FE_UPWARD,
20 FE_DOWNWARD,
21 FE_TOWARDZERO
24 static void
25 TEST (void)
27 int i, j, ri, mi, round_save;
29 round_save = fegetround ();
30 for (mi = 0; mi < DIM (modes); mi++) {
31 fesetround (modes[mi]);
32 for (i = 0; i < DIM (data); i++) {
33 for (ri = 0; ri < DIM (roundings); ri++) {
34 union value guess;
35 union value *current_answers = answers[ri];
36 switch ( roundings[ri] ) {
37 case _MM_FROUND_TO_NEAREST_INT:
38 guess.x = ROUND_INTRIN (data[i].value1.x, data[i].value2.x,
39 _MM_FROUND_TO_NEAREST_INT);
40 break;
41 case _MM_FROUND_TO_NEG_INF:
42 guess.x = ROUND_INTRIN (data[i].value1.x, data[i].value2.x,
43 _MM_FROUND_TO_NEG_INF);
44 break;
45 case _MM_FROUND_TO_POS_INF:
46 guess.x = ROUND_INTRIN (data[i].value1.x, data[i].value2.x,
47 _MM_FROUND_TO_POS_INF);
48 break;
49 case _MM_FROUND_TO_ZERO:
50 guess.x = ROUND_INTRIN (data[i].value1.x, data[i].value2.x,
51 _MM_FROUND_TO_ZERO);
52 break;
53 case _MM_FROUND_CUR_DIRECTION:
54 guess.x = ROUND_INTRIN (data[i].value1.x, data[i].value2.x,
55 _MM_FROUND_CUR_DIRECTION);
56 switch ( modes[mi] ) {
57 case FE_TONEAREST:
58 current_answers = answers_NEAREST_INT;
59 break;
60 case FE_UPWARD:
61 current_answers = answers_POS_INF;
62 break;
63 case FE_DOWNWARD:
64 current_answers = answers_NEG_INF;
65 break;
66 case FE_TOWARDZERO:
67 current_answers = answers_ZERO;
68 break;
70 break;
71 default:
72 abort ();
74 for (j = 0; j < DIM (guess.f); j++)
75 if (guess.f[j] != current_answers[i].f[j])
76 abort ();
80 fesetround (round_save);