[LLVMdev] INSERT_SUBREG node.

sanjiv gupta sanjiv.gupta at microchip.com
Mon Oct 13 11:24:21 PDT 2008


On Thu, 2008-10-02 at 11:19 -0700, Evan Cheng wrote:
> 
> On Oct 2, 2008, at 11:02 AM, Sanjiv.Gupta at microchip.com wrote:
> 
> > What’s the value produced by an INSERT_SUBREG node? Is it a chain?
> 
> 
> No, insert_subreg returns a value:
> 
> 
> v1 = insert_subreg v2, v3, idx
> 
> 
> v1 and v2 will have the same type, e.g. i16, and v3 must have a
> sub-register type, e.g. i8.
> 
> > 
> > Can I use to set a superreg of i16 type with two i8 values, and use
> > the supperreg as an operand somewhere else?
> 
> 
> Suppose you want to use a pair of i8 v1, v2 to create a i16 v3. The
> way to do it is:
> 
> 
> v4 = insert_subreg implicit_def, v1, 0
> v3 = insert_subreg v4,                 v2, 1
> 
> 
> Evan
> 

This is how my register classes look like: 
  
  def FSR0L : Register<"FSR0L">;
  def FSR0H : Register<"FSR0H">;
  def FSR1L : Register<"FSR1L">;
  def FSR1H : Register<"FSR1H">;

  def FSR0 : RegisterWithSubRegs<"FSR0", [FSR0H, FSR0L]>;
  def FSR1 : RegisterWithSubRegs<"FSR1", [FSR1H, FSR1L]>;

  def FSR8RC  : RegisterClass<"PIC16", [i8], 8, [FSR0L, FSR0H, FSR0L,
FSR1H]>;

  def FSR16RC  : RegisterClass<"PIC16", [i16], 8, [FSR0, FSR1]> {
    let SubRegClassList = [FSR8RC];
  }

in my case I want to insert two values, which are available in register
types of FSR8RC, into a register type of FSR16RC.

when I use and INSERT_SUBREG with an SubIdx = 0, as you mentioned in 

> v4= insert_subreg implicit_def, v1, 0

the following function returns an incorrect subregclass:

static const TargetRegisterClass*
getSubRegisterRegClass(const TargetRegisterClass *TRC, unsigned SubIdx)
{
  // Pick the register class of the subregister
  TargetRegisterInfo::regclass_iterator I =
    TRC->subregclasses_begin() + SubIdx-1;                              
  assert(I < TRC->subregclasses_end() &&
         "Invalid subregister index for register class");
  return *I;
}

what does -1 do while initializing I in the above fn?

TIA,
Sanjiv






More information about the llvm-dev mailing list