diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index d455aa52427..14ecbad5df4 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -497,7 +497,26 @@ rs6000_store_data_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
 
 /* Processor costs (relative to an add) */
 
-const struct processor_costs *rs6000_cost;
+struct processor_costs {
+  const int mulsi;	  /* cost of SImode multiplication.  */
+  const int mulsi_const;  /* cost of SImode multiplication by constant.  */
+  const int mulsi_const9; /* cost of SImode mult by short constant.  */
+  const int muldi;	  /* cost of DImode multiplication.  */
+  const int divsi;	  /* cost of SImode division.  */
+  const int divdi;	  /* cost of DImode division.  */
+  const int fp;		  /* cost of simple SFmode and DFmode insns.  */
+  const int dmul;	  /* cost of DFmode multiplication (and fmadd).  */
+  const int sdiv;	  /* cost of SFmode division (fdivs).  */
+  const int ddiv;	  /* cost of DFmode division (fdiv).  */
+  const int cache_line_size;    /* cache line size in bytes. */
+  const int l1_cache_size;	/* size of l1 cache, in kilobytes.  */
+  const int l2_cache_size;	/* size of l2 cache, in kilobytes.  */
+  const int simultaneous_prefetches; /* number of parallel prefetch
+					operations.  */
+  const int sfdf_convert;	/* cost of SF->DF conversion.  */
+};
+
+static const struct processor_costs *rs6000_cost;
 
 /* Instruction size costs on 32bit processors.  */
 static const
@@ -4618,131 +4637,128 @@ rs6000_option_override_internal (bool global_init_p)
     }
 
   /* Initialize rs6000_cost with the appropriate target costs.  */
-  if (optimize_size)
-    rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
-  else
-    switch (rs6000_tune)
-      {
-      case PROCESSOR_RS64A:
-	rs6000_cost = &rs64a_cost;
-	break;
+  switch (rs6000_tune)
+    {
+    case PROCESSOR_RS64A:
+      rs6000_cost = &rs64a_cost;
+      break;
 
-      case PROCESSOR_MPCCORE:
-	rs6000_cost = &mpccore_cost;
-	break;
+    case PROCESSOR_MPCCORE:
+      rs6000_cost = &mpccore_cost;
+      break;
 
-      case PROCESSOR_PPC403:
-	rs6000_cost = &ppc403_cost;
-	break;
+    case PROCESSOR_PPC403:
+      rs6000_cost = &ppc403_cost;
+      break;
 
-      case PROCESSOR_PPC405:
-	rs6000_cost = &ppc405_cost;
-	break;
+    case PROCESSOR_PPC405:
+      rs6000_cost = &ppc405_cost;
+      break;
 
-      case PROCESSOR_PPC440:
-	rs6000_cost = &ppc440_cost;
-	break;
+    case PROCESSOR_PPC440:
+      rs6000_cost = &ppc440_cost;
+      break;
 
-      case PROCESSOR_PPC476:
-	rs6000_cost = &ppc476_cost;
-	break;
+    case PROCESSOR_PPC476:
+      rs6000_cost = &ppc476_cost;
+      break;
 
-      case PROCESSOR_PPC601:
-	rs6000_cost = &ppc601_cost;
-	break;
+    case PROCESSOR_PPC601:
+      rs6000_cost = &ppc601_cost;
+      break;
 
-      case PROCESSOR_PPC603:
-	rs6000_cost = &ppc603_cost;
-	break;
+    case PROCESSOR_PPC603:
+      rs6000_cost = &ppc603_cost;
+      break;
 
-      case PROCESSOR_PPC604:
-	rs6000_cost = &ppc604_cost;
-	break;
+    case PROCESSOR_PPC604:
+      rs6000_cost = &ppc604_cost;
+      break;
 
-      case PROCESSOR_PPC604e:
-	rs6000_cost = &ppc604e_cost;
-	break;
+    case PROCESSOR_PPC604e:
+      rs6000_cost = &ppc604e_cost;
+      break;
 
-      case PROCESSOR_PPC620:
-	rs6000_cost = &ppc620_cost;
-	break;
+    case PROCESSOR_PPC620:
+      rs6000_cost = &ppc620_cost;
+      break;
 
-      case PROCESSOR_PPC630:
-	rs6000_cost = &ppc630_cost;
-	break;
+    case PROCESSOR_PPC630:
+      rs6000_cost = &ppc630_cost;
+      break;
 
-      case PROCESSOR_CELL:
-	rs6000_cost = &ppccell_cost;
-	break;
+    case PROCESSOR_CELL:
+      rs6000_cost = &ppccell_cost;
+      break;
 
-      case PROCESSOR_PPC750:
-      case PROCESSOR_PPC7400:
-	rs6000_cost = &ppc750_cost;
-	break;
+    case PROCESSOR_PPC750:
+    case PROCESSOR_PPC7400:
+      rs6000_cost = &ppc750_cost;
+      break;
 
-      case PROCESSOR_PPC7450:
-	rs6000_cost = &ppc7450_cost;
-	break;
+    case PROCESSOR_PPC7450:
+      rs6000_cost = &ppc7450_cost;
+      break;
 
-      case PROCESSOR_PPC8540:
-      case PROCESSOR_PPC8548:
-	rs6000_cost = &ppc8540_cost;
-	break;
+    case PROCESSOR_PPC8540:
+    case PROCESSOR_PPC8548:
+      rs6000_cost = &ppc8540_cost;
+      break;
 
-      case PROCESSOR_PPCE300C2:
-      case PROCESSOR_PPCE300C3:
-	rs6000_cost = &ppce300c2c3_cost;
-	break;
+    case PROCESSOR_PPCE300C2:
+    case PROCESSOR_PPCE300C3:
+      rs6000_cost = &ppce300c2c3_cost;
+      break;
 
-      case PROCESSOR_PPCE500MC:
-	rs6000_cost = &ppce500mc_cost;
-	break;
+    case PROCESSOR_PPCE500MC:
+      rs6000_cost = &ppce500mc_cost;
+      break;
 
-      case PROCESSOR_PPCE500MC64:
-	rs6000_cost = &ppce500mc64_cost;
-	break;
+    case PROCESSOR_PPCE500MC64:
+      rs6000_cost = &ppce500mc64_cost;
+      break;
 
-      case PROCESSOR_PPCE5500:
-	rs6000_cost = &ppce5500_cost;
-	break;
+    case PROCESSOR_PPCE5500:
+      rs6000_cost = &ppce5500_cost;
+      break;
 
-      case PROCESSOR_PPCE6500:
-	rs6000_cost = &ppce6500_cost;
-	break;
+    case PROCESSOR_PPCE6500:
+      rs6000_cost = &ppce6500_cost;
+      break;
 
-      case PROCESSOR_TITAN:
-	rs6000_cost = &titan_cost;
-	break;
+    case PROCESSOR_TITAN:
+      rs6000_cost = &titan_cost;
+      break;
 
-      case PROCESSOR_POWER4:
-      case PROCESSOR_POWER5:
-	rs6000_cost = &power4_cost;
-	break;
+    case PROCESSOR_POWER4:
+    case PROCESSOR_POWER5:
+      rs6000_cost = &power4_cost;
+      break;
 
-      case PROCESSOR_POWER6:
-	rs6000_cost = &power6_cost;
-	break;
+    case PROCESSOR_POWER6:
+      rs6000_cost = &power6_cost;
+      break;
 
-      case PROCESSOR_POWER7:
-	rs6000_cost = &power7_cost;
-	break;
+    case PROCESSOR_POWER7:
+      rs6000_cost = &power7_cost;
+      break;
 
-      case PROCESSOR_POWER8:
-	rs6000_cost = &power8_cost;
-	break;
+    case PROCESSOR_POWER8:
+      rs6000_cost = &power8_cost;
+      break;
 
-      case PROCESSOR_POWER9:
-      case PROCESSOR_POWER10:
-	rs6000_cost = &power9_cost;
-	break;
+    case PROCESSOR_POWER9:
+    case PROCESSOR_POWER10:
+      rs6000_cost = &power9_cost;
+      break;
 
-      case PROCESSOR_PPCA2:
-	rs6000_cost = &ppca2_cost;
-	break;
+    case PROCESSOR_PPCA2:
+      rs6000_cost = &ppca2_cost;
+      break;
 
-      default:
-	gcc_unreachable ();
-      }
+    default:
+      gcc_unreachable ();
+    }
 
   if (global_init_p)
     {
@@ -21438,15 +21454,17 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code,
 
     case PLUS:
     case MINUS:
-      if (FLOAT_MODE_P (mode))
+      if (speed && FLOAT_MODE_P (mode))
 	*total = rs6000_cost->fp;
       else
 	*total = COSTS_N_INSNS (1);
       return false;
 
     case MULT:
-      if (CONST_INT_P (XEXP (x, 1))
-	  && satisfies_constraint_I (XEXP (x, 1)))
+      if (!speed)
+	*total = COSTS_N_INSNS (1);
+      else if (CONST_INT_P (XEXP (x, 1))
+	       && satisfies_constraint_I (XEXP (x, 1)))
 	{
 	  if (INTVAL (XEXP (x, 1)) >= -256
 	      && INTVAL (XEXP (x, 1)) <= 255)
@@ -21465,7 +21483,9 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code,
       return false;
 
     case FMA:
-      if (mode == SFmode)
+      if (!speed)
+	*total = COSTS_N_INSNS (1);
+      else if (mode == SFmode)
 	*total = rs6000_cost->fp;
       else
 	*total = rs6000_cost->dmul;
@@ -21475,8 +21495,10 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code,
     case MOD:
       if (FLOAT_MODE_P (mode))
 	{
-	  *total = mode == DFmode ? rs6000_cost->ddiv
-				  : rs6000_cost->sdiv;
+	  if (!speed)
+	    *total = COSTS_N_INSNS (1);
+	  else
+	    *total = mode == DFmode ? rs6000_cost->ddiv : rs6000_cost->sdiv;
 	  return false;
 	}
       /* FALLTHRU */
@@ -21495,7 +21517,9 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code,
 	}
       else
 	{
-	  if (GET_MODE (XEXP (x, 1)) == DImode)
+	  if (!speed)
+	    *total = COSTS_N_INSNS (1);
+	  else if (GET_MODE (XEXP (x, 1)) == DImode)
 	    *total = rs6000_cost->divdi;
 	  else
 	    *total = rs6000_cost->divsi;
@@ -21587,7 +21611,9 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code,
       if (outer_code == TRUNCATE
 	  && GET_CODE (XEXP (x, 0)) == MULT)
 	{
-	  if (mode == DImode)
+	  if (!speed)
+	    *total = COSTS_N_INSNS (1);
+	  else if (mode == DImode)
 	    *total = rs6000_cost->muldi;
 	  else
 	    *total = rs6000_cost->mulsi;
@@ -21622,11 +21648,16 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code,
     case FIX:
     case UNSIGNED_FIX:
     case FLOAT_TRUNCATE:
-      *total = rs6000_cost->fp;
+      if (!speed)
+	*total = COSTS_N_INSNS (1);
+      else
+	*total = rs6000_cost->fp;
       return false;
 
     case FLOAT_EXTEND:
-      if (mode == DFmode)
+      if (!speed)
+	*total = COSTS_N_INSNS (1);
+      else if (mode == DFmode)
 	*total = rs6000_cost->sfdf_convert;
       else
 	*total = rs6000_cost->fp;
@@ -21773,6 +21804,10 @@ rs6000_insn_cost (rtx_insn *insn, bool speed)
       n = length / 4;
     }
 
+  const struct processor_costs *proc_cost = rs6000_cost;
+  if (optimize_size)
+    proc_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
+
   enum attr_type type = get_attr_type (insn);
 
   switch (type)
@@ -21787,16 +21822,16 @@ rs6000_insn_cost (rtx_insn *insn, bool speed)
       switch (get_attr_size (insn))
 	{
 	case SIZE_8:
-	  cost = COSTS_N_INSNS (n - 1) + rs6000_cost->mulsi_const9;
+	  cost = COSTS_N_INSNS (n - 1) + proc_cost->mulsi_const9;
 	  break;
 	case SIZE_16:
-	  cost = COSTS_N_INSNS (n - 1) + rs6000_cost->mulsi_const;
+	  cost = COSTS_N_INSNS (n - 1) + proc_cost->mulsi_const;
 	  break;
 	case SIZE_32:
-	  cost = COSTS_N_INSNS (n - 1) + rs6000_cost->mulsi;
+	  cost = COSTS_N_INSNS (n - 1) + proc_cost->mulsi;
 	  break;
 	case SIZE_64:
-	  cost = COSTS_N_INSNS (n - 1) + rs6000_cost->muldi;
+	  cost = COSTS_N_INSNS (n - 1) + proc_cost->muldi;
 	  break;
 	default:
 	  gcc_unreachable ();
@@ -21806,10 +21841,10 @@ rs6000_insn_cost (rtx_insn *insn, bool speed)
       switch (get_attr_size (insn))
 	{
 	case SIZE_32:
-	  cost = COSTS_N_INSNS (n - 1) + rs6000_cost->divsi;
+	  cost = COSTS_N_INSNS (n - 1) + proc_cost->divsi;
 	  break;
 	case SIZE_64:
-	  cost = COSTS_N_INSNS (n - 1) + rs6000_cost->divdi;
+	  cost = COSTS_N_INSNS (n - 1) + proc_cost->divdi;
 	  break;
 	default:
 	  gcc_unreachable ();
@@ -21817,16 +21852,16 @@ rs6000_insn_cost (rtx_insn *insn, bool speed)
       break;
 
     case TYPE_FP:
-      cost = n * rs6000_cost->fp;
+      cost = n * proc_cost->fp;
       break;
     case TYPE_DMUL:
-      cost = n * rs6000_cost->dmul;
+      cost = n * proc_cost->dmul;
       break;
     case TYPE_SDIV:
-      cost = n * rs6000_cost->sdiv;
+      cost = n * proc_cost->sdiv;
       break;
     case TYPE_DDIV:
-      cost = n * rs6000_cost->ddiv;
+      cost = n * proc_cost->ddiv;
       break;
 
     case TYPE_SYNC:
@@ -22388,7 +22423,7 @@ rs6000_emit_parity (rtx dst, rtx src)
   if (mode == SImode)
     {
       /* Is mult+shift >= shift+xor+shift+xor?  */
-      if (rs6000_cost->mulsi_const >= COSTS_N_INSNS (3))
+      if (!optimize_size && rs6000_cost->mulsi_const >= COSTS_N_INSNS (3))
 	{
 	  rtx tmp1, tmp2, tmp3, tmp4;
 
@@ -22411,7 +22446,7 @@ rs6000_emit_parity (rtx dst, rtx src)
   else
     {
       /* Is mult+shift >= shift+xor+shift+xor+shift+xor?  */
-      if (rs6000_cost->muldi >= COSTS_N_INSNS (5))
+      if (!optimize_size && rs6000_cost->muldi >= COSTS_N_INSNS (5))
 	{
 	  rtx tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
 
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index bbd8060e143..9daf55adc02 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -1869,29 +1869,6 @@ extern scalar_int_mode rs6000_pmode;
 #define REVERSE_CONDITION(CODE, MODE) rs6000_reverse_condition (MODE, CODE)
 
 
-/* Target cpu costs.  */
-
-struct processor_costs {
-  const int mulsi;	  /* cost of SImode multiplication.  */
-  const int mulsi_const;  /* cost of SImode multiplication by constant.  */
-  const int mulsi_const9; /* cost of SImode mult by short constant.  */
-  const int muldi;	  /* cost of DImode multiplication.  */
-  const int divsi;	  /* cost of SImode division.  */
-  const int divdi;	  /* cost of DImode division.  */
-  const int fp;		  /* cost of simple SFmode and DFmode insns.  */
-  const int dmul;	  /* cost of DFmode multiplication (and fmadd).  */
-  const int sdiv;	  /* cost of SFmode division (fdivs).  */
-  const int ddiv;	  /* cost of DFmode division (fdiv).  */
-  const int cache_line_size;    /* cache line size in bytes. */
-  const int l1_cache_size;	/* size of l1 cache, in kilobytes.  */
-  const int l2_cache_size;	/* size of l2 cache, in kilobytes.  */
-  const int simultaneous_prefetches; /* number of parallel prefetch
-					operations.  */
-  const int sfdf_convert;	/* cost of SF->DF conversion.  */
-};
-
-extern const struct processor_costs *rs6000_cost;
-
 /* Control the assembler format that we output.  */
 
 /* A C string constant describing how to begin a comment in the target
