aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2003-07-07 22:53:44 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2003-07-07 22:53:44 +0200
commiteeff9307bc479d7a973c2ef102643975ba0a771e (patch)
tree7dbec197784b6793cdf0655b7356622141502b7f
parentb6fa901bc961f54ec9b24c77538f159ad6736d20 (diff)
downloadgcc-eeff9307bc479d7a973c2ef102643975ba0a771e.zip
gcc-eeff9307bc479d7a973c2ef102643975ba0a771e.tar.gz
gcc-eeff9307bc479d7a973c2ef102643975ba0a771e.tar.bz2
rs6000.c (rs6000_output_mi_thunk): Remove bogus clearing of SYMBOL_FLAG_LOCAL bit.
* config/rs6000/rs6000.c (rs6000_output_mi_thunk): Remove bogus clearing of SYMBOL_FLAG_LOCAL bit. If vcall_offset fits into signed 16-bit immediate, use one instruction for both addition and load. From-SVN: r69055
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/rs6000/rs6000.c18
2 files changed, 20 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c874fd6..ae1c379 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2003-07-07 Jakub Jelinek <jakub@redhat.com>
+
+ * config/rs6000/rs6000.c (rs6000_output_mi_thunk): Remove bogus
+ clearing of SYMBOL_FLAG_LOCAL bit.
+ If vcall_offset fits into signed 16-bit immediate, use
+ one instruction for both addition and load.
+
2003-07-07 Neil Booth <neil@daikokuya.co.uk>
* opts.c (common_handle_option): Correct handling of the
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 13f3fc3..f3b6c30 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -12374,10 +12374,19 @@ rs6000_output_mi_thunk (file, thunk_fndecl, delta, vcall_offset, function)
rtx tmp = gen_rtx_REG (Pmode, 12);
emit_move_insn (tmp, gen_rtx_MEM (Pmode, this));
- emit_insn (TARGET_32BIT
- ? gen_addsi3 (tmp, tmp, vcall_offset_rtx)
- : gen_adddi3 (tmp, tmp, vcall_offset_rtx));
- emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
+ if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
+ {
+ emit_insn (TARGET_32BIT
+ ? gen_addsi3 (tmp, tmp, vcall_offset_rtx)
+ : gen_adddi3 (tmp, tmp, vcall_offset_rtx));
+ emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
+ }
+ else
+ {
+ rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
+
+ emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
+ }
emit_insn (TARGET_32BIT
? gen_addsi3 (this, this, tmp)
: gen_adddi3 (this, this, tmp));
@@ -12390,7 +12399,6 @@ rs6000_output_mi_thunk (file, thunk_fndecl, delta, vcall_offset, function)
TREE_USED (function) = 1;
}
funexp = XEXP (DECL_RTL (function), 0);
- SYMBOL_REF_FLAGS (funexp) &= ~SYMBOL_FLAG_LOCAL;
funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
#if TARGET_MACHO