Hi DJ, >> "long double" should always be 64 bits, which means that libgcc must >> always have DFmode helpers.
Please find below a modified patch which sets the long double to 64 bits. This will use default settings for DFmode and libgcc long double types. I have also posted the binutils part of my patch, https://sourceware.org/ml/binutils/2014-05/msg00117.html I have also posted the newlib part of thei patch, https://sourceware.org/ml/newlib/2014/msg00150.html I have also attached the following patch, to avoid issue with whitespaces being dropped. Let me know if the below version is OK to commit. Thanks, Kaushik 2014-05-14 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. * 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,7 +101,7 @@ #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 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
rl78_64bit .diff
Description: rl78_64bit .diff