public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jan Hubicka <jh@suse.cz>
To: gcc-patches@gcc.gnu.org, rth@cygnus.com, aj@suse.de
Subject: Simplify floating point conversions
Date: Tue, 05 Nov 2002 09:14:00 -0000	[thread overview]
Message-ID: <20021105171400.GX14655@kam.mff.cuni.cz> (raw)

Hi,
this patch makes us to simplify some of the floating point operations to
narrower mode when conversions are present.  This include
+,-,/,*,abs,neg,sqrt/sin/cos/exp.
I believe it is IEEE safe, but some expert would be welcome.

The sqrt/sin/cos/exp conversion does not work in fortran mode, since
built_in_decls is not initialized.  I was trying to get around but never
suceeded to produce working call there.

Honza

Tue Nov  5 02:06:18 PST 2002  Jan Hubicka  <jh@suse.cz>
	* convert.c (convert_to_real): Simplify some special cases.
Index: convert.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/convert.c,v
retrieving revision 1.19
diff -c -3 -p -r1.19 convert.c
*** convert.c	4 Jul 2002 06:38:54 -0000	1.19
--- convert.c	5 Nov 2002 17:09:53 -0000
*************** tree
*** 80,85 ****
--- 80,203 ----
  convert_to_real (type, expr)
       tree type, expr;
  {
+   enum built_in_function fcode = builtin_mathfn_code (expr);
+   tree itype = TREE_TYPE (expr);
+ 
+   if ((fcode == BUILT_IN_SQRT
+        || fcode == BUILT_IN_SQRTL
+        || fcode == BUILT_IN_SIN
+        || fcode == BUILT_IN_SINL
+        || fcode == BUILT_IN_COS
+        || fcode == BUILT_IN_COSL
+        || fcode == BUILT_IN_EXP
+        || fcode == BUILT_IN_EXPL)
+       && (TYPE_MODE (type) == TYPE_MODE (double_type_node)
+           || TYPE_MODE (type) == TYPE_MODE (float_type_node)))
+     {
+       tree arg0 = TREE_VALUE (TREE_OPERAND (expr, 1));
+       tree newtype = type;
+ 
+       if (TREE_CODE (arg0) == NOP_EXPR)
+ 	arg0 = TREE_OPERAND (arg0, 0);
+ 
+       if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (type))
+ 	newtype = TREE_TYPE (arg0);
+       if (FLOAT_TYPE_P (TREE_TYPE (arg0))
+ 	  && TYPE_PRECISION (newtype) <= TYPE_PRECISION (itype)
+ 	  && (TYPE_MODE (newtype) == TYPE_MODE (double_type_node)
+ 	      || TYPE_MODE (newtype) == TYPE_MODE (float_type_node)))
+ 	{
+ 	  tree arglist, decl;
+ 	  if (TYPE_MODE (type) == TYPE_MODE (float_type_node))
+ 	    switch (fcode)
+ 	      {
+ 	      case BUILT_IN_SQRT:
+ 	      case BUILT_IN_SQRTL:
+ 		fcode = BUILT_IN_SQRTF;
+ 		break;
+ 	      case BUILT_IN_SIN:
+ 	      case BUILT_IN_SINL:
+ 		fcode = BUILT_IN_SINF;
+ 		break;
+ 	      case BUILT_IN_COS:
+ 	      case BUILT_IN_COSL:
+ 		fcode = BUILT_IN_COSF;
+ 		break;
+ 	      case BUILT_IN_EXP:
+ 	      case BUILT_IN_EXPL:
+ 		fcode = BUILT_IN_EXPF;
+ 		break;
+ 	      default:
+ 		abort ();
+ 	      }
+ 	  else
+ 	    switch (fcode)
+ 	      {
+ 	      case BUILT_IN_SQRT:
+ 	      case BUILT_IN_SQRTL:
+ 		fcode = BUILT_IN_SQRT;
+ 		break;
+ 	      case BUILT_IN_SIN:
+ 	      case BUILT_IN_SINL:
+ 		fcode = BUILT_IN_SIN;
+ 		break;
+ 	      case BUILT_IN_COS:
+ 	      case BUILT_IN_COSL:
+ 		fcode = BUILT_IN_COS;
+ 		break;
+ 	      case BUILT_IN_EXP:
+ 	      case BUILT_IN_EXPL:
+ 		fcode = BUILT_IN_EXP;
+ 		break;
+ 	      default:
+ 		abort ();
+ 	      }
+ 
+ 	  if (built_in_decls [fcode])
+ 	    {
+ 	      decl = build_function_call_expr (built_in_decls [fcode], arglist);
+ 	      return decl;
+ 	    }
+ 	}
+     }
+   if (itype != type && FLOAT_TYPE_P (type))
+     switch (TREE_CODE (expr))
+       {
+ 	case ABS_EXPR:
+ 	case NEGATE_EXPR:
+ 	  return build1 (TREE_CODE (expr), type,
+ 			 fold (convert_to_real (type,
+ 						TREE_OPERAND (expr, 0))));
+ 	case PLUS_EXPR:
+ 	case MINUS_EXPR:
+ 	case MULT_EXPR:
+ 	case RDIV_EXPR:
+ 	   {
+ 	     tree arg0 = TREE_OPERAND (expr, 0);
+ 	     tree arg1 = TREE_OPERAND (expr, 1);
+ 	     if (TREE_CODE (arg0) == NOP_EXPR)
+ 	       arg0 = TREE_OPERAND (arg0, 0);
+ 	     if (TREE_CODE (arg1) == NOP_EXPR)
+ 	       arg1 = TREE_OPERAND (arg1, 0);
+ 	     if (FLOAT_TYPE_P (TREE_TYPE (arg0))
+ 		 && FLOAT_TYPE_P (TREE_TYPE (arg1)))
+ 	       {
+ 		  tree newtype = type;
+ 		  if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (newtype))
+ 		    newtype = TREE_TYPE (arg0);
+ 		  if (TYPE_PRECISION (TREE_TYPE (arg1)) > TYPE_PRECISION (newtype))
+ 		    newtype = TREE_TYPE (arg1);
+ 		  if (TYPE_PRECISION (newtype) < TYPE_PRECISION (itype))
+ 		    return build (TREE_CODE (expr), newtype,
+ 				  fold (convert_to_real (newtype, arg0)),
+ 				  fold (convert_to_real (newtype, arg1)));
+ 	       }
+ 	   }
+ 	  break;
+ 	default:
+ 	  break;
+       }
+ 
    switch (TREE_CODE (TREE_TYPE (expr)))
      {
      case REAL_TYPE:

             reply	other threads:[~2002-11-05 17:14 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-11-05  9:14 Jan Hubicka [this message]
2002-11-05  9:38 ` Richard Henderson
2002-11-05  9:42   ` Jan Hubicka
2002-11-06  1:23   ` Simplify floating point conversions II Jan Hubicka
2002-11-06  3:08     ` Michael Matz
2002-11-06  4:36       ` Jan Hubicka
2002-11-06  9:54     ` Jan Hubicka
2002-11-06 10:09       ` Richard Henderson
2002-11-06 13:11         ` Jan Hubicka
2002-11-06 13:19           ` Jan Hubicka
2002-11-06 13:35           ` Gabriel Dos Reis
2002-11-06 13:36             ` Jan Hubicka
2002-11-06 14:06               ` Gabriel Dos Reis
2002-11-06 14:29             ` Converting floor to rint Jan Hubicka
2002-11-06 14:47               ` Richard Henderson
2002-11-06 14:53                 ` Jan Hubicka
2002-11-06 14:55               ` Gabriel Dos Reis
2002-11-07  1:21                 ` Jan Hubicka
2002-11-07  1:32                   ` Jakub Jelinek
2002-11-07  1:33                   ` Gabriel Dos Reis
2002-11-07  1:44                     ` Jan Hubicka
2002-11-07  1:52                       ` Jakub Jelinek
2002-11-07  1:54                         ` Jan Hubicka
2002-11-07  2:04                     ` Jan Hubicka
2002-11-07  4:47                       ` Gabriel Dos Reis
2002-11-07  4:56                         ` Jan Hubicka
2002-11-07  5:14                           ` Andreas Schwab
2002-11-07  5:27                             ` Gabriel Dos Reis
2002-11-07  5:31                               ` Jan Hubicka
2002-11-07  5:35                                 ` Andreas Schwab
2002-11-07  5:22                           ` Gabriel Dos Reis
2002-11-07  5:43                             ` Andreas Schwab
2002-11-07  6:23                               ` Gabriel Dos Reis
2002-11-07  7:01                                 ` Jan Hubicka
2002-11-07  7:18                                   ` Gabriel Dos Reis
2002-11-06 13:48         ` Simplify floating point conversions III Jan Hubicka
2002-11-06 14:55           ` Richard Henderson
2002-11-07  2:54             ` Simplify floating point conversions IV Jan Hubicka
2002-11-18 15:01               ` Richard Henderson
2002-11-05 11:14 ` Simplify floating point conversions Geoff Keating
2002-11-06  1:09   ` Jan Hubicka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20021105171400.GX14655@kam.mff.cuni.cz \
    --to=jh@suse.cz \
    --cc=aj@suse.de \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=rth@cygnus.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).