18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Native implementation of soft float functions. Only a single status 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project context is supported */ 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "softfloat.h" 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <math.h> 52c538c86c15d597cc875dc926e4e39285c5625dfDavid 'Digit' Turner#if defined(CONFIG_SOLARIS) 65d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <fenv.h> 75d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid set_float_rounding_mode(int val STATUS_PARAM) 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STATUS(float_rounding_mode) = val; 122c538c86c15d597cc875dc926e4e39285c5625dfDavid 'Digit' Turner#if (defined(CONFIG_BSD) && !defined(__APPLE__) && !defined(__GLIBC__)) || \ 132c538c86c15d597cc875dc926e4e39285c5625dfDavid 'Digit' Turner (defined(CONFIG_SOLARIS) && CONFIG_SOLARIS_VERSION < 10) 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fpsetround(val); 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fesetround(val); 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef FLOATX80 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid set_floatx80_rounding_precision(int val STATUS_PARAM) 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STATUS(floatx80_rounding_precision) = val; 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 272c538c86c15d597cc875dc926e4e39285c5625dfDavid 'Digit' Turner#if defined(CONFIG_BSD) || \ 282c538c86c15d597cc875dc926e4e39285c5625dfDavid 'Digit' Turner (defined(CONFIG_SOLARIS) && CONFIG_SOLARIS_VERSION < 10) 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define lrint(d) ((int32_t)rint(d)) 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define llrint(d) ((int64_t)rint(d)) 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define lrintf(f) ((int32_t)rint(f)) 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define llrintf(f) ((int64_t)rint(f)) 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define sqrtf(f) ((float)sqrt(f)) 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define remainderf(fa, fb) ((float)remainder(fa, fb)) 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define rintf(f) ((float)rint(f)) 362c538c86c15d597cc875dc926e4e39285c5625dfDavid 'Digit' Turner#if !defined(__sparc__) && \ 372c538c86c15d597cc875dc926e4e39285c5625dfDavid 'Digit' Turner (defined(CONFIG_SOLARIS) && CONFIG_SOLARIS_VERSION < 10) 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern long double rintl(long double); 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern long double scalbnl(long double, int); 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectlong long 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectllrintl(long double x) { 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ((long long) rintl(x)); 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectlong 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectlrintl(long double x) { 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ((long) rintl(x)); 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectlong double 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectldexpl(long double x, int n) { 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (scalbnl(x, n)); 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(_ARCH_PPC) 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* correct (but slow) PowerPC rint() (glibc version is incorrect) */ 615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic double qemu_rint(double x) 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project double y = 4503599627370496.0; 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (fabs(x) >= y) 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return x; 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (x < 0) 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project y = -y; 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project y = (x + y) - y; 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (y == 0.0) 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project y = copysign(y, x); 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return y; 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define rint qemu_rint 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*---------------------------------------------------------------------------- 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project| Software IEC/IEEE integer-to-floating-point conversion routines. 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*----------------------------------------------------------------------------*/ 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat32 int32_to_float32(int v STATUS_PARAM) 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (float32)v; 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat32 uint32_to_float32(unsigned int v STATUS_PARAM) 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (float32)v; 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 int32_to_float64(int v STATUS_PARAM) 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (float64)v; 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 uint32_to_float64(unsigned int v STATUS_PARAM) 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (float64)v; 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef FLOATX80 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloatx80 int32_to_floatx80(int v STATUS_PARAM) 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (floatx80)v; 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat32 int64_to_float32( int64_t v STATUS_PARAM) 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (float32)v; 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat32 uint64_to_float32( uint64_t v STATUS_PARAM) 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (float32)v; 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 int64_to_float64( int64_t v STATUS_PARAM) 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (float64)v; 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 uint64_to_float64( uint64_t v STATUS_PARAM) 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (float64)v; 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef FLOATX80 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloatx80 int64_to_floatx80( int64_t v STATUS_PARAM) 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (floatx80)v; 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* XXX: this code implements the x86 behaviour, not the IEEE one. */ 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if HOST_LONG_BITS == 32 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline int long_to_int32(long a) 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline int long_to_int32(long a) 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (a != (int32_t)a) 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project a = 0x80000000; 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*---------------------------------------------------------------------------- 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project| Software IEC/IEEE single-precision conversion routines. 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*----------------------------------------------------------------------------*/ 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float32_to_int32( float32 a STATUS_PARAM) 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return long_to_int32(lrintf(a)); 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float32_to_int32_round_to_zero( float32 a STATUS_PARAM) 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int)a; 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t float32_to_int64( float32 a STATUS_PARAM) 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return llrintf(a); 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t float32_to_int64_round_to_zero( float32 a STATUS_PARAM) 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int64_t)a; 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 float32_to_float64( float32 a STATUS_PARAM) 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef FLOATX80 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloatx80 float32_to_floatx80( float32 a STATUS_PARAM) 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned int float32_to_uint32( float32 a STATUS_PARAM) 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t v; 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned int res; 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = llrintf(a); 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (v < 0) { 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = 0; 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (v > 0xffffffff) { 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = 0xffffffff; 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = v; 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return res; 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned int float32_to_uint32_round_to_zero( float32 a STATUS_PARAM) 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t v; 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned int res; 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = (int64_t)a; 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (v < 0) { 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = 0; 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (v > 0xffffffff) { 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = 0xffffffff; 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = v; 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return res; 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*---------------------------------------------------------------------------- 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project| Software IEC/IEEE single-precision operations. 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*----------------------------------------------------------------------------*/ 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat32 float32_round_to_int( float32 a STATUS_PARAM) 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return rintf(a); 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat32 float32_rem( float32 a, float32 b STATUS_PARAM) 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return remainderf(a, b); 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat32 float32_sqrt( float32 a STATUS_PARAM) 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return sqrtf(a); 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float32_compare( float32 a, float32 b STATUS_PARAM ) 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (a < b) { 2275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_less; 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a == b) { 2295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_equal; 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a > b) { 2315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_greater; 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 2335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_unordered; 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float32_compare_quiet( float32 a, float32 b STATUS_PARAM ) 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isless(a, b)) { 2395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_less; 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a == b) { 2415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_equal; 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (isgreater(a, b)) { 2435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_greater; 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 2455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_unordered; 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float32_is_signaling_nan( float32 a1) 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project float32u u; 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t a; 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.f = a1; 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project a = u.i; 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ( ( ( a>>22 ) & 0x1FF ) == 0x1FE ) && ( a & 0x003FFFFF ); 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 257bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turnerint float32_is_quiet_nan( float32 a1 ) 2585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 2595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner float32u u; 2605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner uint64_t a; 2615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner u.f = a1; 2625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner a = u.i; 2635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return ( 0xFF800000 < ( a<<1 ) ); 2645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 2655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 266bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turnerint float32_is_any_nan( float32 a1 ) 267bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner{ 268bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner float32u u; 269bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner uint32_t a; 270bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner u.f = a1; 271bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner a = u.i; 272bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner return (a & ~(1 << 31)) > 0x7f800000U; 273bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner} 274bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*---------------------------------------------------------------------------- 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project| Software IEC/IEEE double-precision conversion routines. 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*----------------------------------------------------------------------------*/ 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float64_to_int32( float64 a STATUS_PARAM) 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return long_to_int32(lrint(a)); 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float64_to_int32_round_to_zero( float64 a STATUS_PARAM) 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int)a; 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t float64_to_int64( float64 a STATUS_PARAM) 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return llrint(a); 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t float64_to_int64_round_to_zero( float64 a STATUS_PARAM) 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int64_t)a; 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat32 float64_to_float32( float64 a STATUS_PARAM) 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef FLOATX80 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloatx80 float64_to_floatx80( float64 a STATUS_PARAM) 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef FLOAT128 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat128 float64_to_float128( float64 a STATUS_PARAM) 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned int float64_to_uint32( float64 a STATUS_PARAM) 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t v; 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned int res; 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = llrint(a); 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (v < 0) { 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = 0; 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (v > 0xffffffff) { 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = 0xffffffff; 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = v; 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return res; 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned int float64_to_uint32_round_to_zero( float64 a STATUS_PARAM) 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t v; 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned int res; 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = (int64_t)a; 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (v < 0) { 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = 0; 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (v > 0xffffffff) { 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = 0xffffffff; 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = v; 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return res; 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint64_t float64_to_uint64 (float64 a STATUS_PARAM) 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t v; 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = llrint(a + (float64)INT64_MIN); 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return v - INT64_MIN; 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM) 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t v; 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = (int64_t)(a + (float64)INT64_MIN); 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return v - INT64_MIN; 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*---------------------------------------------------------------------------- 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project| Software IEC/IEEE double-precision operations. 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*----------------------------------------------------------------------------*/ 3612c538c86c15d597cc875dc926e4e39285c5625dfDavid 'Digit' Turner#if defined(__sun__) && \ 3622c538c86c15d597cc875dc926e4e39285c5625dfDavid 'Digit' Turner (defined(CONFIG_SOLARIS) && CONFIG_SOLARIS_VERSION < 10) 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline float64 trunc(float64 x) 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return x < 0 ? -floor(-x) : floor(x); 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 float64_trunc_to_int( float64 a STATUS_PARAM ) 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return trunc(a); 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 float64_round_to_int( float64 a STATUS_PARAM ) 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return rint(a); 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 float64_rem( float64 a, float64 b STATUS_PARAM) 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return remainder(a, b); 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 float64_sqrt( float64 a STATUS_PARAM) 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return sqrt(a); 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float64_compare( float64 a, float64 b STATUS_PARAM ) 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (a < b) { 3905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_less; 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a == b) { 3925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_equal; 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a > b) { 3945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_greater; 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_unordered; 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float64_compare_quiet( float64 a, float64 b STATUS_PARAM ) 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isless(a, b)) { 4025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_less; 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a == b) { 4045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_equal; 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (isgreater(a, b)) { 4065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_greater; 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 4085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_unordered; 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float64_is_signaling_nan( float64 a1) 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project float64u u; 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t a; 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.f = a1; 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project a = u.i; 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ( ( ( a>>51 ) & 0xFFF ) == 0xFFE ) 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project && ( a & LIT64( 0x0007FFFFFFFFFFFF ) ); 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 423bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turnerint float64_is_quiet_nan( float64 a1 ) 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project float64u u; 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t a; 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.f = a1; 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project a = u.i; 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 430bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner return ( LIT64( 0xFFF0000000000000 ) < (uint64_t) ( a<<1 ) ); 431bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner 432bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner} 433bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner 434bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turnerint float64_is_any_nan( float64 a1 ) 435bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner{ 436bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner float64u u; 437bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner uint64_t a; 438bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner u.f = a1; 439bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner a = u.i; 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 441bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner return (a & ~(1ULL << 63)) > LIT64 (0x7FF0000000000000 ); 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef FLOATX80 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*---------------------------------------------------------------------------- 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project| Software IEC/IEEE extended double-precision conversion routines. 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*----------------------------------------------------------------------------*/ 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint floatx80_to_int32( floatx80 a STATUS_PARAM) 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return long_to_int32(lrintl(a)); 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint floatx80_to_int32_round_to_zero( floatx80 a STATUS_PARAM) 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int)a; 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t floatx80_to_int64( floatx80 a STATUS_PARAM) 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return llrintl(a); 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t floatx80_to_int64_round_to_zero( floatx80 a STATUS_PARAM) 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int64_t)a; 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat32 floatx80_to_float32( floatx80 a STATUS_PARAM) 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 floatx80_to_float64( floatx80 a STATUS_PARAM) 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*---------------------------------------------------------------------------- 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project| Software IEC/IEEE extended double-precision operations. 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*----------------------------------------------------------------------------*/ 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloatx80 floatx80_round_to_int( floatx80 a STATUS_PARAM) 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return rintl(a); 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloatx80 floatx80_rem( floatx80 a, floatx80 b STATUS_PARAM) 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return remainderl(a, b); 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloatx80 floatx80_sqrt( floatx80 a STATUS_PARAM) 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return sqrtl(a); 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint floatx80_compare( floatx80 a, floatx80 b STATUS_PARAM ) 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (a < b) { 4925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_less; 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a == b) { 4945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_equal; 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a > b) { 4965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_greater; 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 4985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_unordered; 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint floatx80_compare_quiet( floatx80 a, floatx80 b STATUS_PARAM ) 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isless(a, b)) { 5045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_less; 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a == b) { 5065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_equal; 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (isgreater(a, b)) { 5085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_greater; 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 5105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_unordered; 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint floatx80_is_signaling_nan( floatx80 a1) 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project floatx80u u; 5165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner uint64_t aLow; 5175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner u.f = a1; 5185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 5195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner aLow = u.i.low & ~ LIT64( 0x4000000000000000 ); 5205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 5215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ( ( u.i.high & 0x7FFF ) == 0x7FFF ) 522bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner && (uint64_t) ( aLow<<1 ) 5235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner && ( u.i.low == aLow ); 5245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 5255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 526bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turnerint floatx80_is_quiet_nan( floatx80 a1 ) 527bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner{ 528bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner floatx80u u; 529bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner u.f = a1; 530bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner return ( ( u.i.high & 0x7FFF ) == 0x7FFF ) && (uint64_t) ( u.i.low<<1 ); 531bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner} 532bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner 533bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turnerint floatx80_is_any_nan( floatx80 a1 ) 5345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 5355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner floatx80u u; 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.f = a1; 537bfec547677ddf2164ffd49a34c3ace2a41c938adDavid 'Digit' Turner return ((u.i.high & 0x7FFF) == 0x7FFF) && ( u.i.low<<1 ); 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 541