[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 2/4] target-tilegx: Add single floating point
From: |
Chen Gang |
Subject: |
Re: [Qemu-devel] [PATCH v3 2/4] target-tilegx: Add single floating point implementation |
Date: |
Sun, 20 Dec 2015 23:30:20 +0800 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 |
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