diff options
author | jb <jb@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-03-15 20:27:07 +0000 |
---|---|---|
committer | jb <jb@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-03-15 20:27:07 +0000 |
commit | f5fdea8087307a3315215cfad6c21412630039ec (patch) | |
tree | 9579173dd828b7321d6ff0bd81d503222d4a0b19 /gcc/fortran | |
parent | 4c4cd94d7f71c0ac0d95e65d903c248a57a1309f (diff) | |
download | gcc-f5fdea8087307a3315215cfad6c21412630039ec.tar.gz |
Enable BUILT_IN_IROUND.
2012-03-15 Janne Blomqvist <jb@gcc.gnu.org>
* f95-lang.c (gfc_init_builtin_functions): Initialize
BUILT_IN_IROUND.
* mathbuiltins.def: Add IROUND.
* trans-intrinsic.c (build_round_expr): Use BUILT_IN_IROUND if
type size matches.
(gfc_build_intrinsic_lib_fndecls): Build iround functions.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@185442 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fortran/f95-lang.c | 14 | ||||
-rw-r--r-- | gcc/fortran/mathbuiltins.def | 1 | ||||
-rw-r--r-- | gcc/fortran/trans-intrinsic.c | 27 |
4 files changed, 36 insertions, 15 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index eae8b067ae3..a03df3aed00 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2012-03-15 Janne Blomqvist <jb@gcc.gnu.org> + + * f95-lang.c (gfc_init_builtin_functions): Initialize + BUILT_IN_IROUND. + * mathbuiltins.def: Add IROUND. + * trans-intrinsic.c (build_round_expr): Use BUILT_IN_IROUND if + type size matches. + (gfc_build_intrinsic_lib_fndecls): Build iround functions. + 2012-03-12 Richard Guenther <rguenther@suse.de> * f95-lang.c (builtin_type_for_size): Use gfc_type_for_size. diff --git a/gcc/fortran/f95-lang.c b/gcc/fortran/f95-lang.c index 05b598ff3ec..3f28e67759f 100644 --- a/gcc/fortran/f95-lang.c +++ b/gcc/fortran/f95-lang.c @@ -773,7 +773,11 @@ gfc_init_builtin_functions (void) gfc_define_builtin ("__builtin_fmodf", mfunc_float[1], BUILT_IN_FMODF, "fmodf", ATTR_CONST_NOTHROW_LEAF_LIST); - /* lround{f,,l} and llround{f,,l} */ + /* iround{f,,l}, lround{f,,l} and llround{f,,l} */ + ftype = build_function_type_list (integer_type_node, + float_type_node, NULL_TREE); + gfc_define_builtin("__builtin_iroundf", ftype, BUILT_IN_IROUNDF, + "iroundf", ATTR_CONST_NOTHROW_LEAF_LIST); ftype = build_function_type_list (long_integer_type_node, float_type_node, NULL_TREE); gfc_define_builtin ("__builtin_lroundf", ftype, BUILT_IN_LROUNDF, @@ -783,6 +787,10 @@ gfc_init_builtin_functions (void) gfc_define_builtin ("__builtin_llroundf", ftype, BUILT_IN_LLROUNDF, "llroundf", ATTR_CONST_NOTHROW_LEAF_LIST); + ftype = build_function_type_list (integer_type_node, + double_type_node, NULL_TREE); + gfc_define_builtin("__builtin_iround", ftype, BUILT_IN_IROUND, + "iround", ATTR_CONST_NOTHROW_LEAF_LIST); ftype = build_function_type_list (long_integer_type_node, double_type_node, NULL_TREE); gfc_define_builtin ("__builtin_lround", ftype, BUILT_IN_LROUND, @@ -792,6 +800,10 @@ gfc_init_builtin_functions (void) gfc_define_builtin ("__builtin_llround", ftype, BUILT_IN_LLROUND, "llround", ATTR_CONST_NOTHROW_LEAF_LIST); + ftype = build_function_type_list (integer_type_node, + long_double_type_node, NULL_TREE); + gfc_define_builtin("__builtin_iroundl", ftype, BUILT_IN_IROUNDL, + "iroundl", ATTR_CONST_NOTHROW_LEAF_LIST); ftype = build_function_type_list (long_integer_type_node, long_double_type_node, NULL_TREE); gfc_define_builtin ("__builtin_lroundl", ftype, BUILT_IN_LROUNDL, diff --git a/gcc/fortran/mathbuiltins.def b/gcc/fortran/mathbuiltins.def index b0bcc1fa602..b3998568b5f 100644 --- a/gcc/fortran/mathbuiltins.def +++ b/gcc/fortran/mathbuiltins.def @@ -64,6 +64,7 @@ OTHER_BUILTIN (FMOD, "fmod", 2, true) OTHER_BUILTIN (FREXP, "frexp", frexp, false) OTHER_BUILTIN (LLROUND, "llround", llround, true) OTHER_BUILTIN (LROUND, "lround", lround, true) +OTHER_BUILTIN (IROUND, "iround", iround, true) OTHER_BUILTIN (NEXTAFTER, "nextafter", 2, true) OTHER_BUILTIN (POW, "pow", 1, true) OTHER_BUILTIN (ROUND, "round", 1, true) diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c index ac9f5074035..5e54d8e019e 100644 --- a/gcc/fortran/trans-intrinsic.c +++ b/gcc/fortran/trans-intrinsic.c @@ -376,28 +376,24 @@ build_round_expr (tree arg, tree restype) { tree argtype; tree fn; - bool longlong; int argprec, resprec; argtype = TREE_TYPE (arg); argprec = TYPE_PRECISION (argtype); resprec = TYPE_PRECISION (restype); - /* Depending on the type of the result, choose the long int intrinsic - (lround family) or long long intrinsic (llround). We might also - need to convert the result afterwards. */ - if (resprec <= LONG_TYPE_SIZE) - longlong = false; + /* Depending on the type of the result, choose the int intrinsic + (iround, available only as a builtin), long int intrinsic (lround + family) or long long intrinsic (llround). We might also need to + convert the result afterwards. */ + if (resprec <= INT_TYPE_SIZE) + fn = builtin_decl_for_precision (BUILT_IN_IROUND, argprec); + else if (resprec <= LONG_TYPE_SIZE) + fn = builtin_decl_for_precision (BUILT_IN_LROUND, argprec); else if (resprec <= LONG_LONG_TYPE_SIZE) - longlong = true; - else - gcc_unreachable (); - - /* Now, depending on the argument type, we choose between intrinsics. */ - if (longlong) fn = builtin_decl_for_precision (BUILT_IN_LLROUND, argprec); else - fn = builtin_decl_for_precision (BUILT_IN_LROUND, argprec); + gcc_unreachable (); return fold_convert (restype, build_call_expr_loc (input_location, fn, 1, arg)); @@ -623,7 +619,7 @@ gfc_build_intrinsic_lib_fndecls (void) q-suffixed functions. */ tree type, complex_type, func_1, func_2, func_cabs, func_frexp; - tree func_lround, func_llround, func_scalbn, func_cpow; + tree func_iround, func_lround, func_llround, func_scalbn, func_cpow; memset (quad_decls, 0, sizeof(tree) * (END_BUILTINS + 1)); @@ -631,6 +627,9 @@ gfc_build_intrinsic_lib_fndecls (void) complex_type = complex_float128_type_node; /* type (*) (type) */ func_1 = build_function_type_list (type, type, NULL_TREE); + /* int (*) (type) */ + func_iround = build_function_type_list (integer_type_node, + type, NULL_TREE); /* long (*) (type) */ func_lround = build_function_type_list (long_integer_type_node, type, NULL_TREE); |