Home | History | Annotate | Line # | Download | only in fpsp
      1 *	$NetBSD: DYADIC.GCC,v 1.2 1994/10/26 07:48:27 cgd Exp $
      2 
      3 *	MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
      4 *	M68000 Hi-Performance Microprocessor Division
      5 *	M68040 Software Package 
      6 *
      7 *	M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
      8 *	All rights reserved.
      9 *
     10 *	THE SOFTWARE is provided on an "AS IS" basis and without warranty.
     11 *	To the maximum extent permitted by applicable law,
     12 *	MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
     13 *	INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
     14 *	PARTICULAR PURPOSE and any warranty against infringement with
     15 *	regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
     16 *	and any accompanying written materials. 
     17 *
     18 *	To the maximum extent permitted by applicable law,
     19 *	IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
     20 *	(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
     21 *	PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
     22 *	OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
     23 *	SOFTWARE.  Motorola assumes no responsibility for the maintenance
     24 *	and support of the SOFTWARE.  
     25 *
     26 *	You are hereby granted a copyright license to use, modify, and
     27 *	distribute the SOFTWARE so long as this entire notice is retained
     28 *	without alteration in any modified and/or redistributed versions,
     29 *	and that such modified versions are clearly identified as such.
     30 *	No licenses are granted by implication, estoppel or otherwise
     31 *	under any patents or trademarks of Motorola, Inc.
     32 
     33 *
     34 *	DYADIC.GCC --- DYADIC template for GCC compiler
     35 *
     36 *	This is based on the generic template.  The only difference is that
     37 *	GCC does not need the d0-d1/a0-a1 registers saved.
     38 *
     39 *	Customizations:  
     40 *		2. Likewise, don't save FP0/FP1 if they are scratch
     41 *		   registers.
     42 *		3. Delete updating of the fpsr if you only care about
     43 *		   the result.
     44 *		5. Move the result to d0/d1 if the compiler is that old.
     45 *
     46 
     47 	xref	_OPa_
     48 	xref	tag
     49 
     50 	xdef	_OPs_
     51 _OPs_:
     52 	link	a6,#-LOCAL_SIZE
     53 	fmovem.x fp0-fp3,USER_FP0(a6)
     54 	fmove.l	fpsr,USER_FPSR(a6)
     55 	fmove.l	fpcr,USER_FPCR(a6)	; user's rounding mode/precision
     56 	fmove.l	#0,fpcr		; force rounding mode/prec to extended,rn
     57 *
     58 *	copy, convert and tag input arguments
     59 *
     60 	fmove.s	8(a6),fp0
     61 	fmove.x	fp0,FPTEMP(a6)
     62 	lea	FPTEMP(a6),a0
     63 	bsr	tag
     64 	move.b	d0,DTAG(a6)
     65 
     66 	fmove.s	12(a6),fp0
     67 	fmove.x	fp0,ETEMP(a6)
     68 	lea	ETEMP(a6),a0
     69 	bsr	tag
     70 	move.b	d0,STAG(a6)
     71 
     72 	bsr	_OPa_
     73 
     74 	fmove.l	fpsr,d0		; update status register
     75 	or.b	FPSR_AEXCEPT(a6),d0	;add previously accrued exceptions
     76 	swap.w	d0
     77 	or.b	FPSR_QBYTE(a6),d0	; pickup sign of quotient byte
     78 	swap.w	d0
     79 	fmove.l	d0,fpsr
     80 *
     81 *	Result is now in FP0
     82 *
     83 	fmovem.x USER_FP1(a6),fp1-fp3	; note: FP0 not restored
     84 	unlk	a6
     85 	rts
     86 
     87 	xdef	_OPd_
     88 _OPd_:
     89 	link	a6,#-LOCAL_SIZE
     90 	fmovem.x fp0-fp3,USER_FP0(a6)
     91 	fmove.l	fpsr,USER_FPSR(a6)
     92 	fmove.l	fpcr,USER_FPCR(a6)	; user's rounding mode/precision
     93 	fmove.l	#0,fpcr		; force rounding mode/prec to extended,rn
     94 *
     95 *	copy, convert and tag input arguments
     96 *
     97 	fmove.d	8(a6),fp0
     98 	fmove.x	fp0,FPTEMP(a6)
     99 	lea	FPTEMP(a6),a0
    100 	bsr	tag
    101 	move.b	d0,DTAG(a6)
    102 
    103 	fmove.d	16(a6),fp0
    104 	fmove.x	fp0,ETEMP(a6)
    105 	lea	ETEMP(a6),a0
    106 	bsr	tag
    107 	move.b	d0,STAG(a6)
    108 
    109 	bsr	_OPa_
    110 
    111 	fmove.l	fpsr,d0		; update status register
    112 	or.b	FPSR_AEXCEPT(a6),d0	;add previously accrued exceptions
    113 	swap.w	d0
    114 	or.b	FPSR_QBYTE(a6),d0	; pickup sign of quotient byte
    115 	swap.w	d0
    116 	fmove.l	d0,fpsr
    117 *
    118 *	Result is now in FP0
    119 *
    120 	fmovem.x USER_FP1(a6),fp1-fp3	; note: FP0 not restored
    121 	unlk	a6
    122 	rts
    123 
    124 	xdef	_OPx_
    125 _OPx_:
    126 	link	a6,#-LOCAL_SIZE
    127 	fmovem.x fp0-fp3,USER_FP0(a6)
    128 	fmove.l	fpsr,USER_FPSR(a6)
    129 	fmove.l	fpcr,USER_FPCR(a6)	; user's rounding mode/precision
    130 	fmove.l	#0,fpcr		; force rounding mode/prec to extended,rn
    131 *
    132 *	copy, convert and tag input arguments
    133 *
    134 	fmove.x	8(a6),fp0
    135 	fmove.x	fp0,FPTEMP(a6)
    136 	lea	FPTEMP(a6),a0
    137 	bsr	tag
    138 	move.b	d0,DTAG(a6)
    139 
    140 	fmove.x	20(a6),fp0
    141 	fmove.x	fp0,ETEMP(a6)
    142 	lea	ETEMP(a6),a0
    143 	bsr	tag
    144 	move.b	d0,STAG(a6)
    145 
    146 	bsr	_OPa_
    147 
    148 	fmove.l	fpsr,d0		; update status register
    149 	or.b	FPSR_AEXCEPT(a6),d0	;add previously accrued exceptions
    150 	swap.w	d0
    151 	or.b	FPSR_QBYTE(a6),d0	; pickup sign of quotient byte
    152 	swap.w	d0
    153 	fmove.l	d0,fpsr
    154 *
    155 *	Result is now in FP0
    156 *
    157 	fmovem.x USER_FP1(a6),fp1-fp3	; note: FP0 not restored
    158 	unlk	a6
    159 	rts
    160 
    161