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

    <tr>
        <th>Summary</th>
        <td>
            [MIPS] Opcode of mina.fmt and max.fmt in MIPS64 R6 are wrong
        </td>
    </tr>

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

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

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

<pre>
    While proposing https://github.com/llvm/llvm-project/issues/64207#issuecomment-1989915063, I discovered that the opcode of two FPU compare instructions are documented wrong, and the mistake is present in LLVM code.

The opcode of `mina.fmt` and `max.fmt` should be swapped, [according to binutils](https://sourceware.org/git?p=binutils-gdb.git;a=blob;f=opcodes/mips-opc.c;h=dca5eda47ae636e9bb557d9079e9676f596dd725;hb=HEAD#l3313):

```c
{"max.d", "D,S,T",        0x4620001e, 0xffe0003f, WR_1|RD_2|RD_3|FP_D, 0,              I37,            0,      0 },
{"mina.s", "D,S,T",        0x4600001d, 0xffe0003f, WR_1|RD_2|RD_3|FP_S,    0, I37,            0,      0 },
```

Consider the following code which contains `min.fmt` and `max.fmt`:

```asm
owo:
    min.s $f0, $f1, $f0
    min.d $f0, $f1, $f0
    max.s $f0, $f1, $f0
 max.d $f0, $f1, $f0
```

### Expected behavior

`gcc -o minmax-valid.o -c owo.s`   
`objdump` of the code above should print the following encoding:

```
0000000000000000 <owo>:
   0:   4600081c min.s   $f0,$f1,$f0
   4:   4620081c        min.d   $f0,$f1,$f0
 8:   4600081e        max.s   $f0,$f1,$f0
   c:   4620081e        max.d $f0,$f1,$f0
```

### Actual behavior

`clang -o minmax-invalid.o -c owo.s`  
`objdump` of the binary compiled from the code above with LLVM showed `mina.fmt` instead of `max.fmt`:

```
0000000000000000 <owo>:
   0:   4600081c min.s   $f0,$f1,$f0
   4:   4620081c        min.d   $f0,$f1,$f0
   8: 4600081d        mina.s  $f0,$f1,$f0
   c:   4620081d        mina.d $f0,$f1,$f0
```

### Note

Optionally, we can match `@llvm.minnum.f{32,64}` and `@llvm.maxnum.f{32,64}` to these instructions, as it behaves similar to `UCOMISD` on x86, I suppose.

The fix is on its way.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVk2T2ygT_jX4QlmFQB_WwYexFdc7VcmbVCbZHFMIWhZZCVQCjTz_fgtkO7Y385Hdy1Ku0ajV3TTP08DDrVV7DbBG6Qal5YKPrjHDevvEtTk87UEvKiOf1t8a1QLuB9Mbq_QeN871FrE7RHeI7vbKNWMVCdMhumvbx9Nj2Q_mBwiH6E5ZO4JFdJcllOSIsmAQputAu2VcrIoiTknGEN3ieyyVFeYRBpDYNdxh1wA2vTASsKmxmwzeffqKhel6PgBW2rphFE4ZbbE3SCNGnxckngaj9z4p1zKk6ZR1_E_AyuJ-AAvaYaXx-_d_fMA-f4RIicjd_PfL1bQoI53SPKo7hzISEnoTP5wstjFjK3EF2E6870H6eVG64UKYQXrYnMGV0qNTrUVpiejqGkdrxkHAxAeIzLCfgUVs1yNWnsKWe1lFwbzh3tyaCrFNjVg5F-oh7lRvl6YXkUBs0yBWSsFTkDzJOWQsg6Kq0jSXBckLKLI8q9MikzKnqXevECv_9-6uRJS1jMUM0cLXd4EKysj8E8f3fIMo9ThIRGlYM6UlotsHRLdfjqbjIIcko4SQGLyRHOoaCCGs9m_fPn-PUb79XH6n84OhfLv79L0MrhdJ5nHP8hvbTx-CUe7Drgr03Nk3VUh8hfLtFT4c40MBv1HXCchLdLdGWyVhCM1am7Y1k--c0IRTo0SDhdGOK22PDflsPz5HG7fdbDGTOfv46nwyixFNajJjlNTx6R9y7Sbf4MYPr2YLTfOyzy9BQpTNP_zu0IPwG72Chj8qM9wseS8EXhpfc8cPy0feKhkZvBTYTCayHjeMz86m-iHHrvdWf8w0MMPOK_MIp93dD0q7G3JAC-P393OIz6_kZmDEtoGCd5cseNowxqEJV7E4koLPIJ0wukY7OUXROeo4ZqpeDl5dTQjn0EDfa_OKq3mvguVLoa-weifcyNvnOBUt1_sLVpX-Ja8v0FopzYencIGoFiSuB9Pd8j0p18z3gm3MBPL2_Pe3DnB5uhle3Xb_6SbAcxscJ5QXodxP_DtNcB38b7rg_8bB5ZePvb_ieds--TNiAiy4xh13ovEMoIR4zRF1Suuxi2qUb5g_2LPEn7k_D8izHz_82s8Z3wr2WlcECWGxcnNTgsVWdarlg3dHGfm6_fjh_iHEG40Pq2wWMnbse2P_ripqdfAKxGisnMUTf4oWcs1kwQq-gHWcxyRPsoQli2a9qiBJc4BVXHOgaZXLKq0Fqxln9SqlZKHWlNCEsHhFckpYEqVFntYii-u4IBKoQAmBjqs2Cus2w34RxNd6lWZktWh5Ba0N-o9SDRMOH_2lmJaLYR10XDXurcdNWWd_ZnHKtUE4frj_9IDSEn88a6XTRgmgH_eG11neM0vw5yzotCDOFuPQrv-5ngyL-CsAAP__fV_wUg">