TableGen question

Hi,

In tablegen file inside class we have variables declared inside a
class. Say in PPC there is this

class BForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr>
  : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
  bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
  bits<3> CR;
  bits<14> BD;

How does the generator match each variable against an operand?

For the corresponding PPCGenMCCodeEmitter.inc for this the entry is

      // op: BIBO
      op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
      // op: CR
      op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
      // op: BD
      op = getCondBrEncoding(MI, 2, Fixups, STI);

How does the generator know that BIBO is op0 and CR is op1 and so on?
Is it based on the order of the declarations of the variables in the class?

Regards,
Shafi

As you suggested, it is based on the order of the declarations of the variables in the class, and the order they are listed in the TableGen file.

See Writing an LLVM Backend/Instruction operand mapping.

Operands are assigned to unbound fields in the instruction in the order they are defined. Fields are bound when they are assigned a value.

As you suggested, it is based on the order of the declarations of the
variables in the class, and the order they are listed in the TableGen file.

See Writing an LLVM Backend/Instruction operand mapping
<http://llvm.org/docs/WritingAnLLVMBackend.html#instruction-operand-mapping&gt;
.

Operands are assigned to unbound fields in the instruction in the order
they are defined. Fields are bound when they are assigned a value.

Tablegen will try to match operand names with field names first, before
it falls back to matching on the oreder of the fields. So in the
example if the instruction is defined like this:

(ins bb:$BD, GPR:$BIBO, GPR:$CR)

The PPCGenMCCodeEmitter.inc will look something similar to this:

       // op: BIBO
       op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
       // op: CR
       op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
       // op: BD
       op = getCondBrEncoding(MI, 0, Fixups, STI);

-Tom

Tom,

Comment in CodeEmitterGen.cpp suggests what you have mentioned:

  // If the operand matches by name, reference according to that
  // operand number. Non-matching operands are assumed to be in
  // order.
  unsigned OpIdx;
  if (CGI.Operands.hasOperandNamed(VarName, OpIdx)) {

But in 3.5 version (for me anyway) the behavior is like what McKay mentioned:

it is based on the order of the declarations of the
variables in the class, and the order they are listed in the TableGen file.

I say this because for a class that i have mentioned in my first mail
if i match two definition like the following:

def ins_a -> (ins bb:$BD, GPR:$BIBO, GPR:$CR)

def ins_b -> (ins bb:$CR, GPR:$BD, GPR:$BIBO)

i get completely wrong encoding for 'ins_b' (if it is the one defined
after 'ins_a' in td file).
So i had to either write a subclass to override the instruction fields
with the appropriate operand or had to write a new class to match
instruction 'ins_b'

Is this expected?

Regards,
Shafi