[LLVMdev] INSERT_SUBREG node.

Evan Cheng evan.cheng at apple.com
Tue Oct 14 10:19:35 PDT 2008


You need to specify sub-register == super-register, idx relationship.  
See X86RegisterInfo.td:

def x86_subreg_8bit    : PatLeaf<(i32 1)>;
def x86_subreg_16bit   : PatLeaf<(i32 2)>;
def x86_subreg_32bit   : PatLeaf<(i32 3)>;

def : SubRegSet<1, [AX, CX, DX, BX, SP,  BP,  SI,  DI,
                     R8W, R9W, R10W, R11W, R12W, R13W, R14W, R15W],
                    [AL, CL, DL, BL, SPL, BPL, SIL, DIL,
                     R8B, R9B, R10B, R11B, R12B, R13B, R14B, R15B]>;

I admit the way it's specified is not very elegant. We'll clean it up  
some day.

Evan

On Oct 13, 2008, at 11:24 AM, sanjiv gupta wrote:

> 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
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev





More information about the llvm-dev mailing list