From: feedable <[email protected]>

ix86_split_long_move is using parts of the the operands array that are not
set by the recog machionery as storage space, which makes the logic confusing
and also interferes with making the operand count dynamic.

Use local arrays instead.

gcc/ChangeLog:

        * config/i386/i386-expand.cc (ix86_split_to_parts): Use automatic
        storage for temporaries.
        (ix86_split_long_move): Likewise.
        * config/i386/i386.md: Likewise.
---
 gcc/config/i386/i386-expand.cc |  26 ++++----
 gcc/config/i386/i386.md        | 113 ++++++++++++++++-----------------
 2 files changed, 69 insertions(+), 70 deletions(-)

diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index 34c9599f928e6..8f42297263d3c 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -6420,8 +6420,7 @@ ix86_split_to_parts (rtx operand, rtx *parts, 
machine_mode mode)
 
 /* Emit insns to perform a move or push of DI, DF, XF, and TF values.
    Return false when normal moves are needed; true when all required
-   insns have been emitted.  Operands 2-4 contain the input values
-   int the correct order; operands 5-7 contain the output values.  */
+   insns have been emitted.  */
 
 void
 ix86_split_long_move (rtx operands[])
@@ -6602,6 +6601,7 @@ ix86_split_long_move (rtx operands[])
       return;
     }
 
+  rtx move_src[4], move_dst[4];
   /* Choose correct order to not overwrite the source before it is copied.  */
   if ((REG_P (part[0][0])
        && REG_P (part[1][1])
@@ -6615,31 +6615,31 @@ ix86_split_long_move (rtx operands[])
     {
       for (i = 0, j = nparts - 1; i < nparts; i++, j--)
        {
-         operands[2 + i] = part[0][j];
-         operands[6 + i] = part[1][j];
+         move_src[i] = part[0][j];
+         move_dst[i] = part[1][j];
        }
     }
   else
     {
       for (i = 0; i < nparts; i++)
        {
-         operands[2 + i] = part[0][i];
-         operands[6 + i] = part[1][i];
+         move_src[i] = part[0][i];
+         move_dst[i] = part[1][i];
        }
     }
 
   /* Attempt to locally unCSE nonzero constants.  */
   for (j = 0; j < nparts - 1; j++)
-    if (CONST_INT_P (operands[6 + j])
-       && operands[6 + j] != const0_rtx
-       && REG_P (operands[2 + j]))
+    if (CONST_INT_P (move_dst[j])
+       && move_dst[j] != const0_rtx
+       && REG_P (move_src[j]))
       for (i = j; i < nparts - 1; i++)
-       if (CONST_INT_P (operands[7 + i])
-           && INTVAL (operands[7 + i]) == INTVAL (operands[6 + j]))
-         operands[7 + i] = operands[2 + j];
+       if (CONST_INT_P (move_dst[1 + i])
+           && INTVAL (move_dst[1 + i]) == INTVAL (move_dst[j]))
+         move_dst[1 + i] = move_src[j];
 
   for (i = 0; i < nparts; i++)
-    emit_move_insn (operands[2 + i], operands[6 + i]);
+    emit_move_insn (move_src[i], move_dst[i]);
 
   return;
 }
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 4e18797743f48..63f744daab63e 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -3779,8 +3779,8 @@
   "&& reload_completed"
   [(const_int 0)]
 {
-  operands[4] = gen_lowpart (DImode, operands[1]);
-  split_double_concat (TImode, operands[0], operands[4], operands[2]);
+  rtx temp = gen_lowpart (DImode, operands[1]);
+  split_double_concat (TImode, operands[0], temp, operands[2]);
   DONE;
 })
 
@@ -3801,8 +3801,8 @@
   "&& reload_completed"
   [(const_int 0)]
 {
-  operands[4] = gen_highpart (DImode, operands[1]);
-  split_double_concat (TImode, operands[0], operands[2], operands[4]);
+  rtx temp = gen_highpart (DImode, operands[1]);
+  split_double_concat (TImode, operands[0], operands[2], temp);
   DONE;
 })
 
@@ -3821,8 +3821,8 @@
   "&& reload_completed"
   [(const_int 0)]
 {
-  operands[4] = gen_highpart (SImode, operands[1]);
-  split_double_concat (DImode, operands[0], operands[2], operands[4]);
+  rtx temp = gen_highpart (SImode, operands[1]);
+  split_double_concat (DImode, operands[0], operands[2], temp);
   DONE;
 })
 
@@ -5117,10 +5117,11 @@
   [(const_int 0)]
 {
   rtx bits = GEN_INT (<MODE_SIZE> * BITS_PER_UNIT - 1);
+  rtx lowpart, highpart;
 
-  split_double_mode (<DWI>mode, &operands[0], 1, &operands[3], &operands[4]);
+  split_double_mode (<DWI>mode, &operands[0], 1, &lowpart, &highpart);
 
-  emit_move_insn (operands[3], operands[1]);
+  emit_move_insn (lowpart, operands[1]);
 
   /* Generate a cltd if possible and doing so it profitable.  */
   if ((optimize_function_for_size_p (cfun) || TARGET_USE_CLTD)
@@ -5134,7 +5135,7 @@
       emit_move_insn (operands[2], operands[1]);
       emit_insn (gen_ashr<mode>3_cvt (operands[2], operands[2], bits));
     }
-  emit_move_insn (operands[4], operands[2]);
+  emit_move_insn (highpart, operands[2]);
   DONE;
 })
 
@@ -5191,29 +5192,30 @@
   [(const_int 0)]
 {
   rtx bits = GEN_INT (<MODE_SIZE> * BITS_PER_UNIT - 1);
+  rtx lowpart, highpart;
 
-  split_double_mode (<DWI>mode, &operands[0], 1, &operands[3], &operands[4]);
+  split_double_mode (<DWI>mode, &operands[0], 1, &lowpart, &highpart);
 
-  if (REGNO (operands[3]) != REGNO (operands[1]))
-    emit_move_insn (operands[3], operands[1]);
+  if (REGNO (lowpart) != REGNO (operands[1]))
+    emit_move_insn (lowpart, operands[1]);
 
   rtx src = operands[1];
-  if (REGNO (operands[3]) == AX_REG)
-    src = operands[3];
+  if (REGNO (lowpart) == AX_REG)
+    src = lowpart;
 
   /* Generate a cltd if possible and doing so it profitable.  */
   if ((optimize_function_for_size_p (cfun) || TARGET_USE_CLTD)
       && REGNO (src) == AX_REG
-      && REGNO (operands[4]) == DX_REG)
+      && REGNO (highpart) == DX_REG)
     {
-      emit_insn (gen_ashr<mode>3_cvt (operands[4], src, bits));
+      emit_insn (gen_ashr<mode>3_cvt (highpart, src, bits));
       DONE;
     }
 
-  if (REGNO (operands[4]) != REGNO (operands[1]))
-    emit_move_insn (operands[4], operands[1]);
+  if (REGNO (highpart) != REGNO (operands[1]))
+    emit_move_insn (highpart, operands[1]);
 
-  emit_insn (gen_ashr<mode>3_cvt (operands[4], operands[4], bits));
+  emit_insn (gen_ashr<mode>3_cvt (highpart, highpart, bits));
   DONE;
 })
 
@@ -6317,16 +6319,16 @@
        || TARGET_AVX512VL)"
   [(const_int 0)]
 {
-  operands[3] = lowpart_subreg (<ssevecmode>mode, operands[0], <MODE>mode);
-  operands[4] = lowpart_subreg (V4SImode, operands[0], <MODE>mode);
+  rtx lowpart_sse = lowpart_subreg (<ssevecmode>mode, operands[0], <MODE>mode);
+  rtx lowpart_v4si = lowpart_subreg (V4SImode, operands[0], <MODE>mode);
 
-  emit_insn (gen_sse2_loadld (operands[4],
+  emit_insn (gen_sse2_loadld (lowpart_v4si,
                              CONST0_RTX (V4SImode), operands[1]));
 
   if (<ssevecmode>mode == V4SFmode)
-    emit_insn (gen_floatv4siv4sf2 (operands[3], operands[4]));
+    emit_insn (gen_floatv4siv4sf2 (lowpart_sse, lowpart_v4si));
   else
-    emit_insn (gen_sse2_cvtdq2pd (operands[3], operands[4]));
+    emit_insn (gen_sse2_cvtdq2pd (lowpart_sse, lowpart_v4si));
   DONE;
 })
 
@@ -13330,32 +13332,32 @@
   [(const_int:DWIH 0)]
 {
   bool emit_insn_deleted_note_p = false;
+  rtx lowpart[3], highpart[3];
+  split_double_mode (<DWI>mode, &operands[0], 3, lowpart, highpart);
 
-  split_double_mode (<DWI>mode, &operands[0], 3, &operands[0], &operands[3]);
-
-  if (operands[2] == const0_rtx)
-    emit_move_insn (operands[0], const0_rtx);
-  else if (operands[2] == constm1_rtx)
+  if (lowpart[2] == const0_rtx)
+    emit_move_insn (lowpart[0], const0_rtx);
+  else if (lowpart[2] == constm1_rtx)
     {
-      if (!rtx_equal_p (operands[0], operands[1]))
-       emit_move_insn (operands[0], operands[1]);
+      if (!rtx_equal_p (lowpart[0], lowpart[1]))
+       emit_move_insn (lowpart[0], lowpart[1]);
       else
        emit_insn_deleted_note_p = true;
     }
   else
-    ix86_expand_binary_operator (AND, <MODE>mode, &operands[0], 
TARGET_APX_NDD);
+    ix86_expand_binary_operator (AND, <MODE>mode, &lowpart[0], TARGET_APX_NDD);
 
-  if (operands[5] == const0_rtx)
-    emit_move_insn (operands[3], const0_rtx);
-  else if (operands[5] == constm1_rtx)
+  if (highpart[2] == const0_rtx)
+    emit_move_insn (highpart[0], const0_rtx);
+  else if (highpart[2] == constm1_rtx)
     {
-      if (!rtx_equal_p (operands[3], operands[4]))
-       emit_move_insn (operands[3], operands[4]);
+      if (!rtx_equal_p (highpart[0], highpart[1]))
+       emit_move_insn (highpart[0], highpart[1]);
       else if (emit_insn_deleted_note_p)
        emit_note (NOTE_INSN_DELETED);
     }
   else
-    ix86_expand_binary_operator (AND, <MODE>mode, &operands[3], 
TARGET_APX_NDD);
+    ix86_expand_binary_operator (AND, <MODE>mode, &highpart[0], 
TARGET_APX_NDD);
 
   DONE;
 }
@@ -14388,45 +14390,42 @@
      and operands[0] == operands[1], which requires a NOTE_INSN_DELETED.  */
   bool emit_insn_deleted_note_p = false;
 
-  split_double_mode (<DWI>mode, &operands[0], 3, &operands[0], &operands[3]);
+  rtx lowpart[3], highpart[3];
+  split_double_mode (<DWI>mode, &operands[0], 3, lowpart, highpart);
 
-  if (operands[2] == const0_rtx)
+  if (lowpart[2] == const0_rtx)
     {
-      if (!rtx_equal_p (operands[0], operands[1]))
-       emit_move_insn (operands[0], operands[1]);
+      if (!rtx_equal_p (lowpart[0], lowpart[1]))
+       emit_move_insn (lowpart[0], lowpart[1]);
       else
        emit_insn_deleted_note_p = true;
     }
-  else if (operands[2] == constm1_rtx)
+  else if (lowpart[2] == constm1_rtx)
     {
       if (<CODE> == IOR)
-       emit_move_insn (operands[0], constm1_rtx);
+       emit_move_insn (lowpart[0], constm1_rtx);
       else
-       ix86_expand_unary_operator (NOT, <MODE>mode, &operands[0],
-                                   TARGET_APX_NDD);
+       ix86_expand_unary_operator (NOT, <MODE>mode, lowpart, TARGET_APX_NDD);
     }
   else
-    ix86_expand_binary_operator (<CODE>, <MODE>mode, &operands[0],
-                                TARGET_APX_NDD);
+    ix86_expand_binary_operator (<CODE>, <MODE>mode, lowpart, TARGET_APX_NDD);
 
-  if (operands[5] == const0_rtx)
+  if (highpart[2] == const0_rtx)
     {
-      if (!rtx_equal_p (operands[3], operands[4]))
-       emit_move_insn (operands[3], operands[4]);
+      if (!rtx_equal_p (highpart[0], highpart[1]))
+       emit_move_insn (highpart[0], highpart[1]);
       else if (emit_insn_deleted_note_p)
        emit_note (NOTE_INSN_DELETED);
     }
-  else if (operands[5] == constm1_rtx)
+  else if (highpart[2] == constm1_rtx)
     {
       if (<CODE> == IOR)
-       emit_move_insn (operands[3], constm1_rtx);
+       emit_move_insn (highpart[0], constm1_rtx);
       else
-       ix86_expand_unary_operator (NOT, <MODE>mode, &operands[3],
-                                   TARGET_APX_NDD);
+       ix86_expand_unary_operator (NOT, <MODE>mode, highpart, TARGET_APX_NDD);
     }
   else
-    ix86_expand_binary_operator (<CODE>, <MODE>mode, &operands[3],
-                                TARGET_APX_NDD);
+    ix86_expand_binary_operator (<CODE>, <MODE>mode, highpart, TARGET_APX_NDD);
 
   DONE;
 }
-- 
2.54.0

Reply via email to