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:
next 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).