<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/144869>144869</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            SystemZ `esrl` instruction doesn't disassemble `%r0`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Rot127
      </td>
    </tr>
</table>

<pre>
    The SystemZ disassembler doesn't decode `%r0` registers if they are part of an address.

```
echo "0xc6,0x00,0x00,0x00,0x00,0x05" | llvm-mc --disassemble --triple=s390x --show-encoding
        .text
        exrl    0, 0xa                          # encoding: [0xc6,0x00,A,A,A,A]
                                        #   fixup A - offset: 2, value: 12, kind: FK_390_PC32D
```

It should be `exrl      %r0, 0xa`.

It does work the other way around though:

```
echo "exrl %r0, 0xa" | llvm-mc --assemble --triple=s390x --show-encoding
        .text
.Ltmp0:
        exrl    %r0, .Ltmp0+10                  # encoding: [0xc6,0x00,A,A,A,A]
                                        # fixup A - offset: 2, value: (.Ltmp0+10)+2, kind: FK_390_PC32DBL
```

This might due to https://github.com/llvm/llvm-project/issues/44437.

Debugging shows that it happens due to these lines:

https://github.com/llvm/llvm-project/blob/1c35fe4e6b2596d153da82b23d04a3779fb12730/llvm/lib/Target/SystemZ/Disassembler/SystemZDisassembler.cpp#L87-L89

The given register table in `Regs` contains a the valid register id of `r0`, but here it ignores it.

It possibly was supposed to be?
```diff
 {
 assert(RegNo < Size && "Invalid register");
-       if (IsAddr && RegNo == 0) {
+       if (IsAddr && Regs[RegNo] == 0) {
                RegNo = SystemZ::NoRegister;
        } else {
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8VVFvozgQ_jWTlxGRsQOEBx6Sokirq1anbp_uZWXwAL4lGNmmSe_Xn5yGlLbXPd0-XETkOGa-Gc_3zYx0TrcDUQHJHpJyJSffGVs8GB_zbFUZ9Vw8doTfnp2n4x-otJPO0bHqyaIy5AbgmUdFtVGEkDLgiWWQMrTUaufJOtQN-o6eUVrCUVqPpkE5oFTKknNrYLvwpOz6sB3VnUHgnJ3rFPgdOzP2kyUBzhGyO-z7p2N0rDGKFlFiFHmrx55AlE7k7IxR5DpzimiojdJDe3Gfrz2d_ctPOtseWB7QkZ0lfvoBLvCGInYIyf5txLs336QEtvsc7SM2YqPP04g7jNA0jSMfvPAQ15PsJwq7-LL9oQcVdoffvoucff_9TvDyXU6B7b54dJ2ZeoXVharrRV8Ye7kspGx9eznQiydjfwT60PiOLJ5k4NFMg0LfmantQOw-JzB4wDf4H6j6RZ7W9_44stl5_v4q12O-j9n_z9u_swZ8u4gQeA58_ymR-_uPVD522uFRt51HNRF6g533owv54Afgh1b7bqrWtTkCP4RkX5dotOZPqj3wg3ZuIgf8sNlsRHZlvaRqals9tEEpJ4e-kx61x06OIw1uduY7coS9Hsjd-P_PAVS9qYAf4lokDW0orXiSpypOhJJbXnGh2EaKLMubKuaZYAscHewepW0p4FxbE_BDuWhOrwfLf9f1OAIX99ssut_mcy4JW_1Ew61loZdBkXoIVfJArQv9rDaDl3pwKC_l8CR7rV4ttApdDVJ2aX6Bymry2JGlkD7dDsaSQ-1fq2s0zumqf8aTdOimcTSOVEhuRSAOS8qVbpogQcj2YQmXsR749oHarwZB3OE3_Rch8BR4Gsruy_A2OuA8aEwE8-gqVN0EFX5xO6XsbDoDliBKDLK8ugS-_7mVg2R_MYak_Af790Vy8zOPlSAbsftqHuaAxdIMshKpdzRHM-dlpQqhcpHLFRVxljAhGOPpqitUzXjeKCkqWVU8r2Kl4kYqkW3zJE63bKULznjC0jiP2SZj6ZqkzDPasrpRMdtSBhtGR6n7dZDc2th2dSmXIt5stmm-6mVFvbuMTM4HOuHlNKQ5KVe2uAi9mloHG9Zr590rjNe-p2KepqEJO9sHeenBeTvVXpthOVcXg2wxXFeT7Ytfr_jrLZ4K_ncAAAD__86pSig">