Added floating point support

This commit is contained in:
ceriel 1988-04-28 15:16:07 +00:00
parent 0e501983f4
commit 43de234b53
10 changed files with 403 additions and 39 deletions

View file

@ -16,3 +16,4 @@ mloop9
mloopa
mloopb
mloopc
con_float.c

View file

@ -4,7 +4,7 @@ P = mloop
FILES=deffile $P0 $P1 $P2 $P3 $P4 $P5 $P6 $P7 $P8 $P9 $Pa $Pb $Pc
CPP=../../../lib/cpp
b=../../../lib/int
FLTRAP=-DFLTRAP
FLTRAP=
all: $(INTS) em
@ -14,41 +14,44 @@ em: em.c
tmp.s: $(FILES)
cat $(FILES) > tmp.s
em2_t---: tmp.s compile
./compile -o em2_t--- -P $(FLTRAP) -Dopfreq=0 -Dlast=1 -Dcount=0 -Dtest=1 -Dflow=0 -Dprof=0 tmp.s
em2_t---: tmp.s compile con_float.o
./compile -o em2_t--- -P $(FLTRAP) -Dopfreq=0 -Dlast=1 -Dcount=0 -Dtest=1 -Dflow=0 -Dprof=0 tmp.s con_float.o
em2_----: tmp.s compile
./compile -o em2_---- -P $(FLTRAP) -Dopfreq=0 -Dlast=0 -Dcount=0 -Dtest=0 -Dflow=0 -Dprof=0 tmp.s
em2_----: tmp.s compile con_float.o
./compile -o em2_---- -P $(FLTRAP) -Dopfreq=0 -Dlast=0 -Dcount=0 -Dtest=0 -Dflow=0 -Dprof=0 tmp.s con_float.o
em2_t-cp: tmp.s compile
./compile -o em2_t-cp -P $(FLTRAP) -Dopfreq=0 -Dlast=1 -Dcount=1 -Dtest=1 -Dflow=0 -Dprof=1 tmp.s
em2_t-cp: tmp.s compile con_float.o
./compile -o em2_t-cp -P $(FLTRAP) -Dopfreq=0 -Dlast=1 -Dcount=1 -Dtest=1 -Dflow=0 -Dprof=1 tmp.s con_float.o
em2_t-c-: tmp.s compile
./compile -o em2_t-c- -P $(FLTRAP) -Dopfreq=0 -Dlast=1 -Dcount=1 -Dtest=1 -Dflow=0 -Dprof=0 tmp.s
em2_t-c-: tmp.s compile con_float.o
./compile -o em2_t-c- -P $(FLTRAP) -Dopfreq=0 -Dlast=1 -Dcount=1 -Dtest=1 -Dflow=0 -Dprof=0 tmp.s con_float.o
em2_t--p: tmp.s compile
./compile -o em2_t--p -P $(FLTRAP) -Dopfreq=0 -Dlast=1 -Dcount=0 -Dtest=1 -Dflow=0 -Dprof=1 tmp.s
em2_t--p: tmp.s compile con_float.o
./compile -o em2_t--p -P $(FLTRAP) -Dopfreq=0 -Dlast=1 -Dcount=0 -Dtest=1 -Dflow=0 -Dprof=1 tmp.s con_float.o
em4_t---: tmp.s compile
./compile -o em4_t--- -P $(FLTRAP) -Dlword -Dopfreq=0 -Dlast=1 -Dcount=0 -Dtest=1 -Dflow=0 -Dprof=0 tmp.s
em4_t---: tmp.s compile con_float.o
./compile -o em4_t--- -P $(FLTRAP) -Dlword -Dopfreq=0 -Dlast=1 -Dcount=0 -Dtest=1 -Dflow=0 -Dprof=0 tmp.s con_float.o
em4_----: tmp.s compile
./compile -o em4_---- -P $(FLTRAP) -Dlword -Dopfreq=0 -Dlast=0 -Dcount=0 -Dtest=0 -Dflow=0 -Dprof=0 tmp.s
em4_----: tmp.s compile con_float.o
./compile -o em4_---- -P $(FLTRAP) -Dlword -Dopfreq=0 -Dlast=0 -Dcount=0 -Dtest=0 -Dflow=0 -Dprof=0 tmp.s con_float.o
em4_t-cp: tmp.s compile
./compile -o em4_t-cp -P $(FLTRAP) -Dlword -Dopfreq=0 -Dlast=1 -Dcount=1 -Dtest=1 -Dflow=0 -Dprof=1 tmp.s
em4_t-cp: tmp.s compile con_float.o
./compile -o em4_t-cp -P $(FLTRAP) -Dlword -Dopfreq=0 -Dlast=1 -Dcount=1 -Dtest=1 -Dflow=0 -Dprof=1 tmp.s con_float.o
em4_t-c-:tmp.s compile
./compile -o em4_t-c- -P $(FLTRAP) -Dlword -Dopfreq=0 -Dlast=1 -Dcount=1 -Dtest=1 -Dflow=0 -Dprof=0 tmp.s
em4_t-c-:tmp.s compile con_float.o
./compile -o em4_t-c- -P $(FLTRAP) -Dlword -Dopfreq=0 -Dlast=1 -Dcount=1 -Dtest=1 -Dflow=0 -Dprof=0 tmp.s con_float.o
em4_t--p: tmp.s compile
./compile -o em4_t--p -P $(FLTRAP) -Dlword -Dopfreq=0 -Dlast=1 -Dcount=0 -Dtest=1 -Dflow=0 -Dprof=1 tmp.s
em4_t--p: tmp.s compile con_float.o
./compile -o em4_t--p -P $(FLTRAP) -Dlword -Dopfreq=0 -Dlast=1 -Dcount=0 -Dtest=1 -Dflow=0 -Dprof=1 tmp.s con_float.o
con_float.o: con_float.c compile
./compile -c -L -O con_float.c
compile: Makefile
case `ack_sys` in sun*) MACH=sun2;; pmds*) MACH=pmds4;; \
m68_sysV_0) MACH=mantra;; \
m68k2) MACH=m68k2;; *) MACH=m68k4;; \
esac ; echo $$MACH -.m '$$*' > compile; chmod +x compile
esac ; echo $$MACH -r.c -.m -fp '$$*' > compile; chmod +x compile
install: all
-mkdir $b24 $b44
ls em2_???? | sed 's:em2_\(.*\):cp & $b24/em_\1:' | sh

View file

@ -0,0 +1,51 @@
/* unfortunately, we cannot just do an atof and convert result to float
is neccessary, because that might result in over/underflow at an
unexpected moment. For the time being, overflow in floating point
constants goes undetected
*/
con_float(argval, str, res)
char *str, *res;
{
double f;
double atof();
int i;
double frexp(), ldexp();
int j;
float fl;
char *p;
f = atof(str);
if (f == 0 || argval == 8) {
p = (char *) &f;
while (argval--) *res++ = *p++;
return;
}
f = frexp(f, &i);
fl = f;
fl = frexp(fl,&j);
if (i+j > 127) {
/* overflow situation. Unfortunately we don't have the
slightest idea where the floating point constant came
from, so, for the time being, just ignore
*/
*res++ = f < 0 ? 0377 : 0177;
*res++ = 0377;
*res++ = 0377;
*res = 0377;
return;
}
if (i+j < -127) {
/* underflow situation. Unfortunately we don't have the
slightest idea where the floating point constant came
from, so, for the time being, just ignore
*/
*res++ = f < 0 ? 0200 : 0;
*res++ = 0200;
*res++ = 0;
*res = 0;
return;
}
fl = ldexp(fl, i+j);
p = (char *) &fl;
while (argval--) *res++ = *p++;
}

View file

@ -86,4 +86,5 @@
bcc 7f ;\
cmp.l a6,a0 ;\
bcc 6f
#define checkfsize cmp.w #4,d0 ; beq 4f ; cmp.w #8,d0 ; beq 8f ; bra e_oddz

View file

@ -174,13 +174,33 @@ dat6: add.l d2,a3 ; move.l d2,d3
bne 6b ; add.l d3,a3
bra datloop
dofloat: add.l d2,a3
bsr atof ; bra datloop
dofloat:
move.l d2,d0
checkfsize
4:
8:
movem.l a0/a1/d0-d2,-(sp)
move.l a3,-(sp)
add.l d0,a3
move.l a4,-(sp)
move.l d0,-(sp)
bsr _con_float
lea 12(sp),sp
movem.l (sp)+,a0/a1/d0-d2
1:
tst.b (a4)+ ; bne 1b
bra datloop
#ifdef FLTRAP
!DUMMY ASCII TO FLOAT ROUTINE
atof: tst.b (a4)+ ; bne atof
_con_float:
rts
#else
__fptrp:
move.l 4(sp),d0
mov d0,-(sp)
bra error
#endif
blshift: move.l a1,a0 ; move.l #1024,d0
move.l d1,-(sp)
tst.l -(sp)

View file

@ -175,12 +175,162 @@ cuu_z: mov (sp)+,d0 ; mov (sp)+,d1
5: jmp (a4)
!--------------------------------------------------------------------------
#ifdef FLTRAP
cuf_z: cfu_z: cff_z: cfi_z: cif_z:
mov (sp)+,d0 ; subt (sp)+,d0
ext.l d0
sub.l d0,sp
#ifdef FLTRAP
bra flnim !floating point not implemented
#else
cfu_z:
clr.l d0
mov (sp)+,d0
clr.l d1
mov (sp)+,d1
move.l d1,-(sp)
move.l d0,-(sp)
checksize
2:
move.l #4,(sp)
cmp #4,d1
bne 1f
jsr .cfu
add #8,sp
2:
mov #4,-(sp)
mov #2,-(sp)
bra cuu_z
1:
cmp #8,d1
beq 1f
bra e_oddz
1:
jsr .cfu
add #12,sp
bra 2b
4:
mov d1,d0
checkfsize
4:
jsr .cfu
add #8,sp
jmp (a4)
8:
jsr .cfu
add #12,sp
jmp (a4)
cfi_z:
clr.l d0
mov (sp)+,d0
clr.l d1
mov (sp)+,d1
move.l d1,-(sp)
move.l d0,-(sp)
checksize
2:
move.l #4,(sp)
cmp #4,d1
bne 1f
jsr .cfi
add #8,sp
2:
mov #4,-(sp)
mov #2,-(sp)
bra cii_z
1:
cmp #8,d1
beq 1f
bra e_oddz
1:
jsr .cfi
add #12,sp
bra 2b
4:
mov d1,d0
checkfsize
4:
jsr .cfi
add #8,sp
jmp (a4)
8:
jsr .cfi
add #12,sp
jmp (a4)
cuf_z:
mov (sp)+,d0
checkfsize
4:
mov (sp)+,d0
checksize
2:
clr.l d0
move.w (sp)+,d0
move.l d0,-(sp)
4:
move.l #4,-(sp)
jsr .cuf4
add #4,sp
jmp (a4)
8:
mov (sp)+,d0
checksize
2:
clr.l d0
move.w (sp)+,d0
move.l d0,-(sp)
4:
move.l #4,-(sp)
jsr .cuf8
jmp (a4)
cif_z:
mov (sp)+,d0
checkfsize
4:
mov (sp)+,d0
checksize
2:
move.w (sp)+,d0
ext.l d0
move.l d0,-(sp)
4:
move.l #4,-(sp)
jsr .cif4
add #4,sp
jmp (a4)
8:
mov (sp)+,d0
checksize
2:
move.w (sp)+,d0
ext.l d0
move.l d0,-(sp)
4:
move.l #4,-(sp)
jsr .cif8
jmp (a4)
cff_z:
mov (sp)+,d0 ;
checkfsize
4:
mov (sp)+,d0 ; cmp #4,d0 ; beq 1f
cmp #8,d0 ; beq 2f
bra e_oddz
2:
jsr .cff4
add #4,sp
1:
jmp (a4)
8:
mov (sp)+,d0 ; cmp #8,d0 ; beq 1f
cmp #4,d0 ; beq 2f
bra e_oddz
2:
move.l (sp)+,d0
clr.l -(sp)
move.l d0,-(sp)
jsr .cff8
1:
jmp (a4)
#endif

View file

@ -101,25 +101,151 @@ sru_l: adroff ; move.w (a5),d0
!------------------------------------------------------------------------------
! DUMMY FLOATING POINT ROUTINES
!------------------------------------------------------------------------------
adf_l: sbf_l: mlf_l: dvf_l:
adf_l:
adroff ; move.w (a5),d0
1: add.l d0,sp
1:
#ifdef FLTRAP
bra flnim
#else
checkfsize
4:
jsr .adf4
add.l #4,sp
jmp (a4)
8:
jsr .adf8
add.l #8,sp
jmp (a4)
#endif
adf_z: sbf_z: mlf_z: dvf_z:
adf_z:
mov (sp)+,d0 ; bra 1b
adf_s0: sbf_s0: mlf_s0: dvf_s0:
adf_s0:
move.l #0,d0 ; move.b (a3)+,d0
bra 1b
fef_l: sub.l wrd,sp
fif_l: ngf_l: adroff
fef_z:
sbf_l:
adroff ; move.w (a5),d0
1:
#ifdef FLTRAP
bra flnim
#else
checkfsize
4:
jsr .sbf4
add.l #4,sp
jmp (a4)
8:
jsr .sbf8
add.l #8,sp
jmp (a4)
#endif
ngf_z: fif_z: add.l wrd,sp ; bra fef_z
sbf_z:
mov (sp)+,d0 ; bra 1b
sbf_s0:
move.l #0,d0 ; move.b (a3)+,d0
bra 1b
mlf_l:
adroff ; move.w (a5),d0
1:
#ifdef FLTRAP
bra flnim
#else
checkfsize
4:
jsr .mlf4
add.l #4,sp
jmp (a4)
8:
jsr .mlf8
add.l #8,sp
jmp (a4)
#endif
mlf_z:
mov (sp)+,d0 ; bra 1b
mlf_s0:
move.l #0,d0 ; move.b (a3)+,d0
bra 1b
dvf_l:
adroff ; move.w (a5),d0
1:
#ifdef FLTRAP
bra flnim
#else
checkfsize
4:
jsr .dvf4
add.l #4,sp
jmp (a4)
8:
jsr .dvf8
add.l #8,sp
jmp (a4)
#endif
dvf_z:
mov (sp)+,d0 ; bra 1b
dvf_s0:
move.l #0,d0 ; move.b (a3)+,d0
bra 1b
ngf_l: adroff ; move.w (a5),d0
1:
#ifdef FLTRAP
bra flnim
#else
checkfsize
4:
jsr .ngf4
jmp (a4)
8:
jsr .ngf8
jmp (a4)
#endif
ngf_z:
mov (sp)+,d0 ; bra 1b
fif_l: adroff ; move.w (a5),d0
1:
#ifdef FLTRAP
bra flnim
#else
checkfsize
4:
jsr .fif4
jmp (a4)
8:
jsr .fif8
jmp (a4)
#endif
fif_z:
mov (sp)+,d0 ; bra 1b
fef_l: adroff ; move.w (a5),d0
1:
#ifdef FLTRAP
bra flnim
#else
checkfsize
4:
move.l (sp)+,d0
clr.l -(sp)
move.l d0,-(sp)
jsr .fef4
#ifndef lword
add.l #2,sp
#endif
jmp (a4)
8:
move.l (sp)+,d0
move.l (sp)+,d1
clr.l -(sp)
move.l d1,-(sp)
move.l d0,-(sp)
jsr .fef8
#ifndef lword
add.l #2,sp
#endif
jmp (a4)
#endif
fef_z: mov (sp)+,d0 ; bra 1b

View file

@ -133,11 +133,22 @@ cms_s0: move.l d6,d0 ; move.b (a3)+,d0
! DUMMY FLOAT ROUTINES. POINTER ADJUSTMENT AND WARNING
cmf_s0: move.l d6,d0 ; move.b (a3)+,d0
#ifdef FLTRAP
9: add.w d0,d0 ; add.l d0,sp
cl -(sp)
#ifdef FLTRAP
bra flnim
#else
9:
checkfsize
4:
jsr .cmf4
lea 8(sp),sp
mov d0,-(sp)
jmp (a4)
8:
jsr .cmf8
lea 16(sp),sp
mov d0,-(sp)
jmp (a4)
#endif
cmf_l: adroff ; move.w (a5),d0 ; bra 9b

View file

@ -185,7 +185,8 @@ str_s0: move.l d6,d0 ; move.b (a3)+,d0
3: move.l d1,-(sp)
move.l d1,-(sp) ; add.l #1280,(sp)
bsr _Xbreak ; testen (sp)+
4: beq 1f ; bsr e_heap ; jmp (a4)
4: beq 1f ; testen (sp)+ ; bsr e_heap ;
move.l (sp)+,d1 ; jmp (a4)
1: move.l (sp)+,d1 ; bra 5b
!----------------------------------------------------------------------------

View file

@ -28,8 +28,8 @@ e_badmon: mov #0x19,-(sp) ; bra error
e_badlin: mov #0x1A,-(sp) ; bra error
e_badgto: mov #0x1B,-(sp) ; bra error
flnim: mov #0xB,-(sp) ; bra error
no8bar: mov #0xC,-(sp) ; bra error
flnim: bra e_illins
no8bar: bra e_oddz
!---------------------------------------------------------------------------
! ERRORS AND TRAPS
!----------------------------------------------------------------------------