mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-15 05:20:05 +00:00
637bfc392f
The implementations of ceil functions using x87 floating point (i386 and x86_64 long double only) traps when FE_INEXACT is enabled. Although this is a GNU extension outside the scope of the C standard, other architectures that also support traps do not show this behavior. The fix moves the implementation to a common one that holds any exceptions with a 'fnclex' (libc_feholdexcept_setround_387). Checked on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
37 lines
1.2 KiB
C
37 lines
1.2 KiB
C
/* Nearest integet template for x86.
|
|
Copyright (C) 2024 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<https://www.gnu.org/licenses/>. */
|
|
|
|
#define NO_MATH_REDIRECT
|
|
#include <math.h>
|
|
#include <fenv_private.h>
|
|
|
|
TYPE
|
|
FUNC (TYPE x)
|
|
{
|
|
fenv_t fenv;
|
|
TYPE r;
|
|
|
|
libc_feholdexcept_setround_387 (&fenv, FE_OPTION);
|
|
asm volatile ("frndint" : "=t" (r) : "0" (x));
|
|
/* Preserve "invalid" exceptions from sNaN input. */
|
|
fenv.__status_word |= libc_fetestexcept_387 (FE_INVALID);
|
|
libc_fesetenv_387 (&fenv);
|
|
|
|
return r;
|
|
}
|