[LLVMdev] type legalization/operation action

Tom Stellard tom at stellard.net
Tue Feb 17 06:40:47 PST 2015


Adding back llvmdev.

On Tue, Feb 17, 2015 at 09:34:31AM -0500, Tom Stellard wrote:
> On Mon, Feb 16, 2015 at 02:32:36PM -0500, kewuzhang wrote:
> > 
> > Hi Tom, 
> > 
> > Talking about promoting operations.
> > 
> > for i16 type ADD, I promoted it in the tablegen by creating a pattern
> > “
> > def: Pat< (i16  (add i16:$src1 i16:$src2)),  ( IADDs   i16:$src1  i16:$src2)>
> > “ 
> 
> What you've done isn't considered 'promotion'.  This pattern tells the
> instruction selector to *select* i16 add to the IADDs instruction.
> 
> > seems my backend did not complain.
> > and my IADDs is defined as a i32 + i32. I also have the i16 defined, which is same as i32 register
> 
> If the register class you use for IADDs is defined with both i32 and i16
> types (which appears to be the case based on your description), then
> it is expected that the above pattern will work.
> > 
> > my questions are: (1) does  i16 is automatically promoted? or just lucky?
> > (2) I think I should make the pattern to something like:
> > “
> > def: Pat< (i16  (add i16:$src1 i16:$src2)),  ( ConvertToi16 ( IADDs   (ZERO_EXTENDx  i16:$src1)  (ZERO_EXTENDx  i16:$src2)))>
> > “
> 
> This pattern is emulating 16-bit addition using a 32-bit add.
> If you have native 16-bit instructions then you shouldn't use this
> pattern.
> 
> -Tom
> 
> > because the return value is i16 too.
> > Is it necessary?
> >  
> > 
> > best
> > 
> > kevin
> > 
> > > 
> > > Promoting ISD::ADD is not supported.  Take a look in SelectionDAGLegalize::PromoteNode()
> > > to see which opcodes can be promoted.  You will either need to custome lower it or
> > > properly handle it in the PromoteNode() function.
> > 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-dev mailing list