[Patch: RL78] Add support for 64-bit doubles

Kaushik Phatak Kaushik.Phatak@kpit.com
Mon May 12 07:17:00 GMT 2014


Hi DJ,
Thanks for your review earlier.

>> It looks OK, it's just the timing is bad.  Please remind us after GCC is back in stage1.
I am reposting this patch with GCC in stage 1.
	
>> I would also like to see an explicit initialization for the variable to guarantee that the 
>> default is 32-bit-doubles, or some other notation that guarantees the default.
Does the macro ' TARGET_64BIT_DOUBLES ' not guarantee this? 
'sizeof' returns length as 4 for doubles for default options and 8 for -m64bit-doubles.
Is there any other way to do this explicitly?

>> Also, please note in the reminder that you've tested both options and don't see any differences in the testsuite results 
>> between them that reflect bugs in DFmode double support.  Just because you've enabled the type doesn't mean it 
>> will work properly.
We have regression tested this for -m32bit-doubles, -m64bit-doubles and default -msim options and results look OK.
Few additional failures for 64 bit types which were linker errors due to ROM overflow. These were verified manually
by adjusting the linker script.

Please let me know if any modifications are required. Below patch is identical to one submitted earlier.

Regards,
Kaushik

2014-05-12  Kaushik Phatak  <kaushik.phatak@kpit.com>

	* config/rl78/rl78.h (TARGET_CPU_CPP_BUILTINS): Define
	__RL78_64BIT_DOUBLES__ or __RL78_32BIT_DOUBLES__.
	(ASM_SPEC): Pass -m64bit-doubles or -m32bit-doubles on
	to the assembler.
	(DOUBLE_TYPE_SIZE): Use 64 bit if TARGET_64BIT_DOUBLES
	is true.
	(LIBGCC2_HAS_DF_MODE): Define based on __RL78_32BIT_DOUBLES__.
	(LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Use 64 bit is
	__RL78_64BIT_DOUBLES__ is defined.
	* gcc/config/rl78/rl78.opt (m64bit-doubles): New option.
	(m32bit-doubles) Likewise.
	* gcc/config/rl78/t-rl78: Add 64-bit-double multilib.

Index: gcc/config/rl78/rl78.h
===================================================================
--- gcc/config/rl78/rl78.h	(revision 210319)
+++ gcc/config/rl78/rl78.h	(working copy)
@@ -23,18 +23,22 @@
 #define RL78_MUL_RL78	(rl78_mul_type == MUL_RL78)
 #define RL78_MUL_G13	(rl78_mul_type == MUL_G13)
 
-#define TARGET_CPU_CPP_BUILTINS()               \
-  do                                            \
-    {                                           \
-      builtin_define ("__RL78__"); 		\
-      builtin_assert ("cpu=RL78"); 		\
-      if (RL78_MUL_RL78)			\
-	builtin_define ("__RL78_MUL_RL78__"); 	\
-      if (RL78_MUL_G13)				\
-	builtin_define ("__RL78_MUL_G13__"); 	\
-      if (TARGET_G10)				\
-	builtin_define ("__RL78_G10__"); 	\
-    }                                           \
+#define TARGET_CPU_CPP_BUILTINS()		    \
+  do                                                \
+    {                                               \
+      builtin_define ("__RL78__"); 		    \
+      builtin_assert ("cpu=RL78"); 		    \
+      if (RL78_MUL_RL78)			    \
+	builtin_define ("__RL78_MUL_RL78__"); 	    \
+      if (RL78_MUL_G13)				    \
+	builtin_define ("__RL78_MUL_G13__");        \
+      if (TARGET_G10)			      	    \
+	builtin_define ("__RL78_G10__");	    \
+      if (TARGET_64BIT_DOUBLES)			    \
+        builtin_define ("__RL78_64BIT_DOUBLES__");  \
+      else					    \
+        builtin_define ("__RL78_32BIT_DOUBLES__");  \
+    }						    \
   while (0)
 
 #undef  STARTFILE_SPEC
@@ -47,6 +51,8 @@
 #define ASM_SPEC "\
 %{mrelax:-relax} \
 %{mg10} \
+%{m64bit-doubles:-m64bit-doubles} \
+%{!m64bit-doubles:-m32bit-doubles} \
 "
 
 #undef  LINK_SPEC
@@ -95,11 +101,16 @@
 #define LONG_LONG_TYPE_SIZE		64
 
 #define FLOAT_TYPE_SIZE 		32
-#define DOUBLE_TYPE_SIZE 		32 /*64*/
+#define DOUBLE_TYPE_SIZE                (TARGET_64BIT_DOUBLES ? 64 : 32)
 #define LONG_DOUBLE_TYPE_SIZE		64 /*DOUBLE_TYPE_SIZE*/
 
-#define LIBGCC2_HAS_DF_MODE		1
+#ifdef __RL78_32BIT_DOUBLES__
+#define LIBGCC2_HAS_DF_MODE             0
+#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE   32
+#else
+#define LIBGCC2_HAS_DF_MODE             1
 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE   64
+#endif
 
 #define DEFAULT_SIGNED_CHAR		0
 
Index: gcc/config/rl78/rl78.opt
===================================================================
--- gcc/config/rl78/rl78.opt	(revision 210319)
+++ gcc/config/rl78/rl78.opt	(working copy)
@@ -30,6 +30,14 @@
 Target RejectNegative Joined Var(rl78_mul_type) Report Tolower Enum(rl78_mul_types) Init(MUL_NONE)
 Select hardware or software multiplication support.
 
+m64bit-doubles
+Target RejectNegative Mask(64BIT_DOUBLES) Report
+Store doubles in 64 bits.
+
+m32bit-doubles
+Target RejectNegative InverseMask(64BIT_DOUBLES) Report
+Stores doubles in 32 bits.  This is the default
+
 Enum
 Name(rl78_mul_types) Type(enum rl78_mul_types)
 
Index: gcc/config/rl78/t-rl78
===================================================================
--- gcc/config/rl78/t-rl78	(revision 210319)
+++ gcc/config/rl78/t-rl78	(working copy)
@@ -23,5 +23,5 @@
 
 # Enable multilibs:
 
-MULTILIB_OPTIONS    = mg10
-MULTILIB_DIRNAMES   = g10
+MULTILIB_OPTIONS    = mg10 m64bit-doubles
+MULTILIB_DIRNAMES   = g10  64-bit-double



More information about the Gcc-patches mailing list