From 2fd157813c4964033e156ccb7df8889cd2afee99 Mon Sep 17 00:00:00 2001
From: John David Anglin <danglin@gcc.gnu.org>
Date: Sun, 13 Sep 2020 18:47:59 +0000
Subject: Improve costs for DImode shifts of interger constants.

2020-09-13  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
	* config/pa/pa.c (hppa_rtx_costs) [ASHIFT, ASHIFTRT, LSHIFTRT]:
	Provide accurate costs for DImode shifts of integer constants.
---
 gcc/config/pa/pa.c | 33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

(limited to 'gcc/config/pa')

diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index a9223ab..210e44f 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -1630,13 +1630,16 @@ hppa_rtx_costs (rtx x, machine_mode mode, int outer_code,
     case ASHIFT:
       if (mode == DImode)
 	{
-	  if (TARGET_64BIT)
-	    *total = COSTS_N_INSNS (3);
-	  else if (REG_P (XEXP (x, 0)) && CONST_INT_P (XEXP (x, 1)))
+	  if (REG_P (XEXP (x, 0)) && CONST_INT_P (XEXP (x, 1)))
 	    {
-	      *total = COSTS_N_INSNS (2);
+	      if (TARGET_64BIT)
+		*total = COSTS_N_INSNS (1);
+	      else
+		*total = COSTS_N_INSNS (2);
 	      return true;
 	    }
+	  else if (TARGET_64BIT)
+	    *total = COSTS_N_INSNS (3);
 	  else if (speed)
 	    *total = COSTS_N_INSNS (13);
 	  else
@@ -1661,13 +1664,16 @@ hppa_rtx_costs (rtx x, machine_mode mode, int outer_code,
     case ASHIFTRT:
       if (mode == DImode)
 	{
-	  if (TARGET_64BIT)
-	    *total = COSTS_N_INSNS (3);
-	  else if (REG_P (XEXP (x, 0)) && CONST_INT_P (XEXP (x, 1)))
+	  if (REG_P (XEXP (x, 0)) && CONST_INT_P (XEXP (x, 1)))
 	    {
-	      *total = COSTS_N_INSNS (2);
+	      if (TARGET_64BIT)
+		*total = COSTS_N_INSNS (1);
+	      else
+		*total = COSTS_N_INSNS (2);
 	      return true;
 	    }
+	  else if (TARGET_64BIT)
+	    *total = COSTS_N_INSNS (3);
 	  else if (speed)
 	    *total = COSTS_N_INSNS (14);
 	  else
@@ -1692,13 +1698,16 @@ hppa_rtx_costs (rtx x, machine_mode mode, int outer_code,
     case LSHIFTRT:
       if (mode == DImode)
 	{
-	  if (TARGET_64BIT)
-	    *total = COSTS_N_INSNS (2);
-	  else if (REG_P (XEXP (x, 0)) && CONST_INT_P (XEXP (x, 1)))
+	  if (REG_P (XEXP (x, 0)) && CONST_INT_P (XEXP (x, 1)))
 	    {
-	      *total = COSTS_N_INSNS (2);
+	      if (TARGET_64BIT)
+		*total = COSTS_N_INSNS (1);
+	      else
+		*total = COSTS_N_INSNS (2);
 	      return true;
 	    }
+	  else if (TARGET_64BIT)
+	    *total = COSTS_N_INSNS (2);
 	  else if (speed)
 	    *total = COSTS_N_INSNS (12);
 	  else
-- 
cgit v1.1