softfloat-native.c revision 5d8f37ad78fc66901af50c762029a501561f3b23
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> 55d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(HOST_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; 125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(HOST_BSD) && !defined(__APPLE__) || \ 135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (defined(HOST_SOLARIS) && HOST_SOLARIS < 10) 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fpsetround(val); 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(__arm__) 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* nothing to do */ 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fesetround(val); 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef FLOATX80 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid set_floatx80_rounding_precision(int val STATUS_PARAM) 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STATUS(floatx80_rounding_precision) = val; 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(HOST_BSD) || (defined(HOST_SOLARIS) && HOST_SOLARIS < 10) 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define lrint(d) ((int32_t)rint(d)) 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define llrint(d) ((int64_t)rint(d)) 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define lrintf(f) ((int32_t)rint(f)) 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define llrintf(f) ((int64_t)rint(f)) 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define sqrtf(f) ((float)sqrt(f)) 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define remainderf(fa, fb) ((float)remainder(fa, fb)) 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define rintf(f) ((float)rint(f)) 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(__sparc__) && defined(HOST_SOLARIS) && HOST_SOLARIS < 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 2575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint float32_is_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 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*---------------------------------------------------------------------------- 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project| Software IEC/IEEE double-precision conversion routines. 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*----------------------------------------------------------------------------*/ 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float64_to_int32( float64 a STATUS_PARAM) 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return long_to_int32(lrint(a)); 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float64_to_int32_round_to_zero( float64 a STATUS_PARAM) 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int)a; 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t float64_to_int64( float64 a STATUS_PARAM) 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return llrint(a); 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t float64_to_int64_round_to_zero( float64 a STATUS_PARAM) 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int64_t)a; 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat32 float64_to_float32( float64 a STATUS_PARAM) 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef FLOATX80 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloatx80 float64_to_floatx80( float64 a STATUS_PARAM) 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef FLOAT128 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat128 float64_to_float128( float64 a STATUS_PARAM) 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned int float64_to_uint32( float64 a STATUS_PARAM) 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t v; 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned int res; 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = llrint(a); 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (v < 0) { 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = 0; 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (v > 0xffffffff) { 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = 0xffffffff; 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = v; 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return res; 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned int float64_to_uint32_round_to_zero( float64 a STATUS_PARAM) 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t v; 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned int res; 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = (int64_t)a; 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (v < 0) { 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = 0; 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (v > 0xffffffff) { 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = 0xffffffff; 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project res = v; 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return res; 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint64_t float64_to_uint64 (float64 a STATUS_PARAM) 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t v; 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = llrint(a + (float64)INT64_MIN); 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return v - INT64_MIN; 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM) 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t v; 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v = (int64_t)(a + (float64)INT64_MIN); 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return v - INT64_MIN; 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*---------------------------------------------------------------------------- 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project| Software IEC/IEEE double-precision operations. 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*----------------------------------------------------------------------------*/ 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__sun__) && defined(HOST_SOLARIS) && HOST_SOLARIS < 10 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline float64 trunc(float64 x) 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return x < 0 ? -floor(-x) : floor(x); 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 float64_trunc_to_int( float64 a STATUS_PARAM ) 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return trunc(a); 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 float64_round_to_int( float64 a STATUS_PARAM ) 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__arm__) 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch(STATUS(float_rounding_mode)) { 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case float_round_nearest_even: 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project asm("rndd %0, %1" : "=f" (a) : "f"(a)); 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case float_round_down: 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project asm("rnddm %0, %1" : "=f" (a) : "f"(a)); 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case float_round_up: 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project asm("rnddp %0, %1" : "=f" (a) : "f"(a)); 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case float_round_to_zero: 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project asm("rnddz %0, %1" : "=f" (a) : "f"(a)); 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return rint(a); 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 float64_rem( float64 a, float64 b STATUS_PARAM) 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return remainder(a, b); 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 float64_sqrt( float64 a STATUS_PARAM) 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return sqrt(a); 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float64_compare( float64 a, float64 b STATUS_PARAM ) 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (a < b) { 3985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_less; 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a == b) { 4005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_equal; 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a > b) { 4025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_greater; 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 4045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_unordered; 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float64_compare_quiet( float64 a, float64 b STATUS_PARAM ) 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isless(a, b)) { 4105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_less; 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a == b) { 4125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_equal; 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (isgreater(a, b)) { 4145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_greater; 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 4165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_unordered; 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float64_is_signaling_nan( float64 a1) 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project float64u u; 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t a; 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.f = a1; 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project a = u.i; 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ( ( ( a>>51 ) & 0xFFF ) == 0xFFE ) 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project && ( a & LIT64( 0x0007FFFFFFFFFFFF ) ); 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint float64_is_nan( float64 a1 ) 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project float64u u; 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t a; 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.f = a1; 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project a = u.i; 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return ( LIT64( 0xFFF0000000000000 ) < (bits64) ( a<<1 ) ); 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef FLOATX80 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*---------------------------------------------------------------------------- 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project| Software IEC/IEEE extended double-precision conversion routines. 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*----------------------------------------------------------------------------*/ 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint floatx80_to_int32( floatx80 a STATUS_PARAM) 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return long_to_int32(lrintl(a)); 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint floatx80_to_int32_round_to_zero( floatx80 a STATUS_PARAM) 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int)a; 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t floatx80_to_int64( floatx80 a STATUS_PARAM) 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return llrintl(a); 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint64_t floatx80_to_int64_round_to_zero( floatx80 a STATUS_PARAM) 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int64_t)a; 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat32 floatx80_to_float32( floatx80 a STATUS_PARAM) 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloat64 floatx80_to_float64( floatx80 a STATUS_PARAM) 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return a; 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*---------------------------------------------------------------------------- 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project| Software IEC/IEEE extended double-precision operations. 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*----------------------------------------------------------------------------*/ 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloatx80 floatx80_round_to_int( floatx80 a STATUS_PARAM) 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return rintl(a); 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloatx80 floatx80_rem( floatx80 a, floatx80 b STATUS_PARAM) 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return remainderl(a, b); 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfloatx80 floatx80_sqrt( floatx80 a STATUS_PARAM) 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return sqrtl(a); 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint floatx80_compare( floatx80 a, floatx80 b STATUS_PARAM ) 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (a < b) { 4905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_less; 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a == b) { 4925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_equal; 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a > b) { 4945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_greater; 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 4965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_unordered; 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint floatx80_compare_quiet( floatx80 a, floatx80 b STATUS_PARAM ) 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isless(a, b)) { 5025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_less; 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (a == b) { 5045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_equal; 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (isgreater(a, b)) { 5065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_greater; 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 5085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return float_relation_unordered; 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint floatx80_is_signaling_nan( floatx80 a1) 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project floatx80u u; 5145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner uint64_t aLow; 5155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner u.f = a1; 5165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 5175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner aLow = u.i.low & ~ LIT64( 0x4000000000000000 ); 5185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 5195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ( ( u.i.high & 0x7FFF ) == 0x7FFF ) 5205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner && (bits64) ( aLow<<1 ) 5215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner && ( u.i.low == aLow ); 5225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 5235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 5245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint floatx80_is_nan( floatx80 a1 ) 5255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 5265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner floatx80u u; 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.f = a1; 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ( ( u.i.high & 0x7FFF ) == 0x7FFF ) && (bits64) ( u.i.low<<1 ); 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 532