ack/mach/m68020/libem/fp68881.s

300 lines
4 KiB
ArmAsm
Raw Permalink Normal View History

1989-08-01 16:32:34 +00:00
.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
1994-06-24 14:02:31 +00:00
! $Id$
1989-08-01 16:32:34 +00:00
! 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
1989-08-09 14:37:37 +00:00
fmove.l fpsr,d0
and.l #0x2000,d0 ! set if Infinity
beq 1f
move.l #129,(a1)
fmove.s (4,sp),fp0
fblt 2f
1989-08-09 14:37:37 +00:00
move.l #0x3f000000,(4,a1)
jmp (a0)
2:
move.l #0xbf000000,(4,a1)
jmp (a0)
1989-08-09 14:37:37 +00:00
1:
1989-08-01 16:32:34 +00:00
fmove.l fp1,d0
add.l #1,d0
fgetman fp0
1989-08-15 09:02:38 +00:00
fbne 1f
clr.l d0
bra 2f
1:
1989-08-01 16:32:34 +00:00
fmove.l #2,fp1
fdiv fp1,fp0
1989-08-15 09:02:38 +00:00
2:
1989-08-01 16:32:34 +00:00
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
1989-08-09 14:37:37 +00:00
fmove.l fpsr,d0
and.l #0x2000,d0 ! set if Infinity
beq 1f
move.l #1025,(a1)
fmove.d (4,sp),fp0
fblt 2f
1989-08-09 14:37:37 +00:00
move.l #0x3fe00000,(4,a1)
clr.l (8,a1)
jmp (a0)
2:
move.l #0xbfe00000,(4,a1)
clr.l (8,a1)
jmp (a0)
1989-08-09 14:37:37 +00:00
1:
1989-08-01 16:32:34 +00:00
fmove.l fp1,d0
add.l #1,d0
fgetman fp0
1989-08-15 09:02:38 +00:00
fbne 1f
clr.l d0
bra 2f
1:
1989-08-01 16:32:34 +00:00
fmove.l #2,fp1
fdiv fp1,fp0
1989-08-15 09:02:38 +00:00
2:
1989-08-01 16:32:34 +00:00
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
1989-08-01 16:32:34 +00:00
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)
1989-08-01 16:32:34 +00:00
1:
fmove.d (8,sp),fp0
fabs fp0
cmp.l #0x41e00000,(8,sp)
bge 1f
1989-08-01 16:32:34 +00:00
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)
1989-08-01 16:32:34 +00:00
.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)