patch: Re: rfc: auto-casted vector types

Aldy Hernandez aldyh@redhat.com
Wed Feb 19 19:14:00 GMT 2003


> Sounds reasonable, but what I thought your last set of changes removes 
> the need to do any casts between the various V... modes.  Is this not 
> true?  If so, why are the casts required at all?

For opaque types, yes.  The problem is that the builtins return V2SI, 
not an opaque type.  So, if we remove the line Geoff suggested you 
would not be able to do this:

#define __ev_addw(a,b) __builtin_spe_evaddw((__v2si) (a), (__v2si) (b))
vector float foo;
foo = __ev_addw(x,y);

...because __builtin_spe_evaddw returns a V2SI, no a type with an 
underlying name of __ev64_opaque__.  That __ev64_opaque__ is a V2SI is 
purely coincidential, what we're interested in is if the type name is 
actually called "__ev64_opaque__".  If you look at the current 
definition for rs6000_spe_vector_types_compatible(), you will see:

static bool
rs6000_spe_vector_types_compatible (t1, t2)
      tree t1;
      tree t2;
{
   if (!TARGET_SPE
       || TREE_CODE (t1) != VECTOR_TYPE || TREE_CODE (t2) != VECTOR_TYPE)
     return 0;

   if (TYPE_NAME (t1) || TYPE_NAME (t2))
     return is_ev64_opaque_type (t1) || is_ev64_opaque_type (t2);

   /* FIXME: We assume V2SI is the opaque type, so we accidentally
      allow inter conversion to and from V2SI modes.  We could use
      V1D1, and rewrite <spe.h> accordingly.  */
   return t1 == V2SI_type_node || t2 == V2SI_type_node;
}

is_ev64_opaque_type returns true if the underlying type is a typedef 
actually named "__ev64_opaque__".  Geoff has suggested we remove the 
last check for V2SI_type_node.  So I'm suggesting we do as Geoff said, 
and then cast the return arguments from the builtins to __ev64_opaque__.

I hope this makes it clearer.

Aldy



More information about the Gcc-patches mailing list