From: Richard Sandiford Date: Thu, 24 Aug 2017 07:47:13 +0000 (+0000) Subject: Make more use of subreg_offset_from_lsb X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=dc0c1e44766b850cf7418badc99a97a044681409;p=gcc.git Make more use of subreg_offset_from_lsb This patch makes use of the subreg_offset_from_lsb function added by an earlier patch in the SVE series. 2017-08-24 Richard Sandiford Alan Hayward David Sherwood gcc/ * combine.c (make_extraction): Use subreg_offset_from_lsb. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r251326 --- 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);