[Patch i386] PR78509 - TARGET_C_EXCESS_PRECISION should not return

"unpredictable" for EXCESS_PRECISION_TYPE_STANDARD

gcc/

	PR target/78509
	* config/i386/i386.c (i386_excess_precision): Do not return
	FLT_EVAL_METHOD_UNPREDICTABLE when "type" is
	EXCESS_PRECISION_TYPE_STANDARD.
	* target.def (excess_precision): Document that targets should
	not return FLT_EVAL_METHOD_UNPREDICTABLE when "type" is
	EXCESS_PRECISION_TYPE_STANDARD or EXCESS_PRECISION_TYPE_FAST.
	Fix typo in first sentence.
	* doc/tm.texi: Regenerate.

From-SVN: r242866
This commit is contained in:
James Greenhalgh 2016-11-25 09:25:31 +00:00 committed by James Greenhalgh
parent 5bcfb22cf6
commit 2dbe91cff1
4 changed files with 39 additions and 14 deletions

View File

@ -1,3 +1,15 @@
2016-11-24 James Greenahlgh <james.greenhalgh@arm.com>
PR target/78509
* config/i386/i386.c (i386_excess_precision): Do not return
FLT_EVAL_METHOD_UNPREDICTABLE when "type" is
EXCESS_PRECISION_TYPE_STANDARD.
* target.def (excess_precision): Document that targets should
not return FLT_EVAL_METHOD_UNPREDICTABLE when "type" is
EXCESS_PRECISION_TYPE_STANDARD or EXCESS_PRECISION_TYPE_FAST.
Fix typo in first sentence.
* doc/tm.texi: Regenerate.
2016-11-25 Richard Biener <rguenther@suse.de>
PR tree-optimization/78396

View File

@ -51039,17 +51039,26 @@ ix86_excess_precision (enum excess_precision_type type)
case EXCESS_PRECISION_TYPE_IMPLICIT:
/* Otherwise, the excess precision we want when we are
in a standards compliant mode, and the implicit precision we
provide can be identical. */
provide would be identical were it not for the unpredictable
cases. */
if (!TARGET_80387)
return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT;
else if (TARGET_MIX_SSE_I387)
return FLT_EVAL_METHOD_UNPREDICTABLE;
else if (!TARGET_SSE_MATH)
return FLT_EVAL_METHOD_PROMOTE_TO_LONG_DOUBLE;
else if (TARGET_SSE2)
return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT;
else
return FLT_EVAL_METHOD_UNPREDICTABLE;
else if (!TARGET_MIX_SSE_I387)
{
if (!TARGET_SSE_MATH)
return FLT_EVAL_METHOD_PROMOTE_TO_LONG_DOUBLE;
else if (TARGET_SSE2)
return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT;
}
/* If we are in standards compliant mode, but we know we will
calculate in unpredictable precision, return
FLT_EVAL_METHOD_FLOAT. There is no reason to introduce explicit
excess precision if the target can't guarantee it will honor
it. */
return (type == EXCESS_PRECISION_TYPE_STANDARD
? FLT_EVAL_METHOD_PROMOTE_TO_FLOAT
: FLT_EVAL_METHOD_UNPREDICTABLE);
default:
gcc_unreachable ();
}

View File

@ -948,7 +948,7 @@ 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{]}}.
Return a value, with the same meaning as the C99 macro @code{FLT_EVAL_METHOD} 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{]}}. Note that unpredictable explicit excess precision does not make sense, so a target should never return @code{FLT_EVAL_METHOD_UNPREDICTABLE} when @var{type} is @code{EXCESS_PRECISION_TYPE_STANDARD} or @code{EXCESS_PRECISION_TYPE_FAST}.
@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})

View File

@ -5466,9 +5466,9 @@ DEFHOOK_UNDOC
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},\
"Return a value, with the same meaning as the C99 macro\
@code{FLT_EVAL_METHOD} 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\
@ -5477,7 +5477,11 @@ DEFHOOK
@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{]}}.",
value set for @option{-fexcess-precision=@r{[}standard@r{|}fast@r{]}}.\
Note that unpredictable explicit excess precision does not make sense,\
so a target should never return @code{FLT_EVAL_METHOD_UNPREDICTABLE}\
when @var{type} is @code{EXCESS_PRECISION_TYPE_STANDARD} or\
@code{EXCESS_PRECISION_TYPE_FAST}.",
enum flt_eval_method, (enum excess_precision_type type),
default_excess_precision)