1/* Test front-end conversions, optimizer conversions, and run-time 2 conversions between different arithmetic types. 3 4 Constants are specified in a non-obvious way to make them work for 5 any word size. Their value on a 32-bit machine is indicated in the 6 comments. 7 8 Note that this code is NOT intended for testing of accuracy of fp 9 conversions. */ 10 11float 12u2f(u) 13 unsigned int u; 14{ 15 return u; 16} 17 18double 19u2d(u) 20 unsigned int u; 21{ 22 return u; 23} 24 25long double 26u2ld(u) 27 unsigned int u; 28{ 29 return u; 30} 31 32float 33s2f(s) 34 int s; 35{ 36 return s; 37} 38 39double 40s2d(s) 41 int s; 42{ 43 return s; 44} 45 46long double 47s2ld(s) 48 int s; 49{ 50 return s; 51} 52 53int 54fnear (float x, float y) 55{ 56 float t = x - y; 57 return t == 0 || x / t > 1000000.0; 58} 59 60int 61dnear (double x, double y) 62{ 63 double t = x - y; 64 return t == 0 || x / t > 100000000000000.0; 65} 66 67int 68ldnear (long double x, long double y) 69{ 70 long double t = x - y; 71 return t == 0 || x / t > 100000000000000000000000000000000.0; 72} 73 74test_integer_to_float() 75{ 76 if (u2f(0U) != (float) 0U) /* 0 */ 77 abort(); 78 if (!fnear (u2f(~0U), (float) ~0U)) /* 0xffffffff */ 79 abort(); 80 if (!fnear (u2f((~0U) >> 1), (float) ((~0U) >> 1))) /* 0x7fffffff */ 81 abort(); 82 if (u2f(~((~0U) >> 1)) != (float) ~((~0U) >> 1)) /* 0x80000000 */ 83 abort(); 84 85 if (u2d(0U) != (double) 0U) /* 0 */ 86 abort(); 87 if (!dnear (u2d(~0U), (double) ~0U)) /* 0xffffffff */ 88 abort(); 89 if (!dnear (u2d((~0U) >> 1),(double) ((~0U) >> 1))) /* 0x7fffffff */ 90 abort(); 91 if (u2d(~((~0U) >> 1)) != (double) ~((~0U) >> 1)) /* 0x80000000 */ 92 abort(); 93 94 if (u2ld(0U) != (long double) 0U) /* 0 */ 95 abort(); 96 if (!ldnear (u2ld(~0U), (long double) ~0U)) /* 0xffffffff */ 97 abort(); 98 if (!ldnear (u2ld((~0U) >> 1),(long double) ((~0U) >> 1))) /* 0x7fffffff */ 99 abort(); 100 if (u2ld(~((~0U) >> 1)) != (long double) ~((~0U) >> 1)) /* 0x80000000 */ 101 abort(); 102 103 if (s2f(0) != (float) 0) /* 0 */ 104 abort(); 105 if (!fnear (s2f(~0), (float) ~0)) /* 0xffffffff */ 106 abort(); 107 if (!fnear (s2f((int)((~0U) >> 1)), (float)(int)((~0U) >> 1))) /* 0x7fffffff */ 108 abort(); 109 if (s2f((int)(~((~0U) >> 1))) != (float)(int)~((~0U) >> 1)) /* 0x80000000 */ 110 abort(); 111 112 if (s2d(0) != (double) 0) /* 0 */ 113 abort(); 114 if (!dnear (s2d(~0), (double) ~0)) /* 0xffffffff */ 115 abort(); 116 if (!dnear (s2d((int)((~0U) >> 1)), (double)(int)((~0U) >> 1))) /* 0x7fffffff */ 117 abort(); 118 if (s2d((int)~((~0U) >> 1)) != (double)(int)~((~0U) >> 1)) /* 0x80000000 */ 119 abort(); 120 121 if (s2ld(0) != (long double) 0) /* 0 */ 122 abort(); 123 if (!ldnear (s2ld(~0), (long double) ~0)) /* 0xffffffff */ 124 abort(); 125 if (!ldnear (s2ld((int)((~0U) >> 1)), (long double)(int)((~0U) >> 1))) /* 0x7fffffff */ 126 abort(); 127 if (s2ld((int)~((~0U) >> 1)) != (long double)(int)~((~0U) >> 1)) /* 0x80000000 */ 128 abort(); 129} 130 131#if __GNUC__ 132float 133ull2f(u) 134 unsigned long long int u; 135{ 136 return u; 137} 138 139double 140ull2d(u) 141 unsigned long long int u; 142{ 143 return u; 144} 145 146long double 147ull2ld(u) 148 unsigned long long int u; 149{ 150 return u; 151} 152 153float 154sll2f(s) 155 long long int s; 156{ 157 return s; 158} 159 160double 161sll2d(s) 162 long long int s; 163{ 164 return s; 165} 166 167long double 168sll2ld(s) 169 long long int s; 170{ 171 return s; 172} 173 174test_longlong_integer_to_float() 175{ 176 if (ull2f(0ULL) != (float) 0ULL) /* 0 */ 177 abort(); 178 if (ull2f(~0ULL) != (float) ~0ULL) /* 0xffffffff */ 179 abort(); 180 if (ull2f((~0ULL) >> 1) != (float) ((~0ULL) >> 1)) /* 0x7fffffff */ 181 abort(); 182 if (ull2f(~((~0ULL) >> 1)) != (float) ~((~0ULL) >> 1)) /* 0x80000000 */ 183 abort(); 184 185 if (ull2d(0ULL) != (double) 0ULL) /* 0 */ 186 abort(); 187#if __HAVE_68881__ 188 /* Some 68881 targets return values in fp0, with excess precision. 189 But the compile-time conversion to double works correctly. */ 190 if (! dnear (ull2d(~0ULL), (double) ~0ULL)) /* 0xffffffff */ 191 abort(); 192 if (! dnear (ull2d((~0ULL) >> 1), (double) ((~0ULL) >> 1))) /* 0x7fffffff */ 193 abort(); 194#else 195 if (ull2d(~0ULL) != (double) ~0ULL) /* 0xffffffff */ 196 abort(); 197 if (ull2d((~0ULL) >> 1) != (double) ((~0ULL) >> 1)) /* 0x7fffffff */ 198 abort(); 199#endif 200 if (ull2d(~((~0ULL) >> 1)) != (double) ~((~0ULL) >> 1)) /* 0x80000000 */ 201 abort(); 202 203 if (ull2ld(0ULL) != (long double) 0ULL) /* 0 */ 204 abort(); 205 if (ull2ld(~0ULL) != (long double) ~0ULL) /* 0xffffffff */ 206 abort(); 207 if (ull2ld((~0ULL) >> 1) != (long double) ((~0ULL) >> 1)) /* 0x7fffffff */ 208 abort(); 209 if (ull2ld(~((~0ULL) >> 1)) != (long double) ~((~0ULL) >> 1)) /* 0x80000000 */ 210 abort(); 211 212 if (sll2f(0LL) != (float) 0LL) /* 0 */ 213 abort(); 214 if (sll2f(~0LL) != (float) ~0LL) /* 0xffffffff */ 215 abort(); 216 if (! fnear (sll2f((long long int)((~0ULL) >> 1)), (float)(long long int)((~0ULL) >> 1))) /* 0x7fffffff */ 217 abort(); 218 if (sll2f((long long int)(~((~0ULL) >> 1))) != (float)(long long int)~((~0ULL) >> 1)) /* 0x80000000 */ 219 abort(); 220 221 if (sll2d(0LL) != (double) 0LL) /* 0 */ 222 abort(); 223 if (sll2d(~0LL) != (double) ~0LL) /* 0xffffffff */ 224 abort(); 225 if (!dnear (sll2d((long long int)((~0ULL) >> 1)), (double)(long long int)((~0ULL) >> 1))) /* 0x7fffffff */ 226 abort(); 227 if (! dnear (sll2d((long long int)~((~0ULL) >> 1)), (double)(long long int)~((~0ULL) >> 1))) /* 0x80000000 */ 228 abort(); 229 230 if (sll2ld(0LL) != (long double) 0LL) /* 0 */ 231 abort(); 232 if (sll2ld(~0LL) != (long double) ~0LL) /* 0xffffffff */ 233 abort(); 234 if (!ldnear (sll2ld((long long int)((~0ULL) >> 1)), (long double)(long long int)((~0ULL) >> 1))) /* 0x7fffffff */ 235 abort(); 236 if (! ldnear (sll2ld((long long int)~((~0ULL) >> 1)), (long double)(long long int)~((~0ULL) >> 1))) /* 0x80000000 */ 237 abort(); 238} 239#endif 240 241unsigned int 242f2u(float f) 243{ 244 return (unsigned) f; 245} 246 247unsigned int 248d2u(double d) 249{ 250 return (unsigned) d; 251} 252 253unsigned int 254ld2u(long double d) 255{ 256 return (unsigned) d; 257} 258 259int 260f2s(float f) 261{ 262 return (int) f; 263} 264 265int 266d2s(double d) 267{ 268 return (int) d; 269} 270 271int 272ld2s(long double d) 273{ 274 return (int) d; 275} 276 277test_float_to_integer() 278{ 279 if (f2u(0.0) != 0) 280 abort(); 281 if (f2u(0.999) != 0) 282 abort(); 283 if (f2u(1.0) != 1) 284 abort(); 285 if (f2u(1.99) != 1) 286 abort(); 287#ifdef __SPU__ 288 /* SPU float rounds towards zero. */ 289 if (f2u((float) ((~0U) >> 1)) != 0x7fffff80) 290 abort(); 291#else 292 if (f2u((float) ((~0U) >> 1)) != (~0U) >> 1 && /* 0x7fffffff */ 293 f2u((float) ((~0U) >> 1)) != ((~0U) >> 1) + 1) 294 abort(); 295#endif 296 if (f2u((float) ~((~0U) >> 1)) != ~((~0U) >> 1)) /* 0x80000000 */ 297 abort(); 298 299 /* These tests require double precision, so for hosts that don't offer 300 that much precision, just ignore these test. */ 301 if (sizeof (double) >= 8) { 302 if (d2u(0.0) != 0) 303 abort(); 304 if (d2u(0.999) != 0) 305 abort(); 306 if (d2u(1.0) != 1) 307 abort(); 308 if (d2u(1.99) != 1) 309 abort(); 310 if (d2u((double) (~0U)) != ~0U) /* 0xffffffff */ 311 abort(); 312 if (d2u((double) ((~0U) >> 1)) != (~0U) >> 1) /* 0x7fffffff */ 313 abort(); 314 if (d2u((double) ~((~0U) >> 1)) != ~((~0U) >> 1)) /* 0x80000000 */ 315 abort(); 316 } 317 318 /* These tests require long double precision, so for hosts that don't offer 319 that much precision, just ignore these test. */ 320 if (sizeof (long double) >= 8) { 321 if (ld2u(0.0) != 0) 322 abort(); 323 if (ld2u(0.999) != 0) 324 abort(); 325 if (ld2u(1.0) != 1) 326 abort(); 327 if (ld2u(1.99) != 1) 328 abort(); 329 if (ld2u((long double) (~0U)) != ~0U) /* 0xffffffff */ 330 abort(); 331 if (ld2u((long double) ((~0U) >> 1)) != (~0U) >> 1) /* 0x7fffffff */ 332 abort(); 333 if (ld2u((long double) ~((~0U) >> 1)) != ~((~0U) >> 1)) /* 0x80000000 */ 334 abort(); 335 } 336 337 if (f2s(0.0) != 0) 338 abort(); 339 if (f2s(0.999) != 0) 340 abort(); 341 if (f2s(1.0) != 1) 342 abort(); 343 if (f2s(1.99) != 1) 344 abort(); 345 if (f2s(-0.999) != 0) 346 abort(); 347 if (f2s(-1.0) != -1) 348 abort(); 349 if (f2s(-1.99) != -1) 350 abort(); 351 if (f2s((float)(int)~((~0U) >> 1)) != (int)~((~0U) >> 1)) /* 0x80000000 */ 352 abort(); 353 354 /* These tests require double precision, so for hosts that don't offer 355 that much precision, just ignore these test. */ 356 if (sizeof (double) >= 8) { 357 if (d2s(0.0) != 0) 358 abort(); 359 if (d2s(0.999) != 0) 360 abort(); 361 if (d2s(1.0) != 1) 362 abort(); 363 if (d2s(1.99) != 1) 364 abort(); 365 if (d2s(-0.999) != 0) 366 abort(); 367 if (d2s(-1.0) != -1) 368 abort(); 369 if (d2s(-1.99) != -1) 370 abort(); 371 if (d2s((double) ((~0U) >> 1)) != (~0U) >> 1) /* 0x7fffffff */ 372 abort(); 373 if (d2s((double)(int)~((~0U) >> 1)) != (int)~((~0U) >> 1)) /* 0x80000000 */ 374 abort(); 375 } 376 377 /* These tests require long double precision, so for hosts that don't offer 378 that much precision, just ignore these test. */ 379 if (sizeof (long double) >= 8) { 380 if (ld2s(0.0) != 0) 381 abort(); 382 if (ld2s(0.999) != 0) 383 abort(); 384 if (ld2s(1.0) != 1) 385 abort(); 386 if (ld2s(1.99) != 1) 387 abort(); 388 if (ld2s(-0.999) != 0) 389 abort(); 390 if (ld2s(-1.0) != -1) 391 abort(); 392 if (ld2s(-1.99) != -1) 393 abort(); 394 if (ld2s((long double) ((~0U) >> 1)) != (~0U) >> 1) /* 0x7fffffff */ 395 abort(); 396 if (ld2s((long double)(int)~((~0U) >> 1)) != (int)~((~0U) >> 1)) /* 0x80000000 */ 397 abort(); 398 } 399} 400 401#if __GNUC__ 402unsigned long long int 403f2ull(float f) 404{ 405 return (unsigned long long int) f; 406} 407 408unsigned long long int 409d2ull(double d) 410{ 411 return (unsigned long long int) d; 412} 413 414unsigned long long int 415ld2ull(long double d) 416{ 417 return (unsigned long long int) d; 418} 419 420long long int 421f2sll(float f) 422{ 423 return (long long int) f; 424} 425 426long long int 427d2sll(double d) 428{ 429 return (long long int) d; 430} 431 432long long int 433ld2sll(long double d) 434{ 435 return (long long int) d; 436} 437 438test_float_to_longlong_integer() 439{ 440 if (f2ull(0.0) != 0LL) 441 abort(); 442 if (f2ull(0.999) != 0LL) 443 abort(); 444 if (f2ull(1.0) != 1LL) 445 abort(); 446 if (f2ull(1.99) != 1LL) 447 abort(); 448#ifdef __SPU__ 449 /* SPU float rounds towards zero. */ 450 if (f2ull((float) ((~0ULL) >> 1)) != 0x7fffff8000000000ULL) 451 abort(); 452#else 453 if (f2ull((float) ((~0ULL) >> 1)) != (~0ULL) >> 1 && /* 0x7fffffff */ 454 f2ull((float) ((~0ULL) >> 1)) != ((~0ULL) >> 1) + 1) 455 abort(); 456#endif 457 if (f2ull((float) ~((~0ULL) >> 1)) != ~((~0ULL) >> 1)) /* 0x80000000 */ 458 abort(); 459 460 if (d2ull(0.0) != 0LL) 461 abort(); 462 if (d2ull(0.999) != 0LL) 463 abort(); 464 if (d2ull(1.0) != 1LL) 465 abort(); 466 if (d2ull(1.99) != 1LL) 467 abort(); 468 if (d2ull((double) ((~0ULL) >> 1)) != (~0ULL) >> 1 && /* 0x7fffffff */ 469 d2ull((double) ((~0ULL) >> 1)) != ((~0ULL) >> 1) + 1) 470 abort(); 471 if (d2ull((double) ~((~0ULL) >> 1)) != ~((~0ULL) >> 1)) /* 0x80000000 */ 472 abort(); 473 474 if (ld2ull(0.0) != 0LL) 475 abort(); 476 if (ld2ull(0.999) != 0LL) 477 abort(); 478 if (ld2ull(1.0) != 1LL) 479 abort(); 480 if (ld2ull(1.99) != 1LL) 481 abort(); 482 if (ld2ull((long double) ((~0ULL) >> 1)) != (~0ULL) >> 1 && /* 0x7fffffff */ 483 ld2ull((long double) ((~0ULL) >> 1)) != ((~0ULL) >> 1) + 1) 484 abort(); 485 if (ld2ull((long double) ~((~0ULL) >> 1)) != ~((~0ULL) >> 1)) /* 0x80000000 */ 486 abort(); 487 488 489 if (f2sll(0.0) != 0LL) 490 abort(); 491 if (f2sll(0.999) != 0LL) 492 abort(); 493 if (f2sll(1.0) != 1LL) 494 abort(); 495 if (f2sll(1.99) != 1LL) 496 abort(); 497 if (f2sll(-0.999) != 0LL) 498 abort(); 499 if (f2sll(-1.0) != -1LL) 500 abort(); 501 if (f2sll(-1.99) != -1LL) 502 abort(); 503 if (f2sll((float)(long long int)~((~0ULL) >> 1)) != (long long int)~((~0ULL) >> 1)) /* 0x80000000 */ 504 abort(); 505 506 if (d2sll(0.0) != 0LL) 507 abort(); 508 if (d2sll(0.999) != 0LL) 509 abort(); 510 if (d2sll(1.0) != 1LL) 511 abort(); 512 if (d2sll(1.99) != 1LL) 513 abort(); 514 if (d2sll(-0.999) != 0LL) 515 abort(); 516 if (d2sll(-1.0) != -1LL) 517 abort(); 518 if (d2sll(-1.99) != -1LL) 519 abort(); 520 if (d2sll((double)(long long int)~((~0ULL) >> 1)) != (long long int)~((~0ULL) >> 1)) /* 0x80000000 */ 521 abort(); 522 523 if (ld2sll(0.0) != 0LL) 524 abort(); 525 if (ld2sll(0.999) != 0LL) 526 abort(); 527 if (ld2sll(1.0) != 1LL) 528 abort(); 529 if (ld2sll(1.99) != 1LL) 530 abort(); 531 if (ld2sll(-0.999) != 0LL) 532 abort(); 533 if (ld2sll(-1.0) != -1LL) 534 abort(); 535 if (ld2sll(-1.99) != -1LL) 536 abort(); 537 if (ld2sll((long double)(long long int)~((~0ULL) >> 1)) != (long long int)~((~0ULL) >> 1)) /* 0x80000000 */ 538 abort(); 539} 540#endif 541 542main() 543{ 544 test_integer_to_float(); 545 test_float_to_integer(); 546#if __GNUC__ 547 test_longlong_integer_to_float(); 548 test_float_to_longlong_integer(); 549#endif 550 exit(0); 551} 552