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 >