From 8b1bf1e977f237ec4b74568e78ae6a36a3fdcdea Mon Sep 17 00:00:00 2001
From: dalej <dalej@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Tue, 12 Jul 2005 20:29:51 +0000
Subject: [PATCH] 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.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101938 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog              | 14 ++++++++++++++
 gcc/config/rs6000/rs6000.c |  8 +++++++-
 gcc/expr.c                 | 21 +++++++++++++++++++--
 3 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 731f4af1a90c..30269f96f677 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 921d16ff7833..4cf8dd876e3b 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 01f890fa6a51..182ab2382be1 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 ();
 
-- 
GitLab