On Mon, 8 Aug 2011, Uros Bizjak wrote: > Hello! > > One notable omission from x87 rounding sequences is plain round(), > since x87 does not support round-to-nearest, away-from-zero directly. > However, this function can be synthesized as round(a) = sgn(a) * > floor(fabs(a) + 0.5). Fortunately, we have all building blocks ready > in i386.md, we should just wire them correctly. > > The x87 expansion is protected with flag_unsafe_math_optimizations, > since the input range is reduced (true?) due to addition - OTOH, insn > that calculates floor is protected by this flag anyway. > > 2011-08-08 Uros Bizjak <ubiz...@gmail.com> > > * config/i386/i386.c (ix86_emit_i387_round): New function. > * config/i386/i386-protos.h (ix86_emit_i387_round): Declare. > * config/i386/i386.md (round<mode>2): Use X87MODEF mode iterator. > Use ix86_emit_i387_round to expand round function for i387 math. > > Patch was bootstrapped and regression tested on x86_64-pc-linux-gnu. > It also computes correctly +-NaN, +-Inf and all inputs I have thrown > in. > > Any comments?
Can't you do sth similar to ix86_expand_round instead, using trunc (fabs (a) + nextafter (0.5, 0.0)) * sgn(a) (not sure with the sign multiply, copysign would be better)? The addition doesn't really reduce the range if you guard the round by a proper conditional like ix86_expand_round does. Richard.