[BACK]Return to l_fpsp.h CVS log [TXT][DIR] Up to [local] / sys / arch / m68k / fpsp

Annotation of sys/arch/m68k/fpsp/l_fpsp.h, Revision 1.1.1.1

1.1       nbrk        1: *      $OpenBSD: l_fpsp.h,v 1.3 2007/04/10 17:47:54 miod Exp $
                      2: *      $NetBSD: l_fpsp.h,v 1.2 1994/10/26 07:49:14 cgd Exp $
                      3:
                      4: *      MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
                      5: *      M68000 Hi-Performance Microprocessor Division
                      6: *      M68040 Software Package
                      7: *
                      8: *      M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
                      9: *      All rights reserved.
                     10: *
                     11: *      THE SOFTWARE is provided on an "AS IS" basis and without warranty.
                     12: *      To the maximum extent permitted by applicable law,
                     13: *      MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
                     14: *      INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
                     15: *      PARTICULAR PURPOSE and any warranty against infringement with
                     16: *      regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
                     17: *      and any accompanying written materials.
                     18: *
                     19: *      To the maximum extent permitted by applicable law,
                     20: *      IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
                     21: *      (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
                     22: *      PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
                     23: *      OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
                     24: *      SOFTWARE.  Motorola assumes no responsibility for the maintenance
                     25: *      and support of the SOFTWARE.
                     26: *
                     27: *      You are hereby granted a copyright license to use, modify, and
                     28: *      distribute the SOFTWARE so long as this entire notice is retained
                     29: *      without alteration in any modified and/or redistributed versions,
                     30: *      and that such modified versions are clearly identified as such.
                     31: *      No licenses are granted by implication, estoppel or otherwise
                     32: *      under any patents or trademarks of Motorola, Inc.
                     33:
                     34: *
                     35: *      l_fpsp.h 1.2 5/1/91
                     36: *
                     37:
                     38: *      l_fpsp.h --- stack frame offsets for library version of FPSP
                     39: *
                     40: *      This file is derived from fpsp.h.  All equates that refer
                     41: *      to the fsave frame and its bits are removed with the
                     42: *      exception of ETEMP, WBTEMP, DTAG and STAG which are simulated
                     43: *      in the library version.  Equates for the exception frame are
                     44: *      also not needed.  Some of the equates that are only used in
                     45: *      the kernel version of the FPSP are left in to minimize the
                     46: *      differences between this file and the original.
                     47: *
                     48: *      The library routines use the same source files as the regular
                     49: *      kernel mode code so they expect the same setup.  That is, you
                     50: *      must create enough space on the stack for all save areas and
                     51: *      work variables that are needed, and save any registers that
                     52: *      your compiler does not treat as scratch registers on return
                     53: *      from function calls.
                     54: *
                     55: *      The worst case setup is:
                     56: *
                     57: *              link    a6,#-LOCAL_SIZE
                     58: *              movem.l d0-d1/a0-a1,USER_DA(a6)
                     59: *              fmovem.x fp0-fp3,USER_FP0(a6)
                     60: *              fmovem.l fpsr/fpcr,USER_FPSR(a6)
                     61: *
                     62: *      After initialization, the stack looks like this:
                     63: *
                     64: *      A7 ---> +-------------------------------+
                     65: *              |                               |
                     66: *              |       FPSP Local Variables    |
                     67: *              |            including          |
                     68: *              |         saved registers       |
                     69: *              |                               |
                     70: *              +-------------------------------+
                     71: *      A6 ---> |       Saved A6                |
                     72: *              +-------------------------------+
                     73: *              |       Return PC               |
                     74: *              +-------------------------------+
                     75: *              |       Arguments to            |
                     76: *              |       an FPSP library         |
                     77: *              |       package                 |
                     78: *              |                               |
                     79: *
                     80: *      Positive offsets from A6 refer to the input arguments.  Negative
                     81: *      offsets refer to the Local Variable area.
                     82: *
                     83: *      On exit, execute:
                     84: *
                     85: *              movem.l USER_DA(a6),d0-d1/a0-a1
                     86: *              fmovem.x USER_FP0(a6),fp0-fp3
                     87: *              fmove.l USER_FPSR(a6),fpsr/fpcr
                     88: *              unlk    a6
                     89: *              rts
                     90: *
                     91: *      Many 68K C compilers treat a0/a1/d0/d1/fp0/fp1 as scratch so
                     92: *      a simplified setup/exit is possible:
                     93: *
                     94: *              link    a6,#-LOCAL_SIZE
                     95: *              fmovem.x fp2-fp3,USER_FP2(a6)
                     96: *              fmove.l fpsr/fpcr,USER_FPSR(a6)
                     97: *
                     98: *              [call appropriate emulation routine]
                     99: *
                    100: *              fmovem.x USER_FP2(a6),fp2-fp3
                    101: *              fmove.l USER_FPSR(a6),fpsr/fpcr
                    102: *              unlk    a6
                    103: *              rts
                    104: *
                    105: *      Note that you must still save fp2/fp3 because the FPSP emulation
                    106: *      routines expect fp0-fp3 as scratch registers.  For all monadic
                    107: *      entry points, the caller should save the fpcr in d1 and zero the
                    108: *      real fpcr before calling the emulation routine.  On return, the
                    109: *      monadic emulation code will place the value supplied in d1 back
                    110: *      into the fpcr and do a single floating point operation so that
                    111: *      the final result will be correctly rounded and any specified
                    112: *      exceptions will be generated.
                    113: *
                    114: *----------------------------------------------------------------------
                    115: *
                    116: *      Local Variables on the stack
                    117: *
                    118: LOCAL_SIZE     equ     228             ;bytes needed for local variables
                    119: LV             equ     -LOCAL_SIZE     ;convenient base value
                    120: *
                    121: USER_DA                equ     LV+0            ;save space for D0-D1,A0-A1
                    122: USER_D0                equ     LV+0            ;saved user D0
                    123: USER_D1                equ     LV+4            ;saved user D1
                    124: USER_A0                equ     LV+8            ;saved user A0
                    125: USER_A1                equ     LV+12           ;saved user A1
                    126: USER_FP0       equ     LV+16           ;saved user FP0
                    127: USER_FP1       equ     LV+28           ;saved user FP1
                    128: USER_FP2       equ     LV+40           ;saved user FP2
                    129: USER_FP3       equ     LV+52           ;saved user FP3
                    130: USER_FPCR      equ     LV+64           ;saved user FPCR
                    131: FPCR_ENABLE    equ     USER_FPCR+2     ;       FPCR exception enable
                    132: FPCR_MODE      equ     USER_FPCR+3     ;       FPCR rounding mode control
                    133: USER_FPSR      equ     LV+68           ;saved user FPSR
                    134: FPSR_CC                equ     USER_FPSR+0     ;       FPSR condition code
                    135: FPSR_QBYTE     equ     USER_FPSR+1     ;       FPSR quotient
                    136: FPSR_EXCEPT    equ     USER_FPSR+2     ;       FPSR exception
                    137: FPSR_AEXCEPT   equ     USER_FPSR+3     ;       FPSR accrued exception
                    138: USER_FPIAR     equ     LV+72           ;saved user FPIAR
                    139: FP_SCR1                equ     LV+76           ;room for a temporary float value
                    140: FP_SCR2                equ     LV+92           ;room for a temporary float value
                    141: L_SCR1         equ     LV+108          ;room for a temporary long value
                    142: L_SCR2         equ     LV+112          ;room for a temporary long value
                    143: STORE_FLG      equ     LV+116
                    144: BINDEC_FLG     equ     LV+117          ;used in bindec
                    145: DNRM_FLG       equ     LV+118          ;used in res_func
                    146: RES_FLG                equ     LV+119          ;used in res_func
                    147: DY_MO_FLG      equ     LV+120          ;dyadic/monadic flag
                    148: UFLG_TMP       equ     LV+121          ;temporary for uflag errata
                    149: CU_ONLY                equ     LV+122          ;cu-only flag
                    150: VER_TMP                equ     LV+123          ;temp holding for version number
                    151: L_SCR3         equ     LV+124          ;room for a temporary long value
                    152: FP_SCR3                equ     LV+128          ;room for a temporary float value
                    153: FP_SCR4                equ     LV+144          ;room for a temporary float value
                    154: FP_SCR5                equ     LV+160          ;room for a temporary float value
                    155: FP_SCR6                equ     LV+176
                    156: *
                    157: *--------------------------------------------------------------------------
                    158: *
                    159: STAG           equ     LV+192          ;source tag (1 byte)
                    160: *
                    161: DTAG           equ     LV+193          ;dest tag (1 byte)
                    162: *
                    163: FPTEMP         equ     LV+196          ;fptemp (12 bytes)
                    164: FPTEMP_EX      equ     FPTEMP          ;fptemp sign and exponent (2 bytes)
                    165: FPTEMP_HI      equ     FPTEMP+4        ;fptemp mantissa [63:32] (4 bytes)
                    166: FPTEMP_LO      equ     FPTEMP+8        ;fptemp mantissa [31:00] (4 bytes)
                    167: *
                    168: FPTEMP_SGN     equ     FPTEMP+2        ;used to store sign
                    169: *
                    170: ETEMP          equ     LV+208          ;etemp (12 bytes)
                    171: ETEMP_EX       equ     ETEMP           ;etemp sign and exponent (2 bytes)
                    172: ETEMP_HI       equ     ETEMP+4         ;etemp mantissa [63:32] (4 bytes)
                    173: ETEMP_LO       equ     ETEMP+8         ;etemp mantissa [31:00] (4 bytes)
                    174: *
                    175: ETEMP_SGN      equ     ETEMP+2         ;used to store sign
                    176: *
                    177: *--------------------------------------------------------------------------
                    178: *
                    179: *      FPSR/FPCR bits
                    180: *
                    181: neg_bit                equ     3       negative result
                    182: z_bit          equ     2       zero result
                    183: inf_bit                equ     1       infinity result
                    184: nan_bit                equ     0       not-a-number result
                    185: *
                    186: q_sn_bit       equ     7       sign bit of quotient byte
                    187: *
                    188: bsun_bit       equ     7       branch on unordered
                    189: snan_bit       equ     6       signalling nan
                    190: operr_bit      equ     5       operand error
                    191: ovfl_bit       equ     4       overflow
                    192: unfl_bit       equ     3       underflow
                    193: dz_bit         equ     2       divide by zero
                    194: inex2_bit      equ     1       inexact result 2
                    195: inex1_bit      equ     0       inexact result 1
                    196: *
                    197: aiop_bit       equ     7       accrued illegal operation
                    198: aovfl_bit      equ     6       accrued overflow
                    199: aunfl_bit      equ     5       accrued underflow
                    200: adz_bit                equ     4       accrued divide by zero
                    201: ainex_bit      equ     3       accrued inexact
                    202: *
                    203: *      FPSR individual bit masks
                    204: *
                    205: neg_mask       equ     $08000000
                    206: z_mask         equ     $04000000
                    207: inf_mask       equ     $02000000
                    208: nan_mask       equ     $01000000
                    209: *
                    210: bsun_mask      equ     $00008000
                    211: snan_mask      equ     $00004000
                    212: operr_mask     equ     $00002000
                    213: ovfl_mask      equ     $00001000
                    214: unfl_mask      equ     $00000800
                    215: dz_mask                equ     $00000400
                    216: inex2_mask     equ     $00000200
                    217: inex1_mask     equ     $00000100
                    218: *
                    219: aiop_mask      equ     $00000080       accrued illegal operation
                    220: aovfl_mask     equ     $00000040       accrued overflow
                    221: aunfl_mask     equ     $00000020       accrued underflow
                    222: adz_mask       equ     $00000010       accrued divide by zero
                    223: ainex_mask     equ     $00000008       accrued inexact
                    224: *
                    225: *      FPSR combinations used in the FPSP
                    226: *
                    227: dzinf_mask     equ     inf_mask+dz_mask+adz_mask
                    228: opnan_mask     equ     nan_mask+operr_mask+aiop_mask
                    229: nzi_mask       equ     $01ffffff       clears N, Z, and I
                    230: unfinx_mask    equ     unfl_mask+inex2_mask+aunfl_mask+ainex_mask
                    231: unf2inx_mask   equ     unfl_mask+inex2_mask+ainex_mask
                    232: ovfinx_mask    equ     ovfl_mask+inex2_mask+aovfl_mask+ainex_mask
                    233: inx1a_mask     equ     inex1_mask+ainex_mask
                    234: inx2a_mask     equ     inex2_mask+ainex_mask
                    235: snaniop_mask   equ     nan_mask+snan_mask+aiop_mask
                    236: naniop_mask    equ     nan_mask+aiop_mask
                    237: neginf_mask    equ     neg_mask+inf_mask
                    238: infaiop_mask   equ     inf_mask+aiop_mask
                    239: negz_mask      equ     neg_mask+z_mask
                    240: opaop_mask     equ     operr_mask+aiop_mask
                    241: unfl_inx_mask  equ     unfl_mask+aunfl_mask+ainex_mask
                    242: ovfl_inx_mask  equ     ovfl_mask+aovfl_mask+ainex_mask
                    243: *
                    244: *--------------------------------------------------------------------------
                    245: *
                    246: *      FPCR rounding modes
                    247: *
                    248: x_mode         equ     $00     round to extended
                    249: s_mode         equ     $40     round to single
                    250: d_mode         equ     $80     round to double
                    251: *
                    252: rn_mode                equ     $00     round nearest
                    253: rz_mode                equ     $10     round to zero
                    254: rm_mode                equ     $20     round to minus infinity
                    255: rp_mode                equ     $30     round to plus infinity
                    256: *
                    257: *--------------------------------------------------------------------------
                    258: *
                    259: *      Miscellaneous equates
                    260: *
                    261: signan_bit     equ     6       signalling nan bit in mantissa
                    262: sign_bit       equ     7
                    263: *
                    264: rnd_stky_bit   equ     29      round/sticky bit of mantissa
                    265: *                              this can only be used if in a data register
                    266: LOCAL_EX       equ     0
                    267: LOCAL_SGN      equ     2
                    268: LOCAL_HI       equ     4
                    269: LOCAL_LO       equ     8
                    270: LOCAL_GRS      equ     12      valid ONLY for FP_SCR1, FP_SCR2
                    271: *
                    272: *
                    273: norm_tag       equ     $00     tag bits in {7:5} position
                    274: zero_tag       equ     $20
                    275: inf_tag                equ     $40
                    276: nan_tag                equ     $60
                    277: dnrm_tag       equ     $80
                    278: *
                    279: dbl_thresh     equ     $3C01
                    280: sgl_thresh     equ     $3F81
                    281: *

CVSweb