16a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//=== lib/fp_trunc.h - high precision -> low precision conversion *- C -*-===//
26a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//
36a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//                     The LLVM Compiler Infrastructure
46a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//
56a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// This file is dual licensed under the MIT and the University of Illinois Open
66a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// Source Licenses. See LICENSE.TXT for details.
76a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//
86a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//===----------------------------------------------------------------------===//
96a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//
106a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// Set source and destination precision setting
116a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//
126a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//===----------------------------------------------------------------------===//
136a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
146a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#ifndef FP_TRUNC_HEADER
156a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#define FP_TRUNC_HEADER
166a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
176a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#include "int_lib.h"
186a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
19a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainar#if defined SRC_SINGLE
20a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainartypedef float src_t;
21a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainartypedef uint32_t src_rep_t;
22a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainar#define SRC_REP_C UINT32_C
23a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainarstatic const int srcSigBits = 23;
24a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainar
25a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainar#elif defined SRC_DOUBLE
266a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef double src_t;
276a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef uint64_t src_rep_t;
286a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#define SRC_REP_C UINT64_C
296a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesstatic const int srcSigBits = 52;
306a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
316a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#elif defined SRC_QUAD
326a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef long double src_t;
336a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef __uint128_t src_rep_t;
346a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#define SRC_REP_C (__uint128_t)
356a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesstatic const int srcSigBits = 112;
366a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
376a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#else
386a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#error Source should be double precision or quad precision!
396a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#endif //end source precision
406a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
416a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#if defined DST_DOUBLE
426a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef double dst_t;
436a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef uint64_t dst_rep_t;
446a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#define DST_REP_C UINT64_C
456a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesstatic const int dstSigBits = 52;
466a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
476a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#elif defined DST_SINGLE
486a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef float dst_t;
496a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef uint32_t dst_rep_t;
506a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#define DST_REP_C UINT32_C
516a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesstatic const int dstSigBits = 23;
526a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
53a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainar#elif defined DST_HALF
54a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainartypedef uint16_t dst_t;
55a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainartypedef uint16_t dst_rep_t;
56a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainar#define DST_REP_C UINT16_C
57a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainarstatic const int dstSigBits = 10;
58a4cf3ee7395c0b5b172617a8699bb50a6868fce0Pirama Arumuga Nainar
596a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#else
606a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#error Destination should be single precision or double precision!
616a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#endif //end destination precision
626a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
636a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// End of specialization parameters.  Two helper routines for conversion to and
646a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// from the representation of floating-point data as integer values follow.
656a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
66799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarstatic __inline src_rep_t srcToRep(src_t x) {
676a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    const union { src_t f; src_rep_t i; } rep = {.f = x};
686a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    return rep.i;
696a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines}
706a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
71799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarstatic __inline dst_t dstFromRep(dst_rep_t x) {
726a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    const union { dst_t f; dst_rep_t i; } rep = {.i = x};
736a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    return rep.f;
746a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines}
756a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
766a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#endif // FP_TRUNC_HEADER
77