diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 96aa1515782..d448aae1312 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-08-24 Richard Sandiford + Alan Hayward + David Sherwood + + * combine.c (make_extraction): Use subreg_offset_from_lsb. + 2017-08-23 Daniel Santos * config/i386/i386.h (ix86_frame::stack_realign_allocate_offset): diff --git a/gcc/combine.c b/gcc/combine.c index 7aa0a359f48..b34fb81c97a 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7488,26 +7488,15 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos, return a new hard register. */ if (pos || in_dest) { - HOST_WIDE_INT final_word = pos / BITS_PER_WORD; - - if (WORDS_BIG_ENDIAN - && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD) - final_word = ((GET_MODE_SIZE (inner_mode) - - GET_MODE_SIZE (tmode)) - / UNITS_PER_WORD) - final_word; - - final_word *= UNITS_PER_WORD; - if (BYTES_BIG_ENDIAN && - GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode)) - final_word += (GET_MODE_SIZE (inner_mode) - - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD; + unsigned int offset + = subreg_offset_from_lsb (tmode, inner_mode, pos); /* Avoid creating invalid subregs, for example when simplifying (x>>32)&255. */ - if (!validate_subreg (tmode, inner_mode, inner, final_word)) + if (!validate_subreg (tmode, inner_mode, inner, offset)) return NULL_RTX; - new_rtx = gen_rtx_SUBREG (tmode, inner, final_word); + new_rtx = gen_rtx_SUBREG (tmode, inner, offset); } else new_rtx = gen_lowpart (tmode, inner);