}
#define FLOATOBJ_Equal _FLOATOBJ_Equal
-FORCEINLINE
-LONG
-_FLOATOBJ_GetLong(FLOATOBJ *pf)
-{
- EFLOAT_S *pef = (EFLOAT_S*)pf;
- return pef->lMant >> (32 - pef->lExp);
-}
-#define FLOATOBJ_GetLong _FLOATOBJ_GetLong
-
/*!
* \brief Converts a FLOATOBJ into a LONG by truncating the value to integer
*
*/
FORCEINLINE
BOOL
-FASTCALL
FLOATOBJ_bConvertToLong(FLOATOBJ *pf, PLONG pl)
{
EFLOAT_S *pef = (EFLOAT_S*)pf;
- LONG lShift = 32 - pef->lExp;
- if (lShift < 0)
+
+ if (pef->lExp > 32)
{
return FALSE;
}
- *pl = pef->lMant >> lShift;
+
+ if (pef->lExp < 2)
+ {
+ *pl = 0;
+ return TRUE;
+ }
+
+ *pl = EngMulDiv(pef->lMant, 1 << (pef->lExp - 2), 0x40000000);
return TRUE;
}
* FLOATOBJ_SetFloat - implemented, tested
* FLOATOBJ_SetLong - implemented, tested
* FLOATOBJ_GetFloat - implemented, tested
- * FLOATOBJ_GetLong - implemented, tested
+ * FLOATOBJ_GetLong - implemented in C
* FLOATOBJ_Equal - implemented, tested
* FLOATOBJ_EqualLong - implemented
* FLOATOBJ_GreaterThan - implemented
ret 8
-/*******************************************************************************
- * LONG
- * APIENTRY
- * FLOATOBJ_GetLong(IN PFLOATOBJ pf);
- *
- */
-_FLOATOBJ_GetLong@4:
-PUBLIC _FLOATOBJ_GetLong@4
- push ebp
- mov ebp, esp
-
- mov edx, [ebp + PARAM1] /* Load pf into edx */
- mov ecx, 32 /* Load (32 - lExp) into ecx */
- sub ecx, [edx + lExp]
- jle short GetLong2 /* Check for Overflow */
-
- mov eax, [edx + lMant] /* Load mantissa into eax */
- sar eax, cl /* Signed shift mantissa according to exponent */
-
- pop ebp /* Return */
- ret 4
-
-GetLong2:
- xor eax, eax /* Overflow, return 0 */
- pop ebp
- ret 4
-
-
/******************************************************************************
* BOOL
* APIENTRY
pop ebp
ret 8
-
/*******************************************************************************
* VOID
* APIENTRY
pop ebp
ret 8
-
/******************************************************************************
* VOID
* APIENTRY
pop ebp
ret 8
-
/*******************************************************************************
* VOID
* APIENTRY
mov dword ptr [eax + lExp], 0
pop ebp
ret 8
-
/******************************************************************************
* VOID
* APIENTRY
--- /dev/null
+/*
+ * PROJECT: ReactOS win32 kernel mode subsystem
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: win32ss/gdi/eng/i386/floatobj.c
+ * PURPOSE: FLOATOBJ API
+ * PROGRAMMERS: Jérôme Gardou
+ */
+
+/** Includes ******************************************************************/
+
+#include <win32k.h>
+#define NDEBUG
+#include <debug.h>
+
+LONG
+APIENTRY
+FLOATOBJ_GetLong(FLOATOBJ* pf)
+{
+ LONG val = 0;
+ (void)FLOATOBJ_bConvertToLong(pf, &val);
+ return val;
+}