diff options
author | Jakub Jelinek <jakub@redhat.com> | 2003-07-07 22:53:44 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2003-07-07 22:53:44 +0200 |
commit | eeff9307bc479d7a973c2ef102643975ba0a771e (patch) | |
tree | 7dbec197784b6793cdf0655b7356622141502b7f /gcc | |
parent | b6fa901bc961f54ec9b24c77538f159ad6736d20 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 18 |
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 |