Home | History | Annotate | Line # | Download | only in fpsp
      1  1.3      cgd *	$NetBSD: l_support.sa,v 1.3 1994/10/26 07:49:16 cgd Exp $
      2  1.3      cgd 
      3  1.1  mycroft *	MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
      4  1.1  mycroft *	M68000 Hi-Performance Microprocessor Division
      5  1.1  mycroft *	M68040 Software Package 
      6  1.1  mycroft *
      7  1.1  mycroft *	M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
      8  1.1  mycroft *	All rights reserved.
      9  1.1  mycroft *
     10  1.1  mycroft *	THE SOFTWARE is provided on an "AS IS" basis and without warranty.
     11  1.1  mycroft *	To the maximum extent permitted by applicable law,
     12  1.1  mycroft *	MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
     13  1.1  mycroft *	INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
     14  1.1  mycroft *	PARTICULAR PURPOSE and any warranty against infringement with
     15  1.1  mycroft *	regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
     16  1.1  mycroft *	and any accompanying written materials. 
     17  1.1  mycroft *
     18  1.1  mycroft *	To the maximum extent permitted by applicable law,
     19  1.1  mycroft *	IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
     20  1.1  mycroft *	(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
     21  1.1  mycroft *	PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
     22  1.1  mycroft *	OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
     23  1.1  mycroft *	SOFTWARE.  Motorola assumes no responsibility for the maintenance
     24  1.1  mycroft *	and support of the SOFTWARE.  
     25  1.1  mycroft *
     26  1.1  mycroft *	You are hereby granted a copyright license to use, modify, and
     27  1.1  mycroft *	distribute the SOFTWARE so long as this entire notice is retained
     28  1.1  mycroft *	without alteration in any modified and/or redistributed versions,
     29  1.1  mycroft *	and that such modified versions are clearly identified as such.
     30  1.1  mycroft *	No licenses are granted by implication, estoppel or otherwise
     31  1.1  mycroft *	under any patents or trademarks of Motorola, Inc.
     32  1.1  mycroft 
     33  1.1  mycroft *
     34  1.1  mycroft *	l_support.sa 1.2 5/1/91
     35  1.1  mycroft *
     36  1.1  mycroft 
     37  1.1  mycroft L_SUPPORT    IDNT    2,1 Motorola 040 Floating Point Software Package
     38  1.1  mycroft 
     39  1.1  mycroft 	section    8
     40  1.1  mycroft 
     41  1.1  mycroft mns_one  dc.l $bfff0000,$80000000,$00000000
     42  1.1  mycroft pls_one  dc.l $3fff0000,$80000000,$00000000
     43  1.1  mycroft pls_inf  dc.l $7fff0000,$00000000,$00000000
     44  1.1  mycroft pls_huge dc.l $7ffe0000,$ffffffff,$ffffffff
     45  1.1  mycroft mns_huge dc.l $fffe0000,$ffffffff,$ffffffff
     46  1.1  mycroft pls_tiny dc.l $00000000,$80000000,$00000000
     47  1.1  mycroft mns_tiny dc.l $80000000,$80000000,$00000000
     48  1.1  mycroft small    dc.l $20000000,$80000000,$00000000
     49  1.1  mycroft pls_zero dc.l $00000000,$00000000,$00000000
     50  1.1  mycroft 
     51  1.1  mycroft 	include	l_fpsp.h
     52  1.1  mycroft 
     53  1.1  mycroft *
     54  1.1  mycroft * 	tag --- determine the type of an extended precision operand
     55  1.1  mycroft *
     56  1.1  mycroft *	The tag values returned match the way the 68040 would have
     57  1.1  mycroft *	tagged them.
     58  1.1  mycroft *
     59  1.1  mycroft *	Input:	a0 points to operand
     60  1.1  mycroft *
     61  1.1  mycroft *	Output	d0.b	= $00 norm
     62  1.1  mycroft *			  $20 zero
     63  1.1  mycroft *			  $40 inf
     64  1.1  mycroft *			  $60 nan
     65  1.1  mycroft *			  $80 denorm
     66  1.1  mycroft *		All other registers are unchanged
     67  1.1  mycroft *
     68  1.1  mycroft 	xdef	tag
     69  1.1  mycroft tag:
     70  1.1  mycroft 	move.w	LOCAL_EX(a0),d0
     71  1.1  mycroft 	andi.w	#$7fff,d0
     72  1.1  mycroft 	beq.b	chk_zro
     73  1.1  mycroft 	cmpi.w	#$7fff,d0
     74  1.1  mycroft 	beq.b	chk_inf
     75  1.1  mycroft tag_nrm:
     76  1.1  mycroft 	clr.b	d0
     77  1.1  mycroft 	rts
     78  1.1  mycroft tag_nan:
     79  1.1  mycroft 	move.b	#$60,d0
     80  1.1  mycroft 	rts
     81  1.1  mycroft tag_dnrm:
     82  1.1  mycroft 	move.b	#$80,d0
     83  1.1  mycroft 	rts
     84  1.1  mycroft chk_zro:
     85  1.1  mycroft 	btst.b	#7,LOCAL_HI(a0)	# check if J-bit is set
     86  1.1  mycroft 	bne.b	tag_nrm
     87  1.1  mycroft 	tst.l	LOCAL_HI(a0)
     88  1.1  mycroft 	bne.b	tag_dnrm
     89  1.1  mycroft 	tst.l	LOCAL_LO(a0)
     90  1.1  mycroft 	bne.b	tag_dnrm
     91  1.1  mycroft tag_zero:
     92  1.1  mycroft 	move.b	#$20,d0
     93  1.1  mycroft 	rts
     94  1.1  mycroft chk_inf:
     95  1.1  mycroft 	tst.l	LOCAL_HI(a0)
     96  1.1  mycroft 	bne.b	tag_nan
     97  1.1  mycroft 	tst.l	LOCAL_LO(a0)
     98  1.1  mycroft 	bne.b	tag_nan
     99  1.1  mycroft tag_inf:
    100  1.1  mycroft 	move.b	#$40,d0
    101  1.1  mycroft 	rts
    102  1.1  mycroft 
    103  1.1  mycroft *
    104  1.1  mycroft *	t_dz, t_dz2 --- divide by zero exception
    105  1.1  mycroft *
    106  1.1  mycroft * t_dz2 is used by monadic functions such as flogn (from do_func).
    107  1.1  mycroft * t_dz is used by monadic functions such as satanh (from the 
    108  1.1  mycroft * transcendental function).
    109  1.1  mycroft *
    110  1.1  mycroft 	xdef    t_dz2
    111  1.1  mycroft t_dz2:
    112  1.1  mycroft 	fmovem.x	mns_one,fp0
    113  1.1  mycroft 	fmove.l	d1,fpcr
    114  1.1  mycroft 	fdiv.x		pls_zero,fp0
    115  1.1  mycroft 	rts
    116  1.1  mycroft 
    117  1.1  mycroft 	xdef	t_dz
    118  1.1  mycroft t_dz:
    119  1.1  mycroft 	btst.b	#sign_bit,ETEMP_EX(a6)	;check sign for neg or pos
    120  1.1  mycroft 	beq.b	p_inf			;branch if pos sign
    121  1.1  mycroft m_inf:
    122  1.1  mycroft 	fmovem.x mns_one,fp0
    123  1.1  mycroft 	fmove.l	d1,fpcr
    124  1.1  mycroft 	fdiv.x		pls_zero,fp0
    125  1.1  mycroft 	rts
    126  1.1  mycroft p_inf:
    127  1.1  mycroft 	fmovem.x pls_one,fp0
    128  1.1  mycroft 	fmove.l	d1,fpcr
    129  1.1  mycroft 	fdiv.x		pls_zero,fp0
    130  1.1  mycroft 	rts
    131  1.1  mycroft *
    132  1.1  mycroft *	t_operr --- Operand Error exception
    133  1.1  mycroft *
    134  1.1  mycroft 	xdef    t_operr
    135  1.1  mycroft t_operr:
    136  1.1  mycroft 	fmovem.x	pls_inf,fp0
    137  1.1  mycroft 	fmove.l	d1,fpcr
    138  1.1  mycroft 	fmul.x		pls_zero,fp0
    139  1.1  mycroft 	rts
    140  1.1  mycroft 
    141  1.1  mycroft *
    142  1.1  mycroft *	t_unfl --- UNFL exception
    143  1.1  mycroft *
    144  1.1  mycroft 	xdef    t_unfl
    145  1.1  mycroft t_unfl:
    146  1.1  mycroft 	btst.b	#sign_bit,ETEMP(a6)
    147  1.1  mycroft 	beq.b	unf_pos
    148  1.1  mycroft unf_neg:
    149  1.1  mycroft 	fmovem.x	mns_tiny,fp0
    150  1.1  mycroft 	fmove.l	d1,fpcr
    151  1.1  mycroft 	fmul.x	pls_tiny,fp0
    152  1.1  mycroft 	rts
    153  1.1  mycroft 	
    154  1.1  mycroft unf_pos:
    155  1.1  mycroft 	fmovem.x	pls_tiny,fp0
    156  1.1  mycroft 	fmove.l	d1,fpcr
    157  1.1  mycroft 	fmul.x	fp0,fp0
    158  1.1  mycroft 	rts
    159  1.1  mycroft *
    160  1.1  mycroft *	t_ovfl --- OVFL exception
    161  1.1  mycroft *
    162  1.1  mycroft *	t_ovfl is called as an exit for monadic functions.  t_ovfl2
    163  1.1  mycroft *	is for dyadic exits.
    164  1.1  mycroft *
    165  1.1  mycroft 	xdef   		t_ovfl
    166  1.1  mycroft t_ovfl:
    167  1.1  mycroft 	xdef   		t_ovfl2
    168  1.1  mycroft 	move.l		d1,USER_FPCR(a6)	user's control register
    169  1.1  mycroft 	move.l		#ovfinx_mask,d0
    170  1.1  mycroft 	bra.b		t_work
    171  1.1  mycroft t_ovfl2:
    172  1.1  mycroft 	move.l		#ovfl_inx_mask,d0
    173  1.1  mycroft t_work:
    174  1.1  mycroft 	btst.b		#sign_bit,ETEMP(a6)
    175  1.1  mycroft 	beq.b		ovf_pos
    176  1.1  mycroft ovf_neg:
    177  1.1  mycroft 	fmovem.x	mns_huge,fp0
    178  1.1  mycroft 	fmove.l		USER_FPCR(a6),fpcr
    179  1.1  mycroft 	fmul.x		pls_huge,fp0
    180  1.1  mycroft 	fmove.l		fpsr,d1
    181  1.1  mycroft 	or.l		d1,d0
    182  1.1  mycroft 	fmove.l		d0,fpsr
    183  1.1  mycroft 	rts
    184  1.1  mycroft ovf_pos:
    185  1.1  mycroft 	fmovem.x	pls_huge,fp0
    186  1.1  mycroft 	fmove.l		USER_FPCR(a6),fpcr
    187  1.1  mycroft 	fmul.x		pls_huge,fp0
    188  1.1  mycroft 	fmove.l		fpsr,d1
    189  1.1  mycroft 	or.l		d1,d0
    190  1.1  mycroft 	fmove.l		d0,fpsr
    191  1.1  mycroft 	rts
    192  1.1  mycroft *
    193  1.1  mycroft *	t_inx2 --- INEX2 exception (correct fpcr is in USER_FPCR(a6))
    194  1.1  mycroft *
    195  1.1  mycroft 	xdef    t_inx2
    196  1.1  mycroft t_inx2:
    197  1.1  mycroft 	fmove.l		fpsr,USER_FPSR(a6)	capture incoming fpsr
    198  1.1  mycroft 	fmove.l		USER_FPCR(a6),fpcr
    199  1.1  mycroft *
    200  1.1  mycroft * create an inex2 exception by adding two numbers with very different exponents
    201  1.1  mycroft * do the add in fp1 so as to not disturb the result sitting in fp0
    202  1.1  mycroft *
    203  1.1  mycroft 	fmove.x		pls_one,fp1
    204  1.1  mycroft 	fadd.x		small,fp1
    205  1.1  mycroft *
    206  1.1  mycroft 	or.l	#inx2a_mask,USER_FPSR(a6) ;set INEX2, AINEX
    207  1.1  mycroft 	fmove.l	USER_FPSR(a6),fpsr
    208  1.1  mycroft 	rts
    209  1.1  mycroft *
    210  1.1  mycroft *	t_frcinx --- Force Inex2 (for monadic functions)
    211  1.1  mycroft *
    212  1.1  mycroft 	xdef	t_frcinx
    213  1.1  mycroft t_frcinx:
    214  1.1  mycroft 	fmove.l		fpsr,USER_FPSR(a6)	capture incoming fpsr
    215  1.1  mycroft 	fmove.l		d1,fpcr
    216  1.1  mycroft *
    217  1.1  mycroft * create an inex2 exception by adding two numbers with very different exponents
    218  1.1  mycroft * do the add in fp1 so as to not disturb the result sitting in fp0
    219  1.1  mycroft *
    220  1.1  mycroft 	fmove.x		pls_one,fp1
    221  1.1  mycroft 	fadd.x		small,fp1
    222  1.1  mycroft *
    223  1.1  mycroft 	or.l	#inx2a_mask,USER_FPSR(a6) ;set INEX2, AINEX
    224  1.1  mycroft 	btst.b	#unfl_bit,FPSR_EXCEPT(a6) ;test for unfl bit set
    225  1.1  mycroft 	beq.b	no_uacc1		;if clear, do not set aunfl
    226  1.1  mycroft 	bset.b	#aunfl_bit,FPSR_AEXCEPT(a6)
    227  1.1  mycroft no_uacc1:
    228  1.1  mycroft 	fmove.l	USER_FPSR(a6),fpsr
    229  1.1  mycroft 	rts
    230  1.1  mycroft *
    231  1.1  mycroft *	dst_nan --- force result when destination is a NaN
    232  1.1  mycroft *
    233  1.1  mycroft 	xdef	dst_nan
    234  1.1  mycroft dst_nan:
    235  1.1  mycroft 	fmove.l	USER_FPCR(a6),fpcr
    236  1.1  mycroft 	fmove.x FPTEMP(a6),fp0
    237  1.1  mycroft 	rts
    238  1.1  mycroft 
    239  1.1  mycroft *
    240  1.1  mycroft *	src_nan --- force result when source is a NaN
    241  1.1  mycroft *
    242  1.1  mycroft 	xdef	src_nan
    243  1.1  mycroft src_nan:
    244  1.1  mycroft 	fmove.l	USER_FPCR(a6),fpcr
    245  1.1  mycroft 	fmove.x	ETEMP(a6),fp0
    246  1.1  mycroft 	rts
    247  1.1  mycroft *
    248  1.1  mycroft *	mon_nan --- force result when source is a NaN (monadic version)
    249  1.1  mycroft *
    250  1.1  mycroft *	This is the same as src_nan except that the user's fpcr comes
    251  1.1  mycroft *	in via d1, not USER_FPCR(a6).
    252  1.1  mycroft *
    253  1.1  mycroft 	xdef	mon_nan
    254  1.1  mycroft mon_nan:
    255  1.1  mycroft 	fmove.l	d1,fpcr
    256  1.1  mycroft 	fmove.x	ETEMP(a6),fp0
    257  1.1  mycroft 	rts
    258  1.1  mycroft *
    259  1.1  mycroft *	t_extdnrm, t_resdnrm --- generate results for denorm inputs
    260  1.1  mycroft *
    261  1.1  mycroft *	For all functions that have a denormalized input and that f(x)=x,
    262  1.1  mycroft *	this is the entry point.
    263  1.1  mycroft *
    264  1.1  mycroft 	xdef	t_extdnrm
    265  1.1  mycroft t_extdnrm:
    266  1.1  mycroft 	fmove.l	d1,fpcr
    267  1.1  mycroft 	fmove.x	LOCAL_EX(a0),fp0
    268  1.1  mycroft 	fmove.l		fpsr,d0
    269  1.1  mycroft 	or.l		#unfinx_mask,d0
    270  1.1  mycroft 	fmove.l		d0,fpsr
    271  1.1  mycroft 	rts
    272  1.1  mycroft 
    273  1.1  mycroft 	xdef	t_resdnrm
    274  1.1  mycroft t_resdnrm:
    275  1.1  mycroft 	fmove.l	USER_FPCR(a6),fpcr
    276  1.1  mycroft 	fmove.x	LOCAL_EX(a0),fp0
    277  1.1  mycroft 	fmove.l		fpsr,d0
    278  1.1  mycroft 	or.l		#unfl_mask,d0
    279  1.1  mycroft 	fmove.l		d0,fpsr
    280  1.1  mycroft 	rts
    281  1.1  mycroft *
    282  1.1  mycroft *
    283  1.1  mycroft *
    284  1.1  mycroft 	xdef	t_avoid_unsupp
    285  1.1  mycroft t_avoid_unsupp:
    286  1.1  mycroft 	fmove.x	fp0,fp0
    287  1.1  mycroft 	rts
    288  1.1  mycroft 
    289  1.1  mycroft 	xdef	sto_cos
    290  1.1  mycroft sto_cos:
    291  1.1  mycroft 	fmovem.x LOCAL_EX(a0),fp1
    292  1.1  mycroft 	rts
    293  1.1  mycroft *
    294  1.1  mycroft *	Native instruction support
    295  1.1  mycroft *
    296  1.1  mycroft *	Some systems may need entry points even for 68040 native
    297  1.1  mycroft *	instructions.  These routines are provided for
    298  1.1  mycroft *	convenience.
    299  1.1  mycroft *
    300  1.1  mycroft 	xdef	sadd
    301  1.1  mycroft sadd:
    302  1.1  mycroft 	fmovem.x	FPTEMP(a6),fp0
    303  1.1  mycroft 	fmove.l	USER_FPCR(a6),fpcr
    304  1.1  mycroft 	fadd.x	ETEMP(a6),fp0
    305  1.1  mycroft 	rts
    306  1.1  mycroft 
    307  1.1  mycroft 	xdef	ssub
    308  1.1  mycroft ssub:
    309  1.1  mycroft 	fmovem.x	FPTEMP(a6),fp0
    310  1.1  mycroft 	fmove.l	USER_FPCR(a6),fpcr
    311  1.1  mycroft 	fsub.x	ETEMP(a6),fp0
    312  1.1  mycroft 	rts
    313  1.1  mycroft 
    314  1.1  mycroft 	xdef	smul
    315  1.1  mycroft smul:
    316  1.1  mycroft 	fmovem.x	FPTEMP(a6),fp0
    317  1.1  mycroft 	fmove.l	USER_FPCR(a6),fpcr
    318  1.1  mycroft 	fmul.x	ETEMP(a6),fp0
    319  1.1  mycroft 	rts
    320  1.1  mycroft 
    321  1.1  mycroft 	xdef	sdiv
    322  1.1  mycroft sdiv:
    323  1.1  mycroft 	fmovem.x	FPTEMP(a6),fp0
    324  1.1  mycroft 	fmove.l	USER_FPCR(a6),fpcr
    325  1.1  mycroft 	fdiv.x	ETEMP(a6),fp0
    326  1.1  mycroft 	rts
    327  1.1  mycroft 
    328  1.1  mycroft 	xdef	sabs
    329  1.1  mycroft sabs:
    330  1.1  mycroft 	fmovem.x	ETEMP(a6),fp0
    331  1.1  mycroft 	fmove.l	d1,fpcr
    332  1.2  mycroft 	fabs.x	fp0
    333  1.1  mycroft 	rts
    334  1.1  mycroft 
    335  1.1  mycroft 	xdef	sneg
    336  1.1  mycroft sneg:
    337  1.1  mycroft 	fmovem.x	ETEMP(a6),fp0
    338  1.1  mycroft 	fmove.l	d1,fpcr
    339  1.2  mycroft 	fneg.x	fp0
    340  1.1  mycroft 	rts
    341  1.1  mycroft 
    342  1.1  mycroft 	xdef	ssqrt
    343  1.1  mycroft ssqrt:
    344  1.1  mycroft 	fmovem.x	ETEMP(a6),fp0
    345  1.1  mycroft 	fmove.l	d1,fpcr
    346  1.2  mycroft 	fsqrt.x	fp0
    347  1.1  mycroft 	rts
    348  1.1  mycroft 
    349  1.1  mycroft *
    350  1.1  mycroft *	l_sint,l_sintrz,l_sintd --- special wrapper for fint and fintrz
    351  1.1  mycroft *
    352  1.1  mycroft *	On entry, move the user's FPCR to USER_FPCR.
    353  1.1  mycroft *
    354  1.1  mycroft *	On return from, we need to pickup the INEX2/AINEX bits
    355  1.1  mycroft *	that are in USER_FPSR.
    356  1.1  mycroft *
    357  1.1  mycroft 	xref	sint
    358  1.1  mycroft 	xref	sintrz
    359  1.1  mycroft 	xref	sintd
    360  1.1  mycroft 
    361  1.1  mycroft 	xdef	l_sint
    362  1.1  mycroft l_sint:
    363  1.1  mycroft 	move.l	d1,USER_FPCR(a6)
    364  1.1  mycroft 	jsr	sint
    365  1.1  mycroft 	fmove.l	fpsr,d0
    366  1.1  mycroft 	or.l	USER_FPSR(a6),d0
    367  1.1  mycroft 	fmove.l	d0,fpsr
    368  1.1  mycroft 	rts
    369  1.1  mycroft 
    370  1.1  mycroft 	xdef	l_sintrz
    371  1.1  mycroft l_sintrz:
    372  1.1  mycroft 	move.l	d1,USER_FPCR(a6)
    373  1.1  mycroft 	jsr	sintrz
    374  1.1  mycroft 	fmove.l	fpsr,d0
    375  1.1  mycroft 	or.l	USER_FPSR(a6),d0
    376  1.1  mycroft 	fmove.l	d0,fpsr
    377  1.1  mycroft 	rts
    378  1.1  mycroft 
    379  1.1  mycroft 	xdef	l_sintd
    380  1.1  mycroft l_sintd:
    381  1.1  mycroft 	move.l	d1,USER_FPCR(a6)
    382  1.1  mycroft 	jsr	sintd
    383  1.1  mycroft 	fmove.l	fpsr,d0
    384  1.1  mycroft 	or.l	USER_FPSR(a6),d0
    385  1.1  mycroft 	fmove.l	d0,fpsr
    386  1.1  mycroft 	rts
    387  1.1  mycroft 
    388  1.1  mycroft 	end
    389