Remove support for PowerPC SPE extension (powerpc*-*-*gnuspe*).

GCC 9 dropped support for the SPE extensions to PowerPC, which means
powerpc*-*-*gnuspe* configurations are no longer buildable with that
compiler.  This ISA extension was peculiar to the “e500” line of
embedded PowerPC chips, which, as far as I can tell, are no longer
being manufactured, so I think we should follow suit.

This patch was developed by grepping for “e500”, “__SPE__”, and
“__NO_FPRS__”, and may not eliminate every vestige of SPE support.
Most uses of __NO_FPRS__ are left alone, as they are relevant to
normal embedded PowerPC with soft-float.

        * sysdeps/powerpc/preconfigure: Error out on powerpc-*-*gnuspe*
        host type.
        * scripts/build-many-glibcs.py: Remove powerpc-*-linux-gnuspe
        and powerpc-*-linux-gnuspe-e500v1 from list of build configurations.

        * sysdeps/powerpc/powerpc32/e500: Recursively delete.
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/e500: Recursively delete.
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/context-e500.h:
        Delete.

        * sysdeps/powerpc/fpu_control.h: Remove SPE variant.
        Issue an #error if used with a compiler in SPE-float mode.
        * sysdeps/powerpc/powerpc32/__longjmp_common.S
        * sysdeps/powerpc/powerpc32/setjmp_common.S
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S:
        Remove code to preserve SPE register state.

        * sysdeps/unix/sysv/linux/powerpc/elision-lock.c
        * sysdeps/unix/sysv/linux/powerpc/elision-trylock.c
        * sysdeps/unix/sysv/linux/powerpc/elision-unlock.c
        Remove __SPE__ ifndefs.
This commit is contained in:
Zack Weinberg 2019-05-16 13:34:27 -04:00
parent 46ae07324b
commit a053e87849
No known key found for this signature in database
GPG Key ID: 5106A66578DC148C
51 changed files with 56 additions and 1715 deletions

4
NEWS
View File

@ -54,6 +54,10 @@ Deprecated and removed features, and other changes affecting compatibility:
* With --enable-bind-now, installed programs are now linked with the
BIND_NOW flag.
* Support for the PowerPC SPE ISA extension (powerpc-*-*gnuspe*
configurations) has been removed, following the deprecation of this
subarchitecture in version 8 of GCC, and its removal in version 9.
Changes to build and runtime requirements:
* GCC 6.2 or later is required to build the GNU C Library.

View File

@ -318,15 +318,6 @@ class Context(object):
self.add_config(arch='powerpc64le',
os_name='linux-gnu',
gcc_cfg=['--disable-multilib', '--enable-secureplt'])
self.add_config(arch='powerpc',
os_name='linux-gnuspe',
gcc_cfg=['--disable-multilib', '--enable-secureplt',
'--enable-e500-double', '--enable-obsolete'])
self.add_config(arch='powerpc',
os_name='linux-gnuspe',
variant='e500v1',
gcc_cfg=['--disable-multilib', '--enable-secureplt',
'--enable-obsolete'])
self.add_config(arch='riscv64',
os_name='linux-gnu',
variant='rv64imac-lp64',

View File

@ -19,6 +19,10 @@
#ifndef _FPU_CONTROL_H
#define _FPU_CONTROL_H
#if defined __SPE__ || (defined __NO_FPRS__ && !defined _SOFT_FLOAT)
# error "SPE/e500 is no longer supported"
#endif
#ifdef _SOFT_FLOAT
# define _FPU_RESERVED 0xffffffff
@ -28,41 +32,6 @@ typedef unsigned int fpu_control_t;
# define _FPU_SETCW(cw) (void) (cw)
extern fpu_control_t __fpu_control;
#elif defined __NO_FPRS__ /* e500 */
/* rounding control */
# define _FPU_RC_NEAREST 0x00 /* RECOMMENDED */
# define _FPU_RC_DOWN 0x03
# define _FPU_RC_UP 0x02
# define _FPU_RC_ZERO 0x01
/* masking of interrupts */
# define _FPU_MASK_ZM 0x10 /* zero divide */
# define _FPU_MASK_OM 0x04 /* overflow */
# define _FPU_MASK_UM 0x08 /* underflow */
# define _FPU_MASK_XM 0x40 /* inexact */
# define _FPU_MASK_IM 0x20 /* invalid operation */
# define _FPU_RESERVED 0x00c10080 /* These bits are reserved and not changed. */
/* Correct IEEE semantics require traps to be enabled at the hardware
level; the kernel then does the emulation and determines whether
generation of signals from those traps was enabled using prctl. */
# define _FPU_DEFAULT 0x0000003c /* Default value. */
# define _FPU_IEEE _FPU_DEFAULT
/* Type of the control word. */
typedef unsigned int fpu_control_t;
/* Macros for accessing the hardware control word. */
# define _FPU_GETCW(cw) \
__asm__ volatile ("mfspefscr %0" : "=r" (cw))
# define _FPU_SETCW(cw) \
__asm__ volatile ("mtspefscr %0" : : "r" (cw))
/* Default control word set at startup. */
extern fpu_control_t __fpu_control;
#else /* PowerPC 6xx floating-point. */
/* rounding control */

View File

@ -25,12 +25,6 @@
# include <jmpbuf-offsets.h>
#endif
#if defined __SPE__ || (defined __NO_FPRS__ && !defined _SOFT_FLOAT)
# define LOAD_GP(N) evldd r##N,((JB_FPRS+((N)-14)*2)*4)(r3)
#else
# define LOAD_GP(N) lwz r##N,((JB_GPRS+(N)-14)*4)(r3)
#endif
ENTRY (__longjmp_symbol)
#if defined PTR_DEMANGLE || defined CHECK_SP
@ -46,13 +40,13 @@ ENTRY (__longjmp_symbol)
lwz r1,(JB_GPR1*4)(r3)
#endif
lwz r0,(JB_LR*4)(r3)
LOAD_GP (14)
LOAD_GP (15)
LOAD_GP (16)
LOAD_GP (17)
LOAD_GP (18)
LOAD_GP (19)
LOAD_GP (20)
lwz r14,((JB_GPRS+14-14)*4)(r3)
lwz r15,((JB_GPRS+15-14)*4)(r3)
lwz r16,((JB_GPRS+16-14)*4)(r3)
lwz r17,((JB_GPRS+17-14)*4)(r3)
lwz r18,((JB_GPRS+18-14)*4)(r3)
lwz r19,((JB_GPRS+19-14)*4)(r3)
lwz r20,((JB_GPRS+20-14)*4)(r3)
#ifdef PTR_DEMANGLE
# ifndef CHECK_SP
PTR_DEMANGLE3 (r1, r24, r25)
@ -63,19 +57,19 @@ ENTRY (__longjmp_symbol)
second argument (-4@4), and target address (4@0), respectively. */
LIBC_PROBE (longjmp, 3, 4@3, -4@4, 4@0)
mtlr r0
LOAD_GP (21)
LOAD_GP (22)
lwz r21,((JB_GPRS+21-14)*4)(r3)
lwz r22,((JB_GPRS+22-14)*4)(r3)
lwz r5,(JB_CR*4)(r3)
LOAD_GP (23)
LOAD_GP (24)
LOAD_GP (25)
lwz r23,((JB_GPRS+23-14)*4)(r3)
lwz r24,((JB_GPRS+24-14)*4)(r3)
lwz r25,((JB_GPRS+25-14)*4)(r3)
mtcrf 0xFF,r5
LOAD_GP (26)
LOAD_GP (27)
LOAD_GP (28)
LOAD_GP (29)
LOAD_GP (30)
LOAD_GP (31)
lwz r26,((JB_GPRS+26-14)*4)(r3)
lwz r27,((JB_GPRS+27-14)*4)(r3)
lwz r28,((JB_GPRS+28-14)*4)(r3)
lwz r29,((JB_GPRS+29-14)*4)(r3)
lwz r30,((JB_GPRS+30-14)*4)(r3)
lwz r31,((JB_GPRS+31-14)*4)(r3)
LIBC_PROBE (longjmp_target, 3, 4@3, -4@4, 4@0)
mr r3,r4
blr

View File

@ -1,9 +0,0 @@
ifeq ($(subdir),math)
libm-routines += fexcepts_to_spe fexcepts_from_spe
libm-routines += fexcepts_to_prctl fexcepts_from_prctl
libm-routines += fe_note_change
endif
ifeq ($(subdir),soft-fp)
sysdep_routines += fraiseexcept-soft
endif

View File

@ -1,50 +0,0 @@
/* Clear floating-point exceptions for atomic compound assignment.
e500 version.
Copyright (C) 2004-2019 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 <stdlib.h>
#include <sysdep.h>
#include <sys/prctl.h>
void
__atomic_feclearexcept (void)
{
unsigned int fpescr, old_fpescr;
/* Get the current state. */
old_fpescr = fpescr = fegetenv_register ();
/* Clear the relevant bits. */
fpescr &= ~SPEFSCR_ALL_EXCEPT;
/* Put the new state in effect. */
fesetenv_register (fpescr);
/* Let the kernel know if the "invalid" or "underflow" bit was
cleared. */
if (old_fpescr & (SPEFSCR_FINVS | SPEFSCR_FUNFS))
{
int pflags __attribute__ ((__unused__)), r;
INTERNAL_SYSCALL_DECL (err);
r = INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &pflags);
if (INTERNAL_SYSCALL_ERROR_P (r, err))
abort ();
}
}

View File

@ -1,55 +0,0 @@
/* Store current floating-point environment and clear exceptions for
atomic compound assignment. e500 version.
Copyright (C) 2004-2019 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 <stdlib.h>
#include <sysdep.h>
#include <sys/prctl.h>
void
__atomic_feholdexcept (fenv_t *envp)
{
fenv_union_t u;
INTERNAL_SYSCALL_DECL (err);
int r;
/* Get the current state. */
r = INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &u.l[0]);
if (INTERNAL_SYSCALL_ERROR_P (r, err))
abort ();
u.l[1] = fegetenv_register ();
*envp = u.fenv;
/* Clear everything except for the rounding mode and trapping to the
kernel. */
u.l[0] &= ~(PR_FP_EXC_DIV
| PR_FP_EXC_OVF
| PR_FP_EXC_UND
| PR_FP_EXC_RES
| PR_FP_EXC_INV);
u.l[1] &= SPEFSCR_FRMC | (SPEFSCR_ALL_EXCEPT_ENABLE & ~SPEFSCR_FINXE);
/* Put the new state in effect. */
fesetenv_register (u.l[1]);
r = INTERNAL_SYSCALL (prctl, err, 2, PR_SET_FPEXC,
u.l[0] | PR_FP_EXC_SW_ENABLE);
if (INTERNAL_SYSCALL_ERROR_P (r, err))
abort ();
}

View File

@ -1,46 +0,0 @@
/* Install given floating-point environment and raise exceptions for
atomic compound assignment. e500 version.
Copyright (C) 2004-2019 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 <stdlib.h>
#include <sysdep.h>
#include <sys/prctl.h>
void
__atomic_feupdateenv (const fenv_t *envp)
{
int exc;
fenv_union_t u;
INTERNAL_SYSCALL_DECL (err);
int r;
/* Save the currently set exceptions. */
exc = fegetenv_register () & SPEFSCR_ALL_EXCEPT;
u.fenv = *envp;
fesetenv_register (u.l[1]);
r = INTERNAL_SYSCALL (prctl, err, 2, PR_SET_FPEXC,
u.l[0] | PR_FP_EXC_SW_ENABLE);
if (INTERNAL_SYSCALL_ERROR_P (r, err))
abort ();
/* Raise (if appropriate) saved exceptions. */
__feraiseexcept_soft (exc);
}

View File

@ -1,53 +0,0 @@
/* Clear given exceptions in current floating-point environment. e500 version.
Copyright (C) 2004-2019 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>
#undef feclearexcept
int
__feclearexcept (int excepts)
{
unsigned int fpescr;
int excepts_spe = __fexcepts_to_spe (excepts);
/* Get the current state. */
fpescr = fegetenv_register ();
/* Clear the relevant bits. */
fpescr &= ~excepts_spe;
/* Put the new state in effect. */
fesetenv_register (fpescr);
/* Let the kernel know if the "invalid" or "underflow" bit was
cleared. */
if (excepts & (FE_INVALID | FE_UNDERFLOW))
__fe_note_change ();
/* Success. */
return 0;
}
#include <shlib-compat.h>
#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
strong_alias (__feclearexcept, __old_feclearexcept)
compat_symbol (libm, __old_feclearexcept, feclearexcept, GLIBC_2_1);
#endif
libm_hidden_ver (__feclearexcept, feclearexcept)
versioned_symbol (libm, __feclearexcept, feclearexcept, GLIBC_2_2);

View File

@ -1,39 +0,0 @@
/* Note a change to floating-point exceptions.
Copyright (C) 2013-2019 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>
/* Inform the kernel of a change to floating-point exceptions. */
void
__fe_note_change (void)
{
int pflags, r;
INTERNAL_SYSCALL_DECL (err);
r = INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &pflags);
if (INTERNAL_SYSCALL_ERROR_P (r, err))
return;
if ((pflags & PR_FP_EXC_SW_ENABLE) == 0)
INTERNAL_SYSCALL (prctl, err, 2, PR_SET_FPEXC,
pflags | PR_FP_EXC_SW_ENABLE);
}
libm_hidden_def (__fe_note_change)

View File

@ -1,54 +0,0 @@
/* Disable floating-point exceptions. e500 version.
Copyright (C) 2004-2019 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
fedisableexcept (int excepts)
{
int result = 0, pflags, r;
INTERNAL_SYSCALL_DECL (err);
r = INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &pflags);
if (INTERNAL_SYSCALL_ERROR_P (r, err))
return -1;
/* Save old enable bits. */
result = __fexcepts_from_prctl (pflags);
pflags &= ~__fexcepts_to_prctl (excepts);
r = INTERNAL_SYSCALL (prctl, err, 2, PR_SET_FPEXC,
pflags | PR_FP_EXC_SW_ENABLE);
if (INTERNAL_SYSCALL_ERROR_P (r, err))
return -1;
/* If disabling signals for "inexact", also disable trapping to the
kernel. */
if ((excepts & FE_INEXACT) != 0)
{
unsigned long fpescr;
fpescr = fegetenv_register ();
fpescr &= ~SPEFSCR_FINXE;
fesetenv_register (fpescr);
}
return result;
}

View File

@ -1,54 +0,0 @@
/* Enable floating-point exceptions. e500 version.
Copyright (C) 2004-2019 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
feenableexcept (int excepts)
{
unsigned int result = 0, pflags, r;
INTERNAL_SYSCALL_DECL (err);
r = INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &pflags);
if (INTERNAL_SYSCALL_ERROR_P (r, err))
return -1;
/* Save old enable bits. */
result = __fexcepts_from_prctl (pflags);
pflags |= __fexcepts_to_prctl (excepts);
r = INTERNAL_SYSCALL (prctl, err, 2, PR_SET_FPEXC,
pflags | PR_FP_EXC_SW_ENABLE);
if (INTERNAL_SYSCALL_ERROR_P (r, err))
return -1;
/* If enabling signals for "inexact", also enable trapping to the
kernel. */
if ((excepts & FE_INEXACT) != 0)
{
unsigned long fpescr;
fpescr = fegetenv_register ();
fpescr |= SPEFSCR_FINXE;
fesetenv_register (fpescr);
}
return result;
}

View File

@ -1,49 +0,0 @@
/* Store current floating-point environment. e500 version.
Copyright (C) 2004-2019 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
__fegetenv (fenv_t *envp)
{
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 ();
*envp = u.fenv;
/* Success. */
return 0;
}
#include <shlib-compat.h>
#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
strong_alias (__fegetenv, __old_fegetenv)
compat_symbol (libm, __old_fegetenv, fegetenv, GLIBC_2_1);
#endif
libm_hidden_def (__fegetenv)
libm_hidden_ver (__fegetenv, fegetenv)
versioned_symbol (libm, __fegetenv, fegetenv, GLIBC_2_2);

View File

@ -1,36 +0,0 @@
/* Get floating-point exceptions. e500 version.
Copyright (C) 2004-2019 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
fegetexcept (void)
{
int result = 0, pflags, r;
INTERNAL_SYSCALL_DECL (err);
r = INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &pflags);
if (INTERNAL_SYSCALL_ERROR_P (r, err))
return -1;
result = __fexcepts_from_prctl (pflags);
return result;
}

View File

@ -1,37 +0,0 @@
/* Store current floating-point control modes. e500 version.
Copyright (C) 2016-2019 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;
}

View File

@ -1,31 +0,0 @@
/* Return current rounding direction. e500 version.
Copyright (C) 2004-2019 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
__fegetround (void)
{
unsigned long fpescr;
fpescr = fegetenv_register ();
return fpescr & 3;
}
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -1,59 +0,0 @@
/* Store current floating-point environment and clear exceptions.
e500 version.
Copyright (C) 2004-2019 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
__feholdexcept (fenv_t *envp)
{
fenv_union_t u;
INTERNAL_SYSCALL_DECL (err);
int r;
/* Get the current state. */
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 ();
*envp = u.fenv;
/* Clear everything except for the rounding mode and trapping to the
kernel. */
u.l[0] &= ~(PR_FP_EXC_DIV
| PR_FP_EXC_OVF
| PR_FP_EXC_UND
| PR_FP_EXC_RES
| PR_FP_EXC_INV);
u.l[1] &= SPEFSCR_FRMC | (SPEFSCR_ALL_EXCEPT_ENABLE & ~SPEFSCR_FINXE);
/* Put the new state in effect. */
fesetenv_register (u.l[1]);
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;
}
libm_hidden_def (__feholdexcept)
weak_alias (__feholdexcept, feholdexcept)
libm_hidden_weak (feholdexcept)

View File

@ -1,45 +0,0 @@
/* Constant floating-point environments for e500.
Copyright (C) 2004-2019 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/>. */
/* The use of "unsigned long long" as the type to define the
bit-pattern explicitly, rather than the type "double" used in
<bits/fenv.h>, means that we cannot include <fenv_libc.h> here to
get the enum constants for the SPEFSCR bits to enable
exceptions. */
#include <sys/prctl.h>
/* If the default argument is used we use this value. */
const unsigned long long __fe_dfl_env __attribute__ ((aligned (8))) =
0x3cULL;
/* The same representation is used for femode_t. */
extern const unsigned long long __fe_dfl_mode
__attribute__ ((aligned (8), alias ("__fe_dfl_env")));
/* Floating-point environment where none of the exceptions are masked. */
const unsigned long long __fe_enabled_env __attribute__ ((aligned (8))) =
(((unsigned long long) (PR_FP_EXC_DIV
| PR_FP_EXC_OVF
| PR_FP_EXC_UND
| PR_FP_EXC_RES
| PR_FP_EXC_INV)) << 32) | 0x7cULL;
/* Non-IEEE mode. */
const unsigned long long __fe_nonieee_env __attribute__ ((aligned (8))) =
0x0ULL;

View File

@ -1,99 +0,0 @@
/* Internal libc stuff for floating point environment routines. e500 version.
Copyright (C) 2004-2019 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/>. */
#ifndef _FENV_LIBC_H
#define _FENV_LIBC_H 1
#include <fenv.h>
int __feraiseexcept_spe (int);
libm_hidden_proto (__feraiseexcept_spe)
int __feraiseexcept_soft (int);
libc_hidden_proto (__feraiseexcept_soft)
int __fexcepts_to_spe (int);
libm_hidden_proto (__fexcepts_to_spe)
int __fexcepts_from_spe (int);
libm_hidden_proto (__fexcepts_from_spe)
int __fexcepts_to_prctl (int);
libm_hidden_proto (__fexcepts_to_prctl)
int __fexcepts_from_prctl (int);
libm_hidden_proto (__fexcepts_from_prctl)
void __fe_note_change (void);
libm_hidden_proto (__fe_note_change)
/* Equivalent to fegetenv, but returns an unsigned int instead of
taking a pointer. */
#define fegetenv_register() \
({ unsigned int fscr; asm volatile ("mfspefscr %0" : "=r" (fscr)); fscr; })
/* Equivalent to fesetenv, but takes an unsigned int instead of a
pointer. */
#define fesetenv_register(fscr) \
({ asm volatile ("mtspefscr %0" : : "r" (fscr)); })
typedef union
{
fenv_t fenv;
unsigned int l[2];
} fenv_union_t;
/* Definitions of all the SPEFSCR bit numbers. */
enum {
SPEFSCR_SOVH = 0x80000000,
SPEFSCR_OVH = 0x40000000,
SPEFSCR_FGH = 0x20000000,
SPEFSCR_FXH = 0x10000000,
SPEFSCR_FINVH = 0x08000000,
SPEFSCR_FDBZH = 0x04000000,
SPEFSCR_FUNFH = 0x02000000,
SPEFSCR_FOVFH = 0x01000000,
/* 2 unused bits. */
SPEFSCR_FINXS = 0x00200000,
SPEFSCR_FINVS = 0x00100000,
SPEFSCR_FDBZS = 0x00080000,
SPEFSCR_FUNFS = 0x00040000,
SPEFSCR_FOVFS = 0x00020000,
/* Combination of the exception bits. */
SPEFSCR_ALL_EXCEPT = 0x003e0000,
SPEFSCR_MODE = 0x00010000,
SPEFSCR_SOV = 0x00008000,
SPEFSCR_OV = 0x00004000,
SPEFSCR_FG = 0x00002000,
SPEFSCR_FX = 0x00001000,
SPEFSCR_FINV = 0x00000800,
SPEFSCR_FDBZ = 0x00000400,
SPEFSCR_FUNF = 0x00000200,
SPEFSCR_FOVF = 0x00000100,
/* 1 unused bit. */
SPEFSCR_FINXE = 0x00000040,
SPEFSCR_FINVE = 0x00000020,
SPEFSCR_FDBZE = 0x00000010,
SPEFSCR_FUNFE = 0x00000008,
SPEFSCR_FOVFE = 0x00000004,
/* Combination of the exception trap enable bits. */
SPEFSCR_ALL_EXCEPT_ENABLE = 0x0000007c,
SPEFSCR_FRMC = 0x00000003
};
#endif /* fenv_libc.h */

View File

@ -1,50 +0,0 @@
/* Install given floating-point environment. e500 version.
Copyright (C) 1997-2019 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
__fesetenv (const fenv_t *envp)
{
fenv_union_t u;
INTERNAL_SYSCALL_DECL (err);
int r;
u.fenv = *envp;
fesetenv_register (u.l[1]);
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;
/* Success. */
return 0;
}
#include <shlib-compat.h>
#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
strong_alias (__fesetenv, __old_fesetenv)
compat_symbol (libm, __old_fesetenv, fesetenv, GLIBC_2_1);
#endif
libm_hidden_def (__fesetenv)
libm_hidden_ver (__fesetenv, fesetenv)
versioned_symbol (libm, __fesetenv, fesetenv, GLIBC_2_2);

View File

@ -1,37 +0,0 @@
/* Set given exception flags. e500 version.
Copyright (C) 2016-2019 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
fesetexcept (int excepts)
{
unsigned long old_spefscr, spefscr;
int excepts_spe = __fexcepts_to_spe (excepts);
old_spefscr = fegetenv_register ();
spefscr = old_spefscr | excepts_spe;
fesetenv_register (spefscr);
/* If the state of the "invalid" or "underflow" flag has changed,
inform the kernel. */
if (((spefscr ^ old_spefscr) & (SPEFSCR_FINVS | SPEFSCR_FUNFS)) != 0)
__fe_note_change ();
return 0;
}

View File

@ -1,43 +0,0 @@
/* Install given floating-point control modes. e500 version.
Copyright (C) 2016-2019 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;
}

View File

@ -1,37 +0,0 @@
/* Set current rounding direction. e500 version.
Copyright (C) 2004-2019 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
__fesetround (int round)
{
unsigned long fpescr;
if ((unsigned int) round > 3)
return 1;
fpescr = fegetenv_register ();
fpescr = (fpescr & ~SPEFSCR_FRMC) | (round & 3);
fesetenv_register (fpescr);
return 0;
}
libm_hidden_def (__fesetround)
weak_alias (__fesetround, fesetround)
libm_hidden_weak (fesetround)

View File

@ -1,25 +0,0 @@
/* Test exception in saved exception state. e500 version.
Copyright (C) 2016-2019 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
fetestexceptflag (const fexcept_t *flagp, int excepts)
{
return __fexcepts_from_spe (*flagp) & excepts & FE_ALL_EXCEPT;
}

View File

@ -1,48 +0,0 @@
/* Install given floating-point environment and raise exceptions.
e500 version.
Copyright (C) 2004-2019 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
__feupdateenv (const fenv_t *envp)
{
int exc;
/* Save the currently set exceptions. */
exc = fegetenv_register () & SPEFSCR_ALL_EXCEPT;
/* Install new environment. */
__fesetenv (envp);
/* Raise (if appropriate) saved exceptions. */
__feraiseexcept_spe (exc);
/* Success. */
return 0;
}
#include <shlib-compat.h>
#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
strong_alias (__feupdateenv, __old_feupdateenv)
compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1);
#endif
libm_hidden_def (__feupdateenv)
libm_hidden_ver (__feupdateenv, feupdateenv)
versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2);

View File

@ -1,42 +0,0 @@
/* Convert floating-point exceptions from prctl form.
Copyright (C) 2013-2019 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 <sys/prctl.h>
/* Convert EXCEPTS from prctl bits to FE_* form, returning the
converted value. */
int
__fexcepts_from_prctl (int excepts)
{
int result = 0;
if (excepts & PR_FP_EXC_OVF)
result |= FE_OVERFLOW;
if (excepts & PR_FP_EXC_UND)
result |= FE_UNDERFLOW;
if (excepts & PR_FP_EXC_INV)
result |= FE_INVALID;
if (excepts & PR_FP_EXC_DIV)
result |= FE_DIVBYZERO;
if (excepts & PR_FP_EXC_RES)
result |= FE_INEXACT;
return result;
}
libm_hidden_def (__fexcepts_from_prctl)

View File

@ -1,41 +0,0 @@
/* Convert floating-point exceptions from SPEFSCR form.
Copyright (C) 2013-2019 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>
/* Convert EXCEPTS from SPEFSCR bits to FE_* form, returning the
converted value. */
int
__fexcepts_from_spe (int excepts)
{
int result = 0;
if (excepts & SPEFSCR_FINXS)
result |= FE_INEXACT;
if (excepts & SPEFSCR_FDBZS)
result |= FE_DIVBYZERO;
if (excepts & SPEFSCR_FUNFS)
result |= FE_UNDERFLOW;
if (excepts & SPEFSCR_FOVFS)
result |= FE_OVERFLOW;
if (excepts & SPEFSCR_FINVS)
result |= FE_INVALID;
return result;
}
libm_hidden_def (__fexcepts_from_spe)

View File

@ -1,42 +0,0 @@
/* Convert floating-point exceptions to prctl form.
Copyright (C) 2013-2019 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 <sys/prctl.h>
/* Convert EXCEPTS from FE_* form to prctl bits, returning the
converted value. */
int
__fexcepts_to_prctl (int excepts)
{
int result = 0;
if (excepts & FE_INEXACT)
result |= PR_FP_EXC_RES;
if (excepts & FE_DIVBYZERO)
result |= PR_FP_EXC_DIV;
if (excepts & FE_UNDERFLOW)
result |= PR_FP_EXC_UND;
if (excepts & FE_OVERFLOW)
result |= PR_FP_EXC_OVF;
if (excepts & FE_INVALID)
result |= PR_FP_EXC_INV;
return result;
}
libm_hidden_def (__fexcepts_to_prctl)

View File

@ -1,41 +0,0 @@
/* Convert floating-point exceptions to SPEFSCR form.
Copyright (C) 2013-2019 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>
/* Convert EXCEPTS from FE_* form to SPEFSCR bits, returning the
converted value. */
int
__fexcepts_to_spe (int excepts)
{
int result = 0;
if (excepts & FE_INEXACT)
result |= SPEFSCR_FINXS;
if (excepts & FE_DIVBYZERO)
result |= SPEFSCR_FDBZS;
if (excepts & FE_UNDERFLOW)
result |= SPEFSCR_FUNFS;
if (excepts & FE_OVERFLOW)
result |= SPEFSCR_FOVFS;
if (excepts & FE_INVALID)
result |= SPEFSCR_FINVS;
return result;
}
libm_hidden_def (__fexcepts_to_spe)

View File

@ -1,41 +0,0 @@
/* Store current representation for exceptions. e500 version.
Copyright (C) 2004-2019 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
__fegetexceptflag (fexcept_t *flagp, int excepts)
{
unsigned long fpescr;
/* Get the current state. */
fpescr = fegetenv_register ();
*flagp = fpescr & SPEFSCR_ALL_EXCEPT;
/* Success. */
return 0;
}
#include <shlib-compat.h>
#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
strong_alias (__fegetexceptflag, __old_fegetexceptflag)
compat_symbol (libm, __old_fegetexceptflag, fegetexceptflag, GLIBC_2_1);
#endif
versioned_symbol (libm, __fegetexceptflag, fegetexceptflag, GLIBC_2_2);

View File

@ -1,39 +0,0 @@
/* Return current rounding mode as correct value for FLT_ROUNDS. e500
version.
Copyright (C) 2013-2019 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 <stdlib.h>
int
__flt_rounds (void)
{
switch (fegetenv_register () & SPEFSCR_FRMC)
{
case FE_TOWARDZERO:
return 0;
case FE_TONEAREST:
return 1;
case FE_UPWARD:
return 2;
case FE_DOWNWARD:
return 3;
default:
abort ();
}
}

View File

@ -1,25 +0,0 @@
/* Raise given exceptions. e500 version for use from soft-fp.
Copyright (C) 2004-2019 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
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 <libc-symbols.h>
#define __FERAISEEXCEPT_INTERNAL __feraiseexcept_soft
#include "spe-raise.c"
libc_hidden_def (__feraiseexcept_soft)

View File

@ -1,41 +0,0 @@
/* Raise given exceptions. e500 version.
Copyright (C) 2004-2019 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>
#define __FERAISEEXCEPT_INTERNAL __feraiseexcept_spe
#include "spe-raise.c"
libm_hidden_def (__feraiseexcept_spe)
#undef feraiseexcept
int
__feraiseexcept (int excepts)
{
return __feraiseexcept_spe (__fexcepts_to_spe (excepts));
}
#include <shlib-compat.h>
#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
strong_alias (__feraiseexcept, __old_feraiseexcept)
compat_symbol (libm, __old_feraiseexcept, feraiseexcept, GLIBC_2_1);
#endif
libm_hidden_def (__feraiseexcept)
libm_hidden_ver (__feraiseexcept, feraiseexcept)
versioned_symbol (libm, __feraiseexcept, feraiseexcept, GLIBC_2_2);

View File

@ -1,55 +0,0 @@
/* Set floating-point environment exception handling. e500 version.
Copyright (C) 1997-2019 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
__fesetexceptflag (const fexcept_t *flagp, int excepts)
{
unsigned long old_spefscr, spefscr;
fexcept_t flag;
int excepts_spe = __fexcepts_to_spe (excepts);
/* Get the current state. */
old_spefscr = fegetenv_register ();
/* Ignore exceptions not listed in 'excepts'. */
flag = *flagp & excepts_spe;
/* Replace the exception status */
spefscr = (old_spefscr & ~excepts_spe) | flag;
/* Store the new status word (along with the rest of the environment). */
fesetenv_register (spefscr);
/* If the state of the "invalid" or "underflow" flag has changed,
inform the kernel. */
if (((spefscr ^ old_spefscr) & (SPEFSCR_FINVS | SPEFSCR_FUNFS)) != 0)
__fe_note_change ();
/* Success. */
return 0;
}
#include <shlib-compat.h>
#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
strong_alias (__fesetexceptflag, __old_fesetexceptflag)
compat_symbol (libm, __old_fesetexceptflag, fesetexceptflag, GLIBC_2_1);
#endif
versioned_symbol (libm, __fesetexceptflag, fesetexceptflag, GLIBC_2_2);

View File

@ -1,31 +0,0 @@
/* Test exception in current environment. e500 version.
Copyright (C) 2004-2019 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
fetestexcept (int excepts)
{
unsigned long f;
/* Get the current state. */
f = fegetenv_register ();
return __fexcepts_from_spe (f) & excepts;
}
libm_hidden_def (fetestexcept)

View File

@ -1,4 +0,0 @@
/* The generic version of get-rounding-mode.h using fpu_control.h, not
the one using the software rounding mode, is correct for e500. */
#include <sysdeps/generic/get-rounding-mode.h>

View File

@ -1,28 +0,0 @@
/* Floating-point absolute value. e500 version.
Copyright (C) 2004-2019 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 <sysdep.h>
#include <libm-alias-float.h>
ENTRY (__fabsf)
/* float [r3] fabsf (float [r3] x) ; */
efsabs r3,r3
blr
END (__fabsf)
libm_alias_float (__fabs, fabs)

View File

@ -1,53 +0,0 @@
/* Raise given exceptions, given the SPEFSCR bits for those exceptions.
Copyright (C) 1997-2019 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
__FERAISEEXCEPT_INTERNAL (int excepts)
{
unsigned long f;
f = fegetenv_register ();
f |= (excepts & SPEFSCR_ALL_EXCEPT);
fesetenv_register (f);
/* Force the operations that cause the exceptions. */
if ((SPEFSCR_FINVS & excepts) != 0)
/* 0 / 0 */
asm volatile ("efsdiv %0,%0,%1" : : "r" (0), "r" (0));
if ((SPEFSCR_FDBZS & excepts) != 0)
/* 1.0 / 0.0 */
asm volatile ("efsdiv %0,%0,%1" : : "r" (1.0F), "r" (0));
if ((SPEFSCR_FOVFS & excepts) != 0)
/* Largest normalized number plus itself. */
asm volatile ("efsadd %0,%0,%1" : : "r" (0x7f7fffff), "r" (0x7f7fffff));
if ((SPEFSCR_FUNFS & excepts) != 0)
/* Smallest normalized number times itself. */
asm volatile ("efsmul %0,%0,%1" : : "r" (0x800000), "r" (0x800000));
if ((SPEFSCR_FINXS & excepts) != 0)
/* Smallest normalized minus 1.0 raises the inexact flag. */
asm volatile ("efssub %0,%0,%1" : : "r" (0x00800000), "r" (1.0F));
/* Success. */
return 0;
}

View File

@ -25,12 +25,6 @@
# include <jmpbuf-offsets.h>
#endif
#if defined __SPE__ || (defined __NO_FPRS__ && !defined _SOFT_FLOAT)
# define SAVE_GP(N) evstdd r##N,((JB_FPRS+((N)-14)*2)*4)(3)
#else
# define SAVE_GP(N) stw r##N,((JB_GPRS+(N)-14)*4)(3)
#endif
ENTRY (__sigsetjmp_symbol)
#ifdef PTR_MANGLE
@ -44,31 +38,31 @@ ENTRY (__sigsetjmp_symbol)
/* setjmp probe expects longjmp first argument (4@3), second argument
(-4@4), and target address (4@0), respectively. */
LIBC_PROBE (setjmp, 3, 4@3, -4@4, 4@0)
SAVE_GP (14)
stw r14,((JB_GPRS+14-14)*4)(3)
#ifdef PTR_MANGLE
PTR_MANGLE2 (r0, r10)
li r10,0
#endif
stw r0,(JB_LR*4)(3)
SAVE_GP (15)
stw r15,((JB_GPRS+15-14)*4)(3)
mfcr r0
SAVE_GP (16)
stw r16,((JB_GPRS+16-14)*4)(3)
stw r0,(JB_CR*4)(3)
SAVE_GP (17)
SAVE_GP (18)
SAVE_GP (19)
SAVE_GP (20)
SAVE_GP (21)
SAVE_GP (22)
SAVE_GP (23)
SAVE_GP (24)
SAVE_GP (25)
SAVE_GP (26)
SAVE_GP (27)
SAVE_GP (28)
SAVE_GP (29)
SAVE_GP (30)
SAVE_GP (31)
stw r17,((JB_GPRS+17-14)*4)(3)
stw r18,((JB_GPRS+18-14)*4)(3)
stw r19,((JB_GPRS+19-14)*4)(3)
stw r20,((JB_GPRS+20-14)*4)(3)
stw r21,((JB_GPRS+21-14)*4)(3)
stw r22,((JB_GPRS+22-14)*4)(3)
stw r23,((JB_GPRS+23-14)*4)(3)
stw r24,((JB_GPRS+24-14)*4)(3)
stw r25,((JB_GPRS+25-14)*4)(3)
stw r26,((JB_GPRS+26-14)*4)(3)
stw r27,((JB_GPRS+27-14)*4)(3)
stw r28,((JB_GPRS+28-14)*4)(3)
stw r29,((JB_GPRS+29-14)*4)(3)
stw r30,((JB_GPRS+30-14)*4)(3)
stw r31,((JB_GPRS+31-14)*4)(3)
#if IS_IN (rtld)
li r3,0
blr

View File

@ -8,14 +8,18 @@ powerpc64*)
base_machine=powerpc machine=powerpc/powerpc64/be
;;
powerpc*)
# Check for e500.
$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null > conftest.i
if grep -q __NO_FPRS__ conftest.i && ! grep -q _SOFT_FLOAT conftest.i; then
base_machine=powerpc machine=powerpc/powerpc32/e500
else
base_machine=powerpc machine=powerpc/powerpc32
fi
rm -f conftest.i
base_machine=powerpc machine=powerpc/powerpc32
with_fp_cond="!defined __NO_FPRS__"
case "$host_os" in
*gnuspe*)
# SPE support was dropped in glibc 2.30.
# We can't use AC_MSG_ERROR here.
# The parent script is in the middle of printing the
# "checking for sysdeps preconfigure fragments" line.
echo >&2
echo "Host system type $host is no longer supported." >&2
exit 1
;;
esac
;;
esac

View File

@ -45,7 +45,6 @@
int
__lll_lock_elision (int *lock, short *adapt_count, EXTRAARG int pshared)
{
#ifndef __SPE__
/* adapt_count is accessed concurrently but is just a hint. Thus,
use atomic accesses but relaxed MO is sufficient. */
if (atomic_load_relaxed (adapt_count) > 0)
@ -83,6 +82,5 @@ __lll_lock_elision (int *lock, short *adapt_count, EXTRAARG int pshared)
aconf.skip_lock_out_of_tbegin_retries);
use_lock:
#endif
return LLL_LOCK ((*lock), pshared);
}

View File

@ -30,7 +30,6 @@
int
__lll_trylock_elision (int *futex, short *adapt_count)
{
#ifndef __SPE__
/* Implement POSIX semantics by forbiding nesting elided trylocks. */
__libc_tabort (_ABORT_NESTED_TRYLOCK);
@ -66,6 +65,5 @@ __lll_trylock_elision (int *futex, short *adapt_count)
}
use_lock:
#endif
return lll_trylock (*futex);
}

View File

@ -23,7 +23,6 @@
int
__lll_unlock_elision (int *lock, short *adapt_count, int pshared)
{
#ifndef __SPE__
/* When the lock was free we're in a transaction. */
if (*lock == 0)
__libc_tend (0);
@ -40,8 +39,5 @@ __lll_unlock_elision (int *lock, short *adapt_count, int pshared)
lll_unlock ((*lock), pshared);
}
#else
lll_unlock ((*lock), pshared);
#endif
return 0;
}

View File

@ -1,2 +0,0 @@
powerpc/powerpc32/e500/nofpu
powerpc/nofpu

View File

@ -262,10 +262,6 @@ ENTRY(__CONTEXT_FUNC_NAME)
# endif
#endif
#ifdef __CONTEXT_ENABLE_E500
getcontext_e500
#endif
/* We need to set up parms and call sigprocmask which will clobber
volatile registers. So before the call we need to retrieve the
original ucontext ptr (parm1) from stack and store the UC_REGS_PTR

View File

@ -1,144 +0,0 @@
/* getcontext/setcontext/makecontext support for e500 high parts of registers.
Copyright (C) 2006-2019 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/>. */
#ifndef _CONTEXT_E500_H
#define _CONTEXT_E500_H 1
#if defined __SPE__ || (defined __NO_FPRS__ && !defined _SOFT_FLOAT)
# define __CONTEXT_ENABLE_E500 1
/* We follow the kernel's layout, which saves the high parts of the
SPE registers in the vregs area, immediately followed by the ACC
value (call-clobbered, not handled here) and the SPEFSCR value. */
.macro getcontext_e500
la r10,(_UC_VREGS)(r3)
evstwwe r0,(0*4)(r10)
evstwwe r1,(1*4)(r10)
evstwwe r2,(2*4)(r10)
evstwwe r3,(3*4)(r10)
evstwwe r4,(4*4)(r10)
evstwwe r5,(5*4)(r10)
evstwwe r6,(6*4)(r10)
evstwwe r7,(7*4)(r10)
evstwwe r8,(8*4)(r10)
evstwwe r9,(9*4)(r10)
evstwwe r10,(10*4)(r10)
evstwwe r11,(11*4)(r10)
evstwwe r12,(12*4)(r10)
evstwwe r13,(13*4)(r10)
evstwwe r14,(14*4)(r10)
evstwwe r15,(15*4)(r10)
evstwwe r16,(16*4)(r10)
evstwwe r17,(17*4)(r10)
evstwwe r18,(18*4)(r10)
evstwwe r19,(19*4)(r10)
evstwwe r20,(20*4)(r10)
evstwwe r21,(21*4)(r10)
evstwwe r22,(22*4)(r10)
evstwwe r23,(23*4)(r10)
evstwwe r24,(24*4)(r10)
evstwwe r25,(25*4)(r10)
evstwwe r26,(26*4)(r10)
evstwwe r27,(27*4)(r10)
evstwwe r28,(28*4)(r10)
evstwwe r29,(29*4)(r10)
evstwwe r30,(30*4)(r10)
evstwwe r31,(31*4)(r10)
mfspefscr r9
stw r9,(34*4)(r10)
.endm
.macro setcontext_e500
lwz r3,_UC_VREGS+(0*4)(r31)
evmergelo r0,r3,r0
lwz r3,_UC_VREGS+(1*4)(r31)
evmergelo r1,r3,r1
lwz r3,_UC_VREGS+(2*4)(r31)
evmergelo r2,r3,r2
lwz r3,_UC_VREGS+(1*4)(r31)
evmergelo r1,r3,r1
lwz r3,_UC_VREGS+(2*4)(r31)
evmergelo r2,r3,r2
lwz r3,_UC_VREGS+(3*4)(r31)
evmergelo r3,r3,r3
lwz r3,_UC_VREGS+(4*4)(r31)
evmergelo r4,r3,r4
lwz r3,_UC_VREGS+(5*4)(r31)
evmergelo r5,r3,r5
lwz r3,_UC_VREGS+(6*4)(r31)
evmergelo r6,r3,r6
lwz r3,_UC_VREGS+(7*4)(r31)
evmergelo r7,r3,r7
lwz r3,_UC_VREGS+(8*4)(r31)
evmergelo r8,r3,r8
lwz r3,_UC_VREGS+(9*4)(r31)
evmergelo r9,r3,r9
lwz r3,_UC_VREGS+(10*4)(r31)
evmergelo r10,r3,r10
lwz r3,_UC_VREGS+(11*4)(r31)
evmergelo r11,r3,r11
lwz r3,_UC_VREGS+(12*4)(r31)
evmergelo r12,r3,r12
lwz r3,_UC_VREGS+(13*4)(r31)
evmergelo r13,r3,r13
lwz r3,_UC_VREGS+(14*4)(r31)
evmergelo r14,r3,r14
lwz r3,_UC_VREGS+(15*4)(r31)
evmergelo r15,r3,r15
lwz r3,_UC_VREGS+(16*4)(r31)
evmergelo r16,r3,r16
lwz r3,_UC_VREGS+(17*4)(r31)
evmergelo r17,r3,r17
lwz r3,_UC_VREGS+(18*4)(r31)
evmergelo r18,r3,r18
lwz r3,_UC_VREGS+(19*4)(r31)
evmergelo r19,r3,r19
lwz r3,_UC_VREGS+(20*4)(r31)
evmergelo r20,r3,r20
lwz r3,_UC_VREGS+(21*4)(r31)
evmergelo r21,r3,r21
lwz r3,_UC_VREGS+(22*4)(r31)
evmergelo r22,r3,r22
lwz r3,_UC_VREGS+(23*4)(r31)
evmergelo r23,r3,r23
lwz r3,_UC_VREGS+(24*4)(r31)
evmergelo r24,r3,r24
lwz r3,_UC_VREGS+(25*4)(r31)
evmergelo r25,r3,r25
lwz r3,_UC_VREGS+(26*4)(r31)
evmergelo r26,r3,r26
lwz r3,_UC_VREGS+(27*4)(r31)
evmergelo r27,r3,r27
lwz r3,_UC_VREGS+(28*4)(r31)
evmergelo r28,r3,r28
lwz r3,_UC_VREGS+(29*4)(r31)
evmergelo r29,r3,r29
lwz r3,_UC_VREGS+(30*4)(r31)
evmergelo r30,r3,r30
lwz r3,_UC_VREGS+(31*4)(r31)
evmergelo r31,r3,r31
lwz r3,_UC_VREGS+(34*4)(r31)
mtspefscr r3
.endm
#else
# undef __CONTEXT_ENABLE_E500
#endif
#endif /* context-e500.h */

View File

@ -24,8 +24,6 @@
#include <asm/ptrace.h>
#include "ucontext_i.h"
#include <context-e500.h>
#define __CONTEXT_FUNC_NAME __getcontext
#undef __CONTEXT_ENABLE_FPRS
#undef __CONTEXT_ENABLE_VRS

View File

@ -24,8 +24,6 @@
#include <asm/ptrace.h>
#include "ucontext_i.h"
#include <context-e500.h>
#define __CONTEXT_FUNC_NAME __setcontext
#undef __CONTEXT_ENABLE_FPRS
#undef __CONTEXT_ENABLE_VRS

View File

@ -24,8 +24,6 @@
#include <asm/ptrace.h>
#include "ucontext_i.h"
#include <context-e500.h>
#define __CONTEXT_FUNC_NAME __swapcontext
#undef __CONTEXT_ENABLE_FPRS
#undef __CONTEXT_ENABLE_VRS

View File

@ -228,10 +228,6 @@ ENTRY(__CONTEXT_FUNC_NAME)
lfd fp31,_UC_FREGS+(31*8)(r31)
#endif /* __CONTEXT_ENABLE_FPRS */
#ifdef __CONTEXT_ENABLE_E500
setcontext_e500
#endif
/* Restore LR and CCR, and set CTR to the NIP value */
lwz r3,_UC_GREGS+(PT_LNK*4)(r31)
lwz r4,_UC_GREGS+(PT_NIP*4)(r31)

View File

@ -265,10 +265,6 @@ ENTRY(__CONTEXT_FUNC_NAME)
# endif /* __CONTEXT_ENABLE_VRS */
#endif /* __CONTEXT_ENABLE_FPRS */
#ifdef __CONTEXT_ENABLE_E500
getcontext_e500
#endif
/* Restore ucontext (parm1) from stack. */
lwz r12,_FRAME_PARM_SAVE1(r1)
lwz r4,_FRAME_PARM_SAVE2(r1)
@ -451,10 +447,6 @@ ENTRY(__CONTEXT_FUNC_NAME)
lfd fp31,_UC_FREGS+(31*8)(r31)
#endif /* __CONTEXT_ENABLE_FPRS */
#ifdef __CONTEXT_ENABLE_E500
setcontext_e500
#endif
/* Restore LR and CCR, and set CTR to the NIP value */
lwz r3,_UC_GREGS+(PT_LNK*4)(r31)
lwz r4,_UC_GREGS+(PT_NIP*4)(r31)