Commit daa027cc by Kaveh R. Ghazi Committed by Kaveh Ghazi

builtins.c (CASE_MATHFN): New helper macro.

	* builtins.c (CASE_MATHFN): New helper macro.
	(mathfn_built_in): Simplify and sort.

From-SVN: r70436
parent d256ac69
2003-08-14 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 2003-08-14 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* builtins.c (CASE_MATHFN): New helper macro.
(mathfn_built_in): Simplify and sort.
* protoize.c (substr): Delete, callers changed to `strstr'. * protoize.c (substr): Delete, callers changed to `strstr'.
2003-08-13 Zack Weinberg <zack@codesourcery.com> 2003-08-13 Zack Weinberg <zack@codesourcery.com>
......
...@@ -1470,211 +1470,50 @@ expand_builtin_constant_p (tree arglist, enum machine_mode target_mode) ...@@ -1470,211 +1470,50 @@ expand_builtin_constant_p (tree arglist, enum machine_mode target_mode)
return tmp; return tmp;
} }
/* Return mathematic function equivalent to FN but operating directly on TYPE, /* This helper macro, meant to be used in mathfn_built_in below,
if available. */ determines which among a set of three builtin math functions is
appropriate for a given type mode. The `F' and `L' cases are
automatically generated from the `double' case. */
#define CASE_MATHFN(BUILT_IN_MATHFN) \
case BUILT_IN_MATHFN: case BUILT_IN_MATHFN##F: case BUILT_IN_MATHFN##L: \
fcode = BUILT_IN_MATHFN; fcodef = BUILT_IN_MATHFN##F ; \
fcodel = BUILT_IN_MATHFN##L ; break;
/* Return mathematic function equivalent to FN but operating directly
on TYPE, if available. If we can't do the conversion, return zero. */
tree tree
mathfn_built_in (tree type, enum built_in_function fn) mathfn_built_in (tree type, enum built_in_function fn)
{ {
enum built_in_function fcode = NOT_BUILT_IN; const enum machine_mode type_mode = TYPE_MODE (type);
if (TYPE_MODE (type) == TYPE_MODE (double_type_node)) enum built_in_function fcode, fcodef, fcodel;
switch (fn)
{ switch (fn)
case BUILT_IN_SQRT: {
case BUILT_IN_SQRTF: CASE_MATHFN (BUILT_IN_ATAN)
case BUILT_IN_SQRTL: CASE_MATHFN (BUILT_IN_CEIL)
fcode = BUILT_IN_SQRT; CASE_MATHFN (BUILT_IN_COS)
break; CASE_MATHFN (BUILT_IN_EXP)
case BUILT_IN_SIN: CASE_MATHFN (BUILT_IN_FLOOR)
case BUILT_IN_SINF: CASE_MATHFN (BUILT_IN_LOG)
case BUILT_IN_SINL: CASE_MATHFN (BUILT_IN_NEARBYINT)
fcode = BUILT_IN_SIN; CASE_MATHFN (BUILT_IN_ROUND)
break; CASE_MATHFN (BUILT_IN_SIN)
case BUILT_IN_COS: CASE_MATHFN (BUILT_IN_SQRT)
case BUILT_IN_COSF: CASE_MATHFN (BUILT_IN_TAN)
case BUILT_IN_COSL: CASE_MATHFN (BUILT_IN_TRUNC)
fcode = BUILT_IN_COS;
break;
case BUILT_IN_EXP:
case BUILT_IN_EXPF:
case BUILT_IN_EXPL:
fcode = BUILT_IN_EXP;
break;
case BUILT_IN_LOG:
case BUILT_IN_LOGF:
case BUILT_IN_LOGL:
fcode = BUILT_IN_LOG;
break;
case BUILT_IN_TAN:
case BUILT_IN_TANF:
case BUILT_IN_TANL:
fcode = BUILT_IN_TAN;
break;
case BUILT_IN_ATAN:
case BUILT_IN_ATANF:
case BUILT_IN_ATANL:
fcode = BUILT_IN_ATAN;
break;
case BUILT_IN_FLOOR:
case BUILT_IN_FLOORF:
case BUILT_IN_FLOORL:
fcode = BUILT_IN_FLOOR;
break;
case BUILT_IN_CEIL:
case BUILT_IN_CEILF:
case BUILT_IN_CEILL:
fcode = BUILT_IN_CEIL;
break;
case BUILT_IN_TRUNC:
case BUILT_IN_TRUNCF:
case BUILT_IN_TRUNCL:
fcode = BUILT_IN_TRUNC;
break;
case BUILT_IN_ROUND:
case BUILT_IN_ROUNDF:
case BUILT_IN_ROUNDL:
fcode = BUILT_IN_ROUND;
break;
case BUILT_IN_NEARBYINT:
case BUILT_IN_NEARBYINTF:
case BUILT_IN_NEARBYINTL:
fcode = BUILT_IN_NEARBYINT;
break;
default:
abort ();
}
else if (TYPE_MODE (type) == TYPE_MODE (float_type_node))
switch (fn)
{
case BUILT_IN_SQRT:
case BUILT_IN_SQRTF:
case BUILT_IN_SQRTL:
fcode = BUILT_IN_SQRTF;
break;
case BUILT_IN_SIN:
case BUILT_IN_SINF:
case BUILT_IN_SINL:
fcode = BUILT_IN_SINF;
break;
case BUILT_IN_COS:
case BUILT_IN_COSF:
case BUILT_IN_COSL:
fcode = BUILT_IN_COSF;
break;
case BUILT_IN_EXP:
case BUILT_IN_EXPF:
case BUILT_IN_EXPL:
fcode = BUILT_IN_EXPF;
break;
case BUILT_IN_LOG:
case BUILT_IN_LOGF:
case BUILT_IN_LOGL:
fcode = BUILT_IN_LOGF;
break;
case BUILT_IN_TAN:
case BUILT_IN_TANF:
case BUILT_IN_TANL:
fcode = BUILT_IN_TANF;
break;
case BUILT_IN_ATAN:
case BUILT_IN_ATANF:
case BUILT_IN_ATANL:
fcode = BUILT_IN_ATANF;
break;
case BUILT_IN_FLOOR:
case BUILT_IN_FLOORF:
case BUILT_IN_FLOORL:
fcode = BUILT_IN_FLOORF;
break;
case BUILT_IN_CEIL:
case BUILT_IN_CEILF:
case BUILT_IN_CEILL:
fcode = BUILT_IN_CEILF;
break;
case BUILT_IN_TRUNC:
case BUILT_IN_TRUNCF:
case BUILT_IN_TRUNCL:
fcode = BUILT_IN_TRUNCF;
break;
case BUILT_IN_ROUND:
case BUILT_IN_ROUNDF:
case BUILT_IN_ROUNDL:
fcode = BUILT_IN_ROUNDF;
break;
case BUILT_IN_NEARBYINT:
case BUILT_IN_NEARBYINTF:
case BUILT_IN_NEARBYINTL:
fcode = BUILT_IN_NEARBYINTF;
break;
default:
abort ();
}
else if (TYPE_MODE (type) == TYPE_MODE (long_double_type_node))
switch (fn)
{
case BUILT_IN_SQRT:
case BUILT_IN_SQRTF:
case BUILT_IN_SQRTL:
fcode = BUILT_IN_SQRTL;
break;
case BUILT_IN_SIN:
case BUILT_IN_SINF:
case BUILT_IN_SINL:
fcode = BUILT_IN_SINL;
break;
case BUILT_IN_COS:
case BUILT_IN_COSF:
case BUILT_IN_COSL:
fcode = BUILT_IN_COSL;
break;
case BUILT_IN_EXP:
case BUILT_IN_EXPF:
case BUILT_IN_EXPL:
fcode = BUILT_IN_EXPL;
break;
case BUILT_IN_LOG:
case BUILT_IN_LOGF:
case BUILT_IN_LOGL:
fcode = BUILT_IN_LOGL;
break;
case BUILT_IN_TAN:
case BUILT_IN_TANF:
case BUILT_IN_TANL:
fcode = BUILT_IN_TANL;
break;
case BUILT_IN_ATAN:
case BUILT_IN_ATANF:
case BUILT_IN_ATANL:
fcode = BUILT_IN_ATANL;
break;
case BUILT_IN_FLOOR:
case BUILT_IN_FLOORF:
case BUILT_IN_FLOORL:
fcode = BUILT_IN_FLOORL;
break;
case BUILT_IN_CEIL:
case BUILT_IN_CEILF:
case BUILT_IN_CEILL:
fcode = BUILT_IN_CEILL;
break;
case BUILT_IN_TRUNC:
case BUILT_IN_TRUNCF:
case BUILT_IN_TRUNCL:
fcode = BUILT_IN_TRUNCL;
break;
case BUILT_IN_ROUND:
case BUILT_IN_ROUNDF:
case BUILT_IN_ROUNDL:
fcode = BUILT_IN_ROUNDL;
break;
case BUILT_IN_NEARBYINT:
case BUILT_IN_NEARBYINTF:
case BUILT_IN_NEARBYINTL:
fcode = BUILT_IN_NEARBYINTL;
break;
default: default:
abort (); return 0;
} }
return implicit_built_in_decls[fcode];
if (type_mode == TYPE_MODE (double_type_node))
return implicit_built_in_decls[fcode];
else if (type_mode == TYPE_MODE (float_type_node))
return implicit_built_in_decls[fcodef];
else if (type_mode == TYPE_MODE (long_double_type_node))
return implicit_built_in_decls[fcodel];
else
return 0;
} }
/* If errno must be maintained, expand the RTL to check if the result, /* If errno must be maintained, expand the RTL to check if the result,
......
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