This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

ia64 constant pool vs sdata


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
  

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]