Improve costs for DImode shifts of interger constants.
authorJohn David Anglin <danglin@gcc.gnu.org>
Sun, 13 Sep 2020 18:47:59 +0000 (18:47 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Sun, 13 Sep 2020 18:47:59 +0000 (18:47 +0000)
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

index a9223ab3fe94dec79c0fe12dff326bde22375f5c..210e44f76601fb19f93f2773ad12a896eb3b1280 100644 (file)
@@ -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