diff mbox

[PATCH/AARCH64v2,1/2] Factor out IF_THEN_ELSE case from aarch64_rtx_costs

Message ID 1401757517-13460-1-git-send-email-apinski@cavium.com
State New
Headers show

Commit Message

Andrew Pinski June 3, 2014, 1:05 a.m. UTC
This factors out the IF_THEN_ELSE from aarch64_rtx_costs as that function was getting too large.

OK?  Build and tested for aarch64-elf with no regressions.

Thanks,
Andrew Pinski

ChangeLog:
    * config/aarch64/aarch64.c (aarch64_if_then_else_costs): New function.
    (aarch64_rtx_costs): Use aarch64_if_then_else_costs.


---
 gcc/config/aarch64/aarch64.c |  126 ++++++++++++++++++++++--------------------
 1 files changed, 66 insertions(+), 60 deletions(-)

Comments

Marcus Shawcroft June 3, 2014, 8:34 a.m. UTC | #1
On 3 June 2014 02:05, Andrew Pinski <apinski@cavium.com> wrote:
> This factors out the IF_THEN_ELSE from aarch64_rtx_costs as that function was getting too large.
>
> OK?  Build and tested for aarch64-elf with no regressions.

OK, Thanks /Marcus
diff mbox

Patch

diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index bb33304..77a6706 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -4849,6 +4849,70 @@  aarch64_rtx_arith_op_extract_p (rtx x, enum machine_mode mode)
   return false;
 }
 
+/* Calculate the cost of calculating (if_then_else (OP0) (OP1) (OP2)),
+   storing it in *COST.  Result is true if the total cost of the operation
+   has now been calculated.  */
+static bool
+aarch64_if_then_else_costs (rtx op0, rtx op1, rtx op2, int *cost, bool speed)
+{
+  if (GET_CODE (op1) == PC || GET_CODE (op2) == PC)
+    {
+      /* Conditional branch.  */
+      if (GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
+	return true;
+      else
+	{
+	  if (GET_CODE (op0) == NE
+	      || GET_CODE (op0) == EQ)
+	    {
+	      rtx inner = XEXP (op0, 0);
+	      rtx comparator = XEXP (op0, 1);
+
+	      if (comparator == const0_rtx)
+		{
+		  /* TBZ/TBNZ/CBZ/CBNZ.  */
+		  if (GET_CODE (inner) == ZERO_EXTRACT)
+		    /* TBZ/TBNZ.  */
+		    *cost += rtx_cost (XEXP (inner, 0), ZERO_EXTRACT,
+			 	       0, speed);
+		else
+		  /* CBZ/CBNZ.  */
+		  *cost += rtx_cost (inner, GET_CODE (op0), 0, speed);
+
+	        return true;
+	      }
+	    }
+	  else if (GET_CODE (op0) == LT
+		   || GET_CODE (op0) == GE)
+	    {
+	      rtx comparator = XEXP (op0, 1);
+
+	      /* TBZ/TBNZ.  */
+	      if (comparator == const0_rtx)
+		return true;
+	    }
+	}
+    }
+  else if (GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
+    {
+      /* It's a conditional operation based on the status flags,
+	 so it must be some flavor of CSEL.  */
+
+      /* CSNEG, CSINV, and CSINC are handled for free as part of CSEL.  */
+      if (GET_CODE (op1) == NEG
+          || GET_CODE (op1) == NOT
+          || (GET_CODE (op1) == PLUS && XEXP (op1, 1) == const1_rtx))
+	op1 = XEXP (op1, 0);
+
+      *cost += rtx_cost (op1, IF_THEN_ELSE, 1, speed);
+      *cost += rtx_cost (op2, IF_THEN_ELSE, 2, speed);
+      return true;
+    }
+
+  /* We don't know what this is, cost all operands.  */
+  return false;
+}
+
 /* Calculate the cost of calculating X, storing it in *COST.  Result
    is true if the total cost of the operation has now been calculated.  */
 static bool
@@ -5583,66 +5647,8 @@  cost_plus:
       return false;  /* All arguments need to be in registers.  */
 
     case IF_THEN_ELSE:
-      op2 = XEXP (x, 2);
-      op0 = XEXP (x, 0);
-      op1 = XEXP (x, 1);
-
-      if (GET_CODE (op1) == PC || GET_CODE (op2) == PC)
-        {
-          /* Conditional branch.  */
-          if (GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
-	    return true;
-	  else
-	    {
-	      if (GET_CODE (op0) == NE
-		  || GET_CODE (op0) == EQ)
-		{
-		  rtx inner = XEXP (op0, 0);
-		  rtx comparator = XEXP (op0, 1);
-
-		  if (comparator == const0_rtx)
-		    {
-		      /* TBZ/TBNZ/CBZ/CBNZ.  */
-		      if (GET_CODE (inner) == ZERO_EXTRACT)
-			/* TBZ/TBNZ.  */
-			*cost += rtx_cost (XEXP (inner, 0), ZERO_EXTRACT,
-					   0, speed);
-		      else
-			/* CBZ/CBNZ.  */
-			*cost += rtx_cost (inner, GET_CODE (op0), 0, speed);
-
-		      return true;
-		    }
-		}
-	      else if (GET_CODE (op0) == LT
-		       || GET_CODE (op0) == GE)
-		{
-		  rtx comparator = XEXP (op0, 1);
-
-		  /* TBZ/TBNZ.  */
-		  if (comparator == const0_rtx)
-		    return true;
-		}
-	    }
-        }
-      else if (GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
-        {
-          /* It's a conditional operation based on the status flags,
-             so it must be some flavor of CSEL.  */
-
-          /* CSNEG, CSINV, and CSINC are handled for free as part of CSEL.  */
-          if (GET_CODE (op1) == NEG
-              || GET_CODE (op1) == NOT
-              || (GET_CODE (op1) == PLUS && XEXP (op1, 1) == const1_rtx))
-            op1 = XEXP (op1, 0);
-
-          *cost += rtx_cost (op1, IF_THEN_ELSE, 1, speed);
-          *cost += rtx_cost (op2, IF_THEN_ELSE, 2, speed);
-          return true;
-        }
-
-      /* We don't know what this is, cost all operands.  */
-      return false;
+      return aarch64_if_then_else_costs (XEXP (x, 0), XEXP (x, 1),
+					 XEXP (x, 2), cost, speed);
 
     case EQ:
     case NE: