[llvm-dev] How to represent two-address instruction with TableGen?

Craig Topper via llvm-dev llvm-dev at lists.llvm.org
Mon Dec 14 00:54:40 PST 2020


You'll need to declare two sources in "ins" like this

```
"add $dst,$src"
(outs GPR64:$dst)
(ins GPR64:$src1, GPR64:$src2)
```

And your pattern will need to be

```
(set GPR64:$dst,(add GPR64:$src1,GPR64:$src2))
```

Then just above your instruction definition you need

```
let Constraints = "$src1 = $dst" in
```

This will tell tell register allocation that they need to be the same
register.


~Craig


On Mon, Dec 14, 2020 at 12:23 AM Zhang via llvm-dev <llvm-dev at lists.llvm.org>
wrote:

> Hi:
> I'm new to LLVM backend and is developing for a custom ISA which
> instruction has two addresses.
> For example:
> add $r0,$1 means r0=r0+r1.
>
> Previously I just declare two operands for add as following:
>
> ```
> "add $dst,$src"
> (outs GPR64:$dst)
> (ins GPR64:$src)
> ```
>
> However when I tried to add ISel patterns to this instruction with the
> following pattern:
>
> ```
> (set GPR64:$dst,(add GPR64:$src,GPR64:$dst))
> ```
>
> I received error:
>
> ```
> In ADDRR: Input operand $dst occurs in pattern but not in operands list!
> ```
>
> Not sure about what I did wrong here, any hint would be much appreciate
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20201214/32c4c9da/attachment.html>


More information about the llvm-dev mailing list