diff options
author | Roger Sayle <roger@eyesopen.com> | 2003-06-16 12:53:16 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2003-06-16 12:53:16 +0000 |
commit | 82d397c79441ac025ab58fb8a5163f45dbcf4523 (patch) | |
tree | 24bfff3f06bd11da343290bf7f9fda94ee11a36f | |
parent | c6547c920bd81449caa301b2256b85409d6d69fa (diff) | |
download | gcc-82d397c79441ac025ab58fb8a5163f45dbcf4523.zip gcc-82d397c79441ac025ab58fb8a5163f45dbcf4523.tar.gz gcc-82d397c79441ac025ab58fb8a5163f45dbcf4523.tar.bz2 |
optabs.h (enum optab_index): Add new OTI_tan and OTI_atan.
* optabs.h (enum optab_index): Add new OTI_tan and OTI_atan.
(tan_optab, atan_optab): Define corresponding macros.
* optabs.c (init_optabs): Initialize tan_optab and atan_optab.
* genopinit.c (optabs): Implement tan_optab and atan_optab
using tan?f2 and atan?f2 patterns.
* builtins.c (expand_builtin_mathfn): Handle BUILT_IN_TAN{,F,L}
using tan_optab, and BUILT_IN_ATAN{,F,L} using atan_optab.
Change the default value of errno_set to false.
(expand_builtin): Expand BUILT_IN_TAN{,F,L} and BUILT_IN_ATAN{,F,L}
using expand_builtin_mathfn.
* config/i386/i386.md (atansf2, atandf2, atanxf2, atantf2): New
expander patterns implemented using existing atan2?f3 patterns.
* gcc.dg/i386-387-5.c: New test case.
* gcc.dg/i386-387-6.c: New test case.
* gcc.dg/builtins-23.c: New test case.
From-SVN: r68013
-rw-r--r-- | gcc/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/builtins.c | 32 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 52 | ||||
-rw-r--r-- | gcc/genopinit.c | 2 | ||||
-rw-r--r-- | gcc/optabs.c | 2 | ||||
-rw-r--r-- | gcc/optabs.h | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/builtins-23.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/i386-387-5.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/i386-387-6.c | 6 |
10 files changed, 132 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 85934ff..0cd54a0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,21 @@ 2003-06-16 Roger Sayle <roger@eyesopen.com> + * optabs.h (enum optab_index): Add new OTI_tan and OTI_atan. + (tan_optab, atan_optab): Define corresponding macros. + * optabs.c (init_optabs): Initialize tan_optab and atan_optab. + * genopinit.c (optabs): Implement tan_optab and atan_optab + using tan?f2 and atan?f2 patterns. + * builtins.c (expand_builtin_mathfn): Handle BUILT_IN_TAN{,F,L} + using tan_optab, and BUILT_IN_ATAN{,F,L} using atan_optab. + Change the default value of errno_set to false. + (expand_builtin): Expand BUILT_IN_TAN{,F,L} and BUILT_IN_ATAN{,F,L} + using expand_builtin_mathfn. + + * config/i386/i386.md (atansf2, atandf2, atanxf2, atantf2): New + expander patterns implemented using existing atan2?f3 patterns. + +2003-06-16 Roger Sayle <roger@eyesopen.com> + * expr.c (expand_expr <PLUS_EXPR>): If operand_equal_p considers both operands of the addition equal, reuse the expanded RTL. (expand_expr <MULT_EXPR>): Likewise for multiplication. diff --git a/gcc/builtins.c b/gcc/builtins.c index 8379749..efc808d 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -1702,7 +1702,7 @@ expand_builtin_mathfn (tree exp, rtx target, rtx subtarget) tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); tree arglist = TREE_OPERAND (exp, 1); enum machine_mode argmode; - bool errno_set = true; + bool errno_set = false; if (!validate_arglist (arglist, REAL_TYPE, VOID_TYPE)) return 0; @@ -1744,35 +1744,43 @@ expand_builtin_mathfn (tree exp, rtx target, rtx subtarget) case BUILT_IN_SQRT: case BUILT_IN_SQRTF: case BUILT_IN_SQRTL: - builtin_optab = sqrt_optab; break; + errno_set = true; builtin_optab = sqrt_optab; break; case BUILT_IN_EXP: case BUILT_IN_EXPF: case BUILT_IN_EXPL: - builtin_optab = exp_optab; break; + errno_set = true; builtin_optab = exp_optab; break; case BUILT_IN_LOG: case BUILT_IN_LOGF: case BUILT_IN_LOGL: - builtin_optab = log_optab; break; + errno_set = true; builtin_optab = log_optab; break; + case BUILT_IN_TAN: + case BUILT_IN_TANF: + case BUILT_IN_TANL: + builtin_optab = tan_optab; break; + case BUILT_IN_ATAN: + case BUILT_IN_ATANF: + case BUILT_IN_ATANL: + builtin_optab = atan_optab; break; case BUILT_IN_FLOOR: case BUILT_IN_FLOORF: case BUILT_IN_FLOORL: - errno_set = false ; builtin_optab = floor_optab; break; + builtin_optab = floor_optab; break; case BUILT_IN_CEIL: case BUILT_IN_CEILF: case BUILT_IN_CEILL: - errno_set = false ; builtin_optab = ceil_optab; break; + builtin_optab = ceil_optab; break; case BUILT_IN_TRUNC: case BUILT_IN_TRUNCF: case BUILT_IN_TRUNCL: - errno_set = false ; builtin_optab = trunc_optab; break; + builtin_optab = trunc_optab; break; case BUILT_IN_ROUND: case BUILT_IN_ROUNDF: case BUILT_IN_ROUNDL: - errno_set = false ; builtin_optab = round_optab; break; + builtin_optab = round_optab; break; case BUILT_IN_NEARBYINT: case BUILT_IN_NEARBYINTF: case BUILT_IN_NEARBYINTL: - errno_set = false ; builtin_optab = nearbyint_optab; break; + builtin_optab = nearbyint_optab; break; default: abort (); } @@ -4416,6 +4424,12 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode, case BUILT_IN_LOG: case BUILT_IN_LOGF: case BUILT_IN_LOGL: + case BUILT_IN_TAN: + case BUILT_IN_TANF: + case BUILT_IN_TANL: + case BUILT_IN_ATAN: + case BUILT_IN_ATANF: + case BUILT_IN_ATANL: /* Treat these like sqrt only if unsafe math optimizations are allowed, because of possible accuracy problems. */ if (! flag_unsafe_math_optimizations) diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 7ea02a7..4218fb3 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -15855,6 +15855,58 @@ emit_move_insn (operands[2], temp); emit_move_insn (operands[7], CONST1_RTX (XFmode)); /* fld1 */ }) + +(define_expand "atansf2" + [(parallel [(set (match_operand:SF 0 "register_operand" "") + (unspec:SF [(match_dup 2) + (match_operand:SF 1 "register_operand" "")] + UNSPEC_FPATAN)) + (clobber (match_dup 1))])] + "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 + && flag_unsafe_math_optimizations" +{ + operands[2] = gen_reg_rtx (SFmode); + emit_move_insn (operands[2], CONST1_RTX (SFmode)); /* fld1 */ +}) + +(define_expand "atandf2" + [(parallel [(set (match_operand:DF 0 "register_operand" "") + (unspec:DF [(match_dup 2) + (match_operand:DF 1 "register_operand" "")] + UNSPEC_FPATAN)) + (clobber (match_dup 1))])] + "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 + && flag_unsafe_math_optimizations" +{ + operands[2] = gen_reg_rtx (DFmode); + emit_move_insn (operands[2], CONST1_RTX (DFmode)); /* fld1 */ +}) + +(define_expand "atanxf2" + [(parallel [(set (match_operand:XF 0 "register_operand" "") + (unspec:XF [(match_dup 2) + (match_operand:XF 1 "register_operand" "")] + UNSPEC_FPATAN)) + (clobber (match_dup 1))])] + "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 + && flag_unsafe_math_optimizations" +{ + operands[2] = gen_reg_rtx (XFmode); + emit_move_insn (operands[2], CONST1_RTX (XFmode)); /* fld1 */ +}) + +(define_expand "atantf2" + [(parallel [(set (match_operand:TF 0 "register_operand" "") + (unspec:TF [(match_dup 2) + (match_operand:TF 1 "register_operand" "")] + UNSPEC_FPATAN)) + (clobber (match_dup 1))])] + "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 + && flag_unsafe_math_optimizations" +{ + operands[2] = gen_reg_rtx (TFmode); + emit_move_insn (operands[2], CONST1_RTX (TFmode)); /* fld1 */ +}) ;; Block operation instructions diff --git a/gcc/genopinit.c b/gcc/genopinit.c index bba458d..47f441c 100644 --- a/gcc/genopinit.c +++ b/gcc/genopinit.c @@ -125,6 +125,8 @@ static const char * const optabs[] = "cos_optab->handlers[$A].insn_code = CODE_FOR_$(cos$a2$)", "exp_optab->handlers[$A].insn_code = CODE_FOR_$(exp$a2$)", "log_optab->handlers[$A].insn_code = CODE_FOR_$(log$a2$)", + "tan_optab->handlers[$A].insn_code = CODE_FOR_$(tan$a2$)", + "atan_optab->handlers[$A].insn_code = CODE_FOR_$(atan$a2$)", "strlen_optab->handlers[$A].insn_code = CODE_FOR_$(strlen$a$)", "one_cmpl_optab->handlers[$A].insn_code = CODE_FOR_$(one_cmpl$a2$)", "ffs_optab->handlers[$A].insn_code = CODE_FOR_$(ffs$a2$)", diff --git a/gcc/optabs.c b/gcc/optabs.c index 18d9e2a..7f1a5a3 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -5557,6 +5557,8 @@ init_optabs () cos_optab = init_optab (UNKNOWN); exp_optab = init_optab (UNKNOWN); log_optab = init_optab (UNKNOWN); + tan_optab = init_optab (UNKNOWN); + atan_optab = init_optab (UNKNOWN); strlen_optab = init_optab (UNKNOWN); cbranch_optab = init_optab (UNKNOWN); cmov_optab = init_optab (UNKNOWN); diff --git a/gcc/optabs.h b/gcc/optabs.h index 22e2422..0c04a9d 100644 --- a/gcc/optabs.h +++ b/gcc/optabs.h @@ -149,6 +149,10 @@ enum optab_index OTI_trunc, OTI_round, OTI_nearbyint, + /* Tangent */ + OTI_tan, + /* Inverse tangent */ + OTI_atan, /* Compare insn; two operands. */ OTI_cmp, @@ -232,6 +236,8 @@ extern GTY(()) optab optab_table[OTI_MAX]; #define trunc_optab (optab_table[OTI_trunc]) #define round_optab (optab_table[OTI_round]) #define nearbyint_optab (optab_table[OTI_nearbyint]) +#define tan_optab (optab_table[OTI_tan]) +#define atan_optab (optab_table[OTI_atan]) #define cmp_optab (optab_table[OTI_cmp]) #define ucmp_optab (optab_table[OTI_ucmp]) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4371663..ed61bcf8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2003-06-16 Roger Sayle <roger@eyesopen.com> + + * gcc.dg/i386-387-5.c: New test case. + * gcc.dg/i386-387-6.c: New test case. + * gcc.dg/builtins-23.c: New test case. + 2003-06-15 Roger Sayle <roger@eyesopen.com> * gcc.dg/builtins-22.c: New test case. diff --git a/gcc/testsuite/gcc.dg/builtins-23.c b/gcc/testsuite/gcc.dg/builtins-23.c new file mode 100644 index 0000000..f463e17 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtins-23.c @@ -0,0 +1,12 @@ +/* Related to PR optimization/10764 */ + +/* { dg-do compile } */ +/* { dg-options "-O2 -ffast-math" } */ + +double atan(double x); + +double foo(double x) +{ + return atan(atan(x)); +} + diff --git a/gcc/testsuite/gcc.dg/i386-387-5.c b/gcc/testsuite/gcc.dg/i386-387-5.c new file mode 100644 index 0000000..8ccc5c9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/i386-387-5.c @@ -0,0 +1,7 @@ +/* Verify that -mno-fancy-math-387 works. */ +/* { dg-do compile { target "i?86-*-*" } } */ +/* { dg-options "-O -ffast-math -mfpmath=387 -mno-fancy-math-387" } */ +/* { dg-final { scan-assembler "call\t_?atan" } } */ + +double f1(double x) { return __builtin_atan(x); } + diff --git a/gcc/testsuite/gcc.dg/i386-387-6.c b/gcc/testsuite/gcc.dg/i386-387-6.c new file mode 100644 index 0000000..8eb29a1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/i386-387-6.c @@ -0,0 +1,6 @@ +/* Verify that -march overrides -mno-fancy-math-387. */ +/* { dg-do compile { target "i?86-*-*" } } */ +/* { dg-options "-O -ffast-math -mfpmath=387 -march=i686 -mno-fancy-math-387" } */ +/* { dg-final { scan-assembler "fpatan" } } */ + +double f1(double x) { return __builtin_atan(x); } |