Yes, I am aware of both types of vector shift. Our target VLIW
actually supports both and I have implemented all related patterns
in our porting. But it would be still nice to allow programmer 
explicitly use vector shift, preferably both types.

Bingfeng

> -----Original Message-----
> From: Michael Meissner [mailto:meiss...@linux.vnet.ibm.com] 
> Sent: 24 February 2009 21:07
> To: Bingfeng Mei
> Cc: gcc@gcc.gnu.org
> Subject: Re: Native support for vector shift
> 
> On Tue, Feb 24, 2009 at 06:15:37AM -0800, Bingfeng Mei wrote:
> > Hello,
> > For the targets that support vectors, we can write the 
> following code:
> > 
> > typedef short          V4H  __attribute__ ((vector_size (8)));
> > 
> > V4H tst(V4H a, V4H b){
> >   return a + b;
> > }
> > 
> > Other operators such as -, *, |, &, ^ etc are also 
> supported.  However, vector shift
> > is not supported by frontend, including both scalar and 
> vector second operands. 
> > 
> > V4H tst(V4H a, V4H b){
> >   return a << 3;
> > }
> > 
> > V4H tst(V4H a, V4H b){
> >   return a << b;
> > }
> > 
> > Currently, we have to use intrinsics to support such shift. 
> Isn't syntax of vector
> > shift intuitive enough to be supported natively? Someone 
> may argue it breaks the
> > C language. But vector is a GCC extension anyway. Support 
> for vector add/sub/etc
> > already break C syntax. Any thought? Sorry if this issue 
> had been raised in past.
> 
> Note, internally there are two different types of vector 
> shift.  Some machines
> support a vector shift by a scalar, some machines support a 
> vector shift by a
> vector.  One future machine (x86_64 with -msse5) can support 
> both types of
> vector shifts.
> 
> The auto vectorizer now can deal with both types:
> 
>       for (i = 0; i < n; i++)
>         a[i] = b[i] << c
> 
> will generate a vector shift by a scalar on machines with 
> that support, and
> splat the scalar into a vector for the second set of machines.
> 
> If the machine only has vector shift by a scalar, the auto 
> vectorizer will not
> generate a vector shift for:
> 
>       for (i = 0; i < n; i++)
>         a[i] = b[i] << c[i]
> 
> Internally, the compiler uses the standard shift names for 
> vector shift by a
> scalar (i.e. ashl<type>, ashr<type>, lshl<type>), and a v 
> prefix for the vector
> by vector shifts (i.e. vashl<type>, vashr<type>, vlshl<type>).
> 
> The rotate patterns are also similar.
> 
> -- 
> Michael Meissner, IBM
> 4 Technology Place Drive, MS 2203A, Westford, MA, 01886, USA
> meiss...@linux.vnet.ibm.com
> 
> 

Reply via email to