]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: altivec.md (*altivec_lvx_<mode>_internal): Remove asterisk from name so...
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Sat, 25 Apr 2015 02:09:07 +0000 (02:09 +0000)
committerWilliam Schmidt <wschmidt@gcc.gnu.org>
Sat, 25 Apr 2015 02:09:07 +0000 (02:09 +0000)
2015-04-24  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

Backport from mainline r222385
2015-04-23  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

* config/rs6000/altivec.md (*altivec_lvx_<mode>_internal): Remove
asterisk from name so this can be generated directly.
(*altivec_stvx_<mode>_internal): Likewise.
* config/rs6000/rs6000.c (rs6000_emit_le_vsx_store): Add assert
that this is never called during or after reload/lra.
(rs6000_frame_related): Remove split_reg
argument and logic that references it.
(emit_frame_save): Remove last parameter from call to
rs6000_frame_related.
(rs6000_emit_prologue): Remove last parameter from eight calls to
rs6000_frame_related.  Force generation of stvx instruction for
Altivec register saves.  Remove split_reg handling, which is no
longer needed.
(rs6000_emit_epilogue):  Force generation of lvx instruction for
Altivec register restores.

From-SVN: r222439

gcc/ChangeLog
gcc/config/rs6000/altivec.md
gcc/config/rs6000/rs6000.c

index 4d60a7d25e69a450d57563df144b4358f7ebb2c3..fa72ba183bb6e9b8b266fbdf9e4d72b8b1e887ca 100644 (file)
@@ -1,3 +1,24 @@
+2015-04-24  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       Backport from mainline r222385
+       2015-04-23  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       * config/rs6000/altivec.md (*altivec_lvx_<mode>_internal): Remove
+       asterisk from name so this can be generated directly.
+       (*altivec_stvx_<mode>_internal): Likewise.
+       * config/rs6000/rs6000.c (rs6000_emit_le_vsx_store): Add assert
+       that this is never called during or after reload/lra.
+       (rs6000_frame_related): Remove split_reg
+       argument and logic that references it.
+       (emit_frame_save): Remove last parameter from call to
+       rs6000_frame_related.
+       (rs6000_emit_prologue): Remove last parameter from eight calls to
+       rs6000_frame_related.  Force generation of stvx instruction for
+       Altivec register saves.  Remove split_reg handling, which is no
+       longer needed.
+       (rs6000_emit_epilogue):  Force generation of lvx instruction for
+       Altivec register restores.
+
 2015-04-24  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        Backport from mainline
index 697057f73f14d9281b7d0f6404de0fcbfe1481c1..532c452665a65bd4b36bb7f862123ee500932bb0 100644 (file)
     }
 })
 
-(define_insn "*altivec_lvx_<mode>_internal"
+(define_insn "altivec_lvx_<mode>_internal"
   [(parallel
     [(set (match_operand:VM2 0 "register_operand" "=v")
          (match_operand:VM2 1 "memory_operand" "Z"))
     }
 })
 
-(define_insn "*altivec_stvx_<mode>_internal"
+(define_insn "altivec_stvx_<mode>_internal"
   [(parallel
     [(set (match_operand:VM2 0 "memory_operand" "=Z")
          (match_operand:VM2 1 "register_operand" "v"))
index 29683f4b796fbc5dc04a6b1dcc0132237c4f5c6c..a6058b4b47b9ca2be0a445bd945211add2a521db 100644 (file)
@@ -8254,6 +8254,11 @@ rs6000_emit_le_vsx_store (rtx dest, rtx source, enum machine_mode mode)
 {
   rtx tmp, permute_src, permute_tmp;
 
+  /* This should never be called during or after reload, because it does
+     not re-permute the source register.  It is intended only for use
+     during expand.  */
+  gcc_assert (!reload_in_progress && !lra_in_progress && !reload_completed);
+
   /* Use V2DImode to do swaps of types with 128-bit scalare parts (TImode,
      V1TImode).  */
   if (mode == TImode || mode == V1TImode)
@@ -22427,7 +22432,7 @@ output_probe_stack_range (rtx reg1, rtx reg2)
 
 static rtx
 rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
-                     rtx reg2, rtx rreg, rtx split_reg)
+                     rtx reg2, rtx rreg)
 {
   rtx real, temp;
 
@@ -22518,11 +22523,6 @@ rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
          }
     }
 
-  /* If a store insn has been split into multiple insns, the
-     true source register is given by split_reg.  */
-  if (split_reg != NULL_RTX)
-    real = gen_rtx_SET (VOIDmode, SET_DEST (real), split_reg);
-
   RTX_FRAME_RELATED_P (insn) = 1;
   add_reg_note (insn, REG_FRAME_RELATED_EXPR, real);
 
@@ -22630,7 +22630,7 @@ emit_frame_save (rtx frame_reg, enum machine_mode mode,
   reg = gen_rtx_REG (mode, regno);
   insn = emit_insn (gen_frame_store (reg, frame_reg, offset));
   return rs6000_frame_related (insn, frame_reg, frame_reg_to_sp,
-                              NULL_RTX, NULL_RTX, NULL_RTX);
+                              NULL_RTX, NULL_RTX);
 }
 
 /* Emit an offset memory reference suitable for a frame store, while
@@ -23199,7 +23199,7 @@ rs6000_emit_prologue (void)
 
       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
       rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
-                           treg, GEN_INT (-info->total_size), NULL_RTX);
+                           treg, GEN_INT (-info->total_size));
       sp_off = frame_off = info->total_size;
     }
 
@@ -23284,7 +23284,7 @@ rs6000_emit_prologue (void)
 
          insn = emit_move_insn (mem, reg);
          rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
-                               NULL_RTX, NULL_RTX, NULL_RTX);
+                               NULL_RTX, NULL_RTX);
          END_USE (0);
        }
     }
@@ -23340,7 +23340,7 @@ rs6000_emit_prologue (void)
                                     info->lr_save_offset,
                                     DFmode, sel);
       rs6000_frame_related (insn, ptr_reg, sp_off,
-                           NULL_RTX, NULL_RTX, NULL_RTX);
+                           NULL_RTX, NULL_RTX);
       if (lr)
        END_USE (0);
     }
@@ -23419,7 +23419,7 @@ rs6000_emit_prologue (void)
                                         SAVRES_SAVE | SAVRES_GPR);
 
          rs6000_frame_related (insn, spe_save_area_ptr, sp_off - save_off,
-                               NULL_RTX, NULL_RTX, NULL_RTX);
+                               NULL_RTX, NULL_RTX);
        }
 
       /* Move the static chain pointer back.  */
@@ -23469,7 +23469,7 @@ rs6000_emit_prologue (void)
                                     info->lr_save_offset + ptr_off,
                                     reg_mode, sel);
       rs6000_frame_related (insn, ptr_reg, sp_off - ptr_off,
-                           NULL_RTX, NULL_RTX, NULL_RTX);
+                           NULL_RTX, NULL_RTX);
       if (lr)
        END_USE (0);
     }
@@ -23485,7 +23485,7 @@ rs6000_emit_prologue (void)
                             info->gp_save_offset + frame_off + reg_size * i);
       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
       rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
-                           NULL_RTX, NULL_RTX, NULL_RTX);
+                           NULL_RTX, NULL_RTX);
     }
   else if (!WORLD_SAVE_P (info))
     {
@@ -23808,7 +23808,7 @@ rs6000_emit_prologue (void)
                                     info->altivec_save_offset + ptr_off,
                                     0, V4SImode, SAVRES_SAVE | SAVRES_VR);
       rs6000_frame_related (insn, scratch_reg, sp_off - ptr_off,
-                           NULL_RTX, NULL_RTX, NULL_RTX);
+                           NULL_RTX, NULL_RTX);
       if (REGNO (frame_reg_rtx) == REGNO (scratch_reg))
        {
          /* The oddity mentioned above clobbered our frame reg.  */
@@ -23824,7 +23824,7 @@ rs6000_emit_prologue (void)
       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
        if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
          {
-           rtx areg, savereg, mem, split_reg;
+           rtx areg, savereg, mem;
            int offset;
 
            offset = (info->altivec_save_offset + frame_off
@@ -23840,20 +23840,13 @@ rs6000_emit_prologue (void)
            mem = gen_frame_mem (V4SImode,
                                 gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
 
-           insn = emit_move_insn (mem, savereg);
-
-           /* When we split a VSX store into two insns, we need to make
-              sure the DWARF info knows which register we are storing.
-              Pass it in to be used on the appropriate note.  */
-           if (!BYTES_BIG_ENDIAN
-               && GET_CODE (PATTERN (insn)) == SET
-               && GET_CODE (SET_SRC (PATTERN (insn))) == VEC_SELECT)
-             split_reg = savereg;
-           else
-             split_reg = NULL_RTX;
+           /* Rather than emitting a generic move, force use of the stvx
+              instruction, which we always want.  In particular we don't
+              want xxpermdi/stxvd2x for little endian.  */
+           insn = emit_insn (gen_altivec_stvx_v4si_internal (mem, savereg));
 
            rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
-                                 areg, GEN_INT (offset), split_reg);
+                                 areg, GEN_INT (offset));
          }
     }
 
@@ -24495,7 +24488,10 @@ rs6000_emit_epilogue (int sibcall)
                mem = gen_frame_mem (V4SImode, addr);
 
                reg = gen_rtx_REG (V4SImode, i);
-               emit_move_insn (reg, mem);
+               /* Rather than emitting a generic move, force use of the
+                  lvx instruction, which we always want.  In particular
+                  we don't want lxvd2x/xxpermdi for little endian.  */
+               (void) emit_insn (gen_altivec_lvx_v4si_internal (reg, mem));
              }
        }
 
@@ -24693,7 +24689,10 @@ rs6000_emit_epilogue (int sibcall)
                mem = gen_frame_mem (V4SImode, addr);
 
                reg = gen_rtx_REG (V4SImode, i);
-               emit_move_insn (reg, mem);
+               /* Rather than emitting a generic move, force use of the
+                  lvx instruction, which we always want.  In particular
+                  we don't want lxvd2x/xxpermdi for little endian.  */
+               (void) emit_insn (gen_altivec_lvx_v4si_internal (reg, mem));
              }
        }