After tried, I guess, this way below is incorrect: float64_to_float32() assumes the input 'd' is already a standard (packed) float64 variable. But in fact, it is not (e.g. the input from floatsisf2).
And we have to still check TILEGX_F_CALC_CVT, for they are really two different format: TILEGX_F_CALC_CVT has no HBIT, but TILEGX_F_CALC_NCVT has HBIT (which we need process it specially). For me, the way like helper_fdouble_pack2 (the double implementation) is OK to TILEGX_F_CALC_NCVT format, too. - Shift left to get HBIT, and change the related vexp (use vexp instead of exp to process overflow cases -- like double implementation does). - Use (u)int32_to_float32 for the mantissa. - Then process exp again. Thanks. On 12/11/15 06:14, Chen Gang wrote: >> In particular, if gcc decided to optimize fractional fixed-point types, it >> > would do something very similar to the current floatsisf2 code sequence, >> > except >> > that it wouldn't use 0x9e as the exponent; it would use something smaller, >> > so >> > that some number of low bits of the mantessa would be below the radix >> > point. >> > > Oh, really. > >> > Therefore, I think that fsingle_pack2 should do the following: Take the >> > (sign,exp,man) tuple and slot them into a double -- recall that a single >> > only >> > has 23 bits in its mantessa, and this temp format has 32 -- then convert >> > the >> > double to a single. Pre-rounded single results from fsingle_* will be >> > unchanged, while integer data that gcc has constructed will be properly >> > rounded. >> > >> > E.g. >> > >> > uint32_t sign = get_fsingle_sign(sfmt); >> > uint32_t exp = get_fsingle_exp(sfmt); >> > uint32_t man = get_fsingle_man(sfmt); >> > uint64_t d; >> > >> > /* Adjust the exponent for double precision, preserving Inf/NaN. */ >> > if (exp == 0xff) { >> > exp = 0x7ff; >> > } else { >> > exp += 1023 - 127; >> > } >> > >> > d = (uint64_t)sign << 63; >> > d = deposit64(d, 53, 11, exp); >> > d = deposit64(d, 21, 32, man); >> > return float64_to_float32(d, fp_status); >> > >> > Note that this does require float32_to_sfmt to store the mantissa >> > left-justified. That is, not in bits [54-32] as you're doing now, but in >> > bits >> > [63-41]. >> > > For me, it is a good idea! :-) > > -- Chen Gang (陈刚) Open, share, and attitude like air, water, and life which God blessed