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

Annotation of sys/arch/m68k/fpsp/fpsp.h, Revision 1.1

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

CVSweb