1*5f757f3fSDimitry Andric //===-- int_to_fp.h - integer to floating point conversion ----------------===// 2*5f757f3fSDimitry Andric // 3*5f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*5f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*5f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*5f757f3fSDimitry Andric // 7*5f757f3fSDimitry Andric //===----------------------------------------------------------------------===// 8*5f757f3fSDimitry Andric // 9*5f757f3fSDimitry Andric // Set source and destination defines in order to use a correctly 10*5f757f3fSDimitry Andric // parameterised floatXiYf implementation. 11*5f757f3fSDimitry Andric // 12*5f757f3fSDimitry Andric //===----------------------------------------------------------------------===// 13*5f757f3fSDimitry Andric 14*5f757f3fSDimitry Andric #ifndef INT_TO_FP_H 15*5f757f3fSDimitry Andric #define INT_TO_FP_H 16*5f757f3fSDimitry Andric 17*5f757f3fSDimitry Andric #include "int_lib.h" 18*5f757f3fSDimitry Andric 19*5f757f3fSDimitry Andric #if defined SRC_I64 20*5f757f3fSDimitry Andric typedef int64_t src_t; 21*5f757f3fSDimitry Andric typedef uint64_t usrc_t; clzSrcT(usrc_t x)22*5f757f3fSDimitry Andricstatic __inline int clzSrcT(usrc_t x) { return __builtin_clzll(x); } 23*5f757f3fSDimitry Andric 24*5f757f3fSDimitry Andric #elif defined SRC_U64 25*5f757f3fSDimitry Andric typedef uint64_t src_t; 26*5f757f3fSDimitry Andric typedef uint64_t usrc_t; clzSrcT(usrc_t x)27*5f757f3fSDimitry Andricstatic __inline int clzSrcT(usrc_t x) { return __builtin_clzll(x); } 28*5f757f3fSDimitry Andric 29*5f757f3fSDimitry Andric #elif defined SRC_I128 30*5f757f3fSDimitry Andric typedef __int128_t src_t; 31*5f757f3fSDimitry Andric typedef __uint128_t usrc_t; clzSrcT(usrc_t x)32*5f757f3fSDimitry Andricstatic __inline int clzSrcT(usrc_t x) { return __clzti2(x); } 33*5f757f3fSDimitry Andric 34*5f757f3fSDimitry Andric #elif defined SRC_U128 35*5f757f3fSDimitry Andric typedef __uint128_t src_t; 36*5f757f3fSDimitry Andric typedef __uint128_t usrc_t; clzSrcT(usrc_t x)37*5f757f3fSDimitry Andricstatic __inline int clzSrcT(usrc_t x) { return __clzti2(x); } 38*5f757f3fSDimitry Andric 39*5f757f3fSDimitry Andric #else 40*5f757f3fSDimitry Andric #error Source should be a handled integer type. 41*5f757f3fSDimitry Andric #endif 42*5f757f3fSDimitry Andric 43*5f757f3fSDimitry Andric #if defined DST_SINGLE 44*5f757f3fSDimitry Andric typedef float dst_t; 45*5f757f3fSDimitry Andric typedef uint32_t dst_rep_t; 46*5f757f3fSDimitry Andric #define DST_REP_C UINT32_C 47*5f757f3fSDimitry Andric 48*5f757f3fSDimitry Andric enum { 49*5f757f3fSDimitry Andric dstSigBits = 23, 50*5f757f3fSDimitry Andric }; 51*5f757f3fSDimitry Andric 52*5f757f3fSDimitry Andric #elif defined DST_DOUBLE 53*5f757f3fSDimitry Andric typedef double dst_t; 54*5f757f3fSDimitry Andric typedef uint64_t dst_rep_t; 55*5f757f3fSDimitry Andric #define DST_REP_C UINT64_C 56*5f757f3fSDimitry Andric 57*5f757f3fSDimitry Andric enum { 58*5f757f3fSDimitry Andric dstSigBits = 52, 59*5f757f3fSDimitry Andric }; 60*5f757f3fSDimitry Andric 61*5f757f3fSDimitry Andric #elif defined DST_QUAD 62*5f757f3fSDimitry Andric typedef tf_float dst_t; 63*5f757f3fSDimitry Andric typedef __uint128_t dst_rep_t; 64*5f757f3fSDimitry Andric #define DST_REP_C (__uint128_t) 65*5f757f3fSDimitry Andric 66*5f757f3fSDimitry Andric enum { 67*5f757f3fSDimitry Andric dstSigBits = 112, 68*5f757f3fSDimitry Andric }; 69*5f757f3fSDimitry Andric 70*5f757f3fSDimitry Andric #else 71*5f757f3fSDimitry Andric #error Destination should be a handled floating point type 72*5f757f3fSDimitry Andric #endif 73*5f757f3fSDimitry Andric dstFromRep(dst_rep_t x)74*5f757f3fSDimitry Andricstatic __inline dst_t dstFromRep(dst_rep_t x) { 75*5f757f3fSDimitry Andric const union { 76*5f757f3fSDimitry Andric dst_t f; 77*5f757f3fSDimitry Andric dst_rep_t i; 78*5f757f3fSDimitry Andric } rep = {.i = x}; 79*5f757f3fSDimitry Andric return rep.f; 80*5f757f3fSDimitry Andric } 81*5f757f3fSDimitry Andric 82*5f757f3fSDimitry Andric #endif // INT_TO_FP_H 83