1/* Basic test of runtime relational comparisons using NaNs and infinities. */ 2 3#include <stdlib.h> 4#include "dfp-dbg.h" 5 6#define PASTE2(A,B) A ## B 7#define PASTE(A,B) PASTE2(A,B) 8 9/* Override FAILURE from dfp-dbg.h with one that provides additional info. */ 10#undef FAILURE 11#ifdef DBG 12#define FAILURE(OP,KIND) \ 13 { printf ("failed at line %d: %s for %s values\n", __LINE__, OP, KIND); \ 14 failures++; } 15#else 16#define FAILURE(OP,KIND) __builtin_abort (); 17#endif 18 19#ifndef WIDTH 20#error define WIDTH as decimal float size in bytes 21#endif 22 23#if WIDTH == 32 24#define DTYPE _Decimal32 25#define SUFFIX DF 26#define SUFFIX2 d32 27#elif WIDTH == 64 28#define DTYPE _Decimal64 29#define SUFFIX DD 30#define SUFFIX2 d64 31#elif WIDTH == 128 32#define DTYPE _Decimal128 33#define SUFFIX DL 34#define SUFFIX2 d128 35#elif WIDTH == 0 36/* This is for testing the test using a type known to work. */ 37#define DTYPE double 38#define SUFFIX 39#define SUFFIX2 40#else 41#error invalid width for decimal float type 42#endif 43 44DTYPE m_two = PASTE(-2.0, SUFFIX); 45DTYPE m_one = PASTE(-1.0, SUFFIX); 46DTYPE zero = PASTE(0.0, SUFFIX); 47DTYPE one = PASTE(1.0, SUFFIX); 48DTYPE two = PASTE(2.0, SUFFIX); 49 50volatile DTYPE x, y, z, _nan, inf, m_inf; 51 52void 53test_compares (void) 54{ 55 _nan = PASTE(__builtin_nan, SUFFIX2) (""); 56 inf = PASTE(__builtin_inf, SUFFIX2) (); 57 m_inf = - PASTE(__builtin_inf, SUFFIX2) (); 58 59 x = PASTE(__builtin_nan, SUFFIX2) (""); 60 y = PASTE(__builtin_inf, SUFFIX2) (); 61 z = - PASTE(__builtin_inf, SUFFIX2) (); 62 63 /* Less than or equal to with NaN. */ 64 65 if (x <= two) FAILURE ("<=", "NaN") 66 if (x <= zero) FAILURE ("<=", "NaN") 67 if (x <= m_one) FAILURE ("<=", "NaN") 68 if (x <= _nan) FAILURE ("<=", "NaN") 69 if (x <= inf) FAILURE ("<=", "NaN") 70 if (x <= m_inf) FAILURE ("<=", "NaN") 71 72 if (two <= x) FAILURE ("<=", "NaN") 73 if (zero <= x) FAILURE ("<=", "NaN") 74 if (m_one <= x) FAILURE ("<=", "NaN") 75 if (_nan <= x) FAILURE ("<=", "NaN") 76 if (inf <= x) FAILURE ("<=", "NaN") 77 if (m_inf <= x) FAILURE ("<=", "NaN") 78 79 /* Less than or equal to with infinities, no NaNs. */ 80 81 if (y <= two) FAILURE ("<=", "inf") 82 if (y <= zero) FAILURE ("<=", "inf") 83 if (y <= m_one) FAILURE ("<=", "inf") 84 if (!(two <= y)) FAILURE ("<=", "inf") 85 if (!(zero <= y)) FAILURE ("<=", "inf") 86 if (!(m_one <= y)) FAILURE ("<=", "inf") 87 88 if (!(z <= two)) FAILURE ("<=", "-inf") 89 if (!(z <= zero)) FAILURE ("<=", "-inf") 90 if (!(z <= m_one)) FAILURE ("<=", "-inf") 91 if (two <= z) FAILURE ("<=", "-inf") 92 if (zero <= z) FAILURE ("<=", "-inf") 93 if (m_one <= z) FAILURE ("<=", "-inf") 94 95 if (!(y <= inf)) FAILURE ("<=", "inf") 96 if (y <= m_inf) FAILURE ("<=", "inf") 97 if (!(z <= inf)) FAILURE ("<=", "inf") 98 if (!(z <= m_inf)) FAILURE ("<=", "inf") 99 100 /* Less than with NaN. */ 101 102 if (x < two) FAILURE ("<", "NaN") 103 if (x < zero) FAILURE ("<", "NaN") 104 if (x < m_one) FAILURE ("<", "NaN") 105 if (x < _nan) FAILURE ("<", "NaN") 106 if (x < inf) FAILURE ("<", "NaN") 107 if (x < m_inf) FAILURE ("<", "NaN") 108 109 if (two < x) FAILURE ("<", "NaN") 110 if (zero < x) FAILURE ("<", "NaN") 111 if (m_one < x) FAILURE ("<", "NaN") 112 if (_nan < x) FAILURE ("<", "NaN") 113 if (inf < x) FAILURE ("<", "NaN") 114 if (m_inf < x) FAILURE ("<", "NaN") 115 116 /* Less than with infinities, no NaNs. */ 117 118 if (y < two) FAILURE ("<", "inf") 119 if (y < zero) FAILURE ("<", "inf") 120 if (y < m_one) FAILURE ("<", "inf") 121 if (!(two < y)) FAILURE ("<", "inf") 122 if (!(zero < y)) FAILURE ("<", "inf") 123 if (!(m_one < y)) FAILURE ("<", "inf") 124 125 if (!(z < two)) FAILURE ("<", "-inf") 126 if (!(z < zero)) FAILURE ("<", "-inf") 127 if (!(z < m_one)) FAILURE ("<", "-inf") 128 if (two < z) FAILURE ("<", "-inf") 129 if (zero < z) FAILURE ("<", "-inf") 130 if (m_one < z) FAILURE ("<", "-inf") 131 132 if (y < inf) FAILURE ("<=", "inf") 133 if (y < m_inf) FAILURE ("<=", "inf") 134 if (!(z < inf)) FAILURE ("<=", "inf") 135 if (z < m_inf) FAILURE ("<=", "inf") 136 137 /* Greater than or equal to with NaN. */ 138 139 if (x >= two) FAILURE (">=", "NaN") 140 if (x >= zero) FAILURE (">=", "NaN") 141 if (x >= m_one) FAILURE (">=", "NaN") 142 if (x >= _nan) FAILURE (">=", "NaN") 143 if (x >= inf) FAILURE (">=", "NaN") 144 if (x >= m_inf) FAILURE (">=", "NaN") 145 146 if (two >= x) FAILURE (">=", "NaN") 147 if (zero >= x) FAILURE (">=", "NaN") 148 if (m_one >= x) FAILURE (">=", "NaN") 149 if (_nan >= x) FAILURE (">=", "NaN") 150 if (inf >= x) FAILURE (">=", "NaN") 151 if (m_inf >= x) FAILURE (">=", "NaN") 152 153 /* Greater than or equal to with infinities, no NaNs. */ 154 155 if (!(y >= two)) FAILURE (">=", "inf") 156 if (!(y >= zero)) FAILURE (">=", "inf") 157 if (!(y >= m_one)) FAILURE (">=", "inf") 158 if (two >= y) FAILURE (">=", "inf") 159 if (zero >= y) FAILURE (">=", "inf") 160 if (m_one >= y) FAILURE (">=", "inf") 161 162 if (z >= two) FAILURE (">=", "-inf") 163 if (z >= zero) FAILURE (">=", "-inf") 164 if (z >= m_one) FAILURE (">=", "-inf") 165 if (!(two >= z)) FAILURE (">=", "-inf") 166 if (!(zero >= z)) FAILURE (">=", "-inf") 167 if (!(m_one >= z)) FAILURE (">=", "-inf") 168 169 if (!(y >= inf)) FAILURE ("<=", "inf") 170 if (!(y >= m_inf)) FAILURE ("<=", "inf") 171 if (z >= inf) FAILURE ("<=", "inf") 172 if (!(z >= m_inf)) FAILURE ("<=", "inf") 173 174 /* Greater than with NaN. */ 175 176 if (x > two) FAILURE (">", "NaN") 177 if (x > zero) FAILURE (">", "NaN") 178 if (x > m_one) FAILURE (">", "NaN") 179 if (x > _nan) FAILURE (">", "NaN") 180 if (x > inf) FAILURE (">", "NaN") 181 if (x > m_inf) FAILURE (">", "NaN") 182 183 if (two > x) FAILURE (">", "NaN") 184 if (zero > x) FAILURE (">", "NaN") 185 if (m_one > x) FAILURE (">", "NaN") 186 if (_nan > x) FAILURE (">", "NaN") 187 if (inf > x) FAILURE (">", "NaN") 188 if (m_inf > x) FAILURE (">", "NaN") 189 190 /* Greater than with infinities, no NaNs. */ 191 192 if (!(y > two)) FAILURE (">", "inf") 193 if (!(y > zero)) FAILURE (">", "inf") 194 if (!(y > m_one)) FAILURE (">", "inf") 195 if (two > y) FAILURE (">", "inf") 196 if (zero > y) FAILURE (">", "inf") 197 if (m_one > y) FAILURE (">", "inf") 198 199 if (z > two) FAILURE (">", "-inf") 200 if (z > zero) FAILURE (">", "-inf") 201 if (z > m_one) FAILURE (">", "-inf") 202 if (!(two > z)) FAILURE (">", "-inf") 203 if (!(zero > z)) FAILURE (">", "-inf") 204 if (!(m_one > z)) FAILURE (">", "-inf") 205 206 if (y > inf) FAILURE (">", "inf") 207 if (!(y > m_inf)) FAILURE (">", "inf") 208 if (z > inf) FAILURE (">", "inf") 209 if (z > m_inf) FAILURE (">", "inf") 210 211 /* Equal with NaN. */ 212 213 if (x == two) FAILURE ("==", "NaN") 214 if (x == zero) FAILURE ("==", "NaN") 215 if (x == m_one) FAILURE ("==", "NaN") 216 if (x == _nan) FAILURE ("==", "NaN") 217 if (x == inf) FAILURE ("==", "NaN") 218 if (x == m_inf) FAILURE ("==", "NaN") 219 220 if (two == x) FAILURE ("==", "NaN") 221 if (zero == x) FAILURE ("==", "NaN") 222 if (m_one == x) FAILURE ("==", "NaN") 223 if (_nan == x) FAILURE ("==", "NaN") 224 if (inf == x) FAILURE ("==", "NaN") 225 if (m_inf == x) FAILURE ("==", "NaN") 226 227 /* Equal with infinities, no NaNs. */ 228 229 if (y == two) FAILURE ("==", "inf") 230 if (y == zero) FAILURE ("==", "inf") 231 if (y == m_one) FAILURE ("==", "inf") 232 if (two == y) FAILURE ("==", "inf") 233 if (zero == y) FAILURE ("==", "inf") 234 if (m_one == y) FAILURE ("==", "inf") 235 236 if (z == two) FAILURE ("==", "-inf") 237 if (z == zero) FAILURE ("==", "-inf") 238 if (z == m_one) FAILURE ("==", "-inf") 239 if (two == z) FAILURE ("==", "-inf") 240 if (zero == z) FAILURE ("==", "-inf") 241 if (m_one == z) FAILURE ("==", "-inf") 242 243 if (!(y == inf)) FAILURE ("==", "inf") 244 if (y == m_inf) FAILURE ("==", "inf") 245 if (z == inf) FAILURE ("==", "inf") 246 if (!(z == m_inf)) FAILURE ("==", "inf") 247 248 /* Not equal with NaN. */ 249 250 if (!(x != two)) FAILURE ("!=", "NaN") 251 if (!(x != zero)) FAILURE ("!=", "NaN") 252 if (!(x != m_one)) FAILURE ("!=", "NaN") 253 if (!(x != _nan)) FAILURE ("!=", "NaN") 254 if (!(x != inf)) FAILURE ("!=", "NaN") 255 if (!(x != m_inf)) FAILURE ("!=", "NaN") 256 257 if (!(two != x)) FAILURE ("!=", "NaN") 258 if (!(zero != x)) FAILURE ("!=", "NaN") 259 if (!(m_one != x)) FAILURE ("!=", "NaN") 260 if (!(_nan != x)) FAILURE ("!=", "NaN") 261 if (!(inf != x)) FAILURE ("!=", "NaN") 262 if (!(m_inf != x)) FAILURE ("!=", "NaN") 263 264 /* Not equal with infinities, no NaNs. */ 265 266 if (!(y != two)) FAILURE ("!=", "inf") 267 if (!(y != zero)) FAILURE ("!=", "inf") 268 if (!(y != m_one)) FAILURE ("!=", "inf") 269 if (!(two != y)) FAILURE ("!=", "inf") 270 if (!(zero != y)) FAILURE ("!=", "inf") 271 if (!(m_one != y)) FAILURE ("!=", "inf") 272 273 if (!(z != two)) FAILURE ("!=", "-inf") 274 if (!(z != zero)) FAILURE ("!=", "-inf") 275 if (!(z != m_one)) FAILURE ("!=", "-inf") 276 if (!(two != z)) FAILURE ("!=", "-inf") 277 if (!(zero != z)) FAILURE ("!=", "-inf") 278 if (!(m_one != z)) FAILURE ("!=", "-inf") 279 280 if (y != inf) FAILURE ("!=", "inf") 281 if (!(y != m_inf)) FAILURE ("!=", "inf") 282 if (!(z != inf)) FAILURE ("!=", "inf") 283 if (z != m_inf) FAILURE ("!=", "inf") 284} 285