/*
 * @(#) lmuldiv.h - Long (64-bit result) mul/div operations library header.
 * (c) 1998 Ivan Maidanski <ivmai@chat.ru> http://ivmai.chat.ru
 * Freeware function library source. All rights reserved.
 **
 * Language: ANSI C
 * Tested with: Microsoft Visual C++ (R) v4.2, Borland C/C++ v3.1
 * Last modified: 1998-07-22 17:50:00 GMT+04:00
 */

/* Library source file: lmuldiv.c */

/*
 l_mul_shr(),
 lu_mul_shr(),
 l_div_mod(),
 lu_div_mod(),
 l_mul_div(),
 lu_mul_div()
*/

#ifndef _LMULDIV_H_INCLUDED
#define _LMULDIV_H_INCLUDED

/* let LOW(x)=((x)&((1<<(sizeof(long)*CHAR_BIT))-1)) */
/* let HIGH(x)=((x)>>(sizeof(long)*CHAR_BIT)) */
/* let HIGHLOW(x,y)=(((x)<<(sizeof(long)*CHAR_BIT))|(y)) */

/* res=HIGH(a*b) */
long l_mul_shr(long a, long b);
unsigned long lu_mul_shr(unsigned long a, unsigned long b);

/* res=LOW(HIGHLOW(hv,lv)/d) */
/* if (prem!=NULL) *prem=HIGHLOW(hv,lv)%d */
long l_div_mod(long *prem, long hv, long lv, long d);
unsigned long lu_div_mod(unsigned long *prem,
                         unsigned long hv, unsigned long lv, unsigned long d);

/* res=LOW(a*b/d) */
/* if (prem!=NULL) *prem=a*b%d */
long l_mul_div(long *prem, long a, long b, long d);
unsigned long lu_mul_div(unsigned long *prem,
                         unsigned long a, unsigned long b, unsigned long d);

#endif
