1 // RUN: %clang_builtins %s %librt -o %t && %run %t 2 // REQUIRES: librt_has_floatdisf 3 //===-- floatdisf_test.c - Test __floatdisf -------------------------------===// 4 // 5 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 6 // See https://llvm.org/LICENSE.txt for license information. 7 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 8 // 9 //===----------------------------------------------------------------------===// 10 // 11 // This file tests __floatdisf for the compiler_rt library. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "int_lib.h" 16 #include <float.h> 17 #include <stdio.h> 18 19 // Returns: convert a to a float, rounding toward even. 20 21 // Assumption: float is a IEEE 32 bit floating point type 22 // di_int is a 64 bit integral type 23 24 // seee eeee emmm mmmm mmmm mmmm mmmm mmmm 25 26 COMPILER_RT_ABI float __floatdisf(di_int a); 27 28 int test__floatdisf(di_int a, float expected) 29 { 30 float x = __floatdisf(a); 31 if (x != expected) 32 printf("error in __floatdisf(%llX) = %a, expected %a\n", 33 a, x, expected); 34 return x != expected; 35 } 36 37 char assumption_1[sizeof(di_int) == 2*sizeof(si_int)] = {0}; 38 char assumption_2[sizeof(di_int)*CHAR_BIT == 64] = {0}; 39 char assumption_3[sizeof(float)*CHAR_BIT == 32] = {0}; 40 41 int main() 42 { 43 if (test__floatdisf(0, 0.0F)) 44 return 1; 45 46 if (test__floatdisf(1, 1.0F)) 47 return 1; 48 if (test__floatdisf(2, 2.0F)) 49 return 1; 50 if (test__floatdisf(-1, -1.0F)) 51 return 1; 52 if (test__floatdisf(-2, -2.0F)) 53 return 1; 54 55 if (test__floatdisf(0x7FFFFF8000000000LL, 0x1.FFFFFEp+62F)) 56 return 1; 57 if (test__floatdisf(0x7FFFFF0000000000LL, 0x1.FFFFFCp+62F)) 58 return 1; 59 60 if (test__floatdisf(0x8000008000000000LL, -0x1.FFFFFEp+62F)) 61 return 1; 62 if (test__floatdisf(0x8000010000000000LL, -0x1.FFFFFCp+62F)) 63 return 1; 64 65 if (test__floatdisf(0x8000000000000000LL, -0x1.000000p+63F)) 66 return 1; 67 if (test__floatdisf(0x8000000000000001LL, -0x1.000000p+63F)) 68 return 1; 69 70 if (test__floatdisf(0x0007FB72E8000000LL, 0x1.FEDCBAp+50F)) 71 return 1; 72 73 if (test__floatdisf(0x0007FB72EA000000LL, 0x1.FEDCBAp+50F)) 74 return 1; 75 if (test__floatdisf(0x0007FB72EB000000LL, 0x1.FEDCBAp+50F)) 76 return 1; 77 if (test__floatdisf(0x0007FB72EBFFFFFFLL, 0x1.FEDCBAp+50F)) 78 return 1; 79 if (test__floatdisf(0x0007FB72EC000000LL, 0x1.FEDCBCp+50F)) 80 return 1; 81 if (test__floatdisf(0x0007FB72E8000001LL, 0x1.FEDCBAp+50F)) 82 return 1; 83 84 if (test__floatdisf(0x0007FB72E6000000LL, 0x1.FEDCBAp+50F)) 85 return 1; 86 if (test__floatdisf(0x0007FB72E7000000LL, 0x1.FEDCBAp+50F)) 87 return 1; 88 if (test__floatdisf(0x0007FB72E7FFFFFFLL, 0x1.FEDCBAp+50F)) 89 return 1; 90 if (test__floatdisf(0x0007FB72E4000001LL, 0x1.FEDCBAp+50F)) 91 return 1; 92 if (test__floatdisf(0x0007FB72E4000000LL, 0x1.FEDCB8p+50F)) 93 return 1; 94 95 return 0; 96 } 97