[Patch: RL78] Add support for 64-bit doubles
Kaushik Phatak
Kaushik.Phatak@kpit.com
Thu Mar 6 11:40:00 GMT 2014
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.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 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
More information about the Gcc-patches
mailing list