1 // RUN: %clang_builtins %s %librt -o %t && %run %t 2 // REQUIRES: librt_has_floatuntisf 3 //===-- floatuntisf.c - Test __floatuntisf --------------------------------===// 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 __floatuntisf for the compiler_rt library. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "int_lib.h" 16 #include <float.h> 17 #include <stdio.h> 18 19 #if defined(CRT_HAS_128BIT) && HAS_80_BIT_LONG_DOUBLE 20 21 // Returns: convert a to a float, rounding toward even. 22 23 // Assumption: float is a IEEE 32 bit floating point type 24 // tu_int is a 128 bit integral type 25 26 // seee eeee emmm mmmm mmmm mmmm mmmm mmmm 27 28 COMPILER_RT_ABI float __floatuntisf(tu_int a); 29 30 int test__floatuntisf(tu_int a, float expected) 31 { 32 float x = __floatuntisf(a); 33 if (x != expected) 34 { 35 utwords at; 36 at.all = a; 37 printf("error in __floatuntisf(0x%.16llX%.16llX) = %a, expected %a\n", 38 at.s.high, at.s.low, x, expected); 39 } 40 return x != expected; 41 } 42 43 COMPILE_TIME_ASSERT(sizeof(tu_int) == 2*sizeof(du_int)); 44 COMPILE_TIME_ASSERT(sizeof(tu_int)*CHAR_BIT == 128); 45 COMPILE_TIME_ASSERT(sizeof(float)*CHAR_BIT == 32); 46 47 #endif 48 49 int main() 50 { 51 #if defined(CRT_HAS_128BIT) && HAS_80_BIT_LONG_DOUBLE 52 if (test__floatuntisf(0, 0.0F)) 53 return 1; 54 55 if (test__floatuntisf(1, 1.0F)) 56 return 1; 57 if (test__floatuntisf(2, 2.0F)) 58 return 1; 59 if (test__floatuntisf(20, 20.0F)) 60 return 1; 61 62 if (test__floatuntisf(0x7FFFFF8000000000LL, 0x1.FFFFFEp+62F)) 63 return 1; 64 if (test__floatuntisf(0x7FFFFF0000000000LL, 0x1.FFFFFCp+62F)) 65 return 1; 66 67 if (test__floatuntisf(make_ti(0x8000008000000000LL, 0), 0x1.000001p+127F)) 68 return 1; 69 if (test__floatuntisf(make_ti(0x8000000000000800LL, 0), 0x1.0p+127F)) 70 return 1; 71 if (test__floatuntisf(make_ti(0x8000010000000000LL, 0), 0x1.000002p+127F)) 72 return 1; 73 74 if (test__floatuntisf(make_ti(0x8000000000000000LL, 0), 0x1.000000p+127F)) 75 return 1; 76 77 if (test__floatuntisf(0x0007FB72E8000000LL, 0x1.FEDCBAp+50F)) 78 return 1; 79 80 if (test__floatuntisf(0x0007FB72EA000000LL, 0x1.FEDCBA8p+50F)) 81 return 1; 82 if (test__floatuntisf(0x0007FB72EB000000LL, 0x1.FEDCBACp+50F)) 83 return 1; 84 85 if (test__floatuntisf(0x0007FB72EC000000LL, 0x1.FEDCBBp+50F)) 86 return 1; 87 88 if (test__floatuntisf(0x0007FB72E6000000LL, 0x1.FEDCB98p+50F)) 89 return 1; 90 if (test__floatuntisf(0x0007FB72E7000000LL, 0x1.FEDCB9Cp+50F)) 91 return 1; 92 if (test__floatuntisf(0x0007FB72E4000000LL, 0x1.FEDCB9p+50F)) 93 return 1; 94 95 if (test__floatuntisf(0xFFFFFFFFFFFFFFFELL, 0x1p+64F)) 96 return 1; 97 if (test__floatuntisf(0xFFFFFFFFFFFFFFFFLL, 0x1p+64F)) 98 return 1; 99 100 if (test__floatuntisf(0x0007FB72E8000000LL, 0x1.FEDCBAp+50F)) 101 return 1; 102 103 if (test__floatuntisf(0x0007FB72EA000000LL, 0x1.FEDCBAp+50F)) 104 return 1; 105 if (test__floatuntisf(0x0007FB72EB000000LL, 0x1.FEDCBAp+50F)) 106 return 1; 107 if (test__floatuntisf(0x0007FB72EBFFFFFFLL, 0x1.FEDCBAp+50F)) 108 return 1; 109 if (test__floatuntisf(0x0007FB72EC000000LL, 0x1.FEDCBCp+50F)) 110 return 1; 111 if (test__floatuntisf(0x0007FB72E8000001LL, 0x1.FEDCBAp+50F)) 112 return 1; 113 114 if (test__floatuntisf(0x0007FB72E6000000LL, 0x1.FEDCBAp+50F)) 115 return 1; 116 if (test__floatuntisf(0x0007FB72E7000000LL, 0x1.FEDCBAp+50F)) 117 return 1; 118 if (test__floatuntisf(0x0007FB72E7FFFFFFLL, 0x1.FEDCBAp+50F)) 119 return 1; 120 if (test__floatuntisf(0x0007FB72E4000001LL, 0x1.FEDCBAp+50F)) 121 return 1; 122 if (test__floatuntisf(0x0007FB72E4000000LL, 0x1.FEDCB8p+50F)) 123 return 1; 124 125 if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCB90000000000001LL), 126 0x1.FEDCBAp+76F)) 127 return 1; 128 if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBA0000000000000LL), 129 0x1.FEDCBAp+76F)) 130 return 1; 131 if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBAFFFFFFFFFFFFFLL), 132 0x1.FEDCBAp+76F)) 133 return 1; 134 if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBB0000000000000LL), 135 0x1.FEDCBCp+76F)) 136 return 1; 137 if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBB0000000000001LL), 138 0x1.FEDCBCp+76F)) 139 return 1; 140 if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBBFFFFFFFFFFFFFLL), 141 0x1.FEDCBCp+76F)) 142 return 1; 143 if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBC0000000000000LL), 144 0x1.FEDCBCp+76F)) 145 return 1; 146 if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBC0000000000001LL), 147 0x1.FEDCBCp+76F)) 148 return 1; 149 if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBD0000000000000LL), 150 0x1.FEDCBCp+76F)) 151 return 1; 152 if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBD0000000000001LL), 153 0x1.FEDCBEp+76F)) 154 return 1; 155 if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBDFFFFFFFFFFFFFLL), 156 0x1.FEDCBEp+76F)) 157 return 1; 158 if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBE0000000000000LL), 159 0x1.FEDCBEp+76F)) 160 return 1; 161 162 #else 163 printf("skipped\n"); 164 #endif 165 return 0; 166 } 167