Make more use of byte_lowpart_offset
authorRichard Sandiford <richard.sandiford@linaro.org>
Fri, 13 Oct 2017 09:32:29 +0000 (09:32 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 13 Oct 2017 09:32:29 +0000 (09:32 +0000)
This patch uses byte_lowpart_offset in places that open-coded the
calculation.

2017-10-13  Richard Sandiford  <richard.sandiford@linaro.org>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

gcc/
* caller-save.c (replace_reg_with_saved_mem): Use byte_lowpart_offset.
* combine.c (gen_lowpart_for_combine): Likewise.
* dwarf2out.c (rtl_for_decl_location): Likewise.
* final.c (alter_subreg): Likewise.
* rtlhooks.c (gen_lowpart_general): Likewise.
(gen_lowpart_if_possible): Likewise.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r253714

gcc/ChangeLog
gcc/caller-save.c
gcc/combine.c
gcc/dwarf2out.c
gcc/final.c
gcc/rtlhooks.c

index dc2d911e2c5304ea16c0b9f36ef7eda8b8678c52..bdb6bccdb5c35ceed70294145c3901b83e351a81 100644 (file)
@@ -1,3 +1,14 @@
+2017-10-13  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * caller-save.c (replace_reg_with_saved_mem): Use byte_lowpart_offset.
+       * combine.c (gen_lowpart_for_combine): Likewise.
+       * dwarf2out.c (rtl_for_decl_location): Likewise.
+       * final.c (alter_subreg): Likewise.
+       * rtlhooks.c (gen_lowpart_general): Likewise.
+       (gen_lowpart_if_possible): Likewise.
+
 2017-10-13  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 3ea8e29a09de76673fff75ec467aa5083e682567..7c787f751634fbb710df5e18426952d5f2b75cd7 100644 (file)
@@ -1132,17 +1132,7 @@ replace_reg_with_saved_mem (rtx *loc,
        {
          /* This is gen_lowpart_if_possible(), but without validating
             the newly-formed address.  */
-         int offset = 0;
-
-         if (WORDS_BIG_ENDIAN)
-           offset = (MAX (GET_MODE_SIZE (GET_MODE (mem)), UNITS_PER_WORD)
-                     - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
-         if (BYTES_BIG_ENDIAN)
-           /* Adjust the address so that the address-after-the-data is
-              unchanged.  */
-           offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
-                      - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (mem))));
-
+         HOST_WIDE_INT offset = byte_lowpart_offset (mode, GET_MODE (mem));
          mem = adjust_address_nv (mem, mode, offset);
        }
     }
index b89ee6da345b2f0db90d12ee79905d39ac0b5046..4d2f79b3d71f8be697467983884e1f1ff604c082 100644 (file)
@@ -11618,8 +11618,6 @@ gen_lowpart_for_combine (machine_mode omode, rtx x)
 
   if (MEM_P (x))
     {
-      int offset = 0;
-
       /* Refuse to work on a volatile memory ref or one with a mode-dependent
         address.  */
       if (MEM_VOLATILE_P (x)
@@ -11632,14 +11630,7 @@ gen_lowpart_for_combine (machine_mode omode, rtx x)
       if (paradoxical_subreg_p (omode, imode))
        return gen_rtx_SUBREG (omode, x, 0);
 
-      if (WORDS_BIG_ENDIAN)
-       offset = MAX (isize, UNITS_PER_WORD) - MAX (osize, UNITS_PER_WORD);
-
-      /* Adjust the address so that the address-after-the-data is
-        unchanged.  */
-      if (BYTES_BIG_ENDIAN)
-       offset -= MIN (UNITS_PER_WORD, osize) - MIN (UNITS_PER_WORD, isize);
-
+      HOST_WIDE_INT offset = byte_lowpart_offset (omode, imode);
       return adjust_address_nv (x, omode, offset);
     }
 
index 528c1852e5de6d0155c281830ce8a16ecac029a6..beab5e4ce8e881d31e541402a40ae75c8a76a491 100644 (file)
@@ -19077,12 +19077,11 @@ rtl_for_decl_location (tree decl)
   else if (VAR_P (decl)
           && rtl
           && MEM_P (rtl)
-          && GET_MODE (rtl) != TYPE_MODE (TREE_TYPE (decl))
-          && BYTES_BIG_ENDIAN)
+          && GET_MODE (rtl) != TYPE_MODE (TREE_TYPE (decl)))
     {
       machine_mode addr_mode = get_address_mode (rtl);
-      int rsize = GET_MODE_SIZE (GET_MODE (rtl));
-      int dsize = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl)));
+      HOST_WIDE_INT offset = byte_lowpart_offset (TYPE_MODE (TREE_TYPE (decl)),
+                                                 GET_MODE (rtl));
 
       /* If a variable is declared "register" yet is smaller than
         a register, then if we store the variable to memory, it
@@ -19090,10 +19089,9 @@ rtl_for_decl_location (tree decl)
         fact we are not.  We need to adjust the offset of the
         storage location to reflect the actual value's bytes,
         else gdb will not be able to display it.  */
-      if (rsize > dsize)
+      if (offset != 0)
        rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (decl)),
-                          plus_constant (addr_mode, XEXP (rtl, 0),
-                                         rsize - dsize));
+                          plus_constant (addr_mode, XEXP (rtl, 0), offset));
     }
 
   /* A variable with no DECL_RTL but a DECL_INITIAL is a compile-time constant,
index eff2ee6c4966e2f7e48fd355c09a594c1b7ff02f..0ddf7793209bc6ede4e1723dd192a42cb458a475 100644 (file)
@@ -3199,14 +3199,7 @@ alter_subreg (rtx *xp, bool final_p)
       /* For paradoxical subregs on big-endian machines, SUBREG_BYTE
         contains 0 instead of the proper offset.  See simplify_subreg.  */
       if (paradoxical_subreg_p (x))
-        {
-          int difference = GET_MODE_SIZE (GET_MODE (y))
-                          - GET_MODE_SIZE (GET_MODE (x));
-          if (WORDS_BIG_ENDIAN)
-            offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
-          if (BYTES_BIG_ENDIAN)
-            offset += difference % UNITS_PER_WORD;
-        }
+       offset = byte_lowpart_offset (GET_MODE (x), GET_MODE (y));
 
       if (final_p)
        *xp = adjust_address (y, GET_MODE (x), offset);
index 4d04ebd0c4716a7e7610448bb55ed39db02e8b02..d20815e255b712b7dabf53a39ef90e6e75569d56 100644 (file)
@@ -59,8 +59,6 @@ gen_lowpart_general (machine_mode mode, rtx x)
     }
   else
     {
-      int offset = 0;
-
       /* The only additional case we can do is MEM.  */
       gcc_assert (MEM_P (x));
 
@@ -72,16 +70,7 @@ gen_lowpart_general (machine_mode mode, rtx x)
          && !reload_completed)
        return gen_lowpart_general (mode, force_reg (xmode, x));
 
-      if (WORDS_BIG_ENDIAN)
-       offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
-                 - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
-
-      if (BYTES_BIG_ENDIAN)
-       /* Adjust the address so that the address-after-the-data
-          is unchanged.  */
-       offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
-                  - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
-
+      HOST_WIDE_INT offset = byte_lowpart_offset (mode, GET_MODE (x));
       return adjust_address (x, mode, offset);
     }
 }
@@ -126,19 +115,8 @@ gen_lowpart_if_possible (machine_mode mode, rtx x)
   else if (MEM_P (x))
     {
       /* This is the only other case we handle.  */
-      int offset = 0;
-      rtx new_rtx;
-
-      if (WORDS_BIG_ENDIAN)
-       offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
-                 - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
-      if (BYTES_BIG_ENDIAN)
-       /* Adjust the address so that the address-after-the-data is
-          unchanged.  */
-       offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
-                  - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
-
-      new_rtx = adjust_address_nv (x, mode, offset);
+      HOST_WIDE_INT offset = byte_lowpart_offset (mode, GET_MODE (x));
+      rtx new_rtx = adjust_address_nv (x, mode, offset);
       if (! memory_address_addr_space_p (mode, XEXP (new_rtx, 0),
                                         MEM_ADDR_SPACE (x)))
        return 0;