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 19typedef float src_t; 20typedef uint32_t src_rep_t; 21#define SRC_REP_C UINT32_C 22static const int srcSigBits = 23; 23 24#elif defined SRC_DOUBLE 25typedef double src_t; 26typedef uint64_t src_rep_t; 27#define SRC_REP_C UINT64_C 28static const int srcSigBits = 52; 29 30#elif defined SRC_QUAD 31typedef long double src_t; 32typedef __uint128_t src_rep_t; 33#define SRC_REP_C (__uint128_t) 34static 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 41typedef double dst_t; 42typedef uint64_t dst_rep_t; 43#define DST_REP_C UINT64_C 44static const int dstSigBits = 52; 45 46#elif defined DST_SINGLE 47typedef float dst_t; 48typedef uint32_t dst_rep_t; 49#define DST_REP_C UINT32_C 50static const int dstSigBits = 23; 51 52#elif defined DST_HALF 53typedef uint16_t dst_t; 54typedef uint16_t dst_rep_t; 55#define DST_REP_C UINT16_C 56static const int dstSigBits = 10; 57 58#else 59#error Destination should be single precision or double precision! 60#endif // end destination precision 61 62// End of specialization parameters. Two helper routines for conversion to and 63// from the representation of floating-point data as integer values follow. 64 65static __inline src_rep_t srcToRep(src_t x) { 66 const union { 67 src_t f; 68 src_rep_t i; 69 } rep = {.f = x}; 70 return rep.i; 71} 72 73static __inline dst_t dstFromRep(dst_rep_t x) { 74 const union { 75 dst_t f; 76 dst_rep_t i; 77 } rep = {.i = x}; 78 return rep.f; 79} 80 81#endif // FP_TRUNC_HEADER 82