mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 04:50:07 +00:00
ARC: hardware floating point support
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
parent
fd9dec20c8
commit
3ab8611a22
36
sysdeps/arc/fpu/fclrexcpt.c
Normal file
36
sysdeps/arc/fpu/fclrexcpt.c
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/* Clear given exceptions in current floating-point environment.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fpu_control.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
feclearexcept (int excepts)
|
||||||
|
{
|
||||||
|
unsigned int fpsr;
|
||||||
|
|
||||||
|
_FPU_GETS (fpsr);
|
||||||
|
|
||||||
|
/* Clear the relevant bits, FWE is preserved. */
|
||||||
|
fpsr &= ~excepts;
|
||||||
|
|
||||||
|
_FPU_SETS (fpsr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
libm_hidden_def (feclearexcept)
|
37
sysdeps/arc/fpu/fegetenv.c
Normal file
37
sysdeps/arc/fpu/fegetenv.c
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/* Store current floating-point environment.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fpu_control.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
__fegetenv (fenv_t *envp)
|
||||||
|
{
|
||||||
|
unsigned int fpcr;
|
||||||
|
unsigned int fpsr;
|
||||||
|
|
||||||
|
_FPU_GETCW (fpcr);
|
||||||
|
_FPU_GETS (fpsr);
|
||||||
|
envp->__fpcr = fpcr;
|
||||||
|
envp->__fpsr = fpsr;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
libm_hidden_def (__fegetenv)
|
||||||
|
weak_alias (__fegetenv, fegetenv)
|
||||||
|
libm_hidden_weak (fegetenv)
|
31
sysdeps/arc/fpu/fegetmode.c
Normal file
31
sysdeps/arc/fpu/fegetmode.c
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/* Store current floating-point control modes.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fpu_control.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
fegetmode (femode_t *modep)
|
||||||
|
{
|
||||||
|
unsigned int fpcr;
|
||||||
|
|
||||||
|
_FPU_GETCW (fpcr);
|
||||||
|
*modep = fpcr;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
32
sysdeps/arc/fpu/fegetround.c
Normal file
32
sysdeps/arc/fpu/fegetround.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/* Return current rounding direction.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fenv_private.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
__fegetround (void)
|
||||||
|
{
|
||||||
|
unsigned int fpcr;
|
||||||
|
_FPU_GETCW (fpcr);
|
||||||
|
|
||||||
|
return (fpcr >> __FPU_RND_SHIFT) & __FPU_RND_MASK;
|
||||||
|
}
|
||||||
|
libm_hidden_def (__fegetround)
|
||||||
|
weak_alias (__fegetround, fegetround)
|
||||||
|
libm_hidden_weak (fegetround)
|
43
sysdeps/arc/fpu/feholdexcpt.c
Normal file
43
sysdeps/arc/fpu/feholdexcpt.c
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/* Store current floating-point environment and clear exceptions.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fenv_private.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
__feholdexcept (fenv_t *envp)
|
||||||
|
{
|
||||||
|
unsigned int fpcr;
|
||||||
|
unsigned int fpsr;
|
||||||
|
|
||||||
|
_FPU_GETCW (fpcr);
|
||||||
|
_FPU_GETS (fpsr);
|
||||||
|
|
||||||
|
envp->__fpcr = fpcr;
|
||||||
|
envp->__fpsr = fpsr;
|
||||||
|
|
||||||
|
fpsr &= ~FE_ALL_EXCEPT;
|
||||||
|
|
||||||
|
_FPU_SETCW (fpcr);
|
||||||
|
_FPU_SETS (fpsr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
libm_hidden_def (__feholdexcept)
|
||||||
|
weak_alias (__feholdexcept, feholdexcept)
|
||||||
|
libm_hidden_weak (feholdexcept)
|
48
sysdeps/arc/fpu/fesetenv.c
Normal file
48
sysdeps/arc/fpu/fesetenv.c
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/* Install given floating-point environment (doesnot raise exceptions).
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fpu_control.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
__fesetenv (const fenv_t *envp)
|
||||||
|
{
|
||||||
|
unsigned int fpcr;
|
||||||
|
unsigned int fpsr;
|
||||||
|
|
||||||
|
if (envp == FE_DFL_ENV)
|
||||||
|
{
|
||||||
|
fpcr = _FPU_DEFAULT;
|
||||||
|
fpsr = _FPU_FPSR_DEFAULT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* No need to mask out reserved bits as they are IoW. */
|
||||||
|
fpcr = envp->__fpcr;
|
||||||
|
fpsr = envp->__fpsr;
|
||||||
|
}
|
||||||
|
|
||||||
|
_FPU_SETCW (fpcr);
|
||||||
|
_FPU_SETS (fpsr);
|
||||||
|
|
||||||
|
/* Success. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
libm_hidden_def (__fesetenv)
|
||||||
|
weak_alias (__fesetenv, fesetenv)
|
||||||
|
libm_hidden_weak (fesetenv)
|
32
sysdeps/arc/fpu/fesetexcept.c
Normal file
32
sysdeps/arc/fpu/fesetexcept.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/* Set given exception flags.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fpu_control.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
fesetexcept (int excepts)
|
||||||
|
{
|
||||||
|
unsigned int fpsr;
|
||||||
|
|
||||||
|
_FPU_GETS (fpsr);
|
||||||
|
fpsr |= excepts;
|
||||||
|
_FPU_SETS (fpsr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
40
sysdeps/arc/fpu/fesetmode.c
Normal file
40
sysdeps/arc/fpu/fesetmode.c
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/* Install given floating-point control modes.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fpu_control.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
fesetmode (const femode_t *modep)
|
||||||
|
{
|
||||||
|
unsigned int fpcr;
|
||||||
|
|
||||||
|
if (modep == FE_DFL_MODE)
|
||||||
|
{
|
||||||
|
fpcr = _FPU_DEFAULT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* No need to mask out reserved bits as they are IoW. */
|
||||||
|
fpcr = *modep;
|
||||||
|
}
|
||||||
|
|
||||||
|
_FPU_SETCW (fpcr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
40
sysdeps/arc/fpu/fesetround.c
Normal file
40
sysdeps/arc/fpu/fesetround.c
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/* Set current rounding direction.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fenv_private.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
__fesetround (int round)
|
||||||
|
{
|
||||||
|
unsigned int fpcr;
|
||||||
|
|
||||||
|
_FPU_GETCW (fpcr);
|
||||||
|
|
||||||
|
if (((fpcr >> __FPU_RND_SHIFT) & __FPU_RND_MASK) != round)
|
||||||
|
{
|
||||||
|
fpcr &= ~(__FPU_RND_MASK << __FPU_RND_SHIFT);
|
||||||
|
fpcr |= (round & __FPU_RND_MASK) << __FPU_RND_SHIFT;
|
||||||
|
_FPU_SETCW (fpcr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
libm_hidden_def (__fesetround)
|
||||||
|
weak_alias (__fesetround, fesetround)
|
||||||
|
libm_hidden_weak (fesetround)
|
51
sysdeps/arc/fpu/feupdateenv.c
Normal file
51
sysdeps/arc/fpu/feupdateenv.c
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/* Install given floating-point environment and raise exceptions,
|
||||||
|
without clearing currently raised exceptions.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fpu_control.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
__feupdateenv (const fenv_t *envp)
|
||||||
|
{
|
||||||
|
unsigned int fpcr;
|
||||||
|
unsigned int fpsr;
|
||||||
|
|
||||||
|
_FPU_GETS (fpsr);
|
||||||
|
|
||||||
|
if (envp == FE_DFL_ENV)
|
||||||
|
{
|
||||||
|
fpcr = _FPU_DEFAULT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fpcr = envp->__fpcr;
|
||||||
|
|
||||||
|
/* currently raised exceptions need to be preserved. */
|
||||||
|
fpsr |= envp->__fpsr;
|
||||||
|
}
|
||||||
|
|
||||||
|
_FPU_SETCW (fpcr);
|
||||||
|
_FPU_SETS (fpsr);
|
||||||
|
|
||||||
|
/* Success. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
libm_hidden_def (__feupdateenv)
|
||||||
|
weak_alias (__feupdateenv, feupdateenv)
|
||||||
|
libm_hidden_weak (feupdateenv)
|
31
sysdeps/arc/fpu/fgetexcptflg.c
Normal file
31
sysdeps/arc/fpu/fgetexcptflg.c
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/* Store current representation for exceptions, ARC version.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fenv_private.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
fegetexceptflag (fexcept_t *flagp, int excepts)
|
||||||
|
{
|
||||||
|
unsigned int fpsr;
|
||||||
|
|
||||||
|
_FPU_GETS (fpsr);
|
||||||
|
*flagp = fpsr & excepts;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
39
sysdeps/arc/fpu/fraiseexcpt.c
Normal file
39
sysdeps/arc/fpu/fraiseexcpt.c
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/* Raise given exceptions.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fpu_control.h>
|
||||||
|
#include <float.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
__feraiseexcept (int excepts)
|
||||||
|
{
|
||||||
|
unsigned int fpsr;
|
||||||
|
|
||||||
|
/* currently raised exceptions are not cleared. */
|
||||||
|
_FPU_GETS (fpsr);
|
||||||
|
fpsr |= excepts;
|
||||||
|
|
||||||
|
_FPU_SETS (fpsr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
libm_hidden_def (__feraiseexcept)
|
||||||
|
weak_alias (__feraiseexcept, feraiseexcept)
|
||||||
|
libm_hidden_weak (feraiseexcept)
|
38
sysdeps/arc/fpu/fsetexcptflg.c
Normal file
38
sysdeps/arc/fpu/fsetexcptflg.c
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/* Set floating-point environment exception handling, ARC version.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fpu_control.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
fesetexceptflag (const fexcept_t *flagp, int excepts)
|
||||||
|
{
|
||||||
|
unsigned int fpsr;
|
||||||
|
|
||||||
|
_FPU_GETS (fpsr);
|
||||||
|
|
||||||
|
/* Clear the bits first. */
|
||||||
|
fpsr &= ~excepts;
|
||||||
|
|
||||||
|
/* Now set those bits, copying them over from @flagp. */
|
||||||
|
fpsr |= *flagp & excepts;
|
||||||
|
|
||||||
|
_FPU_SETS (fpsr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
33
sysdeps/arc/fpu/ftestexcept.c
Normal file
33
sysdeps/arc/fpu/ftestexcept.c
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* Test exception in current environment.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fpu_control.h>
|
||||||
|
#include <fenv_private.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
fetestexcept (int excepts)
|
||||||
|
{
|
||||||
|
unsigned int fpsr;
|
||||||
|
|
||||||
|
_FPU_GETS (fpsr);
|
||||||
|
|
||||||
|
return fpsr & excepts;
|
||||||
|
}
|
||||||
|
libm_hidden_def (fetestexcept)
|
4
sysdeps/arc/fpu/math-use-builtins-fma.h
Normal file
4
sysdeps/arc/fpu/math-use-builtins-fma.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#define USE_FMA_BUILTIN 1
|
||||||
|
#define USE_FMAF_BUILTIN 1
|
||||||
|
#define USE_FMAL_BUILTIN 0
|
||||||
|
#define USE_FMAF128_BUILTIN 0
|
4
sysdeps/arc/fpu/math-use-builtins-sqrt.h
Normal file
4
sysdeps/arc/fpu/math-use-builtins-sqrt.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#define USE_SQRT_BUILTIN 1
|
||||||
|
#define USE_SQRTF_BUILTIN 1
|
||||||
|
#define USE_SQRTL_BUILTIN 0
|
||||||
|
#define USE_SQRTF128_BUILTIN 0
|
106
sysdeps/arc/fpu_control.h
Normal file
106
sysdeps/arc/fpu_control.h
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/* FPU control word bits. ARC version.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#ifndef _FPU_CONTROL_H
|
||||||
|
#define _FPU_CONTROL_H
|
||||||
|
|
||||||
|
/* ARC FPU control register bits.
|
||||||
|
|
||||||
|
[ 0] -> IVE: Enable invalid operation exception.
|
||||||
|
if 0, soft exception: status register IV flag set.
|
||||||
|
if 1, hardware exception trap (not supported in Linux yet).
|
||||||
|
[ 1] -> DZE: Enable division by zero exception.
|
||||||
|
if 0, soft exception: status register IV flag set.
|
||||||
|
if 1, hardware exception: (not supported in Linux yet).
|
||||||
|
[9:8] -> RM: Rounding Mode:
|
||||||
|
00 - Rounding toward zero.
|
||||||
|
01 - Rounding to nearest (default).
|
||||||
|
10 - Rounding (up) toward plus infinity.
|
||||||
|
11 - Rounding (down)toward minus infinity.
|
||||||
|
|
||||||
|
ARC FPU status register bits.
|
||||||
|
|
||||||
|
[ 0] -> IV: flag invalid operation.
|
||||||
|
[ 1] -> DZ: flag division by zero.
|
||||||
|
[ 2] -> OV: flag Overflow operation.
|
||||||
|
[ 3] -> UV: flag Underflow operation.
|
||||||
|
[ 4] -> IX: flag Inexact operation.
|
||||||
|
[31] -> FWE: Flag Write Enable.
|
||||||
|
If 1, above flags writable explicitly (clearing),
|
||||||
|
else IoW and only writable indirectly via bits [12:7]. */
|
||||||
|
|
||||||
|
#include <features.h>
|
||||||
|
|
||||||
|
#if !defined(__ARC_FPU_SP__) && !defined(__ARC_FPU_DP__)
|
||||||
|
|
||||||
|
# define _FPU_RESERVED 0xffffffff
|
||||||
|
# define _FPU_DEFAULT 0x00000000
|
||||||
|
typedef unsigned int fpu_control_t;
|
||||||
|
# define _FPU_GETCW(cw) (cw) = 0
|
||||||
|
# define _FPU_SETCW(cw) (void) (cw)
|
||||||
|
# define _FPU_GETS(cw) (cw) = 0
|
||||||
|
# define _FPU_SETS(cw) (void) (cw)
|
||||||
|
extern fpu_control_t __fpu_control;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define _FPU_RESERVED 0
|
||||||
|
|
||||||
|
/* The fdlibm code requires strict IEEE double precision arithmetic,
|
||||||
|
and no interrupts for exceptions, rounding to nearest.
|
||||||
|
So only RM set to b'01. */
|
||||||
|
# define _FPU_DEFAULT 0x00000100
|
||||||
|
|
||||||
|
/* Actually default needs to have FWE bit as 1 but that is already
|
||||||
|
ingrained into _FPU_SETS macro below. */
|
||||||
|
#define _FPU_FPSR_DEFAULT 0x00000000
|
||||||
|
|
||||||
|
#define __FPU_RND_SHIFT 8
|
||||||
|
#define __FPU_RND_MASK 0x3
|
||||||
|
|
||||||
|
/* Type of the control word. */
|
||||||
|
typedef unsigned int fpu_control_t;
|
||||||
|
|
||||||
|
/* Macros for accessing the hardware control word. */
|
||||||
|
# define _FPU_GETCW(cw) __asm__ volatile ("lr %0, [0x300]" : "=r" (cw))
|
||||||
|
# define _FPU_SETCW(cw) __asm__ volatile ("sr %0, [0x300]" : : "r" (cw))
|
||||||
|
|
||||||
|
/* Macros for accessing the hardware status word.
|
||||||
|
FWE bit is special as it controls if actual status bits could be wrritten
|
||||||
|
explicitly (other than FPU instructions). We handle it here to keep the
|
||||||
|
callers agnostic of it:
|
||||||
|
- clear it out when reporting status bits
|
||||||
|
- always set it when changing status bits. */
|
||||||
|
# define _FPU_GETS(cw) \
|
||||||
|
__asm__ volatile ("lr %0, [0x301] \r\n" \
|
||||||
|
"bclr %0, %0, 31 \r\n" \
|
||||||
|
: "=r" (cw))
|
||||||
|
|
||||||
|
# define _FPU_SETS(cw) \
|
||||||
|
do { \
|
||||||
|
unsigned int __tmp = 0x80000000 | (cw); \
|
||||||
|
__asm__ volatile ("sr %0, [0x301] \r\n" \
|
||||||
|
: : "r" (__tmp)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Default control word set at startup. */
|
||||||
|
extern fpu_control_t __fpu_control;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* fpu_control.h */
|
38
sysdeps/arc/get-rounding-mode.h
Normal file
38
sysdeps/arc/get-rounding-mode.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/* Determine floating-point rounding mode within libc. ARC version.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#ifndef _ARC_GET_ROUNDING_MODE_H
|
||||||
|
#define _ARC_GET_ROUNDING_MODE_H 1
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <fpu_control.h>
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
get_rounding_mode (void)
|
||||||
|
{
|
||||||
|
#if defined(__ARC_FPU_SP__) || defined(__ARC_FPU_DP__)
|
||||||
|
unsigned int fpcr;
|
||||||
|
_FPU_GETCW (fpcr);
|
||||||
|
|
||||||
|
return (fpcr >> __FPU_RND_SHIFT) & __FPU_RND_MASK;
|
||||||
|
#else
|
||||||
|
return FE_TONEAREST;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* get-rounding-mode.h */
|
27
sysdeps/arc/math-tests-trap.h
Normal file
27
sysdeps/arc/math-tests-trap.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/* Configuration for math tests: support for enabling exception traps.
|
||||||
|
ARC version.
|
||||||
|
Copyright (C) 2020 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/>. */
|
||||||
|
|
||||||
|
#ifndef ARC_MATH_TESTS_TRAP_H
|
||||||
|
#define ARC_MATH_TESTS_TRAP_H 1
|
||||||
|
|
||||||
|
/* Trapping exceptions are optional on ARC
|
||||||
|
and not supported in Linux kernel just yet. */
|
||||||
|
#define EXCEPTION_ENABLE_SUPPORTED(EXCEPT) ((EXCEPT) == 0)
|
||||||
|
|
||||||
|
#endif /* math-tests-trap.h. */
|
1
sysdeps/arc/tininess.h
Normal file
1
sysdeps/arc/tininess.h
Normal file
@ -0,0 +1 @@
|
|||||||
|
#define TININESS_AFTER_ROUNDING 1
|
Loading…
Reference in New Issue
Block a user