[LLVMdev] Possible CellSPU Bug?
B. Scott Michel
scottm at mail.face.aero.org
Thu Mar 3 09:59:55 PST 2011
On Sat, 29 Jan 2011 17:21:07 -0600, David Greene wrote:
> I'm working on enhancing TableGen's type checking and it triggered
> with
> a problem in CellSPU's specification:
>
> XSHWv4i32: (set VECREG:v8i16:$rDest, (sext:v8i16
> VECREG:v4i32:$rSrc))
>
> It's complaining that v4i32 is not smaller than v8i16, which is true
> in
> the sense of vector bit size, and true in the sense of vector element
> size. To me, a sign extension from i32 to i16 makes no sense.
>
>>From the .td file, it looks as if src and dest types have been
>> swapped:
>
> class XSHWVecInst<ValueType in_vectype, ValueType out_vectype>:
> XSHWInst<(outs VECREG:$rDest), (ins VECREG:$rSrc),
> [(set (out_vectype VECREG:$rDest),
> (sext (in_vectype VECREG:$rSrc)))]>;
>
> multiclass ExtendHalfwordWord {
> def v4i32: XSHWVecInst<v4i32, v8i16>;
>
> The multiclass name leads me to believe this was supposed to sign
> extend
> from i16 to i32 but the XSHWVecInst class takes the types in SRC ->
> DST
> order, not DST <- SRC order.
>
> Is this pattern as intended, or did I find a real problem?
>
> -Dave
It's intentional. Everything on Cell is a vector, with the exception of
loads and stores. Unless you really want to write code that determines
the exact vector element that needs to be changed and do all of the
juggling to modify that element. There are no individual registers.
If it's easier to flip the order of the operands, then do so. That's
just style.
-scooter
--
B. Scott Michel, Ph.D.
Director, Computer Systems Research Department
The Aerospace Corporation
Ofc: (310) 336-5034
Cell: (310) 426-4993
More information about the llvm-dev
mailing list