On Sat, Dec 28, 2019 at 9:01 PM GT <tng...@protonmail.com> wrote: > > ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐ > On Monday, December 9, 2019 3:39 AM, Richard Biener > <richard.guent...@gmail.com> 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. Richard. > Bert.