This just removes some unnecessary tests. It's easy to see that if the sign bit isn't set then xor 0x8000 followed by subtract 0x8000 leaves the value unchanged. Bootstrapped etc. powerpc-linux. OK for mainline?
* config/rs6000/rs6000.c (rs6000_emit_set_long_const): Tidy. Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 198174) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -7104,21 +7104,13 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_IN if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000)) || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000))) - { - if (ud1 & 0x8000) - emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) - 0x8000))); - else - emit_move_insn (dest, GEN_INT (ud1)); - } + emit_move_insn (dest, GEN_INT ((ud1 ^ 0x8000) - 0x8000)); else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000)) || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000))) { - if (ud2 & 0x8000) - emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000) - - 0x80000000)); - else - emit_move_insn (dest, GEN_INT (ud2 << 16)); + 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), @@ -7141,12 +7133,8 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_IN else if ((ud4 == 0xffff && (ud3 & 0x8000)) || (ud4 == 0 && ! (ud3 & 0x8000))) { - if (ud3 & 0x8000) - emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000) - - 0x80000000)); - else - emit_move_insn (dest, GEN_INT (ud3 << 16)); - + emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000) + - 0x80000000)); if (ud2 != 0) emit_move_insn (copy_rtx (dest), gen_rtx_IOR (DImode, copy_rtx (dest), @@ -7161,12 +7149,8 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_IN } else { - if (ud4 & 0x8000) - emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000) - - 0x80000000)); - else - emit_move_insn (dest, GEN_INT (ud4 << 16)); - + emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000) + - 0x80000000)); if (ud3 != 0) emit_move_insn (copy_rtx (dest), gen_rtx_IOR (DImode, copy_rtx (dest), @@ -7181,7 +7165,8 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_IN GEN_INT (ud2 << 16))); if (ud1 != 0) emit_move_insn (copy_rtx (dest), - gen_rtx_IOR (DImode, copy_rtx (dest), GEN_INT (ud1))); + gen_rtx_IOR (DImode, copy_rtx (dest), + GEN_INT (ud1))); } } return dest; -- Alan Modra Australia Development Lab, IBM