From 7234a61566edff4c50de8964639683e3acfbeab2 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sat, 9 Jan 2010 18:56:12 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/config/rs6000/rs6000.c | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ea2df0afd27..73263cd0505 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-09 Jakub Jelinek + + * 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 PR debug/42631 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index ee55fbbed80..48f43da76fa 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))) { -- 2.30.2