Add support for large prefixed address in adjusting a vector address.
authorMichael Meissner <meissner@linux.ibm.com>
Tue, 7 Jan 2020 01:29:12 +0000 (01:29 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Tue, 7 Jan 2020 01:29:12 +0000 (01:29 +0000)
2020-01-06  Michael Meissner  <meissner@linux.ibm.com>

* config/rs6000/rs6000.c (rs6000_adjust_vec_address): Add support
for the offset being 34-bits when -mcpu=future is used.

From-SVN: r279937

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 1ba98e4d3ea45005ce53aef6cf9514668a7f0737..b2e6d8504b565cd98e34e89d9514b727f2d415fe 100644 (file)
@@ -1,3 +1,8 @@
+2020-01-06  Michael Meissner  <meissner@linux.ibm.com>
+
+       * config/rs6000/rs6000.c (rs6000_adjust_vec_address): Add support
+       for the offset being 34-bits when -mcpu=future is used.
+
 2020-01-06  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/pa/pa.md: Revert change to use ordered_comparison_operator
index 3011e2d9375ad08445403d621a0df593d0ab52dd..64b40a474499604cf245ab267fd35de2197ea542 100644 (file)
@@ -6797,11 +6797,19 @@ rs6000_adjust_vec_address (rtx scalar_reg,
          HOST_WIDE_INT offset = INTVAL (op1) + INTVAL (element_offset);
          rtx offset_rtx = GEN_INT (offset);
 
-         if (IN_RANGE (offset, -32768, 32767)
+         /* 16-bit offset.  */
+         if (SIGNED_INTEGER_16BIT_P (offset)
              && (scalar_size < 8 || (offset & 0x3) == 0))
            new_addr = gen_rtx_PLUS (Pmode, op0, offset_rtx);
+
+         /* 34-bit offset if we have prefixed addresses.  */
+         else if (TARGET_PREFIXED_ADDR && SIGNED_INTEGER_34BIT_P (offset))
+           new_addr = gen_rtx_PLUS (Pmode, op0, offset_rtx);
+
          else
            {
+             /* Offset overflowed, move offset to the temporary (which will
+                likely be split), and do X-FORM addressing.  */
              emit_move_insn (base_tmp, offset_rtx);
              new_addr = gen_rtx_PLUS (Pmode, op0, base_tmp);
            }
@@ -6830,6 +6838,12 @@ rs6000_adjust_vec_address (rtx scalar_reg,
              emit_insn (insn);
            }
 
+         /* Make sure we don't overwrite the temporary if the element being
+            extracted is variable, and we've put the offset into base_tmp
+            previously.  */
+         else if (reg_mentioned_p (base_tmp, element_offset))
+           emit_insn (gen_add2_insn (base_tmp, op1));
+
          else
            {
              emit_move_insn (base_tmp, op1);