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