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