<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61384>61384</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] Incorrect encoding for ATOMIC_LOGIC_OP
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
omern1
</td>
</tr>
</table>
<pre>
In https://reviews.llvm.org/D140939 the following encodings were introduced for the `bts`, `btc`, and `btr` instructions:
```
multiclass ATOMIC_LOGIC_OP_RM<bits<8> Opc8, string s> {
let Defs = [EFLAGS], mayLoad = 1, mayStore = 1, isCodeGenOnly = 1,
SchedRW = [WriteBitTestSetRegRMW] in {
def 16rm : Ii8<Opc8, MRMDestMem, (outs), (ins i16mem:$src1, GR16:$src2), -------> Type Ii8
!strconcat(s, "{w}\t{$src2, $src1|$src1, $src2}"),
[(set EFLAGS, (!cast<SDNode>("x86_rm_" # s) addr:$src1, GR16:$src2))]>,
OpSize16, TB, LOCK;
def 32rm : Ii8<Opc8, MRMDestMem, (outs), (ins i32mem:$src1, GR32:$src2), -------> Type Ii8
!strconcat(s, "{l}\t{$src2, $src1|$src1, $src2}"),
[(set EFLAGS, (!cast<SDNode>("x86_rm_" # s) addr:$src1, GR32:$src2))]>,
OpSize32, TB, LOCK;
def 64rm : RIi8<Opc8, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2), -------> Type RIi8
!strconcat(s, "{q}\t{$src2, $src1|$src1, $src2}"),
[(set EFLAGS, (!cast<SDNode>("x86_rm_" # s) addr:$src1, GR64:$src2))]>,
TB, LOCK;
}
}
...
--- Incorrect base opcodes for 8 bit immediate (https://www.felixcloutier.com/x86/bts. https://www.felixcloutier.com/x86/btc, https://www.felixcloutier.com/x86/btr)
defm LOCK_BTS_RM : ATOMIC_LOGIC_OP_RM<0xAB, "bts">;
defm LOCK_BTC_RM : ATOMIC_LOGIC_OP_RM<0xBB, "btc">;
defm LOCK_BTR_RM : ATOMIC_LOGIC_OP_RM<0xB3, "btr">;
```
As shown above, the ATOMIC_LOGIC_OP_RM defines the instructions as taking an immediate operand but uses the MR base opcodes.
I've created the following patches to fix this issue:
https://reviews.llvm.org/D145930
https://reviews.llvm.org/D145933
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVl9v6jYU_zTmxSpK7JCEBx4guVRoZUyhUveGHPsA3k1iZjul3aef7ARKoVvX6U6ahQw-9vmdPz-bc5gxctcATNBohkb5gLV2r_RE1aCbcFAq8TpZNHhv7cEgOkVkjshcw7OEoxlW1XM9VHqHyDwPo2BMx9juAW9VVamjbHYYGq6EbHYGH0EDlo3VSrQcBN4q7c-iOCitQXGASNYteL9gjegEGsUBlo2xuuVWqsb7EeQoOM1x0H_8sm4rK3nFjMHTx9VykW0eVveLbLP6ZVMsEc1KaQ2iWYroN7w68NTZMlY7d42ToWTWAWFcgcU5bA1GNMdoNPs2f5jer9Eodzo1e31QTPi9sBesrdLwJpEmUwLuoVk11etZfEJ3Y833IIqnk4EnLS3MpH0EY9dgC9gVyyc0yjGWzaVjGAvY4jDWNUZ0ihcyRTQ7BbMsljkYu4Ta55SkqrUGkXG_ko3BMoxrqD2fkdHcO3tfhPFZQvrzb-OuGy5Dj68H8DY7bxAJjdVcNZxZRFLT2SEomR1RkqNRZp3nJ1i319lMsgvrp_0kd6re-Al-NHOoYHGf_i4MRELOjEU0W-c_KwGIfvNS8pLGG11vECEYEYpd5JgJoT-NduyIdSgny6vDWv4BYezOP87c_LDKfkL0igZK_jUNlHxAAyU_mIbq_0zDTbQ3NLwfHSmUfEJKHPWkFF9nJY4-YCWObli55qJ4I-N2_DU9v_8Iej4w-B8RdpOIG8I-pMX53P1dn3_4eTgcXi7v7u7wouFKa-AWl8wAVgeuBBhfMlJcSotlXYOQzIIL6H1pOh6Pwy1U8oVXqrUS9JCrGpH5SxojMi-tGeKvKXAXy9dUtMuJj0bAtvaJ2Mwe15ti6W_kh1UpeJnO-ivh6iEhLqOn7F3CZJ_AzN5g-N_AFJ_B0DOMvoK5qrfdPDXY7NWxwaxUz-B0XXW_BXePUzZg_PZlUcfMYMu-uzLMmguG1QG0awXK1uLW9IrL4t3VeHeDFogkz4C5BmZBXDUkB2b53oEovJUv2O6lwdKYFs49xT_pdEZjGnzpNB2ICRVjOmYDmIRxkibhKAjTwX4SiKiEZByJIEqiZCsEiLIMonESB9GYsnIgJyQgNKAhDWlEaTqMWcrCkAoSE5GEvERRADWT1dnqwAc0iUOaRoOKlVAZ39wRUjL-HRqB6PRXd1WJ6_f0xOndle3OoCiopLFv_g-stJXvDN35UX7xMk-dnX-VVzQPWl1N3mdmJ-2-Lft34uD7r7uDVr8Bt4jMvdcGkbl3_M8AAAD__y308G4">