On Tue, 19 Jul 2016, James Greenhalgh wrote:

> These slightly complicate the description you give above as we now want
> two behaviours. Where the 16-bit floating point extensions are available,
> we want to use the native operations (FLT_EVAL_METHOD == 16). Where they
> are not available we want to use promotion to float (FLT_EVAL_METHOD == 0).

That's not a complication since TARGET_FLT_EVAL_METHOD already can and 
does depend on target options.

The complications are that the present excess precision support includes 
code to default the options (in c-opts.c:c_common_post_options and 
toplev.c:init_excess_precision), and then to use them (in 
tree.c:excess_precision_type and c-cppbuiltin.c:c_cpp_builtins), that (a) 
only handles the C99/C11 values, (b) ignores the possibility of types 
narrower than float and (c) assumes, when determining the defaults, that 
excess precision is x86-style, i.e. the back end pretending to have 
operations it does not have and C99-style excess precision being 
inefficient so only desired in standards conformance modes.

(a) and (b) are straightforward to fix.  But to fix (c), first you need to 
work out the design for how you actually want the compiler to behave for 
ARM / AArch64, for both FLT_EVAL_METHOD values, outside standards 
conformance modes.  Then you need to work out what that means for the 
initialization of the relevant variables, inside and outside standards 
conformance modes (remembering that for most targets, all the excess 
precision logic *can* be elided because there aren't any types narrower 
than float and so FLT_EVAL_METHOD == 0 really does mean no excess 
precision).  And you need to make all the functions I listed respect the 
new values and the new semantics for the value 0, and add appropriate 
testcases.

> I'm hoping that enabling _Float16 for ARM/AArch64 should not be too
> difficult with the groundwork in your patches, but I would appreciate any
> pointers on where I am likely to run in to trouble; I haven't worked in the
> front-end before.

The actual C front-end code, outside of the functions I listed, should not 
require any changes; it just uses excess_precision_type.

You do need to make appropriate arrangements for _Complex _Float16 
arithmetic.  See PR 63250.  For things to work when you don't promote 
(FLT_EVAL_METHOD == 16) you'll need to arrange for the relevant libgcc 
functions to be built for HCmode (cf. the powerpc float128 issue of 
needing to build them for KCmode to avoid the present duplicate copies of 
those functions).

-- 
Joseph S. Myers
jos...@codesourcery.com

Reply via email to