13cab2bb3Spatrick //===-lib/fp_extend.h - low precision -> high precision conversion -*- C 23cab2bb3Spatrick //-*-===// 33cab2bb3Spatrick // 43cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 53cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 63cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 73cab2bb3Spatrick // 83cab2bb3Spatrick //===----------------------------------------------------------------------===// 93cab2bb3Spatrick // 103cab2bb3Spatrick // Set source and destination setting 113cab2bb3Spatrick // 123cab2bb3Spatrick //===----------------------------------------------------------------------===// 133cab2bb3Spatrick 143cab2bb3Spatrick #ifndef FP_EXTEND_HEADER 153cab2bb3Spatrick #define FP_EXTEND_HEADER 163cab2bb3Spatrick 173cab2bb3Spatrick #include "int_lib.h" 183cab2bb3Spatrick 193cab2bb3Spatrick #if defined SRC_SINGLE 203cab2bb3Spatrick typedef float src_t; 213cab2bb3Spatrick typedef uint32_t src_rep_t; 223cab2bb3Spatrick #define SRC_REP_C UINT32_C 233cab2bb3Spatrick static const int srcSigBits = 23; 241f9cb04fSpatrick #define src_rep_t_clz clzsi 253cab2bb3Spatrick 263cab2bb3Spatrick #elif defined SRC_DOUBLE 273cab2bb3Spatrick typedef double src_t; 283cab2bb3Spatrick typedef uint64_t src_rep_t; 293cab2bb3Spatrick #define SRC_REP_C UINT64_C 303cab2bb3Spatrick static const int srcSigBits = 52; src_rep_t_clz(src_rep_t a)313cab2bb3Spatrickstatic __inline int src_rep_t_clz(src_rep_t a) { 323cab2bb3Spatrick #if defined __LP64__ 333cab2bb3Spatrick return __builtin_clzl(a); 343cab2bb3Spatrick #else 353cab2bb3Spatrick if (a & REP_C(0xffffffff00000000)) 36*810390e3Srobert return clzsi(a >> 32); 373cab2bb3Spatrick else 38*810390e3Srobert return 32 + clzsi(a & REP_C(0xffffffff)); 393cab2bb3Spatrick #endif 403cab2bb3Spatrick } 413cab2bb3Spatrick 423cab2bb3Spatrick #elif defined SRC_HALF 43d89ec533Spatrick #ifdef COMPILER_RT_HAS_FLOAT16 44d89ec533Spatrick typedef _Float16 src_t; 45d89ec533Spatrick #else 463cab2bb3Spatrick typedef uint16_t src_t; 47d89ec533Spatrick #endif 483cab2bb3Spatrick typedef uint16_t src_rep_t; 493cab2bb3Spatrick #define SRC_REP_C UINT16_C 503cab2bb3Spatrick static const int srcSigBits = 10; 513cab2bb3Spatrick #define src_rep_t_clz __builtin_clz 523cab2bb3Spatrick 533cab2bb3Spatrick #else 543cab2bb3Spatrick #error Source should be half, single, or double precision! 553cab2bb3Spatrick #endif // end source precision 563cab2bb3Spatrick 573cab2bb3Spatrick #if defined DST_SINGLE 583cab2bb3Spatrick typedef float dst_t; 593cab2bb3Spatrick typedef uint32_t dst_rep_t; 603cab2bb3Spatrick #define DST_REP_C UINT32_C 613cab2bb3Spatrick static const int dstSigBits = 23; 623cab2bb3Spatrick 633cab2bb3Spatrick #elif defined DST_DOUBLE 643cab2bb3Spatrick typedef double dst_t; 653cab2bb3Spatrick typedef uint64_t dst_rep_t; 663cab2bb3Spatrick #define DST_REP_C UINT64_C 673cab2bb3Spatrick static const int dstSigBits = 52; 683cab2bb3Spatrick 693cab2bb3Spatrick #elif defined DST_QUAD 703cab2bb3Spatrick typedef long double dst_t; 713cab2bb3Spatrick typedef __uint128_t dst_rep_t; 723cab2bb3Spatrick #define DST_REP_C (__uint128_t) 733cab2bb3Spatrick static const int dstSigBits = 112; 743cab2bb3Spatrick 753cab2bb3Spatrick #else 763cab2bb3Spatrick #error Destination should be single, double, or quad precision! 773cab2bb3Spatrick #endif // end destination precision 783cab2bb3Spatrick 793cab2bb3Spatrick // End of specialization parameters. Two helper routines for conversion to and 803cab2bb3Spatrick // from the representation of floating-point data as integer values follow. 813cab2bb3Spatrick srcToRep(src_t x)823cab2bb3Spatrickstatic __inline src_rep_t srcToRep(src_t x) { 833cab2bb3Spatrick const union { 843cab2bb3Spatrick src_t f; 853cab2bb3Spatrick src_rep_t i; 863cab2bb3Spatrick } rep = {.f = x}; 873cab2bb3Spatrick return rep.i; 883cab2bb3Spatrick } 893cab2bb3Spatrick dstFromRep(dst_rep_t x)903cab2bb3Spatrickstatic __inline dst_t dstFromRep(dst_rep_t x) { 913cab2bb3Spatrick const union { 923cab2bb3Spatrick dst_t f; 933cab2bb3Spatrick dst_rep_t i; 943cab2bb3Spatrick } rep = {.i = x}; 953cab2bb3Spatrick return rep.f; 963cab2bb3Spatrick } 973cab2bb3Spatrick // End helper routines. Conversion implementation follows. 983cab2bb3Spatrick 993cab2bb3Spatrick #endif // FP_EXTEND_HEADER 100