Patchwork libgcc refactor aarch64 sfp-machine.h

login
register
mail settings
Submitter Marcus Shawcroft
Date Nov. 15, 2012, 3:58 p.m.
Message ID <50A51122.6090002@arm.com>
Download mbox | patch
Permalink /patch/199333/
State New
Headers show

Comments

Marcus Shawcroft - Nov. 15, 2012, 3:58 p.m.
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 <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.
Marcus Shawcroft - Dec. 3, 2012, 4 p.m.
PING

/Marcus

On 15 Nov 2012, at 15:58, Marcus Shawcroft <Marcus.Shawcroft@arm.com> wrote:

> 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 <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.<refactor-sfp-machine.diff>
Richard Earnshaw - Dec. 3, 2012, 4:08 p.m.
On 03/12/12 16:00, Marcus Shawcroft wrote:
>
> PING
>

I would have thought that both this and the other patch (the update from 
GLibC) comes under the remit of the port maintainer, rather than the 
libgcc maintainer.

So I would work on the assumption that if Ian doesn't say anything in 
the next 24 hours, this is OK to go in.

R.

> /Marcus
>
> On 15 Nov 2012, at 15:58, Marcus Shawcroft <Marcus.Shawcroft@arm.com> wrote:
>
>> 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 <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.<refactor-sfp-machine.diff>
>
>
>
Ian Lance Taylor - Dec. 3, 2012, 11:57 p.m.
Richard Earnshaw <rearnsha@arm.com> writes:

> On 03/12/12 16:00, Marcus Shawcroft wrote:
>>
>> PING
>>
>
> I would have thought that both this and the other patch (the update
> from GLibC) comes under the remit of the port maintainer, rather than
> the libgcc maintainer.
>
> So I would work on the assumption that if Ian doesn't say anything in
> the next 24 hours, this is OK to go in.

It is always true that the port maintainer can approve changes to libgcc
files that are specific to that port.  The port maintainer knows those
files better than the libgcc maintainers do.

Ian


>
> R.
>
>> /Marcus
>>
>> On 15 Nov 2012, at 15:58, Marcus Shawcroft <Marcus.Shawcroft@arm.com> wrote:
>>
>>> 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 <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.<refactor-sfp-machine.diff>
>>
>>
>>

Patch

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
+ * <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));
+    }
+}
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