1b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar//===-- fixunsxfdi_test.c - Test __fixunsxfdi -----------------------------===// 2b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// 3b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// The LLVM Compiler Infrastructure 4b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// 59ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 69ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// 8b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar//===----------------------------------------------------------------------===// 9b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// 10b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// This file tests __fixunsxfdi for the compiler_rt library. 11b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// 12b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar//===----------------------------------------------------------------------===// 13b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 14b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#include "int_lib.h" 15b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#include <stdio.h> 163ea8287d4f270edfa965d4defd824f4d6a117e6dNick Kledzik#include <limits.h> 173ea8287d4f270edfa965d4defd824f4d6a117e6dNick Kledzik 18b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 193ea8287d4f270edfa965d4defd824f4d6a117e6dNick Kledzik#if HAS_80_BIT_LONG_DOUBLE 20b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// Returns: convert a to a unsigned long long, rounding toward zero. 21b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// Negative values all become zero. 22b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 23b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// Assumption: long double is an intel 80 bit floating point type padded with 6 bytes 24b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// du_int is a 64 bit integral type 25b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// value in long double is representable in du_int or is negative 26b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// (no range checking performed) 27b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 28b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee | 29b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar// 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm 30b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 31b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbardu_int __fixunsxfdi(long double a); 32b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 33b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbarint test__fixunsxfdi(long double a, du_int expected) 34b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar{ 35b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar du_int x = __fixunsxfdi(a); 36b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (x != expected) 37b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar printf("error in __fixunsxfdi(%LA) = %llX, expected %llX\n", 38b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar a, x, expected); 39b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return x != expected; 40b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar} 41b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 42b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbarchar assumption_1[sizeof(du_int) == 2*sizeof(su_int)] = {0}; 43b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbarchar assumption_2[sizeof(du_int)*CHAR_BIT == 64] = {0}; 44b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbarchar assumption_3[sizeof(long double)*CHAR_BIT == 128] = {0}; 45b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#endif 46b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 47b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbarint main() 48b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar{ 493ea8287d4f270edfa965d4defd824f4d6a117e6dNick Kledzik#if HAS_80_BIT_LONG_DOUBLE 50b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(0.0, 0)) 51b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 52b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 53b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(0.5, 0)) 54b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 55b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(0.99, 0)) 56b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 57b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(1.0, 1)) 58b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 59b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(1.5, 1)) 60b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 61b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(1.99, 1)) 62b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 63b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(2.0, 2)) 64b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 65b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(2.01, 2)) 66b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 67b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-0.5, 0)) 68b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 69b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-0.99, 0)) 70b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 71b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-1.0, 0)) 72b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 73b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-1.5, 0)) 74b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 75b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-1.99, 0)) 76b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 77b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-2.0, 0)) 78b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 79b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-2.01, 0)) 80b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 81b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 82b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(0x1.FFFFFEp+62, 0x7FFFFF8000000000LL)) 83b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 84b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(0x1.FFFFFCp+62, 0x7FFFFF0000000000LL)) 85b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 86b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 87b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-0x1.FFFFFEp+62, 0)) 88b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 89b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-0x1.FFFFFCp+62, 0)) 90b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 91b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 92b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(0x1.FFFFFFFFFFFFFp+62, 0x7FFFFFFFFFFFFC00LL)) 93b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 94b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(0x1.FFFFFFFFFFFFEp+62, 0x7FFFFFFFFFFFF800LL)) 95b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 96b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 97b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-0x1.FFFFFFFFFFFFFp+62, 0)) 98b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 99b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-0x1.FFFFFFFFFFFFEp+62, 0)) 100b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 101b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 102b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(0x1.FFFFFFFFFFFFFFFEp+63L, 0xFFFFFFFFFFFFFFFFLL)) 103b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 104b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(0x1.0000000000000002p+63L, 0x8000000000000001LL)) 105b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 106b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(0x1.0000000000000000p+63L, 0x8000000000000000LL)) 107b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 108b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(0x1.FFFFFFFFFFFFFFFCp+62L, 0x7FFFFFFFFFFFFFFFLL)) 109b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 110b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(0x1.FFFFFFFFFFFFFFF8p+62L, 0x7FFFFFFFFFFFFFFELL)) 111b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 112b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 113b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-0x1.0000000000000000p+63L, 0)) 114b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 115b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-0x1.FFFFFFFFFFFFFFFCp+62L, 0)) 116b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 117b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar if (test__fixunsxfdi(-0x1.FFFFFFFFFFFFFFF8p+62L, 0)) 118b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 1; 119b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 1207482815716cd9b87931d82dca7298fc3c707229fJoerg Sonnenberger#else 1217482815716cd9b87931d82dca7298fc3c707229fJoerg Sonnenberger printf("skipped\n"); 122b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#endif 123b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return 0; 124b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar} 125