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. >