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