diff options
author | Bernd Schmidt <bernds@codesourcery.com> | 2011-07-08 16:21:58 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2011-07-08 16:21:58 +0000 |
commit | c0a6a1eff605142d06a4d873fb5074cb9b61c77e (patch) | |
tree | 663775dd7f56c1e0bd6ec666857472c3fb3c2d24 /gcc/rtlanal.c | |
parent | 9ae601015839cc1835b55134bc9899c475ef77c2 (diff) | |
download | gcc-c0a6a1eff605142d06a4d873fb5074cb9b61c77e.zip gcc-c0a6a1eff605142d06a4d873fb5074cb9b61c77e.tar.gz gcc-c0a6a1eff605142d06a4d873fb5074cb9b61c77e.tar.bz2 |
defaults.h (REG_WORDS_BIG_ENDIAN): Provide a default.
* defaults.h (REG_WORDS_BIG_ENDIAN): Provide a default.
* doc/tm.texi.in (WORDS_BIG_ENDIAN): Mention REG_WORDS_BIG_ENDIAN.
(REG_WORDS_BIG_ENDIAN): Document.
* doc/tm.texi: Regenerate.
* reload.c (operands_match_p): Take it into account.
(reload_adjust_reg_for_mode): Likewise.
* rtlanal.c (subreg_get_info): Likewise.
From-SVN: r176048
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r-- | gcc/rtlanal.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 76aa79a..c3cdd31 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -3289,7 +3289,7 @@ subreg_get_info (unsigned int xregno, enum machine_mode xmode, return a negative offset so that we find the proper highpart of the register. */ if (GET_MODE_SIZE (ymode) > UNITS_PER_WORD - ? WORDS_BIG_ENDIAN : BYTES_BIG_ENDIAN) + ? REG_WORDS_BIG_ENDIAN : BYTES_BIG_ENDIAN) info->offset = nregs_xmode - nregs_ymode; else info->offset = 0; @@ -3344,6 +3344,15 @@ subreg_get_info (unsigned int xregno, enum machine_mode xmode, gcc_assert ((GET_MODE_SIZE (xmode) % GET_MODE_SIZE (ymode)) == 0); gcc_assert ((nregs_xmode % nregs_ymode) == 0); + if (WORDS_BIG_ENDIAN != REG_WORDS_BIG_ENDIAN + && GET_MODE_SIZE (xmode) > UNITS_PER_WORD) + { + HOST_WIDE_INT xsize = GET_MODE_SIZE (xmode); + HOST_WIDE_INT ysize = GET_MODE_SIZE (ymode); + HOST_WIDE_INT off_low = offset & (ysize - 1); + HOST_WIDE_INT off_high = offset & ~(ysize - 1); + offset = (xsize - ysize - off_high) | off_low; + } /* The XMODE value can be seen as a vector of NREGS_XMODE values. The subreg must represent a lowpart of given field. Compute what field it is. */ |