Added fp8087.s
authorceriel <none@none>
Mon, 27 Nov 1989 16:19:16 +0000 (16:19 +0000)
committerceriel <none@none>
Mon, 27 Nov 1989 16:19:16 +0000 (16:19 +0000)
mach/i86/libem/LIST
mach/i86/libem/fp8087.s [new file with mode: 0644]

index 5288b21..aeb8783 100644 (file)
@@ -17,7 +17,7 @@ dvi4.s
 dvu.s
 dvu4.s
 exg.s
-fakfp.s
+fp8087.s
 gto.s
 iaar.s
 ilar.s
diff --git a/mach/i86/libem/fp8087.s b/mach/i86/libem/fp8087.s
new file mode 100644 (file)
index 0000000..d963505
--- /dev/null
@@ -0,0 +1,518 @@
+.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 Intel 8087
+
+       .sect .rom
+one:
+       .data2  1
+two:
+       .data2  2
+bigmin:
+       .data4  -2147483648
+
+       .sect .text
+.adf4:
+       mov     bx,sp
+       wait
+       flds    2(bx)
+       fadds   6(bx)
+       fstps   6(bx)
+       wait
+       ret
+.adf8:
+       mov     bx,sp
+       wait
+       fldd    2(bx)
+       faddd   10(bx)
+       fstpd   10(bx)
+       wait
+       ret
+
+.sbf4:
+       mov     bx,sp
+       wait
+       flds    6(bx)
+       fsubs   2(bx)
+       fstps   6(bx)
+       wait
+       ret
+
+.sbf8:
+       mov     bx,sp
+       wait
+       fldd    10(bx)
+       fsubd   2(bx)
+       fstpd   10(bx)
+       wait
+       ret
+
+.mlf4:
+       mov     bx,sp
+       wait
+       flds    2(bx)
+       fmuls   6(bx)
+       fstps   6(bx)
+       wait
+       ret
+.mlf8:
+       mov     bx,sp
+       wait
+       fldd    2(bx)
+       fmuld   10(bx)
+       fstpd   10(bx)
+       wait
+       ret
+
+.dvf4:
+       mov     bx,sp
+       wait
+       flds    6(bx)
+       fdivs   2(bx)
+       fstps   6(bx)
+       wait
+       ret
+
+.dvf8:
+       mov     bx,sp
+       wait
+       fldd    10(bx)
+       fdivd   2(bx)
+       fstpd   10(bx)
+       wait
+       ret
+
+.ngf4:
+       mov     bx,sp
+       wait
+       flds    2(bx)
+       fchs
+       fstps   2(bx)
+       wait
+       ret
+
+.ngf8:
+       mov     bx,sp
+       wait
+       fldd    2(bx)
+       fchs
+       fstpd   2(bx)
+       wait
+       ret
+
+.fif4:
+       mov     bx,sp
+       push    bx              ! make room for FP status word
+       wait
+       flds    4(bx)
+       fmuls   8(bx)           ! multiply
+       fld     st              ! copy result
+       ftst                    ! test sign; handle negative separately
+       fstsw   -2(bx)
+       wait
+       mov     ax,-2(bx)
+       sahf                    ! result of test in condition codes
+       jb      1f
+       frndint                 ! this one rounds (?)
+       fcom    st(1)           ! compare with original; if <=, then OK
+       fstsw   -2(bx)
+       wait
+       mov     ax,-2(bx)
+       sahf
+       jbe     2f
+       fisubs  (one)           ! else subtract 1
+       jmp     2f
+1:                             ! here, negative case
+       frndint                 ! this one rounds (?)
+       fcom    st(1)           ! compare with original; if >=, then OK
+       fstsw   -2(bx)
+       wait
+       mov     ax,-2(bx)
+       sahf
+       jae     2f
+       fiadds  (one)           ! else add 1
+2:
+       fsub    st(1),st        ! subtract integer part
+       mov     bx,2(bx)
+       fstps   (bx)
+       fstps   4(bx)
+       wait
+       pop     bx
+       ret
+
+.fif8:
+       mov     bx,sp
+       push    bx              ! make room for FP status word
+       wait
+       fldd    4(bx)
+       fmuld   12(bx)          ! multiply
+       fld     st              ! and copy result
+       ftst                    ! test sign; handle negative separately
+       fstsw   -2(bx)
+       wait
+       mov     ax,-2(bx)
+       sahf                    ! result of test in condition codes
+       jb      1f
+       frndint                 ! this one rounds (?)
+       fcom    st(1)           ! compare with original; if <=, then OK
+       fstsw   -2(bx)
+       wait
+       mov     ax,-2(bx)
+       sahf
+       jbe     2f
+       fisubs  (one)           ! else subtract 1
+       jmp     2f
+1:                             ! here, negative case
+       frndint                 ! this one rounds (?)
+       fcom    st(1)           ! compare with original; if >=, then OK
+       fstsw   -2(bx)
+       wait
+       mov     ax,-2(bx)
+       sahf
+       jae     2f
+       fiadds  (one)           ! else add 1
+2:
+       fsub    st(1),st        ! subtract integer part
+       mov     bx,2(bx)
+       fstpd   (bx)
+       fstpd   8(bx)
+       wait
+       pop     bx
+       ret
+
+.fef4:
+                               ! this could be simpler, if only the
+                               ! fxtract instruction was emulated properly
+       mov     bx,sp
+       mov     ax,6(bx)
+       and     ax,077600
+       je      1f              ! zero exponent
+       mov     cx,7
+       shr     ax,cl
+       sub     ax,126
+       mov     cx,ax           ! exponent in cx
+       mov     ax,6(bx)
+       and     ax,0100177
+       or      ax,0037400      ! load -1 exponent
+       mov     dx,4(bx)
+       mov     bx,2(bx)
+       mov     4(bx),ax
+       mov     2(bx),dx
+       mov     (bx),cx
+       ret
+1:                             ! we get here on zero exp
+       mov     ax,6(bx)
+       and     ax,0177
+       mov     6(bx),ax
+       or      ax,4(bx)
+       jne     1f              ! zero result
+       xor     ax,ax
+       mov     bx,2(bx)
+       mov     (bx),ax
+       mov     2(bx),ax
+       mov     4(bx),ax
+       ret
+1:                             ! otherwise unnormalized number
+       mov     cx,6(bx)
+       mov     dx,cx
+       and     cx,0x8000
+       mov     ax,-125
+2:
+       test    dx,0x80
+       jne     1f
+       dec     ax
+       shl     4(bx),1
+       rcl     dx,1
+       or      dx,cx
+       jmp     2b
+1:
+       mov     cx,4(bx)
+       mov     bx,2(bx)
+       mov     (bx),ax
+       mov     2(bx),cx
+       and     dx,0100177
+       or      dx,0037400      ! load -1 exponent
+       mov     4(bx),dx
+       ret
+
+.fef8:
+                               ! this could be simpler, if only the
+                               ! fxtract instruction was emulated properly
+       mov     bx,sp
+       mov     ax,10(bx)
+       and     ax,077760
+       je      1f              ! zero exponent
+       mov     cx,4
+       shr     ax,cl
+       sub     ax,1022
+       mov     cx,ax           ! exponent in cx
+       mov     ax,10(bx)
+       and     ax,0100017
+       or      ax,0037740      ! load -1 exponent
+       push    8(bx)
+       push    6(bx)
+       push    4(bx)
+       mov     bx,2(bx)
+       pop     2(bx)
+       pop     4(bx)
+       pop     6(bx)
+       mov     8(bx),ax
+       mov     (bx),cx
+       ret
+1:                             ! we get here on zero exp
+       mov     ax,10(bx)
+       and     ax,017
+       mov     10(bx),ax
+       or      ax,8(bx)
+       or      ax,6(bx)
+       or      ax,4(bx)
+       jne     1f              ! zero result
+       xor     ax,ax
+       mov     bx,2(bx)
+       mov     (bx),ax
+       mov     2(bx),ax
+       mov     4(bx),ax
+       mov     6(bx),ax
+       mov     8(bx),ax
+       ret
+1:                             ! otherwise unnormalized number
+       mov     cx,10(bx)
+       mov     dx,cx
+       and     cx,0x8000
+       mov     ax,-1021
+2:
+       test    dx,0x10
+       jne     1f
+       dec     ax
+       shl     4(bx),1
+       rcl     6(bx),1
+       rcl     8(bx),1
+       rcl     dx,1
+       or      dx,cx
+       jmp     2b
+1:
+       and     dx,0100017
+       or      dx,0037740      ! load -1 exponent
+       mov     cx,8(bx)
+       push    6(bx)
+       push    4(bx)
+       mov     bx,2(bx)
+       mov     (bx),ax
+       mov     8(bx),dx
+       mov     6(bx),cx
+       pop     2(bx)
+       pop     4(bx)
+       ret
+
+.cif4:
+       mov     bx,sp
+       cmp     2(bx),2
+       jne     1f
+       filds   4(bx)
+       fstps   2(bx)
+       wait
+       ret
+1:
+       fildl   4(bx)
+       fstps   4(bx)
+       wait
+       ret
+
+.cif8:
+       mov     bx,sp
+       cmp     2(bx),2
+       jne     1f
+       filds   4(bx)
+       fstpd   2(bx)
+       wait
+       ret
+1:
+       fildl   4(bx)
+       fstpd   2(bx)
+       wait
+       ret
+
+.cuf4:
+       mov     bx,sp
+       cmp     2(bx),2
+       jne     1f
+       mov     ax,4(bx)
+       mov     2(bx),ax
+       mov     4(bx),0
+       fildl   2(bx)
+       fstps   2(bx)
+       wait
+       ret
+1:
+       fildl   4(bx)
+       cmp     6(bx),0
+       jge     1f
+2:
+       fisubl  (bigmin)
+       fisubl  (bigmin)
+1:
+       fstps   4(bx)
+       wait
+       ret
+
+.cuf8:
+       mov     bx,sp
+       cmp     2(bx),2
+       jne     1f
+       mov     6(bx),0
+1:
+       fildl   4(bx)
+       cmp     6(bx),0
+       jge     1f
+2:
+       fisubl  (bigmin)
+       fisubl  (bigmin)
+1:
+       fstpd   2(bx)
+       wait
+       ret
+
+.cfi:
+       mov     bx,sp
+       push    bx
+       fstcw   -2(bx)
+       wait
+       mov     dx,-2(bx)
+       or      -2(bx),0xc00    ! truncating mode
+       wait
+       fldcw   -2(bx)
+       pop     ax
+       cmp     4(bx),4
+       jne     2f
+                               ! loc 4 loc ? cfi
+       flds    6(bx)
+       fistpl  6(bx)
+       wait
+       cmp     2(bx),2
+       jne     1f
+       mov     ax,6(bx)
+1:
+       mov     4(bx),dx
+       wait
+       fldcw   4(bx)
+       ret
+2:
+                               ! loc 8 loc ? cfi
+       fldd    6(bx)
+       fistpl  10(bx)
+       wait
+       cmp     2(bx),2
+       jne     1b
+       mov     ax,10(bx)
+       jmp     1b
+
+.cfu:
+       mov     bx,sp
+       push    bx
+       fstcw   -2(bx)
+       wait
+       mov     dx,-2(bx)
+       or      -2(bx),0xc00    ! truncating mode
+       wait
+       fldcw   -2(bx)
+       pop     ax
+       cmp     4(bx),4
+       jne     2f
+                               ! loc 4 loc ? cfu
+       flds    6(bx)
+       fabs                    ! ???
+       fistpl  6(bx)
+       wait
+       cmp     2(bx),2
+       jne     1f
+       mov     ax,6(bx)
+1:
+       mov     4(bx),dx
+       wait
+       fldcw   4(bx)
+       ret
+2:
+                               ! loc 8 loc ? cfu
+       fldd    6(bx)
+       fabs                    ! ???
+       fistpl  10(bx)
+       wait
+       cmp     2(bx),2
+       jne     1b
+       mov     ax,10(bx)
+       jmp     1b
+
+.cff4:
+       mov     bx,sp
+       wait
+       fldd    2(bx)
+       fstcw   2(bx)
+       wait
+       mov     dx,2(bx)
+       and     2(bx),0xf3ff    ! set to rounding mode
+       wait
+       fldcw   2(bx)
+       fstps   6(bx)
+       mov     2(bx),dx
+       wait
+       fldcw   2(bx)
+       wait
+       ret
+
+.cff8:
+       mov     bx,sp
+       wait
+       flds    2(bx)
+       fstpd   2(bx)
+       wait
+       ret
+
+.cmf4:
+       mov     bx,sp
+       push    bx              ! room for 8087 status word
+       xor     cx,cx
+       flds    6(bx)
+       flds    2(bx)
+       fcompp                  ! compare and pop operands
+       fstsw   -2(bx)
+       wait
+       mov     ax,-2(bx)
+       sahf
+       je      1f
+       jb      2f
+       dec     cx
+       jmp     1f
+2:
+       inc     cx
+1:
+       mov     ax,cx
+       pop     bx
+       ret
+
+
+.cmf8:
+       mov     bx,sp
+       push    bx              ! room for 8087 status word
+       xor     cx,cx
+       fldd    10(bx)
+       fldd    2(bx)
+       fcompp                  ! compare and pop operands
+       fstsw   -2(bx)
+       wait
+       mov     ax,-2(bx)
+       sahf
+       je      1f
+       jb      2f
+       dec     cx
+       jmp     1f
+2:
+       inc     cx
+1:
+       mov     ax,cx
+       pop     bx
+       ret