Sync with trunk r43123
[reactos.git] / reactos / subsystems / win32 / win32k / include / floatobj.h
1 #ifndef _WIN32K_FLOATOBJ_H_
2 #define _WIN32K_FLOATOBJ_H_
3
4 #if defined(_X86_)
5
6 FORCEINLINE
7 BOOL
8 _FLOATOBJ_Equal(FLOATOBJ *pf1, FLOATOBJ *pf2)
9 {
10 EFLOAT_S *pef1 = (EFLOAT_S*)pf1;
11 EFLOAT_S *pef2 = (EFLOAT_S*)pf2;
12 return (pef1->lMant == pef2->lMant && pef1->lExp == pef2->lExp);
13 }
14
15 FORCEINLINE
16 LONG
17 _FLOATOBJ_GetLong(FLOATOBJ *pf)
18 {
19 EFLOAT_S *pef = (EFLOAT_S*)pf;
20 return pef->lMant >> (32 - pef->lExp);
21 }
22
23 FORCEINLINE
24 LONG
25 _FLOATOBJ_GetFix(FLOATOBJ *pf)
26 {
27 EFLOAT_S *pef = (EFLOAT_S*)pf;
28 LONG Shift = (28 - pef->lExp);
29 return (Shift >= 0 ? pef->lMant >> Shift : pef->lMant << -Shift);
30 }
31
32 FORCEINLINE
33 BOOL
34 _FLOATOBJ_IsLong(FLOATOBJ *pf)
35 {
36 EFLOAT_S *pef = (EFLOAT_S*)pf;
37 ULONG Shift = 32 - pef->lExp;
38 if (Shift > 31) return FALSE;
39 return (((pef->lMant >> Shift) << Shift) == pef->lMant);
40 }
41
42 FORCEINLINE
43 BOOL
44 _FLOATOBJ_Equal0(FLOATOBJ *pf)
45 {
46 EFLOAT_S *pef = (EFLOAT_S*)pf;
47 return (pef->lMant == 0 && pef->lExp == 0);
48 }
49
50 FORCEINLINE
51 BOOL
52 _FLOATOBJ_Equal1(FLOATOBJ *pf)
53 {
54 EFLOAT_S *pef = (EFLOAT_S*)pf;
55 return (pef->lMant == 0x40000000 && pef->lExp == 2);
56 }
57
58 #define FLOATOBJ_Set0(fo) (fo)->ul1 = 0; (fo)->ul2 = 0;
59 #define FLOATOBJ_Set1(fo) (fo)->ul1 = 0x40000000; (fo)->ul2 = 2;
60
61 #else
62
63 #define _FLOATOBJ_Equal(pf,pf1) (*(pf) == *(pf1))
64 #define _FLOATOBJ_GetLong(pf) ((LONG)*(pf))
65 #define _FLOATOBJ_IsLong(pf) ((FLOAT)((LONG)*(pf)) == *(pf))
66 #define _FLOATOBJ_Equal0(pf) (*(pf) == 0.)
67 #define _FLOATOBJ_Equal1(pf) (*(pf) == 1.)
68 #define _FLOATOBJ_GetFix(pf) ((LONG)(*(pf) * 16.))
69
70 #define FLOATOBJ_Set0(fo) *(fo) = 0;
71 #define FLOATOBJ_Set1(fo) *(fo) = 1;
72
73 #endif
74
75 #endif /* not _WIN32K_FLOATOBJ_H_ */