aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2005-07-12 20:29:51 +0000
committerDale Johannesen <dalej@gcc.gnu.org>2005-07-12 20:29:51 +0000
commite4541b7a1e63c7c02a1fbea8cbbe397fd436ebfe (patch)
tree3fdf52c0ba14a4c842f30934ba59c2b3808ab4ea
parent5133e4b923b5648cc7fc2f27bb03f02855dbbe94 (diff)
downloadgcc-e4541b7a1e63c7c02a1fbea8cbbe397fd436ebfe.zip
gcc-e4541b7a1e63c7c02a1fbea8cbbe397fd436ebfe.tar.gz
gcc-e4541b7a1e63c7c02a1fbea8cbbe397fd436ebfe.tar.bz2
expr.c (compress_float_constant): Add cost check.
2005-07-12 Dale Johannesen <dalej@apple.com> * expr.c (compress_float_constant): Add cost check. * config/rs6000.c (rs6000_rtx_cost): Adjust FLOAT_EXTEND cost. From-SVN: r101938
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/config/rs6000/rs6000.c8
-rw-r--r--gcc/expr.c21
3 files changed, 40 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 731f4af..30269f9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+2005-07-12 Dale Johannesen <dalej@apple.com>
+
+ * expr.c (compress_float_constant): Add cost check.
+ * config/rs6000.c (rs6000_rtx_cost): Adjust FLOAT_EXTEND cost.
+
+2005-07-12 Dale Johannesen <dalej@apple.com>
+
+ * gcc.target/i386/compress-float-sse.c: New.
+ * gcc.target/i386/compress-float-sse-pic.c: New.
+ * gcc.target/i386/compress-float-387.c: New.
+ * gcc.target/i386/compress-float-387-pic.c: New.
+ * gcc.dg/compress-float-ppc.c: New.
+ * gcc.dg/compress-float-ppc-pic.c: New.
+
2005-07-12 Eric Christopher <echristo@redhat.com>
* gcc.c (struct infile): Update comment for language.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 921d16f..4cf8dd8 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -18043,11 +18043,17 @@ rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
}
/* FALLTHRU */
+ case FLOAT_EXTEND:
+ if (mode == DFmode)
+ *total = 0;
+ else
+ *total = rs6000_cost->fp;
+ return false;
+
case FLOAT:
case UNSIGNED_FLOAT:
case FIX:
case UNSIGNED_FIX:
- case FLOAT_EXTEND:
case FLOAT_TRUNCATE:
*total = rs6000_cost->fp;
return false;
diff --git a/gcc/expr.c b/gcc/expr.c
index 01f890f..182ab23 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -3202,9 +3202,15 @@ compress_float_constant (rtx x, rtx y)
enum machine_mode orig_srcmode = GET_MODE (y);
enum machine_mode srcmode;
REAL_VALUE_TYPE r;
+ int oldcost, newcost;
REAL_VALUE_FROM_CONST_DOUBLE (r, y);
+ if (LEGITIMATE_CONSTANT_P (y))
+ oldcost = rtx_cost (y, SET);
+ else
+ oldcost = rtx_cost (force_const_mem (dstmode, y), SET);
+
for (srcmode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (orig_srcmode));
srcmode != orig_srcmode;
srcmode = GET_MODE_WIDER_MODE (srcmode))
@@ -3229,12 +3235,23 @@ compress_float_constant (rtx x, rtx y)
the extension. */
if (! (*insn_data[ic].operand[1].predicate) (trunc_y, srcmode))
continue;
+ /* This is valid, but may not be cheaper than the original. */
+ newcost = rtx_cost (gen_rtx_FLOAT_EXTEND (dstmode, trunc_y), SET);
+ if (oldcost < newcost)
+ continue;
}
else if (float_extend_from_mem[dstmode][srcmode])
- trunc_y = validize_mem (force_const_mem (srcmode, trunc_y));
+ {
+ trunc_y = force_const_mem (srcmode, trunc_y);
+ /* This is valid, but may not be cheaper than the original. */
+ newcost = rtx_cost (gen_rtx_FLOAT_EXTEND (dstmode, trunc_y), SET);
+ if (oldcost < newcost)
+ continue;
+ trunc_y = validize_mem (trunc_y);
+ }
else
continue;
-
+
emit_unop_insn (ic, x, trunc_y, UNKNOWN);
last_insn = get_last_insn ();