===================================================================
@@ -59,6 +59,7 @@
#include "opts.h"
#include "tree-vectorizer.h"
#include "dumpfile.h"
+#include "lower-subreg.h"
#if TARGET_XCOFF
#include "xcoffout.h" /* get declarations of xcoff_*_section_name */
#endif
@@ -1357,6 +1358,8 @@ static const struct attribute_spec rs6000_attribut
#define TARGET_RTX_COSTS rs6000_rtx_costs
#undef TARGET_ADDRESS_COST
#define TARGET_ADDRESS_COST hook_int_rtx_mode_as_bool_0
+#undef TARGET_INIT_LOWER_SUBREG
+#define TARGET_INIT_LOWER_SUBREG rs6000_init_lower_subreg
#undef TARGET_DWARF_REGISTER_SPAN
#define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
@@ -27430,6 +27523,20 @@ rs6000_memory_move_cost (enum machine_mode mode, r
return ret;
}
+static void
+rs6000_init_lower_subreg (void *data)
+{
+ if (!TARGET_IEEEQUAD
+ && TARGET_HARD_FLOAT
+ && (TARGET_FPRS || TARGET_E500_DOUBLE)
+ && TARGET_LONG_DOUBLE_128)
+ {
+ struct target_lower_subreg *info = (struct target_lower_subreg *) data;
+ info->x_choices[0].move_modes_to_split[TFmode] = false;
+ info->x_choices[1].move_modes_to_split[TFmode] = false;
+ }
+}
+
/* Returns a code for a target-specific builtin that implements
reciprocal of the function, or NULL_TREE if not available. */
===================================================================
@@ -39,6 +39,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-pass.h"
#include "df.h"
#include "lower-subreg.h"
+#include "target.h"
#ifdef STACK_GROWS_DOWNWARD
# undef STACK_GROWS_DOWNWARD
@@ -287,6 +288,9 @@ init_lower_subreg (void)
if (LOG_COSTS)
fprintf (stderr, "\nSpeed costs\n===========\n\n");
compute_costs (true, &rtxes);
+
+ if (targetm.init_lower_subreg)
+ targetm.init_lower_subreg (this_target_lower_subreg);
}
static bool
===================================================================
@@ -2926,6 +2926,14 @@ DEFHOOK
void, (int *code, rtx *op0, rtx *op1, bool op0_preserve_value),
default_canonicalize_comparison)
+/* Allow modification of subreg choices. */
+DEFHOOK
+(init_lower_subreg,
+ "This hook allows modification of the choices the lower_subreg pass \
+will make for particular subreg modes. @var{data} is a pointer to a \
+@code{struct target_lower_subreg}.",
+ void, (void *data), NULL)
+
DEFHOOKPOD
(atomic_test_and_set_trueval,
"This value should be set if the result written by\
===================================================================
@@ -6384,6 +6384,8 @@ should probably only be given to addresses with di
registers on machines with lots of registers.
@end deftypefn
+@hook TARGET_INIT_LOWER_SUBREG
+
@node Scheduling
@section Adjusting the Instruction Scheduler
===================================================================
@@ -0,0 +1,10 @@
+/* { dg-do compile { target { powerpc*-*-darwin* powerpc*-*-aix* rs6000-*-* powerpc*-*-linux* } } } */
+/* { dg-options "-O2 -mlong-double-128" } */
+/* { dg-final { scan-assembler-not "lwz" } } */
+/* { dg-final { scan-assembler-not "ld" } } */
+
+long double
+_fabsl (long double x)
+{
+ return __builtin_fabsl (x);
+}