}
}
-#if 0 /* Old fallback functions disabled */
-
-static bool to_native_checked(fptype *fp, fpdata *fpd, fpdata *dst)
-{
- uint64_t aSig = extractFloatx80Frac(fpd->fpx);
- int32_t aExp = extractFloatx80Exp(fpd->fpx);
- if (aExp == 0x7FFF && (uint64_t)(aSig << 1)) {
- dst->fpx = propagateFloatx80NaN(fpd->fpx, fpd->fpx, &fs);
- return true;
- }
- to_native(fp, fpd);
- return false;
-}
-
-static void fp_lognp1(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_lognp1_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = logl(a->fp + 1.0);
- from_native(fpa, a);
-}
-static void fp_sin(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_sin_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = sinl(fpa);
- from_native(fpa, a);
-}
-static void fp_tan(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_tan_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = tanl(fpa);
- from_native(fpa, a);
-}
-static void fp_logn(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_logn_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = logl(fpa);
- from_native(fpa, a);
-}
-static void fp_log10(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_log10_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = log10l(fpa);
- from_native(fpa, a);
-}
-static void fp_log2(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_log2_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = log2l(fpa);
- from_native(fpa, a);
-}
-
-static void fp_cos(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_sin_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = cosl(fpa);
- from_native(fpa, a);
-}
-
-static void fp_sinh(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_sinh_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = sinhl(fpa);
- from_native(fpa, a);
- fp_round(a);
-}
-static void fp_etoxm1(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_etoxm1_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = expl(fpa) - 1.0;
- from_native(fpa, a);
- fp_round(a);
-}
-static void fp_tanh(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_tanh_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = tanhl(fpa);
- from_native(fpa, a);
- fp_round(a);
-}
-static void fp_atan(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_atan_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = atanl(fpa);
- from_native(fpa, a);
- fp_round(a);
-}
-static void fp_asin(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_asin_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = asinl(fpa);
- from_native(fpa, a);
- fp_round(a);
-}
-static void fp_atanh(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_atanh_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = atanhl(fpa);
- from_native(fpa, a);
- fp_round(a);
-}
-static void fp_etox(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_etox_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = expl(fpa);
- from_native(fpa, a);
- fp_round(a);
-}
-static void fp_twotox(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_twotox_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = powl(2.0, fpa);
- from_native(fpa, a);
- fp_round(a);
-}
-static void fp_tentox(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_tentox_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = powl(10.0, fpa);
- from_native(fpa, a);
- fp_round(a);
-}
-static void fp_cosh(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_cosh_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = coshl(fpa);
- from_native(fpa, a);
- fp_round(a);
-}
-static void fp_acos(fpdata *a, fpdata *b)
-{
- fptype fpa;
- flag e = 0;
- a->fpx = floatx80_acos_check(b->fpx, &e, &fs);
- if (e)
- return;
- to_native(&fpa, b);
- fpa = acosl(fpa);
- from_native(fpa, a);
- fp_round(a);
-}
-
-#endif
-
static void fp_normalize(fpdata *a)
{
a->fpx = floatx80_normalize(a->fpx);
/*----------------------------------------------------------------------------
| The pattern for a default generated extended double-precision NaN.
*----------------------------------------------------------------------------*/
-static floatx80 floatx80_default_nan(float_status *status)
+static inline floatx80 floatx80_default_nan(float_status *status)
{
floatx80 r;
r.high = 0x7FFF;
| exception is raised.
*----------------------------------------------------------------------------*/
-static commonNaNT float32ToCommonNaN( float32 a, float_status *status )
+static inline commonNaNT float32ToCommonNaN( float32 a, float_status *status )
{
commonNaNT z;
| precision floating-point format.
*----------------------------------------------------------------------------*/
-static float32 commonNaNToFloat32( commonNaNT a )
+static inline float32 commonNaNToFloat32( commonNaNT a )
{
return ( ( (uint32_t) a.sign )<<31 ) | 0x7FC00000 | ( a.high>>41 );
| signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/
-static float32 propagateFloat32NaN( float32 a, float32 b, float_status *status )
+static inline float32 propagateFloat32NaN( float32 a, float32 b, float_status *status )
{
flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
| exception is raised.
*----------------------------------------------------------------------------*/
-static commonNaNT float64ToCommonNaN(float64 a, float_status *status)
+static inline commonNaNT float64ToCommonNaN(float64 a, float_status *status)
{
commonNaNT z;
| precision floating-point format.
*----------------------------------------------------------------------------*/
-static float64 commonNaNToFloat64(commonNaNT a, float_status *status)
+static inline float64 commonNaNToFloat64(commonNaNT a, float_status *status)
{
return
( ( (uint64_t) a.sign )<<63 )
| ( a.high>>12 );
}
-/*----------------------------------------------------------------------------
-| Takes two double-precision floating-point values `a' and `b', one of which
-| is a NaN, and returns the appropriate NaN result. If either `a' or `b' is a
-| signaling NaN, the invalid exception is raised.
-*----------------------------------------------------------------------------*/
-
-static float64 propagateFloat64NaN( float64 a, float64 b, float_status *status )
-{
- flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
-
- aIsNaN = float64_is_nan( a );
- aIsSignalingNaN = float64_is_signaling_nan( a );
- bIsNaN = float64_is_nan( b );
- bIsSignalingNaN = float64_is_signaling_nan( b );
- a |= LIT64( 0x0008000000000000 );
- b |= LIT64( 0x0008000000000000 );
- if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_signaling, status );
- if ( aIsNaN ) {
- return ( aIsSignalingNaN & bIsNaN ) ? b : a;
- }
- else {
- return b;
- }
-
-}
-
/*----------------------------------------------------------------------------
| Returns 1 if the extended double-precision floating-point value `a' is a
| signaling NaN; otherwise returns 0.
| invalid exception is raised.
*----------------------------------------------------------------------------*/
-static commonNaNT floatx80ToCommonNaN( floatx80 a, float_status *status )
+static inline commonNaNT floatx80ToCommonNaN( floatx80 a, float_status *status )
{
commonNaNT z;
| double-precision floating-point format.
*----------------------------------------------------------------------------*/
-static floatx80 commonNaNToFloatx80(commonNaNT a, float_status *status)
+static inline floatx80 commonNaNToFloatx80(commonNaNT a, float_status *status)
{
floatx80 z;
#ifdef SOFTFLOAT_68K
| `b' is a signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/
-static floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b, float_status *status )
+static inline floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b, float_status *status )
{
flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
+++ /dev/null
-
-
-#define SOFTFLOAT_68K
-
-#include <stdint.h>
-#include <stdlib.h>
-
-/*============================================================================
-
-This C source file is an extension to the SoftFloat IEC/IEEE Floating-point
-Arithmetic Package, Release 2a.
-
-=============================================================================*/
-
-#include "softfloat/softfloat.h"
-#include "softfloat/softfloat-specialize.h"
-
-/*----------------------------------------------------------------------------
-| Methods for detecting special conditions for mathematical functions
-| supported by MC68881 and MC68862 mathematical coprocessor.
-*----------------------------------------------------------------------------*/
-
-#define pi_sig0 LIT64(0xc90fdaa22168c234)
-#define pi_sig1 LIT64(0xc4c6628b80dc1cd1)
-
-#define pi_exp 0x4000
-#define piby2_exp 0x3FFF
-#define piby4_exp 0x3FFE
-
-#define one_exp 0x3FFF
-#define one_sig LIT64(0x8000000000000000)
-
-/*----------------------------------------------------------------------------
- | Arc cosine
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_acos_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF && (uint64_t) (aSig<<1)) {
- return propagateFloatx80NaNOneArg(a, status);
- }
-
- if (aExp > one_exp || (aExp == one_exp && aSig > one_sig)) {
- float_raise(float_flag_invalid, status);
- a.low = floatx80_default_nan_low;
- a.high = floatx80_default_nan_high;
- return a;
- }
-
- if (aExp == 0) {
- if (aSig == 0) return roundAndPackFloatx80(status->floatx80_rounding_precision,
- 0, piby2_exp, pi_sig0, pi_sig1, status);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Arc sine
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_asin_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF && (uint64_t) (aSig<<1)) {
- return propagateFloatx80NaNOneArg(a, status);
- }
-
- if (aExp > one_exp || (aExp == one_exp && aSig > one_sig)) {
- float_raise(float_flag_invalid, status);
- a.low = floatx80_default_nan_low;
- a.high = floatx80_default_nan_high;
- return a;
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(aSign, 0, 0);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Arc tangent
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_atan_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status);
- return roundAndPackFloatx80(status->floatx80_rounding_precision,
- aSign, piby2_exp, pi_sig0, pi_sig1, status);
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(aSign, 0, 0);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Hyperbolic arc tangent
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_atanh_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF && (uint64_t) (aSig<<1)) {
- return propagateFloatx80NaNOneArg(a, status);
- }
-
- if (aExp >= one_exp) {
- if (aExp == one_exp && aSig == one_sig) {
- float_raise(float_flag_divbyzero, status);
- packFloatx80(aSign, 0x7FFF, floatx80_default_infinity_low);
- }
- float_raise(float_flag_invalid, status);
- a.low = floatx80_default_nan_low;
- a.high = floatx80_default_nan_high;
- return a;
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(aSign, 0, 0);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Cosine
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_cos_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status);
- float_raise(float_flag_invalid, status);
- a.low = floatx80_default_nan_low;
- a.high = floatx80_default_nan_high;
- return a;
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(0, one_exp, one_sig);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Hyperbolic cosine
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_cosh_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status);
- return packFloatx80(0, 0x7FFF, floatx80_default_infinity_low);
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(0, one_exp, one_sig);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | e to x
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_etox_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status);
- if (aSign) return packFloatx80(0, 0, 0);
- return packFloatx80(0, 0x7FFF, floatx80_default_infinity_low);
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(0, one_exp, one_sig);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | e to x minus 1
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_etoxm1_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status);
- if (aSign) return packFloatx80(aSign, one_exp, one_sig);
- return packFloatx80(0, 0x7FFF, floatx80_default_infinity_low);
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(aSign, 0, 0);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Log base 10
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_log10_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) propagateFloatx80NaNOneArg(a, status);
- if (aSign == 0)
- return packFloatx80(0, 0x7FFF, floatx80_default_infinity_low);
- }
-
- if (aExp == 0) {
- if (aSig == 0) {
- float_raise(float_flag_divbyzero, status);
- return packFloatx80(1, 0x7FFF, floatx80_default_infinity_low);
- }
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- if (aSign) {
- float_raise(float_flag_invalid, status);
- a.low = floatx80_default_nan_low;
- a.high = floatx80_default_nan_high;
- return a;
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Log base 2
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_log2_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) propagateFloatx80NaNOneArg(a, status);
- if (aSign == 0)
- return packFloatx80(0, 0x7FFF, floatx80_default_infinity_low);
- }
-
- if (aExp == 0) {
- if (aSig == 0) {
- float_raise(float_flag_divbyzero, status);
- return packFloatx80(1, 0x7FFF, floatx80_default_infinity_low);
- }
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- if (aSign) {
- float_raise(float_flag_invalid, status);
- a.low = floatx80_default_nan_low;
- a.high = floatx80_default_nan_high;
- return a;
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Log base e
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_logn_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) propagateFloatx80NaNOneArg(a, status);
- if (aSign == 0)
- return packFloatx80(0, 0x7FFF, floatx80_default_infinity_low);
- }
-
- if (aExp == 0) {
- if (aSig == 0) {
- float_raise(float_flag_divbyzero, status);
- return packFloatx80(1, 0x7FFF, floatx80_default_infinity_low);
- }
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- if (aSign) {
- float_raise(float_flag_invalid, status);
- a.low = floatx80_default_nan_low;
- a.high = floatx80_default_nan_high;
- return a;
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Log base e of x plus 1
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_lognp1_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) propagateFloatx80NaNOneArg(a, status);
- if (aSign) {
- float_raise(float_flag_invalid, status);
- a.low = floatx80_default_nan_low;
- a.high = floatx80_default_nan_high;
- return a;
- }
- return packFloatx80(0, 0x7FFF, floatx80_default_infinity_low);
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(aSign, 0, 0);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- if (aSign && aExp >= one_exp) {
- if (aExp == one_exp && aSig == one_sig) {
- float_raise(float_flag_divbyzero, status);
- packFloatx80(aSign, 0x7FFF, floatx80_default_infinity_low); /* NaN? */
- }
- float_raise(float_flag_invalid, status);
- a.low = floatx80_default_nan_low;
- a.high = floatx80_default_nan_high;
- return a;
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Sine
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_sin_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status);
- float_raise(float_flag_invalid, status);
- a.low = floatx80_default_nan_low;
- a.high = floatx80_default_nan_high;
- return a;
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(aSign, 0, 0);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Hyperbolic sine
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_sinh_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status);
- return packFloatx80(aSign, 0x7FFF, floatx80_default_infinity_low);
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(aSign, 0, 0);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Tangent
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_tan_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status);
- float_raise(float_flag_invalid, status);
- a.low = floatx80_default_nan_low;
- a.high = floatx80_default_nan_high;
- return a;
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(aSign, 0, 0);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | Hyperbolic tangent
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_tanh_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status);
- return packFloatx80(aSign, one_exp, one_sig);
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(aSign, 0, 0);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | 10 to x
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_tentox_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status);
- if (aSign) return packFloatx80(0, 0, 0);
- return packFloatx80(0, 0x7FFF, floatx80_default_infinity_low);
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(0, one_exp, one_sig);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}
-
-/*----------------------------------------------------------------------------
- | 2 to x
- *----------------------------------------------------------------------------*/
-
-floatx80 floatx80_twotox_check(floatx80 a, flag *e, float_status *status)
-{
- flag aSign;
- int32_t aExp;
- uint64_t aSig;
-
- *e = 1;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status);
- if (aSign) return packFloatx80(0, 0, 0);
- return packFloatx80(0, 0x7FFF, floatx80_default_infinity_low);
- }
-
- if (aExp == 0) {
- if (aSig == 0) return packFloatx80(0, one_exp, one_sig);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- *e = 0;
- return a;
-}