Don't use BUILT_IN_IROUND for __float128.
authorJanne Blomqvist <jb@gcc.gnu.org>
Fri, 16 Mar 2012 08:14:01 +0000 (10:14 +0200)
committerJanne Blomqvist <jb@gcc.gnu.org>
Fri, 16 Mar 2012 08:14:01 +0000 (10:14 +0200)
2012-03-16  Janne Blomqvist  <jb@gcc.gnu.org>

       * trans-intrinsic.c (build_round_expr): Don't use BUILT_IN_IROUND
       for __float128.

From-SVN: r185453

gcc/fortran/ChangeLog
gcc/fortran/trans-intrinsic.c

index a03df3a..bdc2d84 100644 (file)
@@ -1,3 +1,8 @@
+2012-03-16  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       * trans-intrinsic.c (build_round_expr): Don't use BUILT_IN_IROUND
+       for __float128.
+
 2012-03-15  Janne Blomqvist  <jb@gcc.gnu.org>
 
        * f95-lang.c (gfc_init_builtin_functions): Initialize
index 5e54d8e..876eec5 100644 (file)
@@ -383,10 +383,11 @@ build_round_expr (tree arg, tree restype)
   resprec = TYPE_PRECISION (restype);
 
   /* 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)
+     (iround, available only as a builtin, therefore cannot use it for
+     __float128), long int intrinsic (lround family) or long long
+     intrinsic (llround).  We might also need to convert the result
+     afterwards.  */
+  if (resprec <= INT_TYPE_SIZE && argprec <= LONG_DOUBLE_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);