Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

fehelper.h

Go to the documentation of this file.
00001 /****************************** 00002 Intel Confidential 00003 ******************************/ 00004 00005 #ifndef _EM_HELPER_H 00006 #define _EM_HELPER_H 00007 00008 #include "fepublic.h" 00009 #undef FP_QNAN 00010 #undef FP_SNAN 00011 00012 /*************************************************************************** 00013 defines to get rid of ps in the prototypes and the 00014 definitions in EM_helper.c 00015 ***************************************************************************/ 00016 00017 #define fp_reg_read_hi(arg1) \ 00018 fp82_reg_read_hi(EM_state_type *ps, arg1) 00019 #define fp_reg_read_lo(arg1) \ 00020 fp82_reg_read_lo(EM_state_type *ps, arg1) 00021 00022 #define fp_decode_environment(arg1, arg2, arg3) \ 00023 fp82_fp_decode_environment(EM_state_type *ps, arg1, arg2, arg3) 00024 00025 #define fp_ieee_rnd_to_int(arg1, arg2) \ 00026 fp82_fp_ieee_rnd_to_int(EM_state_type *ps, arg1, arg2) 00027 00028 #define fp_ieee_rnd_to_int_sp(arg1, arg2, arg3) \ 00029 fp82_fp_ieee_rnd_to_int_sp(EM_state_type *ps, arg1, arg2, arg3) 00030 00031 #define fp_ieee_round_sp(arg1, arg2, arg3) \ 00032 fp82_fp_ieee_round_sp(EM_state_type *ps, arg1, arg2, arg3) 00033 00034 #define fp_ieee_round(arg1,arg2) \ 00035 fp82_fp_ieee_round(EM_state_type *ps, arg1, arg2) 00036 00037 #define fp_reg_disabled(arg1, arg2, arg3, arg4) \ 00038 fp82_fp_reg_disabled(EM_state_type *ps, arg1, arg2, arg3, arg4) 00039 00040 #define fminmax_exception_fault_check(arg1, arg2, arg3, arg4) \ 00041 fp82_fminmax_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4) 00042 #define fpminmax_exception_fault_check(arg1, arg2, arg3, arg4) \ 00043 fp82_fpminmax_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4) 00044 00045 #define fcmp_exception_fault_check(arg1, arg2, arg3, arg4, arg5) \ 00046 fp82_fcmp_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4, arg5) 00047 #define fpcmp_exception_fault_check(arg1, arg2, arg3, arg4, arg5) \ 00048 fp82_fpcmp_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4, arg5) 00049 00050 #define fcvt_exception_fault_check(arg1, arg2, arg3, arg4, arg5) \ 00051 fp82_fcvt_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4, arg5) 00052 00053 #define fpcvt_exception_fault_check(arg1, arg2, arg3, arg4, arg5) \ 00054 fp82_fpcvt_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4, arg5) 00055 00056 #define fpma_exception_fault_check(arg1, arg2, arg3, arg4, arg5) \ 00057 fp82_fpma_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4, arg5) 00058 00059 #define fma_exception_fault_check(arg1, arg2, arg3, arg4, arg5, arg6) \ 00060 fp82_fma_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4, arg5, arg6) 00061 00062 #define fms_fnma_exception_fault_check(arg1, arg2, arg3, arg4, arg5, arg6) \ 00063 fp82_fms_fnma_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4, arg5, arg6) 00064 00065 #define fpms_fpnma_exception_fault_check(arg1, arg2, arg3, arg4, arg5) \ 00066 fp82_fpms_fpnma_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4, arg5) 00067 00068 #define frcpa_exception_fault_check(arg1, arg2, arg3, arg4) \ 00069 fp82_frcpa_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4) 00070 00071 #define fprcpa_exception_fault_check(arg1, arg2, arg3, arg4, arg5) \ 00072 fp82_fprcpa_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4, arg5) 00073 00074 #define frsqrta_exception_fault_check(arg1, arg2, arg3) \ 00075 fp82_frsqrta_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3) 00076 00077 #define fprsqrta_exception_fault_check(arg1, arg2, arg3, arg4) \ 00078 fp82_fprsqrta_exception_fault_check(EM_state_type *ps, arg1, arg2, arg3, arg4) 00079 00080 #define fp_update_fpsr(arg1, arg2) fp82_fp_update_fpsr(EM_state_type *ps, arg1, arg2) 00081 #define fp_update_psr(arg1) fp82_fp_update_psr(EM_state_type *ps, arg1) 00082 00083 00084 00085 /* Function Prototypes for Helper functions */ 00086 00087 #define SET_STATUS_FLAG(status_flag) { \ 00088 status_flag = 1; \ 00089 } 00090 00091 #define CLEAR_STATUS_FLAG(status_flag) { \ 00092 status_flag = 0; \ 00093 } 00094 00095 00096 00097 // helper functions declarations 00098 00099 EM_uint_t 00100 fp_extract_bits( 00101 EM_uint64_t input_value, 00102 unsigned int hi_bound, 00103 unsigned int lo_bound); 00104 00105 EM_uint64_t 00106 fp_concatenate(EM_uint_t hi_val, EM_uint_t lo_val); 00107 00108 INLINE EM_boolean_t 00109 fp_equal( 00110 EM_fp_reg_type fr1, EM_fp_reg_type fr2); 00111 00112 INLINE EM_boolean_t 00113 fp_less_than( 00114 EM_fp_reg_type fr1, 00115 EM_fp_reg_type fr2); 00116 00117 INLINE EM_boolean_t 00118 fp_lesser_or_equal( 00119 EM_fp_reg_type fr1, EM_fp_reg_type fr2); 00120 00121 INLINE EM_boolean_t 00122 fp_unordered( 00123 EM_fp_reg_type fr1, EM_fp_reg_type fr2); 00124 00125 EM_uint_t 00126 fp82_fp_decode_fault( 00127 EM_tmp_fp_env_type tmp_fp_env); 00128 00129 EM_uint_t 00130 fp82_fp_decode_trap( 00131 EM_tmp_fp_env_type tmp_fp_env); 00132 00133 // MACH 00134 void 00135 fp_decode_environment( 00136 EM_opcode_pc_type pc, 00137 EM_opcode_sf_type sf, 00138 EM_tmp_fp_env_type *tmp_fp_env); 00139 00140 EM_uint_t 00141 fp_reg_disabled( 00142 EM_uint_t f1, 00143 EM_uint_t f2, 00144 EM_uint_t f3, 00145 EM_uint_t f4); 00146 00147 INLINE EM_boolean_t 00148 fp_is_nan_or_inf( 00149 EM_fp_reg_type tmp_res); 00150 00151 INLINE EM_fp_reg_type 00152 fp_dp_to_fr( 00153 EM_fp_dp_type tmp_res); 00154 00155 INLINE EM_fp_dp_type 00156 fp_add( 00157 EM_fp_dp_type fp_dp, EM_fp_reg_type fr2, 00158 EM_tmp_fp_env_type tmp_fp_env); 00159 00160 INLINE void 00161 fcmp_exception_fault_check( 00162 EM_fp_reg_specifier f2, 00163 EM_fp_reg_specifier f3, 00164 EM_opcode_frel_type frel, 00165 EM_opcode_sf_type sf, 00166 EM_tmp_fp_env_type *tmp_fp_env); 00167 00168 INLINE void 00169 fpcmp_exception_fault_check( 00170 EM_fp_reg_specifier f2, 00171 EM_fp_reg_specifier f3, 00172 EM_opcode_frel_type frel, 00173 EM_opcode_sf_type sf, 00174 EM_tmp_fp_env_type *tmp_fp_env); 00175 00176 INLINE EM_fp_reg_type 00177 fcvt_exception_fault_check( 00178 EM_fp_reg_specifier f2, 00179 EM_opcode_sf_type sf, 00180 EM_boolean_t signed_form, 00181 EM_boolean_t trunc_form, 00182 EM_tmp_fp_env_type *tmp_fp_env); 00183 00184 EM_pair_fp_reg_type 00185 fpcvt_exception_fault_check( 00186 EM_fp_reg_specifier f2, 00187 EM_opcode_sf_type sf, 00188 EM_boolean_t signed_form, 00189 EM_boolean_t trunc_form, 00190 EM_tmp_fp_env_type *tmp_fp_env); 00191 00192 EM_fp_reg_type 00193 fma_exception_fault_check( 00194 EM_fp_reg_specifier f2, 00195 EM_fp_reg_specifier f3, 00196 EM_fp_reg_specifier f4, 00197 EM_opcode_pc_type pc, 00198 EM_opcode_sf_type sf, 00199 EM_tmp_fp_env_type *tmp_fp_env); 00200 00201 EM_pair_fp_reg_type 00202 fpma_exception_fault_check( 00203 EM_fp_reg_specifier f2, 00204 EM_fp_reg_specifier f3, 00205 EM_fp_reg_specifier f4, 00206 EM_opcode_sf_type sf, 00207 EM_tmp_fp_env_type *tmp_fp_env); 00208 00209 INLINE void 00210 fminmax_exception_fault_check( 00211 EM_fp_reg_specifier f2, 00212 EM_fp_reg_specifier f3, 00213 EM_opcode_sf_type sf, 00214 EM_tmp_fp_env_type *tmp_fp_env); 00215 00216 00217 INLINE void 00218 fpminmax_exception_fault_check( 00219 EM_uint_t f2, 00220 EM_uint_t f3, 00221 EM_opcode_sf_type sf, 00222 EM_tmp_fp_env_type *tmp_fp_env); 00223 00224 EM_fp_reg_type 00225 fms_fnma_exception_fault_check( 00226 EM_fp_reg_specifier f2, 00227 EM_fp_reg_specifier f3, 00228 EM_fp_reg_specifier f4, 00229 EM_opcode_pc_type pc, 00230 EM_opcode_sf_type sf, 00231 EM_tmp_fp_env_type *tmp_fp_env); 00232 00233 00234 EM_pair_fp_reg_type 00235 fpms_fpnma_exception_fault_check( 00236 EM_fp_reg_specifier f2, 00237 EM_fp_reg_specifier f3, 00238 EM_fp_reg_specifier f4, 00239 EM_opcode_sf_type sf, 00240 EM_tmp_fp_env_type *tmp_fp_env); 00241 00242 00243 INLINE EM_boolean_t 00244 fp_flag_set_is_enabled( 00245 EM_uint_t flags, EM_uint_t traps); 00246 00247 INLINE EM_boolean_t 00248 fp_flag_set_is_clear( 00249 EM_uint_t flags, EM_uint_t traps); 00250 00251 INLINE EM_fp_dp_type 00252 fp_max_or_infinity( 00253 EM_uint_t sign, EM_tmp_fp_env_type *tmp_fp_env, 00254 EM_uint_t e_max, EM_uint128_t max_significand); 00255 00256 INLINE EM_fp_dp_type 00257 fp_mul( 00258 EM_fp_reg_type fr3, EM_fp_reg_type fr4); 00259 00260 INLINE EM_fp_reg_type 00261 fp_normalize(EM_fp_reg_type freg); 00262 00263 INLINE EM_fp_dp_type 00264 fp_normalize_dp(EM_fp_dp_type fp_dp); 00265 00266 EM_fp_dp_type 00267 fp82_fp_fr_to_dp(EM_fp_reg_type fr1); 00268 00269 INLINE EM_memory_type 00270 fr_to_mem4_bias_adjust(EM_fp_reg_type freg); 00271 00272 EM_fp_reg_type 00273 frcpa_exception_fault_check( 00274 EM_fp_reg_specifier f2, 00275 EM_fp_reg_specifier f3, 00276 EM_opcode_sf_type sf, 00277 EM_tmp_fp_env_type *tmp_fp_env); 00278 00279 EM_pair_fp_reg_type 00280 fprcpa_exception_fault_check( 00281 EM_fp_reg_specifier f2, 00282 EM_fp_reg_specifier f3, 00283 EM_opcode_sf_type sf, 00284 EM_tmp_fp_env_type *tmp_fp_env, 00285 EM_limits_check_fprcpa *limits_check); 00286 00287 EM_fp_reg_type 00288 frsqrta_exception_fault_check( 00289 EM_fp_reg_specifier f3, 00290 EM_opcode_sf_type sf, 00291 EM_tmp_fp_env_type *tmp_fp_env); 00292 00293 EM_pair_fp_reg_type 00294 fprsqrta_exception_fault_check( 00295 EM_fp_reg_specifier f3, 00296 EM_opcode_sf_type sf, 00297 EM_tmp_fp_env_type *tmp_fp_env, 00298 EM_limits_check_fprsqrta *limits_check); 00299 00300 EM_fp_reg_type 00301 fp_ieee_rnd_to_int( 00302 EM_fp_reg_type fr1, 00303 EM_tmp_fp_env_type *tmp_fp_env); 00304 00305 EM_fp_reg_type 00306 fp_ieee_rnd_to_int_sp( 00307 EM_fp_reg_type fr2, 00308 EM_simd_hilo hilo, 00309 EM_tmp_fp_env_type *tmp_fp_env); 00310 00311 EM_fp_reg_type 00312 fp_ieee_round( 00313 EM_fp_dp_type fp_dp, 00314 EM_tmp_fp_env_type *tmp_fp_env); 00315 00316 INLINE EM_boolean_t 00317 fp_is_finite(EM_fp_reg_type freg); 00318 00319 INLINE EM_boolean_t 00320 fp_is_inf(EM_fp_reg_type freg); 00321 00322 INLINE EM_boolean_t 00323 fp_is_inf_dp(EM_fp_dp_type tmp_res); 00324 00325 INLINE EM_boolean_t 00326 fp_is_nan(EM_fp_reg_type freg); 00327 00328 INLINE EM_boolean_t 00329 fp_is_nan_dp(EM_fp_dp_type tmp_res); 00330 00331 INLINE EM_boolean_t 00332 fp_is_natval(EM_fp_reg_type freg); 00333 00334 INLINE EM_boolean_t 00335 fp_is_neg_dp(EM_fp_dp_type tmp_res); 00336 00337 INLINE EM_boolean_t 00338 fp_is_neg_inf(EM_fp_reg_type freg); 00339 00340 INLINE EM_boolean_t 00341 fp_is_neg_non_zero(EM_fp_reg_type freg); 00342 00343 INLINE EM_boolean_t 00344 fp_is_normal(EM_fp_reg_type freg); 00345 00346 INLINE EM_boolean_t 00347 fp_is_normal_dp(EM_fp_dp_type tmp_res); 00348 00349 INLINE EM_boolean_t 00350 fp_is_pos_dp(EM_fp_dp_type tmp_res); 00351 00352 INLINE EM_boolean_t 00353 fp_is_pos_inf(EM_fp_reg_type freg); 00354 00355 INLINE EM_boolean_t 00356 fp_is_pos_non_zero(EM_fp_reg_type freg); 00357 00358 INLINE EM_boolean_t 00359 fp_is_pseudo_zero(EM_fp_reg_type freg); 00360 00361 INLINE EM_boolean_t 00362 fp_is_qnan(EM_fp_reg_type freg); 00363 00364 INLINE EM_boolean_t 00365 fp_is_snan(EM_fp_reg_type freg); 00366 00367 INLINE EM_boolean_t 00368 fp_is_unorm(EM_fp_reg_type freg); 00369 00370 INLINE EM_boolean_t 00371 fp_is_unsupported(EM_fp_reg_type freg); 00372 00373 INLINE EM_boolean_t 00374 fp_is_unsupported_dp(EM_fp_dp_type tmp_res); 00375 00376 INLINE EM_boolean_t 00377 fp_is_zero(EM_fp_reg_type freg); 00378 00379 INLINE EM_boolean_t 00380 fp_is_zero_dp(EM_fp_dp_type tmp_res); 00381 00382 EM_int_t 00383 fp82_fp_U64_lead0(EM_uint64_t value); 00384 00385 INLINE EM_int_t 00386 fp_U128_lead0(EM_uint128_t value); 00387 00388 EM_int_t 00389 fp82_fp_U256_lead0(EM_uint256_t value); 00390 00391 EM_fp_reg_type 00392 fp_mem_to_fr_format( 00393 EM_memory_type mem, 00394 EM_uint_t size, 00395 EM_uint_t integer_form); 00396 00397 EM_memory_type 00398 fp_fr_to_mem_format( 00399 EM_fp_reg_type freg, 00400 EM_uint_t size, 00401 EM_uint_t integer_form); 00402 00403 INLINE EM_fp_reg_type 00404 fp_make_quiet_nan(EM_fp_reg_type freg); 00405 00406 EM_boolean_t 00407 fp82_fp_raise_fault(EM_tmp_fp_env_type tmp_fp_env); 00408 00409 EM_boolean_t 00410 fp82_fp_raise_traps(EM_tmp_fp_env_type tmp_fp_env); 00411 00412 INLINE EM_fp_reg_type 00413 fp_reg_read(EM_fp_reg_type freg); 00414 00415 INLINE EM_fp_reg_type 00416 fp_reg_read_hi(EM_uint_t freg); 00417 00418 INLINE EM_fp_reg_type 00419 fp_reg_read_lo(EM_uint_t freg); 00420 00421 INLINE EM_uint_t 00422 fp_single(EM_fp_reg_type freg); 00423 00424 EM_uint_t 00425 fp_ieee_round_sp( 00426 EM_fp_dp_type fp_dp, 00427 EM_simd_hilo hilo, 00428 EM_tmp_fp_env_type *tmp_fp_env); 00429 00430 INLINE void 00431 fp_ieee_to_hilo( 00432 EM_simd_hilo hilo, 00433 EM_tmp_fp_env_type *tmp_fp_env); 00434 00435 EM_uint_t fp82_no_bytes(char *str); 00436 00437 EM_uint_t fp82_not_int(char *str); 00438 00439 INLINE void 00440 fp_update_fpsr( 00441 EM_opcode_sf_type sf, 00442 EM_tmp_fp_env_type tmp_fp_env); 00443 00444 INLINE void 00445 fp_update_psr( 00446 EM_uint_t dest_freg); 00447 00448 /* Basic Types Support Functions */ 00449 00450 /* 128-bit unsigned int support routines */ 00451 00452 EM_boolean_t 00453 fp82_fp_U128_eq(EM_uint128_t value1, EM_uint128_t value2); 00454 00455 static INLINE EM_boolean_t 00456 fp_U128_ge(EM_uint128_t value1, EM_uint128_t value2); 00457 00458 static INLINE EM_boolean_t 00459 fp_U128_gt(EM_uint128_t value1, EM_uint128_t value2); 00460 00461 static INLINE EM_boolean_t 00462 fp_U128_le(EM_uint128_t value1, EM_uint128_t value2); 00463 00464 EM_boolean_t 00465 fp82_fp_U128_lt(EM_uint128_t value1, EM_uint128_t value2); 00466 00467 EM_boolean_t 00468 fp82_ne_U128(EM_uint128_t value1, EM_uint128_t value2); 00469 00470 static INLINE EM_uint128_t 00471 bld_U128(EM_uint64_t hi, EM_uint64_t lo); 00472 00473 EM_uint128_t 00474 fp82_fp_U128_lsh(EM_uint128_t value, EM_uint_t count); 00475 00476 EM_uint128_t 00477 fp82_fp_U128_rsh(EM_uint128_t value, EM_uint_t count); 00478 00479 EM_uint128_t 00480 fp82_fp_U64_x_U64_to_U128(EM_uint64_t value1, EM_uint64_t value2); 00481 00482 INLINE EM_uint128_t 00483 fp_I64_x_I64_to_I128(EM_uint64_t value1, EM_uint64_t value2); 00484 00485 EM_uint128_t 00486 fp82_fp_U128_inc(EM_uint128_t value1); 00487 00488 static INLINE EM_uint128_t 00489 fp_U128_neg(EM_uint128_t value); 00490 00491 EM_uint128_t 00492 fp82_fp_U128_add(EM_uint128_t value1, EM_uint128_t value2); 00493 00494 EM_uint128_t 00495 fp82_fp_U128_bor(EM_uint128_t value1, EM_uint128_t value2); 00496 00497 EM_uint128_t 00498 fp82_fp_U128_band(EM_uint128_t value1, EM_uint128_t value2); 00499 00500 /* 256-bit unsigned int support routines */ 00501 00502 EM_boolean_t 00503 fp82_fp_U256_eq(EM_uint256_t value1, EM_uint256_t value2); 00504 00505 EM_boolean_t 00506 fp82_ne_U256(EM_uint256_t value1, EM_uint256_t value2); 00507 00508 static INLINE EM_uint256_t 00509 bld_U256( 00510 EM_uint64_t hh, EM_uint64_t hl, 00511 EM_uint64_t lh, EM_uint64_t ll); 00512 00513 EM_uint256_t 00514 fp82_fp_U256_lsh(EM_uint256_t value, EM_uint_t count); 00515 00516 EM_uint256_t 00517 fp82_fp_U256_rsh(EM_uint256_t value, EM_uint_t count); 00518 00519 EM_uint256_t 00520 fp82_fp_U256_inc(EM_uint256_t value1); 00521 00522 static INLINE EM_uint256_t 00523 fp_U256_neg(EM_uint256_t value); 00524 00525 static INLINE EM_uint256_t 00526 fp_U256_add(EM_uint256_t value1, 00527 EM_uint256_t value2); 00528 00529 /* Basic Conversion Routines */ 00530 00531 INLINE EM_uint128_t 00532 fp_U64_to_U128(EM_uint64_t value); 00533 00534 INLINE EM_uint64_t 00535 fp_U128_to_U64(EM_uint128_t value); 00536 00537 static INLINE EM_uint256_t 00538 fp_U64_to_U256(EM_uint64_t value); 00539 00540 static INLINE EM_uint64_t 00541 fp_U256_to_U64(EM_uint256_t value); 00542 00543 EM_uint256_t 00544 fp82_fp_U128_to_U256(EM_uint128_t value); 00545 00546 static INLINE EM_uint128_t 00547 fp_U256_to_U128(EM_uint256_t value); 00548 00549 EM_boolean_t 00550 is_reserved_field( 00551 EM_opcode_type calling_instruction, 00552 EM_opcode_sf_type sf, 00553 EM_uint_t val) ; 00554 00555 00556 00557 /* Basic Constants */ 00558 00559 static const EM_uint64_t U64_0 = CONST_FORMAT( 0x0000000000000000 ); 00560 static const EM_uint64_t U64_1 = CONST_FORMAT( 0x0000000000000001 ); 00561 static const EM_uint64_t U64_0x0000000080000000 = CONST_FORMAT( 0x0000000080000000 ); 00562 static const EM_uint64_t U64_0x2000000000000000 = CONST_FORMAT( 0x2000000000000000 ); 00563 static const EM_uint64_t U64_0x4000000000000000 = CONST_FORMAT( 0x4000000000000000 ); 00564 static const EM_uint64_t U64_0x8000000000000000 = CONST_FORMAT( 0x8000000000000000 ); 00565 static const EM_uint64_t U64_0xC000000000000000 = CONST_FORMAT( 0xC000000000000000 ); 00566 static const EM_uint64_t U64_0x3FFFFFFFFFFFFFFF = CONST_FORMAT( 0x3FFFFFFFFFFFFFFF ); 00567 static const EM_uint64_t U64_0x7FFFFFFFFFFFFFFF = CONST_FORMAT( 0x7FFFFFFFFFFFFFFF ); 00568 static const EM_uint64_t U64_0xFFFFFF0000000000 = CONST_FORMAT( 0xFFFFFF0000000000 ); 00569 static const EM_uint64_t U64_0xFFFFFFFFFFFFF800 = CONST_FORMAT( 0xFFFFFFFFFFFFF800 ); 00570 static const EM_uint64_t U64_0xFFFFFFFFFFFFFFFF = CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ); 00571 static const EM_uint64_t U64_0xFFFFFFFF00000000 = CONST_FORMAT( 0xFFFFFFFF00000000 ); 00572 static const EM_uint64_t U64_0xFFFF000000000000 = CONST_FORMAT( 0xFFFF000000000000 ); 00573 static const EM_uint64_t U64_0xFF00000000000000 = CONST_FORMAT( 0xFF00000000000000 ); 00574 00575 00576 static const EM_uint128_t U128_0 00577 = { 00578 #ifdef BIG_ENDIAN 00579 CONST_FORMAT( 0x0000000000000000 ), 00580 CONST_FORMAT( 0x0000000000000000 ), 00581 #endif 00582 #ifdef LITTLE_ENDIAN 00583 CONST_FORMAT( 0x0000000000000000 ), 00584 CONST_FORMAT( 0x0000000000000000 ), 00585 #endif 00586 }; 00587 00588 00589 00590 static const EM_uint128_t U128_0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00591 = { 00592 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00593 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ) 00594 }; 00595 00596 00597 static const EM_uint128_t U128_0x00000000000000000000000000003FFF 00598 = { 00599 #ifdef BIG_ENDIAN 00600 CONST_FORMAT( 0x0000000000000000 ), 00601 CONST_FORMAT( 0x0000000000003FFF ), 00602 #endif 00603 #ifdef LITTLE_ENDIAN 00604 CONST_FORMAT( 0x0000000000003FFF ), 00605 CONST_FORMAT( 0x0000000000000000 ), 00606 #endif 00607 }; 00608 00609 00610 static const EM_uint128_t U128_0x00000000000000000000000000007FFF 00611 = { 00612 #ifdef BIG_ENDIAN 00613 CONST_FORMAT( 0x0000000000000000 ), 00614 CONST_FORMAT( 0x0000000000007FFF ), 00615 #endif 00616 #ifdef LITTLE_ENDIAN 00617 CONST_FORMAT( 0x0000000000007FFF ), 00618 CONST_FORMAT( 0x0000000000000000 ), 00619 #endif 00620 }; 00621 00622 00623 static const EM_uint128_t U128_0x00000000000000000000000000004000 00624 = { 00625 #ifdef BIG_ENDIAN 00626 CONST_FORMAT( 0x0000000000000000 ), 00627 CONST_FORMAT( 0x0000000000004000 ), 00628 #endif 00629 #ifdef LITTLE_ENDIAN 00630 CONST_FORMAT( 0x0000000000004000 ), 00631 CONST_FORMAT( 0x0000000000000000 ), 00632 #endif 00633 }; 00634 00635 00636 static const EM_uint128_t U128_0x00000000000000000000000000008000 00637 = { 00638 #ifdef BIG_ENDIAN 00639 CONST_FORMAT( 0x0000000000000000 ), 00640 CONST_FORMAT( 0x0000000000008000 ), 00641 #endif 00642 #ifdef LITTLE_ENDIAN 00643 CONST_FORMAT( 0x0000000000008000 ), 00644 CONST_FORMAT( 0x0000000000000000 ), 00645 #endif 00646 }; 00647 00648 00649 static const EM_uint128_t U128_0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 00650 = { 00651 #ifdef BIG_ENDIAN 00652 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00653 CONST_FORMAT( 0x0000000000008000 ), 00654 #endif 00655 #ifdef LITTLE_ENDIAN 00656 CONST_FORMAT( 0x0000000000008000 ), 00657 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00658 #endif 00659 }; 00660 00661 00662 static const EM_uint128_t U128_0x40000000000000000000000000000000 00663 = { 00664 #ifdef BIG_ENDIAN 00665 CONST_FORMAT( 0x4000000000000000 ), 00666 CONST_FORMAT( 0x0000000000000000 ), 00667 #endif 00668 #ifdef LITTLE_ENDIAN 00669 CONST_FORMAT( 0x0000000000000000 ), 00670 CONST_FORMAT( 0x4000000000000000 ), 00671 #endif 00672 }; 00673 00674 00675 static const EM_uint128_t U128_0x00000100000000000000000000000000 00676 = { 00677 #ifdef BIG_ENDIAN 00678 CONST_FORMAT( 0x0000010000000000 ), 00679 CONST_FORMAT( 0x0000000000000000 ), 00680 #endif 00681 #ifdef LITTLE_ENDIAN 00682 CONST_FORMAT( 0x0000000000000000 ), 00683 CONST_FORMAT( 0x0000010000000000 ), 00684 #endif 00685 }; 00686 00687 00688 static const EM_uint128_t U128_0x00000080000000000000000000000000 00689 = { 00690 #ifdef BIG_ENDIAN 00691 CONST_FORMAT( 0x0000008000000000 ), 00692 CONST_FORMAT( 0x0000000000000000 ), 00693 #endif 00694 #ifdef LITTLE_ENDIAN 00695 CONST_FORMAT( 0x0000000000000000 ), 00696 CONST_FORMAT( 0x0000008000000000 ), 00697 #endif 00698 }; 00699 00700 00701 static const EM_uint128_t U128_0x00000000000008000000000000000000 00702 = { 00703 #ifdef BIG_ENDIAN 00704 CONST_FORMAT( 0x0000000000000800 ), 00705 CONST_FORMAT( 0x0000000000000000 ), 00706 #endif 00707 #ifdef LITTLE_ENDIAN 00708 CONST_FORMAT( 0x0000000000000000 ), 00709 CONST_FORMAT( 0x0000000000000800 ), 00710 #endif 00711 }; 00712 00713 00714 static const EM_uint128_t U128_0x00000000000004000000000000000000 00715 = { 00716 #ifdef BIG_ENDIAN 00717 CONST_FORMAT( 0x0000000000000400 ), 00718 CONST_FORMAT( 0x0000000000000000 ), 00719 #endif 00720 #ifdef LITTLE_ENDIAN 00721 CONST_FORMAT( 0x0000000000000000 ), 00722 CONST_FORMAT( 0x0000000000000400 ), 00723 #endif 00724 }; 00725 00726 00727 static const EM_uint128_t U128_0x00000000000000010000000000000000 00728 = { 00729 #ifdef BIG_ENDIAN 00730 CONST_FORMAT( 0x0000000000000001 ), 00731 CONST_FORMAT( 0x0000000000000000 ), 00732 #endif 00733 #ifdef LITTLE_ENDIAN 00734 CONST_FORMAT( 0x0000000000000000 ), 00735 CONST_FORMAT( 0x0000000000000001 ), 00736 #endif 00737 }; 00738 00739 00740 static const EM_uint128_t U128_0x00000000000000008000000000000000 00741 = { 00742 #ifdef BIG_ENDIAN 00743 CONST_FORMAT( 0x0000000000000000 ), 00744 CONST_FORMAT( 0x8000000000000000 ), 00745 #endif 00746 #ifdef LITTLE_ENDIAN 00747 CONST_FORMAT( 0x8000000000000000 ), 00748 CONST_FORMAT( 0x0000000000000000 ), 00749 #endif 00750 }; 00751 00752 00753 static const EM_uint128_t U128_0x00000000000000007FFFFFFFFFFFFFFF 00754 = { 00755 #ifdef BIG_ENDIAN 00756 CONST_FORMAT( 0x0000000000000000 ), 00757 CONST_FORMAT( 0x7FFFFFFFFFFFFFFF ), 00758 #endif 00759 #ifdef LITTLE_ENDIAN 00760 CONST_FORMAT( 0x7FFFFFFFFFFFFFFF ), 00761 CONST_FORMAT( 0x0000000000000000 ), 00762 #endif 00763 }; 00764 00765 00766 static const EM_uint128_t U128_0x0000000000000000FFFFFFFFFFFFFFFF 00767 = { 00768 #ifdef BIG_ENDIAN 00769 CONST_FORMAT( 0x0000000000000000 ), 00770 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00771 #endif 00772 #ifdef LITTLE_ENDIAN 00773 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00774 CONST_FORMAT( 0x0000000000000000 ), 00775 #endif 00776 }; 00777 00778 00779 static const EM_uint128_t U128_0xFFFFFFFFFFFFFFFF0000000000000000 00780 = { 00781 #ifdef BIG_ENDIAN 00782 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00783 CONST_FORMAT( 0x0000000000000000 ), 00784 #endif 00785 #ifdef LITTLE_ENDIAN 00786 CONST_FORMAT( 0x0000000000000000 ), 00787 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00788 #endif 00789 }; 00790 00791 00792 static const EM_uint128_t U128_0xFFFFFFFFFFFFFFFF8000000000000000 00793 = { 00794 #ifdef BIG_ENDIAN 00795 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00796 CONST_FORMAT( 0x8000000000000000 ), 00797 #endif 00798 #ifdef LITTLE_ENDIAN 00799 CONST_FORMAT( 0x8000000000000000 ), 00800 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00801 #endif 00802 }; 00803 00804 00805 static const EM_uint128_t U128_0x00000000000003FFFFFFFFFFFFFFFFFF 00806 = { 00807 #ifdef BIG_ENDIAN 00808 CONST_FORMAT( 0x00000000000003FF ), 00809 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00810 #endif 00811 #ifdef LITTLE_ENDIAN 00812 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00813 CONST_FORMAT( 0x00000000000003FF ), 00814 #endif 00815 }; 00816 00817 00818 static const EM_uint128_t U128_0x00000000000007FFFFFFFFFFFFFFFFFF 00819 = { 00820 #ifdef BIG_ENDIAN 00821 CONST_FORMAT( 0x00000000000007FF ), 00822 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00823 #endif 00824 #ifdef LITTLE_ENDIAN 00825 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00826 CONST_FORMAT( 0x00000000000007FF ), 00827 #endif 00828 }; 00829 00830 00831 static const EM_uint128_t U128_0xFFFFFFFFFFFFF8000000000000000000 00832 = { 00833 #ifdef BIG_ENDIAN 00834 CONST_FORMAT( 0xFFFFFFFFFFFFF800 ), 00835 CONST_FORMAT( 0x0000000000000000 ), 00836 #endif 00837 #ifdef LITTLE_ENDIAN 00838 CONST_FORMAT( 0x0000000000000000 ), 00839 CONST_FORMAT( 0xFFFFFFFFFFFFF800 ), 00840 #endif 00841 }; 00842 00843 00844 static const EM_uint128_t U128_0xFFFFFFFFFFFFFC000000000000000000 00845 = { 00846 #ifdef BIG_ENDIAN 00847 CONST_FORMAT( 0xFFFFFFFFFFFFFC00 ), 00848 CONST_FORMAT( 0x0000000000000000 ), 00849 #endif 00850 #ifdef LITTLE_ENDIAN 00851 CONST_FORMAT( 0x0000000000000000 ), 00852 CONST_FORMAT( 0xFFFFFFFFFFFFFC00 ), 00853 #endif 00854 }; 00855 00856 00857 static const EM_uint128_t U128_0x0000007FFFFFFFFFFFFFFFFFFFFFFFFF 00858 = { 00859 #ifdef BIG_ENDIAN 00860 CONST_FORMAT( 0x0000007FFFFFFFFF ), 00861 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00862 #endif 00863 #ifdef LITTLE_ENDIAN 00864 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00865 CONST_FORMAT( 0x0000007FFFFFFFFF ), 00866 #endif 00867 }; 00868 00869 00870 static const EM_uint128_t U128_0x000000FFFFFFFFFFFFFFFFFFFFFFFFFF 00871 = { 00872 #ifdef BIG_ENDIAN 00873 CONST_FORMAT( 0x000000FFFFFFFFFF ), 00874 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00875 #endif 00876 #ifdef LITTLE_ENDIAN 00877 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00878 CONST_FORMAT( 0x000000FFFFFFFFFF ), 00879 #endif 00880 }; 00881 00882 00883 static const EM_uint128_t U128_0xFFFFFF00000000000000000000000000 00884 = { 00885 #ifdef BIG_ENDIAN 00886 CONST_FORMAT( 0xFFFFFF0000000000 ), 00887 CONST_FORMAT( 0x0000000000000000 ), 00888 #endif 00889 #ifdef LITTLE_ENDIAN 00890 CONST_FORMAT( 0x0000000000000000 ), 00891 CONST_FORMAT( 0xFFFFFF0000000000 ), 00892 #endif 00893 }; 00894 00895 00896 static const EM_uint128_t U128_0xFFFFFF80000000000000000000000000 00897 = { 00898 #ifdef BIG_ENDIAN 00899 CONST_FORMAT( 0xFFFFFF8000000000 ), 00900 CONST_FORMAT( 0x0000000000000000 ), 00901 #endif 00902 #ifdef LITTLE_ENDIAN 00903 CONST_FORMAT( 0x0000000000000000 ), 00904 CONST_FORMAT( 0xFFFFFF8000000000 ), 00905 #endif 00906 }; 00907 00908 00909 static const EM_uint128_t U128_0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00910 = { 00911 #ifdef BIG_ENDIAN 00912 CONST_FORMAT( 0x7FFFFFFFFFFFFFFF ), 00913 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00914 #endif 00915 #ifdef LITTLE_ENDIAN 00916 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00917 CONST_FORMAT( 0x7FFFFFFFFFFFFFFF ), 00918 #endif 00919 }; 00920 00921 00922 static const EM_uint128_t U128_0xC0000000000000000000000000000000 00923 = { 00924 #ifdef BIG_ENDIAN 00925 CONST_FORMAT( 0xC000000000000000 ), 00926 CONST_FORMAT( 0x0000000000000000 ), 00927 #endif 00928 #ifdef LITTLE_ENDIAN 00929 CONST_FORMAT( 0x0000000000000000 ), 00930 CONST_FORMAT( 0xC000000000000000 ), 00931 #endif 00932 }; 00933 00934 00935 static const EM_uint128_t U128_0x3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00936 = { 00937 #ifdef BIG_ENDIAN 00938 CONST_FORMAT( 0x3FFFFFFFFFFFFFFF ), 00939 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00940 #endif 00941 #ifdef LITTLE_ENDIAN 00942 CONST_FORMAT( 0xFFFFFFFFFFFFFFFF ), 00943 CONST_FORMAT( 0x3FFFFFFFFFFFFFFF ), 00944 #endif 00945 }; 00946 00947 00948 static const EM_uint128_t U128_0x80000000000000000000000000000000 00949 = { 00950 #ifdef BIG_ENDIAN 00951 CONST_FORMAT( 0x8000000000000000 ), 00952 CONST_FORMAT( 0x0000000000000000 ), 00953 #endif 00954 #ifdef LITTLE_ENDIAN 00955 CONST_FORMAT( 0x0000000000000000 ), 00956 CONST_FORMAT( 0x8000000000000000 ), 00957 #endif 00958 }; 00959 00960 00961 static const EM_uint256_t U256_0 00962 = { 00963 #ifdef BIG_ENDIAN 00964 CONST_FORMAT( 0x0000000000000000 ), 00965 CONST_FORMAT( 0x0000000000000000 ), 00966 CONST_FORMAT( 0x0000000000000000 ), 00967 CONST_FORMAT( 0x0000000000000000 ), 00968 #endif 00969 #ifdef LITTLE_ENDIAN 00970 CONST_FORMAT( 0x0000000000000000 ), 00971 CONST_FORMAT( 0x0000000000000000 ), 00972 CONST_FORMAT( 0x0000000000000000 ), 00973 CONST_FORMAT( 0x0000000000000000 ), 00974 #endif 00975 }; 00976 00977 00978 /* Floating Sign Constants */ 00979 00980 static const EM_uint_t FP_SIGN_POSITIVE = 0; 00981 00982 static const EM_uint_t FP_SIGN_NEGATIVE = 1; 00983 00984 /* Floating Exponent Constants */ 00985 00986 static const EM_uint_t FP_SGL_BIAS = 0x0007F; 00987 static const EM_uint_t FP_DBL_BIAS = 0x003FF; 00988 static const EM_uint_t FP_EXT_BIAS = 0x03FFF; 00989 static const EM_uint_t FP_REG_BIAS = 0x0FFFF; 00990 static const EM_uint_t FP_DP_BIAS = 0x3FFFF; 00991 00992 static const EM_uint_t FP_SGL_EXP_ONES = 0x000FF; 00993 static const EM_uint_t FP_DBL_EXP_ONES = 0x007FF; 00994 static const EM_uint_t FP_EXT_EXP_ONES = 0x07FFF; 00995 static const EM_uint_t FP_REG_EXP_ONES = 0x1FFFF; 00996 static const EM_uint_t FP_DP_EXP_ONES = 0x7FFFF; 00997 00998 static const EM_uint_t FP_SGL_EXP_WIDTH = 8; 00999 static const EM_uint_t FP_DBL_EXP_WIDTH = 11; 01000 static const EM_uint_t FP_EXT_EXP_WIDTH = 15; 01001 static const EM_uint_t FP_REG_EXP_WIDTH = 17; 01002 01003 static const EM_uint_t FP_SGL_SIGNIFICAND_WIDTH = 23; 01004 static const EM_uint_t FP_DBL_SIGNIFICAND_WIDTH = 52; 01005 static const EM_uint_t FP_EXT_SIGNIFICAND_WIDTH = 64; 01006 static const EM_uint_t FP_REG_SIGNIFICAND_WIDTH = 64; 01007 01008 static const EM_uint_t FP_REG_EXP_HALF = 0x0FFFE; 01009 01010 static const EM_uint_t FP_INTEGER_EXP = 0x1003E; 01011 01012 static const EM_uint_t FP_DP_INTEGER_EXP = 0x4003E; 01013 01014 /* Floating Constants */ 01015 01016 static const EM_fp_reg_type 01017 FP_ZERO = {CONST_FORMAT( 0x0000000000000000 ), 0x00000, 0x0 }; /* 0.0 */ 01018 01019 static const EM_fp_reg_type 01020 FP_NEG_ZERO = {CONST_FORMAT( 0x0000000000000000 ), 0x00000, 0x1 }; /* -0.0 */ 01021 01022 static const EM_fp_reg_type 01023 FP_HALF = {CONST_FORMAT( 0x8000000000000000 ), 0x0FFFE, 0x0 }; /* 0.5 */ 01024 01025 static const EM_fp_reg_type 01026 FP_ONE = {CONST_FORMAT( 0x8000000000000000 ), 0x0FFFF, 0x0 }; /* 1.0 */ 01027 01028 static const EM_fp_reg_type 01029 FP_ONE_PAIR = {CONST_FORMAT( 0x3F8000003F800000 ), 0x1003E, 0x0 }; 01030 /* Pair of ones for SIMD non-memory ops */ 01031 01032 static const EM_fp_reg_type 01033 FP_INFINITY = {CONST_FORMAT( 0x8000000000000000 ), 0x1FFFF, 0x0 }; /* Inf */ 01034 01035 static const EM_fp_reg_type 01036 FP_QNAN = {CONST_FORMAT( 0xC000000000000000 ), 0x1FFFF, 0x1 }; /* QNaN Indefinite */ 01037 01038 static const EM_fp_reg_type 01039 FP_SNAN = {CONST_FORMAT( 0x8000000000000000 ), 0x1FFFF, 0x0 }; /* SNaN*/ 01040 01041 static const EM_fp_reg_type 01042 FP_POS_2_TO_63 = {CONST_FORMAT( 0x8000000000000000 ), 0x1003E, 0x0 }; /* 2.0**63 */ 01043 01044 static const EM_fp_reg_type 01045 FP_NEG_2_TO_63 = {CONST_FORMAT( 0x8000000000000000 ), 0x1003E, 0x1 }; /* -2.0**63 */ 01046 01047 static const EM_fp_reg_type 01048 FP_POS_2_TO_64 = {CONST_FORMAT( 0x8000000000000000 ), 0x1003F, 0x0 }; /* 2.0**64 */ 01049 01050 static const EM_fp_reg_type 01051 FP_NEG_2_TO_64 = {CONST_FORMAT( 0x8000000000000000 ), 0x1003F, 0x1 }; /* -2.0**64 */ 01052 01053 static const EM_fp_reg_type 01054 FP_POS_2_TO_31 = {CONST_FORMAT( 0x0000000080000000 ), 0x1003E, 0x0 }; /* 2.0**31 */ 01055 01056 static const EM_fp_reg_type 01057 FP_NEG_2_TO_31 = {CONST_FORMAT( 0x0000000080000000 ), 0x1003E, 0x1 }; /* -2.0**31 */ 01058 01059 static const EM_fp_reg_type 01060 FP_POS_2_TO_32 = {CONST_FORMAT( 0x0000000080000000 ), 0x1003F, 0x0 }; /* 2.0**32 */ 01061 01062 static const EM_fp_reg_type 01063 FP_NEQ_2_TO_32 = {CONST_FORMAT( 0x0000000080000000 ), 0x1003F, 0x1 }; /* -2.0**32 */ 01064 01065 static const EM_fp_reg_type 01066 NATVAL = {CONST_FORMAT( 0x0000000000000000 ), 0x1FFFE, 0x0 }; /* NaTVal */ 01067 01068 static const EM_uint64_t 01069 INTEGER_INDEFINITE = CONST_FORMAT( 0x8000000000000000 ); /* -(2**63) */ 01070 01071 static const EM_uint_t 01072 INTEGER_INDEFINITE_32_BIT = 0x80000000; /* */ 01073 01074 01075 01076 01077 01078 01079 01080 01081 /******************************************************************************/ 01082 /* Define macros to simplify access to the fp82_ functions. This is done so */ 01083 /* the namespace doesn't get cluttered, while retaining convenient access. */ 01084 /* The FP82_NO_SHORTCUTS macro can be defined to prevent creation of these. */ 01085 /******************************************************************************/ 01086 01087 #ifndef FP82_NO_SHORTCUTS 01088 #define fp_U64_x_U64_to_U128 fp82_fp_U64_x_U64_to_U128 01089 #define fp_U128_add fp82_fp_U128_add 01090 #define fp_U128_band fp82_fp_U128_band 01091 #define fp_U128_bor fp82_fp_U128_bor 01092 #define fp_U128_eq fp82_fp_U128_eq 01093 #define fp_U256_eq fp82_fp_U256_eq 01094 #define fp_U128_to_U256 fp82_fp_U128_to_U256 01095 #define fp_U128_lt fp82_fp_U128_lt 01096 #define fp_U128_inc fp82_fp_U128_inc 01097 #define fp_U256_inc fp82_fp_U256_inc 01098 #define fp_U128_rsh fp82_fp_U128_rsh 01099 #define fp_U128_lsh fp82_fp_U128_lsh 01100 #define fp_U256_rsh fp82_fp_U256_rsh 01101 #define fp_U256_lsh fp82_fp_U256_lsh 01102 #define fp_U256_rsh fp82_fp_U256_rsh 01103 #define fp_U64_lead0 fp82_fp_U64_lead0 01104 #define fp_U256_lead0 fp82_fp_U256_lead0 01105 #define fp_raise_fault fp82_fp_raise_fault 01106 #define fp_raise_traps fp82_fp_raise_traps 01107 #define fp_decode_fault fp82_fp_decode_fault 01108 #define fp_decode_trap fp82_fp_decode_trap 01109 #define fp_fr_to_dp fp82_fp_fr_to_dp 01110 #endif /* FP82_NO_SHORTCUTS */ 01111 01112 #endif /* _EM_HELPER_H */ 01113

Generated on Sat May 15 19:39:59 2004 for test by doxygen 1.3.7