summaryrefslogtreecommitdiff
path: root/ANDROID_3.4.5/arch/m68k/fpsp040/kernel_ex.S
diff options
context:
space:
mode:
Diffstat (limited to 'ANDROID_3.4.5/arch/m68k/fpsp040/kernel_ex.S')
-rw-r--r--ANDROID_3.4.5/arch/m68k/fpsp040/kernel_ex.S493
1 files changed, 0 insertions, 493 deletions
diff --git a/ANDROID_3.4.5/arch/m68k/fpsp040/kernel_ex.S b/ANDROID_3.4.5/arch/m68k/fpsp040/kernel_ex.S
deleted file mode 100644
index 45bcf345..00000000
--- a/ANDROID_3.4.5/arch/m68k/fpsp040/kernel_ex.S
+++ /dev/null
@@ -1,493 +0,0 @@
-|
-| kernel_ex.sa 3.3 12/19/90
-|
-| This file contains routines to force exception status in the
-| fpu for exceptional cases detected or reported within the
-| transcendental functions. Typically, the t_xx routine will
-| set the appropriate bits in the USER_FPSR word on the stack.
-| The bits are tested in gen_except.sa to determine if an exceptional
-| situation needs to be created on return from the FPSP.
-|
-
-| Copyright (C) Motorola, Inc. 1990
-| All Rights Reserved
-|
-| For details on the license for this file, please see the
-| file, README, in this same directory.
-
-KERNEL_EX: |idnt 2,1 | Motorola 040 Floating Point Software Package
-
- |section 8
-
-#include "fpsp.h"
-
-mns_inf: .long 0xffff0000,0x00000000,0x00000000
-pls_inf: .long 0x7fff0000,0x00000000,0x00000000
-nan: .long 0x7fff0000,0xffffffff,0xffffffff
-huge: .long 0x7ffe0000,0xffffffff,0xffffffff
-
- |xref ovf_r_k
- |xref unf_sub
- |xref nrm_set
-
- .global t_dz
- .global t_dz2
- .global t_operr
- .global t_unfl
- .global t_ovfl
- .global t_ovfl2
- .global t_inx2
- .global t_frcinx
- .global t_extdnrm
- .global t_resdnrm
- .global dst_nan
- .global src_nan
-|
-| DZ exception
-|
-|
-| if dz trap disabled
-| store properly signed inf (use sign of etemp) into fp0
-| set FPSR exception status dz bit, condition code
-| inf bit, and accrued dz bit
-| return
-| frestore the frame into the machine (done by unimp_hd)
-|
-| else dz trap enabled
-| set exception status bit & accrued bits in FPSR
-| set flag to disable sto_res from corrupting fp register
-| return
-| frestore the frame into the machine (done by unimp_hd)
-|
-| t_dz2 is used by monadic functions such as flogn (from do_func).
-| t_dz is used by monadic functions such as satanh (from the
-| transcendental function).
-|
-t_dz2:
- bsetb #neg_bit,FPSR_CC(%a6) |set neg bit in FPSR
- fmovel #0,%FPSR |clr status bits (Z set)
- btstb #dz_bit,FPCR_ENABLE(%a6) |test FPCR for dz exc enabled
- bnes dz_ena_end
- bras m_inf |flogx always returns -inf
-t_dz:
- fmovel #0,%FPSR |clr status bits (Z set)
- btstb #dz_bit,FPCR_ENABLE(%a6) |test FPCR for dz exc enabled
- bnes dz_ena
-|
-| dz disabled
-|
- btstb #sign_bit,ETEMP_EX(%a6) |check sign for neg or pos
- beqs p_inf |branch if pos sign
-
-m_inf:
- fmovemx mns_inf,%fp0-%fp0 |load -inf
- bsetb #neg_bit,FPSR_CC(%a6) |set neg bit in FPSR
- bras set_fpsr
-p_inf:
- fmovemx pls_inf,%fp0-%fp0 |load +inf
-set_fpsr:
- orl #dzinf_mask,USER_FPSR(%a6) |set I,DZ,ADZ
- rts
-|
-| dz enabled
-|
-dz_ena:
- btstb #sign_bit,ETEMP_EX(%a6) |check sign for neg or pos
- beqs dz_ena_end
- bsetb #neg_bit,FPSR_CC(%a6) |set neg bit in FPSR
-dz_ena_end:
- orl #dzinf_mask,USER_FPSR(%a6) |set I,DZ,ADZ
- st STORE_FLG(%a6)
- rts
-|
-| OPERR exception
-|
-| if (operr trap disabled)
-| set FPSR exception status operr bit, condition code
-| nan bit; Store default NAN into fp0
-| frestore the frame into the machine (done by unimp_hd)
-|
-| else (operr trap enabled)
-| set FPSR exception status operr bit, accrued operr bit
-| set flag to disable sto_res from corrupting fp register
-| frestore the frame into the machine (done by unimp_hd)
-|
-t_operr:
- orl #opnan_mask,USER_FPSR(%a6) |set NaN, OPERR, AIOP
-
- btstb #operr_bit,FPCR_ENABLE(%a6) |test FPCR for operr enabled
- bnes op_ena
-
- fmovemx nan,%fp0-%fp0 |load default nan
- rts
-op_ena:
- st STORE_FLG(%a6) |do not corrupt destination
- rts
-
-|
-| t_unfl --- UNFL exception
-|
-| This entry point is used by all routines requiring unfl, inex2,
-| aunfl, and ainex to be set on exit.
-|
-| On entry, a0 points to the exceptional operand. The final exceptional
-| operand is built in FP_SCR1 and only the sign from the original operand
-| is used.
-|
-t_unfl:
- clrl FP_SCR1(%a6) |set exceptional operand to zero
- clrl FP_SCR1+4(%a6)
- clrl FP_SCR1+8(%a6)
- tstb (%a0) |extract sign from caller's exop
- bpls unfl_signok
- bset #sign_bit,FP_SCR1(%a6)
-unfl_signok:
- leal FP_SCR1(%a6),%a0
- orl #unfinx_mask,USER_FPSR(%a6)
-| ;set UNFL, INEX2, AUNFL, AINEX
-unfl_con:
- btstb #unfl_bit,FPCR_ENABLE(%a6)
- beqs unfl_dis
-
-unfl_ena:
- bfclr STAG(%a6){#5:#3} |clear wbtm66,wbtm1,wbtm0
- bsetb #wbtemp15_bit,WB_BYTE(%a6) |set wbtemp15
- bsetb #sticky_bit,STICKY(%a6) |set sticky bit
-
- bclrb #E1,E_BYTE(%a6)
-
-unfl_dis:
- bfextu FPCR_MODE(%a6){#0:#2},%d0 |get round precision
-
- bclrb #sign_bit,LOCAL_EX(%a0)
- sne LOCAL_SGN(%a0) |convert to internal ext format
-
- bsr unf_sub |returns IEEE result at a0
-| ;and sets FPSR_CC accordingly
-
- bfclr LOCAL_SGN(%a0){#0:#8} |convert back to IEEE ext format
- beqs unfl_fin
-
- bsetb #sign_bit,LOCAL_EX(%a0)
- bsetb #sign_bit,FP_SCR1(%a6) |set sign bit of exc operand
-
-unfl_fin:
- fmovemx (%a0),%fp0-%fp0 |store result in fp0
- rts
-
-
-|
-| t_ovfl2 --- OVFL exception (without inex2 returned)
-|
-| This entry is used by scale to force catastrophic overflow. The
-| ovfl, aovfl, and ainex bits are set, but not the inex2 bit.
-|
-t_ovfl2:
- orl #ovfl_inx_mask,USER_FPSR(%a6)
- movel ETEMP(%a6),FP_SCR1(%a6)
- movel ETEMP_HI(%a6),FP_SCR1+4(%a6)
- movel ETEMP_LO(%a6),FP_SCR1+8(%a6)
-|
-| Check for single or double round precision. If single, check if
-| the lower 40 bits of ETEMP are zero; if not, set inex2. If double,
-| check if the lower 21 bits are zero; if not, set inex2.
-|
- moveb FPCR_MODE(%a6),%d0
- andib #0xc0,%d0
- beq t_work |if extended, finish ovfl processing
- cmpib #0x40,%d0 |test for single
- bnes t_dbl
-t_sgl:
- tstb ETEMP_LO(%a6)
- bnes t_setinx2
- movel ETEMP_HI(%a6),%d0
- andil #0xff,%d0 |look at only lower 8 bits
- bnes t_setinx2
- bra t_work
-t_dbl:
- movel ETEMP_LO(%a6),%d0
- andil #0x7ff,%d0 |look at only lower 11 bits
- beq t_work
-t_setinx2:
- orl #inex2_mask,USER_FPSR(%a6)
- bras t_work
-|
-| t_ovfl --- OVFL exception
-|
-|** Note: the exc operand is returned in ETEMP.
-|
-t_ovfl:
- orl #ovfinx_mask,USER_FPSR(%a6)
-t_work:
- btstb #ovfl_bit,FPCR_ENABLE(%a6) |test FPCR for ovfl enabled
- beqs ovf_dis
-
-ovf_ena:
- clrl FP_SCR1(%a6) |set exceptional operand
- clrl FP_SCR1+4(%a6)
- clrl FP_SCR1+8(%a6)
-
- bfclr STAG(%a6){#5:#3} |clear wbtm66,wbtm1,wbtm0
- bclrb #wbtemp15_bit,WB_BYTE(%a6) |clear wbtemp15
- bsetb #sticky_bit,STICKY(%a6) |set sticky bit
-
- bclrb #E1,E_BYTE(%a6)
-| ;fall through to disabled case
-
-| For disabled overflow call 'ovf_r_k'. This routine loads the
-| correct result based on the rounding precision, destination
-| format, rounding mode and sign.
-|
-ovf_dis:
- bsr ovf_r_k |returns unsigned ETEMP_EX
-| ;and sets FPSR_CC accordingly.
- bfclr ETEMP_SGN(%a6){#0:#8} |fix sign
- beqs ovf_pos
- bsetb #sign_bit,ETEMP_EX(%a6)
- bsetb #sign_bit,FP_SCR1(%a6) |set exceptional operand sign
-ovf_pos:
- fmovemx ETEMP(%a6),%fp0-%fp0 |move the result to fp0
- rts
-
-
-|
-| INEX2 exception
-|
-| The inex2 and ainex bits are set.
-|
-t_inx2:
- orl #inx2a_mask,USER_FPSR(%a6) |set INEX2, AINEX
- rts
-
-|
-| Force Inex2
-|
-| This routine is called by the transcendental routines to force
-| the inex2 exception bits set in the FPSR. If the underflow bit
-| is set, but the underflow trap was not taken, the aunfl bit in
-| the FPSR must be set.
-|
-t_frcinx:
- orl #inx2a_mask,USER_FPSR(%a6) |set INEX2, AINEX
- btstb #unfl_bit,FPSR_EXCEPT(%a6) |test for unfl bit set
- beqs no_uacc1 |if clear, do not set aunfl
- bsetb #aunfl_bit,FPSR_AEXCEPT(%a6)
-no_uacc1:
- rts
-
-|
-| DST_NAN
-|
-| Determine if the destination nan is signalling or non-signalling,
-| and set the FPSR bits accordingly. See the MC68040 User's Manual
-| section 3.2.2.5 NOT-A-NUMBERS.
-|
-dst_nan:
- btstb #sign_bit,FPTEMP_EX(%a6) |test sign of nan
- beqs dst_pos |if clr, it was positive
- bsetb #neg_bit,FPSR_CC(%a6) |set N bit
-dst_pos:
- btstb #signan_bit,FPTEMP_HI(%a6) |check if signalling
- beqs dst_snan |branch if signalling
-
- fmovel %d1,%fpcr |restore user's rmode/prec
- fmovex FPTEMP(%a6),%fp0 |return the non-signalling nan
-|
-| Check the source nan. If it is signalling, snan will be reported.
-|
- moveb STAG(%a6),%d0
- andib #0xe0,%d0
- cmpib #0x60,%d0
- bnes no_snan
- btstb #signan_bit,ETEMP_HI(%a6) |check if signalling
- bnes no_snan
- orl #snaniop_mask,USER_FPSR(%a6) |set NAN, SNAN, AIOP
-no_snan:
- rts
-
-dst_snan:
- btstb #snan_bit,FPCR_ENABLE(%a6) |check if trap enabled
- beqs dst_dis |branch if disabled
-
- orb #nan_tag,DTAG(%a6) |set up dtag for nan
- st STORE_FLG(%a6) |do not store a result
- orl #snaniop_mask,USER_FPSR(%a6) |set NAN, SNAN, AIOP
- rts
-
-dst_dis:
- bsetb #signan_bit,FPTEMP_HI(%a6) |set SNAN bit in sop
- fmovel %d1,%fpcr |restore user's rmode/prec
- fmovex FPTEMP(%a6),%fp0 |load non-sign. nan
- orl #snaniop_mask,USER_FPSR(%a6) |set NAN, SNAN, AIOP
- rts
-
-|
-| SRC_NAN
-|
-| Determine if the source nan is signalling or non-signalling,
-| and set the FPSR bits accordingly. See the MC68040 User's Manual
-| section 3.2.2.5 NOT-A-NUMBERS.
-|
-src_nan:
- btstb #sign_bit,ETEMP_EX(%a6) |test sign of nan
- beqs src_pos |if clr, it was positive
- bsetb #neg_bit,FPSR_CC(%a6) |set N bit
-src_pos:
- btstb #signan_bit,ETEMP_HI(%a6) |check if signalling
- beqs src_snan |branch if signalling
- fmovel %d1,%fpcr |restore user's rmode/prec
- fmovex ETEMP(%a6),%fp0 |return the non-signalling nan
- rts
-
-src_snan:
- btstb #snan_bit,FPCR_ENABLE(%a6) |check if trap enabled
- beqs src_dis |branch if disabled
- bsetb #signan_bit,ETEMP_HI(%a6) |set SNAN bit in sop
- orb #norm_tag,DTAG(%a6) |set up dtag for norm
- orb #nan_tag,STAG(%a6) |set up stag for nan
- st STORE_FLG(%a6) |do not store a result
- orl #snaniop_mask,USER_FPSR(%a6) |set NAN, SNAN, AIOP
- rts
-
-src_dis:
- bsetb #signan_bit,ETEMP_HI(%a6) |set SNAN bit in sop
- fmovel %d1,%fpcr |restore user's rmode/prec
- fmovex ETEMP(%a6),%fp0 |load non-sign. nan
- orl #snaniop_mask,USER_FPSR(%a6) |set NAN, SNAN, AIOP
- rts
-
-|
-| For all functions that have a denormalized input and that f(x)=x,
-| this is the entry point
-|
-t_extdnrm:
- orl #unfinx_mask,USER_FPSR(%a6)
-| ;set UNFL, INEX2, AUNFL, AINEX
- bras xdnrm_con
-|
-| Entry point for scale with extended denorm. The function does
-| not set inex2, aunfl, or ainex.
-|
-t_resdnrm:
- orl #unfl_mask,USER_FPSR(%a6)
-
-xdnrm_con:
- btstb #unfl_bit,FPCR_ENABLE(%a6)
- beqs xdnrm_dis
-
-|
-| If exceptions are enabled, the additional task of setting up WBTEMP
-| is needed so that when the underflow exception handler is entered,
-| the user perceives no difference between what the 040 provides vs.
-| what the FPSP provides.
-|
-xdnrm_ena:
- movel %a0,-(%a7)
-
- movel LOCAL_EX(%a0),FP_SCR1(%a6)
- movel LOCAL_HI(%a0),FP_SCR1+4(%a6)
- movel LOCAL_LO(%a0),FP_SCR1+8(%a6)
-
- lea FP_SCR1(%a6),%a0
-
- bclrb #sign_bit,LOCAL_EX(%a0)
- sne LOCAL_SGN(%a0) |convert to internal ext format
- tstw LOCAL_EX(%a0) |check if input is denorm
- beqs xdnrm_dn |if so, skip nrm_set
- bsr nrm_set |normalize the result (exponent
-| ;will be negative
-xdnrm_dn:
- bclrb #sign_bit,LOCAL_EX(%a0) |take off false sign
- bfclr LOCAL_SGN(%a0){#0:#8} |change back to IEEE ext format
- beqs xdep
- bsetb #sign_bit,LOCAL_EX(%a0)
-xdep:
- bfclr STAG(%a6){#5:#3} |clear wbtm66,wbtm1,wbtm0
- bsetb #wbtemp15_bit,WB_BYTE(%a6) |set wbtemp15
- bclrb #sticky_bit,STICKY(%a6) |clear sticky bit
- bclrb #E1,E_BYTE(%a6)
- movel (%a7)+,%a0
-xdnrm_dis:
- bfextu FPCR_MODE(%a6){#0:#2},%d0 |get round precision
- bnes not_ext |if not round extended, store
-| ;IEEE defaults
-is_ext:
- btstb #sign_bit,LOCAL_EX(%a0)
- beqs xdnrm_store
-
- bsetb #neg_bit,FPSR_CC(%a6) |set N bit in FPSR_CC
-
- bras xdnrm_store
-
-not_ext:
- bclrb #sign_bit,LOCAL_EX(%a0)
- sne LOCAL_SGN(%a0) |convert to internal ext format
- bsr unf_sub |returns IEEE result pointed by
-| ;a0; sets FPSR_CC accordingly
- bfclr LOCAL_SGN(%a0){#0:#8} |convert back to IEEE ext format
- beqs xdnrm_store
- bsetb #sign_bit,LOCAL_EX(%a0)
-xdnrm_store:
- fmovemx (%a0),%fp0-%fp0 |store result in fp0
- rts
-
-|
-| This subroutine is used for dyadic operations that use an extended
-| denorm within the kernel. The approach used is to capture the frame,
-| fix/restore.
-|
- .global t_avoid_unsupp
-t_avoid_unsupp:
- link %a2,#-LOCAL_SIZE |so that a2 fpsp.h negative
-| ;offsets may be used
- fsave -(%a7)
- tstb 1(%a7) |check if idle, exit if so
- beq idle_end
- btstb #E1,E_BYTE(%a2) |check for an E1 exception if
-| ;enabled, there is an unsupp
- beq end_avun |else, exit
- btstb #7,DTAG(%a2) |check for denorm destination
- beqs src_den |else, must be a source denorm
-|
-| handle destination denorm
-|
- lea FPTEMP(%a2),%a0
- btstb #sign_bit,LOCAL_EX(%a0)
- sne LOCAL_SGN(%a0) |convert to internal ext format
- bclrb #7,DTAG(%a2) |set DTAG to norm
- bsr nrm_set |normalize result, exponent
-| ;will become negative
- bclrb #sign_bit,LOCAL_EX(%a0) |get rid of fake sign
- bfclr LOCAL_SGN(%a0){#0:#8} |convert back to IEEE ext format
- beqs ck_src_den |check if source is also denorm
- bsetb #sign_bit,LOCAL_EX(%a0)
-ck_src_den:
- btstb #7,STAG(%a2)
- beqs end_avun
-src_den:
- lea ETEMP(%a2),%a0
- btstb #sign_bit,LOCAL_EX(%a0)
- sne LOCAL_SGN(%a0) |convert to internal ext format
- bclrb #7,STAG(%a2) |set STAG to norm
- bsr nrm_set |normalize result, exponent
-| ;will become negative
- bclrb #sign_bit,LOCAL_EX(%a0) |get rid of fake sign
- bfclr LOCAL_SGN(%a0){#0:#8} |convert back to IEEE ext format
- beqs den_com
- bsetb #sign_bit,LOCAL_EX(%a0)
-den_com:
- moveb #0xfe,CU_SAVEPC(%a2) |set continue frame
- clrw NMNEXC(%a2) |clear NMNEXC
- bclrb #E1,E_BYTE(%a2)
-| fmove.l %FPSR,FPSR_SHADOW(%a2)
-| bset.b #SFLAG,E_BYTE(%a2)
-| bset.b #XFLAG,T_BYTE(%a2)
-end_avun:
- frestore (%a7)+
- unlk %a2
- rts
-idle_end:
- addl #4,%a7
- unlk %a2
- rts
- |end