/******************************Module*Header*******************************\ * * ******************* * * GDI SAMPLE CODE * * ******************* * * Module Name: math64.h * * Additional support for 64 bit math. * * Copyright (C) 1995-1999 Microsoft Corporation. All rights reserved. \**************************************************************************/ #ifndef __MATH64__ #define __MATH64__ //------------------------------------------------------------------------------ // // We have to be careful of arithmetic overflow in a number of places. // Fortunately, the compiler is guaranteed to natively support 64-bit // signed LONGLONGs and 64-bit unsigned DWORDLONGs. // // Int32x32To64(a, b) is a macro defined in 'winnt.h' that multiplies // two 32-bit LONGs to produce a 64-bit LONGLONG result. // // UInt64By32To32 is our own macro to divide a 64-bit DWORDLONG by // a 32-bit ULONG to produce a 32-bit ULONG result. // // UInt64Mod32To32 is our own macro to modulus a 64-bit DWORDLONG by // a 32-bit ULONG to produce a 32-bit ULONG result. // //------------------------------------------------------------------------------ #define UInt64Div32To32(a, b) \ ((((DWORDLONG)(a)) > ULONG_MAX) ? \ (ULONG)((DWORDLONG)(a) / (ULONG)(b)) : \ (ULONG)((ULONG)(a) / (ULONG)(b))) #define UInt64Mod32To32(a, b) \ ((((DWORDLONG)(a)) > ULONG_MAX) ? \ (ULONG)((DWORDLONG)(a) % (ULONG)(b)) : \ (ULONG)((ULONG)(a) % (ULONG)(b))) //------------------------------------------------------------------------------ // Type conversion functions //------------------------------------------------------------------------------ static __inline void myFtoi(int *result, float f) { #if defined(_X86_) __asm { fld f mov eax,result fistp dword ptr [eax] } #else *result = (int)f; #endif } static __inline void myFtoui(unsigned long *result, float f) { *result = (unsigned long)f; } #endif // __MATH64__