mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-10 05:03:06 +03:00
Add femode_t functions: powerpc.
This patch adds PowerPC versions of fegetmode and fesetmode. * sysdeps/powerpc/fpu/fegetmode.c: New file. * sysdeps/powerpc/fpu/fesetmode.c: Likewise. * sysdeps/powerpc/nofpu/fegetmode.c: Likewise. * sysdeps/powerpc/nofpu/fesetmode.c: Likewise. * sysdeps/powerpc/powerpc32/e500/nofpu/fegetmode.c: Likewise. * sysdeps/powerpc/powerpc32/e500/nofpu/fesetmode.c: Likewise.
This commit is contained in:
@@ -1,5 +1,12 @@
|
||||
2016-09-07 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* sysdeps/powerpc/fpu/fegetmode.c: New file.
|
||||
* sysdeps/powerpc/fpu/fesetmode.c: Likewise.
|
||||
* sysdeps/powerpc/nofpu/fegetmode.c: Likewise.
|
||||
* sysdeps/powerpc/nofpu/fesetmode.c: Likewise.
|
||||
* sysdeps/powerpc/powerpc32/e500/nofpu/fegetmode.c: Likewise.
|
||||
* sysdeps/powerpc/powerpc32/e500/nofpu/fesetmode.c: Likewise.
|
||||
|
||||
* sysdeps/mips/fpu/fegetmode.c: New file.
|
||||
* sysdeps/mips/fpu/fesetmode.c: Likewise.
|
||||
|
||||
|
26
sysdeps/powerpc/fpu/fegetmode.c
Normal file
26
sysdeps/powerpc/fpu/fegetmode.c
Normal file
@@ -0,0 +1,26 @@
|
||||
/* Store current floating-point control modes. PowerPC version.
|
||||
Copyright (C) 2016 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
|
||||
int
|
||||
fegetmode (femode_t *modep)
|
||||
{
|
||||
*modep = fegetenv_register ();
|
||||
return 0;
|
||||
}
|
49
sysdeps/powerpc/fpu/fesetmode.c
Normal file
49
sysdeps/powerpc/fpu/fesetmode.c
Normal file
@@ -0,0 +1,49 @@
|
||||
/* Install given floating-point control modes. PowerPC version.
|
||||
Copyright (C) 2016 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
#define _FPU_MASK_ALL (_FPU_MASK_ZM | _FPU_MASK_OM | _FPU_MASK_UM \
|
||||
| _FPU_MASK_XM | _FPU_MASK_IM)
|
||||
|
||||
#define FPU_STATUS 0xbffff700ULL
|
||||
|
||||
int
|
||||
fesetmode (const femode_t *modep)
|
||||
{
|
||||
fenv_union_t old, new;
|
||||
|
||||
/* Logic regarding enabled exceptions as in fesetenv. */
|
||||
|
||||
new.fenv = *modep;
|
||||
old.fenv = fegetenv_register ();
|
||||
new.l = (new.l & ~FPU_STATUS) | (old.l & FPU_STATUS);
|
||||
|
||||
if (old.l == new.l)
|
||||
return 0;
|
||||
|
||||
if ((old.l & _FPU_MASK_ALL) == 0 && (new.l & _FPU_MASK_ALL) != 0)
|
||||
(void) __fe_nomask_env_priv ();
|
||||
|
||||
if ((old.l & _FPU_MASK_ALL) != 0 && (new.l & _FPU_MASK_ALL) == 0)
|
||||
(void) __fe_mask_env ();
|
||||
|
||||
fesetenv_register (new.fenv);
|
||||
return 0;
|
||||
}
|
33
sysdeps/powerpc/nofpu/fegetmode.c
Normal file
33
sysdeps/powerpc/nofpu/fegetmode.c
Normal file
@@ -0,0 +1,33 @@
|
||||
/* Store current floating-point control modes. PowerPC soft-float version.
|
||||
Copyright (C) 2016 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "soft-fp.h"
|
||||
#include "soft-supp.h"
|
||||
|
||||
int
|
||||
fegetmode (femode_t *modep)
|
||||
{
|
||||
fenv_union_t u;
|
||||
|
||||
u.l[0] = __sim_round_mode_thread;
|
||||
u.l[1] = __sim_disabled_exceptions_thread;
|
||||
|
||||
*modep = u.fenv;
|
||||
|
||||
return 0;
|
||||
}
|
34
sysdeps/powerpc/nofpu/fesetmode.c
Normal file
34
sysdeps/powerpc/nofpu/fesetmode.c
Normal file
@@ -0,0 +1,34 @@
|
||||
/* Install given floating-point control modes. PowerPC soft-float version.
|
||||
Copyright (C) 2016 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "soft-fp.h"
|
||||
#include "soft-supp.h"
|
||||
|
||||
int
|
||||
fesetmode (const femode_t *modep)
|
||||
{
|
||||
fenv_union_t u;
|
||||
|
||||
u.fenv = *modep;
|
||||
__sim_round_mode_thread = u.l[0];
|
||||
SIM_SET_GLOBAL (__sim_round_mode_global, __sim_round_mode_thread);
|
||||
__sim_disabled_exceptions_thread = u.l[1];
|
||||
SIM_SET_GLOBAL (__sim_disabled_exceptions_global,
|
||||
__sim_disabled_exceptions_thread);
|
||||
return 0;
|
||||
}
|
37
sysdeps/powerpc/powerpc32/e500/nofpu/fegetmode.c
Normal file
37
sysdeps/powerpc/powerpc32/e500/nofpu/fegetmode.c
Normal file
@@ -0,0 +1,37 @@
|
||||
/* Store current floating-point control modes. e500 version.
|
||||
Copyright (C) 2016 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <sysdep.h>
|
||||
#include <sys/prctl.h>
|
||||
|
||||
int
|
||||
fegetmode (femode_t *modep)
|
||||
{
|
||||
fenv_union_t u;
|
||||
INTERNAL_SYSCALL_DECL (err);
|
||||
int r;
|
||||
|
||||
r = INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &u.l[0]);
|
||||
if (INTERNAL_SYSCALL_ERROR_P (r, err))
|
||||
return -1;
|
||||
|
||||
u.l[1] = fegetenv_register ();
|
||||
*modep = u.fenv;
|
||||
return 0;
|
||||
}
|
43
sysdeps/powerpc/powerpc32/e500/nofpu/fesetmode.c
Normal file
43
sysdeps/powerpc/powerpc32/e500/nofpu/fesetmode.c
Normal file
@@ -0,0 +1,43 @@
|
||||
/* Install given floating-point control modes. e500 version.
|
||||
Copyright (C) 2016 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <sysdep.h>
|
||||
#include <sys/prctl.h>
|
||||
|
||||
#define SPEFSCR_STATUS 0xff3eff00
|
||||
|
||||
int
|
||||
fesetmode (const femode_t *modep)
|
||||
{
|
||||
fenv_union_t u;
|
||||
INTERNAL_SYSCALL_DECL (err);
|
||||
int r;
|
||||
|
||||
u.fenv = *modep;
|
||||
unsigned int spefscr = fegetenv_register ();
|
||||
spefscr = (spefscr & SPEFSCR_STATUS) | (u.l[1] & ~SPEFSCR_STATUS);
|
||||
|
||||
fesetenv_register (spefscr);
|
||||
r = INTERNAL_SYSCALL (prctl, err, 2, PR_SET_FPEXC,
|
||||
u.l[0] | PR_FP_EXC_SW_ENABLE);
|
||||
if (INTERNAL_SYSCALL_ERROR_P (r, err))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user