diff mbox

[IA64,RFT] : Implement PR 71242, Missing built-in functions for float128 NaNs

Message ID CAFULd4YSxGqkTzp7NiKcqtBB4gya_ameFeSk7E3W0Y4E4rW8uw@mail.gmail.com
State New
Headers show

Commit Message

Uros Bizjak June 12, 2016, 6:36 p.m. UTC
Hello!

The functionality is the same as x86 version, ported to IA64.

2016-06-12  Uros Bizjak  <ubizjak@gmail.com>

    PR target/71242
    * config/ia64/ia64.c (enum ia64_builtins) [IA64_BUILTIN_NANQ]: New.
    [IA64_BUILTIN_NANSQ]: Ditto.
    (ia64_fold_builtin): New function.
    (TARGET_FOLD_BUILTIN): New define.
    (ia64_init_builtins) Declare const_string_type node.
    Add __builtin_nanq and __builtin_nansq builtin functions.
    (ia64_expand_builtin): Handle IA64_BUILTIN_NANQ and IA64_BUILTIN_NANSQ.

testsuite/ChangeLog:

2016-06-12  Uros Bizjak  <ubizjak@gmail.com>

    PR target/71241
    * testsuite/gcc.dg/torture/float128-nan.c: Also run on ia64-*-*.

Tested by building croscompiller to ia64-linux-gnu and eyeballed
resulting assembly.

Can someone please test this patch on a real IA64 ?

Uros.

Comments

Alexander Monakov June 16, 2016, 10:44 a.m. UTC | #1
Hi,

> 2016-06-12  Uros Bizjak  <ubizjak@gmail.com>
> 
>     PR target/71242
>     * config/ia64/ia64.c (enum ia64_builtins) [IA64_BUILTIN_NANQ]: New.
>     [IA64_BUILTIN_NANSQ]: Ditto.
>     (ia64_fold_builtin): New function.
>     (TARGET_FOLD_BUILTIN): New define.
>     (ia64_init_builtins) Declare const_string_type node.
>     Add __builtin_nanq and __builtin_nansq builtin functions.
>     (ia64_expand_builtin): Handle IA64_BUILTIN_NANQ and IA64_BUILTIN_NANSQ.
> 
> testsuite/ChangeLog:
> 
> 2016-06-12  Uros Bizjak  <ubizjak@gmail.com>
> 
>     PR target/71241
>     * testsuite/gcc.dg/torture/float128-nan.c: Also run on ia64-*-*.
> 
> Tested by building croscompiller to ia64-linux-gnu and eyeballed
> resulting assembly.
> 
> Can someone please test this patch on a real IA64 ?

I gave it a shot.  It bootstraps, and the float128-nan.c test passes.
Unfortunately, I had trouble running the testsuite to completion, but fwiw I
don't see anything alarming in the partial results I got.

Alexander
Uros Bizjak June 16, 2016, 2:34 p.m. UTC | #2
On Thu, Jun 16, 2016 at 12:44 PM, Alexander Monakov <amonakov@ispras.ru> wrote:
> Hi,
>
>> 2016-06-12  Uros Bizjak  <ubizjak@gmail.com>
>>
>>     PR target/71242
>>     * config/ia64/ia64.c (enum ia64_builtins) [IA64_BUILTIN_NANQ]: New.
>>     [IA64_BUILTIN_NANSQ]: Ditto.
>>     (ia64_fold_builtin): New function.
>>     (TARGET_FOLD_BUILTIN): New define.
>>     (ia64_init_builtins) Declare const_string_type node.
>>     Add __builtin_nanq and __builtin_nansq builtin functions.
>>     (ia64_expand_builtin): Handle IA64_BUILTIN_NANQ and IA64_BUILTIN_NANSQ.
>>
>> testsuite/ChangeLog:
>>
>> 2016-06-12  Uros Bizjak  <ubizjak@gmail.com>
>>
>>     PR target/71241
>>     * testsuite/gcc.dg/torture/float128-nan.c: Also run on ia64-*-*.
>>
>> Tested by building croscompiller to ia64-linux-gnu and eyeballed
>> resulting assembly.
>>
>> Can someone please test this patch on a real IA64 ?
>
> I gave it a shot.  It bootstraps, and the float128-nan.c test passes.
> Unfortunately, I had trouble running the testsuite to completion, but fwiw I
> don't see anything alarming in the partial results I got.

Many thanks!

I have committed the patch to the mainline to resolve PR71242

Uros.
diff mbox

Patch

Index: config/ia64/ia64.c
===================================================================
--- config/ia64/ia64.c	(revision 237337)
+++ config/ia64/ia64.c	(working copy)
@@ -323,6 +323,7 @@  static void ia64_trampoline_init (rtx, tree, rtx);
 static void ia64_override_options_after_change (void);
 static bool ia64_member_type_forces_blk (const_tree, machine_mode);
 
+static tree ia64_fold_builtin (tree, int, tree *, bool);
 static tree ia64_builtin_decl (unsigned, bool);
 
 static reg_class_t ia64_preferred_reload_class (rtx, reg_class_t);
@@ -372,6 +373,9 @@  static const struct attribute_spec ia64_attribute_
 #undef TARGET_INIT_BUILTINS
 #define TARGET_INIT_BUILTINS ia64_init_builtins
 
+#undef TARGET_FOLD_BUILTIN
+#define TARGET_FOLD_BUILTIN ia64_fold_builtin
+
 #undef TARGET_EXPAND_BUILTIN
 #define TARGET_EXPAND_BUILTIN ia64_expand_builtin
 
@@ -10325,6 +10329,8 @@  enum ia64_builtins
   IA64_BUILTIN_FLUSHRS,
   IA64_BUILTIN_INFQ,
   IA64_BUILTIN_HUGE_VALQ,
+  IA64_BUILTIN_NANQ,
+  IA64_BUILTIN_NANSQ,
   IA64_BUILTIN_max
 };
 
@@ -10353,6 +10359,9 @@  ia64_init_builtins (void)
   if (!TARGET_HPUX)
     {
       tree ftype;
+      tree const_string_type
+	= build_pointer_type (build_qualified_type
+			      (char_type_node, TYPE_QUAL_CONST));
       tree float128_type = make_node (REAL_TYPE);
 
       TYPE_PRECISION (float128_type) = 128;
@@ -10372,6 +10381,21 @@  ia64_init_builtins (void)
       ia64_builtins[IA64_BUILTIN_HUGE_VALQ] = decl;
 
       ftype = build_function_type_list (float128_type,
+					const_string_type,
+					NULL_TREE);
+      decl = add_builtin_function ("__builtin_nanq", ftype,
+				   IA64_BUILTIN_NANQ, BUILT_IN_MD,
+				   "nanq", NULL_TREE);
+      TREE_READONLY (decl) = 1;
+      ia64_builtins[IA64_BUILTIN_NANQ] = decl;
+
+      decl = add_builtin_function ("__builtin_nansq", ftype,
+				   IA64_BUILTIN_NANSQ, BUILT_IN_MD,
+				   "nansq", NULL_TREE);
+      TREE_READONLY (decl) = 1;
+      ia64_builtins[IA64_BUILTIN_NANSQ] = decl;
+
+      ftype = build_function_type_list (float128_type,
 					float128_type,
 					NULL_TREE);
       decl = add_builtin_function ("__builtin_fabsq", ftype,
@@ -10427,6 +10451,41 @@  ia64_init_builtins (void)
     }
 }
 
+static tree
+ia64_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
+		   tree *args, bool ignore ATTRIBUTE_UNUSED)
+{
+  if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
+    {
+      enum ia64_builtins fn_code = (enum ia64_builtins)
+				   DECL_FUNCTION_CODE (fndecl);
+      switch (fn_code)
+	{
+	case IA64_BUILTIN_NANQ:
+	case IA64_BUILTIN_NANSQ:
+	  {
+	    tree type = TREE_TYPE (TREE_TYPE (fndecl));
+	    const char *str = c_getstr (*args);
+	    int quiet = fn_code == IA64_BUILTIN_NANQ;
+	    REAL_VALUE_TYPE real;
+
+	    if (str && real_nan (&real, str, quiet, TYPE_MODE (type)))
+	      return build_real (type, real);
+	    return NULL_TREE;
+	  }
+
+	default:
+	  break;
+	}
+    }
+
+#ifdef SUBTARGET_FOLD_BUILTIN
+  return SUBTARGET_FOLD_BUILTIN (fndecl, n_args, args, ignore);
+#endif
+
+  return NULL_TREE;
+}
+
 rtx
 ia64_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
 		     machine_mode mode ATTRIBUTE_UNUSED,
@@ -10469,6 +10528,8 @@  ia64_expand_builtin (tree exp, rtx target, rtx sub
 	return target;
       }
 
+    case IA64_BUILTIN_NANQ:
+    case IA64_BUILTIN_NANSQ:
     case IA64_BUILTIN_FABSQ:
     case IA64_BUILTIN_COPYSIGNQ:
       return expand_call (exp, target, ignore);
Index: testsuite/gcc.dg/torture/float128-nan.c
===================================================================
--- testsuite/gcc.dg/torture/float128-nan.c	(revision 237338)
+++ testsuite/gcc.dg/torture/float128-nan.c	(working copy)
@@ -1,5 +1,5 @@ 
 /* Test __float128 NaN generation.  */
-/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-do run { target ia64-*-* i?86-*-* x86_64-*-* } } */
 /* { dg-require-effective-target fenv_exceptions } */
 /* { dg-options "" } */