ack/mach/m68020/libem/fp68881.s

300 lines
4 KiB
ArmAsm

.define .adf4, .adf8, .sbf4, .sbf8, .mlf4, .mlf8, .dvf4, .dvf8
.define .ngf4, .ngf8, .fif4, .fif8, .fef4, .fef8
.define .cif4, .cif8, .cuf4, .cuf8, .cfi, .cfu, .cff4, .cff8
.define .cmf4, .cmf8
.sect .text
.sect .rom
.sect .data
.sect .bss
! $Header$
! Implement interface to floating point package for M68881
.sect .text
.adf4:
move.l (sp)+,a0
fmove.s (sp),fp0
fadd.s (4,sp),fp0
fmove.s fp0,(4,sp)
jmp (a0)
.adf8:
move.l (sp)+,a0
fmove.d (sp),fp0
fadd.d (8,sp),fp0
fmove.d fp0,(8,sp)
jmp (a0)
.sbf4:
move.l (sp)+,a0
fmove.s (sp),fp0
fmove.s (4,sp),fp1
fsub fp0,fp1
fmove.s fp1,(4,sp)
jmp (a0)
.sbf8:
move.l (sp)+,a0
fmove.d (sp),fp0
fmove.d (8,sp),fp1
fsub fp0,fp1
fmove.d fp1,(8,sp)
jmp (a0)
.mlf4:
move.l (sp)+,a0
fmove.s (sp),fp0
fmul.s (4,sp),fp0
fmove.s fp0,(4,sp)
jmp (a0)
.mlf8:
move.l (sp)+,a0
fmove.d (sp),fp0
fmul.d (8,sp),fp0
fmove.d fp0,(8,sp)
jmp (a0)
.dvf4:
move.l (sp)+,a0
fmove.s (sp),fp0
fmove.s (4,sp),fp1
fdiv fp0,fp1
fmove.s fp1,(4,sp)
jmp (a0)
.dvf8:
move.l (sp)+,a0
fmove.d (sp),fp0
fmove.d (8,sp),fp1
fdiv fp0,fp1
fmove.d fp1,(8,sp)
jmp (a0)
.ngf4:
fmove.s (4,sp),fp0
fneg fp0
fmove.s fp0,(4,sp)
rts
.ngf8:
fmove.d (4,sp),fp0
fneg fp0
fmove.d fp0,(4,sp)
rts
.fif4:
move.l (sp)+,a0
move.l (sp),a1
fmove.s (4,sp),fp0
fmove.s (8,sp),fp1
fmul fp0,fp1
fintrz fp1,fp0
fsub fp0,fp1
fmove.s fp1,(4,a1)
fmove.s fp0,(a1)
jmp (a0)
.fif8:
move.l (sp)+,a0
move.l (sp),a1
fmove.d (4,sp),fp0
fmove.d (12,sp),fp1
fmul fp0,fp1
fintrz fp1,fp0
fsub fp0,fp1
fmove.d fp1,(8,a1)
fmove.d fp0,(a1)
jmp (a0)
.fef4:
move.l (sp)+,a0
move.l (sp),a1
fmove.s (4,sp),fp0
fgetexp fp0,fp1
fmove.l fpsr,d0
and.l #0x2000,d0 ! set if Infinity
beq 1f
move.l #129,(a1)
fmove.s (4,sp),fp0
fblt 2f
move.l #0x3f000000,(4,a1)
jmp (a0)
2:
move.l #0xbf000000,(4,a1)
jmp (a0)
1:
fmove.l fp1,d0
add.l #1,d0
fgetman fp0
fbne 1f
clr.l d0
bra 2f
1:
fmove.l #2,fp1
fdiv fp1,fp0
2:
fmove.s fp0,(4,a1)
move.l d0,(a1)
jmp (a0)
.fef8:
move.l (sp)+,a0
move.l (sp),a1
fmove.d (4,sp),fp0
fgetexp fp0,fp1
fmove.l fpsr,d0
and.l #0x2000,d0 ! set if Infinity
beq 1f
move.l #1025,(a1)
fmove.d (4,sp),fp0
fblt 2f
move.l #0x3fe00000,(4,a1)
clr.l (8,a1)
jmp (a0)
2:
move.l #0xbfe00000,(4,a1)
clr.l (8,a1)
jmp (a0)
1:
fmove.l fp1,d0
add.l #1,d0
fgetman fp0
fbne 1f
clr.l d0
bra 2f
1:
fmove.l #2,fp1
fdiv fp1,fp0
2:
fmove.d fp0,(4,a1)
move.l d0,(a1)
jmp (a0)
.cif4:
move.l (sp)+,a0
fmove.l (4,sp),fp0
fmove.s fp0,(4,sp)
jmp (a0)
.cif8:
move.l (sp)+,a0
fmove.l (4,sp),fp0
fmove.d fp0,(sp)
jmp (a0)
.cuf4:
move.l (sp)+,a0
fmove.l (4,sp),fp0
tst.l (4,sp)
bge 1f
fsub.l #-2147483648,fp0
fsub.l #-2147483648,fp0
1:
fmove.s fp0,(4,sp)
jmp (a0)
.cuf8:
move.l (sp)+,a0
fmove.l (4,sp),fp0
tst.l (4,sp)
bge 1f
fsub.l #-2147483648,fp0
fsub.l #-2147483648,fp0
1:
fmove.d fp0,(sp)
jmp (a0)
.cfi:
move.l (sp)+,a0
move.l (4,sp),d0
cmp.l #4,d0
bne 1f
fmove.s (8,sp),fp0
fintrz fp0,fp0
fmove.l fp0,(8,sp)
jmp (a0)
1:
fmove.d (8,sp),fp0
fintrz fp0,fp0
fmove.l fp0,(12,sp)
jmp (a0)
.cfu:
move.l (sp)+,a0
move.l (4,sp),d0
cmp.l #4,d0
bne 1f
fmove.s (8,sp),fp0
fabs fp0
cmp.l #0x4f000000,(8,sp)
bge 2f
fintrz fp0,fp0
fmove.l fp0,(8,sp)
jmp (a0)
2:
fadd.l #-2147483648,fp0
fintrz fp0,fp0
fmove.l fp0,d0
bchg #31,d0
move.l d0,(8,sp)
jmp (a0)
1:
fmove.d (8,sp),fp0
fabs fp0
cmp.l #0x41e00000,(8,sp)
bge 1f
fintrz fp0,fp0
fmove.l fp0,(12,sp)
jmp (a0)
1:
fadd.l #-2147483648,fp0
fintrz fp0,fp0
fmove.l fp0,d0
bchg #31,d0
move.l d0,(12,sp)
jmp (a0)
.cff4:
move.l (sp)+,a0
fmove.d (sp),fp0
fmove.s fp0,(4,sp)
jmp (a0)
.cff8:
move.l (sp)+,a0
fmove.s (sp),fp0
fmove.d fp0,(sp)
jmp (a0)
.cmf4:
move.l (sp)+,a0
clr.l d0
fmove.s (sp),fp0
fmove.s (4,sp),fp1
fcmp fp0,fp1
fbeq 2f
fblt 1f
add.l #1,d0
jmp (a0)
1:
sub.l #1,d0
2:
jmp (a0)
.cmf8:
move.l (sp)+,a0
clr.l d0
fmove.d (sp),fp0
fmove.d (8,sp),fp1
fcmp fp0,fp1
fbeq 2f
fblt 1f
add.l #1,d0
jmp (a0)
1:
sub.l #1,d0
2:
jmp (a0)