RISC-V: Increase mult/div cost if not implemented in hardware.
authorAndrew Waterman <andrew@sifive.com>
Tue, 16 Jan 2018 03:03:09 +0000 (03:03 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Tue, 16 Jan 2018 03:03:09 +0000 (19:03 -0800)
2018-01-15  Andrew Waterman  <andrew@sifive.com>
gcc/
* config/riscv/riscv.c (riscv_rtx_costs) <MULT>: Increase cost if
!TARGET_MUL.
<UDIV>: Increase cost if !TARGET_DIV.

From-SVN: r256722

gcc/ChangeLog
gcc/config/riscv/riscv.c

index b2acae1c1e15150badfbdfc04cf2111b4701a685..c4af56fc3400a072eac4381a33a51e79f0850ebf 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-15  Andrew Waterman  <andrew@sifive.com>
+
+       * config/riscv/riscv.c (riscv_rtx_costs) <MULT>: Increase cost if
+       !TARGET_MUL.
+       <UDIV>: Increase cost if !TARGET_DIV.
+
 2018-01-15  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * config/rs6000/rs6000.md (define_attr "type"): Remove delayed_cr.
index d260c0ebae148d4caaeca2c14c0251f073c4443f..19a01e0825a1926105cd9dd6e447905eb8bf840c 100644 (file)
@@ -1615,6 +1615,9 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN
     case MULT:
       if (float_mode_p)
        *total = tune_info->fp_mul[mode == DFmode];
+      else if (!TARGET_MUL)
+       /* Estimate the cost of a library call.  */
+       *total = COSTS_N_INSNS (speed ? 32 : 6);
       else if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
        *total = 3 * tune_info->int_mul[0] + COSTS_N_INSNS (2);
       else if (!speed)
@@ -1635,7 +1638,10 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN
 
     case UDIV:
     case UMOD:
-      if (speed)
+      if (!TARGET_DIV)
+       /* Estimate the cost of a library call.  */
+       *total = COSTS_N_INSNS (speed ? 32 : 6);
+      else if (speed)
        *total = tune_info->int_div[mode == DImode];
       else
        *total = COSTS_N_INSNS (1);