From patchwork Thu Nov 15 15:58:26 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcus Shawcroft X-Patchwork-Id: 199333 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id AF3492C0470 for ; Fri, 16 Nov 2012 02:58:47 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1353599928; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Message-ID:Date:From:User-Agent:MIME-Version:To:Subject: Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=bUEvekb 8pcztu2k9XfQbR1ziCPo=; b=yixaQDXmhMOkjZhWSZu0jocv1B2zfl6NjSo9Z0T hAy2znfTg9spO7T0Bvf8zeHRffqDMz7iFeDDx9d5CtYb39NsnrmdzM+25PNDoCJq 7VSyUrPz3GPIUMzONlCUtiWODdCPkTLvjN0RhfAexqFK46lNeVtYt+aTquU/ap4C gtAA= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:X-MC-Unique:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=GzDqx/1tlJU2OGoZO8YlsomYAKWdDEPC75m5epm1a8MXrEKX/QYiH2CDAVt8zF 4v5b5rOkgBSAtQikCSb1Y+AYB+CTwM+vcRAG6e0k1TW/u+uSqvrzXDxyeM0BuNOS trSv6WHGhZJ/I+6YKdLosZs/NZcyraZYU81pP+pZ5yQIc=; Received: (qmail 26720 invoked by alias); 15 Nov 2012 15:58:40 -0000 Received: (qmail 26709 invoked by uid 22791); 15 Nov 2012 15:58:38 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, RCVD_IN_DNSWL_LOW, TW_SF X-Spam-Check-By: sourceware.org Received: from service87.mimecast.com (HELO service87.mimecast.com) (91.220.42.44) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 15 Nov 2012 15:58:29 +0000 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Thu, 15 Nov 2012 15:58:27 +0000 Received: from [10.1.72.50] ([10.1.255.212]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 15 Nov 2012 15:58:26 +0000 Message-ID: <50A51122.6090002@arm.com> Date: Thu, 15 Nov 2012 15:58:26 +0000 From: Marcus Shawcroft User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: "gcc-patches@gcc.gnu.org" Subject: [PATCH] libgcc refactor aarch64 sfp-machine.h X-MC-Unique: 112111515582705001 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org This patch reorganizes the AArch64 sfp-machine.h file, splitting out FP_HANDLE_EXCEPTIONS into a new file sfp-exceptions.c following the same idiom used in ia64 and i386. OK ? Cheers /Marcus 2012-11-15 Marcus Shawcroft * config/aarch64/sfp-machine.h (FP_RND_MASK): Define. (FP_ROUNDMODE): Use FP_RND_MASK. * config/aarch64/sfp-exceptions.c: New. * config/aarch64/sfp-machine.h (FP_HANDLE_EXCEPTIONS): Use __sfp_handle_exceptions. diff --git a/libgcc/config/aarch64/sfp-exceptions.c b/libgcc/config/aarch64/sfp-exceptions.c new file mode 100644 index 0000000..878cf8f --- /dev/null +++ b/libgcc/config/aarch64/sfp-exceptions.c @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2012 Free Software Foundation, Inc. + * + * This file is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 3, or (at your option) any + * later version. + * + * This file 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 + * General Public License for more details. + * + * Under Section 7 of GPL version 3, you are granted additional + * permissions described in the GCC Runtime Library Exception, version + * 3.1, as published by the Free Software Foundation. + * + * You should have received a copy of the GNU General Public License and + * a copy of the GCC Runtime Library Exception along with this program; + * see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + * . + */ + +#include "sfp-machine.h" + +void +__sfp_handle_exceptions (int _fex) +{ + const float fp_max = __FLT_MAX__; + const float fp_min = __FLT_MIN__; + const float fp_1e32 = 1.0e32f; + const float fp_zero = 0.0; + const float fp_one = 1.0; + unsigned fpsr; + + if (_fex & FP_EX_INVALID) + { + __asm__ __volatile__ ("fdiv\ts0, %s0, %s0" + : + : "w" (fp_zero) + : "s0"); + __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); + } + if (_fex & FP_EX_DIVZERO) + { + __asm__ __volatile__ ("fdiv\ts0, %s0, %s1" + : + : "w" (fp_one), "w" (fp_zero) + : "s0"); + __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); + } + if (_fex & FP_EX_OVERFLOW) + { + __asm__ __volatile__ ("fadd\ts0, %s0, %s1" + : + : "w" (fp_max), "w" (fp_1e32) + : "s0"); + __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); + } + if (_fex & FP_EX_UNDERFLOW) + { + __asm__ __volatile__ ("fmul\ts0, %s0, %s0" + : + : "w" (fp_min) + : "s0"); + __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); + } + if (_fex & FP_EX_INEXACT) + { + __asm__ __volatile__ ("fsub\ts0, %s0, %s1" + : + : "w" (fp_max), "w" (fp_one) + : "s0"); + __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); + } +} diff --git a/libgcc/config/aarch64/sfp-machine.h b/libgcc/config/aarch64/sfp-machine.h index 3a09ae7..6c56a92 100644 --- a/libgcc/config/aarch64/sfp-machine.h +++ b/libgcc/config/aarch64/sfp-machine.h @@ -70,61 +70,19 @@ typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__))); #define FP_EX_UNDERFLOW 0x08 #define FP_EX_INEXACT 0x10 -#define FP_HANDLE_EXCEPTIONS \ - do { \ - const float fp_max = __FLT_MAX__; \ - const float fp_min = __FLT_MIN__; \ - const float fp_1e32 = 1.0e32f; \ - const float fp_zero = 0.0; \ - const float fp_one = 1.0; \ - unsigned fpsr; \ - if (_fex & FP_EX_INVALID) \ - { \ - __asm__ __volatile__ ("fdiv\ts0, %s0, %s0" \ - : \ - : "w" (fp_zero) \ - : "s0"); \ - __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); \ - } \ - if (_fex & FP_EX_DIVZERO) \ - { \ - __asm__ __volatile__ ("fdiv\ts0, %s0, %s1" \ - : \ - : "w" (fp_one), "w" (fp_zero) \ - : "s0"); \ - __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); \ - } \ - if (_fex & FP_EX_OVERFLOW) \ - { \ - __asm__ __volatile__ ("fadd\ts0, %s0, %s1" \ - : \ - : "w" (fp_max), "w" (fp_1e32) \ - : "s0"); \ - __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); \ - } \ - if (_fex & FP_EX_UNDERFLOW) \ - { \ - __asm__ __volatile__ ("fmul\ts0, %s0, %s0" \ - : \ - : "w" (fp_min) \ - : "s0"); \ - __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); \ - } \ - if (_fex & FP_EX_INEXACT) \ - { \ - __asm__ __volatile__ ("fsub\ts0, %s0, %s1" \ - : \ - : "w" (fp_max), "w" (fp_one) \ - : "s0"); \ - __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); \ - } \ - } while (0) +void __sfp_handle_exceptions (int); +#define FP_HANDLE_EXCEPTIONS \ + do { \ + if (__builtin_expect (_fex, 0)) \ + __sfp_handle_exceptions (_fex); \ + } while (0); -#define FP_RND_NEAREST 0 -#define FP_RND_ZERO 0xc00000 +#define FP_RND_NEAREST 0x000000 #define FP_RND_PINF 0x400000 #define FP_RND_MINF 0x800000 +#define FP_RND_ZERO 0xc00000 +#define FP_RND_MASK 0xc00000 #define _FP_DECL_EX \ unsigned long int _fpcr __attribute__ ((unused)) = FP_RND_NEAREST @@ -135,7 +93,7 @@ typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__))); : "=r" (_fpcr)); \ } while (0) -#define FP_ROUNDMODE (_fpcr & 0xc00000) +#define FP_ROUNDMODE (_fpcr & FP_RND_MASK) #define __LITTLE_ENDIAN 1234 #define __BIG_ENDIAN 4321 diff --git a/libgcc/config/aarch64/t-softfp b/libgcc/config/aarch64/t-softfp index 6500b52..586dca22 100644 --- a/libgcc/config/aarch64/t-softfp +++ b/libgcc/config/aarch64/t-softfp @@ -5,3 +5,5 @@ softfp_truncations := tfsf tfdf softfp_exclude_libgcc2 := n TARGET_LIBGCC2_CFLAGS += -Wno-missing-prototypes + +LIB2ADD += $(srcdir)/config/aarch64/sfp-exceptions.c