[llvm-dev] Uses, Defs, ins, outs, params in tablegen instruction definition

Nicolai Hähnle via llvm-dev llvm-dev at lists.llvm.org
Wed Jul 25 07:32:54 PDT 2018


Hi Michael,

On 16.07.2018 08:43, Michael Stellmann via llvm-dev wrote:
> Hi, I'm working on a Z80 backend and I'm trying to get the instruction 
> definitions right, but couldn't find a clearly detailed explanation 
> about the parameters, specifically "Uses" and "Defs".
> I looked especially at the X86 tables, but don't really get it - e.g. 
> for ADD and MUL, there are different approaches and parameter-setups, 
> where I would expect almost equal instruction definitions.
> 
> About "Uses" and "Defs", include\llvm\Target\Target.td says:
> 
>    Uses - Default to using no non-operand registers
>    Defs - Default to modifying no non-operand registers
> 
> As an example, let me take X86's "ADD" and "ADC" commands and assume 
> that they have only the "AL" form, and taking a look only at adding 
> other registers. To make it easier, let's for now not consider 
> multiclass and pattern-setup.
> 
> ADD AL,r/m/i -> DST = DST + SRC, overflow result in Carry
> ADC AL,r/m/i -> DST = DST + SRC + Carry, overflow result in Carry
> 
> DST is (always, only): AL
> SRC is reg / mem / imm
> 
> Now for the definition:
> Assuming the following register classes:
> - "AR" has register AL only
> - "EFLAGS" has the status / flags register only
> - "GR" has all other registers
> 
> The instruction format is:
> 
> let Uses = [...], Defs = [...] in {
> ITy<...(outs ...),(ins ...), ...
> [(set ...dst..., EFLAGS,
>     (...SDNode<...,IsCommutable>, ...param1..., ...param2...))]>;
> 
> For "ADD AL,r" what would be the Uses, Defs, outs, ins, param1, param2? 
> I would expect the following:
> Uses = [AL]
> Defs = [AL, EFLAGS]
> (outs AR:$dst)
> (ins GR:$src)
> set AL, EFLAGS, ...
> param1: AL
> param2: GR:$src

Uses and Defs is for *implicit* uses and defs, and it takes registers 
(not register classes), so you'd only have EFLAGS (as a register) in there.

Outs and Ins always need to be listed fully, so you'd have

(outs AR:$dst)
(ins AR:$src1, GR:$src2)

and then set Constraints to "$dst = $src1", to encode the fact that 
you're really talking about a two-operand instruction here.

The AR / GR do have to be register calsses as far as I'm aware.

Cheers,
Nicolai


> 
> For "ADC AL,r", I would expect the only difference to be
> Uses = [AR, EFLAGS]
> 
> But, as to my understanding and looking at the X86 definitions, this is 
> not correct, or too much.
> 
> So here are my questions:
> - What (registers and / or register classes) is required in each, Uses, 
> Defs, ins, outs, param1, param2?
> - can I use the register definition instead of the register class if it 
> contains only one register?
> - Does the order of param1 and param2 matter in the case of a commutable 
> operation?
> - When adding AL, AL, I could also do a left-shift-into-carry. If the 
> shift operation would be cheaper, how could this be represented?
> 
> Thanks,
> Michael
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the llvm-dev mailing list