[LLVMdev] Tablegen: Instructions that take immediates or registers as operands

Tom Stellard thomas.stellard at amd.com
Thu Nov 3 10:22:57 PDT 2011


Hi,

I'm working on an LLVM backend for GPUs.  One thing that is a little
different about some GPUs is that instructions can take registers or
32-bit floating point immediates as arguments.  I was wondering if there
is a way to model this using tablegen, without having to define an
instruction for each possible combination of registers and immediates
(e.g. For ADD it would require four definitions: ADD_imm_imm,
ADD_reg_reg, ADD_imm_reg, ADD_reg_imm).

I have tried a few different ways to make this work in tablegen, but I
have been unsuccessful so far.  Here is an example of something I have
tried.  It fails to compile with tablegen, but I hope it can help
demonstrate what I am trying to do:


def F32Node : PatLeaf<(vt), [{return N->getVT() == MVT::f32;}]>;

def F32Op : Operand <f32> {
  let MIOperandInfo = (ops GPR, f32imm);
}

 def ADD : InstAMD <
          (outs GPR:$dst),
          (ins F32Op:$src0, F32Op:$src1),
          "ADD $dst, $src0, $src1"),
          [(set GPR:$dst, (fadd F32Node:$src0, F32Node:$src1))]
  >;

Is what I am trying to do possible with tablegen, and if so what is the
best way for me to do it?

Thanks,
Tom Stellard






More information about the llvm-dev mailing list