Reactos
1//
2// fpieee.h
3//
4// Copyright (c) Microsoft Corporation. All rights reserved.
5//
6// This file contains constant and type definitions for handling floating point
7// exceptions (IEEE 754).
8//
9#pragma once
10#ifndef _INC_FPIEEE // include guard for 3rd party interop
11#define _INC_FPIEEE
12
13#ifndef __midl
14
15#ifdef _M_CEE_PURE
16 #error ERROR: This file is not supported in the pure mode!
17#endif
18
19#include <corecrt.h>
20
21#pragma warning(push)
22#pragma warning(disable: _UCRT_DISABLED_WARNINGS)
23_UCRT_DISABLE_CLANG_WARNINGS
24
25_CRT_BEGIN_C_HEADER
26
27
28
29#ifndef __assembler
30
31 // Define floating point IEEE compare result values.
32 typedef enum
33 {
34 _FpCompareEqual,
35 _FpCompareGreater,
36 _FpCompareLess,
37 _FpCompareUnordered
38 } _FPIEEE_COMPARE_RESULT;
39
40 // Define floating point format and result precision values.
41 typedef enum
42 {
43 _FpFormatFp32,
44 _FpFormatFp64,
45 _FpFormatFp80,
46 _FpFormatFp128,
47 _FpFormatI16,
48 _FpFormatI32,
49 _FpFormatI64,
50 _FpFormatU16,
51 _FpFormatU32,
52 _FpFormatU64,
53 _FpFormatBcd80,
54 _FpFormatCompare,
55 _FpFormatString,
56 } _FPIEEE_FORMAT;
57
58 // Define operation code values.
59 typedef enum
60 {
61 _FpCodeUnspecified,
62 _FpCodeAdd,
63 _FpCodeSubtract,
64 _FpCodeMultiply,
65 _FpCodeDivide,
66 _FpCodeSquareRoot,
67 _FpCodeRemainder,
68 _FpCodeCompare,
69 _FpCodeConvert,
70 _FpCodeRound,
71 _FpCodeTruncate,
72 _FpCodeFloor,
73 _FpCodeCeil,
74 _FpCodeAcos,
75 _FpCodeAsin,
76 _FpCodeAtan,
77 _FpCodeAtan2,
78 _FpCodeCabs,
79 _FpCodeCos,
80 _FpCodeCosh,
81 _FpCodeExp,
82 _FpCodeFabs,
83 _FpCodeFmod,
84 _FpCodeFrexp,
85 _FpCodeHypot,
86 _FpCodeLdexp,
87 _FpCodeLog,
88 _FpCodeLog10,
89 _FpCodeModf,
90 _FpCodePow,
91 _FpCodeSin,
92 _FpCodeSinh,
93 _FpCodeTan,
94 _FpCodeTanh,
95 _FpCodeY0,
96 _FpCodeY1,
97 _FpCodeYn,
98 _FpCodeLogb,
99 _FpCodeNextafter,
100 _FpCodeNegate,
101 _FpCodeFmin, // XMMI
102 _FpCodeFmax, // XMMI
103 _FpCodeConvertTrunc, // XMMI
104 _XMMIAddps, // XMMI
105 _XMMIAddss,
106 _XMMISubps,
107 _XMMISubss,
108 _XMMIMulps,
109 _XMMIMulss,
110 _XMMIDivps,
111 _XMMIDivss,
112 _XMMISqrtps,
113 _XMMISqrtss,
114 _XMMIMaxps,
115 _XMMIMaxss,
116 _XMMIMinps,
117 _XMMIMinss,
118 _XMMICmpps,
119 _XMMICmpss,
120 _XMMIComiss,
121 _XMMIUComiss,
122 _XMMICvtpi2ps,
123 _XMMICvtsi2ss,
124 _XMMICvtps2pi,
125 _XMMICvtss2si,
126 _XMMICvttps2pi,
127 _XMMICvttss2si,
128 _XMMIAddsubps, // XMMI for PNI
129 _XMMIHaddps, // XMMI for PNI
130 _XMMIHsubps, // XMMI for PNI
131 _XMMIRoundps, // 66 0F 3A 08
132 _XMMIRoundss, // 66 0F 3A 0A
133 _XMMIDpps, // 66 0F 3A 40
134 _XMMI2Addpd, // XMMI2
135 _XMMI2Addsd,
136 _XMMI2Subpd,
137 _XMMI2Subsd,
138 _XMMI2Mulpd,
139 _XMMI2Mulsd,
140 _XMMI2Divpd,
141 _XMMI2Divsd,
142 _XMMI2Sqrtpd,
143 _XMMI2Sqrtsd,
144 _XMMI2Maxpd,
145 _XMMI2Maxsd,
146 _XMMI2Minpd,
147 _XMMI2Minsd,
148 _XMMI2Cmppd,
149 _XMMI2Cmpsd,
150 _XMMI2Comisd,
151 _XMMI2UComisd,
152 _XMMI2Cvtpd2pi, // 66 2D
153 _XMMI2Cvtsd2si, // F2
154 _XMMI2Cvttpd2pi, // 66 2C
155 _XMMI2Cvttsd2si, // F2
156 _XMMI2Cvtps2pd, // 0F 5A
157 _XMMI2Cvtss2sd, // F3
158 _XMMI2Cvtpd2ps, // 66
159 _XMMI2Cvtsd2ss, // F2
160 _XMMI2Cvtdq2ps, // 0F 5B
161 _XMMI2Cvttps2dq, // F3
162 _XMMI2Cvtps2dq, // 66
163 _XMMI2Cvttpd2dq, // 66 0F E6
164 _XMMI2Cvtpd2dq, // F2
165 _XMMI2Addsubpd, // 66 0F D0
166 _XMMI2Haddpd, // 66 0F 7C
167 _XMMI2Hsubpd, // 66 0F 7D
168 _XMMI2Roundpd, // 66 0F 3A 09
169 _XMMI2Roundsd, // 66 0F 3A 0B
170 _XMMI2Dppd, // 66 0F 3A 41
171 } _FP_OPERATION_CODE;
172
173#endif // __assembler
174
175#ifdef _CORECRT_BUILD
176 #ifndef __assembler
177
178 #define OP_UNSPEC _FpCodeUnspecified
179 #define OP_ADD _FpCodeAdd
180 #define OP_SUB _FpCodeSubtract
181 #define OP_MUL _FpCodeMultiply
182 #define OP_DIV _FpCodeDivide
183 #define OP_REM _FpCodeRemainder
184 #define OP_COMP _FpCodeCompare
185 #define OP_CVT _FpCodeConvert
186 #define OP_RND _FpCodeRound
187 #define OP_TRUNC _FpCodeTruncate
188
189 #define OP_EXP _FpCodeExp
190
191 #define OP_POW _FpCodePow
192 #define OP_LOG _FpCodeLog
193 #define OP_LOG10 _FpCodeLog10
194 #define OP_SINH _FpCodeSinh
195 #define OP_COSH _FpCodeCosh
196 #define OP_TANH _FpCodeTanh
197 #define OP_ASIN _FpCodeAsin
198 #define OP_ACOS _FpCodeAcos
199 #define OP_ATAN _FpCodeAtan
200 #define OP_ATAN2 _FpCodeAtan2
201 #define OP_SQRT _FpCodeSquareRoot
202 #define OP_SIN _FpCodeSin
203 #define OP_COS _FpCodeCos
204 #define OP_TAN _FpCodeTan
205 #define OP_CEIL _FpCodeCeil
206 #define OP_FLOOR _FpCodeFloor
207 #define OP_ABS _FpCodeFabs
208 #define OP_MODF _FpCodeModf
209 #define OP_LDEXP _FpCodeLdexp
210 #define OP_CABS _FpCodeCabs
211 #define OP_HYPOT _FpCodeHypot
212 #define OP_FMOD _FpCodeFmod
213 #define OP_FREXP _FpCodeFrexp
214 #define OP_Y0 _FpCodeY0
215 #define OP_Y1 _FpCodeY1
216 #define OP_YN _FpCodeYn
217
218 #define OP_LOGB _FpCodeLogb
219 #define OP_NEXTAFTER _FpCodeNextafter
220
221 // XMMI
222 #define OP_ADDPS _XMMIAddps
223 #define OP_ADDSS _XMMIAddss
224 #define OP_SUBPS _XMMISubps
225 #define OP_SUBSS _XMMISubss
226 #define OP_MULPS _XMMIMulps
227 #define OP_MULSS _XMMIMulss
228 #define OP_DIVPS _XMMIDivps
229 #define OP_DIVSS _XMMIDivss
230 #define OP_SQRTPS _XMMISqrtps
231 #define OP_SQRTSS _XMMISqrtss
232 #define OP_MAXPS _XMMIMaxps
233 #define OP_MAXSS _XMMIMaxss
234 #define OP_MINPS _XMMIMinps
235 #define OP_MINSS _XMMIMinss
236 #define OP_CMPPS _XMMICmpps
237 #define OP_CMPSS _XMMICmpss
238 #define OP_COMISS _XMMIComiss
239 #define OP_UCOMISS _XMMIUComiss
240 #define OP_CVTPI2PS _XMMICvtpi2ps
241 #define OP_CVTSI2SS _XMMICvtsi2ss
242 #define OP_CVTPS2PI _XMMICvtps2pi
243 #define OP_CVTSS2SI _XMMICvtss2si
244 #define OP_CVTTPS2PI _XMMICvttps2pi
245 #define OP_CVTTSS2SI _XMMICvttss2si
246 #define OP_ADDSUBPS _XMMIAddsubps
247 #define OP_HADDPS _XMMIHaddps
248 #define OP_HSUBPS _XMMIHsubps
249 #define OP_ROUNDPS _XMMIRoundps
250 #define OP_ROUNDSS _XMMIRoundss
251 #define OP_DPPS _XMMIDpps
252 // XMMI
253
254 // XMMI2
255 #define OP_ADDPD _XMMI2Addpd // XMMI2
256 #define OP_ADDSD _XMMI2Addsd
257 #define OP_SUBPD _XMMI2Subpd
258 #define OP_SUBSD _XMMI2Subsd
259 #define OP_MULPD _XMMI2Mulpd
260 #define OP_MULSD _XMMI2Mulsd
261 #define OP_DIVPD _XMMI2Divpd
262 #define OP_DIVSD _XMMI2Divsd
263 #define OP_SQRTPD _XMMI2Sqrtpd
264 #define OP_SQRTSD _XMMI2Sqrtsd
265 #define OP_MAXPD _XMMI2Maxpd
266 #define OP_MAXSD _XMMI2Maxsd
267 #define OP_MINPD _XMMI2Minpd
268 #define OP_MINSD _XMMI2Minsd
269 #define OP_CMPPD _XMMI2Cmppd
270 #define OP_CMPSD _XMMI2Cmpsd
271 #define OP_COMISD _XMMI2Comisd
272 #define OP_UCOMISD _XMMI2UComisd
273 #define OP_CVTPD2PI _XMMI2Cvtpd2pi // 66 2D
274 #define OP_CVTSD2SI _XMMI2Cvtsd2si // F2
275 #define OP_CVTTPD2PI _XMMI2Cvttpd2pi // 66 2C
276 #define OP_CVTTSD2SI _XMMI2Cvttsd2si // F2
277 #define OP_CVTPS2PD _XMMI2Cvtps2pd // 0F 5A
278 #define OP_CVTSS2SD _XMMI2Cvtss2sd // F3
279 #define OP_CVTPD2PS _XMMI2Cvtpd2ps // 66
280 #define OP_CVTSD2SS _XMMI2Cvtsd2ss // F2
281 #define OP_CVTDQ2PS _XMMI2Cvtdq2ps // 0F 5B
282 #define OP_CVTTPS2DQ _XMMI2Cvttps2dq // F3
283 #define OP_CVTPS2DQ _XMMI2Cvtps2dq // 66
284 #define OP_CVTTPD2DQ _XMMI2Cvttpd2dq // 66 0F E6
285 #define OP_CVTPD2DQ _XMMI2Cvtpd2dq // F2
286 #define OP_ADDSUBPD _XMMI2Addsubpd // 66 0F D0
287 #define OP_HADDPD _XMMI2Haddpd // 66 0F 7C
288 #define OP_HSUBPD _XMMI2Hsubpd // 66 0F 7D
289 #define OP_ROUNDPD _XMMI2Roundpd // 66 0F 3A 09
290 #define OP_ROUNDSD _XMMI2Roundsd // 66 0F 3A 0B
291 #define OP_DPPD _XMMI2Dppd // 66 0F 3A 41
292 // XMMI2
293
294 #else // __assembler
295
296 // This must be the same as the enumerator _FP_OPERATION_CODE
297 #define OP_UNSPEC 0
298 #define OP_ADD 1
299 #define OP_SUB 2
300 #define OP_MUL 3
301 #define OP_DIV 4
302 #define OP_SQRT 5
303 #define OP_REM 6
304 #define OP_COMP 7
305 #define OP_CVT 8
306 #define OP_RND 9
307 #define OP_TRUNC 10
308 #define OP_FLOOR 11
309 #define OP_CEIL 12
310 #define OP_ACOS 13
311 #define OP_ASIN 14
312 #define OP_ATAN 15
313 #define OP_ATAN2 16
314 #define OP_CABS 17
315 #define OP_COS 18
316 #define OP_COSH 19
317 #define OP_EXP 20
318 #define OP_ABS 21 // same as OP_FABS
319 #define OP_FABS 21 // same as OP_ABS
320 #define OP_FMOD 22
321 #define OP_FREXP 23
322 #define OP_HYPOT 24
323 #define OP_LDEXP 25
324 #define OP_LOG 26
325 #define OP_LOG10 27
326 #define OP_MODF 28
327 #define OP_POW 29
328 #define OP_SIN 30
329 #define OP_SINH 31
330 #define OP_TAN 32
331 #define OP_TANH 33
332 #define OP_Y0 34
333 #define OP_Y1 35
334 #define OP_YN 36
335 #define OP_LOGB 37
336 #define OP_NEXTAFTER 38
337 #define OP_NEG 39
338
339 #endif // __assembler
340#endif // _CORECRT_BUILD
341
342// Define rounding modes.
343#ifndef __assembler
344
345 typedef enum
346 {
347 _FpRoundNearest,
348 _FpRoundMinusInfinity,
349 _FpRoundPlusInfinity,
350 _FpRoundChopped
351 } _FPIEEE_ROUNDING_MODE;
352
353 typedef enum
354 {
355 _FpPrecisionFull,
356 _FpPrecision53,
357 _FpPrecision24,
358 } _FPIEEE_PRECISION;
359
360
361 // Define floating point context record
362 typedef float _FP32;
363 typedef double _FP64;
364 typedef short _I16;
365 typedef int _I32;
366 typedef unsigned short _U16;
367 typedef unsigned int _U32;
368 typedef __int64 _Q64;
369
370 #ifdef _CORECRT_BUILD
371 typedef struct
372 {
373 unsigned long W[4];
374 } _U32ARRAY;
375 #endif
376
377 typedef struct
378 {
379 unsigned short W[5];
380 } _FP80;
381
382 typedef struct _CRT_ALIGN(16)
383 {
384 unsigned long W[4];
385 } _FP128;
386
387 typedef struct _CRT_ALIGN(8)
388 {
389 unsigned long W[2];
390 } _I64;
391
392 typedef struct _CRT_ALIGN(8)
393 {
394 unsigned long W[2];
395 } _U64;
396
397 typedef struct
398 {
399 unsigned short W[5];
400 } _BCD80;
401
402 typedef struct _CRT_ALIGN(16)
403 {
404 _Q64 W[2];
405 } _FPQ64;
406
407 typedef struct
408 {
409 union
410 {
411 _FP32 Fp32Value;
412 _FP64 Fp64Value;
413 _FP80 Fp80Value;
414 _FP128 Fp128Value;
415 _I16 I16Value;
416 _I32 I32Value;
417 _I64 I64Value;
418 _U16 U16Value;
419 _U32 U32Value;
420 _U64 U64Value;
421 _BCD80 Bcd80Value;
422 char *StringValue;
423 int CompareValue;
424 #ifdef _CORECRT_BUILD
425 _U32ARRAY U32ArrayValue;
426 #endif
427 _Q64 Q64Value;
428 _FPQ64 Fpq64Value;
429 } Value;
430
431 unsigned int OperandValid : 1;
432 unsigned int Format : 4;
433
434 } _FPIEEE_VALUE;
435
436 typedef struct
437 {
438 unsigned int Inexact : 1;
439 unsigned int Underflow : 1;
440 unsigned int Overflow : 1;
441 unsigned int ZeroDivide : 1;
442 unsigned int InvalidOperation : 1;
443 } _FPIEEE_EXCEPTION_FLAGS;
444
445
446 typedef struct
447 {
448 unsigned int RoundingMode : 2;
449 unsigned int Precision : 3;
450 unsigned int Operation : 12;
451 _FPIEEE_EXCEPTION_FLAGS Cause;
452 _FPIEEE_EXCEPTION_FLAGS Enable;
453 _FPIEEE_EXCEPTION_FLAGS Status;
454 _FPIEEE_VALUE Operand1;
455 _FPIEEE_VALUE Operand2;
456 _FPIEEE_VALUE Result;
457 } _FPIEEE_RECORD, *_PFPIEEE_RECORD;
458
459
460 struct _EXCEPTION_POINTERS;
461
462 typedef int (__cdecl* _FpieeFltHandlerType)(_FPIEEE_RECORD*);
463
464 // Floating point IEEE exception filter routine
465 _ACRTIMP int __cdecl _fpieee_flt(
466 _In_ unsigned long _ExceptionCode,
467 _In_ struct _EXCEPTION_POINTERS* _PtExceptionPtr,
468 _In_ _FpieeFltHandlerType _Handler
469 );
470
471#endif // __assembler
472
473_CRT_END_C_HEADER
474
475_UCRT_RESTORE_CLANG_WARNINGS
476#pragma warning(pop) // _UCRT_DISABLED_WARNINGS
477#endif // __midl
478#endif // _INC_FPIEEE