On Wed, 18 May 2016, Matthew Wahab wrote: > On 18/05/16 09:41, Ramana Radhakrishnan wrote: > > On Mon, May 16, 2016 at 2:16 PM, Tejas Belagod > > <tejas.bela...@foss.arm.com> wrote: > > > > > > > > We do have plans to fix pre-ACLE behavior of fp16 to conform to current > > > ACLE > > > spec, but can't say when exactly. > > > > Matthew, could you please take a look at this while you are in this area ? > > Ok.
FWIW, the obvious (to me) approach to doing the conversion without double rounding issues while properly respecting exceptions and rounding modes would be to set a sticky bit in the double value and ensure its precision is no more than that of float before converting to float. Something like (example for little-endian, untested): union { double d; struct { uint32_t lo, hi; } r; } x; __fp16 ret; if (x.r.lo) x.r.hi |= 1; x.r.lo = 0; ret = (__fp16) (float) x.d; By using floating point for the final conversion, you ensure it respects the rounding mode and produces the proper exceptions. -- Joseph S. Myers jos...@codesourcery.com