Alex Susu via llvm-dev
2016-Aug-09 23:21 UTC
[llvm-dev] Vector instruction legalization for v16i32 integer type when the only supported type is v32i16
Hello.
I'm trying to implement an ADD operation for v16i32 vector register
type when the
only supported register type is v32i16.
For doing this I am looking to implement in [MyTarget]ISelLowering.cpp, in
LowerOperation() a custom operation lowering (and eventually operand type
legalization).
(For this I plan to follow an easy to understand example of custom lowering
available at
lib/Target/Mips/MipsISelLowering.cpp, SDValue
MipsTargetLowering::lowerShiftLeftParts(SDValue Op, SelectionDAG &DAG)
const.)
The pseudocode of the algorithm I need to perform is something like this:
Dest_v32i16 = Src1_v32i16 ADD Src2_v32i16
ONE_v32i16 = 1
IX_v32i16 = LDIX (load index of the Processing Element of the vector)
IX_AND_v32i16 = IX_v32i16 AND 1 % and it with 1
IX_AND_v32i16 == 0 % compare the result (each element of
IX_AND_v32i16 with 0)
WHERE true % if the result is true (if index of element is even)
WHERE CARRY % where add above gave a carry
Dest_v32i16 = Dest_v32i16 ADD ONE_v32i16
ENDWHERE
ENDWHERE
In LowerOperation() I need to perform the right DAG.getNode()
instantiations and
"wirings" coresponding to the above algorithm in order to build a
subDAG that is returned
instead of the original SDNode.
Please let me know if everything is OK.
I would normally NOT do type legalization from v16i32 to v32i16 (no custom
lower
bitcasts) - but a previous thread arguments we have to (see
http://lists.llvm.org/pipermail/llvm-dev/2016-January/094485.html: "Vectors
of i16 are a
bit special and we need to custom lower bitcasts to/from them. Therefore we do
setOperationAction(ISD::BITCAST, VT, Custom)"...).
Thank you,
Alex
Daniel Sanders via llvm-dev
2016-Aug-10 10:38 UTC
[llvm-dev] Vector instruction legalization for v16i32 integer type when the only supported type is v32i16
> -----Original Message----- > From: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org] On Behalf Of Alex > Susu via llvm-dev > Sent: 10 August 2016 00:22 > To: llvm-dev > Subject: [llvm-dev] Vector instruction legalization for v16i32 integer type > when the only supported type is v32i16 > > Hello. > I'm trying to implement an ADD operation for v16i32 vector register type > when the only supported register type is v32i16.How does your target support a v16i32 operation if there's no way to store a v16i32 value in a register? Could you tell us a bit more about the target instructions that you are trying to generate?> For doing this I am looking to implement in [MyTarget]ISelLowering.cpp, in > LowerOperation() a custom operation lowering (and eventually operand > type legalization). > (For this I plan to follow an easy to understand example of custom lowering > available at > lib/Target/Mips/MipsISelLowering.cpp, SDValue > MipsTargetLowering::lowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) > const.) > > The pseudocode of the algorithm I need to perform is something like this: > Dest_v32i16 = Src1_v32i16 ADD Src2_v32i16 > ONE_v32i16 = 1 > IX_v32i16 = LDIX (load index of the Processing Element of the vector) > IX_AND_v32i16 = IX_v32i16 AND 1 % and it with 1 > IX_AND_v32i16 == 0 % compare the result (each element of > IX_AND_v32i16 with 0) > WHERE true % if the result is true (if index of element is even) > WHERE CARRY % where add above gave a carry > Dest_v32i16 = Dest_v32i16 ADD ONE_v32i16 > ENDWHERE > ENDWHERE > > In LowerOperation() I need to perform the right DAG.getNode() > instantiations and > "wirings" coresponding to the above algorithm in order to build a subDAG > that is returned > instead of the original SDNode.What is this algorithm for? Is it the internal behaviour of your target instruction?> Please let me know if everything is OK. > I would normally NOT do type legalization from v16i32 to v32i16 (no custom > lower > bitcasts) - but a previous thread arguments we have to (see > http://lists.llvm.org/pipermail/llvm-dev/2016-January/094485.html: "Vectors > of i16 are a > bit special and we need to custom lower bitcasts to/from them. Therefore > we do > setOperationAction(ISD::BITCAST, VT, Custom)"...).The context of that quote is important. Mikael was describing the implementation for his particular target which is presumably driven by some attribute of that target. You need to define your lowerings according to what is correct for your target.> Thank you, > Alex > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev