[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     ! 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