summaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>2012-03-15 20:27:07 +0000
committerjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>2012-03-15 20:27:07 +0000
commitf5fdea8087307a3315215cfad6c21412630039ec (patch)
tree9579173dd828b7321d6ff0bd81d503222d4a0b19 /gcc/fortran
parent4c4cd94d7f71c0ac0d95e65d903c248a57a1309f (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/fortran/f95-lang.c14
-rw-r--r--gcc/fortran/mathbuiltins.def1
-rw-r--r--gcc/fortran/trans-intrinsic.c27
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);