aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/ia64/ia64.c16
-rw-r--r--gcc/config/ia64/sysv4.h15
3 files changed, 32 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 53ba7fc..9d60871 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2000-05-31 Richard Henderson <rth@cygnus.com>
+ * config/ia64/ia64.c (sdata_symbolic_operand): Consider small
+ CONSTANT_POOL_ADDRESS_P addresses for .sdata.
+ * config/ia64/sysv4.h (SELECT_RTX_SECTION): New.
+
+2000-05-31 Richard Henderson <rth@cygnus.com>
+
* config/ia64/ia64-protos.h (ia64_expand_prediction): Remove.
* config/ia64/ia64.c (ia64_expand_prediction): Move code ...
(ia64_print_operand) [+]: ... here. Use current_output_insn.
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index 3e170f8..8328d7f 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -144,13 +144,19 @@ sdata_symbolic_operand (op, mode)
{
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:
- return XSTR (op, 0)[0] == SDATA_NAME_FLAG_CHAR;
+ 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;
- 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;
}
diff --git a/gcc/config/ia64/sysv4.h b/gcc/config/ia64/sysv4.h
index 7e9e2c9..9c1c125 100644
--- a/gcc/config/ia64/sysv4.h
+++ b/gcc/config/ia64/sysv4.h
@@ -226,6 +226,21 @@ do { \
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