diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/ia64/fpu/fraiseexcpt.c | 23 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/clone.S | 77 |
2 files changed, 5 insertions, 95 deletions
diff --git a/sysdeps/ia64/fpu/fraiseexcpt.c b/sysdeps/ia64/fpu/fraiseexcpt.c index 78a881117e..57111a94cf 100644 --- a/sysdeps/ia64/fpu/fraiseexcpt.c +++ b/sysdeps/ia64/fpu/fraiseexcpt.c @@ -51,35 +51,20 @@ feraiseexcept (int excepts) if (FE_DIVBYZERO & excepts) __asm__ __volatile__ ("frcpa.s0 %0,p1=f1,f0" : "=f" (tmp) : : "p1" ); - /* XXX There seem to be no reliable way to generate - overflow/underflow exceptions without causing inexact exceptions - as well. */ /* Next: overflow. */ if (FE_OVERFLOW & excepts) { - __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (fpsr)); - fpsr |= (FE_OVERFLOW << 13); - __asm__ __volatile__ ("mov.m ar.fpsr=%0" : : "r" (fpsr)); + dummy = DBL_MAX; - if (!((unsigned long int) fpsr & FE_OVERFLOW)) - { - pid_t pid = getpid (); - kill (pid, SIGFPE); - } + __asm__ __volatile__ ("fadd.d.s0 %0=%1,%1" : "=f" (dummy) : "0" (dummy)); } /* Next: underflow. */ if (FE_UNDERFLOW & excepts) { - __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (fpsr)); - fpsr |= (FE_UNDERFLOW << 13); - __asm__ __volatile__ ("mov.m ar.fpsr=%0" : : "r" (fpsr)); + dummy = DBL_MIN; - if (!((unsigned long int) fpsr & FE_UNDERFLOW)) - { - pid_t pid = getpid(); - kill (pid, SIGFPE); - } + __asm__ __volatile__ ("fnma.d.s0 %0=%1,%1,f0" : "=f" (tmp) : "f" (dummy)); } /* Last: inexact. */ diff --git a/sysdeps/unix/sysv/linux/ia64/clone.S b/sysdeps/unix/sysv/linux/ia64/clone.S index 75a33d2f2c..0cfaeab64e 100644 --- a/sysdeps/unix/sysv/linux/ia64/clone.S +++ b/sysdeps/unix/sysv/linux/ia64/clone.S @@ -1,76 +1 @@ -/* Copyright (C) 1999,2000 Free Software Foundation, Inc. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* clone is even more special than fork as it mucks with stacks - and invokes a function in the right context after its all over. */ - -#include <sysdep.h> - -/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */ - -/* - * Used for both clone and fork system calls. Note that if fn is NULL - * then clone was called from fork. - */ - -ENTRY(__clone) - add r2 = -16, r33 // save space for fn and arg - cmp.ne p6,p0 = 0,r33 - ;; -(p6) add r33 = -16, r33 - add r12 = -16, r12 - ;; -(p6) st8 [r2] = r32, 8 // save fn for child - st8 [r12] = r32 // save fn for parent - ;; -(p6) st8 [r2] = r35 // save arg for child - mov r32 = r34 // put flags in out0 - DO_CALL (SYS_ify (clone)) -1: - ld8 r33 = [r12], 8 // recover fn - ;; - ld8 r32 = [r12], 8 // recover arg - - cmp.eq p6,p0=-1,r10 -(p6) br.cond.spnt.many __syscall_error // handle error - - cmp.ne p7,p0=0,r8 -(p7) ret // parent process, just return - - cmp.eq p8,p0=0,r33 -(p8) ret // fork call, return - - alloc loc0 = ar.pfs,2,2,2,0 - ;; - ld8 r2 = [in1], 8 // get address of fn - mov out0 = in0 - mov loc1 = gp // save gp across indirect call - ;; - ld8 gp = [in1] // set new gp - mov b6 = r2 - br.call.sptk b0 = b6 // call thread routine - ;; - - mov ar.pfs = loc0 - mov gp = loc1 - mov r32 = r8 // exit value - ;; - br.call.sptk b0 = _exit // we're out of here - -PSEUDO_END(__clone) - -weak_alias (__clone, clone) +/* clone is not supported under Linux/ia64, use clone2. */ |