Home | History | Annotate | Line # | Download | only in fpsp
      1 *	$NetBSD: x_ovfl.sa,v 1.4 2024/09/20 19:38:53 andvar 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 *	x_ovfl.sa 3.5 7/1/91
     35 *
     36 *	fpsp_ovfl --- FPSP handler for overflow exception
     37 *
     38 *	Overflow occurs when a floating-point intermediate result is
     39 *	too large to be represented in a floating-point data register,
     40 *	or when storing to memory, the contents of a floating-point
     41 *	data register are too large to be represented in the
     42 *	destination format.
     43 *		
     44 * Trap disabled results
     45 *
     46 * If the instruction is move_out, then garbage is stored in the
     47 * destination.  If the instruction is not move_out, then the
     48 * destination is not affected.  For 68881 compatibility, the
     49 * following values should be stored at the destination, based
     50 * on the current rounding mode:
     51 *
     52 *  RN	Infinity with the sign of the intermediate result.
     53 *  RZ	Largest magnitude number, with the sign of the
     54 *	intermediate result.
     55 *  RM   For pos overflow, the largest pos number. For neg overflow,
     56 *	-infinity
     57 *  RP   For pos overflow, +infinity. For neg overflow, the largest
     58 *	neg number
     59 *
     60 * Trap enabled results
     61 * All trap disabled code applies.  In addition the exceptional
     62 * operand needs to be made available to the users exception handler
     63 * with a bias of $6000 subtracted from the exponent.
     64 *
     65 
     66 X_OVFL	IDNT    2,1 Motorola 040 Floating Point Software Package
     67 
     68 	section	8
     69 
     70 	include	fpsp.h
     71 
     72 	xref	ovf_r_x2
     73 	xref	ovf_r_x3
     74 	xref	store
     75 	xref	real_ovfl
     76 	xref	real_inex
     77 	xref	fpsp_done
     78 	xref	g_opcls
     79 	xref	b1238_fix
     80 
     81 	xdef	fpsp_ovfl
     82 fpsp_ovfl:
     83 	link		a6,#-LOCAL_SIZE
     84 	fsave		-(a7)
     85 	movem.l		d0-d1/a0-a1,USER_DA(a6)
     86 	fmovem.x	fp0-fp3,USER_FP0(a6)
     87 	fmovem.l	fpcr/fpsr/fpiar,USER_FPCR(a6)
     88 
     89 *
     90 *	The 040 doesn't set the AINEX bit in the FPSR, the following
     91 *	line temporarily rectifies this error.
     92 *
     93 	bset.b	#ainex_bit,FPSR_AEXCEPT(a6)
     94 *
     95 	bsr.l	ovf_adj		;denormalize, round & store interm op
     96 *
     97 *	if overflow traps not enabled check for inexact exception
     98 *
     99 	btst.b	#ovfl_bit,FPCR_ENABLE(a6)
    100 	beq.b	ck_inex	
    101 *
    102 	btst.b		#E3,E_BYTE(a6)
    103 	beq.b		no_e3_1
    104 	bfextu		CMDREG3B(a6){6:3},d0	;get dest reg no
    105 	bclr.b		d0,FPR_DIRTY_BITS(a6)	;clr dest dirty bit
    106 	bsr.l		b1238_fix
    107 	move.l		USER_FPSR(a6),FPSR_SHADOW(a6)
    108 	or.l		#sx_mask,E_BYTE(a6)
    109 no_e3_1:
    110 	movem.l		USER_DA(a6),d0-d1/a0-a1
    111 	fmovem.x	USER_FP0(a6),fp0-fp3
    112 	fmovem.l	USER_FPCR(a6),fpcr/fpsr/fpiar
    113 	frestore	(a7)+
    114 	unlk		a6
    115 	bra.l		real_ovfl
    116 *
    117 * It is possible to have either inex2 or inex1 exceptions with the
    118 * ovfl.  If the inex enable bit is set in the FPCR, and either
    119 * inex2 or inex1 occurred, we must clean up and branch to the
    120 * real inex handler.
    121 *
    122 ck_inex:
    123 *	move.b		FPCR_ENABLE(a6),d0
    124 *	and.b		FPSR_EXCEPT(a6),d0
    125 *	andi.b		#$3,d0
    126 	btst.b		#inex2_bit,FPCR_ENABLE(a6)
    127 	beq.b		ovfl_exit
    128 *
    129 * Inexact enabled and reported, and we must take an inexact exception.
    130 *
    131 take_inex:
    132 	btst.b		#E3,E_BYTE(a6)
    133 	beq.b		no_e3_2
    134 	bfextu		CMDREG3B(a6){6:3},d0	;get dest reg no
    135 	bclr.b		d0,FPR_DIRTY_BITS(a6)	;clr dest dirty bit
    136 	bsr.l		b1238_fix
    137 	move.l		USER_FPSR(a6),FPSR_SHADOW(a6)
    138 	or.l		#sx_mask,E_BYTE(a6)
    139 no_e3_2:
    140 	move.b		#INEX_VEC,EXC_VEC+1(a6)
    141 	movem.l		USER_DA(a6),d0-d1/a0-a1
    142 	fmovem.x	USER_FP0(a6),fp0-fp3
    143 	fmovem.l	USER_FPCR(a6),fpcr/fpsr/fpiar
    144 	frestore	(a7)+
    145 	unlk		a6
    146 	bra.l		real_inex
    147 	
    148 ovfl_exit:
    149 	bclr.b	#E3,E_BYTE(a6)	;test and clear E3 bit
    150 	beq.b	e1_set
    151 *
    152 * Clear dirty bit on dest register in the frame before branching
    153 * to b1238_fix.
    154 *
    155 	bfextu		CMDREG3B(a6){6:3},d0	;get dest reg no
    156 	bclr.b		d0,FPR_DIRTY_BITS(a6)	;clr dest dirty bit
    157 	bsr.l		b1238_fix		;test for bug1238 case
    158 
    159 	move.l		USER_FPSR(a6),FPSR_SHADOW(a6)
    160 	or.l		#sx_mask,E_BYTE(a6)
    161 	movem.l		USER_DA(a6),d0-d1/a0-a1
    162 	fmovem.x	USER_FP0(a6),fp0-fp3
    163 	fmovem.l	USER_FPCR(a6),fpcr/fpsr/fpiar
    164 	frestore	(a7)+
    165 	unlk		a6
    166 	bra.l		fpsp_done
    167 e1_set:
    168 	movem.l		USER_DA(a6),d0-d1/a0-a1
    169 	fmovem.x	USER_FP0(a6),fp0-fp3
    170 	fmovem.l	USER_FPCR(a6),fpcr/fpsr/fpiar
    171 	unlk		a6
    172 	bra.l		fpsp_done
    173 
    174 *
    175 *	ovf_adj
    176 *
    177 ovf_adj:
    178 *
    179 * Have a0 point to the correct operand. 
    180 *
    181 	btst.b	#E3,E_BYTE(a6)	;test E3 bit
    182 	beq.b	ovf_e1
    183 
    184 	lea	WBTEMP(a6),a0
    185 	bra.b	ovf_com
    186 ovf_e1:
    187 	lea	ETEMP(a6),a0
    188 
    189 ovf_com:
    190 	bclr.b	#sign_bit,LOCAL_EX(a0)
    191 	sne	LOCAL_SGN(a0)
    192 
    193 	bsr.l	g_opcls		;returns opclass in d0
    194 	cmpi.w	#3,d0		;check for opclass3
    195 	bne.b	not_opc011
    196 
    197 *
    198 * FPSR_CC is saved and restored because ovf_r_x3 affects it. The
    199 * CCs are defined to be 'not affected' for the opclass3 instruction.
    200 *
    201 	move.b	FPSR_CC(a6),L_SCR1(a6)
    202  	bsr.l	ovf_r_x3	;returns a0 pointing to result
    203 	move.b	L_SCR1(a6),FPSR_CC(a6)
    204 	bra.l	store		;stores to memory or register
    205 	
    206 not_opc011:
    207 	bsr.l	ovf_r_x2	;returns a0 pointing to result
    208 	bra.l	store		;stores to memory or register
    209 
    210 	end
    211