On 07/06/17 12:38, Tamar Christina wrote:
> Hi All,
> 
> This patch allows the inlining of lrint when -fno-math-errno
> assuming that errno does not need to be set when the rounded value
> is not representable as a long.
> 

turns out emitting frintx+fcvtzs is wrong for ilp32
because spurious inexact may be raised when the final
result is out-of-bound for 32bit long.

i opened
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81800

> The case
> 
> void f(double *a, long *b, double x)
> {
>       *a = __builtin_rint(x);
>       *b = __builtin_lrint(x);
> }
> 
> now generates with -fno-math-errno:
> 
> f:
>       frintx  d0, d0
>       fcvtzs  x2, d0
>       str     d0, [x0]
>       str     x2, [x1]
>       ret
> 
> When the flag is not used the same function call is emitted as before:
> 
> f:
>       stp     x29, x30, [sp, -32]!
>       frintx  d1, d0
>       add     x29, sp, 0
>       str     x19, [sp, 16]
>       mov     x19, x1
>       str     d1, [x0]
>       bl      lrint
>       str     x0, [x19]
>       ldr     x19, [sp, 16]
>       ldp     x29, x30, [sp], 32
>       ret
> 
> Bootstrapped and regtested on aarch64-none-linux-gnu and no regressions.
> The patch also has no regressions on Spec2006.
> 
> Ok for trunk?
> 
> gcc/
> 2017-06-07  Tamar Christina  <tamar.christ...@arm.com>
> 
>       * config/aarch64/aarch64.md (lrint<GPF:mode><GPI:mode>2): New.
> 
> gcc/testsuite/
> 2017-06-07  Tamar Christina  <tamar.christ...@arm.com>
> 
>       * gcc.target/aarch64/lrint-matherr.h: New.
>       * gcc.target/aarch64/inline-lrint_1.c: New.
>       * gcc.target/aarch64/inline-lrint_2.c: New.
>       * gcc.target/aarch64/no-inline-lrint_1.c: New.
>       * gcc.target/aarch64/no-inline-lrint_2.c: New.
> 

Reply via email to