1 //=== lib/fp_trunc.h - high precision -> low precision conversion *- C -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Set source and destination precision setting 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef FP_TRUNC_HEADER 14 #define FP_TRUNC_HEADER 15 16 #include "int_lib.h" 17 18 #if defined SRC_SINGLE 19 typedef float src_t; 20 typedef uint32_t src_rep_t; 21 #define SRC_REP_C UINT32_C 22 static const int srcSigBits = 23; 23 24 #elif defined SRC_DOUBLE 25 typedef double src_t; 26 typedef uint64_t src_rep_t; 27 #define SRC_REP_C UINT64_C 28 static const int srcSigBits = 52; 29 30 #elif defined SRC_QUAD 31 typedef long double src_t; 32 typedef __uint128_t src_rep_t; 33 #define SRC_REP_C (__uint128_t) 34 static const int srcSigBits = 112; 35 36 #else 37 #error Source should be double precision or quad precision! 38 #endif // end source precision 39 40 #if defined DST_DOUBLE 41 typedef double dst_t; 42 typedef uint64_t dst_rep_t; 43 #define DST_REP_C UINT64_C 44 static const int dstSigBits = 52; 45 46 #elif defined DST_SINGLE 47 typedef float dst_t; 48 typedef uint32_t dst_rep_t; 49 #define DST_REP_C UINT32_C 50 static const int dstSigBits = 23; 51 52 #elif defined DST_HALF 53 #ifdef COMPILER_RT_HAS_FLOAT16 54 typedef _Float16 dst_t; 55 #else 56 typedef uint16_t dst_t; 57 #endif 58 typedef uint16_t dst_rep_t; 59 #define DST_REP_C UINT16_C 60 static const int dstSigBits = 10; 61 62 #else 63 #error Destination should be single precision or double precision! 64 #endif // end destination precision 65 66 // End of specialization parameters. Two helper routines for conversion to and 67 // from the representation of floating-point data as integer values follow. 68 69 static __inline src_rep_t srcToRep(src_t x) { 70 const union { 71 src_t f; 72 src_rep_t i; 73 } rep = {.f = x}; 74 return rep.i; 75 } 76 77 static __inline dst_t dstFromRep(dst_rep_t x) { 78 const union { 79 dst_t f; 80 dst_rep_t i; 81 } rep = {.i = x}; 82 return rep.f; 83 } 84 85 #endif // FP_TRUNC_HEADER 86