Support for gcc vector attributes, SIMD builtins

Iain Buclaw ibuclaw at ubuntu.com
Sun Feb 6 05:23:17 PST 2011


== Quote from Iain Buclaw (ibuclaw at ubuntu.com)'s article
> == Quote from Mike Farnsworth (mike.farnsworth at gmail.com)'s article
> > On 02/01/2011 10:38 AM, Iain Buclaw wrote:
> > > I haven't given it much thought on how internal representation could be, but I'd
> > > lean on using unions in D code for usage in the language. As its probably most
> > > portable.
> > >
> > > For example, one of the older 'hello vectors' I know of:
> > >
> > > import std.c.stdio;
> > >
> > > pragma(set_attribute, __v4sf, vector_size(16));
> > > typedef float __v4sf;
> > >
> > > union f4vector
> > > {
> > >     __v4sf v;
> > >     float[4] f;
> > > }
> > >
> > > int main()
> > > {
> > >     f4vector a, b, c;
> > >
> > >     a.f = [1, 2, 3, 4];
> > >     b.f = [5, 6, 7, 8];
> > >
> > >     c.v = a.v + b.v;
> > >     printf("%f, %f, %f, %f\n", c.f[0], c.f[1], c.f[2], c.f[3]);
> > >
> > >     return 0;
> > > }
> > I've been giving this a serious try, and while the above works, I can't
> > get any __builtin_... functions to actually work.  I've added support
> > for the VECTOR_TYPE tree code in gcc_type_to_d_type(tree) function (in
> > d_builtins2.cc):
> >         case VECTOR_TYPE:
> >         {
> >             tree baseType = TREE_TYPE(t);
> >             d = gcc_type_to_d_type(baseType, printstuff);
> >             if (d)
> >                 return d;
> >             break;
> >         }
> > This allows it to succeed in interpreting the SSE-related builtins in
> > gcc_type_to_d_type(tree).  Note that all it does is grab the base vector
> > element type and convert that to a D type so as not to confuse the
> > frontend; this way it matches the typedef for __v4sf, so as long as we
> > use the union we won't lose data before we can pass it to a builtin.
> Try:
>         case VECTOR_TYPE:
>         {
>             tree basetype = TYPE_DEBUG_REPRESENTATION_TYPE(t);
>             assert(TREE_CODE(basetype) == RECORD_TYPE);
>             basetype = TREE_TYPE(TYPE_FIELDS(basetype));
>             d = gcc_type_to_d_type(basetype);
>             if (d)
>             {
>                 d->ctype = t;
>                 return d;
>             }
>             break;
>         }
> That makes them static arrays, so you needn't require a whacky union to use vector
> functions.

A better way actually:

        case VECTOR_TYPE:
        {
            d = gcc_type_to_d_type(TREE_TYPE(t));
            if (d)
            {
                d = new TypeSArray(d,
                        new IntegerExp(0, TYPE_VECTOR_SUBPARTS(t),
                            Type::tindex));
                d->ctype = t;
                return d;
            }
            break;
        }

Happy hacking! :)

Regards
Iain


More information about the D.gnu mailing list