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