diff mbox series

[RS6000] Don't put large integer constants in TOC for -mcmodel=medium

Message ID 20181113032320.GL29784@bubble.grove.modra.org
State New
Headers show
Series [RS6000] Don't put large integer constants in TOC for -mcmodel=medium | expand

Commit Message

Alan Modra Nov. 13, 2018, 3:23 a.m. UTC
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.

Bootstrapped etc. powerpc64le-linux.  OK?

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

Comments

Segher Boessenkool Nov. 13, 2018, 11:50 a.m. UTC | #1
On Tue, Nov 13, 2018 at 01:53:20PM +1030, Alan Modra wrote:
> 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.
> 
> Bootstrapped etc. powerpc64le-linux.  OK?

Okay, thanks!


Segher


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

Patch

diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h
index e6b4fd22d73..0d8e164a598 100644
--- a/gcc/config/rs6000/linux64.h
+++ b/gcc/config/rs6000/linux64.h
@@ -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						\