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