aarch64: Refactor aarch64 sfp-machine.h

2012-12-04  Marcus Shawcroft <marcus.shawcroft@arm.com>

	* 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.

From-SVN: r194142
This commit is contained in:
Marcus Shawcroft 2012-12-04 14:16:17 +00:00 committed by Marcus Shawcroft
parent 71ce1a3485
commit 868395e87f
4 changed files with 96 additions and 52 deletions

View file

@ -1,3 +1,11 @@
2012-12-04 Marcus Shawcroft <marcus.shawcroft@arm.com>
* 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.
2012-12-04 Richard Earnshaw <rearnsha@arm.com>
* config.host: (arm*-*-freebsd*): Remove.

View file

@ -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
* <http://www.gnu.org/licenses/>.
*/
#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));
}
}

View file

@ -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

View file

@ -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