Annotation of GNUtools/cctools/include/architecture/m88k/fp_regs.h, revision 1.1

1.1     ! root        1: /* Copyright (c) 1991 NeXT Computer, Inc.  All rights reserved.
        !             2:  *
        !             3:  *     File:   architecture/m88k/fp_regs.h
        !             4:  *     Author: Mike DeMoney, NeXT Computer, Inc.
        !             5:  *
        !             6:  *     This include file defines Motorola 88K architecturally defined
        !             7:  *     floating point control and status registers.
        !             8:  *
        !             9:  * HISTORY
        !            10:  * 23-Jan-91  Mike DeMoney ([email protected])
        !            11:  *     Created.
        !            12:  */
        !            13: 
        !            14: #ifndef        _ARCH_M88K_FP_REGS_H_
        !            15: #define        _ARCH_M88K_FP_REGS_H_
        !            16: 
        !            17: #import <architecture/m88k/reg_help.h>
        !            18: 
        !            19: /*
        !            20:  * m88k_xrf_t -- data types that MAY be in extended register file
        !            21:  * Actual data types supported is implementation dependent
        !            22:  */
        !            23: typedef union {
        !            24:        float           f;              // 32 bit IEEE single
        !            25:        double          d;              // 64 bit IEEE double
        !            26:        /*
        !            27:         * NOTE: currently compiler implements long double type
        !            28:         * simply as double.  In the future, it may implement
        !            29:         * this as 80 bit IEEE double extended or 128 bit IEEE quad
        !            30:         * as appropriate for the 88K implementation.
        !            31:         */
        !            32:        long double     e;              // 80 or 128 bit IEEE format
        !            33:        /* Insure compiler aligns struct appropriately */
        !            34:        unsigned        x[4] __attribute__(( aligned(16) ));
        !            35: } m88k_xrf_t;
        !            36: 
        !            37: /*
        !            38:  * FPSR -- Floating Point Status Register
        !            39:  */
        !            40: typedef struct {
        !            41:        unsigned        :BITS_WIDTH(31,17);
        !            42:        unsigned        xmod:BIT_WIDTH(16);     // extended registers modified
        !            43:        unsigned        :BITS_WIDTH(15,5);
        !            44:        unsigned        afinv:BIT_WIDTH(4);     // accumulated invalid flag
        !            45:        unsigned        afdvz:BIT_WIDTH(3);     // accumulated div by zero flag
        !            46:        unsigned        afunf:BIT_WIDTH(2);     // accumulated underflow flag
        !            47:        unsigned        afovf:BIT_WIDTH(1);     // accumulated overflow flag
        !            48:        unsigned        afinx:BIT_WIDTH(0);     // accumulated inexact flag
        !            49: } m88k_fpsr_t;
        !            50: 
        !            51: /*
        !            52:  * FPCR -- Floating Point Control Register
        !            53:  * 88K architecturally specified form.
        !            54:  * Does not expose implementation-dependent functions
        !            55:  */
        !            56: typedef enum {
        !            57:        M88K_RM_NEAREST = 0,            // round toward nearest
        !            58:        M88K_RM_ZERO    = 1,            // round toward zero
        !            59:        M88K_RM_NEGINF = 2,             // round toward negative infinity
        !            60:        M88K_RM_POSINF =3               // round toward positive infinity
        !            61: } m88k_fpcr_rm_t;
        !            62: 
        !            63: typedef struct {
        !            64:        unsigned        :BITS_WIDTH(31,16);
        !            65:        m88k_fpcr_rm_t  rm:BITS_WIDTH(15,14);   // rounding mode
        !            66:        unsigned        :BITS_WIDTH(13,5);
        !            67:        unsigned        efinv:BIT_WIDTH(4);     // invalid exception enable
        !            68:        unsigned        efdvz:BIT_WIDTH(3);     // div by zero exception enable
        !            69:        unsigned        efunf:BIT_WIDTH(2);     // underflow exception enable
        !            70:        unsigned        efovf:BIT_WIDTH(1);     // overflow exception enable
        !            71:        unsigned        efinx:BIT_WIDTH(0);     // inexact exception enable
        !            72: } m88k_fpcr_t;
        !            73: 
        !            74: /*
        !            75:  * FPCR -- Floating Point Control Register
        !            76:  * 88110 implementation -- includes "TCFP" features.
        !            77:  */
        !            78: typedef struct {
        !            79:        unsigned        :BITS_WIDTH(31,22);
        !            80:        unsigned        tcfp:BIT_WIDTH(21);     // def results for INF/NaN
        !            81:        unsigned        :BITS_WIDTH(20,19);
        !            82:        unsigned        tcfpunf:BIT_WIDTH(18);  // underflow -> zero
        !            83:        unsigned        tcfpovf:BIT_WIDTH(17);  // overflow -> inf
        !            84:        unsigned        :BIT_WIDTH(16);
        !            85:        m88k_fpcr_rm_t  rm:BITS_WIDTH(15,14);   // rounding mode
        !            86:        unsigned        :BITS_WIDTH(13,5);
        !            87:        unsigned        efinv:BIT_WIDTH(4);     // invalid exception enable
        !            88:        unsigned        efdvz:BIT_WIDTH(3);     // div by zero exception enable
        !            89:        unsigned        efunf:BIT_WIDTH(2);     // underflow exception enable
        !            90:        unsigned        efovf:BIT_WIDTH(1);     // overflow exception enable
        !            91:        unsigned        efinx:BIT_WIDTH(0);     // inexact exception enable
        !            92: } m88110_fpcr_t;
        !            93: 
        !            94: #ifndef        __STRICT_ANSI__
        !            95: /*
        !            96:  * read and write fpsr and fpcr registers
        !            97:  *
        !            98:  * FIXME: When the compiler is fixed, convert to style of inlines shown
        !            99:  * in m88110_sfu0.h which do not use either CONTENTS() macro or
        !           100:  * *(foo_t *)& casts (and therefore, don't force the compiler to generate
        !           101:  * a memory reference.
        !           102:  */
        !           103: static __inline__ m88k_fpsr_t m88k_get_fpsr()
        !           104: {
        !           105:        unsigned        cr_tmp;
        !           106:        
        !           107:        __asm__ volatile ("fldcr         %0,fcr62       ; get_fpsr()" : "=r" (cr_tmp));
        !           108:        return *(m88k_fpsr_t *)&cr_tmp;
        !           109: }
        !           110: 
        !           111: static __inline__ void m88k_set_fpsr(m88k_fpsr_t fpsr_val)
        !           112: {
        !           113:        /*
        !           114:         * Must force xmod to 1, since OS uses this to determine
        !           115:         * if XRF must be context switched.  Not setting to 1
        !           116:         * will NOT corrupt other threads registers, but will
        !           117:         * result in loss of this threads register values.
        !           118:         */
        !           119:        fpsr_val.xmod = 1;
        !           120:        __asm__ volatile ("fstcr         %0,fcr62       ; set_fpsr()"
        !           121:          : : "r" (CONTENTS(fpsr_val)));
        !           122: }
        !           123: 
        !           124: static __inline__ m88k_fpcr_t m88k_get_fpcr()
        !           125: {
        !           126:        unsigned        cr_tmp;
        !           127:        
        !           128:        __asm__ volatile ("fldcr         %0,fcr63       ; get_fpcr()" : "=r" (cr_tmp));
        !           129:        return *(m88k_fpcr_t *)&cr_tmp;
        !           130: }
        !           131: 
        !           132: static __inline__ void m88k_set_fpcr(m88k_fpcr_t fpcr_val)
        !           133: {
        !           134:        __asm__ volatile ("fstcr         %0,fcr63       ; set_fpcr()"
        !           135:          : : "r" (CONTENTS(fpcr_val)));
        !           136: }
        !           137: #endif __STRICT_ANSI__
        !           138: 
        !           139: #endif _ARCH_M88K_FP_REGS_H_

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.