public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH][AArch64] Handle fcvta[su] and frint in RTX cost function
@ 2014-07-10  7:53 Kyrill Tkachov
  2014-07-17 10:12 ` Marcus Shawcroft
  0 siblings, 1 reply; 2+ messages in thread
From: Kyrill Tkachov @ 2014-07-10  7:53 UTC (permalink / raw)
  To: GCC Patches; +Cc: Marcus Shawcroft, Richard Earnshaw

[-- Attachment #1: Type: text/plain, Size: 557 bytes --]

Hi all,

This patch adds rtx costing code for the round-to-integer instructions 
in AArch64.
Some of them are implemented as UNSPECs, so I've added the appropriate 
case to the big switch that can be
expanded upon to handle other unspecs in the future.
Tested aarch64-none-elf and bootstrapped on aarch64-none-linux-gnu.

Ok for trunk?

Thanks,
Kyrill


2014-07-10  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

     * config/aarch64/aarch64.c (aarch64_frint_unspec_p): New function.
     (aarch64_rtx_costs): Handle FIX, UNSIGNED_FIX, UNSPEC.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: aarch64-fix-frint-costs.patch --]
[-- Type: text/x-patch; name=aarch64-fix-frint-costs.patch, Size: 3157 bytes --]

commit 32fcdbfebf209ac3fce9af3b891e874feef1bdf7
Author: Kyrylo Tkachov <kyrylo.tkachov@arm.com>
Date:   Fri Jul 4 14:49:58 2014 +0100

    [AArch64] RTX costs for FIX and UNSIGNED_FIX

diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 3aba204..4b34dce 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -4841,6 +4841,25 @@ aarch64_rtx_arith_op_extract_p (rtx x, enum machine_mode mode)
   return false;
 }
 
+static bool
+aarch64_frint_unspec_p (unsigned int u)
+{
+  switch (u)
+    {
+      case UNSPEC_FRINTZ:
+      case UNSPEC_FRINTP:
+      case UNSPEC_FRINTM:
+      case UNSPEC_FRINTA:
+      case UNSPEC_FRINTN:
+      case UNSPEC_FRINTX:
+      case UNSPEC_FRINTI:
+        return true;
+
+      default:
+        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.  */
@@ -5021,7 +5040,7 @@ aarch64_rtx_costs (rtx x, int code, int outer ATTRIBUTE_UNUSED,
 	default:
 	  /* We can't make sense of this, assume default cost.  */
           *cost = COSTS_N_INSNS (1);
-	  break;
+	  return false;
 	}
       return false;
 
@@ -5719,6 +5738,29 @@ cost_plus:
 	*cost += extra_cost->fp[mode == DFmode].narrow;
       return false;
 
+    case FIX:
+    case UNSIGNED_FIX:
+      x = XEXP (x, 0);
+      /* Strip the rounding part.  They will all be implemented
+         by the fcvt* family of instructions anyway.  */
+      if (GET_CODE (x) == UNSPEC)
+        {
+          unsigned int uns_code = XINT (x, 1);
+
+          if (uns_code == UNSPEC_FRINTA
+              || uns_code == UNSPEC_FRINTM
+              || uns_code == UNSPEC_FRINTN
+              || uns_code == UNSPEC_FRINTP
+              || uns_code == UNSPEC_FRINTZ)
+            x = XVECEXP (x, 0, 0);
+        }
+
+      if (speed)
+        *cost += extra_cost->fp[GET_MODE (x) == DFmode].toint;
+
+      *cost += rtx_cost (x, (enum rtx_code) code, 0, speed);
+      return true;
+
     case ABS:
       if (GET_MODE_CLASS (mode) == MODE_FLOAT)
 	{
@@ -5748,6 +5790,17 @@ cost_plus:
 	}
       return false;
 
+    case UNSPEC:
+      /* The floating point round to integer frint* instructions.  */
+      if (aarch64_frint_unspec_p (XINT (x, 1)))
+        {
+          if (speed)
+            *cost += extra_cost->fp[mode == DFmode].roundint;
+
+          return false;
+        }
+      break;
+
     case TRUNCATE:
 
       /* Decompose <su>muldi3_highpart.  */
@@ -5782,13 +5835,14 @@ cost_plus:
 
       /* Fall through.  */
     default:
-      if (dump_file && (dump_flags & TDF_DETAILS))
-	fprintf (dump_file,
-		 "\nFailed to cost RTX.  Assuming default cost.\n");
-
-      return true;
+      break;
     }
-  return false;
+
+  if (dump_file && (dump_flags & TDF_DETAILS))
+    fprintf (dump_file,
+      "\nFailed to cost RTX.  Assuming default cost.\n");
+
+  return true;
 }
 
 /* Wrapper around aarch64_rtx_costs, dumps the partial, or total cost

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH][AArch64] Handle fcvta[su] and frint in RTX cost function
  2014-07-10  7:53 [PATCH][AArch64] Handle fcvta[su] and frint in RTX cost function Kyrill Tkachov
@ 2014-07-17 10:12 ` Marcus Shawcroft
  0 siblings, 0 replies; 2+ messages in thread
From: Marcus Shawcroft @ 2014-07-17 10:12 UTC (permalink / raw)
  To: Kyrill Tkachov; +Cc: GCC Patches

On 10 July 2014 08:52, Kyrill Tkachov <kyrylo.tkachov@arm.com> wrote:
> Hi all,
>
> This patch adds rtx costing code for the round-to-integer instructions in
> AArch64.
> Some of them are implemented as UNSPECs, so I've added the appropriate case
> to the big switch that can be
> expanded upon to handle other unspecs in the future.
> Tested aarch64-none-elf and bootstrapped on aarch64-none-linux-gnu.
>
> Ok for trunk?
>
> Thanks,
> Kyrill
>
>
> 2014-07-10  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
>
>     * config/aarch64/aarch64.c (aarch64_frint_unspec_p): New function.
>     (aarch64_rtx_costs): Handle FIX, UNSIGNED_FIX, UNSPEC.

OK Thanks /Marcus

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2014-07-17 10:10 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-07-10  7:53 [PATCH][AArch64] Handle fcvta[su] and frint in RTX cost function Kyrill Tkachov
2014-07-17 10:12 ` Marcus Shawcroft

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).