This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
ia64 constant pool vs sdata
- To: gcc-patches at gcc dot gnu dot org
- Subject: ia64 constant pool vs sdata
- From: Richard Henderson <rth at cygnus dot com>
- Date: Wed, 31 May 2000 17:15:59 -0700
Like MIPS, we'd prefer to access constant pool data quickly
than have it be read-only.
r~
* config/ia64/ia64.c (sdata_symbolic_operand): Consider small
CONSTANT_POOL_ADDRESS_P addresses for .sdata.
* config/ia64/sysv4.h (SELECT_RTX_SECTION): New.
Index: ia64.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/ia64/ia64.c,v
retrieving revision 1.19
diff -c -p -d -r1.19 ia64.c
*** ia64.c 2000/06/01 00:10:35 1.19
--- ia64.c 2000/06/01 00:11:34
*************** sdata_symbolic_operand (op, mode)
*** 144,156 ****
{
switch (GET_CODE (op))
{
case SYMBOL_REF:
! return XSTR (op, 0)[0] == SDATA_NAME_FLAG_CHAR;
- case CONST:
- return (GET_CODE (XEXP (op, 0)) == PLUS
- && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
- && XSTR (XEXP (XEXP (op, 0), 0), 0)[0] == SDATA_NAME_FLAG_CHAR);
default:
break;
}
--- 144,162 ----
{
switch (GET_CODE (op))
{
+ case CONST:
+ if (GET_CODE (XEXP (op, 0)) != PLUS
+ || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF)
+ break;
+ op = XEXP (XEXP (op, 0), 0);
+ /* FALLTHRU */
+
case SYMBOL_REF:
! if (CONSTANT_POOL_ADDRESS_P (op))
! return GET_MODE_SIZE (get_pool_mode (op)) <= ia64_section_threshold;
! else
! return XSTR (op, 0)[0] == SDATA_NAME_FLAG_CHAR;
default:
break;
}
Index: sysv4.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/ia64/sysv4.h,v
retrieving revision 1.3
diff -c -p -d -r1.3 sysv4.h
*** sysv4.h 2000/05/03 18:46:05 1.3
--- sysv4.h 2000/06/01 00:11:34
*************** do { \
*** 226,231 ****
--- 226,246 ----
const_section (); \
}
+ /* Similarly for constant pool data. */
+
+ extern int ia64_section_threshold;
+ #undef SELECT_RTX_SECTION
+ #define SELECT_RTX_SECTION(MODE, RTX) \
+ { \
+ if (GET_MODE_SIZE (MODE) > 0 \
+ && GET_MODE_SIZE (MODE) <= ia64_section_threshold) \
+ sdata_section (); \
+ else if (flag_pic && symbolic_operand ((RTX), (MODE))) \
+ data_section (); \
+ else \
+ const_section (); \
+ }
+
#undef EXTRA_SECTIONS
#define EXTRA_SECTIONS in_const, in_ctors, in_dtors, in_sdata, in_sbss