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 Andric static __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 Andric static __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 Andric static __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 Andric static __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 Andric static __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