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'.

Backports commit eab0bdb07cbed1131be2d1f541059c7b96b05e32 from qemu
This commit is contained in:
Aleksandar Markovic 2018-11-11 05:58:11 -05:00 committed by Lioncash
parent 8429d98b40
commit ed037799c7
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7

View file

@ -1481,7 +1481,7 @@ enum {
* S32OR XRa, XRb, XRc D32SARW XRa, XRb, XRc, Rb * S32OR XRa, XRb, XRc D32SARW XRa, XRb, XRc, Rb
* Q16SLL XRa, XRb, XRc, XRd, sft4 * Q16SLL XRa, XRb, XRc, XRd, sft4
* Q16SLR 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 * ------------------------- Q16SLLV XRa, XRb, Rb
* Q16SLRV XRa, XRb, Rb * Q16SLRV XRa, XRb, Rb
* S32SFL XRa, XRb, XRc, XRd, optn2 Q16SARV XRa, XRb, Rb * S32SFL XRa, XRb, XRc, XRd, optn2 Q16SARV XRa, XRb, Rb
@ -1499,7 +1499,7 @@ enum {
* *
* 000000 OPC_MXU_S32MADD * 000000 OPC_MXU_S32MADD
* 000001 OPC_MXU_S32MADDU * 000001 OPC_MXU_S32MADDU
* 000010 <not assigned> * 000010 <not assigned> (non-MXU OPC_MUL)
* 20..18 * 20..18
* 000011 OPC_MXU__POOL00 000 OPC_MXU_S32MAX * 000011 OPC_MXU__POOL00 000 OPC_MXU_S32MAX
* 001 OPC_MXU_S32MIN * 001 OPC_MXU_S32MIN
@ -1531,73 +1531,67 @@ enum {
* 001010 OPC_MXU_D16MAC * 001010 OPC_MXU_D16MAC
* 001011 OPC_MXU_D16MACF * 001011 OPC_MXU_D16MACF
* 001100 OPC_MXU_D16MADL * 001100 OPC_MXU_D16MADL
* 25..24 * 001101 OPC_MXU_S16MAD
* 001101 OPC_MXU__POOL04 00 OPC_MXU_S16MAD
* 01 OPC_MXU_S16MAD_1
* 001110 OPC_MXU_Q16ADD * 001110 OPC_MXU_Q16ADD
* 001111 OPC_MXU_D16MACE * 001111 OPC_MXU_D16MACE 23
* 23 * 0 OPC_MXU_S32LDD
* 010000 OPC_MXU__POOL05 0 OPC_MXU_S32LDD * 010000 OPC_MXU__POOL04 1 OPC_MXU_S32LDDR
* 1 OPC_MXU_S32LDDR
* *
* 23 * 23
* 010001 OPC_MXU__POOL06 0 OPC_MXU_S32STD * 010001 OPC_MXU__POOL05 0 OPC_MXU_S32STD
* 1 OPC_MXU_S32STDR * 1 OPC_MXU_S32STDR
* *
* 13..10 * 13..10
* 010010 OPC_MXU__POOL07 0000 OPC_MXU_S32LDDV * 010010 OPC_MXU__POOL06 0000 OPC_MXU_S32LDDV
* 0001 OPC_MXU_S32LDDVR * 0001 OPC_MXU_S32LDDVR
* *
* 13..10 * 13..10
* 010011 OPC_MXU__POOL08 0000 OPC_MXU_S32STDV * 010011 OPC_MXU__POOL07 0000 OPC_MXU_S32STDV
* 0001 OPC_MXU_S32STDVR * 0001 OPC_MXU_S32STDVR
* *
* 23 * 23
* 010100 OPC_MXU__POOL09 0 OPC_MXU_S32LDI * 010100 OPC_MXU__POOL08 0 OPC_MXU_S32LDI
* 1 OPC_MXU_S32LDIR * 1 OPC_MXU_S32LDIR
* *
* 23 * 23
* 010101 OPC_MXU__POOL10 0 OPC_MXU_S32SDI * 010101 OPC_MXU__POOL09 0 OPC_MXU_S32SDI
* 1 OPC_MXU_S32SDIR * 1 OPC_MXU_S32SDIR
* *
* 13..10 * 13..10
* 010110 OPC_MXU__POOL11 0000 OPC_MXU_S32LDIV * 010110 OPC_MXU__POOL10 0000 OPC_MXU_S32LDIV
* 0001 OPC_MXU_S32LDIVR * 0001 OPC_MXU_S32LDIVR
* *
* 13..10 * 13..10
* 010111 OPC_MXU__POOL12 0000 OPC_MXU_S32SDIV * 010111 OPC_MXU__POOL11 0000 OPC_MXU_S32SDIV
* 0001 OPC_MXU_S32SDIVR * 0001 OPC_MXU_S32SDIVR
* 011000 OPC_MXU_D32ADD * 011000 OPC_MXU_D32ADD
* 23..22 * 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 * opcodes 01 OPC_MXU_D32ACCM
* 10 OPC_MXU_D32ASUM * 10 OPC_MXU_D32ASUM
* 011010 <not assigned> * 011010 <not assigned>
* 23..22 * 23..22
* 011011 OPC_MXU__POOL14 00 OPC_MXU_Q16ACC * 011011 OPC_MXU__POOL13 00 OPC_MXU_Q16ACC
* 01 OPC_MXU_Q16ACCM * 01 OPC_MXU_Q16ACCM
* 10 OPC_MXU_Q16ASUM * 10 OPC_MXU_Q16ASUM
* *
* 23..22 * 23..22
* 011100 OPC_MXU__POOL15 00 OPC_MXU_Q8ADDE * 011100 OPC_MXU__POOL14 00 OPC_MXU_Q8ADDE
* 01 OPC_MXU_D8SUM * 01 OPC_MXU_D8SUM
* 011101 OPC_MXU_Q8ACCE 10 OPC_MXU_D8SUMC * 011101 OPC_MXU_Q8ACCE 10 OPC_MXU_D8SUMC
* 011110 <not assigned> * 011110 <not assigned>
* 011111 <not assigned> * 011111 <not assigned>
* 100000 <not assigned> * 100000 <not assigned> (overlaps with CLZ)
* 100001 <not assigned> * 100001 <not assigned> (overlaps with CLO)
* 100010 OPC_MXU_S8LDD * 100010 OPC_MXU_S8LDD
* 100011 OPC_MXU_S8STD * 100011 OPC_MXU_S8STD 15..14
* 100100 OPC_MXU_S8LDI * 100100 OPC_MXU_S8LDI 00 OPC_MXU_S32MUL
* 100101 OPC_MXU_S8SDI * 100101 OPC_MXU_S8SDI 00 OPC_MXU_S32MULU
* 15..14
* 100110 OPC_MXU__POOL16 00 OPC_MXU_S32MUL
* 00 OPC_MXU_S32MULU
* 00 OPC_MXU_S32EXTR * 00 OPC_MXU_S32EXTR
* 00 OPC_MXU_S32EXTRV * 100110 OPC_MXU__POOL15 00 OPC_MXU_S32EXTRV
* *
* 20..18 * 20..18
* 100111 OPC_MXU__POOL17 000 OPC_MXU_D32SARW * 100111 OPC_MXU__POOL16 000 OPC_MXU_D32SARW
* 001 OPC_MXU_S32ALN * 001 OPC_MXU_S32ALN
* 101000 OPC_MXU_LXB 010 OPC_MXU_S32ALNI * 101000 OPC_MXU_LXB 010 OPC_MXU_S32ALNI
* 101001 <not assigned> 011 OPC_MXU_S32NOR * 101001 <not assigned> 011 OPC_MXU_S32NOR
@ -1605,33 +1599,24 @@ enum {
* 101011 OPC_MXU_S16STD 101 OPC_MXU_S32OR * 101011 OPC_MXU_S16STD 101 OPC_MXU_S32OR
* 101100 OPC_MXU_S16LDI 110 OPC_MXU_S32XOR * 101100 OPC_MXU_S16LDI 110 OPC_MXU_S32XOR
* 101101 OPC_MXU_S16SDI 111 OPC_MXU_S32LUI * 101101 OPC_MXU_S16SDI 111 OPC_MXU_S32LUI
* 101000 <not assigned>
* 101001 <not assigned>
* 101010 <not assigned>
* 101011 <not assigned>
* 101100 <not assigned>
* 101101 <not assigned>
* 101110 OPC_MXU_S32M2I * 101110 OPC_MXU_S32M2I
* 101111 OPC_MXU_S32I2M * 101111 OPC_MXU_S32I2M
* 110000 OPC_MXU_D32SLL * 110000 OPC_MXU_D32SLL
* 110001 OPC_MXU_D32SLR * 110001 OPC_MXU_D32SLR 20..18
* 110010 OPC_MXU_D32SARL * 110010 OPC_MXU_D32SARL 000 OPC_MXU_D32SLLV
* 110011 OPC_MXU_D32SAR * 110011 OPC_MXU_D32SAR 001 OPC_MXU_D32SLRV
* 110100 OPC_MXU_Q16SLL * 110100 OPC_MXU_Q16SLL 010 OPC_MXU_D32SARV
* 110101 OPC_MXU_Q16SLR 20..18 * 110101 OPC_MXU_Q16SLR 011 OPC_MXU_Q16SLLV
* 110110 OPC_MXU__POOL18 000 OPC_MXU_D32SLLV
* 001 OPC_MXU_D32SLRV
* 010 OPC_MXU_D32SARV
* 011 OPC_MXU_Q16SLLV
* 100 OPC_MXU_Q16SLRV * 100 OPC_MXU_Q16SLRV
* 101 OPC_MXU_Q16SARV * 110110 OPC_MXU__POOL17 101 OPC_MXU_Q16SARV
*
* 110111 OPC_MXU_Q16SAR * 110111 OPC_MXU_Q16SAR
* 23..22 * 23..22
* 111000 OPC_MXU__POOL19 00 OPC_MXU_Q8MUL * 111000 OPC_MXU__POOL18 00 OPC_MXU_Q8MUL
* 01 OPC_MXU_Q8MULSU * 01 OPC_MXU_Q8MULSU
* *
* 20..18 * 20..18
* 111001 OPC_MXU__POOL20 000 OPC_MXU_Q8MOVZ * 111001 OPC_MXU__POOL19 000 OPC_MXU_Q8MOVZ
* 001 OPC_MXU_Q8MOVN * 001 OPC_MXU_Q8MOVN
* 010 OPC_MXU_D16MOVZ * 010 OPC_MXU_D16MOVZ
* 011 OPC_MXU_D16MOVN * 011 OPC_MXU_D16MOVN
@ -1639,13 +1624,13 @@ enum {
* 101 OPC_MXU_S32MOV * 101 OPC_MXU_S32MOV
* *
* 23..22 * 23..22
* 111010 OPC_MXU__POOL21 00 OPC_MXU_Q8MAC * 111010 OPC_MXU__POOL20 00 OPC_MXU_Q8MAC
* 10 OPC_MXU_Q8MACSU * 10 OPC_MXU_Q8MACSU
* 111011 OPC_MXU_Q16SCOP * 111011 OPC_MXU_Q16SCOP
* 111100 OPC_MXU_Q8MADL * 111100 OPC_MXU_Q8MADL
* 111101 OPC_MXU_S32SFL * 111101 OPC_MXU_S32SFL
* 111110 OPC_MXU_Q8SAD * 111110 OPC_MXU_Q8SAD
* 111111 <not assigned> * 111111 <not assigned> (overlaps with SDBBP)
* *
* *
* Compiled after: * Compiled after:
@ -1668,22 +1653,22 @@ enum {
OPC_MXU_D16MAC = 0x0A, OPC_MXU_D16MAC = 0x0A,
OPC_MXU_D16MACF = 0x0B, OPC_MXU_D16MACF = 0x0B,
OPC_MXU_D16MADL = 0x0C, OPC_MXU_D16MADL = 0x0C,
OPC_MXU__POOL04 = 0x0D, OPC_MXU_S16MAD = 0x0D,
OPC_MXU_Q16ADD = 0x0E, OPC_MXU_Q16ADD = 0x0E,
OPC_MXU_D16MACE = 0x0F, OPC_MXU_D16MACE = 0x0F,
OPC_MXU__POOL05 = 0x10, OPC_MXU__POOL04 = 0x10,
OPC_MXU__POOL06 = 0x11, OPC_MXU__POOL05 = 0x11,
OPC_MXU__POOL07 = 0x12, OPC_MXU__POOL06 = 0x12,
OPC_MXU__POOL08 = 0x13, OPC_MXU__POOL07 = 0x13,
OPC_MXU__POOL09 = 0x14, OPC_MXU__POOL08 = 0x14,
OPC_MXU__POOL10 = 0x15, OPC_MXU__POOL09 = 0x15,
OPC_MXU__POOL11 = 0x16, OPC_MXU__POOL10 = 0x16,
OPC_MXU__POOL12 = 0x17, OPC_MXU__POOL11 = 0x17,
OPC_MXU_D32ADD = 0x18, OPC_MXU_D32ADD = 0x18,
OPC_MXU__POOL13 = 0x19, OPC_MXU__POOL12 = 0x19,
/* not assigned 0x1A */ /* not assigned 0x1A */
OPC_MXU__POOL14 = 0x1B, OPC_MXU__POOL13 = 0x1B,
OPC_MXU__POOL15 = 0x1C, OPC_MXU__POOL14 = 0x1C,
OPC_MXU_Q8ACCE = 0x1D, OPC_MXU_Q8ACCE = 0x1D,
/* not assigned 0x1E */ /* not assigned 0x1E */
/* not assigned 0x1F */ /* not assigned 0x1F */
@ -1693,8 +1678,8 @@ enum {
OPC_MXU_S8STD = 0x23, OPC_MXU_S8STD = 0x23,
OPC_MXU_S8LDI = 0x24, OPC_MXU_S8LDI = 0x24,
OPC_MXU_S8SDI = 0x25, OPC_MXU_S8SDI = 0x25,
OPC_MXU__POOL16 = 0x26, OPC_MXU__POOL15 = 0x26,
OPC_MXU__POOL17 = 0x27, OPC_MXU__POOL16 = 0x27,
OPC_MXU_LXB = 0x28, OPC_MXU_LXB = 0x28,
/* not assigned 0x29 */ /* not assigned 0x29 */
OPC_MXU_S16LDD = 0x2A, OPC_MXU_S16LDD = 0x2A,
@ -1709,11 +1694,11 @@ enum {
OPC_MXU_D32SAR = 0x33, OPC_MXU_D32SAR = 0x33,
OPC_MXU_Q16SLL = 0x34, OPC_MXU_Q16SLL = 0x34,
OPC_MXU_Q16SLR = 0x35, OPC_MXU_Q16SLR = 0x35,
OPC_MXU__POOL18 = 0x36, OPC_MXU__POOL17 = 0x36,
OPC_MXU_Q16SAR = 0x37, OPC_MXU_Q16SAR = 0x37,
OPC_MXU__POOL19 = 0x38, OPC_MXU__POOL18 = 0x38,
OPC_MXU__POOL20 = 0x39, OPC_MXU__POOL19 = 0x39,
OPC_MXU__POOL21 = 0x3A, OPC_MXU__POOL20 = 0x3A,
OPC_MXU_Q16SCOP = 0x3B, OPC_MXU_Q16SCOP = 0x3B,
OPC_MXU_Q8MADL = 0x3C, OPC_MXU_Q8MADL = 0x3C,
OPC_MXU_S32SFL = 0x3D, OPC_MXU_S32SFL = 0x3D,
@ -1770,21 +1755,13 @@ enum {
/* /*
* MXU pool 04 * MXU pool 04
*/ */
enum {
OPC_MXU_S16MAD = 0x00,
OPC_MXU_S16MAD_1 = 0x01,
};
/*
* MXU pool 05
*/
enum { enum {
OPC_MXU_S32LDD = 0x00, OPC_MXU_S32LDD = 0x00,
OPC_MXU_S32LDDR = 0x01, OPC_MXU_S32LDDR = 0x01,
}; };
/* /*
* MXU pool 06 * MXU pool 05
*/ */
enum { enum {
OPC_MXU_S32STD = 0x00, OPC_MXU_S32STD = 0x00,
@ -1792,7 +1769,7 @@ enum {
}; };
/* /*
* MXU pool 07 * MXU pool 06
*/ */
enum { enum {
OPC_MXU_S32LDDV = 0x00, OPC_MXU_S32LDDV = 0x00,
@ -1800,7 +1777,7 @@ enum {
}; };
/* /*
* MXU pool 08 * MXU pool 07
*/ */
enum { enum {
OPC_MXU_S32STDV = 0x00, OPC_MXU_S32STDV = 0x00,
@ -1808,7 +1785,7 @@ enum {
}; };
/* /*
* MXU pool 09 * MXU pool 08
*/ */
enum { enum {
OPC_MXU_S32LDI = 0x00, OPC_MXU_S32LDI = 0x00,
@ -1816,7 +1793,7 @@ enum {
}; };
/* /*
* MXU pool 10 * MXU pool 09
*/ */
enum { enum {
OPC_MXU_S32SDI = 0x00, OPC_MXU_S32SDI = 0x00,
@ -1824,7 +1801,7 @@ enum {
}; };
/* /*
* MXU pool 11 * MXU pool 10
*/ */
enum { enum {
OPC_MXU_S32LDIV = 0x00, OPC_MXU_S32LDIV = 0x00,
@ -1832,7 +1809,7 @@ enum {
}; };
/* /*
* MXU pool 12 * MXU pool 11
*/ */
enum { enum {
OPC_MXU_S32SDIV = 0x00, OPC_MXU_S32SDIV = 0x00,
@ -1840,7 +1817,7 @@ enum {
}; };
/* /*
* MXU pool 13 * MXU pool 12
*/ */
enum { enum {
OPC_MXU_D32ACC = 0x00, OPC_MXU_D32ACC = 0x00,
@ -1849,7 +1826,7 @@ enum {
}; };
/* /*
* MXU pool 14 * MXU pool 13
*/ */
enum { enum {
OPC_MXU_Q16ACC = 0x00, OPC_MXU_Q16ACC = 0x00,
@ -1858,7 +1835,7 @@ enum {
}; };
/* /*
* MXU pool 15 * MXU pool 14
*/ */
enum { enum {
OPC_MXU_Q8ADDE = 0x00, OPC_MXU_Q8ADDE = 0x00,
@ -1867,7 +1844,7 @@ enum {
}; };
/* /*
* MXU pool 16 * MXU pool 15
*/ */
enum { enum {
OPC_MXU_S32MUL = 0x00, OPC_MXU_S32MUL = 0x00,
@ -1877,7 +1854,7 @@ enum {
}; };
/* /*
* MXU pool 17 * MXU pool 16
*/ */
enum { enum {
OPC_MXU_D32SARW = 0x00, OPC_MXU_D32SARW = 0x00,
@ -1891,7 +1868,7 @@ enum {
}; };
/* /*
* MXU pool 18 * MXU pool 17
*/ */
enum { enum {
OPC_MXU_D32SLLV = 0x00, OPC_MXU_D32SLLV = 0x00,
@ -1903,7 +1880,7 @@ enum {
}; };
/* /*
* MXU pool 19 * MXU pool 18
*/ */
enum { enum {
OPC_MXU_Q8MUL = 0x00, OPC_MXU_Q8MUL = 0x00,
@ -1911,7 +1888,7 @@ enum {
}; };
/* /*
* MXU pool 20 * MXU pool 19
*/ */
enum { enum {
OPC_MXU_Q8MOVZ = 0x00, OPC_MXU_Q8MOVZ = 0x00,
@ -1923,7 +1900,7 @@ enum {
}; };
/* /*
* MXU pool 21 * MXU pool 20
*/ */
enum { enum {
OPC_MXU_Q8MAC = 0x00, OPC_MXU_Q8MAC = 0x00,