Hi,
Please find below a patch which adds support for 64-bit doubles to the RL78 
target.
This is largely based on the rx target port and uses similar option and 
multilibs.
I will be posting the binutils and newlib part of this patch shortly.

Kindly review the same and let me know if OK to commit.

Thanks & Best Regards,
Kaushik

2013-03-06  Kaushik Phatak  <kaushik.pha...@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 208379)
+++ 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 208379)
+++ 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 208379)
+++ 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

Reply via email to