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

    <tr>
        <th>Summary</th>
        <td>
            [x86][MC] Over-decode invalid instruction with mutual exclusive prefix and unmatch opcode
        </td>
    </tr>

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

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

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

<pre>
    ### Work environment

| Questions | Answers
|------------------------------------------|--------------------
| OS/arch/bits                             | x86_64 Ubuntu 20.04
| Architecture                             | x86_64
| Source of Capstone | `git clone`, default on `master` branch.
| Version/git commit                   | llvm-20git, [f08278](https://github.com/llvm/llvm-project/commit/f082782c1b3ec98f50237ddfc92e6776013bf62f)

<!-- INCORRECT DISASSEMBLY BUGS -->

### minimum disassembler PoC program
```c
int main(int argc, char *argv[]){
    /*
       some input sanity check of hex string from argv
    */
    // Initialize LLVM after input validation
    LLVMInitializeAllTargetInfos();
 LLVMInitializeAllTargets();
    LLVMInitializeAllTargetMCs();
 LLVMInitializeAllDisassemblers();

    LLVMDisasmContextRef disasm = LLVMCreateDisasm("x86_64", NULL, 0, NULL, NULL);
    if (!disasm) {
 errx(1, "Error: LLVMCreateDisasm() failed.");
    }

    // Set disassembler options: print immediates as hex, use Intel syntax
    if (!LLVMSetDisasmOptions(disasm, LLVMDisassembler_Option_PrintImmHex |
 LLVMDisassembler_Option_AsmPrinterVariant)) {
        errx(1, "Error: LLVMSetDisasmOptions() failed.");
 }

    char output_string[MAX_OUTPUT_LENGTH];
    uint64_t address = 0;
    size_t instr_len = LLVMDisasmInstruction(disasm, raw_bytes, bytes_len, address,
 output_string, sizeof(output_string));

    if (instr_len > 0) {
 printf("%s\n", output_string);
    } else {
 printf("Error: Unable to disassemble the input bytes.\n");
 }
}
```

### Instruction bytes giving faulty results

```
f2 f0 41 0f b7 d6
```

### Expected results

It should be:
```
Error: Unable to disassemble the input bytes.
```

### Actually results

```sh
$./min_llvm_disassembler "f2f0410fb7d6"
 xacquire
```

<!-- ADDITIONAL CONTEXT -->

### Additional Logs, screenshots, source code,  configuration dump, ...
This is similar to [a verified bug](https://github.com/capstone-engine/capstone/issues/2547) in the capstone engine. Bytes "f2f0410fb7d6" can not be translated into valid x86 instructions because of mutual exclusive prefixes `f2`, `f0` and LOCK prefix on register operation. But llvm MC accepts it into instruction `xacquire`.  All the other instruction decoders like the Capstone, Zydis, and Xed reject the byte sequences. Not sure whether the workaround in this [pull request](https://github.com/llvm/llvm-project/pull/117299) can fix this. 
 

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycV19z4jgS_zTipSuULWMDDzyACbvUkWRuQubm9oWS5TbWjS2xkkzIfvoryebfDMnOrCsVW3b__f26pYYZI7YScULiGYnnPdbYUunJA9PR2x8lk9tepvK3CaFR-wf_UfoboNwLrWSN0pJgToJp93-Ywr8bNFYoacCtptK8ojanz3c_fb0jfHb09EzogmleErrIhDXw0eUUDqNkkwzgJWukbYAG_WBwtjbVvBQWuW00_qSls_KzajRHUAWkbGeskujFSBJshQVeKYkkCQhNIceCNZUFJd3XmhmLmiQBZJpJXvbPJr-gNkJJQhfehKprYd-Jpqr29R11rpwHEs-KYESHIxLPCR2V1u4MiaaELlpbZZP1uaoJXTi97na30-p_yC2hi9YVoYvWCuVhFiEfj4o4oNEwzws-ppgMh0kQRlmR0ILQ8VUNRCmh4d0dLB_Tp8-f79M1zJfP0-fn-4fZ6r8we_ntGe7uSHR_pXQqr1pIUTc15MIwY7DOKtTwSaWw02qrWd3JJ0H7x9u1kBZqJiShI_fI9JY7LHjJNBA6ZXq7b-vbBTuctUoePwfL9LwGAKNqBCF3jQXDpLBvwEvk3xy7JR7AWC3kFgqtavB2L2x5lK9tL2AphRWsEn8hrFZfHoAVFnXnYM8qkTPXLmc1J3TWmVbVmukt2qUslCF05DKIjhm8I_uD3PtmH9K_Nzq_4OJ76WsHXrJOlbR4sJ-xaGmsgURz_z3VyCy2Ut4Q7VqJUsfX48tq5e7B5aK9XycjCvDqYd6ZGsOZVtT6QOgo9N1A6b3WSpNoejuAMRRMVJj3fQjXXshw_n2SHafPaK8rVO38nufc7LQrQVHXmAtm0QAzrnBcNI1BWEqLFZg3adnhRkIuyGe0bYRPnVU6OuaZnmHuXG9aoc0n53ZZ17_jwe0KF1zekp6a2iug_sK0YNK63K9Q7K6PwLwR5weA3kDT96dq7K6xm7avSDx7mH7dPL2sP72sN6v7x9_Wv7u2vaSlEdImg40FlucajfHVFVyJGPEXbiwIaazeVChPBdjGu3TvG-777hJbzV432ZtF4xb-wSm7ReeK0COw11HT1LtUBaGj776Mb3dLS_hlgPeu7C8Z8IVUtG1CaGxInMquUX7w8V3ZAlYG3zF1ovBFsqxCsOqylMGWx93PA9A_eb1J5enhuCHf3tUvAG_Nwlbs_TbqTsM30Giaypor5WuLBYUigEEIQQHZEPLkp_zeH3bILea3HCwtmFI1VQ4ZugPylr1fxepnYppy27Cq-jhpUx7VBn1CF7WQG3dOb642HUJpQYtgEAZFNswTx1LLz4HxPxuh8aN4jsf0dD5frpdPj9MVpE-P6_uv64-O52meC8ciq2Cltr5PDNeI0pTKtst2FuIqR7cErmQhto32pxzkTb1zr_v9Dqx1KQwIA0bUomLaIUziGYM9alEIzCFrtn87yfBu6rpDuRUSL94QuhDGNK6jFzQeDF2HCemJO4pAq9SHmS_MH0EFziRIZSFDsJpJUzFXUkJa1R7gbh5s95q2xA1kyJnb7FUBdePoBjzwqjFij7DTWIiD85QEBe3mQvfsKAImc1g9pf_qxNygqHEr3JwIaoctjH2YNdbPffCQAuMcd9aAsG1MF5E4u6diSII-wLSqfPbKln4KOYvm6DjTBirxrS3t9ARiCn-85cLz6wL86jvKDYxezhU_GPyzQcnR9OFRWTBujn4t0btxQq9Kf2NaNTJvCRDGEb1rqgq0UzX2Hw6szgShizAc0rE_wxxdDjrnow_HLcvfevkkysfRmPVwEg4jSpNRHNNeOWH5eMTG8SgexBGOE47RKCwizqJgkAzyUdgTExrQQRhSGowHNKJ9nvBRFrJsHPMsHo5DMgiwZqLqu_D6Sm97vvAmYTiMgqRXsQwr439lUSrxFfxX17LxvKcnPqes2RoyCCphrDmbscJW_ufZYZQ4iOLZQ0riOTztUd-1pIGQbSFe8vkqbPle9XkWG1kzy0tQO2ej1-hq8svgn5qrS3M_of8PAAD__wAYQNQ">