blob: 136b9b48e30ce84d7aab627f41f5b98ceaa9ad37 [file] [log] [blame]
/*
* +------------------------------------------------------------------+
* | Private Math Library Definitions |
* +------------------------------------------------------------------+
*/
/*
* Optional assembly language
*/
#ifdef ASM
#include "machineop.h" /* 16-bit integer machine operations */
#define uModDiv(n, d, qp) umoddiv16(n, d, qp) /* slight help */
#else
#define uModDiv(n, d, qp) (*(qp) = (n) / (d), (n) % (d))
#endif
#define uMul(u, v) ((u) * (v)) /* fast enough */
/*
* Optional alternate memory allocator
*/
#ifndef MYALLOC
# ifdef BWGC
extern char *gc_malloc_atomic();
#define allocate(size) (char *) gc_malloc_atomic(size)
# else
extern void *malloc();
#define allocate(size) (char *) malloc(size)
# endif
#ifdef IGNOREFREE
#define deallocate(p) {};
#else
extern int free();
#define deallocate(p) free(p)
#endif
#else
extern char *allocate();
extern void deallocate();
#endif
/*
* These next four types are used only used in this include file
*/
#include <stdint.h>
typedef uint8_t u8; /* 8 bits */
typedef uint16_t u16; /* 16 bits */
typedef uint32_t u32; /* 32 bits */
typedef u8 boolean; /* 1 bit */
#define BASE 65536 /* Base * (Base-1) <= MAXINT */
/*
* Operations on Base (unsigned math)
*/
#define modBase(u) ((u) & 0xffff) /* remainder on Base */
#define divBase(u) ((u) >> 16) /* divide by Base */
#define mulBase(u) ((u) << 16) /* multiply by Base */
/*
* The type of a variable used to store intermediate results.
* This should be the most efficient unsigned int on your machine.
*/
typedef u32 accumulator; /* 0..(Base * Base) - 1 */
/*
* The type of a single digit
*/
typedef u16 digit; /* 0..Base-1 */
/*
* The type of a digit index (the largest number of digits - 1)
* Determines the maximum representable precision (not usually changed)
*/
typedef u16 posit; /* 0..size */
typedef unsigned short prefc; /* in precision.h also */
/*
* End of area which needs to be modified
*/
#define false 0
#define true 1
typedef digit digitString[1]; /* dummy array type */
typedef digit *digitPtr;
/*
* A normalized integer has the following attributes:
* -0 cannot occur
* all digits >= size assumed to be 0. (no leading zero's)
* size > 0
*/
typedef struct {
#ifndef BWGC
prefc refcount; /* reference count (must be 1st [for pref]) */
#endif
posit alloc; /* allocated size */
posit size; /* number of digits */
boolean sign; /* sign: TRUE negative */
digitString value;
} precisionType;
typedef precisionType *precision;
/*
* Overlay for cache of precisions
*/
typedef struct {
precision next; /* next item in list */
short count; /* number of items in this sublist */
} cacheType;
typedef cacheType *cachePtr;
/*
* Maximum total memory consumed by cache =
* LIMIT * (1 + SIZE * (PrecisionSize + sizeof(digit) * (SIZE-1) / 2))
*/
#ifndef CACHESIZE
#define CACHESIZE 32 /* size of allocation cache */
#endif
#define CACHELIMIT 128 /* Determines max mem used by cache */
#define PrecisionSize (sizeof(precisionType) - sizeof(digitString))
/*
* Function definitions are all in the global include file "mathdefs.h".
*/
extern precision palloc(); /* semi-private */
extern int pfree(); /* semi-private */
extern void pnorm(); /* semi-private */