On Wed, Jul 18, 2018 at 8:08 PM Richard Sandiford
<richard.sandif...@arm.com> wrote:
>
> This patch adds the target framework for handling the SVE ACLE,
> starting with four functions: svadd, svptrue, svsub and svsubr.
>
> The ACLE has both overloaded and non-overloaded names.  Without
> the equivalent of clang's __attribute__((overloadable)), a header
> file that declared all functions would need three sets of declarations:
>
> - the non-overloaded forms (used for both C and C++)
> - _Generic-based macros to handle overloading in C
> - normal overloaded inline functions for C++
>
> This would likely require a lot of cut-&-paste.  It would probably
> also lead to poor diagnosics and be slow to parse.
>
> Another consideration is that some functions require certain arguments
> to be integer constant expressions.  We can (sort of) enforce that
> for calls to built-in functions using resolve_overloaded_builtin,
> but it would be harder to enforce with inline forwarder functions.
>
> For these reasons and others, the patch takes the approach of adding
> a pragma that gets the compiler to insert the definitions itself.
> This requires a slight variation on the existing lang hooks for
> built-in functions, but otherwise it seems to just work.

I guess you did consider auto-generating the three variants from a template?

> It was easier to add the support without enumerating every function
> at build time.  This in turn meant that it was easier if the SVE
> builtins occupied a distinct numberspace from the existing AArch64 ones.
> The patch therefore divides the built-in functions codes into "major"
> and "minor" codes.  At present the major code is just "general" or "SVE".
>
> For now, the patch is only expected to work for fixed-length SVE.
> Some uses of the ACLE do manage to squeak through the front-end
> in the normal vector-length agnostic mode, but that's more by
> accident than design.  We're planning to work on proper frontend
> support for "sizeless" types in parallel with the backend changes.
>
> Other things not handled yet:
>
> - support for the SVE AAPCS
> - handling the built-ins correctly when the compiler is invoked
>   without SVE enabled (e.g. if SVE is enabled later by a pragma)
>
> Both of these are blockers to merging the support into trunk.
>
> The aim is to make sure when adding a function that the function
> produces the expected assembly output for all relevant combinations.
> The patch adds a new check-function-bodies test to try to make
> that easier.
>
> Tested on aarch64-linux-gnu (with and without SVE) and committed
> to aarch64/sve-acle-branch.
>
> Richard
>
>

Reply via email to