* 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)
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++;
}
}
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 */
"1:"
"clr -(sp)"
"dbf %[a],1b" | | |
+zrf | | | | zer $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 |
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]"
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 */