#include "fppsim.h"
-#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,".data4 %s\n",str);
}
-#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));
+#ifdef NOFLOAT
+con_float() {
+
+static int been_here;
+ if (argval != 4 && argval != 8)
+ fatal("bad fcon size");
+ fputs(".data4\t", codefile);
+ if (argval == 8)
+ fputs("0,", codefile);
+ fputs("0 !dummy float\n", codefile);
+ if ( !been_here++)
+ {
+ fputs("Warning : dummy float-constant(s)\n", stderr);
+ }
}
-#endif IEEEFLOAT
-
-con_float()
-{
- register word sz;
- register long *l;
-#ifdef FPPSIM
+#else
+#define IEEEFLOAT
+
+con_float() {
+ double f;
+ double atof();
+ float fl;
+ int i;
+#ifndef OWNFLOAT
+ double f1;
+ double frexp(), modf();
+ int j;
+ int sign = 0;
+ int fraction[4] ;
+#else OWNFLOAT
+ char *p;
+#endif OWNFLOAT
+
+ if (argval!= 4 && argval!= 8) {
+ fprintf(stderr,"float constant size = %d\n",argval);
+ fatal("bad fcon size");
+ }
+ fprintf(codefile,"!float %s sz %d\n", str, argval);
+ f = atof(str);
+#ifdef OWNFLOAT
+ if (argval == 4) {
+ fl = f;
+ p = (char *) &fl;
+ }
+ else {
+ p = (char *) &f;
+ }
+ fprintf(codefile, ".data1 0%o", *p++ & 0377);
+ for (i = argval-1; i; i--) {
+ fprintf(codefile,",0%o", *p++ & 0377);
+ }
+#else OWNFLOAT
+ f = frexp(f, &i);
+ if (f < 0) {
+ f = -f;
+ sign = 1;
+ }
+ if (f == 0) {
+ if (argval == 8) fprintf(codefile, ".data2 0, 0\n");
+ fprintf(codefile, ".data2 0, 0\n");
+ return;
+ }
+ while (f < 0.5) {
+ f += f;
+ i --;
+ }
+ f = modf(2 * f, &f1); /* hidden bit */
#ifdef IEEEFLOAT
- register my_dbl *md;
+ if (argval == 4) {
#endif IEEEFLOAT
- double d, atof();
-#else not FPPSIM
- static int been_here;
-#endif
-
- sz = argval;
- if (sz!= 4 && sz!= 8) {
- char mesg[128];
- sprintf(mesg,"con_float(): bad fcon size %d %ld\nstr: %s\n\0",
- sz,sz,str);
- fatal(mesg);
- }
-
-#ifdef FPPSIM
- d = atof(str);
- l = (long *) &d;
-
+ i = (i + 128) & 0377;
+ fraction[0] = (sign << 15) | (i << 7);
+ for (j = 6; j>= 0; j--) {
+ if (f >= 0.5) fraction[0] |= (1 << j);
+ f = modf(2*f, &f1);
+ }
#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);
+ }
+ else {
+ i = (i + 1024) & 03777;
+ fraction[0] = (sign << 15) | (i << 4);
+ for (j = 3; j>= 0; j--) {
+ if (f >= 0.5) fraction[0] |= (1 << j);
+ f = modf(2*f, &f1);
+ }
}
#endif IEEEFLOAT
-
- while ( sz ) {
- fprintf(codefile,"\t.data2 0x%x,0x%x !float test %s\n",
- (int)(*l)&0xFFFF,(int)(*l>>16)&0xFFFF,str);
- sz -=4 ;
- l++;
+ for (i = 1; i < argval / 2; i++) {
+ fraction[i] = 0;
+ for (j = 15; j>= 0; j--) {
+ if (f >= 0.5) fraction[i] |= (1 << j);
+ f = modf(2*f, &f1);
+ }
}
-#else not FPPSIM
- if (! been_here) {
- been_here = 1;
- fprintf(stderr,"warning: dummy floating constant(s)\n");
+ if (f >= 0.5) {
+ for (i = argval/2 - 1; i >= 0; i--) {
+ for (j = 0; j < 16; j++) {
+ if (fraction[i] & (1 << j)) {
+ fraction[i] &= ~(1 << j);
+ }
+ else {
+ fraction[i] |= (1 << j);
+ break;
+ }
+ }
+ if (j != 16) break;
+ }
}
- while (sz) {
- fprintf(codefile,"\t.data4 0 !dummy float\n");
- sz -= 4;
+ for (i = 0; i < argval/2; i++) {
+ fprintf(codefile,
+ i != 0 ? ", 0%o, 0%o" : ".data1 0%o, 0%o",
+ (fraction[i]>>8)&0377,
+ fraction[i]&0377);
}
-#endif
+#endif OWNFLOAT
+ putc('\n', codefile);
}
+#endif
#ifdef REGVARS
*/
#define REGVARS
-#include "fppsim.h"
EM_WSIZE = 2
EM_PSIZE = 4
sbu | | | | sbi $1 |
slu | | | | sli $1 |
-#ifdef FPPSIM
/* 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 8 lfr 4 loi 8 |
-fif $1==4 | |
- remove(ALL)
- "jsr .fif4" | | asp 8 lfr 4 loi 8 |
-fif $1==8 | |
- remove(ALL)
- "jsr .fif8" | | asp 16 lfr 4 loi 16 |
+adf $1==4 | | | | cal ".adf4" asp 4 |
+adf $1==8 | | | | cal ".adf8" asp 8 |
+sbf $1==4 | | | | cal ".sbf4" asp 4 |
+sbf $1==8 | | | | cal ".sbf8" asp 8 |
+mlf $1==4 | | | | cal ".mlf4" asp 4 |
+mlf $1==8 | | | | cal ".mlf8" asp 8 |
+dvf $1==4 | | | | cal ".dvf4" asp 4 |
+dvf $1==8 | | | | cal ".dvf8" asp 8 |
+ngf $1==4 | | | | cal ".ngf4" |
+ngf $1==8 | | | | cal ".ngf8" |
+fif $1==4 | | | | cal ".fif4" |
+fif $1==8 | | | | cal ".fif8" |
fef $1==4 | |
remove(ALL)
- "jsr .fef4" | | asp 4 lfr 4 loi 8 |
+ "move.l (sp)+,d0"
+ "clr.w -(sp)"
+ "move.l d0,-(sp)" | | cal ".fef4" |
fef $1==8 | |
remove(ALL)
- "jsr .fef8" | | asp 8 lfr 4 loi 12 |
-#else not FPPSIM
-fef | | | | loc 18 trp |
-fif | | | | loc 18 trp |
-ngf | | | | loc 18 trp |
-adf | | | | loc 18 trp |
-sbf | | | | loc 18 trp |
-mlf | | | | loc 18 trp |
-dvf | | | | loc 18 trp |
-#endif FPPSIM
-
+ "move.l (sp)+,d0"
+ "move.l (sp)+,d1"
+ "clr.w -(sp)"
+ "move.l d1,-(sp)"
+ "move.l d0,-(sp)" | | cal ".fef8" |
/* G R O U P VI : P O I N T E R A R I T H M E T I C */
/* Floating point stuff */
-#ifdef FPPSYM
-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 | |
+/*
+ * Floating point stuff
+ *
+ * Conversion
+ *
+ */
+
+loc loc cif $1==2 && $2==4 | | | | loc $1 cal ".cif4" |
+loc loc cif $1==2 && $2==8 | ANY |
remove(ALL)
- "move.w #$1,-(sp)"
- "jsr .cuf4" | | asp 4 lfr 4 |
-loc loc cuf $1==2 && $2==8 | |
+ "clr.l -(sp)"
+ "move.w %[1],-(sp)"
+ | | loc $1 cal ".cif8" |
+loc loc cif $1==4 && $2==4 | | | | loc $1 cal ".cif4" asp 2 |
+loc loc cif $1==4 && $2==8 | ANY4 |
remove(ALL)
- "move.w #$1,-(sp)"
- "jsr .cuf8" | | asp 4 lfr 4 loi 8 |
-loc loc cuf $1==4 && $2==4 | |
+ "clr.w -(sp)"
+ "move.l %[1],-(sp)"
+ | | loc $1 cal ".cif8" |
+loc loc cuf $1==2 && $2==4 | | | | loc $1 cal ".cuf4" |
+loc loc cuf $1==2 && $2==8 | ANY |
remove(ALL)
- "move.w #$1,-(sp)"
- "jsr .cuf4" | | asp 6 lfr 4 |
-loc loc cuf $1==4 && $2==8 | |
+ "clr.l -(sp)"
+ "move.w %[1],-(sp)"
+ | | loc $1 cal ".cuf8" |
+loc loc cuf $1==4 && $2==4 | | | | loc $1 cal ".cuf4" asp 2 |
+loc loc cuf $1==4 && $2==8 | ANY4 |
remove(ALL)
- "move.w #$1,-(sp)"
- "jsr .cuf8" | | asp 6 lfr 4 loi 8 |
+ "clr.w -(sp)"
+ "move.l %[1],-(sp)"
+ | | loc $1 cal ".cuf8" |
loc loc cfi $1==4 && $2==2 | |
remove(ALL)
"move.w #$1,-(sp)"
"move.w #$2,-(sp)"
- "jsr .cfi" | | asp 8 lfr 2 |
+ | | cal ".cfi" asp 6 |
loc loc cfi $1==4 && $2==4 | |
remove(ALL)
"move.w #$1,-(sp)"
"move.w #$2,-(sp)"
- "jsr .cfi" | | asp 8 lfr 4 |
+ | | cal ".cfi" asp 4 |
loc loc cfi $1==8 && $2==2 | |
remove(ALL)
"move.w #$1,-(sp)"
"move.w #$2,-(sp)"
- "jsr .cfi" | | asp 12 lfr 2 |
+ | | cal ".cfi" asp 10 |
loc loc cfi $1==8 && $2==4 | |
remove(ALL)
"move.w #$1,-(sp)"
"move.w #$2,-(sp)"
- "jsr .cfi" | | asp 12 lfr 4 |
+ | | cal ".cfi" asp 8 |
loc loc cfu $1==4 && $2==2 | |
remove(ALL)
"move.w #$1,-(sp)"
"move.w #$2,-(sp)"
- "jsr .cfu" | | asp 8 lfr 2 |
+ | | cal ".cfu" asp 6 |
loc loc cfu $1==4 && $2==4 | |
remove(ALL)
"move.w #$1,-(sp)"
"move.w #$2,-(sp)"
- "jsr .cfu" | | asp 8 lfr 4 |
+ | | cal ".cfu" asp 4 |
loc loc cfu $1==8 && $2==2 | |
remove(ALL)
"move.w #$1,-(sp)"
"move.w #$2,-(sp)"
- "jsr .cfu" | | asp 12 lfr 2 |
+ | | cal ".cfu" asp 10 |
loc loc cfu $1==8 && $2==4 | |
remove(ALL)
"move.w #$1,-(sp)"
"move.w #$2,-(sp)"
- "jsr .cfu" | | asp 12 lfr 4 |
+ | | cal ".cfu" asp 8 |
loc loc cff $1==8 && $2==4 | |
remove(ALL)
- "jsr .cff4" | | asp 8 lfr 4 |
+ | | cal ".cff4" asp 4 |
+loc loc cff $1==4 && $2==8 | ANY4 |
+ remove(ALL)
+ "clr.l -(sp)"
+ "move.l %[1],-(sp)" | | cal ".cff8" |
loc loc cff $1==4 && $2==8 | |
remove(ALL)
- "jsr .cff8" | | asp 4 lfr 4 loi 8 |
-#else not FPPSIM
-cif | | | | loc 18 trp |
-cfi | | | | loc 18 trp |
-cuf | | | | loc 18 trp |
-cfu | | | | loc 18 trp |
-cff | | | | loc 18 trp |
-#endif FPPSIM
-
+ "move.l (sp),ax"
+ "clr.l -(sp)"
+ "move.l ax,(sp)" | | cal ".cff8" |
/* G R O U P IX : L O G I C A L */
-and defined($1) && $1 == 2 | ANY DATASCR |
+and $1 == 2 | ANY DATASCR |
"and %[1],%[2]"
setcc(%[2])
erase(%[2]) | %[2] | | (2,2)+%[1]
/* Note that the contents of an address register may not be used as
* operand of a and, or etc. instruction
*/
-and defined($1) && $1 == 4 | ANY4-ADDREG DATASCR4 |
+and $1 == 4 | ANY4-ADDREG DATASCR4 |
"and.l %[1],%[2]"
erase(%[2])
setcc(%[2]) | %[2] | | (2,3)+%[1]
lde and sde $1 == $3 && $2 == 4 | DATAREG4+EXTENDED4+DOUBLE |
remove(MEM_ALL)
"and.l %[1],$1" | | |
-and defined($1) && $1 > 4 | STACK |
+and $1 > 4 | STACK |
allocate(DATAREG4,ADDREG,DATAREG)
"move.l #$1/2-1,%[a]"
"move.l sp,%[b]"
"dbf %[a],1b" | | |
and !defined($1) | DATASCR STACK |
allocate(ADDREG,DATAREG)
- "move.l sp,%[a]"
- "sub.w #1,%[1]"
+ "lea 0(sp,%[1]),%[a]"
"asr #1,%[1]"
+ "sub.w #1,%[1]"
"1:"
"move.w (sp)+,%[b]"
"and %[b],(%[a])+"
"dbf %[1],1b"
erase(%[1]) | | |
-ior defined($1) && $1 == 2 | ANY DATASCR |
+ior $1 == 2 | ANY DATASCR |
"or %[1],%[2]"
erase(%[2])
setcc(%[2]) | %[2] | | (2,2)+%[1]
loe loc ior ste $3 == 2 && $1 == $4 | |
remove(MEM_ALL)
"or.w #$2,$1" | | | (7,11)
-ior defined($1) && $1 == 4 | ANY4-ADDREG DATASCR4 |
+ior $1 == 4 | ANY4-ADDREG DATASCR4 |
"or.l %[1],%[2]"
erase(%[2])
setcc(%[2]) | %[2] | |(2,3)+%[1]
lde ior sde $1 == $3 && $2 == 4 | DATAREG4+EXTENDED4+DOUBLE |
remove(MEM_ALL)
"or.l %[1],$1" | | |
-ior defined($1) && $1 > 4 | STACK |
+ior $1 > 4 | STACK |
allocate(DATAREG4,ADDREG,DATAREG)
"move.l #$1/2-1,%[a]"
"move.l sp,%[b]"
"dbf %[a],1b" | | |
ior !defined($1) | DATASCR STACK |
allocate(ADDREG,DATAREG)
- "move.l sp,%[a]"
- "sub.w #1,%[1]"
+ "lea 0(sp,%[1]),%[a]"
"asr #1,%[1]"
+ "sub.w #1,%[1]"
"1:"
"move.w (sp)+,%[b]"
"or %[b],(%[a])+"
"dbf %[1],1b"
erase(%[1]) | | |
-xor defined($1) && $1 == 2 | DATAREG DATASCR |
+xor $1 == 2 | DATAREG DATASCR |
"eor %[1],%[2]"
erase(%[2])
setcc(%[2]) | %[2] | | (2,2)+%[1]
allocate(ADDREG={DISPL4,LB,$1})
remove(MEM_ALL)
"eor.w %[1],(%[a])" | | |
-xor defined($1) && $1 == 4 | DATAREG4+EXTENDED4 DATASCR4 |
+xor $1 == 4 | DATAREG4+EXTENDED4 DATASCR4 |
"eor.l %[1],%[2]"
erase(%[2])
setcc(%[2]) | %[2] | | (2,3)+%[1]
lde xor sde $1 == $3 && $2 == 4 | DATAREG4+EXTENDED4+DOUBLE |
remove(MEM_ALL)
"eor.l %[1],$1" | | |
-xor defined($1) && $1 > 4 | STACK |
+xor $1 > 4 | STACK |
allocate(DATAREG4,ADDREG,DATAREG)
"move.l #$1/2-1,%[a]"
"move.l sp,%[b]"
"dbf %[a],1b" | | |
xor !defined($1) | DATASCR STACK |
allocate(ADDREG,DATAREG)
- "move.l sp,%[a]"
- "sub.w #1,%[1]"
+ "lea 0(sp,%[1]),%[a]"
"asr #1,%[1]"
+ "sub.w #1,%[1]"
"1:"
"move.w (sp)+,%[b]"
"eor %[b],(%[a])+"
"dbf %[1],1b"
erase(%[1]) | | |
-com defined($1) && $1 == 2 | DATASCR | "not %[1]"
+com $1 == 2 | DATASCR | "not %[1]"
erase(%[1])
setcc(%[1]) | %[1] | |
-com defined($1) && $1 == 4 | DATASCR4 | "not.l %[1]"
+com $1 == 4 | DATASCR4 | "not.l %[1]"
erase(%[1])
setcc(%[1]) | %[1] | |
-com defined($1) && $1 > 4 | STACK | allocate(DATAREG4,ADDREG)
+com $1 > 4 | STACK | allocate(DATAREG4,ADDREG)
"move.l #$1/2-1,%[a]"
"move.l sp,%[b]"
"1:"
"not (%[b])+"
"dbf %[a],1b" | | |
com !defined($1) | DATASCR STACK | allocate(ADDREG)
- "sub.w #1,%[1]"
"asr #1,%[1]"
+ "sub.w #1,%[1]"
"move.w sp,%[a]"
"1:"
"not (%[a])+"
"dbf %[1],1b" | | |
-rol defined($1) && $1 == 2 | DATAREG DATASCR |
+rol $1 == 2 | DATAREG DATASCR |
"rol %[1],%[2]"
erase(%[2])
setcc(%[2]) | %[2] | |
-rol defined($1) && $1 == 4 | DATAREG DATASCR4 |
+rol $1 == 4 | DATAREG DATASCR4 |
"rol.l %[1],%[2]"
erase(%[2])
setcc(%[2]) | %[2] | |
-ror defined($1) && $1 == 2 | DATAREG DATASCR |
+ror $1 == 2 | DATAREG DATASCR |
"ror %[1],%[2]"
erase(%[2])
setcc(%[2]) | %[2] | |
-ror defined($1) && $1 == 4 | DATAREG DATASCR4 |
+ror $1 == 4 | DATAREG DATASCR4 |
"ror.l %[1],%[2]"
erase(%[2])
setcc(%[2]) | %[2] | |
cmp | | remove(ALL)
"jsr .cmp"
| D1 | |
-/* floating point */
+/*
+ * Floating point
+ * Comparision
+ */
-#ifdef FPPSIM
cmf $1==4 | |
remove(ALL)
- "jsr .cmf4" | | asp 8 lfr 2 |
+ | | cal ".cmf4" asp 8 lfr 2 |
cmf $1==8 | |
remove(ALL)
- "jsr .cmf8" | | asp 16 lfr 2 |
-#else
-cmf | | | | loc 18 trp |
-#endif
+ | | cal ".cmf8" asp 16 lfr 2 |
cmi tlt and $1==2 && $3==2 | ANY DATAREG DATASCR |
"cmp %[1],%[2]"