15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines//=== lib/fp_trunc.h - high precision -> low precision conversion *- C -*-===//
25d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines//
35d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines//                     The LLVM Compiler Infrastructure
45d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines//
55d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// This file is dual licensed under the MIT and the University of Illinois Open
65d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Source Licenses. See LICENSE.TXT for details.
75d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines//
85d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines//===----------------------------------------------------------------------===//
95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines//
105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Set source and destination precision setting
115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines//
125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines//===----------------------------------------------------------------------===//
135d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
145d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#ifndef FP_TRUNC_HEADER
155d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#define FP_TRUNC_HEADER
165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
175d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include "int_lib.h"
185d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
195d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#if defined SRC_DOUBLE
205d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestypedef double src_t;
215d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestypedef uint64_t src_rep_t;
225d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#define SRC_REP_C UINT64_C
235d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesstatic const int srcSigBits = 52;
245d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
255d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#elif defined SRC_QUAD
265d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestypedef long double src_t;
275d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestypedef __uint128_t src_rep_t;
285d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#define SRC_REP_C (__uint128_t)
295d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesstatic const int srcSigBits = 112;
305d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
315d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#else
325d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#error Source should be double precision or quad precision!
335d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#endif //end source precision
345d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
355d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#if defined DST_DOUBLE
365d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestypedef double dst_t;
375d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestypedef uint64_t dst_rep_t;
385d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#define DST_REP_C UINT64_C
395d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesstatic const int dstSigBits = 52;
405d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
415d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#elif defined DST_SINGLE
425d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestypedef float dst_t;
435d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestypedef uint32_t dst_rep_t;
445d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#define DST_REP_C UINT32_C
455d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesstatic const int dstSigBits = 23;
465d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
475d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#else
485d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#error Destination should be single precision or double precision!
495d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#endif //end destination precision
505d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
515d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// End of specialization parameters.  Two helper routines for conversion to and
525d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// from the representation of floating-point data as integer values follow.
535d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
545d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesstatic inline src_rep_t srcToRep(src_t x) {
555d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    const union { src_t f; src_rep_t i; } rep = {.f = x};
565d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    return rep.i;
575d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
585d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
595d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesstatic inline dst_t dstFromRep(dst_rep_t x) {
605d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    const union { dst_t f; dst_rep_t i; } rep = {.i = x};
615d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    return rep.f;
625d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
635d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
645d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#endif // FP_TRUNC_HEADER
65