/*** *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] * *Revision History: * 03-01-92 GDP written * 04-05-92 GDP calling convention macros * 01-21-93 GJF Removed support for C6-386's _cdecl. * 04-06-93 SKS Replace _CRTAPI1/2 with __cdecl, _CRTVAR1 with nothing * 09-01-93 GJF Merged Cuda and NT SDK versions. * 09-24-93 GJF Removed dummy args from _fpieee_flt prototype. * 01-13-94 RDL Added #ifndef _LANGUAGE_ASSEMBLY for asm includes. * 01-24-94 GJF Merged in 01-13 change above (from crt32 tree on * \\orville\razzle). * 11-03-94 GJF Ensure 8 byte alignment. * 02-11-95 CFW Add _CRTBLD to avoid users getting wrong headers. * 02-14-95 CFW Clean up Mac merge. * 12-14-95 JWM Add "#pragma once". * 02-21-97 GJF Cleaned out obsolete support for _CRTAPI* and _NTSDK. * Also, detab-ed. * 09-30-97 JWM Restored not-so-obsolete _CRTAPI1 support. * 10-07-97 RDL Added IA64. * 09-11-98 JWM Added Katmai exception support. * 05-13-99 PML Remove _CRTAPI1 * 05-17-99 PML Remove all Macintosh support. * 03-01-00 PML Add WNI exception support. * 09-14-00 PML Add alignment for 64-bit, 128-bit types (vs7#160260). * 03-24-01 PML Enable 64-bit/128-bit type alignment on x86. * 06-13-01 PML Compile clean -Za -W4 -Tc (vs7#267063) * ****/ #if _MSC_VER > 1000 /*IFSTRIP=IGN*/ #pragma once #endif #ifndef _INC_FPIEEE #define _INC_FPIEEE #if !defined(_WIN32) #error ERROR: Only Win32 target supported! #endif #ifndef _CRTBLD /* This version of the header files is NOT for user programs. * It is intended for use when building the C runtimes ONLY. * The version intended for public use will not have this message. */ #error ERROR: Use of C runtime library internal header file. #endif /* _CRTBLD */ #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) /* Disable C4324: structure was padded due to __declspec(align()) */ #pragma warning(push) #pragma warning(disable: 4324) #endif /* _MSC_VER */ #ifdef __cplusplus extern "C" { #endif #ifndef _INTERNAL_IFSTRIP_ #include #endif /* _INTERNAL_IFSTRIP_ */ /* Define _CRTIMP */ #ifndef _CRTIMP #ifdef CRTDLL #define _CRTIMP __declspec(dllexport) #else /* ndef CRTDLL */ #ifdef _DLL #define _CRTIMP __declspec(dllimport) #else /* ndef _DLL */ #define _CRTIMP #endif /* _DLL */ #endif /* CRTDLL */ #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 */ #ifndef _INTERNAL_IFSTRIP_ #ifndef __assembler /* MIPS ONLY: Protect from assembler */ #define OP_UNSPEC _FpCodeUnspecified #define OP_ADD _FpCodeAdd #define OP_SUB _FpCodeSubtract #define OP_MUL _FpCodeMultiply #define OP_DIV _FpCodeDivide #define OP_REM _FpCodeRemainder #define OP_COMP _FpCodeCompare #define OP_CVT _FpCodeConvert #define OP_RND _FpCodeRound #define OP_TRUNC _FpCodeTruncate #define OP_EXP _FpCodeExp #define OP_POW _FpCodePow #define OP_LOG _FpCodeLog #define OP_LOG10 _FpCodeLog10 #define OP_SINH _FpCodeSinh #define OP_COSH _FpCodeCosh #define OP_TANH _FpCodeTanh #define OP_ASIN _FpCodeAsin #define OP_ACOS _FpCodeAcos #define OP_ATAN _FpCodeAtan #define OP_ATAN2 _FpCodeAtan2 #define OP_SQRT _FpCodeSquareRoot #define OP_SIN _FpCodeSin #define OP_COS _FpCodeCos #define OP_TAN _FpCodeTan #define OP_CEIL _FpCodeCeil #define OP_FLOOR _FpCodeFloor #define OP_ABS _FpCodeFabs #define OP_MODF _FpCodeModf #define OP_LDEXP _FpCodeLdexp #define OP_CABS _FpCodeCabs #define OP_HYPOT _FpCodeHypot #define OP_FMOD _FpCodeFmod #define OP_FREXP _FpCodeFrexp #define OP_Y0 _FpCodeY0 #define OP_Y1 _FpCodeY1 #define OP_YN _FpCodeYn #define OP_LOGB _FpCodeLogb #define OP_NEXTAFTER _FpCodeNextafter /* XMMI */ #define OP_ADDPS _XMMIAddps #define OP_ADDSS _XMMIAddss #define OP_SUBPS _XMMISubps #define OP_SUBSS _XMMISubss #define OP_MULPS _XMMIMulps #define OP_MULSS _XMMIMulss #define OP_DIVPS _XMMIDivps #define OP_DIVSS _XMMIDivss #define OP_SQRTPS _XMMISqrtps #define OP_SQRTSS _XMMISqrtss #define OP_MAXPS _XMMIMaxps #define OP_MAXSS _XMMIMaxss #define OP_MINPS _XMMIMinps #define OP_MINSS _XMMIMinss #define OP_CMPPS _XMMICmpps #define OP_CMPSS _XMMICmpss #define OP_COMISS _XMMIComiss #define OP_UCOMISS _XMMIUComiss #define OP_CVTPI2PS _XMMICvtpi2ps #define OP_CVTSI2SS _XMMICvtsi2ss #define OP_CVTPS2PI _XMMICvtps2pi #define OP_CVTSS2SI _XMMICvtss2si #define OP_CVTTPS2PI _XMMICvttps2pi #define OP_CVTTSS2SI _XMMICvttss2si /* XMMI */ /* XMMI2 */ #define OP_ADDPD _XMMI2Addpd /* XMMI2 */ #define OP_ADDSD _XMMI2Addsd #define OP_SUBPD _XMMI2Subpd #define OP_SUBSD _XMMI2Subsd #define OP_MULPD _XMMI2Mulpd #define OP_MULSD _XMMI2Mulsd #define OP_DIVPD _XMMI2Divpd #define OP_DIVSD _XMMI2Divsd #define OP_SQRTPD _XMMI2Sqrtpd #define OP_SQRTSD _XMMI2Sqrtsd #define OP_MAXPD _XMMI2Maxpd #define OP_MAXSD _XMMI2Maxsd #define OP_MINPD _XMMI2Minpd #define OP_MINSD _XMMI2Minsd #define OP_CMPPD _XMMI2Cmppd #define OP_CMPSD _XMMI2Cmpsd #define OP_COMISD _XMMI2Comisd #define OP_UCOMISD _XMMI2UComisd #define OP_CVTPD2PI _XMMI2Cvtpd2pi /* 66 2D */ #define OP_CVTSD2SI _XMMI2Cvtsd2si /* F2 */ #define OP_CVTTPD2PI _XMMI2Cvttpd2pi /* 66 2C */ #define OP_CVTTSD2SI _XMMI2Cvttsd2si /* F2 */ #define OP_CVTPS2PD _XMMI2Cvtps2pd /* 0F 5A */ #define OP_CVTSS2SD _XMMI2Cvtss2sd /* F3 */ #define OP_CVTPD2PS _XMMI2Cvtpd2ps /* 66 */ #define OP_CVTSD2SS _XMMI2Cvtsd2ss /* F2 */ #define OP_CVTDQ2PS _XMMI2Cvtdq2ps /* 0F 5B */ #define OP_CVTTPS2DQ _XMMI2Cvttps2dq /* F3 */ #define OP_CVTPS2DQ _XMMI2Cvtps2dq /* 66 */ #define OP_CVTTPD2DQ _XMMI2Cvttpd2dq /* 66 0F E6 */ #define OP_CVTPD2DQ _XMMI2Cvtpd2dq /* F2 */ /* XMMI2 */ #else /* #ifndef __assembler */ /* This must be the same as the enumerator _FP_OPERATION_CODE ! */ #define OP_UNSPEC 0 #define OP_ADD 1 #define OP_SUB 2 #define OP_MUL 3 #define OP_DIV 4 #define OP_SQRT 5 #define OP_REM 6 #define OP_COMP 7 #define OP_CVT 8 #define OP_RND 9 #define OP_TRUNC 10 #define OP_FLOOR 11 #define OP_CEIL 12 #define OP_ACOS 13 #define OP_ASIN 14 #define OP_ATAN 15 #define OP_ATAN2 16 #define OP_CABS 17 #define OP_COS 18 #define OP_COSH 19 #define OP_EXP 20 #define OP_ABS 21 /* same as OP_FABS */ #define OP_FABS 21 /* same as OP_ABS */ #define OP_FMOD 22 #define OP_FREXP 23 #define OP_HYPOT 24 #define OP_LDEXP 25 #define OP_LOG 26 #define OP_LOG10 27 #define OP_MODF 28 #define OP_POW 29 #define OP_SIN 30 #define OP_SINH 31 #define OP_TAN 32 #define OP_TANH 33 #define OP_Y0 34 #define OP_Y1 35 #define OP_YN 36 #define OP_LOGB 37 #define OP_NEXTAFTER 38 #define OP_NEG 39 #endif /* #ifndef __assembler */ #endif /* _INTERNAL_IFSTRIP_ */ /* * 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; #ifndef _INTERNAL_IFSTRIP_ typedef struct { unsigned long W[4]; } _U32ARRAY; #endif /* _INTERNAL_IFSTRIP_ */ 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; #ifndef _INTERNAL_IFSTRIP_ _U32ARRAY U32ArrayValue; #endif /* _INTERNAL_IFSTRIP_ */ _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 warning(pop) #pragma pack(pop) #endif /* _MSC_VER */ #endif /* #ifndef __assembler */ #endif /* _INC_FPIEEE */