From ca9a6feeb0339411c6e14cf43ee8bf007910558f Mon Sep 17 00:00:00 2001 From: bal Date: Fri, 12 Apr 1985 15:47:30 +0000 Subject: [PATCH] floating point stuff added --- mach/m68k2/cg/mach.c | 72 ++++++++++++++++---- mach/m68k2/cg/table | 157 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 196 insertions(+), 33 deletions(-) diff --git a/mach/m68k2/cg/mach.c b/mach/m68k2/cg/mach.c index 2b539e4d2..65fb301e4 100644 --- a/mach/m68k2/cg/mach.c +++ b/mach/m68k2/cg/mach.c @@ -23,6 +23,19 @@ static char rcsid[] = "$Header$"; * machine dependent back end routines for the Motorola 68000 */ +#define IEEEFLOAT + +#ifdef IEEEFLOAT +#include "FP.h" +#include "trp.c" +#include "fcompact.c" +#include "dbl_extract.c" +#ifdef PRT_EXP_DEBUG +#include "prt_extend.c" +#endif +#endif IEEEFLOAT + + con_part(sz,w) register sz; word w; { while (part_size % sz) @@ -48,18 +61,53 @@ con_mult(sz) word sz; { fprintf(codefile,".long %s\n",str); } -con_float() { - -static int been_here; - if (argval != 4 && argval != 8) - fatal("bad fcon size"); - fprintf(codefile,".long\t"); - if (argval == 8) - fprintf(codefile,"F_DUM,"); - fprintf(codefile,"F_DUM\n"); - if ( !been_here++) - { - fprintf(stderr,"Warning : dummy float-constant(s)\n"); +#ifdef IEEEFLOAT +dbl_adjust(fl) +my_dbl *fl; +{ + EXTEND buf; + + /* special routine to strip SGL_BIAS */ + dbl_extract(fl,&buf); + /* standard routine to add DBL_BIAS */ + fcompact(&buf,fl,sizeof(double)); +} +#endif IEEEFLOAT + +con_float() +{ + register word sz; + register long *l; +#ifdef IEEEFLOAT + register my_dbl *md; +#endif IEEEFLOAT + double d; + char mesg[128]; + + sz = argval; + if (sz!= 4 && sz!= 8) { + sprintf(mesg,"con_float(): bad fcon size %d %D\nstr: %s\n\0", + sz,sz,str); + fatal(mesg); + } + + d = atof(str); + l = (long *) &d; + +#ifdef IEEEFLOAT + if (sz == 8) { + /* ATOF() RETURNS THE PROPER FORMAT FOR A FLOAT */ + /* BUT NOT FOR A DOUBLE. CORRECT THE FORMAT. */ + md = (my_dbl *) &d; + dbl_adjust(md); + } +#endif IEEEFLOAT + + while ( sz ) { + fprintf(codefile,"\t.word 0x%x,0x%x !float test %s\n", + (int)(*l)&0xFFFF,(int)(*l>>16)&0xFFFF,str); + sz -=4 ; + l++; } } diff --git a/mach/m68k2/cg/table b/mach/m68k2/cg/table index 068d2faac..2a327bf7b 100644 --- a/mach/m68k2/cg/table +++ b/mach/m68k2/cg/table @@ -1035,6 +1035,50 @@ adu | | | | adi $1 | sbu | | | | sbi $1 | slu | | | | sli $1 | +/* Floating point stuff */ +adf $1==4 | | + remove(ALL) + "jsr .adf4" | | asp 8 lfr 4 | +adf $1==8 | | + remove(ALL) + "jsr .adf8" | | asp 16 lfr 4 loi 8 | +sbf $1==4 | | + remove(ALL) + "jsr .sbf4" | | asp 8 lfr 4 | +sbf $1==8 | | + remove(ALL) + "jsr .sbf8" | | asp 16 lfr 4 loi 8 | +mlf $1==4 | | + remove(ALL) + "jsr .mlf4" | | asp 8 lfr 4 | +mlf $1==8 | | + remove(ALL) + "jsr .mlf8" | | asp 16 lfr 4 loi 8 | +dvf $1==4 | | + remove(ALL) + "jsr .dvf4" | | asp 8 lfr 4 | +dvf $1==8 | | + remove(ALL) + "jsr .dvf8" | | asp 16 lfr 4 loi 8 | +ngf $1==4 | | + remove(ALL) + "jsr .ngf4" | | asp 4 lfr 4 | +ngf $1==8 | | + remove(ALL) + "jsr .ngf8" | | asp 16 lfr 4 loi 8 | +fif $1==4 | | + remove(ALL) + "jsr .fif4" | | asp 16 lfr 4 loi 8 | +fif $1==8 | | + remove(ALL) + "jsr .fif8" | | asp 16 lfr 4 loi 16 | +fef $1==4 | | + remove(ALL) + "jsr .fef4" | | asp 4 lfr 4 loi 8 | +fef $1==8 | | + remove(ALL) + "jsr .fef8" | | asp 8 lfr 4 loi 12 | + /* G R O U P VI : P O I N T E R A R I T H M E T I C */ @@ -1249,6 +1293,7 @@ zer $1 > 12 | | remove(ALL) "1:" "clr -(sp)" "dbf %[a],1b" | | | +zrf | | | | zer $1 | @@ -1298,6 +1343,88 @@ loc loc ciu $1==4 && $2==2 | DATAREG4 | | %[1.1] | | loc loc cui $1==4 && $2==2 | DATAREG4 | | %[1.1] | | ... | ANY | | | | +/* Floating point stuff */ + +loc loc cif $1==2 && $2==4 | | + remove(ALL) + "move.w #$1,-(sp)" + "jsr .cif4" | | asp 4 lfr 4 | +loc loc cif $1==2 && $2==8 | | + remove(ALL) + "move.w #$1,-(sp)" + "jsr .cif8" | | asp 4 lfr 4 loi 8 | +loc loc cif $1==4 && $2==4 | | + remove(ALL) + "move.w #$1,-(sp)" + "jsr .cif4" | | asp 6 lfr 4 | +loc loc cif $1==4 && $2==8 | | + remove(ALL) + "move.w #$1,-(sp)" + "jsr .cif8" | | asp 6 lfr 4 loi 8 | +loc loc cuf $1==2 && $2==4 | | + remove(ALL) + "move.w #$1,-(sp)" + "jsr .cuf4" | | asp 4 lfr 4 | +loc loc cuf $1==2 && $2==8 | | + remove(ALL) + "move.w #$1,-(sp)" + "jsr .cuf8" | | asp 4 lfr 4 loi 8 | +loc loc cuf $1==4 && $2==4 | | + remove(ALL) + "move.w #$1,-(sp)" + "jsr .cuf4" | | asp 6 lfr 4 | +loc loc cuf $1==4 && $2==8 | | + remove(ALL) + "move.w #$1,-(sp)" + "jsr .cuf8" | | asp 6 lfr 4 loi 8 | +loc loc cfi $1==4 && $2==2 | | + remove(ALL) + "move.w #$1,-(sp)" + "move.w #$2,-(sp)" + "jsr .cfi" | | asp 8 lfr 2 | +loc loc cfi $1==4 && $2==4 | | + remove(ALL) + "move.w #$1,-(sp)" + "move.w #$2,-(sp)" + "jsr .cfi" | | asp 8 lfr 4 | +loc loc cfi $1==8 && $2==2 | | + remove(ALL) + "move.w #$1,-(sp)" + "move.w #$2,-(sp)" + "jsr .cfi" | | asp 12 lfr 2 | +loc loc cfi $1==8 && $2==4 | | + remove(ALL) + "move.w #$1,-(sp)" + "move.w #$2,-(sp)" + "jsr .cfi" | | asp 12 lfr 4 | +loc loc cfu $1==4 && $2==2 | | + remove(ALL) + "move.w #$1,-(sp)" + "move.w #$2,-(sp)" + "jsr .cfu" | | asp 8 lfr 2 | +loc loc cfu $1==4 && $2==4 | | + remove(ALL) + "move.w #$1,-(sp)" + "move.w #$2,-(sp)" + "jsr .cfu" | | asp 8 lfr 4 | +loc loc cfu $1==8 && $2==2 | | + remove(ALL) + "move.w #$1,-(sp)" + "move.w #$2,-(sp)" + "jsr .cfu" | | asp 12 lfr 2 | +loc loc cfu $1==8 && $2==4 | | + remove(ALL) + "move.w #$1,-(sp)" + "move.w #$2,-(sp)" + "jsr .cfu" | | asp 12 lfr 4 | +loc loc cff $1==8 && $2==4 | | + remove(ALL) + "jsr .cff4" | | asp 8 lfr 4 | +loc loc cff $1==4 && $2==8 | | + remove(ALL) + "jsr .cff8" | | asp 4 lfr 4 loi 8 | + + /* G R O U P IX : L O G I C A L */ and defined($1) && $1 == 2 | ANY DATASCR | @@ -1727,6 +1854,15 @@ cms !defined($1) | ANY | remove(ALL) cmp | | remove(ALL) "jsr .cmp" | D1 | | +/* floating point */ + +cmf $1==4 | | + remove(ALL) + "jsr .cmf4" | | asp 8 lfr 2 | +cmf $1==8 | | + remove(ALL) + "jsr .cmf8" | | asp 16 lfr 2 | + cmi tlt and $1==2 && $3==2 | ANY DATAREG DATASCR | "cmp %[1],%[2]" @@ -2652,27 +2788,6 @@ str $1 == 2 | | remove(ALL) trp | STACK | "jsr .trp" | | | -/* For several floating point instructions we generate an illegal - * instruction trap. - */ - -adf | | | | loc 18 trp | -sbf | | | | loc 18 trp | -mlf | | | | loc 18 trp | -dvf | | | | loc 18 trp | -ngf | | | | loc 18 trp | -fef | | | | loc 18 trp | -fif | | | | loc 18 trp | -zrf | | | | loc 18 trp | -cfi | | | | loc 18 trp | -cif | | | | loc 18 trp | -cuf | | | | loc 18 trp | -cff | | | | loc 18 trp | -cfu | | | | loc 18 trp | -cmf | | | | loc 18 trp | - - - /* C O E R C I O N S */ -- 2.34.1