This is a revision of a patch that I've submitted several times.  It makes
-mpcrel the default on Linux 64-bit systems that use ELF v2, use the medium
code mode, and if the user did not disable prefixed load/store instructions for
-mcpu=future.

Previous versions of the patch had two macros that the target os could set, one
to say that the target os supported prefixed instructions with large numeric
offsets, and the second whether PC-relative prefixed load/store instructions
could be generated.  Segher asked that we drop the capability to configure
whether prefixed numeric load/store instructions would be enabled by default,
and this patch does this.  All of the PC-relative support is in the master
branch, we just need to enable it by default.

Is this patch acceptable to be committed to the master branch.  I have done
various tests with this patch, including most recently bootstraping and running
make check.  I have built the Spec 2017 benchmark suite with this patch.

2020-03-23  Michael Meissner  <meiss...@linux.ibm.com>

        * config/rs6000/linux64.h (PCREL_SUPPORTED_BY_OS): Enable -mpcrel
        for -mcpu=future by default on 64-bit systems with medium code
        model.
        * config/rs6000/rs6000-cpus.def (ISA_FUTURE_MASKS_SERVER): Do not
        define the bits for -mprefixed or -mpcrel here.
        (OTHER_FUTURE_MASKS): Define the bits for -mprefixed and -mpcrel
        here.
        * config/rs6000/rs6000.c (PCREL_SUPPORTED_BY_OS): If not defined,
        don't enable -mpcrel by default.
        (rs6000_option_override_internal): Enable -mpcrel on systems that
        support it, if the user did not do -mno-pcrel.

--- /tmp/QuuFm5_linux64.h       2020-03-20 20:15:38.321862650 -0400
+++ gcc/config/rs6000/linux64.h 2020-03-20 18:36:33.654484833 -0400
@@ -640,3 +640,11 @@ extern int dot_symbols;
    enabling the __float128 keyword.  */
 #undef TARGET_FLOAT128_ENABLE_TYPE
 #define TARGET_FLOAT128_ENABLE_TYPE 1
+
+/* Enable support for PC-relative addressing on the 'future' system.  Currently
+   this support only exits for the ELF v2 object file format using the medium
+   code model.  */
+#undef  PCREL_SUPPORTED_BY_OS
+#define PCREL_SUPPORTED_BY_OS  (TARGET_FUTURE && TARGET_PREFIXED       \
+                                && ELFv2_ABI_CHECK                     \
+                                && (TARGET_CMODEL == CMODEL_MEDIUM))
--- /tmp/sO5cAE_rs6000-cpus.def 2020-03-20 20:15:38.331862575 -0400
+++ gcc/config/rs6000/rs6000-cpus.def   2020-03-20 17:05:17.347638233 -0400
@@ -75,11 +75,10 @@
                                 | OPTION_MASK_P8_VECTOR                \
                                 | OPTION_MASK_P9_VECTOR)
 
-/* Support for a future processor's features.  Do not enable -mpcrel until it
-   is fully functional.  */
+/* Support for a future processor's features.  The addressing related options
+   (like -mprefixed, -mpcrel) are not set here.  */
 #define ISA_FUTURE_MASKS_SERVER        (ISA_3_0_MASKS_SERVER                   
\
-                                | OPTION_MASK_FUTURE                   \
-                                | OPTION_MASK_PREFIXED)
+                                | OPTION_MASK_FUTURE)
 
 /* Flags that need to be turned off if -mno-future.  */
 #define OTHER_FUTURE_MASKS     (OPTION_MASK_PCREL                      \
--- /tmp/xQt3Pd_rs6000.c        2020-03-20 20:15:38.343862485 -0400
+++ gcc/config/rs6000/rs6000.c  2020-03-20 20:11:02.942928364 -0400
@@ -98,6 +98,12 @@
 #endif
 #endif
 
+/* Set up the defaults for whether PC-relative addressing is supported by the
+   target system.  */
+#ifndef PCREL_SUPPORTED_BY_OS
+#define PCREL_SUPPORTED_BY_OS          0
+#endif
+
 /* Support targetm.vectorize.builtin_mask_for_load.  */
 tree altivec_builtin_mask_for_load;
 
@@ -4012,6 +4018,11 @@ rs6000_option_override_internal (bool gl
       rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW;
     }
 
+  /* Enable -mprefixed by default on 64-bit 'future' systems.  */
+  if (TARGET_FUTURE && TARGET_POWERPC64
+      && (rs6000_isa_flags_explicit & OPTION_MASK_PREFIXED) == 0)
+    rs6000_isa_flags |= OPTION_MASK_PREFIXED;
+
   /* -mprefixed (and hence -mpcrel) requires -mcpu=future.  */
   if (TARGET_PREFIXED && !TARGET_FUTURE)
     {
@@ -4173,6 +4184,11 @@ rs6000_option_override_internal (bool gl
       rs6000_isa_flags &= ~OPTION_MASK_PCREL;
     }
 
+  /* If the OS has support for PC-relative relocations, enable it now.  */
+  if (PCREL_SUPPORTED_BY_OS
+      && (rs6000_isa_flags_explicit & OPTION_MASK_PCREL) == 0)
+    rs6000_isa_flags |= OPTION_MASK_PCREL;
+
   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
     rs6000_print_isa_options (stderr, 0, "after subtarget", rs6000_isa_flags);
 


-- 
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meiss...@linux.ibm.com, phone: +1 (978) 899-4797

Reply via email to