diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-01-09 18:56:12 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-01-09 18:56:12 +0100 |
commit | 7234a61566edff4c50de8964639683e3acfbeab2 (patch) | |
tree | ae157d3331dc7129dfe34ee4c436e7190ece2a4a | |
parent | f2ff577a338d9422ee2b35786b3ae873aab933fe (diff) | |
download | gcc-7234a61566edff4c50de8964639683e3acfbeab2.zip gcc-7234a61566edff4c50de8964639683e3acfbeab2.tar.gz gcc-7234a61566edff4c50de8964639683e3acfbeab2.tar.bz2 |
rs6000.c (rs6000_emit_set_long_const): Shorten sequence for DImode constants >= 0x80000000UL <= 0xFFFFFFFFUL by 1 insn.
* config/rs6000/rs6000.c (rs6000_emit_set_long_const): Shorten
sequence for DImode constants >= 0x80000000UL <= 0xFFFFFFFFUL by
1 insn.
(num_insns_constant_wide): Adjust for that change.
From-SVN: r155770
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 16 |
2 files changed, 23 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ea2df0a..73263cd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-09 Jakub Jelinek <jakub@redhat.com> + + * config/rs6000/rs6000.c (rs6000_emit_set_long_const): Shorten + sequence for DImode constants >= 0x80000000UL <= 0xFFFFFFFFUL by + 1 insn. + (num_insns_constant_wide): Adjust for that change. + 2010-01-09 Alexandre Oliva <aoliva@redhat.com> PR debug/42631 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index ee55fbb..48f43da 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -3794,6 +3794,8 @@ num_insns_constant_wide (HOST_WIDE_INT value) if (low == 0) return num_insns_constant_wide (high) + 1; + else if (high == 0) + return num_insns_constant_wide (low) + 1; else return (num_insns_constant_wide (high) + num_insns_constant_wide (low) + 1); @@ -6143,6 +6145,20 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2) gen_rtx_IOR (DImode, copy_rtx (dest), GEN_INT (ud1))); } + else if (ud3 == 0 && ud4 == 0) + { + gcc_assert (ud2 & 0x8000); + emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000) + - 0x80000000)); + if (ud1 != 0) + emit_move_insn (copy_rtx (dest), + gen_rtx_IOR (DImode, copy_rtx (dest), + GEN_INT (ud1))); + emit_move_insn (copy_rtx (dest), + gen_rtx_ZERO_EXTEND (DImode, + gen_lowpart (SImode, + copy_rtx (dest)))); + } else if ((ud4 == 0xffff && (ud3 & 0x8000)) || (ud4 == 0 && ! (ud3 & 0x8000))) { |