Home | History | Annotate | Line # | Download | only in fpsp
      1 *	$NetBSD: fpsp.h,v 1.2 1994/10/26 07:49:04 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 *	fpsp.h 3.3 3.3
     35 *
     36 
     37 *	fpsp.h --- stack frame offsets during FPSP exception handling
     38 *
     39 *	These equates are used to access the exception frame, the fsave
     40 *	frame and any local variables needed by the FPSP package.
     41 *
     42 *	All FPSP handlers begin by executing:
     43 *
     44 *		link	a6,#-LOCAL_SIZE
     45 *		fsave	-(a7)
     46 *		movem.l	d0-d1/a0-a1,USER_DA(a6)
     47 *		fmovem.x fp0-fp3,USER_FP0(a6)
     48 *		fmove.l	fpsr/fpcr/fpiar,USER_FPSR(a6)
     49 *
     50 *	After initialization, the stack looks like this:
     51 *
     52 *	A7 --->	+-------------------------------+
     53 *		|				|
     54 *		|	FPU fsave area		|
     55 *		|				|
     56 *		+-------------------------------+
     57 *		|				|
     58 *		|	FPSP Local Variables	|
     59 *		|	     including		|
     60 *		|	  saved registers	|
     61 *		|				|
     62 *		+-------------------------------+
     63 *	A6 --->	|	Saved A6		|
     64 *		+-------------------------------+
     65 *		|				|
     66 *		|	Exception Frame		|
     67 *		|				|
     68 *		|				|
     69 *
     70 *	Positive offsets from A6 refer to the exception frame.  Negative
     71 *	offsets refer to the Local Variable area and the fsave area.
     72 *	The fsave frame is also accessible 'from the top' via A7.
     73 *
     74 *	On exit, the handlers execute:
     75 *
     76 *		movem.l	USER_DA(a6),d0-d1/a0-a1
     77 *		fmovem.x USER_FP0(a6),fp0-fp3
     78 *		fmove.l	USER_FPSR(a6),fpsr/fpcr/fpiar
     79 *		frestore (a7)+
     80 *		unlk	a6
     81 *
     82 *	and then either 'bra fpsp_done' if the exception was completely
     83 *	handled	by the package, or 'bra real_xxxx' which is an external
     84 *	label to a routine that will process a real exception of the
     85 *	type that was generated.  Some handlers may omit the 'frestore'
     86 *	if the FPU state after the exception is idle.
     87 *
     88 *	Sometimes the exception handler will transform the fsave area
     89 *	because it needs to report an exception back to the user.  This
     90 *	can happen if the package is entered for an unimplemented float
     91 *	instruction that generates (say) an underflow.  Alternatively,
     92 *	a second fsave frame can be pushed onto the stack and the
     93 *	handler	exit code will reload the new frame and discard the old.
     94 *
     95 *	The registers d0, d1, a0, a1 and fp0-fp3 are always saved and
     96 *	restored from the 'local variable' area and can be used as
     97 *	temporaries.  If a routine needs to change any
     98 *	of these registers, it should modify the saved copy and let
     99 *	the handler exit code restore the value.
    100 *
    101 *----------------------------------------------------------------------
    102 *
    103 *	Local Variables on the stack
    104 *
    105 LOCAL_SIZE	equ	192		;bytes needed for local variables
    106 LV		equ	-LOCAL_SIZE	;convenient base value
    107 *
    108 USER_DA		equ	LV+0		;save space for D0-D1,A0-A1
    109 USER_D0		equ	LV+0		;saved user D0
    110 USER_D1		equ	LV+4		;saved user D1
    111 USER_A0		equ	LV+8		;saved user A0
    112 USER_A1		equ	LV+12		;saved user A1
    113 USER_FP0	equ	LV+16		;saved user FP0
    114 USER_FP1	equ	LV+28		;saved user FP1
    115 USER_FP2	equ	LV+40		;saved user FP2
    116 USER_FP3	equ	LV+52		;saved user FP3
    117 USER_FPCR	equ	LV+64		;saved user FPCR
    118 FPCR_ENABLE	equ	USER_FPCR+2	;	FPCR exception enable
    119 FPCR_MODE	equ	USER_FPCR+3	;	FPCR rounding mode control
    120 USER_FPSR	equ	LV+68		;saved user FPSR
    121 FPSR_CC		equ	USER_FPSR+0	;	FPSR condition code
    122 FPSR_QBYTE	equ	USER_FPSR+1	;	FPSR quotient
    123 FPSR_EXCEPT	equ	USER_FPSR+2	;	FPSR exception
    124 FPSR_AEXCEPT	equ	USER_FPSR+3	;	FPSR accrued exception
    125 USER_FPIAR	equ	LV+72		;saved user FPIAR
    126 FP_SCR1		equ	LV+76		;room for a temporary float value
    127 FP_SCR2		equ	LV+92		;room for a temporary float value
    128 L_SCR1		equ	LV+108		;room for a temporary long value
    129 L_SCR2		equ	LV+112		;room for a temporary long value
    130 STORE_FLG	equ	LV+116
    131 BINDEC_FLG	equ	LV+117		;used in bindec
    132 DNRM_FLG	equ	LV+118		;used in res_func
    133 RES_FLG		equ	LV+119		;used in res_func
    134 DY_MO_FLG	equ	LV+120		;dyadic/monadic flag
    135 UFLG_TMP	equ	LV+121		;temporary for uflag errata
    136 CU_ONLY		equ	LV+122		;cu-only flag
    137 VER_TMP		equ	LV+123		;temp holding for version number
    138 L_SCR3		equ	LV+124		;room for a temporary long value
    139 FP_SCR3		equ	LV+128		;room for a temporary float value
    140 FP_SCR4		equ	LV+144		;room for a temporary float value
    141 FP_SCR5		equ	LV+160		;room for a temporary float value
    142 FP_SCR6		equ	LV+176
    143 *
    144 *NEXT		equ	LV+192		;need to increase LOCAL_SIZE
    145 *
    146 *--------------------------------------------------------------------------
    147 *
    148 *	fsave offsets and bit definitions
    149 *
    150 *	Offsets are defined from the end of an fsave because the last 10
    151 *	words of a busy frame are the same as the unimplemented frame.
    152 *
    153 CU_SAVEPC	equ	LV-92		;micro-pc for CU (1 byte)
    154 FPR_DIRTY_BITS	equ	LV-91		;fpr dirty bits
    155 *
    156 WBTEMP		equ	LV-76		;write back temp (12 bytes)
    157 WBTEMP_EX	equ	WBTEMP		;wbtemp sign and exponent (2 bytes)
    158 WBTEMP_HI	equ	WBTEMP+4	;wbtemp mantissa [63:32] (4 bytes)
    159 WBTEMP_LO	equ	WBTEMP+8	;wbtemp mantissa [31:00] (4 bytes)
    160 *
    161 WBTEMP_SGN	equ	WBTEMP+2	;used to store sign
    162 *
    163 FPSR_SHADOW	equ	LV-64		;fpsr shadow reg
    164 *
    165 FPIARCU		equ	LV-60		;Instr. addr. reg. for CU (4 bytes)
    166 *
    167 CMDREG2B	equ	LV-52		;cmd reg for machine 2
    168 CMDREG3B	equ	LV-48		;cmd reg for E3 exceptions (2 bytes)
    169 *
    170 NMNEXC		equ	LV-44		;NMNEXC (unsup,snan bits only)
    171 nmn_unsup_bit	equ	1
    172 nmn_snan_bit	equ	0
    173 *
    174 NMCEXC		equ	LV-43		;NMNEXC & NMCEXC
    175 nmn_operr_bit	equ	7
    176 nmn_ovfl_bit	equ	6
    177 nmn_unfl_bit	equ	5
    178 nmc_unsup_bit	equ	4
    179 nmc_snan_bit	equ	3
    180 nmc_operr_bit	equ	2
    181 nmc_ovfl_bit	equ	1
    182 nmc_unfl_bit	equ	0
    183 *
    184 STAG		equ	LV-40		;source tag (1 byte)
    185 WBTEMP_GRS	equ	LV-40		;alias wbtemp guard, round, sticky
    186 guard_bit	equ	1		;guard bit is bit number 1
    187 round_bit	equ	0		;round bit is bit number 0
    188 stag_mask	equ	$E0		;upper 3 bits are source tag type
    189 denorm_bit	equ	7		;bit determins if denorm or unnorm
    190 etemp15_bit	equ	4		;etemp exponent bit #15
    191 wbtemp66_bit	equ	2		;wbtemp mantissa bit #66
    192 wbtemp1_bit	equ	1		;wbtemp mantissa bit #1
    193 wbtemp0_bit	equ	0		;wbtemp mantissa bit #0
    194 *
    195 STICKY		equ	LV-39		;holds sticky bit
    196 sticky_bit	equ	7
    197 *
    198 CMDREG1B	equ	LV-36		;cmd reg for E1 exceptions (2 bytes)
    199 kfact_bit	equ	12		;distinguishes static/dynamic k-factor
    200 *					;on packed move out's.  NOTE: this
    201 *					;equate only works when CMDREG1B is in
    202 *					;a register.
    203 *
    204 CMDWORD		equ	LV-35		;command word in cmd1b
    205 direction_bit	equ	5		;bit 0 in opclass
    206 size_bit2	equ	12		;bit 2 in size field
    207 *
    208 DTAG		equ	LV-32		;dest tag (1 byte)
    209 dtag_mask	equ	$E0		;upper 3 bits are dest type tag
    210 fptemp15_bit	equ	4		;fptemp exponent bit #15
    211 *
    212 WB_BYTE		equ	LV-31		;holds WBTE15 bit (1 byte)
    213 wbtemp15_bit	equ	4		;wbtemp exponent bit #15
    214 *
    215 E_BYTE		equ	LV-28		;holds E1 and E3 bits (1 byte)
    216 E1		equ	2		;which bit is E1 flag
    217 E3		equ	1		;which bit is E3 flag
    218 SFLAG		equ	0		;which bit is S flag
    219 *
    220 T_BYTE		equ	LV-27		;holds T and U bits (1 byte)
    221 XFLAG		equ	7		;which bit is X flag
    222 UFLAG		equ	5		;which bit is U flag
    223 TFLAG		equ	4		;which bit is T flag
    224 *
    225 FPTEMP		equ	LV-24		;fptemp (12 bytes)
    226 FPTEMP_EX	equ	FPTEMP		;fptemp sign and exponent (2 bytes)
    227 FPTEMP_HI	equ	FPTEMP+4	;fptemp mantissa [63:32] (4 bytes)
    228 FPTEMP_LO	equ	FPTEMP+8	;fptemp mantissa [31:00] (4 bytes)
    229 *
    230 FPTEMP_SGN	equ	FPTEMP+2	;used to store sign
    231 *
    232 ETEMP		equ	LV-12		;etemp (12 bytes)
    233 ETEMP_EX	equ	ETEMP		;etemp sign and exponent (2 bytes)
    234 ETEMP_HI	equ	ETEMP+4		;etemp mantissa [63:32] (4 bytes)
    235 ETEMP_LO	equ	ETEMP+8		;etemp mantissa [31:00] (4 bytes)
    236 *
    237 ETEMP_SGN	equ	ETEMP+2		;used to store sign
    238 *
    239 EXC_SR		equ	4		;exception frame status register
    240 EXC_PC		equ	6		;exception frame program counter
    241 EXC_VEC		equ	10		;exception frame vector (format+vector#)
    242 EXC_EA		equ	12		;exception frame effective address
    243 *
    244 *--------------------------------------------------------------------------
    245 *
    246 *	FPSR/FPCR bits
    247 *
    248 neg_bit		equ	3	negative result
    249 z_bit		equ	2	zero result
    250 inf_bit		equ	1	infinity result
    251 nan_bit		equ	0	not-a-number result
    252 *
    253 q_sn_bit	equ	7	sign bit of quotient byte
    254 *
    255 bsun_bit	equ	7	branch on unordered
    256 snan_bit	equ	6	signalling nan
    257 operr_bit	equ	5	operand error
    258 ovfl_bit	equ	4	overflow
    259 unfl_bit	equ	3	underflow
    260 dz_bit		equ	2	divide by zero
    261 inex2_bit	equ	1	inexact result 2
    262 inex1_bit	equ	0	inexact result 1
    263 *
    264 aiop_bit	equ	7	accrued illegal operation
    265 aovfl_bit	equ	6	accrued overflow
    266 aunfl_bit	equ	5	accrued underflow
    267 adz_bit		equ	4	accrued divide by zero
    268 ainex_bit	equ	3	accrued inexact
    269 *
    270 *	FPSR individual bit masks
    271 *
    272 neg_mask	equ	$08000000
    273 z_mask		equ	$04000000
    274 inf_mask	equ	$02000000
    275 nan_mask	equ	$01000000
    276 *
    277 bsun_mask	equ	$00008000
    278 snan_mask	equ	$00004000
    279 operr_mask	equ	$00002000
    280 ovfl_mask	equ	$00001000
    281 unfl_mask	equ	$00000800
    282 dz_mask		equ	$00000400
    283 inex2_mask	equ	$00000200
    284 inex1_mask	equ	$00000100
    285 *
    286 aiop_mask	equ	$00000080	accrued illegal operation
    287 aovfl_mask	equ	$00000040	accrued overflow
    288 aunfl_mask	equ	$00000020	accrued underflow
    289 adz_mask	equ	$00000010	accrued divide by zero
    290 ainex_mask	equ	$00000008	accrued inexact
    291 *
    292 *	FPSR combinations used in the FPSP
    293 *
    294 dzinf_mask	equ	inf_mask+dz_mask+adz_mask
    295 opnan_mask	equ	nan_mask+operr_mask+aiop_mask
    296 nzi_mask	equ	$01ffffff 	clears N, Z, and I
    297 unfinx_mask	equ	unfl_mask+inex2_mask+aunfl_mask+ainex_mask
    298 unf2inx_mask	equ	unfl_mask+inex2_mask+ainex_mask
    299 ovfinx_mask	equ	ovfl_mask+inex2_mask+aovfl_mask+ainex_mask
    300 inx1a_mask	equ	inex1_mask+ainex_mask
    301 inx2a_mask	equ	inex2_mask+ainex_mask
    302 snaniop_mask	equ	nan_mask+snan_mask+aiop_mask
    303 naniop_mask	equ	nan_mask+aiop_mask
    304 neginf_mask	equ	neg_mask+inf_mask
    305 infaiop_mask	equ	inf_mask+aiop_mask
    306 negz_mask	equ	neg_mask+z_mask
    307 opaop_mask	equ	operr_mask+aiop_mask
    308 unfl_inx_mask	equ	unfl_mask+aunfl_mask+ainex_mask
    309 ovfl_inx_mask	equ	ovfl_mask+aovfl_mask+ainex_mask
    310 *
    311 *--------------------------------------------------------------------------
    312 *
    313 *	FPCR rounding modes
    314 *
    315 x_mode		equ	$00	round to extended
    316 s_mode		equ	$40	round to single
    317 d_mode		equ	$80	round to double
    318 *
    319 rn_mode		equ	$00	round nearest
    320 rz_mode		equ	$10	round to zero
    321 rm_mode		equ	$20	round to minus infinity
    322 rp_mode		equ	$30	round to plus infinity
    323 *
    324 *--------------------------------------------------------------------------
    325 *
    326 *	Miscellaneous equates
    327 *
    328 signan_bit	equ	6	signalling nan bit in mantissa
    329 sign_bit	equ	7
    330 *
    331 rnd_stky_bit	equ	29	round/sticky bit of mantissa
    332 *				this can only be used if in a data register
    333 sx_mask		equ	$01800000 set s and x bits in word $48
    334 *
    335 LOCAL_EX	equ	0
    336 LOCAL_SGN	equ	2
    337 LOCAL_HI	equ	4
    338 LOCAL_LO	equ	8
    339 LOCAL_GRS	equ	12	valid ONLY for FP_SCR1, FP_SCR2
    340 *
    341 *
    342 norm_tag	equ	$00	tag bits in {7:5} position
    343 zero_tag	equ	$20
    344 inf_tag		equ	$40
    345 nan_tag		equ	$60
    346 dnrm_tag	equ	$80
    347 *
    348 *	fsave sizes and formats
    349 *
    350 VER_4		equ	$40		fpsp compatible version numbers
    351 *					are in the $40s {$40-$4f}
    352 VER_40		equ	$40		original version number
    353 VER_41		equ	$41		revision version number
    354 *
    355 BUSY_SIZE	equ	100		size of busy frame
    356 BUSY_FRAME	equ	LV-BUSY_SIZE	start of busy frame
    357 *
    358 UNIMP_40_SIZE	equ	44		size of orig unimp frame
    359 UNIMP_41_SIZE	equ	52		size of rev unimp frame
    360 *
    361 IDLE_SIZE	equ	4		size of idle frame
    362 IDLE_FRAME	equ	LV-IDLE_SIZE	start of idle frame
    363 *
    364 *	exception vectors
    365 *
    366 TRACE_VEC	equ	$2024		trace trap
    367 FLINE_VEC	equ	$002C		'real' F-line
    368 UNIMP_VEC	equ	$202C		unimplemented
    369 INEX_VEC	equ	$00C4
    370 *
    371 dbl_thresh	equ	$3C01
    372 sgl_thresh	equ	$3F81
    373 *
    374