summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/tg-tests.h
blob: ce9cfb866cfb455a879e28ac500af21fa21fcba8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/* Test various type-generic builtins by calling "main_tests()".  */

#define FP_NAN 1
#define FP_INFINITE 2
#define FP_NORMAL 3
#define FP_SUBNORMAL 4
#define FP_ZERO 5
#define fpclassify(X) __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, (X))

void __attribute__ ((__noinline__))
foo_1 (float f, double d, long double ld,
       int res_unord, int res_isnan, int res_isinf,
       int res_isinf_sign, int res_isfin, int res_isnorm,
       int classification)
{
  if (__builtin_isunordered (f, 0) != res_unord)
    __builtin_abort ();
  if (__builtin_isunordered (0, f) != res_unord)
    __builtin_abort ();
  if (__builtin_isunordered (d, 0) != res_unord)
    __builtin_abort ();
  if (__builtin_isunordered (0, d) != res_unord)
    __builtin_abort ();
  if (__builtin_isunordered (ld, 0) != res_unord)
    __builtin_abort ();
  if (__builtin_isunordered (0, ld) != res_unord)
    __builtin_abort ();

  if (__builtin_isnan (f) != res_isnan)
    __builtin_abort ();
  if (__builtin_isnan (d) != res_isnan)
    __builtin_abort ();
  if (__builtin_isnan (ld) != res_isnan)
    __builtin_abort ();
  if (__builtin_isnanf (f) != res_isnan)
    __builtin_abort ();
  if (__builtin_isnanl (ld) != res_isnan)
    __builtin_abort ();

  if (__builtin_isinf (f) != res_isinf)
    __builtin_abort ();
  if (__builtin_isinf (d) != res_isinf)
    __builtin_abort ();
  if (__builtin_isinf (ld) != res_isinf)
    __builtin_abort ();
  if (__builtin_isinff (f) != res_isinf)
    __builtin_abort ();
  if (__builtin_isinfl (ld) != res_isinf)
    __builtin_abort ();

  if (__builtin_isinf_sign (f) != res_isinf_sign)
    __builtin_abort ();
  if (__builtin_isinf_sign (d) != res_isinf_sign)
    __builtin_abort ();
  if (__builtin_isinf_sign (ld) != res_isinf_sign)
    __builtin_abort ();

  if (__builtin_isnormal (f) != res_isnorm)
    __builtin_abort ();
  if (__builtin_isnormal (d) != res_isnorm)
    __builtin_abort ();
  if (__builtin_isnormal (ld) != res_isnorm)
    __builtin_abort ();

  if (__builtin_isfinite (f) != res_isfin)
    __builtin_abort ();
  if (__builtin_isfinite (d) != res_isfin)
    __builtin_abort ();
  if (__builtin_isfinite (ld) != res_isfin)
    __builtin_abort ();

  if (__builtin_finitef (f) != res_isfin)
    __builtin_abort ();
  if (__builtin_finite (f) != res_isfin)
    __builtin_abort ();
  if (__builtin_finite (d) != res_isfin)
    __builtin_abort ();
  if (__builtin_finitel (d) != res_isfin)
    __builtin_abort ();
  if (__builtin_finitel (ld) != res_isfin)
    __builtin_abort ();

  /* Subnormals can abruptly underflow to zero in unsafe math
     mode, so bypass testing these numbers if necessary.  */
#ifdef UNSAFE
  if (classification != FP_SUBNORMAL)
#endif
    {
      if (fpclassify(f) != classification)
	__builtin_abort ();
      if (fpclassify(d) != classification)
	__builtin_abort ();
      if (fpclassify(ld) != classification)
	__builtin_abort ();
    }
}

void __attribute__ ((__noinline__))
foo (float f, double d, long double ld,
     int res_unord, int res_isnan, int res_isinf,
     int res_isfin, int res_isnorm, int classification)
{
  foo_1 (f, d, ld, res_unord, res_isnan, res_isinf, res_isinf, res_isfin, res_isnorm, classification);
  /* Try all the values negated as well.  */
  foo_1 (-f, -d, -ld, res_unord, res_isnan, res_isinf, -res_isinf, res_isfin, res_isnorm, classification);
}

int __attribute__ ((__noinline__))
main_tests (void)
{
  volatile float f;
  volatile double d;
  volatile long double ld;
  
  /* Test NaN.  */
  f = __builtin_nanf(""); d = __builtin_nan(""); ld = __builtin_nanl("");
  foo(f, d, ld, /*unord=*/ 1, /*isnan=*/ 1, /*isinf=*/ 0, /*isfin=*/ 0, /*isnorm=*/ 0, FP_NAN);

  /* Test infinity.  */
  f = __builtin_inff(); d = __builtin_inf(); ld = __builtin_infl();
  foo(f, d, ld, /*unord=*/ 0, /*isnan=*/ 0, /*isinf=*/ 1, /*isfin=*/ 0, /*isnorm=*/ 0, FP_INFINITE);

  /* Test zero.  */
  f = 0; d = 0; ld = 0;
  foo(f, d, ld, /*unord=*/ 0, /*isnan=*/ 0, /*isinf=*/ 0, /*isfin=*/ 1, /*isnorm=*/ 0, FP_ZERO);

  /* Test one.  */
  f = 1; d = 1; ld = 1;
  foo(f, d, ld, /*unord=*/ 0, /*isnan=*/ 0, /*isinf=*/ 0, /*isfin=*/ 1, /*isnorm=*/ 1, FP_NORMAL);

  /* Test minimum values.  */
  f = __FLT_MIN__; d = __DBL_MIN__; ld = __LDBL_MIN__;
  foo(f, d, ld, /*unord=*/ 0, /*isnan=*/ 0, /*isinf=*/ 0, /*isfin=*/ 1, /*isnorm=*/ 1, FP_NORMAL);

  /* Test subnormal values.  */
  f = __FLT_MIN__/2; d = __DBL_MIN__/2; ld = __LDBL_MIN__/2;
  foo(f, d, ld, /*unord=*/ 0, /*isnan=*/ 0, /*isinf=*/ 0, /*isfin=*/ 1, /*isnorm=*/ 0, FP_SUBNORMAL);

  /* Test maximum values.  */
  f = __FLT_MAX__; d = __DBL_MAX__; ld = __LDBL_MAX__;
  foo(f, d, ld, /*unord=*/ 0, /*isnan=*/ 0, /*isinf=*/ 0, /*isfin=*/ 1, /*isnorm=*/ 1, FP_NORMAL);

  /* Test overflow values.  */
  f = __FLT_MAX__*2; d = __DBL_MAX__*2; ld = __LDBL_MAX__*2;
  foo(f, d, ld, /*unord=*/ 0, /*isnan=*/ 0, /*isinf=*/ 1, /*isfin=*/ 0, /*isnorm=*/ 0, FP_INFINITE);

  return 0;
}