Commit 82b4201f by Kaveh R. Ghazi Committed by Kaveh Ghazi

tree.h (BUILTIN_EXP10_P, [...]): New macros.

	* tree.h (BUILTIN_EXP10_P, BUILTIN_EXPONENT_P, BUILTIN_SQRT_P,
	BUILTIN_CBRT_P, BUILTIN_ROOT_P): New macros.

	* builtins.c (fold_builtin_logarithm, fold_builtin): Use new
	macros.
	* fold-const.c (fold_mathfn_compare, fold): Likewise.

From-SVN: r79023
parent 0c2cc7b3
2004-03-06 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* tree.h (BUILTIN_EXP10_P, BUILTIN_EXPONENT_P, BUILTIN_SQRT_P,
BUILTIN_CBRT_P, BUILTIN_ROOT_P): New macros.
* builtins.c (fold_builtin_logarithm, fold_builtin): Use new
macros.
* fold-const.c (fold_mathfn_compare, fold): Likewise.
2004-03-06 Eric Botcazou <ebotcazou@libertysurf.fr>
PR target/14343
......
......@@ -6212,10 +6212,7 @@ fold_builtin_logarithm (tree exp, const REAL_VALUE_TYPE *value)
&& (fcode == BUILT_IN_EXP2
|| fcode == BUILT_IN_EXP2F
|| fcode == BUILT_IN_EXP2L))
|| (value == &dconst10
&& (fcode == BUILT_IN_EXP10
|| fcode == BUILT_IN_EXP10F
|| fcode == BUILT_IN_EXP10L))))
|| (value == &dconst10 && (BUILTIN_EXP10_P (fcode)))))
return convert (type, TREE_VALUE (TREE_OPERAND (arg, 1)));
/* Optimize logN(func()) for various exponential functions. We
......@@ -6725,12 +6722,9 @@ fold_builtin (tree exp)
return build_real (type, r);
}
/* Optimize sqrt(exp(x)) = exp(x*0.5). */
/* Optimize sqrt(expN(x)) = expN(x*0.5). */
fcode = builtin_mathfn_code (arg);
if (flag_unsafe_math_optimizations
&& (fcode == BUILT_IN_EXP
|| fcode == BUILT_IN_EXPF
|| fcode == BUILT_IN_EXPL))
if (flag_unsafe_math_optimizations && BUILTIN_EXPONENT_P (fcode))
{
tree expfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
arg = fold (build (MULT_EXPR, type,
......@@ -6948,12 +6942,9 @@ fold_builtin (tree exp)
}
}
/* Optimize pow(exp(x),y) = exp(x*y). */
/* Optimize pow(expN(x),y) = expN(x*y). */
fcode = builtin_mathfn_code (arg0);
if (flag_unsafe_math_optimizations
&& (fcode == BUILT_IN_EXP
|| fcode == BUILT_IN_EXPF
|| fcode == BUILT_IN_EXPL))
if (flag_unsafe_math_optimizations && BUILTIN_EXPONENT_P (fcode))
{
tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
tree arg = TREE_VALUE (TREE_OPERAND (arg0, 1));
......@@ -6963,10 +6954,7 @@ fold_builtin (tree exp)
}
/* Optimize pow(sqrt(x),y) = pow(x,y*0.5). */
if (flag_unsafe_math_optimizations
&& (fcode == BUILT_IN_SQRT
|| fcode == BUILT_IN_SQRTF
|| fcode == BUILT_IN_SQRTL))
if (flag_unsafe_math_optimizations && BUILTIN_SQRT_P (fcode))
{
tree narg0 = TREE_VALUE (TREE_OPERAND (arg0, 1));
tree narg1 = fold (build (MULT_EXPR, type, arg1,
......
......@@ -4985,9 +4985,7 @@ fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
{
REAL_VALUE_TYPE c;
if (fcode == BUILT_IN_SQRT
|| fcode == BUILT_IN_SQRTF
|| fcode == BUILT_IN_SQRTL)
if (BUILTIN_SQRT_P (fcode))
{
tree arg = TREE_VALUE (TREE_OPERAND (arg0, 1));
enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
......@@ -6425,9 +6423,7 @@ fold (tree expr)
enum built_in_function fcode1 = builtin_mathfn_code (arg1);
/* Optimizations of sqrt(...)*sqrt(...). */
if ((fcode0 == BUILT_IN_SQRT && fcode1 == BUILT_IN_SQRT)
|| (fcode0 == BUILT_IN_SQRTF && fcode1 == BUILT_IN_SQRTF)
|| (fcode0 == BUILT_IN_SQRTL && fcode1 == BUILT_IN_SQRTL))
if (fcode0 == fcode1 && BUILTIN_SQRT_P (fcode0))
{
tree sqrtfn, arg, arglist;
tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
......@@ -6446,19 +6442,7 @@ fold (tree expr)
}
/* Optimize expN(x)*expN(y) as expN(x+y). */
if (fcode0 == fcode1
&& (fcode0 == BUILT_IN_EXP
|| fcode0 == BUILT_IN_EXPF
|| fcode0 == BUILT_IN_EXPL
|| fcode0 == BUILT_IN_EXP2
|| fcode0 == BUILT_IN_EXP2F
|| fcode0 == BUILT_IN_EXP2L
|| fcode0 == BUILT_IN_EXP10
|| fcode0 == BUILT_IN_EXP10F
|| fcode0 == BUILT_IN_EXP10L
|| fcode0 == BUILT_IN_POW10
|| fcode0 == BUILT_IN_POW10F
|| fcode0 == BUILT_IN_POW10L))
if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
{
tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
tree arg = build (PLUS_EXPR, type,
......@@ -6791,18 +6775,7 @@ fold (tree expr)
{
enum built_in_function fcode = builtin_mathfn_code (arg1);
/* Optimize x/expN(y) into x*expN(-y). */
if (fcode == BUILT_IN_EXP
|| fcode == BUILT_IN_EXPF
|| fcode == BUILT_IN_EXPL
|| fcode == BUILT_IN_EXP2
|| fcode == BUILT_IN_EXP2F
|| fcode == BUILT_IN_EXP2L
|| fcode == BUILT_IN_EXP10
|| fcode == BUILT_IN_EXP10F
|| fcode == BUILT_IN_EXP10L
|| fcode == BUILT_IN_POW10
|| fcode == BUILT_IN_POW10F
|| fcode == BUILT_IN_POW10L)
if (BUILTIN_EXPONENT_P (fcode))
{
tree expfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
tree arg = build1 (NEGATE_EXPR, type,
......
......@@ -101,6 +101,24 @@ enum built_in_function
/* Names for the above. */
extern const char *const built_in_names[(int) END_BUILTINS];
/* Helper macros for math builtins. */
#define BUILTIN_EXP10_P(FN) \
((FN) == BUILT_IN_EXP10 || (FN) == BUILT_IN_EXP10F || (FN) == BUILT_IN_EXP10L \
|| (FN) == BUILT_IN_POW10 || (FN) == BUILT_IN_POW10F || (FN) == BUILT_IN_POW10L)
#define BUILTIN_EXPONENT_P(FN) (BUILTIN_EXP10_P (FN) \
|| (FN) == BUILT_IN_EXP || (FN) == BUILT_IN_EXPF || (FN) == BUILT_IN_EXPL \
|| (FN) == BUILT_IN_EXP2 || (FN) == BUILT_IN_EXP2F || (FN) == BUILT_IN_EXP2L)
#define BUILTIN_SQRT_P(FN) \
((FN) == BUILT_IN_SQRT || (FN) == BUILT_IN_SQRTF || (FN) == BUILT_IN_SQRTL)
#define BUILTIN_CBRT_P(FN) \
((FN) == BUILT_IN_CBRT || (FN) == BUILT_IN_CBRTF || (FN) == BUILT_IN_CBRTL)
#define BUILTIN_ROOT_P(FN) (BUILTIN_SQRT_P (FN) || BUILTIN_CBRT_P (FN))
/* An array of _DECL trees for the above. */
extern GTY(()) tree built_in_decls[(int) END_BUILTINS];
extern GTY(()) tree implicit_built_in_decls[(int) END_BUILTINS];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment