aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.6/gcc/config/i386
diff options
context:
space:
mode:
authorPavel Chupin <pavel.v.chupin@intel.com>2012-08-10 10:38:23 +0400
committerPavel Chupin <pavel.v.chupin@intel.com>2012-08-24 10:40:31 +0400
commit65cadbba7f7e816b4b2bff752808b7429d0d0f2a (patch)
tree5a85af9fe5e320b5b1961cb01ad91b135279dbf3 /gcc-4.6/gcc/config/i386
parent3c052de3bb16ac53b6b6ed659ec7557eb84c7590 (diff)
downloadtoolchain_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.c3
-rw-r--r--gcc-4.6/gcc/config/i386/i386.c13
-rw-r--r--gcc-4.6/gcc/config/i386/i386.h12
-rw-r--r--gcc-4.6/gcc/config/i386/i386.opt8
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