Commit 42e02b20 by James Greenhalgh Committed by James Greenhalgh

[Patch 1/17] Add a new target hook for describing excess precision intentions

gcc/

	* target.def (excess_precision): New hook.
	* target.h (flt_eval_method): New.
	(excess_precision_type): Likewise.
	* targhooks.c (default_excess_precision): New.
	* targhooks.h (default_excess_precision): New.
	* doc/tm.texi.in (TARGET_C_EXCESS_PRECISION): New.
	* doc/tm.texi: Regenerate.

From-SVN: r242771
parent aecc521b
2016-11-23 James Greenhalgh <james.greenhalgh@arm.com>
* target.def (excess_precision): New hook.
* target.h (flt_eval_method): New.
(excess_precision_type): Likewise.
* targhooks.c (default_excess_precision): New.
* targhooks.h (default_excess_precision): New.
* doc/tm.texi.in (TARGET_C_EXCESS_PRECISION): New.
* doc/tm.texi: Regenerate.
2016-11-23 Martin Sebor <msebor@redhat.com>
PR middle-end/78461
......@@ -332,6 +332,24 @@ enum symbol_visibility
VISIBILITY_INTERNAL
};
/* enums used by the targetm.excess_precision hook. */
enum flt_eval_method
{
FLT_EVAL_METHOD_UNPREDICTABLE = -1,
FLT_EVAL_METHOD_PROMOTE_TO_FLOAT = 0,
FLT_EVAL_METHOD_PROMOTE_TO_DOUBLE = 1,
FLT_EVAL_METHOD_PROMOTE_TO_LONG_DOUBLE = 2,
FLT_EVAL_METHOD_PROMOTE_TO_FLOAT16 = 16
};
enum excess_precision_type
{
EXCESS_PRECISION_TYPE_IMPLICIT,
EXCESS_PRECISION_TYPE_STANDARD,
EXCESS_PRECISION_TYPE_FAST
};
/* Support for user-provided GGC and PCH markers. The first parameter
is a pointer to a pointer, the second a cookie. */
typedef void (*gt_pointer_operator) (void *, void *);
......
......@@ -947,6 +947,10 @@ sign-extend the result to 64 bits. On such machines, set
Do not define this macro if it would never modify @var{m}.
@end defmac
@deftypefn {Target Hook} {enum flt_eval_method} TARGET_C_EXCESS_PRECISION (enum excess_precision_type @var{type})
Return a value, with the same meaning as @code{FLT_EVAL_METHOD} C that describes which excess precision should be applied. @var{type} is either @code{EXCESS_PRECISION_TYPE_IMPLICIT}, @code{EXCESS_PRECISION_TYPE_FAST}, or @code{EXCESS_PRECISION_TYPE_STANDARD}. For @code{EXCESS_PRECISION_TYPE_IMPLICIT}, the target should return which precision and range operations will be implictly evaluated in regardless of the excess precision explicitly added. For @code{EXCESS_PRECISION_TYPE_STANDARD} and @code{EXCESS_PRECISION_TYPE_FAST}, the target should return the explicit excess precision that should be added depending on the value set for @option{-fexcess-precision=@r{[}standard@r{|}fast@r{]}}.
@end deftypefn
@deftypefn {Target Hook} machine_mode TARGET_PROMOTE_FUNCTION_MODE (const_tree @var{type}, machine_mode @var{mode}, int *@var{punsignedp}, const_tree @var{funtype}, int @var{for_return})
Like @code{PROMOTE_MODE}, but it is applied to outgoing function arguments or
function return values. The target hook should return the new mode
......
......@@ -921,6 +921,8 @@ sign-extend the result to 64 bits. On such machines, set
Do not define this macro if it would never modify @var{m}.
@end defmac
@hook TARGET_C_EXCESS_PRECISION
@hook TARGET_PROMOTE_FUNCTION_MODE
@defmac PARM_BOUNDARY
......
......@@ -5464,6 +5464,23 @@ DEFHOOK_UNDOC
machine_mode, (char c),
default_mode_for_suffix)
DEFHOOK
(excess_precision,
"Return a value, with the same meaning as @code{FLT_EVAL_METHOD} C that\
describes which excess precision should be applied. @var{type} is\
either @code{EXCESS_PRECISION_TYPE_IMPLICIT},\
@code{EXCESS_PRECISION_TYPE_FAST}, or\
@code{EXCESS_PRECISION_TYPE_STANDARD}. For\
@code{EXCESS_PRECISION_TYPE_IMPLICIT}, the target should return which\
precision and range operations will be implictly evaluated in regardless\
of the excess precision explicitly added. For\
@code{EXCESS_PRECISION_TYPE_STANDARD} and\
@code{EXCESS_PRECISION_TYPE_FAST}, the target should return the\
explicit excess precision that should be added depending on the\
value set for @option{-fexcess-precision=@r{[}standard@r{|}fast@r{]}}.",
enum flt_eval_method, (enum excess_precision_type type),
default_excess_precision)
HOOK_VECTOR_END (c)
/* Functions specific to the C++ frontend. */
......
......@@ -2135,4 +2135,12 @@ default_min_arithmetic_precision (void)
return WORD_REGISTER_OPERATIONS ? BITS_PER_WORD : BITS_PER_UNIT;
}
/* Default implementation of TARGET_C_EXCESS_PRECISION. */
enum flt_eval_method
default_excess_precision (enum excess_precision_type ATTRIBUTE_UNUSED)
{
return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT;
}
#include "gt-targhooks.h"
......@@ -263,4 +263,7 @@ extern bool default_optab_supported_p (int, machine_mode, machine_mode,
extern unsigned int default_max_noce_ifcvt_seq_cost (edge);
extern unsigned int default_min_arithmetic_precision (void);
extern enum flt_eval_method
default_excess_precision (enum excess_precision_type ATTRIBUTE_UNUSED);
#endif /* GCC_TARGHOOKS_H */
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