From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7547 invoked by alias); 8 Aug 2012 14:56:49 -0000 Received: (qmail 7527 invoked by uid 22791); 8 Aug 2012 14:56:47 -0000 X-SWARE-Spam-Status: No, hits=-5.0 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-wg0-f43.google.com (HELO mail-wg0-f43.google.com) (74.125.82.43) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 08 Aug 2012 14:56:14 +0000 Received: by wgbdr1 with SMTP id dr1so604883wgb.12 for ; Wed, 08 Aug 2012 07:56:13 -0700 (PDT) Received: by 10.50.76.137 with SMTP id k9mr424595igw.36.1344437772552; Wed, 08 Aug 2012 07:56:12 -0700 (PDT) Received: from anchor.twiddle.home.com ([173.160.232.49]) by mx.google.com with ESMTPS id ai6sm5255913igc.0.2012.08.08.07.56.11 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 08 Aug 2012 07:56:12 -0700 (PDT) From: Richard Henderson To: libc-ports@sourceware.org Subject: [PATCH 3/3] alpha: Purge __ASSUME_IEEE_RAISE_EXCEPTION Date: Wed, 08 Aug 2012 14:56:00 -0000 Message-Id: <1344437762-3593-4-git-send-email-rth@twiddle.net> In-Reply-To: <1344437762-3593-1-git-send-email-rth@twiddle.net> References: <1344437762-3593-1-git-send-email-rth@twiddle.net> X-IsSubscribed: yes Mailing-List: contact libc-ports-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: libc-ports-owner@sourceware.org X-SW-Source: 2012-08/txt/msg00049.txt.bz2 --- ports/ChangeLog.alpha | 5 + ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S | 56 ++++++++++++ ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.c | 91 -------------------- .../unix/sysv/linux/alpha/kernel-features.h | 3 - 4 files changed, 61 insertions(+), 94 deletions(-) create mode 100644 ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S delete mode 100644 ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.c diff --git a/ports/ChangeLog.alpha b/ports/ChangeLog.alpha index 719fc6a..45061b2 100644 --- a/ports/ChangeLog.alpha +++ b/ports/ChangeLog.alpha @@ -1,5 +1,10 @@ 2012-08-08 Richard Henderson + * sysdeps/unix/sysv/linux/alpha/kernel-features.h + (__ASSUME_IEEE_RAISE_EXCEPTION): Remove. + * sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S: New file. + * sysdeps/unix/sysv/linux/alpha/fraiseexcpt.c: Remove. + * sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S: Use dwarf2 cfi markup for unwind. Adjust stack early so that the normal syscall error path can be used. diff --git a/ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S b/ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S new file mode 100644 index 0000000..6e770ad --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S @@ -0,0 +1,56 @@ +/* Copyright (C) 2004-2012 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 + . */ + +#include +#include "kernel_sysinfo.h" + + + .text + +ENTRY(__feraiseexcept) + cfi_startproc + PSEUDO_PROLOGUE + + lda sp, -16(sp) + cfi_adjust_cfa_offset(16) + + ldi v0, __NR_osf_setsysinfo + stq a0, 0(sp) + mov sp, a1 + ldi a0, SSI_IEEE_RAISE_EXCEPTION + call_pal PAL_callsys + + lda sp, 16(sp) + cfi_adjust_cfa_offset(-16) + + /* Here in libm we can't use SYSCALL_ERROR_LABEL. Nor is it clear + that we'd want to set errno anyway. All we're required to do is + return non-zero on error. Which is exactly A3. */ + mov a3, v0 + ret + +END(__feraiseexcept) + cfi_endproc + +#include +#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_ver (__feraiseexcept, feraiseexcept) +versioned_symbol (libm, __feraiseexcept, feraiseexcept, GLIBC_2_2); diff --git a/ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.c b/ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.c deleted file mode 100644 index a01b2cf..0000000 --- a/ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Copyright (C) 2004,2006 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 - . */ - -#include -#include -#include -#include -#include "kernel_sysinfo.h" - - -int -__feraiseexcept (int excepts) -{ - INTERNAL_SYSCALL_DECL (err); - unsigned long t = excepts; - long r; - - r = INTERNAL_SYSCALL (osf_setsysinfo, err, 2, SSI_IEEE_RAISE_EXCEPTION, &t); - -#ifndef __ASSUME_IEEE_RAISE_EXCEPTION - if (!INTERNAL_SYSCALL_ERROR_P (r, err)) - return 0; - - double d; - - /* If we got an error from SSI_IEEE_RAISE_EXCEPTION, assume it means that - the system call isn't actually implemented. Do the best we can. */ - - /* Invalid implemented with 0 / 0 -> NaN. */ - if (excepts & FE_INVALID) - __asm__ __volatile__ ("divs/su $f31,$f31,%0; trapb" : "=f"(d) : ); - - /* Division By Zero implemented with 1 / 0 -> NaN. */ - if (excepts & FE_DIVBYZERO) - __asm__ __volatile__ ("divs/su %1,$f31,%0; trapb" : "=&f"(d) : "f"(1.0f)); - - /* Overflow and underflow cannot be had all by themselves. We can - generate them with arithmetic, but we always get INEXACT raised - at the same time. Prepare to undo. */ - if ((excepts & (FE_OVERFLOW | FE_UNDERFLOW)) && !(excepts & FE_INEXACT)) - INTERNAL_SYSCALL (osf_getsysinfo, err, 2, GSI_IEEE_FP_CONTROL, &t); - - /* Overflow implemented with FLT_MAX + FLT_MAX -> Inf. */ - if (excepts & FE_OVERFLOW) - __asm__ __volatile__ ("adds/sui %1,%1,%0; trapb" - : "=&f"(d) : "f"(FLT_MAX)); - - /* Underflow implemented with FLT_MIN * FLT_MIN -> 0. */ - if (excepts & FE_UNDERFLOW) - __asm__ __volatile__ ("muls/sui %1,%1,%0; trapb" - : "=&f"(d) : "f"(FLT_MIN)); - - /* Inexact implemented with (long)0.5 -> 0. */ - if ((excepts & (FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)) == FE_INEXACT) - __asm__ __volatile__ ("cvttq/svi %1,%0; trapb" : "=&f"(d) : "f"(0.5f)); - - /* If we raised inexact when not asked, and inexact was not previously - raised, then clear that exception. */ - if ((excepts & (FE_OVERFLOW | FE_UNDERFLOW)) - && !((excepts | t) & FE_INEXACT)) - { - t |= excepts & SWCR_STATUS_MASK; - INTERNAL_SYSCALL (osf_setsysinfo, err, 2, SSI_IEEE_FP_CONTROL, &t); - } -#endif /* !__ASSUME_IEEE_RAISE_EXCEPTION */ - - return 0; -} - -#include -#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_ver (__feraiseexcept, feraiseexcept) -versioned_symbol (libm, __feraiseexcept, feraiseexcept, GLIBC_2_2); diff --git a/ports/sysdeps/unix/sysv/linux/alpha/kernel-features.h b/ports/sysdeps/unix/sysv/linux/alpha/kernel-features.h index 53c282d..a4e8de9 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/kernel-features.h +++ b/ports/sysdeps/unix/sysv/linux/alpha/kernel-features.h @@ -25,9 +25,6 @@ #define __ASSUME_UTIMES 1 -/* Starting with version 2.6.9, SSI_IEEE_RAISE_EXCEPTION exists. */ -#define __ASSUME_IEEE_RAISE_EXCEPTION 1 - /* Support for the O_CLOEXEC flag was added for alpha in 2.6.23. */ #if __LINUX_KERNEL_VERSION >= 0x020617 # define __ASSUME_O_CLOEXEC 1 -- 1.7.7.6