mirror of
https://github.com/reactos/reactos.git
synced 2025-05-17 16:27:00 +00:00

Imported from https://www.nuget.org/packages/Microsoft.Windows.SDK.CRTSource/10.0.22621.3 License: MIT
478 lines
13 KiB
C
478 lines
13 KiB
C
//
|
|
// fpieee.h
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// This file contains constant and type definitions for handling floating point
|
|
// exceptions (IEEE 754).
|
|
//
|
|
#pragma once
|
|
#ifndef _INC_FPIEEE // include guard for 3rd party interop
|
|
#define _INC_FPIEEE
|
|
|
|
#ifndef __midl
|
|
|
|
#ifdef _M_CEE_PURE
|
|
#error ERROR: This file is not supported in the pure mode!
|
|
#endif
|
|
|
|
#include <corecrt.h>
|
|
|
|
#pragma warning(push)
|
|
#pragma warning(disable: _UCRT_DISABLED_WARNINGS)
|
|
_UCRT_DISABLE_CLANG_WARNINGS
|
|
|
|
_CRT_BEGIN_C_HEADER
|
|
|
|
|
|
|
|
#ifndef __assembler
|
|
|
|
// 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.
|
|
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,
|
|
_XMMIAddsubps, // XMMI for PNI
|
|
_XMMIHaddps, // XMMI for PNI
|
|
_XMMIHsubps, // XMMI for PNI
|
|
_XMMIRoundps, // 66 0F 3A 08
|
|
_XMMIRoundss, // 66 0F 3A 0A
|
|
_XMMIDpps, // 66 0F 3A 40
|
|
_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
|
|
_XMMI2Addsubpd, // 66 0F D0
|
|
_XMMI2Haddpd, // 66 0F 7C
|
|
_XMMI2Hsubpd, // 66 0F 7D
|
|
_XMMI2Roundpd, // 66 0F 3A 09
|
|
_XMMI2Roundsd, // 66 0F 3A 0B
|
|
_XMMI2Dppd, // 66 0F 3A 41
|
|
} _FP_OPERATION_CODE;
|
|
|
|
#endif // __assembler
|
|
|
|
#ifdef _CORECRT_BUILD
|
|
#ifndef __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
|
|
#define OP_ADDSUBPS _XMMIAddsubps
|
|
#define OP_HADDPS _XMMIHaddps
|
|
#define OP_HSUBPS _XMMIHsubps
|
|
#define OP_ROUNDPS _XMMIRoundps
|
|
#define OP_ROUNDSS _XMMIRoundss
|
|
#define OP_DPPS _XMMIDpps
|
|
// 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
|
|
#define OP_ADDSUBPD _XMMI2Addsubpd // 66 0F D0
|
|
#define OP_HADDPD _XMMI2Haddpd // 66 0F 7C
|
|
#define OP_HSUBPD _XMMI2Hsubpd // 66 0F 7D
|
|
#define OP_ROUNDPD _XMMI2Roundpd // 66 0F 3A 09
|
|
#define OP_ROUNDSD _XMMI2Roundsd // 66 0F 3A 0B
|
|
#define OP_DPPD _XMMI2Dppd // 66 0F 3A 41
|
|
// XMMI2
|
|
|
|
#else // __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 // __assembler
|
|
#endif // _CORECRT_BUILD
|
|
|
|
// Define rounding modes.
|
|
#ifndef __assembler
|
|
|
|
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 __int64 _Q64;
|
|
|
|
#ifdef _CORECRT_BUILD
|
|
typedef struct
|
|
{
|
|
unsigned long W[4];
|
|
} _U32ARRAY;
|
|
#endif
|
|
|
|
typedef struct
|
|
{
|
|
unsigned short W[5];
|
|
} _FP80;
|
|
|
|
typedef struct _CRT_ALIGN(16)
|
|
{
|
|
unsigned long W[4];
|
|
} _FP128;
|
|
|
|
typedef struct _CRT_ALIGN(8)
|
|
{
|
|
unsigned long W[2];
|
|
} _I64;
|
|
|
|
typedef struct _CRT_ALIGN(8)
|
|
{
|
|
unsigned long W[2];
|
|
} _U64;
|
|
|
|
typedef struct
|
|
{
|
|
unsigned short W[5];
|
|
} _BCD80;
|
|
|
|
typedef struct _CRT_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;
|
|
#ifdef _CORECRT_BUILD
|
|
_U32ARRAY U32ArrayValue;
|
|
#endif
|
|
_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;
|
|
} _FPIEEE_RECORD, *_PFPIEEE_RECORD;
|
|
|
|
|
|
struct _EXCEPTION_POINTERS;
|
|
|
|
typedef int (__cdecl* _FpieeFltHandlerType)(_FPIEEE_RECORD*);
|
|
|
|
// Floating point IEEE exception filter routine
|
|
_ACRTIMP int __cdecl _fpieee_flt(
|
|
_In_ unsigned long _ExceptionCode,
|
|
_In_ struct _EXCEPTION_POINTERS* _PtExceptionPtr,
|
|
_In_ _FpieeFltHandlerType _Handler
|
|
);
|
|
|
|
#endif // __assembler
|
|
|
|
_CRT_END_C_HEADER
|
|
|
|
_UCRT_RESTORE_CLANG_WARNINGS
|
|
#pragma warning(pop) // _UCRT_DISABLED_WARNINGS
|
|
#endif // __midl
|
|
#endif // _INC_FPIEEE
|