On 12/23/2015 01:48 PM, cheng...@emindsoft.com.cn wrote:
+static float32 sfmt_to_float32(uint64_t sfmt) +{ + uint32_t sign = get_fsingle_sign(sfmt); + uint32_t man = get_fsingle_man(sfmt); + uint32_t exp = get_fsingle_exp(sfmt); + float32 f; + + if (get_fsingle_calc(sfmt) == TILEGX_F_CALC_CVT) { + if (sign) { + f = int32_to_float32(0 - man, &fp_status); + } else { + f = uint32_to_float32(man, &fp_status); + } + exp += get_f32_exp(f) - 0x9e; + if ((int32_t) exp < 0) { + return float32_infinity | float32_set_sign(float32_zero, sign); + } else if (exp >= 0xff) { + return float32_zero | float32_set_sign(float32_zero, sign); + } else { + set_f32_exp(&f, exp); + }
What in the world are you attempting to do here? This is not normalization. This is not even remotely correct with respect to zero or infinity. Moreover, I thought we agreed to do away with that CALC bit. r~
+ } else { + f = create_f32_man(man >> 8); + set_f32_exp(&f, exp); + } + + f = float32_set_sign(f, sign); + return f; +} + +uint64_t helper_fsingle_pack2(uint64_t srca) +{ + return float32_val(sfmt_to_float32(srca)); +} + +static uint64_t main_calc(float32 fsrca, float32 fsrcb, + float32 (*calc)(float32, float32, float_status *)) +{ + uint64_t sfmt = float32_to_sfmt(calc(fsrca, fsrcb, &fp_status)); + + if (float32_eq(fsrca, fsrcb, &fp_status)) { + sfmt |= create_fsfd_flag_eq(); + } else { + sfmt |= create_fsfd_flag_ne(); + } + + if (float32_lt(fsrca, fsrcb, &fp_status)) { + sfmt |= create_fsfd_flag_lt(); + } + if (float32_le(fsrca, fsrcb, &fp_status)) { + sfmt |= create_fsfd_flag_le(); + } + + if (float32_lt(fsrcb, fsrca, &fp_status)) { + sfmt |= create_fsfd_flag_gt(); + } + if (float32_le(fsrcb, fsrca, &fp_status)) { + sfmt |= create_fsfd_flag_ge(); + } + + if (float32_unordered(fsrca, fsrcb, &fp_status)) { + sfmt |= create_fsfd_flag_un(); + } + + set_fsingle_calc(&sfmt, TILEGX_F_CALC_NCVT); + return sfmt; +} + +uint64_t helper_fsingle_add1(uint64_t srca, uint64_t srcb) +{ + return main_calc(make_float32(srca), make_float32(srcb), float32_add); +} + +uint64_t helper_fsingle_sub1(uint64_t srca, uint64_t srcb) +{ + return main_calc(make_float32(srca), make_float32(srcb), float32_sub); +} + +uint64_t helper_fsingle_mul1(uint64_t srca, uint64_t srcb) +{ + return main_calc(make_float32(srca), make_float32(srcb), float32_mul); +}