This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PPC64 libmvec implementation of sincos

On Sat, Dec 28, 2019 at 9:01 PM GT <> wrote:
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> On Monday, December 9, 2019 3:39 AM, Richard Biener <> wrote:
> > > I'm modifying the code trying to get complex double accepted as a valid type by the vectorizer.
> > > This is the first time I'm dealing with GCC source so I ask for some patience.
> > > Function mode_for_vector in gcc/stor-layout.c requires a new else-if for complex double. I cannot
> > > seem to find a header file where MIN_MODE_VECTOR_FLOAT and similar macros are defined. I expect
> > > a new MIN_MODE_COMPLEX_VECTOR_FLOAT to be defined in the same file as the existing similar macros.
> > > How do I go about making this change?
> >
> > You don't want to do it this way but map _Complex double to a vector
> > of 2 * n doubles instead.
> > Look into get_related_vectype_for_scalar_type where it alreday has
> > code to "change" the
> > scalar type into something that fits what we allow for vectors.
> >
> I need more guidance on how to proceed here. Function mode_for_vector is called by
> build_vector_type_for_mode. The latter is called by get_related_vectype_for_scalar_type,
> which you suggested to study for a preferred implementation. The code in mode_for_vector
> relies on the relationship that vector mode E_V2DFmode is composed of E_DFmode scalars.
> The complex argument has mode E_DCmode. Where should I create a relationship between
> E_V2DFmode and E_DCmode so that mode_for_vector returns the appropriate vector mode?
> The solution has to be general so that single precision float complex vectorization is
> also supported.

For _Complex types you call mode_for_vector with the component type
but twice the number
of elements.  I would not suggest to try making a vector type with
complex components.

As for the other question for testing you probably want to provide a
OMP simd declaration
of a function like

_Complex double mycexpi (double);

and make a testcase like

void foo (_Complex double * __restrict out, double *in)
  for (int i = 0; i < 1024; ++i)
       out[i] = mycexpi (in[i]);

or eventually with two output arrays and explicit __real/__imag
processing.  The real
and main question is how is the OMP SIMD declaration of mycexpi looking like?

So I'd completely side-step sincos() and GCCs sincos() ->
__builtin_cepxi transform
and concentrate on OMP SIMD of a function with the signature we need to handle.


> Bert.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]