diff options
author | Pavel Chupin <pavel.v.chupin@intel.com> | 2012-08-10 10:38:23 +0400 |
---|---|---|
committer | Pavel Chupin <pavel.v.chupin@intel.com> | 2012-08-24 10:40:31 +0400 |
commit | 65cadbba7f7e816b4b2bff752808b7429d0d0f2a (patch) | |
tree | 5a85af9fe5e320b5b1961cb01ad91b135279dbf3 /gcc-4.6/gcc/config/i386 | |
parent | 3c052de3bb16ac53b6b6ed659ec7557eb84c7590 (diff) | |
download | toolchain_gcc-65cadbba7f7e816b4b2bff752808b7429d0d0f2a.tar.gz toolchain_gcc-65cadbba7f7e816b4b2bff752808b7429d0d0f2a.tar.bz2 toolchain_gcc-65cadbba7f7e816b4b2bff752808b7429d0d0f2a.zip |
Backport from trunk r190598 and r190599: 64-bit long double for bionic
2012-08-22 H.J. Lu <hongjiu.lu@intel.com>
Replace REAL_VALUE_TO_TARGET_LONG_DOUBLE with real_to_target
PR target/54347
* config/i386/i386.c (ix86_split_to_parts): Replace
REAL_VALUE_TO_TARGET_LONG_DOUBLE with real_to_target.
2012-08-22 H.J. Lu <hongjiu.lu@intel.com>
Add -mlong-double-64/-mlong-double-80 to i386
gcc/
* doc/invoke.texi: Document -mlong-double-64/-mlong-double-80.
* config/i386/i386.c (flag_opts): Add -mlong-double-64.
(TARGET_HAS_BIONIC): Default long double to 64-bit for Bionic.
* config/i386/i386.h (LONG_DOUBLE_TYPE_SIZE): Use 64 if
TARGET_LONG_DOUBLE_64 is true.
(LIBGCC2_LONG_DOUBLE_TYPE_SIZE): New macro.
(WIDEST_HARDWARE_FP_SIZE): Defined to 80.
* config/i386/i386.opt (mlong-double-80): New option.
(mlong-double-64): Likewise.
* config/i386/i386-c.c (ix86_target_macros): Define
__LONG_DOUBLE_64__ for TARGET_LONG_DOUBLE_64.
gcc/testsuite/
* gcc.target/i386/long-double-64-1.c: New file.
* gcc.target/i386/long-double-64-2.c: Likewise.
* gcc.target/i386/long-double-64-3.c: Likewise.
* gcc.target/i386/long-double-64-4.c: Likewise.
* gcc.target/i386/long-double-80-1.c: Likewise.
* gcc.target/i386/long-double-80-2.c: Likewise.
* gcc.target/i386/long-double-80-3.c: Likewise.
* gcc.target/i386/long-double-80-4.c: Likewise.
* gcc.target/i386/long-double-80-5.c: Likewise.
* gcc.target/i386/long-double-80-6.c: Likewise.
* gcc.target/i386/long-double-80-7.c: Likewise.
libgcc/
* config/i386/t-linux (HOST_LIBGCC2_CFLAGS): New.
Change-Id: I85b1e7105e24272e6d43115797b4914b93c2a598
Signed-off-by: Pavel Chupin <pavel.v.chupin@intel.com>
Diffstat (limited to 'gcc-4.6/gcc/config/i386')
-rw-r--r-- | gcc-4.6/gcc/config/i386/i386-c.c | 3 | ||||
-rw-r--r-- | gcc-4.6/gcc/config/i386/i386.c | 13 | ||||
-rw-r--r-- | gcc-4.6/gcc/config/i386/i386.h | 12 | ||||
-rw-r--r-- | gcc-4.6/gcc/config/i386/i386.opt | 8 |
4 files changed, 32 insertions, 4 deletions
diff --git a/gcc-4.6/gcc/config/i386/i386-c.c b/gcc-4.6/gcc/config/i386/i386-c.c index 149735133..ee9a57699 100644 --- a/gcc-4.6/gcc/config/i386/i386-c.c +++ b/gcc-4.6/gcc/config/i386/i386-c.c @@ -376,6 +376,9 @@ ix86_target_macros (void) builtin_define_std ("i386"); } + if (TARGET_LONG_DOUBLE_64) + cpp_define (parse_in, "__LONG_DOUBLE_64__"); + ix86_target_macros_internal (ix86_isa_flags, ix86_arch, ix86_tune, diff --git a/gcc-4.6/gcc/config/i386/i386.c b/gcc-4.6/gcc/config/i386/i386.c index 6117e7d7b..b99d31150 100644 --- a/gcc-4.6/gcc/config/i386/i386.c +++ b/gcc-4.6/gcc/config/i386/i386.c @@ -3125,6 +3125,7 @@ ix86_target_string (int isa, int flags, const char *arch, const char *tune, static struct ix86_target_opts flag_opts[] = { { "-m128bit-long-double", MASK_128BIT_LONG_DOUBLE }, + { "-mlong-double-64", MASK_LONG_DOUBLE_64 }, { "-m80387", MASK_80387 }, { "-maccumulate-outgoing-args", MASK_ACCUMULATE_OUTGOING_ARGS }, { "-malign-double", MASK_ALIGN_DOUBLE }, @@ -4292,7 +4293,13 @@ ix86_option_override_internal (bool main_args_p) #endif } - /* Save the initial options in case the user does function specific options */ + /* Default long double to 64-bit for Bionic. */ + if (TARGET_HAS_BIONIC + && !(target_flags_explicit & MASK_LONG_DOUBLE_64)) + target_flags |= MASK_LONG_DOUBLE_64; + + /* Save the initial options in case the user does function specific + options. */ if (main_args_p) target_option_default_node = target_option_current_node = build_target_option_node (); @@ -19419,7 +19426,9 @@ ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode) parts[2] = gen_int_mode (l[2], SImode); break; case XFmode: - REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l); + /* We can't use REAL_VALUE_TO_TARGET_LONG_DOUBLE since + long double may not be 80-bit. */ + real_to_target (l, &r, mode); parts[2] = gen_int_mode (l[2], SImode); break; case DFmode: diff --git a/gcc-4.6/gcc/config/i386/i386.h b/gcc-4.6/gcc/config/i386/i386.h index dcb3f295a..678071f27 100644 --- a/gcc-4.6/gcc/config/i386/i386.h +++ b/gcc-4.6/gcc/config/i386/i386.h @@ -659,9 +659,17 @@ enum target_cpu_default #define LONG_LONG_TYPE_SIZE 64 #define FLOAT_TYPE_SIZE 32 #define DOUBLE_TYPE_SIZE 64 -#define LONG_DOUBLE_TYPE_SIZE 80 +#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_64 ? 64 : 80) -#define WIDEST_HARDWARE_FP_SIZE LONG_DOUBLE_TYPE_SIZE +/* Define this to set long double type size to use in libgcc2.c, which can + not depend on target_flags. */ +#ifdef __LONG_DOUBLE_64__ +#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 +#else +#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 80 +#endif + +#define WIDEST_HARDWARE_FP_SIZE 80 #if defined (TARGET_BI_ARCH) || TARGET_64BIT_DEFAULT #define MAX_BITS_PER_WORD 64 diff --git a/gcc-4.6/gcc/config/i386/i386.opt b/gcc-4.6/gcc/config/i386/i386.opt index dca06e7aa..9deba3e01 100644 --- a/gcc-4.6/gcc/config/i386/i386.opt +++ b/gcc-4.6/gcc/config/i386/i386.opt @@ -73,6 +73,14 @@ m96bit-long-double Target RejectNegative Report InverseMask(128BIT_LONG_DOUBLE) Save sizeof(long double) is 12 +mlong-double-80 +Target Report RejectNegative InverseMask(LONG_DOUBLE_64) Save +Use 80-bit long double + +mlong-double-64 +Target Report RejectNegative Mask(LONG_DOUBLE_64) Save +Use 64-bit long double + maccumulate-outgoing-args Target Report Mask(ACCUMULATE_OUTGOING_ARGS) Save Reserve space for outgoing arguments in the function prologue |