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