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

    <tr>
        <th>Summary</th>
        <td>
            [AMDGPU][MC][GFX940] Disassembler fails to decode smfmac opcodes
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            bug,
            backend:AMDGPU,
            mc
      </td>
    </tr>

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

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

<pre>
    Disassembler fails to decode smfmac opcodes with selected dst operands.

An example of failed test:

    0xfc,0x00,0xe6,0xd3,0x02,0x09,0x0e,0x04

Expected output:

    v_smfmac_f32_16x16x32_bf16 v[252:255], v[2:3], v[4:7], v3

Actual result:

    unexpected immediate type
    UNREACHABLE executed at <...>AMDGPUDisassembler.cpp:1332!

This is caused by a hardcoded vdst bit:

    class VOP3Pe_SMFMAC <bits<7> op> : Enc64 {
        ...
        let vdst{8} = 1; // VGPR or AGPR, but not SGPR
        ...
    }

This does work for dst but fails to decode tied src2:

    template <typename InsnType>
    static DecodeStatus decodeToMCInst(DecodeStatus S, unsigned Idx, InsnType insn, MCInst &MI,
                                       uint64_t Address, const MCDisassembler *Decoder, bool &DecodeComplete) {
      ...
      case 534:
        // decoding of dst
        tmp = 0x100;
        insertBits(tmp, fieldFromInstruction(insn, 0, 8), 0, 8);
        insertBits(tmp, fieldFromInstruction(insn, 15, 1), 9, 1);
        if (DecodeAV_128RegisterClass(MI, tmp, Address, Decoder) == MCDisassembler::Fail) { return MCDisassembler::Fail; }
        ...
        // decoding of src2
        tmp = 0x0;
        insertBits(tmp, fieldFromInstruction(insn, 0, 8), 0, 8);
        insertBits(tmp, fieldFromInstruction(insn, 15, 1), 9, 1);
        if (DecodeAV_128RegisterClass(MI, tmp, Address, Decoder) == MCDisassembler::Fail) { return MCDisassembler::Fail; }
        return S;

So currently src2 is incorrectly decoded as an SGPR but the decoder may fail if the value does not map to any SGPR.

A fix is pending.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztVluPqzYQ_jXkxWoEGEJ4yAO5bVdq2tVmz6pvkbFNQg9gZJs0-fedMSSb7MmqqlT1qQjZjC9z-b7xmFyJ82xZGmaMrPNKalKwsjLEKiIkV0ISUxc140S1KBnyZ2kPxMhKcisFEcbCjNSsEWbs-UvPz_o2a4g8sbqtJFGF0wmrrTTWo9ntOgKPfyq4Fy78k--7Tk5cJ2g_GPZd2ney76JbJatT27ujOtt2j0wcd30Yu4KGu2Byghc-8iKYkKMXz8M4hE1hHHvxEvT3YzBCb-QI5OQi07tYue1YRbQ0XfXIeNfIi4NlXUtRMiuJPbfyY8m3X19X2eLnbP7LCnCTvMPFzBKPLsbjsUdX2Wb59PLtlqgxb1swFlAKAAW3Nt8OpSHwctYZUJOfCSMHpgUSKMgROcvLR47yCrST999e6IvcbTfrTbZAD2CxgS4BN4BsbGEvWTV8EhEvmX_sxwfdvRuopHU2YeXUS5awd0kCj86JF67hJe9PL69EaZJBj9jmnSWNsmSL8teqQdUPMQuFCar0d1KAQhcnKPuc0LYEFIzm4QMErISURXogXmSoYbUkz41p3pAuuvpYaSyzJSdLp3MLQmcGA29qs4At1gund7NbjK5rTLlvwIFncUL5opuU8IED_V4AZ7J5Bvkegb95urKxk2hnSSYEZKNBfVyhus3i7ox7Yda7ph3iSlVosB9aKDy1Fs5Z-pndT9xyZiSJaXTF8eLHwKyDo2z2WAEwAe7W2Lp1qeCfAjj29FMWARpS2zkmXjiFpehmUcpKrLWqESDdcVsqQGx6AQ5rB5mC1_fCv6A5iF07qE6vwg-qC3LlPHvfBeH0Ve5LY6Ve4MGCOUcpGazekHQlI0VMEJZ7whBhmq0hkQdWoNjYTjdfL8PzdTkhXx7NBzy5c_EFUf_T9J_QNOzZXh3v260ivNNaNrY6O5qwxJcNVzDGcayvPnBtGMIaVz5d-bMHOUxpUrOzK4eIAY4fWdXJvmxiya1Zi3WSNWe3_f5CB_hPaBKKIibLMDkSMypSmrKRLW0lZ3BR9lcV3pTxfLPo-6f172nkwzf5B_8ao05Xs4O1rUHEXK7u4e-jy8dc1SBU1fHS_dRq9QfAAGJpTCeBrnUcx3QyOsxYSoMwnwbTImFpImIhCipoWkga0SQPolHFclkZdN0Lw7zbQ4tso8D4dwgXzA9BXWdqjt_xclTOQj8M_ThIgijw43AskzSOoiBJ84hOkzz2Il_WEOcY_RwrvR_pmXMZLBmYrCD1zMckgIMXhBzcEa2WKtdssMY6e1B6dhkduWBnLtK_AOc01GU">