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. Jakub