aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-05-31 17:14:13 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-05-31 17:14:13 -0700
commitac9cd70f207c6c83d3f34fd79d2f07d1d52051d0 (patch)
treeb14bf4c936636a0cb5afc48016ef6ccc759663e3 /gcc
parent85548039c4a4913179825edea3a81a8ce6da36d3 (diff)
downloadgcc-ac9cd70f207c6c83d3f34fd79d2f07d1d52051d0.zip
gcc-ac9cd70f207c6c83d3f34fd79d2f07d1d52051d0.tar.gz
gcc-ac9cd70f207c6c83d3f34fd79d2f07d1d52051d0.tar.bz2
ia64.c (sdata_symbolic_operand): Consider small CONSTANT_POOL_ADDRESS_P addresses for .sdata.
* config/ia64/ia64.c (sdata_symbolic_operand): Consider small CONSTANT_POOL_ADDRESS_P addresses for .sdata. * config/ia64/sysv4.h (SELECT_RTX_SECTION): New. From-SVN: r34319
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