<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">