1
0
mirror of https://github.com/golang/go synced 2024-11-22 07:34:40 -07:00

mp fixed arith

R=r
DELTA=149  (80 added, 62 deleted, 7 changed)
OCL=14029
CL=14029
This commit is contained in:
Ken Thompson 2008-08-09 17:29:26 -07:00
parent baf0747dd3
commit 272ae659db
4 changed files with 61 additions and 43 deletions

View File

@ -22,7 +22,9 @@ OFILES=\
export.$O\
walk.$O\
const.$O\
mparith.$O\
mparith1.$O\
mparith2.$O\
mparith3.$O\
sysimport.$O\
compat.$O\

View File

@ -323,16 +323,7 @@ evconst(Node *n)
goto settrue;
goto setfalse;
}
*n = *nl;
// second half of dance
if(wl == Wlitint) {
n->val.u.xval = xval;
} else
if(wl == Wlitfloat) {
n->val.u.fval = fval;
}
return;
goto ret;
settrue:
*n = *booltrue;
@ -343,6 +334,15 @@ setfalse:
return;
unary:
if(wl == Wlitint) {
xval = mal(sizeof(*xval));
mpmovefixfix(xval, nl->val.u.xval);
} else
if(wl == Wlitfloat) {
fval = mal(sizeof(*fval));
mpmovefltflt(fval, nl->val.u.fval);
}
switch(TUP(n->op, wl)) {
default:
yyerror("illegal combination of literals %O %d", n->op, wl);
@ -351,16 +351,16 @@ unary:
case TUP(OPLUS, Wlitint):
break;
case TUP(OMINUS, Wlitint):
mpnegfix(nl->val.u.xval);
mpnegfix(xval);
break;
case TUP(OCOM, Wlitint):
mpcomfix(nl->val.u.xval);
mpcomfix(xval);
break;
case TUP(OPLUS, Wlitfloat):
break;
case TUP(OMINUS, Wlitfloat):
mpnegflt(nl->val.u.fval);
mpnegflt(fval);
break;
case TUP(ONOT, Wlitbool):
@ -368,7 +368,17 @@ unary:
goto settrue;
goto setfalse;
}
ret:
*n = *nl;
// second half of dance
if(wl == Wlitint) {
n->val.u.xval = xval;
} else
if(wl == Wlitfloat) {
n->val.u.fval = fval;
}
}
void

View File

@ -78,8 +78,6 @@ typedef struct Mpflt Mpflt;
struct Mpflt
{
double val;
long a[Mpprec];
uchar neg;
uchar ovf;
};
@ -471,46 +469,54 @@ void ungetc(int);
void mkpackage(char*);
/*
* mparith.c
* mparith1.c
*/
void mpmovefixfix(Mpint *a, Mpint *b);
void mpmovefixflt(Mpflt *a, Mpint *b);
void mpmovefltfix(Mpint *a, Mpflt *b);
void mpmovefltflt(Mpflt *a, Mpflt *b);
void mpmovecfix(Mpint *a, vlong v);
void mpmovecflt(Mpflt *a, double f);
int mpcmpfixfix(Mpint *a, Mpint *b);
int mpcmpfltflt(Mpflt *a, Mpflt *b);
int mpcmpfixc(Mpint *b, vlong c);
int mpcmpfltc(Mpint *b, double c);
int mptestfixfix(Mpint *a);
int mptestfltflt(Mpflt *a);
void mpaddfixfix(Mpint *a, Mpint *b);
void mpaddfltflt(Mpflt *a, Mpflt *b);
int mpcmpfltflt(Mpflt *a, Mpflt *b);
int mpcmpfltc(Mpflt *b, double c);
void mpsubfixfix(Mpint *a, Mpint *b);
void mpsubfltflt(Mpflt *a, Mpflt *b);
void mpmulfixfix(Mpint *a, Mpint *b);
void mpmulfltflt(Mpflt *a, Mpflt *b);
void mpaddcfix(Mpint *a, vlong c);
void mpaddcflt(Mpflt *a, double c);
void mpmulcfix(Mpint *a, vlong c);
void mpmulcflt(Mpflt *a, double c);
void mpdivfixfix(Mpint *a, Mpint *b);
void mpdivfltflt(Mpflt *a, Mpflt *b);
void mpnegfix(Mpint *a);
void mpnegflt(Mpflt *a);
void mpmodfixfix(Mpint *a, Mpint *b);
void mpatofix(Mpint *a, char *s);
void mpatoflt(Mpflt *a, char *s);
void mpmovefltfix(Mpint *a, Mpflt *b);
void mpmovefixflt(Mpflt *a, Mpint *b);
/*
* mparith2.c
*/
void mpmovefixfix(Mpint *a, Mpint *b);
void mpmovecfix(Mpint *a, vlong v);
int mptestfix(Mpint *a);
void mpaddfixfix(Mpint *a, Mpint *b);
void mpmulfixfix(Mpint *a, Mpint *b);
void mpdivmodfixfix(Mpint *q, Mpint *r, Mpint *n, Mpint *d);
void mpnegfix(Mpint *a);
void mpandfixfix(Mpint *a, Mpint *b);
void mplshfixfix(Mpint *a, Mpint *b);
void mpmodfixfix(Mpint *a, Mpint *b);
void mporfixfix(Mpint *a, Mpint *b);
void mprshfixfix(Mpint *a, Mpint *b);
void mpxorfixfix(Mpint *a, Mpint *b);
void mpcomfix(Mpint *a);
double mpgetflt(Mpflt *a);
vlong mpgetfix(Mpint *a);
void mpatofix(Mpint *a, char *s);
void mpatoflt(Mpflt *a, char *s);
/*
* mparith3.c
*/
void mpmovefltflt(Mpflt *a, Mpflt *b);
void mpmovecflt(Mpflt *a, double f);
int mptestflt(Mpflt *a);
void mpaddfltflt(Mpflt *a, Mpflt *b);
void mpmulfltflt(Mpflt *a, Mpflt *b);
void mpdivfltflt(Mpflt *a, Mpflt *b);
void mpnegflt(Mpflt *a);
double mpgetflt(Mpflt *a);
/*
* subr.c

View File

@ -1076,11 +1076,11 @@ lexinit(void)
mpatofix(minintval[TINT32], "-0x80000000");
mpatofix(maxintval[TINT64], "0x7fffffffffffffff");
mpatofix(minintval[TINT64], "-0x8000000000000000");
mpatofix(maxintval[TUINT8], "0xff");
mpatofix(maxintval[TUINT16], "0xffff");
mpatofix(maxintval[TUINT32], "0xffffffff");
mpatofix(maxintval[TUINT64], "0x7fffffffffffffff");
mpatofix(minintval[TUINT64], "-0x8000000000000000");
mpatofix(maxintval[TUINT64], "0xffffffffffffffff");
mpatoflt(maxfltval[TFLOAT32], "3.40282347e+38");
mpatoflt(minfltval[TFLOAT32], "-3.40282347e+38");