diff options
author | Feng Wang <fengwang@nudt.edu.cn> | 2004-05-19 00:34:59 +0000 |
---|---|---|
committer | Paul Brook <pbrook@gcc.gnu.org> | 2004-05-19 00:34:59 +0000 |
commit | 5b200ac2c7278c022c23a684589df1b31a40a153 (patch) | |
tree | 6d5551f77f0b03649dcf0b885fe4be35ce373a23 /libgfortran/m4 | |
parent | 933520b9beeea22009be7637b3186c61679266b0 (diff) | |
download | gcc-5b200ac2c7278c022c23a684589df1b31a40a153.zip gcc-5b200ac2c7278c022c23a684589df1b31a40a153.tar.gz gcc-5b200ac2c7278c022c23a684589df1b31a40a153.tar.bz2 |
f95-lang.c (gfc_init_builtin_functions): Use vold_list_node.
* f95-lang.c (gfc_init_builtin_functions): Use vold_list_node.
Create decls for __builtin_pow{,f}.
* gfortran.h (PREFIX_LEN): Define.
* trans-decl.c (gfor_fndecl_math_powi): Add.
(gfor_fndecl_math_powf, gfor_fndecl_math_pow): Remove.
(gfc_build_intrinsic_function_decls): Create decls for powi.
* trans-expr.c (powi_table): Add.
(gfc_conv_integer_power): Remove.
(gfc_conv_powi): New function.
(gfc_conv_cst_int_power): New function.
(gfc_conv_power_op): Use new powi routines.
* trans.h (struct gfc_powdecl_list): Add.
(gfor_fndecl_math_powi): Add.
(gfor_fndecl_math_powf, gfor_fndecl_math_pow): Remove.
testsuite/
* gfortran.fortran-torture/execute/power.f90: Test constant integers.
libgfortran/
* Makefile.am (i_pow_c): Set it. Add build rule.
(gfor_built_src): Use it.
(m4_files): add m4/pow.m4.
* Makefile.in: Regenerate.
* m4/pow.m4: New file.
* generated/pow_*.c: Regenerate.
From-SVN: r82014
Diffstat (limited to 'libgfortran/m4')
-rw-r--r-- | libgfortran/m4/pow.m4 | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/libgfortran/m4/pow.m4 b/libgfortran/m4/pow.m4 new file mode 100644 index 0000000..4bf453a --- /dev/null +++ b/libgfortran/m4/pow.m4 @@ -0,0 +1,68 @@ +`/* Support routines for the intrinsic power (**) operator. + Copyright 2004 Free Software Foundation, Inc. + Contributed by Paul Brook + +This file is part of the GNU Fortran 95 runtime library (libgfor). + +Libgfor is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +Ligbfor is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with libgfor; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "config.h" +#include "libgfortran.h"' +include(iparm.m4)dnl + +/* Uuse Binary Method to calculate the powi. This is not an optimal but + a simple and reasonable arithmetic. See section 4.6.3, "Evaluation of + Powers" of Donald E. Knuth, "Seminumerical Algorithms", Vol. 2, "The Art + of Computer Programming", 3rd Edition, 1998. */ + +rtype_name +`prefix(pow_'rtype_code`_'atype_code) (rtype_name a, atype_name b) +{ + rtype_name pow, x; + atype_name n, u; + + n = b; + x = a; + pow = 1; + if (n != 0) + { + if (n < 0) + { +ifelse(rtype_letter,i,`dnl + if (x == 1) + return 1; + if (x == -1) + return (n & 1) ? -1 : 1; + return (x == 0) ? 1 / x : 0; +',` + n = -n; + x = pow / x; +')dnl + } + u = n; + for (;;) + { + if (u & 1) + pow *= x; + u >>= 1; + if (u) + x *= x; + else + break; + } + } + return pow; +} |