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