* $NetBSD: l_fpsp.h,v 1.3 2014/10/18 08:33:25 snj Exp $ * MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP * M68000 Hi-Performance Microprocessor Division * M68040 Software Package * * M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc. * All rights reserved. * * THE SOFTWARE is provided on an "AS IS" basis and without warranty. * To the maximum extent permitted by applicable law, * MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A * PARTICULAR PURPOSE and any warranty against infringement with * regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) * and any accompanying written materials. * * To the maximum extent permitted by applicable law, * IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER * (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS * PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR * OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE * SOFTWARE. Motorola assumes no responsibility for the maintenance * and support of the SOFTWARE. * * You are hereby granted a copyright license to use, modify, and * distribute the SOFTWARE so long as this entire notice is retained * without alteration in any modified and/or redistributed versions, * and that such modified versions are clearly identified as such. * No licenses are granted by implication, estoppel or otherwise * under any patents or trademarks of Motorola, Inc. * * l_fpsp.h 1.2 5/1/91 * * l_fpsp.h --- stack frame offsets for library version of FPSP * * This file is derived from fpsp.h. All equates that refer * to the fsave frame and its bits are removed with the * exception of ETEMP, WBTEMP, DTAG and STAG which are simulated * in the library version. Equates for the exception frame are * also not needed. Some of the equates that are only used in * the kernel version of the FPSP are left in to minimize the * differences between this file and the original. * * The library routines use the same source files as the regular * kernel mode code so they expect the same setup. That is, you * must create enough space on the stack for all save areas and * work variables that are needed, and save any registers that * your compiler does not treat as scratch registers on return * from function calls. * * The worst case setup is: * * link a6,#-LOCAL_SIZE * movem.l d0-d1/a0-a1,USER_DA(a6) * fmovem.x fp0-fp3,USER_FP0(a6) * fmovem.l fpsr/fpcr,USER_FPSR(a6) * * After initialization, the stack looks like this: * * A7 ---> +-------------------------------+ * | | * | FPSP Local Variables | * | including | * | saved registers | * | | * +-------------------------------+ * A6 ---> | Saved A6 | * +-------------------------------+ * | Return PC | * +-------------------------------+ * | Arguments to | * | an FPSP library | * | package | * | | * * Positive offsets from A6 refer to the input arguments. Negative * offsets refer to the Local Variable area. * * On exit, execute: * * movem.l USER_DA(a6),d0-d1/a0-a1 * fmovem.x USER_FP0(a6),fp0-fp3 * fmove.l USER_FPSR(a6),fpsr/fpcr * unlk a6 * rts * * Many 68K C compilers treat a0/a1/d0/d1/fp0/fp1 as scratch so * a simplified setup/exit is possible: * * link a6,#-LOCAL_SIZE * fmovem.x fp2-fp3,USER_FP2(a6) * fmove.l fpsr/fpcr,USER_FPSR(a6) * * [call appropriate emulation routine] * * fmovem.x USER_FP2(a6),fp2-fp3 * fmove.l USER_FPSR(a6),fpsr/fpcr * unlk a6 * rts * * Note that you must still save fp2/fp3 because the FPSP emulation * routines expect fp0-fp3 as scratch registers. For all monadic * entry points, the caller should save the fpcr in d1 and zero the * real fpcr before calling the emulation routine. On return, the * monadic emulation code will place the value supplied in d1 back * into the fpcr and do a single floating point operation so that * the final result will be correctly rounded and any specified * exceptions will be generated. * *---------------------------------------------------------------------- * * Local Variables on the stack * LOCAL_SIZE equ 228 ;bytes needed for local variables LV equ -LOCAL_SIZE ;convenient base value * USER_DA equ LV+0 ;save space for D0-D1,A0-A1 USER_D0 equ LV+0 ;saved user D0 USER_D1 equ LV+4 ;saved user D1 USER_A0 equ LV+8 ;saved user A0 USER_A1 equ LV+12 ;saved user A1 USER_FP0 equ LV+16 ;saved user FP0 USER_FP1 equ LV+28 ;saved user FP1 USER_FP2 equ LV+40 ;saved user FP2 USER_FP3 equ LV+52 ;saved user FP3 USER_FPCR equ LV+64 ;saved user FPCR FPCR_ENABLE equ USER_FPCR+2 ; FPCR exception enable FPCR_MODE equ USER_FPCR+3 ; FPCR rounding mode control USER_FPSR equ LV+68 ;saved user FPSR FPSR_CC equ USER_FPSR+0 ; FPSR condition code FPSR_QBYTE equ USER_FPSR+1 ; FPSR quotient FPSR_EXCEPT equ USER_FPSR+2 ; FPSR exception FPSR_AEXCEPT equ USER_FPSR+3 ; FPSR accrued exception USER_FPIAR equ LV+72 ;saved user FPIAR FP_SCR1 equ LV+76 ;room for a temporary float value FP_SCR2 equ LV+92 ;room for a temporary float value L_SCR1 equ LV+108 ;room for a temporary long value L_SCR2 equ LV+112 ;room for a temporary long value STORE_FLG equ LV+116 BINDEC_FLG equ LV+117 ;used in bindec DNRM_FLG equ LV+118 ;used in res_func RES_FLG equ LV+119 ;used in res_func DY_MO_FLG equ LV+120 ;dyadic/monadic flag UFLG_TMP equ LV+121 ;temporary for uflag errata CU_ONLY equ LV+122 ;cu-only flag VER_TMP equ LV+123 ;temp holding for version number L_SCR3 equ LV+124 ;room for a temporary long value FP_SCR3 equ LV+128 ;room for a temporary float value FP_SCR4 equ LV+144 ;room for a temporary float value FP_SCR5 equ LV+160 ;room for a temporary float value FP_SCR6 equ LV+176 * *-------------------------------------------------------------------------- * STAG equ LV+192 ;source tag (1 byte) * DTAG equ LV+193 ;dest tag (1 byte) * FPTEMP equ LV+196 ;fptemp (12 bytes) FPTEMP_EX equ FPTEMP ;fptemp sign and exponent (2 bytes) FPTEMP_HI equ FPTEMP+4 ;fptemp mantissa [63:32] (4 bytes) FPTEMP_LO equ FPTEMP+8 ;fptemp mantissa [31:00] (4 bytes) * FPTEMP_SGN equ FPTEMP+2 ;used to store sign * ETEMP equ LV+208 ;etemp (12 bytes) ETEMP_EX equ ETEMP ;etemp sign and exponent (2 bytes) ETEMP_HI equ ETEMP+4 ;etemp mantissa [63:32] (4 bytes) ETEMP_LO equ ETEMP+8 ;etemp mantissa [31:00] (4 bytes) * ETEMP_SGN equ ETEMP+2 ;used to store sign * *-------------------------------------------------------------------------- * * FPSR/FPCR bits * neg_bit equ 3 negative result z_bit equ 2 zero result inf_bit equ 1 infinity result nan_bit equ 0 not-a-number result * q_sn_bit equ 7 sign bit of quotient byte * bsun_bit equ 7 branch on unordered snan_bit equ 6 signalling nan operr_bit equ 5 operand error ovfl_bit equ 4 overflow unfl_bit equ 3 underflow dz_bit equ 2 divide by zero inex2_bit equ 1 inexact result 2 inex1_bit equ 0 inexact result 1 * aiop_bit equ 7 accrued illegal operation aovfl_bit equ 6 accrued overflow aunfl_bit equ 5 accrued underflow adz_bit equ 4 accrued divide by zero ainex_bit equ 3 accrued inexact * * FPSR individual bit masks * neg_mask equ $08000000 z_mask equ $04000000 inf_mask equ $02000000 nan_mask equ $01000000 * bsun_mask equ $00008000 snan_mask equ $00004000 operr_mask equ $00002000 ovfl_mask equ $00001000 unfl_mask equ $00000800 dz_mask equ $00000400 inex2_mask equ $00000200 inex1_mask equ $00000100 * aiop_mask equ $00000080 accrued illegal operation aovfl_mask equ $00000040 accrued overflow aunfl_mask equ $00000020 accrued underflow adz_mask equ $00000010 accrued divide by zero ainex_mask equ $00000008 accrued inexact * * FPSR combinations used in the FPSP * dzinf_mask equ inf_mask+dz_mask+adz_mask opnan_mask equ nan_mask+operr_mask+aiop_mask nzi_mask equ $01ffffff clears N, Z, and I unfinx_mask equ unfl_mask+inex2_mask+aunfl_mask+ainex_mask unf2inx_mask equ unfl_mask+inex2_mask+ainex_mask ovfinx_mask equ ovfl_mask+inex2_mask+aovfl_mask+ainex_mask inx1a_mask equ inex1_mask+ainex_mask inx2a_mask equ inex2_mask+ainex_mask snaniop_mask equ nan_mask+snan_mask+aiop_mask naniop_mask equ nan_mask+aiop_mask neginf_mask equ neg_mask+inf_mask infaiop_mask equ inf_mask+aiop_mask negz_mask equ neg_mask+z_mask opaop_mask equ operr_mask+aiop_mask unfl_inx_mask equ unfl_mask+aunfl_mask+ainex_mask ovfl_inx_mask equ ovfl_mask+aovfl_mask+ainex_mask * *-------------------------------------------------------------------------- * * FPCR rounding modes * x_mode equ $00 round to extended s_mode equ $40 round to single d_mode equ $80 round to double * rn_mode equ $00 round nearest rz_mode equ $10 round to zero rm_mode equ $20 round to minus infinity rp_mode equ $30 round to plus infinity * *-------------------------------------------------------------------------- * * Miscellaneous equates * signan_bit equ 6 signalling nan bit in mantissa sign_bit equ 7 * rnd_stky_bit equ 29 round/sticky bit of mantissa * this can only be used if in a data register LOCAL_EX equ 0 LOCAL_SGN equ 2 LOCAL_HI equ 4 LOCAL_LO equ 8 LOCAL_GRS equ 12 valid ONLY for FP_SCR1, FP_SCR2 * * norm_tag equ $00 tag bits in {7:5} position zero_tag equ $20 inf_tag equ $40 nan_tag equ $60 dnrm_tag equ $80 * dbl_thresh equ $3C01 sgl_thresh equ $3F81 *