Synchronizing this new file to release 4.2
[unix-history] / usr / src / old / as.vax / asnumber.h
CommitLineData
15693c49
RH
1/*
2 * Copyright (c) 1982 Regents of the University of California
82dad1b0 3 * @(#)asnumber.h 4.2 %G%
15693c49
RH
4 */
5
6union Ib_int{ /* byte */
7 u_char Ib_uchar[1];
8 char Ichar;
9};
10union Iw_int{ /* word */
11 u_char Iw_uchar[2];
12 u_short Iw_ushort[1];
13 short Iw_short;
14};
15union Il_int{ /* long word */
16 u_char Il_uchar[4];
17 u_short Il_ushort[2];
18 u_int Il_ulong[1];
19 int Il_long;
20};
21
22union Iq_int{ /* quad word */
23 u_char Iq_uchar[8];
24 u_short Iq_ushort[4];
25 u_int Iq_ulong[2];
26};
27
28union Io_int{ /* octal word */
29 u_char Io_uchar[16];
30 u_short Io_ushort[8];
31 u_int Io_ulong[4];
32 union Iq_int Io_quad[2];
33};
34
35union Ff_float{
36 u_char Ff_uchar[4];
37 u_short Ff_ushort[2];
38 u_int Ff_ulong[1];
39 float Ff_value;
40};
41
42union Fd_float{
43 u_char Fd_uchar[8];
44 u_short Fd_ushort[4];
45 u_int Fd_ulong[2];
46 double Fd_value;
47};
48
49union Fg_float{
50 u_char Fg_uchar[8];
51 u_short Fg_ushort[4];
52 u_int Fg_ulong[2];
53};
54
55union Fh_float{
56 u_char Fh_uchar[16];
57 u_short Fh_ushort[8];
58 u_int Fh_ulong[4];
59};
60
61struct as_number{
62 union {
63 union Ib_int numIb_int;
64 union Iw_int numIw_int;
65 union Il_int numIl_int;
66 union Iq_int numIq_int;
67 union Io_int numIo_int;
68 union Ff_float numFf_float;
69 union Fd_float numFd_float;
70 union Fg_float numFg_float;
71 union Fh_float numFh_float;
72 }num_num;
73 char num_tag; /* the key field: TYPB..TYPUNPACKED */
74 char num_sign; /* when unpacked, the sign */
75 short num_exponent; /* when unpacked, the unexcessed exp */
76};
77typedef struct as_number Bignum;
78
79extern Bignum Znumber; /* one all zero'ed out */
80
81#define num_uchar num_num.numIq_int.Iq_uchar
82#define num_uint num_num.numIq_int.Iq_ulong
83#define num_ulong num_num.numIq_int.Iq_ulong
84#define num_ushort num_num.numIq_int.Iq_ushort
85/*
86 * The following definitions must all be consistent.
87 * They define the granularity of working on longs, quad and octal
88 * words. Currently, the granularity is as large as it can be: 32 bits
89 * in a chunk.
90 */
91#define CH_N 4 /* number of pieces */
92#define CH_BITS 32 /* number of bits per piece */
93#define CH_FIELD(x) ((x).num_num.numIo_int.Io_ulong)
94typedef u_int *chptr; /* basic data type */
95#define SIGNBIT 0x80000000
96
97#define HOC (CH_N - 1) /* high order chunk */
98#if 0
99#define MAXINT_1 ((unsigned)(1<<(CH_BITS - 1)))
100#define MAXINT_10 ((unsigned)((MAXINT_1/(unsigned)10)))
101#define MAXINT_5 ((unsigned)((MAXINT_1/(unsigned)5)))
102#else not 0
103/*
104 * These values were computed using dc, so are exact.
105 * Only MAXINT_10 and MAXINT_5 are used in the programs.
106 */
107#define MAXINT_1 2147483648
108#define MAXINT_10 214748364
109#define MAXINT_5 429496729
110#endif not 0
111
112Bignum as_atoi(); /* converts string to integer */
113Bignum as_atof(); /* converts string to float */
114Bignum bigatof(); /* converts string to float */
115Bignum floatconvert(); /* converts amongst float #s */
116Bignum intconvert(); /* converts amongst float #s */
117Bignum bignumconvert(); /* converts amongst float #s */
118Bignum bignumpack(); /* converts UNPACKED bignum to bignum */
119Bignum bignumunpack(); /* converts bignum to UNPACKED bignum */
120\f
121/*
122 * Definitions for overflows.
123 */
124typedef u_int Ovf;
125
126#define OVF_ADDV (1<<0) /* integer: adding two vectors overflowed */
127#define OVF_LSHIFT (1<<1) /* integer: left shifting a vector lost bits */
128#define OVF_POSOVF (1<<2) /* integer: positive number overflowed */
129#define OVF_MAXINT (1<<3) /* integer: the number was the maxint + 1*/
130#define OVF_F (1<<4) /* float: F overflow */
131#define OVF_D (1<<5) /* float: D overflow */
132#define OVF_G (1<<6) /* float: G overflow */
133#define OVF_H (1<<7) /* float: H overflow */
134#define OVF_OVERFLOW (1<<9) /* overflow in conversion */
135#define OVF_UNDERFLOW (1<<10) /* underflow in conversion */
136
137Ovf posovf();
138Ovf numclear();
139Ovf numshift();
140Ovf numaddv();
141Ovf numaddd();
142Ovf num1comp();
143Ovf numnegate();
144\f
145/*
146 * Definitions to unpack big numbers numbers into
147 * a 128 bit fraction and 16 bit excess-free exponent,
148 * and an 8 copy bits for the sign.
149 *
150 * The fraction is represented as a normalized binary number,
151 * 128 bits long, with the binary point between bits 127 and the
152 * hypothetical 128'th bit. This hypothetical 128'th bit
153 * is always assumed to be one.
154 */
155/*
156 * A map entry is NOTAKE if the corresponding byte is
157 * not to be taken
158 *
159 * The maps are for going from packed to unpacked format (b_up)
160 * and from unpacked to packed format (b_p)
161 * for the mantissa (b_upmmap) and for the exponent(b_upemap)
162 *
163 * byte #i in the packed number goes to byte #b_upmmap[i] in the unpacked
164 */
165#define NOTAKE -1
166struct ty_bigdesc{
167 char b_upmmap[16]; /* byte x of float goes to up_mmap[x] in mant */
168 char b_pmmap[16]; /* inverse of upmmap */
169 char b_upemap[2]; /* byte x of float goes to up_emap[x] in exp */
170 char b_pemap[2]; /* inverse of upemap */
171 char b_mlshift; /* left shift quantity to justify to left */
172 char b_ershift; /* right shift quantity to r justify exponent */
173 short b_msigbits; /* # sig bits in mantissa */
174 char b_esigbits; /* # sig bits in exponent */
175 short b_eexcess; /* exponent excess */
176};
177extern struct ty_bigdesc ty_bigdesc[];
178/*
179 * Bit manipulations
180 */
181#define ONES(n) ((1 << (n)) - 1)
182/*
183 * Assertions
184 */
185#if 1
186#define assert(x, str) if (!(x)) panic("%s%s\n", "x", str)
187#else
188#define assert(x, str)
189#endif