📄 wfloat.s
字号:
| @(#)Wfloat.s 1.1 92/07/30 SMI| Copyright (c) 1988 by Sun Microsystems, Inc.#include "fpcrtdefs.h"#include "Wdefs.h"#include "Mdefs.h"RTENTRY(Wuns) cmpl twoto31,d0 bges 1f fpstol d0,fpa0 SREADR0 bras 2f1: fpmoves d0,fpa0 fpsubs twoto31,fpa0 | Subtract 2**31. fpstol fpa0,fpa0 fpmoves fpa0,d0 bchg #31,d0 | Add 2**31.2: RETtwoto31: .long 0x4f000000 | 2**31.dtwoto31: .double 0r2.147483648000000000E+9 | 2**31RTENTRY(Wund) cmpl dtwoto31,d0 bges 1f fpdtol d0:d1,fpa0 SREADR0 bras 2f1: fpmoved d0:d1,fpa0 fpsubd dtwoto31,fpa0 | Subtract 2**31. fpdtol fpa0,fpa0 fpmoves fpa0,d0 bchg #31,d0 | Add 2**31.2: RETSMONADIC(Wflts,lto)SMONADIC(Wsqrs,sqr)SDYADIC(Wadds,add)SDYADIC(Wsubs,sub)SDYADIC(Wmuls,mul)SDYADIC(Wdivs,div)RTENTRY(Wints) fpstol d0,fpa0 SREADR0 RETRTENTRY(Wrints) fpmoves d0,fpa0 fpmove fpamode,d0 andl #0xf,d0 | Clear garbage bits. movel d0,d1 bclr #1,d0 fpmove d0,fpamode fpstol fpa0,fpa0 fpmove d1,fpamode SREADR0 RETRTENTRY(Wnints) SWRITER0 | fpa0 := x. bpls 1f cmpl mshalf,d0 blts 3f cmpl msthreshold,d0 bges 2f | No add/sub if big enough. fpsubs shalf,fpa0 | fpa0 := x - 0.5. bras 2f3: clrl d0 bras 4f1: cmpl shalf,d0 blts 3b cmpl sthreshold,d0 bges 2f | No add/sub if big enough. fpadds shalf,fpa0 | fpa0 := x + 0.5.2: fpstol fpa0,fpa0 | fpa0 := nint(x). SREADR04: RETshalf: .single 0r0.5mshalf: .single 0r-0.5sthreshold: .single 0r8388608msthreshold: .single 0r-8388608RTENTRY(Wcmps) SWRITER0 SDYADOP(cmp) READFPACC RETENTER(Wscaleis) fmoves d0,fp0 fscalel d1,fp0 fmoves fp0,d0 RET RTENTRY(Wstod) fpstod d0,fpa0 DREADR0 RETRTENTRY(Wdtos) fpdtos d0:d1,fpa0 SREADR0 RETRTENTRY(Wfltd) fpltod d0,fpa0 DREADR0 RETDMONADIC(Wsqrd,sqr)DDYADIC(Waddd,add)DDYADIC(Wsubd,sub)DDYADIC(Wmuld,mul)DDYADIC(Wdivd,div)RTENTRY(Wintd) fpdtol d0:d1,fpa0 SREADR0 RETRTENTRY(Wrintd) fpmoved d0:d1,fpa0 fpmove fpamode,d0 andl #0xf,d0 | Clear garbage bits. movel d0,d1 bclr #1,d0 fpmove d0,fpamode fpdtol fpa0,fpa0 fpmove d1,fpamode SREADR0 RETRTENTRY(Wnintd) movel d1,FPABASEADDRESS+(0xc04) movel d0,FPABASEADDRESS+(0xc00) bpls 1f cmpl mdhalf,d0 blts 3f cmpl mdthreshold,d0 bges 2f fpsubd dhalf,fpa0 bras 2f3: clrl d0 bras 4f1: cmpl dhalf,d0 blts 3b cmpl dthreshold,d0 bges 2f fpaddd dhalf,fpa02: fpdtol fpa0,fpa0 | r0 := int(r0). SREADR04: RETdhalf: .double 0r0.5mdhalf: .double 0r-0.5dthreshold: .double 0r4.503599627370496000E+15mdthreshold: .double 0r-4.503599627370496000E+15RTENTRY(Wcmpd) DWRITER0 DDYADOP(cmp) READFPACC RETENTER(Wscaleid) FMOVEDIN fscalel a0@,fp0 fmoved fp0,sp@ moveml sp@+,d0/d1 RETRTENTRY(Wstatus) movel d0,d1 fmovel fpsr,d0 fmovel d1,fpsr btst #3,d1 bnes 1f | Branch if accrued inexact on. movel #1,FPABASEADDRESS+0xf14 | Enable FPA inexact mask.1: RETRTENTRY(Wmode) movel d0,a0 fmovel fpcr,d0 andl #0xffffffcf,d0 | Clear round direction. fpmove fpamode,d1 | d1 gets FPA mode. andl #0xc,d1 | Clear all but round direction. lslb #2,d1 | Align for 68881. orb d1,d0 | Insert. btst #5,d0 beqs 1f | Branch if rn or rz. bchg #4,d0 | Reverse rm and rp.1: exg d0,a0 | a0 gets old mode. | d0 gets new mode. fmovel d0,fpcr | Load new mode to 68881. btst #9,d0 beqs 1f | Branch if inexact disabled. movel #1,FPABASEADDRESS+0xf14 | Enable FPA inexact mask.1: fpmove fpamode,d1 andl #3,d1 | Clear round direction. andl #0x30,d0 | Get round bits. btst #5,d0 beqs 1f | Branch if rn or rz. bchg #4,d0 | Reverse rm and rp.1: lsrb #2,d0 orb d0,d1 fpmove d1,fpamode | Set FPA mode bits. movel a0,d0 | Set up old mode return value. RETRTENTRY(_fpamode_) movel PARAM,a0 | Get address of long argument. movel a0@,d1 | Get long argument. fpmove fpamode,d0 andl #0xf,d0 | Clear junk bits. andl #0xf,d1 | Clear junk bits. fpmove d1,fpamode RET| C entry points for use by fpa_handler and fpa_recompute to avoid circularity| of references via winitfp -> fpmode -> VinitRTENTRY(_Wmode) movel PARAM,d0 jsr Wmode RETRTENTRY(_Wstatus) movel PARAM,d0 jsr Wstatus RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -