diff options
author | Dale Johannesen <dalej@apple.com> | 2005-07-12 20:29:51 +0000 |
---|---|---|
committer | Dale Johannesen <dalej@gcc.gnu.org> | 2005-07-12 20:29:51 +0000 |
commit | e4541b7a1e63c7c02a1fbea8cbbe397fd436ebfe (patch) | |
tree | 3fdf52c0ba14a4c842f30934ba59c2b3808ab4ea | |
parent | 5133e4b923b5648cc7fc2f27bb03f02855dbbe94 (diff) | |
download | gcc-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/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 8 | ||||
-rw-r--r-- | gcc/expr.c | 21 |
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; @@ -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 (); |