]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[NDS32] In nds32_valid_stack_push_pop_p(), we look into OP rtx to see if we indeed...
authorChung-Ju Wu <jasonwucj@gmail.com>
Wed, 3 Sep 2014 08:28:02 +0000 (08:28 +0000)
committerChung-Ju Wu <jasonwucj@gcc.gnu.org>
Wed, 3 Sep 2014 08:28:02 +0000 (08:28 +0000)
* config/nds32/nds32-predicates.c
(nds32_valid_stack_push_pop): Rename to ...
(nds32_valid_stack_push_pop_p): ... this.
* config/nds32/nds32-protos.h: Likewise.
* config/nds32/predicates.md: Likewise.

From-SVN: r214853

gcc/ChangeLog
gcc/config/nds32/nds32-predicates.c
gcc/config/nds32/nds32-protos.h
gcc/config/nds32/predicates.md

index e285da4efb6c4ec42db78a83ac5b90bc7996f088..f67e58db5d6a92d10321079375f78675b8b87af4 100644 (file)
@@ -1,3 +1,11 @@
+2014-09-03  Chung-Ju Wu  <jasonwucj@gmail.com>
+
+       * config/nds32/nds32-predicates.c
+       (nds32_valid_stack_push_pop): Rename to ...
+       (nds32_valid_stack_push_pop_p): ... this.
+       * config/nds32/nds32-protos.h: Likewise.
+       * config/nds32/predicates.md: Likewise.
+
 2014-09-03  Chung-Ju Wu  <jasonwucj@gmail.com>
 
        * config/nds32/nds32.c (nds32_gen_stack_v3push): Rename to ...
index 72cd739905fd57254e6fbd42c612e3ccede19ffb..374a1a8112420f87c9620883d0c87a8d7b599c0d 100644 (file)
@@ -173,12 +173,13 @@ nds32_valid_multiple_load_store (rtx op, bool load_p)
      3. The last element must be stack adjustment rtx.
    See the prologue/epilogue implementation for details.  */
 bool
-nds32_valid_stack_push_pop (rtx op, bool push_p)
+nds32_valid_stack_push_pop_p (rtx op, bool push_p)
 {
   int index;
   int total_count;
   int rest_count;
   int first_regno;
+  int save_fp, save_gp, save_lp;
   rtx elt;
   rtx elt_reg;
   rtx elt_mem;
@@ -234,14 +235,18 @@ nds32_valid_stack_push_pop (rtx op, bool push_p)
         The $sp adjustment rtx, $fp push rtx, $gp push rtx,
         and $lp push rtx are excluded.  */
 
+  /* Detect whether we have $fp, $gp, or $lp in the parallel rtx.  */
+  save_fp = reg_mentioned_p (gen_rtx_REG (SImode, FP_REGNUM), op);
+  save_gp = reg_mentioned_p (gen_rtx_REG (SImode, GP_REGNUM), op);
+  save_lp = reg_mentioned_p (gen_rtx_REG (SImode, LP_REGNUM), op);
   /* Exclude last $sp adjustment rtx.  */
   rest_count = total_count - 1;
   /* Exclude $fp, $gp, and $lp if they are in the parallel rtx.  */
-  if (cfun->machine->fp_size)
+  if (save_fp)
     rest_count--;
-  if (cfun->machine->gp_size)
+  if (save_gp)
     rest_count--;
-  if (cfun->machine->lp_size)
+  if (save_lp)
     rest_count--;
 
   if (rest_count > 0)
@@ -275,7 +280,7 @@ nds32_valid_stack_push_pop (rtx op, bool push_p)
 
   /* Check $fp/$gp/$lp one by one.
      We use 'push_p' to pick up reg rtx and mem rtx.  */
-  if (cfun->machine->fp_size)
+  if (save_fp)
     {
       elt = XVECEXP (op, 0, index);
       elt_mem = push_p ? SET_DEST (elt) : SET_SRC (elt);
@@ -287,7 +292,7 @@ nds32_valid_stack_push_pop (rtx op, bool push_p)
           || REGNO (elt_reg) != FP_REGNUM)
         return false;
     }
-  if (cfun->machine->gp_size)
+  if (save_gp)
     {
       elt = XVECEXP (op, 0, index);
       elt_mem = push_p ? SET_DEST (elt) : SET_SRC (elt);
@@ -299,7 +304,7 @@ nds32_valid_stack_push_pop (rtx op, bool push_p)
           || REGNO (elt_reg) != GP_REGNUM)
         return false;
     }
-  if (cfun->machine->lp_size)
+  if (save_lp)
     {
       elt = XVECEXP (op, 0, index);
       elt_mem = push_p ? SET_DEST (elt) : SET_SRC (elt);
index 57884256955fc72bad79137bf5c7eda7b90e6634..e2810163ec94bbe95eb1afd1392a428561860d2b 100644 (file)
@@ -80,7 +80,7 @@ extern bool nds32_valid_multiple_load_store (rtx, bool);
 
 /* Auxiliary functions for stack operation predicate checking.  */
 
-extern bool nds32_valid_stack_push_pop (rtx, bool);
+extern bool nds32_valid_stack_push_pop_p (rtx, bool);
 
 /* Auxiliary functions for bit operation detection.  */
 
index 0a40d68b8cf3cadc2186ee70966868f0c6bc6efe..6877187b5a17fb33dbb8f4bc050057e63c22cfe7 100644 (file)
   (match_code "parallel")
 {
   /* To verify 'push' operation, pass 'true' for the second argument.
-     See the implementation in nds32.c for details.  */
-  return nds32_valid_stack_push_pop (op, true);
+     See the implementation in nds32-predicates.c for details.  */
+  return nds32_valid_stack_push_pop_p (op, true);
 })
 
 (define_special_predicate "nds32_stack_pop_operation"
   (match_code "parallel")
 {
   /* To verify 'pop' operation, pass 'false' for the second argument.
-     See the implementation in nds32.c for details.  */
-  return nds32_valid_stack_push_pop (op, false);
+     See the implementation in nds32-predicates.c for details.  */
+  return nds32_valid_stack_push_pop_p (op, false);
 })
 
 ;; ------------------------------------------------------------------------