2025-04-27 07:49:33 -04:00

216 lines
6.1 KiB
C

/*[
* Name: host_npx.h
*
* SCCS ID: @(#)cfpu_def.h 1.13 10/13/94
*
* Purpose: More dodgy, non-portable structures!
*
* (C) Copyright Insignia Solutions, 1994.
]*/
typedef double FPH;
#define FPHOST FP64
#define HOST_MAX_EXP 2047
#if !defined(HOST_BIAS)
#define HOST_BIAS 1023
#endif
typedef struct {
IU32 sign:1;
IU32 exp:8;
IU32 mant:23;
} FP32;
typedef struct {
IU32 sign:1;
IU32 exp:11;
IU32 mant_hi:20;
} FP64HI;
typedef struct {
IU16 sign:1;
IU16 exp:15;
} FP80SE;
//#ifdef BIGEND
typedef struct {
FP64HI hiword;
IU32 mant_lo;
} FP64;
typedef struct {
IS32 high_word;
IU32 low_word;
} FPU_I64;
/*
* The format of an FP80 has to be
* struct { IU64 mant; IU16 sign_exp }
* to match the Acpu.
*/
typedef struct {
IU32 mant_hi;
IU32 mant_lo;
FP80SE sign_exp;
} FP80;
//#endif
/* HOST_ values are based on a byte ordering where 0 represents the first
* byte. They are used to copy n-byte values represented in bigendian-order
* to a host memory location in host-order. The definition is therefore
* determined by whether the host is bigendian or littleendian.
*/
#ifdef BIGEND
/* Format for double precision on bigendian host */
#define HOST_R64_BYTE_0 0
#define HOST_R64_BYTE_1 1
#define HOST_R64_BYTE_2 2
#define HOST_R64_BYTE_3 3
#define HOST_R64_BYTE_4 4
#define HOST_R64_BYTE_5 5
#define HOST_R64_BYTE_6 6
#define HOST_R64_BYTE_7 7
/* Format for internal representation of an R80 on bigendian host */
/* This reflects the struct { IU64 mant; IU16 sign_exp } format of FP80 */
#define HOST_R80_BYTE_0 8
#define HOST_R80_BYTE_1 9
#define HOST_R80_BYTE_2 0
#define HOST_R80_BYTE_3 1
#define HOST_R80_BYTE_4 2
#define HOST_R80_BYTE_5 3
#define HOST_R80_BYTE_6 4
#define HOST_R80_BYTE_7 5
#define HOST_R80_BYTE_8 6
#define HOST_R80_BYTE_9 7
#define NPX_LOW_32_BITS 1
#define NPX_HIGH_32_BITS 0
#endif /* BIGEND */
#ifdef LITTLEND
/* Format for double precision on littleendian host */
#define HOST_R64_BYTE_0 7
#define HOST_R64_BYTE_1 6
#define HOST_R64_BYTE_2 5
#define HOST_R64_BYTE_3 4
#define HOST_R64_BYTE_4 3
#define HOST_R64_BYTE_5 2
#define HOST_R64_BYTE_6 1
#define HOST_R64_BYTE_7 0
/* Format for internal representation of an R80 on littleendian host */
#define HOST_R80_BYTE_0 9
#define HOST_R80_BYTE_1 8
#define HOST_R80_BYTE_2 7
#define HOST_R80_BYTE_3 6
#define HOST_R80_BYTE_4 5
#define HOST_R80_BYTE_5 4
#define HOST_R80_BYTE_6 3
#define HOST_R80_BYTE_7 2
#define HOST_R80_BYTE_8 1
#define HOST_R80_BYTE_9 0
#define NPX_LOW_32_BITS 0
#define NPX_HIGH_32_BITS 1
#endif /* LITTLEND */
#ifdef NTVDM
#include <float.h>
#define HostGetOverflowException() (_controlfp(0, 0) & _EM_OVERFLOW)
#define HostGetUnderflowException() (_controlfp(0, 0) & _EM_UNDERFLOW)
#define HostGetPrecisionException() (_controlfp(0, 0) & _EM_INEXACT)
#define HostClearExceptions() ((VOID)_controlfp(0, _MCW_EM))
#define HostSetRoundToNearest() ((VOID)_controlfp(_RC_NEAR, _MCW_RC))
#define HostSetRoundDown() ((VOID)_controlfp(_RC_DOWN, _MCW_RC))
#define HostSetRoundUp() ((VOID)_controlfp(_RC_UP, _MCW_RC))
#define HostSetRoundToZero() ((VOID)_controlfp(_RC_CHOP, _MCW_RC))
/*************************************/
#define HUGE_VAL 1.8e308
/*
* Useful mathmatical constants:
*
* M_E - e
* M_LOG2E - log2(e)
* M_LOG10E - log10(e)
* M_LN2 - ln(2)
* M_LN10 - ln(10)
* M_PI - pi
* M_PI_2 - pi/2
* M_PI_4 - pi/4
* M_1_PI - 1/pi
* M_2_PI - 2/pi
* M_2_SQRTPI - 2/sqrt(pi)
* M_SQRT2 - sqrt(2)
* M_SQRT1_2 - 1/sqrt(2)
*/
#define M_E 2.7182818284590452354E0 /*Hex 2^ 0 * 1.5bf0a8b145769 */
#define M_LOG2E 1.4426950408889634074E0 /*Hex 2^ 0 * 1.71547652B82FE */
#define M_LOG10E 4.3429448190325182765E-1 /*Hex 2^-2 * 1.BCB7B1526E50E */
#define M_LN2 6.9314718055994530942E-1 /*Hex 2^-1 * 1.62E42FEFA39EF */
#define M_LN10 2.3025850929940456840E0 /*Hex 2^ 1 * 1.26bb1bbb55516 */
#define M_PI 3.1415926535897932385E0 /*Hex 2^ 1 * 1.921FB54442D18 */
#define M_PI_2 1.5707963267948966192E0 /*Hex 2^ 0 * 1.921FB54442D18 */
#define M_PI_4 7.8539816339744830962E-1 /*Hex 2^-1 * 1.921FB54442D18 */
#define M_1_PI 3.1830988618379067154E-1 /*Hex 2^-2 * 1.45f306dc9c883 */
#define M_2_PI 6.3661977236758134308E-1 /*Hex 2^-1 * 1.45f306dc9c883 */
#define M_2_SQRTPI 1.1283791670955125739E0 /*Hex 2^ 0 * 1.20dd750429b6d */
#define M_SQRT2 1.4142135623730950488E0 /*Hex 2^ 0 * 1.6A09E667F3BCD */
#define M_SQRT1_2 7.0710678118654752440E-1 /*Hex 2^-1 * 1.6a09e667f3bcd */
#define MAXFLOAT ((float)3.40282346638528860e+38)
# define HUGE 1.8e308
#define M_2PI 6.2831853071795864769E0 /*Hex 2^ 2 * 1.921FB54442D18 */
/* This is the nearest number to the cube root of MAXDOUBLE that */
/* doesn't cause the cube of it to overflow. */
/* In double precision hex this constant is: 554428a2 f98d728a */
#define CUBRTHUGE 5.6438030941223618e102
#define INV_CUBRTHUGE 1.7718548704178434e-103
#else /* !NTVDM */
#define HostGetOverflowException() (fpgetsticky() & FP_X_OFL)
#define HostGetUnderflowException() (fpgetsticky() & FP_X_UFL)
#define HostGetPrecisionException() (fpgetsticky() & FP_X_IMP)
#define HostClearExceptions() ((VOID)fpsetsticky(FP_X_CLEAR))
#define HostSetRoundToNearest() ((VOID)fpsetround(FP_RN))
#define HostSetRoundDown() ((VOID)fpsetround(FP_RM))
#define HostSetRoundUp() ((VOID)fpsetround(FP_RP))
#define HostSetRoundToZero() ((VOID)fpsetround(FP_RZ))
#endif /* !NTVDM */
#ifndef _Fpu_c_h
/* These definitions are for the Ccpu NPX only: in circumstances
* where both the C NPX and the Assembler NPX are accessed, these
* definitions should be excluded in favour of the generated ones in
* Fpu_c.h, hence the #ifndef above.
*/
typedef struct {
FPH fpvalue;
IUH padding; /* To allow at least 10 bytes for unconverted formats */
IUH tagvalue;
} FPSTACKENTRY;
#endif