/*
 * divide.h
 *
 * [Generated from divide, 25 September 1996]
 */

#if !defined(__CC_NORCROFT) || !defined(__arm)
  #error You must use the Norcroft ARM Compiler for Sapphire programs
#endif

#pragma include_only_once
#pragma force_top_level

#ifndef __divide_h
#define __divide_h

#ifndef __sapphire_h
  #include "sapphire.h"
#endif

/*----- Overview ----------------------------------------------------------*
 *
 * Functions provided:
 *
 *  divide
 *  div_unsigned
 *  div10
 *  div_round
 *  div_u64x32
 */

/* --- divide --- *
 *
 * On entry:	R0 == dividend
 * 		R1 == divisor
 *
 * On exit:	R0 == quotient
 *		R1 == remainder
 *
 * Use:		A standard divide routine.  Fairly speedy, hopefully.
 *		The results are always such that
 *
 *			|quotient| <= |(divisor/dividend)|,
 *
 *			|remainder| < |divisor|
 *
 *		and
 *
 *			quotient * divisor + remainder == dividend
 */

extern routine divide;

/* --- div_unsigned --- *
 *
 * On entry:	R0 == dividend
 * 		R1 == divisor
 *
 * On exit:	R0 == quotient
 *		R1 == remainder
 *
 * Use:		As for divide, except that it considers its operands to be
 *		unsigned.
 */

extern routine div_unsigned;

/* --- div10 --- *
 *
 * On entry:	R0 == integer to divide
 *
 * On exit:	R0 == quotient after division by 10
 *		R1 == remainder after division by 10
 *
 * Use:		Divides an integer very quickly by 10.
 *
 * [Generated by Straylight divc]
 */

extern routine div10;

/* --- div_round --- *
 *
 * On entry:	R0 == dividend
 *		R1 == divisor
 *
 * On exit:	R0 == quotient, rounded to nearest integer
 *		R1 == remainder
 *
 * Use:		Calculates a rounded-to-nearest quotient, rather than one
 *		rounded towards zero, which is what divide returns you.
 *
 *		The remainder is fiddled during this process, so that the
 *		properties
 *
 *			quotient * divisor + remainder == dividend
 *
 *		and
 *
 *			|remainder| < |divisor|
 *
 *		still hold (so the remainder's sign may well change).
 */

extern routine div_round;

/* --- div_u64x32 --- *
 *
 * On entry:	R0,R1 == dividend (high word in R1)
 *		R2 == divisor
 *
 * On exit:	R0 == quotient
 *		R1 == remainder
 *
 * Use:		Divides a 64-bit unsigned value by a 32-bit unsigned value
 *		yielding 32-bit unsigned quotient and remainder.  If there
 *		are more than 32 bits of quotient, the return values are
 *		undefined.
 */

extern routine div_u64x32;

/*----- That's all, folks -------------------------------------------------*/

#endif
