ieee_fpu.h

Go to the documentation of this file.
00001 /*
00002 *****************************************************************************
00003 **                                                                          *
00004 **                          COPYRIGHT 1990 BY                               *
00005 **             DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.                *
00006 **                         ALL RIGHTS RESERVED                              *
00007 **                                                                          *
00008 **  THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND  COPIED  *
00009 **  ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH  LICENSE AND WITH THE  *
00010 **  INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR  ANY  OTHER  *
00011 **  COPIES  THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY  *
00012 **  OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF  THE  SOFTWARE  IS  HEREBY  *
00013 **  TRANSFERRED.                                                            *
00014 **                                                                          *
00015 **  THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE  WITHOUT  NOTICE  *
00016 **  AND  SHOULD  NOT  BE  CONSTRUED  AS  A COMMITMENT BY DIGITAL EQUIPMENT  *
00017 **  CORPORATION.                                                            *
00018 **                                                                          *
00019 **  DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF  ITS  *
00020 **  SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.                 *
00021 **                                                                          *
00022 *****************************************************************************
00023 **++
00024 **  FACILITY:
00025 **
00026 **      SYS
00027 **
00028 **  ABSTRACT:
00029 **
00030 **      This module contains floating point definitions.
00031 **
00032 **  AUTHORS:
00033 **
00034 **      Robert Gries
00035 **
00036 **  CREATION DATE:      07-Oct-1993
00037 **
00038 **  MODIFICATION HISTORY:
00039 **
00040 **      X-3     EMB         Ellen M. Batbouta           09-Apr-1998
00041 **              Clean-up.
00042 **
00043 **      X-2     BMAN        Brian Man                   04-Nov-1994
00044 **              Added #INCLUDE of INTS.H since BUILTINS.H doesn't include
00045 **              it in itself anymore.
00046 **
00047 **--
00048 **/
00049 
00050 /*
00051  *      Alpha FP definitions
00052  */
00053 
00054 #include <builtins.h>
00055 #include <ints.h>
00056 
00057 
00058 #define IEEE_PLUS_SIGN          0
00059 #define IEEE_MINUS_SIGN         1
00060 
00061 
00062 /* ALPHA constants for exceptional values */
00063 #define IEEE_PLUS_QUIET_NAN             0x7ff7ffffffffffffUL
00064 #define IEEE_MINUS_QUIET_NAN            0xfff7ffffffffffffUL
00065 #define IEEE_PLUS_SIGNALING_NAN         0x7fffffffffffffffUL
00066 #define IEEE_MINUS_SIGNALING_NAN        0xffffffffffffffffUL
00067 #define IEEE_PLUS_INFINITY              0x7ff0000000000000UL
00068 #define IEEE_MINUS_INFINITY             0xfff0000000000000UL
00069 #define IEEE_PLUS_LARGEST_NUMBER        0x7fefffffffffffffUL
00070 #define IEEE_MINUS_LARGEST_NUMBER       0xffefffffffffffffUL
00071 #define IEEE_PLUS_ZERO                  0x0000000000000000UL
00072 #define IEEE_MINUS_ZERO                 0x8000000000000000UL
00073 #define IEEE_PLUS_TWO                   0x4000000000000000UL
00074 
00075 #define IEEE_ZERO_EXPONENT              0
00076 #define IEEE_ZERO_FRACTION              0
00077 #define IEEE_DENORM_EXPONENT            0
00078 #define IEEE_NAN_EXPONENT               0x7ff
00079 #define IEEE_SIGNALING_NAN_MASK         0x0008000000000000UL
00080 
00081 #define IEEE_FP_TRUE                    IEEE_PLUS_TWO
00082 #define IEEE_FP_FALSE                   IEEE_PLUS_ZERO
00083 #define IEEE_SIGN_BIT_MASK              (1UL<<63)
00084 
00085 /* S format constants */
00086 #define IEEE_S_FRACTION_SIZE            23
00087 #define IEEE_S_EXPONENT_BIAS            127
00088 #define IEEE_S_EXPONENT_MAX             254
00089 #define IEEE_S_EXPONENT_SHIFT           3       /* in reg to make like t */
00090 
00091 /* T format constants */
00092 #define IEEE_T_FRACTION_SIZE            52
00093 #define IEEE_T_EXPONENT_BIAS            1023
00094 #define IEEE_T_EXPONENT_MAX             2046
00095 #define IEEE_T_FRACTION_HIGH_BIT        (1UL<<51)
00096 #define IEEE_T_EXPONENT_SHIFT           0
00097 
00098 /* F format constants */
00099 #define VAX_F_FRACTION_SIZE             23
00100 #define VAX_F_EXPONENT_BIAS             127
00101 
00102 /* G format constants */
00103 #define VAX_G_FRACTION_SIZE             52
00104 #define VAX_G_EXPONENT_BIAS             1023
00105 
00106 /* D format constants */
00107 #define VAX_D_FRACTION_SIZE             55
00108 #define VAX_D_EXPONENT_BIAS             -127
00109 
00110 /* Constants for fpcr bits in fc_struct.fc_word */
00111 #define FPCR_INV        0x0010000000000000UL    /* invalid operation */
00112 #define FPCR_DZE        0x0020000000000000UL    /* divide by zero */
00113 #define FPCR_OVF        0x0040000000000000UL    /* overflow */
00114 #define FPCR_UNF        0x0080000000000000UL    /* undeflow */
00115 #define FPCR_INE        0x0100000000000000UL    /* inexact */
00116 #define FPCR_IOV        0x0200000000000000UL    /* integer overflow */
00117 #define FPCR_DYN_MASK   0x0c00000000000000UL    /* dynamic rounding mode mask */
00118 #define FPCR_DYN_SHIFT  58                      /* bit position of dyn_rm */
00119 #define FPCR_DYN_CHOPPED 0x0000000000000000UL/* chopped rounding */
00120 #define FPCR_DYN_MINUS  0x0400000000000000UL    /* minus inf rounding */
00121 #define FPCR_DYN_NORMAL 0x0800000000000000UL    /* normal rounding */
00122 #define FPCR_DYN_PLUS   0x0c00000000000000UL    /* plus inf rounding */
00123 #define FPCR_SUM        0x8000000000000000UL    /* summary */
00124 
00125 /*
00126  * These constants are for the dynamic
00127  * rounding mode
00128  */
00129 
00130 /* Constants for dyn_rm field of the fpcr */
00131 #define FE_TOWARDZERO   0       /* chopped */
00132 #define FE_DOWNWARD     1       /* minus infinity */
00133 #define FE_TONEAREST    2       /* normal */
00134 #define FE_UPWARD       3       /* plus infinity */
00135 
00136 /* ieee dynamic rounding mode field value names */
00137 #define IEEE_ROUND_CHOPPED              FE_TOWARDZERO
00138 #define IEEE_ROUND_TO_ZERO              IEEE_ROUND_CHOPPED      /* ieee name */
00139 #define IEEE_ROUND_TO_MINUS_INFINITY    FE_DOWNWARD
00140 #define IEEE_ROUND_NORMAL               FE_TONEAREST
00141 #define IEEE_ROUND_TO_NEAREST           IEEE_ROUND_NORMAL       /* ieee name */
00142 #define IEEE_ROUND_TO_PLUS_INFINITY     FE_UPWARD
00143 
00144 /* exception summary bits */
00145 #define EXCSUM_SWC      0x01
00146 #define EXCSUM_INV      0x02
00147 #define EXCSUM_DZE      0x04
00148 #define EXCSUM_OVF      0x08
00149 #define EXCSUM_UNF      0x10
00150 #define EXCSUM_INE      0x20
00151 #define EXCSUM_IOV      0x40
00152 #define EXCSUM_MASK     0x7e
00153 
00154 typedef struct fp_s_memory {
00155         unsigned short          low_fraction;
00156         unsigned short          hi_fraction:7;
00157         unsigned short          exponent:8;
00158         unsigned short          sign:1;
00159 } fp_s_memory;                          /* ieee single precision */
00160 
00161 typedef struct fp_f_memory {
00162         unsigned short          low_fraction;
00163         unsigned short          hi_fraction:7;
00164         unsigned short          exponent:8;
00165         unsigned short          sign:1;
00166 } fp_f_memory;                          /* Vax single precision */
00167 
00168 /* in register formats for alpha floating point types */
00169 
00170 typedef struct fp_s_register {
00171         unsigned short          mbz_0;          /* must be zero */
00172         unsigned short          mbz_1:13;       /* must be zero */
00173         unsigned short          low_fraction:3;
00174         unsigned short          mid_fraction;
00175         unsigned short          hi_fraction:4;
00176         unsigned short          exponent:11;
00177         unsigned short          sign:1;
00178 } fp_s_register;                                /* ieee single precision */
00179 
00180 typedef struct fp_f_register {
00181         unsigned short          mbz_0;          /* must be zero */
00182         unsigned short          mbz_1:13;       /* must be zero */
00183         unsigned short          low_fraction:3;
00184         unsigned short          mid_fraction;
00185         unsigned short          exponent:11;
00186         unsigned short          sign:1;
00187 } fp_f_register;                                /* vax single precision */
00188 
00189 typedef struct fp_t_register {
00190         unsigned long  low_word;
00191         unsigned short next_word;
00192         unsigned short high_byte:4;
00193         unsigned short          exponent:11;
00194         unsigned short          sign:1;
00195 } fp_t_register;                                /* ieee double precision */
00196 
00197 typedef struct fp_g_register {
00198         unsigned long  low_word;
00199         unsigned short next_word;
00200         unsigned short high_byte:4;
00201         unsigned short          exponent:11;
00202         unsigned short          sign:1;
00203 } fp_g_register;                                /* vax double precision */
00204 
00205 typedef struct fp_d_register {
00206         unsigned long           low_word;
00207         unsigned short          next_word;
00208         unsigned short                  high_word:7;
00209         unsigned short          exponent:8;
00210         unsigned short          sign:1;
00211 } fp_d_register;                                /* vax double precision */
00212 
00213 typedef struct fp_l_register {
00214         unsigned short          low_mbz;
00215         unsigned short          hi_mbz:13;
00216         unsigned short          low_bits:3;
00217         unsigned short          mid_bits;
00218         unsigned short          hi_low_bit:11;
00219         unsigned short          ignored:3;
00220         unsigned short          hi_bit:1;
00221         unsigned short          sign:1;
00222 } fp_l_register;                                /* longword format */
00223 
00224 typedef struct fp_q_register {
00225         unsigned long           low_bits;
00226         unsigned short          mid_bits;
00227         unsigned short          hi_bit:15;
00228         unsigned short          sign:1;
00229 } fp_q_register;                                /* quadword format */
00230 
00231 typedef union fp_register {
00232 #ifndef __MSDOS__
00233         uint64                  qval;           /* quad to access */
00234 #endif
00235         double                  dval;           /* double to print */
00236         fp_s_register           s_form;         /* ieee single precision */
00237         fp_t_register           t_form;         /* ieee double precision */
00238         fp_f_register           f_form;         /* vax single precision */
00239         fp_g_register           g_form;         /* vax double precision */
00240         fp_d_register           d_form;         /* vax double precision */
00241         fp_l_register           l_form;         /* longword format */
00242         fp_q_register           q_form;         /* quadword format */
00243 } fp_register;
00244 
00245 
00246 /* exception summary register */
00247 typedef union excsum {
00248 #ifndef __MSDOS__
00249         uint64                  qval;
00250 #endif
00251         struct {
00252             /* cumulative excption bits representing excptions in trap shadow */
00253             unsigned short      swc:1;
00254             unsigned short      inv:1;
00255             unsigned short      dze:1;
00256             unsigned short      ovf:1;
00257             unsigned short      unf:1;
00258             unsigned short      ine:1;
00259             unsigned short      iov:1;
00260 
00261         } fields;
00262 } excsum;
00263 
00264 typedef union ieee_fp_control_t {
00265 #ifndef __MSDOS__
00266         uint64                  qval;           /* quad to access */
00267 #endif
00268     struct {
00269 
00270         unsigned short  reserved1:1;
00271 
00272         /* trap and action enables match excsum except for int overflow */
00273         unsigned short  enable_inv:1;
00274         unsigned short  enable_dze:1;
00275         unsigned short  enable_ovf:1;
00276         unsigned short  enable_unf:1;
00277         unsigned short  enable_ine:1;
00278 
00279         unsigned short  reserved2: 7;
00280 
00281         unsigned short  map_underflows_to_zero:1;
00282         unsigned short  reserved3:3;
00283 
00284         /* sticky status bits, only cleared by user */
00285         unsigned short  inv:1;
00286         unsigned short  dze:1;
00287         unsigned short  ovf:1;
00288         unsigned short  unf:1;
00289         unsigned short  ine:1;
00290 
00291         unsigned short  reserved4: 10;
00292         unsigned long   inherit;        /* on fork or thread create */
00293 
00294     } fields;
00295 
00296 } ieee_fp_control_t;
00297 
00298 typedef struct a_reg_mask
00299    {
00300      unsigned long dest_int_reg_mask, search_int_reg_mask,
00301      dest_float_reg_mask, search_float_reg_mask;
00302      /* used for shadow check*/
00303    } a_reg_mask;
00304 
00305 typedef struct a_fp_control_req
00306         {
00307                 unsigned long reserved0;
00308                 unsigned reserved1:16;
00309                 unsigned reserved2:4;
00310                 unsigned int invalid_operation:1;
00311                 unsigned int divide_by_zero:1;
00312                 unsigned int floating_overflow:1;
00313                 unsigned int floating_underflow: 1;
00314                 unsigned int inexact_result: 1;
00315                 unsigned int integer_overflow: 1;
00316                 unsigned int dynamic_rounding: 2;
00317                 unsigned int reserved3 : 3;
00318                 unsigned int summary: 1;
00319         } a_fp_control_req;
00320 
00321 /* exception summary register */
00322 typedef struct a_excsum
00323         {
00324             /* cumulative excption bits representing excptions in trap shadow */
00325             unsigned int        software_completion:1;
00326             unsigned int        invalid_operation:1;
00327             unsigned int        divide_by_zero:1;
00328             unsigned int        floating_overflow:1;
00329             unsigned int        floating_underflow:1;
00330             unsigned int        inexact_result:1;
00331             unsigned int        integer_overflow:1;
00332         } a_excsum;
00333 
00334 /* exception summary bits */
00335 #define excsum_software_completion      0x01
00336 #define excsum_invalid_operation        0x02
00337 #define excsum_divide_by_zero           0x04
00338 #define excsum_floating_overflow        0x08
00339 #define excsum_floating_underflow       0x10
00340 #define excsum_inexact_result           0x20
00341 #define excsum_integer_overflow         0x40
00342 #define excsum_mask                     0x7e
00343 
00344 void print_instruction(union alpha_instruction current_instruct);
00345 unsigned set_my_status();
00346 int clear_ieee_status();
00347 int get_floating_control(uint64 *new_value);
00348 int set_floating_control(uint64 *new_value);
00349 

SourceForge.net Logo
Project space on SourceForge.net