On Wed, Feb 26, 2020 at 2:46 PM Jakub Jelinek <ja...@redhat.com> wrote:
>
> On Wed, Feb 26, 2020 at 10:32:17AM -0300, Tulio Magno Quites Machado Filho 
> wrote:
> > Jakub Jelinek <ja...@redhat.com> writes:
> >
> > > Can you please explain how do you want to pass the
> > > void sincos (double, double *, double *);
> > > arguments?  I must say it isn't entirely clear from the document.
> > > You talk there about double[2], but sincos certainly doesn't have such an
> > > argument.
> >
> > The plan [1] is to return a struct instead, i.e.:
> >
> >     struct sincosret _ZGVbN2v_sincos (vector double);
> >     struct sincosretf _ZGVbN4v_sincosf (vector float);
>
> Ugh, then certainly it shouldn't be mangled as simd variant of sincos, it
> needs to be called something else.
> The ABI can't be written for a single, even if commonly used, function, but
> needs to be generic.
> And if I have a
> #pragma omp declare simd
> void foo (double x, double *y, double *z);
> then from the prototype there is no way to find out that it only uses the
> second two arguments to store a single double through them.  It could very
> well do
> void foo (double x, double *y, double *z) {
>   y[0] = y[1] + x;
>   z[0] = z[1] + x;
> }
> or anything else and then you can't transform it to something like that.

Yeah.  I think you have to approach the sincos case from our internal
__builtin_cexpi which means

_Complex double foo (double);

and how that represents itself with OpenMP SIMD.

Richard.


>         Jakub
>

Reply via email to