Commit b6ca982f by Uros Bizjak Committed by Uros Bizjak

re PR target/71242 ([ia64] Missing built-in functions for float128 NaNs)

	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:

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

From-SVN: r237530
parent b07447ba
2016-06-16 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.
2016-06-16 Nick Clifton <nickc@redhat.com> 2016-06-16 Nick Clifton <nickc@redhat.com>
* config/msp430/msp430-opts.h (msp430_hwmult_types): Add * config/msp430/msp430-opts.h (msp430_hwmult_types): Add
......
...@@ -323,6 +323,7 @@ static void ia64_trampoline_init (rtx, tree, rtx); ...@@ -323,6 +323,7 @@ static void ia64_trampoline_init (rtx, tree, rtx);
static void ia64_override_options_after_change (void); static void ia64_override_options_after_change (void);
static bool ia64_member_type_forces_blk (const_tree, machine_mode); 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 tree ia64_builtin_decl (unsigned, bool);
static reg_class_t ia64_preferred_reload_class (rtx, reg_class_t); static reg_class_t ia64_preferred_reload_class (rtx, reg_class_t);
...@@ -372,6 +373,9 @@ static const struct attribute_spec ia64_attribute_table[] = ...@@ -372,6 +373,9 @@ static const struct attribute_spec ia64_attribute_table[] =
#undef TARGET_INIT_BUILTINS #undef TARGET_INIT_BUILTINS
#define TARGET_INIT_BUILTINS ia64_init_builtins #define TARGET_INIT_BUILTINS ia64_init_builtins
#undef TARGET_FOLD_BUILTIN
#define TARGET_FOLD_BUILTIN ia64_fold_builtin
#undef TARGET_EXPAND_BUILTIN #undef TARGET_EXPAND_BUILTIN
#define TARGET_EXPAND_BUILTIN ia64_expand_builtin #define TARGET_EXPAND_BUILTIN ia64_expand_builtin
...@@ -10325,6 +10329,8 @@ enum ia64_builtins ...@@ -10325,6 +10329,8 @@ enum ia64_builtins
IA64_BUILTIN_FLUSHRS, IA64_BUILTIN_FLUSHRS,
IA64_BUILTIN_INFQ, IA64_BUILTIN_INFQ,
IA64_BUILTIN_HUGE_VALQ, IA64_BUILTIN_HUGE_VALQ,
IA64_BUILTIN_NANQ,
IA64_BUILTIN_NANSQ,
IA64_BUILTIN_max IA64_BUILTIN_max
}; };
...@@ -10353,6 +10359,9 @@ ia64_init_builtins (void) ...@@ -10353,6 +10359,9 @@ ia64_init_builtins (void)
if (!TARGET_HPUX) if (!TARGET_HPUX)
{ {
tree ftype; 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); tree float128_type = make_node (REAL_TYPE);
TYPE_PRECISION (float128_type) = 128; TYPE_PRECISION (float128_type) = 128;
...@@ -10372,6 +10381,21 @@ ia64_init_builtins (void) ...@@ -10372,6 +10381,21 @@ ia64_init_builtins (void)
ia64_builtins[IA64_BUILTIN_HUGE_VALQ] = decl; ia64_builtins[IA64_BUILTIN_HUGE_VALQ] = decl;
ftype = build_function_type_list (float128_type, 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, float128_type,
NULL_TREE); NULL_TREE);
decl = add_builtin_function ("__builtin_fabsq", ftype, decl = add_builtin_function ("__builtin_fabsq", ftype,
...@@ -10427,6 +10451,41 @@ ia64_init_builtins (void) ...@@ -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 rtx
ia64_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, ia64_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
machine_mode mode ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED,
...@@ -10469,6 +10528,8 @@ ia64_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, ...@@ -10469,6 +10528,8 @@ ia64_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
return target; return target;
} }
case IA64_BUILTIN_NANQ:
case IA64_BUILTIN_NANSQ:
case IA64_BUILTIN_FABSQ: case IA64_BUILTIN_FABSQ:
case IA64_BUILTIN_COPYSIGNQ: case IA64_BUILTIN_COPYSIGNQ:
return expand_call (exp, target, ignore); return expand_call (exp, target, ignore);
......
2016-06-16 Uros Bizjak <ubizjak@gmail.com>
PR target/71242
* testsuite/gcc.dg/torture/float128-nan.c: Also run on ia64-*-*.
2016-06-16 Jan Hubicka <hubicka@ucw.cz> 2016-06-16 Jan Hubicka <hubicka@ucw.cz>
* g++.dg/vect/pr36648.cc: Disable cunrolli * g++.dg/vect/pr36648.cc: Disable cunrolli
......
/* Test __float128 NaN generation. */ /* Test __float128 NaN generation. */
/* { dg-do run { target i?86-*-* x86_64-*-* } } */ /* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
/* { dg-require-effective-target fenv_exceptions } */ /* { dg-require-effective-target fenv_exceptions } */
/* { dg-options "" } */ /* { dg-options "" } */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment