diff options
author | Kaveh R. Ghazi <ghazi@caip.rutgers.edu> | 2003-08-14 14:38:38 +0000 |
---|---|---|
committer | Kaveh Ghazi <ghazi@gcc.gnu.org> | 2003-08-14 14:38:38 +0000 |
commit | daa027cc473c361231dd4aa9f362674fe2c9a0fb (patch) | |
tree | 023e2c3ab4439753e0c700eba2cc569c5f31246e /gcc/builtins.c | |
parent | d256ac69eee99d5cc5c657bad82f9b1b00431c07 (diff) | |
download | gcc-daa027cc473c361231dd4aa9f362674fe2c9a0fb.zip gcc-daa027cc473c361231dd4aa9f362674fe2c9a0fb.tar.gz gcc-daa027cc473c361231dd4aa9f362674fe2c9a0fb.tar.bz2 |
builtins.c (CASE_MATHFN): New helper macro.
* builtins.c (CASE_MATHFN): New helper macro.
(mathfn_built_in): Simplify and sort.
From-SVN: r70436
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 239 |
1 files changed, 39 insertions, 200 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index a7265bf..5b975f0 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -1470,211 +1470,50 @@ expand_builtin_constant_p (tree arglist, enum machine_mode target_mode) return tmp; } -/* Return mathematic function equivalent to FN but operating directly on TYPE, - if available. */ +/* This helper macro, meant to be used in mathfn_built_in below, + 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 mathfn_built_in (tree type, enum built_in_function fn) { - enum built_in_function fcode = NOT_BUILT_IN; - if (TYPE_MODE (type) == TYPE_MODE (double_type_node)) - switch (fn) - { - case BUILT_IN_SQRT: - case BUILT_IN_SQRTF: - case BUILT_IN_SQRTL: - fcode = BUILT_IN_SQRT; - break; - case BUILT_IN_SIN: - case BUILT_IN_SINF: - case BUILT_IN_SINL: - fcode = BUILT_IN_SIN; - break; - case BUILT_IN_COS: - case BUILT_IN_COSF: - case BUILT_IN_COSL: - 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; + const enum machine_mode type_mode = TYPE_MODE (type); + enum built_in_function fcode, fcodef, fcodel; + + switch (fn) + { + CASE_MATHFN (BUILT_IN_ATAN) + CASE_MATHFN (BUILT_IN_CEIL) + CASE_MATHFN (BUILT_IN_COS) + CASE_MATHFN (BUILT_IN_EXP) + CASE_MATHFN (BUILT_IN_FLOOR) + CASE_MATHFN (BUILT_IN_LOG) + CASE_MATHFN (BUILT_IN_NEARBYINT) + CASE_MATHFN (BUILT_IN_ROUND) + CASE_MATHFN (BUILT_IN_SIN) + CASE_MATHFN (BUILT_IN_SQRT) + CASE_MATHFN (BUILT_IN_TAN) + CASE_MATHFN (BUILT_IN_TRUNC) + 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, |