/*** * fpieee.h - Definitions for floating point IEEE exception handling * * Copyright (c) 1991-1993, Microsoft Corporation. All rights reserved. * *Purpose: * This file contains constant and type definitions for handling * floating point exceptions [ANSI/IEEE std. 754] * *******************************************************************************/ #ifndef _INC_FPIEEE #ifdef __cplusplus extern "C" { #endif #ifndef _LANGUAGE_ASSEMBLY /* * Conditional macro definition for function calling type and variable type * qualifiers. */ #if ( (_MSC_VER >= 800) && (_M_IX86 >= 300) ) /* * Definitions for MS C8-32 (386/486) compiler */ #define _CRTAPI1 __cdecl #define _CRTAPI2 __cdecl #else /* * Other compilers (e.g., MIPS) */ #define _CRTAPI1 #define _CRTAPI2 #endif /* * Define floating point IEEE compare result values. */ typedef enum { _FpCompareEqual, _FpCompareGreater, _FpCompareLess, _FpCompareUnordered } _FPIEEE_COMPARE_RESULT; /* * Define floating point format and result precision values. */ typedef enum { _FpFormatFp32, _FpFormatFp64, _FpFormatFp80, _FpFormatFp128, _FpFormatI16, _FpFormatI32, _FpFormatI64, _FpFormatU16, _FpFormatU32, _FpFormatU64, _FpFormatBcd80, _FpFormatCompare, _FpFormatString } _FPIEEE_FORMAT; /* * Define operation code values. * * NOTE: If you change this enum, change the #defines below for assembler! */ typedef enum { _FpCodeUnspecified, _FpCodeAdd, _FpCodeSubtract, _FpCodeMultiply, _FpCodeDivide, _FpCodeSquareRoot, _FpCodeRemainder, _FpCodeCompare, _FpCodeConvert, _FpCodeRound, _FpCodeTruncate, _FpCodeFloor, _FpCodeCeil, _FpCodeAcos, _FpCodeAsin, _FpCodeAtan, _FpCodeAtan2, _FpCodeCabs, _FpCodeCos, _FpCodeCosh, _FpCodeExp, _FpCodeFabs, _FpCodeFmod, _FpCodeFrexp, _FpCodeHypot, _FpCodeLdexp, _FpCodeLog, _FpCodeLog10, _FpCodeModf, _FpCodePow, _FpCodeSin, _FpCodeSinh, _FpCodeTan, _FpCodeTanh, _FpCodeY0, _FpCodeY1, _FpCodeYn, _FpCodeLogb, _FpCodeNextafter, _FpCodeNegate } _FP_OPERATION_CODE; #endif /* _LANGUAGE_ASSEMBLY */ /* * Define rounding modes. */ #ifndef _LANGUAGE_ASSEMBLY typedef enum { _FpRoundNearest, _FpRoundMinusInfinity, _FpRoundPlusInfinity, _FpRoundChopped } _FPIEEE_ROUNDING_MODE; typedef enum { _FpPrecisionFull, _FpPrecision53, _FpPrecision24 } _FPIEEE_PRECISION; /* * Define floating point context record */ typedef float _FP32; typedef double _FP64; typedef short _I16; typedef int _I32; typedef unsigned short _U16; typedef unsigned int _U32; typedef struct { unsigned short W[5]; } _FP80; typedef struct { unsigned long W[4]; } _FP128; typedef struct { unsigned long W[2]; } _I64; typedef struct { unsigned long W[2]; } _U64; typedef struct { unsigned short W[5]; } _BCD80; typedef struct { union { _FP32 Fp32Value; _FP64 Fp64Value; _FP80 Fp80Value; _FP128 Fp128Value; _I16 I16Value; _I32 I32Value; _I64 I64Value; _U16 U16Value; _U32 U32Value; _U64 U64Value; _BCD80 Bcd80Value; char *StringValue; int CompareValue; } Value; unsigned int OperandValid : 1; unsigned int Format : 4; } _FPIEEE_VALUE; typedef struct { unsigned int Inexact : 1; unsigned int Underflow : 1; unsigned int Overflow : 1; unsigned int ZeroDivide : 1; unsigned int InvalidOperation : 1; } _FPIEEE_EXCEPTION_FLAGS; typedef struct { unsigned int RoundingMode : 2; unsigned int Precision : 3; unsigned int Operation :12; _FPIEEE_EXCEPTION_FLAGS Cause; _FPIEEE_EXCEPTION_FLAGS Enable; _FPIEEE_EXCEPTION_FLAGS Status; _FPIEEE_VALUE Operand1; _FPIEEE_VALUE Operand2; _FPIEEE_VALUE Result; } _FPIEEE_RECORD; struct _EXCEPTION_POINTERS; /* * Floating point IEEE exception filter routine */ int _CRTAPI1 _fpieee_flt(unsigned long code, struct _EXCEPTION_POINTERS *p, int handler(_FPIEEE_RECORD *)); #endif /* _LANGUAGE_ASSEMBLY */ #ifdef __cplusplus } #endif #define _INC_FPIEEE #endif /* _INC_FPIEEE */