[RS6000] Don't put large integer constants in TOC for -mcmodel=medium
authorAlan Modra <amodra@gmail.com>
Tue, 13 Nov 2018 13:01:36 +0000 (23:31 +1030)
committerAlan Modra <amodra@gcc.gnu.org>
Tue, 13 Nov 2018 13:01:36 +0000 (23:31 +1030)
For -mcmodel=medium we can use toc-relative addressing to access
constants placed in read-only data, which is better since they can be
merged when in .rodata.cst8.

* config/rs6000/linux64.h (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Exclude
integer constants when -mcmodel=medium.

From-SVN: r266069

gcc/ChangeLog
gcc/config/rs6000/linux64.h

index 3f94aeb8080a2508e7dc623a3135d82fb6cba2ba..369ef54fb0d74bff1ce41c7c23f7c719f6e65f39 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-13  Alan Modra  <amodra@gmail.com>
+
+       * config/rs6000/linux64.h (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Exclude
+       integer constants when -mcmodel=medium.
+
 2018-11-13  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * config/arc/arc.h (FUNCTION_PROFILER): Redefine to empty.
index e6b4fd22d738604e606d6d25f3b4dae8e9356e7a..0d8e164a598a12cbf4202d3d0e90fec4ba46d6a8 100644 (file)
@@ -582,8 +582,10 @@ extern int dot_symbols;
    we also do this for floating-point constants.  We actually can only
    do this if the FP formats of the target and host machines are the
    same, but we can't check that since not every file that uses
-   the macros includes real.h.  We also do this when we can write the
-   entry into the TOC and the entry is not larger than a TOC entry.  */
+   the macros includes real.h.  We also do this when we can write an
+   integer into the TOC and the entry is not larger than a TOC entry,
+   but not for -mcmodel=medium where we'll use a toc-relative load for
+   constants outside the TOC.  */
 
 #undef  ASM_OUTPUT_SPECIAL_POOL_ENTRY_P
 #define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE)                       \
@@ -593,6 +595,7 @@ extern int dot_symbols;
           && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF)           \
        || GET_CODE (X) == LABEL_REF                                    \
        || (GET_CODE (X) == CONST_INT                                   \
+          && TARGET_CMODEL != CMODEL_MEDIUM                            \
           && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode))      \
        || (GET_CODE (X) == CONST_DOUBLE                                        \
           && ((TARGET_64BIT                                            \