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