|
|
/***
*fpieee.h - Definitions for floating point IEEE exception handling * * Copyright (c) 1991-2001, Microsoft Corporation. All rights reserved. * *Purpose: * This file contains constant and type definitions for handling * floating point exceptions [ANSI/IEEE std. 754] * * [Public] * ****/
#if _MSC_VER > 1000
#pragma once
#endif
#ifndef _INC_FPIEEE
#define _INC_FPIEEE
#if !defined(_WIN32)
#error ERROR: Only Win32 target supported!
#endif
#ifndef __assembler /* MIPS ONLY: Protect from assembler */
#ifdef _MSC_VER
/*
* Currently, all MS C compilers for Win32 platforms default to 8 byte * alignment. */ #pragma pack(push,8)
#endif /* _MSC_VER */
#ifdef __cplusplus
extern "C" { #endif
/* Define _CRTIMP */
#ifndef _CRTIMP
#ifdef _DLL
#define _CRTIMP __declspec(dllimport)
#else /* ndef _DLL */
#define _CRTIMP
#endif /* _DLL */
#endif /* _CRTIMP */
/* Define __cdecl for non-Microsoft compilers */
#if ( !defined(_MSC_VER) && !defined(__cdecl) )
#define __cdecl
#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, #if defined(_M_IA64)
_FpFormatFp82 #endif
} _FPIEEE_FORMAT;
/*
* Define operation code values. */
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, _FpCodeFmin, //XMMI
_FpCodeFmax, //XMMI
_FpCodeConvertTrunc, //XMMI
_XMMIAddps, //XMMI
_XMMIAddss, _XMMISubps, _XMMISubss, _XMMIMulps, _XMMIMulss, _XMMIDivps, _XMMIDivss, _XMMISqrtps, _XMMISqrtss, _XMMIMaxps, _XMMIMaxss, _XMMIMinps, _XMMIMinss, _XMMICmpps, _XMMICmpss, _XMMIComiss, _XMMIUComiss, _XMMICvtpi2ps, _XMMICvtsi2ss, _XMMICvtps2pi, _XMMICvtss2si, _XMMICvttps2pi, _XMMICvttss2si, _XMMI2Addpd, //XMMI2
_XMMI2Addsd, _XMMI2Subpd, _XMMI2Subsd, _XMMI2Mulpd, _XMMI2Mulsd, _XMMI2Divpd, _XMMI2Divsd, _XMMI2Sqrtpd, _XMMI2Sqrtsd, _XMMI2Maxpd, _XMMI2Maxsd, _XMMI2Minpd, _XMMI2Minsd, _XMMI2Cmppd, _XMMI2Cmpsd, _XMMI2Comisd, _XMMI2UComisd, _XMMI2Cvtpd2pi, //66 2D
_XMMI2Cvtsd2si, //F2
_XMMI2Cvttpd2pi, //66 2C
_XMMI2Cvttsd2si, //F2
_XMMI2Cvtps2pd, //0F 5A
_XMMI2Cvtss2sd, //F3
_XMMI2Cvtpd2ps, //66
_XMMI2Cvtsd2ss, //F2
_XMMI2Cvtdq2ps, //0F 5B
_XMMI2Cvttps2dq, //F3
_XMMI2Cvtps2dq, //66
_XMMI2Cvttpd2dq, //66 0F E6
_XMMI2Cvtpd2dq, //F2
#if defined(_M_IA64)
_FpCodeFma, _FpCodeFmaSingle, _FpCodeFmaDouble, _FpCodeFms, _FpCodeFmsSingle, _FpCodeFmsDouble, _FpCodeFnma, _FpCodeFnmaSingle, _FpCodeFnmaDouble, _FpCodeFamin, _FpCodeFamax #endif
} _FP_OPERATION_CODE;
#endif /* #ifndef __assembler */
/*
* Define rounding modes. */
#ifndef __assembler /* MIPS ONLY: Protect from assembler */
typedef enum { _FpRoundNearest, _FpRoundMinusInfinity, _FpRoundPlusInfinity, _FpRoundChopped } _FPIEEE_ROUNDING_MODE;
typedef enum { _FpPrecisionFull, _FpPrecision53, _FpPrecision24, #if defined(_M_IA64)
_FpPrecision64, _FpPrecision113 #endif
} _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 __int64 _Q64;
typedef struct #if defined(_M_IA64)
__declspec(align(16)) #endif
{ unsigned short W[5]; } _FP80;
typedef struct __declspec(align(16)) { unsigned long W[4]; } _FP128;
typedef struct __declspec(align(8)) { unsigned long W[2]; } _I64;
typedef struct __declspec(align(8)) { unsigned long W[2]; } _U64;
typedef struct #if defined(_M_IA64)
__declspec(align(16)) #endif
{ unsigned short W[5]; } _BCD80;
typedef struct __declspec(align(16)) { _Q64 W[2]; } _FPQ64;
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; _Q64 Q64Value; _FPQ64 Fpq64Value; } 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; #if defined(_M_IA64)
_FPIEEE_VALUE Operand3; #endif
} _FPIEEE_RECORD, *_PFPIEEE_RECORD;
struct _EXCEPTION_POINTERS;
/*
* Floating point IEEE exception filter routine */
_CRTIMP int __cdecl _fpieee_flt( unsigned long, struct _EXCEPTION_POINTERS *, int (__cdecl *)(_FPIEEE_RECORD *) );
#ifdef __cplusplus
} #endif
#ifdef _MSC_VER
#pragma pack(pop)
#endif /* _MSC_VER */
#endif /* #ifndef __assembler */
#endif /* _INC_FPIEEE */
|