Michael Stellmann via llvm-dev
2018-Jul-16 06:43 UTC
[llvm-dev] Uses, Defs, ins, outs, params in tablegen instruction definition
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 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
Nicolai Hähnle via llvm-dev
2018-Jul-25 14:32 UTC
[llvm-dev] Uses, Defs, ins, outs, params in tablegen instruction definition
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:$srcUses 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.