From eab0bdb07cbed1131be2d1f541059c7b96b05e32 Mon Sep 17 00:00:00 2001 From: Aleksandar Markovic Date: Tue, 23 Oct 2018 17:26:58 +0200 Subject: [PATCH] target/mips: Amend MXU instruction opcodes Amend MXU instruction opcodes. Pool04 is actually only instruction OPC_MXU_S16MAD. Two cases within S16MAD are recognized by 1-bit subfield 'aptn1'. Reviewed-by: Stefan Markovic Signed-off-by: Aleksandar Markovic --- target/mips/translate.c | 160 +++++++++++++++++----------------------- 1 file changed, 69 insertions(+), 91 deletions(-) diff --git a/target/mips/translate.c b/target/mips/translate.c index d6e733f36c..23357215e0 100644 --- a/target/mips/translate.c +++ b/target/mips/translate.c @@ -1486,7 +1486,7 @@ enum { * S32OR XRa, XRb, XRc D32SARW XRa, XRb, XRc, Rb * Q16SLL XRa, XRb, XRc, XRd, sft4 * Q16SLR XRa, XRb, XRc, XRd, sft4 - * Miscelaneous instructions Q16SAR XRa, XRb, XRc, XRd, sft4 + * Miscellaneous instructions Q16SAR XRa, XRb, XRc, XRd, sft4 * ------------------------- Q16SLLV XRa, XRb, Rb * Q16SLRV XRa, XRb, Rb * S32SFL XRa, XRb, XRc, XRd, optn2 Q16SARV XRa, XRb, Rb @@ -1504,7 +1504,8 @@ enum { * * ┌─ 000000 ─ OPC_MXU_S32MADD * ├─ 000001 ─ OPC_MXU_S32MADDU - * ├─ 000010 ─ + * ├─ 000010 ─ (non-MXU OPC_MUL) + * │ * │ 20..18 * ├─ 000011 ─ OPC_MXU__POOL00 ─┬─ 000 ─ OPC_MXU_S32MAX * │ ├─ 001 ─ OPC_MXU_S32MIN @@ -1536,73 +1537,67 @@ enum { * ├─ 001010 ─ OPC_MXU_D16MAC * ├─ 001011 ─ OPC_MXU_D16MACF * ├─ 001100 ─ OPC_MXU_D16MADL - * │ 25..24 - * ├─ 001101 ─ OPC_MXU__POOL04 ─┬─ 00 ─ OPC_MXU_S16MAD - * │ └─ 01 ─ OPC_MXU_S16MAD_1 + * ├─ 001101 ─ OPC_MXU_S16MAD * ├─ 001110 ─ OPC_MXU_Q16ADD - * ├─ 001111 ─ OPC_MXU_D16MACE - * │ 23 - * ├─ 010000 ─ OPC_MXU__POOL05 ─┬─ 0 ─ OPC_MXU_S32LDD - * │ └─ 1 ─ OPC_MXU_S32LDDR + * ├─ 001111 ─ OPC_MXU_D16MACE 23 + * │ ┌─ 0 ─ OPC_MXU_S32LDD + * ├─ 010000 ─ OPC_MXU__POOL04 ─┴─ 1 ─ OPC_MXU_S32LDDR * │ * │ 23 - * ├─ 010001 ─ OPC_MXU__POOL06 ─┬─ 0 ─ OPC_MXU_S32STD + * ├─ 010001 ─ OPC_MXU__POOL05 ─┬─ 0 ─ OPC_MXU_S32STD * │ └─ 1 ─ OPC_MXU_S32STDR * │ * │ 13..10 - * ├─ 010010 ─ OPC_MXU__POOL07 ─┬─ 0000 ─ OPC_MXU_S32LDDV + * ├─ 010010 ─ OPC_MXU__POOL06 ─┬─ 0000 ─ OPC_MXU_S32LDDV * │ └─ 0001 ─ OPC_MXU_S32LDDVR * │ * │ 13..10 - * ├─ 010011 ─ OPC_MXU__POOL08 ─┬─ 0000 ─ OPC_MXU_S32STDV + * ├─ 010011 ─ OPC_MXU__POOL07 ─┬─ 0000 ─ OPC_MXU_S32STDV * │ └─ 0001 ─ OPC_MXU_S32STDVR * │ * │ 23 - * ├─ 010100 ─ OPC_MXU__POOL09 ─┬─ 0 ─ OPC_MXU_S32LDI + * ├─ 010100 ─ OPC_MXU__POOL08 ─┬─ 0 ─ OPC_MXU_S32LDI * │ └─ 1 ─ OPC_MXU_S32LDIR * │ * │ 23 - * ├─ 010101 ─ OPC_MXU__POOL10 ─┬─ 0 ─ OPC_MXU_S32SDI + * ├─ 010101 ─ OPC_MXU__POOL09 ─┬─ 0 ─ OPC_MXU_S32SDI * │ └─ 1 ─ OPC_MXU_S32SDIR * │ * │ 13..10 - * ├─ 010110 ─ OPC_MXU__POOL11 ─┬─ 0000 ─ OPC_MXU_S32LDIV + * ├─ 010110 ─ OPC_MXU__POOL10 ─┬─ 0000 ─ OPC_MXU_S32LDIV * │ └─ 0001 ─ OPC_MXU_S32LDIVR * │ * │ 13..10 - * ├─ 010111 ─ OPC_MXU__POOL12 ─┬─ 0000 ─ OPC_MXU_S32SDIV + * ├─ 010111 ─ OPC_MXU__POOL11 ─┬─ 0000 ─ OPC_MXU_S32SDIV * │ └─ 0001 ─ OPC_MXU_S32SDIVR * ├─ 011000 ─ OPC_MXU_D32ADD * │ 23..22 - * MXU ├─ 011001 ─ OPC_MXU__POOL13 ─┬─ 00 ─ OPC_MXU_D32ACC + * MXU ├─ 011001 ─ OPC_MXU__POOL12 ─┬─ 00 ─ OPC_MXU_D32ACC * opcodes ─┤ ├─ 01 ─ OPC_MXU_D32ACCM * │ └─ 10 ─ OPC_MXU_D32ASUM * ├─ 011010 ─ * │ 23..22 - * ├─ 011011 ─ OPC_MXU__POOL14 ─┬─ 00 ─ OPC_MXU_Q16ACC + * ├─ 011011 ─ OPC_MXU__POOL13 ─┬─ 00 ─ OPC_MXU_Q16ACC * │ ├─ 01 ─ OPC_MXU_Q16ACCM * │ └─ 10 ─ OPC_MXU_Q16ASUM * │ * │ 23..22 - * ├─ 011100 ─ OPC_MXU__POOL15 ─┬─ 00 ─ OPC_MXU_Q8ADDE + * ├─ 011100 ─ OPC_MXU__POOL14 ─┬─ 00 ─ OPC_MXU_Q8ADDE * │ ├─ 01 ─ OPC_MXU_D8SUM * ├─ 011101 ─ OPC_MXU_Q8ACCE └─ 10 ─ OPC_MXU_D8SUMC * ├─ 011110 ─ * ├─ 011111 ─ - * ├─ 100000 ─ - * ├─ 100001 ─ + * ├─ 100000 ─ (overlaps with CLZ) + * ├─ 100001 ─ (overlaps with CLO) * ├─ 100010 ─ OPC_MXU_S8LDD - * ├─ 100011 ─ OPC_MXU_S8STD - * ├─ 100100 ─ OPC_MXU_S8LDI - * ├─ 100101 ─ OPC_MXU_S8SDI - * │ 15..14 - * ├─ 100110 ─ OPC_MXU__POOL16 ─┬─ 00 ─ OPC_MXU_S32MUL - * │ ├─ 00 ─ OPC_MXU_S32MULU + * ├─ 100011 ─ OPC_MXU_S8STD 15..14 + * ├─ 100100 ─ OPC_MXU_S8LDI ┌─ 00 ─ OPC_MXU_S32MUL + * ├─ 100101 ─ OPC_MXU_S8SDI ├─ 00 ─ OPC_MXU_S32MULU * │ ├─ 00 ─ OPC_MXU_S32EXTR - * │ └─ 00 ─ OPC_MXU_S32EXTRV + * ├─ 100110 ─ OPC_MXU__POOL15 ─┴─ 00 ─ OPC_MXU_S32EXTRV * │ * │ 20..18 - * ├─ 100111 ─ OPC_MXU__POOL17 ─┬─ 000 ─ OPC_MXU_D32SARW + * ├─ 100111 ─ OPC_MXU__POOL16 ─┬─ 000 ─ OPC_MXU_D32SARW * │ ├─ 001 ─ OPC_MXU_S32ALN * ├─ 101000 ─ OPC_MXU_LXB ├─ 010 ─ OPC_MXU_S32ALNI * ├─ 101001 ─ ├─ 011 ─ OPC_MXU_S32NOR @@ -1610,33 +1605,24 @@ enum { * ├─ 101011 ─ OPC_MXU_S16STD ├─ 101 ─ OPC_MXU_S32OR * ├─ 101100 ─ OPC_MXU_S16LDI ├─ 110 ─ OPC_MXU_S32XOR * ├─ 101101 ─ OPC_MXU_S16SDI └─ 111 ─ OPC_MXU_S32LUI - * ├─ 101000 ─ - * ├─ 101001 ─ - * ├─ 101010 ─ - * ├─ 101011 ─ - * ├─ 101100 ─ - * ├─ 101101 ─ * ├─ 101110 ─ OPC_MXU_S32M2I * ├─ 101111 ─ OPC_MXU_S32I2M * ├─ 110000 ─ OPC_MXU_D32SLL - * ├─ 110001 ─ OPC_MXU_D32SLR - * ├─ 110010 ─ OPC_MXU_D32SARL - * ├─ 110011 ─ OPC_MXU_D32SAR - * ├─ 110100 ─ OPC_MXU_Q16SLL - * ├─ 110101 ─ OPC_MXU_Q16SLR 20..18 - * ├─ 110110 ─ OPC_MXU__POOL18 ─┬─ 000 ─ OPC_MXU_D32SLLV - * │ ├─ 001 ─ OPC_MXU_D32SLRV - * │ ├─ 010 ─ OPC_MXU_D32SARV - * │ ├─ 011 ─ OPC_MXU_Q16SLLV + * ├─ 110001 ─ OPC_MXU_D32SLR 20..18 + * ├─ 110010 ─ OPC_MXU_D32SARL ┌─ 000 ─ OPC_MXU_D32SLLV + * ├─ 110011 ─ OPC_MXU_D32SAR ├─ 001 ─ OPC_MXU_D32SLRV + * ├─ 110100 ─ OPC_MXU_Q16SLL ├─ 010 ─ OPC_MXU_D32SARV + * ├─ 110101 ─ OPC_MXU_Q16SLR ├─ 011 ─ OPC_MXU_Q16SLLV * │ ├─ 100 ─ OPC_MXU_Q16SLRV - * │ └─ 101 ─ OPC_MXU_Q16SARV + * ├─ 110110 ─ OPC_MXU__POOL17 ─┴─ 101 ─ OPC_MXU_Q16SARV + * │ * ├─ 110111 ─ OPC_MXU_Q16SAR * │ 23..22 - * ├─ 111000 ─ OPC_MXU__POOL19 ─┬─ 00 ─ OPC_MXU_Q8MUL + * ├─ 111000 ─ OPC_MXU__POOL18 ─┬─ 00 ─ OPC_MXU_Q8MUL * │ └─ 01 ─ OPC_MXU_Q8MULSU * │ * │ 20..18 - * ├─ 111001 ─ OPC_MXU__POOL20 ─┬─ 000 ─ OPC_MXU_Q8MOVZ + * ├─ 111001 ─ OPC_MXU__POOL19 ─┬─ 000 ─ OPC_MXU_Q8MOVZ * │ ├─ 001 ─ OPC_MXU_Q8MOVN * │ ├─ 010 ─ OPC_MXU_D16MOVZ * │ ├─ 011 ─ OPC_MXU_D16MOVN @@ -1644,13 +1630,13 @@ enum { * │ └─ 101 ─ OPC_MXU_S32MOV * │ * │ 23..22 - * ├─ 111010 ─ OPC_MXU__POOL21 ─┬─ 00 ─ OPC_MXU_Q8MAC + * ├─ 111010 ─ OPC_MXU__POOL20 ─┬─ 00 ─ OPC_MXU_Q8MAC * │ └─ 10 ─ OPC_MXU_Q8MACSU * ├─ 111011 ─ OPC_MXU_Q16SCOP * ├─ 111100 ─ OPC_MXU_Q8MADL * ├─ 111101 ─ OPC_MXU_S32SFL * ├─ 111110 ─ OPC_MXU_Q8SAD - * └─ 111111 ─ + * └─ 111111 ─ (overlaps with SDBBP) * * * Compiled after: @@ -1673,22 +1659,22 @@ enum { OPC_MXU_D16MAC = 0x0A, OPC_MXU_D16MACF = 0x0B, OPC_MXU_D16MADL = 0x0C, - OPC_MXU__POOL04 = 0x0D, + OPC_MXU_S16MAD = 0x0D, OPC_MXU_Q16ADD = 0x0E, OPC_MXU_D16MACE = 0x0F, - OPC_MXU__POOL05 = 0x10, - OPC_MXU__POOL06 = 0x11, - OPC_MXU__POOL07 = 0x12, - OPC_MXU__POOL08 = 0x13, - OPC_MXU__POOL09 = 0x14, - OPC_MXU__POOL10 = 0x15, - OPC_MXU__POOL11 = 0x16, - OPC_MXU__POOL12 = 0x17, + OPC_MXU__POOL04 = 0x10, + OPC_MXU__POOL05 = 0x11, + OPC_MXU__POOL06 = 0x12, + OPC_MXU__POOL07 = 0x13, + OPC_MXU__POOL08 = 0x14, + OPC_MXU__POOL09 = 0x15, + OPC_MXU__POOL10 = 0x16, + OPC_MXU__POOL11 = 0x17, OPC_MXU_D32ADD = 0x18, - OPC_MXU__POOL13 = 0x19, + OPC_MXU__POOL12 = 0x19, /* not assigned 0x1A */ - OPC_MXU__POOL14 = 0x1B, - OPC_MXU__POOL15 = 0x1C, + OPC_MXU__POOL13 = 0x1B, + OPC_MXU__POOL14 = 0x1C, OPC_MXU_Q8ACCE = 0x1D, /* not assigned 0x1E */ /* not assigned 0x1F */ @@ -1698,8 +1684,8 @@ enum { OPC_MXU_S8STD = 0x23, OPC_MXU_S8LDI = 0x24, OPC_MXU_S8SDI = 0x25, - OPC_MXU__POOL16 = 0x26, - OPC_MXU__POOL17 = 0x27, + OPC_MXU__POOL15 = 0x26, + OPC_MXU__POOL16 = 0x27, OPC_MXU_LXB = 0x28, /* not assigned 0x29 */ OPC_MXU_S16LDD = 0x2A, @@ -1714,11 +1700,11 @@ enum { OPC_MXU_D32SAR = 0x33, OPC_MXU_Q16SLL = 0x34, OPC_MXU_Q16SLR = 0x35, - OPC_MXU__POOL18 = 0x36, + OPC_MXU__POOL17 = 0x36, OPC_MXU_Q16SAR = 0x37, - OPC_MXU__POOL19 = 0x38, - OPC_MXU__POOL20 = 0x39, - OPC_MXU__POOL21 = 0x3A, + OPC_MXU__POOL18 = 0x38, + OPC_MXU__POOL19 = 0x39, + OPC_MXU__POOL20 = 0x3A, OPC_MXU_Q16SCOP = 0x3B, OPC_MXU_Q8MADL = 0x3C, OPC_MXU_S32SFL = 0x3D, @@ -1775,21 +1761,13 @@ enum { /* * MXU pool 04 */ -enum { - OPC_MXU_S16MAD = 0x00, - OPC_MXU_S16MAD_1 = 0x01, -}; - -/* - * MXU pool 05 - */ enum { OPC_MXU_S32LDD = 0x00, OPC_MXU_S32LDDR = 0x01, }; /* - * MXU pool 06 + * MXU pool 05 */ enum { OPC_MXU_S32STD = 0x00, @@ -1797,7 +1775,7 @@ enum { }; /* - * MXU pool 07 + * MXU pool 06 */ enum { OPC_MXU_S32LDDV = 0x00, @@ -1805,7 +1783,7 @@ enum { }; /* - * MXU pool 08 + * MXU pool 07 */ enum { OPC_MXU_S32STDV = 0x00, @@ -1813,7 +1791,7 @@ enum { }; /* - * MXU pool 09 + * MXU pool 08 */ enum { OPC_MXU_S32LDI = 0x00, @@ -1821,7 +1799,7 @@ enum { }; /* - * MXU pool 10 + * MXU pool 09 */ enum { OPC_MXU_S32SDI = 0x00, @@ -1829,7 +1807,7 @@ enum { }; /* - * MXU pool 11 + * MXU pool 10 */ enum { OPC_MXU_S32LDIV = 0x00, @@ -1837,7 +1815,7 @@ enum { }; /* - * MXU pool 12 + * MXU pool 11 */ enum { OPC_MXU_S32SDIV = 0x00, @@ -1845,7 +1823,7 @@ enum { }; /* - * MXU pool 13 + * MXU pool 12 */ enum { OPC_MXU_D32ACC = 0x00, @@ -1854,7 +1832,7 @@ enum { }; /* - * MXU pool 14 + * MXU pool 13 */ enum { OPC_MXU_Q16ACC = 0x00, @@ -1863,7 +1841,7 @@ enum { }; /* - * MXU pool 15 + * MXU pool 14 */ enum { OPC_MXU_Q8ADDE = 0x00, @@ -1872,7 +1850,7 @@ enum { }; /* - * MXU pool 16 + * MXU pool 15 */ enum { OPC_MXU_S32MUL = 0x00, @@ -1882,7 +1860,7 @@ enum { }; /* - * MXU pool 17 + * MXU pool 16 */ enum { OPC_MXU_D32SARW = 0x00, @@ -1896,7 +1874,7 @@ enum { }; /* - * MXU pool 18 + * MXU pool 17 */ enum { OPC_MXU_D32SLLV = 0x00, @@ -1908,7 +1886,7 @@ enum { }; /* - * MXU pool 19 + * MXU pool 18 */ enum { OPC_MXU_Q8MUL = 0x00, @@ -1916,7 +1894,7 @@ enum { }; /* - * MXU pool 20 + * MXU pool 19 */ enum { OPC_MXU_Q8MOVZ = 0x00, @@ -1928,7 +1906,7 @@ enum { }; /* - * MXU pool 21 + * MXU pool 20 */ enum { OPC_MXU_Q8MAC = 0x00,