2
* REMOVED FORMAL PARAMETERS FROM FUNCTION DEFINITIONS (1/4/92)
33
extern int MPOverflow;
34
extern int DivideOverflow;
36
/* Mark Peterson's expanded floating point operators. Automatically uses
37
either the 8086 or 80386 processor type specified in global 'cpu'. If
38
the operation results in an overflow (result < 2**(2**14), or division
39
by zero) the global 'MPoverflow' is set to one. */
41
/* function pointer support added by Tim Wegner 12/07/89 */
42
extern int (*pMPcmp)(struct MP , struct MP );
43
extern struct MP *(*pMPmul)(struct MP , struct MP );
44
extern struct MP *(*pMPdiv)(struct MP , struct MP );
45
extern struct MP *(*pMPadd)(struct MP , struct MP );
46
extern struct MP *(*pMPsub)(struct MP , struct MP );
47
extern struct MP *(*pd2MP)(double ) ;
48
extern double *(*pMP2d)(struct MP ) ;
51
/*** Formula Declarations ***/
53
enum MATH_TYPE { D_MATH, M_MATH, L_MATH };
55
enum MATH_TYPE { D_MATH};
57
extern enum MATH_TYPE MathType;
59
#define fDiv(x, y, z) (void)((*(long*)&z) = RegDivFloat(*(long*)&x, *(long*)&y))
60
#define fMul16(x, y, z) (void)((*(long*)&z) = r16Mul(*(long*)&x, *(long*)&y))
61
#define fShift(x, Shift, z) (void)((*(long*)&z) = \
62
RegSftFloat(*(long*)&x, Shift))
63
#define Fg2Float(x, f, z) (void)((*(long*)&z) = RegFg2Float(x, f))
64
#define Float2Fg(x, f) RegFloat2Fg(*(long*)&x, f)
65
#define fLog14(x, z) (void)((*(long*)&z) = \
66
RegFg2Float(LogFloat14(*(long*)&x), 16))
67
#define fExp14(x, z) (void)((*(long*)&z) = ExpFloat14(*(long*)&x));
68
#define fSqrt14(x, z) fLog14(x, z); fShift(z, -1, z); fExp14(z, z)
70
/* the following are declared 4 dimensional as an experiment */
71
/* changeing declarations to _CMPLX and _LCMPLX restores the code */
88
extern union Arg *Arg1,*Arg2;
90
extern void lStkSin(void),lStkCos(void),lStkSinh(void),lStkCosh(void),lStkLog(void),lStkExp(void),lStkSqr(void);
91
extern void dStkSin(void),dStkCos(void),dStkSinh(void),dStkCosh(void),dStkLog(void),dStkExp(void),dStkSqr(void);
93
extern void (*ltrig0)(void);
94
extern void (*ltrig1)(void);
95
extern void (*ltrig2)(void);
96
extern void (*ltrig3)(void);
97
extern void (*dtrig0)(void);
98
extern void (*dtrig1)(void);
99
extern void (*dtrig2)(void);
100
extern void (*dtrig3)(void);
102
/* -------------------------------------------------------------------- */
103
/* The following #defines allow the complex transcendental functions */
104
/* in parser.c to be used here thus avoiding duplicated code. */
105
/* -------------------------------------------------------------------- */
108
#define CMPLXmod(z) (sqr((z).x)+sqr((z).y))
109
#define CMPLXconj(z) ((z).y = -((z).y))
110
#define LCMPLXmod(z) (lsqr((z).x)+lsqr((z).y))
111
#define LCMPLXconj(z) ((z).y = -((z).y))
114
#define LCMPLXtrig0(arg,out) Arg1->l = (arg); ltrig0(); (out)=Arg1->l
115
#define LCMPLXtrig1(arg,out) Arg1->l = (arg); ltrig1(); (out)=Arg1->l
116
#define LCMPLXtrig2(arg,out) Arg1->l = (arg); ltrig2(); (out)=Arg1->l
117
#define LCMPLXtrig3(arg,out) Arg1->l = (arg); ltrig3(); (out)=Arg1->l
121
#define CMPLXtrig0(arg,out) Arg1->d = (arg); dtrig0(); (out)=Arg1->d
122
#define CMPLXtrig1(arg,out) Arg1->d = (arg); dtrig1(); (out)=Arg1->d
123
#define CMPLXtrig2(arg,out) Arg1->d = (arg); dtrig2(); (out)=Arg1->d
124
#define CMPLXtrig3(arg,out) Arg1->d = (arg); dtrig3(); (out)=Arg1->d
128
#define LCMPLXsin(arg,out) Arg1->l = (arg); lStkSin(); (out) = Arg1->l
129
#define LCMPLXcos(arg,out) Arg1->l = (arg); lStkCos(); (out) = Arg1->l
130
#define LCMPLXsinh(arg,out) Arg1->l = (arg); lStkSinh(); (out) = Arg1->l
131
#define LCMPLXcosh(arg,out) Arg1->l = (arg); lStkCosh(); (out) = Arg1->l
132
#define LCMPLXlog(arg,out) Arg1->l = (arg); lStkLog(); (out) = Arg1->l
133
#define LCMPLXexp(arg,out) Arg1->l = (arg); lStkExp(); (out) = Arg1->l
135
#define LCMPLXsqr(arg,out) Arg1->l = (arg); lStkSqr(); (out) = Arg1->l
137
#define LCMPLXsqr(arg,out) \
138
(out).x = lsqr((arg).x) - lsqr((arg).y);\
139
(out).y = multiply((arg).x, (arg).y, bitshiftless1)
140
#define LCMPLXsqr_old(out) \
141
(out).y = multiply(lold.x, lold.y, bitshiftless1);\
142
(out).x = ltempsqrx - ltempsqry
144
#define LCMPLXpwr(arg1,arg2,out) Arg2->l = (arg1); Arg1->l = (arg2);\
145
lStkPwr(); Arg1++; Arg2++; (out) = Arg2->l
146
#define LCMPLXmult(arg1,arg2,out) Arg2->l = (arg1); Arg1->l = (arg2);\
147
lStkMul(); Arg1++; Arg2++; (out) = Arg2->l
148
#define LCMPLXadd(arg1,arg2,out) \
149
(out).x = (arg1).x + (arg2).x; (out).y = (arg1).y + (arg2).y
150
#define LCMPLXsub(arg1,arg2,out) \
151
(out).x = (arg1).x - (arg2).x; (out).y = (arg1).y - (arg2).y
153
#define LCMPLXtimesreal(arg,real,out) \
154
(out).x = multiply((arg).x,(real),bitshift);\
155
(out).y = multiply((arg).y,(real),bitshift)
157
#define LCMPLXrecip(arg,out) \
158
{ long denom; denom = lsqr((arg).x) + lsqr((arg).y);\
159
if(denom==0L) overflow=1; else {(out).x = divide((arg).x,denom,bitshift);\
160
(out).y = -divide((arg).y,denom,bitshift);}}
163
#define CMPLXsin(arg,out) Arg1->d = (arg); dStkSin(); (out) = Arg1->d
164
#define CMPLXcos(arg,out) Arg1->d = (arg); dStkCos(); (out) = Arg1->d
165
#define CMPLXsinh(arg,out) Arg1->d = (arg); dStkSinh(); (out) = Arg1->d
166
#define CMPLXcosh(arg,out) Arg1->d = (arg); dStkCosh(); (out) = Arg1->d
167
#define CMPLXlog(arg,out) Arg1->d = (arg); dStkLog(); (out) = Arg1->d
168
#define CMPLXexp(arg,out) FPUcplxexp(&(arg), &(out))
170
#define CMPLXsqr(arg,out) Arg1->d = (arg); dStkSqr(); (out) = Arg1->d
172
#define CMPLXsqr(arg,out) \
173
(out).x = sqr((arg).x) - sqr((arg).y);\
174
(out).y = ((arg).x+(arg).x) * (arg).y
175
#define CMPLXsqr_old(out) \
176
(out).y = (old.x+old.x) * old.y;\
177
(out).x = tempsqrx - tempsqry
179
#define CMPLXpwr(arg1,arg2,out) (out)= ComplexPower((arg1), (arg2))
180
#define CMPLXmult1(arg1,arg2,out) Arg2->d = (arg1); Arg1->d = (arg2);\
181
dStkMul(); Arg1++; Arg2++; (out) = Arg2->d
182
#define CMPLXmult(arg1,arg2,out) \
185
TmP.x = (arg1).x*(arg2).x - (arg1).y*(arg2).y;\
186
TmP.y = (arg1).x*(arg2).y + (arg1).y*(arg2).x;\
189
#define CMPLXadd(arg1,arg2,out) \
190
(out).x = (arg1).x + (arg2).x; (out).y = (arg1).y + (arg2).y
191
#define CMPLXsub(arg1,arg2,out) \
192
(out).x = (arg1).x - (arg2).x; (out).y = (arg1).y - (arg2).y
193
#define CMPLXtimesreal(arg,real,out) \
194
(out).x = (arg).x*(real);\
195
(out).y = (arg).y*(real)
197
#define CMPLXrecip(arg,out) \
198
{ double denom; denom = sqr((arg).x) + sqr((arg).y);\
199
if(denom==0.0) {(out).x = 1.0e10;(out).y = 1.0e10;}else\
200
{ (out).x = (arg).x/denom;\
201
(out).y = -(arg).y/denom;}}
203
#define CMPLXneg(arg,out) (out).x = -(arg).x; (out).y = -(arg).y