00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #ifndef float_rf_INCLUDED
00050 #define float_rf_INCLUDED
00051
00052 #ifdef _MIPSEL
00053 #define TARGETEL 1
00054 #endif
00055
00056 #ifdef _MIPSEB
00057 #define TARGETEB 1
00058 #endif
00059
00060 #ifdef linux
00061 #ifndef __STDC_LIMIT_MACROS
00062 #define __STDC_LIMIT_MACROS
00063 #endif
00064 #ifndef __STDC_LIMIT_MACROS
00065 #define __STDC_LIMIT_MACROS
00066 #include <stdint.h>
00067 #endif
00068 #else
00069 #include <inttypes.h>
00070 #endif
00071
00072
00073
00074 #ifndef _STRUCTS_H_
00075 #define _STRUCTS_H_
00076
00077 #ifndef __STDC_LIMIT_MACROS
00078 #define __STDC_LIMIT_MACROS
00079 #endif
00080 #include <stdint.h>
00081
00082 typedef struct {
00083 uint32_t unused : 14;
00084 uint32_t sign : 1;
00085 uint32_t exp : 17;
00086 uint64_t frac : 64;
00087 } float_rf;
00088
00089
00090 typedef union {
00091 uint64_t i;
00092 struct {
00093 #if TARGETEL
00094 uint64_t trapsDisabled : 6;
00095 uint64_t controls : 7;
00096 uint64_t flags : 6;
00097 uint64_t ISR_fpa : 1;
00098 uint64_t ISR_ebc : 1;
00099 uint64_t reserved : 43;
00100 #endif
00101 #if TARGETEB
00102 uint64_t reserved : 43;
00103 uint64_t ISR_ebc : 1;
00104 uint64_t ISR_fpa : 1;
00105 uint64_t flags : 6;
00106 uint64_t controls : 7;
00107 uint64_t trapsDisabled : 6;
00108 #endif
00109 } c;
00110 struct {
00111 #if TARGETEL
00112 uint64_t invalid_trap_disabled : 1;
00113 uint64_t den_unn_op_trap_disabled : 1;
00114 uint64_t zero_div_trap_disabled : 1;
00115 uint64_t overflow_trap_disabled : 1;
00116 uint64_t underflow_trap_disabled : 1;
00117 uint64_t inexact_trap_disabled : 1;
00118 uint64_t ftz : 1;
00119 uint64_t wre : 1;
00120 uint64_t pc : 2;
00121 uint64_t rc : 2;
00122 uint64_t td : 1;
00123 uint64_t invalid_flag : 1;
00124 uint64_t den_unn_op_flag : 1;
00125 uint64_t zero_div_flag : 1;
00126 uint64_t overflow_flag : 1;
00127 uint64_t underflow_flag : 1;
00128 uint64_t inexact_flag : 1;
00129 uint64_t ISR_fpa : 1;
00130 uint64_t ISR_ebc : 1;
00131 uint64_t reserved : 43;
00132 #endif
00133 #if TARGETEB
00134 uint64_t reserved : 43;
00135 uint64_t ISR_ebc : 1;
00136 uint64_t ISR_fpa : 1;
00137 uint64_t inexact_flag : 1;
00138 uint64_t underflow_flag : 1;
00139 uint64_t overflow_flag : 1;
00140 uint64_t zero_div_flag : 1;
00141 uint64_t den_unn_op_flag : 1;
00142 uint64_t invalid_flag : 1;
00143 uint64_t td : 1;
00144 uint64_t rc : 2;
00145 uint64_t pc : 2;
00146 uint64_t wre : 1;
00147 uint64_t ftz : 1;
00148 uint64_t inexact_trap_disabled : 1;
00149 uint64_t underflow_trap_disabled : 1;
00150 uint64_t overflow_trap_disabled : 1;
00151 uint64_t zero_div_trap_disabled : 1;
00152 uint64_t den_unn_op_trap_disabled : 1;
00153 uint64_t invalid_trap_disabled : 1;
00154 #endif
00155 } b;
00156 } status_field;
00157
00158 #endif
00159
00160
00161
00162 #ifndef _STRUCTS_H_
00163 #endif
00164
00165 #if defined(linux)
00166 #endif
00167
00168 extern "C" {
00169 uint64_t mul64(uint64_t, uint64_t, uint64_t *);
00170 }
00171
00172 extern float_rf Quiet_nan_rf;
00173 extern float_rf NaTVal_rf;
00174 extern float_rf Infinity_rf;
00175 extern float_rf Zero_rf;
00176
00177 extern float_rf round(uint32_t, int32_t, uint64_t, uint64_t, status_field* );
00178
00179 extern float_rf round_l(uint32_t, int64_t, uint64_t, status_field* );
00180
00181 extern int32_t renorm( uint64_t * );
00182
00183 extern float_rf soft_div( uint32_t, int32_t, uint64_t,
00184 uint32_t, int32_t, uint64_t,
00185 status_field * );
00186
00187 extern
00188 float_rf
00189 recip_sqrt( uint32_t, int32_t, uint64_t );
00190
00191 extern
00192 float_rf
00193 fma( const float_rf *, const float_rf *, const float_rf *, status_field * );
00194
00195 extern
00196 float_rf
00197 fnorm( const float_rf *, const float_rf *, const float_rf *, status_field * );
00198
00199 extern
00200 float_rf
00201 fms( const float_rf *, const float_rf *, const float_rf *, status_field * );
00202
00203 extern
00204 float_rf
00205 fnma( const float_rf *, const float_rf *, const float_rf *, status_field * );
00206
00207 extern
00208 float_rf
00209 fmin( const float_rf *, const float_rf *, status_field * );
00210
00211 extern
00212 float_rf
00213 fmax( const float_rf *, const float_rf *, status_field * );
00214
00215 extern
00216 float_rf
00217 famin( const float_rf *, const float_rf *, status_field * );
00218
00219 extern
00220 float_rf
00221 famax( const float_rf *, const float_rf *, status_field * );
00222
00223 extern
00224 float_rf
00225 frcpa( int32_t *, const float_rf *, const float_rf *, status_field * );
00226
00227 extern
00228 float_rf
00229 frsqrta( int32_t *, const float_rf *, status_field * );
00230
00231 extern
00232 float_rf
00233 fcvtfx( const float_rf *, status_field * );
00234
00235 extern
00236 float_rf
00237 fcvtfxtrunc( const float_rf *, status_field * );
00238
00239 extern
00240 float_rf
00241 fcvtfxu( const float_rf *, status_field * );
00242
00243 extern
00244 float_rf
00245 fcvtfxutrunc( const float_rf *, status_field * );
00246
00247 extern
00248 float_rf
00249 fcvtxf( const float_rf * );
00250
00251 extern
00252 int32_t
00253 fcmp_eq( const float_rf *, const float_rf *, status_field * );
00254
00255 extern
00256 int32_t
00257 fcmp_lt( const float_rf *, const float_rf *, status_field * );
00258
00259 extern
00260 int32_t
00261 fcmp_le( const float_rf *, const float_rf *, status_field * );
00262
00263 extern
00264 int32_t
00265 fcmp_unord( const float_rf *, const float_rf *, status_field * );
00266
00267 extern
00268 float_rf
00269 madd( uint32_t, int32_t, uint64_t, uint32_t, int32_t, uint64_t,
00270 uint32_t, int32_t, uint64_t, status_field * );
00271
00272 extern
00273 void
00274 breakout(const float_rf *, uint32_t *, int32_t *, uint64_t *, status_field * );
00275
00276 extern
00277 int32_t
00278 breakout_and_test2(const float_rf *, uint32_t *, int32_t *, uint64_t *,
00279 const float_rf *, uint32_t *, int32_t *, uint64_t *,
00280 status_field * );
00281
00282 extern
00283 int32_t
00284 breakout_and_test3(const float_rf *, uint32_t *, int32_t *, uint64_t *,
00285 const float_rf *, uint32_t *, int32_t *, uint64_t *,
00286 const float_rf *, uint32_t *, int32_t *, uint64_t *,
00287 status_field * );
00288
00289 extern
00290 int32_t
00291 breakout_and_test( const float_rf *, uint32_t *, int32_t *, uint64_t *,
00292 status_field * );
00293
00294
00295
00296
00297
00298 #endif