]> Git Repo - qemu.git/blob - target/mips/translate.c
Merge remote-tracking branch 'remotes/amarkovic/tags/mips-queue-oct-2018-part-3'...
[qemu.git] / target / mips / translate.c
1 /*
2  *  MIPS emulation for QEMU - main translation routines
3  *
4  *  Copyright (c) 2004-2005 Jocelyn Mayer
5  *  Copyright (c) 2006 Marius Groeger (FPU operations)
6  *  Copyright (c) 2006 Thiemo Seufer (MIPS32R2 support)
7  *  Copyright (c) 2009 CodeSourcery (MIPS16 and microMIPS support)
8  *  Copyright (c) 2012 Jia Liu & Dongxue Zhang (MIPS ASE DSP support)
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
22  */
23
24 #include "qemu/osdep.h"
25 #include "cpu.h"
26 #include "internal.h"
27 #include "disas/disas.h"
28 #include "exec/exec-all.h"
29 #include "tcg-op.h"
30 #include "exec/cpu_ldst.h"
31 #include "hw/mips/cpudevs.h"
32
33 #include "exec/helper-proto.h"
34 #include "exec/helper-gen.h"
35 #include "exec/semihost.h"
36
37 #include "target/mips/trace.h"
38 #include "trace-tcg.h"
39 #include "exec/translator.h"
40 #include "exec/log.h"
41
42 #define MIPS_DEBUG_DISAS 0
43
44 /* MIPS major opcodes */
45 #define MASK_OP_MAJOR(op)  (op & (0x3F << 26))
46
47 enum {
48     /* indirect opcode tables */
49     OPC_SPECIAL  = (0x00 << 26),
50     OPC_REGIMM   = (0x01 << 26),
51     OPC_CP0      = (0x10 << 26),
52     OPC_CP1      = (0x11 << 26),
53     OPC_CP2      = (0x12 << 26),
54     OPC_CP3      = (0x13 << 26),
55     OPC_SPECIAL2 = (0x1C << 26),
56     OPC_SPECIAL3 = (0x1F << 26),
57     /* arithmetic with immediate */
58     OPC_ADDI     = (0x08 << 26),
59     OPC_ADDIU    = (0x09 << 26),
60     OPC_SLTI     = (0x0A << 26),
61     OPC_SLTIU    = (0x0B << 26),
62     /* logic with immediate */
63     OPC_ANDI     = (0x0C << 26),
64     OPC_ORI      = (0x0D << 26),
65     OPC_XORI     = (0x0E << 26),
66     OPC_LUI      = (0x0F << 26),
67     /* arithmetic with immediate */
68     OPC_DADDI    = (0x18 << 26),
69     OPC_DADDIU   = (0x19 << 26),
70     /* Jump and branches */
71     OPC_J        = (0x02 << 26),
72     OPC_JAL      = (0x03 << 26),
73     OPC_BEQ      = (0x04 << 26),  /* Unconditional if rs = rt = 0 (B) */
74     OPC_BEQL     = (0x14 << 26),
75     OPC_BNE      = (0x05 << 26),
76     OPC_BNEL     = (0x15 << 26),
77     OPC_BLEZ     = (0x06 << 26),
78     OPC_BLEZL    = (0x16 << 26),
79     OPC_BGTZ     = (0x07 << 26),
80     OPC_BGTZL    = (0x17 << 26),
81     OPC_JALX     = (0x1D << 26),
82     OPC_DAUI     = (0x1D << 26),
83     /* Load and stores */
84     OPC_LDL      = (0x1A << 26),
85     OPC_LDR      = (0x1B << 26),
86     OPC_LB       = (0x20 << 26),
87     OPC_LH       = (0x21 << 26),
88     OPC_LWL      = (0x22 << 26),
89     OPC_LW       = (0x23 << 26),
90     OPC_LWPC     = OPC_LW | 0x5,
91     OPC_LBU      = (0x24 << 26),
92     OPC_LHU      = (0x25 << 26),
93     OPC_LWR      = (0x26 << 26),
94     OPC_LWU      = (0x27 << 26),
95     OPC_SB       = (0x28 << 26),
96     OPC_SH       = (0x29 << 26),
97     OPC_SWL      = (0x2A << 26),
98     OPC_SW       = (0x2B << 26),
99     OPC_SDL      = (0x2C << 26),
100     OPC_SDR      = (0x2D << 26),
101     OPC_SWR      = (0x2E << 26),
102     OPC_LL       = (0x30 << 26),
103     OPC_LLD      = (0x34 << 26),
104     OPC_LD       = (0x37 << 26),
105     OPC_LDPC     = OPC_LD | 0x5,
106     OPC_SC       = (0x38 << 26),
107     OPC_SCD      = (0x3C << 26),
108     OPC_SD       = (0x3F << 26),
109     /* Floating point load/store */
110     OPC_LWC1     = (0x31 << 26),
111     OPC_LWC2     = (0x32 << 26),
112     OPC_LDC1     = (0x35 << 26),
113     OPC_LDC2     = (0x36 << 26),
114     OPC_SWC1     = (0x39 << 26),
115     OPC_SWC2     = (0x3A << 26),
116     OPC_SDC1     = (0x3D << 26),
117     OPC_SDC2     = (0x3E << 26),
118     /* Compact Branches */
119     OPC_BLEZALC  = (0x06 << 26),
120     OPC_BGEZALC  = (0x06 << 26),
121     OPC_BGEUC    = (0x06 << 26),
122     OPC_BGTZALC  = (0x07 << 26),
123     OPC_BLTZALC  = (0x07 << 26),
124     OPC_BLTUC    = (0x07 << 26),
125     OPC_BOVC     = (0x08 << 26),
126     OPC_BEQZALC  = (0x08 << 26),
127     OPC_BEQC     = (0x08 << 26),
128     OPC_BLEZC    = (0x16 << 26),
129     OPC_BGEZC    = (0x16 << 26),
130     OPC_BGEC     = (0x16 << 26),
131     OPC_BGTZC    = (0x17 << 26),
132     OPC_BLTZC    = (0x17 << 26),
133     OPC_BLTC     = (0x17 << 26),
134     OPC_BNVC     = (0x18 << 26),
135     OPC_BNEZALC  = (0x18 << 26),
136     OPC_BNEC     = (0x18 << 26),
137     OPC_BC       = (0x32 << 26),
138     OPC_BEQZC    = (0x36 << 26),
139     OPC_JIC      = (0x36 << 26),
140     OPC_BALC     = (0x3A << 26),
141     OPC_BNEZC    = (0x3E << 26),
142     OPC_JIALC    = (0x3E << 26),
143     /* MDMX ASE specific */
144     OPC_MDMX     = (0x1E << 26),
145     /* MSA ASE, same as MDMX */
146     OPC_MSA      = OPC_MDMX,
147     /* Cache and prefetch */
148     OPC_CACHE    = (0x2F << 26),
149     OPC_PREF     = (0x33 << 26),
150     /* PC-relative address computation / loads */
151     OPC_PCREL    = (0x3B << 26),
152 };
153
154 /* PC-relative address computation / loads  */
155 #define MASK_OPC_PCREL_TOP2BITS(op)  (MASK_OP_MAJOR(op) | (op & (3 << 19)))
156 #define MASK_OPC_PCREL_TOP5BITS(op)  (MASK_OP_MAJOR(op) | (op & (0x1f << 16)))
157 enum {
158     /* Instructions determined by bits 19 and 20 */
159     OPC_ADDIUPC = OPC_PCREL | (0 << 19),
160     R6_OPC_LWPC = OPC_PCREL | (1 << 19),
161     OPC_LWUPC   = OPC_PCREL | (2 << 19),
162
163     /* Instructions determined by bits 16 ... 20 */
164     OPC_AUIPC   = OPC_PCREL | (0x1e << 16),
165     OPC_ALUIPC  = OPC_PCREL | (0x1f << 16),
166
167     /* Other */
168     R6_OPC_LDPC = OPC_PCREL | (6 << 18),
169 };
170
171 /* MIPS special opcodes */
172 #define MASK_SPECIAL(op)   MASK_OP_MAJOR(op) | (op & 0x3F)
173
174 enum {
175     /* Shifts */
176     OPC_SLL      = 0x00 | OPC_SPECIAL,
177     /* NOP is SLL r0, r0, 0   */
178     /* SSNOP is SLL r0, r0, 1 */
179     /* EHB is SLL r0, r0, 3 */
180     OPC_SRL      = 0x02 | OPC_SPECIAL, /* also ROTR */
181     OPC_ROTR     = OPC_SRL | (1 << 21),
182     OPC_SRA      = 0x03 | OPC_SPECIAL,
183     OPC_SLLV     = 0x04 | OPC_SPECIAL,
184     OPC_SRLV     = 0x06 | OPC_SPECIAL, /* also ROTRV */
185     OPC_ROTRV    = OPC_SRLV | (1 << 6),
186     OPC_SRAV     = 0x07 | OPC_SPECIAL,
187     OPC_DSLLV    = 0x14 | OPC_SPECIAL,
188     OPC_DSRLV    = 0x16 | OPC_SPECIAL, /* also DROTRV */
189     OPC_DROTRV   = OPC_DSRLV | (1 << 6),
190     OPC_DSRAV    = 0x17 | OPC_SPECIAL,
191     OPC_DSLL     = 0x38 | OPC_SPECIAL,
192     OPC_DSRL     = 0x3A | OPC_SPECIAL, /* also DROTR */
193     OPC_DROTR    = OPC_DSRL | (1 << 21),
194     OPC_DSRA     = 0x3B | OPC_SPECIAL,
195     OPC_DSLL32   = 0x3C | OPC_SPECIAL,
196     OPC_DSRL32   = 0x3E | OPC_SPECIAL, /* also DROTR32 */
197     OPC_DROTR32  = OPC_DSRL32 | (1 << 21),
198     OPC_DSRA32   = 0x3F | OPC_SPECIAL,
199     /* Multiplication / division */
200     OPC_MULT     = 0x18 | OPC_SPECIAL,
201     OPC_MULTU    = 0x19 | OPC_SPECIAL,
202     OPC_DIV      = 0x1A | OPC_SPECIAL,
203     OPC_DIVU     = 0x1B | OPC_SPECIAL,
204     OPC_DMULT    = 0x1C | OPC_SPECIAL,
205     OPC_DMULTU   = 0x1D | OPC_SPECIAL,
206     OPC_DDIV     = 0x1E | OPC_SPECIAL,
207     OPC_DDIVU    = 0x1F | OPC_SPECIAL,
208
209     /* 2 registers arithmetic / logic */
210     OPC_ADD      = 0x20 | OPC_SPECIAL,
211     OPC_ADDU     = 0x21 | OPC_SPECIAL,
212     OPC_SUB      = 0x22 | OPC_SPECIAL,
213     OPC_SUBU     = 0x23 | OPC_SPECIAL,
214     OPC_AND      = 0x24 | OPC_SPECIAL,
215     OPC_OR       = 0x25 | OPC_SPECIAL,
216     OPC_XOR      = 0x26 | OPC_SPECIAL,
217     OPC_NOR      = 0x27 | OPC_SPECIAL,
218     OPC_SLT      = 0x2A | OPC_SPECIAL,
219     OPC_SLTU     = 0x2B | OPC_SPECIAL,
220     OPC_DADD     = 0x2C | OPC_SPECIAL,
221     OPC_DADDU    = 0x2D | OPC_SPECIAL,
222     OPC_DSUB     = 0x2E | OPC_SPECIAL,
223     OPC_DSUBU    = 0x2F | OPC_SPECIAL,
224     /* Jumps */
225     OPC_JR       = 0x08 | OPC_SPECIAL, /* Also JR.HB */
226     OPC_JALR     = 0x09 | OPC_SPECIAL, /* Also JALR.HB */
227     /* Traps */
228     OPC_TGE      = 0x30 | OPC_SPECIAL,
229     OPC_TGEU     = 0x31 | OPC_SPECIAL,
230     OPC_TLT      = 0x32 | OPC_SPECIAL,
231     OPC_TLTU     = 0x33 | OPC_SPECIAL,
232     OPC_TEQ      = 0x34 | OPC_SPECIAL,
233     OPC_TNE      = 0x36 | OPC_SPECIAL,
234     /* HI / LO registers load & stores */
235     OPC_MFHI     = 0x10 | OPC_SPECIAL,
236     OPC_MTHI     = 0x11 | OPC_SPECIAL,
237     OPC_MFLO     = 0x12 | OPC_SPECIAL,
238     OPC_MTLO     = 0x13 | OPC_SPECIAL,
239     /* Conditional moves */
240     OPC_MOVZ     = 0x0A | OPC_SPECIAL,
241     OPC_MOVN     = 0x0B | OPC_SPECIAL,
242
243     OPC_SELEQZ   = 0x35 | OPC_SPECIAL,
244     OPC_SELNEZ   = 0x37 | OPC_SPECIAL,
245
246     OPC_MOVCI    = 0x01 | OPC_SPECIAL,
247
248     /* Special */
249     OPC_PMON     = 0x05 | OPC_SPECIAL, /* unofficial */
250     OPC_SYSCALL  = 0x0C | OPC_SPECIAL,
251     OPC_BREAK    = 0x0D | OPC_SPECIAL,
252     OPC_SPIM     = 0x0E | OPC_SPECIAL, /* unofficial */
253     OPC_SYNC     = 0x0F | OPC_SPECIAL,
254
255     OPC_SPECIAL28_RESERVED = 0x28 | OPC_SPECIAL,
256     OPC_SPECIAL29_RESERVED = 0x29 | OPC_SPECIAL,
257     OPC_SPECIAL39_RESERVED = 0x39 | OPC_SPECIAL,
258     OPC_SPECIAL3D_RESERVED = 0x3D | OPC_SPECIAL,
259 };
260
261 /* R6 Multiply and Divide instructions have the same Opcode
262    and function field as legacy OPC_MULT[U]/OPC_DIV[U] */
263 #define MASK_R6_MULDIV(op)   (MASK_SPECIAL(op) | (op & (0x7ff)))
264
265 enum {
266     R6_OPC_MUL   = OPC_MULT  | (2 << 6),
267     R6_OPC_MUH   = OPC_MULT  | (3 << 6),
268     R6_OPC_MULU  = OPC_MULTU | (2 << 6),
269     R6_OPC_MUHU  = OPC_MULTU | (3 << 6),
270     R6_OPC_DIV   = OPC_DIV   | (2 << 6),
271     R6_OPC_MOD   = OPC_DIV   | (3 << 6),
272     R6_OPC_DIVU  = OPC_DIVU  | (2 << 6),
273     R6_OPC_MODU  = OPC_DIVU  | (3 << 6),
274
275     R6_OPC_DMUL   = OPC_DMULT  | (2 << 6),
276     R6_OPC_DMUH   = OPC_DMULT  | (3 << 6),
277     R6_OPC_DMULU  = OPC_DMULTU | (2 << 6),
278     R6_OPC_DMUHU  = OPC_DMULTU | (3 << 6),
279     R6_OPC_DDIV   = OPC_DDIV   | (2 << 6),
280     R6_OPC_DMOD   = OPC_DDIV   | (3 << 6),
281     R6_OPC_DDIVU  = OPC_DDIVU  | (2 << 6),
282     R6_OPC_DMODU  = OPC_DDIVU  | (3 << 6),
283
284     R6_OPC_CLZ      = 0x10 | OPC_SPECIAL,
285     R6_OPC_CLO      = 0x11 | OPC_SPECIAL,
286     R6_OPC_DCLZ     = 0x12 | OPC_SPECIAL,
287     R6_OPC_DCLO     = 0x13 | OPC_SPECIAL,
288     R6_OPC_SDBBP    = 0x0e | OPC_SPECIAL,
289
290     OPC_LSA  = 0x05 | OPC_SPECIAL,
291     OPC_DLSA = 0x15 | OPC_SPECIAL,
292 };
293
294 /* Multiplication variants of the vr54xx. */
295 #define MASK_MUL_VR54XX(op)   MASK_SPECIAL(op) | (op & (0x1F << 6))
296
297 enum {
298     OPC_VR54XX_MULS    = (0x03 << 6) | OPC_MULT,
299     OPC_VR54XX_MULSU   = (0x03 << 6) | OPC_MULTU,
300     OPC_VR54XX_MACC    = (0x05 << 6) | OPC_MULT,
301     OPC_VR54XX_MACCU   = (0x05 << 6) | OPC_MULTU,
302     OPC_VR54XX_MSAC    = (0x07 << 6) | OPC_MULT,
303     OPC_VR54XX_MSACU   = (0x07 << 6) | OPC_MULTU,
304     OPC_VR54XX_MULHI   = (0x09 << 6) | OPC_MULT,
305     OPC_VR54XX_MULHIU  = (0x09 << 6) | OPC_MULTU,
306     OPC_VR54XX_MULSHI  = (0x0B << 6) | OPC_MULT,
307     OPC_VR54XX_MULSHIU = (0x0B << 6) | OPC_MULTU,
308     OPC_VR54XX_MACCHI  = (0x0D << 6) | OPC_MULT,
309     OPC_VR54XX_MACCHIU = (0x0D << 6) | OPC_MULTU,
310     OPC_VR54XX_MSACHI  = (0x0F << 6) | OPC_MULT,
311     OPC_VR54XX_MSACHIU = (0x0F << 6) | OPC_MULTU,
312 };
313
314 /* REGIMM (rt field) opcodes */
315 #define MASK_REGIMM(op)    MASK_OP_MAJOR(op) | (op & (0x1F << 16))
316
317 enum {
318     OPC_BLTZ     = (0x00 << 16) | OPC_REGIMM,
319     OPC_BLTZL    = (0x02 << 16) | OPC_REGIMM,
320     OPC_BGEZ     = (0x01 << 16) | OPC_REGIMM,
321     OPC_BGEZL    = (0x03 << 16) | OPC_REGIMM,
322     OPC_BLTZAL   = (0x10 << 16) | OPC_REGIMM,
323     OPC_BLTZALL  = (0x12 << 16) | OPC_REGIMM,
324     OPC_BGEZAL   = (0x11 << 16) | OPC_REGIMM,
325     OPC_BGEZALL  = (0x13 << 16) | OPC_REGIMM,
326     OPC_TGEI     = (0x08 << 16) | OPC_REGIMM,
327     OPC_TGEIU    = (0x09 << 16) | OPC_REGIMM,
328     OPC_TLTI     = (0x0A << 16) | OPC_REGIMM,
329     OPC_TLTIU    = (0x0B << 16) | OPC_REGIMM,
330     OPC_TEQI     = (0x0C << 16) | OPC_REGIMM,
331     OPC_TNEI     = (0x0E << 16) | OPC_REGIMM,
332     OPC_SIGRIE   = (0x17 << 16) | OPC_REGIMM,
333     OPC_SYNCI    = (0x1F << 16) | OPC_REGIMM,
334
335     OPC_DAHI     = (0x06 << 16) | OPC_REGIMM,
336     OPC_DATI     = (0x1e << 16) | OPC_REGIMM,
337 };
338
339 /* Special2 opcodes */
340 #define MASK_SPECIAL2(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
341
342 enum {
343     /* Multiply & xxx operations */
344     OPC_MADD     = 0x00 | OPC_SPECIAL2,
345     OPC_MADDU    = 0x01 | OPC_SPECIAL2,
346     OPC_MUL      = 0x02 | OPC_SPECIAL2,
347     OPC_MSUB     = 0x04 | OPC_SPECIAL2,
348     OPC_MSUBU    = 0x05 | OPC_SPECIAL2,
349     /* Loongson 2F */
350     OPC_MULT_G_2F   = 0x10 | OPC_SPECIAL2,
351     OPC_DMULT_G_2F  = 0x11 | OPC_SPECIAL2,
352     OPC_MULTU_G_2F  = 0x12 | OPC_SPECIAL2,
353     OPC_DMULTU_G_2F = 0x13 | OPC_SPECIAL2,
354     OPC_DIV_G_2F    = 0x14 | OPC_SPECIAL2,
355     OPC_DDIV_G_2F   = 0x15 | OPC_SPECIAL2,
356     OPC_DIVU_G_2F   = 0x16 | OPC_SPECIAL2,
357     OPC_DDIVU_G_2F  = 0x17 | OPC_SPECIAL2,
358     OPC_MOD_G_2F    = 0x1c | OPC_SPECIAL2,
359     OPC_DMOD_G_2F   = 0x1d | OPC_SPECIAL2,
360     OPC_MODU_G_2F   = 0x1e | OPC_SPECIAL2,
361     OPC_DMODU_G_2F  = 0x1f | OPC_SPECIAL2,
362     /* Misc */
363     OPC_CLZ      = 0x20 | OPC_SPECIAL2,
364     OPC_CLO      = 0x21 | OPC_SPECIAL2,
365     OPC_DCLZ     = 0x24 | OPC_SPECIAL2,
366     OPC_DCLO     = 0x25 | OPC_SPECIAL2,
367     /* Special */
368     OPC_SDBBP    = 0x3F | OPC_SPECIAL2,
369 };
370
371 /* Special3 opcodes */
372 #define MASK_SPECIAL3(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
373
374 enum {
375     OPC_EXT      = 0x00 | OPC_SPECIAL3,
376     OPC_DEXTM    = 0x01 | OPC_SPECIAL3,
377     OPC_DEXTU    = 0x02 | OPC_SPECIAL3,
378     OPC_DEXT     = 0x03 | OPC_SPECIAL3,
379     OPC_INS      = 0x04 | OPC_SPECIAL3,
380     OPC_DINSM    = 0x05 | OPC_SPECIAL3,
381     OPC_DINSU    = 0x06 | OPC_SPECIAL3,
382     OPC_DINS     = 0x07 | OPC_SPECIAL3,
383     OPC_FORK     = 0x08 | OPC_SPECIAL3,
384     OPC_YIELD    = 0x09 | OPC_SPECIAL3,
385     OPC_BSHFL    = 0x20 | OPC_SPECIAL3,
386     OPC_DBSHFL   = 0x24 | OPC_SPECIAL3,
387     OPC_RDHWR    = 0x3B | OPC_SPECIAL3,
388
389     /* Loongson 2E */
390     OPC_MULT_G_2E   = 0x18 | OPC_SPECIAL3,
391     OPC_MULTU_G_2E  = 0x19 | OPC_SPECIAL3,
392     OPC_DIV_G_2E    = 0x1A | OPC_SPECIAL3,
393     OPC_DIVU_G_2E   = 0x1B | OPC_SPECIAL3,
394     OPC_DMULT_G_2E  = 0x1C | OPC_SPECIAL3,
395     OPC_DMULTU_G_2E = 0x1D | OPC_SPECIAL3,
396     OPC_DDIV_G_2E   = 0x1E | OPC_SPECIAL3,
397     OPC_DDIVU_G_2E  = 0x1F | OPC_SPECIAL3,
398     OPC_MOD_G_2E    = 0x22 | OPC_SPECIAL3,
399     OPC_MODU_G_2E   = 0x23 | OPC_SPECIAL3,
400     OPC_DMOD_G_2E   = 0x26 | OPC_SPECIAL3,
401     OPC_DMODU_G_2E  = 0x27 | OPC_SPECIAL3,
402
403     /* MIPS DSP Load */
404     OPC_LX_DSP         = 0x0A | OPC_SPECIAL3,
405     /* MIPS DSP Arithmetic */
406     OPC_ADDU_QB_DSP    = 0x10 | OPC_SPECIAL3,
407     OPC_ADDU_OB_DSP    = 0x14 | OPC_SPECIAL3,
408     OPC_ABSQ_S_PH_DSP  = 0x12 | OPC_SPECIAL3,
409     OPC_ABSQ_S_QH_DSP  = 0x16 | OPC_SPECIAL3,
410     /* OPC_ADDUH_QB_DSP is same as OPC_MULT_G_2E.  */
411     /* OPC_ADDUH_QB_DSP   = 0x18 | OPC_SPECIAL3,  */
412     OPC_CMPU_EQ_QB_DSP = 0x11 | OPC_SPECIAL3,
413     OPC_CMPU_EQ_OB_DSP = 0x15 | OPC_SPECIAL3,
414     /* MIPS DSP GPR-Based Shift Sub-class */
415     OPC_SHLL_QB_DSP    = 0x13 | OPC_SPECIAL3,
416     OPC_SHLL_OB_DSP    = 0x17 | OPC_SPECIAL3,
417     /* MIPS DSP Multiply Sub-class insns */
418     /* OPC_MUL_PH_DSP is same as OPC_ADDUH_QB_DSP.  */
419     /* OPC_MUL_PH_DSP     = 0x18 | OPC_SPECIAL3,  */
420     OPC_DPA_W_PH_DSP   = 0x30 | OPC_SPECIAL3,
421     OPC_DPAQ_W_QH_DSP  = 0x34 | OPC_SPECIAL3,
422     /* DSP Bit/Manipulation Sub-class */
423     OPC_INSV_DSP       = 0x0C | OPC_SPECIAL3,
424     OPC_DINSV_DSP      = 0x0D | OPC_SPECIAL3,
425     /* MIPS DSP Append Sub-class */
426     OPC_APPEND_DSP     = 0x31 | OPC_SPECIAL3,
427     OPC_DAPPEND_DSP    = 0x35 | OPC_SPECIAL3,
428     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
429     OPC_EXTR_W_DSP     = 0x38 | OPC_SPECIAL3,
430     OPC_DEXTR_W_DSP    = 0x3C | OPC_SPECIAL3,
431
432     /* EVA */
433     OPC_LWLE           = 0x19 | OPC_SPECIAL3,
434     OPC_LWRE           = 0x1A | OPC_SPECIAL3,
435     OPC_CACHEE         = 0x1B | OPC_SPECIAL3,
436     OPC_SBE            = 0x1C | OPC_SPECIAL3,
437     OPC_SHE            = 0x1D | OPC_SPECIAL3,
438     OPC_SCE            = 0x1E | OPC_SPECIAL3,
439     OPC_SWE            = 0x1F | OPC_SPECIAL3,
440     OPC_SWLE           = 0x21 | OPC_SPECIAL3,
441     OPC_SWRE           = 0x22 | OPC_SPECIAL3,
442     OPC_PREFE          = 0x23 | OPC_SPECIAL3,
443     OPC_LBUE           = 0x28 | OPC_SPECIAL3,
444     OPC_LHUE           = 0x29 | OPC_SPECIAL3,
445     OPC_LBE            = 0x2C | OPC_SPECIAL3,
446     OPC_LHE            = 0x2D | OPC_SPECIAL3,
447     OPC_LLE            = 0x2E | OPC_SPECIAL3,
448     OPC_LWE            = 0x2F | OPC_SPECIAL3,
449
450     /* R6 */
451     R6_OPC_PREF        = 0x35 | OPC_SPECIAL3,
452     R6_OPC_CACHE       = 0x25 | OPC_SPECIAL3,
453     R6_OPC_LL          = 0x36 | OPC_SPECIAL3,
454     R6_OPC_SC          = 0x26 | OPC_SPECIAL3,
455     R6_OPC_LLD         = 0x37 | OPC_SPECIAL3,
456     R6_OPC_SCD         = 0x27 | OPC_SPECIAL3,
457 };
458
459 /* BSHFL opcodes */
460 #define MASK_BSHFL(op)     MASK_SPECIAL3(op) | (op & (0x1F << 6))
461
462 enum {
463     OPC_WSBH      = (0x02 << 6) | OPC_BSHFL,
464     OPC_SEB       = (0x10 << 6) | OPC_BSHFL,
465     OPC_SEH       = (0x18 << 6) | OPC_BSHFL,
466     OPC_ALIGN     = (0x08 << 6) | OPC_BSHFL, /* 010.bp (010.00 to 010.11) */
467     OPC_ALIGN_1   = (0x09 << 6) | OPC_BSHFL,
468     OPC_ALIGN_2   = (0x0A << 6) | OPC_BSHFL,
469     OPC_ALIGN_3   = (0x0B << 6) | OPC_BSHFL,
470     OPC_BITSWAP   = (0x00 << 6) | OPC_BSHFL  /* 00000 */
471 };
472
473 /* DBSHFL opcodes */
474 #define MASK_DBSHFL(op)    MASK_SPECIAL3(op) | (op & (0x1F << 6))
475
476 enum {
477     OPC_DSBH       = (0x02 << 6) | OPC_DBSHFL,
478     OPC_DSHD       = (0x05 << 6) | OPC_DBSHFL,
479     OPC_DALIGN     = (0x08 << 6) | OPC_DBSHFL, /* 01.bp (01.000 to 01.111) */
480     OPC_DALIGN_1   = (0x09 << 6) | OPC_DBSHFL,
481     OPC_DALIGN_2   = (0x0A << 6) | OPC_DBSHFL,
482     OPC_DALIGN_3   = (0x0B << 6) | OPC_DBSHFL,
483     OPC_DALIGN_4   = (0x0C << 6) | OPC_DBSHFL,
484     OPC_DALIGN_5   = (0x0D << 6) | OPC_DBSHFL,
485     OPC_DALIGN_6   = (0x0E << 6) | OPC_DBSHFL,
486     OPC_DALIGN_7   = (0x0F << 6) | OPC_DBSHFL,
487     OPC_DBITSWAP   = (0x00 << 6) | OPC_DBSHFL, /* 00000 */
488 };
489
490 /* MIPS DSP REGIMM opcodes */
491 enum {
492     OPC_BPOSGE32 = (0x1C << 16) | OPC_REGIMM,
493     OPC_BPOSGE64 = (0x1D << 16) | OPC_REGIMM,
494 };
495
496 #define MASK_LX(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
497 /* MIPS DSP Load */
498 enum {
499     OPC_LBUX = (0x06 << 6) | OPC_LX_DSP,
500     OPC_LHX  = (0x04 << 6) | OPC_LX_DSP,
501     OPC_LWX  = (0x00 << 6) | OPC_LX_DSP,
502     OPC_LDX = (0x08 << 6) | OPC_LX_DSP,
503 };
504
505 #define MASK_ADDU_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
506 enum {
507     /* MIPS DSP Arithmetic Sub-class */
508     OPC_ADDQ_PH        = (0x0A << 6) | OPC_ADDU_QB_DSP,
509     OPC_ADDQ_S_PH      = (0x0E << 6) | OPC_ADDU_QB_DSP,
510     OPC_ADDQ_S_W       = (0x16 << 6) | OPC_ADDU_QB_DSP,
511     OPC_ADDU_QB        = (0x00 << 6) | OPC_ADDU_QB_DSP,
512     OPC_ADDU_S_QB      = (0x04 << 6) | OPC_ADDU_QB_DSP,
513     OPC_ADDU_PH        = (0x08 << 6) | OPC_ADDU_QB_DSP,
514     OPC_ADDU_S_PH      = (0x0C << 6) | OPC_ADDU_QB_DSP,
515     OPC_SUBQ_PH        = (0x0B << 6) | OPC_ADDU_QB_DSP,
516     OPC_SUBQ_S_PH      = (0x0F << 6) | OPC_ADDU_QB_DSP,
517     OPC_SUBQ_S_W       = (0x17 << 6) | OPC_ADDU_QB_DSP,
518     OPC_SUBU_QB        = (0x01 << 6) | OPC_ADDU_QB_DSP,
519     OPC_SUBU_S_QB      = (0x05 << 6) | OPC_ADDU_QB_DSP,
520     OPC_SUBU_PH        = (0x09 << 6) | OPC_ADDU_QB_DSP,
521     OPC_SUBU_S_PH      = (0x0D << 6) | OPC_ADDU_QB_DSP,
522     OPC_ADDSC          = (0x10 << 6) | OPC_ADDU_QB_DSP,
523     OPC_ADDWC          = (0x11 << 6) | OPC_ADDU_QB_DSP,
524     OPC_MODSUB         = (0x12 << 6) | OPC_ADDU_QB_DSP,
525     OPC_RADDU_W_QB     = (0x14 << 6) | OPC_ADDU_QB_DSP,
526     /* MIPS DSP Multiply Sub-class insns */
527     OPC_MULEU_S_PH_QBL = (0x06 << 6) | OPC_ADDU_QB_DSP,
528     OPC_MULEU_S_PH_QBR = (0x07 << 6) | OPC_ADDU_QB_DSP,
529     OPC_MULQ_RS_PH     = (0x1F << 6) | OPC_ADDU_QB_DSP,
530     OPC_MULEQ_S_W_PHL  = (0x1C << 6) | OPC_ADDU_QB_DSP,
531     OPC_MULEQ_S_W_PHR  = (0x1D << 6) | OPC_ADDU_QB_DSP,
532     OPC_MULQ_S_PH      = (0x1E << 6) | OPC_ADDU_QB_DSP,
533 };
534
535 #define OPC_ADDUH_QB_DSP OPC_MULT_G_2E
536 #define MASK_ADDUH_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
537 enum {
538     /* MIPS DSP Arithmetic Sub-class */
539     OPC_ADDUH_QB   = (0x00 << 6) | OPC_ADDUH_QB_DSP,
540     OPC_ADDUH_R_QB = (0x02 << 6) | OPC_ADDUH_QB_DSP,
541     OPC_ADDQH_PH   = (0x08 << 6) | OPC_ADDUH_QB_DSP,
542     OPC_ADDQH_R_PH = (0x0A << 6) | OPC_ADDUH_QB_DSP,
543     OPC_ADDQH_W    = (0x10 << 6) | OPC_ADDUH_QB_DSP,
544     OPC_ADDQH_R_W  = (0x12 << 6) | OPC_ADDUH_QB_DSP,
545     OPC_SUBUH_QB   = (0x01 << 6) | OPC_ADDUH_QB_DSP,
546     OPC_SUBUH_R_QB = (0x03 << 6) | OPC_ADDUH_QB_DSP,
547     OPC_SUBQH_PH   = (0x09 << 6) | OPC_ADDUH_QB_DSP,
548     OPC_SUBQH_R_PH = (0x0B << 6) | OPC_ADDUH_QB_DSP,
549     OPC_SUBQH_W    = (0x11 << 6) | OPC_ADDUH_QB_DSP,
550     OPC_SUBQH_R_W  = (0x13 << 6) | OPC_ADDUH_QB_DSP,
551     /* MIPS DSP Multiply Sub-class insns */
552     OPC_MUL_PH     = (0x0C << 6) | OPC_ADDUH_QB_DSP,
553     OPC_MUL_S_PH   = (0x0E << 6) | OPC_ADDUH_QB_DSP,
554     OPC_MULQ_S_W   = (0x16 << 6) | OPC_ADDUH_QB_DSP,
555     OPC_MULQ_RS_W  = (0x17 << 6) | OPC_ADDUH_QB_DSP,
556 };
557
558 #define MASK_ABSQ_S_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
559 enum {
560     /* MIPS DSP Arithmetic Sub-class */
561     OPC_ABSQ_S_QB       = (0x01 << 6) | OPC_ABSQ_S_PH_DSP,
562     OPC_ABSQ_S_PH       = (0x09 << 6) | OPC_ABSQ_S_PH_DSP,
563     OPC_ABSQ_S_W        = (0x11 << 6) | OPC_ABSQ_S_PH_DSP,
564     OPC_PRECEQ_W_PHL    = (0x0C << 6) | OPC_ABSQ_S_PH_DSP,
565     OPC_PRECEQ_W_PHR    = (0x0D << 6) | OPC_ABSQ_S_PH_DSP,
566     OPC_PRECEQU_PH_QBL  = (0x04 << 6) | OPC_ABSQ_S_PH_DSP,
567     OPC_PRECEQU_PH_QBR  = (0x05 << 6) | OPC_ABSQ_S_PH_DSP,
568     OPC_PRECEQU_PH_QBLA = (0x06 << 6) | OPC_ABSQ_S_PH_DSP,
569     OPC_PRECEQU_PH_QBRA = (0x07 << 6) | OPC_ABSQ_S_PH_DSP,
570     OPC_PRECEU_PH_QBL   = (0x1C << 6) | OPC_ABSQ_S_PH_DSP,
571     OPC_PRECEU_PH_QBR   = (0x1D << 6) | OPC_ABSQ_S_PH_DSP,
572     OPC_PRECEU_PH_QBLA  = (0x1E << 6) | OPC_ABSQ_S_PH_DSP,
573     OPC_PRECEU_PH_QBRA  = (0x1F << 6) | OPC_ABSQ_S_PH_DSP,
574     /* DSP Bit/Manipulation Sub-class */
575     OPC_BITREV          = (0x1B << 6) | OPC_ABSQ_S_PH_DSP,
576     OPC_REPL_QB         = (0x02 << 6) | OPC_ABSQ_S_PH_DSP,
577     OPC_REPLV_QB        = (0x03 << 6) | OPC_ABSQ_S_PH_DSP,
578     OPC_REPL_PH         = (0x0A << 6) | OPC_ABSQ_S_PH_DSP,
579     OPC_REPLV_PH        = (0x0B << 6) | OPC_ABSQ_S_PH_DSP,
580 };
581
582 #define MASK_CMPU_EQ_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
583 enum {
584     /* MIPS DSP Arithmetic Sub-class */
585     OPC_PRECR_QB_PH      = (0x0D << 6) | OPC_CMPU_EQ_QB_DSP,
586     OPC_PRECRQ_QB_PH     = (0x0C << 6) | OPC_CMPU_EQ_QB_DSP,
587     OPC_PRECR_SRA_PH_W   = (0x1E << 6) | OPC_CMPU_EQ_QB_DSP,
588     OPC_PRECR_SRA_R_PH_W = (0x1F << 6) | OPC_CMPU_EQ_QB_DSP,
589     OPC_PRECRQ_PH_W      = (0x14 << 6) | OPC_CMPU_EQ_QB_DSP,
590     OPC_PRECRQ_RS_PH_W   = (0x15 << 6) | OPC_CMPU_EQ_QB_DSP,
591     OPC_PRECRQU_S_QB_PH  = (0x0F << 6) | OPC_CMPU_EQ_QB_DSP,
592     /* DSP Compare-Pick Sub-class */
593     OPC_CMPU_EQ_QB       = (0x00 << 6) | OPC_CMPU_EQ_QB_DSP,
594     OPC_CMPU_LT_QB       = (0x01 << 6) | OPC_CMPU_EQ_QB_DSP,
595     OPC_CMPU_LE_QB       = (0x02 << 6) | OPC_CMPU_EQ_QB_DSP,
596     OPC_CMPGU_EQ_QB      = (0x04 << 6) | OPC_CMPU_EQ_QB_DSP,
597     OPC_CMPGU_LT_QB      = (0x05 << 6) | OPC_CMPU_EQ_QB_DSP,
598     OPC_CMPGU_LE_QB      = (0x06 << 6) | OPC_CMPU_EQ_QB_DSP,
599     OPC_CMPGDU_EQ_QB     = (0x18 << 6) | OPC_CMPU_EQ_QB_DSP,
600     OPC_CMPGDU_LT_QB     = (0x19 << 6) | OPC_CMPU_EQ_QB_DSP,
601     OPC_CMPGDU_LE_QB     = (0x1A << 6) | OPC_CMPU_EQ_QB_DSP,
602     OPC_CMP_EQ_PH        = (0x08 << 6) | OPC_CMPU_EQ_QB_DSP,
603     OPC_CMP_LT_PH        = (0x09 << 6) | OPC_CMPU_EQ_QB_DSP,
604     OPC_CMP_LE_PH        = (0x0A << 6) | OPC_CMPU_EQ_QB_DSP,
605     OPC_PICK_QB          = (0x03 << 6) | OPC_CMPU_EQ_QB_DSP,
606     OPC_PICK_PH          = (0x0B << 6) | OPC_CMPU_EQ_QB_DSP,
607     OPC_PACKRL_PH        = (0x0E << 6) | OPC_CMPU_EQ_QB_DSP,
608 };
609
610 #define MASK_SHLL_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
611 enum {
612     /* MIPS DSP GPR-Based Shift Sub-class */
613     OPC_SHLL_QB    = (0x00 << 6) | OPC_SHLL_QB_DSP,
614     OPC_SHLLV_QB   = (0x02 << 6) | OPC_SHLL_QB_DSP,
615     OPC_SHLL_PH    = (0x08 << 6) | OPC_SHLL_QB_DSP,
616     OPC_SHLLV_PH   = (0x0A << 6) | OPC_SHLL_QB_DSP,
617     OPC_SHLL_S_PH  = (0x0C << 6) | OPC_SHLL_QB_DSP,
618     OPC_SHLLV_S_PH = (0x0E << 6) | OPC_SHLL_QB_DSP,
619     OPC_SHLL_S_W   = (0x14 << 6) | OPC_SHLL_QB_DSP,
620     OPC_SHLLV_S_W  = (0x16 << 6) | OPC_SHLL_QB_DSP,
621     OPC_SHRL_QB    = (0x01 << 6) | OPC_SHLL_QB_DSP,
622     OPC_SHRLV_QB   = (0x03 << 6) | OPC_SHLL_QB_DSP,
623     OPC_SHRL_PH    = (0x19 << 6) | OPC_SHLL_QB_DSP,
624     OPC_SHRLV_PH   = (0x1B << 6) | OPC_SHLL_QB_DSP,
625     OPC_SHRA_QB    = (0x04 << 6) | OPC_SHLL_QB_DSP,
626     OPC_SHRA_R_QB  = (0x05 << 6) | OPC_SHLL_QB_DSP,
627     OPC_SHRAV_QB   = (0x06 << 6) | OPC_SHLL_QB_DSP,
628     OPC_SHRAV_R_QB = (0x07 << 6) | OPC_SHLL_QB_DSP,
629     OPC_SHRA_PH    = (0x09 << 6) | OPC_SHLL_QB_DSP,
630     OPC_SHRAV_PH   = (0x0B << 6) | OPC_SHLL_QB_DSP,
631     OPC_SHRA_R_PH  = (0x0D << 6) | OPC_SHLL_QB_DSP,
632     OPC_SHRAV_R_PH = (0x0F << 6) | OPC_SHLL_QB_DSP,
633     OPC_SHRA_R_W   = (0x15 << 6) | OPC_SHLL_QB_DSP,
634     OPC_SHRAV_R_W  = (0x17 << 6) | OPC_SHLL_QB_DSP,
635 };
636
637 #define MASK_DPA_W_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
638 enum {
639     /* MIPS DSP Multiply Sub-class insns */
640     OPC_DPAU_H_QBL    = (0x03 << 6) | OPC_DPA_W_PH_DSP,
641     OPC_DPAU_H_QBR    = (0x07 << 6) | OPC_DPA_W_PH_DSP,
642     OPC_DPSU_H_QBL    = (0x0B << 6) | OPC_DPA_W_PH_DSP,
643     OPC_DPSU_H_QBR    = (0x0F << 6) | OPC_DPA_W_PH_DSP,
644     OPC_DPA_W_PH      = (0x00 << 6) | OPC_DPA_W_PH_DSP,
645     OPC_DPAX_W_PH     = (0x08 << 6) | OPC_DPA_W_PH_DSP,
646     OPC_DPAQ_S_W_PH   = (0x04 << 6) | OPC_DPA_W_PH_DSP,
647     OPC_DPAQX_S_W_PH  = (0x18 << 6) | OPC_DPA_W_PH_DSP,
648     OPC_DPAQX_SA_W_PH = (0x1A << 6) | OPC_DPA_W_PH_DSP,
649     OPC_DPS_W_PH      = (0x01 << 6) | OPC_DPA_W_PH_DSP,
650     OPC_DPSX_W_PH     = (0x09 << 6) | OPC_DPA_W_PH_DSP,
651     OPC_DPSQ_S_W_PH   = (0x05 << 6) | OPC_DPA_W_PH_DSP,
652     OPC_DPSQX_S_W_PH  = (0x19 << 6) | OPC_DPA_W_PH_DSP,
653     OPC_DPSQX_SA_W_PH = (0x1B << 6) | OPC_DPA_W_PH_DSP,
654     OPC_MULSAQ_S_W_PH = (0x06 << 6) | OPC_DPA_W_PH_DSP,
655     OPC_DPAQ_SA_L_W   = (0x0C << 6) | OPC_DPA_W_PH_DSP,
656     OPC_DPSQ_SA_L_W   = (0x0D << 6) | OPC_DPA_W_PH_DSP,
657     OPC_MAQ_S_W_PHL   = (0x14 << 6) | OPC_DPA_W_PH_DSP,
658     OPC_MAQ_S_W_PHR   = (0x16 << 6) | OPC_DPA_W_PH_DSP,
659     OPC_MAQ_SA_W_PHL  = (0x10 << 6) | OPC_DPA_W_PH_DSP,
660     OPC_MAQ_SA_W_PHR  = (0x12 << 6) | OPC_DPA_W_PH_DSP,
661     OPC_MULSA_W_PH    = (0x02 << 6) | OPC_DPA_W_PH_DSP,
662 };
663
664 #define MASK_INSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
665 enum {
666     /* DSP Bit/Manipulation Sub-class */
667     OPC_INSV = (0x00 << 6) | OPC_INSV_DSP,
668 };
669
670 #define MASK_APPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
671 enum {
672     /* MIPS DSP Append Sub-class */
673     OPC_APPEND  = (0x00 << 6) | OPC_APPEND_DSP,
674     OPC_PREPEND = (0x01 << 6) | OPC_APPEND_DSP,
675     OPC_BALIGN  = (0x10 << 6) | OPC_APPEND_DSP,
676 };
677
678 #define MASK_EXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
679 enum {
680     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
681     OPC_EXTR_W     = (0x00 << 6) | OPC_EXTR_W_DSP,
682     OPC_EXTR_R_W   = (0x04 << 6) | OPC_EXTR_W_DSP,
683     OPC_EXTR_RS_W  = (0x06 << 6) | OPC_EXTR_W_DSP,
684     OPC_EXTR_S_H   = (0x0E << 6) | OPC_EXTR_W_DSP,
685     OPC_EXTRV_S_H  = (0x0F << 6) | OPC_EXTR_W_DSP,
686     OPC_EXTRV_W    = (0x01 << 6) | OPC_EXTR_W_DSP,
687     OPC_EXTRV_R_W  = (0x05 << 6) | OPC_EXTR_W_DSP,
688     OPC_EXTRV_RS_W = (0x07 << 6) | OPC_EXTR_W_DSP,
689     OPC_EXTP       = (0x02 << 6) | OPC_EXTR_W_DSP,
690     OPC_EXTPV      = (0x03 << 6) | OPC_EXTR_W_DSP,
691     OPC_EXTPDP     = (0x0A << 6) | OPC_EXTR_W_DSP,
692     OPC_EXTPDPV    = (0x0B << 6) | OPC_EXTR_W_DSP,
693     OPC_SHILO      = (0x1A << 6) | OPC_EXTR_W_DSP,
694     OPC_SHILOV     = (0x1B << 6) | OPC_EXTR_W_DSP,
695     OPC_MTHLIP     = (0x1F << 6) | OPC_EXTR_W_DSP,
696     OPC_WRDSP      = (0x13 << 6) | OPC_EXTR_W_DSP,
697     OPC_RDDSP      = (0x12 << 6) | OPC_EXTR_W_DSP,
698 };
699
700 #define MASK_ABSQ_S_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
701 enum {
702     /* MIPS DSP Arithmetic Sub-class */
703     OPC_PRECEQ_L_PWL    = (0x14 << 6) | OPC_ABSQ_S_QH_DSP,
704     OPC_PRECEQ_L_PWR    = (0x15 << 6) | OPC_ABSQ_S_QH_DSP,
705     OPC_PRECEQ_PW_QHL   = (0x0C << 6) | OPC_ABSQ_S_QH_DSP,
706     OPC_PRECEQ_PW_QHR   = (0x0D << 6) | OPC_ABSQ_S_QH_DSP,
707     OPC_PRECEQ_PW_QHLA  = (0x0E << 6) | OPC_ABSQ_S_QH_DSP,
708     OPC_PRECEQ_PW_QHRA  = (0x0F << 6) | OPC_ABSQ_S_QH_DSP,
709     OPC_PRECEQU_QH_OBL  = (0x04 << 6) | OPC_ABSQ_S_QH_DSP,
710     OPC_PRECEQU_QH_OBR  = (0x05 << 6) | OPC_ABSQ_S_QH_DSP,
711     OPC_PRECEQU_QH_OBLA = (0x06 << 6) | OPC_ABSQ_S_QH_DSP,
712     OPC_PRECEQU_QH_OBRA = (0x07 << 6) | OPC_ABSQ_S_QH_DSP,
713     OPC_PRECEU_QH_OBL   = (0x1C << 6) | OPC_ABSQ_S_QH_DSP,
714     OPC_PRECEU_QH_OBR   = (0x1D << 6) | OPC_ABSQ_S_QH_DSP,
715     OPC_PRECEU_QH_OBLA  = (0x1E << 6) | OPC_ABSQ_S_QH_DSP,
716     OPC_PRECEU_QH_OBRA  = (0x1F << 6) | OPC_ABSQ_S_QH_DSP,
717     OPC_ABSQ_S_OB       = (0x01 << 6) | OPC_ABSQ_S_QH_DSP,
718     OPC_ABSQ_S_PW       = (0x11 << 6) | OPC_ABSQ_S_QH_DSP,
719     OPC_ABSQ_S_QH       = (0x09 << 6) | OPC_ABSQ_S_QH_DSP,
720     /* DSP Bit/Manipulation Sub-class */
721     OPC_REPL_OB         = (0x02 << 6) | OPC_ABSQ_S_QH_DSP,
722     OPC_REPL_PW         = (0x12 << 6) | OPC_ABSQ_S_QH_DSP,
723     OPC_REPL_QH         = (0x0A << 6) | OPC_ABSQ_S_QH_DSP,
724     OPC_REPLV_OB        = (0x03 << 6) | OPC_ABSQ_S_QH_DSP,
725     OPC_REPLV_PW        = (0x13 << 6) | OPC_ABSQ_S_QH_DSP,
726     OPC_REPLV_QH        = (0x0B << 6) | OPC_ABSQ_S_QH_DSP,
727 };
728
729 #define MASK_ADDU_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
730 enum {
731     /* MIPS DSP Multiply Sub-class insns */
732     OPC_MULEQ_S_PW_QHL = (0x1C << 6) | OPC_ADDU_OB_DSP,
733     OPC_MULEQ_S_PW_QHR = (0x1D << 6) | OPC_ADDU_OB_DSP,
734     OPC_MULEU_S_QH_OBL = (0x06 << 6) | OPC_ADDU_OB_DSP,
735     OPC_MULEU_S_QH_OBR = (0x07 << 6) | OPC_ADDU_OB_DSP,
736     OPC_MULQ_RS_QH     = (0x1F << 6) | OPC_ADDU_OB_DSP,
737     /* MIPS DSP Arithmetic Sub-class */
738     OPC_RADDU_L_OB     = (0x14 << 6) | OPC_ADDU_OB_DSP,
739     OPC_SUBQ_PW        = (0x13 << 6) | OPC_ADDU_OB_DSP,
740     OPC_SUBQ_S_PW      = (0x17 << 6) | OPC_ADDU_OB_DSP,
741     OPC_SUBQ_QH        = (0x0B << 6) | OPC_ADDU_OB_DSP,
742     OPC_SUBQ_S_QH      = (0x0F << 6) | OPC_ADDU_OB_DSP,
743     OPC_SUBU_OB        = (0x01 << 6) | OPC_ADDU_OB_DSP,
744     OPC_SUBU_S_OB      = (0x05 << 6) | OPC_ADDU_OB_DSP,
745     OPC_SUBU_QH        = (0x09 << 6) | OPC_ADDU_OB_DSP,
746     OPC_SUBU_S_QH      = (0x0D << 6) | OPC_ADDU_OB_DSP,
747     OPC_SUBUH_OB       = (0x19 << 6) | OPC_ADDU_OB_DSP,
748     OPC_SUBUH_R_OB     = (0x1B << 6) | OPC_ADDU_OB_DSP,
749     OPC_ADDQ_PW        = (0x12 << 6) | OPC_ADDU_OB_DSP,
750     OPC_ADDQ_S_PW      = (0x16 << 6) | OPC_ADDU_OB_DSP,
751     OPC_ADDQ_QH        = (0x0A << 6) | OPC_ADDU_OB_DSP,
752     OPC_ADDQ_S_QH      = (0x0E << 6) | OPC_ADDU_OB_DSP,
753     OPC_ADDU_OB        = (0x00 << 6) | OPC_ADDU_OB_DSP,
754     OPC_ADDU_S_OB      = (0x04 << 6) | OPC_ADDU_OB_DSP,
755     OPC_ADDU_QH        = (0x08 << 6) | OPC_ADDU_OB_DSP,
756     OPC_ADDU_S_QH      = (0x0C << 6) | OPC_ADDU_OB_DSP,
757     OPC_ADDUH_OB       = (0x18 << 6) | OPC_ADDU_OB_DSP,
758     OPC_ADDUH_R_OB     = (0x1A << 6) | OPC_ADDU_OB_DSP,
759 };
760
761 #define MASK_CMPU_EQ_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
762 enum {
763     /* DSP Compare-Pick Sub-class */
764     OPC_CMP_EQ_PW         = (0x10 << 6) | OPC_CMPU_EQ_OB_DSP,
765     OPC_CMP_LT_PW         = (0x11 << 6) | OPC_CMPU_EQ_OB_DSP,
766     OPC_CMP_LE_PW         = (0x12 << 6) | OPC_CMPU_EQ_OB_DSP,
767     OPC_CMP_EQ_QH         = (0x08 << 6) | OPC_CMPU_EQ_OB_DSP,
768     OPC_CMP_LT_QH         = (0x09 << 6) | OPC_CMPU_EQ_OB_DSP,
769     OPC_CMP_LE_QH         = (0x0A << 6) | OPC_CMPU_EQ_OB_DSP,
770     OPC_CMPGDU_EQ_OB      = (0x18 << 6) | OPC_CMPU_EQ_OB_DSP,
771     OPC_CMPGDU_LT_OB      = (0x19 << 6) | OPC_CMPU_EQ_OB_DSP,
772     OPC_CMPGDU_LE_OB      = (0x1A << 6) | OPC_CMPU_EQ_OB_DSP,
773     OPC_CMPGU_EQ_OB       = (0x04 << 6) | OPC_CMPU_EQ_OB_DSP,
774     OPC_CMPGU_LT_OB       = (0x05 << 6) | OPC_CMPU_EQ_OB_DSP,
775     OPC_CMPGU_LE_OB       = (0x06 << 6) | OPC_CMPU_EQ_OB_DSP,
776     OPC_CMPU_EQ_OB        = (0x00 << 6) | OPC_CMPU_EQ_OB_DSP,
777     OPC_CMPU_LT_OB        = (0x01 << 6) | OPC_CMPU_EQ_OB_DSP,
778     OPC_CMPU_LE_OB        = (0x02 << 6) | OPC_CMPU_EQ_OB_DSP,
779     OPC_PACKRL_PW         = (0x0E << 6) | OPC_CMPU_EQ_OB_DSP,
780     OPC_PICK_OB           = (0x03 << 6) | OPC_CMPU_EQ_OB_DSP,
781     OPC_PICK_PW           = (0x13 << 6) | OPC_CMPU_EQ_OB_DSP,
782     OPC_PICK_QH           = (0x0B << 6) | OPC_CMPU_EQ_OB_DSP,
783     /* MIPS DSP Arithmetic Sub-class */
784     OPC_PRECR_OB_QH       = (0x0D << 6) | OPC_CMPU_EQ_OB_DSP,
785     OPC_PRECR_SRA_QH_PW   = (0x1E << 6) | OPC_CMPU_EQ_OB_DSP,
786     OPC_PRECR_SRA_R_QH_PW = (0x1F << 6) | OPC_CMPU_EQ_OB_DSP,
787     OPC_PRECRQ_OB_QH      = (0x0C << 6) | OPC_CMPU_EQ_OB_DSP,
788     OPC_PRECRQ_PW_L       = (0x1C << 6) | OPC_CMPU_EQ_OB_DSP,
789     OPC_PRECRQ_QH_PW      = (0x14 << 6) | OPC_CMPU_EQ_OB_DSP,
790     OPC_PRECRQ_RS_QH_PW   = (0x15 << 6) | OPC_CMPU_EQ_OB_DSP,
791     OPC_PRECRQU_S_OB_QH   = (0x0F << 6) | OPC_CMPU_EQ_OB_DSP,
792 };
793
794 #define MASK_DAPPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
795 enum {
796     /* DSP Append Sub-class */
797     OPC_DAPPEND  = (0x00 << 6) | OPC_DAPPEND_DSP,
798     OPC_PREPENDD = (0x03 << 6) | OPC_DAPPEND_DSP,
799     OPC_PREPENDW = (0x01 << 6) | OPC_DAPPEND_DSP,
800     OPC_DBALIGN  = (0x10 << 6) | OPC_DAPPEND_DSP,
801 };
802
803 #define MASK_DEXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
804 enum {
805     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
806     OPC_DMTHLIP     = (0x1F << 6) | OPC_DEXTR_W_DSP,
807     OPC_DSHILO      = (0x1A << 6) | OPC_DEXTR_W_DSP,
808     OPC_DEXTP       = (0x02 << 6) | OPC_DEXTR_W_DSP,
809     OPC_DEXTPDP     = (0x0A << 6) | OPC_DEXTR_W_DSP,
810     OPC_DEXTPDPV    = (0x0B << 6) | OPC_DEXTR_W_DSP,
811     OPC_DEXTPV      = (0x03 << 6) | OPC_DEXTR_W_DSP,
812     OPC_DEXTR_L     = (0x10 << 6) | OPC_DEXTR_W_DSP,
813     OPC_DEXTR_R_L   = (0x14 << 6) | OPC_DEXTR_W_DSP,
814     OPC_DEXTR_RS_L  = (0x16 << 6) | OPC_DEXTR_W_DSP,
815     OPC_DEXTR_W     = (0x00 << 6) | OPC_DEXTR_W_DSP,
816     OPC_DEXTR_R_W   = (0x04 << 6) | OPC_DEXTR_W_DSP,
817     OPC_DEXTR_RS_W  = (0x06 << 6) | OPC_DEXTR_W_DSP,
818     OPC_DEXTR_S_H   = (0x0E << 6) | OPC_DEXTR_W_DSP,
819     OPC_DEXTRV_L    = (0x11 << 6) | OPC_DEXTR_W_DSP,
820     OPC_DEXTRV_R_L  = (0x15 << 6) | OPC_DEXTR_W_DSP,
821     OPC_DEXTRV_RS_L = (0x17 << 6) | OPC_DEXTR_W_DSP,
822     OPC_DEXTRV_S_H  = (0x0F << 6) | OPC_DEXTR_W_DSP,
823     OPC_DEXTRV_W    = (0x01 << 6) | OPC_DEXTR_W_DSP,
824     OPC_DEXTRV_R_W  = (0x05 << 6) | OPC_DEXTR_W_DSP,
825     OPC_DEXTRV_RS_W = (0x07 << 6) | OPC_DEXTR_W_DSP,
826     OPC_DSHILOV     = (0x1B << 6) | OPC_DEXTR_W_DSP,
827 };
828
829 #define MASK_DINSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
830 enum {
831     /* DSP Bit/Manipulation Sub-class */
832     OPC_DINSV = (0x00 << 6) | OPC_DINSV_DSP,
833 };
834
835 #define MASK_DPAQ_W_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
836 enum {
837     /* MIPS DSP Multiply Sub-class insns */
838     OPC_DMADD         = (0x19 << 6) | OPC_DPAQ_W_QH_DSP,
839     OPC_DMADDU        = (0x1D << 6) | OPC_DPAQ_W_QH_DSP,
840     OPC_DMSUB         = (0x1B << 6) | OPC_DPAQ_W_QH_DSP,
841     OPC_DMSUBU        = (0x1F << 6) | OPC_DPAQ_W_QH_DSP,
842     OPC_DPA_W_QH      = (0x00 << 6) | OPC_DPAQ_W_QH_DSP,
843     OPC_DPAQ_S_W_QH   = (0x04 << 6) | OPC_DPAQ_W_QH_DSP,
844     OPC_DPAQ_SA_L_PW  = (0x0C << 6) | OPC_DPAQ_W_QH_DSP,
845     OPC_DPAU_H_OBL    = (0x03 << 6) | OPC_DPAQ_W_QH_DSP,
846     OPC_DPAU_H_OBR    = (0x07 << 6) | OPC_DPAQ_W_QH_DSP,
847     OPC_DPS_W_QH      = (0x01 << 6) | OPC_DPAQ_W_QH_DSP,
848     OPC_DPSQ_S_W_QH   = (0x05 << 6) | OPC_DPAQ_W_QH_DSP,
849     OPC_DPSQ_SA_L_PW  = (0x0D << 6) | OPC_DPAQ_W_QH_DSP,
850     OPC_DPSU_H_OBL    = (0x0B << 6) | OPC_DPAQ_W_QH_DSP,
851     OPC_DPSU_H_OBR    = (0x0F << 6) | OPC_DPAQ_W_QH_DSP,
852     OPC_MAQ_S_L_PWL   = (0x1C << 6) | OPC_DPAQ_W_QH_DSP,
853     OPC_MAQ_S_L_PWR   = (0x1E << 6) | OPC_DPAQ_W_QH_DSP,
854     OPC_MAQ_S_W_QHLL  = (0x14 << 6) | OPC_DPAQ_W_QH_DSP,
855     OPC_MAQ_SA_W_QHLL = (0x10 << 6) | OPC_DPAQ_W_QH_DSP,
856     OPC_MAQ_S_W_QHLR  = (0x15 << 6) | OPC_DPAQ_W_QH_DSP,
857     OPC_MAQ_SA_W_QHLR = (0x11 << 6) | OPC_DPAQ_W_QH_DSP,
858     OPC_MAQ_S_W_QHRL  = (0x16 << 6) | OPC_DPAQ_W_QH_DSP,
859     OPC_MAQ_SA_W_QHRL = (0x12 << 6) | OPC_DPAQ_W_QH_DSP,
860     OPC_MAQ_S_W_QHRR  = (0x17 << 6) | OPC_DPAQ_W_QH_DSP,
861     OPC_MAQ_SA_W_QHRR = (0x13 << 6) | OPC_DPAQ_W_QH_DSP,
862     OPC_MULSAQ_S_L_PW = (0x0E << 6) | OPC_DPAQ_W_QH_DSP,
863     OPC_MULSAQ_S_W_QH = (0x06 << 6) | OPC_DPAQ_W_QH_DSP,
864 };
865
866 #define MASK_SHLL_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
867 enum {
868     /* MIPS DSP GPR-Based Shift Sub-class */
869     OPC_SHLL_PW    = (0x10 << 6) | OPC_SHLL_OB_DSP,
870     OPC_SHLL_S_PW  = (0x14 << 6) | OPC_SHLL_OB_DSP,
871     OPC_SHLLV_OB   = (0x02 << 6) | OPC_SHLL_OB_DSP,
872     OPC_SHLLV_PW   = (0x12 << 6) | OPC_SHLL_OB_DSP,
873     OPC_SHLLV_S_PW = (0x16 << 6) | OPC_SHLL_OB_DSP,
874     OPC_SHLLV_QH   = (0x0A << 6) | OPC_SHLL_OB_DSP,
875     OPC_SHLLV_S_QH = (0x0E << 6) | OPC_SHLL_OB_DSP,
876     OPC_SHRA_PW    = (0x11 << 6) | OPC_SHLL_OB_DSP,
877     OPC_SHRA_R_PW  = (0x15 << 6) | OPC_SHLL_OB_DSP,
878     OPC_SHRAV_OB   = (0x06 << 6) | OPC_SHLL_OB_DSP,
879     OPC_SHRAV_R_OB = (0x07 << 6) | OPC_SHLL_OB_DSP,
880     OPC_SHRAV_PW   = (0x13 << 6) | OPC_SHLL_OB_DSP,
881     OPC_SHRAV_R_PW = (0x17 << 6) | OPC_SHLL_OB_DSP,
882     OPC_SHRAV_QH   = (0x0B << 6) | OPC_SHLL_OB_DSP,
883     OPC_SHRAV_R_QH = (0x0F << 6) | OPC_SHLL_OB_DSP,
884     OPC_SHRLV_OB   = (0x03 << 6) | OPC_SHLL_OB_DSP,
885     OPC_SHRLV_QH   = (0x1B << 6) | OPC_SHLL_OB_DSP,
886     OPC_SHLL_OB    = (0x00 << 6) | OPC_SHLL_OB_DSP,
887     OPC_SHLL_QH    = (0x08 << 6) | OPC_SHLL_OB_DSP,
888     OPC_SHLL_S_QH  = (0x0C << 6) | OPC_SHLL_OB_DSP,
889     OPC_SHRA_OB    = (0x04 << 6) | OPC_SHLL_OB_DSP,
890     OPC_SHRA_R_OB  = (0x05 << 6) | OPC_SHLL_OB_DSP,
891     OPC_SHRA_QH    = (0x09 << 6) | OPC_SHLL_OB_DSP,
892     OPC_SHRA_R_QH  = (0x0D << 6) | OPC_SHLL_OB_DSP,
893     OPC_SHRL_OB    = (0x01 << 6) | OPC_SHLL_OB_DSP,
894     OPC_SHRL_QH    = (0x19 << 6) | OPC_SHLL_OB_DSP,
895 };
896
897 /* Coprocessor 0 (rs field) */
898 #define MASK_CP0(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
899
900 enum {
901     OPC_MFC0     = (0x00 << 21) | OPC_CP0,
902     OPC_DMFC0    = (0x01 << 21) | OPC_CP0,
903     OPC_MFHC0    = (0x02 << 21) | OPC_CP0,
904     OPC_MTC0     = (0x04 << 21) | OPC_CP0,
905     OPC_DMTC0    = (0x05 << 21) | OPC_CP0,
906     OPC_MTHC0    = (0x06 << 21) | OPC_CP0,
907     OPC_MFTR     = (0x08 << 21) | OPC_CP0,
908     OPC_RDPGPR   = (0x0A << 21) | OPC_CP0,
909     OPC_MFMC0    = (0x0B << 21) | OPC_CP0,
910     OPC_MTTR     = (0x0C << 21) | OPC_CP0,
911     OPC_WRPGPR   = (0x0E << 21) | OPC_CP0,
912     OPC_C0       = (0x10 << 21) | OPC_CP0,
913     OPC_C0_1     = (0x11 << 21) | OPC_CP0,
914     OPC_C0_2     = (0x12 << 21) | OPC_CP0,
915     OPC_C0_3     = (0x13 << 21) | OPC_CP0,
916     OPC_C0_4     = (0x14 << 21) | OPC_CP0,
917     OPC_C0_5     = (0x15 << 21) | OPC_CP0,
918     OPC_C0_6     = (0x16 << 21) | OPC_CP0,
919     OPC_C0_7     = (0x17 << 21) | OPC_CP0,
920     OPC_C0_8     = (0x18 << 21) | OPC_CP0,
921     OPC_C0_9     = (0x19 << 21) | OPC_CP0,
922     OPC_C0_A     = (0x1A << 21) | OPC_CP0,
923     OPC_C0_B     = (0x1B << 21) | OPC_CP0,
924     OPC_C0_C     = (0x1C << 21) | OPC_CP0,
925     OPC_C0_D     = (0x1D << 21) | OPC_CP0,
926     OPC_C0_E     = (0x1E << 21) | OPC_CP0,
927     OPC_C0_F     = (0x1F << 21) | OPC_CP0,
928 };
929
930 /* MFMC0 opcodes */
931 #define MASK_MFMC0(op)     MASK_CP0(op) | (op & 0xFFFF)
932
933 enum {
934     OPC_DMT      = 0x01 | (0 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
935     OPC_EMT      = 0x01 | (1 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
936     OPC_DVPE     = 0x01 | (0 << 5) | OPC_MFMC0,
937     OPC_EVPE     = 0x01 | (1 << 5) | OPC_MFMC0,
938     OPC_DI       = (0 << 5) | (0x0C << 11) | OPC_MFMC0,
939     OPC_EI       = (1 << 5) | (0x0C << 11) | OPC_MFMC0,
940     OPC_DVP      = 0x04 | (0 << 3) | (1 << 5) | (0 << 11) | OPC_MFMC0,
941     OPC_EVP      = 0x04 | (0 << 3) | (0 << 5) | (0 << 11) | OPC_MFMC0,
942 };
943
944 /* Coprocessor 0 (with rs == C0) */
945 #define MASK_C0(op)        MASK_CP0(op) | (op & 0x3F)
946
947 enum {
948     OPC_TLBR     = 0x01 | OPC_C0,
949     OPC_TLBWI    = 0x02 | OPC_C0,
950     OPC_TLBINV   = 0x03 | OPC_C0,
951     OPC_TLBINVF  = 0x04 | OPC_C0,
952     OPC_TLBWR    = 0x06 | OPC_C0,
953     OPC_TLBP     = 0x08 | OPC_C0,
954     OPC_RFE      = 0x10 | OPC_C0,
955     OPC_ERET     = 0x18 | OPC_C0,
956     OPC_DERET    = 0x1F | OPC_C0,
957     OPC_WAIT     = 0x20 | OPC_C0,
958 };
959
960 /* Coprocessor 1 (rs field) */
961 #define MASK_CP1(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
962
963 /* Values for the fmt field in FP instructions */
964 enum {
965     /* 0 - 15 are reserved */
966     FMT_S = 16,          /* single fp */
967     FMT_D = 17,          /* double fp */
968     FMT_E = 18,          /* extended fp */
969     FMT_Q = 19,          /* quad fp */
970     FMT_W = 20,          /* 32-bit fixed */
971     FMT_L = 21,          /* 64-bit fixed */
972     FMT_PS = 22,         /* paired single fp */
973     /* 23 - 31 are reserved */
974 };
975
976 enum {
977     OPC_MFC1     = (0x00 << 21) | OPC_CP1,
978     OPC_DMFC1    = (0x01 << 21) | OPC_CP1,
979     OPC_CFC1     = (0x02 << 21) | OPC_CP1,
980     OPC_MFHC1    = (0x03 << 21) | OPC_CP1,
981     OPC_MTC1     = (0x04 << 21) | OPC_CP1,
982     OPC_DMTC1    = (0x05 << 21) | OPC_CP1,
983     OPC_CTC1     = (0x06 << 21) | OPC_CP1,
984     OPC_MTHC1    = (0x07 << 21) | OPC_CP1,
985     OPC_BC1      = (0x08 << 21) | OPC_CP1, /* bc */
986     OPC_BC1ANY2  = (0x09 << 21) | OPC_CP1,
987     OPC_BC1ANY4  = (0x0A << 21) | OPC_CP1,
988     OPC_BZ_V     = (0x0B << 21) | OPC_CP1,
989     OPC_BNZ_V    = (0x0F << 21) | OPC_CP1,
990     OPC_S_FMT    = (FMT_S << 21) | OPC_CP1,
991     OPC_D_FMT    = (FMT_D << 21) | OPC_CP1,
992     OPC_E_FMT    = (FMT_E << 21) | OPC_CP1,
993     OPC_Q_FMT    = (FMT_Q << 21) | OPC_CP1,
994     OPC_W_FMT    = (FMT_W << 21) | OPC_CP1,
995     OPC_L_FMT    = (FMT_L << 21) | OPC_CP1,
996     OPC_PS_FMT   = (FMT_PS << 21) | OPC_CP1,
997     OPC_BC1EQZ   = (0x09 << 21) | OPC_CP1,
998     OPC_BC1NEZ   = (0x0D << 21) | OPC_CP1,
999     OPC_BZ_B     = (0x18 << 21) | OPC_CP1,
1000     OPC_BZ_H     = (0x19 << 21) | OPC_CP1,
1001     OPC_BZ_W     = (0x1A << 21) | OPC_CP1,
1002     OPC_BZ_D     = (0x1B << 21) | OPC_CP1,
1003     OPC_BNZ_B    = (0x1C << 21) | OPC_CP1,
1004     OPC_BNZ_H    = (0x1D << 21) | OPC_CP1,
1005     OPC_BNZ_W    = (0x1E << 21) | OPC_CP1,
1006     OPC_BNZ_D    = (0x1F << 21) | OPC_CP1,
1007 };
1008
1009 #define MASK_CP1_FUNC(op)       MASK_CP1(op) | (op & 0x3F)
1010 #define MASK_BC1(op)            MASK_CP1(op) | (op & (0x3 << 16))
1011
1012 enum {
1013     OPC_BC1F     = (0x00 << 16) | OPC_BC1,
1014     OPC_BC1T     = (0x01 << 16) | OPC_BC1,
1015     OPC_BC1FL    = (0x02 << 16) | OPC_BC1,
1016     OPC_BC1TL    = (0x03 << 16) | OPC_BC1,
1017 };
1018
1019 enum {
1020     OPC_BC1FANY2     = (0x00 << 16) | OPC_BC1ANY2,
1021     OPC_BC1TANY2     = (0x01 << 16) | OPC_BC1ANY2,
1022 };
1023
1024 enum {
1025     OPC_BC1FANY4     = (0x00 << 16) | OPC_BC1ANY4,
1026     OPC_BC1TANY4     = (0x01 << 16) | OPC_BC1ANY4,
1027 };
1028
1029 #define MASK_CP2(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
1030
1031 enum {
1032     OPC_MFC2    = (0x00 << 21) | OPC_CP2,
1033     OPC_DMFC2   = (0x01 << 21) | OPC_CP2,
1034     OPC_CFC2    = (0x02 << 21) | OPC_CP2,
1035     OPC_MFHC2   = (0x03 << 21) | OPC_CP2,
1036     OPC_MTC2    = (0x04 << 21) | OPC_CP2,
1037     OPC_DMTC2   = (0x05 << 21) | OPC_CP2,
1038     OPC_CTC2    = (0x06 << 21) | OPC_CP2,
1039     OPC_MTHC2   = (0x07 << 21) | OPC_CP2,
1040     OPC_BC2     = (0x08 << 21) | OPC_CP2,
1041     OPC_BC2EQZ  = (0x09 << 21) | OPC_CP2,
1042     OPC_BC2NEZ  = (0x0D << 21) | OPC_CP2,
1043 };
1044
1045 #define MASK_LMI(op)  (MASK_OP_MAJOR(op) | (op & (0x1F << 21)) | (op & 0x1F))
1046
1047 enum {
1048     OPC_PADDSH  = (24 << 21) | (0x00) | OPC_CP2,
1049     OPC_PADDUSH = (25 << 21) | (0x00) | OPC_CP2,
1050     OPC_PADDH   = (26 << 21) | (0x00) | OPC_CP2,
1051     OPC_PADDW   = (27 << 21) | (0x00) | OPC_CP2,
1052     OPC_PADDSB  = (28 << 21) | (0x00) | OPC_CP2,
1053     OPC_PADDUSB = (29 << 21) | (0x00) | OPC_CP2,
1054     OPC_PADDB   = (30 << 21) | (0x00) | OPC_CP2,
1055     OPC_PADDD   = (31 << 21) | (0x00) | OPC_CP2,
1056
1057     OPC_PSUBSH  = (24 << 21) | (0x01) | OPC_CP2,
1058     OPC_PSUBUSH = (25 << 21) | (0x01) | OPC_CP2,
1059     OPC_PSUBH   = (26 << 21) | (0x01) | OPC_CP2,
1060     OPC_PSUBW   = (27 << 21) | (0x01) | OPC_CP2,
1061     OPC_PSUBSB  = (28 << 21) | (0x01) | OPC_CP2,
1062     OPC_PSUBUSB = (29 << 21) | (0x01) | OPC_CP2,
1063     OPC_PSUBB   = (30 << 21) | (0x01) | OPC_CP2,
1064     OPC_PSUBD   = (31 << 21) | (0x01) | OPC_CP2,
1065
1066     OPC_PSHUFH   = (24 << 21) | (0x02) | OPC_CP2,
1067     OPC_PACKSSWH = (25 << 21) | (0x02) | OPC_CP2,
1068     OPC_PACKSSHB = (26 << 21) | (0x02) | OPC_CP2,
1069     OPC_PACKUSHB = (27 << 21) | (0x02) | OPC_CP2,
1070     OPC_XOR_CP2  = (28 << 21) | (0x02) | OPC_CP2,
1071     OPC_NOR_CP2  = (29 << 21) | (0x02) | OPC_CP2,
1072     OPC_AND_CP2  = (30 << 21) | (0x02) | OPC_CP2,
1073     OPC_PANDN    = (31 << 21) | (0x02) | OPC_CP2,
1074
1075     OPC_PUNPCKLHW = (24 << 21) | (0x03) | OPC_CP2,
1076     OPC_PUNPCKHHW = (25 << 21) | (0x03) | OPC_CP2,
1077     OPC_PUNPCKLBH = (26 << 21) | (0x03) | OPC_CP2,
1078     OPC_PUNPCKHBH = (27 << 21) | (0x03) | OPC_CP2,
1079     OPC_PINSRH_0  = (28 << 21) | (0x03) | OPC_CP2,
1080     OPC_PINSRH_1  = (29 << 21) | (0x03) | OPC_CP2,
1081     OPC_PINSRH_2  = (30 << 21) | (0x03) | OPC_CP2,
1082     OPC_PINSRH_3  = (31 << 21) | (0x03) | OPC_CP2,
1083
1084     OPC_PAVGH   = (24 << 21) | (0x08) | OPC_CP2,
1085     OPC_PAVGB   = (25 << 21) | (0x08) | OPC_CP2,
1086     OPC_PMAXSH  = (26 << 21) | (0x08) | OPC_CP2,
1087     OPC_PMINSH  = (27 << 21) | (0x08) | OPC_CP2,
1088     OPC_PMAXUB  = (28 << 21) | (0x08) | OPC_CP2,
1089     OPC_PMINUB  = (29 << 21) | (0x08) | OPC_CP2,
1090
1091     OPC_PCMPEQW = (24 << 21) | (0x09) | OPC_CP2,
1092     OPC_PCMPGTW = (25 << 21) | (0x09) | OPC_CP2,
1093     OPC_PCMPEQH = (26 << 21) | (0x09) | OPC_CP2,
1094     OPC_PCMPGTH = (27 << 21) | (0x09) | OPC_CP2,
1095     OPC_PCMPEQB = (28 << 21) | (0x09) | OPC_CP2,
1096     OPC_PCMPGTB = (29 << 21) | (0x09) | OPC_CP2,
1097
1098     OPC_PSLLW   = (24 << 21) | (0x0A) | OPC_CP2,
1099     OPC_PSLLH   = (25 << 21) | (0x0A) | OPC_CP2,
1100     OPC_PMULLH  = (26 << 21) | (0x0A) | OPC_CP2,
1101     OPC_PMULHH  = (27 << 21) | (0x0A) | OPC_CP2,
1102     OPC_PMULUW  = (28 << 21) | (0x0A) | OPC_CP2,
1103     OPC_PMULHUH = (29 << 21) | (0x0A) | OPC_CP2,
1104
1105     OPC_PSRLW     = (24 << 21) | (0x0B) | OPC_CP2,
1106     OPC_PSRLH     = (25 << 21) | (0x0B) | OPC_CP2,
1107     OPC_PSRAW     = (26 << 21) | (0x0B) | OPC_CP2,
1108     OPC_PSRAH     = (27 << 21) | (0x0B) | OPC_CP2,
1109     OPC_PUNPCKLWD = (28 << 21) | (0x0B) | OPC_CP2,
1110     OPC_PUNPCKHWD = (29 << 21) | (0x0B) | OPC_CP2,
1111
1112     OPC_ADDU_CP2 = (24 << 21) | (0x0C) | OPC_CP2,
1113     OPC_OR_CP2   = (25 << 21) | (0x0C) | OPC_CP2,
1114     OPC_ADD_CP2  = (26 << 21) | (0x0C) | OPC_CP2,
1115     OPC_DADD_CP2 = (27 << 21) | (0x0C) | OPC_CP2,
1116     OPC_SEQU_CP2 = (28 << 21) | (0x0C) | OPC_CP2,
1117     OPC_SEQ_CP2  = (29 << 21) | (0x0C) | OPC_CP2,
1118
1119     OPC_SUBU_CP2 = (24 << 21) | (0x0D) | OPC_CP2,
1120     OPC_PASUBUB  = (25 << 21) | (0x0D) | OPC_CP2,
1121     OPC_SUB_CP2  = (26 << 21) | (0x0D) | OPC_CP2,
1122     OPC_DSUB_CP2 = (27 << 21) | (0x0D) | OPC_CP2,
1123     OPC_SLTU_CP2 = (28 << 21) | (0x0D) | OPC_CP2,
1124     OPC_SLT_CP2  = (29 << 21) | (0x0D) | OPC_CP2,
1125
1126     OPC_SLL_CP2  = (24 << 21) | (0x0E) | OPC_CP2,
1127     OPC_DSLL_CP2 = (25 << 21) | (0x0E) | OPC_CP2,
1128     OPC_PEXTRH   = (26 << 21) | (0x0E) | OPC_CP2,
1129     OPC_PMADDHW  = (27 << 21) | (0x0E) | OPC_CP2,
1130     OPC_SLEU_CP2 = (28 << 21) | (0x0E) | OPC_CP2,
1131     OPC_SLE_CP2  = (29 << 21) | (0x0E) | OPC_CP2,
1132
1133     OPC_SRL_CP2  = (24 << 21) | (0x0F) | OPC_CP2,
1134     OPC_DSRL_CP2 = (25 << 21) | (0x0F) | OPC_CP2,
1135     OPC_SRA_CP2  = (26 << 21) | (0x0F) | OPC_CP2,
1136     OPC_DSRA_CP2 = (27 << 21) | (0x0F) | OPC_CP2,
1137     OPC_BIADD    = (28 << 21) | (0x0F) | OPC_CP2,
1138     OPC_PMOVMSKB = (29 << 21) | (0x0F) | OPC_CP2,
1139 };
1140
1141
1142 #define MASK_CP3(op)       MASK_OP_MAJOR(op) | (op & 0x3F)
1143
1144 enum {
1145     OPC_LWXC1   = 0x00 | OPC_CP3,
1146     OPC_LDXC1   = 0x01 | OPC_CP3,
1147     OPC_LUXC1   = 0x05 | OPC_CP3,
1148     OPC_SWXC1   = 0x08 | OPC_CP3,
1149     OPC_SDXC1   = 0x09 | OPC_CP3,
1150     OPC_SUXC1   = 0x0D | OPC_CP3,
1151     OPC_PREFX   = 0x0F | OPC_CP3,
1152     OPC_ALNV_PS = 0x1E | OPC_CP3,
1153     OPC_MADD_S  = 0x20 | OPC_CP3,
1154     OPC_MADD_D  = 0x21 | OPC_CP3,
1155     OPC_MADD_PS = 0x26 | OPC_CP3,
1156     OPC_MSUB_S  = 0x28 | OPC_CP3,
1157     OPC_MSUB_D  = 0x29 | OPC_CP3,
1158     OPC_MSUB_PS = 0x2E | OPC_CP3,
1159     OPC_NMADD_S = 0x30 | OPC_CP3,
1160     OPC_NMADD_D = 0x31 | OPC_CP3,
1161     OPC_NMADD_PS= 0x36 | OPC_CP3,
1162     OPC_NMSUB_S = 0x38 | OPC_CP3,
1163     OPC_NMSUB_D = 0x39 | OPC_CP3,
1164     OPC_NMSUB_PS= 0x3E | OPC_CP3,
1165 };
1166
1167 /* MSA Opcodes */
1168 #define MASK_MSA_MINOR(op)    (MASK_OP_MAJOR(op) | (op & 0x3F))
1169 enum {
1170     OPC_MSA_I8_00   = 0x00 | OPC_MSA,
1171     OPC_MSA_I8_01   = 0x01 | OPC_MSA,
1172     OPC_MSA_I8_02   = 0x02 | OPC_MSA,
1173     OPC_MSA_I5_06   = 0x06 | OPC_MSA,
1174     OPC_MSA_I5_07   = 0x07 | OPC_MSA,
1175     OPC_MSA_BIT_09  = 0x09 | OPC_MSA,
1176     OPC_MSA_BIT_0A  = 0x0A | OPC_MSA,
1177     OPC_MSA_3R_0D   = 0x0D | OPC_MSA,
1178     OPC_MSA_3R_0E   = 0x0E | OPC_MSA,
1179     OPC_MSA_3R_0F   = 0x0F | OPC_MSA,
1180     OPC_MSA_3R_10   = 0x10 | OPC_MSA,
1181     OPC_MSA_3R_11   = 0x11 | OPC_MSA,
1182     OPC_MSA_3R_12   = 0x12 | OPC_MSA,
1183     OPC_MSA_3R_13   = 0x13 | OPC_MSA,
1184     OPC_MSA_3R_14   = 0x14 | OPC_MSA,
1185     OPC_MSA_3R_15   = 0x15 | OPC_MSA,
1186     OPC_MSA_ELM     = 0x19 | OPC_MSA,
1187     OPC_MSA_3RF_1A  = 0x1A | OPC_MSA,
1188     OPC_MSA_3RF_1B  = 0x1B | OPC_MSA,
1189     OPC_MSA_3RF_1C  = 0x1C | OPC_MSA,
1190     OPC_MSA_VEC     = 0x1E | OPC_MSA,
1191
1192     /* MI10 instruction */
1193     OPC_LD_B    = (0x20) | OPC_MSA,
1194     OPC_LD_H    = (0x21) | OPC_MSA,
1195     OPC_LD_W    = (0x22) | OPC_MSA,
1196     OPC_LD_D    = (0x23) | OPC_MSA,
1197     OPC_ST_B    = (0x24) | OPC_MSA,
1198     OPC_ST_H    = (0x25) | OPC_MSA,
1199     OPC_ST_W    = (0x26) | OPC_MSA,
1200     OPC_ST_D    = (0x27) | OPC_MSA,
1201 };
1202
1203 enum {
1204     /* I5 instruction df(bits 22..21) = _b, _h, _w, _d */
1205     OPC_ADDVI_df    = (0x0 << 23) | OPC_MSA_I5_06,
1206     OPC_CEQI_df     = (0x0 << 23) | OPC_MSA_I5_07,
1207     OPC_SUBVI_df    = (0x1 << 23) | OPC_MSA_I5_06,
1208     OPC_MAXI_S_df   = (0x2 << 23) | OPC_MSA_I5_06,
1209     OPC_CLTI_S_df   = (0x2 << 23) | OPC_MSA_I5_07,
1210     OPC_MAXI_U_df   = (0x3 << 23) | OPC_MSA_I5_06,
1211     OPC_CLTI_U_df   = (0x3 << 23) | OPC_MSA_I5_07,
1212     OPC_MINI_S_df   = (0x4 << 23) | OPC_MSA_I5_06,
1213     OPC_CLEI_S_df   = (0x4 << 23) | OPC_MSA_I5_07,
1214     OPC_MINI_U_df   = (0x5 << 23) | OPC_MSA_I5_06,
1215     OPC_CLEI_U_df   = (0x5 << 23) | OPC_MSA_I5_07,
1216     OPC_LDI_df      = (0x6 << 23) | OPC_MSA_I5_07,
1217
1218     /* I8 instruction */
1219     OPC_ANDI_B  = (0x0 << 24) | OPC_MSA_I8_00,
1220     OPC_BMNZI_B = (0x0 << 24) | OPC_MSA_I8_01,
1221     OPC_SHF_B   = (0x0 << 24) | OPC_MSA_I8_02,
1222     OPC_ORI_B   = (0x1 << 24) | OPC_MSA_I8_00,
1223     OPC_BMZI_B  = (0x1 << 24) | OPC_MSA_I8_01,
1224     OPC_SHF_H   = (0x1 << 24) | OPC_MSA_I8_02,
1225     OPC_NORI_B  = (0x2 << 24) | OPC_MSA_I8_00,
1226     OPC_BSELI_B = (0x2 << 24) | OPC_MSA_I8_01,
1227     OPC_SHF_W   = (0x2 << 24) | OPC_MSA_I8_02,
1228     OPC_XORI_B  = (0x3 << 24) | OPC_MSA_I8_00,
1229
1230     /* VEC/2R/2RF instruction */
1231     OPC_AND_V   = (0x00 << 21) | OPC_MSA_VEC,
1232     OPC_OR_V    = (0x01 << 21) | OPC_MSA_VEC,
1233     OPC_NOR_V   = (0x02 << 21) | OPC_MSA_VEC,
1234     OPC_XOR_V   = (0x03 << 21) | OPC_MSA_VEC,
1235     OPC_BMNZ_V  = (0x04 << 21) | OPC_MSA_VEC,
1236     OPC_BMZ_V   = (0x05 << 21) | OPC_MSA_VEC,
1237     OPC_BSEL_V  = (0x06 << 21) | OPC_MSA_VEC,
1238
1239     OPC_MSA_2R      = (0x18 << 21) | OPC_MSA_VEC,
1240     OPC_MSA_2RF     = (0x19 << 21) | OPC_MSA_VEC,
1241
1242     /* 2R instruction df(bits 17..16) = _b, _h, _w, _d */
1243     OPC_FILL_df = (0x00 << 18) | OPC_MSA_2R,
1244     OPC_PCNT_df = (0x01 << 18) | OPC_MSA_2R,
1245     OPC_NLOC_df = (0x02 << 18) | OPC_MSA_2R,
1246     OPC_NLZC_df = (0x03 << 18) | OPC_MSA_2R,
1247
1248     /* 2RF instruction df(bit 16) = _w, _d */
1249     OPC_FCLASS_df   = (0x00 << 17) | OPC_MSA_2RF,
1250     OPC_FTRUNC_S_df = (0x01 << 17) | OPC_MSA_2RF,
1251     OPC_FTRUNC_U_df = (0x02 << 17) | OPC_MSA_2RF,
1252     OPC_FSQRT_df    = (0x03 << 17) | OPC_MSA_2RF,
1253     OPC_FRSQRT_df   = (0x04 << 17) | OPC_MSA_2RF,
1254     OPC_FRCP_df     = (0x05 << 17) | OPC_MSA_2RF,
1255     OPC_FRINT_df    = (0x06 << 17) | OPC_MSA_2RF,
1256     OPC_FLOG2_df    = (0x07 << 17) | OPC_MSA_2RF,
1257     OPC_FEXUPL_df   = (0x08 << 17) | OPC_MSA_2RF,
1258     OPC_FEXUPR_df   = (0x09 << 17) | OPC_MSA_2RF,
1259     OPC_FFQL_df     = (0x0A << 17) | OPC_MSA_2RF,
1260     OPC_FFQR_df     = (0x0B << 17) | OPC_MSA_2RF,
1261     OPC_FTINT_S_df  = (0x0C << 17) | OPC_MSA_2RF,
1262     OPC_FTINT_U_df  = (0x0D << 17) | OPC_MSA_2RF,
1263     OPC_FFINT_S_df  = (0x0E << 17) | OPC_MSA_2RF,
1264     OPC_FFINT_U_df  = (0x0F << 17) | OPC_MSA_2RF,
1265
1266     /* 3R instruction df(bits 22..21) = _b, _h, _w, d */
1267     OPC_SLL_df      = (0x0 << 23) | OPC_MSA_3R_0D,
1268     OPC_ADDV_df     = (0x0 << 23) | OPC_MSA_3R_0E,
1269     OPC_CEQ_df      = (0x0 << 23) | OPC_MSA_3R_0F,
1270     OPC_ADD_A_df    = (0x0 << 23) | OPC_MSA_3R_10,
1271     OPC_SUBS_S_df   = (0x0 << 23) | OPC_MSA_3R_11,
1272     OPC_MULV_df     = (0x0 << 23) | OPC_MSA_3R_12,
1273     OPC_DOTP_S_df   = (0x0 << 23) | OPC_MSA_3R_13,
1274     OPC_SLD_df      = (0x0 << 23) | OPC_MSA_3R_14,
1275     OPC_VSHF_df     = (0x0 << 23) | OPC_MSA_3R_15,
1276     OPC_SRA_df      = (0x1 << 23) | OPC_MSA_3R_0D,
1277     OPC_SUBV_df     = (0x1 << 23) | OPC_MSA_3R_0E,
1278     OPC_ADDS_A_df   = (0x1 << 23) | OPC_MSA_3R_10,
1279     OPC_SUBS_U_df   = (0x1 << 23) | OPC_MSA_3R_11,
1280     OPC_MADDV_df    = (0x1 << 23) | OPC_MSA_3R_12,
1281     OPC_DOTP_U_df   = (0x1 << 23) | OPC_MSA_3R_13,
1282     OPC_SPLAT_df    = (0x1 << 23) | OPC_MSA_3R_14,
1283     OPC_SRAR_df     = (0x1 << 23) | OPC_MSA_3R_15,
1284     OPC_SRL_df      = (0x2 << 23) | OPC_MSA_3R_0D,
1285     OPC_MAX_S_df    = (0x2 << 23) | OPC_MSA_3R_0E,
1286     OPC_CLT_S_df    = (0x2 << 23) | OPC_MSA_3R_0F,
1287     OPC_ADDS_S_df   = (0x2 << 23) | OPC_MSA_3R_10,
1288     OPC_SUBSUS_U_df = (0x2 << 23) | OPC_MSA_3R_11,
1289     OPC_MSUBV_df    = (0x2 << 23) | OPC_MSA_3R_12,
1290     OPC_DPADD_S_df  = (0x2 << 23) | OPC_MSA_3R_13,
1291     OPC_PCKEV_df    = (0x2 << 23) | OPC_MSA_3R_14,
1292     OPC_SRLR_df     = (0x2 << 23) | OPC_MSA_3R_15,
1293     OPC_BCLR_df     = (0x3 << 23) | OPC_MSA_3R_0D,
1294     OPC_MAX_U_df    = (0x3 << 23) | OPC_MSA_3R_0E,
1295     OPC_CLT_U_df    = (0x3 << 23) | OPC_MSA_3R_0F,
1296     OPC_ADDS_U_df   = (0x3 << 23) | OPC_MSA_3R_10,
1297     OPC_SUBSUU_S_df = (0x3 << 23) | OPC_MSA_3R_11,
1298     OPC_DPADD_U_df  = (0x3 << 23) | OPC_MSA_3R_13,
1299     OPC_PCKOD_df    = (0x3 << 23) | OPC_MSA_3R_14,
1300     OPC_BSET_df     = (0x4 << 23) | OPC_MSA_3R_0D,
1301     OPC_MIN_S_df    = (0x4 << 23) | OPC_MSA_3R_0E,
1302     OPC_CLE_S_df    = (0x4 << 23) | OPC_MSA_3R_0F,
1303     OPC_AVE_S_df    = (0x4 << 23) | OPC_MSA_3R_10,
1304     OPC_ASUB_S_df   = (0x4 << 23) | OPC_MSA_3R_11,
1305     OPC_DIV_S_df    = (0x4 << 23) | OPC_MSA_3R_12,
1306     OPC_DPSUB_S_df  = (0x4 << 23) | OPC_MSA_3R_13,
1307     OPC_ILVL_df     = (0x4 << 23) | OPC_MSA_3R_14,
1308     OPC_HADD_S_df   = (0x4 << 23) | OPC_MSA_3R_15,
1309     OPC_BNEG_df     = (0x5 << 23) | OPC_MSA_3R_0D,
1310     OPC_MIN_U_df    = (0x5 << 23) | OPC_MSA_3R_0E,
1311     OPC_CLE_U_df    = (0x5 << 23) | OPC_MSA_3R_0F,
1312     OPC_AVE_U_df    = (0x5 << 23) | OPC_MSA_3R_10,
1313     OPC_ASUB_U_df   = (0x5 << 23) | OPC_MSA_3R_11,
1314     OPC_DIV_U_df    = (0x5 << 23) | OPC_MSA_3R_12,
1315     OPC_DPSUB_U_df  = (0x5 << 23) | OPC_MSA_3R_13,
1316     OPC_ILVR_df     = (0x5 << 23) | OPC_MSA_3R_14,
1317     OPC_HADD_U_df   = (0x5 << 23) | OPC_MSA_3R_15,
1318     OPC_BINSL_df    = (0x6 << 23) | OPC_MSA_3R_0D,
1319     OPC_MAX_A_df    = (0x6 << 23) | OPC_MSA_3R_0E,
1320     OPC_AVER_S_df   = (0x6 << 23) | OPC_MSA_3R_10,
1321     OPC_MOD_S_df    = (0x6 << 23) | OPC_MSA_3R_12,
1322     OPC_ILVEV_df    = (0x6 << 23) | OPC_MSA_3R_14,
1323     OPC_HSUB_S_df   = (0x6 << 23) | OPC_MSA_3R_15,
1324     OPC_BINSR_df    = (0x7 << 23) | OPC_MSA_3R_0D,
1325     OPC_MIN_A_df    = (0x7 << 23) | OPC_MSA_3R_0E,
1326     OPC_AVER_U_df   = (0x7 << 23) | OPC_MSA_3R_10,
1327     OPC_MOD_U_df    = (0x7 << 23) | OPC_MSA_3R_12,
1328     OPC_ILVOD_df    = (0x7 << 23) | OPC_MSA_3R_14,
1329     OPC_HSUB_U_df   = (0x7 << 23) | OPC_MSA_3R_15,
1330
1331     /* ELM instructions df(bits 21..16) = _b, _h, _w, _d */
1332     OPC_SLDI_df     = (0x0 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1333     OPC_CTCMSA      = (0x0 << 22) | (0x3E << 16) | OPC_MSA_ELM,
1334     OPC_SPLATI_df   = (0x1 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1335     OPC_CFCMSA      = (0x1 << 22) | (0x3E << 16) | OPC_MSA_ELM,
1336     OPC_COPY_S_df   = (0x2 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1337     OPC_MOVE_V      = (0x2 << 22) | (0x3E << 16) | OPC_MSA_ELM,
1338     OPC_COPY_U_df   = (0x3 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1339     OPC_INSERT_df   = (0x4 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1340     OPC_INSVE_df    = (0x5 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1341
1342     /* 3RF instruction _df(bit 21) = _w, _d */
1343     OPC_FCAF_df     = (0x0 << 22) | OPC_MSA_3RF_1A,
1344     OPC_FADD_df     = (0x0 << 22) | OPC_MSA_3RF_1B,
1345     OPC_FCUN_df     = (0x1 << 22) | OPC_MSA_3RF_1A,
1346     OPC_FSUB_df     = (0x1 << 22) | OPC_MSA_3RF_1B,
1347     OPC_FCOR_df     = (0x1 << 22) | OPC_MSA_3RF_1C,
1348     OPC_FCEQ_df     = (0x2 << 22) | OPC_MSA_3RF_1A,
1349     OPC_FMUL_df     = (0x2 << 22) | OPC_MSA_3RF_1B,
1350     OPC_FCUNE_df    = (0x2 << 22) | OPC_MSA_3RF_1C,
1351     OPC_FCUEQ_df    = (0x3 << 22) | OPC_MSA_3RF_1A,
1352     OPC_FDIV_df     = (0x3 << 22) | OPC_MSA_3RF_1B,
1353     OPC_FCNE_df     = (0x3 << 22) | OPC_MSA_3RF_1C,
1354     OPC_FCLT_df     = (0x4 << 22) | OPC_MSA_3RF_1A,
1355     OPC_FMADD_df    = (0x4 << 22) | OPC_MSA_3RF_1B,
1356     OPC_MUL_Q_df    = (0x4 << 22) | OPC_MSA_3RF_1C,
1357     OPC_FCULT_df    = (0x5 << 22) | OPC_MSA_3RF_1A,
1358     OPC_FMSUB_df    = (0x5 << 22) | OPC_MSA_3RF_1B,
1359     OPC_MADD_Q_df   = (0x5 << 22) | OPC_MSA_3RF_1C,
1360     OPC_FCLE_df     = (0x6 << 22) | OPC_MSA_3RF_1A,
1361     OPC_MSUB_Q_df   = (0x6 << 22) | OPC_MSA_3RF_1C,
1362     OPC_FCULE_df    = (0x7 << 22) | OPC_MSA_3RF_1A,
1363     OPC_FEXP2_df    = (0x7 << 22) | OPC_MSA_3RF_1B,
1364     OPC_FSAF_df     = (0x8 << 22) | OPC_MSA_3RF_1A,
1365     OPC_FEXDO_df    = (0x8 << 22) | OPC_MSA_3RF_1B,
1366     OPC_FSUN_df     = (0x9 << 22) | OPC_MSA_3RF_1A,
1367     OPC_FSOR_df     = (0x9 << 22) | OPC_MSA_3RF_1C,
1368     OPC_FSEQ_df     = (0xA << 22) | OPC_MSA_3RF_1A,
1369     OPC_FTQ_df      = (0xA << 22) | OPC_MSA_3RF_1B,
1370     OPC_FSUNE_df    = (0xA << 22) | OPC_MSA_3RF_1C,
1371     OPC_FSUEQ_df    = (0xB << 22) | OPC_MSA_3RF_1A,
1372     OPC_FSNE_df     = (0xB << 22) | OPC_MSA_3RF_1C,
1373     OPC_FSLT_df     = (0xC << 22) | OPC_MSA_3RF_1A,
1374     OPC_FMIN_df     = (0xC << 22) | OPC_MSA_3RF_1B,
1375     OPC_MULR_Q_df   = (0xC << 22) | OPC_MSA_3RF_1C,
1376     OPC_FSULT_df    = (0xD << 22) | OPC_MSA_3RF_1A,
1377     OPC_FMIN_A_df   = (0xD << 22) | OPC_MSA_3RF_1B,
1378     OPC_MADDR_Q_df  = (0xD << 22) | OPC_MSA_3RF_1C,
1379     OPC_FSLE_df     = (0xE << 22) | OPC_MSA_3RF_1A,
1380     OPC_FMAX_df     = (0xE << 22) | OPC_MSA_3RF_1B,
1381     OPC_MSUBR_Q_df  = (0xE << 22) | OPC_MSA_3RF_1C,
1382     OPC_FSULE_df    = (0xF << 22) | OPC_MSA_3RF_1A,
1383     OPC_FMAX_A_df   = (0xF << 22) | OPC_MSA_3RF_1B,
1384
1385     /* BIT instruction df(bits 22..16) = _B _H _W _D */
1386     OPC_SLLI_df     = (0x0 << 23) | OPC_MSA_BIT_09,
1387     OPC_SAT_S_df    = (0x0 << 23) | OPC_MSA_BIT_0A,
1388     OPC_SRAI_df     = (0x1 << 23) | OPC_MSA_BIT_09,
1389     OPC_SAT_U_df    = (0x1 << 23) | OPC_MSA_BIT_0A,
1390     OPC_SRLI_df     = (0x2 << 23) | OPC_MSA_BIT_09,
1391     OPC_SRARI_df    = (0x2 << 23) | OPC_MSA_BIT_0A,
1392     OPC_BCLRI_df    = (0x3 << 23) | OPC_MSA_BIT_09,
1393     OPC_SRLRI_df    = (0x3 << 23) | OPC_MSA_BIT_0A,
1394     OPC_BSETI_df    = (0x4 << 23) | OPC_MSA_BIT_09,
1395     OPC_BNEGI_df    = (0x5 << 23) | OPC_MSA_BIT_09,
1396     OPC_BINSLI_df   = (0x6 << 23) | OPC_MSA_BIT_09,
1397     OPC_BINSRI_df   = (0x7 << 23) | OPC_MSA_BIT_09,
1398 };
1399
1400
1401 /*
1402  *    AN OVERVIEW OF MXU EXTENSION INSTRUCTION SET
1403  *    ============================================
1404  *
1405  * MXU (full name: MIPS eXtension/enhanced Unit) is an SIMD extension of MIPS32
1406  * instructions set. It is designed to fit the needs of signal, graphical and
1407  * video processing applications. MXU instruction set is used in Xburst family
1408  * of microprocessors by Ingenic.
1409  *
1410  * MXU unit contains 17 registers called X0-X16. X0 is always zero, and X16 is
1411  * the control register.
1412  *
1413  * The notation used in MXU assembler mnemonics:
1414  *
1415  *   XRa, XRb, XRc, XRd - MXU registers
1416  *   Rb, Rc, Rd, Rs, Rt - general purpose MIPS registers
1417  *   s12                - a subfield of an instruction code
1418  *   strd2              - a subfield of an instruction code
1419  *   eptn2              - a subfield of an instruction code
1420  *   eptn3              - a subfield of an instruction code
1421  *   optn2              - a subfield of an instruction code
1422  *   optn3              - a subfield of an instruction code
1423  *   sft4               - a subfield of an instruction code
1424  *
1425  * Load/Store instructions           Multiplication instructions
1426  * -----------------------           ---------------------------
1427  *
1428  *  S32LDD XRa, Rb, s12               S32MADD XRa, XRd, Rs, Rt
1429  *  S32STD XRa, Rb, s12               S32MADDU XRa, XRd, Rs, Rt
1430  *  S32LDDV XRa, Rb, rc, strd2        S32SUB XRa, XRd, Rs, Rt
1431  *  S32STDV XRa, Rb, rc, strd2        S32SUBU XRa, XRd, Rs, Rt
1432  *  S32LDI XRa, Rb, s12               S32MUL XRa, XRd, Rs, Rt
1433  *  S32SDI XRa, Rb, s12               S32MULU XRa, XRd, Rs, Rt
1434  *  S32LDIV XRa, Rb, rc, strd2        D16MUL XRa, XRb, XRc, XRd, optn2
1435  *  S32SDIV XRa, Rb, rc, strd2        D16MULE XRa, XRb, XRc, optn2
1436  *  S32LDDR XRa, Rb, s12              D16MULF XRa, XRb, XRc, optn2
1437  *  S32STDR XRa, Rb, s12              D16MAC XRa, XRb, XRc, XRd, aptn2, optn2
1438  *  S32LDDVR XRa, Rb, rc, strd2       D16MACE XRa, XRb, XRc, XRd, aptn2, optn2
1439  *  S32STDVR XRa, Rb, rc, strd2       D16MACF XRa, XRb, XRc, XRd, aptn2, optn2
1440  *  S32LDIR XRa, Rb, s12              D16MADL XRa, XRb, XRc, XRd, aptn2, optn2
1441  *  S32SDIR XRa, Rb, s12              S16MAD XRa, XRb, XRc, XRd, aptn1, optn2
1442  *  S32LDIVR XRa, Rb, rc, strd2       Q8MUL XRa, XRb, XRc, XRd
1443  *  S32SDIVR XRa, Rb, rc, strd2       Q8MULSU XRa, XRb, XRc, XRd
1444  *  S16LDD XRa, Rb, s10, eptn2        Q8MAC XRa, XRb, XRc, XRd, aptn2
1445  *  S16STD XRa, Rb, s10, eptn2        Q8MACSU XRa, XRb, XRc, XRd, aptn2
1446  *  S16LDI XRa, Rb, s10, eptn2        Q8MADL XRa, XRb, XRc, XRd, aptn2
1447  *  S16SDI XRa, Rb, s10, eptn2
1448  *  S8LDD XRa, Rb, s8, eptn3
1449  *  S8STD XRa, Rb, s8, eptn3         Addition and subtraction instructions
1450  *  S8LDI XRa, Rb, s8, eptn3         -------------------------------------
1451  *  S8SDI XRa, Rb, s8, eptn3
1452  *  LXW Rd, Rs, Rt, strd2             D32ADD XRa, XRb, XRc, XRd, eptn2
1453  *  LXH Rd, Rs, Rt, strd2             D32ADDC XRa, XRb, XRc, XRd
1454  *  LXHU Rd, Rs, Rt, strd2            D32ACC XRa, XRb, XRc, XRd, eptn2
1455  *  LXB Rd, Rs, Rt, strd2             D32ACCM XRa, XRb, XRc, XRd, eptn2
1456  *  LXBU Rd, Rs, Rt, strd2            D32ASUM XRa, XRb, XRc, XRd, eptn2
1457  *                                    S32CPS XRa, XRb, XRc
1458  *                                    Q16ADD XRa, XRb, XRc, XRd, eptn2, optn2
1459  * Comparison instructions            Q16ACC XRa, XRb, XRc, XRd, eptn2
1460  * -----------------------            Q16ACCM XRa, XRb, XRc, XRd, eptn2
1461  *                                    D16ASUM XRa, XRb, XRc, XRd, eptn2
1462  *  S32MAX XRa, XRb, XRc              D16CPS XRa, XRb,
1463  *  S32MIN XRa, XRb, XRc              D16AVG XRa, XRb, XRc
1464  *  S32SLT XRa, XRb, XRc              D16AVGR XRa, XRb, XRc
1465  *  S32MOVZ XRa, XRb, XRc             Q8ADD XRa, XRb, XRc, eptn2
1466  *  S32MOVN XRa, XRb, XRc             Q8ADDE XRa, XRb, XRc, XRd, eptn2
1467  *  D16MAX XRa, XRb, XRc              Q8ACCE XRa, XRb, XRc, XRd, eptn2
1468  *  D16MIN XRa, XRb, XRc              Q8ABD XRa, XRb, XRc
1469  *  D16SLT XRa, XRb, XRc              Q8SAD XRa, XRb, XRc, XRd
1470  *  D16MOVZ XRa, XRb, XRc             Q8AVG XRa, XRb, XRc
1471  *  D16MOVN XRa, XRb, XRc             Q8AVGR XRa, XRb, XRc
1472  *  Q8MAX XRa, XRb, XRc               D8SUM XRa, XRb, XRc, XRd
1473  *  Q8MIN XRa, XRb, XRc               D8SUMC XRa, XRb, XRc, XRd
1474  *  Q8SLT XRa, XRb, XRc
1475  *  Q8SLTU XRa, XRb, XRc
1476  *  Q8MOVZ XRa, XRb, XRc             Shift instructions
1477  *  Q8MOVN XRa, XRb, XRc             ------------------
1478  *
1479  *                                    D32SLL XRa, XRb, XRc, XRd, sft4
1480  * Bitwise instructions               D32SLR XRa, XRb, XRc, XRd, sft4
1481  * --------------------               D32SAR XRa, XRb, XRc, XRd, sft4
1482  *                                    D32SARL XRa, XRb, XRc, sft4
1483  *  S32NOR XRa, XRb, XRc              D32SLLV XRa, XRb, Rb
1484  *  S32AND XRa, XRb, XRc              D32SLRV XRa, XRb, Rb
1485  *  S32XOR XRa, XRb, XRc              D32SARV XRa, XRb, Rb
1486  *  S32OR XRa, XRb, XRc               D32SARW XRa, XRb, XRc, Rb
1487  *                                    Q16SLL XRa, XRb, XRc, XRd, sft4
1488  *                                    Q16SLR XRa, XRb, XRc, XRd, sft4
1489  * Miscelaneous instructions          Q16SAR XRa, XRb, XRc, XRd, sft4
1490  * -------------------------          Q16SLLV XRa, XRb, Rb
1491  *                                    Q16SLRV XRa, XRb, Rb
1492  *  S32SFL XRa, XRb, XRc, XRd, optn2  Q16SARV XRa, XRb, Rb
1493  *  S32ALN XRa, XRb, XRc, Rb
1494  *  S32ALNI XRa, XRb, XRc, s3
1495  *  S32LUI XRa, s8, optn3            Move instructions
1496  *  S32EXTR XRa, XRb, Rb, bits5      -----------------
1497  *  S32EXTRV XRa, XRb, Rs, Rt
1498  *  Q16SCOP XRa, XRb, XRc, XRd        S32M2I XRa, Rb
1499  *  Q16SAT XRa, XRb, XRc              S32I2M XRa, Rb
1500  *
1501  *
1502  *              bits
1503  *             05..00
1504  *
1505  *          â”Œâ”€ 000000 â”€ OPC_MXU_S32MADD
1506  *          â”œâ”€ 000001 â”€ OPC_MXU_S32MADDU
1507  *          â”œâ”€ 000010 â”€ <not assigned>
1508  *          â”‚                               20..18
1509  *          â”œâ”€ 000011 â”€ OPC_MXU__POOL00 â”€â”¬â”€ 000 â”€ OPC_MXU_S32MAX
1510  *          â”‚                            â”œâ”€ 001 â”€ OPC_MXU_S32MIN
1511  *          â”‚                            â”œâ”€ 010 â”€ OPC_MXU_D16MAX
1512  *          â”‚                            â”œâ”€ 011 â”€ OPC_MXU_D16MIN
1513  *          â”‚                            â”œâ”€ 100 â”€ OPC_MXU_Q8MAX
1514  *          â”‚                            â”œâ”€ 101 â”€ OPC_MXU_Q8MIN
1515  *          â”‚                            â”œâ”€ 110 â”€ OPC_MXU_Q8SLT
1516  *          â”‚                            â””─ 111 â”€ OPC_MXU_Q8SLTU
1517  *          â”œâ”€ 000100 â”€ OPC_MXU_S32MSUB
1518  *          â”œâ”€ 000101 â”€ OPC_MXU_S32MSUBU    20..18
1519  *          â”œâ”€ 000110 â”€ OPC_MXU__POOL01 â”€â”¬â”€ 000 â”€ OPC_MXU_S32SLT
1520  *          â”‚                            â”œâ”€ 001 â”€ OPC_MXU_D16SLT
1521  *          â”‚                            â”œâ”€ 010 â”€ OPC_MXU_D16AVG
1522  *          â”‚                            â”œâ”€ 011 â”€ OPC_MXU_D16AVGR
1523  *          â”‚                            â”œâ”€ 100 â”€ OPC_MXU_Q8AVG
1524  *          â”‚                            â”œâ”€ 101 â”€ OPC_MXU_Q8AVGR
1525  *          â”‚                            â””─ 111 â”€ OPC_MXU_Q8ADD
1526  *          â”‚
1527  *          â”‚                               20..18
1528  *          â”œâ”€ 000111 â”€ OPC_MXU__POOL02 â”€â”¬â”€ 000 â”€ OPC_MXU_S32CPS
1529  *          â”‚                            â”œâ”€ 010 â”€ OPC_MXU_D16CPS
1530  *          â”‚                            â”œâ”€ 100 â”€ OPC_MXU_Q8ABD
1531  *          â”‚                            â””─ 110 â”€ OPC_MXU_Q16SAT
1532  *          â”œâ”€ 001000 â”€ OPC_MXU_D16MUL
1533  *          â”‚                               25..24
1534  *          â”œâ”€ 001001 â”€ OPC_MXU__POOL03 â”€â”¬â”€ 00 â”€ OPC_MXU_D16MULF
1535  *          â”‚                            â””─ 01 â”€ OPC_MXU_D16MULE
1536  *          â”œâ”€ 001010 â”€ OPC_MXU_D16MAC
1537  *          â”œâ”€ 001011 â”€ OPC_MXU_D16MACF
1538  *          â”œâ”€ 001100 â”€ OPC_MXU_D16MADL
1539  *          â”‚                               25..24
1540  *          â”œâ”€ 001101 â”€ OPC_MXU__POOL04 â”€â”¬â”€ 00 â”€ OPC_MXU_S16MAD
1541  *          â”‚                            â””─ 01 â”€ OPC_MXU_S16MAD_1
1542  *          â”œâ”€ 001110 â”€ OPC_MXU_Q16ADD
1543  *          â”œâ”€ 001111 â”€ OPC_MXU_D16MACE
1544  *          â”‚                               23
1545  *          â”œâ”€ 010000 â”€ OPC_MXU__POOL05 â”€â”¬â”€ 0 â”€ OPC_MXU_S32LDD
1546  *          â”‚                            â””─ 1 â”€ OPC_MXU_S32LDDR
1547  *          â”‚
1548  *          â”‚                               23
1549  *          â”œâ”€ 010001 â”€ OPC_MXU__POOL06 â”€â”¬â”€ 0 â”€ OPC_MXU_S32STD
1550  *          â”‚                            â””─ 1 â”€ OPC_MXU_S32STDR
1551  *          â”‚
1552  *          â”‚                               13..10
1553  *          â”œâ”€ 010010 â”€ OPC_MXU__POOL07 â”€â”¬â”€ 0000 â”€ OPC_MXU_S32LDDV
1554  *          â”‚                            â””─ 0001 â”€ OPC_MXU_S32LDDVR
1555  *          â”‚
1556  *          â”‚                               13..10
1557  *          â”œâ”€ 010011 â”€ OPC_MXU__POOL08 â”€â”¬â”€ 0000 â”€ OPC_MXU_S32STDV
1558  *          â”‚                            â””─ 0001 â”€ OPC_MXU_S32STDVR
1559  *          â”‚
1560  *          â”‚                               23
1561  *          â”œâ”€ 010100 â”€ OPC_MXU__POOL09 â”€â”¬â”€ 0 â”€ OPC_MXU_S32LDI
1562  *          â”‚                            â””─ 1 â”€ OPC_MXU_S32LDIR
1563  *          â”‚
1564  *          â”‚                               23
1565  *          â”œâ”€ 010101 â”€ OPC_MXU__POOL10 â”€â”¬â”€ 0 â”€ OPC_MXU_S32SDI
1566  *          â”‚                            â””─ 1 â”€ OPC_MXU_S32SDIR
1567  *          â”‚
1568  *          â”‚                               13..10
1569  *          â”œâ”€ 010110 â”€ OPC_MXU__POOL11 â”€â”¬â”€ 0000 â”€ OPC_MXU_S32LDIV
1570  *          â”‚                            â””─ 0001 â”€ OPC_MXU_S32LDIVR
1571  *          â”‚
1572  *          â”‚                               13..10
1573  *          â”œâ”€ 010111 â”€ OPC_MXU__POOL12 â”€â”¬â”€ 0000 â”€ OPC_MXU_S32SDIV
1574  *          â”‚                            â””─ 0001 â”€ OPC_MXU_S32SDIVR
1575  *          â”œâ”€ 011000 â”€ OPC_MXU_D32ADD
1576  *          â”‚                               23..22
1577  *   MXU    â”œâ”€ 011001 â”€ OPC_MXU__POOL13 â”€â”¬â”€ 00 â”€ OPC_MXU_D32ACC
1578  * opcodes â”€â”¤                            â”œâ”€ 01 â”€ OPC_MXU_D32ACCM
1579  *          â”‚                            â””─ 10 â”€ OPC_MXU_D32ASUM
1580  *          â”œâ”€ 011010 â”€ <not assigned>
1581  *          â”‚                               23..22
1582  *          â”œâ”€ 011011 â”€ OPC_MXU__POOL14 â”€â”¬â”€ 00 â”€ OPC_MXU_Q16ACC
1583  *          â”‚                            â”œâ”€ 01 â”€ OPC_MXU_Q16ACCM
1584  *          â”‚                            â””─ 10 â”€ OPC_MXU_Q16ASUM
1585  *          â”‚
1586  *          â”‚                               23..22
1587  *          â”œâ”€ 011100 â”€ OPC_MXU__POOL15 â”€â”¬â”€ 00 â”€ OPC_MXU_Q8ADDE
1588  *          â”‚                            â”œâ”€ 01 â”€ OPC_MXU_D8SUM
1589  *          â”œâ”€ 011101 â”€ OPC_MXU_Q8ACCE   â””─ 10 â”€ OPC_MXU_D8SUMC
1590  *          â”œâ”€ 011110 â”€ <not assigned>
1591  *          â”œâ”€ 011111 â”€ <not assigned>
1592  *          â”œâ”€ 100000 â”€ <not assigned>
1593  *          â”œâ”€ 100001 â”€ <not assigned>
1594  *          â”œâ”€ 100010 â”€ OPC_MXU_S8LDD
1595  *          â”œâ”€ 100011 â”€ OPC_MXU_S8STD
1596  *          â”œâ”€ 100100 â”€ OPC_MXU_S8LDI
1597  *          â”œâ”€ 100101 â”€ OPC_MXU_S8SDI
1598  *          â”‚                               15..14
1599  *          â”œâ”€ 100110 â”€ OPC_MXU__POOL16 â”€â”¬â”€ 00 â”€ OPC_MXU_S32MUL
1600  *          â”‚                            â”œâ”€ 00 â”€ OPC_MXU_S32MULU
1601  *          â”‚                            â”œâ”€ 00 â”€ OPC_MXU_S32EXTR
1602  *          â”‚                            â””─ 00 â”€ OPC_MXU_S32EXTRV
1603  *          â”‚
1604  *          â”‚                               20..18
1605  *          â”œâ”€ 100111 â”€ OPC_MXU__POOL17 â”€â”¬â”€ 000 â”€ OPC_MXU_D32SARW
1606  *          â”‚                            â”œâ”€ 001 â”€ OPC_MXU_S32ALN
1607  *          â”œâ”€ 101000 â”€ OPC_MXU_LXB      â”œâ”€ 010 â”€ OPC_MXU_S32ALNI
1608  *          â”œâ”€ 101001 â”€ <not assigned>   â”œâ”€ 011 â”€ OPC_MXU_S32NOR
1609  *          â”œâ”€ 101010 â”€ OPC_MXU_S16LDD   â”œâ”€ 100 â”€ OPC_MXU_S32AND
1610  *          â”œâ”€ 101011 â”€ OPC_MXU_S16STD   â”œâ”€ 101 â”€ OPC_MXU_S32OR
1611  *          â”œâ”€ 101100 â”€ OPC_MXU_S16LDI   â”œâ”€ 110 â”€ OPC_MXU_S32XOR
1612  *          â”œâ”€ 101101 â”€ OPC_MXU_S16SDI   â””─ 111 â”€ OPC_MXU_S32LUI
1613  *          â”œâ”€ 101000 â”€ <not assigned>
1614  *          â”œâ”€ 101001 â”€ <not assigned>
1615  *          â”œâ”€ 101010 â”€ <not assigned>
1616  *          â”œâ”€ 101011 â”€ <not assigned>
1617  *          â”œâ”€ 101100 â”€ <not assigned>
1618  *          â”œâ”€ 101101 â”€ <not assigned>
1619  *          â”œâ”€ 101110 â”€ OPC_MXU_S32M2I
1620  *          â”œâ”€ 101111 â”€ OPC_MXU_S32I2M
1621  *          â”œâ”€ 110000 â”€ OPC_MXU_D32SLL
1622  *          â”œâ”€ 110001 â”€ OPC_MXU_D32SLR
1623  *          â”œâ”€ 110010 â”€ OPC_MXU_D32SARL
1624  *          â”œâ”€ 110011 â”€ OPC_MXU_D32SAR
1625  *          â”œâ”€ 110100 â”€ OPC_MXU_Q16SLL
1626  *          â”œâ”€ 110101 â”€ OPC_MXU_Q16SLR      20..18
1627  *          â”œâ”€ 110110 â”€ OPC_MXU__POOL18 â”€â”¬â”€ 000 â”€ OPC_MXU_D32SLLV
1628  *          â”‚                            â”œâ”€ 001 â”€ OPC_MXU_D32SLRV
1629  *          â”‚                            â”œâ”€ 010 â”€ OPC_MXU_D32SARV
1630  *          â”‚                            â”œâ”€ 011 â”€ OPC_MXU_Q16SLLV
1631  *          â”‚                            â”œâ”€ 100 â”€ OPC_MXU_Q16SLRV
1632  *          â”‚                            â””─ 101 â”€ OPC_MXU_Q16SARV
1633  *          â”œâ”€ 110111 â”€ OPC_MXU_Q16SAR
1634  *          â”‚                               23..22
1635  *          â”œâ”€ 111000 â”€ OPC_MXU__POOL19 â”€â”¬â”€ 00 â”€ OPC_MXU_Q8MUL
1636  *          â”‚                            â””─ 01 â”€ OPC_MXU_Q8MULSU
1637  *          â”‚
1638  *          â”‚                               20..18
1639  *          â”œâ”€ 111001 â”€ OPC_MXU__POOL20 â”€â”¬â”€ 000 â”€ OPC_MXU_Q8MOVZ
1640  *          â”‚                            â”œâ”€ 001 â”€ OPC_MXU_Q8MOVN
1641  *          â”‚                            â”œâ”€ 010 â”€ OPC_MXU_D16MOVZ
1642  *          â”‚                            â”œâ”€ 011 â”€ OPC_MXU_D16MOVN
1643  *          â”‚                            â”œâ”€ 100 â”€ OPC_MXU_S32MOVZ
1644  *          â”‚                            â””─ 101 â”€ OPC_MXU_S32MOV
1645  *          â”‚
1646  *          â”‚                               23..22
1647  *          â”œâ”€ 111010 â”€ OPC_MXU__POOL21 â”€â”¬â”€ 00 â”€ OPC_MXU_Q8MAC
1648  *          â”‚                            â””─ 10 â”€ OPC_MXU_Q8MACSU
1649  *          â”œâ”€ 111011 â”€ OPC_MXU_Q16SCOP
1650  *          â”œâ”€ 111100 â”€ OPC_MXU_Q8MADL
1651  *          â”œâ”€ 111101 â”€ OPC_MXU_S32SFL
1652  *          â”œâ”€ 111110 â”€ OPC_MXU_Q8SAD
1653  *          â””─ 111111 â”€ <not assigned>
1654  *
1655  *
1656  *   Compiled after:
1657  *
1658  *   "XBurst® Instruction Set Architecture MIPS eXtension/enhanced Unit
1659  *   Programming Manual", Ingenic Semiconductor Co, Ltd., 2017
1660  */
1661
1662 enum {
1663     OPC_MXU_S32MADD  = 0x00,
1664     OPC_MXU_S32MADDU = 0x01,
1665     /* not assigned 0x02 */
1666     OPC_MXU__POOL00  = 0x03,
1667     OPC_MXU_S32MSUB  = 0x04,
1668     OPC_MXU_S32MSUBU = 0x05,
1669     OPC_MXU__POOL01  = 0x06,
1670     OPC_MXU__POOL02  = 0x07,
1671     OPC_MXU_D16MUL   = 0x08,
1672     OPC_MXU__POOL03  = 0x09,
1673     OPC_MXU_D16MAC   = 0x0A,
1674     OPC_MXU_D16MACF  = 0x0B,
1675     OPC_MXU_D16MADL  = 0x0C,
1676     OPC_MXU__POOL04  = 0x0D,
1677     OPC_MXU_Q16ADD   = 0x0E,
1678     OPC_MXU_D16MACE  = 0x0F,
1679     OPC_MXU__POOL05  = 0x10,
1680     OPC_MXU__POOL06  = 0x11,
1681     OPC_MXU__POOL07  = 0x12,
1682     OPC_MXU__POOL08  = 0x13,
1683     OPC_MXU__POOL09  = 0x14,
1684     OPC_MXU__POOL10  = 0x15,
1685     OPC_MXU__POOL11  = 0x16,
1686     OPC_MXU__POOL12  = 0x17,
1687     OPC_MXU_D32ADD   = 0x18,
1688     OPC_MXU__POOL13  = 0x19,
1689     /* not assigned 0x1A */
1690     OPC_MXU__POOL14  = 0x1B,
1691     OPC_MXU__POOL15  = 0x1C,
1692     OPC_MXU_Q8ACCE   = 0x1D,
1693     /* not assigned 0x1E */
1694     /* not assigned 0x1F */
1695     /* not assigned 0x20 */
1696     /* not assigned 0x21 */
1697     OPC_MXU_S8LDD    = 0x22,
1698     OPC_MXU_S8STD    = 0x23,
1699     OPC_MXU_S8LDI    = 0x24,
1700     OPC_MXU_S8SDI    = 0x25,
1701     OPC_MXU__POOL16  = 0x26,
1702     OPC_MXU__POOL17  = 0x27,
1703     OPC_MXU_LXB      = 0x28,
1704     /* not assigned 0x29 */
1705     OPC_MXU_S16LDD   = 0x2A,
1706     OPC_MXU_S16STD   = 0x2B,
1707     OPC_MXU_S16LDI   = 0x2C,
1708     OPC_MXU_S16SDI   = 0x2D,
1709     OPC_MXU_S32M2I   = 0x2E,
1710     OPC_MXU_S32I2M   = 0x2F,
1711     OPC_MXU_D32SLL   = 0x30,
1712     OPC_MXU_D32SLR   = 0x31,
1713     OPC_MXU_D32SARL  = 0x32,
1714     OPC_MXU_D32SAR   = 0x33,
1715     OPC_MXU_Q16SLL   = 0x34,
1716     OPC_MXU_Q16SLR   = 0x35,
1717     OPC_MXU__POOL18  = 0x36,
1718     OPC_MXU_Q16SAR   = 0x37,
1719     OPC_MXU__POOL19  = 0x38,
1720     OPC_MXU__POOL20  = 0x39,
1721     OPC_MXU__POOL21  = 0x3A,
1722     OPC_MXU_Q16SCOP  = 0x3B,
1723     OPC_MXU_Q8MADL   = 0x3C,
1724     OPC_MXU_S32SFL   = 0x3D,
1725     OPC_MXU_Q8SAD    = 0x3E,
1726     /* not assigned 0x3F */
1727 };
1728
1729
1730 /*
1731  * MXU pool 00
1732  */
1733 enum {
1734     OPC_MXU_S32MAX   = 0x00,
1735     OPC_MXU_S32MIN   = 0x01,
1736     OPC_MXU_D16MAX   = 0x02,
1737     OPC_MXU_D16MIN   = 0x03,
1738     OPC_MXU_Q8MAX    = 0x04,
1739     OPC_MXU_Q8MIN    = 0x05,
1740     OPC_MXU_Q8SLT    = 0x06,
1741     OPC_MXU_Q8SLTU   = 0x07,
1742 };
1743
1744 /*
1745  * MXU pool 01
1746  */
1747 enum {
1748     OPC_MXU_S32SLT   = 0x00,
1749     OPC_MXU_D16SLT   = 0x01,
1750     OPC_MXU_D16AVG   = 0x02,
1751     OPC_MXU_D16AVGR  = 0x03,
1752     OPC_MXU_Q8AVG    = 0x04,
1753     OPC_MXU_Q8AVGR   = 0x05,
1754     OPC_MXU_Q8ADD    = 0x07,
1755 };
1756
1757 /*
1758  * MXU pool 02
1759  */
1760 enum {
1761     OPC_MXU_S32CPS   = 0x00,
1762     OPC_MXU_D16CPS   = 0x02,
1763     OPC_MXU_Q8ABD    = 0x04,
1764     OPC_MXU_Q16SAT   = 0x06,
1765 };
1766
1767 /*
1768  * MXU pool 03
1769  */
1770 enum {
1771     OPC_MXU_D16MULF  = 0x00,
1772     OPC_MXU_D16MULE  = 0x01,
1773 };
1774
1775 /*
1776  * MXU pool 04
1777  */
1778 enum {
1779     OPC_MXU_S16MAD   = 0x00,
1780     OPC_MXU_S16MAD_1 = 0x01,
1781 };
1782
1783 /*
1784  * MXU pool 05
1785  */
1786 enum {
1787     OPC_MXU_S32LDD   = 0x00,
1788     OPC_MXU_S32LDDR  = 0x01,
1789 };
1790
1791 /*
1792  * MXU pool 06
1793  */
1794 enum {
1795     OPC_MXU_S32STD   = 0x00,
1796     OPC_MXU_S32STDR  = 0x01,
1797 };
1798
1799 /*
1800  * MXU pool 07
1801  */
1802 enum {
1803     OPC_MXU_S32LDDV  = 0x00,
1804     OPC_MXU_S32LDDVR = 0x01,
1805 };
1806
1807 /*
1808  * MXU pool 08
1809  */
1810 enum {
1811     OPC_MXU_S32STDV  = 0x00,
1812     OPC_MXU_S32STDVR = 0x01,
1813 };
1814
1815 /*
1816  * MXU pool 09
1817  */
1818 enum {
1819     OPC_MXU_S32LDI   = 0x00,
1820     OPC_MXU_S32LDIR  = 0x01,
1821 };
1822
1823 /*
1824  * MXU pool 10
1825  */
1826 enum {
1827     OPC_MXU_S32SDI   = 0x00,
1828     OPC_MXU_S32SDIR  = 0x01,
1829 };
1830
1831 /*
1832  * MXU pool 11
1833  */
1834 enum {
1835     OPC_MXU_S32LDIV  = 0x00,
1836     OPC_MXU_S32LDIVR = 0x01,
1837 };
1838
1839 /*
1840  * MXU pool 12
1841  */
1842 enum {
1843     OPC_MXU_S32SDIV  = 0x00,
1844     OPC_MXU_S32SDIVR = 0x01,
1845 };
1846
1847 /*
1848  * MXU pool 13
1849  */
1850 enum {
1851     OPC_MXU_D32ACC   = 0x00,
1852     OPC_MXU_D32ACCM  = 0x01,
1853     OPC_MXU_D32ASUM  = 0x02,
1854 };
1855
1856 /*
1857  * MXU pool 14
1858  */
1859 enum {
1860     OPC_MXU_Q16ACC   = 0x00,
1861     OPC_MXU_Q16ACCM  = 0x01,
1862     OPC_MXU_Q16ASUM  = 0x02,
1863 };
1864
1865 /*
1866  * MXU pool 15
1867  */
1868 enum {
1869     OPC_MXU_Q8ADDE   = 0x00,
1870     OPC_MXU_D8SUM    = 0x01,
1871     OPC_MXU_D8SUMC   = 0x02,
1872 };
1873
1874 /*
1875  * MXU pool 16
1876  */
1877 enum {
1878     OPC_MXU_S32MUL   = 0x00,
1879     OPC_MXU_S32MULU  = 0x01,
1880     OPC_MXU_S32EXTR  = 0x02,
1881     OPC_MXU_S32EXTRV = 0x03,
1882 };
1883
1884 /*
1885  * MXU pool 17
1886  */
1887 enum {
1888     OPC_MXU_D32SARW  = 0x00,
1889     OPC_MXU_S32ALN   = 0x01,
1890     OPC_MXU_S32ALNI  = 0x02,
1891     OPC_MXU_S32NOR   = 0x03,
1892     OPC_MXU_S32AND   = 0x04,
1893     OPC_MXU_S32OR    = 0x05,
1894     OPC_MXU_S32XOR   = 0x06,
1895     OPC_MXU_S32LUI   = 0x07,
1896 };
1897
1898 /*
1899  * MXU pool 18
1900  */
1901 enum {
1902     OPC_MXU_D32SLLV  = 0x00,
1903     OPC_MXU_D32SLRV  = 0x01,
1904     OPC_MXU_D32SARV  = 0x03,
1905     OPC_MXU_Q16SLLV  = 0x04,
1906     OPC_MXU_Q16SLRV  = 0x05,
1907     OPC_MXU_Q16SARV  = 0x07,
1908 };
1909
1910 /*
1911  * MXU pool 19
1912  */
1913 enum {
1914     OPC_MXU_Q8MUL    = 0x00,
1915     OPC_MXU_Q8MULSU  = 0x01,
1916 };
1917
1918 /*
1919  * MXU pool 20
1920  */
1921 enum {
1922     OPC_MXU_Q8MOVZ   = 0x00,
1923     OPC_MXU_Q8MOVN   = 0x01,
1924     OPC_MXU_D16MOVZ  = 0x02,
1925     OPC_MXU_D16MOVN  = 0x03,
1926     OPC_MXU_S32MOVZ  = 0x04,
1927     OPC_MXU_S32MOVN  = 0x05,
1928 };
1929
1930 /*
1931  * MXU pool 21
1932  */
1933 enum {
1934     OPC_MXU_Q8MAC    = 0x00,
1935     OPC_MXU_Q8MACSU  = 0x01,
1936 };
1937
1938 /*
1939  *     Overview of the TX79-specific instruction set
1940  *     =============================================
1941  *
1942  * The R5900 and the C790 have 128-bit wide GPRs, where the upper 64 bits
1943  * are only used by the specific quadword (128-bit) LQ/SQ load/store
1944  * instructions and certain multimedia instructions (MMIs). These MMIs
1945  * configure the 128-bit data path as two 64-bit, four 32-bit, eight 16-bit
1946  * or sixteen 8-bit paths.
1947  *
1948  * Reference:
1949  *
1950  * The Toshiba TX System RISC TX79 Core Architecture manual,
1951  * https://wiki.qemu.org/File:C790.pdf
1952  *
1953  *     Three-Operand Multiply and Multiply-Add (4 instructions)
1954  *     --------------------------------------------------------
1955  * MADD    [rd,] rs, rt      Multiply/Add
1956  * MADDU   [rd,] rs, rt      Multiply/Add Unsigned
1957  * MULT    [rd,] rs, rt      Multiply (3-operand)
1958  * MULTU   [rd,] rs, rt      Multiply Unsigned (3-operand)
1959  *
1960  *     Multiply Instructions for Pipeline 1 (10 instructions)
1961  *     ------------------------------------------------------
1962  * MULT1   [rd,] rs, rt      Multiply Pipeline 1
1963  * MULTU1  [rd,] rs, rt      Multiply Unsigned Pipeline 1
1964  * DIV1    rs, rt            Divide Pipeline 1
1965  * DIVU1   rs, rt            Divide Unsigned Pipeline 1
1966  * MADD1   [rd,] rs, rt      Multiply-Add Pipeline 1
1967  * MADDU1  [rd,] rs, rt      Multiply-Add Unsigned Pipeline 1
1968  * MFHI1   rd                Move From HI1 Register
1969  * MFLO1   rd                Move From LO1 Register
1970  * MTHI1   rs                Move To HI1 Register
1971  * MTLO1   rs                Move To LO1 Register
1972  *
1973  *     Arithmetic (19 instructions)
1974  *     ----------------------------
1975  * PADDB   rd, rs, rt        Parallel Add Byte
1976  * PSUBB   rd, rs, rt        Parallel Subtract Byte
1977  * PADDH   rd, rs, rt        Parallel Add Halfword
1978  * PSUBH   rd, rs, rt        Parallel Subtract Halfword
1979  * PADDW   rd, rs, rt        Parallel Add Word
1980  * PSUBW   rd, rs, rt        Parallel Subtract Word
1981  * PADSBH  rd, rs, rt        Parallel Add/Subtract Halfword
1982  * PADDSB  rd, rs, rt        Parallel Add with Signed Saturation Byte
1983  * PSUBSB  rd, rs, rt        Parallel Subtract with Signed Saturation Byte
1984  * PADDSH  rd, rs, rt        Parallel Add with Signed Saturation Halfword
1985  * PSUBSH  rd, rs, rt        Parallel Subtract with Signed Saturation Halfword
1986  * PADDSW  rd, rs, rt        Parallel Add with Signed Saturation Word
1987  * PSUBSW  rd, rs, rt        Parallel Subtract with Signed Saturation Word
1988  * PADDUB  rd, rs, rt        Parallel Add with Unsigned saturation Byte
1989  * PSUBUB  rd, rs, rt        Parallel Subtract with Unsigned saturation Byte
1990  * PADDUH  rd, rs, rt        Parallel Add with Unsigned saturation Halfword
1991  * PSUBUH  rd, rs, rt        Parallel Subtract with Unsigned saturation Halfword
1992  * PADDUW  rd, rs, rt        Parallel Add with Unsigned saturation Word
1993  * PSUBUW  rd, rs, rt        Parallel Subtract with Unsigned saturation Word
1994  *
1995  *     Min/Max (4 instructions)
1996  *     ------------------------
1997  * PMAXH   rd, rs, rt        Parallel Maximum Halfword
1998  * PMINH   rd, rs, rt        Parallel Minimum Halfword
1999  * PMAXW   rd, rs, rt        Parallel Maximum Word
2000  * PMINW   rd, rs, rt        Parallel Minimum Word
2001  *
2002  *     Absolute (2 instructions)
2003  *     -------------------------
2004  * PABSH   rd, rt            Parallel Absolute Halfword
2005  * PABSW   rd, rt            Parallel Absolute Word
2006  *
2007  *     Logical (4 instructions)
2008  *     ------------------------
2009  * PAND    rd, rs, rt        Parallel AND
2010  * POR     rd, rs, rt        Parallel OR
2011  * PXOR    rd, rs, rt        Parallel XOR
2012  * PNOR    rd, rs, rt        Parallel NOR
2013  *
2014  *     Shift (9 instructions)
2015  *     ----------------------
2016  * PSLLH   rd, rt, sa        Parallel Shift Left Logical Halfword
2017  * PSRLH   rd, rt, sa        Parallel Shift Right Logical Halfword
2018  * PSRAH   rd, rt, sa        Parallel Shift Right Arithmetic Halfword
2019  * PSLLW   rd, rt, sa        Parallel Shift Left Logical Word
2020  * PSRLW   rd, rt, sa        Parallel Shift Right Logical Word
2021  * PSRAW   rd, rt, sa        Parallel Shift Right Arithmetic Word
2022  * PSLLVW  rd, rt, rs        Parallel Shift Left Logical Variable Word
2023  * PSRLVW  rd, rt, rs        Parallel Shift Right Logical Variable Word
2024  * PSRAVW  rd, rt, rs        Parallel Shift Right Arithmetic Variable Word
2025  *
2026  *     Compare (6 instructions)
2027  *     ------------------------
2028  * PCGTB   rd, rs, rt        Parallel Compare for Greater Than Byte
2029  * PCEQB   rd, rs, rt        Parallel Compare for Equal Byte
2030  * PCGTH   rd, rs, rt        Parallel Compare for Greater Than Halfword
2031  * PCEQH   rd, rs, rt        Parallel Compare for Equal Halfword
2032  * PCGTW   rd, rs, rt        Parallel Compare for Greater Than Word
2033  * PCEQW   rd, rs, rt        Parallel Compare for Equal Word
2034  *
2035  *     LZC (1 instruction)
2036  *     -------------------
2037  * PLZCW   rd, rs            Parallel Leading Zero or One Count Word
2038  *
2039  *     Quadword Load and Store (2 instructions)
2040  *     ----------------------------------------
2041  * LQ      rt, offset(base)  Load Quadword
2042  * SQ      rt, offset(base)  Store Quadword
2043  *
2044  *     Multiply and Divide (19 instructions)
2045  *     -------------------------------------
2046  * PMULTW  rd, rs, rt        Parallel Multiply Word
2047  * PMULTUW rd, rs, rt        Parallel Multiply Unsigned Word
2048  * PDIVW   rs, rt            Parallel Divide Word
2049  * PDIVUW  rs, rt            Parallel Divide Unsigned Word
2050  * PMADDW  rd, rs, rt        Parallel Multiply-Add Word
2051  * PMADDUW rd, rs, rt        Parallel Multiply-Add Unsigned Word
2052  * PMSUBW  rd, rs, rt        Parallel Multiply-Subtract Word
2053  * PMULTH  rd, rs, rt        Parallel Multiply Halfword
2054  * PMADDH  rd, rs, rt        Parallel Multiply-Add Halfword
2055  * PMSUBH  rd, rs, rt        Parallel Multiply-Subtract Halfword
2056  * PHMADH  rd, rs, rt        Parallel Horizontal Multiply-Add Halfword
2057  * PHMSBH  rd, rs, rt        Parallel Horizontal Multiply-Subtract Halfword
2058  * PDIVBW  rs, rt            Parallel Divide Broadcast Word
2059  * PMFHI   rd                Parallel Move From HI Register
2060  * PMFLO   rd                Parallel Move From LO Register
2061  * PMTHI   rs                Parallel Move To HI Register
2062  * PMTLO   rs                Parallel Move To LO Register
2063  * PMFHL   rd                Parallel Move From HI/LO Register
2064  * PMTHL   rs                Parallel Move To HI/LO Register
2065  *
2066  *     Pack/Extend (11 instructions)
2067  *     -----------------------------
2068  * PPAC5   rd, rt            Parallel Pack to 5 bits
2069  * PPACB   rd, rs, rt        Parallel Pack to Byte
2070  * PPACH   rd, rs, rt        Parallel Pack to Halfword
2071  * PPACW   rd, rs, rt        Parallel Pack to Word
2072  * PEXT5   rd, rt            Parallel Extend Upper from 5 bits
2073  * PEXTUB  rd, rs, rt        Parallel Extend Upper from Byte
2074  * PEXTLB  rd, rs, rt        Parallel Extend Lower from Byte
2075  * PEXTUH  rd, rs, rt        Parallel Extend Upper from Halfword
2076  * PEXTLH  rd, rs, rt        Parallel Extend Lower from Halfword
2077  * PEXTUW  rd, rs, rt        Parallel Extend Upper from Word
2078  * PEXTLW  rd, rs, rt        Parallel Extend Lower from Word
2079  *
2080  *     Others (16 instructions)
2081  *     ------------------------
2082  * PCPYH   rd, rt            Parallel Copy Halfword
2083  * PCPYLD  rd, rs, rt        Parallel Copy Lower Doubleword
2084  * PCPYUD  rd, rs, rt        Parallel Copy Upper Doubleword
2085  * PREVH   rd, rt            Parallel Reverse Halfword
2086  * PINTH   rd, rs, rt        Parallel Interleave Halfword
2087  * PINTEH  rd, rs, rt        Parallel Interleave Even Halfword
2088  * PEXEH   rd, rt            Parallel Exchange Even Halfword
2089  * PEXCH   rd, rt            Parallel Exchange Center Halfword
2090  * PEXEW   rd, rt            Parallel Exchange Even Word
2091  * PEXCW   rd, rt            Parallel Exchange Center Word
2092  * QFSRV   rd, rs, rt        Quadword Funnel Shift Right Variable
2093  * MFSA    rd                Move from Shift Amount Register
2094  * MTSA    rs                Move to Shift Amount Register
2095  * MTSAB   rs, immediate     Move Byte Count to Shift Amount Register
2096  * MTSAH   rs, immediate     Move Halfword Count to Shift Amount Register
2097  * PROT3W  rd, rt            Parallel Rotate 3 Words
2098  *
2099  *     The TX79-specific Multimedia Instruction encodings
2100  *     ==================================================
2101  *
2102  * TX79 Multimedia Instruction encoding table keys:
2103  *
2104  *     *   This code is reserved for future use. An attempt to execute it
2105  *         causes a Reserved Instruction exception.
2106  *     %   This code indicates an instruction class. The instruction word
2107  *         must be further decoded by examining additional tables that show
2108  *         the values for other instruction fields.
2109  *     #   This code is reserved for the unsupported instructions DMULT,
2110  *         DMULTU, DDIV, DDIVU, LL, LLD, SC, SCD, LWC2 and SWC2. An attempt
2111  *         to execute it causes a Reserved Instruction exception.
2112  *
2113  * TX79 Multimedia Instructions encoded by opcode field (MMI, LQ, SQ):
2114  *
2115  *  31    26                                        0
2116  * +--------+----------------------------------------+
2117  * | opcode |                                        |
2118  * +--------+----------------------------------------+
2119  *
2120  *   opcode  bits 28..26
2121  *     bits |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7
2122  *   31..29 |  000  |  001  |  010  |  011  |  100  |  101  |  110  |  111
2123  *   -------+-------+-------+-------+-------+-------+-------+-------+-------
2124  *    0 000 |SPECIAL| REGIMM|   J   |  JAL  |  BEQ  |  BNE  |  BLEZ |  BGTZ
2125  *    1 001 |  ADDI | ADDIU |  SLTI | SLTIU |  ANDI |  ORI  |  XORI |  LUI
2126  *    2 010 |  COP0 |  COP1 |   *   |   *   |  BEQL |  BNEL | BLEZL | BGTZL
2127  *    3 011 | DADDI | DADDIU|  LDL  |  LDR  |  MMI% |   *   |   LQ  |   SQ
2128  *    4 100 |   LB  |   LH  |  LWL  |   LW  |  LBU  |  LHU  |  LWR  |  LWU
2129  *    5 101 |   SB  |   SH  |  SWL  |   SW  |  SDL  |  SDR  |  SWR  | CACHE
2130  *    6 110 |   #   |  LWC1 |   #   |  PREF |   #   |  LDC1 |   #   |   LD
2131  *    7 111 |   #   |  SWC1 |   #   |   *   |   #   |  SDC1 |   #   |   SD
2132  */
2133
2134 enum {
2135     TX79_CLASS_MMI = 0x1C << 26,    /* Same as OPC_SPECIAL2 */
2136     TX79_LQ        = 0x1E << 26,    /* Same as OPC_MSA */
2137     TX79_SQ        = 0x1F << 26,    /* Same as OPC_SPECIAL3 */
2138 };
2139
2140 /*
2141  * TX79 Multimedia Instructions with opcode field = MMI:
2142  *
2143  *  31    26                                 5      0
2144  * +--------+-------------------------------+--------+
2145  * |   MMI  |                               |function|
2146  * +--------+-------------------------------+--------+
2147  *
2148  * function  bits 2..0
2149  *     bits |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7
2150  *     5..3 |  000  |  001  |  010  |  011  |  100  |  101  |  110  |  111
2151  *   -------+-------+-------+-------+-------+-------+-------+-------+-------
2152  *    0 000 |  MADD | MADDU |   *   |   *   | PLZCW |   *   |   *   |   *
2153  *    1 001 | MMI0% | MMI2% |   *   |   *   |   *   |   *   |   *   |   *
2154  *    2 010 | MFHI1 | MTHI1 | MFLO1 | MTLO1 |   *   |   *   |   *   |   *
2155  *    3 011 | MULT1 | MULTU1|  DIV1 | DIVU1 |   *   |   *   |   *   |   *
2156  *    4 100 | MADD1 | MADDU1|   *   |   *   |   *   |   *   |   *   |   *
2157  *    5 101 | MMI1% | MMI3% |   *   |   *   |   *   |   *   |   *   |   *
2158  *    6 110 | PMFHL | PMTHL |   *   |   *   | PSLLH |   *   | PSRLH | PSRAH
2159  *    7 111 |   *   |   *   |   *   |   *   | PSLLW |   *   | PSRLW | PSRAW
2160  */
2161
2162 #define MASK_TX79_MMI(op) (MASK_OP_MAJOR(op) | ((op) & 0x3F))
2163 enum {
2164     TX79_MMI_MADD       = 0x00 | TX79_CLASS_MMI, /* Same as OPC_MADD */
2165     TX79_MMI_MADDU      = 0x01 | TX79_CLASS_MMI, /* Same as OPC_MADDU */
2166     TX79_MMI_PLZCW      = 0x04 | TX79_CLASS_MMI,
2167     TX79_MMI_CLASS_MMI0 = 0x08 | TX79_CLASS_MMI,
2168     TX79_MMI_CLASS_MMI2 = 0x09 | TX79_CLASS_MMI,
2169     TX79_MMI_MFHI1      = 0x10 | TX79_CLASS_MMI, /* Same minor as OPC_MFHI */
2170     TX79_MMI_MTHI1      = 0x11 | TX79_CLASS_MMI, /* Same minor as OPC_MTHI */
2171     TX79_MMI_MFLO1      = 0x12 | TX79_CLASS_MMI, /* Same minor as OPC_MFLO */
2172     TX79_MMI_MTLO1      = 0x13 | TX79_CLASS_MMI, /* Same minor as OPC_MTLO */
2173     TX79_MMI_MULT1      = 0x18 | TX79_CLASS_MMI, /* Same minor as OPC_MULT */
2174     TX79_MMI_MULTU1     = 0x19 | TX79_CLASS_MMI, /* Same minor as OPC_MULTU */
2175     TX79_MMI_DIV1       = 0x1A | TX79_CLASS_MMI, /* Same minor as OPC_DIV */
2176     TX79_MMI_DIVU1      = 0x1B | TX79_CLASS_MMI, /* Same minor as OPC_DIVU */
2177     TX79_MMI_MADD1      = 0x20 | TX79_CLASS_MMI,
2178     TX79_MMI_MADDU1     = 0x21 | TX79_CLASS_MMI,
2179     TX79_MMI_CLASS_MMI1 = 0x28 | TX79_CLASS_MMI,
2180     TX79_MMI_CLASS_MMI3 = 0x29 | TX79_CLASS_MMI,
2181     TX79_MMI_PMFHL      = 0x30 | TX79_CLASS_MMI,
2182     TX79_MMI_PMTHL      = 0x31 | TX79_CLASS_MMI,
2183     TX79_MMI_PSLLH      = 0x34 | TX79_CLASS_MMI,
2184     TX79_MMI_PSRLH      = 0x36 | TX79_CLASS_MMI,
2185     TX79_MMI_PSRAH      = 0x37 | TX79_CLASS_MMI,
2186     TX79_MMI_PSLLW      = 0x3C | TX79_CLASS_MMI,
2187     TX79_MMI_PSRLW      = 0x3E | TX79_CLASS_MMI,
2188     TX79_MMI_PSRAW      = 0x3F | TX79_CLASS_MMI,
2189 };
2190
2191 /*
2192  * TX79 Multimedia Instructions with opcode field = MMI and bits 5..0 = MMI0:
2193  *
2194  *  31    26                        10     6 5      0
2195  * +--------+----------------------+--------+--------+
2196  * |   MMI  |                      |function|  MMI0  |
2197  * +--------+----------------------+--------+--------+
2198  *
2199  * function  bits 7..6
2200  *     bits |   0   |   1   |   2   |   3
2201  *    10..8 |   00  |   01  |   10  |   11
2202  *   -------+-------+-------+-------+-------
2203  *    0 000 | PADDW | PSUBW | PCGTW | PMAXW
2204  *    1 001 | PADDH | PSUBH | PCGTH | PMAXH
2205  *    2 010 | PADDB | PSUBB | PCGTB |   *
2206  *    3 011 |   *   |   *   |   *   |   *
2207  *    4 100 | PADDSW| PSUBSW| PEXTLW| PPACW
2208  *    5 101 | PADDSH| PSUBSH| PEXTLH| PPACH
2209  *    6 110 | PADDSB| PSUBSB| PEXTLB| PPACB
2210  *    7 111 |   *   |   *   | PEXT5 | PPAC5
2211  */
2212
2213 #define MASK_TX79_MMI0(op) (MASK_OP_MAJOR(op) | ((op) & 0x7FF))
2214 enum {
2215     TX79_MMI0_PADDW  = (0x00 << 6) | TX79_MMI_CLASS_MMI0,
2216     TX79_MMI0_PSUBW  = (0x01 << 6) | TX79_MMI_CLASS_MMI0,
2217     TX79_MMI0_PCGTW  = (0x02 << 6) | TX79_MMI_CLASS_MMI0,
2218     TX79_MMI0_PMAXW  = (0x03 << 6) | TX79_MMI_CLASS_MMI0,
2219     TX79_MMI0_PADDH  = (0x04 << 6) | TX79_MMI_CLASS_MMI0,
2220     TX79_MMI0_PSUBH  = (0x05 << 6) | TX79_MMI_CLASS_MMI0,
2221     TX79_MMI0_PCGTH  = (0x06 << 6) | TX79_MMI_CLASS_MMI0,
2222     TX79_MMI0_PMAXH  = (0x07 << 6) | TX79_MMI_CLASS_MMI0,
2223     TX79_MMI0_PADDB  = (0x08 << 6) | TX79_MMI_CLASS_MMI0,
2224     TX79_MMI0_PSUBB  = (0x09 << 6) | TX79_MMI_CLASS_MMI0,
2225     TX79_MMI0_PCGTB  = (0x0A << 6) | TX79_MMI_CLASS_MMI0,
2226     TX79_MMI0_PADDSW = (0x10 << 6) | TX79_MMI_CLASS_MMI0,
2227     TX79_MMI0_PSUBSW = (0x11 << 6) | TX79_MMI_CLASS_MMI0,
2228     TX79_MMI0_PEXTLW = (0x12 << 6) | TX79_MMI_CLASS_MMI0,
2229     TX79_MMI0_PPACW  = (0x13 << 6) | TX79_MMI_CLASS_MMI0,
2230     TX79_MMI0_PADDSH = (0x14 << 6) | TX79_MMI_CLASS_MMI0,
2231     TX79_MMI0_PSUBSH = (0x15 << 6) | TX79_MMI_CLASS_MMI0,
2232     TX79_MMI0_PEXTLH = (0x16 << 6) | TX79_MMI_CLASS_MMI0,
2233     TX79_MMI0_PPACH  = (0x17 << 6) | TX79_MMI_CLASS_MMI0,
2234     TX79_MMI0_PADDSB = (0x18 << 6) | TX79_MMI_CLASS_MMI0,
2235     TX79_MMI0_PSUBSB = (0x19 << 6) | TX79_MMI_CLASS_MMI0,
2236     TX79_MMI0_PEXTLB = (0x1A << 6) | TX79_MMI_CLASS_MMI0,
2237     TX79_MMI0_PPACB  = (0x1B << 6) | TX79_MMI_CLASS_MMI0,
2238     TX79_MMI0_PEXT5  = (0x1E << 6) | TX79_MMI_CLASS_MMI0,
2239     TX79_MMI0_PPAC5  = (0x1F << 6) | TX79_MMI_CLASS_MMI0,
2240 };
2241
2242 /*
2243  * TX79 Multimedia Instructions with opcode field = MMI and bits 5..0 = MMI1:
2244  *
2245  *  31    26                        10     6 5      0
2246  * +--------+----------------------+--------+--------+
2247  * |   MMI  |                      |function|  MMI1  |
2248  * +--------+----------------------+--------+--------+
2249  *
2250  * function  bits 7..6
2251  *     bits |   0   |   1   |   2   |   3
2252  *    10..8 |   00  |   01  |   10  |   11
2253  *   -------+-------+-------+-------+-------
2254  *    0 000 |   *   | PABSW | PCEQW | PMINW
2255  *    1 001 | PADSBH| PABSH | PCEQH | PMINH
2256  *    2 010 |   *   |   *   | PCEQB |   *
2257  *    3 011 |   *   |   *   |   *   |   *
2258  *    4 100 | PADDUW| PSUBUW| PEXTUW|   *
2259  *    5 101 | PADDUH| PSUBUH| PEXTUH|   *
2260  *    6 110 | PADDUB| PSUBUB| PEXTUB| QFSRV
2261  *    7 111 |   *   |   *   |   *   |   *
2262  */
2263
2264 #define MASK_TX79_MMI1(op) (MASK_OP_MAJOR(op) | ((op) & 0x7FF))
2265 enum {
2266     TX79_MMI1_PABSW  = (0x01 << 6) | TX79_MMI_CLASS_MMI1,
2267     TX79_MMI1_PCEQW  = (0x02 << 6) | TX79_MMI_CLASS_MMI1,
2268     TX79_MMI1_PMINW  = (0x03 << 6) | TX79_MMI_CLASS_MMI1,
2269     TX79_MMI1_PADSBH = (0x04 << 6) | TX79_MMI_CLASS_MMI1,
2270     TX79_MMI1_PABSH  = (0x05 << 6) | TX79_MMI_CLASS_MMI1,
2271     TX79_MMI1_PCEQH  = (0x06 << 6) | TX79_MMI_CLASS_MMI1,
2272     TX79_MMI1_PMINH  = (0x07 << 6) | TX79_MMI_CLASS_MMI1,
2273     TX79_MMI1_PCEQB  = (0x0A << 6) | TX79_MMI_CLASS_MMI1,
2274     TX79_MMI1_PADDUW = (0x10 << 6) | TX79_MMI_CLASS_MMI1,
2275     TX79_MMI1_PSUBUW = (0x11 << 6) | TX79_MMI_CLASS_MMI1,
2276     TX79_MMI1_PEXTUW = (0x12 << 6) | TX79_MMI_CLASS_MMI1,
2277     TX79_MMI1_PADDUH = (0x14 << 6) | TX79_MMI_CLASS_MMI1,
2278     TX79_MMI1_PSUBUH = (0x15 << 6) | TX79_MMI_CLASS_MMI1,
2279     TX79_MMI1_PEXTUH = (0x16 << 6) | TX79_MMI_CLASS_MMI1,
2280     TX79_MMI1_PADDUB = (0x18 << 6) | TX79_MMI_CLASS_MMI1,
2281     TX79_MMI1_PSUBUB = (0x19 << 6) | TX79_MMI_CLASS_MMI1,
2282     TX79_MMI1_PEXTUB = (0x1A << 6) | TX79_MMI_CLASS_MMI1,
2283     TX79_MMI1_QFSRV  = (0x1B << 6) | TX79_MMI_CLASS_MMI1,
2284 };
2285
2286 /*
2287  * TX79 Multimedia Instructions with opcode field = MMI and bits 5..0 = MMI2:
2288  *
2289  *  31    26                        10     6 5      0
2290  * +--------+----------------------+--------+--------+
2291  * |   MMI  |                      |function|  MMI2  |
2292  * +--------+----------------------+--------+--------+
2293  *
2294  * function  bits 7..6
2295  *     bits |   0   |   1   |   2   |   3
2296  *    10..8 |   00  |   01  |   10  |   11
2297  *   -------+-------+-------+-------+-------
2298  *    0 000 | PMADDW|   *   | PSLLVW| PSRLVW
2299  *    1 001 | PMSUBW|   *   |   *   |   *
2300  *    2 010 | PMFHI | PMFLO | PINTH |   *
2301  *    3 011 | PMULTW| PDIVW | PCPYLD|   *
2302  *    4 100 | PMADDH| PHMADH|  PAND |  PXOR
2303  *    5 101 | PMSUBH| PHMSBH|   *   |   *
2304  *    6 110 |   *   |   *   | PEXEH | PREVH
2305  *    7 111 | PMULTH| PDIVBW| PEXEW | PROT3W
2306  */
2307
2308 #define MASK_TX79_MMI2(op) (MASK_OP_MAJOR(op) | ((op) & 0x7FF))
2309 enum {
2310     TX79_MMI2_PMADDW = (0x00 << 6) | TX79_MMI_CLASS_MMI2,
2311     TX79_MMI2_PSLLVW = (0x02 << 6) | TX79_MMI_CLASS_MMI2,
2312     TX79_MMI2_PSRLVW = (0x03 << 6) | TX79_MMI_CLASS_MMI2,
2313     TX79_MMI2_PMSUBW = (0x04 << 6) | TX79_MMI_CLASS_MMI2,
2314     TX79_MMI2_PMFHI  = (0x08 << 6) | TX79_MMI_CLASS_MMI2,
2315     TX79_MMI2_PMFLO  = (0x09 << 6) | TX79_MMI_CLASS_MMI2,
2316     TX79_MMI2_PINTH  = (0x0A << 6) | TX79_MMI_CLASS_MMI2,
2317     TX79_MMI2_PMULTW = (0x0C << 6) | TX79_MMI_CLASS_MMI2,
2318     TX79_MMI2_PDIVW  = (0x0D << 6) | TX79_MMI_CLASS_MMI2,
2319     TX79_MMI2_PCPYLD = (0x0E << 6) | TX79_MMI_CLASS_MMI2,
2320     TX79_MMI2_PMADDH = (0x10 << 6) | TX79_MMI_CLASS_MMI2,
2321     TX79_MMI2_PHMADH = (0x11 << 6) | TX79_MMI_CLASS_MMI2,
2322     TX79_MMI2_PAND   = (0x12 << 6) | TX79_MMI_CLASS_MMI2,
2323     TX79_MMI2_PXOR   = (0x13 << 6) | TX79_MMI_CLASS_MMI2,
2324     TX79_MMI2_PMSUBH = (0x14 << 6) | TX79_MMI_CLASS_MMI2,
2325     TX79_MMI2_PHMSBH = (0x15 << 6) | TX79_MMI_CLASS_MMI2,
2326     TX79_MMI2_PEXEH  = (0x1A << 6) | TX79_MMI_CLASS_MMI2,
2327     TX79_MMI2_PREVH  = (0x1B << 6) | TX79_MMI_CLASS_MMI2,
2328     TX79_MMI2_PMULTH = (0x1C << 6) | TX79_MMI_CLASS_MMI2,
2329     TX79_MMI2_PDIVBW = (0x1D << 6) | TX79_MMI_CLASS_MMI2,
2330     TX79_MMI2_PEXEW  = (0x1E << 6) | TX79_MMI_CLASS_MMI2,
2331     TX79_MMI2_PROT3W = (0x1F << 6) | TX79_MMI_CLASS_MMI2,
2332 };
2333
2334 /*
2335  * TX79 Multimedia Instructions with opcode field = MMI and bits 5..0 = MMI3:
2336  *
2337  *  31    26                        10     6 5      0
2338  * +--------+----------------------+--------+--------+
2339  * |   MMI  |                      |function|  MMI3  |
2340  * +--------+----------------------+--------+--------+
2341  *
2342  * function  bits 7..6
2343  *     bits |   0   |   1   |   2   |   3
2344  *    10..8 |   00  |   01  |   10  |   11
2345  *   -------+-------+-------+-------+-------
2346  *    0 000 |PMADDUW|   *   |   *   | PSRAVW
2347  *    1 001 |   *   |   *   |   *   |   *
2348  *    2 010 | PMTHI | PMTLO | PINTEH|   *
2349  *    3 011 |PMULTUW| PDIVUW| PCPYUD|   *
2350  *    4 100 |   *   |   *   |  POR  |  PNOR
2351  *    5 101 |   *   |   *   |   *   |   *
2352  *    6 110 |   *   |   *   | PEXCH | PCPYH
2353  *    7 111 |   *   |   *   | PEXCW |   *
2354  */
2355
2356 #define MASK_TX79_MMI3(op) (MASK_OP_MAJOR(op) | ((op) & 0x7FF))
2357 enum {
2358     TX79_MMI3_PMADDUW = (0x00 << 6) | TX79_MMI_CLASS_MMI3,
2359     TX79_MMI3_PSRAVW  = (0x03 << 6) | TX79_MMI_CLASS_MMI3,
2360     TX79_MMI3_PMTHI   = (0x08 << 6) | TX79_MMI_CLASS_MMI3,
2361     TX79_MMI3_PMTLO   = (0x09 << 6) | TX79_MMI_CLASS_MMI3,
2362     TX79_MMI3_PINTEH  = (0x0A << 6) | TX79_MMI_CLASS_MMI3,
2363     TX79_MMI3_PMULTUW = (0x0C << 6) | TX79_MMI_CLASS_MMI3,
2364     TX79_MMI3_PDIVUW  = (0x0D << 6) | TX79_MMI_CLASS_MMI3,
2365     TX79_MMI3_PCPYUD  = (0x0E << 6) | TX79_MMI_CLASS_MMI3,
2366     TX79_MMI3_POR     = (0x12 << 6) | TX79_MMI_CLASS_MMI3,
2367     TX79_MMI3_PNOR    = (0x13 << 6) | TX79_MMI_CLASS_MMI3,
2368     TX79_MMI3_PEXCH   = (0x1A << 6) | TX79_MMI_CLASS_MMI3,
2369     TX79_MMI3_PCPYH   = (0x1B << 6) | TX79_MMI_CLASS_MMI3,
2370     TX79_MMI3_PEXCW   = (0x1E << 6) | TX79_MMI_CLASS_MMI3,
2371 };
2372
2373 /* global register indices */
2374 static TCGv cpu_gpr[32], cpu_PC;
2375 static TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC];
2376 static TCGv cpu_dspctrl, btarget, bcond;
2377 static TCGv_i32 hflags;
2378 static TCGv_i32 fpu_fcr0, fpu_fcr31;
2379 static TCGv_i64 fpu_f64[32];
2380 static TCGv_i64 msa_wr_d[64];
2381
2382 #include "exec/gen-icount.h"
2383
2384 #define gen_helper_0e0i(name, arg) do {                           \
2385     TCGv_i32 helper_tmp = tcg_const_i32(arg);                     \
2386     gen_helper_##name(cpu_env, helper_tmp);                       \
2387     tcg_temp_free_i32(helper_tmp);                                \
2388     } while(0)
2389
2390 #define gen_helper_0e1i(name, arg1, arg2) do {                    \
2391     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
2392     gen_helper_##name(cpu_env, arg1, helper_tmp);                 \
2393     tcg_temp_free_i32(helper_tmp);                                \
2394     } while(0)
2395
2396 #define gen_helper_1e0i(name, ret, arg1) do {                     \
2397     TCGv_i32 helper_tmp = tcg_const_i32(arg1);                    \
2398     gen_helper_##name(ret, cpu_env, helper_tmp);                  \
2399     tcg_temp_free_i32(helper_tmp);                                \
2400     } while(0)
2401
2402 #define gen_helper_1e1i(name, ret, arg1, arg2) do {               \
2403     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
2404     gen_helper_##name(ret, cpu_env, arg1, helper_tmp);            \
2405     tcg_temp_free_i32(helper_tmp);                                \
2406     } while(0)
2407
2408 #define gen_helper_0e2i(name, arg1, arg2, arg3) do {              \
2409     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
2410     gen_helper_##name(cpu_env, arg1, arg2, helper_tmp);           \
2411     tcg_temp_free_i32(helper_tmp);                                \
2412     } while(0)
2413
2414 #define gen_helper_1e2i(name, ret, arg1, arg2, arg3) do {         \
2415     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
2416     gen_helper_##name(ret, cpu_env, arg1, arg2, helper_tmp);      \
2417     tcg_temp_free_i32(helper_tmp);                                \
2418     } while(0)
2419
2420 #define gen_helper_0e3i(name, arg1, arg2, arg3, arg4) do {        \
2421     TCGv_i32 helper_tmp = tcg_const_i32(arg4);                    \
2422     gen_helper_##name(cpu_env, arg1, arg2, arg3, helper_tmp);     \
2423     tcg_temp_free_i32(helper_tmp);                                \
2424     } while(0)
2425
2426 typedef struct DisasContext {
2427     DisasContextBase base;
2428     target_ulong saved_pc;
2429     target_ulong page_start;
2430     uint32_t opcode;
2431     uint64_t insn_flags;
2432     int32_t CP0_Config1;
2433     int32_t CP0_Config2;
2434     int32_t CP0_Config3;
2435     int32_t CP0_Config5;
2436     /* Routine used to access memory */
2437     int mem_idx;
2438     TCGMemOp default_tcg_memop_mask;
2439     uint32_t hflags, saved_hflags;
2440     target_ulong btarget;
2441     bool ulri;
2442     int kscrexist;
2443     bool rxi;
2444     int ie;
2445     bool bi;
2446     bool bp;
2447     uint64_t PAMask;
2448     bool mvh;
2449     bool eva;
2450     bool sc;
2451     int CP0_LLAddr_shift;
2452     bool ps;
2453     bool vp;
2454     bool cmgcr;
2455     bool mrp;
2456     bool nan2008;
2457     bool abs2008;
2458 } DisasContext;
2459
2460 #define DISAS_STOP       DISAS_TARGET_0
2461 #define DISAS_EXIT       DISAS_TARGET_1
2462
2463 static const char * const regnames[] = {
2464     "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
2465     "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
2466     "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2467     "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
2468 };
2469
2470 static const char * const regnames_HI[] = {
2471     "HI0", "HI1", "HI2", "HI3",
2472 };
2473
2474 static const char * const regnames_LO[] = {
2475     "LO0", "LO1", "LO2", "LO3",
2476 };
2477
2478 static const char * const fregnames[] = {
2479     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
2480     "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
2481     "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
2482     "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
2483 };
2484
2485 static const char * const msaregnames[] = {
2486     "w0.d0",  "w0.d1",  "w1.d0",  "w1.d1",
2487     "w2.d0",  "w2.d1",  "w3.d0",  "w3.d1",
2488     "w4.d0",  "w4.d1",  "w5.d0",  "w5.d1",
2489     "w6.d0",  "w6.d1",  "w7.d0",  "w7.d1",
2490     "w8.d0",  "w8.d1",  "w9.d0",  "w9.d1",
2491     "w10.d0", "w10.d1", "w11.d0", "w11.d1",
2492     "w12.d0", "w12.d1", "w13.d0", "w13.d1",
2493     "w14.d0", "w14.d1", "w15.d0", "w15.d1",
2494     "w16.d0", "w16.d1", "w17.d0", "w17.d1",
2495     "w18.d0", "w18.d1", "w19.d0", "w19.d1",
2496     "w20.d0", "w20.d1", "w21.d0", "w21.d1",
2497     "w22.d0", "w22.d1", "w23.d0", "w23.d1",
2498     "w24.d0", "w24.d1", "w25.d0", "w25.d1",
2499     "w26.d0", "w26.d1", "w27.d0", "w27.d1",
2500     "w28.d0", "w28.d1", "w29.d0", "w29.d1",
2501     "w30.d0", "w30.d1", "w31.d0", "w31.d1",
2502 };
2503
2504 #define LOG_DISAS(...)                                                        \
2505     do {                                                                      \
2506         if (MIPS_DEBUG_DISAS) {                                               \
2507             qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__);                 \
2508         }                                                                     \
2509     } while (0)
2510
2511 #define MIPS_INVAL(op)                                                        \
2512     do {                                                                      \
2513         if (MIPS_DEBUG_DISAS) {                                               \
2514             qemu_log_mask(CPU_LOG_TB_IN_ASM,                                  \
2515                           TARGET_FMT_lx ": %08x Invalid %s %03x %03x %03x\n", \
2516                           ctx->base.pc_next, ctx->opcode, op,                 \
2517                           ctx->opcode >> 26, ctx->opcode & 0x3F,              \
2518                           ((ctx->opcode >> 16) & 0x1F));                      \
2519         }                                                                     \
2520     } while (0)
2521
2522 /* General purpose registers moves. */
2523 static inline void gen_load_gpr (TCGv t, int reg)
2524 {
2525     if (reg == 0)
2526         tcg_gen_movi_tl(t, 0);
2527     else
2528         tcg_gen_mov_tl(t, cpu_gpr[reg]);
2529 }
2530
2531 static inline void gen_store_gpr (TCGv t, int reg)
2532 {
2533     if (reg != 0)
2534         tcg_gen_mov_tl(cpu_gpr[reg], t);
2535 }
2536
2537 /* Moves to/from shadow registers. */
2538 static inline void gen_load_srsgpr (int from, int to)
2539 {
2540     TCGv t0 = tcg_temp_new();
2541
2542     if (from == 0)
2543         tcg_gen_movi_tl(t0, 0);
2544     else {
2545         TCGv_i32 t2 = tcg_temp_new_i32();
2546         TCGv_ptr addr = tcg_temp_new_ptr();
2547
2548         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
2549         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
2550         tcg_gen_andi_i32(t2, t2, 0xf);
2551         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
2552         tcg_gen_ext_i32_ptr(addr, t2);
2553         tcg_gen_add_ptr(addr, cpu_env, addr);
2554
2555         tcg_gen_ld_tl(t0, addr, sizeof(target_ulong) * from);
2556         tcg_temp_free_ptr(addr);
2557         tcg_temp_free_i32(t2);
2558     }
2559     gen_store_gpr(t0, to);
2560     tcg_temp_free(t0);
2561 }
2562
2563 static inline void gen_store_srsgpr (int from, int to)
2564 {
2565     if (to != 0) {
2566         TCGv t0 = tcg_temp_new();
2567         TCGv_i32 t2 = tcg_temp_new_i32();
2568         TCGv_ptr addr = tcg_temp_new_ptr();
2569
2570         gen_load_gpr(t0, from);
2571         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
2572         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
2573         tcg_gen_andi_i32(t2, t2, 0xf);
2574         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
2575         tcg_gen_ext_i32_ptr(addr, t2);
2576         tcg_gen_add_ptr(addr, cpu_env, addr);
2577
2578         tcg_gen_st_tl(t0, addr, sizeof(target_ulong) * to);
2579         tcg_temp_free_ptr(addr);
2580         tcg_temp_free_i32(t2);
2581         tcg_temp_free(t0);
2582     }
2583 }
2584
2585 /* Tests */
2586 static inline void gen_save_pc(target_ulong pc)
2587 {
2588     tcg_gen_movi_tl(cpu_PC, pc);
2589 }
2590
2591 static inline void save_cpu_state(DisasContext *ctx, int do_save_pc)
2592 {
2593     LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags);
2594     if (do_save_pc && ctx->base.pc_next != ctx->saved_pc) {
2595         gen_save_pc(ctx->base.pc_next);
2596         ctx->saved_pc = ctx->base.pc_next;
2597     }
2598     if (ctx->hflags != ctx->saved_hflags) {
2599         tcg_gen_movi_i32(hflags, ctx->hflags);
2600         ctx->saved_hflags = ctx->hflags;
2601         switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
2602         case MIPS_HFLAG_BR:
2603             break;
2604         case MIPS_HFLAG_BC:
2605         case MIPS_HFLAG_BL:
2606         case MIPS_HFLAG_B:
2607             tcg_gen_movi_tl(btarget, ctx->btarget);
2608             break;
2609         }
2610     }
2611 }
2612
2613 static inline void restore_cpu_state(CPUMIPSState *env, DisasContext *ctx)
2614 {
2615     ctx->saved_hflags = ctx->hflags;
2616     switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
2617     case MIPS_HFLAG_BR:
2618         break;
2619     case MIPS_HFLAG_BC:
2620     case MIPS_HFLAG_BL:
2621     case MIPS_HFLAG_B:
2622         ctx->btarget = env->btarget;
2623         break;
2624     }
2625 }
2626
2627 static inline void generate_exception_err(DisasContext *ctx, int excp, int err)
2628 {
2629     TCGv_i32 texcp = tcg_const_i32(excp);
2630     TCGv_i32 terr = tcg_const_i32(err);
2631     save_cpu_state(ctx, 1);
2632     gen_helper_raise_exception_err(cpu_env, texcp, terr);
2633     tcg_temp_free_i32(terr);
2634     tcg_temp_free_i32(texcp);
2635     ctx->base.is_jmp = DISAS_NORETURN;
2636 }
2637
2638 static inline void generate_exception(DisasContext *ctx, int excp)
2639 {
2640     gen_helper_0e0i(raise_exception, excp);
2641 }
2642
2643 static inline void generate_exception_end(DisasContext *ctx, int excp)
2644 {
2645     generate_exception_err(ctx, excp, 0);
2646 }
2647
2648 /* Floating point register moves. */
2649 static void gen_load_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
2650 {
2651     if (ctx->hflags & MIPS_HFLAG_FRE) {
2652         generate_exception(ctx, EXCP_RI);
2653     }
2654     tcg_gen_extrl_i64_i32(t, fpu_f64[reg]);
2655 }
2656
2657 static void gen_store_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
2658 {
2659     TCGv_i64 t64;
2660     if (ctx->hflags & MIPS_HFLAG_FRE) {
2661         generate_exception(ctx, EXCP_RI);
2662     }
2663     t64 = tcg_temp_new_i64();
2664     tcg_gen_extu_i32_i64(t64, t);
2665     tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 0, 32);
2666     tcg_temp_free_i64(t64);
2667 }
2668
2669 static void gen_load_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
2670 {
2671     if (ctx->hflags & MIPS_HFLAG_F64) {
2672         tcg_gen_extrh_i64_i32(t, fpu_f64[reg]);
2673     } else {
2674         gen_load_fpr32(ctx, t, reg | 1);
2675     }
2676 }
2677
2678 static void gen_store_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
2679 {
2680     if (ctx->hflags & MIPS_HFLAG_F64) {
2681         TCGv_i64 t64 = tcg_temp_new_i64();
2682         tcg_gen_extu_i32_i64(t64, t);
2683         tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 32, 32);
2684         tcg_temp_free_i64(t64);
2685     } else {
2686         gen_store_fpr32(ctx, t, reg | 1);
2687     }
2688 }
2689
2690 static void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
2691 {
2692     if (ctx->hflags & MIPS_HFLAG_F64) {
2693         tcg_gen_mov_i64(t, fpu_f64[reg]);
2694     } else {
2695         tcg_gen_concat32_i64(t, fpu_f64[reg & ~1], fpu_f64[reg | 1]);
2696     }
2697 }
2698
2699 static void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
2700 {
2701     if (ctx->hflags & MIPS_HFLAG_F64) {
2702         tcg_gen_mov_i64(fpu_f64[reg], t);
2703     } else {
2704         TCGv_i64 t0;
2705         tcg_gen_deposit_i64(fpu_f64[reg & ~1], fpu_f64[reg & ~1], t, 0, 32);
2706         t0 = tcg_temp_new_i64();
2707         tcg_gen_shri_i64(t0, t, 32);
2708         tcg_gen_deposit_i64(fpu_f64[reg | 1], fpu_f64[reg | 1], t0, 0, 32);
2709         tcg_temp_free_i64(t0);
2710     }
2711 }
2712
2713 static inline int get_fp_bit (int cc)
2714 {
2715     if (cc)
2716         return 24 + cc;
2717     else
2718         return 23;
2719 }
2720
2721 /* Addresses computation */
2722 static inline void gen_op_addr_add (DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1)
2723 {
2724     tcg_gen_add_tl(ret, arg0, arg1);
2725
2726 #if defined(TARGET_MIPS64)
2727     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
2728         tcg_gen_ext32s_i64(ret, ret);
2729     }
2730 #endif
2731 }
2732
2733 static inline void gen_op_addr_addi(DisasContext *ctx, TCGv ret, TCGv base,
2734                                     target_long ofs)
2735 {
2736     tcg_gen_addi_tl(ret, base, ofs);
2737
2738 #if defined(TARGET_MIPS64)
2739     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
2740         tcg_gen_ext32s_i64(ret, ret);
2741     }
2742 #endif
2743 }
2744
2745 /* Addresses computation (translation time) */
2746 static target_long addr_add(DisasContext *ctx, target_long base,
2747                             target_long offset)
2748 {
2749     target_long sum = base + offset;
2750
2751 #if defined(TARGET_MIPS64)
2752     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
2753         sum = (int32_t)sum;
2754     }
2755 #endif
2756     return sum;
2757 }
2758
2759 /* Sign-extract the low 32-bits to a target_long.  */
2760 static inline void gen_move_low32(TCGv ret, TCGv_i64 arg)
2761 {
2762 #if defined(TARGET_MIPS64)
2763     tcg_gen_ext32s_i64(ret, arg);
2764 #else
2765     tcg_gen_extrl_i64_i32(ret, arg);
2766 #endif
2767 }
2768
2769 /* Sign-extract the high 32-bits to a target_long.  */
2770 static inline void gen_move_high32(TCGv ret, TCGv_i64 arg)
2771 {
2772 #if defined(TARGET_MIPS64)
2773     tcg_gen_sari_i64(ret, arg, 32);
2774 #else
2775     tcg_gen_extrh_i64_i32(ret, arg);
2776 #endif
2777 }
2778
2779 static inline void check_cp0_enabled(DisasContext *ctx)
2780 {
2781     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0)))
2782         generate_exception_err(ctx, EXCP_CpU, 0);
2783 }
2784
2785 static inline void check_cp1_enabled(DisasContext *ctx)
2786 {
2787     if (unlikely(!(ctx->hflags & MIPS_HFLAG_FPU)))
2788         generate_exception_err(ctx, EXCP_CpU, 1);
2789 }
2790
2791 /* Verify that the processor is running with COP1X instructions enabled.
2792    This is associated with the nabla symbol in the MIPS32 and MIPS64
2793    opcode tables.  */
2794
2795 static inline void check_cop1x(DisasContext *ctx)
2796 {
2797     if (unlikely(!(ctx->hflags & MIPS_HFLAG_COP1X)))
2798         generate_exception_end(ctx, EXCP_RI);
2799 }
2800
2801 /* Verify that the processor is running with 64-bit floating-point
2802    operations enabled.  */
2803
2804 static inline void check_cp1_64bitmode(DisasContext *ctx)
2805 {
2806     if (unlikely(~ctx->hflags & (MIPS_HFLAG_F64 | MIPS_HFLAG_COP1X)))
2807         generate_exception_end(ctx, EXCP_RI);
2808 }
2809
2810 /*
2811  * Verify if floating point register is valid; an operation is not defined
2812  * if bit 0 of any register specification is set and the FR bit in the
2813  * Status register equals zero, since the register numbers specify an
2814  * even-odd pair of adjacent coprocessor general registers. When the FR bit
2815  * in the Status register equals one, both even and odd register numbers
2816  * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers.
2817  *
2818  * Multiple 64 bit wide registers can be checked by calling
2819  * gen_op_cp1_registers(freg1 | freg2 | ... | fregN);
2820  */
2821 static inline void check_cp1_registers(DisasContext *ctx, int regs)
2822 {
2823     if (unlikely(!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1)))
2824         generate_exception_end(ctx, EXCP_RI);
2825 }
2826
2827 /* Verify that the processor is running with DSP instructions enabled.
2828    This is enabled by CP0 Status register MX(24) bit.
2829  */
2830
2831 static inline void check_dsp(DisasContext *ctx)
2832 {
2833     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP))) {
2834         if (ctx->insn_flags & ASE_DSP) {
2835             generate_exception_end(ctx, EXCP_DSPDIS);
2836         } else {
2837             generate_exception_end(ctx, EXCP_RI);
2838         }
2839     }
2840 }
2841
2842 static inline void check_dsp_r2(DisasContext *ctx)
2843 {
2844     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP_R2))) {
2845         if (ctx->insn_flags & ASE_DSP) {
2846             generate_exception_end(ctx, EXCP_DSPDIS);
2847         } else {
2848             generate_exception_end(ctx, EXCP_RI);
2849         }
2850     }
2851 }
2852
2853 static inline void check_dsp_r3(DisasContext *ctx)
2854 {
2855     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP_R3))) {
2856         if (ctx->insn_flags & ASE_DSP) {
2857             generate_exception_end(ctx, EXCP_DSPDIS);
2858         } else {
2859             generate_exception_end(ctx, EXCP_RI);
2860         }
2861     }
2862 }
2863
2864 /* This code generates a "reserved instruction" exception if the
2865    CPU does not support the instruction set corresponding to flags. */
2866 static inline void check_insn(DisasContext *ctx, uint64_t flags)
2867 {
2868     if (unlikely(!(ctx->insn_flags & flags))) {
2869         generate_exception_end(ctx, EXCP_RI);
2870     }
2871 }
2872
2873 /* This code generates a "reserved instruction" exception if the
2874    CPU has corresponding flag set which indicates that the instruction
2875    has been removed. */
2876 static inline void check_insn_opc_removed(DisasContext *ctx, uint64_t flags)
2877 {
2878     if (unlikely(ctx->insn_flags & flags)) {
2879         generate_exception_end(ctx, EXCP_RI);
2880     }
2881 }
2882
2883 /*
2884  * The Linux kernel traps certain reserved instruction exceptions to
2885  * emulate the corresponding instructions. QEMU is the kernel in user
2886  * mode, so those traps are emulated by accepting the instructions.
2887  *
2888  * A reserved instruction exception is generated for flagged CPUs if
2889  * QEMU runs in system mode.
2890  */
2891 static inline void check_insn_opc_user_only(DisasContext *ctx, uint64_t flags)
2892 {
2893 #ifndef CONFIG_USER_ONLY
2894     check_insn_opc_removed(ctx, flags);
2895 #endif
2896 }
2897
2898 /* This code generates a "reserved instruction" exception if the
2899    CPU does not support 64-bit paired-single (PS) floating point data type */
2900 static inline void check_ps(DisasContext *ctx)
2901 {
2902     if (unlikely(!ctx->ps)) {
2903         generate_exception(ctx, EXCP_RI);
2904     }
2905     check_cp1_64bitmode(ctx);
2906 }
2907
2908 #ifdef TARGET_MIPS64
2909 /* This code generates a "reserved instruction" exception if 64-bit
2910    instructions are not enabled. */
2911 static inline void check_mips_64(DisasContext *ctx)
2912 {
2913     if (unlikely(!(ctx->hflags & MIPS_HFLAG_64)))
2914         generate_exception_end(ctx, EXCP_RI);
2915 }
2916 #endif
2917
2918 #ifndef CONFIG_USER_ONLY
2919 static inline void check_mvh(DisasContext *ctx)
2920 {
2921     if (unlikely(!ctx->mvh)) {
2922         generate_exception(ctx, EXCP_RI);
2923     }
2924 }
2925 #endif
2926
2927 /*
2928  * This code generates a "reserved instruction" exception if the
2929  * Config5 XNP bit is set.
2930  */
2931 static inline void check_xnp(DisasContext *ctx)
2932 {
2933     if (unlikely(ctx->CP0_Config5 & (1 << CP0C5_XNP))) {
2934         generate_exception_end(ctx, EXCP_RI);
2935     }
2936 }
2937
2938 #ifndef CONFIG_USER_ONLY
2939 /*
2940  * This code generates a "reserved instruction" exception if the
2941  * Config3 PW bit is NOT set.
2942  */
2943 static inline void check_pw(DisasContext *ctx)
2944 {
2945     if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_PW)))) {
2946         generate_exception_end(ctx, EXCP_RI);
2947     }
2948 }
2949 #endif
2950
2951 /*
2952  * This code generates a "reserved instruction" exception if the
2953  * Config3 MT bit is NOT set.
2954  */
2955 static inline void check_mt(DisasContext *ctx)
2956 {
2957     if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_MT)))) {
2958         generate_exception_end(ctx, EXCP_RI);
2959     }
2960 }
2961
2962 #ifndef CONFIG_USER_ONLY
2963 /*
2964  * This code generates a "coprocessor unusable" exception if CP0 is not
2965  * available, and, if that is not the case, generates a "reserved instruction"
2966  * exception if the Config5 MT bit is NOT set. This is needed for availability
2967  * control of some of MT ASE instructions.
2968  */
2969 static inline void check_cp0_mt(DisasContext *ctx)
2970 {
2971     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0))) {
2972         generate_exception_err(ctx, EXCP_CpU, 0);
2973     } else {
2974         if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_MT)))) {
2975             generate_exception_err(ctx, EXCP_RI, 0);
2976         }
2977     }
2978 }
2979 #endif
2980
2981 /*
2982  * This code generates a "reserved instruction" exception if the
2983  * Config5 NMS bit is set.
2984  */
2985 static inline void check_nms(DisasContext *ctx)
2986 {
2987     if (unlikely(ctx->CP0_Config5 & (1 << CP0C5_NMS))) {
2988         generate_exception_end(ctx, EXCP_RI);
2989     }
2990 }
2991
2992 /*
2993  * This code generates a "reserved instruction" exception if the
2994  * Config5 NMS bit is set, and Config1 DL, Config1 IL, Config2 SL,
2995  * Config2 TL, and Config5 L2C are unset.
2996  */
2997 static inline void check_nms_dl_il_sl_tl_l2c(DisasContext *ctx)
2998 {
2999     if (unlikely(ctx->CP0_Config5 & (1 << CP0C5_NMS)) &&
3000         !(ctx->CP0_Config1 & (1 << CP0C1_DL)) &&
3001         !(ctx->CP0_Config1 & (1 << CP0C1_IL)) &&
3002         !(ctx->CP0_Config2 & (1 << CP0C2_SL)) &&
3003         !(ctx->CP0_Config2 & (1 << CP0C2_TL)) &&
3004         !(ctx->CP0_Config5 & (1 << CP0C5_L2C)))
3005     {
3006         generate_exception_end(ctx, EXCP_RI);
3007     }
3008 }
3009
3010 /*
3011  * This code generates a "reserved instruction" exception if the
3012  * Config5 EVA bit is NOT set.
3013  */
3014 static inline void check_eva(DisasContext *ctx)
3015 {
3016     if (unlikely(!(ctx->CP0_Config5 & (1 << CP0C5_EVA)))) {
3017         generate_exception_end(ctx, EXCP_RI);
3018     }
3019 }
3020
3021
3022 /* Define small wrappers for gen_load_fpr* so that we have a uniform
3023    calling interface for 32 and 64-bit FPRs.  No sense in changing
3024    all callers for gen_load_fpr32 when we need the CTX parameter for
3025    this one use.  */
3026 #define gen_ldcmp_fpr32(ctx, x, y) gen_load_fpr32(ctx, x, y)
3027 #define gen_ldcmp_fpr64(ctx, x, y) gen_load_fpr64(ctx, x, y)
3028 #define FOP_CONDS(type, abs, fmt, ifmt, bits)                                 \
3029 static inline void gen_cmp ## type ## _ ## fmt(DisasContext *ctx, int n,      \
3030                                                int ft, int fs, int cc)        \
3031 {                                                                             \
3032     TCGv_i##bits fp0 = tcg_temp_new_i##bits ();                               \
3033     TCGv_i##bits fp1 = tcg_temp_new_i##bits ();                               \
3034     switch (ifmt) {                                                           \
3035     case FMT_PS:                                                              \
3036         check_ps(ctx);                                                        \
3037         break;                                                                \
3038     case FMT_D:                                                               \
3039         if (abs) {                                                            \
3040             check_cop1x(ctx);                                                 \
3041         }                                                                     \
3042         check_cp1_registers(ctx, fs | ft);                                    \
3043         break;                                                                \
3044     case FMT_S:                                                               \
3045         if (abs) {                                                            \
3046             check_cop1x(ctx);                                                 \
3047         }                                                                     \
3048         break;                                                                \
3049     }                                                                         \
3050     gen_ldcmp_fpr##bits (ctx, fp0, fs);                                       \
3051     gen_ldcmp_fpr##bits (ctx, fp1, ft);                                       \
3052     switch (n) {                                                              \
3053     case  0: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc);    break;\
3054     case  1: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc);   break;\
3055     case  2: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc);   break;\
3056     case  3: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc);  break;\
3057     case  4: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc);  break;\
3058     case  5: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc);  break;\
3059     case  6: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc);  break;\
3060     case  7: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc);  break;\
3061     case  8: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc);   break;\
3062     case  9: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc); break;\
3063     case 10: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc);  break;\
3064     case 11: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc);  break;\
3065     case 12: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc);   break;\
3066     case 13: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc);  break;\
3067     case 14: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc);   break;\
3068     case 15: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc);  break;\
3069     default: abort();                                                         \
3070     }                                                                         \
3071     tcg_temp_free_i##bits (fp0);                                              \
3072     tcg_temp_free_i##bits (fp1);                                              \
3073 }
3074
3075 FOP_CONDS(, 0, d, FMT_D, 64)
3076 FOP_CONDS(abs, 1, d, FMT_D, 64)
3077 FOP_CONDS(, 0, s, FMT_S, 32)
3078 FOP_CONDS(abs, 1, s, FMT_S, 32)
3079 FOP_CONDS(, 0, ps, FMT_PS, 64)
3080 FOP_CONDS(abs, 1, ps, FMT_PS, 64)
3081 #undef FOP_CONDS
3082
3083 #define FOP_CONDNS(fmt, ifmt, bits, STORE)                              \
3084 static inline void gen_r6_cmp_ ## fmt(DisasContext * ctx, int n,        \
3085                                       int ft, int fs, int fd)           \
3086 {                                                                       \
3087     TCGv_i ## bits fp0 = tcg_temp_new_i ## bits();                      \
3088     TCGv_i ## bits fp1 = tcg_temp_new_i ## bits();                      \
3089     if (ifmt == FMT_D) {                                                \
3090         check_cp1_registers(ctx, fs | ft | fd);                         \
3091     }                                                                   \
3092     gen_ldcmp_fpr ## bits(ctx, fp0, fs);                                \
3093     gen_ldcmp_fpr ## bits(ctx, fp1, ft);                                \
3094     switch (n) {                                                        \
3095     case  0:                                                            \
3096         gen_helper_r6_cmp_ ## fmt ## _af(fp0, cpu_env, fp0, fp1);       \
3097         break;                                                          \
3098     case  1:                                                            \
3099         gen_helper_r6_cmp_ ## fmt ## _un(fp0, cpu_env, fp0, fp1);       \
3100         break;                                                          \
3101     case  2:                                                            \
3102         gen_helper_r6_cmp_ ## fmt ## _eq(fp0, cpu_env, fp0, fp1);       \
3103         break;                                                          \
3104     case  3:                                                            \
3105         gen_helper_r6_cmp_ ## fmt ## _ueq(fp0, cpu_env, fp0, fp1);      \
3106         break;                                                          \
3107     case  4:                                                            \
3108         gen_helper_r6_cmp_ ## fmt ## _lt(fp0, cpu_env, fp0, fp1);       \
3109         break;                                                          \
3110     case  5:                                                            \
3111         gen_helper_r6_cmp_ ## fmt ## _ult(fp0, cpu_env, fp0, fp1);      \
3112         break;                                                          \
3113     case  6:                                                            \
3114         gen_helper_r6_cmp_ ## fmt ## _le(fp0, cpu_env, fp0, fp1);       \
3115         break;                                                          \
3116     case  7:                                                            \
3117         gen_helper_r6_cmp_ ## fmt ## _ule(fp0, cpu_env, fp0, fp1);      \
3118         break;                                                          \
3119     case  8:                                                            \
3120         gen_helper_r6_cmp_ ## fmt ## _saf(fp0, cpu_env, fp0, fp1);      \
3121         break;                                                          \
3122     case  9:                                                            \
3123         gen_helper_r6_cmp_ ## fmt ## _sun(fp0, cpu_env, fp0, fp1);      \
3124         break;                                                          \
3125     case 10:                                                            \
3126         gen_helper_r6_cmp_ ## fmt ## _seq(fp0, cpu_env, fp0, fp1);      \
3127         break;                                                          \
3128     case 11:                                                            \
3129         gen_helper_r6_cmp_ ## fmt ## _sueq(fp0, cpu_env, fp0, fp1);     \
3130         break;                                                          \
3131     case 12:                                                            \
3132         gen_helper_r6_cmp_ ## fmt ## _slt(fp0, cpu_env, fp0, fp1);      \
3133         break;                                                          \
3134     case 13:                                                            \
3135         gen_helper_r6_cmp_ ## fmt ## _sult(fp0, cpu_env, fp0, fp1);     \
3136         break;                                                          \
3137     case 14:                                                            \
3138         gen_helper_r6_cmp_ ## fmt ## _sle(fp0, cpu_env, fp0, fp1);      \
3139         break;                                                          \
3140     case 15:                                                            \
3141         gen_helper_r6_cmp_ ## fmt ## _sule(fp0, cpu_env, fp0, fp1);     \
3142         break;                                                          \
3143     case 17:                                                            \
3144         gen_helper_r6_cmp_ ## fmt ## _or(fp0, cpu_env, fp0, fp1);       \
3145         break;                                                          \
3146     case 18:                                                            \
3147         gen_helper_r6_cmp_ ## fmt ## _une(fp0, cpu_env, fp0, fp1);      \
3148         break;                                                          \
3149     case 19:                                                            \
3150         gen_helper_r6_cmp_ ## fmt ## _ne(fp0, cpu_env, fp0, fp1);       \
3151         break;                                                          \
3152     case 25:                                                            \
3153         gen_helper_r6_cmp_ ## fmt ## _sor(fp0, cpu_env, fp0, fp1);      \
3154         break;                                                          \
3155     case 26:                                                            \
3156         gen_helper_r6_cmp_ ## fmt ## _sune(fp0, cpu_env, fp0, fp1);     \
3157         break;                                                          \
3158     case 27:                                                            \
3159         gen_helper_r6_cmp_ ## fmt ## _sne(fp0, cpu_env, fp0, fp1);      \
3160         break;                                                          \
3161     default:                                                            \
3162         abort();                                                        \
3163     }                                                                   \
3164     STORE;                                                              \
3165     tcg_temp_free_i ## bits (fp0);                                      \
3166     tcg_temp_free_i ## bits (fp1);                                      \
3167 }
3168
3169 FOP_CONDNS(d, FMT_D, 64, gen_store_fpr64(ctx, fp0, fd))
3170 FOP_CONDNS(s, FMT_S, 32, gen_store_fpr32(ctx, fp0, fd))
3171 #undef FOP_CONDNS
3172 #undef gen_ldcmp_fpr32
3173 #undef gen_ldcmp_fpr64
3174
3175 /* load/store instructions. */
3176 #ifdef CONFIG_USER_ONLY
3177 #define OP_LD_ATOMIC(insn,fname)                                           \
3178 static inline void op_ld_##insn(TCGv ret, TCGv arg1, int mem_idx,          \
3179                                 DisasContext *ctx)                         \
3180 {                                                                          \
3181     TCGv t0 = tcg_temp_new();                                              \
3182     tcg_gen_mov_tl(t0, arg1);                                              \
3183     tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                         \
3184     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                \
3185     tcg_gen_st_tl(ret, cpu_env, offsetof(CPUMIPSState, llval));                \
3186     tcg_temp_free(t0);                                                     \
3187 }
3188 #else
3189 #define OP_LD_ATOMIC(insn,fname)                                           \
3190 static inline void op_ld_##insn(TCGv ret, TCGv arg1, int mem_idx,          \
3191                                 DisasContext *ctx)                         \
3192 {                                                                          \
3193     gen_helper_1e1i(insn, ret, arg1, mem_idx);                             \
3194 }
3195 #endif
3196 OP_LD_ATOMIC(ll,ld32s);
3197 #if defined(TARGET_MIPS64)
3198 OP_LD_ATOMIC(lld,ld64);
3199 #endif
3200 #undef OP_LD_ATOMIC
3201
3202 #ifdef CONFIG_USER_ONLY
3203 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
3204 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, int mem_idx,   \
3205                                 DisasContext *ctx)                           \
3206 {                                                                            \
3207     TCGv t0 = tcg_temp_new();                                                \
3208     TCGLabel *l1 = gen_new_label();                                          \
3209     TCGLabel *l2 = gen_new_label();                                          \
3210                                                                              \
3211     tcg_gen_andi_tl(t0, arg2, almask);                                       \
3212     tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1);                              \
3213     tcg_gen_st_tl(arg2, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));          \
3214     generate_exception(ctx, EXCP_AdES);                                      \
3215     gen_set_label(l1);                                                       \
3216     tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                  \
3217     tcg_gen_brcond_tl(TCG_COND_NE, arg2, t0, l2);                            \
3218     tcg_gen_movi_tl(t0, rt | ((almask << 3) & 0x20));                        \
3219     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, llreg));                   \
3220     tcg_gen_st_tl(arg1, cpu_env, offsetof(CPUMIPSState, llnewval));              \
3221     generate_exception_end(ctx, EXCP_SC);                                    \
3222     gen_set_label(l2);                                                       \
3223     tcg_gen_movi_tl(t0, 0);                                                  \
3224     gen_store_gpr(t0, rt);                                                   \
3225     tcg_temp_free(t0);                                                       \
3226 }
3227 #else
3228 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
3229 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, int mem_idx,   \
3230                                 DisasContext *ctx)                           \
3231 {                                                                            \
3232     TCGv t0 = tcg_temp_new();                                                \
3233     gen_helper_1e2i(insn, t0, arg1, arg2, mem_idx);                          \
3234     gen_store_gpr(t0, rt);                                                   \
3235     tcg_temp_free(t0);                                                       \
3236 }
3237 #endif
3238 OP_ST_ATOMIC(sc,st32,ld32s,0x3);
3239 #if defined(TARGET_MIPS64)
3240 OP_ST_ATOMIC(scd,st64,ld64,0x7);
3241 #endif
3242 #undef OP_ST_ATOMIC
3243
3244 static void gen_base_offset_addr (DisasContext *ctx, TCGv addr,
3245                                   int base, int offset)
3246 {
3247     if (base == 0) {
3248         tcg_gen_movi_tl(addr, offset);
3249     } else if (offset == 0) {
3250         gen_load_gpr(addr, base);
3251     } else {
3252         tcg_gen_movi_tl(addr, offset);
3253         gen_op_addr_add(ctx, addr, cpu_gpr[base], addr);
3254     }
3255 }
3256
3257 static target_ulong pc_relative_pc (DisasContext *ctx)
3258 {
3259     target_ulong pc = ctx->base.pc_next;
3260
3261     if (ctx->hflags & MIPS_HFLAG_BMASK) {
3262         int branch_bytes = ctx->hflags & MIPS_HFLAG_BDS16 ? 2 : 4;
3263
3264         pc -= branch_bytes;
3265     }
3266
3267     pc &= ~(target_ulong)3;
3268     return pc;
3269 }
3270
3271 /* Load */
3272 static void gen_ld(DisasContext *ctx, uint32_t opc,
3273                    int rt, int base, int offset)
3274 {
3275     TCGv t0, t1, t2;
3276     int mem_idx = ctx->mem_idx;
3277
3278     if (rt == 0 && ctx->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)) {
3279         /* Loongson CPU uses a load to zero register for prefetch.
3280            We emulate it as a NOP. On other CPU we must perform the
3281            actual memory access. */
3282         return;
3283     }
3284
3285     t0 = tcg_temp_new();
3286     gen_base_offset_addr(ctx, t0, base, offset);
3287
3288     switch (opc) {
3289 #if defined(TARGET_MIPS64)
3290     case OPC_LWU:
3291         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL |
3292                            ctx->default_tcg_memop_mask);
3293         gen_store_gpr(t0, rt);
3294         break;
3295     case OPC_LD:
3296         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ |
3297                            ctx->default_tcg_memop_mask);
3298         gen_store_gpr(t0, rt);
3299         break;
3300     case OPC_LLD:
3301     case R6_OPC_LLD:
3302         op_ld_lld(t0, t0, mem_idx, ctx);
3303         gen_store_gpr(t0, rt);
3304         break;
3305     case OPC_LDL:
3306         t1 = tcg_temp_new();
3307         /* Do a byte access to possibly trigger a page
3308            fault with the unaligned address.  */
3309         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
3310         tcg_gen_andi_tl(t1, t0, 7);
3311 #ifndef TARGET_WORDS_BIGENDIAN
3312         tcg_gen_xori_tl(t1, t1, 7);
3313 #endif
3314         tcg_gen_shli_tl(t1, t1, 3);
3315         tcg_gen_andi_tl(t0, t0, ~7);
3316         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
3317         tcg_gen_shl_tl(t0, t0, t1);
3318         t2 = tcg_const_tl(-1);
3319         tcg_gen_shl_tl(t2, t2, t1);
3320         gen_load_gpr(t1, rt);
3321         tcg_gen_andc_tl(t1, t1, t2);
3322         tcg_temp_free(t2);
3323         tcg_gen_or_tl(t0, t0, t1);
3324         tcg_temp_free(t1);
3325         gen_store_gpr(t0, rt);
3326         break;
3327     case OPC_LDR:
3328         t1 = tcg_temp_new();
3329         /* Do a byte access to possibly trigger a page
3330            fault with the unaligned address.  */
3331         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
3332         tcg_gen_andi_tl(t1, t0, 7);
3333 #ifdef TARGET_WORDS_BIGENDIAN
3334         tcg_gen_xori_tl(t1, t1, 7);
3335 #endif
3336         tcg_gen_shli_tl(t1, t1, 3);
3337         tcg_gen_andi_tl(t0, t0, ~7);
3338         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
3339         tcg_gen_shr_tl(t0, t0, t1);
3340         tcg_gen_xori_tl(t1, t1, 63);
3341         t2 = tcg_const_tl(0xfffffffffffffffeull);
3342         tcg_gen_shl_tl(t2, t2, t1);
3343         gen_load_gpr(t1, rt);
3344         tcg_gen_and_tl(t1, t1, t2);
3345         tcg_temp_free(t2);
3346         tcg_gen_or_tl(t0, t0, t1);
3347         tcg_temp_free(t1);
3348         gen_store_gpr(t0, rt);
3349         break;
3350     case OPC_LDPC:
3351         t1 = tcg_const_tl(pc_relative_pc(ctx));
3352         gen_op_addr_add(ctx, t0, t0, t1);
3353         tcg_temp_free(t1);
3354         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
3355         gen_store_gpr(t0, rt);
3356         break;
3357 #endif
3358     case OPC_LWPC:
3359         t1 = tcg_const_tl(pc_relative_pc(ctx));
3360         gen_op_addr_add(ctx, t0, t0, t1);
3361         tcg_temp_free(t1);
3362         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESL);
3363         gen_store_gpr(t0, rt);
3364         break;
3365     case OPC_LWE:
3366         mem_idx = MIPS_HFLAG_UM;
3367         /* fall through */
3368     case OPC_LW:
3369         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESL |
3370                            ctx->default_tcg_memop_mask);
3371         gen_store_gpr(t0, rt);
3372         break;
3373     case OPC_LHE:
3374         mem_idx = MIPS_HFLAG_UM;
3375         /* fall through */
3376     case OPC_LH:
3377         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESW |
3378                            ctx->default_tcg_memop_mask);
3379         gen_store_gpr(t0, rt);
3380         break;
3381     case OPC_LHUE:
3382         mem_idx = MIPS_HFLAG_UM;
3383         /* fall through */
3384     case OPC_LHU:
3385         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUW |
3386                            ctx->default_tcg_memop_mask);
3387         gen_store_gpr(t0, rt);
3388         break;
3389     case OPC_LBE:
3390         mem_idx = MIPS_HFLAG_UM;
3391         /* fall through */
3392     case OPC_LB:
3393         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_SB);
3394         gen_store_gpr(t0, rt);
3395         break;
3396     case OPC_LBUE:
3397         mem_idx = MIPS_HFLAG_UM;
3398         /* fall through */
3399     case OPC_LBU:
3400         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_UB);
3401         gen_store_gpr(t0, rt);
3402         break;
3403     case OPC_LWLE:
3404         mem_idx = MIPS_HFLAG_UM;
3405         /* fall through */
3406     case OPC_LWL:
3407         t1 = tcg_temp_new();
3408         /* Do a byte access to possibly trigger a page
3409            fault with the unaligned address.  */
3410         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
3411         tcg_gen_andi_tl(t1, t0, 3);
3412 #ifndef TARGET_WORDS_BIGENDIAN
3413         tcg_gen_xori_tl(t1, t1, 3);
3414 #endif
3415         tcg_gen_shli_tl(t1, t1, 3);
3416         tcg_gen_andi_tl(t0, t0, ~3);
3417         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL);
3418         tcg_gen_shl_tl(t0, t0, t1);
3419         t2 = tcg_const_tl(-1);
3420         tcg_gen_shl_tl(t2, t2, t1);
3421         gen_load_gpr(t1, rt);
3422         tcg_gen_andc_tl(t1, t1, t2);
3423         tcg_temp_free(t2);
3424         tcg_gen_or_tl(t0, t0, t1);
3425         tcg_temp_free(t1);
3426         tcg_gen_ext32s_tl(t0, t0);
3427         gen_store_gpr(t0, rt);
3428         break;
3429     case OPC_LWRE:
3430         mem_idx = MIPS_HFLAG_UM;
3431         /* fall through */
3432     case OPC_LWR:
3433         t1 = tcg_temp_new();
3434         /* Do a byte access to possibly trigger a page
3435            fault with the unaligned address.  */
3436         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
3437         tcg_gen_andi_tl(t1, t0, 3);
3438 #ifdef TARGET_WORDS_BIGENDIAN
3439         tcg_gen_xori_tl(t1, t1, 3);
3440 #endif
3441         tcg_gen_shli_tl(t1, t1, 3);
3442         tcg_gen_andi_tl(t0, t0, ~3);
3443         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL);
3444         tcg_gen_shr_tl(t0, t0, t1);
3445         tcg_gen_xori_tl(t1, t1, 31);
3446         t2 = tcg_const_tl(0xfffffffeull);
3447         tcg_gen_shl_tl(t2, t2, t1);
3448         gen_load_gpr(t1, rt);
3449         tcg_gen_and_tl(t1, t1, t2);
3450         tcg_temp_free(t2);
3451         tcg_gen_or_tl(t0, t0, t1);
3452         tcg_temp_free(t1);
3453         tcg_gen_ext32s_tl(t0, t0);
3454         gen_store_gpr(t0, rt);
3455         break;
3456     case OPC_LLE:
3457         mem_idx = MIPS_HFLAG_UM;
3458         /* fall through */
3459     case OPC_LL:
3460     case R6_OPC_LL:
3461         op_ld_ll(t0, t0, mem_idx, ctx);
3462         gen_store_gpr(t0, rt);
3463         break;
3464     }
3465     tcg_temp_free(t0);
3466 }
3467
3468 static void gen_llwp(DisasContext *ctx, uint32_t base, int16_t offset,
3469                     uint32_t reg1, uint32_t reg2)
3470 {
3471     TCGv taddr = tcg_temp_new();
3472     TCGv_i64 tval = tcg_temp_new_i64();
3473     TCGv tmp1 = tcg_temp_new();
3474     TCGv tmp2 = tcg_temp_new();
3475
3476     gen_base_offset_addr(ctx, taddr, base, offset);
3477     tcg_gen_qemu_ld64(tval, taddr, ctx->mem_idx);
3478 #ifdef TARGET_WORDS_BIGENDIAN
3479     tcg_gen_extr_i64_tl(tmp2, tmp1, tval);
3480 #else
3481     tcg_gen_extr_i64_tl(tmp1, tmp2, tval);
3482 #endif
3483     gen_store_gpr(tmp1, reg1);
3484     tcg_temp_free(tmp1);
3485     gen_store_gpr(tmp2, reg2);
3486     tcg_temp_free(tmp2);
3487     tcg_gen_st_i64(tval, cpu_env, offsetof(CPUMIPSState, llval_wp));
3488     tcg_temp_free_i64(tval);
3489     tcg_gen_st_tl(taddr, cpu_env, offsetof(CPUMIPSState, lladdr));
3490     tcg_temp_free(taddr);
3491 }
3492
3493 /* Store */
3494 static void gen_st (DisasContext *ctx, uint32_t opc, int rt,
3495                     int base, int offset)
3496 {
3497     TCGv t0 = tcg_temp_new();
3498     TCGv t1 = tcg_temp_new();
3499     int mem_idx = ctx->mem_idx;
3500
3501     gen_base_offset_addr(ctx, t0, base, offset);
3502     gen_load_gpr(t1, rt);
3503     switch (opc) {
3504 #if defined(TARGET_MIPS64)
3505     case OPC_SD:
3506         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEQ |
3507                            ctx->default_tcg_memop_mask);
3508         break;
3509     case OPC_SDL:
3510         gen_helper_0e2i(sdl, t1, t0, mem_idx);
3511         break;
3512     case OPC_SDR:
3513         gen_helper_0e2i(sdr, t1, t0, mem_idx);
3514         break;
3515 #endif
3516     case OPC_SWE:
3517         mem_idx = MIPS_HFLAG_UM;
3518         /* fall through */
3519     case OPC_SW:
3520         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEUL |
3521                            ctx->default_tcg_memop_mask);
3522         break;
3523     case OPC_SHE:
3524         mem_idx = MIPS_HFLAG_UM;
3525         /* fall through */
3526     case OPC_SH:
3527         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEUW |
3528                            ctx->default_tcg_memop_mask);
3529         break;
3530     case OPC_SBE:
3531         mem_idx = MIPS_HFLAG_UM;
3532         /* fall through */
3533     case OPC_SB:
3534         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_8);
3535         break;
3536     case OPC_SWLE:
3537         mem_idx = MIPS_HFLAG_UM;
3538         /* fall through */
3539     case OPC_SWL:
3540         gen_helper_0e2i(swl, t1, t0, mem_idx);
3541         break;
3542     case OPC_SWRE:
3543         mem_idx = MIPS_HFLAG_UM;
3544         /* fall through */
3545     case OPC_SWR:
3546         gen_helper_0e2i(swr, t1, t0, mem_idx);
3547         break;
3548     }
3549     tcg_temp_free(t0);
3550     tcg_temp_free(t1);
3551 }
3552
3553
3554 /* Store conditional */
3555 static void gen_st_cond (DisasContext *ctx, uint32_t opc, int rt,
3556                          int base, int16_t offset)
3557 {
3558     TCGv t0, t1;
3559     int mem_idx = ctx->mem_idx;
3560
3561 #ifdef CONFIG_USER_ONLY
3562     t0 = tcg_temp_local_new();
3563     t1 = tcg_temp_local_new();
3564 #else
3565     t0 = tcg_temp_new();
3566     t1 = tcg_temp_new();
3567 #endif
3568     gen_base_offset_addr(ctx, t0, base, offset);
3569     gen_load_gpr(t1, rt);
3570     switch (opc) {
3571 #if defined(TARGET_MIPS64)
3572     case OPC_SCD:
3573     case R6_OPC_SCD:
3574         op_st_scd(t1, t0, rt, mem_idx, ctx);
3575         break;
3576 #endif
3577     case OPC_SCE:
3578         mem_idx = MIPS_HFLAG_UM;
3579         /* fall through */
3580     case OPC_SC:
3581     case R6_OPC_SC:
3582         op_st_sc(t1, t0, rt, mem_idx, ctx);
3583         break;
3584     }
3585     tcg_temp_free(t1);
3586     tcg_temp_free(t0);
3587 }
3588
3589 static void gen_scwp(DisasContext *ctx, uint32_t base, int16_t offset,
3590                     uint32_t reg1, uint32_t reg2)
3591 {
3592     TCGv taddr = tcg_temp_local_new();
3593     TCGv lladdr = tcg_temp_local_new();
3594     TCGv_i64 tval = tcg_temp_new_i64();
3595     TCGv_i64 llval = tcg_temp_new_i64();
3596     TCGv_i64 val = tcg_temp_new_i64();
3597     TCGv tmp1 = tcg_temp_new();
3598     TCGv tmp2 = tcg_temp_new();
3599     TCGLabel *lab_fail = gen_new_label();
3600     TCGLabel *lab_done = gen_new_label();
3601
3602     gen_base_offset_addr(ctx, taddr, base, offset);
3603
3604     tcg_gen_ld_tl(lladdr, cpu_env, offsetof(CPUMIPSState, lladdr));
3605     tcg_gen_brcond_tl(TCG_COND_NE, taddr, lladdr, lab_fail);
3606
3607     gen_load_gpr(tmp1, reg1);
3608     gen_load_gpr(tmp2, reg2);
3609
3610 #ifdef TARGET_WORDS_BIGENDIAN
3611     tcg_gen_concat_tl_i64(tval, tmp2, tmp1);
3612 #else
3613     tcg_gen_concat_tl_i64(tval, tmp1, tmp2);
3614 #endif
3615
3616     tcg_gen_ld_i64(llval, cpu_env, offsetof(CPUMIPSState, llval_wp));
3617     tcg_gen_atomic_cmpxchg_i64(val, taddr, llval, tval,
3618                                ctx->mem_idx, MO_64);
3619     if (reg1 != 0) {
3620         tcg_gen_movi_tl(cpu_gpr[reg1], 1);
3621     }
3622     tcg_gen_brcond_i64(TCG_COND_EQ, val, llval, lab_done);
3623
3624     gen_set_label(lab_fail);
3625
3626     if (reg1 != 0) {
3627         tcg_gen_movi_tl(cpu_gpr[reg1], 0);
3628     }
3629     gen_set_label(lab_done);
3630     tcg_gen_movi_tl(lladdr, -1);
3631     tcg_gen_st_tl(lladdr, cpu_env, offsetof(CPUMIPSState, lladdr));
3632 }
3633
3634 /* Load and store */
3635 static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
3636                           TCGv t0)
3637 {
3638     /* Don't do NOP if destination is zero: we must perform the actual
3639        memory access. */
3640     switch (opc) {
3641     case OPC_LWC1:
3642         {
3643             TCGv_i32 fp0 = tcg_temp_new_i32();
3644             tcg_gen_qemu_ld_i32(fp0, t0, ctx->mem_idx, MO_TESL |
3645                                 ctx->default_tcg_memop_mask);
3646             gen_store_fpr32(ctx, fp0, ft);
3647             tcg_temp_free_i32(fp0);
3648         }
3649         break;
3650     case OPC_SWC1:
3651         {
3652             TCGv_i32 fp0 = tcg_temp_new_i32();
3653             gen_load_fpr32(ctx, fp0, ft);
3654             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL |
3655                                 ctx->default_tcg_memop_mask);
3656             tcg_temp_free_i32(fp0);
3657         }
3658         break;
3659     case OPC_LDC1:
3660         {
3661             TCGv_i64 fp0 = tcg_temp_new_i64();
3662             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
3663                                 ctx->default_tcg_memop_mask);
3664             gen_store_fpr64(ctx, fp0, ft);
3665             tcg_temp_free_i64(fp0);
3666         }
3667         break;
3668     case OPC_SDC1:
3669         {
3670             TCGv_i64 fp0 = tcg_temp_new_i64();
3671             gen_load_fpr64(ctx, fp0, ft);
3672             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
3673                                 ctx->default_tcg_memop_mask);
3674             tcg_temp_free_i64(fp0);
3675         }
3676         break;
3677     default:
3678         MIPS_INVAL("flt_ldst");
3679         generate_exception_end(ctx, EXCP_RI);
3680         break;
3681     }
3682 }
3683
3684 static void gen_cop1_ldst(DisasContext *ctx, uint32_t op, int rt,
3685                           int rs, int16_t imm)
3686 {
3687     TCGv t0 = tcg_temp_new();
3688
3689     if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
3690         check_cp1_enabled(ctx);
3691         switch (op) {
3692         case OPC_LDC1:
3693         case OPC_SDC1:
3694             check_insn(ctx, ISA_MIPS2);
3695             /* Fallthrough */
3696         default:
3697             gen_base_offset_addr(ctx, t0, rs, imm);
3698             gen_flt_ldst(ctx, op, rt, t0);
3699         }
3700     } else {
3701         generate_exception_err(ctx, EXCP_CpU, 1);
3702     }
3703     tcg_temp_free(t0);
3704 }
3705
3706 /* Arithmetic with immediate operand */
3707 static void gen_arith_imm(DisasContext *ctx, uint32_t opc,
3708                           int rt, int rs, int imm)
3709 {
3710     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
3711
3712     if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) {
3713         /* If no destination, treat it as a NOP.
3714            For addi, we must generate the overflow exception when needed. */
3715         return;
3716     }
3717     switch (opc) {
3718     case OPC_ADDI:
3719         {
3720             TCGv t0 = tcg_temp_local_new();
3721             TCGv t1 = tcg_temp_new();
3722             TCGv t2 = tcg_temp_new();
3723             TCGLabel *l1 = gen_new_label();
3724
3725             gen_load_gpr(t1, rs);
3726             tcg_gen_addi_tl(t0, t1, uimm);
3727             tcg_gen_ext32s_tl(t0, t0);
3728
3729             tcg_gen_xori_tl(t1, t1, ~uimm);
3730             tcg_gen_xori_tl(t2, t0, uimm);
3731             tcg_gen_and_tl(t1, t1, t2);
3732             tcg_temp_free(t2);
3733             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
3734             tcg_temp_free(t1);
3735             /* operands of same sign, result different sign */
3736             generate_exception(ctx, EXCP_OVERFLOW);
3737             gen_set_label(l1);
3738             tcg_gen_ext32s_tl(t0, t0);
3739             gen_store_gpr(t0, rt);
3740             tcg_temp_free(t0);
3741         }
3742         break;
3743     case OPC_ADDIU:
3744         if (rs != 0) {
3745             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
3746             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
3747         } else {
3748             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
3749         }
3750         break;
3751 #if defined(TARGET_MIPS64)
3752     case OPC_DADDI:
3753         {
3754             TCGv t0 = tcg_temp_local_new();
3755             TCGv t1 = tcg_temp_new();
3756             TCGv t2 = tcg_temp_new();
3757             TCGLabel *l1 = gen_new_label();
3758
3759             gen_load_gpr(t1, rs);
3760             tcg_gen_addi_tl(t0, t1, uimm);
3761
3762             tcg_gen_xori_tl(t1, t1, ~uimm);
3763             tcg_gen_xori_tl(t2, t0, uimm);
3764             tcg_gen_and_tl(t1, t1, t2);
3765             tcg_temp_free(t2);
3766             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
3767             tcg_temp_free(t1);
3768             /* operands of same sign, result different sign */
3769             generate_exception(ctx, EXCP_OVERFLOW);
3770             gen_set_label(l1);
3771             gen_store_gpr(t0, rt);
3772             tcg_temp_free(t0);
3773         }
3774         break;
3775     case OPC_DADDIU:
3776         if (rs != 0) {
3777             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
3778         } else {
3779             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
3780         }
3781         break;
3782 #endif
3783     }
3784 }
3785
3786 /* Logic with immediate operand */
3787 static void gen_logic_imm(DisasContext *ctx, uint32_t opc,
3788                           int rt, int rs, int16_t imm)
3789 {
3790     target_ulong uimm;
3791
3792     if (rt == 0) {
3793         /* If no destination, treat it as a NOP. */
3794         return;
3795     }
3796     uimm = (uint16_t)imm;
3797     switch (opc) {
3798     case OPC_ANDI:
3799         if (likely(rs != 0))
3800             tcg_gen_andi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
3801         else
3802             tcg_gen_movi_tl(cpu_gpr[rt], 0);
3803         break;
3804     case OPC_ORI:
3805         if (rs != 0)
3806             tcg_gen_ori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
3807         else
3808             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
3809         break;
3810     case OPC_XORI:
3811         if (likely(rs != 0))
3812             tcg_gen_xori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
3813         else
3814             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
3815         break;
3816     case OPC_LUI:
3817         if (rs != 0 && (ctx->insn_flags & ISA_MIPS32R6)) {
3818             /* OPC_AUI */
3819             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], imm << 16);
3820             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
3821         } else {
3822             tcg_gen_movi_tl(cpu_gpr[rt], imm << 16);
3823         }
3824         break;
3825
3826     default:
3827         break;
3828     }
3829 }
3830
3831 /* Set on less than with immediate operand */
3832 static void gen_slt_imm(DisasContext *ctx, uint32_t opc,
3833                         int rt, int rs, int16_t imm)
3834 {
3835     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
3836     TCGv t0;
3837
3838     if (rt == 0) {
3839         /* If no destination, treat it as a NOP. */
3840         return;
3841     }
3842     t0 = tcg_temp_new();
3843     gen_load_gpr(t0, rs);
3844     switch (opc) {
3845     case OPC_SLTI:
3846         tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr[rt], t0, uimm);
3847         break;
3848     case OPC_SLTIU:
3849         tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr[rt], t0, uimm);
3850         break;
3851     }
3852     tcg_temp_free(t0);
3853 }
3854
3855 /* Shifts with immediate operand */
3856 static void gen_shift_imm(DisasContext *ctx, uint32_t opc,
3857                           int rt, int rs, int16_t imm)
3858 {
3859     target_ulong uimm = ((uint16_t)imm) & 0x1f;
3860     TCGv t0;
3861
3862     if (rt == 0) {
3863         /* If no destination, treat it as a NOP. */
3864         return;
3865     }
3866
3867     t0 = tcg_temp_new();
3868     gen_load_gpr(t0, rs);
3869     switch (opc) {
3870     case OPC_SLL:
3871         tcg_gen_shli_tl(t0, t0, uimm);
3872         tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
3873         break;
3874     case OPC_SRA:
3875         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
3876         break;
3877     case OPC_SRL:
3878         if (uimm != 0) {
3879             tcg_gen_ext32u_tl(t0, t0);
3880             tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
3881         } else {
3882             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
3883         }
3884         break;
3885     case OPC_ROTR:
3886         if (uimm != 0) {
3887             TCGv_i32 t1 = tcg_temp_new_i32();
3888
3889             tcg_gen_trunc_tl_i32(t1, t0);
3890             tcg_gen_rotri_i32(t1, t1, uimm);
3891             tcg_gen_ext_i32_tl(cpu_gpr[rt], t1);
3892             tcg_temp_free_i32(t1);
3893         } else {
3894             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
3895         }
3896         break;
3897 #if defined(TARGET_MIPS64)
3898     case OPC_DSLL:
3899         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm);
3900         break;
3901     case OPC_DSRA:
3902         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
3903         break;
3904     case OPC_DSRL:
3905         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
3906         break;
3907     case OPC_DROTR:
3908         if (uimm != 0) {
3909             tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm);
3910         } else {
3911             tcg_gen_mov_tl(cpu_gpr[rt], t0);
3912         }
3913         break;
3914     case OPC_DSLL32:
3915         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm + 32);
3916         break;
3917     case OPC_DSRA32:
3918         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm + 32);
3919         break;
3920     case OPC_DSRL32:
3921         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm + 32);
3922         break;
3923     case OPC_DROTR32:
3924         tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm + 32);
3925         break;
3926 #endif
3927     }
3928     tcg_temp_free(t0);
3929 }
3930
3931 /* Arithmetic */
3932 static void gen_arith(DisasContext *ctx, uint32_t opc,
3933                       int rd, int rs, int rt)
3934 {
3935     if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB
3936        && opc != OPC_DADD && opc != OPC_DSUB) {
3937         /* If no destination, treat it as a NOP.
3938            For add & sub, we must generate the overflow exception when needed. */
3939         return;
3940     }
3941
3942     switch (opc) {
3943     case OPC_ADD:
3944         {
3945             TCGv t0 = tcg_temp_local_new();
3946             TCGv t1 = tcg_temp_new();
3947             TCGv t2 = tcg_temp_new();
3948             TCGLabel *l1 = gen_new_label();
3949
3950             gen_load_gpr(t1, rs);
3951             gen_load_gpr(t2, rt);
3952             tcg_gen_add_tl(t0, t1, t2);
3953             tcg_gen_ext32s_tl(t0, t0);
3954             tcg_gen_xor_tl(t1, t1, t2);
3955             tcg_gen_xor_tl(t2, t0, t2);
3956             tcg_gen_andc_tl(t1, t2, t1);
3957             tcg_temp_free(t2);
3958             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
3959             tcg_temp_free(t1);
3960             /* operands of same sign, result different sign */
3961             generate_exception(ctx, EXCP_OVERFLOW);
3962             gen_set_label(l1);
3963             gen_store_gpr(t0, rd);
3964             tcg_temp_free(t0);
3965         }
3966         break;
3967     case OPC_ADDU:
3968         if (rs != 0 && rt != 0) {
3969             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
3970             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3971         } else if (rs == 0 && rt != 0) {
3972             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
3973         } else if (rs != 0 && rt == 0) {
3974             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
3975         } else {
3976             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3977         }
3978         break;
3979     case OPC_SUB:
3980         {
3981             TCGv t0 = tcg_temp_local_new();
3982             TCGv t1 = tcg_temp_new();
3983             TCGv t2 = tcg_temp_new();
3984             TCGLabel *l1 = gen_new_label();
3985
3986             gen_load_gpr(t1, rs);
3987             gen_load_gpr(t2, rt);
3988             tcg_gen_sub_tl(t0, t1, t2);
3989             tcg_gen_ext32s_tl(t0, t0);
3990             tcg_gen_xor_tl(t2, t1, t2);
3991             tcg_gen_xor_tl(t1, t0, t1);
3992             tcg_gen_and_tl(t1, t1, t2);
3993             tcg_temp_free(t2);
3994             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
3995             tcg_temp_free(t1);
3996             /* operands of different sign, first operand and result different sign */
3997             generate_exception(ctx, EXCP_OVERFLOW);
3998             gen_set_label(l1);
3999             gen_store_gpr(t0, rd);
4000             tcg_temp_free(t0);
4001         }
4002         break;
4003     case OPC_SUBU:
4004         if (rs != 0 && rt != 0) {
4005             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4006             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4007         } else if (rs == 0 && rt != 0) {
4008             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
4009             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4010         } else if (rs != 0 && rt == 0) {
4011             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
4012         } else {
4013             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4014         }
4015         break;
4016 #if defined(TARGET_MIPS64)
4017     case OPC_DADD:
4018         {
4019             TCGv t0 = tcg_temp_local_new();
4020             TCGv t1 = tcg_temp_new();
4021             TCGv t2 = tcg_temp_new();
4022             TCGLabel *l1 = gen_new_label();
4023
4024             gen_load_gpr(t1, rs);
4025             gen_load_gpr(t2, rt);
4026             tcg_gen_add_tl(t0, t1, t2);
4027             tcg_gen_xor_tl(t1, t1, t2);
4028             tcg_gen_xor_tl(t2, t0, t2);
4029             tcg_gen_andc_tl(t1, t2, t1);
4030             tcg_temp_free(t2);
4031             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
4032             tcg_temp_free(t1);
4033             /* operands of same sign, result different sign */
4034             generate_exception(ctx, EXCP_OVERFLOW);
4035             gen_set_label(l1);
4036             gen_store_gpr(t0, rd);
4037             tcg_temp_free(t0);
4038         }
4039         break;
4040     case OPC_DADDU:
4041         if (rs != 0 && rt != 0) {
4042             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4043         } else if (rs == 0 && rt != 0) {
4044             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
4045         } else if (rs != 0 && rt == 0) {
4046             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
4047         } else {
4048             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4049         }
4050         break;
4051     case OPC_DSUB:
4052         {
4053             TCGv t0 = tcg_temp_local_new();
4054             TCGv t1 = tcg_temp_new();
4055             TCGv t2 = tcg_temp_new();
4056             TCGLabel *l1 = gen_new_label();
4057
4058             gen_load_gpr(t1, rs);
4059             gen_load_gpr(t2, rt);
4060             tcg_gen_sub_tl(t0, t1, t2);
4061             tcg_gen_xor_tl(t2, t1, t2);
4062             tcg_gen_xor_tl(t1, t0, t1);
4063             tcg_gen_and_tl(t1, t1, t2);
4064             tcg_temp_free(t2);
4065             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
4066             tcg_temp_free(t1);
4067             /* operands of different sign, first operand and result different sign */
4068             generate_exception(ctx, EXCP_OVERFLOW);
4069             gen_set_label(l1);
4070             gen_store_gpr(t0, rd);
4071             tcg_temp_free(t0);
4072         }
4073         break;
4074     case OPC_DSUBU:
4075         if (rs != 0 && rt != 0) {
4076             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4077         } else if (rs == 0 && rt != 0) {
4078             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
4079         } else if (rs != 0 && rt == 0) {
4080             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
4081         } else {
4082             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4083         }
4084         break;
4085 #endif
4086     case OPC_MUL:
4087         if (likely(rs != 0 && rt != 0)) {
4088             tcg_gen_mul_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4089             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4090         } else {
4091             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4092         }
4093         break;
4094     }
4095 }
4096
4097 /* Conditional move */
4098 static void gen_cond_move(DisasContext *ctx, uint32_t opc,
4099                           int rd, int rs, int rt)
4100 {
4101     TCGv t0, t1, t2;
4102
4103     if (rd == 0) {
4104         /* If no destination, treat it as a NOP. */
4105         return;
4106     }
4107
4108     t0 = tcg_temp_new();
4109     gen_load_gpr(t0, rt);
4110     t1 = tcg_const_tl(0);
4111     t2 = tcg_temp_new();
4112     gen_load_gpr(t2, rs);
4113     switch (opc) {
4114     case OPC_MOVN:
4115         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
4116         break;
4117     case OPC_MOVZ:
4118         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
4119         break;
4120     case OPC_SELNEZ:
4121         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, t1);
4122         break;
4123     case OPC_SELEQZ:
4124         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, t1);
4125         break;
4126     }
4127     tcg_temp_free(t2);
4128     tcg_temp_free(t1);
4129     tcg_temp_free(t0);
4130 }
4131
4132 /* Logic */
4133 static void gen_logic(DisasContext *ctx, uint32_t opc,
4134                       int rd, int rs, int rt)
4135 {
4136     if (rd == 0) {
4137         /* If no destination, treat it as a NOP. */
4138         return;
4139     }
4140
4141     switch (opc) {
4142     case OPC_AND:
4143         if (likely(rs != 0 && rt != 0)) {
4144             tcg_gen_and_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4145         } else {
4146             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4147         }
4148         break;
4149     case OPC_NOR:
4150         if (rs != 0 && rt != 0) {
4151             tcg_gen_nor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4152         } else if (rs == 0 && rt != 0) {
4153             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rt]);
4154         } else if (rs != 0 && rt == 0) {
4155             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rs]);
4156         } else {
4157             tcg_gen_movi_tl(cpu_gpr[rd], ~((target_ulong)0));
4158         }
4159         break;
4160     case OPC_OR:
4161         if (likely(rs != 0 && rt != 0)) {
4162             tcg_gen_or_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4163         } else if (rs == 0 && rt != 0) {
4164             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
4165         } else if (rs != 0 && rt == 0) {
4166             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
4167         } else {
4168             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4169         }
4170         break;
4171     case OPC_XOR:
4172         if (likely(rs != 0 && rt != 0)) {
4173             tcg_gen_xor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4174         } else if (rs == 0 && rt != 0) {
4175             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
4176         } else if (rs != 0 && rt == 0) {
4177             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
4178         } else {
4179             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4180         }
4181         break;
4182     }
4183 }
4184
4185 /* Set on lower than */
4186 static void gen_slt(DisasContext *ctx, uint32_t opc,
4187                     int rd, int rs, int rt)
4188 {
4189     TCGv t0, t1;
4190
4191     if (rd == 0) {
4192         /* If no destination, treat it as a NOP. */
4193         return;
4194     }
4195
4196     t0 = tcg_temp_new();
4197     t1 = tcg_temp_new();
4198     gen_load_gpr(t0, rs);
4199     gen_load_gpr(t1, rt);
4200     switch (opc) {
4201     case OPC_SLT:
4202         tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr[rd], t0, t1);
4203         break;
4204     case OPC_SLTU:
4205         tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr[rd], t0, t1);
4206         break;
4207     }
4208     tcg_temp_free(t0);
4209     tcg_temp_free(t1);
4210 }
4211
4212 /* Shifts */
4213 static void gen_shift(DisasContext *ctx, uint32_t opc,
4214                       int rd, int rs, int rt)
4215 {
4216     TCGv t0, t1;
4217
4218     if (rd == 0) {
4219         /* If no destination, treat it as a NOP.
4220            For add & sub, we must generate the overflow exception when needed. */
4221         return;
4222     }
4223
4224     t0 = tcg_temp_new();
4225     t1 = tcg_temp_new();
4226     gen_load_gpr(t0, rs);
4227     gen_load_gpr(t1, rt);
4228     switch (opc) {
4229     case OPC_SLLV:
4230         tcg_gen_andi_tl(t0, t0, 0x1f);
4231         tcg_gen_shl_tl(t0, t1, t0);
4232         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
4233         break;
4234     case OPC_SRAV:
4235         tcg_gen_andi_tl(t0, t0, 0x1f);
4236         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
4237         break;
4238     case OPC_SRLV:
4239         tcg_gen_ext32u_tl(t1, t1);
4240         tcg_gen_andi_tl(t0, t0, 0x1f);
4241         tcg_gen_shr_tl(t0, t1, t0);
4242         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
4243         break;
4244     case OPC_ROTRV:
4245         {
4246             TCGv_i32 t2 = tcg_temp_new_i32();
4247             TCGv_i32 t3 = tcg_temp_new_i32();
4248
4249             tcg_gen_trunc_tl_i32(t2, t0);
4250             tcg_gen_trunc_tl_i32(t3, t1);
4251             tcg_gen_andi_i32(t2, t2, 0x1f);
4252             tcg_gen_rotr_i32(t2, t3, t2);
4253             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
4254             tcg_temp_free_i32(t2);
4255             tcg_temp_free_i32(t3);
4256         }
4257         break;
4258 #if defined(TARGET_MIPS64)
4259     case OPC_DSLLV:
4260         tcg_gen_andi_tl(t0, t0, 0x3f);
4261         tcg_gen_shl_tl(cpu_gpr[rd], t1, t0);
4262         break;
4263     case OPC_DSRAV:
4264         tcg_gen_andi_tl(t0, t0, 0x3f);
4265         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
4266         break;
4267     case OPC_DSRLV:
4268         tcg_gen_andi_tl(t0, t0, 0x3f);
4269         tcg_gen_shr_tl(cpu_gpr[rd], t1, t0);
4270         break;
4271     case OPC_DROTRV:
4272         tcg_gen_andi_tl(t0, t0, 0x3f);
4273         tcg_gen_rotr_tl(cpu_gpr[rd], t1, t0);
4274         break;
4275 #endif
4276     }
4277     tcg_temp_free(t0);
4278     tcg_temp_free(t1);
4279 }
4280
4281 /* Arithmetic on HI/LO registers */
4282 static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
4283 {
4284     if (reg == 0 && (opc == OPC_MFHI || opc == TX79_MMI_MFHI1 ||
4285                      opc == OPC_MFLO || opc == TX79_MMI_MFLO1)) {
4286         /* Treat as NOP. */
4287         return;
4288     }
4289
4290     if (acc != 0) {
4291         if (!(ctx->insn_flags & INSN_R5900)) {
4292             check_dsp(ctx);
4293         }
4294     }
4295
4296     switch (opc) {
4297     case OPC_MFHI:
4298     case TX79_MMI_MFHI1:
4299 #if defined(TARGET_MIPS64)
4300         if (acc != 0) {
4301             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_HI[acc]);
4302         } else
4303 #endif
4304         {
4305             tcg_gen_mov_tl(cpu_gpr[reg], cpu_HI[acc]);
4306         }
4307         break;
4308     case OPC_MFLO:
4309     case TX79_MMI_MFLO1:
4310 #if defined(TARGET_MIPS64)
4311         if (acc != 0) {
4312             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_LO[acc]);
4313         } else
4314 #endif
4315         {
4316             tcg_gen_mov_tl(cpu_gpr[reg], cpu_LO[acc]);
4317         }
4318         break;
4319     case OPC_MTHI:
4320     case TX79_MMI_MTHI1:
4321         if (reg != 0) {
4322 #if defined(TARGET_MIPS64)
4323             if (acc != 0) {
4324                 tcg_gen_ext32s_tl(cpu_HI[acc], cpu_gpr[reg]);
4325             } else
4326 #endif
4327             {
4328                 tcg_gen_mov_tl(cpu_HI[acc], cpu_gpr[reg]);
4329             }
4330         } else {
4331             tcg_gen_movi_tl(cpu_HI[acc], 0);
4332         }
4333         break;
4334     case OPC_MTLO:
4335     case TX79_MMI_MTLO1:
4336         if (reg != 0) {
4337 #if defined(TARGET_MIPS64)
4338             if (acc != 0) {
4339                 tcg_gen_ext32s_tl(cpu_LO[acc], cpu_gpr[reg]);
4340             } else
4341 #endif
4342             {
4343                 tcg_gen_mov_tl(cpu_LO[acc], cpu_gpr[reg]);
4344             }
4345         } else {
4346             tcg_gen_movi_tl(cpu_LO[acc], 0);
4347         }
4348         break;
4349     }
4350 }
4351
4352 static inline void gen_r6_ld(target_long addr, int reg, int memidx,
4353                              TCGMemOp memop)
4354 {
4355     TCGv t0 = tcg_const_tl(addr);
4356     tcg_gen_qemu_ld_tl(t0, t0, memidx, memop);
4357     gen_store_gpr(t0, reg);
4358     tcg_temp_free(t0);
4359 }
4360
4361 static inline void gen_pcrel(DisasContext *ctx, int opc, target_ulong pc,
4362                              int rs)
4363 {
4364     target_long offset;
4365     target_long addr;
4366
4367     switch (MASK_OPC_PCREL_TOP2BITS(opc)) {
4368     case OPC_ADDIUPC:
4369         if (rs != 0) {
4370             offset = sextract32(ctx->opcode << 2, 0, 21);
4371             addr = addr_add(ctx, pc, offset);
4372             tcg_gen_movi_tl(cpu_gpr[rs], addr);
4373         }
4374         break;
4375     case R6_OPC_LWPC:
4376         offset = sextract32(ctx->opcode << 2, 0, 21);
4377         addr = addr_add(ctx, pc, offset);
4378         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TESL);
4379         break;
4380 #if defined(TARGET_MIPS64)
4381     case OPC_LWUPC:
4382         check_mips_64(ctx);
4383         offset = sextract32(ctx->opcode << 2, 0, 21);
4384         addr = addr_add(ctx, pc, offset);
4385         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEUL);
4386         break;
4387 #endif
4388     default:
4389         switch (MASK_OPC_PCREL_TOP5BITS(opc)) {
4390         case OPC_AUIPC:
4391             if (rs != 0) {
4392                 offset = sextract32(ctx->opcode, 0, 16) << 16;
4393                 addr = addr_add(ctx, pc, offset);
4394                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
4395             }
4396             break;
4397         case OPC_ALUIPC:
4398             if (rs != 0) {
4399                 offset = sextract32(ctx->opcode, 0, 16) << 16;
4400                 addr = ~0xFFFF & addr_add(ctx, pc, offset);
4401                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
4402             }
4403             break;
4404 #if defined(TARGET_MIPS64)
4405         case R6_OPC_LDPC: /* bits 16 and 17 are part of immediate */
4406         case R6_OPC_LDPC + (1 << 16):
4407         case R6_OPC_LDPC + (2 << 16):
4408         case R6_OPC_LDPC + (3 << 16):
4409             check_mips_64(ctx);
4410             offset = sextract32(ctx->opcode << 3, 0, 21);
4411             addr = addr_add(ctx, (pc & ~0x7), offset);
4412             gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEQ);
4413             break;
4414 #endif
4415         default:
4416             MIPS_INVAL("OPC_PCREL");
4417             generate_exception_end(ctx, EXCP_RI);
4418             break;
4419         }
4420         break;
4421     }
4422 }
4423
4424 static void gen_r6_muldiv(DisasContext *ctx, int opc, int rd, int rs, int rt)
4425 {
4426     TCGv t0, t1;
4427
4428     if (rd == 0) {
4429         /* Treat as NOP. */
4430         return;
4431     }
4432
4433     t0 = tcg_temp_new();
4434     t1 = tcg_temp_new();
4435
4436     gen_load_gpr(t0, rs);
4437     gen_load_gpr(t1, rt);
4438
4439     switch (opc) {
4440     case R6_OPC_DIV:
4441         {
4442             TCGv t2 = tcg_temp_new();
4443             TCGv t3 = tcg_temp_new();
4444             tcg_gen_ext32s_tl(t0, t0);
4445             tcg_gen_ext32s_tl(t1, t1);
4446             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
4447             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
4448             tcg_gen_and_tl(t2, t2, t3);
4449             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
4450             tcg_gen_or_tl(t2, t2, t3);
4451             tcg_gen_movi_tl(t3, 0);
4452             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
4453             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
4454             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4455             tcg_temp_free(t3);
4456             tcg_temp_free(t2);
4457         }
4458         break;
4459     case R6_OPC_MOD:
4460         {
4461             TCGv t2 = tcg_temp_new();
4462             TCGv t3 = tcg_temp_new();
4463             tcg_gen_ext32s_tl(t0, t0);
4464             tcg_gen_ext32s_tl(t1, t1);
4465             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
4466             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
4467             tcg_gen_and_tl(t2, t2, t3);
4468             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
4469             tcg_gen_or_tl(t2, t2, t3);
4470             tcg_gen_movi_tl(t3, 0);
4471             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
4472             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
4473             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4474             tcg_temp_free(t3);
4475             tcg_temp_free(t2);
4476         }
4477         break;
4478     case R6_OPC_DIVU:
4479         {
4480             TCGv t2 = tcg_const_tl(0);
4481             TCGv t3 = tcg_const_tl(1);
4482             tcg_gen_ext32u_tl(t0, t0);
4483             tcg_gen_ext32u_tl(t1, t1);
4484             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
4485             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
4486             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4487             tcg_temp_free(t3);
4488             tcg_temp_free(t2);
4489         }
4490         break;
4491     case R6_OPC_MODU:
4492         {
4493             TCGv t2 = tcg_const_tl(0);
4494             TCGv t3 = tcg_const_tl(1);
4495             tcg_gen_ext32u_tl(t0, t0);
4496             tcg_gen_ext32u_tl(t1, t1);
4497             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
4498             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
4499             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4500             tcg_temp_free(t3);
4501             tcg_temp_free(t2);
4502         }
4503         break;
4504     case R6_OPC_MUL:
4505         {
4506             TCGv_i32 t2 = tcg_temp_new_i32();
4507             TCGv_i32 t3 = tcg_temp_new_i32();
4508             tcg_gen_trunc_tl_i32(t2, t0);
4509             tcg_gen_trunc_tl_i32(t3, t1);
4510             tcg_gen_mul_i32(t2, t2, t3);
4511             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
4512             tcg_temp_free_i32(t2);
4513             tcg_temp_free_i32(t3);
4514         }
4515         break;
4516     case R6_OPC_MUH:
4517         {
4518             TCGv_i32 t2 = tcg_temp_new_i32();
4519             TCGv_i32 t3 = tcg_temp_new_i32();
4520             tcg_gen_trunc_tl_i32(t2, t0);
4521             tcg_gen_trunc_tl_i32(t3, t1);
4522             tcg_gen_muls2_i32(t2, t3, t2, t3);
4523             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
4524             tcg_temp_free_i32(t2);
4525             tcg_temp_free_i32(t3);
4526         }
4527         break;
4528     case R6_OPC_MULU:
4529         {
4530             TCGv_i32 t2 = tcg_temp_new_i32();
4531             TCGv_i32 t3 = tcg_temp_new_i32();
4532             tcg_gen_trunc_tl_i32(t2, t0);
4533             tcg_gen_trunc_tl_i32(t3, t1);
4534             tcg_gen_mul_i32(t2, t2, t3);
4535             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
4536             tcg_temp_free_i32(t2);
4537             tcg_temp_free_i32(t3);
4538         }
4539         break;
4540     case R6_OPC_MUHU:
4541         {
4542             TCGv_i32 t2 = tcg_temp_new_i32();
4543             TCGv_i32 t3 = tcg_temp_new_i32();
4544             tcg_gen_trunc_tl_i32(t2, t0);
4545             tcg_gen_trunc_tl_i32(t3, t1);
4546             tcg_gen_mulu2_i32(t2, t3, t2, t3);
4547             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
4548             tcg_temp_free_i32(t2);
4549             tcg_temp_free_i32(t3);
4550         }
4551         break;
4552 #if defined(TARGET_MIPS64)
4553     case R6_OPC_DDIV:
4554         {
4555             TCGv t2 = tcg_temp_new();
4556             TCGv t3 = tcg_temp_new();
4557             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
4558             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
4559             tcg_gen_and_tl(t2, t2, t3);
4560             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
4561             tcg_gen_or_tl(t2, t2, t3);
4562             tcg_gen_movi_tl(t3, 0);
4563             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
4564             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
4565             tcg_temp_free(t3);
4566             tcg_temp_free(t2);
4567         }
4568         break;
4569     case R6_OPC_DMOD:
4570         {
4571             TCGv t2 = tcg_temp_new();
4572             TCGv t3 = tcg_temp_new();
4573             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
4574             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
4575             tcg_gen_and_tl(t2, t2, t3);
4576             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
4577             tcg_gen_or_tl(t2, t2, t3);
4578             tcg_gen_movi_tl(t3, 0);
4579             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
4580             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
4581             tcg_temp_free(t3);
4582             tcg_temp_free(t2);
4583         }
4584         break;
4585     case R6_OPC_DDIVU:
4586         {
4587             TCGv t2 = tcg_const_tl(0);
4588             TCGv t3 = tcg_const_tl(1);
4589             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
4590             tcg_gen_divu_i64(cpu_gpr[rd], t0, t1);
4591             tcg_temp_free(t3);
4592             tcg_temp_free(t2);
4593         }
4594         break;
4595     case R6_OPC_DMODU:
4596         {
4597             TCGv t2 = tcg_const_tl(0);
4598             TCGv t3 = tcg_const_tl(1);
4599             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
4600             tcg_gen_remu_i64(cpu_gpr[rd], t0, t1);
4601             tcg_temp_free(t3);
4602             tcg_temp_free(t2);
4603         }
4604         break;
4605     case R6_OPC_DMUL:
4606         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
4607         break;
4608     case R6_OPC_DMUH:
4609         {
4610             TCGv t2 = tcg_temp_new();
4611             tcg_gen_muls2_i64(t2, cpu_gpr[rd], t0, t1);
4612             tcg_temp_free(t2);
4613         }
4614         break;
4615     case R6_OPC_DMULU:
4616         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
4617         break;
4618     case R6_OPC_DMUHU:
4619         {
4620             TCGv t2 = tcg_temp_new();
4621             tcg_gen_mulu2_i64(t2, cpu_gpr[rd], t0, t1);
4622             tcg_temp_free(t2);
4623         }
4624         break;
4625 #endif
4626     default:
4627         MIPS_INVAL("r6 mul/div");
4628         generate_exception_end(ctx, EXCP_RI);
4629         goto out;
4630     }
4631  out:
4632     tcg_temp_free(t0);
4633     tcg_temp_free(t1);
4634 }
4635
4636 static void gen_muldiv(DisasContext *ctx, uint32_t opc,
4637                        int acc, int rs, int rt)
4638 {
4639     TCGv t0, t1;
4640
4641     t0 = tcg_temp_new();
4642     t1 = tcg_temp_new();
4643
4644     gen_load_gpr(t0, rs);
4645     gen_load_gpr(t1, rt);
4646
4647     if (acc != 0) {
4648         if (!(ctx->insn_flags & INSN_R5900)) {
4649             check_dsp(ctx);
4650         }
4651     }
4652
4653     switch (opc) {
4654     case OPC_DIV:
4655     case TX79_MMI_DIV1:
4656         {
4657             TCGv t2 = tcg_temp_new();
4658             TCGv t3 = tcg_temp_new();
4659             tcg_gen_ext32s_tl(t0, t0);
4660             tcg_gen_ext32s_tl(t1, t1);
4661             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
4662             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
4663             tcg_gen_and_tl(t2, t2, t3);
4664             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
4665             tcg_gen_or_tl(t2, t2, t3);
4666             tcg_gen_movi_tl(t3, 0);
4667             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
4668             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
4669             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
4670             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
4671             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
4672             tcg_temp_free(t3);
4673             tcg_temp_free(t2);
4674         }
4675         break;
4676     case OPC_DIVU:
4677     case TX79_MMI_DIVU1:
4678         {
4679             TCGv t2 = tcg_const_tl(0);
4680             TCGv t3 = tcg_const_tl(1);
4681             tcg_gen_ext32u_tl(t0, t0);
4682             tcg_gen_ext32u_tl(t1, t1);
4683             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
4684             tcg_gen_divu_tl(cpu_LO[acc], t0, t1);
4685             tcg_gen_remu_tl(cpu_HI[acc], t0, t1);
4686             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
4687             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
4688             tcg_temp_free(t3);
4689             tcg_temp_free(t2);
4690         }
4691         break;
4692     case OPC_MULT:
4693         {
4694             TCGv_i32 t2 = tcg_temp_new_i32();
4695             TCGv_i32 t3 = tcg_temp_new_i32();
4696             tcg_gen_trunc_tl_i32(t2, t0);
4697             tcg_gen_trunc_tl_i32(t3, t1);
4698             tcg_gen_muls2_i32(t2, t3, t2, t3);
4699             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
4700             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
4701             tcg_temp_free_i32(t2);
4702             tcg_temp_free_i32(t3);
4703         }
4704         break;
4705     case OPC_MULTU:
4706         {
4707             TCGv_i32 t2 = tcg_temp_new_i32();
4708             TCGv_i32 t3 = tcg_temp_new_i32();
4709             tcg_gen_trunc_tl_i32(t2, t0);
4710             tcg_gen_trunc_tl_i32(t3, t1);
4711             tcg_gen_mulu2_i32(t2, t3, t2, t3);
4712             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
4713             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
4714             tcg_temp_free_i32(t2);
4715             tcg_temp_free_i32(t3);
4716         }
4717         break;
4718 #if defined(TARGET_MIPS64)
4719     case OPC_DDIV:
4720         {
4721             TCGv t2 = tcg_temp_new();
4722             TCGv t3 = tcg_temp_new();
4723             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
4724             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
4725             tcg_gen_and_tl(t2, t2, t3);
4726             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
4727             tcg_gen_or_tl(t2, t2, t3);
4728             tcg_gen_movi_tl(t3, 0);
4729             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
4730             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
4731             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
4732             tcg_temp_free(t3);
4733             tcg_temp_free(t2);
4734         }
4735         break;
4736     case OPC_DDIVU:
4737         {
4738             TCGv t2 = tcg_const_tl(0);
4739             TCGv t3 = tcg_const_tl(1);
4740             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
4741             tcg_gen_divu_i64(cpu_LO[acc], t0, t1);
4742             tcg_gen_remu_i64(cpu_HI[acc], t0, t1);
4743             tcg_temp_free(t3);
4744             tcg_temp_free(t2);
4745         }
4746         break;
4747     case OPC_DMULT:
4748         tcg_gen_muls2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
4749         break;
4750     case OPC_DMULTU:
4751         tcg_gen_mulu2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
4752         break;
4753 #endif
4754     case OPC_MADD:
4755         {
4756             TCGv_i64 t2 = tcg_temp_new_i64();
4757             TCGv_i64 t3 = tcg_temp_new_i64();
4758
4759             tcg_gen_ext_tl_i64(t2, t0);
4760             tcg_gen_ext_tl_i64(t3, t1);
4761             tcg_gen_mul_i64(t2, t2, t3);
4762             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
4763             tcg_gen_add_i64(t2, t2, t3);
4764             tcg_temp_free_i64(t3);
4765             gen_move_low32(cpu_LO[acc], t2);
4766             gen_move_high32(cpu_HI[acc], t2);
4767             tcg_temp_free_i64(t2);
4768         }
4769         break;
4770     case OPC_MADDU:
4771         {
4772             TCGv_i64 t2 = tcg_temp_new_i64();
4773             TCGv_i64 t3 = tcg_temp_new_i64();
4774
4775             tcg_gen_ext32u_tl(t0, t0);
4776             tcg_gen_ext32u_tl(t1, t1);
4777             tcg_gen_extu_tl_i64(t2, t0);
4778             tcg_gen_extu_tl_i64(t3, t1);
4779             tcg_gen_mul_i64(t2, t2, t3);
4780             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
4781             tcg_gen_add_i64(t2, t2, t3);
4782             tcg_temp_free_i64(t3);
4783             gen_move_low32(cpu_LO[acc], t2);
4784             gen_move_high32(cpu_HI[acc], t2);
4785             tcg_temp_free_i64(t2);
4786         }
4787         break;
4788     case OPC_MSUB:
4789         {
4790             TCGv_i64 t2 = tcg_temp_new_i64();
4791             TCGv_i64 t3 = tcg_temp_new_i64();
4792
4793             tcg_gen_ext_tl_i64(t2, t0);
4794             tcg_gen_ext_tl_i64(t3, t1);
4795             tcg_gen_mul_i64(t2, t2, t3);
4796             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
4797             tcg_gen_sub_i64(t2, t3, t2);
4798             tcg_temp_free_i64(t3);
4799             gen_move_low32(cpu_LO[acc], t2);
4800             gen_move_high32(cpu_HI[acc], t2);
4801             tcg_temp_free_i64(t2);
4802         }
4803         break;
4804     case OPC_MSUBU:
4805         {
4806             TCGv_i64 t2 = tcg_temp_new_i64();
4807             TCGv_i64 t3 = tcg_temp_new_i64();
4808
4809             tcg_gen_ext32u_tl(t0, t0);
4810             tcg_gen_ext32u_tl(t1, t1);
4811             tcg_gen_extu_tl_i64(t2, t0);
4812             tcg_gen_extu_tl_i64(t3, t1);
4813             tcg_gen_mul_i64(t2, t2, t3);
4814             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
4815             tcg_gen_sub_i64(t2, t3, t2);
4816             tcg_temp_free_i64(t3);
4817             gen_move_low32(cpu_LO[acc], t2);
4818             gen_move_high32(cpu_HI[acc], t2);
4819             tcg_temp_free_i64(t2);
4820         }
4821         break;
4822     default:
4823         MIPS_INVAL("mul/div");
4824         generate_exception_end(ctx, EXCP_RI);
4825         goto out;
4826     }
4827  out:
4828     tcg_temp_free(t0);
4829     tcg_temp_free(t1);
4830 }
4831
4832 /*
4833  * These MULT and MULTU instructions implemented in for example the
4834  * Toshiba/Sony R5900 and the Toshiba TX19, TX39 and TX79 core
4835  * architectures are special three-operand variants with the syntax
4836  *
4837  *     MULT[U][1] rd, rs, rt
4838  *
4839  * such that
4840  *
4841  *     (rd, LO, HI) <- rs * rt
4842  *
4843  * where the low-order 32-bits of the result is placed into both the
4844  * GPR rd and the special register LO. The high-order 32-bits of the
4845  * result is placed into the special register HI.
4846  *
4847  * If the GPR rd is omitted in assembly language, it is taken to be 0,
4848  * which is the zero register that always reads as 0.
4849  */
4850 static void gen_mul_txx9(DisasContext *ctx, uint32_t opc,
4851                          int rd, int rs, int rt)
4852 {
4853     TCGv t0 = tcg_temp_new();
4854     TCGv t1 = tcg_temp_new();
4855     int acc = 0;
4856
4857     gen_load_gpr(t0, rs);
4858     gen_load_gpr(t1, rt);
4859
4860     switch (opc) {
4861     case TX79_MMI_MULT1:
4862         acc = 1;
4863         /* Fall through */
4864     case OPC_MULT:
4865         {
4866             TCGv_i32 t2 = tcg_temp_new_i32();
4867             TCGv_i32 t3 = tcg_temp_new_i32();
4868             tcg_gen_trunc_tl_i32(t2, t0);
4869             tcg_gen_trunc_tl_i32(t3, t1);
4870             tcg_gen_muls2_i32(t2, t3, t2, t3);
4871             if (rd) {
4872                 tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
4873             }
4874             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
4875             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
4876             tcg_temp_free_i32(t2);
4877             tcg_temp_free_i32(t3);
4878         }
4879         break;
4880     case TX79_MMI_MULTU1:
4881         acc = 1;
4882         /* Fall through */
4883     case OPC_MULTU:
4884         {
4885             TCGv_i32 t2 = tcg_temp_new_i32();
4886             TCGv_i32 t3 = tcg_temp_new_i32();
4887             tcg_gen_trunc_tl_i32(t2, t0);
4888             tcg_gen_trunc_tl_i32(t3, t1);
4889             tcg_gen_mulu2_i32(t2, t3, t2, t3);
4890             if (rd) {
4891                 tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
4892             }
4893             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
4894             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
4895             tcg_temp_free_i32(t2);
4896             tcg_temp_free_i32(t3);
4897         }
4898         break;
4899     default:
4900         MIPS_INVAL("mul TXx9");
4901         generate_exception_end(ctx, EXCP_RI);
4902         goto out;
4903     }
4904
4905  out:
4906     tcg_temp_free(t0);
4907     tcg_temp_free(t1);
4908 }
4909
4910 static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc,
4911                             int rd, int rs, int rt)
4912 {
4913     TCGv t0 = tcg_temp_new();
4914     TCGv t1 = tcg_temp_new();
4915
4916     gen_load_gpr(t0, rs);
4917     gen_load_gpr(t1, rt);
4918
4919     switch (opc) {
4920     case OPC_VR54XX_MULS:
4921         gen_helper_muls(t0, cpu_env, t0, t1);
4922         break;
4923     case OPC_VR54XX_MULSU:
4924         gen_helper_mulsu(t0, cpu_env, t0, t1);
4925         break;
4926     case OPC_VR54XX_MACC:
4927         gen_helper_macc(t0, cpu_env, t0, t1);
4928         break;
4929     case OPC_VR54XX_MACCU:
4930         gen_helper_maccu(t0, cpu_env, t0, t1);
4931         break;
4932     case OPC_VR54XX_MSAC:
4933         gen_helper_msac(t0, cpu_env, t0, t1);
4934         break;
4935     case OPC_VR54XX_MSACU:
4936         gen_helper_msacu(t0, cpu_env, t0, t1);
4937         break;
4938     case OPC_VR54XX_MULHI:
4939         gen_helper_mulhi(t0, cpu_env, t0, t1);
4940         break;
4941     case OPC_VR54XX_MULHIU:
4942         gen_helper_mulhiu(t0, cpu_env, t0, t1);
4943         break;
4944     case OPC_VR54XX_MULSHI:
4945         gen_helper_mulshi(t0, cpu_env, t0, t1);
4946         break;
4947     case OPC_VR54XX_MULSHIU:
4948         gen_helper_mulshiu(t0, cpu_env, t0, t1);
4949         break;
4950     case OPC_VR54XX_MACCHI:
4951         gen_helper_macchi(t0, cpu_env, t0, t1);
4952         break;
4953     case OPC_VR54XX_MACCHIU:
4954         gen_helper_macchiu(t0, cpu_env, t0, t1);
4955         break;
4956     case OPC_VR54XX_MSACHI:
4957         gen_helper_msachi(t0, cpu_env, t0, t1);
4958         break;
4959     case OPC_VR54XX_MSACHIU:
4960         gen_helper_msachiu(t0, cpu_env, t0, t1);
4961         break;
4962     default:
4963         MIPS_INVAL("mul vr54xx");
4964         generate_exception_end(ctx, EXCP_RI);
4965         goto out;
4966     }
4967     gen_store_gpr(t0, rd);
4968
4969  out:
4970     tcg_temp_free(t0);
4971     tcg_temp_free(t1);
4972 }
4973
4974 static void gen_cl (DisasContext *ctx, uint32_t opc,
4975                     int rd, int rs)
4976 {
4977     TCGv t0;
4978
4979     if (rd == 0) {
4980         /* Treat as NOP. */
4981         return;
4982     }
4983     t0 = cpu_gpr[rd];
4984     gen_load_gpr(t0, rs);
4985
4986     switch (opc) {
4987     case OPC_CLO:
4988     case R6_OPC_CLO:
4989 #if defined(TARGET_MIPS64)
4990     case OPC_DCLO:
4991     case R6_OPC_DCLO:
4992 #endif
4993         tcg_gen_not_tl(t0, t0);
4994         break;
4995     }
4996
4997     switch (opc) {
4998     case OPC_CLO:
4999     case R6_OPC_CLO:
5000     case OPC_CLZ:
5001     case R6_OPC_CLZ:
5002         tcg_gen_ext32u_tl(t0, t0);
5003         tcg_gen_clzi_tl(t0, t0, TARGET_LONG_BITS);
5004         tcg_gen_subi_tl(t0, t0, TARGET_LONG_BITS - 32);
5005         break;
5006 #if defined(TARGET_MIPS64)
5007     case OPC_DCLO:
5008     case R6_OPC_DCLO:
5009     case OPC_DCLZ:
5010     case R6_OPC_DCLZ:
5011         tcg_gen_clzi_i64(t0, t0, 64);
5012         break;
5013 #endif
5014     }
5015 }
5016
5017 /* Godson integer instructions */
5018 static void gen_loongson_integer(DisasContext *ctx, uint32_t opc,
5019                                  int rd, int rs, int rt)
5020 {
5021     TCGv t0, t1;
5022
5023     if (rd == 0) {
5024         /* Treat as NOP. */
5025         return;
5026     }
5027
5028     switch (opc) {
5029     case OPC_MULT_G_2E:
5030     case OPC_MULT_G_2F:
5031     case OPC_MULTU_G_2E:
5032     case OPC_MULTU_G_2F:
5033 #if defined(TARGET_MIPS64)
5034     case OPC_DMULT_G_2E:
5035     case OPC_DMULT_G_2F:
5036     case OPC_DMULTU_G_2E:
5037     case OPC_DMULTU_G_2F:
5038 #endif
5039         t0 = tcg_temp_new();
5040         t1 = tcg_temp_new();
5041         break;
5042     default:
5043         t0 = tcg_temp_local_new();
5044         t1 = tcg_temp_local_new();
5045         break;
5046     }
5047
5048     gen_load_gpr(t0, rs);
5049     gen_load_gpr(t1, rt);
5050
5051     switch (opc) {
5052     case OPC_MULT_G_2E:
5053     case OPC_MULT_G_2F:
5054         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
5055         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
5056         break;
5057     case OPC_MULTU_G_2E:
5058     case OPC_MULTU_G_2F:
5059         tcg_gen_ext32u_tl(t0, t0);
5060         tcg_gen_ext32u_tl(t1, t1);
5061         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
5062         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
5063         break;
5064     case OPC_DIV_G_2E:
5065     case OPC_DIV_G_2F:
5066         {
5067             TCGLabel *l1 = gen_new_label();
5068             TCGLabel *l2 = gen_new_label();
5069             TCGLabel *l3 = gen_new_label();
5070             tcg_gen_ext32s_tl(t0, t0);
5071             tcg_gen_ext32s_tl(t1, t1);
5072             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
5073             tcg_gen_movi_tl(cpu_gpr[rd], 0);
5074             tcg_gen_br(l3);
5075             gen_set_label(l1);
5076             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
5077             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
5078             tcg_gen_mov_tl(cpu_gpr[rd], t0);
5079             tcg_gen_br(l3);
5080             gen_set_label(l2);
5081             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
5082             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
5083             gen_set_label(l3);
5084         }
5085         break;
5086     case OPC_DIVU_G_2E:
5087     case OPC_DIVU_G_2F:
5088         {
5089             TCGLabel *l1 = gen_new_label();
5090             TCGLabel *l2 = gen_new_label();
5091             tcg_gen_ext32u_tl(t0, t0);
5092             tcg_gen_ext32u_tl(t1, t1);
5093             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
5094             tcg_gen_movi_tl(cpu_gpr[rd], 0);
5095             tcg_gen_br(l2);
5096             gen_set_label(l1);
5097             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
5098             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
5099             gen_set_label(l2);
5100         }
5101         break;
5102     case OPC_MOD_G_2E:
5103     case OPC_MOD_G_2F:
5104         {
5105             TCGLabel *l1 = gen_new_label();
5106             TCGLabel *l2 = gen_new_label();
5107             TCGLabel *l3 = gen_new_label();
5108             tcg_gen_ext32u_tl(t0, t0);
5109             tcg_gen_ext32u_tl(t1, t1);
5110             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
5111             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
5112             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
5113             gen_set_label(l1);
5114             tcg_gen_movi_tl(cpu_gpr[rd], 0);
5115             tcg_gen_br(l3);
5116             gen_set_label(l2);
5117             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
5118             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
5119             gen_set_label(l3);
5120         }
5121         break;
5122     case OPC_MODU_G_2E:
5123     case OPC_MODU_G_2F:
5124         {
5125             TCGLabel *l1 = gen_new_label();
5126             TCGLabel *l2 = gen_new_label();
5127             tcg_gen_ext32u_tl(t0, t0);
5128             tcg_gen_ext32u_tl(t1, t1);
5129             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
5130             tcg_gen_movi_tl(cpu_gpr[rd], 0);
5131             tcg_gen_br(l2);
5132             gen_set_label(l1);
5133             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
5134             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
5135             gen_set_label(l2);
5136         }
5137         break;
5138 #if defined(TARGET_MIPS64)
5139     case OPC_DMULT_G_2E:
5140     case OPC_DMULT_G_2F:
5141         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
5142         break;
5143     case OPC_DMULTU_G_2E:
5144     case OPC_DMULTU_G_2F:
5145         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
5146         break;
5147     case OPC_DDIV_G_2E:
5148     case OPC_DDIV_G_2F:
5149         {
5150             TCGLabel *l1 = gen_new_label();
5151             TCGLabel *l2 = gen_new_label();
5152             TCGLabel *l3 = gen_new_label();
5153             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
5154             tcg_gen_movi_tl(cpu_gpr[rd], 0);
5155             tcg_gen_br(l3);
5156             gen_set_label(l1);
5157             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
5158             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
5159             tcg_gen_mov_tl(cpu_gpr[rd], t0);
5160             tcg_gen_br(l3);
5161             gen_set_label(l2);
5162             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
5163             gen_set_label(l3);
5164         }
5165         break;
5166     case OPC_DDIVU_G_2E:
5167     case OPC_DDIVU_G_2F:
5168         {
5169             TCGLabel *l1 = gen_new_label();
5170             TCGLabel *l2 = gen_new_label();
5171             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
5172             tcg_gen_movi_tl(cpu_gpr[rd], 0);
5173             tcg_gen_br(l2);
5174             gen_set_label(l1);
5175             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
5176             gen_set_label(l2);
5177         }
5178         break;
5179     case OPC_DMOD_G_2E:
5180     case OPC_DMOD_G_2F:
5181         {
5182             TCGLabel *l1 = gen_new_label();
5183             TCGLabel *l2 = gen_new_label();
5184             TCGLabel *l3 = gen_new_label();
5185             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
5186             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
5187             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
5188             gen_set_label(l1);
5189             tcg_gen_movi_tl(cpu_gpr[rd], 0);
5190             tcg_gen_br(l3);
5191             gen_set_label(l2);
5192             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
5193             gen_set_label(l3);
5194         }
5195         break;
5196     case OPC_DMODU_G_2E:
5197     case OPC_DMODU_G_2F:
5198         {
5199             TCGLabel *l1 = gen_new_label();
5200             TCGLabel *l2 = gen_new_label();
5201             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
5202             tcg_gen_movi_tl(cpu_gpr[rd], 0);
5203             tcg_gen_br(l2);
5204             gen_set_label(l1);
5205             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
5206             gen_set_label(l2);
5207         }
5208         break;
5209 #endif
5210     }
5211
5212     tcg_temp_free(t0);
5213     tcg_temp_free(t1);
5214 }
5215
5216 /* Loongson multimedia instructions */
5217 static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt)
5218 {
5219     uint32_t opc, shift_max;
5220     TCGv_i64 t0, t1;
5221
5222     opc = MASK_LMI(ctx->opcode);
5223     switch (opc) {
5224     case OPC_ADD_CP2:
5225     case OPC_SUB_CP2:
5226     case OPC_DADD_CP2:
5227     case OPC_DSUB_CP2:
5228         t0 = tcg_temp_local_new_i64();
5229         t1 = tcg_temp_local_new_i64();
5230         break;
5231     default:
5232         t0 = tcg_temp_new_i64();
5233         t1 = tcg_temp_new_i64();
5234         break;
5235     }
5236
5237     check_cp1_enabled(ctx);
5238     gen_load_fpr64(ctx, t0, rs);
5239     gen_load_fpr64(ctx, t1, rt);
5240
5241 #define LMI_HELPER(UP, LO) \
5242     case OPC_##UP: gen_helper_##LO(t0, t0, t1); break
5243 #define LMI_HELPER_1(UP, LO) \
5244     case OPC_##UP: gen_helper_##LO(t0, t0); break
5245 #define LMI_DIRECT(UP, LO, OP) \
5246     case OPC_##UP: tcg_gen_##OP##_i64(t0, t0, t1); break
5247
5248     switch (opc) {
5249     LMI_HELPER(PADDSH, paddsh);
5250     LMI_HELPER(PADDUSH, paddush);
5251     LMI_HELPER(PADDH, paddh);
5252     LMI_HELPER(PADDW, paddw);
5253     LMI_HELPER(PADDSB, paddsb);
5254     LMI_HELPER(PADDUSB, paddusb);
5255     LMI_HELPER(PADDB, paddb);
5256
5257     LMI_HELPER(PSUBSH, psubsh);
5258     LMI_HELPER(PSUBUSH, psubush);
5259     LMI_HELPER(PSUBH, psubh);
5260     LMI_HELPER(PSUBW, psubw);
5261     LMI_HELPER(PSUBSB, psubsb);
5262     LMI_HELPER(PSUBUSB, psubusb);
5263     LMI_HELPER(PSUBB, psubb);
5264
5265     LMI_HELPER(PSHUFH, pshufh);
5266     LMI_HELPER(PACKSSWH, packsswh);
5267     LMI_HELPER(PACKSSHB, packsshb);
5268     LMI_HELPER(PACKUSHB, packushb);
5269
5270     LMI_HELPER(PUNPCKLHW, punpcklhw);
5271     LMI_HELPER(PUNPCKHHW, punpckhhw);
5272     LMI_HELPER(PUNPCKLBH, punpcklbh);
5273     LMI_HELPER(PUNPCKHBH, punpckhbh);
5274     LMI_HELPER(PUNPCKLWD, punpcklwd);
5275     LMI_HELPER(PUNPCKHWD, punpckhwd);
5276
5277     LMI_HELPER(PAVGH, pavgh);
5278     LMI_HELPER(PAVGB, pavgb);
5279     LMI_HELPER(PMAXSH, pmaxsh);
5280     LMI_HELPER(PMINSH, pminsh);
5281     LMI_HELPER(PMAXUB, pmaxub);
5282     LMI_HELPER(PMINUB, pminub);
5283
5284     LMI_HELPER(PCMPEQW, pcmpeqw);
5285     LMI_HELPER(PCMPGTW, pcmpgtw);
5286     LMI_HELPER(PCMPEQH, pcmpeqh);
5287     LMI_HELPER(PCMPGTH, pcmpgth);
5288     LMI_HELPER(PCMPEQB, pcmpeqb);
5289     LMI_HELPER(PCMPGTB, pcmpgtb);
5290
5291     LMI_HELPER(PSLLW, psllw);
5292     LMI_HELPER(PSLLH, psllh);
5293     LMI_HELPER(PSRLW, psrlw);
5294     LMI_HELPER(PSRLH, psrlh);
5295     LMI_HELPER(PSRAW, psraw);
5296     LMI_HELPER(PSRAH, psrah);
5297
5298     LMI_HELPER(PMULLH, pmullh);
5299     LMI_HELPER(PMULHH, pmulhh);
5300     LMI_HELPER(PMULHUH, pmulhuh);
5301     LMI_HELPER(PMADDHW, pmaddhw);
5302
5303     LMI_HELPER(PASUBUB, pasubub);
5304     LMI_HELPER_1(BIADD, biadd);
5305     LMI_HELPER_1(PMOVMSKB, pmovmskb);
5306
5307     LMI_DIRECT(PADDD, paddd, add);
5308     LMI_DIRECT(PSUBD, psubd, sub);
5309     LMI_DIRECT(XOR_CP2, xor, xor);
5310     LMI_DIRECT(NOR_CP2, nor, nor);
5311     LMI_DIRECT(AND_CP2, and, and);
5312     LMI_DIRECT(OR_CP2, or, or);
5313
5314     case OPC_PANDN:
5315         tcg_gen_andc_i64(t0, t1, t0);
5316         break;
5317
5318     case OPC_PINSRH_0:
5319         tcg_gen_deposit_i64(t0, t0, t1, 0, 16);
5320         break;
5321     case OPC_PINSRH_1:
5322         tcg_gen_deposit_i64(t0, t0, t1, 16, 16);
5323         break;
5324     case OPC_PINSRH_2:
5325         tcg_gen_deposit_i64(t0, t0, t1, 32, 16);
5326         break;
5327     case OPC_PINSRH_3:
5328         tcg_gen_deposit_i64(t0, t0, t1, 48, 16);
5329         break;
5330
5331     case OPC_PEXTRH:
5332         tcg_gen_andi_i64(t1, t1, 3);
5333         tcg_gen_shli_i64(t1, t1, 4);
5334         tcg_gen_shr_i64(t0, t0, t1);
5335         tcg_gen_ext16u_i64(t0, t0);
5336         break;
5337
5338     case OPC_ADDU_CP2:
5339         tcg_gen_add_i64(t0, t0, t1);
5340         tcg_gen_ext32s_i64(t0, t0);
5341         break;
5342     case OPC_SUBU_CP2:
5343         tcg_gen_sub_i64(t0, t0, t1);
5344         tcg_gen_ext32s_i64(t0, t0);
5345         break;
5346
5347     case OPC_SLL_CP2:
5348         shift_max = 32;
5349         goto do_shift;
5350     case OPC_SRL_CP2:
5351         shift_max = 32;
5352         goto do_shift;
5353     case OPC_SRA_CP2:
5354         shift_max = 32;
5355         goto do_shift;
5356     case OPC_DSLL_CP2:
5357         shift_max = 64;
5358         goto do_shift;
5359     case OPC_DSRL_CP2:
5360         shift_max = 64;
5361         goto do_shift;
5362     case OPC_DSRA_CP2:
5363         shift_max = 64;
5364         goto do_shift;
5365     do_shift:
5366         /* Make sure shift count isn't TCG undefined behaviour.  */
5367         tcg_gen_andi_i64(t1, t1, shift_max - 1);
5368
5369         switch (opc) {
5370         case OPC_SLL_CP2:
5371         case OPC_DSLL_CP2:
5372             tcg_gen_shl_i64(t0, t0, t1);
5373             break;
5374         case OPC_SRA_CP2:
5375         case OPC_DSRA_CP2:
5376             /* Since SRA is UndefinedResult without sign-extended inputs,
5377                we can treat SRA and DSRA the same.  */
5378             tcg_gen_sar_i64(t0, t0, t1);
5379             break;
5380         case OPC_SRL_CP2:
5381             /* We want to shift in zeros for SRL; zero-extend first.  */
5382             tcg_gen_ext32u_i64(t0, t0);
5383             /* FALLTHRU */
5384         case OPC_DSRL_CP2:
5385             tcg_gen_shr_i64(t0, t0, t1);
5386             break;
5387         }
5388
5389         if (shift_max == 32) {
5390             tcg_gen_ext32s_i64(t0, t0);
5391         }
5392
5393         /* Shifts larger than MAX produce zero.  */
5394         tcg_gen_setcondi_i64(TCG_COND_LTU, t1, t1, shift_max);
5395         tcg_gen_neg_i64(t1, t1);
5396         tcg_gen_and_i64(t0, t0, t1);
5397         break;
5398
5399     case OPC_ADD_CP2:
5400     case OPC_DADD_CP2:
5401         {
5402             TCGv_i64 t2 = tcg_temp_new_i64();
5403             TCGLabel *lab = gen_new_label();
5404
5405             tcg_gen_mov_i64(t2, t0);
5406             tcg_gen_add_i64(t0, t1, t2);
5407             if (opc == OPC_ADD_CP2) {
5408                 tcg_gen_ext32s_i64(t0, t0);
5409             }
5410             tcg_gen_xor_i64(t1, t1, t2);
5411             tcg_gen_xor_i64(t2, t2, t0);
5412             tcg_gen_andc_i64(t1, t2, t1);
5413             tcg_temp_free_i64(t2);
5414             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
5415             generate_exception(ctx, EXCP_OVERFLOW);
5416             gen_set_label(lab);
5417             break;
5418         }
5419
5420     case OPC_SUB_CP2:
5421     case OPC_DSUB_CP2:
5422         {
5423             TCGv_i64 t2 = tcg_temp_new_i64();
5424             TCGLabel *lab = gen_new_label();
5425
5426             tcg_gen_mov_i64(t2, t0);
5427             tcg_gen_sub_i64(t0, t1, t2);
5428             if (opc == OPC_SUB_CP2) {
5429                 tcg_gen_ext32s_i64(t0, t0);
5430             }
5431             tcg_gen_xor_i64(t1, t1, t2);
5432             tcg_gen_xor_i64(t2, t2, t0);
5433             tcg_gen_and_i64(t1, t1, t2);
5434             tcg_temp_free_i64(t2);
5435             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
5436             generate_exception(ctx, EXCP_OVERFLOW);
5437             gen_set_label(lab);
5438             break;
5439         }
5440
5441     case OPC_PMULUW:
5442         tcg_gen_ext32u_i64(t0, t0);
5443         tcg_gen_ext32u_i64(t1, t1);
5444         tcg_gen_mul_i64(t0, t0, t1);
5445         break;
5446
5447     case OPC_SEQU_CP2:
5448     case OPC_SEQ_CP2:
5449     case OPC_SLTU_CP2:
5450     case OPC_SLT_CP2:
5451     case OPC_SLEU_CP2:
5452     case OPC_SLE_CP2:
5453         /* ??? Document is unclear: Set FCC[CC].  Does that mean the
5454            FD field is the CC field?  */
5455     default:
5456         MIPS_INVAL("loongson_cp2");
5457         generate_exception_end(ctx, EXCP_RI);
5458         return;
5459     }
5460
5461 #undef LMI_HELPER
5462 #undef LMI_DIRECT
5463
5464     gen_store_fpr64(ctx, t0, rd);
5465
5466     tcg_temp_free_i64(t0);
5467     tcg_temp_free_i64(t1);
5468 }
5469
5470 /* Traps */
5471 static void gen_trap (DisasContext *ctx, uint32_t opc,
5472                       int rs, int rt, int16_t imm)
5473 {
5474     int cond;
5475     TCGv t0 = tcg_temp_new();
5476     TCGv t1 = tcg_temp_new();
5477
5478     cond = 0;
5479     /* Load needed operands */
5480     switch (opc) {
5481     case OPC_TEQ:
5482     case OPC_TGE:
5483     case OPC_TGEU:
5484     case OPC_TLT:
5485     case OPC_TLTU:
5486     case OPC_TNE:
5487         /* Compare two registers */
5488         if (rs != rt) {
5489             gen_load_gpr(t0, rs);
5490             gen_load_gpr(t1, rt);
5491             cond = 1;
5492         }
5493         break;
5494     case OPC_TEQI:
5495     case OPC_TGEI:
5496     case OPC_TGEIU:
5497     case OPC_TLTI:
5498     case OPC_TLTIU:
5499     case OPC_TNEI:
5500         /* Compare register to immediate */
5501         if (rs != 0 || imm != 0) {
5502             gen_load_gpr(t0, rs);
5503             tcg_gen_movi_tl(t1, (int32_t)imm);
5504             cond = 1;
5505         }
5506         break;
5507     }
5508     if (cond == 0) {
5509         switch (opc) {
5510         case OPC_TEQ:   /* rs == rs */
5511         case OPC_TEQI:  /* r0 == 0  */
5512         case OPC_TGE:   /* rs >= rs */
5513         case OPC_TGEI:  /* r0 >= 0  */
5514         case OPC_TGEU:  /* rs >= rs unsigned */
5515         case OPC_TGEIU: /* r0 >= 0  unsigned */
5516             /* Always trap */
5517             generate_exception_end(ctx, EXCP_TRAP);
5518             break;
5519         case OPC_TLT:   /* rs < rs           */
5520         case OPC_TLTI:  /* r0 < 0            */
5521         case OPC_TLTU:  /* rs < rs unsigned  */
5522         case OPC_TLTIU: /* r0 < 0  unsigned  */
5523         case OPC_TNE:   /* rs != rs          */
5524         case OPC_TNEI:  /* r0 != 0           */
5525             /* Never trap: treat as NOP. */
5526             break;
5527         }
5528     } else {
5529         TCGLabel *l1 = gen_new_label();
5530
5531         switch (opc) {
5532         case OPC_TEQ:
5533         case OPC_TEQI:
5534             tcg_gen_brcond_tl(TCG_COND_NE, t0, t1, l1);
5535             break;
5536         case OPC_TGE:
5537         case OPC_TGEI:
5538             tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1);
5539             break;
5540         case OPC_TGEU:
5541         case OPC_TGEIU:
5542             tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1);
5543             break;
5544         case OPC_TLT:
5545         case OPC_TLTI:
5546             tcg_gen_brcond_tl(TCG_COND_GE, t0, t1, l1);
5547             break;
5548         case OPC_TLTU:
5549         case OPC_TLTIU:
5550             tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1);
5551             break;
5552         case OPC_TNE:
5553         case OPC_TNEI:
5554             tcg_gen_brcond_tl(TCG_COND_EQ, t0, t1, l1);
5555             break;
5556         }
5557         generate_exception(ctx, EXCP_TRAP);
5558         gen_set_label(l1);
5559     }
5560     tcg_temp_free(t0);
5561     tcg_temp_free(t1);
5562 }
5563
5564 static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest)
5565 {
5566     if (unlikely(ctx->base.singlestep_enabled)) {
5567         return false;
5568     }
5569
5570 #ifndef CONFIG_USER_ONLY
5571     return (ctx->base.tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK);
5572 #else
5573     return true;
5574 #endif
5575 }
5576
5577 static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
5578 {
5579     if (use_goto_tb(ctx, dest)) {
5580         tcg_gen_goto_tb(n);
5581         gen_save_pc(dest);
5582         tcg_gen_exit_tb(ctx->base.tb, n);
5583     } else {
5584         gen_save_pc(dest);
5585         if (ctx->base.singlestep_enabled) {
5586             save_cpu_state(ctx, 0);
5587             gen_helper_raise_exception_debug(cpu_env);
5588         }
5589         tcg_gen_lookup_and_goto_ptr();
5590     }
5591 }
5592
5593 /* Branches (before delay slot) */
5594 static void gen_compute_branch (DisasContext *ctx, uint32_t opc,
5595                                 int insn_bytes,
5596                                 int rs, int rt, int32_t offset,
5597                                 int delayslot_size)
5598 {
5599     target_ulong btgt = -1;
5600     int blink = 0;
5601     int bcond_compute = 0;
5602     TCGv t0 = tcg_temp_new();
5603     TCGv t1 = tcg_temp_new();
5604
5605     if (ctx->hflags & MIPS_HFLAG_BMASK) {
5606 #ifdef MIPS_DEBUG_DISAS
5607         LOG_DISAS("Branch in delay / forbidden slot at PC 0x"
5608                   TARGET_FMT_lx "\n", ctx->base.pc_next);
5609 #endif
5610         generate_exception_end(ctx, EXCP_RI);
5611         goto out;
5612     }
5613
5614     /* Load needed operands */
5615     switch (opc) {
5616     case OPC_BEQ:
5617     case OPC_BEQL:
5618     case OPC_BNE:
5619     case OPC_BNEL:
5620         /* Compare two registers */
5621         if (rs != rt) {
5622             gen_load_gpr(t0, rs);
5623             gen_load_gpr(t1, rt);
5624             bcond_compute = 1;
5625         }
5626         btgt = ctx->base.pc_next + insn_bytes + offset;
5627         break;
5628     case OPC_BGEZ:
5629     case OPC_BGEZAL:
5630     case OPC_BGEZALL:
5631     case OPC_BGEZL:
5632     case OPC_BGTZ:
5633     case OPC_BGTZL:
5634     case OPC_BLEZ:
5635     case OPC_BLEZL:
5636     case OPC_BLTZ:
5637     case OPC_BLTZAL:
5638     case OPC_BLTZALL:
5639     case OPC_BLTZL:
5640         /* Compare to zero */
5641         if (rs != 0) {
5642             gen_load_gpr(t0, rs);
5643             bcond_compute = 1;
5644         }
5645         btgt = ctx->base.pc_next + insn_bytes + offset;
5646         break;
5647     case OPC_BPOSGE32:
5648 #if defined(TARGET_MIPS64)
5649     case OPC_BPOSGE64:
5650         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x7F);
5651 #else
5652         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
5653 #endif
5654         bcond_compute = 1;
5655         btgt = ctx->base.pc_next + insn_bytes + offset;
5656         break;
5657     case OPC_J:
5658     case OPC_JAL:
5659     case OPC_JALX:
5660         /* Jump to immediate */
5661         btgt = ((ctx->base.pc_next + insn_bytes) & (int32_t)0xF0000000) |
5662             (uint32_t)offset;
5663         break;
5664     case OPC_JR:
5665     case OPC_JALR:
5666         /* Jump to register */
5667         if (offset != 0 && offset != 16) {
5668             /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
5669                others are reserved. */
5670             MIPS_INVAL("jump hint");
5671             generate_exception_end(ctx, EXCP_RI);
5672             goto out;
5673         }
5674         gen_load_gpr(btarget, rs);
5675         break;
5676     default:
5677         MIPS_INVAL("branch/jump");
5678         generate_exception_end(ctx, EXCP_RI);
5679         goto out;
5680     }
5681     if (bcond_compute == 0) {
5682         /* No condition to be computed */
5683         switch (opc) {
5684         case OPC_BEQ:     /* rx == rx        */
5685         case OPC_BEQL:    /* rx == rx likely */
5686         case OPC_BGEZ:    /* 0 >= 0          */
5687         case OPC_BGEZL:   /* 0 >= 0 likely   */
5688         case OPC_BLEZ:    /* 0 <= 0          */
5689         case OPC_BLEZL:   /* 0 <= 0 likely   */
5690             /* Always take */
5691             ctx->hflags |= MIPS_HFLAG_B;
5692             break;
5693         case OPC_BGEZAL:  /* 0 >= 0          */
5694         case OPC_BGEZALL: /* 0 >= 0 likely   */
5695             /* Always take and link */
5696             blink = 31;
5697             ctx->hflags |= MIPS_HFLAG_B;
5698             break;
5699         case OPC_BNE:     /* rx != rx        */
5700         case OPC_BGTZ:    /* 0 > 0           */
5701         case OPC_BLTZ:    /* 0 < 0           */
5702             /* Treat as NOP. */
5703             goto out;
5704         case OPC_BLTZAL:  /* 0 < 0           */
5705             /* Handle as an unconditional branch to get correct delay
5706                slot checking.  */
5707             blink = 31;
5708             btgt = ctx->base.pc_next + insn_bytes + delayslot_size;
5709             ctx->hflags |= MIPS_HFLAG_B;
5710             break;
5711         case OPC_BLTZALL: /* 0 < 0 likely */
5712             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 8);
5713             /* Skip the instruction in the delay slot */
5714             ctx->base.pc_next += 4;
5715             goto out;
5716         case OPC_BNEL:    /* rx != rx likely */
5717         case OPC_BGTZL:   /* 0 > 0 likely */
5718         case OPC_BLTZL:   /* 0 < 0 likely */
5719             /* Skip the instruction in the delay slot */
5720             ctx->base.pc_next += 4;
5721             goto out;
5722         case OPC_J:
5723             ctx->hflags |= MIPS_HFLAG_B;
5724             break;
5725         case OPC_JALX:
5726             ctx->hflags |= MIPS_HFLAG_BX;
5727             /* Fallthrough */
5728         case OPC_JAL:
5729             blink = 31;
5730             ctx->hflags |= MIPS_HFLAG_B;
5731             break;
5732         case OPC_JR:
5733             ctx->hflags |= MIPS_HFLAG_BR;
5734             break;
5735         case OPC_JALR:
5736             blink = rt;
5737             ctx->hflags |= MIPS_HFLAG_BR;
5738             break;
5739         default:
5740             MIPS_INVAL("branch/jump");
5741             generate_exception_end(ctx, EXCP_RI);
5742             goto out;
5743         }
5744     } else {
5745         switch (opc) {
5746         case OPC_BEQ:
5747             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
5748             goto not_likely;
5749         case OPC_BEQL:
5750             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
5751             goto likely;
5752         case OPC_BNE:
5753             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
5754             goto not_likely;
5755         case OPC_BNEL:
5756             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
5757             goto likely;
5758         case OPC_BGEZ:
5759             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5760             goto not_likely;
5761         case OPC_BGEZL:
5762             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5763             goto likely;
5764         case OPC_BGEZAL:
5765             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5766             blink = 31;
5767             goto not_likely;
5768         case OPC_BGEZALL:
5769             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5770             blink = 31;
5771             goto likely;
5772         case OPC_BGTZ:
5773             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
5774             goto not_likely;
5775         case OPC_BGTZL:
5776             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
5777             goto likely;
5778         case OPC_BLEZ:
5779             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
5780             goto not_likely;
5781         case OPC_BLEZL:
5782             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
5783             goto likely;
5784         case OPC_BLTZ:
5785             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5786             goto not_likely;
5787         case OPC_BLTZL:
5788             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5789             goto likely;
5790         case OPC_BPOSGE32:
5791             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
5792             goto not_likely;
5793 #if defined(TARGET_MIPS64)
5794         case OPC_BPOSGE64:
5795             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 64);
5796             goto not_likely;
5797 #endif
5798         case OPC_BLTZAL:
5799             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5800             blink = 31;
5801         not_likely:
5802             ctx->hflags |= MIPS_HFLAG_BC;
5803             break;
5804         case OPC_BLTZALL:
5805             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5806             blink = 31;
5807         likely:
5808             ctx->hflags |= MIPS_HFLAG_BL;
5809             break;
5810         default:
5811             MIPS_INVAL("conditional branch/jump");
5812             generate_exception_end(ctx, EXCP_RI);
5813             goto out;
5814         }
5815     }
5816
5817     ctx->btarget = btgt;
5818
5819     switch (delayslot_size) {
5820     case 2:
5821         ctx->hflags |= MIPS_HFLAG_BDS16;
5822         break;
5823     case 4:
5824         ctx->hflags |= MIPS_HFLAG_BDS32;
5825         break;
5826     }
5827
5828     if (blink > 0) {
5829         int post_delay = insn_bytes + delayslot_size;
5830         int lowbit = !!(ctx->hflags & MIPS_HFLAG_M16);
5831
5832         tcg_gen_movi_tl(cpu_gpr[blink],
5833                         ctx->base.pc_next + post_delay + lowbit);
5834     }
5835
5836  out:
5837     if (insn_bytes == 2)
5838         ctx->hflags |= MIPS_HFLAG_B16;
5839     tcg_temp_free(t0);
5840     tcg_temp_free(t1);
5841 }
5842
5843
5844 /* nanoMIPS Branches */
5845 static void gen_compute_branch_nm(DisasContext *ctx, uint32_t opc,
5846                                 int insn_bytes,
5847                                 int rs, int rt, int32_t offset)
5848 {
5849     target_ulong btgt = -1;
5850     int bcond_compute = 0;
5851     TCGv t0 = tcg_temp_new();
5852     TCGv t1 = tcg_temp_new();
5853
5854     /* Load needed operands */
5855     switch (opc) {
5856     case OPC_BEQ:
5857     case OPC_BNE:
5858         /* Compare two registers */
5859         if (rs != rt) {
5860             gen_load_gpr(t0, rs);
5861             gen_load_gpr(t1, rt);
5862             bcond_compute = 1;
5863         }
5864         btgt = ctx->base.pc_next + insn_bytes + offset;
5865         break;
5866     case OPC_BGEZAL:
5867         /* Compare to zero */
5868         if (rs != 0) {
5869             gen_load_gpr(t0, rs);
5870             bcond_compute = 1;
5871         }
5872         btgt = ctx->base.pc_next + insn_bytes + offset;
5873         break;
5874     case OPC_BPOSGE32:
5875         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
5876         bcond_compute = 1;
5877         btgt = ctx->base.pc_next + insn_bytes + offset;
5878         break;
5879     case OPC_JR:
5880     case OPC_JALR:
5881         /* Jump to register */
5882         if (offset != 0 && offset != 16) {
5883             /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
5884                others are reserved. */
5885             MIPS_INVAL("jump hint");
5886             generate_exception_end(ctx, EXCP_RI);
5887             goto out;
5888         }
5889         gen_load_gpr(btarget, rs);
5890         break;
5891     default:
5892         MIPS_INVAL("branch/jump");
5893         generate_exception_end(ctx, EXCP_RI);
5894         goto out;
5895     }
5896     if (bcond_compute == 0) {
5897         /* No condition to be computed */
5898         switch (opc) {
5899         case OPC_BEQ:     /* rx == rx        */
5900             /* Always take */
5901             ctx->hflags |= MIPS_HFLAG_B;
5902             break;
5903         case OPC_BGEZAL:  /* 0 >= 0          */
5904             /* Always take and link */
5905             tcg_gen_movi_tl(cpu_gpr[31],
5906                             ctx->base.pc_next + insn_bytes);
5907             ctx->hflags |= MIPS_HFLAG_B;
5908             break;
5909         case OPC_BNE:     /* rx != rx        */
5910             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 8);
5911             /* Skip the instruction in the delay slot */
5912             ctx->base.pc_next += 4;
5913             goto out;
5914         case OPC_JR:
5915             ctx->hflags |= MIPS_HFLAG_BR;
5916             break;
5917         case OPC_JALR:
5918             if (rt > 0) {
5919                 tcg_gen_movi_tl(cpu_gpr[rt],
5920                                 ctx->base.pc_next + insn_bytes);
5921             }
5922             ctx->hflags |= MIPS_HFLAG_BR;
5923             break;
5924         default:
5925             MIPS_INVAL("branch/jump");
5926             generate_exception_end(ctx, EXCP_RI);
5927             goto out;
5928         }
5929     } else {
5930         switch (opc) {
5931         case OPC_BEQ:
5932             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
5933             goto not_likely;
5934         case OPC_BNE:
5935             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
5936             goto not_likely;
5937         case OPC_BGEZAL:
5938             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5939             tcg_gen_movi_tl(cpu_gpr[31],
5940                             ctx->base.pc_next + insn_bytes);
5941             goto not_likely;
5942         case OPC_BPOSGE32:
5943             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
5944         not_likely:
5945             ctx->hflags |= MIPS_HFLAG_BC;
5946             break;
5947         default:
5948             MIPS_INVAL("conditional branch/jump");
5949             generate_exception_end(ctx, EXCP_RI);
5950             goto out;
5951         }
5952     }
5953
5954     ctx->btarget = btgt;
5955
5956  out:
5957     if (insn_bytes == 2) {
5958         ctx->hflags |= MIPS_HFLAG_B16;
5959     }
5960     tcg_temp_free(t0);
5961     tcg_temp_free(t1);
5962 }
5963
5964
5965 /* special3 bitfield operations */
5966 static void gen_bitops (DisasContext *ctx, uint32_t opc, int rt,
5967                         int rs, int lsb, int msb)
5968 {
5969     TCGv t0 = tcg_temp_new();
5970     TCGv t1 = tcg_temp_new();
5971
5972     gen_load_gpr(t1, rs);
5973     switch (opc) {
5974     case OPC_EXT:
5975         if (lsb + msb > 31) {
5976             goto fail;
5977         }
5978         if (msb != 31) {
5979             tcg_gen_extract_tl(t0, t1, lsb, msb + 1);
5980         } else {
5981             /* The two checks together imply that lsb == 0,
5982                so this is a simple sign-extension.  */
5983             tcg_gen_ext32s_tl(t0, t1);
5984         }
5985         break;
5986 #if defined(TARGET_MIPS64)
5987     case OPC_DEXTU:
5988         lsb += 32;
5989         goto do_dext;
5990     case OPC_DEXTM:
5991         msb += 32;
5992         goto do_dext;
5993     case OPC_DEXT:
5994     do_dext:
5995         if (lsb + msb > 63) {
5996             goto fail;
5997         }
5998         tcg_gen_extract_tl(t0, t1, lsb, msb + 1);
5999         break;
6000 #endif
6001     case OPC_INS:
6002         if (lsb > msb) {
6003             goto fail;
6004         }
6005         gen_load_gpr(t0, rt);
6006         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
6007         tcg_gen_ext32s_tl(t0, t0);
6008         break;
6009 #if defined(TARGET_MIPS64)
6010     case OPC_DINSU:
6011         lsb += 32;
6012         /* FALLTHRU */
6013     case OPC_DINSM:
6014         msb += 32;
6015         /* FALLTHRU */
6016     case OPC_DINS:
6017         if (lsb > msb) {
6018             goto fail;
6019         }
6020         gen_load_gpr(t0, rt);
6021         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
6022         break;
6023 #endif
6024     default:
6025 fail:
6026         MIPS_INVAL("bitops");
6027         generate_exception_end(ctx, EXCP_RI);
6028         tcg_temp_free(t0);
6029         tcg_temp_free(t1);
6030         return;
6031     }
6032     gen_store_gpr(t0, rt);
6033     tcg_temp_free(t0);
6034     tcg_temp_free(t1);
6035 }
6036
6037 static void gen_bshfl (DisasContext *ctx, uint32_t op2, int rt, int rd)
6038 {
6039     TCGv t0;
6040
6041     if (rd == 0) {
6042         /* If no destination, treat it as a NOP. */
6043         return;
6044     }
6045
6046     t0 = tcg_temp_new();
6047     gen_load_gpr(t0, rt);
6048     switch (op2) {
6049     case OPC_WSBH:
6050         {
6051             TCGv t1 = tcg_temp_new();
6052             TCGv t2 = tcg_const_tl(0x00FF00FF);
6053
6054             tcg_gen_shri_tl(t1, t0, 8);
6055             tcg_gen_and_tl(t1, t1, t2);
6056             tcg_gen_and_tl(t0, t0, t2);
6057             tcg_gen_shli_tl(t0, t0, 8);
6058             tcg_gen_or_tl(t0, t0, t1);
6059             tcg_temp_free(t2);
6060             tcg_temp_free(t1);
6061             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
6062         }
6063         break;
6064     case OPC_SEB:
6065         tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
6066         break;
6067     case OPC_SEH:
6068         tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
6069         break;
6070 #if defined(TARGET_MIPS64)
6071     case OPC_DSBH:
6072         {
6073             TCGv t1 = tcg_temp_new();
6074             TCGv t2 = tcg_const_tl(0x00FF00FF00FF00FFULL);
6075
6076             tcg_gen_shri_tl(t1, t0, 8);
6077             tcg_gen_and_tl(t1, t1, t2);
6078             tcg_gen_and_tl(t0, t0, t2);
6079             tcg_gen_shli_tl(t0, t0, 8);
6080             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
6081             tcg_temp_free(t2);
6082             tcg_temp_free(t1);
6083         }
6084         break;
6085     case OPC_DSHD:
6086         {
6087             TCGv t1 = tcg_temp_new();
6088             TCGv t2 = tcg_const_tl(0x0000FFFF0000FFFFULL);
6089
6090             tcg_gen_shri_tl(t1, t0, 16);
6091             tcg_gen_and_tl(t1, t1, t2);
6092             tcg_gen_and_tl(t0, t0, t2);
6093             tcg_gen_shli_tl(t0, t0, 16);
6094             tcg_gen_or_tl(t0, t0, t1);
6095             tcg_gen_shri_tl(t1, t0, 32);
6096             tcg_gen_shli_tl(t0, t0, 32);
6097             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
6098             tcg_temp_free(t2);
6099             tcg_temp_free(t1);
6100         }
6101         break;
6102 #endif
6103     default:
6104         MIPS_INVAL("bsfhl");
6105         generate_exception_end(ctx, EXCP_RI);
6106         tcg_temp_free(t0);
6107         return;
6108     }
6109     tcg_temp_free(t0);
6110 }
6111
6112 static void gen_lsa(DisasContext *ctx, int opc, int rd, int rs, int rt,
6113                     int imm2)
6114 {
6115     TCGv t0;
6116     TCGv t1;
6117     if (rd == 0) {
6118         /* Treat as NOP. */
6119         return;
6120     }
6121     t0 = tcg_temp_new();
6122     t1 = tcg_temp_new();
6123     gen_load_gpr(t0, rs);
6124     gen_load_gpr(t1, rt);
6125     tcg_gen_shli_tl(t0, t0, imm2 + 1);
6126     tcg_gen_add_tl(cpu_gpr[rd], t0, t1);
6127     if (opc == OPC_LSA) {
6128         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
6129     }
6130
6131     tcg_temp_free(t1);
6132     tcg_temp_free(t0);
6133
6134     return;
6135 }
6136
6137 static void gen_align_bits(DisasContext *ctx, int wordsz, int rd, int rs,
6138                            int rt, int bits)
6139 {
6140     TCGv t0;
6141     if (rd == 0) {
6142         /* Treat as NOP. */
6143         return;
6144     }
6145     t0 = tcg_temp_new();
6146     if (bits == 0 || bits == wordsz) {
6147         if (bits == 0) {
6148             gen_load_gpr(t0, rt);
6149         } else {
6150             gen_load_gpr(t0, rs);
6151         }
6152         switch (wordsz) {
6153         case 32:
6154             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
6155             break;
6156 #if defined(TARGET_MIPS64)
6157         case 64:
6158             tcg_gen_mov_tl(cpu_gpr[rd], t0);
6159             break;
6160 #endif
6161         }
6162     } else {
6163         TCGv t1 = tcg_temp_new();
6164         gen_load_gpr(t0, rt);
6165         gen_load_gpr(t1, rs);
6166         switch (wordsz) {
6167         case 32:
6168             {
6169                 TCGv_i64 t2 = tcg_temp_new_i64();
6170                 tcg_gen_concat_tl_i64(t2, t1, t0);
6171                 tcg_gen_shri_i64(t2, t2, 32 - bits);
6172                 gen_move_low32(cpu_gpr[rd], t2);
6173                 tcg_temp_free_i64(t2);
6174             }
6175             break;
6176 #if defined(TARGET_MIPS64)
6177         case 64:
6178             tcg_gen_shli_tl(t0, t0, bits);
6179             tcg_gen_shri_tl(t1, t1, 64 - bits);
6180             tcg_gen_or_tl(cpu_gpr[rd], t1, t0);
6181             break;
6182 #endif
6183         }
6184         tcg_temp_free(t1);
6185     }
6186
6187     tcg_temp_free(t0);
6188 }
6189
6190 static void gen_align(DisasContext *ctx, int wordsz, int rd, int rs, int rt,
6191                       int bp)
6192 {
6193     gen_align_bits(ctx, wordsz, rd, rs, rt, bp * 8);
6194 }
6195
6196 static void gen_ext(DisasContext *ctx, int wordsz, int rd, int rs, int rt,
6197                     int shift)
6198 {
6199     gen_align_bits(ctx, wordsz, rd, rs, rt, wordsz - shift);
6200 }
6201
6202 static void gen_bitswap(DisasContext *ctx, int opc, int rd, int rt)
6203 {
6204     TCGv t0;
6205     if (rd == 0) {
6206         /* Treat as NOP. */
6207         return;
6208     }
6209     t0 = tcg_temp_new();
6210     gen_load_gpr(t0, rt);
6211     switch (opc) {
6212     case OPC_BITSWAP:
6213         gen_helper_bitswap(cpu_gpr[rd], t0);
6214         break;
6215 #if defined(TARGET_MIPS64)
6216     case OPC_DBITSWAP:
6217         gen_helper_dbitswap(cpu_gpr[rd], t0);
6218         break;
6219 #endif
6220     }
6221     tcg_temp_free(t0);
6222 }
6223
6224 #ifndef CONFIG_USER_ONLY
6225 /* CP0 (MMU and control) */
6226 static inline void gen_mthc0_entrylo(TCGv arg, target_ulong off)
6227 {
6228     TCGv_i64 t0 = tcg_temp_new_i64();
6229     TCGv_i64 t1 = tcg_temp_new_i64();
6230
6231     tcg_gen_ext_tl_i64(t0, arg);
6232     tcg_gen_ld_i64(t1, cpu_env, off);
6233 #if defined(TARGET_MIPS64)
6234     tcg_gen_deposit_i64(t1, t1, t0, 30, 32);
6235 #else
6236     tcg_gen_concat32_i64(t1, t1, t0);
6237 #endif
6238     tcg_gen_st_i64(t1, cpu_env, off);
6239     tcg_temp_free_i64(t1);
6240     tcg_temp_free_i64(t0);
6241 }
6242
6243 static inline void gen_mthc0_store64(TCGv arg, target_ulong off)
6244 {
6245     TCGv_i64 t0 = tcg_temp_new_i64();
6246     TCGv_i64 t1 = tcg_temp_new_i64();
6247
6248     tcg_gen_ext_tl_i64(t0, arg);
6249     tcg_gen_ld_i64(t1, cpu_env, off);
6250     tcg_gen_concat32_i64(t1, t1, t0);
6251     tcg_gen_st_i64(t1, cpu_env, off);
6252     tcg_temp_free_i64(t1);
6253     tcg_temp_free_i64(t0);
6254 }
6255
6256 static inline void gen_mfhc0_entrylo(TCGv arg, target_ulong off)
6257 {
6258     TCGv_i64 t0 = tcg_temp_new_i64();
6259
6260     tcg_gen_ld_i64(t0, cpu_env, off);
6261 #if defined(TARGET_MIPS64)
6262     tcg_gen_shri_i64(t0, t0, 30);
6263 #else
6264     tcg_gen_shri_i64(t0, t0, 32);
6265 #endif
6266     gen_move_low32(arg, t0);
6267     tcg_temp_free_i64(t0);
6268 }
6269
6270 static inline void gen_mfhc0_load64(TCGv arg, target_ulong off, int shift)
6271 {
6272     TCGv_i64 t0 = tcg_temp_new_i64();
6273
6274     tcg_gen_ld_i64(t0, cpu_env, off);
6275     tcg_gen_shri_i64(t0, t0, 32 + shift);
6276     gen_move_low32(arg, t0);
6277     tcg_temp_free_i64(t0);
6278 }
6279
6280 static inline void gen_mfc0_load32 (TCGv arg, target_ulong off)
6281 {
6282     TCGv_i32 t0 = tcg_temp_new_i32();
6283
6284     tcg_gen_ld_i32(t0, cpu_env, off);
6285     tcg_gen_ext_i32_tl(arg, t0);
6286     tcg_temp_free_i32(t0);
6287 }
6288
6289 static inline void gen_mfc0_load64 (TCGv arg, target_ulong off)
6290 {
6291     tcg_gen_ld_tl(arg, cpu_env, off);
6292     tcg_gen_ext32s_tl(arg, arg);
6293 }
6294
6295 static inline void gen_mtc0_store32 (TCGv arg, target_ulong off)
6296 {
6297     TCGv_i32 t0 = tcg_temp_new_i32();
6298
6299     tcg_gen_trunc_tl_i32(t0, arg);
6300     tcg_gen_st_i32(t0, cpu_env, off);
6301     tcg_temp_free_i32(t0);
6302 }
6303
6304 #define CP0_CHECK(c)                            \
6305     do {                                        \
6306         if (!(c)) {                             \
6307             goto cp0_unimplemented;             \
6308         }                                       \
6309     } while (0)
6310
6311 static void gen_mfhc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6312 {
6313     const char *rn = "invalid";
6314
6315     switch (reg) {
6316     case 2:
6317         switch (sel) {
6318         case 0:
6319             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
6320             gen_mfhc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo0));
6321             rn = "EntryLo0";
6322             break;
6323         default:
6324             goto cp0_unimplemented;
6325         }
6326         break;
6327     case 3:
6328         switch (sel) {
6329         case 0:
6330             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
6331             gen_mfhc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo1));
6332             rn = "EntryLo1";
6333             break;
6334         default:
6335             goto cp0_unimplemented;
6336         }
6337         break;
6338     case 17:
6339         switch (sel) {
6340         case 0:
6341             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, lladdr),
6342                              ctx->CP0_LLAddr_shift);
6343             rn = "LLAddr";
6344             break;
6345         case 1:
6346             CP0_CHECK(ctx->mrp);
6347             gen_helper_mfhc0_maar(arg, cpu_env);
6348             rn = "MAAR";
6349             break;
6350         default:
6351             goto cp0_unimplemented;
6352         }
6353         break;
6354     case 28:
6355         switch (sel) {
6356         case 0:
6357         case 2:
6358         case 4:
6359         case 6:
6360             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, CP0_TagLo), 0);
6361             rn = "TagLo";
6362             break;
6363         default:
6364             goto cp0_unimplemented;
6365         }
6366         break;
6367     default:
6368         goto cp0_unimplemented;
6369     }
6370     trace_mips_translate_c0("mfhc0", rn, reg, sel);
6371     return;
6372
6373 cp0_unimplemented:
6374     qemu_log_mask(LOG_UNIMP, "mfhc0 %s (reg %d sel %d)\n", rn, reg, sel);
6375     tcg_gen_movi_tl(arg, 0);
6376 }
6377
6378 static void gen_mthc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6379 {
6380     const char *rn = "invalid";
6381     uint64_t mask = ctx->PAMask >> 36;
6382
6383     switch (reg) {
6384     case 2:
6385         switch (sel) {
6386         case 0:
6387             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
6388             tcg_gen_andi_tl(arg, arg, mask);
6389             gen_mthc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo0));
6390             rn = "EntryLo0";
6391             break;
6392         default:
6393             goto cp0_unimplemented;
6394         }
6395         break;
6396     case 3:
6397         switch (sel) {
6398         case 0:
6399             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
6400             tcg_gen_andi_tl(arg, arg, mask);
6401             gen_mthc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo1));
6402             rn = "EntryLo1";
6403             break;
6404         default:
6405             goto cp0_unimplemented;
6406         }
6407         break;
6408     case 17:
6409         switch (sel) {
6410         case 0:
6411             /* LLAddr is read-only (the only exception is bit 0 if LLB is
6412                supported); the CP0_LLAddr_rw_bitmask does not seem to be
6413                relevant for modern MIPS cores supporting MTHC0, therefore
6414                treating MTHC0 to LLAddr as NOP. */
6415             rn = "LLAddr";
6416             break;
6417         case 1:
6418             CP0_CHECK(ctx->mrp);
6419             gen_helper_mthc0_maar(cpu_env, arg);
6420             rn = "MAAR";
6421             break;
6422         default:
6423             goto cp0_unimplemented;
6424         }
6425         break;
6426     case 28:
6427         switch (sel) {
6428         case 0:
6429         case 2:
6430         case 4:
6431         case 6:
6432             tcg_gen_andi_tl(arg, arg, mask);
6433             gen_mthc0_store64(arg, offsetof(CPUMIPSState, CP0_TagLo));
6434             rn = "TagLo";
6435             break;
6436         default:
6437             goto cp0_unimplemented;
6438         }
6439         break;
6440     default:
6441         goto cp0_unimplemented;
6442     }
6443     trace_mips_translate_c0("mthc0", rn, reg, sel);
6444
6445 cp0_unimplemented:
6446     qemu_log_mask(LOG_UNIMP, "mthc0 %s (reg %d sel %d)\n", rn, reg, sel);
6447 }
6448
6449 static inline void gen_mfc0_unimplemented(DisasContext *ctx, TCGv arg)
6450 {
6451     if (ctx->insn_flags & ISA_MIPS32R6) {
6452         tcg_gen_movi_tl(arg, 0);
6453     } else {
6454         tcg_gen_movi_tl(arg, ~0);
6455     }
6456 }
6457
6458 static void gen_mfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6459 {
6460     const char *rn = "invalid";
6461
6462     if (sel != 0)
6463         check_insn(ctx, ISA_MIPS32);
6464
6465     switch (reg) {
6466     case 0:
6467         switch (sel) {
6468         case 0:
6469             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
6470             rn = "Index";
6471             break;
6472         case 1:
6473             CP0_CHECK(ctx->insn_flags & ASE_MT);
6474             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
6475             rn = "MVPControl";
6476             break;
6477         case 2:
6478             CP0_CHECK(ctx->insn_flags & ASE_MT);
6479             gen_helper_mfc0_mvpconf0(arg, cpu_env);
6480             rn = "MVPConf0";
6481             break;
6482         case 3:
6483             CP0_CHECK(ctx->insn_flags & ASE_MT);
6484             gen_helper_mfc0_mvpconf1(arg, cpu_env);
6485             rn = "MVPConf1";
6486             break;
6487         case 4:
6488             CP0_CHECK(ctx->vp);
6489             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPControl));
6490             rn = "VPControl";
6491             break;
6492         default:
6493             goto cp0_unimplemented;
6494         }
6495         break;
6496     case 1:
6497         switch (sel) {
6498         case 0:
6499             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
6500             gen_helper_mfc0_random(arg, cpu_env);
6501             rn = "Random";
6502             break;
6503         case 1:
6504             CP0_CHECK(ctx->insn_flags & ASE_MT);
6505             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
6506             rn = "VPEControl";
6507             break;
6508         case 2:
6509             CP0_CHECK(ctx->insn_flags & ASE_MT);
6510             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
6511             rn = "VPEConf0";
6512             break;
6513         case 3:
6514             CP0_CHECK(ctx->insn_flags & ASE_MT);
6515             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
6516             rn = "VPEConf1";
6517             break;
6518         case 4:
6519             CP0_CHECK(ctx->insn_flags & ASE_MT);
6520             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_YQMask));
6521             rn = "YQMask";
6522             break;
6523         case 5:
6524             CP0_CHECK(ctx->insn_flags & ASE_MT);
6525             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
6526             rn = "VPESchedule";
6527             break;
6528         case 6:
6529             CP0_CHECK(ctx->insn_flags & ASE_MT);
6530             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
6531             rn = "VPEScheFBack";
6532             break;
6533         case 7:
6534             CP0_CHECK(ctx->insn_flags & ASE_MT);
6535             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
6536             rn = "VPEOpt";
6537             break;
6538         default:
6539             goto cp0_unimplemented;
6540         }
6541         break;
6542     case 2:
6543         switch (sel) {
6544         case 0:
6545             {
6546                 TCGv_i64 tmp = tcg_temp_new_i64();
6547                 tcg_gen_ld_i64(tmp, cpu_env,
6548                                offsetof(CPUMIPSState, CP0_EntryLo0));
6549 #if defined(TARGET_MIPS64)
6550                 if (ctx->rxi) {
6551                     /* Move RI/XI fields to bits 31:30 */
6552                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
6553                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
6554                 }
6555 #endif
6556                 gen_move_low32(arg, tmp);
6557                 tcg_temp_free_i64(tmp);
6558             }
6559             rn = "EntryLo0";
6560             break;
6561         case 1:
6562             CP0_CHECK(ctx->insn_flags & ASE_MT);
6563             gen_helper_mfc0_tcstatus(arg, cpu_env);
6564             rn = "TCStatus";
6565             break;
6566         case 2:
6567             CP0_CHECK(ctx->insn_flags & ASE_MT);
6568             gen_helper_mfc0_tcbind(arg, cpu_env);
6569             rn = "TCBind";
6570             break;
6571         case 3:
6572             CP0_CHECK(ctx->insn_flags & ASE_MT);
6573             gen_helper_mfc0_tcrestart(arg, cpu_env);
6574             rn = "TCRestart";
6575             break;
6576         case 4:
6577             CP0_CHECK(ctx->insn_flags & ASE_MT);
6578             gen_helper_mfc0_tchalt(arg, cpu_env);
6579             rn = "TCHalt";
6580             break;
6581         case 5:
6582             CP0_CHECK(ctx->insn_flags & ASE_MT);
6583             gen_helper_mfc0_tccontext(arg, cpu_env);
6584             rn = "TCContext";
6585             break;
6586         case 6:
6587             CP0_CHECK(ctx->insn_flags & ASE_MT);
6588             gen_helper_mfc0_tcschedule(arg, cpu_env);
6589             rn = "TCSchedule";
6590             break;
6591         case 7:
6592             CP0_CHECK(ctx->insn_flags & ASE_MT);
6593             gen_helper_mfc0_tcschefback(arg, cpu_env);
6594             rn = "TCScheFBack";
6595             break;
6596         default:
6597             goto cp0_unimplemented;
6598         }
6599         break;
6600     case 3:
6601         switch (sel) {
6602         case 0:
6603             {
6604                 TCGv_i64 tmp = tcg_temp_new_i64();
6605                 tcg_gen_ld_i64(tmp, cpu_env,
6606                                offsetof(CPUMIPSState, CP0_EntryLo1));
6607 #if defined(TARGET_MIPS64)
6608                 if (ctx->rxi) {
6609                     /* Move RI/XI fields to bits 31:30 */
6610                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
6611                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
6612                 }
6613 #endif
6614                 gen_move_low32(arg, tmp);
6615                 tcg_temp_free_i64(tmp);
6616             }
6617             rn = "EntryLo1";
6618             break;
6619         case 1:
6620             CP0_CHECK(ctx->vp);
6621             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_GlobalNumber));
6622             rn = "GlobalNumber";
6623             break;
6624         default:
6625             goto cp0_unimplemented;
6626         }
6627         break;
6628     case 4:
6629         switch (sel) {
6630         case 0:
6631             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
6632             tcg_gen_ext32s_tl(arg, arg);
6633             rn = "Context";
6634             break;
6635         case 1:
6636 //            gen_helper_mfc0_contextconfig(arg); /* SmartMIPS ASE */
6637             rn = "ContextConfig";
6638             goto cp0_unimplemented;
6639         case 2:
6640             CP0_CHECK(ctx->ulri);
6641             tcg_gen_ld_tl(arg, cpu_env,
6642                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
6643             tcg_gen_ext32s_tl(arg, arg);
6644             rn = "UserLocal";
6645             break;
6646         default:
6647             goto cp0_unimplemented;
6648         }
6649         break;
6650     case 5:
6651         switch (sel) {
6652         case 0:
6653             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
6654             rn = "PageMask";
6655             break;
6656         case 1:
6657             check_insn(ctx, ISA_MIPS32R2);
6658             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
6659             rn = "PageGrain";
6660             break;
6661         case 2:
6662             CP0_CHECK(ctx->sc);
6663             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl0));
6664             tcg_gen_ext32s_tl(arg, arg);
6665             rn = "SegCtl0";
6666             break;
6667         case 3:
6668             CP0_CHECK(ctx->sc);
6669             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl1));
6670             tcg_gen_ext32s_tl(arg, arg);
6671             rn = "SegCtl1";
6672             break;
6673         case 4:
6674             CP0_CHECK(ctx->sc);
6675             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl2));
6676             tcg_gen_ext32s_tl(arg, arg);
6677             rn = "SegCtl2";
6678             break;
6679         case 5:
6680             check_pw(ctx);
6681             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWBase));
6682             rn = "PWBase";
6683             break;
6684         case 6:
6685             check_pw(ctx);
6686             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWField));
6687             rn = "PWField";
6688             break;
6689         case 7:
6690             check_pw(ctx);
6691             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWSize));
6692             rn = "PWSize";
6693             break;
6694         default:
6695             goto cp0_unimplemented;
6696         }
6697         break;
6698     case 6:
6699         switch (sel) {
6700         case 0:
6701             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
6702             rn = "Wired";
6703             break;
6704         case 1:
6705             check_insn(ctx, ISA_MIPS32R2);
6706             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
6707             rn = "SRSConf0";
6708             break;
6709         case 2:
6710             check_insn(ctx, ISA_MIPS32R2);
6711             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
6712             rn = "SRSConf1";
6713             break;
6714         case 3:
6715             check_insn(ctx, ISA_MIPS32R2);
6716             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
6717             rn = "SRSConf2";
6718             break;
6719         case 4:
6720             check_insn(ctx, ISA_MIPS32R2);
6721             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
6722             rn = "SRSConf3";
6723             break;
6724         case 5:
6725             check_insn(ctx, ISA_MIPS32R2);
6726             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
6727             rn = "SRSConf4";
6728             break;
6729         case 6:
6730             check_pw(ctx);
6731             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWCtl));
6732             rn = "PWCtl";
6733             break;
6734         default:
6735             goto cp0_unimplemented;
6736         }
6737         break;
6738     case 7:
6739         switch (sel) {
6740         case 0:
6741             check_insn(ctx, ISA_MIPS32R2);
6742             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
6743             rn = "HWREna";
6744             break;
6745         default:
6746             goto cp0_unimplemented;
6747         }
6748         break;
6749     case 8:
6750         switch (sel) {
6751         case 0:
6752             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
6753             tcg_gen_ext32s_tl(arg, arg);
6754             rn = "BadVAddr";
6755             break;
6756         case 1:
6757             CP0_CHECK(ctx->bi);
6758             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
6759             rn = "BadInstr";
6760             break;
6761         case 2:
6762             CP0_CHECK(ctx->bp);
6763             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
6764             rn = "BadInstrP";
6765             break;
6766         case 3:
6767             CP0_CHECK(ctx->bi);
6768             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrX));
6769             tcg_gen_andi_tl(arg, arg, ~0xffff);
6770             rn = "BadInstrX";
6771             break;
6772        default:
6773             goto cp0_unimplemented;
6774         }
6775         break;
6776     case 9:
6777         switch (sel) {
6778         case 0:
6779             /* Mark as an IO operation because we read the time.  */
6780             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
6781                 gen_io_start();
6782             }
6783             gen_helper_mfc0_count(arg, cpu_env);
6784             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
6785                 gen_io_end();
6786             }
6787             /* Break the TB to be able to take timer interrupts immediately
6788                after reading count. DISAS_STOP isn't sufficient, we need to
6789                ensure we break completely out of translated code.  */
6790             gen_save_pc(ctx->base.pc_next + 4);
6791             ctx->base.is_jmp = DISAS_EXIT;
6792             rn = "Count";
6793             break;
6794         /* 6,7 are implementation dependent */
6795         default:
6796             goto cp0_unimplemented;
6797         }
6798         break;
6799     case 10:
6800         switch (sel) {
6801         case 0:
6802             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
6803             tcg_gen_ext32s_tl(arg, arg);
6804             rn = "EntryHi";
6805             break;
6806         default:
6807             goto cp0_unimplemented;
6808         }
6809         break;
6810     case 11:
6811         switch (sel) {
6812         case 0:
6813             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
6814             rn = "Compare";
6815             break;
6816         /* 6,7 are implementation dependent */
6817         default:
6818             goto cp0_unimplemented;
6819         }
6820         break;
6821     case 12:
6822         switch (sel) {
6823         case 0:
6824             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
6825             rn = "Status";
6826             break;
6827         case 1:
6828             check_insn(ctx, ISA_MIPS32R2);
6829             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
6830             rn = "IntCtl";
6831             break;
6832         case 2:
6833             check_insn(ctx, ISA_MIPS32R2);
6834             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
6835             rn = "SRSCtl";
6836             break;
6837         case 3:
6838             check_insn(ctx, ISA_MIPS32R2);
6839             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
6840             rn = "SRSMap";
6841             break;
6842         default:
6843             goto cp0_unimplemented;
6844        }
6845         break;
6846     case 13:
6847         switch (sel) {
6848         case 0:
6849             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
6850             rn = "Cause";
6851             break;
6852         default:
6853             goto cp0_unimplemented;
6854        }
6855         break;
6856     case 14:
6857         switch (sel) {
6858         case 0:
6859             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
6860             tcg_gen_ext32s_tl(arg, arg);
6861             rn = "EPC";
6862             break;
6863         default:
6864             goto cp0_unimplemented;
6865         }
6866         break;
6867     case 15:
6868         switch (sel) {
6869         case 0:
6870             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
6871             rn = "PRid";
6872             break;
6873         case 1:
6874             check_insn(ctx, ISA_MIPS32R2);
6875             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EBase));
6876             tcg_gen_ext32s_tl(arg, arg);
6877             rn = "EBase";
6878             break;
6879         case 3:
6880             check_insn(ctx, ISA_MIPS32R2);
6881             CP0_CHECK(ctx->cmgcr);
6882             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_CMGCRBase));
6883             tcg_gen_ext32s_tl(arg, arg);
6884             rn = "CMGCRBase";
6885             break;
6886         default:
6887             goto cp0_unimplemented;
6888        }
6889         break;
6890     case 16:
6891         switch (sel) {
6892         case 0:
6893             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
6894             rn = "Config";
6895             break;
6896         case 1:
6897             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
6898             rn = "Config1";
6899             break;
6900         case 2:
6901             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
6902             rn = "Config2";
6903             break;
6904         case 3:
6905             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
6906             rn = "Config3";
6907             break;
6908         case 4:
6909             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
6910             rn = "Config4";
6911             break;
6912         case 5:
6913             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
6914             rn = "Config5";
6915             break;
6916         /* 6,7 are implementation dependent */
6917         case 6:
6918             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
6919             rn = "Config6";
6920             break;
6921         case 7:
6922             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
6923             rn = "Config7";
6924             break;
6925         default:
6926             goto cp0_unimplemented;
6927         }
6928         break;
6929     case 17:
6930         switch (sel) {
6931         case 0:
6932             gen_helper_mfc0_lladdr(arg, cpu_env);
6933             rn = "LLAddr";
6934             break;
6935         case 1:
6936             CP0_CHECK(ctx->mrp);
6937             gen_helper_mfc0_maar(arg, cpu_env);
6938             rn = "MAAR";
6939             break;
6940         case 2:
6941             CP0_CHECK(ctx->mrp);
6942             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MAARI));
6943             rn = "MAARI";
6944             break;
6945         default:
6946             goto cp0_unimplemented;
6947         }
6948         break;
6949     case 18:
6950         switch (sel) {
6951         case 0:
6952         case 1:
6953         case 2:
6954         case 3:
6955         case 4:
6956         case 5:
6957         case 6:
6958         case 7:
6959             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
6960             gen_helper_1e0i(mfc0_watchlo, arg, sel);
6961             rn = "WatchLo";
6962             break;
6963         default:
6964             goto cp0_unimplemented;
6965         }
6966         break;
6967     case 19:
6968         switch (sel) {
6969         case 0:
6970         case 1:
6971         case 2:
6972         case 3:
6973         case 4:
6974         case 5:
6975         case 6:
6976         case 7:
6977             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
6978             gen_helper_1e0i(mfc0_watchhi, arg, sel);
6979             rn = "WatchHi";
6980             break;
6981         default:
6982             goto cp0_unimplemented;
6983         }
6984         break;
6985     case 20:
6986         switch (sel) {
6987         case 0:
6988 #if defined(TARGET_MIPS64)
6989             check_insn(ctx, ISA_MIPS3);
6990             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
6991             tcg_gen_ext32s_tl(arg, arg);
6992             rn = "XContext";
6993             break;
6994 #endif
6995         default:
6996             goto cp0_unimplemented;
6997         }
6998         break;
6999     case 21:
7000        /* Officially reserved, but sel 0 is used for R1x000 framemask */
7001         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
7002         switch (sel) {
7003         case 0:
7004             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
7005             rn = "Framemask";
7006             break;
7007         default:
7008             goto cp0_unimplemented;
7009         }
7010         break;
7011     case 22:
7012         tcg_gen_movi_tl(arg, 0); /* unimplemented */
7013         rn = "'Diagnostic"; /* implementation dependent */
7014         break;
7015     case 23:
7016         switch (sel) {
7017         case 0:
7018             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
7019             rn = "Debug";
7020             break;
7021         case 1:
7022 //            gen_helper_mfc0_tracecontrol(arg); /* PDtrace support */
7023             rn = "TraceControl";
7024             goto cp0_unimplemented;
7025         case 2:
7026 //            gen_helper_mfc0_tracecontrol2(arg); /* PDtrace support */
7027             rn = "TraceControl2";
7028             goto cp0_unimplemented;
7029         case 3:
7030 //            gen_helper_mfc0_usertracedata(arg); /* PDtrace support */
7031             rn = "UserTraceData";
7032             goto cp0_unimplemented;
7033         case 4:
7034 //            gen_helper_mfc0_tracebpc(arg); /* PDtrace support */
7035             rn = "TraceBPC";
7036             goto cp0_unimplemented;
7037         default:
7038             goto cp0_unimplemented;
7039         }
7040         break;
7041     case 24:
7042         switch (sel) {
7043         case 0:
7044             /* EJTAG support */
7045             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
7046             tcg_gen_ext32s_tl(arg, arg);
7047             rn = "DEPC";
7048             break;
7049         default:
7050             goto cp0_unimplemented;
7051         }
7052         break;
7053     case 25:
7054         switch (sel) {
7055         case 0:
7056             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
7057             rn = "Performance0";
7058             break;
7059         case 1:
7060 //            gen_helper_mfc0_performance1(arg);
7061             rn = "Performance1";
7062             goto cp0_unimplemented;
7063         case 2:
7064 //            gen_helper_mfc0_performance2(arg);
7065             rn = "Performance2";
7066             goto cp0_unimplemented;
7067         case 3:
7068 //            gen_helper_mfc0_performance3(arg);
7069             rn = "Performance3";
7070             goto cp0_unimplemented;
7071         case 4:
7072 //            gen_helper_mfc0_performance4(arg);
7073             rn = "Performance4";
7074             goto cp0_unimplemented;
7075         case 5:
7076 //            gen_helper_mfc0_performance5(arg);
7077             rn = "Performance5";
7078             goto cp0_unimplemented;
7079         case 6:
7080 //            gen_helper_mfc0_performance6(arg);
7081             rn = "Performance6";
7082             goto cp0_unimplemented;
7083         case 7:
7084 //            gen_helper_mfc0_performance7(arg);
7085             rn = "Performance7";
7086             goto cp0_unimplemented;
7087         default:
7088             goto cp0_unimplemented;
7089         }
7090         break;
7091     case 26:
7092         switch (sel) {
7093         case 0:
7094             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_ErrCtl));
7095             rn = "ErrCtl";
7096             break;
7097         default:
7098             goto cp0_unimplemented;
7099         }
7100         break;
7101     case 27:
7102         switch (sel) {
7103         case 0:
7104         case 1:
7105         case 2:
7106         case 3:
7107             tcg_gen_movi_tl(arg, 0); /* unimplemented */
7108             rn = "CacheErr";
7109             break;
7110         default:
7111             goto cp0_unimplemented;
7112         }
7113         break;
7114     case 28:
7115         switch (sel) {
7116         case 0:
7117         case 2:
7118         case 4:
7119         case 6:
7120             {
7121                 TCGv_i64 tmp = tcg_temp_new_i64();
7122                 tcg_gen_ld_i64(tmp, cpu_env, offsetof(CPUMIPSState, CP0_TagLo));
7123                 gen_move_low32(arg, tmp);
7124                 tcg_temp_free_i64(tmp);
7125             }
7126             rn = "TagLo";
7127             break;
7128         case 1:
7129         case 3:
7130         case 5:
7131         case 7:
7132             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
7133             rn = "DataLo";
7134             break;
7135         default:
7136             goto cp0_unimplemented;
7137         }
7138         break;
7139     case 29:
7140         switch (sel) {
7141         case 0:
7142         case 2:
7143         case 4:
7144         case 6:
7145             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
7146             rn = "TagHi";
7147             break;
7148         case 1:
7149         case 3:
7150         case 5:
7151         case 7:
7152             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
7153             rn = "DataHi";
7154             break;
7155         default:
7156             goto cp0_unimplemented;
7157         }
7158         break;
7159     case 30:
7160         switch (sel) {
7161         case 0:
7162             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
7163             tcg_gen_ext32s_tl(arg, arg);
7164             rn = "ErrorEPC";
7165             break;
7166         default:
7167             goto cp0_unimplemented;
7168         }
7169         break;
7170     case 31:
7171         switch (sel) {
7172         case 0:
7173             /* EJTAG support */
7174             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
7175             rn = "DESAVE";
7176             break;
7177         case 2:
7178         case 3:
7179         case 4:
7180         case 5:
7181         case 6:
7182         case 7:
7183             CP0_CHECK(ctx->kscrexist & (1 << sel));
7184             tcg_gen_ld_tl(arg, cpu_env,
7185                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
7186             tcg_gen_ext32s_tl(arg, arg);
7187             rn = "KScratch";
7188             break;
7189         default:
7190             goto cp0_unimplemented;
7191         }
7192         break;
7193     default:
7194        goto cp0_unimplemented;
7195     }
7196     trace_mips_translate_c0("mfc0", rn, reg, sel);
7197     return;
7198
7199 cp0_unimplemented:
7200     qemu_log_mask(LOG_UNIMP, "mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
7201     gen_mfc0_unimplemented(ctx, arg);
7202 }
7203
7204 static void gen_mtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
7205 {
7206     const char *rn = "invalid";
7207
7208     if (sel != 0)
7209         check_insn(ctx, ISA_MIPS32);
7210
7211     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
7212         gen_io_start();
7213     }
7214
7215     switch (reg) {
7216     case 0:
7217         switch (sel) {
7218         case 0:
7219             gen_helper_mtc0_index(cpu_env, arg);
7220             rn = "Index";
7221             break;
7222         case 1:
7223             CP0_CHECK(ctx->insn_flags & ASE_MT);
7224             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
7225             rn = "MVPControl";
7226             break;
7227         case 2:
7228             CP0_CHECK(ctx->insn_flags & ASE_MT);
7229             /* ignored */
7230             rn = "MVPConf0";
7231             break;
7232         case 3:
7233             CP0_CHECK(ctx->insn_flags & ASE_MT);
7234             /* ignored */
7235             rn = "MVPConf1";
7236             break;
7237         case 4:
7238             CP0_CHECK(ctx->vp);
7239             /* ignored */
7240             rn = "VPControl";
7241             break;
7242         default:
7243             goto cp0_unimplemented;
7244         }
7245         break;
7246     case 1:
7247         switch (sel) {
7248         case 0:
7249             /* ignored */
7250             rn = "Random";
7251             break;
7252         case 1:
7253             CP0_CHECK(ctx->insn_flags & ASE_MT);
7254             gen_helper_mtc0_vpecontrol(cpu_env, arg);
7255             rn = "VPEControl";
7256             break;
7257         case 2:
7258             CP0_CHECK(ctx->insn_flags & ASE_MT);
7259             gen_helper_mtc0_vpeconf0(cpu_env, arg);
7260             rn = "VPEConf0";
7261             break;
7262         case 3:
7263             CP0_CHECK(ctx->insn_flags & ASE_MT);
7264             gen_helper_mtc0_vpeconf1(cpu_env, arg);
7265             rn = "VPEConf1";
7266             break;
7267         case 4:
7268             CP0_CHECK(ctx->insn_flags & ASE_MT);
7269             gen_helper_mtc0_yqmask(cpu_env, arg);
7270             rn = "YQMask";
7271             break;
7272         case 5:
7273             CP0_CHECK(ctx->insn_flags & ASE_MT);
7274             tcg_gen_st_tl(arg, cpu_env,
7275                           offsetof(CPUMIPSState, CP0_VPESchedule));
7276             rn = "VPESchedule";
7277             break;
7278         case 6:
7279             CP0_CHECK(ctx->insn_flags & ASE_MT);
7280             tcg_gen_st_tl(arg, cpu_env,
7281                           offsetof(CPUMIPSState, CP0_VPEScheFBack));
7282             rn = "VPEScheFBack";
7283             break;
7284         case 7:
7285             CP0_CHECK(ctx->insn_flags & ASE_MT);
7286             gen_helper_mtc0_vpeopt(cpu_env, arg);
7287             rn = "VPEOpt";
7288             break;
7289         default:
7290             goto cp0_unimplemented;
7291         }
7292         break;
7293     case 2:
7294         switch (sel) {
7295         case 0:
7296             gen_helper_mtc0_entrylo0(cpu_env, arg);
7297             rn = "EntryLo0";
7298             break;
7299         case 1:
7300             CP0_CHECK(ctx->insn_flags & ASE_MT);
7301             gen_helper_mtc0_tcstatus(cpu_env, arg);
7302             rn = "TCStatus";
7303             break;
7304         case 2:
7305             CP0_CHECK(ctx->insn_flags & ASE_MT);
7306             gen_helper_mtc0_tcbind(cpu_env, arg);
7307             rn = "TCBind";
7308             break;
7309         case 3:
7310             CP0_CHECK(ctx->insn_flags & ASE_MT);
7311             gen_helper_mtc0_tcrestart(cpu_env, arg);
7312             rn = "TCRestart";
7313             break;
7314         case 4:
7315             CP0_CHECK(ctx->insn_flags & ASE_MT);
7316             gen_helper_mtc0_tchalt(cpu_env, arg);
7317             rn = "TCHalt";
7318             break;
7319         case 5:
7320             CP0_CHECK(ctx->insn_flags & ASE_MT);
7321             gen_helper_mtc0_tccontext(cpu_env, arg);
7322             rn = "TCContext";
7323             break;
7324         case 6:
7325             CP0_CHECK(ctx->insn_flags & ASE_MT);
7326             gen_helper_mtc0_tcschedule(cpu_env, arg);
7327             rn = "TCSchedule";
7328             break;
7329         case 7:
7330             CP0_CHECK(ctx->insn_flags & ASE_MT);
7331             gen_helper_mtc0_tcschefback(cpu_env, arg);
7332             rn = "TCScheFBack";
7333             break;
7334         default:
7335             goto cp0_unimplemented;
7336         }
7337         break;
7338     case 3:
7339         switch (sel) {
7340         case 0:
7341             gen_helper_mtc0_entrylo1(cpu_env, arg);
7342             rn = "EntryLo1";
7343             break;
7344         case 1:
7345             CP0_CHECK(ctx->vp);
7346             /* ignored */
7347             rn = "GlobalNumber";
7348             break;
7349         default:
7350             goto cp0_unimplemented;
7351         }
7352         break;
7353     case 4:
7354         switch (sel) {
7355         case 0:
7356             gen_helper_mtc0_context(cpu_env, arg);
7357             rn = "Context";
7358             break;
7359         case 1:
7360 //            gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
7361             rn = "ContextConfig";
7362             goto cp0_unimplemented;
7363         case 2:
7364             CP0_CHECK(ctx->ulri);
7365             tcg_gen_st_tl(arg, cpu_env,
7366                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
7367             rn = "UserLocal";
7368             break;
7369         default:
7370             goto cp0_unimplemented;
7371         }
7372         break;
7373     case 5:
7374         switch (sel) {
7375         case 0:
7376             gen_helper_mtc0_pagemask(cpu_env, arg);
7377             rn = "PageMask";
7378             break;
7379         case 1:
7380             check_insn(ctx, ISA_MIPS32R2);
7381             gen_helper_mtc0_pagegrain(cpu_env, arg);
7382             rn = "PageGrain";
7383             ctx->base.is_jmp = DISAS_STOP;
7384             break;
7385         case 2:
7386             CP0_CHECK(ctx->sc);
7387             gen_helper_mtc0_segctl0(cpu_env, arg);
7388             rn = "SegCtl0";
7389             break;
7390         case 3:
7391             CP0_CHECK(ctx->sc);
7392             gen_helper_mtc0_segctl1(cpu_env, arg);
7393             rn = "SegCtl1";
7394             break;
7395         case 4:
7396             CP0_CHECK(ctx->sc);
7397             gen_helper_mtc0_segctl2(cpu_env, arg);
7398             rn = "SegCtl2";
7399             break;
7400         case 5:
7401             check_pw(ctx);
7402             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_PWBase));
7403             rn = "PWBase";
7404             break;
7405         case 6:
7406             check_pw(ctx);
7407             gen_helper_mtc0_pwfield(cpu_env, arg);
7408             rn = "PWField";
7409             break;
7410         case 7:
7411             check_pw(ctx);
7412             gen_helper_mtc0_pwsize(cpu_env, arg);
7413             rn = "PWSize";
7414             break;
7415         default:
7416             goto cp0_unimplemented;
7417         }
7418         break;
7419     case 6:
7420         switch (sel) {
7421         case 0:
7422             gen_helper_mtc0_wired(cpu_env, arg);
7423             rn = "Wired";
7424             break;
7425         case 1:
7426             check_insn(ctx, ISA_MIPS32R2);
7427             gen_helper_mtc0_srsconf0(cpu_env, arg);
7428             rn = "SRSConf0";
7429             break;
7430         case 2:
7431             check_insn(ctx, ISA_MIPS32R2);
7432             gen_helper_mtc0_srsconf1(cpu_env, arg);
7433             rn = "SRSConf1";
7434             break;
7435         case 3:
7436             check_insn(ctx, ISA_MIPS32R2);
7437             gen_helper_mtc0_srsconf2(cpu_env, arg);
7438             rn = "SRSConf2";
7439             break;
7440         case 4:
7441             check_insn(ctx, ISA_MIPS32R2);
7442             gen_helper_mtc0_srsconf3(cpu_env, arg);
7443             rn = "SRSConf3";
7444             break;
7445         case 5:
7446             check_insn(ctx, ISA_MIPS32R2);
7447             gen_helper_mtc0_srsconf4(cpu_env, arg);
7448             rn = "SRSConf4";
7449             break;
7450         case 6:
7451             check_pw(ctx);
7452             gen_helper_mtc0_pwctl(cpu_env, arg);
7453             rn = "PWCtl";
7454             break;
7455         default:
7456             goto cp0_unimplemented;
7457         }
7458         break;
7459     case 7:
7460         switch (sel) {
7461         case 0:
7462             check_insn(ctx, ISA_MIPS32R2);
7463             gen_helper_mtc0_hwrena(cpu_env, arg);
7464             ctx->base.is_jmp = DISAS_STOP;
7465             rn = "HWREna";
7466             break;
7467         default:
7468             goto cp0_unimplemented;
7469         }
7470         break;
7471     case 8:
7472         switch (sel) {
7473         case 0:
7474             /* ignored */
7475             rn = "BadVAddr";
7476             break;
7477         case 1:
7478             /* ignored */
7479             rn = "BadInstr";
7480             break;
7481         case 2:
7482             /* ignored */
7483             rn = "BadInstrP";
7484             break;
7485         case 3:
7486             /* ignored */
7487             rn = "BadInstrX";
7488             break;
7489         default:
7490             goto cp0_unimplemented;
7491         }
7492         break;
7493     case 9:
7494         switch (sel) {
7495         case 0:
7496             gen_helper_mtc0_count(cpu_env, arg);
7497             rn = "Count";
7498             break;
7499         /* 6,7 are implementation dependent */
7500         default:
7501             goto cp0_unimplemented;
7502         }
7503         break;
7504     case 10:
7505         switch (sel) {
7506         case 0:
7507             gen_helper_mtc0_entryhi(cpu_env, arg);
7508             rn = "EntryHi";
7509             break;
7510         default:
7511             goto cp0_unimplemented;
7512         }
7513         break;
7514     case 11:
7515         switch (sel) {
7516         case 0:
7517             gen_helper_mtc0_compare(cpu_env, arg);
7518             rn = "Compare";
7519             break;
7520         /* 6,7 are implementation dependent */
7521         default:
7522             goto cp0_unimplemented;
7523         }
7524         break;
7525     case 12:
7526         switch (sel) {
7527         case 0:
7528             save_cpu_state(ctx, 1);
7529             gen_helper_mtc0_status(cpu_env, arg);
7530             /* DISAS_STOP isn't good enough here, hflags may have changed. */
7531             gen_save_pc(ctx->base.pc_next + 4);
7532             ctx->base.is_jmp = DISAS_EXIT;
7533             rn = "Status";
7534             break;
7535         case 1:
7536             check_insn(ctx, ISA_MIPS32R2);
7537             gen_helper_mtc0_intctl(cpu_env, arg);
7538             /* Stop translation as we may have switched the execution mode */
7539             ctx->base.is_jmp = DISAS_STOP;
7540             rn = "IntCtl";
7541             break;
7542         case 2:
7543             check_insn(ctx, ISA_MIPS32R2);
7544             gen_helper_mtc0_srsctl(cpu_env, arg);
7545             /* Stop translation as we may have switched the execution mode */
7546             ctx->base.is_jmp = DISAS_STOP;
7547             rn = "SRSCtl";
7548             break;
7549         case 3:
7550             check_insn(ctx, ISA_MIPS32R2);
7551             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
7552             /* Stop translation as we may have switched the execution mode */
7553             ctx->base.is_jmp = DISAS_STOP;
7554             rn = "SRSMap";
7555             break;
7556         default:
7557             goto cp0_unimplemented;
7558         }
7559         break;
7560     case 13:
7561         switch (sel) {
7562         case 0:
7563             save_cpu_state(ctx, 1);
7564             gen_helper_mtc0_cause(cpu_env, arg);
7565             /* Stop translation as we may have triggered an interrupt.
7566              * DISAS_STOP isn't sufficient, we need to ensure we break out of
7567              * translated code to check for pending interrupts.  */
7568             gen_save_pc(ctx->base.pc_next + 4);
7569             ctx->base.is_jmp = DISAS_EXIT;
7570             rn = "Cause";
7571             break;
7572         default:
7573             goto cp0_unimplemented;
7574         }
7575         break;
7576     case 14:
7577         switch (sel) {
7578         case 0:
7579             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
7580             rn = "EPC";
7581             break;
7582         default:
7583             goto cp0_unimplemented;
7584         }
7585         break;
7586     case 15:
7587         switch (sel) {
7588         case 0:
7589             /* ignored */
7590             rn = "PRid";
7591             break;
7592         case 1:
7593             check_insn(ctx, ISA_MIPS32R2);
7594             gen_helper_mtc0_ebase(cpu_env, arg);
7595             rn = "EBase";
7596             break;
7597         default:
7598             goto cp0_unimplemented;
7599         }
7600         break;
7601     case 16:
7602         switch (sel) {
7603         case 0:
7604             gen_helper_mtc0_config0(cpu_env, arg);
7605             rn = "Config";
7606             /* Stop translation as we may have switched the execution mode */
7607             ctx->base.is_jmp = DISAS_STOP;
7608             break;
7609         case 1:
7610             /* ignored, read only */
7611             rn = "Config1";
7612             break;
7613         case 2:
7614             gen_helper_mtc0_config2(cpu_env, arg);
7615             rn = "Config2";
7616             /* Stop translation as we may have switched the execution mode */
7617             ctx->base.is_jmp = DISAS_STOP;
7618             break;
7619         case 3:
7620             gen_helper_mtc0_config3(cpu_env, arg);
7621             rn = "Config3";
7622             /* Stop translation as we may have switched the execution mode */
7623             ctx->base.is_jmp = DISAS_STOP;
7624             break;
7625         case 4:
7626             gen_helper_mtc0_config4(cpu_env, arg);
7627             rn = "Config4";
7628             ctx->base.is_jmp = DISAS_STOP;
7629             break;
7630         case 5:
7631             gen_helper_mtc0_config5(cpu_env, arg);
7632             rn = "Config5";
7633             /* Stop translation as we may have switched the execution mode */
7634             ctx->base.is_jmp = DISAS_STOP;
7635             break;
7636         /* 6,7 are implementation dependent */
7637         case 6:
7638             /* ignored */
7639             rn = "Config6";
7640             break;
7641         case 7:
7642             /* ignored */
7643             rn = "Config7";
7644             break;
7645         default:
7646             rn = "Invalid config selector";
7647             goto cp0_unimplemented;
7648         }
7649         break;
7650     case 17:
7651         switch (sel) {
7652         case 0:
7653             gen_helper_mtc0_lladdr(cpu_env, arg);
7654             rn = "LLAddr";
7655             break;
7656         case 1:
7657             CP0_CHECK(ctx->mrp);
7658             gen_helper_mtc0_maar(cpu_env, arg);
7659             rn = "MAAR";
7660             break;
7661         case 2:
7662             CP0_CHECK(ctx->mrp);
7663             gen_helper_mtc0_maari(cpu_env, arg);
7664             rn = "MAARI";
7665             break;
7666         default:
7667             goto cp0_unimplemented;
7668         }
7669         break;
7670     case 18:
7671         switch (sel) {
7672         case 0:
7673         case 1:
7674         case 2:
7675         case 3:
7676         case 4:
7677         case 5:
7678         case 6:
7679         case 7:
7680             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7681             gen_helper_0e1i(mtc0_watchlo, arg, sel);
7682             rn = "WatchLo";
7683             break;
7684         default:
7685             goto cp0_unimplemented;
7686         }
7687         break;
7688     case 19:
7689         switch (sel) {
7690         case 0:
7691         case 1:
7692         case 2:
7693         case 3:
7694         case 4:
7695         case 5:
7696         case 6:
7697         case 7:
7698             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7699             gen_helper_0e1i(mtc0_watchhi, arg, sel);
7700             rn = "WatchHi";
7701             break;
7702         default:
7703             goto cp0_unimplemented;
7704         }
7705         break;
7706     case 20:
7707         switch (sel) {
7708         case 0:
7709 #if defined(TARGET_MIPS64)
7710             check_insn(ctx, ISA_MIPS3);
7711             gen_helper_mtc0_xcontext(cpu_env, arg);
7712             rn = "XContext";
7713             break;
7714 #endif
7715         default:
7716             goto cp0_unimplemented;
7717         }
7718         break;
7719     case 21:
7720        /* Officially reserved, but sel 0 is used for R1x000 framemask */
7721         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
7722         switch (sel) {
7723         case 0:
7724             gen_helper_mtc0_framemask(cpu_env, arg);
7725             rn = "Framemask";
7726             break;
7727         default:
7728             goto cp0_unimplemented;
7729         }
7730         break;
7731     case 22:
7732         /* ignored */
7733         rn = "Diagnostic"; /* implementation dependent */
7734         break;
7735     case 23:
7736         switch (sel) {
7737         case 0:
7738             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
7739             /* DISAS_STOP isn't good enough here, hflags may have changed. */
7740             gen_save_pc(ctx->base.pc_next + 4);
7741             ctx->base.is_jmp = DISAS_EXIT;
7742             rn = "Debug";
7743             break;
7744         case 1:
7745 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
7746             rn = "TraceControl";
7747             /* Stop translation as we may have switched the execution mode */
7748             ctx->base.is_jmp = DISAS_STOP;
7749             goto cp0_unimplemented;
7750         case 2:
7751 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
7752             rn = "TraceControl2";
7753             /* Stop translation as we may have switched the execution mode */
7754             ctx->base.is_jmp = DISAS_STOP;
7755             goto cp0_unimplemented;
7756         case 3:
7757             /* Stop translation as we may have switched the execution mode */
7758             ctx->base.is_jmp = DISAS_STOP;
7759 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
7760             rn = "UserTraceData";
7761             /* Stop translation as we may have switched the execution mode */
7762             ctx->base.is_jmp = DISAS_STOP;
7763             goto cp0_unimplemented;
7764         case 4:
7765 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
7766             /* Stop translation as we may have switched the execution mode */
7767             ctx->base.is_jmp = DISAS_STOP;
7768             rn = "TraceBPC";
7769             goto cp0_unimplemented;
7770         default:
7771             goto cp0_unimplemented;
7772         }
7773         break;
7774     case 24:
7775         switch (sel) {
7776         case 0:
7777             /* EJTAG support */
7778             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
7779             rn = "DEPC";
7780             break;
7781         default:
7782             goto cp0_unimplemented;
7783         }
7784         break;
7785     case 25:
7786         switch (sel) {
7787         case 0:
7788             gen_helper_mtc0_performance0(cpu_env, arg);
7789             rn = "Performance0";
7790             break;
7791         case 1:
7792 //            gen_helper_mtc0_performance1(arg);
7793             rn = "Performance1";
7794             goto cp0_unimplemented;
7795         case 2:
7796 //            gen_helper_mtc0_performance2(arg);
7797             rn = "Performance2";
7798             goto cp0_unimplemented;
7799         case 3:
7800 //            gen_helper_mtc0_performance3(arg);
7801             rn = "Performance3";
7802             goto cp0_unimplemented;
7803         case 4:
7804 //            gen_helper_mtc0_performance4(arg);
7805             rn = "Performance4";
7806             goto cp0_unimplemented;
7807         case 5:
7808 //            gen_helper_mtc0_performance5(arg);
7809             rn = "Performance5";
7810             goto cp0_unimplemented;
7811         case 6:
7812 //            gen_helper_mtc0_performance6(arg);
7813             rn = "Performance6";
7814             goto cp0_unimplemented;
7815         case 7:
7816 //            gen_helper_mtc0_performance7(arg);
7817             rn = "Performance7";
7818             goto cp0_unimplemented;
7819         default:
7820             goto cp0_unimplemented;
7821         }
7822        break;
7823     case 26:
7824         switch (sel) {
7825         case 0:
7826             gen_helper_mtc0_errctl(cpu_env, arg);
7827             ctx->base.is_jmp = DISAS_STOP;
7828             rn = "ErrCtl";
7829             break;
7830         default:
7831             goto cp0_unimplemented;
7832         }
7833         break;
7834     case 27:
7835         switch (sel) {
7836         case 0:
7837         case 1:
7838         case 2:
7839         case 3:
7840             /* ignored */
7841             rn = "CacheErr";
7842             break;
7843         default:
7844             goto cp0_unimplemented;
7845         }
7846        break;
7847     case 28:
7848         switch (sel) {
7849         case 0:
7850         case 2:
7851         case 4:
7852         case 6:
7853             gen_helper_mtc0_taglo(cpu_env, arg);
7854             rn = "TagLo";
7855             break;
7856         case 1:
7857         case 3:
7858         case 5:
7859         case 7:
7860             gen_helper_mtc0_datalo(cpu_env, arg);
7861             rn = "DataLo";
7862             break;
7863         default:
7864             goto cp0_unimplemented;
7865         }
7866         break;
7867     case 29:
7868         switch (sel) {
7869         case 0:
7870         case 2:
7871         case 4:
7872         case 6:
7873             gen_helper_mtc0_taghi(cpu_env, arg);
7874             rn = "TagHi";
7875             break;
7876         case 1:
7877         case 3:
7878         case 5:
7879         case 7:
7880             gen_helper_mtc0_datahi(cpu_env, arg);
7881             rn = "DataHi";
7882             break;
7883         default:
7884             rn = "invalid sel";
7885             goto cp0_unimplemented;
7886         }
7887        break;
7888     case 30:
7889         switch (sel) {
7890         case 0:
7891             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
7892             rn = "ErrorEPC";
7893             break;
7894         default:
7895             goto cp0_unimplemented;
7896         }
7897         break;
7898     case 31:
7899         switch (sel) {
7900         case 0:
7901             /* EJTAG support */
7902             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
7903             rn = "DESAVE";
7904             break;
7905         case 2:
7906         case 3:
7907         case 4:
7908         case 5:
7909         case 6:
7910         case 7:
7911             CP0_CHECK(ctx->kscrexist & (1 << sel));
7912             tcg_gen_st_tl(arg, cpu_env,
7913                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
7914             rn = "KScratch";
7915             break;
7916         default:
7917             goto cp0_unimplemented;
7918         }
7919         break;
7920     default:
7921        goto cp0_unimplemented;
7922     }
7923     trace_mips_translate_c0("mtc0", rn, reg, sel);
7924
7925     /* For simplicity assume that all writes can cause interrupts.  */
7926     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
7927         gen_io_end();
7928         /* DISAS_STOP isn't sufficient, we need to ensure we break out of
7929          * translated code to check for pending interrupts.  */
7930         gen_save_pc(ctx->base.pc_next + 4);
7931         ctx->base.is_jmp = DISAS_EXIT;
7932     }
7933     return;
7934
7935 cp0_unimplemented:
7936     qemu_log_mask(LOG_UNIMP, "mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
7937 }
7938
7939 #if defined(TARGET_MIPS64)
7940 static void gen_dmfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
7941 {
7942     const char *rn = "invalid";
7943
7944     if (sel != 0)
7945         check_insn(ctx, ISA_MIPS64);
7946
7947     switch (reg) {
7948     case 0:
7949         switch (sel) {
7950         case 0:
7951             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
7952             rn = "Index";
7953             break;
7954         case 1:
7955             CP0_CHECK(ctx->insn_flags & ASE_MT);
7956             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
7957             rn = "MVPControl";
7958             break;
7959         case 2:
7960             CP0_CHECK(ctx->insn_flags & ASE_MT);
7961             gen_helper_mfc0_mvpconf0(arg, cpu_env);
7962             rn = "MVPConf0";
7963             break;
7964         case 3:
7965             CP0_CHECK(ctx->insn_flags & ASE_MT);
7966             gen_helper_mfc0_mvpconf1(arg, cpu_env);
7967             rn = "MVPConf1";
7968             break;
7969         case 4:
7970             CP0_CHECK(ctx->vp);
7971             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPControl));
7972             rn = "VPControl";
7973             break;
7974         default:
7975             goto cp0_unimplemented;
7976         }
7977         break;
7978     case 1:
7979         switch (sel) {
7980         case 0:
7981             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
7982             gen_helper_mfc0_random(arg, cpu_env);
7983             rn = "Random";
7984             break;
7985         case 1:
7986             CP0_CHECK(ctx->insn_flags & ASE_MT);
7987             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
7988             rn = "VPEControl";
7989             break;
7990         case 2:
7991             CP0_CHECK(ctx->insn_flags & ASE_MT);
7992             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
7993             rn = "VPEConf0";
7994             break;
7995         case 3:
7996             CP0_CHECK(ctx->insn_flags & ASE_MT);
7997             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
7998             rn = "VPEConf1";
7999             break;
8000         case 4:
8001             CP0_CHECK(ctx->insn_flags & ASE_MT);
8002             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_YQMask));
8003             rn = "YQMask";
8004             break;
8005         case 5:
8006             CP0_CHECK(ctx->insn_flags & ASE_MT);
8007             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
8008             rn = "VPESchedule";
8009             break;
8010         case 6:
8011             CP0_CHECK(ctx->insn_flags & ASE_MT);
8012             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
8013             rn = "VPEScheFBack";
8014             break;
8015         case 7:
8016             CP0_CHECK(ctx->insn_flags & ASE_MT);
8017             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
8018             rn = "VPEOpt";
8019             break;
8020         default:
8021             goto cp0_unimplemented;
8022         }
8023         break;
8024     case 2:
8025         switch (sel) {
8026         case 0:
8027             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0));
8028             rn = "EntryLo0";
8029             break;
8030         case 1:
8031             CP0_CHECK(ctx->insn_flags & ASE_MT);
8032             gen_helper_mfc0_tcstatus(arg, cpu_env);
8033             rn = "TCStatus";
8034             break;
8035         case 2:
8036             CP0_CHECK(ctx->insn_flags & ASE_MT);
8037             gen_helper_mfc0_tcbind(arg, cpu_env);
8038             rn = "TCBind";
8039             break;
8040         case 3:
8041             CP0_CHECK(ctx->insn_flags & ASE_MT);
8042             gen_helper_dmfc0_tcrestart(arg, cpu_env);
8043             rn = "TCRestart";
8044             break;
8045         case 4:
8046             CP0_CHECK(ctx->insn_flags & ASE_MT);
8047             gen_helper_dmfc0_tchalt(arg, cpu_env);
8048             rn = "TCHalt";
8049             break;
8050         case 5:
8051             CP0_CHECK(ctx->insn_flags & ASE_MT);
8052             gen_helper_dmfc0_tccontext(arg, cpu_env);
8053             rn = "TCContext";
8054             break;
8055         case 6:
8056             CP0_CHECK(ctx->insn_flags & ASE_MT);
8057             gen_helper_dmfc0_tcschedule(arg, cpu_env);
8058             rn = "TCSchedule";
8059             break;
8060         case 7:
8061             CP0_CHECK(ctx->insn_flags & ASE_MT);
8062             gen_helper_dmfc0_tcschefback(arg, cpu_env);
8063             rn = "TCScheFBack";
8064             break;
8065         default:
8066             goto cp0_unimplemented;
8067         }
8068         break;
8069     case 3:
8070         switch (sel) {
8071         case 0:
8072             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
8073             rn = "EntryLo1";
8074             break;
8075         case 1:
8076             CP0_CHECK(ctx->vp);
8077             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_GlobalNumber));
8078             rn = "GlobalNumber";
8079             break;
8080         default:
8081             goto cp0_unimplemented;
8082         }
8083         break;
8084     case 4:
8085         switch (sel) {
8086         case 0:
8087             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
8088             rn = "Context";
8089             break;
8090         case 1:
8091 //            gen_helper_dmfc0_contextconfig(arg); /* SmartMIPS ASE */
8092             rn = "ContextConfig";
8093             goto cp0_unimplemented;
8094         case 2:
8095             CP0_CHECK(ctx->ulri);
8096             tcg_gen_ld_tl(arg, cpu_env,
8097                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
8098             rn = "UserLocal";
8099             break;
8100         default:
8101             goto cp0_unimplemented;
8102         }
8103         break;
8104     case 5:
8105         switch (sel) {
8106         case 0:
8107             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
8108             rn = "PageMask";
8109             break;
8110         case 1:
8111             check_insn(ctx, ISA_MIPS32R2);
8112             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
8113             rn = "PageGrain";
8114             break;
8115         case 2:
8116             CP0_CHECK(ctx->sc);
8117             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl0));
8118             rn = "SegCtl0";
8119             break;
8120         case 3:
8121             CP0_CHECK(ctx->sc);
8122             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl1));
8123             rn = "SegCtl1";
8124             break;
8125         case 4:
8126             CP0_CHECK(ctx->sc);
8127             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl2));
8128             rn = "SegCtl2";
8129             break;
8130         case 5:
8131             check_pw(ctx);
8132             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWBase));
8133             rn = "PWBase";
8134             break;
8135         case 6:
8136             check_pw(ctx);
8137             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWField));
8138             rn = "PWField";
8139             break;
8140         case 7:
8141             check_pw(ctx);
8142             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWSize));
8143             rn = "PWSize";
8144             break;
8145         default:
8146             goto cp0_unimplemented;
8147         }
8148         break;
8149     case 6:
8150         switch (sel) {
8151         case 0:
8152             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
8153             rn = "Wired";
8154             break;
8155         case 1:
8156             check_insn(ctx, ISA_MIPS32R2);
8157             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
8158             rn = "SRSConf0";
8159             break;
8160         case 2:
8161             check_insn(ctx, ISA_MIPS32R2);
8162             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
8163             rn = "SRSConf1";
8164             break;
8165         case 3:
8166             check_insn(ctx, ISA_MIPS32R2);
8167             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
8168             rn = "SRSConf2";
8169             break;
8170         case 4:
8171             check_insn(ctx, ISA_MIPS32R2);
8172             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
8173             rn = "SRSConf3";
8174             break;
8175         case 5:
8176             check_insn(ctx, ISA_MIPS32R2);
8177             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
8178             rn = "SRSConf4";
8179             break;
8180         case 6:
8181             check_pw(ctx);
8182             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWCtl));
8183             rn = "PWCtl";
8184             break;
8185         default:
8186             goto cp0_unimplemented;
8187         }
8188         break;
8189     case 7:
8190         switch (sel) {
8191         case 0:
8192             check_insn(ctx, ISA_MIPS32R2);
8193             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
8194             rn = "HWREna";
8195             break;
8196         default:
8197             goto cp0_unimplemented;
8198         }
8199         break;
8200     case 8:
8201         switch (sel) {
8202         case 0:
8203             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
8204             rn = "BadVAddr";
8205             break;
8206         case 1:
8207             CP0_CHECK(ctx->bi);
8208             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
8209             rn = "BadInstr";
8210             break;
8211         case 2:
8212             CP0_CHECK(ctx->bp);
8213             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
8214             rn = "BadInstrP";
8215             break;
8216         case 3:
8217             CP0_CHECK(ctx->bi);
8218             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrX));
8219             tcg_gen_andi_tl(arg, arg, ~0xffff);
8220             rn = "BadInstrX";
8221             break;
8222         default:
8223             goto cp0_unimplemented;
8224         }
8225         break;
8226     case 9:
8227         switch (sel) {
8228         case 0:
8229             /* Mark as an IO operation because we read the time.  */
8230             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
8231                 gen_io_start();
8232             }
8233             gen_helper_mfc0_count(arg, cpu_env);
8234             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
8235                 gen_io_end();
8236             }
8237             /* Break the TB to be able to take timer interrupts immediately
8238                after reading count. DISAS_STOP isn't sufficient, we need to
8239                ensure we break completely out of translated code.  */
8240             gen_save_pc(ctx->base.pc_next + 4);
8241             ctx->base.is_jmp = DISAS_EXIT;
8242             rn = "Count";
8243             break;
8244         /* 6,7 are implementation dependent */
8245         default:
8246             goto cp0_unimplemented;
8247         }
8248         break;
8249     case 10:
8250         switch (sel) {
8251         case 0:
8252             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
8253             rn = "EntryHi";
8254             break;
8255         default:
8256             goto cp0_unimplemented;
8257         }
8258         break;
8259     case 11:
8260         switch (sel) {
8261         case 0:
8262             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
8263             rn = "Compare";
8264             break;
8265         /* 6,7 are implementation dependent */
8266         default:
8267             goto cp0_unimplemented;
8268         }
8269         break;
8270     case 12:
8271         switch (sel) {
8272         case 0:
8273             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
8274             rn = "Status";
8275             break;
8276         case 1:
8277             check_insn(ctx, ISA_MIPS32R2);
8278             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
8279             rn = "IntCtl";
8280             break;
8281         case 2:
8282             check_insn(ctx, ISA_MIPS32R2);
8283             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
8284             rn = "SRSCtl";
8285             break;
8286         case 3:
8287             check_insn(ctx, ISA_MIPS32R2);
8288             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
8289             rn = "SRSMap";
8290             break;
8291         default:
8292             goto cp0_unimplemented;
8293         }
8294         break;
8295     case 13:
8296         switch (sel) {
8297         case 0:
8298             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
8299             rn = "Cause";
8300             break;
8301         default:
8302             goto cp0_unimplemented;
8303         }
8304         break;
8305     case 14:
8306         switch (sel) {
8307         case 0:
8308             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
8309             rn = "EPC";
8310             break;
8311         default:
8312             goto cp0_unimplemented;
8313         }
8314         break;
8315     case 15:
8316         switch (sel) {
8317         case 0:
8318             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
8319             rn = "PRid";
8320             break;
8321         case 1:
8322             check_insn(ctx, ISA_MIPS32R2);
8323             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EBase));
8324             rn = "EBase";
8325             break;
8326         case 3:
8327             check_insn(ctx, ISA_MIPS32R2);
8328             CP0_CHECK(ctx->cmgcr);
8329             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_CMGCRBase));
8330             rn = "CMGCRBase";
8331             break;
8332         default:
8333             goto cp0_unimplemented;
8334         }
8335         break;
8336     case 16:
8337         switch (sel) {
8338         case 0:
8339             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
8340             rn = "Config";
8341             break;
8342         case 1:
8343             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
8344             rn = "Config1";
8345             break;
8346         case 2:
8347             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
8348             rn = "Config2";
8349             break;
8350         case 3:
8351             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
8352             rn = "Config3";
8353             break;
8354         case 4:
8355             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
8356             rn = "Config4";
8357             break;
8358         case 5:
8359             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
8360             rn = "Config5";
8361             break;
8362        /* 6,7 are implementation dependent */
8363         case 6:
8364             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
8365             rn = "Config6";
8366             break;
8367         case 7:
8368             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
8369             rn = "Config7";
8370             break;
8371         default:
8372             goto cp0_unimplemented;
8373         }
8374         break;
8375     case 17:
8376         switch (sel) {
8377         case 0:
8378             gen_helper_dmfc0_lladdr(arg, cpu_env);
8379             rn = "LLAddr";
8380             break;
8381         case 1:
8382             CP0_CHECK(ctx->mrp);
8383             gen_helper_dmfc0_maar(arg, cpu_env);
8384             rn = "MAAR";
8385             break;
8386         case 2:
8387             CP0_CHECK(ctx->mrp);
8388             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MAARI));
8389             rn = "MAARI";
8390             break;
8391         default:
8392             goto cp0_unimplemented;
8393         }
8394         break;
8395     case 18:
8396         switch (sel) {
8397         case 0:
8398         case 1:
8399         case 2:
8400         case 3:
8401         case 4:
8402         case 5:
8403         case 6:
8404         case 7:
8405             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
8406             gen_helper_1e0i(dmfc0_watchlo, arg, sel);
8407             rn = "WatchLo";
8408             break;
8409         default:
8410             goto cp0_unimplemented;
8411         }
8412         break;
8413     case 19:
8414         switch (sel) {
8415         case 0:
8416         case 1:
8417         case 2:
8418         case 3:
8419         case 4:
8420         case 5:
8421         case 6:
8422         case 7:
8423             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
8424             gen_helper_1e0i(mfc0_watchhi, arg, sel);
8425             rn = "WatchHi";
8426             break;
8427         default:
8428             goto cp0_unimplemented;
8429         }
8430         break;
8431     case 20:
8432         switch (sel) {
8433         case 0:
8434             check_insn(ctx, ISA_MIPS3);
8435             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
8436             rn = "XContext";
8437             break;
8438         default:
8439             goto cp0_unimplemented;
8440         }
8441         break;
8442     case 21:
8443        /* Officially reserved, but sel 0 is used for R1x000 framemask */
8444         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
8445         switch (sel) {
8446         case 0:
8447             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
8448             rn = "Framemask";
8449             break;
8450         default:
8451             goto cp0_unimplemented;
8452         }
8453         break;
8454     case 22:
8455         tcg_gen_movi_tl(arg, 0); /* unimplemented */
8456         rn = "'Diagnostic"; /* implementation dependent */
8457         break;
8458     case 23:
8459         switch (sel) {
8460         case 0:
8461             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
8462             rn = "Debug";
8463             break;
8464         case 1:
8465 //            gen_helper_dmfc0_tracecontrol(arg, cpu_env); /* PDtrace support */
8466             rn = "TraceControl";
8467             goto cp0_unimplemented;
8468         case 2:
8469 //            gen_helper_dmfc0_tracecontrol2(arg, cpu_env); /* PDtrace support */
8470             rn = "TraceControl2";
8471             goto cp0_unimplemented;
8472         case 3:
8473 //            gen_helper_dmfc0_usertracedata(arg, cpu_env); /* PDtrace support */
8474             rn = "UserTraceData";
8475             goto cp0_unimplemented;
8476         case 4:
8477 //            gen_helper_dmfc0_tracebpc(arg, cpu_env); /* PDtrace support */
8478             rn = "TraceBPC";
8479             goto cp0_unimplemented;
8480         default:
8481             goto cp0_unimplemented;
8482         }
8483         break;
8484     case 24:
8485         switch (sel) {
8486         case 0:
8487             /* EJTAG support */
8488             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
8489             rn = "DEPC";
8490             break;
8491         default:
8492             goto cp0_unimplemented;
8493         }
8494         break;
8495     case 25:
8496         switch (sel) {
8497         case 0:
8498             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
8499             rn = "Performance0";
8500             break;
8501         case 1:
8502 //            gen_helper_dmfc0_performance1(arg);
8503             rn = "Performance1";
8504             goto cp0_unimplemented;
8505         case 2:
8506 //            gen_helper_dmfc0_performance2(arg);
8507             rn = "Performance2";
8508             goto cp0_unimplemented;
8509         case 3:
8510 //            gen_helper_dmfc0_performance3(arg);
8511             rn = "Performance3";
8512             goto cp0_unimplemented;
8513         case 4:
8514 //            gen_helper_dmfc0_performance4(arg);
8515             rn = "Performance4";
8516             goto cp0_unimplemented;
8517         case 5:
8518 //            gen_helper_dmfc0_performance5(arg);
8519             rn = "Performance5";
8520             goto cp0_unimplemented;
8521         case 6:
8522 //            gen_helper_dmfc0_performance6(arg);
8523             rn = "Performance6";
8524             goto cp0_unimplemented;
8525         case 7:
8526 //            gen_helper_dmfc0_performance7(arg);
8527             rn = "Performance7";
8528             goto cp0_unimplemented;
8529         default:
8530             goto cp0_unimplemented;
8531         }
8532         break;
8533     case 26:
8534         switch (sel) {
8535         case 0:
8536             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_ErrCtl));
8537             rn = "ErrCtl";
8538             break;
8539         default:
8540             goto cp0_unimplemented;
8541         }
8542         break;
8543     case 27:
8544         switch (sel) {
8545         /* ignored */
8546         case 0:
8547         case 1:
8548         case 2:
8549         case 3:
8550             tcg_gen_movi_tl(arg, 0); /* unimplemented */
8551             rn = "CacheErr";
8552             break;
8553         default:
8554             goto cp0_unimplemented;
8555         }
8556         break;
8557     case 28:
8558         switch (sel) {
8559         case 0:
8560         case 2:
8561         case 4:
8562         case 6:
8563             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
8564             rn = "TagLo";
8565             break;
8566         case 1:
8567         case 3:
8568         case 5:
8569         case 7:
8570             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
8571             rn = "DataLo";
8572             break;
8573         default:
8574             goto cp0_unimplemented;
8575         }
8576         break;
8577     case 29:
8578         switch (sel) {
8579         case 0:
8580         case 2:
8581         case 4:
8582         case 6:
8583             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
8584             rn = "TagHi";
8585             break;
8586         case 1:
8587         case 3:
8588         case 5:
8589         case 7:
8590             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
8591             rn = "DataHi";
8592             break;
8593         default:
8594             goto cp0_unimplemented;
8595         }
8596         break;
8597     case 30:
8598         switch (sel) {
8599         case 0:
8600             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
8601             rn = "ErrorEPC";
8602             break;
8603         default:
8604             goto cp0_unimplemented;
8605         }
8606         break;
8607     case 31:
8608         switch (sel) {
8609         case 0:
8610             /* EJTAG support */
8611             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
8612             rn = "DESAVE";
8613             break;
8614         case 2:
8615         case 3:
8616         case 4:
8617         case 5:
8618         case 6:
8619         case 7:
8620             CP0_CHECK(ctx->kscrexist & (1 << sel));
8621             tcg_gen_ld_tl(arg, cpu_env,
8622                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
8623             rn = "KScratch";
8624             break;
8625         default:
8626             goto cp0_unimplemented;
8627         }
8628         break;
8629     default:
8630         goto cp0_unimplemented;
8631     }
8632     trace_mips_translate_c0("dmfc0", rn, reg, sel);
8633     return;
8634
8635 cp0_unimplemented:
8636     qemu_log_mask(LOG_UNIMP, "dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
8637     gen_mfc0_unimplemented(ctx, arg);
8638 }
8639
8640 static void gen_dmtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
8641 {
8642     const char *rn = "invalid";
8643
8644     if (sel != 0)
8645         check_insn(ctx, ISA_MIPS64);
8646
8647     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
8648         gen_io_start();
8649     }
8650
8651     switch (reg) {
8652     case 0:
8653         switch (sel) {
8654         case 0:
8655             gen_helper_mtc0_index(cpu_env, arg);
8656             rn = "Index";
8657             break;
8658         case 1:
8659             CP0_CHECK(ctx->insn_flags & ASE_MT);
8660             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
8661             rn = "MVPControl";
8662             break;
8663         case 2:
8664             CP0_CHECK(ctx->insn_flags & ASE_MT);
8665             /* ignored */
8666             rn = "MVPConf0";
8667             break;
8668         case 3:
8669             CP0_CHECK(ctx->insn_flags & ASE_MT);
8670             /* ignored */
8671             rn = "MVPConf1";
8672             break;
8673         case 4:
8674             CP0_CHECK(ctx->vp);
8675             /* ignored */
8676             rn = "VPControl";
8677             break;
8678         default:
8679             goto cp0_unimplemented;
8680         }
8681         break;
8682     case 1:
8683         switch (sel) {
8684         case 0:
8685             /* ignored */
8686             rn = "Random";
8687             break;
8688         case 1:
8689             CP0_CHECK(ctx->insn_flags & ASE_MT);
8690             gen_helper_mtc0_vpecontrol(cpu_env, arg);
8691             rn = "VPEControl";
8692             break;
8693         case 2:
8694             CP0_CHECK(ctx->insn_flags & ASE_MT);
8695             gen_helper_mtc0_vpeconf0(cpu_env, arg);
8696             rn = "VPEConf0";
8697             break;
8698         case 3:
8699             CP0_CHECK(ctx->insn_flags & ASE_MT);
8700             gen_helper_mtc0_vpeconf1(cpu_env, arg);
8701             rn = "VPEConf1";
8702             break;
8703         case 4:
8704             CP0_CHECK(ctx->insn_flags & ASE_MT);
8705             gen_helper_mtc0_yqmask(cpu_env, arg);
8706             rn = "YQMask";
8707             break;
8708         case 5:
8709             CP0_CHECK(ctx->insn_flags & ASE_MT);
8710             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
8711             rn = "VPESchedule";
8712             break;
8713         case 6:
8714             CP0_CHECK(ctx->insn_flags & ASE_MT);
8715             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
8716             rn = "VPEScheFBack";
8717             break;
8718         case 7:
8719             CP0_CHECK(ctx->insn_flags & ASE_MT);
8720             gen_helper_mtc0_vpeopt(cpu_env, arg);
8721             rn = "VPEOpt";
8722             break;
8723         default:
8724             goto cp0_unimplemented;
8725         }
8726         break;
8727     case 2:
8728         switch (sel) {
8729         case 0:
8730             gen_helper_dmtc0_entrylo0(cpu_env, arg);
8731             rn = "EntryLo0";
8732             break;
8733         case 1:
8734             CP0_CHECK(ctx->insn_flags & ASE_MT);
8735             gen_helper_mtc0_tcstatus(cpu_env, arg);
8736             rn = "TCStatus";
8737             break;
8738         case 2:
8739             CP0_CHECK(ctx->insn_flags & ASE_MT);
8740             gen_helper_mtc0_tcbind(cpu_env, arg);
8741             rn = "TCBind";
8742             break;
8743         case 3:
8744             CP0_CHECK(ctx->insn_flags & ASE_MT);
8745             gen_helper_mtc0_tcrestart(cpu_env, arg);
8746             rn = "TCRestart";
8747             break;
8748         case 4:
8749             CP0_CHECK(ctx->insn_flags & ASE_MT);
8750             gen_helper_mtc0_tchalt(cpu_env, arg);
8751             rn = "TCHalt";
8752             break;
8753         case 5:
8754             CP0_CHECK(ctx->insn_flags & ASE_MT);
8755             gen_helper_mtc0_tccontext(cpu_env, arg);
8756             rn = "TCContext";
8757             break;
8758         case 6:
8759             CP0_CHECK(ctx->insn_flags & ASE_MT);
8760             gen_helper_mtc0_tcschedule(cpu_env, arg);
8761             rn = "TCSchedule";
8762             break;
8763         case 7:
8764             CP0_CHECK(ctx->insn_flags & ASE_MT);
8765             gen_helper_mtc0_tcschefback(cpu_env, arg);
8766             rn = "TCScheFBack";
8767             break;
8768         default:
8769             goto cp0_unimplemented;
8770         }
8771         break;
8772     case 3:
8773         switch (sel) {
8774         case 0:
8775             gen_helper_dmtc0_entrylo1(cpu_env, arg);
8776             rn = "EntryLo1";
8777             break;
8778         case 1:
8779             CP0_CHECK(ctx->vp);
8780             /* ignored */
8781             rn = "GlobalNumber";
8782             break;
8783         default:
8784             goto cp0_unimplemented;
8785         }
8786         break;
8787     case 4:
8788         switch (sel) {
8789         case 0:
8790             gen_helper_mtc0_context(cpu_env, arg);
8791             rn = "Context";
8792             break;
8793         case 1:
8794 //           gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
8795             rn = "ContextConfig";
8796             goto cp0_unimplemented;
8797         case 2:
8798             CP0_CHECK(ctx->ulri);
8799             tcg_gen_st_tl(arg, cpu_env,
8800                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
8801             rn = "UserLocal";
8802             break;
8803         default:
8804             goto cp0_unimplemented;
8805         }
8806         break;
8807     case 5:
8808         switch (sel) {
8809         case 0:
8810             gen_helper_mtc0_pagemask(cpu_env, arg);
8811             rn = "PageMask";
8812             break;
8813         case 1:
8814             check_insn(ctx, ISA_MIPS32R2);
8815             gen_helper_mtc0_pagegrain(cpu_env, arg);
8816             rn = "PageGrain";
8817             break;
8818         case 2:
8819             CP0_CHECK(ctx->sc);
8820             gen_helper_mtc0_segctl0(cpu_env, arg);
8821             rn = "SegCtl0";
8822             break;
8823         case 3:
8824             CP0_CHECK(ctx->sc);
8825             gen_helper_mtc0_segctl1(cpu_env, arg);
8826             rn = "SegCtl1";
8827             break;
8828         case 4:
8829             CP0_CHECK(ctx->sc);
8830             gen_helper_mtc0_segctl2(cpu_env, arg);
8831             rn = "SegCtl2";
8832             break;
8833         case 5:
8834             check_pw(ctx);
8835             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWBase));
8836             rn = "PWBase";
8837             break;
8838         case 6:
8839             check_pw(ctx);
8840             gen_helper_mtc0_pwfield(cpu_env, arg);
8841             rn = "PWField";
8842             break;
8843         case 7:
8844             check_pw(ctx);
8845             gen_helper_mtc0_pwsize(cpu_env, arg);
8846             rn = "PWSize";
8847             break;
8848         default:
8849             goto cp0_unimplemented;
8850         }
8851         break;
8852     case 6:
8853         switch (sel) {
8854         case 0:
8855             gen_helper_mtc0_wired(cpu_env, arg);
8856             rn = "Wired";
8857             break;
8858         case 1:
8859             check_insn(ctx, ISA_MIPS32R2);
8860             gen_helper_mtc0_srsconf0(cpu_env, arg);
8861             rn = "SRSConf0";
8862             break;
8863         case 2:
8864             check_insn(ctx, ISA_MIPS32R2);
8865             gen_helper_mtc0_srsconf1(cpu_env, arg);
8866             rn = "SRSConf1";
8867             break;
8868         case 3:
8869             check_insn(ctx, ISA_MIPS32R2);
8870             gen_helper_mtc0_srsconf2(cpu_env, arg);
8871             rn = "SRSConf2";
8872             break;
8873         case 4:
8874             check_insn(ctx, ISA_MIPS32R2);
8875             gen_helper_mtc0_srsconf3(cpu_env, arg);
8876             rn = "SRSConf3";
8877             break;
8878         case 5:
8879             check_insn(ctx, ISA_MIPS32R2);
8880             gen_helper_mtc0_srsconf4(cpu_env, arg);
8881             rn = "SRSConf4";
8882             break;
8883         case 6:
8884             check_pw(ctx);
8885             gen_helper_mtc0_pwctl(cpu_env, arg);
8886             rn = "PWCtl";
8887             break;
8888         default:
8889             goto cp0_unimplemented;
8890         }
8891         break;
8892     case 7:
8893         switch (sel) {
8894         case 0:
8895             check_insn(ctx, ISA_MIPS32R2);
8896             gen_helper_mtc0_hwrena(cpu_env, arg);
8897             ctx->base.is_jmp = DISAS_STOP;
8898             rn = "HWREna";
8899             break;
8900         default:
8901             goto cp0_unimplemented;
8902         }
8903         break;
8904     case 8:
8905         switch (sel) {
8906         case 0:
8907             /* ignored */
8908             rn = "BadVAddr";
8909             break;
8910         case 1:
8911             /* ignored */
8912             rn = "BadInstr";
8913             break;
8914         case 2:
8915             /* ignored */
8916             rn = "BadInstrP";
8917             break;
8918         case 3:
8919             /* ignored */
8920             rn = "BadInstrX";
8921             break;
8922         default:
8923             goto cp0_unimplemented;
8924         }
8925         break;
8926     case 9:
8927         switch (sel) {
8928         case 0:
8929             gen_helper_mtc0_count(cpu_env, arg);
8930             rn = "Count";
8931             break;
8932         /* 6,7 are implementation dependent */
8933         default:
8934             goto cp0_unimplemented;
8935         }
8936         /* Stop translation as we may have switched the execution mode */
8937         ctx->base.is_jmp = DISAS_STOP;
8938         break;
8939     case 10:
8940         switch (sel) {
8941         case 0:
8942             gen_helper_mtc0_entryhi(cpu_env, arg);
8943             rn = "EntryHi";
8944             break;
8945         default:
8946             goto cp0_unimplemented;
8947         }
8948         break;
8949     case 11:
8950         switch (sel) {
8951         case 0:
8952             gen_helper_mtc0_compare(cpu_env, arg);
8953             rn = "Compare";
8954             break;
8955         /* 6,7 are implementation dependent */
8956         default:
8957             goto cp0_unimplemented;
8958         }
8959         /* Stop translation as we may have switched the execution mode */
8960         ctx->base.is_jmp = DISAS_STOP;
8961         break;
8962     case 12:
8963         switch (sel) {
8964         case 0:
8965             save_cpu_state(ctx, 1);
8966             gen_helper_mtc0_status(cpu_env, arg);
8967             /* DISAS_STOP isn't good enough here, hflags may have changed. */
8968             gen_save_pc(ctx->base.pc_next + 4);
8969             ctx->base.is_jmp = DISAS_EXIT;
8970             rn = "Status";
8971             break;
8972         case 1:
8973             check_insn(ctx, ISA_MIPS32R2);
8974             gen_helper_mtc0_intctl(cpu_env, arg);
8975             /* Stop translation as we may have switched the execution mode */
8976             ctx->base.is_jmp = DISAS_STOP;
8977             rn = "IntCtl";
8978             break;
8979         case 2:
8980             check_insn(ctx, ISA_MIPS32R2);
8981             gen_helper_mtc0_srsctl(cpu_env, arg);
8982             /* Stop translation as we may have switched the execution mode */
8983             ctx->base.is_jmp = DISAS_STOP;
8984             rn = "SRSCtl";
8985             break;
8986         case 3:
8987             check_insn(ctx, ISA_MIPS32R2);
8988             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
8989             /* Stop translation as we may have switched the execution mode */
8990             ctx->base.is_jmp = DISAS_STOP;
8991             rn = "SRSMap";
8992             break;
8993         default:
8994             goto cp0_unimplemented;
8995         }
8996         break;
8997     case 13:
8998         switch (sel) {
8999         case 0:
9000             save_cpu_state(ctx, 1);
9001             gen_helper_mtc0_cause(cpu_env, arg);
9002             /* Stop translation as we may have triggered an interrupt.
9003              * DISAS_STOP isn't sufficient, we need to ensure we break out of
9004              * translated code to check for pending interrupts.  */
9005             gen_save_pc(ctx->base.pc_next + 4);
9006             ctx->base.is_jmp = DISAS_EXIT;
9007             rn = "Cause";
9008             break;
9009         default:
9010             goto cp0_unimplemented;
9011         }
9012         break;
9013     case 14:
9014         switch (sel) {
9015         case 0:
9016             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
9017             rn = "EPC";
9018             break;
9019         default:
9020             goto cp0_unimplemented;
9021         }
9022         break;
9023     case 15:
9024         switch (sel) {
9025         case 0:
9026             /* ignored */
9027             rn = "PRid";
9028             break;
9029         case 1:
9030             check_insn(ctx, ISA_MIPS32R2);
9031             gen_helper_mtc0_ebase(cpu_env, arg);
9032             rn = "EBase";
9033             break;
9034         default:
9035             goto cp0_unimplemented;
9036         }
9037         break;
9038     case 16:
9039         switch (sel) {
9040         case 0:
9041             gen_helper_mtc0_config0(cpu_env, arg);
9042             rn = "Config";
9043             /* Stop translation as we may have switched the execution mode */
9044             ctx->base.is_jmp = DISAS_STOP;
9045             break;
9046         case 1:
9047             /* ignored, read only */
9048             rn = "Config1";
9049             break;
9050         case 2:
9051             gen_helper_mtc0_config2(cpu_env, arg);
9052             rn = "Config2";
9053             /* Stop translation as we may have switched the execution mode */
9054             ctx->base.is_jmp = DISAS_STOP;
9055             break;
9056         case 3:
9057             gen_helper_mtc0_config3(cpu_env, arg);
9058             rn = "Config3";
9059             /* Stop translation as we may have switched the execution mode */
9060             ctx->base.is_jmp = DISAS_STOP;
9061             break;
9062         case 4:
9063             /* currently ignored */
9064             rn = "Config4";
9065             break;
9066         case 5:
9067             gen_helper_mtc0_config5(cpu_env, arg);
9068             rn = "Config5";
9069             /* Stop translation as we may have switched the execution mode */
9070             ctx->base.is_jmp = DISAS_STOP;
9071             break;
9072         /* 6,7 are implementation dependent */
9073         default:
9074             rn = "Invalid config selector";
9075             goto cp0_unimplemented;
9076         }
9077         break;
9078     case 17:
9079         switch (sel) {
9080         case 0:
9081             gen_helper_mtc0_lladdr(cpu_env, arg);
9082             rn = "LLAddr";
9083             break;
9084         case 1:
9085             CP0_CHECK(ctx->mrp);
9086             gen_helper_mtc0_maar(cpu_env, arg);
9087             rn = "MAAR";
9088             break;
9089         case 2:
9090             CP0_CHECK(ctx->mrp);
9091             gen_helper_mtc0_maari(cpu_env, arg);
9092             rn = "MAARI";
9093             break;
9094         default:
9095             goto cp0_unimplemented;
9096         }
9097         break;
9098     case 18:
9099         switch (sel) {
9100         case 0:
9101         case 1:
9102         case 2:
9103         case 3:
9104         case 4:
9105         case 5:
9106         case 6:
9107         case 7:
9108             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
9109             gen_helper_0e1i(mtc0_watchlo, arg, sel);
9110             rn = "WatchLo";
9111             break;
9112         default:
9113             goto cp0_unimplemented;
9114         }
9115         break;
9116     case 19:
9117         switch (sel) {
9118         case 0:
9119         case 1:
9120         case 2:
9121         case 3:
9122         case 4:
9123         case 5:
9124         case 6:
9125         case 7:
9126             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
9127             gen_helper_0e1i(mtc0_watchhi, arg, sel);
9128             rn = "WatchHi";
9129             break;
9130         default:
9131             goto cp0_unimplemented;
9132         }
9133         break;
9134     case 20:
9135         switch (sel) {
9136         case 0:
9137             check_insn(ctx, ISA_MIPS3);
9138             gen_helper_mtc0_xcontext(cpu_env, arg);
9139             rn = "XContext";
9140             break;
9141         default:
9142             goto cp0_unimplemented;
9143         }
9144         break;
9145     case 21:
9146        /* Officially reserved, but sel 0 is used for R1x000 framemask */
9147         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
9148         switch (sel) {
9149         case 0:
9150             gen_helper_mtc0_framemask(cpu_env, arg);
9151             rn = "Framemask";
9152             break;
9153         default:
9154             goto cp0_unimplemented;
9155         }
9156         break;
9157     case 22:
9158         /* ignored */
9159         rn = "Diagnostic"; /* implementation dependent */
9160         break;
9161     case 23:
9162         switch (sel) {
9163         case 0:
9164             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
9165             /* DISAS_STOP isn't good enough here, hflags may have changed. */
9166             gen_save_pc(ctx->base.pc_next + 4);
9167             ctx->base.is_jmp = DISAS_EXIT;
9168             rn = "Debug";
9169             break;
9170         case 1:
9171 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
9172             /* Stop translation as we may have switched the execution mode */
9173             ctx->base.is_jmp = DISAS_STOP;
9174             rn = "TraceControl";
9175             goto cp0_unimplemented;
9176         case 2:
9177 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
9178             /* Stop translation as we may have switched the execution mode */
9179             ctx->base.is_jmp = DISAS_STOP;
9180             rn = "TraceControl2";
9181             goto cp0_unimplemented;
9182         case 3:
9183 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
9184             /* Stop translation as we may have switched the execution mode */
9185             ctx->base.is_jmp = DISAS_STOP;
9186             rn = "UserTraceData";
9187             goto cp0_unimplemented;
9188         case 4:
9189 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
9190             /* Stop translation as we may have switched the execution mode */
9191             ctx->base.is_jmp = DISAS_STOP;
9192             rn = "TraceBPC";
9193             goto cp0_unimplemented;
9194         default:
9195             goto cp0_unimplemented;
9196         }
9197         break;
9198     case 24:
9199         switch (sel) {
9200         case 0:
9201             /* EJTAG support */
9202             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
9203             rn = "DEPC";
9204             break;
9205         default:
9206             goto cp0_unimplemented;
9207         }
9208         break;
9209     case 25:
9210         switch (sel) {
9211         case 0:
9212             gen_helper_mtc0_performance0(cpu_env, arg);
9213             rn = "Performance0";
9214             break;
9215         case 1:
9216 //            gen_helper_mtc0_performance1(cpu_env, arg);
9217             rn = "Performance1";
9218             goto cp0_unimplemented;
9219         case 2:
9220 //            gen_helper_mtc0_performance2(cpu_env, arg);
9221             rn = "Performance2";
9222             goto cp0_unimplemented;
9223         case 3:
9224 //            gen_helper_mtc0_performance3(cpu_env, arg);
9225             rn = "Performance3";
9226             goto cp0_unimplemented;
9227         case 4:
9228 //            gen_helper_mtc0_performance4(cpu_env, arg);
9229             rn = "Performance4";
9230             goto cp0_unimplemented;
9231         case 5:
9232 //            gen_helper_mtc0_performance5(cpu_env, arg);
9233             rn = "Performance5";
9234             goto cp0_unimplemented;
9235         case 6:
9236 //            gen_helper_mtc0_performance6(cpu_env, arg);
9237             rn = "Performance6";
9238             goto cp0_unimplemented;
9239         case 7:
9240 //            gen_helper_mtc0_performance7(cpu_env, arg);
9241             rn = "Performance7";
9242             goto cp0_unimplemented;
9243         default:
9244             goto cp0_unimplemented;
9245         }
9246         break;
9247     case 26:
9248         switch (sel) {
9249         case 0:
9250             gen_helper_mtc0_errctl(cpu_env, arg);
9251             ctx->base.is_jmp = DISAS_STOP;
9252             rn = "ErrCtl";
9253             break;
9254         default:
9255             goto cp0_unimplemented;
9256         }
9257         break;
9258     case 27:
9259         switch (sel) {
9260         case 0:
9261         case 1:
9262         case 2:
9263         case 3:
9264             /* ignored */
9265             rn = "CacheErr";
9266             break;
9267         default:
9268             goto cp0_unimplemented;
9269         }
9270         break;
9271     case 28:
9272         switch (sel) {
9273         case 0:
9274         case 2:
9275         case 4:
9276         case 6:
9277             gen_helper_mtc0_taglo(cpu_env, arg);
9278             rn = "TagLo";
9279             break;
9280         case 1:
9281         case 3:
9282         case 5:
9283         case 7:
9284             gen_helper_mtc0_datalo(cpu_env, arg);
9285             rn = "DataLo";
9286             break;
9287         default:
9288             goto cp0_unimplemented;
9289         }
9290         break;
9291     case 29:
9292         switch (sel) {
9293         case 0:
9294         case 2:
9295         case 4:
9296         case 6:
9297             gen_helper_mtc0_taghi(cpu_env, arg);
9298             rn = "TagHi";
9299             break;
9300         case 1:
9301         case 3:
9302         case 5:
9303         case 7:
9304             gen_helper_mtc0_datahi(cpu_env, arg);
9305             rn = "DataHi";
9306             break;
9307         default:
9308             rn = "invalid sel";
9309             goto cp0_unimplemented;
9310         }
9311         break;
9312     case 30:
9313         switch (sel) {
9314         case 0:
9315             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
9316             rn = "ErrorEPC";
9317             break;
9318         default:
9319             goto cp0_unimplemented;
9320         }
9321         break;
9322     case 31:
9323         switch (sel) {
9324         case 0:
9325             /* EJTAG support */
9326             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
9327             rn = "DESAVE";
9328             break;
9329         case 2:
9330         case 3:
9331         case 4:
9332         case 5:
9333         case 6:
9334         case 7:
9335             CP0_CHECK(ctx->kscrexist & (1 << sel));
9336             tcg_gen_st_tl(arg, cpu_env,
9337                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
9338             rn = "KScratch";
9339             break;
9340         default:
9341             goto cp0_unimplemented;
9342         }
9343         break;
9344     default:
9345         goto cp0_unimplemented;
9346     }
9347     trace_mips_translate_c0("dmtc0", rn, reg, sel);
9348
9349     /* For simplicity assume that all writes can cause interrupts.  */
9350     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
9351         gen_io_end();
9352         /* DISAS_STOP isn't sufficient, we need to ensure we break out of
9353          * translated code to check for pending interrupts.  */
9354         gen_save_pc(ctx->base.pc_next + 4);
9355         ctx->base.is_jmp = DISAS_EXIT;
9356     }
9357     return;
9358
9359 cp0_unimplemented:
9360     qemu_log_mask(LOG_UNIMP, "dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
9361 }
9362 #endif /* TARGET_MIPS64 */
9363
9364 static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd,
9365                      int u, int sel, int h)
9366 {
9367     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
9368     TCGv t0 = tcg_temp_local_new();
9369
9370     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
9371         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
9372          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
9373         tcg_gen_movi_tl(t0, -1);
9374     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
9375              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
9376         tcg_gen_movi_tl(t0, -1);
9377     else if (u == 0) {
9378         switch (rt) {
9379         case 1:
9380             switch (sel) {
9381             case 1:
9382                 gen_helper_mftc0_vpecontrol(t0, cpu_env);
9383                 break;
9384             case 2:
9385                 gen_helper_mftc0_vpeconf0(t0, cpu_env);
9386                 break;
9387             default:
9388                 goto die;
9389                 break;
9390             }
9391             break;
9392         case 2:
9393             switch (sel) {
9394             case 1:
9395                 gen_helper_mftc0_tcstatus(t0, cpu_env);
9396                 break;
9397             case 2:
9398                 gen_helper_mftc0_tcbind(t0, cpu_env);
9399                 break;
9400             case 3:
9401                 gen_helper_mftc0_tcrestart(t0, cpu_env);
9402                 break;
9403             case 4:
9404                 gen_helper_mftc0_tchalt(t0, cpu_env);
9405                 break;
9406             case 5:
9407                 gen_helper_mftc0_tccontext(t0, cpu_env);
9408                 break;
9409             case 6:
9410                 gen_helper_mftc0_tcschedule(t0, cpu_env);
9411                 break;
9412             case 7:
9413                 gen_helper_mftc0_tcschefback(t0, cpu_env);
9414                 break;
9415             default:
9416                 gen_mfc0(ctx, t0, rt, sel);
9417                 break;
9418             }
9419             break;
9420         case 10:
9421             switch (sel) {
9422             case 0:
9423                 gen_helper_mftc0_entryhi(t0, cpu_env);
9424                 break;
9425             default:
9426                 gen_mfc0(ctx, t0, rt, sel);
9427                 break;
9428             }
9429         case 12:
9430             switch (sel) {
9431             case 0:
9432                 gen_helper_mftc0_status(t0, cpu_env);
9433                 break;
9434             default:
9435                 gen_mfc0(ctx, t0, rt, sel);
9436                 break;
9437             }
9438         case 13:
9439             switch (sel) {
9440             case 0:
9441                 gen_helper_mftc0_cause(t0, cpu_env);
9442                 break;
9443             default:
9444                 goto die;
9445                 break;
9446             }
9447             break;
9448         case 14:
9449             switch (sel) {
9450             case 0:
9451                 gen_helper_mftc0_epc(t0, cpu_env);
9452                 break;
9453             default:
9454                 goto die;
9455                 break;
9456             }
9457             break;
9458         case 15:
9459             switch (sel) {
9460             case 1:
9461                 gen_helper_mftc0_ebase(t0, cpu_env);
9462                 break;
9463             default:
9464                 goto die;
9465                 break;
9466             }
9467             break;
9468         case 16:
9469             switch (sel) {
9470             case 0:
9471             case 1:
9472             case 2:
9473             case 3:
9474             case 4:
9475             case 5:
9476             case 6:
9477             case 7:
9478                 gen_helper_mftc0_configx(t0, cpu_env, tcg_const_tl(sel));
9479                 break;
9480             default:
9481                 goto die;
9482                 break;
9483             }
9484             break;
9485         case 23:
9486             switch (sel) {
9487             case 0:
9488                 gen_helper_mftc0_debug(t0, cpu_env);
9489                 break;
9490             default:
9491                 gen_mfc0(ctx, t0, rt, sel);
9492                 break;
9493             }
9494             break;
9495         default:
9496             gen_mfc0(ctx, t0, rt, sel);
9497         }
9498     } else switch (sel) {
9499     /* GPR registers. */
9500     case 0:
9501         gen_helper_1e0i(mftgpr, t0, rt);
9502         break;
9503     /* Auxiliary CPU registers */
9504     case 1:
9505         switch (rt) {
9506         case 0:
9507             gen_helper_1e0i(mftlo, t0, 0);
9508             break;
9509         case 1:
9510             gen_helper_1e0i(mfthi, t0, 0);
9511             break;
9512         case 2:
9513             gen_helper_1e0i(mftacx, t0, 0);
9514             break;
9515         case 4:
9516             gen_helper_1e0i(mftlo, t0, 1);
9517             break;
9518         case 5:
9519             gen_helper_1e0i(mfthi, t0, 1);
9520             break;
9521         case 6:
9522             gen_helper_1e0i(mftacx, t0, 1);
9523             break;
9524         case 8:
9525             gen_helper_1e0i(mftlo, t0, 2);
9526             break;
9527         case 9:
9528             gen_helper_1e0i(mfthi, t0, 2);
9529             break;
9530         case 10:
9531             gen_helper_1e0i(mftacx, t0, 2);
9532             break;
9533         case 12:
9534             gen_helper_1e0i(mftlo, t0, 3);
9535             break;
9536         case 13:
9537             gen_helper_1e0i(mfthi, t0, 3);
9538             break;
9539         case 14:
9540             gen_helper_1e0i(mftacx, t0, 3);
9541             break;
9542         case 16:
9543             gen_helper_mftdsp(t0, cpu_env);
9544             break;
9545         default:
9546             goto die;
9547         }
9548         break;
9549     /* Floating point (COP1). */
9550     case 2:
9551         /* XXX: For now we support only a single FPU context. */
9552         if (h == 0) {
9553             TCGv_i32 fp0 = tcg_temp_new_i32();
9554
9555             gen_load_fpr32(ctx, fp0, rt);
9556             tcg_gen_ext_i32_tl(t0, fp0);
9557             tcg_temp_free_i32(fp0);
9558         } else {
9559             TCGv_i32 fp0 = tcg_temp_new_i32();
9560
9561             gen_load_fpr32h(ctx, fp0, rt);
9562             tcg_gen_ext_i32_tl(t0, fp0);
9563             tcg_temp_free_i32(fp0);
9564         }
9565         break;
9566     case 3:
9567         /* XXX: For now we support only a single FPU context. */
9568         gen_helper_1e0i(cfc1, t0, rt);
9569         break;
9570     /* COP2: Not implemented. */
9571     case 4:
9572     case 5:
9573         /* fall through */
9574     default:
9575         goto die;
9576     }
9577     trace_mips_translate_tr("mftr", rt, u, sel, h);
9578     gen_store_gpr(t0, rd);
9579     tcg_temp_free(t0);
9580     return;
9581
9582 die:
9583     tcg_temp_free(t0);
9584     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
9585     generate_exception_end(ctx, EXCP_RI);
9586 }
9587
9588 static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt,
9589                      int u, int sel, int h)
9590 {
9591     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
9592     TCGv t0 = tcg_temp_local_new();
9593
9594     gen_load_gpr(t0, rt);
9595     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
9596         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
9597          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
9598         /* NOP */ ;
9599     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
9600              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
9601         /* NOP */ ;
9602     else if (u == 0) {
9603         switch (rd) {
9604         case 1:
9605             switch (sel) {
9606             case 1:
9607                 gen_helper_mttc0_vpecontrol(cpu_env, t0);
9608                 break;
9609             case 2:
9610                 gen_helper_mttc0_vpeconf0(cpu_env, t0);
9611                 break;
9612             default:
9613                 goto die;
9614                 break;
9615             }
9616             break;
9617         case 2:
9618             switch (sel) {
9619             case 1:
9620                 gen_helper_mttc0_tcstatus(cpu_env, t0);
9621                 break;
9622             case 2:
9623                 gen_helper_mttc0_tcbind(cpu_env, t0);
9624                 break;
9625             case 3:
9626                 gen_helper_mttc0_tcrestart(cpu_env, t0);
9627                 break;
9628             case 4:
9629                 gen_helper_mttc0_tchalt(cpu_env, t0);
9630                 break;
9631             case 5:
9632                 gen_helper_mttc0_tccontext(cpu_env, t0);
9633                 break;
9634             case 6:
9635                 gen_helper_mttc0_tcschedule(cpu_env, t0);
9636                 break;
9637             case 7:
9638                 gen_helper_mttc0_tcschefback(cpu_env, t0);
9639                 break;
9640             default:
9641                 gen_mtc0(ctx, t0, rd, sel);
9642                 break;
9643             }
9644             break;
9645         case 10:
9646             switch (sel) {
9647             case 0:
9648                 gen_helper_mttc0_entryhi(cpu_env, t0);
9649                 break;
9650             default:
9651                 gen_mtc0(ctx, t0, rd, sel);
9652                 break;
9653             }
9654         case 12:
9655             switch (sel) {
9656             case 0:
9657                 gen_helper_mttc0_status(cpu_env, t0);
9658                 break;
9659             default:
9660                 gen_mtc0(ctx, t0, rd, sel);
9661                 break;
9662             }
9663         case 13:
9664             switch (sel) {
9665             case 0:
9666                 gen_helper_mttc0_cause(cpu_env, t0);
9667                 break;
9668             default:
9669                 goto die;
9670                 break;
9671             }
9672             break;
9673         case 15:
9674             switch (sel) {
9675             case 1:
9676                 gen_helper_mttc0_ebase(cpu_env, t0);
9677                 break;
9678             default:
9679                 goto die;
9680                 break;
9681             }
9682             break;
9683         case 23:
9684             switch (sel) {
9685             case 0:
9686                 gen_helper_mttc0_debug(cpu_env, t0);
9687                 break;
9688             default:
9689                 gen_mtc0(ctx, t0, rd, sel);
9690                 break;
9691             }
9692             break;
9693         default:
9694             gen_mtc0(ctx, t0, rd, sel);
9695         }
9696     } else switch (sel) {
9697     /* GPR registers. */
9698     case 0:
9699         gen_helper_0e1i(mttgpr, t0, rd);
9700         break;
9701     /* Auxiliary CPU registers */
9702     case 1:
9703         switch (rd) {
9704         case 0:
9705             gen_helper_0e1i(mttlo, t0, 0);
9706             break;
9707         case 1:
9708             gen_helper_0e1i(mtthi, t0, 0);
9709             break;
9710         case 2:
9711             gen_helper_0e1i(mttacx, t0, 0);
9712             break;
9713         case 4:
9714             gen_helper_0e1i(mttlo, t0, 1);
9715             break;
9716         case 5:
9717             gen_helper_0e1i(mtthi, t0, 1);
9718             break;
9719         case 6:
9720             gen_helper_0e1i(mttacx, t0, 1);
9721             break;
9722         case 8:
9723             gen_helper_0e1i(mttlo, t0, 2);
9724             break;
9725         case 9:
9726             gen_helper_0e1i(mtthi, t0, 2);
9727             break;
9728         case 10:
9729             gen_helper_0e1i(mttacx, t0, 2);
9730             break;
9731         case 12:
9732             gen_helper_0e1i(mttlo, t0, 3);
9733             break;
9734         case 13:
9735             gen_helper_0e1i(mtthi, t0, 3);
9736             break;
9737         case 14:
9738             gen_helper_0e1i(mttacx, t0, 3);
9739             break;
9740         case 16:
9741             gen_helper_mttdsp(cpu_env, t0);
9742             break;
9743         default:
9744             goto die;
9745         }
9746         break;
9747     /* Floating point (COP1). */
9748     case 2:
9749         /* XXX: For now we support only a single FPU context. */
9750         if (h == 0) {
9751             TCGv_i32 fp0 = tcg_temp_new_i32();
9752
9753             tcg_gen_trunc_tl_i32(fp0, t0);
9754             gen_store_fpr32(ctx, fp0, rd);
9755             tcg_temp_free_i32(fp0);
9756         } else {
9757             TCGv_i32 fp0 = tcg_temp_new_i32();
9758
9759             tcg_gen_trunc_tl_i32(fp0, t0);
9760             gen_store_fpr32h(ctx, fp0, rd);
9761             tcg_temp_free_i32(fp0);
9762         }
9763         break;
9764     case 3:
9765         /* XXX: For now we support only a single FPU context. */
9766         {
9767             TCGv_i32 fs_tmp = tcg_const_i32(rd);
9768
9769             gen_helper_0e2i(ctc1, t0, fs_tmp, rt);
9770             tcg_temp_free_i32(fs_tmp);
9771         }
9772         /* Stop translation as we may have changed hflags */
9773         ctx->base.is_jmp = DISAS_STOP;
9774         break;
9775     /* COP2: Not implemented. */
9776     case 4:
9777     case 5:
9778         /* fall through */
9779     default:
9780         goto die;
9781     }
9782     trace_mips_translate_tr("mttr", rd, u, sel, h);
9783     tcg_temp_free(t0);
9784     return;
9785
9786 die:
9787     tcg_temp_free(t0);
9788     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
9789     generate_exception_end(ctx, EXCP_RI);
9790 }
9791
9792 static void gen_cp0 (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, int rt, int rd)
9793 {
9794     const char *opn = "ldst";
9795
9796     check_cp0_enabled(ctx);
9797     switch (opc) {
9798     case OPC_MFC0:
9799         if (rt == 0) {
9800             /* Treat as NOP. */
9801             return;
9802         }
9803         gen_mfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
9804         opn = "mfc0";
9805         break;
9806     case OPC_MTC0:
9807         {
9808             TCGv t0 = tcg_temp_new();
9809
9810             gen_load_gpr(t0, rt);
9811             gen_mtc0(ctx, t0, rd, ctx->opcode & 0x7);
9812             tcg_temp_free(t0);
9813         }
9814         opn = "mtc0";
9815         break;
9816 #if defined(TARGET_MIPS64)
9817     case OPC_DMFC0:
9818         check_insn(ctx, ISA_MIPS3);
9819         if (rt == 0) {
9820             /* Treat as NOP. */
9821             return;
9822         }
9823         gen_dmfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
9824         opn = "dmfc0";
9825         break;
9826     case OPC_DMTC0:
9827         check_insn(ctx, ISA_MIPS3);
9828         {
9829             TCGv t0 = tcg_temp_new();
9830
9831             gen_load_gpr(t0, rt);
9832             gen_dmtc0(ctx, t0, rd, ctx->opcode & 0x7);
9833             tcg_temp_free(t0);
9834         }
9835         opn = "dmtc0";
9836         break;
9837 #endif
9838     case OPC_MFHC0:
9839         check_mvh(ctx);
9840         if (rt == 0) {
9841             /* Treat as NOP. */
9842             return;
9843         }
9844         gen_mfhc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
9845         opn = "mfhc0";
9846         break;
9847     case OPC_MTHC0:
9848         check_mvh(ctx);
9849         {
9850             TCGv t0 = tcg_temp_new();
9851             gen_load_gpr(t0, rt);
9852             gen_mthc0(ctx, t0, rd, ctx->opcode & 0x7);
9853             tcg_temp_free(t0);
9854         }
9855         opn = "mthc0";
9856         break;
9857     case OPC_MFTR:
9858         check_cp0_enabled(ctx);
9859         if (rd == 0) {
9860             /* Treat as NOP. */
9861             return;
9862         }
9863         gen_mftr(env, ctx, rt, rd, (ctx->opcode >> 5) & 1,
9864                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
9865         opn = "mftr";
9866         break;
9867     case OPC_MTTR:
9868         check_cp0_enabled(ctx);
9869         gen_mttr(env, ctx, rd, rt, (ctx->opcode >> 5) & 1,
9870                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
9871         opn = "mttr";
9872         break;
9873     case OPC_TLBWI:
9874         opn = "tlbwi";
9875         if (!env->tlb->helper_tlbwi)
9876             goto die;
9877         gen_helper_tlbwi(cpu_env);
9878         break;
9879     case OPC_TLBINV:
9880         opn = "tlbinv";
9881         if (ctx->ie >= 2) {
9882             if (!env->tlb->helper_tlbinv) {
9883                 goto die;
9884             }
9885             gen_helper_tlbinv(cpu_env);
9886         } /* treat as nop if TLBINV not supported */
9887         break;
9888     case OPC_TLBINVF:
9889         opn = "tlbinvf";
9890         if (ctx->ie >= 2) {
9891             if (!env->tlb->helper_tlbinvf) {
9892                 goto die;
9893             }
9894             gen_helper_tlbinvf(cpu_env);
9895         } /* treat as nop if TLBINV not supported */
9896         break;
9897     case OPC_TLBWR:
9898         opn = "tlbwr";
9899         if (!env->tlb->helper_tlbwr)
9900             goto die;
9901         gen_helper_tlbwr(cpu_env);
9902         break;
9903     case OPC_TLBP:
9904         opn = "tlbp";
9905         if (!env->tlb->helper_tlbp)
9906             goto die;
9907         gen_helper_tlbp(cpu_env);
9908         break;
9909     case OPC_TLBR:
9910         opn = "tlbr";
9911         if (!env->tlb->helper_tlbr)
9912             goto die;
9913         gen_helper_tlbr(cpu_env);
9914         break;
9915     case OPC_ERET: /* OPC_ERETNC */
9916         if ((ctx->insn_flags & ISA_MIPS32R6) &&
9917             (ctx->hflags & MIPS_HFLAG_BMASK)) {
9918             goto die;
9919         } else {
9920             int bit_shift = (ctx->hflags & MIPS_HFLAG_M16) ? 16 : 6;
9921             if (ctx->opcode & (1 << bit_shift)) {
9922                 /* OPC_ERETNC */
9923                 opn = "eretnc";
9924                 check_insn(ctx, ISA_MIPS32R5);
9925                 gen_helper_eretnc(cpu_env);
9926             } else {
9927                 /* OPC_ERET */
9928                 opn = "eret";
9929                 check_insn(ctx, ISA_MIPS2);
9930                 gen_helper_eret(cpu_env);
9931             }
9932             ctx->base.is_jmp = DISAS_EXIT;
9933         }
9934         break;
9935     case OPC_DERET:
9936         opn = "deret";
9937         check_insn(ctx, ISA_MIPS32);
9938         if ((ctx->insn_flags & ISA_MIPS32R6) &&
9939             (ctx->hflags & MIPS_HFLAG_BMASK)) {
9940             goto die;
9941         }
9942         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
9943             MIPS_INVAL(opn);
9944             generate_exception_end(ctx, EXCP_RI);
9945         } else {
9946             gen_helper_deret(cpu_env);
9947             ctx->base.is_jmp = DISAS_EXIT;
9948         }
9949         break;
9950     case OPC_WAIT:
9951         opn = "wait";
9952         check_insn(ctx, ISA_MIPS3 | ISA_MIPS32);
9953         if ((ctx->insn_flags & ISA_MIPS32R6) &&
9954             (ctx->hflags & MIPS_HFLAG_BMASK)) {
9955             goto die;
9956         }
9957         /* If we get an exception, we want to restart at next instruction */
9958         ctx->base.pc_next += 4;
9959         save_cpu_state(ctx, 1);
9960         ctx->base.pc_next -= 4;
9961         gen_helper_wait(cpu_env);
9962         ctx->base.is_jmp = DISAS_NORETURN;
9963         break;
9964     default:
9965  die:
9966         MIPS_INVAL(opn);
9967         generate_exception_end(ctx, EXCP_RI);
9968         return;
9969     }
9970     (void)opn; /* avoid a compiler warning */
9971 }
9972 #endif /* !CONFIG_USER_ONLY */
9973
9974 /* CP1 Branches (before delay slot) */
9975 static void gen_compute_branch1(DisasContext *ctx, uint32_t op,
9976                                 int32_t cc, int32_t offset)
9977 {
9978     target_ulong btarget;
9979     TCGv_i32 t0 = tcg_temp_new_i32();
9980
9981     if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->hflags & MIPS_HFLAG_BMASK)) {
9982         generate_exception_end(ctx, EXCP_RI);
9983         goto out;
9984     }
9985
9986     if (cc != 0)
9987         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
9988
9989     btarget = ctx->base.pc_next + 4 + offset;
9990
9991     switch (op) {
9992     case OPC_BC1F:
9993         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9994         tcg_gen_not_i32(t0, t0);
9995         tcg_gen_andi_i32(t0, t0, 1);
9996         tcg_gen_extu_i32_tl(bcond, t0);
9997         goto not_likely;
9998     case OPC_BC1FL:
9999         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
10000         tcg_gen_not_i32(t0, t0);
10001         tcg_gen_andi_i32(t0, t0, 1);
10002         tcg_gen_extu_i32_tl(bcond, t0);
10003         goto likely;
10004     case OPC_BC1T:
10005         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
10006         tcg_gen_andi_i32(t0, t0, 1);
10007         tcg_gen_extu_i32_tl(bcond, t0);
10008         goto not_likely;
10009     case OPC_BC1TL:
10010         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
10011         tcg_gen_andi_i32(t0, t0, 1);
10012         tcg_gen_extu_i32_tl(bcond, t0);
10013     likely:
10014         ctx->hflags |= MIPS_HFLAG_BL;
10015         break;
10016     case OPC_BC1FANY2:
10017         {
10018             TCGv_i32 t1 = tcg_temp_new_i32();
10019             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
10020             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
10021             tcg_gen_nand_i32(t0, t0, t1);
10022             tcg_temp_free_i32(t1);
10023             tcg_gen_andi_i32(t0, t0, 1);
10024             tcg_gen_extu_i32_tl(bcond, t0);
10025         }
10026         goto not_likely;
10027     case OPC_BC1TANY2:
10028         {
10029             TCGv_i32 t1 = tcg_temp_new_i32();
10030             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
10031             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
10032             tcg_gen_or_i32(t0, t0, t1);
10033             tcg_temp_free_i32(t1);
10034             tcg_gen_andi_i32(t0, t0, 1);
10035             tcg_gen_extu_i32_tl(bcond, t0);
10036         }
10037         goto not_likely;
10038     case OPC_BC1FANY4:
10039         {
10040             TCGv_i32 t1 = tcg_temp_new_i32();
10041             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
10042             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
10043             tcg_gen_and_i32(t0, t0, t1);
10044             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
10045             tcg_gen_and_i32(t0, t0, t1);
10046             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
10047             tcg_gen_nand_i32(t0, t0, t1);
10048             tcg_temp_free_i32(t1);
10049             tcg_gen_andi_i32(t0, t0, 1);
10050             tcg_gen_extu_i32_tl(bcond, t0);
10051         }
10052         goto not_likely;
10053     case OPC_BC1TANY4:
10054         {
10055             TCGv_i32 t1 = tcg_temp_new_i32();
10056             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
10057             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
10058             tcg_gen_or_i32(t0, t0, t1);
10059             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
10060             tcg_gen_or_i32(t0, t0, t1);
10061             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
10062             tcg_gen_or_i32(t0, t0, t1);
10063             tcg_temp_free_i32(t1);
10064             tcg_gen_andi_i32(t0, t0, 1);
10065             tcg_gen_extu_i32_tl(bcond, t0);
10066         }
10067     not_likely:
10068         ctx->hflags |= MIPS_HFLAG_BC;
10069         break;
10070     default:
10071         MIPS_INVAL("cp1 cond branch");
10072         generate_exception_end(ctx, EXCP_RI);
10073         goto out;
10074     }
10075     ctx->btarget = btarget;
10076     ctx->hflags |= MIPS_HFLAG_BDS32;
10077  out:
10078     tcg_temp_free_i32(t0);
10079 }
10080
10081 /* R6 CP1 Branches */
10082 static void gen_compute_branch1_r6(DisasContext *ctx, uint32_t op,
10083                                    int32_t ft, int32_t offset,
10084                                    int delayslot_size)
10085 {
10086     target_ulong btarget;
10087     TCGv_i64 t0 = tcg_temp_new_i64();
10088
10089     if (ctx->hflags & MIPS_HFLAG_BMASK) {
10090 #ifdef MIPS_DEBUG_DISAS
10091         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
10092                   "\n", ctx->base.pc_next);
10093 #endif
10094         generate_exception_end(ctx, EXCP_RI);
10095         goto out;
10096     }
10097
10098     gen_load_fpr64(ctx, t0, ft);
10099     tcg_gen_andi_i64(t0, t0, 1);
10100
10101     btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
10102
10103     switch (op) {
10104     case OPC_BC1EQZ:
10105         tcg_gen_xori_i64(t0, t0, 1);
10106         ctx->hflags |= MIPS_HFLAG_BC;
10107         break;
10108     case OPC_BC1NEZ:
10109         /* t0 already set */
10110         ctx->hflags |= MIPS_HFLAG_BC;
10111         break;
10112     default:
10113         MIPS_INVAL("cp1 cond branch");
10114         generate_exception_end(ctx, EXCP_RI);
10115         goto out;
10116     }
10117
10118     tcg_gen_trunc_i64_tl(bcond, t0);
10119
10120     ctx->btarget = btarget;
10121
10122     switch (delayslot_size) {
10123     case 2:
10124         ctx->hflags |= MIPS_HFLAG_BDS16;
10125         break;
10126     case 4:
10127         ctx->hflags |= MIPS_HFLAG_BDS32;
10128         break;
10129     }
10130
10131 out:
10132     tcg_temp_free_i64(t0);
10133 }
10134
10135 /* Coprocessor 1 (FPU) */
10136
10137 #define FOP(func, fmt) (((fmt) << 21) | (func))
10138
10139 enum fopcode {
10140     OPC_ADD_S = FOP(0, FMT_S),
10141     OPC_SUB_S = FOP(1, FMT_S),
10142     OPC_MUL_S = FOP(2, FMT_S),
10143     OPC_DIV_S = FOP(3, FMT_S),
10144     OPC_SQRT_S = FOP(4, FMT_S),
10145     OPC_ABS_S = FOP(5, FMT_S),
10146     OPC_MOV_S = FOP(6, FMT_S),
10147     OPC_NEG_S = FOP(7, FMT_S),
10148     OPC_ROUND_L_S = FOP(8, FMT_S),
10149     OPC_TRUNC_L_S = FOP(9, FMT_S),
10150     OPC_CEIL_L_S = FOP(10, FMT_S),
10151     OPC_FLOOR_L_S = FOP(11, FMT_S),
10152     OPC_ROUND_W_S = FOP(12, FMT_S),
10153     OPC_TRUNC_W_S = FOP(13, FMT_S),
10154     OPC_CEIL_W_S = FOP(14, FMT_S),
10155     OPC_FLOOR_W_S = FOP(15, FMT_S),
10156     OPC_SEL_S = FOP(16, FMT_S),
10157     OPC_MOVCF_S = FOP(17, FMT_S),
10158     OPC_MOVZ_S = FOP(18, FMT_S),
10159     OPC_MOVN_S = FOP(19, FMT_S),
10160     OPC_SELEQZ_S = FOP(20, FMT_S),
10161     OPC_RECIP_S = FOP(21, FMT_S),
10162     OPC_RSQRT_S = FOP(22, FMT_S),
10163     OPC_SELNEZ_S = FOP(23, FMT_S),
10164     OPC_MADDF_S = FOP(24, FMT_S),
10165     OPC_MSUBF_S = FOP(25, FMT_S),
10166     OPC_RINT_S = FOP(26, FMT_S),
10167     OPC_CLASS_S = FOP(27, FMT_S),
10168     OPC_MIN_S = FOP(28, FMT_S),
10169     OPC_RECIP2_S = FOP(28, FMT_S),
10170     OPC_MINA_S = FOP(29, FMT_S),
10171     OPC_RECIP1_S = FOP(29, FMT_S),
10172     OPC_MAX_S = FOP(30, FMT_S),
10173     OPC_RSQRT1_S = FOP(30, FMT_S),
10174     OPC_MAXA_S = FOP(31, FMT_S),
10175     OPC_RSQRT2_S = FOP(31, FMT_S),
10176     OPC_CVT_D_S = FOP(33, FMT_S),
10177     OPC_CVT_W_S = FOP(36, FMT_S),
10178     OPC_CVT_L_S = FOP(37, FMT_S),
10179     OPC_CVT_PS_S = FOP(38, FMT_S),
10180     OPC_CMP_F_S = FOP (48, FMT_S),
10181     OPC_CMP_UN_S = FOP (49, FMT_S),
10182     OPC_CMP_EQ_S = FOP (50, FMT_S),
10183     OPC_CMP_UEQ_S = FOP (51, FMT_S),
10184     OPC_CMP_OLT_S = FOP (52, FMT_S),
10185     OPC_CMP_ULT_S = FOP (53, FMT_S),
10186     OPC_CMP_OLE_S = FOP (54, FMT_S),
10187     OPC_CMP_ULE_S = FOP (55, FMT_S),
10188     OPC_CMP_SF_S = FOP (56, FMT_S),
10189     OPC_CMP_NGLE_S = FOP (57, FMT_S),
10190     OPC_CMP_SEQ_S = FOP (58, FMT_S),
10191     OPC_CMP_NGL_S = FOP (59, FMT_S),
10192     OPC_CMP_LT_S = FOP (60, FMT_S),
10193     OPC_CMP_NGE_S = FOP (61, FMT_S),
10194     OPC_CMP_LE_S = FOP (62, FMT_S),
10195     OPC_CMP_NGT_S = FOP (63, FMT_S),
10196
10197     OPC_ADD_D = FOP(0, FMT_D),
10198     OPC_SUB_D = FOP(1, FMT_D),
10199     OPC_MUL_D = FOP(2, FMT_D),
10200     OPC_DIV_D = FOP(3, FMT_D),
10201     OPC_SQRT_D = FOP(4, FMT_D),
10202     OPC_ABS_D = FOP(5, FMT_D),
10203     OPC_MOV_D = FOP(6, FMT_D),
10204     OPC_NEG_D = FOP(7, FMT_D),
10205     OPC_ROUND_L_D = FOP(8, FMT_D),
10206     OPC_TRUNC_L_D = FOP(9, FMT_D),
10207     OPC_CEIL_L_D = FOP(10, FMT_D),
10208     OPC_FLOOR_L_D = FOP(11, FMT_D),
10209     OPC_ROUND_W_D = FOP(12, FMT_D),
10210     OPC_TRUNC_W_D = FOP(13, FMT_D),
10211     OPC_CEIL_W_D = FOP(14, FMT_D),
10212     OPC_FLOOR_W_D = FOP(15, FMT_D),
10213     OPC_SEL_D = FOP(16, FMT_D),
10214     OPC_MOVCF_D = FOP(17, FMT_D),
10215     OPC_MOVZ_D = FOP(18, FMT_D),
10216     OPC_MOVN_D = FOP(19, FMT_D),
10217     OPC_SELEQZ_D = FOP(20, FMT_D),
10218     OPC_RECIP_D = FOP(21, FMT_D),
10219     OPC_RSQRT_D = FOP(22, FMT_D),
10220     OPC_SELNEZ_D = FOP(23, FMT_D),
10221     OPC_MADDF_D = FOP(24, FMT_D),
10222     OPC_MSUBF_D = FOP(25, FMT_D),
10223     OPC_RINT_D = FOP(26, FMT_D),
10224     OPC_CLASS_D = FOP(27, FMT_D),
10225     OPC_MIN_D = FOP(28, FMT_D),
10226     OPC_RECIP2_D = FOP(28, FMT_D),
10227     OPC_MINA_D = FOP(29, FMT_D),
10228     OPC_RECIP1_D = FOP(29, FMT_D),
10229     OPC_MAX_D = FOP(30, FMT_D),
10230     OPC_RSQRT1_D = FOP(30, FMT_D),
10231     OPC_MAXA_D = FOP(31, FMT_D),
10232     OPC_RSQRT2_D = FOP(31, FMT_D),
10233     OPC_CVT_S_D = FOP(32, FMT_D),
10234     OPC_CVT_W_D = FOP(36, FMT_D),
10235     OPC_CVT_L_D = FOP(37, FMT_D),
10236     OPC_CMP_F_D = FOP (48, FMT_D),
10237     OPC_CMP_UN_D = FOP (49, FMT_D),
10238     OPC_CMP_EQ_D = FOP (50, FMT_D),
10239     OPC_CMP_UEQ_D = FOP (51, FMT_D),
10240     OPC_CMP_OLT_D = FOP (52, FMT_D),
10241     OPC_CMP_ULT_D = FOP (53, FMT_D),
10242     OPC_CMP_OLE_D = FOP (54, FMT_D),
10243     OPC_CMP_ULE_D = FOP (55, FMT_D),
10244     OPC_CMP_SF_D = FOP (56, FMT_D),
10245     OPC_CMP_NGLE_D = FOP (57, FMT_D),
10246     OPC_CMP_SEQ_D = FOP (58, FMT_D),
10247     OPC_CMP_NGL_D = FOP (59, FMT_D),
10248     OPC_CMP_LT_D = FOP (60, FMT_D),
10249     OPC_CMP_NGE_D = FOP (61, FMT_D),
10250     OPC_CMP_LE_D = FOP (62, FMT_D),
10251     OPC_CMP_NGT_D = FOP (63, FMT_D),
10252
10253     OPC_CVT_S_W = FOP(32, FMT_W),
10254     OPC_CVT_D_W = FOP(33, FMT_W),
10255     OPC_CVT_S_L = FOP(32, FMT_L),
10256     OPC_CVT_D_L = FOP(33, FMT_L),
10257     OPC_CVT_PS_PW = FOP(38, FMT_W),
10258
10259     OPC_ADD_PS = FOP(0, FMT_PS),
10260     OPC_SUB_PS = FOP(1, FMT_PS),
10261     OPC_MUL_PS = FOP(2, FMT_PS),
10262     OPC_DIV_PS = FOP(3, FMT_PS),
10263     OPC_ABS_PS = FOP(5, FMT_PS),
10264     OPC_MOV_PS = FOP(6, FMT_PS),
10265     OPC_NEG_PS = FOP(7, FMT_PS),
10266     OPC_MOVCF_PS = FOP(17, FMT_PS),
10267     OPC_MOVZ_PS = FOP(18, FMT_PS),
10268     OPC_MOVN_PS = FOP(19, FMT_PS),
10269     OPC_ADDR_PS = FOP(24, FMT_PS),
10270     OPC_MULR_PS = FOP(26, FMT_PS),
10271     OPC_RECIP2_PS = FOP(28, FMT_PS),
10272     OPC_RECIP1_PS = FOP(29, FMT_PS),
10273     OPC_RSQRT1_PS = FOP(30, FMT_PS),
10274     OPC_RSQRT2_PS = FOP(31, FMT_PS),
10275
10276     OPC_CVT_S_PU = FOP(32, FMT_PS),
10277     OPC_CVT_PW_PS = FOP(36, FMT_PS),
10278     OPC_CVT_S_PL = FOP(40, FMT_PS),
10279     OPC_PLL_PS = FOP(44, FMT_PS),
10280     OPC_PLU_PS = FOP(45, FMT_PS),
10281     OPC_PUL_PS = FOP(46, FMT_PS),
10282     OPC_PUU_PS = FOP(47, FMT_PS),
10283     OPC_CMP_F_PS = FOP (48, FMT_PS),
10284     OPC_CMP_UN_PS = FOP (49, FMT_PS),
10285     OPC_CMP_EQ_PS = FOP (50, FMT_PS),
10286     OPC_CMP_UEQ_PS = FOP (51, FMT_PS),
10287     OPC_CMP_OLT_PS = FOP (52, FMT_PS),
10288     OPC_CMP_ULT_PS = FOP (53, FMT_PS),
10289     OPC_CMP_OLE_PS = FOP (54, FMT_PS),
10290     OPC_CMP_ULE_PS = FOP (55, FMT_PS),
10291     OPC_CMP_SF_PS = FOP (56, FMT_PS),
10292     OPC_CMP_NGLE_PS = FOP (57, FMT_PS),
10293     OPC_CMP_SEQ_PS = FOP (58, FMT_PS),
10294     OPC_CMP_NGL_PS = FOP (59, FMT_PS),
10295     OPC_CMP_LT_PS = FOP (60, FMT_PS),
10296     OPC_CMP_NGE_PS = FOP (61, FMT_PS),
10297     OPC_CMP_LE_PS = FOP (62, FMT_PS),
10298     OPC_CMP_NGT_PS = FOP (63, FMT_PS),
10299 };
10300
10301 enum r6_f_cmp_op {
10302     R6_OPC_CMP_AF_S   = FOP(0, FMT_W),
10303     R6_OPC_CMP_UN_S   = FOP(1, FMT_W),
10304     R6_OPC_CMP_EQ_S   = FOP(2, FMT_W),
10305     R6_OPC_CMP_UEQ_S  = FOP(3, FMT_W),
10306     R6_OPC_CMP_LT_S   = FOP(4, FMT_W),
10307     R6_OPC_CMP_ULT_S  = FOP(5, FMT_W),
10308     R6_OPC_CMP_LE_S   = FOP(6, FMT_W),
10309     R6_OPC_CMP_ULE_S  = FOP(7, FMT_W),
10310     R6_OPC_CMP_SAF_S  = FOP(8, FMT_W),
10311     R6_OPC_CMP_SUN_S  = FOP(9, FMT_W),
10312     R6_OPC_CMP_SEQ_S  = FOP(10, FMT_W),
10313     R6_OPC_CMP_SEUQ_S = FOP(11, FMT_W),
10314     R6_OPC_CMP_SLT_S  = FOP(12, FMT_W),
10315     R6_OPC_CMP_SULT_S = FOP(13, FMT_W),
10316     R6_OPC_CMP_SLE_S  = FOP(14, FMT_W),
10317     R6_OPC_CMP_SULE_S = FOP(15, FMT_W),
10318     R6_OPC_CMP_OR_S   = FOP(17, FMT_W),
10319     R6_OPC_CMP_UNE_S  = FOP(18, FMT_W),
10320     R6_OPC_CMP_NE_S   = FOP(19, FMT_W),
10321     R6_OPC_CMP_SOR_S  = FOP(25, FMT_W),
10322     R6_OPC_CMP_SUNE_S = FOP(26, FMT_W),
10323     R6_OPC_CMP_SNE_S  = FOP(27, FMT_W),
10324
10325     R6_OPC_CMP_AF_D   = FOP(0, FMT_L),
10326     R6_OPC_CMP_UN_D   = FOP(1, FMT_L),
10327     R6_OPC_CMP_EQ_D   = FOP(2, FMT_L),
10328     R6_OPC_CMP_UEQ_D  = FOP(3, FMT_L),
10329     R6_OPC_CMP_LT_D   = FOP(4, FMT_L),
10330     R6_OPC_CMP_ULT_D  = FOP(5, FMT_L),
10331     R6_OPC_CMP_LE_D   = FOP(6, FMT_L),
10332     R6_OPC_CMP_ULE_D  = FOP(7, FMT_L),
10333     R6_OPC_CMP_SAF_D  = FOP(8, FMT_L),
10334     R6_OPC_CMP_SUN_D  = FOP(9, FMT_L),
10335     R6_OPC_CMP_SEQ_D  = FOP(10, FMT_L),
10336     R6_OPC_CMP_SEUQ_D = FOP(11, FMT_L),
10337     R6_OPC_CMP_SLT_D  = FOP(12, FMT_L),
10338     R6_OPC_CMP_SULT_D = FOP(13, FMT_L),
10339     R6_OPC_CMP_SLE_D  = FOP(14, FMT_L),
10340     R6_OPC_CMP_SULE_D = FOP(15, FMT_L),
10341     R6_OPC_CMP_OR_D   = FOP(17, FMT_L),
10342     R6_OPC_CMP_UNE_D  = FOP(18, FMT_L),
10343     R6_OPC_CMP_NE_D   = FOP(19, FMT_L),
10344     R6_OPC_CMP_SOR_D  = FOP(25, FMT_L),
10345     R6_OPC_CMP_SUNE_D = FOP(26, FMT_L),
10346     R6_OPC_CMP_SNE_D  = FOP(27, FMT_L),
10347 };
10348 static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
10349 {
10350     TCGv t0 = tcg_temp_new();
10351
10352     switch (opc) {
10353     case OPC_MFC1:
10354         {
10355             TCGv_i32 fp0 = tcg_temp_new_i32();
10356
10357             gen_load_fpr32(ctx, fp0, fs);
10358             tcg_gen_ext_i32_tl(t0, fp0);
10359             tcg_temp_free_i32(fp0);
10360         }
10361         gen_store_gpr(t0, rt);
10362         break;
10363     case OPC_MTC1:
10364         gen_load_gpr(t0, rt);
10365         {
10366             TCGv_i32 fp0 = tcg_temp_new_i32();
10367
10368             tcg_gen_trunc_tl_i32(fp0, t0);
10369             gen_store_fpr32(ctx, fp0, fs);
10370             tcg_temp_free_i32(fp0);
10371         }
10372         break;
10373     case OPC_CFC1:
10374         gen_helper_1e0i(cfc1, t0, fs);
10375         gen_store_gpr(t0, rt);
10376         break;
10377     case OPC_CTC1:
10378         gen_load_gpr(t0, rt);
10379         save_cpu_state(ctx, 0);
10380         {
10381             TCGv_i32 fs_tmp = tcg_const_i32(fs);
10382
10383             gen_helper_0e2i(ctc1, t0, fs_tmp, rt);
10384             tcg_temp_free_i32(fs_tmp);
10385         }
10386         /* Stop translation as we may have changed hflags */
10387         ctx->base.is_jmp = DISAS_STOP;
10388         break;
10389 #if defined(TARGET_MIPS64)
10390     case OPC_DMFC1:
10391         gen_load_fpr64(ctx, t0, fs);
10392         gen_store_gpr(t0, rt);
10393         break;
10394     case OPC_DMTC1:
10395         gen_load_gpr(t0, rt);
10396         gen_store_fpr64(ctx, t0, fs);
10397         break;
10398 #endif
10399     case OPC_MFHC1:
10400         {
10401             TCGv_i32 fp0 = tcg_temp_new_i32();
10402
10403             gen_load_fpr32h(ctx, fp0, fs);
10404             tcg_gen_ext_i32_tl(t0, fp0);
10405             tcg_temp_free_i32(fp0);
10406         }
10407         gen_store_gpr(t0, rt);
10408         break;
10409     case OPC_MTHC1:
10410         gen_load_gpr(t0, rt);
10411         {
10412             TCGv_i32 fp0 = tcg_temp_new_i32();
10413
10414             tcg_gen_trunc_tl_i32(fp0, t0);
10415             gen_store_fpr32h(ctx, fp0, fs);
10416             tcg_temp_free_i32(fp0);
10417         }
10418         break;
10419     default:
10420         MIPS_INVAL("cp1 move");
10421         generate_exception_end(ctx, EXCP_RI);
10422         goto out;
10423     }
10424
10425  out:
10426     tcg_temp_free(t0);
10427 }
10428
10429 static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
10430 {
10431     TCGLabel *l1;
10432     TCGCond cond;
10433     TCGv_i32 t0;
10434
10435     if (rd == 0) {
10436         /* Treat as NOP. */
10437         return;
10438     }
10439
10440     if (tf)
10441         cond = TCG_COND_EQ;
10442     else
10443         cond = TCG_COND_NE;
10444
10445     l1 = gen_new_label();
10446     t0 = tcg_temp_new_i32();
10447     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
10448     tcg_gen_brcondi_i32(cond, t0, 0, l1);
10449     tcg_temp_free_i32(t0);
10450     if (rs == 0) {
10451         tcg_gen_movi_tl(cpu_gpr[rd], 0);
10452     } else {
10453         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
10454     }
10455     gen_set_label(l1);
10456 }
10457
10458 static inline void gen_movcf_s(DisasContext *ctx, int fs, int fd, int cc,
10459                                int tf)
10460 {
10461     int cond;
10462     TCGv_i32 t0 = tcg_temp_new_i32();
10463     TCGLabel *l1 = gen_new_label();
10464
10465     if (tf)
10466         cond = TCG_COND_EQ;
10467     else
10468         cond = TCG_COND_NE;
10469
10470     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
10471     tcg_gen_brcondi_i32(cond, t0, 0, l1);
10472     gen_load_fpr32(ctx, t0, fs);
10473     gen_store_fpr32(ctx, t0, fd);
10474     gen_set_label(l1);
10475     tcg_temp_free_i32(t0);
10476 }
10477
10478 static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf)
10479 {
10480     int cond;
10481     TCGv_i32 t0 = tcg_temp_new_i32();
10482     TCGv_i64 fp0;
10483     TCGLabel *l1 = gen_new_label();
10484
10485     if (tf)
10486         cond = TCG_COND_EQ;
10487     else
10488         cond = TCG_COND_NE;
10489
10490     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
10491     tcg_gen_brcondi_i32(cond, t0, 0, l1);
10492     tcg_temp_free_i32(t0);
10493     fp0 = tcg_temp_new_i64();
10494     gen_load_fpr64(ctx, fp0, fs);
10495     gen_store_fpr64(ctx, fp0, fd);
10496     tcg_temp_free_i64(fp0);
10497     gen_set_label(l1);
10498 }
10499
10500 static inline void gen_movcf_ps(DisasContext *ctx, int fs, int fd,
10501                                 int cc, int tf)
10502 {
10503     int cond;
10504     TCGv_i32 t0 = tcg_temp_new_i32();
10505     TCGLabel *l1 = gen_new_label();
10506     TCGLabel *l2 = gen_new_label();
10507
10508     if (tf)
10509         cond = TCG_COND_EQ;
10510     else
10511         cond = TCG_COND_NE;
10512
10513     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
10514     tcg_gen_brcondi_i32(cond, t0, 0, l1);
10515     gen_load_fpr32(ctx, t0, fs);
10516     gen_store_fpr32(ctx, t0, fd);
10517     gen_set_label(l1);
10518
10519     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc+1));
10520     tcg_gen_brcondi_i32(cond, t0, 0, l2);
10521     gen_load_fpr32h(ctx, t0, fs);
10522     gen_store_fpr32h(ctx, t0, fd);
10523     tcg_temp_free_i32(t0);
10524     gen_set_label(l2);
10525 }
10526
10527 static void gen_sel_s(DisasContext *ctx, enum fopcode op1, int fd, int ft,
10528                       int fs)
10529 {
10530     TCGv_i32 t1 = tcg_const_i32(0);
10531     TCGv_i32 fp0 = tcg_temp_new_i32();
10532     TCGv_i32 fp1 = tcg_temp_new_i32();
10533     TCGv_i32 fp2 = tcg_temp_new_i32();
10534     gen_load_fpr32(ctx, fp0, fd);
10535     gen_load_fpr32(ctx, fp1, ft);
10536     gen_load_fpr32(ctx, fp2, fs);
10537
10538     switch (op1) {
10539     case OPC_SEL_S:
10540         tcg_gen_andi_i32(fp0, fp0, 1);
10541         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
10542         break;
10543     case OPC_SELEQZ_S:
10544         tcg_gen_andi_i32(fp1, fp1, 1);
10545         tcg_gen_movcond_i32(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
10546         break;
10547     case OPC_SELNEZ_S:
10548         tcg_gen_andi_i32(fp1, fp1, 1);
10549         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
10550         break;
10551     default:
10552         MIPS_INVAL("gen_sel_s");
10553         generate_exception_end(ctx, EXCP_RI);
10554         break;
10555     }
10556
10557     gen_store_fpr32(ctx, fp0, fd);
10558     tcg_temp_free_i32(fp2);
10559     tcg_temp_free_i32(fp1);
10560     tcg_temp_free_i32(fp0);
10561     tcg_temp_free_i32(t1);
10562 }
10563
10564 static void gen_sel_d(DisasContext *ctx, enum fopcode op1, int fd, int ft,
10565                       int fs)
10566 {
10567     TCGv_i64 t1 = tcg_const_i64(0);
10568     TCGv_i64 fp0 = tcg_temp_new_i64();
10569     TCGv_i64 fp1 = tcg_temp_new_i64();
10570     TCGv_i64 fp2 = tcg_temp_new_i64();
10571     gen_load_fpr64(ctx, fp0, fd);
10572     gen_load_fpr64(ctx, fp1, ft);
10573     gen_load_fpr64(ctx, fp2, fs);
10574
10575     switch (op1) {
10576     case OPC_SEL_D:
10577         tcg_gen_andi_i64(fp0, fp0, 1);
10578         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
10579         break;
10580     case OPC_SELEQZ_D:
10581         tcg_gen_andi_i64(fp1, fp1, 1);
10582         tcg_gen_movcond_i64(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
10583         break;
10584     case OPC_SELNEZ_D:
10585         tcg_gen_andi_i64(fp1, fp1, 1);
10586         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
10587         break;
10588     default:
10589         MIPS_INVAL("gen_sel_d");
10590         generate_exception_end(ctx, EXCP_RI);
10591         break;
10592     }
10593
10594     gen_store_fpr64(ctx, fp0, fd);
10595     tcg_temp_free_i64(fp2);
10596     tcg_temp_free_i64(fp1);
10597     tcg_temp_free_i64(fp0);
10598     tcg_temp_free_i64(t1);
10599 }
10600
10601 static void gen_farith (DisasContext *ctx, enum fopcode op1,
10602                         int ft, int fs, int fd, int cc)
10603 {
10604     uint32_t func = ctx->opcode & 0x3f;
10605     switch (op1) {
10606     case OPC_ADD_S:
10607         {
10608             TCGv_i32 fp0 = tcg_temp_new_i32();
10609             TCGv_i32 fp1 = tcg_temp_new_i32();
10610
10611             gen_load_fpr32(ctx, fp0, fs);
10612             gen_load_fpr32(ctx, fp1, ft);
10613             gen_helper_float_add_s(fp0, cpu_env, fp0, fp1);
10614             tcg_temp_free_i32(fp1);
10615             gen_store_fpr32(ctx, fp0, fd);
10616             tcg_temp_free_i32(fp0);
10617         }
10618         break;
10619     case OPC_SUB_S:
10620         {
10621             TCGv_i32 fp0 = tcg_temp_new_i32();
10622             TCGv_i32 fp1 = tcg_temp_new_i32();
10623
10624             gen_load_fpr32(ctx, fp0, fs);
10625             gen_load_fpr32(ctx, fp1, ft);
10626             gen_helper_float_sub_s(fp0, cpu_env, fp0, fp1);
10627             tcg_temp_free_i32(fp1);
10628             gen_store_fpr32(ctx, fp0, fd);
10629             tcg_temp_free_i32(fp0);
10630         }
10631         break;
10632     case OPC_MUL_S:
10633         {
10634             TCGv_i32 fp0 = tcg_temp_new_i32();
10635             TCGv_i32 fp1 = tcg_temp_new_i32();
10636
10637             gen_load_fpr32(ctx, fp0, fs);
10638             gen_load_fpr32(ctx, fp1, ft);
10639             gen_helper_float_mul_s(fp0, cpu_env, fp0, fp1);
10640             tcg_temp_free_i32(fp1);
10641             gen_store_fpr32(ctx, fp0, fd);
10642             tcg_temp_free_i32(fp0);
10643         }
10644         break;
10645     case OPC_DIV_S:
10646         {
10647             TCGv_i32 fp0 = tcg_temp_new_i32();
10648             TCGv_i32 fp1 = tcg_temp_new_i32();
10649
10650             gen_load_fpr32(ctx, fp0, fs);
10651             gen_load_fpr32(ctx, fp1, ft);
10652             gen_helper_float_div_s(fp0, cpu_env, fp0, fp1);
10653             tcg_temp_free_i32(fp1);
10654             gen_store_fpr32(ctx, fp0, fd);
10655             tcg_temp_free_i32(fp0);
10656         }
10657         break;
10658     case OPC_SQRT_S:
10659         {
10660             TCGv_i32 fp0 = tcg_temp_new_i32();
10661
10662             gen_load_fpr32(ctx, fp0, fs);
10663             gen_helper_float_sqrt_s(fp0, cpu_env, fp0);
10664             gen_store_fpr32(ctx, fp0, fd);
10665             tcg_temp_free_i32(fp0);
10666         }
10667         break;
10668     case OPC_ABS_S:
10669         {
10670             TCGv_i32 fp0 = tcg_temp_new_i32();
10671
10672             gen_load_fpr32(ctx, fp0, fs);
10673             if (ctx->abs2008) {
10674                 tcg_gen_andi_i32(fp0, fp0, 0x7fffffffUL);
10675             } else {
10676                 gen_helper_float_abs_s(fp0, fp0);
10677             }
10678             gen_store_fpr32(ctx, fp0, fd);
10679             tcg_temp_free_i32(fp0);
10680         }
10681         break;
10682     case OPC_MOV_S:
10683         {
10684             TCGv_i32 fp0 = tcg_temp_new_i32();
10685
10686             gen_load_fpr32(ctx, fp0, fs);
10687             gen_store_fpr32(ctx, fp0, fd);
10688             tcg_temp_free_i32(fp0);
10689         }
10690         break;
10691     case OPC_NEG_S:
10692         {
10693             TCGv_i32 fp0 = tcg_temp_new_i32();
10694
10695             gen_load_fpr32(ctx, fp0, fs);
10696             if (ctx->abs2008) {
10697                 tcg_gen_xori_i32(fp0, fp0, 1UL << 31);
10698             } else {
10699                 gen_helper_float_chs_s(fp0, fp0);
10700             }
10701             gen_store_fpr32(ctx, fp0, fd);
10702             tcg_temp_free_i32(fp0);
10703         }
10704         break;
10705     case OPC_ROUND_L_S:
10706         check_cp1_64bitmode(ctx);
10707         {
10708             TCGv_i32 fp32 = tcg_temp_new_i32();
10709             TCGv_i64 fp64 = tcg_temp_new_i64();
10710
10711             gen_load_fpr32(ctx, fp32, fs);
10712             if (ctx->nan2008) {
10713                 gen_helper_float_round_2008_l_s(fp64, cpu_env, fp32);
10714             } else {
10715                 gen_helper_float_round_l_s(fp64, cpu_env, fp32);
10716             }
10717             tcg_temp_free_i32(fp32);
10718             gen_store_fpr64(ctx, fp64, fd);
10719             tcg_temp_free_i64(fp64);
10720         }
10721         break;
10722     case OPC_TRUNC_L_S:
10723         check_cp1_64bitmode(ctx);
10724         {
10725             TCGv_i32 fp32 = tcg_temp_new_i32();
10726             TCGv_i64 fp64 = tcg_temp_new_i64();
10727
10728             gen_load_fpr32(ctx, fp32, fs);
10729             if (ctx->nan2008) {
10730                 gen_helper_float_trunc_2008_l_s(fp64, cpu_env, fp32);
10731             } else {
10732                 gen_helper_float_trunc_l_s(fp64, cpu_env, fp32);
10733             }
10734             tcg_temp_free_i32(fp32);
10735             gen_store_fpr64(ctx, fp64, fd);
10736             tcg_temp_free_i64(fp64);
10737         }
10738         break;
10739     case OPC_CEIL_L_S:
10740         check_cp1_64bitmode(ctx);
10741         {
10742             TCGv_i32 fp32 = tcg_temp_new_i32();
10743             TCGv_i64 fp64 = tcg_temp_new_i64();
10744
10745             gen_load_fpr32(ctx, fp32, fs);
10746             if (ctx->nan2008) {
10747                 gen_helper_float_ceil_2008_l_s(fp64, cpu_env, fp32);
10748             } else {
10749                 gen_helper_float_ceil_l_s(fp64, cpu_env, fp32);
10750             }
10751             tcg_temp_free_i32(fp32);
10752             gen_store_fpr64(ctx, fp64, fd);
10753             tcg_temp_free_i64(fp64);
10754         }
10755         break;
10756     case OPC_FLOOR_L_S:
10757         check_cp1_64bitmode(ctx);
10758         {
10759             TCGv_i32 fp32 = tcg_temp_new_i32();
10760             TCGv_i64 fp64 = tcg_temp_new_i64();
10761
10762             gen_load_fpr32(ctx, fp32, fs);
10763             if (ctx->nan2008) {
10764                 gen_helper_float_floor_2008_l_s(fp64, cpu_env, fp32);
10765             } else {
10766                 gen_helper_float_floor_l_s(fp64, cpu_env, fp32);
10767             }
10768             tcg_temp_free_i32(fp32);
10769             gen_store_fpr64(ctx, fp64, fd);
10770             tcg_temp_free_i64(fp64);
10771         }
10772         break;
10773     case OPC_ROUND_W_S:
10774         {
10775             TCGv_i32 fp0 = tcg_temp_new_i32();
10776
10777             gen_load_fpr32(ctx, fp0, fs);
10778             if (ctx->nan2008) {
10779                 gen_helper_float_round_2008_w_s(fp0, cpu_env, fp0);
10780             } else {
10781                 gen_helper_float_round_w_s(fp0, cpu_env, fp0);
10782             }
10783             gen_store_fpr32(ctx, fp0, fd);
10784             tcg_temp_free_i32(fp0);
10785         }
10786         break;
10787     case OPC_TRUNC_W_S:
10788         {
10789             TCGv_i32 fp0 = tcg_temp_new_i32();
10790
10791             gen_load_fpr32(ctx, fp0, fs);
10792             if (ctx->nan2008) {
10793                 gen_helper_float_trunc_2008_w_s(fp0, cpu_env, fp0);
10794             } else {
10795                 gen_helper_float_trunc_w_s(fp0, cpu_env, fp0);
10796             }
10797             gen_store_fpr32(ctx, fp0, fd);
10798             tcg_temp_free_i32(fp0);
10799         }
10800         break;
10801     case OPC_CEIL_W_S:
10802         {
10803             TCGv_i32 fp0 = tcg_temp_new_i32();
10804
10805             gen_load_fpr32(ctx, fp0, fs);
10806             if (ctx->nan2008) {
10807                 gen_helper_float_ceil_2008_w_s(fp0, cpu_env, fp0);
10808             } else {
10809                 gen_helper_float_ceil_w_s(fp0, cpu_env, fp0);
10810             }
10811             gen_store_fpr32(ctx, fp0, fd);
10812             tcg_temp_free_i32(fp0);
10813         }
10814         break;
10815     case OPC_FLOOR_W_S:
10816         {
10817             TCGv_i32 fp0 = tcg_temp_new_i32();
10818
10819             gen_load_fpr32(ctx, fp0, fs);
10820             if (ctx->nan2008) {
10821                 gen_helper_float_floor_2008_w_s(fp0, cpu_env, fp0);
10822             } else {
10823                 gen_helper_float_floor_w_s(fp0, cpu_env, fp0);
10824             }
10825             gen_store_fpr32(ctx, fp0, fd);
10826             tcg_temp_free_i32(fp0);
10827         }
10828         break;
10829     case OPC_SEL_S:
10830         check_insn(ctx, ISA_MIPS32R6);
10831         gen_sel_s(ctx, op1, fd, ft, fs);
10832         break;
10833     case OPC_SELEQZ_S:
10834         check_insn(ctx, ISA_MIPS32R6);
10835         gen_sel_s(ctx, op1, fd, ft, fs);
10836         break;
10837     case OPC_SELNEZ_S:
10838         check_insn(ctx, ISA_MIPS32R6);
10839         gen_sel_s(ctx, op1, fd, ft, fs);
10840         break;
10841     case OPC_MOVCF_S:
10842         check_insn_opc_removed(ctx, ISA_MIPS32R6);
10843         gen_movcf_s(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
10844         break;
10845     case OPC_MOVZ_S:
10846         check_insn_opc_removed(ctx, ISA_MIPS32R6);
10847         {
10848             TCGLabel *l1 = gen_new_label();
10849             TCGv_i32 fp0;
10850
10851             if (ft != 0) {
10852                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
10853             }
10854             fp0 = tcg_temp_new_i32();
10855             gen_load_fpr32(ctx, fp0, fs);
10856             gen_store_fpr32(ctx, fp0, fd);
10857             tcg_temp_free_i32(fp0);
10858             gen_set_label(l1);
10859         }
10860         break;
10861     case OPC_MOVN_S:
10862         check_insn_opc_removed(ctx, ISA_MIPS32R6);
10863         {
10864             TCGLabel *l1 = gen_new_label();
10865             TCGv_i32 fp0;
10866
10867             if (ft != 0) {
10868                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
10869                 fp0 = tcg_temp_new_i32();
10870                 gen_load_fpr32(ctx, fp0, fs);
10871                 gen_store_fpr32(ctx, fp0, fd);
10872                 tcg_temp_free_i32(fp0);
10873                 gen_set_label(l1);
10874             }
10875         }
10876         break;
10877     case OPC_RECIP_S:
10878         {
10879             TCGv_i32 fp0 = tcg_temp_new_i32();
10880
10881             gen_load_fpr32(ctx, fp0, fs);
10882             gen_helper_float_recip_s(fp0, cpu_env, fp0);
10883             gen_store_fpr32(ctx, fp0, fd);
10884             tcg_temp_free_i32(fp0);
10885         }
10886         break;
10887     case OPC_RSQRT_S:
10888         {
10889             TCGv_i32 fp0 = tcg_temp_new_i32();
10890
10891             gen_load_fpr32(ctx, fp0, fs);
10892             gen_helper_float_rsqrt_s(fp0, cpu_env, fp0);
10893             gen_store_fpr32(ctx, fp0, fd);
10894             tcg_temp_free_i32(fp0);
10895         }
10896         break;
10897     case OPC_MADDF_S:
10898         check_insn(ctx, ISA_MIPS32R6);
10899         {
10900             TCGv_i32 fp0 = tcg_temp_new_i32();
10901             TCGv_i32 fp1 = tcg_temp_new_i32();
10902             TCGv_i32 fp2 = tcg_temp_new_i32();
10903             gen_load_fpr32(ctx, fp0, fs);
10904             gen_load_fpr32(ctx, fp1, ft);
10905             gen_load_fpr32(ctx, fp2, fd);
10906             gen_helper_float_maddf_s(fp2, cpu_env, fp0, fp1, fp2);
10907             gen_store_fpr32(ctx, fp2, fd);
10908             tcg_temp_free_i32(fp2);
10909             tcg_temp_free_i32(fp1);
10910             tcg_temp_free_i32(fp0);
10911         }
10912         break;
10913     case OPC_MSUBF_S:
10914         check_insn(ctx, ISA_MIPS32R6);
10915         {
10916             TCGv_i32 fp0 = tcg_temp_new_i32();
10917             TCGv_i32 fp1 = tcg_temp_new_i32();
10918             TCGv_i32 fp2 = tcg_temp_new_i32();
10919             gen_load_fpr32(ctx, fp0, fs);
10920             gen_load_fpr32(ctx, fp1, ft);
10921             gen_load_fpr32(ctx, fp2, fd);
10922             gen_helper_float_msubf_s(fp2, cpu_env, fp0, fp1, fp2);
10923             gen_store_fpr32(ctx, fp2, fd);
10924             tcg_temp_free_i32(fp2);
10925             tcg_temp_free_i32(fp1);
10926             tcg_temp_free_i32(fp0);
10927         }
10928         break;
10929     case OPC_RINT_S:
10930         check_insn(ctx, ISA_MIPS32R6);
10931         {
10932             TCGv_i32 fp0 = tcg_temp_new_i32();
10933             gen_load_fpr32(ctx, fp0, fs);
10934             gen_helper_float_rint_s(fp0, cpu_env, fp0);
10935             gen_store_fpr32(ctx, fp0, fd);
10936             tcg_temp_free_i32(fp0);
10937         }
10938         break;
10939     case OPC_CLASS_S:
10940         check_insn(ctx, ISA_MIPS32R6);
10941         {
10942             TCGv_i32 fp0 = tcg_temp_new_i32();
10943             gen_load_fpr32(ctx, fp0, fs);
10944             gen_helper_float_class_s(fp0, cpu_env, fp0);
10945             gen_store_fpr32(ctx, fp0, fd);
10946             tcg_temp_free_i32(fp0);
10947         }
10948         break;
10949     case OPC_MIN_S: /* OPC_RECIP2_S */
10950         if (ctx->insn_flags & ISA_MIPS32R6) {
10951             /* OPC_MIN_S */
10952             TCGv_i32 fp0 = tcg_temp_new_i32();
10953             TCGv_i32 fp1 = tcg_temp_new_i32();
10954             TCGv_i32 fp2 = tcg_temp_new_i32();
10955             gen_load_fpr32(ctx, fp0, fs);
10956             gen_load_fpr32(ctx, fp1, ft);
10957             gen_helper_float_min_s(fp2, cpu_env, fp0, fp1);
10958             gen_store_fpr32(ctx, fp2, fd);
10959             tcg_temp_free_i32(fp2);
10960             tcg_temp_free_i32(fp1);
10961             tcg_temp_free_i32(fp0);
10962         } else {
10963             /* OPC_RECIP2_S */
10964             check_cp1_64bitmode(ctx);
10965             {
10966                 TCGv_i32 fp0 = tcg_temp_new_i32();
10967                 TCGv_i32 fp1 = tcg_temp_new_i32();
10968
10969                 gen_load_fpr32(ctx, fp0, fs);
10970                 gen_load_fpr32(ctx, fp1, ft);
10971                 gen_helper_float_recip2_s(fp0, cpu_env, fp0, fp1);
10972                 tcg_temp_free_i32(fp1);
10973                 gen_store_fpr32(ctx, fp0, fd);
10974                 tcg_temp_free_i32(fp0);
10975             }
10976         }
10977         break;
10978     case OPC_MINA_S: /* OPC_RECIP1_S */
10979         if (ctx->insn_flags & ISA_MIPS32R6) {
10980             /* OPC_MINA_S */
10981             TCGv_i32 fp0 = tcg_temp_new_i32();
10982             TCGv_i32 fp1 = tcg_temp_new_i32();
10983             TCGv_i32 fp2 = tcg_temp_new_i32();
10984             gen_load_fpr32(ctx, fp0, fs);
10985             gen_load_fpr32(ctx, fp1, ft);
10986             gen_helper_float_mina_s(fp2, cpu_env, fp0, fp1);
10987             gen_store_fpr32(ctx, fp2, fd);
10988             tcg_temp_free_i32(fp2);
10989             tcg_temp_free_i32(fp1);
10990             tcg_temp_free_i32(fp0);
10991         } else {
10992             /* OPC_RECIP1_S */
10993             check_cp1_64bitmode(ctx);
10994             {
10995                 TCGv_i32 fp0 = tcg_temp_new_i32();
10996
10997                 gen_load_fpr32(ctx, fp0, fs);
10998                 gen_helper_float_recip1_s(fp0, cpu_env, fp0);
10999                 gen_store_fpr32(ctx, fp0, fd);
11000                 tcg_temp_free_i32(fp0);
11001             }
11002         }
11003         break;
11004     case OPC_MAX_S: /* OPC_RSQRT1_S */
11005         if (ctx->insn_flags & ISA_MIPS32R6) {
11006             /* OPC_MAX_S */
11007             TCGv_i32 fp0 = tcg_temp_new_i32();
11008             TCGv_i32 fp1 = tcg_temp_new_i32();
11009             gen_load_fpr32(ctx, fp0, fs);
11010             gen_load_fpr32(ctx, fp1, ft);
11011             gen_helper_float_max_s(fp1, cpu_env, fp0, fp1);
11012             gen_store_fpr32(ctx, fp1, fd);
11013             tcg_temp_free_i32(fp1);
11014             tcg_temp_free_i32(fp0);
11015         } else {
11016             /* OPC_RSQRT1_S */
11017             check_cp1_64bitmode(ctx);
11018             {
11019                 TCGv_i32 fp0 = tcg_temp_new_i32();
11020
11021                 gen_load_fpr32(ctx, fp0, fs);
11022                 gen_helper_float_rsqrt1_s(fp0, cpu_env, fp0);
11023                 gen_store_fpr32(ctx, fp0, fd);
11024                 tcg_temp_free_i32(fp0);
11025             }
11026         }
11027         break;
11028     case OPC_MAXA_S: /* OPC_RSQRT2_S */
11029         if (ctx->insn_flags & ISA_MIPS32R6) {
11030             /* OPC_MAXA_S */
11031             TCGv_i32 fp0 = tcg_temp_new_i32();
11032             TCGv_i32 fp1 = tcg_temp_new_i32();
11033             gen_load_fpr32(ctx, fp0, fs);
11034             gen_load_fpr32(ctx, fp1, ft);
11035             gen_helper_float_maxa_s(fp1, cpu_env, fp0, fp1);
11036             gen_store_fpr32(ctx, fp1, fd);
11037             tcg_temp_free_i32(fp1);
11038             tcg_temp_free_i32(fp0);
11039         } else {
11040             /* OPC_RSQRT2_S */
11041             check_cp1_64bitmode(ctx);
11042             {
11043                 TCGv_i32 fp0 = tcg_temp_new_i32();
11044                 TCGv_i32 fp1 = tcg_temp_new_i32();
11045
11046                 gen_load_fpr32(ctx, fp0, fs);
11047                 gen_load_fpr32(ctx, fp1, ft);
11048                 gen_helper_float_rsqrt2_s(fp0, cpu_env, fp0, fp1);
11049                 tcg_temp_free_i32(fp1);
11050                 gen_store_fpr32(ctx, fp0, fd);
11051                 tcg_temp_free_i32(fp0);
11052             }
11053         }
11054         break;
11055     case OPC_CVT_D_S:
11056         check_cp1_registers(ctx, fd);
11057         {
11058             TCGv_i32 fp32 = tcg_temp_new_i32();
11059             TCGv_i64 fp64 = tcg_temp_new_i64();
11060
11061             gen_load_fpr32(ctx, fp32, fs);
11062             gen_helper_float_cvtd_s(fp64, cpu_env, fp32);
11063             tcg_temp_free_i32(fp32);
11064             gen_store_fpr64(ctx, fp64, fd);
11065             tcg_temp_free_i64(fp64);
11066         }
11067         break;
11068     case OPC_CVT_W_S:
11069         {
11070             TCGv_i32 fp0 = tcg_temp_new_i32();
11071
11072             gen_load_fpr32(ctx, fp0, fs);
11073             if (ctx->nan2008) {
11074                 gen_helper_float_cvt_2008_w_s(fp0, cpu_env, fp0);
11075             } else {
11076                 gen_helper_float_cvt_w_s(fp0, cpu_env, fp0);
11077             }
11078             gen_store_fpr32(ctx, fp0, fd);
11079             tcg_temp_free_i32(fp0);
11080         }
11081         break;
11082     case OPC_CVT_L_S:
11083         check_cp1_64bitmode(ctx);
11084         {
11085             TCGv_i32 fp32 = tcg_temp_new_i32();
11086             TCGv_i64 fp64 = tcg_temp_new_i64();
11087
11088             gen_load_fpr32(ctx, fp32, fs);
11089             if (ctx->nan2008) {
11090                 gen_helper_float_cvt_2008_l_s(fp64, cpu_env, fp32);
11091             } else {
11092                 gen_helper_float_cvt_l_s(fp64, cpu_env, fp32);
11093             }
11094             tcg_temp_free_i32(fp32);
11095             gen_store_fpr64(ctx, fp64, fd);
11096             tcg_temp_free_i64(fp64);
11097         }
11098         break;
11099     case OPC_CVT_PS_S:
11100         check_ps(ctx);
11101         {
11102             TCGv_i64 fp64 = tcg_temp_new_i64();
11103             TCGv_i32 fp32_0 = tcg_temp_new_i32();
11104             TCGv_i32 fp32_1 = tcg_temp_new_i32();
11105
11106             gen_load_fpr32(ctx, fp32_0, fs);
11107             gen_load_fpr32(ctx, fp32_1, ft);
11108             tcg_gen_concat_i32_i64(fp64, fp32_1, fp32_0);
11109             tcg_temp_free_i32(fp32_1);
11110             tcg_temp_free_i32(fp32_0);
11111             gen_store_fpr64(ctx, fp64, fd);
11112             tcg_temp_free_i64(fp64);
11113         }
11114         break;
11115     case OPC_CMP_F_S:
11116     case OPC_CMP_UN_S:
11117     case OPC_CMP_EQ_S:
11118     case OPC_CMP_UEQ_S:
11119     case OPC_CMP_OLT_S:
11120     case OPC_CMP_ULT_S:
11121     case OPC_CMP_OLE_S:
11122     case OPC_CMP_ULE_S:
11123     case OPC_CMP_SF_S:
11124     case OPC_CMP_NGLE_S:
11125     case OPC_CMP_SEQ_S:
11126     case OPC_CMP_NGL_S:
11127     case OPC_CMP_LT_S:
11128     case OPC_CMP_NGE_S:
11129     case OPC_CMP_LE_S:
11130     case OPC_CMP_NGT_S:
11131         check_insn_opc_removed(ctx, ISA_MIPS32R6);
11132         if (ctx->opcode & (1 << 6)) {
11133             gen_cmpabs_s(ctx, func-48, ft, fs, cc);
11134         } else {
11135             gen_cmp_s(ctx, func-48, ft, fs, cc);
11136         }
11137         break;
11138     case OPC_ADD_D:
11139         check_cp1_registers(ctx, fs | ft | fd);
11140         {
11141             TCGv_i64 fp0 = tcg_temp_new_i64();
11142             TCGv_i64 fp1 = tcg_temp_new_i64();
11143
11144             gen_load_fpr64(ctx, fp0, fs);
11145             gen_load_fpr64(ctx, fp1, ft);
11146             gen_helper_float_add_d(fp0, cpu_env, fp0, fp1);
11147             tcg_temp_free_i64(fp1);
11148             gen_store_fpr64(ctx, fp0, fd);
11149             tcg_temp_free_i64(fp0);
11150         }
11151         break;
11152     case OPC_SUB_D:
11153         check_cp1_registers(ctx, fs | ft | fd);
11154         {
11155             TCGv_i64 fp0 = tcg_temp_new_i64();
11156             TCGv_i64 fp1 = tcg_temp_new_i64();
11157
11158             gen_load_fpr64(ctx, fp0, fs);
11159             gen_load_fpr64(ctx, fp1, ft);
11160             gen_helper_float_sub_d(fp0, cpu_env, fp0, fp1);
11161             tcg_temp_free_i64(fp1);
11162             gen_store_fpr64(ctx, fp0, fd);
11163             tcg_temp_free_i64(fp0);
11164         }
11165         break;
11166     case OPC_MUL_D:
11167         check_cp1_registers(ctx, fs | ft | fd);
11168         {
11169             TCGv_i64 fp0 = tcg_temp_new_i64();
11170             TCGv_i64 fp1 = tcg_temp_new_i64();
11171
11172             gen_load_fpr64(ctx, fp0, fs);
11173             gen_load_fpr64(ctx, fp1, ft);
11174             gen_helper_float_mul_d(fp0, cpu_env, fp0, fp1);
11175             tcg_temp_free_i64(fp1);
11176             gen_store_fpr64(ctx, fp0, fd);
11177             tcg_temp_free_i64(fp0);
11178         }
11179         break;
11180     case OPC_DIV_D:
11181         check_cp1_registers(ctx, fs | ft | fd);
11182         {
11183             TCGv_i64 fp0 = tcg_temp_new_i64();
11184             TCGv_i64 fp1 = tcg_temp_new_i64();
11185
11186             gen_load_fpr64(ctx, fp0, fs);
11187             gen_load_fpr64(ctx, fp1, ft);
11188             gen_helper_float_div_d(fp0, cpu_env, fp0, fp1);
11189             tcg_temp_free_i64(fp1);
11190             gen_store_fpr64(ctx, fp0, fd);
11191             tcg_temp_free_i64(fp0);
11192         }
11193         break;
11194     case OPC_SQRT_D:
11195         check_cp1_registers(ctx, fs | fd);
11196         {
11197             TCGv_i64 fp0 = tcg_temp_new_i64();
11198
11199             gen_load_fpr64(ctx, fp0, fs);
11200             gen_helper_float_sqrt_d(fp0, cpu_env, fp0);
11201             gen_store_fpr64(ctx, fp0, fd);
11202             tcg_temp_free_i64(fp0);
11203         }
11204         break;
11205     case OPC_ABS_D:
11206         check_cp1_registers(ctx, fs | fd);
11207         {
11208             TCGv_i64 fp0 = tcg_temp_new_i64();
11209
11210             gen_load_fpr64(ctx, fp0, fs);
11211             if (ctx->abs2008) {
11212                 tcg_gen_andi_i64(fp0, fp0, 0x7fffffffffffffffULL);
11213             } else {
11214                 gen_helper_float_abs_d(fp0, fp0);
11215             }
11216             gen_store_fpr64(ctx, fp0, fd);
11217             tcg_temp_free_i64(fp0);
11218         }
11219         break;
11220     case OPC_MOV_D:
11221         check_cp1_registers(ctx, fs | fd);
11222         {
11223             TCGv_i64 fp0 = tcg_temp_new_i64();
11224
11225             gen_load_fpr64(ctx, fp0, fs);
11226             gen_store_fpr64(ctx, fp0, fd);
11227             tcg_temp_free_i64(fp0);
11228         }
11229         break;
11230     case OPC_NEG_D:
11231         check_cp1_registers(ctx, fs | fd);
11232         {
11233             TCGv_i64 fp0 = tcg_temp_new_i64();
11234
11235             gen_load_fpr64(ctx, fp0, fs);
11236             if (ctx->abs2008) {
11237                 tcg_gen_xori_i64(fp0, fp0, 1ULL << 63);
11238             } else {
11239                 gen_helper_float_chs_d(fp0, fp0);
11240             }
11241             gen_store_fpr64(ctx, fp0, fd);
11242             tcg_temp_free_i64(fp0);
11243         }
11244         break;
11245     case OPC_ROUND_L_D:
11246         check_cp1_64bitmode(ctx);
11247         {
11248             TCGv_i64 fp0 = tcg_temp_new_i64();
11249
11250             gen_load_fpr64(ctx, fp0, fs);
11251             if (ctx->nan2008) {
11252                 gen_helper_float_round_2008_l_d(fp0, cpu_env, fp0);
11253             } else {
11254                 gen_helper_float_round_l_d(fp0, cpu_env, fp0);
11255             }
11256             gen_store_fpr64(ctx, fp0, fd);
11257             tcg_temp_free_i64(fp0);
11258         }
11259         break;
11260     case OPC_TRUNC_L_D:
11261         check_cp1_64bitmode(ctx);
11262         {
11263             TCGv_i64 fp0 = tcg_temp_new_i64();
11264
11265             gen_load_fpr64(ctx, fp0, fs);
11266             if (ctx->nan2008) {
11267                 gen_helper_float_trunc_2008_l_d(fp0, cpu_env, fp0);
11268             } else {
11269                 gen_helper_float_trunc_l_d(fp0, cpu_env, fp0);
11270             }
11271             gen_store_fpr64(ctx, fp0, fd);
11272             tcg_temp_free_i64(fp0);
11273         }
11274         break;
11275     case OPC_CEIL_L_D:
11276         check_cp1_64bitmode(ctx);
11277         {
11278             TCGv_i64 fp0 = tcg_temp_new_i64();
11279
11280             gen_load_fpr64(ctx, fp0, fs);
11281             if (ctx->nan2008) {
11282                 gen_helper_float_ceil_2008_l_d(fp0, cpu_env, fp0);
11283             } else {
11284                 gen_helper_float_ceil_l_d(fp0, cpu_env, fp0);
11285             }
11286             gen_store_fpr64(ctx, fp0, fd);
11287             tcg_temp_free_i64(fp0);
11288         }
11289         break;
11290     case OPC_FLOOR_L_D:
11291         check_cp1_64bitmode(ctx);
11292         {
11293             TCGv_i64 fp0 = tcg_temp_new_i64();
11294
11295             gen_load_fpr64(ctx, fp0, fs);
11296             if (ctx->nan2008) {
11297                 gen_helper_float_floor_2008_l_d(fp0, cpu_env, fp0);
11298             } else {
11299                 gen_helper_float_floor_l_d(fp0, cpu_env, fp0);
11300             }
11301             gen_store_fpr64(ctx, fp0, fd);
11302             tcg_temp_free_i64(fp0);
11303         }
11304         break;
11305     case OPC_ROUND_W_D:
11306         check_cp1_registers(ctx, fs);
11307         {
11308             TCGv_i32 fp32 = tcg_temp_new_i32();
11309             TCGv_i64 fp64 = tcg_temp_new_i64();
11310
11311             gen_load_fpr64(ctx, fp64, fs);
11312             if (ctx->nan2008) {
11313                 gen_helper_float_round_2008_w_d(fp32, cpu_env, fp64);
11314             } else {
11315                 gen_helper_float_round_w_d(fp32, cpu_env, fp64);
11316             }
11317             tcg_temp_free_i64(fp64);
11318             gen_store_fpr32(ctx, fp32, fd);
11319             tcg_temp_free_i32(fp32);
11320         }
11321         break;
11322     case OPC_TRUNC_W_D:
11323         check_cp1_registers(ctx, fs);
11324         {
11325             TCGv_i32 fp32 = tcg_temp_new_i32();
11326             TCGv_i64 fp64 = tcg_temp_new_i64();
11327
11328             gen_load_fpr64(ctx, fp64, fs);
11329             if (ctx->nan2008) {
11330                 gen_helper_float_trunc_2008_w_d(fp32, cpu_env, fp64);
11331             } else {
11332                 gen_helper_float_trunc_w_d(fp32, cpu_env, fp64);
11333             }
11334             tcg_temp_free_i64(fp64);
11335             gen_store_fpr32(ctx, fp32, fd);
11336             tcg_temp_free_i32(fp32);
11337         }
11338         break;
11339     case OPC_CEIL_W_D:
11340         check_cp1_registers(ctx, fs);
11341         {
11342             TCGv_i32 fp32 = tcg_temp_new_i32();
11343             TCGv_i64 fp64 = tcg_temp_new_i64();
11344
11345             gen_load_fpr64(ctx, fp64, fs);
11346             if (ctx->nan2008) {
11347                 gen_helper_float_ceil_2008_w_d(fp32, cpu_env, fp64);
11348             } else {
11349                 gen_helper_float_ceil_w_d(fp32, cpu_env, fp64);
11350             }
11351             tcg_temp_free_i64(fp64);
11352             gen_store_fpr32(ctx, fp32, fd);
11353             tcg_temp_free_i32(fp32);
11354         }
11355         break;
11356     case OPC_FLOOR_W_D:
11357         check_cp1_registers(ctx, fs);
11358         {
11359             TCGv_i32 fp32 = tcg_temp_new_i32();
11360             TCGv_i64 fp64 = tcg_temp_new_i64();
11361
11362             gen_load_fpr64(ctx, fp64, fs);
11363             if (ctx->nan2008) {
11364                 gen_helper_float_floor_2008_w_d(fp32, cpu_env, fp64);
11365             } else {
11366                 gen_helper_float_floor_w_d(fp32, cpu_env, fp64);
11367             }
11368             tcg_temp_free_i64(fp64);
11369             gen_store_fpr32(ctx, fp32, fd);
11370             tcg_temp_free_i32(fp32);
11371         }
11372         break;
11373     case OPC_SEL_D:
11374         check_insn(ctx, ISA_MIPS32R6);
11375         gen_sel_d(ctx, op1, fd, ft, fs);
11376         break;
11377     case OPC_SELEQZ_D:
11378         check_insn(ctx, ISA_MIPS32R6);
11379         gen_sel_d(ctx, op1, fd, ft, fs);
11380         break;
11381     case OPC_SELNEZ_D:
11382         check_insn(ctx, ISA_MIPS32R6);
11383         gen_sel_d(ctx, op1, fd, ft, fs);
11384         break;
11385     case OPC_MOVCF_D:
11386         check_insn_opc_removed(ctx, ISA_MIPS32R6);
11387         gen_movcf_d(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
11388         break;
11389     case OPC_MOVZ_D:
11390         check_insn_opc_removed(ctx, ISA_MIPS32R6);
11391         {
11392             TCGLabel *l1 = gen_new_label();
11393             TCGv_i64 fp0;
11394
11395             if (ft != 0) {
11396                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
11397             }
11398             fp0 = tcg_temp_new_i64();
11399             gen_load_fpr64(ctx, fp0, fs);
11400             gen_store_fpr64(ctx, fp0, fd);
11401             tcg_temp_free_i64(fp0);
11402             gen_set_label(l1);
11403         }
11404         break;
11405     case OPC_MOVN_D:
11406         check_insn_opc_removed(ctx, ISA_MIPS32R6);
11407         {
11408             TCGLabel *l1 = gen_new_label();
11409             TCGv_i64 fp0;
11410
11411             if (ft != 0) {
11412                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
11413                 fp0 = tcg_temp_new_i64();
11414                 gen_load_fpr64(ctx, fp0, fs);
11415                 gen_store_fpr64(ctx, fp0, fd);
11416                 tcg_temp_free_i64(fp0);
11417                 gen_set_label(l1);
11418             }
11419         }
11420         break;
11421     case OPC_RECIP_D:
11422         check_cp1_registers(ctx, fs | fd);
11423         {
11424             TCGv_i64 fp0 = tcg_temp_new_i64();
11425
11426             gen_load_fpr64(ctx, fp0, fs);
11427             gen_helper_float_recip_d(fp0, cpu_env, fp0);
11428             gen_store_fpr64(ctx, fp0, fd);
11429             tcg_temp_free_i64(fp0);
11430         }
11431         break;
11432     case OPC_RSQRT_D:
11433         check_cp1_registers(ctx, fs | fd);
11434         {
11435             TCGv_i64 fp0 = tcg_temp_new_i64();
11436
11437             gen_load_fpr64(ctx, fp0, fs);
11438             gen_helper_float_rsqrt_d(fp0, cpu_env, fp0);
11439             gen_store_fpr64(ctx, fp0, fd);
11440             tcg_temp_free_i64(fp0);
11441         }
11442         break;
11443     case OPC_MADDF_D:
11444         check_insn(ctx, ISA_MIPS32R6);
11445         {
11446             TCGv_i64 fp0 = tcg_temp_new_i64();
11447             TCGv_i64 fp1 = tcg_temp_new_i64();
11448             TCGv_i64 fp2 = tcg_temp_new_i64();
11449             gen_load_fpr64(ctx, fp0, fs);
11450             gen_load_fpr64(ctx, fp1, ft);
11451             gen_load_fpr64(ctx, fp2, fd);
11452             gen_helper_float_maddf_d(fp2, cpu_env, fp0, fp1, fp2);
11453             gen_store_fpr64(ctx, fp2, fd);
11454             tcg_temp_free_i64(fp2);
11455             tcg_temp_free_i64(fp1);
11456             tcg_temp_free_i64(fp0);
11457         }
11458         break;
11459     case OPC_MSUBF_D:
11460         check_insn(ctx, ISA_MIPS32R6);
11461         {
11462             TCGv_i64 fp0 = tcg_temp_new_i64();
11463             TCGv_i64 fp1 = tcg_temp_new_i64();
11464             TCGv_i64 fp2 = tcg_temp_new_i64();
11465             gen_load_fpr64(ctx, fp0, fs);
11466             gen_load_fpr64(ctx, fp1, ft);
11467             gen_load_fpr64(ctx, fp2, fd);
11468             gen_helper_float_msubf_d(fp2, cpu_env, fp0, fp1, fp2);
11469             gen_store_fpr64(ctx, fp2, fd);
11470             tcg_temp_free_i64(fp2);
11471             tcg_temp_free_i64(fp1);
11472             tcg_temp_free_i64(fp0);
11473         }
11474         break;
11475     case OPC_RINT_D:
11476         check_insn(ctx, ISA_MIPS32R6);
11477         {
11478             TCGv_i64 fp0 = tcg_temp_new_i64();
11479             gen_load_fpr64(ctx, fp0, fs);
11480             gen_helper_float_rint_d(fp0, cpu_env, fp0);
11481             gen_store_fpr64(ctx, fp0, fd);
11482             tcg_temp_free_i64(fp0);
11483         }
11484         break;
11485     case OPC_CLASS_D:
11486         check_insn(ctx, ISA_MIPS32R6);
11487         {
11488             TCGv_i64 fp0 = tcg_temp_new_i64();
11489             gen_load_fpr64(ctx, fp0, fs);
11490             gen_helper_float_class_d(fp0, cpu_env, fp0);
11491             gen_store_fpr64(ctx, fp0, fd);
11492             tcg_temp_free_i64(fp0);
11493         }
11494         break;
11495     case OPC_MIN_D: /* OPC_RECIP2_D */
11496         if (ctx->insn_flags & ISA_MIPS32R6) {
11497             /* OPC_MIN_D */
11498             TCGv_i64 fp0 = tcg_temp_new_i64();
11499             TCGv_i64 fp1 = tcg_temp_new_i64();
11500             gen_load_fpr64(ctx, fp0, fs);
11501             gen_load_fpr64(ctx, fp1, ft);
11502             gen_helper_float_min_d(fp1, cpu_env, fp0, fp1);
11503             gen_store_fpr64(ctx, fp1, fd);
11504             tcg_temp_free_i64(fp1);
11505             tcg_temp_free_i64(fp0);
11506         } else {
11507             /* OPC_RECIP2_D */
11508             check_cp1_64bitmode(ctx);
11509             {
11510                 TCGv_i64 fp0 = tcg_temp_new_i64();
11511                 TCGv_i64 fp1 = tcg_temp_new_i64();
11512
11513                 gen_load_fpr64(ctx, fp0, fs);
11514                 gen_load_fpr64(ctx, fp1, ft);
11515                 gen_helper_float_recip2_d(fp0, cpu_env, fp0, fp1);
11516                 tcg_temp_free_i64(fp1);
11517                 gen_store_fpr64(ctx, fp0, fd);
11518                 tcg_temp_free_i64(fp0);
11519             }
11520         }
11521         break;
11522     case OPC_MINA_D: /* OPC_RECIP1_D */
11523         if (ctx->insn_flags & ISA_MIPS32R6) {
11524             /* OPC_MINA_D */
11525             TCGv_i64 fp0 = tcg_temp_new_i64();
11526             TCGv_i64 fp1 = tcg_temp_new_i64();
11527             gen_load_fpr64(ctx, fp0, fs);
11528             gen_load_fpr64(ctx, fp1, ft);
11529             gen_helper_float_mina_d(fp1, cpu_env, fp0, fp1);
11530             gen_store_fpr64(ctx, fp1, fd);
11531             tcg_temp_free_i64(fp1);
11532             tcg_temp_free_i64(fp0);
11533         } else {
11534             /* OPC_RECIP1_D */
11535             check_cp1_64bitmode(ctx);
11536             {
11537                 TCGv_i64 fp0 = tcg_temp_new_i64();
11538
11539                 gen_load_fpr64(ctx, fp0, fs);
11540                 gen_helper_float_recip1_d(fp0, cpu_env, fp0);
11541                 gen_store_fpr64(ctx, fp0, fd);
11542                 tcg_temp_free_i64(fp0);
11543             }
11544         }
11545         break;
11546     case OPC_MAX_D: /*  OPC_RSQRT1_D */
11547         if (ctx->insn_flags & ISA_MIPS32R6) {
11548             /* OPC_MAX_D */
11549             TCGv_i64 fp0 = tcg_temp_new_i64();
11550             TCGv_i64 fp1 = tcg_temp_new_i64();
11551             gen_load_fpr64(ctx, fp0, fs);
11552             gen_load_fpr64(ctx, fp1, ft);
11553             gen_helper_float_max_d(fp1, cpu_env, fp0, fp1);
11554             gen_store_fpr64(ctx, fp1, fd);
11555             tcg_temp_free_i64(fp1);
11556             tcg_temp_free_i64(fp0);
11557         } else {
11558             /* OPC_RSQRT1_D */
11559             check_cp1_64bitmode(ctx);
11560             {
11561                 TCGv_i64 fp0 = tcg_temp_new_i64();
11562
11563                 gen_load_fpr64(ctx, fp0, fs);
11564                 gen_helper_float_rsqrt1_d(fp0, cpu_env, fp0);
11565                 gen_store_fpr64(ctx, fp0, fd);
11566                 tcg_temp_free_i64(fp0);
11567             }
11568         }
11569         break;
11570     case OPC_MAXA_D: /* OPC_RSQRT2_D */
11571         if (ctx->insn_flags & ISA_MIPS32R6) {
11572             /* OPC_MAXA_D */
11573             TCGv_i64 fp0 = tcg_temp_new_i64();
11574             TCGv_i64 fp1 = tcg_temp_new_i64();
11575             gen_load_fpr64(ctx, fp0, fs);
11576             gen_load_fpr64(ctx, fp1, ft);
11577             gen_helper_float_maxa_d(fp1, cpu_env, fp0, fp1);
11578             gen_store_fpr64(ctx, fp1, fd);
11579             tcg_temp_free_i64(fp1);
11580             tcg_temp_free_i64(fp0);
11581         } else {
11582             /* OPC_RSQRT2_D */
11583             check_cp1_64bitmode(ctx);
11584             {
11585                 TCGv_i64 fp0 = tcg_temp_new_i64();
11586                 TCGv_i64 fp1 = tcg_temp_new_i64();
11587
11588                 gen_load_fpr64(ctx, fp0, fs);
11589                 gen_load_fpr64(ctx, fp1, ft);
11590                 gen_helper_float_rsqrt2_d(fp0, cpu_env, fp0, fp1);
11591                 tcg_temp_free_i64(fp1);
11592                 gen_store_fpr64(ctx, fp0, fd);
11593                 tcg_temp_free_i64(fp0);
11594             }
11595         }
11596         break;
11597     case OPC_CMP_F_D:
11598     case OPC_CMP_UN_D:
11599     case OPC_CMP_EQ_D:
11600     case OPC_CMP_UEQ_D:
11601     case OPC_CMP_OLT_D:
11602     case OPC_CMP_ULT_D:
11603     case OPC_CMP_OLE_D:
11604     case OPC_CMP_ULE_D:
11605     case OPC_CMP_SF_D:
11606     case OPC_CMP_NGLE_D:
11607     case OPC_CMP_SEQ_D:
11608     case OPC_CMP_NGL_D:
11609     case OPC_CMP_LT_D:
11610     case OPC_CMP_NGE_D:
11611     case OPC_CMP_LE_D:
11612     case OPC_CMP_NGT_D:
11613         check_insn_opc_removed(ctx, ISA_MIPS32R6);
11614         if (ctx->opcode & (1 << 6)) {
11615             gen_cmpabs_d(ctx, func-48, ft, fs, cc);
11616         } else {
11617             gen_cmp_d(ctx, func-48, ft, fs, cc);
11618         }
11619         break;
11620     case OPC_CVT_S_D:
11621         check_cp1_registers(ctx, fs);
11622         {
11623             TCGv_i32 fp32 = tcg_temp_new_i32();
11624             TCGv_i64 fp64 = tcg_temp_new_i64();
11625
11626             gen_load_fpr64(ctx, fp64, fs);
11627             gen_helper_float_cvts_d(fp32, cpu_env, fp64);
11628             tcg_temp_free_i64(fp64);
11629             gen_store_fpr32(ctx, fp32, fd);
11630             tcg_temp_free_i32(fp32);
11631         }
11632         break;
11633     case OPC_CVT_W_D:
11634         check_cp1_registers(ctx, fs);
11635         {
11636             TCGv_i32 fp32 = tcg_temp_new_i32();
11637             TCGv_i64 fp64 = tcg_temp_new_i64();
11638
11639             gen_load_fpr64(ctx, fp64, fs);
11640             if (ctx->nan2008) {
11641                 gen_helper_float_cvt_2008_w_d(fp32, cpu_env, fp64);
11642             } else {
11643                 gen_helper_float_cvt_w_d(fp32, cpu_env, fp64);
11644             }
11645             tcg_temp_free_i64(fp64);
11646             gen_store_fpr32(ctx, fp32, fd);
11647             tcg_temp_free_i32(fp32);
11648         }
11649         break;
11650     case OPC_CVT_L_D:
11651         check_cp1_64bitmode(ctx);
11652         {
11653             TCGv_i64 fp0 = tcg_temp_new_i64();
11654
11655             gen_load_fpr64(ctx, fp0, fs);
11656             if (ctx->nan2008) {
11657                 gen_helper_float_cvt_2008_l_d(fp0, cpu_env, fp0);
11658             } else {
11659                 gen_helper_float_cvt_l_d(fp0, cpu_env, fp0);
11660             }
11661             gen_store_fpr64(ctx, fp0, fd);
11662             tcg_temp_free_i64(fp0);
11663         }
11664         break;
11665     case OPC_CVT_S_W:
11666         {
11667             TCGv_i32 fp0 = tcg_temp_new_i32();
11668
11669             gen_load_fpr32(ctx, fp0, fs);
11670             gen_helper_float_cvts_w(fp0, cpu_env, fp0);
11671             gen_store_fpr32(ctx, fp0, fd);
11672             tcg_temp_free_i32(fp0);
11673         }
11674         break;
11675     case OPC_CVT_D_W:
11676         check_cp1_registers(ctx, fd);
11677         {
11678             TCGv_i32 fp32 = tcg_temp_new_i32();
11679             TCGv_i64 fp64 = tcg_temp_new_i64();
11680
11681             gen_load_fpr32(ctx, fp32, fs);
11682             gen_helper_float_cvtd_w(fp64, cpu_env, fp32);
11683             tcg_temp_free_i32(fp32);
11684             gen_store_fpr64(ctx, fp64, fd);
11685             tcg_temp_free_i64(fp64);
11686         }
11687         break;
11688     case OPC_CVT_S_L:
11689         check_cp1_64bitmode(ctx);
11690         {
11691             TCGv_i32 fp32 = tcg_temp_new_i32();
11692             TCGv_i64 fp64 = tcg_temp_new_i64();
11693
11694             gen_load_fpr64(ctx, fp64, fs);
11695             gen_helper_float_cvts_l(fp32, cpu_env, fp64);
11696             tcg_temp_free_i64(fp64);
11697             gen_store_fpr32(ctx, fp32, fd);
11698             tcg_temp_free_i32(fp32);
11699         }
11700         break;
11701     case OPC_CVT_D_L:
11702         check_cp1_64bitmode(ctx);
11703         {
11704             TCGv_i64 fp0 = tcg_temp_new_i64();
11705
11706             gen_load_fpr64(ctx, fp0, fs);
11707             gen_helper_float_cvtd_l(fp0, cpu_env, fp0);
11708             gen_store_fpr64(ctx, fp0, fd);
11709             tcg_temp_free_i64(fp0);
11710         }
11711         break;
11712     case OPC_CVT_PS_PW:
11713         check_ps(ctx);
11714         {
11715             TCGv_i64 fp0 = tcg_temp_new_i64();
11716
11717             gen_load_fpr64(ctx, fp0, fs);
11718             gen_helper_float_cvtps_pw(fp0, cpu_env, fp0);
11719             gen_store_fpr64(ctx, fp0, fd);
11720             tcg_temp_free_i64(fp0);
11721         }
11722         break;
11723     case OPC_ADD_PS:
11724         check_ps(ctx);
11725         {
11726             TCGv_i64 fp0 = tcg_temp_new_i64();
11727             TCGv_i64 fp1 = tcg_temp_new_i64();
11728
11729             gen_load_fpr64(ctx, fp0, fs);
11730             gen_load_fpr64(ctx, fp1, ft);
11731             gen_helper_float_add_ps(fp0, cpu_env, fp0, fp1);
11732             tcg_temp_free_i64(fp1);
11733             gen_store_fpr64(ctx, fp0, fd);
11734             tcg_temp_free_i64(fp0);
11735         }
11736         break;
11737     case OPC_SUB_PS:
11738         check_ps(ctx);
11739         {
11740             TCGv_i64 fp0 = tcg_temp_new_i64();
11741             TCGv_i64 fp1 = tcg_temp_new_i64();
11742
11743             gen_load_fpr64(ctx, fp0, fs);
11744             gen_load_fpr64(ctx, fp1, ft);
11745             gen_helper_float_sub_ps(fp0, cpu_env, fp0, fp1);
11746             tcg_temp_free_i64(fp1);
11747             gen_store_fpr64(ctx, fp0, fd);
11748             tcg_temp_free_i64(fp0);
11749         }
11750         break;
11751     case OPC_MUL_PS:
11752         check_ps(ctx);
11753         {
11754             TCGv_i64 fp0 = tcg_temp_new_i64();
11755             TCGv_i64 fp1 = tcg_temp_new_i64();
11756
11757             gen_load_fpr64(ctx, fp0, fs);
11758             gen_load_fpr64(ctx, fp1, ft);
11759             gen_helper_float_mul_ps(fp0, cpu_env, fp0, fp1);
11760             tcg_temp_free_i64(fp1);
11761             gen_store_fpr64(ctx, fp0, fd);
11762             tcg_temp_free_i64(fp0);
11763         }
11764         break;
11765     case OPC_ABS_PS:
11766         check_ps(ctx);
11767         {
11768             TCGv_i64 fp0 = tcg_temp_new_i64();
11769
11770             gen_load_fpr64(ctx, fp0, fs);
11771             gen_helper_float_abs_ps(fp0, fp0);
11772             gen_store_fpr64(ctx, fp0, fd);
11773             tcg_temp_free_i64(fp0);
11774         }
11775         break;
11776     case OPC_MOV_PS:
11777         check_ps(ctx);
11778         {
11779             TCGv_i64 fp0 = tcg_temp_new_i64();
11780
11781             gen_load_fpr64(ctx, fp0, fs);
11782             gen_store_fpr64(ctx, fp0, fd);
11783             tcg_temp_free_i64(fp0);
11784         }
11785         break;
11786     case OPC_NEG_PS:
11787         check_ps(ctx);
11788         {
11789             TCGv_i64 fp0 = tcg_temp_new_i64();
11790
11791             gen_load_fpr64(ctx, fp0, fs);
11792             gen_helper_float_chs_ps(fp0, fp0);
11793             gen_store_fpr64(ctx, fp0, fd);
11794             tcg_temp_free_i64(fp0);
11795         }
11796         break;
11797     case OPC_MOVCF_PS:
11798         check_ps(ctx);
11799         gen_movcf_ps(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
11800         break;
11801     case OPC_MOVZ_PS:
11802         check_ps(ctx);
11803         {
11804             TCGLabel *l1 = gen_new_label();
11805             TCGv_i64 fp0;
11806
11807             if (ft != 0)
11808                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
11809             fp0 = tcg_temp_new_i64();
11810             gen_load_fpr64(ctx, fp0, fs);
11811             gen_store_fpr64(ctx, fp0, fd);
11812             tcg_temp_free_i64(fp0);
11813             gen_set_label(l1);
11814         }
11815         break;
11816     case OPC_MOVN_PS:
11817         check_ps(ctx);
11818         {
11819             TCGLabel *l1 = gen_new_label();
11820             TCGv_i64 fp0;
11821
11822             if (ft != 0) {
11823                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
11824                 fp0 = tcg_temp_new_i64();
11825                 gen_load_fpr64(ctx, fp0, fs);
11826                 gen_store_fpr64(ctx, fp0, fd);
11827                 tcg_temp_free_i64(fp0);
11828                 gen_set_label(l1);
11829             }
11830         }
11831         break;
11832     case OPC_ADDR_PS:
11833         check_ps(ctx);
11834         {
11835             TCGv_i64 fp0 = tcg_temp_new_i64();
11836             TCGv_i64 fp1 = tcg_temp_new_i64();
11837
11838             gen_load_fpr64(ctx, fp0, ft);
11839             gen_load_fpr64(ctx, fp1, fs);
11840             gen_helper_float_addr_ps(fp0, cpu_env, fp0, fp1);
11841             tcg_temp_free_i64(fp1);
11842             gen_store_fpr64(ctx, fp0, fd);
11843             tcg_temp_free_i64(fp0);
11844         }
11845         break;
11846     case OPC_MULR_PS:
11847         check_ps(ctx);
11848         {
11849             TCGv_i64 fp0 = tcg_temp_new_i64();
11850             TCGv_i64 fp1 = tcg_temp_new_i64();
11851
11852             gen_load_fpr64(ctx, fp0, ft);
11853             gen_load_fpr64(ctx, fp1, fs);
11854             gen_helper_float_mulr_ps(fp0, cpu_env, fp0, fp1);
11855             tcg_temp_free_i64(fp1);
11856             gen_store_fpr64(ctx, fp0, fd);
11857             tcg_temp_free_i64(fp0);
11858         }
11859         break;
11860     case OPC_RECIP2_PS:
11861         check_ps(ctx);
11862         {
11863             TCGv_i64 fp0 = tcg_temp_new_i64();
11864             TCGv_i64 fp1 = tcg_temp_new_i64();
11865
11866             gen_load_fpr64(ctx, fp0, fs);
11867             gen_load_fpr64(ctx, fp1, ft);
11868             gen_helper_float_recip2_ps(fp0, cpu_env, fp0, fp1);
11869             tcg_temp_free_i64(fp1);
11870             gen_store_fpr64(ctx, fp0, fd);
11871             tcg_temp_free_i64(fp0);
11872         }
11873         break;
11874     case OPC_RECIP1_PS:
11875         check_ps(ctx);
11876         {
11877             TCGv_i64 fp0 = tcg_temp_new_i64();
11878
11879             gen_load_fpr64(ctx, fp0, fs);
11880             gen_helper_float_recip1_ps(fp0, cpu_env, fp0);
11881             gen_store_fpr64(ctx, fp0, fd);
11882             tcg_temp_free_i64(fp0);
11883         }
11884         break;
11885     case OPC_RSQRT1_PS:
11886         check_ps(ctx);
11887         {
11888             TCGv_i64 fp0 = tcg_temp_new_i64();
11889
11890             gen_load_fpr64(ctx, fp0, fs);
11891             gen_helper_float_rsqrt1_ps(fp0, cpu_env, fp0);
11892             gen_store_fpr64(ctx, fp0, fd);
11893             tcg_temp_free_i64(fp0);
11894         }
11895         break;
11896     case OPC_RSQRT2_PS:
11897         check_ps(ctx);
11898         {
11899             TCGv_i64 fp0 = tcg_temp_new_i64();
11900             TCGv_i64 fp1 = tcg_temp_new_i64();
11901
11902             gen_load_fpr64(ctx, fp0, fs);
11903             gen_load_fpr64(ctx, fp1, ft);
11904             gen_helper_float_rsqrt2_ps(fp0, cpu_env, fp0, fp1);
11905             tcg_temp_free_i64(fp1);
11906             gen_store_fpr64(ctx, fp0, fd);
11907             tcg_temp_free_i64(fp0);
11908         }
11909         break;
11910     case OPC_CVT_S_PU:
11911         check_cp1_64bitmode(ctx);
11912         {
11913             TCGv_i32 fp0 = tcg_temp_new_i32();
11914
11915             gen_load_fpr32h(ctx, fp0, fs);
11916             gen_helper_float_cvts_pu(fp0, cpu_env, fp0);
11917             gen_store_fpr32(ctx, fp0, fd);
11918             tcg_temp_free_i32(fp0);
11919         }
11920         break;
11921     case OPC_CVT_PW_PS:
11922         check_ps(ctx);
11923         {
11924             TCGv_i64 fp0 = tcg_temp_new_i64();
11925
11926             gen_load_fpr64(ctx, fp0, fs);
11927             gen_helper_float_cvtpw_ps(fp0, cpu_env, fp0);
11928             gen_store_fpr64(ctx, fp0, fd);
11929             tcg_temp_free_i64(fp0);
11930         }
11931         break;
11932     case OPC_CVT_S_PL:
11933         check_cp1_64bitmode(ctx);
11934         {
11935             TCGv_i32 fp0 = tcg_temp_new_i32();
11936
11937             gen_load_fpr32(ctx, fp0, fs);
11938             gen_helper_float_cvts_pl(fp0, cpu_env, fp0);
11939             gen_store_fpr32(ctx, fp0, fd);
11940             tcg_temp_free_i32(fp0);
11941         }
11942         break;
11943     case OPC_PLL_PS:
11944         check_ps(ctx);
11945         {
11946             TCGv_i32 fp0 = tcg_temp_new_i32();
11947             TCGv_i32 fp1 = tcg_temp_new_i32();
11948
11949             gen_load_fpr32(ctx, fp0, fs);
11950             gen_load_fpr32(ctx, fp1, ft);
11951             gen_store_fpr32h(ctx, fp0, fd);
11952             gen_store_fpr32(ctx, fp1, fd);
11953             tcg_temp_free_i32(fp0);
11954             tcg_temp_free_i32(fp1);
11955         }
11956         break;
11957     case OPC_PLU_PS:
11958         check_ps(ctx);
11959         {
11960             TCGv_i32 fp0 = tcg_temp_new_i32();
11961             TCGv_i32 fp1 = tcg_temp_new_i32();
11962
11963             gen_load_fpr32(ctx, fp0, fs);
11964             gen_load_fpr32h(ctx, fp1, ft);
11965             gen_store_fpr32(ctx, fp1, fd);
11966             gen_store_fpr32h(ctx, fp0, fd);
11967             tcg_temp_free_i32(fp0);
11968             tcg_temp_free_i32(fp1);
11969         }
11970         break;
11971     case OPC_PUL_PS:
11972         check_ps(ctx);
11973         {
11974             TCGv_i32 fp0 = tcg_temp_new_i32();
11975             TCGv_i32 fp1 = tcg_temp_new_i32();
11976
11977             gen_load_fpr32h(ctx, fp0, fs);
11978             gen_load_fpr32(ctx, fp1, ft);
11979             gen_store_fpr32(ctx, fp1, fd);
11980             gen_store_fpr32h(ctx, fp0, fd);
11981             tcg_temp_free_i32(fp0);
11982             tcg_temp_free_i32(fp1);
11983         }
11984         break;
11985     case OPC_PUU_PS:
11986         check_ps(ctx);
11987         {
11988             TCGv_i32 fp0 = tcg_temp_new_i32();
11989             TCGv_i32 fp1 = tcg_temp_new_i32();
11990
11991             gen_load_fpr32h(ctx, fp0, fs);
11992             gen_load_fpr32h(ctx, fp1, ft);
11993             gen_store_fpr32(ctx, fp1, fd);
11994             gen_store_fpr32h(ctx, fp0, fd);
11995             tcg_temp_free_i32(fp0);
11996             tcg_temp_free_i32(fp1);
11997         }
11998         break;
11999     case OPC_CMP_F_PS:
12000     case OPC_CMP_UN_PS:
12001     case OPC_CMP_EQ_PS:
12002     case OPC_CMP_UEQ_PS:
12003     case OPC_CMP_OLT_PS:
12004     case OPC_CMP_ULT_PS:
12005     case OPC_CMP_OLE_PS:
12006     case OPC_CMP_ULE_PS:
12007     case OPC_CMP_SF_PS:
12008     case OPC_CMP_NGLE_PS:
12009     case OPC_CMP_SEQ_PS:
12010     case OPC_CMP_NGL_PS:
12011     case OPC_CMP_LT_PS:
12012     case OPC_CMP_NGE_PS:
12013     case OPC_CMP_LE_PS:
12014     case OPC_CMP_NGT_PS:
12015         if (ctx->opcode & (1 << 6)) {
12016             gen_cmpabs_ps(ctx, func-48, ft, fs, cc);
12017         } else {
12018             gen_cmp_ps(ctx, func-48, ft, fs, cc);
12019         }
12020         break;
12021     default:
12022         MIPS_INVAL("farith");
12023         generate_exception_end(ctx, EXCP_RI);
12024         return;
12025     }
12026 }
12027
12028 /* Coprocessor 3 (FPU) */
12029 static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
12030                            int fd, int fs, int base, int index)
12031 {
12032     TCGv t0 = tcg_temp_new();
12033
12034     if (base == 0) {
12035         gen_load_gpr(t0, index);
12036     } else if (index == 0) {
12037         gen_load_gpr(t0, base);
12038     } else {
12039         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[index]);
12040     }
12041     /* Don't do NOP if destination is zero: we must perform the actual
12042        memory access. */
12043     switch (opc) {
12044     case OPC_LWXC1:
12045         check_cop1x(ctx);
12046         {
12047             TCGv_i32 fp0 = tcg_temp_new_i32();
12048
12049             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
12050             tcg_gen_trunc_tl_i32(fp0, t0);
12051             gen_store_fpr32(ctx, fp0, fd);
12052             tcg_temp_free_i32(fp0);
12053         }
12054         break;
12055     case OPC_LDXC1:
12056         check_cop1x(ctx);
12057         check_cp1_registers(ctx, fd);
12058         {
12059             TCGv_i64 fp0 = tcg_temp_new_i64();
12060             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
12061             gen_store_fpr64(ctx, fp0, fd);
12062             tcg_temp_free_i64(fp0);
12063         }
12064         break;
12065     case OPC_LUXC1:
12066         check_cp1_64bitmode(ctx);
12067         tcg_gen_andi_tl(t0, t0, ~0x7);
12068         {
12069             TCGv_i64 fp0 = tcg_temp_new_i64();
12070
12071             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
12072             gen_store_fpr64(ctx, fp0, fd);
12073             tcg_temp_free_i64(fp0);
12074         }
12075         break;
12076     case OPC_SWXC1:
12077         check_cop1x(ctx);
12078         {
12079             TCGv_i32 fp0 = tcg_temp_new_i32();
12080             gen_load_fpr32(ctx, fp0, fs);
12081             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL);
12082             tcg_temp_free_i32(fp0);
12083         }
12084         break;
12085     case OPC_SDXC1:
12086         check_cop1x(ctx);
12087         check_cp1_registers(ctx, fs);
12088         {
12089             TCGv_i64 fp0 = tcg_temp_new_i64();
12090             gen_load_fpr64(ctx, fp0, fs);
12091             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
12092             tcg_temp_free_i64(fp0);
12093         }
12094         break;
12095     case OPC_SUXC1:
12096         check_cp1_64bitmode(ctx);
12097         tcg_gen_andi_tl(t0, t0, ~0x7);
12098         {
12099             TCGv_i64 fp0 = tcg_temp_new_i64();
12100             gen_load_fpr64(ctx, fp0, fs);
12101             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
12102             tcg_temp_free_i64(fp0);
12103         }
12104         break;
12105     }
12106     tcg_temp_free(t0);
12107 }
12108
12109 static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
12110                             int fd, int fr, int fs, int ft)
12111 {
12112     switch (opc) {
12113     case OPC_ALNV_PS:
12114         check_ps(ctx);
12115         {
12116             TCGv t0 = tcg_temp_local_new();
12117             TCGv_i32 fp = tcg_temp_new_i32();
12118             TCGv_i32 fph = tcg_temp_new_i32();
12119             TCGLabel *l1 = gen_new_label();
12120             TCGLabel *l2 = gen_new_label();
12121
12122             gen_load_gpr(t0, fr);
12123             tcg_gen_andi_tl(t0, t0, 0x7);
12124
12125             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);
12126             gen_load_fpr32(ctx, fp, fs);
12127             gen_load_fpr32h(ctx, fph, fs);
12128             gen_store_fpr32(ctx, fp, fd);
12129             gen_store_fpr32h(ctx, fph, fd);
12130             tcg_gen_br(l2);
12131             gen_set_label(l1);
12132             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 4, l2);
12133             tcg_temp_free(t0);
12134 #ifdef TARGET_WORDS_BIGENDIAN
12135             gen_load_fpr32(ctx, fp, fs);
12136             gen_load_fpr32h(ctx, fph, ft);
12137             gen_store_fpr32h(ctx, fp, fd);
12138             gen_store_fpr32(ctx, fph, fd);
12139 #else
12140             gen_load_fpr32h(ctx, fph, fs);
12141             gen_load_fpr32(ctx, fp, ft);
12142             gen_store_fpr32(ctx, fph, fd);
12143             gen_store_fpr32h(ctx, fp, fd);
12144 #endif
12145             gen_set_label(l2);
12146             tcg_temp_free_i32(fp);
12147             tcg_temp_free_i32(fph);
12148         }
12149         break;
12150     case OPC_MADD_S:
12151         check_cop1x(ctx);
12152         {
12153             TCGv_i32 fp0 = tcg_temp_new_i32();
12154             TCGv_i32 fp1 = tcg_temp_new_i32();
12155             TCGv_i32 fp2 = tcg_temp_new_i32();
12156
12157             gen_load_fpr32(ctx, fp0, fs);
12158             gen_load_fpr32(ctx, fp1, ft);
12159             gen_load_fpr32(ctx, fp2, fr);
12160             gen_helper_float_madd_s(fp2, cpu_env, fp0, fp1, fp2);
12161             tcg_temp_free_i32(fp0);
12162             tcg_temp_free_i32(fp1);
12163             gen_store_fpr32(ctx, fp2, fd);
12164             tcg_temp_free_i32(fp2);
12165         }
12166         break;
12167     case OPC_MADD_D:
12168         check_cop1x(ctx);
12169         check_cp1_registers(ctx, fd | fs | ft | fr);
12170         {
12171             TCGv_i64 fp0 = tcg_temp_new_i64();
12172             TCGv_i64 fp1 = tcg_temp_new_i64();
12173             TCGv_i64 fp2 = tcg_temp_new_i64();
12174
12175             gen_load_fpr64(ctx, fp0, fs);
12176             gen_load_fpr64(ctx, fp1, ft);
12177             gen_load_fpr64(ctx, fp2, fr);
12178             gen_helper_float_madd_d(fp2, cpu_env, fp0, fp1, fp2);
12179             tcg_temp_free_i64(fp0);
12180             tcg_temp_free_i64(fp1);
12181             gen_store_fpr64(ctx, fp2, fd);
12182             tcg_temp_free_i64(fp2);
12183         }
12184         break;
12185     case OPC_MADD_PS:
12186         check_ps(ctx);
12187         {
12188             TCGv_i64 fp0 = tcg_temp_new_i64();
12189             TCGv_i64 fp1 = tcg_temp_new_i64();
12190             TCGv_i64 fp2 = tcg_temp_new_i64();
12191
12192             gen_load_fpr64(ctx, fp0, fs);
12193             gen_load_fpr64(ctx, fp1, ft);
12194             gen_load_fpr64(ctx, fp2, fr);
12195             gen_helper_float_madd_ps(fp2, cpu_env, fp0, fp1, fp2);
12196             tcg_temp_free_i64(fp0);
12197             tcg_temp_free_i64(fp1);
12198             gen_store_fpr64(ctx, fp2, fd);
12199             tcg_temp_free_i64(fp2);
12200         }
12201         break;
12202     case OPC_MSUB_S:
12203         check_cop1x(ctx);
12204         {
12205             TCGv_i32 fp0 = tcg_temp_new_i32();
12206             TCGv_i32 fp1 = tcg_temp_new_i32();
12207             TCGv_i32 fp2 = tcg_temp_new_i32();
12208
12209             gen_load_fpr32(ctx, fp0, fs);
12210             gen_load_fpr32(ctx, fp1, ft);
12211             gen_load_fpr32(ctx, fp2, fr);
12212             gen_helper_float_msub_s(fp2, cpu_env, fp0, fp1, fp2);
12213             tcg_temp_free_i32(fp0);
12214             tcg_temp_free_i32(fp1);
12215             gen_store_fpr32(ctx, fp2, fd);
12216             tcg_temp_free_i32(fp2);
12217         }
12218         break;
12219     case OPC_MSUB_D:
12220         check_cop1x(ctx);
12221         check_cp1_registers(ctx, fd | fs | ft | fr);
12222         {
12223             TCGv_i64 fp0 = tcg_temp_new_i64();
12224             TCGv_i64 fp1 = tcg_temp_new_i64();
12225             TCGv_i64 fp2 = tcg_temp_new_i64();
12226
12227             gen_load_fpr64(ctx, fp0, fs);
12228             gen_load_fpr64(ctx, fp1, ft);
12229             gen_load_fpr64(ctx, fp2, fr);
12230             gen_helper_float_msub_d(fp2, cpu_env, fp0, fp1, fp2);
12231             tcg_temp_free_i64(fp0);
12232             tcg_temp_free_i64(fp1);
12233             gen_store_fpr64(ctx, fp2, fd);
12234             tcg_temp_free_i64(fp2);
12235         }
12236         break;
12237     case OPC_MSUB_PS:
12238         check_ps(ctx);
12239         {
12240             TCGv_i64 fp0 = tcg_temp_new_i64();
12241             TCGv_i64 fp1 = tcg_temp_new_i64();
12242             TCGv_i64 fp2 = tcg_temp_new_i64();
12243
12244             gen_load_fpr64(ctx, fp0, fs);
12245             gen_load_fpr64(ctx, fp1, ft);
12246             gen_load_fpr64(ctx, fp2, fr);
12247             gen_helper_float_msub_ps(fp2, cpu_env, fp0, fp1, fp2);
12248             tcg_temp_free_i64(fp0);
12249             tcg_temp_free_i64(fp1);
12250             gen_store_fpr64(ctx, fp2, fd);
12251             tcg_temp_free_i64(fp2);
12252         }
12253         break;
12254     case OPC_NMADD_S:
12255         check_cop1x(ctx);
12256         {
12257             TCGv_i32 fp0 = tcg_temp_new_i32();
12258             TCGv_i32 fp1 = tcg_temp_new_i32();
12259             TCGv_i32 fp2 = tcg_temp_new_i32();
12260
12261             gen_load_fpr32(ctx, fp0, fs);
12262             gen_load_fpr32(ctx, fp1, ft);
12263             gen_load_fpr32(ctx, fp2, fr);
12264             gen_helper_float_nmadd_s(fp2, cpu_env, fp0, fp1, fp2);
12265             tcg_temp_free_i32(fp0);
12266             tcg_temp_free_i32(fp1);
12267             gen_store_fpr32(ctx, fp2, fd);
12268             tcg_temp_free_i32(fp2);
12269         }
12270         break;
12271     case OPC_NMADD_D:
12272         check_cop1x(ctx);
12273         check_cp1_registers(ctx, fd | fs | ft | fr);
12274         {
12275             TCGv_i64 fp0 = tcg_temp_new_i64();
12276             TCGv_i64 fp1 = tcg_temp_new_i64();
12277             TCGv_i64 fp2 = tcg_temp_new_i64();
12278
12279             gen_load_fpr64(ctx, fp0, fs);
12280             gen_load_fpr64(ctx, fp1, ft);
12281             gen_load_fpr64(ctx, fp2, fr);
12282             gen_helper_float_nmadd_d(fp2, cpu_env, fp0, fp1, fp2);
12283             tcg_temp_free_i64(fp0);
12284             tcg_temp_free_i64(fp1);
12285             gen_store_fpr64(ctx, fp2, fd);
12286             tcg_temp_free_i64(fp2);
12287         }
12288         break;
12289     case OPC_NMADD_PS:
12290         check_ps(ctx);
12291         {
12292             TCGv_i64 fp0 = tcg_temp_new_i64();
12293             TCGv_i64 fp1 = tcg_temp_new_i64();
12294             TCGv_i64 fp2 = tcg_temp_new_i64();
12295
12296             gen_load_fpr64(ctx, fp0, fs);
12297             gen_load_fpr64(ctx, fp1, ft);
12298             gen_load_fpr64(ctx, fp2, fr);
12299             gen_helper_float_nmadd_ps(fp2, cpu_env, fp0, fp1, fp2);
12300             tcg_temp_free_i64(fp0);
12301             tcg_temp_free_i64(fp1);
12302             gen_store_fpr64(ctx, fp2, fd);
12303             tcg_temp_free_i64(fp2);
12304         }
12305         break;
12306     case OPC_NMSUB_S:
12307         check_cop1x(ctx);
12308         {
12309             TCGv_i32 fp0 = tcg_temp_new_i32();
12310             TCGv_i32 fp1 = tcg_temp_new_i32();
12311             TCGv_i32 fp2 = tcg_temp_new_i32();
12312
12313             gen_load_fpr32(ctx, fp0, fs);
12314             gen_load_fpr32(ctx, fp1, ft);
12315             gen_load_fpr32(ctx, fp2, fr);
12316             gen_helper_float_nmsub_s(fp2, cpu_env, fp0, fp1, fp2);
12317             tcg_temp_free_i32(fp0);
12318             tcg_temp_free_i32(fp1);
12319             gen_store_fpr32(ctx, fp2, fd);
12320             tcg_temp_free_i32(fp2);
12321         }
12322         break;
12323     case OPC_NMSUB_D:
12324         check_cop1x(ctx);
12325         check_cp1_registers(ctx, fd | fs | ft | fr);
12326         {
12327             TCGv_i64 fp0 = tcg_temp_new_i64();
12328             TCGv_i64 fp1 = tcg_temp_new_i64();
12329             TCGv_i64 fp2 = tcg_temp_new_i64();
12330
12331             gen_load_fpr64(ctx, fp0, fs);
12332             gen_load_fpr64(ctx, fp1, ft);
12333             gen_load_fpr64(ctx, fp2, fr);
12334             gen_helper_float_nmsub_d(fp2, cpu_env, fp0, fp1, fp2);
12335             tcg_temp_free_i64(fp0);
12336             tcg_temp_free_i64(fp1);
12337             gen_store_fpr64(ctx, fp2, fd);
12338             tcg_temp_free_i64(fp2);
12339         }
12340         break;
12341     case OPC_NMSUB_PS:
12342         check_ps(ctx);
12343         {
12344             TCGv_i64 fp0 = tcg_temp_new_i64();
12345             TCGv_i64 fp1 = tcg_temp_new_i64();
12346             TCGv_i64 fp2 = tcg_temp_new_i64();
12347
12348             gen_load_fpr64(ctx, fp0, fs);
12349             gen_load_fpr64(ctx, fp1, ft);
12350             gen_load_fpr64(ctx, fp2, fr);
12351             gen_helper_float_nmsub_ps(fp2, cpu_env, fp0, fp1, fp2);
12352             tcg_temp_free_i64(fp0);
12353             tcg_temp_free_i64(fp1);
12354             gen_store_fpr64(ctx, fp2, fd);
12355             tcg_temp_free_i64(fp2);
12356         }
12357         break;
12358     default:
12359         MIPS_INVAL("flt3_arith");
12360         generate_exception_end(ctx, EXCP_RI);
12361         return;
12362     }
12363 }
12364
12365 static void gen_rdhwr(DisasContext *ctx, int rt, int rd, int sel)
12366 {
12367     TCGv t0;
12368
12369 #if !defined(CONFIG_USER_ONLY)
12370     /* The Linux kernel will emulate rdhwr if it's not supported natively.
12371        Therefore only check the ISA in system mode.  */
12372     check_insn(ctx, ISA_MIPS32R2);
12373 #endif
12374     t0 = tcg_temp_new();
12375
12376     switch (rd) {
12377     case 0:
12378         gen_helper_rdhwr_cpunum(t0, cpu_env);
12379         gen_store_gpr(t0, rt);
12380         break;
12381     case 1:
12382         gen_helper_rdhwr_synci_step(t0, cpu_env);
12383         gen_store_gpr(t0, rt);
12384         break;
12385     case 2:
12386         if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
12387             gen_io_start();
12388         }
12389         gen_helper_rdhwr_cc(t0, cpu_env);
12390         if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
12391             gen_io_end();
12392         }
12393         gen_store_gpr(t0, rt);
12394         /* Break the TB to be able to take timer interrupts immediately
12395            after reading count. DISAS_STOP isn't sufficient, we need to ensure
12396            we break completely out of translated code.  */
12397         gen_save_pc(ctx->base.pc_next + 4);
12398         ctx->base.is_jmp = DISAS_EXIT;
12399         break;
12400     case 3:
12401         gen_helper_rdhwr_ccres(t0, cpu_env);
12402         gen_store_gpr(t0, rt);
12403         break;
12404     case 4:
12405         check_insn(ctx, ISA_MIPS32R6);
12406         if (sel != 0) {
12407             /* Performance counter registers are not implemented other than
12408              * control register 0.
12409              */
12410             generate_exception(ctx, EXCP_RI);
12411         }
12412         gen_helper_rdhwr_performance(t0, cpu_env);
12413         gen_store_gpr(t0, rt);
12414         break;
12415     case 5:
12416         check_insn(ctx, ISA_MIPS32R6);
12417         gen_helper_rdhwr_xnp(t0, cpu_env);
12418         gen_store_gpr(t0, rt);
12419         break;
12420     case 29:
12421 #if defined(CONFIG_USER_ONLY)
12422         tcg_gen_ld_tl(t0, cpu_env,
12423                       offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
12424         gen_store_gpr(t0, rt);
12425         break;
12426 #else
12427         if ((ctx->hflags & MIPS_HFLAG_CP0) ||
12428             (ctx->hflags & MIPS_HFLAG_HWRENA_ULR)) {
12429             tcg_gen_ld_tl(t0, cpu_env,
12430                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
12431             gen_store_gpr(t0, rt);
12432         } else {
12433             generate_exception_end(ctx, EXCP_RI);
12434         }
12435         break;
12436 #endif
12437     default:            /* Invalid */
12438         MIPS_INVAL("rdhwr");
12439         generate_exception_end(ctx, EXCP_RI);
12440         break;
12441     }
12442     tcg_temp_free(t0);
12443 }
12444
12445 static inline void clear_branch_hflags(DisasContext *ctx)
12446 {
12447     ctx->hflags &= ~MIPS_HFLAG_BMASK;
12448     if (ctx->base.is_jmp == DISAS_NEXT) {
12449         save_cpu_state(ctx, 0);
12450     } else {
12451         /* it is not safe to save ctx->hflags as hflags may be changed
12452            in execution time by the instruction in delay / forbidden slot. */
12453         tcg_gen_andi_i32(hflags, hflags, ~MIPS_HFLAG_BMASK);
12454     }
12455 }
12456
12457 static void gen_branch(DisasContext *ctx, int insn_bytes)
12458 {
12459     if (ctx->hflags & MIPS_HFLAG_BMASK) {
12460         int proc_hflags = ctx->hflags & MIPS_HFLAG_BMASK;
12461         /* Branches completion */
12462         clear_branch_hflags(ctx);
12463         ctx->base.is_jmp = DISAS_NORETURN;
12464         /* FIXME: Need to clear can_do_io.  */
12465         switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) {
12466         case MIPS_HFLAG_FBNSLOT:
12467             gen_goto_tb(ctx, 0, ctx->base.pc_next + insn_bytes);
12468             break;
12469         case MIPS_HFLAG_B:
12470             /* unconditional branch */
12471             if (proc_hflags & MIPS_HFLAG_BX) {
12472                 tcg_gen_xori_i32(hflags, hflags, MIPS_HFLAG_M16);
12473             }
12474             gen_goto_tb(ctx, 0, ctx->btarget);
12475             break;
12476         case MIPS_HFLAG_BL:
12477             /* blikely taken case */
12478             gen_goto_tb(ctx, 0, ctx->btarget);
12479             break;
12480         case MIPS_HFLAG_BC:
12481             /* Conditional branch */
12482             {
12483                 TCGLabel *l1 = gen_new_label();
12484
12485                 tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
12486                 gen_goto_tb(ctx, 1, ctx->base.pc_next + insn_bytes);
12487                 gen_set_label(l1);
12488                 gen_goto_tb(ctx, 0, ctx->btarget);
12489             }
12490             break;
12491         case MIPS_HFLAG_BR:
12492             /* unconditional branch to register */
12493             if (ctx->insn_flags & (ASE_MIPS16 | ASE_MICROMIPS)) {
12494                 TCGv t0 = tcg_temp_new();
12495                 TCGv_i32 t1 = tcg_temp_new_i32();
12496
12497                 tcg_gen_andi_tl(t0, btarget, 0x1);
12498                 tcg_gen_trunc_tl_i32(t1, t0);
12499                 tcg_temp_free(t0);
12500                 tcg_gen_andi_i32(hflags, hflags, ~(uint32_t)MIPS_HFLAG_M16);
12501                 tcg_gen_shli_i32(t1, t1, MIPS_HFLAG_M16_SHIFT);
12502                 tcg_gen_or_i32(hflags, hflags, t1);
12503                 tcg_temp_free_i32(t1);
12504
12505                 tcg_gen_andi_tl(cpu_PC, btarget, ~(target_ulong)0x1);
12506             } else {
12507                 tcg_gen_mov_tl(cpu_PC, btarget);
12508             }
12509             if (ctx->base.singlestep_enabled) {
12510                 save_cpu_state(ctx, 0);
12511                 gen_helper_raise_exception_debug(cpu_env);
12512             }
12513             tcg_gen_lookup_and_goto_ptr();
12514             break;
12515         default:
12516             fprintf(stderr, "unknown branch 0x%x\n", proc_hflags);
12517             abort();
12518         }
12519     }
12520 }
12521
12522 /* Compact Branches */
12523 static void gen_compute_compact_branch(DisasContext *ctx, uint32_t opc,
12524                                        int rs, int rt, int32_t offset)
12525 {
12526     int bcond_compute = 0;
12527     TCGv t0 = tcg_temp_new();
12528     TCGv t1 = tcg_temp_new();
12529     int m16_lowbit = (ctx->hflags & MIPS_HFLAG_M16) != 0;
12530
12531     if (ctx->hflags & MIPS_HFLAG_BMASK) {
12532 #ifdef MIPS_DEBUG_DISAS
12533         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
12534                   "\n", ctx->base.pc_next);
12535 #endif
12536         generate_exception_end(ctx, EXCP_RI);
12537         goto out;
12538     }
12539
12540     /* Load needed operands and calculate btarget */
12541     switch (opc) {
12542     /* compact branch */
12543     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
12544     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
12545         gen_load_gpr(t0, rs);
12546         gen_load_gpr(t1, rt);
12547         bcond_compute = 1;
12548         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12549         if (rs <= rt && rs == 0) {
12550             /* OPC_BEQZALC, OPC_BNEZALC */
12551             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
12552         }
12553         break;
12554     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
12555     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
12556         gen_load_gpr(t0, rs);
12557         gen_load_gpr(t1, rt);
12558         bcond_compute = 1;
12559         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12560         break;
12561     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
12562     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
12563         if (rs == 0 || rs == rt) {
12564             /* OPC_BLEZALC, OPC_BGEZALC */
12565             /* OPC_BGTZALC, OPC_BLTZALC */
12566             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
12567         }
12568         gen_load_gpr(t0, rs);
12569         gen_load_gpr(t1, rt);
12570         bcond_compute = 1;
12571         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12572         break;
12573     case OPC_BC:
12574     case OPC_BALC:
12575         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12576         break;
12577     case OPC_BEQZC:
12578     case OPC_BNEZC:
12579         if (rs != 0) {
12580             /* OPC_BEQZC, OPC_BNEZC */
12581             gen_load_gpr(t0, rs);
12582             bcond_compute = 1;
12583             ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12584         } else {
12585             /* OPC_JIC, OPC_JIALC */
12586             TCGv tbase = tcg_temp_new();
12587             TCGv toffset = tcg_temp_new();
12588
12589             gen_load_gpr(tbase, rt);
12590             tcg_gen_movi_tl(toffset, offset);
12591             gen_op_addr_add(ctx, btarget, tbase, toffset);
12592             tcg_temp_free(tbase);
12593             tcg_temp_free(toffset);
12594         }
12595         break;
12596     default:
12597         MIPS_INVAL("Compact branch/jump");
12598         generate_exception_end(ctx, EXCP_RI);
12599         goto out;
12600     }
12601
12602     if (bcond_compute == 0) {
12603         /* Uncoditional compact branch */
12604         switch (opc) {
12605         case OPC_JIALC:
12606             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
12607             /* Fallthrough */
12608         case OPC_JIC:
12609             ctx->hflags |= MIPS_HFLAG_BR;
12610             break;
12611         case OPC_BALC:
12612             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
12613             /* Fallthrough */
12614         case OPC_BC:
12615             ctx->hflags |= MIPS_HFLAG_B;
12616             break;
12617         default:
12618             MIPS_INVAL("Compact branch/jump");
12619             generate_exception_end(ctx, EXCP_RI);
12620             goto out;
12621         }
12622
12623         /* Generating branch here as compact branches don't have delay slot */
12624         gen_branch(ctx, 4);
12625     } else {
12626         /* Conditional compact branch */
12627         TCGLabel *fs = gen_new_label();
12628         save_cpu_state(ctx, 0);
12629
12630         switch (opc) {
12631         case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
12632             if (rs == 0 && rt != 0) {
12633                 /* OPC_BLEZALC */
12634                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
12635             } else if (rs != 0 && rt != 0 && rs == rt) {
12636                 /* OPC_BGEZALC */
12637                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
12638             } else {
12639                 /* OPC_BGEUC */
12640                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GEU), t0, t1, fs);
12641             }
12642             break;
12643         case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
12644             if (rs == 0 && rt != 0) {
12645                 /* OPC_BGTZALC */
12646                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
12647             } else if (rs != 0 && rt != 0 && rs == rt) {
12648                 /* OPC_BLTZALC */
12649                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
12650             } else {
12651                 /* OPC_BLTUC */
12652                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LTU), t0, t1, fs);
12653             }
12654             break;
12655         case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
12656             if (rs == 0 && rt != 0) {
12657                 /* OPC_BLEZC */
12658                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
12659             } else if (rs != 0 && rt != 0 && rs == rt) {
12660                 /* OPC_BGEZC */
12661                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
12662             } else {
12663                 /* OPC_BGEC */
12664                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GE), t0, t1, fs);
12665             }
12666             break;
12667         case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
12668             if (rs == 0 && rt != 0) {
12669                 /* OPC_BGTZC */
12670                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
12671             } else if (rs != 0 && rt != 0 && rs == rt) {
12672                 /* OPC_BLTZC */
12673                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
12674             } else {
12675                 /* OPC_BLTC */
12676                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LT), t0, t1, fs);
12677             }
12678             break;
12679         case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
12680         case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
12681             if (rs >= rt) {
12682                 /* OPC_BOVC, OPC_BNVC */
12683                 TCGv t2 = tcg_temp_new();
12684                 TCGv t3 = tcg_temp_new();
12685                 TCGv t4 = tcg_temp_new();
12686                 TCGv input_overflow = tcg_temp_new();
12687
12688                 gen_load_gpr(t0, rs);
12689                 gen_load_gpr(t1, rt);
12690                 tcg_gen_ext32s_tl(t2, t0);
12691                 tcg_gen_setcond_tl(TCG_COND_NE, input_overflow, t2, t0);
12692                 tcg_gen_ext32s_tl(t3, t1);
12693                 tcg_gen_setcond_tl(TCG_COND_NE, t4, t3, t1);
12694                 tcg_gen_or_tl(input_overflow, input_overflow, t4);
12695
12696                 tcg_gen_add_tl(t4, t2, t3);
12697                 tcg_gen_ext32s_tl(t4, t4);
12698                 tcg_gen_xor_tl(t2, t2, t3);
12699                 tcg_gen_xor_tl(t3, t4, t3);
12700                 tcg_gen_andc_tl(t2, t3, t2);
12701                 tcg_gen_setcondi_tl(TCG_COND_LT, t4, t2, 0);
12702                 tcg_gen_or_tl(t4, t4, input_overflow);
12703                 if (opc == OPC_BOVC) {
12704                     /* OPC_BOVC */
12705                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t4, 0, fs);
12706                 } else {
12707                     /* OPC_BNVC */
12708                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t4, 0, fs);
12709                 }
12710                 tcg_temp_free(input_overflow);
12711                 tcg_temp_free(t4);
12712                 tcg_temp_free(t3);
12713                 tcg_temp_free(t2);
12714             } else if (rs < rt && rs == 0) {
12715                 /* OPC_BEQZALC, OPC_BNEZALC */
12716                 if (opc == OPC_BEQZALC) {
12717                     /* OPC_BEQZALC */
12718                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t1, 0, fs);
12719                 } else {
12720                     /* OPC_BNEZALC */
12721                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t1, 0, fs);
12722                 }
12723             } else {
12724                 /* OPC_BEQC, OPC_BNEC */
12725                 if (opc == OPC_BEQC) {
12726                     /* OPC_BEQC */
12727                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_EQ), t0, t1, fs);
12728                 } else {
12729                     /* OPC_BNEC */
12730                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_NE), t0, t1, fs);
12731                 }
12732             }
12733             break;
12734         case OPC_BEQZC:
12735             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t0, 0, fs);
12736             break;
12737         case OPC_BNEZC:
12738             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t0, 0, fs);
12739             break;
12740         default:
12741             MIPS_INVAL("Compact conditional branch/jump");
12742             generate_exception_end(ctx, EXCP_RI);
12743             goto out;
12744         }
12745
12746         /* Generating branch here as compact branches don't have delay slot */
12747         gen_goto_tb(ctx, 1, ctx->btarget);
12748         gen_set_label(fs);
12749
12750         ctx->hflags |= MIPS_HFLAG_FBNSLOT;
12751     }
12752
12753 out:
12754     tcg_temp_free(t0);
12755     tcg_temp_free(t1);
12756 }
12757
12758 /* ISA extensions (ASEs) */
12759 /* MIPS16 extension to MIPS32 */
12760
12761 /* MIPS16 major opcodes */
12762 enum {
12763   M16_OPC_ADDIUSP = 0x00,
12764   M16_OPC_ADDIUPC = 0x01,
12765   M16_OPC_B = 0x02,
12766   M16_OPC_JAL = 0x03,
12767   M16_OPC_BEQZ = 0x04,
12768   M16_OPC_BNEQZ = 0x05,
12769   M16_OPC_SHIFT = 0x06,
12770   M16_OPC_LD = 0x07,
12771   M16_OPC_RRIA = 0x08,
12772   M16_OPC_ADDIU8 = 0x09,
12773   M16_OPC_SLTI = 0x0a,
12774   M16_OPC_SLTIU = 0x0b,
12775   M16_OPC_I8 = 0x0c,
12776   M16_OPC_LI = 0x0d,
12777   M16_OPC_CMPI = 0x0e,
12778   M16_OPC_SD = 0x0f,
12779   M16_OPC_LB = 0x10,
12780   M16_OPC_LH = 0x11,
12781   M16_OPC_LWSP = 0x12,
12782   M16_OPC_LW = 0x13,
12783   M16_OPC_LBU = 0x14,
12784   M16_OPC_LHU = 0x15,
12785   M16_OPC_LWPC = 0x16,
12786   M16_OPC_LWU = 0x17,
12787   M16_OPC_SB = 0x18,
12788   M16_OPC_SH = 0x19,
12789   M16_OPC_SWSP = 0x1a,
12790   M16_OPC_SW = 0x1b,
12791   M16_OPC_RRR = 0x1c,
12792   M16_OPC_RR = 0x1d,
12793   M16_OPC_EXTEND = 0x1e,
12794   M16_OPC_I64 = 0x1f
12795 };
12796
12797 /* I8 funct field */
12798 enum {
12799   I8_BTEQZ = 0x0,
12800   I8_BTNEZ = 0x1,
12801   I8_SWRASP = 0x2,
12802   I8_ADJSP = 0x3,
12803   I8_SVRS = 0x4,
12804   I8_MOV32R = 0x5,
12805   I8_MOVR32 = 0x7
12806 };
12807
12808 /* RRR f field */
12809 enum {
12810   RRR_DADDU = 0x0,
12811   RRR_ADDU = 0x1,
12812   RRR_DSUBU = 0x2,
12813   RRR_SUBU = 0x3
12814 };
12815
12816 /* RR funct field */
12817 enum {
12818   RR_JR = 0x00,
12819   RR_SDBBP = 0x01,
12820   RR_SLT = 0x02,
12821   RR_SLTU = 0x03,
12822   RR_SLLV = 0x04,
12823   RR_BREAK = 0x05,
12824   RR_SRLV = 0x06,
12825   RR_SRAV = 0x07,
12826   RR_DSRL = 0x08,
12827   RR_CMP = 0x0a,
12828   RR_NEG = 0x0b,
12829   RR_AND = 0x0c,
12830   RR_OR = 0x0d,
12831   RR_XOR = 0x0e,
12832   RR_NOT = 0x0f,
12833   RR_MFHI = 0x10,
12834   RR_CNVT = 0x11,
12835   RR_MFLO = 0x12,
12836   RR_DSRA = 0x13,
12837   RR_DSLLV = 0x14,
12838   RR_DSRLV = 0x16,
12839   RR_DSRAV = 0x17,
12840   RR_MULT = 0x18,
12841   RR_MULTU = 0x19,
12842   RR_DIV = 0x1a,
12843   RR_DIVU = 0x1b,
12844   RR_DMULT = 0x1c,
12845   RR_DMULTU = 0x1d,
12846   RR_DDIV = 0x1e,
12847   RR_DDIVU = 0x1f
12848 };
12849
12850 /* I64 funct field */
12851 enum {
12852   I64_LDSP = 0x0,
12853   I64_SDSP = 0x1,
12854   I64_SDRASP = 0x2,
12855   I64_DADJSP = 0x3,
12856   I64_LDPC = 0x4,
12857   I64_DADDIU5 = 0x5,
12858   I64_DADDIUPC = 0x6,
12859   I64_DADDIUSP = 0x7
12860 };
12861
12862 /* RR ry field for CNVT */
12863 enum {
12864   RR_RY_CNVT_ZEB = 0x0,
12865   RR_RY_CNVT_ZEH = 0x1,
12866   RR_RY_CNVT_ZEW = 0x2,
12867   RR_RY_CNVT_SEB = 0x4,
12868   RR_RY_CNVT_SEH = 0x5,
12869   RR_RY_CNVT_SEW = 0x6,
12870 };
12871
12872 static int xlat (int r)
12873 {
12874   static int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
12875
12876   return map[r];
12877 }
12878
12879 static void gen_mips16_save (DisasContext *ctx,
12880                              int xsregs, int aregs,
12881                              int do_ra, int do_s0, int do_s1,
12882                              int framesize)
12883 {
12884     TCGv t0 = tcg_temp_new();
12885     TCGv t1 = tcg_temp_new();
12886     TCGv t2 = tcg_temp_new();
12887     int args, astatic;
12888
12889     switch (aregs) {
12890     case 0:
12891     case 1:
12892     case 2:
12893     case 3:
12894     case 11:
12895         args = 0;
12896         break;
12897     case 4:
12898     case 5:
12899     case 6:
12900     case 7:
12901         args = 1;
12902         break;
12903     case 8:
12904     case 9:
12905     case 10:
12906         args = 2;
12907         break;
12908     case 12:
12909     case 13:
12910         args = 3;
12911         break;
12912     case 14:
12913         args = 4;
12914         break;
12915     default:
12916         generate_exception_end(ctx, EXCP_RI);
12917         return;
12918     }
12919
12920     switch (args) {
12921     case 4:
12922         gen_base_offset_addr(ctx, t0, 29, 12);
12923         gen_load_gpr(t1, 7);
12924         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12925         /* Fall through */
12926     case 3:
12927         gen_base_offset_addr(ctx, t0, 29, 8);
12928         gen_load_gpr(t1, 6);
12929         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12930         /* Fall through */
12931     case 2:
12932         gen_base_offset_addr(ctx, t0, 29, 4);
12933         gen_load_gpr(t1, 5);
12934         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12935         /* Fall through */
12936     case 1:
12937         gen_base_offset_addr(ctx, t0, 29, 0);
12938         gen_load_gpr(t1, 4);
12939         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12940     }
12941
12942     gen_load_gpr(t0, 29);
12943
12944 #define DECR_AND_STORE(reg) do {                                 \
12945         tcg_gen_movi_tl(t2, -4);                                 \
12946         gen_op_addr_add(ctx, t0, t0, t2);                        \
12947         gen_load_gpr(t1, reg);                                   \
12948         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL); \
12949     } while (0)
12950
12951     if (do_ra) {
12952         DECR_AND_STORE(31);
12953     }
12954
12955     switch (xsregs) {
12956     case 7:
12957         DECR_AND_STORE(30);
12958         /* Fall through */
12959     case 6:
12960         DECR_AND_STORE(23);
12961         /* Fall through */
12962     case 5:
12963         DECR_AND_STORE(22);
12964         /* Fall through */
12965     case 4:
12966         DECR_AND_STORE(21);
12967         /* Fall through */
12968     case 3:
12969         DECR_AND_STORE(20);
12970         /* Fall through */
12971     case 2:
12972         DECR_AND_STORE(19);
12973         /* Fall through */
12974     case 1:
12975         DECR_AND_STORE(18);
12976     }
12977
12978     if (do_s1) {
12979         DECR_AND_STORE(17);
12980     }
12981     if (do_s0) {
12982         DECR_AND_STORE(16);
12983     }
12984
12985     switch (aregs) {
12986     case 0:
12987     case 4:
12988     case 8:
12989     case 12:
12990     case 14:
12991         astatic = 0;
12992         break;
12993     case 1:
12994     case 5:
12995     case 9:
12996     case 13:
12997         astatic = 1;
12998         break;
12999     case 2:
13000     case 6:
13001     case 10:
13002         astatic = 2;
13003         break;
13004     case 3:
13005     case 7:
13006         astatic = 3;
13007         break;
13008     case 11:
13009         astatic = 4;
13010         break;
13011     default:
13012         generate_exception_end(ctx, EXCP_RI);
13013         return;
13014     }
13015
13016     if (astatic > 0) {
13017         DECR_AND_STORE(7);
13018         if (astatic > 1) {
13019             DECR_AND_STORE(6);
13020             if (astatic > 2) {
13021                 DECR_AND_STORE(5);
13022                 if (astatic > 3) {
13023                     DECR_AND_STORE(4);
13024                 }
13025             }
13026         }
13027     }
13028 #undef DECR_AND_STORE
13029
13030     tcg_gen_movi_tl(t2, -framesize);
13031     gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
13032     tcg_temp_free(t0);
13033     tcg_temp_free(t1);
13034     tcg_temp_free(t2);
13035 }
13036
13037 static void gen_mips16_restore (DisasContext *ctx,
13038                                 int xsregs, int aregs,
13039                                 int do_ra, int do_s0, int do_s1,
13040                                 int framesize)
13041 {
13042     int astatic;
13043     TCGv t0 = tcg_temp_new();
13044     TCGv t1 = tcg_temp_new();
13045     TCGv t2 = tcg_temp_new();
13046
13047     tcg_gen_movi_tl(t2, framesize);
13048     gen_op_addr_add(ctx, t0, cpu_gpr[29], t2);
13049
13050 #define DECR_AND_LOAD(reg) do {                            \
13051         tcg_gen_movi_tl(t2, -4);                           \
13052         gen_op_addr_add(ctx, t0, t0, t2);                  \
13053         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL); \
13054         gen_store_gpr(t1, reg);                            \
13055     } while (0)
13056
13057     if (do_ra) {
13058         DECR_AND_LOAD(31);
13059     }
13060
13061     switch (xsregs) {
13062     case 7:
13063         DECR_AND_LOAD(30);
13064         /* Fall through */
13065     case 6:
13066         DECR_AND_LOAD(23);
13067         /* Fall through */
13068     case 5:
13069         DECR_AND_LOAD(22);
13070         /* Fall through */
13071     case 4:
13072         DECR_AND_LOAD(21);
13073         /* Fall through */
13074     case 3:
13075         DECR_AND_LOAD(20);
13076         /* Fall through */
13077     case 2:
13078         DECR_AND_LOAD(19);
13079         /* Fall through */
13080     case 1:
13081         DECR_AND_LOAD(18);
13082     }
13083
13084     if (do_s1) {
13085         DECR_AND_LOAD(17);
13086     }
13087     if (do_s0) {
13088         DECR_AND_LOAD(16);
13089     }
13090
13091     switch (aregs) {
13092     case 0:
13093     case 4:
13094     case 8:
13095     case 12:
13096     case 14:
13097         astatic = 0;
13098         break;
13099     case 1:
13100     case 5:
13101     case 9:
13102     case 13:
13103         astatic = 1;
13104         break;
13105     case 2:
13106     case 6:
13107     case 10:
13108         astatic = 2;
13109         break;
13110     case 3:
13111     case 7:
13112         astatic = 3;
13113         break;
13114     case 11:
13115         astatic = 4;
13116         break;
13117     default:
13118         generate_exception_end(ctx, EXCP_RI);
13119         return;
13120     }
13121
13122     if (astatic > 0) {
13123         DECR_AND_LOAD(7);
13124         if (astatic > 1) {
13125             DECR_AND_LOAD(6);
13126             if (astatic > 2) {
13127                 DECR_AND_LOAD(5);
13128                 if (astatic > 3) {
13129                     DECR_AND_LOAD(4);
13130                 }
13131             }
13132         }
13133     }
13134 #undef DECR_AND_LOAD
13135
13136     tcg_gen_movi_tl(t2, framesize);
13137     gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
13138     tcg_temp_free(t0);
13139     tcg_temp_free(t1);
13140     tcg_temp_free(t2);
13141 }
13142
13143 static void gen_addiupc (DisasContext *ctx, int rx, int imm,
13144                          int is_64_bit, int extended)
13145 {
13146     TCGv t0;
13147
13148     if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
13149         generate_exception_end(ctx, EXCP_RI);
13150         return;
13151     }
13152
13153     t0 = tcg_temp_new();
13154
13155     tcg_gen_movi_tl(t0, pc_relative_pc(ctx));
13156     tcg_gen_addi_tl(cpu_gpr[rx], t0, imm);
13157     if (!is_64_bit) {
13158         tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
13159     }
13160
13161     tcg_temp_free(t0);
13162 }
13163
13164 static void gen_cache_operation(DisasContext *ctx, uint32_t op, int base,
13165                                 int16_t offset)
13166 {
13167     TCGv_i32 t0 = tcg_const_i32(op);
13168     TCGv t1 = tcg_temp_new();
13169     gen_base_offset_addr(ctx, t1, base, offset);
13170     gen_helper_cache(cpu_env, t1, t0);
13171 }
13172
13173 #if defined(TARGET_MIPS64)
13174 static void decode_i64_mips16 (DisasContext *ctx,
13175                                int ry, int funct, int16_t offset,
13176                                int extended)
13177 {
13178     switch (funct) {
13179     case I64_LDSP:
13180         check_insn(ctx, ISA_MIPS3);
13181         check_mips_64(ctx);
13182         offset = extended ? offset : offset << 3;
13183         gen_ld(ctx, OPC_LD, ry, 29, offset);
13184         break;
13185     case I64_SDSP:
13186         check_insn(ctx, ISA_MIPS3);
13187         check_mips_64(ctx);
13188         offset = extended ? offset : offset << 3;
13189         gen_st(ctx, OPC_SD, ry, 29, offset);
13190         break;
13191     case I64_SDRASP:
13192         check_insn(ctx, ISA_MIPS3);
13193         check_mips_64(ctx);
13194         offset = extended ? offset : (ctx->opcode & 0xff) << 3;
13195         gen_st(ctx, OPC_SD, 31, 29, offset);
13196         break;
13197     case I64_DADJSP:
13198         check_insn(ctx, ISA_MIPS3);
13199         check_mips_64(ctx);
13200         offset = extended ? offset : ((int8_t)ctx->opcode) << 3;
13201         gen_arith_imm(ctx, OPC_DADDIU, 29, 29, offset);
13202         break;
13203     case I64_LDPC:
13204         check_insn(ctx, ISA_MIPS3);
13205         check_mips_64(ctx);
13206         if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
13207             generate_exception_end(ctx, EXCP_RI);
13208         } else {
13209             offset = extended ? offset : offset << 3;
13210             gen_ld(ctx, OPC_LDPC, ry, 0, offset);
13211         }
13212         break;
13213     case I64_DADDIU5:
13214         check_insn(ctx, ISA_MIPS3);
13215         check_mips_64(ctx);
13216         offset = extended ? offset : ((int8_t)(offset << 3)) >> 3;
13217         gen_arith_imm(ctx, OPC_DADDIU, ry, ry, offset);
13218         break;
13219     case I64_DADDIUPC:
13220         check_insn(ctx, ISA_MIPS3);
13221         check_mips_64(ctx);
13222         offset = extended ? offset : offset << 2;
13223         gen_addiupc(ctx, ry, offset, 1, extended);
13224         break;
13225     case I64_DADDIUSP:
13226         check_insn(ctx, ISA_MIPS3);
13227         check_mips_64(ctx);
13228         offset = extended ? offset : offset << 2;
13229         gen_arith_imm(ctx, OPC_DADDIU, ry, 29, offset);
13230         break;
13231     }
13232 }
13233 #endif
13234
13235 static int decode_extended_mips16_opc (CPUMIPSState *env, DisasContext *ctx)
13236 {
13237     int extend = cpu_lduw_code(env, ctx->base.pc_next + 2);
13238     int op, rx, ry, funct, sa;
13239     int16_t imm, offset;
13240
13241     ctx->opcode = (ctx->opcode << 16) | extend;
13242     op = (ctx->opcode >> 11) & 0x1f;
13243     sa = (ctx->opcode >> 22) & 0x1f;
13244     funct = (ctx->opcode >> 8) & 0x7;
13245     rx = xlat((ctx->opcode >> 8) & 0x7);
13246     ry = xlat((ctx->opcode >> 5) & 0x7);
13247     offset = imm = (int16_t) (((ctx->opcode >> 16) & 0x1f) << 11
13248                               | ((ctx->opcode >> 21) & 0x3f) << 5
13249                               | (ctx->opcode & 0x1f));
13250
13251     /* The extended opcodes cleverly reuse the opcodes from their 16-bit
13252        counterparts.  */
13253     switch (op) {
13254     case M16_OPC_ADDIUSP:
13255         gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
13256         break;
13257     case M16_OPC_ADDIUPC:
13258         gen_addiupc(ctx, rx, imm, 0, 1);
13259         break;
13260     case M16_OPC_B:
13261         gen_compute_branch(ctx, OPC_BEQ, 4, 0, 0, offset << 1, 0);
13262         /* No delay slot, so just process as a normal instruction */
13263         break;
13264     case M16_OPC_BEQZ:
13265         gen_compute_branch(ctx, OPC_BEQ, 4, rx, 0, offset << 1, 0);
13266         /* No delay slot, so just process as a normal instruction */
13267         break;
13268     case M16_OPC_BNEQZ:
13269         gen_compute_branch(ctx, OPC_BNE, 4, rx, 0, offset << 1, 0);
13270         /* No delay slot, so just process as a normal instruction */
13271         break;
13272     case M16_OPC_SHIFT:
13273         switch (ctx->opcode & 0x3) {
13274         case 0x0:
13275             gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
13276             break;
13277         case 0x1:
13278 #if defined(TARGET_MIPS64)
13279             check_mips_64(ctx);
13280             gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
13281 #else
13282             generate_exception_end(ctx, EXCP_RI);
13283 #endif
13284             break;
13285         case 0x2:
13286             gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
13287             break;
13288         case 0x3:
13289             gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
13290             break;
13291         }
13292         break;
13293 #if defined(TARGET_MIPS64)
13294     case M16_OPC_LD:
13295         check_insn(ctx, ISA_MIPS3);
13296         check_mips_64(ctx);
13297         gen_ld(ctx, OPC_LD, ry, rx, offset);
13298         break;
13299 #endif
13300     case M16_OPC_RRIA:
13301         imm = ctx->opcode & 0xf;
13302         imm = imm | ((ctx->opcode >> 20) & 0x7f) << 4;
13303         imm = imm | ((ctx->opcode >> 16) & 0xf) << 11;
13304         imm = (int16_t) (imm << 1) >> 1;
13305         if ((ctx->opcode >> 4) & 0x1) {
13306 #if defined(TARGET_MIPS64)
13307             check_mips_64(ctx);
13308             gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
13309 #else
13310             generate_exception_end(ctx, EXCP_RI);
13311 #endif
13312         } else {
13313             gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
13314         }
13315         break;
13316     case M16_OPC_ADDIU8:
13317         gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
13318         break;
13319     case M16_OPC_SLTI:
13320         gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
13321         break;
13322     case M16_OPC_SLTIU:
13323         gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
13324         break;
13325     case M16_OPC_I8:
13326         switch (funct) {
13327         case I8_BTEQZ:
13328             gen_compute_branch(ctx, OPC_BEQ, 4, 24, 0, offset << 1, 0);
13329             break;
13330         case I8_BTNEZ:
13331             gen_compute_branch(ctx, OPC_BNE, 4, 24, 0, offset << 1, 0);
13332             break;
13333         case I8_SWRASP:
13334             gen_st(ctx, OPC_SW, 31, 29, imm);
13335             break;
13336         case I8_ADJSP:
13337             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm);
13338             break;
13339         case I8_SVRS:
13340             check_insn(ctx, ISA_MIPS32);
13341             {
13342                 int xsregs = (ctx->opcode >> 24) & 0x7;
13343                 int aregs = (ctx->opcode >> 16) & 0xf;
13344                 int do_ra = (ctx->opcode >> 6) & 0x1;
13345                 int do_s0 = (ctx->opcode >> 5) & 0x1;
13346                 int do_s1 = (ctx->opcode >> 4) & 0x1;
13347                 int framesize = (((ctx->opcode >> 20) & 0xf) << 4
13348                                  | (ctx->opcode & 0xf)) << 3;
13349
13350                 if (ctx->opcode & (1 << 7)) {
13351                     gen_mips16_save(ctx, xsregs, aregs,
13352                                     do_ra, do_s0, do_s1,
13353                                     framesize);
13354                 } else {
13355                     gen_mips16_restore(ctx, xsregs, aregs,
13356                                        do_ra, do_s0, do_s1,
13357                                        framesize);
13358                 }
13359             }
13360             break;
13361         default:
13362             generate_exception_end(ctx, EXCP_RI);
13363             break;
13364         }
13365         break;
13366     case M16_OPC_LI:
13367         tcg_gen_movi_tl(cpu_gpr[rx], (uint16_t) imm);
13368         break;
13369     case M16_OPC_CMPI:
13370         tcg_gen_xori_tl(cpu_gpr[24], cpu_gpr[rx], (uint16_t) imm);
13371         break;
13372 #if defined(TARGET_MIPS64)
13373     case M16_OPC_SD:
13374         check_insn(ctx, ISA_MIPS3);
13375         check_mips_64(ctx);
13376         gen_st(ctx, OPC_SD, ry, rx, offset);
13377         break;
13378 #endif
13379     case M16_OPC_LB:
13380         gen_ld(ctx, OPC_LB, ry, rx, offset);
13381         break;
13382     case M16_OPC_LH:
13383         gen_ld(ctx, OPC_LH, ry, rx, offset);
13384         break;
13385     case M16_OPC_LWSP:
13386         gen_ld(ctx, OPC_LW, rx, 29, offset);
13387         break;
13388     case M16_OPC_LW:
13389         gen_ld(ctx, OPC_LW, ry, rx, offset);
13390         break;
13391     case M16_OPC_LBU:
13392         gen_ld(ctx, OPC_LBU, ry, rx, offset);
13393         break;
13394     case M16_OPC_LHU:
13395         gen_ld(ctx, OPC_LHU, ry, rx, offset);
13396         break;
13397     case M16_OPC_LWPC:
13398         gen_ld(ctx, OPC_LWPC, rx, 0, offset);
13399         break;
13400 #if defined(TARGET_MIPS64)
13401     case M16_OPC_LWU:
13402         check_insn(ctx, ISA_MIPS3);
13403         check_mips_64(ctx);
13404         gen_ld(ctx, OPC_LWU, ry, rx, offset);
13405         break;
13406 #endif
13407     case M16_OPC_SB:
13408         gen_st(ctx, OPC_SB, ry, rx, offset);
13409         break;
13410     case M16_OPC_SH:
13411         gen_st(ctx, OPC_SH, ry, rx, offset);
13412         break;
13413     case M16_OPC_SWSP:
13414         gen_st(ctx, OPC_SW, rx, 29, offset);
13415         break;
13416     case M16_OPC_SW:
13417         gen_st(ctx, OPC_SW, ry, rx, offset);
13418         break;
13419 #if defined(TARGET_MIPS64)
13420     case M16_OPC_I64:
13421         decode_i64_mips16(ctx, ry, funct, offset, 1);
13422         break;
13423 #endif
13424     default:
13425         generate_exception_end(ctx, EXCP_RI);
13426         break;
13427     }
13428
13429     return 4;
13430 }
13431
13432 static inline bool is_uhi(int sdbbp_code)
13433 {
13434 #ifdef CONFIG_USER_ONLY
13435     return false;
13436 #else
13437     return semihosting_enabled() && sdbbp_code == 1;
13438 #endif
13439 }
13440
13441 static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx)
13442 {
13443     int rx, ry;
13444     int sa;
13445     int op, cnvt_op, op1, offset;
13446     int funct;
13447     int n_bytes;
13448
13449     op = (ctx->opcode >> 11) & 0x1f;
13450     sa = (ctx->opcode >> 2) & 0x7;
13451     sa = sa == 0 ? 8 : sa;
13452     rx = xlat((ctx->opcode >> 8) & 0x7);
13453     cnvt_op = (ctx->opcode >> 5) & 0x7;
13454     ry = xlat((ctx->opcode >> 5) & 0x7);
13455     op1 = offset = ctx->opcode & 0x1f;
13456
13457     n_bytes = 2;
13458
13459     switch (op) {
13460     case M16_OPC_ADDIUSP:
13461         {
13462             int16_t imm = ((uint8_t) ctx->opcode) << 2;
13463
13464             gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
13465         }
13466         break;
13467     case M16_OPC_ADDIUPC:
13468         gen_addiupc(ctx, rx, ((uint8_t) ctx->opcode) << 2, 0, 0);
13469         break;
13470     case M16_OPC_B:
13471         offset = (ctx->opcode & 0x7ff) << 1;
13472         offset = (int16_t)(offset << 4) >> 4;
13473         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0, offset, 0);
13474         /* No delay slot, so just process as a normal instruction */
13475         break;
13476     case M16_OPC_JAL:
13477         offset = cpu_lduw_code(env, ctx->base.pc_next + 2);
13478         offset = (((ctx->opcode & 0x1f) << 21)
13479                   | ((ctx->opcode >> 5) & 0x1f) << 16
13480                   | offset) << 2;
13481         op = ((ctx->opcode >> 10) & 0x1) ? OPC_JALX : OPC_JAL;
13482         gen_compute_branch(ctx, op, 4, rx, ry, offset, 2);
13483         n_bytes = 4;
13484         break;
13485     case M16_OPC_BEQZ:
13486         gen_compute_branch(ctx, OPC_BEQ, 2, rx, 0,
13487                            ((int8_t)ctx->opcode) << 1, 0);
13488         /* No delay slot, so just process as a normal instruction */
13489         break;
13490     case M16_OPC_BNEQZ:
13491         gen_compute_branch(ctx, OPC_BNE, 2, rx, 0,
13492                            ((int8_t)ctx->opcode) << 1, 0);
13493         /* No delay slot, so just process as a normal instruction */
13494         break;
13495     case M16_OPC_SHIFT:
13496         switch (ctx->opcode & 0x3) {
13497         case 0x0:
13498             gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
13499             break;
13500         case 0x1:
13501 #if defined(TARGET_MIPS64)
13502             check_insn(ctx, ISA_MIPS3);
13503             check_mips_64(ctx);
13504             gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
13505 #else
13506             generate_exception_end(ctx, EXCP_RI);
13507 #endif
13508             break;
13509         case 0x2:
13510             gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
13511             break;
13512         case 0x3:
13513             gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
13514             break;
13515         }
13516         break;
13517 #if defined(TARGET_MIPS64)
13518     case M16_OPC_LD:
13519         check_insn(ctx, ISA_MIPS3);
13520         check_mips_64(ctx);
13521         gen_ld(ctx, OPC_LD, ry, rx, offset << 3);
13522         break;
13523 #endif
13524     case M16_OPC_RRIA:
13525         {
13526             int16_t imm = (int8_t)((ctx->opcode & 0xf) << 4) >> 4;
13527
13528             if ((ctx->opcode >> 4) & 1) {
13529 #if defined(TARGET_MIPS64)
13530                 check_insn(ctx, ISA_MIPS3);
13531                 check_mips_64(ctx);
13532                 gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
13533 #else
13534                 generate_exception_end(ctx, EXCP_RI);
13535 #endif
13536             } else {
13537                 gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
13538             }
13539         }
13540         break;
13541     case M16_OPC_ADDIU8:
13542         {
13543             int16_t imm = (int8_t) ctx->opcode;
13544
13545             gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
13546         }
13547         break;
13548     case M16_OPC_SLTI:
13549         {
13550             int16_t imm = (uint8_t) ctx->opcode;
13551             gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
13552         }
13553         break;
13554     case M16_OPC_SLTIU:
13555         {
13556             int16_t imm = (uint8_t) ctx->opcode;
13557             gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
13558         }
13559         break;
13560     case M16_OPC_I8:
13561         {
13562             int reg32;
13563
13564             funct = (ctx->opcode >> 8) & 0x7;
13565             switch (funct) {
13566             case I8_BTEQZ:
13567                 gen_compute_branch(ctx, OPC_BEQ, 2, 24, 0,
13568                                    ((int8_t)ctx->opcode) << 1, 0);
13569                 break;
13570             case I8_BTNEZ:
13571                 gen_compute_branch(ctx, OPC_BNE, 2, 24, 0,
13572                                    ((int8_t)ctx->opcode) << 1, 0);
13573                 break;
13574             case I8_SWRASP:
13575                 gen_st(ctx, OPC_SW, 31, 29, (ctx->opcode & 0xff) << 2);
13576                 break;
13577             case I8_ADJSP:
13578                 gen_arith_imm(ctx, OPC_ADDIU, 29, 29,
13579                               ((int8_t)ctx->opcode) << 3);
13580                 break;
13581             case I8_SVRS:
13582                 check_insn(ctx, ISA_MIPS32);
13583                 {
13584                     int do_ra = ctx->opcode & (1 << 6);
13585                     int do_s0 = ctx->opcode & (1 << 5);
13586                     int do_s1 = ctx->opcode & (1 << 4);
13587                     int framesize = ctx->opcode & 0xf;
13588
13589                     if (framesize == 0) {
13590                         framesize = 128;
13591                     } else {
13592                         framesize = framesize << 3;
13593                     }
13594
13595                     if (ctx->opcode & (1 << 7)) {
13596                         gen_mips16_save(ctx, 0, 0,
13597                                         do_ra, do_s0, do_s1, framesize);
13598                     } else {
13599                         gen_mips16_restore(ctx, 0, 0,
13600                                            do_ra, do_s0, do_s1, framesize);
13601                     }
13602                 }
13603                 break;
13604             case I8_MOV32R:
13605                 {
13606                     int rz = xlat(ctx->opcode & 0x7);
13607
13608                     reg32 = (((ctx->opcode >> 3) & 0x3) << 3) |
13609                         ((ctx->opcode >> 5) & 0x7);
13610                     gen_arith(ctx, OPC_ADDU, reg32, rz, 0);
13611                 }
13612                 break;
13613             case I8_MOVR32:
13614                 reg32 = ctx->opcode & 0x1f;
13615                 gen_arith(ctx, OPC_ADDU, ry, reg32, 0);
13616                 break;
13617             default:
13618                 generate_exception_end(ctx, EXCP_RI);
13619                 break;
13620             }
13621         }
13622         break;
13623     case M16_OPC_LI:
13624         {
13625             int16_t imm = (uint8_t) ctx->opcode;
13626
13627             gen_arith_imm(ctx, OPC_ADDIU, rx, 0, imm);
13628         }
13629         break;
13630     case M16_OPC_CMPI:
13631         {
13632             int16_t imm = (uint8_t) ctx->opcode;
13633             gen_logic_imm(ctx, OPC_XORI, 24, rx, imm);
13634         }
13635         break;
13636 #if defined(TARGET_MIPS64)
13637     case M16_OPC_SD:
13638         check_insn(ctx, ISA_MIPS3);
13639         check_mips_64(ctx);
13640         gen_st(ctx, OPC_SD, ry, rx, offset << 3);
13641         break;
13642 #endif
13643     case M16_OPC_LB:
13644         gen_ld(ctx, OPC_LB, ry, rx, offset);
13645         break;
13646     case M16_OPC_LH:
13647         gen_ld(ctx, OPC_LH, ry, rx, offset << 1);
13648         break;
13649     case M16_OPC_LWSP:
13650         gen_ld(ctx, OPC_LW, rx, 29, ((uint8_t)ctx->opcode) << 2);
13651         break;
13652     case M16_OPC_LW:
13653         gen_ld(ctx, OPC_LW, ry, rx, offset << 2);
13654         break;
13655     case M16_OPC_LBU:
13656         gen_ld(ctx, OPC_LBU, ry, rx, offset);
13657         break;
13658     case M16_OPC_LHU:
13659         gen_ld(ctx, OPC_LHU, ry, rx, offset << 1);
13660         break;
13661     case M16_OPC_LWPC:
13662         gen_ld(ctx, OPC_LWPC, rx, 0, ((uint8_t)ctx->opcode) << 2);
13663         break;
13664 #if defined (TARGET_MIPS64)
13665     case M16_OPC_LWU:
13666         check_insn(ctx, ISA_MIPS3);
13667         check_mips_64(ctx);
13668         gen_ld(ctx, OPC_LWU, ry, rx, offset << 2);
13669         break;
13670 #endif
13671     case M16_OPC_SB:
13672         gen_st(ctx, OPC_SB, ry, rx, offset);
13673         break;
13674     case M16_OPC_SH:
13675         gen_st(ctx, OPC_SH, ry, rx, offset << 1);
13676         break;
13677     case M16_OPC_SWSP:
13678         gen_st(ctx, OPC_SW, rx, 29, ((uint8_t)ctx->opcode) << 2);
13679         break;
13680     case M16_OPC_SW:
13681         gen_st(ctx, OPC_SW, ry, rx, offset << 2);
13682         break;
13683     case M16_OPC_RRR:
13684         {
13685             int rz = xlat((ctx->opcode >> 2) & 0x7);
13686             int mips32_op;
13687
13688             switch (ctx->opcode & 0x3) {
13689             case RRR_ADDU:
13690                 mips32_op = OPC_ADDU;
13691                 break;
13692             case RRR_SUBU:
13693                 mips32_op = OPC_SUBU;
13694                 break;
13695 #if defined(TARGET_MIPS64)
13696             case RRR_DADDU:
13697                 mips32_op = OPC_DADDU;
13698                 check_insn(ctx, ISA_MIPS3);
13699                 check_mips_64(ctx);
13700                 break;
13701             case RRR_DSUBU:
13702                 mips32_op = OPC_DSUBU;
13703                 check_insn(ctx, ISA_MIPS3);
13704                 check_mips_64(ctx);
13705                 break;
13706 #endif
13707             default:
13708                 generate_exception_end(ctx, EXCP_RI);
13709                 goto done;
13710             }
13711
13712             gen_arith(ctx, mips32_op, rz, rx, ry);
13713         done:
13714             ;
13715         }
13716         break;
13717     case M16_OPC_RR:
13718         switch (op1) {
13719         case RR_JR:
13720             {
13721                 int nd = (ctx->opcode >> 7) & 0x1;
13722                 int link = (ctx->opcode >> 6) & 0x1;
13723                 int ra = (ctx->opcode >> 5) & 0x1;
13724
13725                 if (nd) {
13726                     check_insn(ctx, ISA_MIPS32);
13727                 }
13728
13729                 if (link) {
13730                     op = OPC_JALR;
13731                 } else {
13732                     op = OPC_JR;
13733                 }
13734
13735                 gen_compute_branch(ctx, op, 2, ra ? 31 : rx, 31, 0,
13736                                    (nd ? 0 : 2));
13737             }
13738             break;
13739         case RR_SDBBP:
13740             if (is_uhi(extract32(ctx->opcode, 5, 6))) {
13741                 gen_helper_do_semihosting(cpu_env);
13742             } else {
13743                 /* XXX: not clear which exception should be raised
13744                  *      when in debug mode...
13745                  */
13746                 check_insn(ctx, ISA_MIPS32);
13747                 generate_exception_end(ctx, EXCP_DBp);
13748             }
13749             break;
13750         case RR_SLT:
13751             gen_slt(ctx, OPC_SLT, 24, rx, ry);
13752             break;
13753         case RR_SLTU:
13754             gen_slt(ctx, OPC_SLTU, 24, rx, ry);
13755             break;
13756         case RR_BREAK:
13757             generate_exception_end(ctx, EXCP_BREAK);
13758             break;
13759         case RR_SLLV:
13760             gen_shift(ctx, OPC_SLLV, ry, rx, ry);
13761             break;
13762         case RR_SRLV:
13763             gen_shift(ctx, OPC_SRLV, ry, rx, ry);
13764             break;
13765         case RR_SRAV:
13766             gen_shift(ctx, OPC_SRAV, ry, rx, ry);
13767             break;
13768 #if defined (TARGET_MIPS64)
13769         case RR_DSRL:
13770             check_insn(ctx, ISA_MIPS3);
13771             check_mips_64(ctx);
13772             gen_shift_imm(ctx, OPC_DSRL, ry, ry, sa);
13773             break;
13774 #endif
13775         case RR_CMP:
13776             gen_logic(ctx, OPC_XOR, 24, rx, ry);
13777             break;
13778         case RR_NEG:
13779             gen_arith(ctx, OPC_SUBU, rx, 0, ry);
13780             break;
13781         case RR_AND:
13782             gen_logic(ctx, OPC_AND, rx, rx, ry);
13783             break;
13784         case RR_OR:
13785             gen_logic(ctx, OPC_OR, rx, rx, ry);
13786             break;
13787         case RR_XOR:
13788             gen_logic(ctx, OPC_XOR, rx, rx, ry);
13789             break;
13790         case RR_NOT:
13791             gen_logic(ctx, OPC_NOR, rx, ry, 0);
13792             break;
13793         case RR_MFHI:
13794             gen_HILO(ctx, OPC_MFHI, 0, rx);
13795             break;
13796         case RR_CNVT:
13797             check_insn(ctx, ISA_MIPS32);
13798             switch (cnvt_op) {
13799             case RR_RY_CNVT_ZEB:
13800                 tcg_gen_ext8u_tl(cpu_gpr[rx], cpu_gpr[rx]);
13801                 break;
13802             case RR_RY_CNVT_ZEH:
13803                 tcg_gen_ext16u_tl(cpu_gpr[rx], cpu_gpr[rx]);
13804                 break;
13805             case RR_RY_CNVT_SEB:
13806                 tcg_gen_ext8s_tl(cpu_gpr[rx], cpu_gpr[rx]);
13807                 break;
13808             case RR_RY_CNVT_SEH:
13809                 tcg_gen_ext16s_tl(cpu_gpr[rx], cpu_gpr[rx]);
13810                 break;
13811 #if defined (TARGET_MIPS64)
13812             case RR_RY_CNVT_ZEW:
13813                 check_insn(ctx, ISA_MIPS64);
13814                 check_mips_64(ctx);
13815                 tcg_gen_ext32u_tl(cpu_gpr[rx], cpu_gpr[rx]);
13816                 break;
13817             case RR_RY_CNVT_SEW:
13818                 check_insn(ctx, ISA_MIPS64);
13819                 check_mips_64(ctx);
13820                 tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
13821                 break;
13822 #endif
13823             default:
13824                 generate_exception_end(ctx, EXCP_RI);
13825                 break;
13826             }
13827             break;
13828         case RR_MFLO:
13829             gen_HILO(ctx, OPC_MFLO, 0, rx);
13830             break;
13831 #if defined (TARGET_MIPS64)
13832         case RR_DSRA:
13833             check_insn(ctx, ISA_MIPS3);
13834             check_mips_64(ctx);
13835             gen_shift_imm(ctx, OPC_DSRA, ry, ry, sa);
13836             break;
13837         case RR_DSLLV:
13838             check_insn(ctx, ISA_MIPS3);
13839             check_mips_64(ctx);
13840             gen_shift(ctx, OPC_DSLLV, ry, rx, ry);
13841             break;
13842         case RR_DSRLV:
13843             check_insn(ctx, ISA_MIPS3);
13844             check_mips_64(ctx);
13845             gen_shift(ctx, OPC_DSRLV, ry, rx, ry);
13846             break;
13847         case RR_DSRAV:
13848             check_insn(ctx, ISA_MIPS3);
13849             check_mips_64(ctx);
13850             gen_shift(ctx, OPC_DSRAV, ry, rx, ry);
13851             break;
13852 #endif
13853         case RR_MULT:
13854             gen_muldiv(ctx, OPC_MULT, 0, rx, ry);
13855             break;
13856         case RR_MULTU:
13857             gen_muldiv(ctx, OPC_MULTU, 0, rx, ry);
13858             break;
13859         case RR_DIV:
13860             gen_muldiv(ctx, OPC_DIV, 0, rx, ry);
13861             break;
13862         case RR_DIVU:
13863             gen_muldiv(ctx, OPC_DIVU, 0, rx, ry);
13864             break;
13865 #if defined (TARGET_MIPS64)
13866         case RR_DMULT:
13867             check_insn(ctx, ISA_MIPS3);
13868             check_mips_64(ctx);
13869             gen_muldiv(ctx, OPC_DMULT, 0, rx, ry);
13870             break;
13871         case RR_DMULTU:
13872             check_insn(ctx, ISA_MIPS3);
13873             check_mips_64(ctx);
13874             gen_muldiv(ctx, OPC_DMULTU, 0, rx, ry);
13875             break;
13876         case RR_DDIV:
13877             check_insn(ctx, ISA_MIPS3);
13878             check_mips_64(ctx);
13879             gen_muldiv(ctx, OPC_DDIV, 0, rx, ry);
13880             break;
13881         case RR_DDIVU:
13882             check_insn(ctx, ISA_MIPS3);
13883             check_mips_64(ctx);
13884             gen_muldiv(ctx, OPC_DDIVU, 0, rx, ry);
13885             break;
13886 #endif
13887         default:
13888             generate_exception_end(ctx, EXCP_RI);
13889             break;
13890         }
13891         break;
13892     case M16_OPC_EXTEND:
13893         decode_extended_mips16_opc(env, ctx);
13894         n_bytes = 4;
13895         break;
13896 #if defined(TARGET_MIPS64)
13897     case M16_OPC_I64:
13898         funct = (ctx->opcode >> 8) & 0x7;
13899         decode_i64_mips16(ctx, ry, funct, offset, 0);
13900         break;
13901 #endif
13902     default:
13903         generate_exception_end(ctx, EXCP_RI);
13904         break;
13905     }
13906
13907     return n_bytes;
13908 }
13909
13910 /* microMIPS extension to MIPS32/MIPS64 */
13911
13912 /*
13913  * microMIPS32/microMIPS64 major opcodes
13914  *
13915  * 1. MIPS Architecture for Programmers Volume II-B:
13916  *      The microMIPS32 Instruction Set (Revision 3.05)
13917  *
13918  *    Table 6.2 microMIPS32 Encoding of Major Opcode Field
13919  *
13920  * 2. MIPS Architecture For Programmers Volume II-A:
13921  *      The MIPS64 Instruction Set (Revision 3.51)
13922  */
13923
13924 enum {
13925     POOL32A = 0x00,
13926     POOL16A = 0x01,
13927     LBU16 = 0x02,
13928     MOVE16 = 0x03,
13929     ADDI32 = 0x04,
13930     R6_LUI = 0x04,
13931     AUI = 0x04,
13932     LBU32 = 0x05,
13933     SB32 = 0x06,
13934     LB32 = 0x07,
13935
13936     POOL32B = 0x08,
13937     POOL16B = 0x09,
13938     LHU16 = 0x0a,
13939     ANDI16 = 0x0b,
13940     ADDIU32 = 0x0c,
13941     LHU32 = 0x0d,
13942     SH32 = 0x0e,
13943     LH32 = 0x0f,
13944
13945     POOL32I = 0x10,
13946     POOL16C = 0x11,
13947     LWSP16 = 0x12,
13948     POOL16D = 0x13,
13949     ORI32 = 0x14,
13950     POOL32F = 0x15,
13951     POOL32S = 0x16,  /* MIPS64 */
13952     DADDIU32 = 0x17, /* MIPS64 */
13953
13954     POOL32C = 0x18,
13955     LWGP16 = 0x19,
13956     LW16 = 0x1a,
13957     POOL16E = 0x1b,
13958     XORI32 = 0x1c,
13959     JALS32 = 0x1d,
13960     BOVC = 0x1d,
13961     BEQC = 0x1d,
13962     BEQZALC = 0x1d,
13963     ADDIUPC = 0x1e,
13964     PCREL = 0x1e,
13965     BNVC = 0x1f,
13966     BNEC = 0x1f,
13967     BNEZALC = 0x1f,
13968
13969     R6_BEQZC = 0x20,
13970     JIC = 0x20,
13971     POOL16F = 0x21,
13972     SB16 = 0x22,
13973     BEQZ16 = 0x23,
13974     BEQZC16 = 0x23,
13975     SLTI32 = 0x24,
13976     BEQ32 = 0x25,
13977     BC = 0x25,
13978     SWC132 = 0x26,
13979     LWC132 = 0x27,
13980
13981     /* 0x29 is reserved */
13982     RES_29 = 0x29,
13983     R6_BNEZC = 0x28,
13984     JIALC = 0x28,
13985     SH16 = 0x2a,
13986     BNEZ16 = 0x2b,
13987     BNEZC16 = 0x2b,
13988     SLTIU32 = 0x2c,
13989     BNE32 = 0x2d,
13990     BALC = 0x2d,
13991     SDC132 = 0x2e,
13992     LDC132 = 0x2f,
13993
13994     /* 0x31 is reserved */
13995     RES_31 = 0x31,
13996     BLEZALC = 0x30,
13997     BGEZALC = 0x30,
13998     BGEUC = 0x30,
13999     SWSP16 = 0x32,
14000     B16 = 0x33,
14001     BC16 = 0x33,
14002     ANDI32 = 0x34,
14003     J32 = 0x35,
14004     BGTZC = 0x35,
14005     BLTZC = 0x35,
14006     BLTC = 0x35,
14007     SD32 = 0x36, /* MIPS64 */
14008     LD32 = 0x37, /* MIPS64 */
14009
14010     /* 0x39 is reserved */
14011     RES_39 = 0x39,
14012     BGTZALC = 0x38,
14013     BLTZALC = 0x38,
14014     BLTUC = 0x38,
14015     SW16 = 0x3a,
14016     LI16 = 0x3b,
14017     JALX32 = 0x3c,
14018     JAL32 = 0x3d,
14019     BLEZC = 0x3d,
14020     BGEZC = 0x3d,
14021     BGEC = 0x3d,
14022     SW32 = 0x3e,
14023     LW32 = 0x3f
14024 };
14025
14026 /* PCREL Instructions perform PC-Relative address calculation. bits 20..16 */
14027 enum {
14028     ADDIUPC_00 = 0x00,
14029     ADDIUPC_01 = 0x01,
14030     ADDIUPC_02 = 0x02,
14031     ADDIUPC_03 = 0x03,
14032     ADDIUPC_04 = 0x04,
14033     ADDIUPC_05 = 0x05,
14034     ADDIUPC_06 = 0x06,
14035     ADDIUPC_07 = 0x07,
14036     AUIPC = 0x1e,
14037     ALUIPC = 0x1f,
14038     LWPC_08 = 0x08,
14039     LWPC_09 = 0x09,
14040     LWPC_0A = 0x0A,
14041     LWPC_0B = 0x0B,
14042     LWPC_0C = 0x0C,
14043     LWPC_0D = 0x0D,
14044     LWPC_0E = 0x0E,
14045     LWPC_0F = 0x0F,
14046 };
14047
14048 /* POOL32A encoding of minor opcode field */
14049
14050 enum {
14051     /* These opcodes are distinguished only by bits 9..6; those bits are
14052      * what are recorded below. */
14053     SLL32 = 0x0,
14054     SRL32 = 0x1,
14055     SRA = 0x2,
14056     ROTR = 0x3,
14057     SELEQZ = 0x5,
14058     SELNEZ = 0x6,
14059     R6_RDHWR = 0x7,
14060
14061     SLLV = 0x0,
14062     SRLV = 0x1,
14063     SRAV = 0x2,
14064     ROTRV = 0x3,
14065     ADD = 0x4,
14066     ADDU32 = 0x5,
14067     SUB = 0x6,
14068     SUBU32 = 0x7,
14069     MUL = 0x8,
14070     AND = 0x9,
14071     OR32 = 0xa,
14072     NOR = 0xb,
14073     XOR32 = 0xc,
14074     SLT = 0xd,
14075     SLTU = 0xe,
14076
14077     MOVN = 0x0,
14078     R6_MUL  = 0x0,
14079     MOVZ = 0x1,
14080     MUH  = 0x1,
14081     MULU = 0x2,
14082     MUHU = 0x3,
14083     LWXS = 0x4,
14084     R6_DIV  = 0x4,
14085     MOD  = 0x5,
14086     R6_DIVU = 0x6,
14087     MODU = 0x7,
14088
14089     /* The following can be distinguished by their lower 6 bits. */
14090     BREAK32 = 0x07,
14091     INS = 0x0c,
14092     LSA = 0x0f,
14093     ALIGN = 0x1f,
14094     EXT = 0x2c,
14095     POOL32AXF = 0x3c,
14096     SIGRIE = 0x3f
14097 };
14098
14099 /* POOL32AXF encoding of minor opcode field extension */
14100
14101 /*
14102  * 1. MIPS Architecture for Programmers Volume II-B:
14103  *      The microMIPS32 Instruction Set (Revision 3.05)
14104  *
14105  *    Table 6.5 POOL32Axf Encoding of Minor Opcode Extension Field
14106  *
14107  * 2. MIPS Architecture for Programmers VolumeIV-e:
14108  *      The MIPS DSP Application-Specific Extension
14109  *        to the microMIPS32 Architecture (Revision 2.34)
14110  *
14111  *    Table 5.5 POOL32Axf Encoding of Minor Opcode Extension Field
14112  */
14113
14114 enum {
14115     /* bits 11..6 */
14116     TEQ = 0x00,
14117     TGE = 0x08,
14118     TGEU = 0x10,
14119     TLT = 0x20,
14120     TLTU = 0x28,
14121     TNE = 0x30,
14122
14123     MFC0 = 0x03,
14124     MTC0 = 0x0b,
14125
14126     /* begin of microMIPS32 DSP */
14127
14128     /* bits 13..12 for 0x01 */
14129     MFHI_ACC = 0x0,
14130     MFLO_ACC = 0x1,
14131     MTHI_ACC = 0x2,
14132     MTLO_ACC = 0x3,
14133
14134     /* bits 13..12 for 0x2a */
14135     MADD_ACC = 0x0,
14136     MADDU_ACC = 0x1,
14137     MSUB_ACC = 0x2,
14138     MSUBU_ACC = 0x3,
14139
14140     /* bits 13..12 for 0x32 */
14141     MULT_ACC = 0x0,
14142     MULTU_ACC = 0x1,
14143
14144     /* end of microMIPS32 DSP */
14145
14146     /* bits 15..12 for 0x2c */
14147     BITSWAP = 0x0,
14148     SEB = 0x2,
14149     SEH = 0x3,
14150     CLO = 0x4,
14151     CLZ = 0x5,
14152     RDHWR = 0x6,
14153     WSBH = 0x7,
14154     MULT = 0x8,
14155     MULTU = 0x9,
14156     DIV = 0xa,
14157     DIVU = 0xb,
14158     MADD = 0xc,
14159     MADDU = 0xd,
14160     MSUB = 0xe,
14161     MSUBU = 0xf,
14162
14163     /* bits 15..12 for 0x34 */
14164     MFC2 = 0x4,
14165     MTC2 = 0x5,
14166     MFHC2 = 0x8,
14167     MTHC2 = 0x9,
14168     CFC2 = 0xc,
14169     CTC2 = 0xd,
14170
14171     /* bits 15..12 for 0x3c */
14172     JALR = 0x0,
14173     JR = 0x0,                   /* alias */
14174     JALRC = 0x0,
14175     JRC = 0x0,
14176     JALR_HB = 0x1,
14177     JALRC_HB = 0x1,
14178     JALRS = 0x4,
14179     JALRS_HB = 0x5,
14180
14181     /* bits 15..12 for 0x05 */
14182     RDPGPR = 0xe,
14183     WRPGPR = 0xf,
14184
14185     /* bits 15..12 for 0x0d */
14186     TLBP = 0x0,
14187     TLBR = 0x1,
14188     TLBWI = 0x2,
14189     TLBWR = 0x3,
14190     TLBINV = 0x4,
14191     TLBINVF = 0x5,
14192     WAIT = 0x9,
14193     IRET = 0xd,
14194     DERET = 0xe,
14195     ERET = 0xf,
14196
14197     /* bits 15..12 for 0x15 */
14198     DMT = 0x0,
14199     DVPE = 0x1,
14200     EMT = 0x2,
14201     EVPE = 0x3,
14202
14203     /* bits 15..12 for 0x1d */
14204     DI = 0x4,
14205     EI = 0x5,
14206
14207     /* bits 15..12 for 0x2d */
14208     SYNC = 0x6,
14209     SYSCALL = 0x8,
14210     SDBBP = 0xd,
14211
14212     /* bits 15..12 for 0x35 */
14213     MFHI32 = 0x0,
14214     MFLO32 = 0x1,
14215     MTHI32 = 0x2,
14216     MTLO32 = 0x3,
14217 };
14218
14219 /* POOL32B encoding of minor opcode field (bits 15..12) */
14220
14221 enum {
14222     LWC2 = 0x0,
14223     LWP = 0x1,
14224     LDP = 0x4,
14225     LWM32 = 0x5,
14226     CACHE = 0x6,
14227     LDM = 0x7,
14228     SWC2 = 0x8,
14229     SWP = 0x9,
14230     SDP = 0xc,
14231     SWM32 = 0xd,
14232     SDM = 0xf
14233 };
14234
14235 /* POOL32C encoding of minor opcode field (bits 15..12) */
14236
14237 enum {
14238     LWL = 0x0,
14239     SWL = 0x8,
14240     LWR = 0x1,
14241     SWR = 0x9,
14242     PREF = 0x2,
14243     ST_EVA = 0xa,
14244     LL = 0x3,
14245     SC = 0xb,
14246     LDL = 0x4,
14247     SDL = 0xc,
14248     LDR = 0x5,
14249     SDR = 0xd,
14250     LD_EVA = 0x6,
14251     LWU = 0xe,
14252     LLD = 0x7,
14253     SCD = 0xf
14254 };
14255
14256 /* POOL32C LD-EVA encoding of minor opcode field (bits 11..9) */
14257
14258 enum {
14259     LBUE = 0x0,
14260     LHUE = 0x1,
14261     LWLE = 0x2,
14262     LWRE = 0x3,
14263     LBE = 0x4,
14264     LHE = 0x5,
14265     LLE = 0x6,
14266     LWE = 0x7,
14267 };
14268
14269 /* POOL32C ST-EVA encoding of minor opcode field (bits 11..9) */
14270
14271 enum {
14272     SWLE = 0x0,
14273     SWRE = 0x1,
14274     PREFE = 0x2,
14275     CACHEE = 0x3,
14276     SBE = 0x4,
14277     SHE = 0x5,
14278     SCE = 0x6,
14279     SWE = 0x7,
14280 };
14281
14282 /* POOL32F encoding of minor opcode field (bits 5..0) */
14283
14284 enum {
14285     /* These are the bit 7..6 values */
14286     ADD_FMT = 0x0,
14287
14288     SUB_FMT = 0x1,
14289
14290     MUL_FMT = 0x2,
14291
14292     DIV_FMT = 0x3,
14293
14294     /* These are the bit 8..6 values */
14295     MOVN_FMT = 0x0,
14296     RSQRT2_FMT = 0x0,
14297     MOVF_FMT = 0x0,
14298     RINT_FMT = 0x0,
14299     SELNEZ_FMT = 0x0,
14300
14301     MOVZ_FMT = 0x1,
14302     LWXC1 = 0x1,
14303     MOVT_FMT = 0x1,
14304     CLASS_FMT = 0x1,
14305     SELEQZ_FMT = 0x1,
14306
14307     PLL_PS = 0x2,
14308     SWXC1 = 0x2,
14309     SEL_FMT = 0x2,
14310
14311     PLU_PS = 0x3,
14312     LDXC1 = 0x3,
14313
14314     MOVN_FMT_04 = 0x4,
14315     PUL_PS = 0x4,
14316     SDXC1 = 0x4,
14317     RECIP2_FMT = 0x4,
14318
14319     MOVZ_FMT_05 = 0x05,
14320     PUU_PS = 0x5,
14321     LUXC1 = 0x5,
14322
14323     CVT_PS_S = 0x6,
14324     SUXC1 = 0x6,
14325     ADDR_PS = 0x6,
14326     PREFX = 0x6,
14327     MADDF_FMT = 0x6,
14328
14329     MULR_PS = 0x7,
14330     MSUBF_FMT = 0x7,
14331
14332     MADD_S = 0x01,
14333     MADD_D = 0x09,
14334     MADD_PS = 0x11,
14335     ALNV_PS = 0x19,
14336     MSUB_S = 0x21,
14337     MSUB_D = 0x29,
14338     MSUB_PS = 0x31,
14339
14340     NMADD_S = 0x02,
14341     NMADD_D = 0x0a,
14342     NMADD_PS = 0x12,
14343     NMSUB_S = 0x22,
14344     NMSUB_D = 0x2a,
14345     NMSUB_PS = 0x32,
14346
14347     MIN_FMT = 0x3,
14348     MAX_FMT = 0xb,
14349     MINA_FMT = 0x23,
14350     MAXA_FMT = 0x2b,
14351     POOL32FXF = 0x3b,
14352
14353     CABS_COND_FMT = 0x1c,              /* MIPS3D */
14354     C_COND_FMT = 0x3c,
14355
14356     CMP_CONDN_S = 0x5,
14357     CMP_CONDN_D = 0x15
14358 };
14359
14360 /* POOL32Fxf encoding of minor opcode extension field */
14361
14362 enum {
14363     CVT_L = 0x04,
14364     RSQRT_FMT = 0x08,
14365     FLOOR_L = 0x0c,
14366     CVT_PW_PS = 0x1c,
14367     CVT_W = 0x24,
14368     SQRT_FMT = 0x28,
14369     FLOOR_W = 0x2c,
14370     CVT_PS_PW = 0x3c,
14371     CFC1 = 0x40,
14372     RECIP_FMT = 0x48,
14373     CEIL_L = 0x4c,
14374     CTC1 = 0x60,
14375     CEIL_W = 0x6c,
14376     MFC1 = 0x80,
14377     CVT_S_PL = 0x84,
14378     TRUNC_L = 0x8c,
14379     MTC1 = 0xa0,
14380     CVT_S_PU = 0xa4,
14381     TRUNC_W = 0xac,
14382     MFHC1 = 0xc0,
14383     ROUND_L = 0xcc,
14384     MTHC1 = 0xe0,
14385     ROUND_W = 0xec,
14386
14387     MOV_FMT = 0x01,
14388     MOVF = 0x05,
14389     ABS_FMT = 0x0d,
14390     RSQRT1_FMT = 0x1d,
14391     MOVT = 0x25,
14392     NEG_FMT = 0x2d,
14393     CVT_D = 0x4d,
14394     RECIP1_FMT = 0x5d,
14395     CVT_S = 0x6d
14396 };
14397
14398 /* POOL32I encoding of minor opcode field (bits 25..21) */
14399
14400 enum {
14401     BLTZ = 0x00,
14402     BLTZAL = 0x01,
14403     BGEZ = 0x02,
14404     BGEZAL = 0x03,
14405     BLEZ = 0x04,
14406     BNEZC = 0x05,
14407     BGTZ = 0x06,
14408     BEQZC = 0x07,
14409     TLTI = 0x08,
14410     BC1EQZC = 0x08,
14411     TGEI = 0x09,
14412     BC1NEZC = 0x09,
14413     TLTIU = 0x0a,
14414     BC2EQZC = 0x0a,
14415     TGEIU = 0x0b,
14416     BC2NEZC = 0x0a,
14417     TNEI = 0x0c,
14418     R6_SYNCI = 0x0c,
14419     LUI = 0x0d,
14420     TEQI = 0x0e,
14421     SYNCI = 0x10,
14422     BLTZALS = 0x11,
14423     BGEZALS = 0x13,
14424     BC2F = 0x14,
14425     BC2T = 0x15,
14426     BPOSGE64 = 0x1a,
14427     BPOSGE32 = 0x1b,
14428     /* These overlap and are distinguished by bit16 of the instruction */
14429     BC1F = 0x1c,
14430     BC1T = 0x1d,
14431     BC1ANY2F = 0x1c,
14432     BC1ANY2T = 0x1d,
14433     BC1ANY4F = 0x1e,
14434     BC1ANY4T = 0x1f
14435 };
14436
14437 /* POOL16A encoding of minor opcode field */
14438
14439 enum {
14440     ADDU16 = 0x0,
14441     SUBU16 = 0x1
14442 };
14443
14444 /* POOL16B encoding of minor opcode field */
14445
14446 enum {
14447     SLL16 = 0x0,
14448     SRL16 = 0x1
14449 };
14450
14451 /* POOL16C encoding of minor opcode field */
14452
14453 enum {
14454     NOT16 = 0x00,
14455     XOR16 = 0x04,
14456     AND16 = 0x08,
14457     OR16 = 0x0c,
14458     LWM16 = 0x10,
14459     SWM16 = 0x14,
14460     JR16 = 0x18,
14461     JRC16 = 0x1a,
14462     JALR16 = 0x1c,
14463     JALR16S = 0x1e,
14464     MFHI16 = 0x20,
14465     MFLO16 = 0x24,
14466     BREAK16 = 0x28,
14467     SDBBP16 = 0x2c,
14468     JRADDIUSP = 0x30
14469 };
14470
14471 /* R6 POOL16C encoding of minor opcode field (bits 0..5) */
14472
14473 enum {
14474     R6_NOT16    = 0x00,
14475     R6_AND16    = 0x01,
14476     R6_LWM16    = 0x02,
14477     R6_JRC16    = 0x03,
14478     MOVEP       = 0x04,
14479     MOVEP_05    = 0x05,
14480     MOVEP_06    = 0x06,
14481     MOVEP_07    = 0x07,
14482     R6_XOR16    = 0x08,
14483     R6_OR16     = 0x09,
14484     R6_SWM16    = 0x0a,
14485     JALRC16     = 0x0b,
14486     MOVEP_0C    = 0x0c,
14487     MOVEP_0D    = 0x0d,
14488     MOVEP_0E    = 0x0e,
14489     MOVEP_0F    = 0x0f,
14490     JRCADDIUSP  = 0x13,
14491     R6_BREAK16  = 0x1b,
14492     R6_SDBBP16  = 0x3b
14493 };
14494
14495 /* POOL16D encoding of minor opcode field */
14496
14497 enum {
14498     ADDIUS5 = 0x0,
14499     ADDIUSP = 0x1
14500 };
14501
14502 /* POOL16E encoding of minor opcode field */
14503
14504 enum {
14505     ADDIUR2 = 0x0,
14506     ADDIUR1SP = 0x1
14507 };
14508
14509 static int mmreg (int r)
14510 {
14511     static const int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
14512
14513     return map[r];
14514 }
14515
14516 /* Used for 16-bit store instructions.  */
14517 static int mmreg2 (int r)
14518 {
14519     static const int map[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
14520
14521     return map[r];
14522 }
14523
14524 #define uMIPS_RD(op) ((op >> 7) & 0x7)
14525 #define uMIPS_RS(op) ((op >> 4) & 0x7)
14526 #define uMIPS_RS2(op) uMIPS_RS(op)
14527 #define uMIPS_RS1(op) ((op >> 1) & 0x7)
14528 #define uMIPS_RD5(op) ((op >> 5) & 0x1f)
14529 #define uMIPS_RS5(op) (op & 0x1f)
14530
14531 /* Signed immediate */
14532 #define SIMM(op, start, width)                                          \
14533     ((int32_t)(((op >> start) & ((~0U) >> (32-width)))                 \
14534                << (32-width))                                           \
14535      >> (32-width))
14536 /* Zero-extended immediate */
14537 #define ZIMM(op, start, width) ((op >> start) & ((~0U) >> (32-width)))
14538
14539 static void gen_addiur1sp(DisasContext *ctx)
14540 {
14541     int rd = mmreg(uMIPS_RD(ctx->opcode));
14542
14543     gen_arith_imm(ctx, OPC_ADDIU, rd, 29, ((ctx->opcode >> 1) & 0x3f) << 2);
14544 }
14545
14546 static void gen_addiur2(DisasContext *ctx)
14547 {
14548     static const int decoded_imm[] = { 1, 4, 8, 12, 16, 20, 24, -1 };
14549     int rd = mmreg(uMIPS_RD(ctx->opcode));
14550     int rs = mmreg(uMIPS_RS(ctx->opcode));
14551
14552     gen_arith_imm(ctx, OPC_ADDIU, rd, rs, decoded_imm[ZIMM(ctx->opcode, 1, 3)]);
14553 }
14554
14555 static void gen_addiusp(DisasContext *ctx)
14556 {
14557     int encoded = ZIMM(ctx->opcode, 1, 9);
14558     int decoded;
14559
14560     if (encoded <= 1) {
14561         decoded = 256 + encoded;
14562     } else if (encoded <= 255) {
14563         decoded = encoded;
14564     } else if (encoded <= 509) {
14565         decoded = encoded - 512;
14566     } else {
14567         decoded = encoded - 768;
14568     }
14569
14570     gen_arith_imm(ctx, OPC_ADDIU, 29, 29, decoded << 2);
14571 }
14572
14573 static void gen_addius5(DisasContext *ctx)
14574 {
14575     int imm = SIMM(ctx->opcode, 1, 4);
14576     int rd = (ctx->opcode >> 5) & 0x1f;
14577
14578     gen_arith_imm(ctx, OPC_ADDIU, rd, rd, imm);
14579 }
14580
14581 static void gen_andi16(DisasContext *ctx)
14582 {
14583     static const int decoded_imm[] = { 128, 1, 2, 3, 4, 7, 8, 15, 16,
14584                                  31, 32, 63, 64, 255, 32768, 65535 };
14585     int rd = mmreg(uMIPS_RD(ctx->opcode));
14586     int rs = mmreg(uMIPS_RS(ctx->opcode));
14587     int encoded = ZIMM(ctx->opcode, 0, 4);
14588
14589     gen_logic_imm(ctx, OPC_ANDI, rd, rs, decoded_imm[encoded]);
14590 }
14591
14592 static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist,
14593                                int base, int16_t offset)
14594 {
14595     TCGv t0, t1;
14596     TCGv_i32 t2;
14597
14598     if (ctx->hflags & MIPS_HFLAG_BMASK) {
14599         generate_exception_end(ctx, EXCP_RI);
14600         return;
14601     }
14602
14603     t0 = tcg_temp_new();
14604
14605     gen_base_offset_addr(ctx, t0, base, offset);
14606
14607     t1 = tcg_const_tl(reglist);
14608     t2 = tcg_const_i32(ctx->mem_idx);
14609
14610     save_cpu_state(ctx, 1);
14611     switch (opc) {
14612     case LWM32:
14613         gen_helper_lwm(cpu_env, t0, t1, t2);
14614         break;
14615     case SWM32:
14616         gen_helper_swm(cpu_env, t0, t1, t2);
14617         break;
14618 #ifdef TARGET_MIPS64
14619     case LDM:
14620         gen_helper_ldm(cpu_env, t0, t1, t2);
14621         break;
14622     case SDM:
14623         gen_helper_sdm(cpu_env, t0, t1, t2);
14624         break;
14625 #endif
14626     }
14627     tcg_temp_free(t0);
14628     tcg_temp_free(t1);
14629     tcg_temp_free_i32(t2);
14630 }
14631
14632
14633 static void gen_pool16c_insn(DisasContext *ctx)
14634 {
14635     int rd = mmreg((ctx->opcode >> 3) & 0x7);
14636     int rs = mmreg(ctx->opcode & 0x7);
14637
14638     switch (((ctx->opcode) >> 4) & 0x3f) {
14639     case NOT16 + 0:
14640     case NOT16 + 1:
14641     case NOT16 + 2:
14642     case NOT16 + 3:
14643         gen_logic(ctx, OPC_NOR, rd, rs, 0);
14644         break;
14645     case XOR16 + 0:
14646     case XOR16 + 1:
14647     case XOR16 + 2:
14648     case XOR16 + 3:
14649         gen_logic(ctx, OPC_XOR, rd, rd, rs);
14650         break;
14651     case AND16 + 0:
14652     case AND16 + 1:
14653     case AND16 + 2:
14654     case AND16 + 3:
14655         gen_logic(ctx, OPC_AND, rd, rd, rs);
14656         break;
14657     case OR16 + 0:
14658     case OR16 + 1:
14659     case OR16 + 2:
14660     case OR16 + 3:
14661         gen_logic(ctx, OPC_OR, rd, rd, rs);
14662         break;
14663     case LWM16 + 0:
14664     case LWM16 + 1:
14665     case LWM16 + 2:
14666     case LWM16 + 3:
14667         {
14668             static const int lwm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
14669             int offset = ZIMM(ctx->opcode, 0, 4);
14670
14671             gen_ldst_multiple(ctx, LWM32, lwm_convert[(ctx->opcode >> 4) & 0x3],
14672                               29, offset << 2);
14673         }
14674         break;
14675     case SWM16 + 0:
14676     case SWM16 + 1:
14677     case SWM16 + 2:
14678     case SWM16 + 3:
14679         {
14680             static const int swm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
14681             int offset = ZIMM(ctx->opcode, 0, 4);
14682
14683             gen_ldst_multiple(ctx, SWM32, swm_convert[(ctx->opcode >> 4) & 0x3],
14684                               29, offset << 2);
14685         }
14686         break;
14687     case JR16 + 0:
14688     case JR16 + 1:
14689         {
14690             int reg = ctx->opcode & 0x1f;
14691
14692             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 4);
14693         }
14694         break;
14695     case JRC16 + 0:
14696     case JRC16 + 1:
14697         {
14698             int reg = ctx->opcode & 0x1f;
14699             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 0);
14700             /* Let normal delay slot handling in our caller take us
14701                to the branch target.  */
14702         }
14703         break;
14704     case JALR16 + 0:
14705     case JALR16 + 1:
14706         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 4);
14707         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14708         break;
14709     case JALR16S + 0:
14710     case JALR16S + 1:
14711         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 2);
14712         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14713         break;
14714     case MFHI16 + 0:
14715     case MFHI16 + 1:
14716         gen_HILO(ctx, OPC_MFHI, 0, uMIPS_RS5(ctx->opcode));
14717         break;
14718     case MFLO16 + 0:
14719     case MFLO16 + 1:
14720         gen_HILO(ctx, OPC_MFLO, 0, uMIPS_RS5(ctx->opcode));
14721         break;
14722     case BREAK16:
14723         generate_exception_end(ctx, EXCP_BREAK);
14724         break;
14725     case SDBBP16:
14726         if (is_uhi(extract32(ctx->opcode, 0, 4))) {
14727             gen_helper_do_semihosting(cpu_env);
14728         } else {
14729             /* XXX: not clear which exception should be raised
14730              *      when in debug mode...
14731              */
14732             check_insn(ctx, ISA_MIPS32);
14733             generate_exception_end(ctx, EXCP_DBp);
14734         }
14735         break;
14736     case JRADDIUSP + 0:
14737     case JRADDIUSP + 1:
14738         {
14739             int imm = ZIMM(ctx->opcode, 0, 5);
14740             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
14741             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
14742             /* Let normal delay slot handling in our caller take us
14743                to the branch target.  */
14744         }
14745         break;
14746     default:
14747         generate_exception_end(ctx, EXCP_RI);
14748         break;
14749     }
14750 }
14751
14752 static inline void gen_movep(DisasContext *ctx, int enc_dest, int enc_rt,
14753                              int enc_rs)
14754 {
14755     int rd, rs, re, rt;
14756     static const int rd_enc[] = { 5, 5, 6, 4, 4, 4, 4, 4 };
14757     static const int re_enc[] = { 6, 7, 7, 21, 22, 5, 6, 7 };
14758     static const int rs_rt_enc[] = { 0, 17, 2, 3, 16, 18, 19, 20 };
14759     rd = rd_enc[enc_dest];
14760     re = re_enc[enc_dest];
14761     rs = rs_rt_enc[enc_rs];
14762     rt = rs_rt_enc[enc_rt];
14763     if (rs) {
14764         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
14765     } else {
14766         tcg_gen_movi_tl(cpu_gpr[rd], 0);
14767     }
14768     if (rt) {
14769         tcg_gen_mov_tl(cpu_gpr[re], cpu_gpr[rt]);
14770     } else {
14771         tcg_gen_movi_tl(cpu_gpr[re], 0);
14772     }
14773 }
14774
14775 static void gen_pool16c_r6_insn(DisasContext *ctx)
14776 {
14777     int rt = mmreg((ctx->opcode >> 7) & 0x7);
14778     int rs = mmreg((ctx->opcode >> 4) & 0x7);
14779
14780     switch (ctx->opcode & 0xf) {
14781     case R6_NOT16:
14782         gen_logic(ctx, OPC_NOR, rt, rs, 0);
14783         break;
14784     case R6_AND16:
14785         gen_logic(ctx, OPC_AND, rt, rt, rs);
14786         break;
14787     case R6_LWM16:
14788         {
14789             int lwm_converted = 0x11 + extract32(ctx->opcode, 8, 2);
14790             int offset = extract32(ctx->opcode, 4, 4);
14791             gen_ldst_multiple(ctx, LWM32, lwm_converted, 29, offset << 2);
14792         }
14793         break;
14794     case R6_JRC16: /* JRCADDIUSP */
14795         if ((ctx->opcode >> 4) & 1) {
14796             /* JRCADDIUSP */
14797             int imm = extract32(ctx->opcode, 5, 5);
14798             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
14799             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
14800         } else {
14801             /* JRC16 */
14802             rs = extract32(ctx->opcode, 5, 5);
14803             gen_compute_branch(ctx, OPC_JR, 2, rs, 0, 0, 0);
14804         }
14805         break;
14806     case MOVEP:
14807     case MOVEP_05:
14808     case MOVEP_06:
14809     case MOVEP_07:
14810     case MOVEP_0C:
14811     case MOVEP_0D:
14812     case MOVEP_0E:
14813     case MOVEP_0F:
14814         {
14815             int enc_dest = uMIPS_RD(ctx->opcode);
14816             int enc_rt = uMIPS_RS2(ctx->opcode);
14817             int enc_rs = (ctx->opcode & 3) | ((ctx->opcode >> 1) & 4);
14818             gen_movep(ctx, enc_dest, enc_rt, enc_rs);
14819         }
14820         break;
14821     case R6_XOR16:
14822         gen_logic(ctx, OPC_XOR, rt, rt, rs);
14823         break;
14824     case R6_OR16:
14825         gen_logic(ctx, OPC_OR, rt, rt, rs);
14826         break;
14827     case R6_SWM16:
14828         {
14829             int swm_converted = 0x11 + extract32(ctx->opcode, 8, 2);
14830             int offset = extract32(ctx->opcode, 4, 4);
14831             gen_ldst_multiple(ctx, SWM32, swm_converted, 29, offset << 2);
14832         }
14833         break;
14834     case JALRC16: /* BREAK16, SDBBP16 */
14835         switch (ctx->opcode & 0x3f) {
14836         case JALRC16:
14837         case JALRC16 + 0x20:
14838             /* JALRC16 */
14839             gen_compute_branch(ctx, OPC_JALR, 2, (ctx->opcode >> 5) & 0x1f,
14840                                31, 0, 0);
14841             break;
14842         case R6_BREAK16:
14843             /* BREAK16 */
14844             generate_exception(ctx, EXCP_BREAK);
14845             break;
14846         case R6_SDBBP16:
14847             /* SDBBP16 */
14848             if (is_uhi(extract32(ctx->opcode, 6, 4))) {
14849                 gen_helper_do_semihosting(cpu_env);
14850             } else {
14851                 if (ctx->hflags & MIPS_HFLAG_SBRI) {
14852                     generate_exception(ctx, EXCP_RI);
14853                 } else {
14854                     generate_exception(ctx, EXCP_DBp);
14855                 }
14856             }
14857             break;
14858         }
14859         break;
14860     default:
14861         generate_exception(ctx, EXCP_RI);
14862         break;
14863     }
14864 }
14865
14866 static void gen_ldxs (DisasContext *ctx, int base, int index, int rd)
14867 {
14868     TCGv t0 = tcg_temp_new();
14869     TCGv t1 = tcg_temp_new();
14870
14871     gen_load_gpr(t0, base);
14872
14873     if (index != 0) {
14874         gen_load_gpr(t1, index);
14875         tcg_gen_shli_tl(t1, t1, 2);
14876         gen_op_addr_add(ctx, t0, t1, t0);
14877     }
14878
14879     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
14880     gen_store_gpr(t1, rd);
14881
14882     tcg_temp_free(t0);
14883     tcg_temp_free(t1);
14884 }
14885
14886 static void gen_ldst_pair (DisasContext *ctx, uint32_t opc, int rd,
14887                            int base, int16_t offset)
14888 {
14889     TCGv t0, t1;
14890
14891     if (ctx->hflags & MIPS_HFLAG_BMASK || rd == 31) {
14892         generate_exception_end(ctx, EXCP_RI);
14893         return;
14894     }
14895
14896     t0 = tcg_temp_new();
14897     t1 = tcg_temp_new();
14898
14899     gen_base_offset_addr(ctx, t0, base, offset);
14900
14901     switch (opc) {
14902     case LWP:
14903         if (rd == base) {
14904             generate_exception_end(ctx, EXCP_RI);
14905             return;
14906         }
14907         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
14908         gen_store_gpr(t1, rd);
14909         tcg_gen_movi_tl(t1, 4);
14910         gen_op_addr_add(ctx, t0, t0, t1);
14911         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
14912         gen_store_gpr(t1, rd+1);
14913         break;
14914     case SWP:
14915         gen_load_gpr(t1, rd);
14916         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
14917         tcg_gen_movi_tl(t1, 4);
14918         gen_op_addr_add(ctx, t0, t0, t1);
14919         gen_load_gpr(t1, rd+1);
14920         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
14921         break;
14922 #ifdef TARGET_MIPS64
14923     case LDP:
14924         if (rd == base) {
14925             generate_exception_end(ctx, EXCP_RI);
14926             return;
14927         }
14928         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
14929         gen_store_gpr(t1, rd);
14930         tcg_gen_movi_tl(t1, 8);
14931         gen_op_addr_add(ctx, t0, t0, t1);
14932         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
14933         gen_store_gpr(t1, rd+1);
14934         break;
14935     case SDP:
14936         gen_load_gpr(t1, rd);
14937         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
14938         tcg_gen_movi_tl(t1, 8);
14939         gen_op_addr_add(ctx, t0, t0, t1);
14940         gen_load_gpr(t1, rd+1);
14941         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
14942         break;
14943 #endif
14944     }
14945     tcg_temp_free(t0);
14946     tcg_temp_free(t1);
14947 }
14948
14949 static void gen_sync(int stype)
14950 {
14951     TCGBar tcg_mo = TCG_BAR_SC;
14952
14953     switch (stype) {
14954     case 0x4: /* SYNC_WMB */
14955         tcg_mo |= TCG_MO_ST_ST;
14956         break;
14957     case 0x10: /* SYNC_MB */
14958         tcg_mo |= TCG_MO_ALL;
14959         break;
14960     case 0x11: /* SYNC_ACQUIRE */
14961         tcg_mo |= TCG_MO_LD_LD | TCG_MO_LD_ST;
14962         break;
14963     case 0x12: /* SYNC_RELEASE */
14964         tcg_mo |= TCG_MO_ST_ST | TCG_MO_LD_ST;
14965         break;
14966     case 0x13: /* SYNC_RMB */
14967         tcg_mo |= TCG_MO_LD_LD;
14968         break;
14969     default:
14970         tcg_mo |= TCG_MO_ALL;
14971         break;
14972     }
14973
14974     tcg_gen_mb(tcg_mo);
14975 }
14976
14977 static void gen_pool32axf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs)
14978 {
14979     int extension = (ctx->opcode >> 6) & 0x3f;
14980     int minor = (ctx->opcode >> 12) & 0xf;
14981     uint32_t mips32_op;
14982
14983     switch (extension) {
14984     case TEQ:
14985         mips32_op = OPC_TEQ;
14986         goto do_trap;
14987     case TGE:
14988         mips32_op = OPC_TGE;
14989         goto do_trap;
14990     case TGEU:
14991         mips32_op = OPC_TGEU;
14992         goto do_trap;
14993     case TLT:
14994         mips32_op = OPC_TLT;
14995         goto do_trap;
14996     case TLTU:
14997         mips32_op = OPC_TLTU;
14998         goto do_trap;
14999     case TNE:
15000         mips32_op = OPC_TNE;
15001     do_trap:
15002         gen_trap(ctx, mips32_op, rs, rt, -1);
15003         break;
15004 #ifndef CONFIG_USER_ONLY
15005     case MFC0:
15006     case MFC0 + 32:
15007         check_cp0_enabled(ctx);
15008         if (rt == 0) {
15009             /* Treat as NOP. */
15010             break;
15011         }
15012         gen_mfc0(ctx, cpu_gpr[rt], rs, (ctx->opcode >> 11) & 0x7);
15013         break;
15014     case MTC0:
15015     case MTC0 + 32:
15016         check_cp0_enabled(ctx);
15017         {
15018             TCGv t0 = tcg_temp_new();
15019
15020             gen_load_gpr(t0, rt);
15021             gen_mtc0(ctx, t0, rs, (ctx->opcode >> 11) & 0x7);
15022             tcg_temp_free(t0);
15023         }
15024         break;
15025 #endif
15026     case 0x2a:
15027         switch (minor & 3) {
15028         case MADD_ACC:
15029             gen_muldiv(ctx, OPC_MADD, (ctx->opcode >> 14) & 3, rs, rt);
15030             break;
15031         case MADDU_ACC:
15032             gen_muldiv(ctx, OPC_MADDU, (ctx->opcode >> 14) & 3, rs, rt);
15033             break;
15034         case MSUB_ACC:
15035             gen_muldiv(ctx, OPC_MSUB, (ctx->opcode >> 14) & 3, rs, rt);
15036             break;
15037         case MSUBU_ACC:
15038             gen_muldiv(ctx, OPC_MSUBU, (ctx->opcode >> 14) & 3, rs, rt);
15039             break;
15040         default:
15041             goto pool32axf_invalid;
15042         }
15043         break;
15044     case 0x32:
15045         switch (minor & 3) {
15046         case MULT_ACC:
15047             gen_muldiv(ctx, OPC_MULT, (ctx->opcode >> 14) & 3, rs, rt);
15048             break;
15049         case MULTU_ACC:
15050             gen_muldiv(ctx, OPC_MULTU, (ctx->opcode >> 14) & 3, rs, rt);
15051             break;
15052         default:
15053             goto pool32axf_invalid;
15054         }
15055         break;
15056     case 0x2c:
15057         switch (minor) {
15058         case BITSWAP:
15059             check_insn(ctx, ISA_MIPS32R6);
15060             gen_bitswap(ctx, OPC_BITSWAP, rs, rt);
15061             break;
15062         case SEB:
15063             gen_bshfl(ctx, OPC_SEB, rs, rt);
15064             break;
15065         case SEH:
15066             gen_bshfl(ctx, OPC_SEH, rs, rt);
15067             break;
15068         case CLO:
15069             mips32_op = OPC_CLO;
15070             goto do_cl;
15071         case CLZ:
15072             mips32_op = OPC_CLZ;
15073         do_cl:
15074             check_insn(ctx, ISA_MIPS32);
15075             gen_cl(ctx, mips32_op, rt, rs);
15076             break;
15077         case RDHWR:
15078             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15079             gen_rdhwr(ctx, rt, rs, 0);
15080             break;
15081         case WSBH:
15082             gen_bshfl(ctx, OPC_WSBH, rs, rt);
15083             break;
15084         case MULT:
15085             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15086             mips32_op = OPC_MULT;
15087             goto do_mul;
15088         case MULTU:
15089             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15090             mips32_op = OPC_MULTU;
15091             goto do_mul;
15092         case DIV:
15093             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15094             mips32_op = OPC_DIV;
15095             goto do_div;
15096         case DIVU:
15097             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15098             mips32_op = OPC_DIVU;
15099             goto do_div;
15100         do_div:
15101             check_insn(ctx, ISA_MIPS32);
15102             gen_muldiv(ctx, mips32_op, 0, rs, rt);
15103             break;
15104         case MADD:
15105             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15106             mips32_op = OPC_MADD;
15107             goto do_mul;
15108         case MADDU:
15109             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15110             mips32_op = OPC_MADDU;
15111             goto do_mul;
15112         case MSUB:
15113             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15114             mips32_op = OPC_MSUB;
15115             goto do_mul;
15116         case MSUBU:
15117             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15118             mips32_op = OPC_MSUBU;
15119         do_mul:
15120             check_insn(ctx, ISA_MIPS32);
15121             gen_muldiv(ctx, mips32_op, 0, rs, rt);
15122             break;
15123         default:
15124             goto pool32axf_invalid;
15125         }
15126         break;
15127     case 0x34:
15128         switch (minor) {
15129         case MFC2:
15130         case MTC2:
15131         case MFHC2:
15132         case MTHC2:
15133         case CFC2:
15134         case CTC2:
15135             generate_exception_err(ctx, EXCP_CpU, 2);
15136             break;
15137         default:
15138             goto pool32axf_invalid;
15139         }
15140         break;
15141     case 0x3c:
15142         switch (minor) {
15143         case JALR:    /* JALRC */
15144         case JALR_HB: /* JALRC_HB */
15145             if (ctx->insn_flags & ISA_MIPS32R6) {
15146                 /* JALRC, JALRC_HB */
15147                 gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 0);
15148             } else {
15149                 /* JALR, JALR_HB */
15150                 gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 4);
15151                 ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15152             }
15153             break;
15154         case JALRS:
15155         case JALRS_HB:
15156             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15157             gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 2);
15158             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15159             break;
15160         default:
15161             goto pool32axf_invalid;
15162         }
15163         break;
15164     case 0x05:
15165         switch (minor) {
15166         case RDPGPR:
15167             check_cp0_enabled(ctx);
15168             check_insn(ctx, ISA_MIPS32R2);
15169             gen_load_srsgpr(rs, rt);
15170             break;
15171         case WRPGPR:
15172             check_cp0_enabled(ctx);
15173             check_insn(ctx, ISA_MIPS32R2);
15174             gen_store_srsgpr(rs, rt);
15175             break;
15176         default:
15177             goto pool32axf_invalid;
15178         }
15179         break;
15180 #ifndef CONFIG_USER_ONLY
15181     case 0x0d:
15182         switch (minor) {
15183         case TLBP:
15184             mips32_op = OPC_TLBP;
15185             goto do_cp0;
15186         case TLBR:
15187             mips32_op = OPC_TLBR;
15188             goto do_cp0;
15189         case TLBWI:
15190             mips32_op = OPC_TLBWI;
15191             goto do_cp0;
15192         case TLBWR:
15193             mips32_op = OPC_TLBWR;
15194             goto do_cp0;
15195         case TLBINV:
15196             mips32_op = OPC_TLBINV;
15197             goto do_cp0;
15198         case TLBINVF:
15199             mips32_op = OPC_TLBINVF;
15200             goto do_cp0;
15201         case WAIT:
15202             mips32_op = OPC_WAIT;
15203             goto do_cp0;
15204         case DERET:
15205             mips32_op = OPC_DERET;
15206             goto do_cp0;
15207         case ERET:
15208             mips32_op = OPC_ERET;
15209         do_cp0:
15210             gen_cp0(env, ctx, mips32_op, rt, rs);
15211             break;
15212         default:
15213             goto pool32axf_invalid;
15214         }
15215         break;
15216     case 0x1d:
15217         switch (minor) {
15218         case DI:
15219             check_cp0_enabled(ctx);
15220             {
15221                 TCGv t0 = tcg_temp_new();
15222
15223                 save_cpu_state(ctx, 1);
15224                 gen_helper_di(t0, cpu_env);
15225                 gen_store_gpr(t0, rs);
15226                 /* Stop translation as we may have switched the execution mode */
15227                 ctx->base.is_jmp = DISAS_STOP;
15228                 tcg_temp_free(t0);
15229             }
15230             break;
15231         case EI:
15232             check_cp0_enabled(ctx);
15233             {
15234                 TCGv t0 = tcg_temp_new();
15235
15236                 save_cpu_state(ctx, 1);
15237                 gen_helper_ei(t0, cpu_env);
15238                 gen_store_gpr(t0, rs);
15239                 /* DISAS_STOP isn't sufficient, we need to ensure we break out
15240                    of translated code to check for pending interrupts.  */
15241                 gen_save_pc(ctx->base.pc_next + 4);
15242                 ctx->base.is_jmp = DISAS_EXIT;
15243                 tcg_temp_free(t0);
15244             }
15245             break;
15246         default:
15247             goto pool32axf_invalid;
15248         }
15249         break;
15250 #endif
15251     case 0x2d:
15252         switch (minor) {
15253         case SYNC:
15254             gen_sync(extract32(ctx->opcode, 16, 5));
15255             break;
15256         case SYSCALL:
15257             generate_exception_end(ctx, EXCP_SYSCALL);
15258             break;
15259         case SDBBP:
15260             if (is_uhi(extract32(ctx->opcode, 16, 10))) {
15261                 gen_helper_do_semihosting(cpu_env);
15262             } else {
15263                 check_insn(ctx, ISA_MIPS32);
15264                 if (ctx->hflags & MIPS_HFLAG_SBRI) {
15265                     generate_exception_end(ctx, EXCP_RI);
15266                 } else {
15267                     generate_exception_end(ctx, EXCP_DBp);
15268                 }
15269             }
15270             break;
15271         default:
15272             goto pool32axf_invalid;
15273         }
15274         break;
15275     case 0x01:
15276         switch (minor & 3) {
15277         case MFHI_ACC:
15278             gen_HILO(ctx, OPC_MFHI, minor >> 2, rs);
15279             break;
15280         case MFLO_ACC:
15281             gen_HILO(ctx, OPC_MFLO, minor >> 2, rs);
15282             break;
15283         case MTHI_ACC:
15284             gen_HILO(ctx, OPC_MTHI, minor >> 2, rs);
15285             break;
15286         case MTLO_ACC:
15287             gen_HILO(ctx, OPC_MTLO, minor >> 2, rs);
15288             break;
15289         default:
15290             goto pool32axf_invalid;
15291         }
15292         break;
15293     case 0x35:
15294         check_insn_opc_removed(ctx, ISA_MIPS32R6);
15295         switch (minor) {
15296         case MFHI32:
15297             gen_HILO(ctx, OPC_MFHI, 0, rs);
15298             break;
15299         case MFLO32:
15300             gen_HILO(ctx, OPC_MFLO, 0, rs);
15301             break;
15302         case MTHI32:
15303             gen_HILO(ctx, OPC_MTHI, 0, rs);
15304             break;
15305         case MTLO32:
15306             gen_HILO(ctx, OPC_MTLO, 0, rs);
15307             break;
15308         default:
15309             goto pool32axf_invalid;
15310         }
15311         break;
15312     default:
15313     pool32axf_invalid:
15314         MIPS_INVAL("pool32axf");
15315         generate_exception_end(ctx, EXCP_RI);
15316         break;
15317     }
15318 }
15319
15320 /* Values for microMIPS fmt field.  Variable-width, depending on which
15321    formats the instruction supports.  */
15322
15323 enum {
15324     FMT_SD_S = 0,
15325     FMT_SD_D = 1,
15326
15327     FMT_SDPS_S = 0,
15328     FMT_SDPS_D = 1,
15329     FMT_SDPS_PS = 2,
15330
15331     FMT_SWL_S = 0,
15332     FMT_SWL_W = 1,
15333     FMT_SWL_L = 2,
15334
15335     FMT_DWL_D = 0,
15336     FMT_DWL_W = 1,
15337     FMT_DWL_L = 2
15338 };
15339
15340 static void gen_pool32fxf(DisasContext *ctx, int rt, int rs)
15341 {
15342     int extension = (ctx->opcode >> 6) & 0x3ff;
15343     uint32_t mips32_op;
15344
15345 #define FLOAT_1BIT_FMT(opc, fmt) (fmt << 8) | opc
15346 #define FLOAT_2BIT_FMT(opc, fmt) (fmt << 7) | opc
15347 #define COND_FLOAT_MOV(opc, cond) (cond << 7) | opc
15348
15349     switch (extension) {
15350     case FLOAT_1BIT_FMT(CFC1, 0):
15351         mips32_op = OPC_CFC1;
15352         goto do_cp1;
15353     case FLOAT_1BIT_FMT(CTC1, 0):
15354         mips32_op = OPC_CTC1;
15355         goto do_cp1;
15356     case FLOAT_1BIT_FMT(MFC1, 0):
15357         mips32_op = OPC_MFC1;
15358         goto do_cp1;
15359     case FLOAT_1BIT_FMT(MTC1, 0):
15360         mips32_op = OPC_MTC1;
15361         goto do_cp1;
15362     case FLOAT_1BIT_FMT(MFHC1, 0):
15363         mips32_op = OPC_MFHC1;
15364         goto do_cp1;
15365     case FLOAT_1BIT_FMT(MTHC1, 0):
15366         mips32_op = OPC_MTHC1;
15367     do_cp1:
15368         gen_cp1(ctx, mips32_op, rt, rs);
15369         break;
15370
15371         /* Reciprocal square root */
15372     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_S):
15373         mips32_op = OPC_RSQRT_S;
15374         goto do_unaryfp;
15375     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_D):
15376         mips32_op = OPC_RSQRT_D;
15377         goto do_unaryfp;
15378
15379         /* Square root */
15380     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_S):
15381         mips32_op = OPC_SQRT_S;
15382         goto do_unaryfp;
15383     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_D):
15384         mips32_op = OPC_SQRT_D;
15385         goto do_unaryfp;
15386
15387         /* Reciprocal */
15388     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_S):
15389         mips32_op = OPC_RECIP_S;
15390         goto do_unaryfp;
15391     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_D):
15392         mips32_op = OPC_RECIP_D;
15393         goto do_unaryfp;
15394
15395         /* Floor */
15396     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_S):
15397         mips32_op = OPC_FLOOR_L_S;
15398         goto do_unaryfp;
15399     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_D):
15400         mips32_op = OPC_FLOOR_L_D;
15401         goto do_unaryfp;
15402     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_S):
15403         mips32_op = OPC_FLOOR_W_S;
15404         goto do_unaryfp;
15405     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_D):
15406         mips32_op = OPC_FLOOR_W_D;
15407         goto do_unaryfp;
15408
15409         /* Ceiling */
15410     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_S):
15411         mips32_op = OPC_CEIL_L_S;
15412         goto do_unaryfp;
15413     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_D):
15414         mips32_op = OPC_CEIL_L_D;
15415         goto do_unaryfp;
15416     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_S):
15417         mips32_op = OPC_CEIL_W_S;
15418         goto do_unaryfp;
15419     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_D):
15420         mips32_op = OPC_CEIL_W_D;
15421         goto do_unaryfp;
15422
15423         /* Truncation */
15424     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_S):
15425         mips32_op = OPC_TRUNC_L_S;
15426         goto do_unaryfp;
15427     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_D):
15428         mips32_op = OPC_TRUNC_L_D;
15429         goto do_unaryfp;
15430     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_S):
15431         mips32_op = OPC_TRUNC_W_S;
15432         goto do_unaryfp;
15433     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_D):
15434         mips32_op = OPC_TRUNC_W_D;
15435         goto do_unaryfp;
15436
15437         /* Round */
15438     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_S):
15439         mips32_op = OPC_ROUND_L_S;
15440         goto do_unaryfp;
15441     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_D):
15442         mips32_op = OPC_ROUND_L_D;
15443         goto do_unaryfp;
15444     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_S):
15445         mips32_op = OPC_ROUND_W_S;
15446         goto do_unaryfp;
15447     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_D):
15448         mips32_op = OPC_ROUND_W_D;
15449         goto do_unaryfp;
15450
15451         /* Integer to floating-point conversion */
15452     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_S):
15453         mips32_op = OPC_CVT_L_S;
15454         goto do_unaryfp;
15455     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_D):
15456         mips32_op = OPC_CVT_L_D;
15457         goto do_unaryfp;
15458     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_S):
15459         mips32_op = OPC_CVT_W_S;
15460         goto do_unaryfp;
15461     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_D):
15462         mips32_op = OPC_CVT_W_D;
15463         goto do_unaryfp;
15464
15465         /* Paired-foo conversions */
15466     case FLOAT_1BIT_FMT(CVT_S_PL, 0):
15467         mips32_op = OPC_CVT_S_PL;
15468         goto do_unaryfp;
15469     case FLOAT_1BIT_FMT(CVT_S_PU, 0):
15470         mips32_op = OPC_CVT_S_PU;
15471         goto do_unaryfp;
15472     case FLOAT_1BIT_FMT(CVT_PW_PS, 0):
15473         mips32_op = OPC_CVT_PW_PS;
15474         goto do_unaryfp;
15475     case FLOAT_1BIT_FMT(CVT_PS_PW, 0):
15476         mips32_op = OPC_CVT_PS_PW;
15477         goto do_unaryfp;
15478
15479         /* Floating-point moves */
15480     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_S):
15481         mips32_op = OPC_MOV_S;
15482         goto do_unaryfp;
15483     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_D):
15484         mips32_op = OPC_MOV_D;
15485         goto do_unaryfp;
15486     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_PS):
15487         mips32_op = OPC_MOV_PS;
15488         goto do_unaryfp;
15489
15490         /* Absolute value */
15491     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_S):
15492         mips32_op = OPC_ABS_S;
15493         goto do_unaryfp;
15494     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_D):
15495         mips32_op = OPC_ABS_D;
15496         goto do_unaryfp;
15497     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_PS):
15498         mips32_op = OPC_ABS_PS;
15499         goto do_unaryfp;
15500
15501         /* Negation */
15502     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_S):
15503         mips32_op = OPC_NEG_S;
15504         goto do_unaryfp;
15505     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_D):
15506         mips32_op = OPC_NEG_D;
15507         goto do_unaryfp;
15508     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_PS):
15509         mips32_op = OPC_NEG_PS;
15510         goto do_unaryfp;
15511
15512         /* Reciprocal square root step */
15513     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_S):
15514         mips32_op = OPC_RSQRT1_S;
15515         goto do_unaryfp;
15516     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_D):
15517         mips32_op = OPC_RSQRT1_D;
15518         goto do_unaryfp;
15519     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_PS):
15520         mips32_op = OPC_RSQRT1_PS;
15521         goto do_unaryfp;
15522
15523         /* Reciprocal step */
15524     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_S):
15525         mips32_op = OPC_RECIP1_S;
15526         goto do_unaryfp;
15527     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_D):
15528         mips32_op = OPC_RECIP1_S;
15529         goto do_unaryfp;
15530     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_PS):
15531         mips32_op = OPC_RECIP1_PS;
15532         goto do_unaryfp;
15533
15534         /* Conversions from double */
15535     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_S):
15536         mips32_op = OPC_CVT_D_S;
15537         goto do_unaryfp;
15538     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_W):
15539         mips32_op = OPC_CVT_D_W;
15540         goto do_unaryfp;
15541     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_L):
15542         mips32_op = OPC_CVT_D_L;
15543         goto do_unaryfp;
15544
15545         /* Conversions from single */
15546     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_D):
15547         mips32_op = OPC_CVT_S_D;
15548         goto do_unaryfp;
15549     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_W):
15550         mips32_op = OPC_CVT_S_W;
15551         goto do_unaryfp;
15552     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_L):
15553         mips32_op = OPC_CVT_S_L;
15554     do_unaryfp:
15555         gen_farith(ctx, mips32_op, -1, rs, rt, 0);
15556         break;
15557
15558         /* Conditional moves on floating-point codes */
15559     case COND_FLOAT_MOV(MOVT, 0):
15560     case COND_FLOAT_MOV(MOVT, 1):
15561     case COND_FLOAT_MOV(MOVT, 2):
15562     case COND_FLOAT_MOV(MOVT, 3):
15563     case COND_FLOAT_MOV(MOVT, 4):
15564     case COND_FLOAT_MOV(MOVT, 5):
15565     case COND_FLOAT_MOV(MOVT, 6):
15566     case COND_FLOAT_MOV(MOVT, 7):
15567         check_insn_opc_removed(ctx, ISA_MIPS32R6);
15568         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 1);
15569         break;
15570     case COND_FLOAT_MOV(MOVF, 0):
15571     case COND_FLOAT_MOV(MOVF, 1):
15572     case COND_FLOAT_MOV(MOVF, 2):
15573     case COND_FLOAT_MOV(MOVF, 3):
15574     case COND_FLOAT_MOV(MOVF, 4):
15575     case COND_FLOAT_MOV(MOVF, 5):
15576     case COND_FLOAT_MOV(MOVF, 6):
15577     case COND_FLOAT_MOV(MOVF, 7):
15578         check_insn_opc_removed(ctx, ISA_MIPS32R6);
15579         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 0);
15580         break;
15581     default:
15582         MIPS_INVAL("pool32fxf");
15583         generate_exception_end(ctx, EXCP_RI);
15584         break;
15585     }
15586 }
15587
15588 static void decode_micromips32_opc(CPUMIPSState *env, DisasContext *ctx)
15589 {
15590     int32_t offset;
15591     uint16_t insn;
15592     int rt, rs, rd, rr;
15593     int16_t imm;
15594     uint32_t op, minor, minor2, mips32_op;
15595     uint32_t cond, fmt, cc;
15596
15597     insn = cpu_lduw_code(env, ctx->base.pc_next + 2);
15598     ctx->opcode = (ctx->opcode << 16) | insn;
15599
15600     rt = (ctx->opcode >> 21) & 0x1f;
15601     rs = (ctx->opcode >> 16) & 0x1f;
15602     rd = (ctx->opcode >> 11) & 0x1f;
15603     rr = (ctx->opcode >> 6) & 0x1f;
15604     imm = (int16_t) ctx->opcode;
15605
15606     op = (ctx->opcode >> 26) & 0x3f;
15607     switch (op) {
15608     case POOL32A:
15609         minor = ctx->opcode & 0x3f;
15610         switch (minor) {
15611         case 0x00:
15612             minor = (ctx->opcode >> 6) & 0xf;
15613             switch (minor) {
15614             case SLL32:
15615                 mips32_op = OPC_SLL;
15616                 goto do_shifti;
15617             case SRA:
15618                 mips32_op = OPC_SRA;
15619                 goto do_shifti;
15620             case SRL32:
15621                 mips32_op = OPC_SRL;
15622                 goto do_shifti;
15623             case ROTR:
15624                 mips32_op = OPC_ROTR;
15625             do_shifti:
15626                 gen_shift_imm(ctx, mips32_op, rt, rs, rd);
15627                 break;
15628             case SELEQZ:
15629                 check_insn(ctx, ISA_MIPS32R6);
15630                 gen_cond_move(ctx, OPC_SELEQZ, rd, rs, rt);
15631                 break;
15632             case SELNEZ:
15633                 check_insn(ctx, ISA_MIPS32R6);
15634                 gen_cond_move(ctx, OPC_SELNEZ, rd, rs, rt);
15635                 break;
15636             case R6_RDHWR:
15637                 check_insn(ctx, ISA_MIPS32R6);
15638                 gen_rdhwr(ctx, rt, rs, extract32(ctx->opcode, 11, 3));
15639                 break;
15640             default:
15641                 goto pool32a_invalid;
15642             }
15643             break;
15644         case 0x10:
15645             minor = (ctx->opcode >> 6) & 0xf;
15646             switch (minor) {
15647                 /* Arithmetic */
15648             case ADD:
15649                 mips32_op = OPC_ADD;
15650                 goto do_arith;
15651             case ADDU32:
15652                 mips32_op = OPC_ADDU;
15653                 goto do_arith;
15654             case SUB:
15655                 mips32_op = OPC_SUB;
15656                 goto do_arith;
15657             case SUBU32:
15658                 mips32_op = OPC_SUBU;
15659                 goto do_arith;
15660             case MUL:
15661                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15662                 mips32_op = OPC_MUL;
15663             do_arith:
15664                 gen_arith(ctx, mips32_op, rd, rs, rt);
15665                 break;
15666                 /* Shifts */
15667             case SLLV:
15668                 mips32_op = OPC_SLLV;
15669                 goto do_shift;
15670             case SRLV:
15671                 mips32_op = OPC_SRLV;
15672                 goto do_shift;
15673             case SRAV:
15674                 mips32_op = OPC_SRAV;
15675                 goto do_shift;
15676             case ROTRV:
15677                 mips32_op = OPC_ROTRV;
15678             do_shift:
15679                 gen_shift(ctx, mips32_op, rd, rs, rt);
15680                 break;
15681                 /* Logical operations */
15682             case AND:
15683                 mips32_op = OPC_AND;
15684                 goto do_logic;
15685             case OR32:
15686                 mips32_op = OPC_OR;
15687                 goto do_logic;
15688             case NOR:
15689                 mips32_op = OPC_NOR;
15690                 goto do_logic;
15691             case XOR32:
15692                 mips32_op = OPC_XOR;
15693             do_logic:
15694                 gen_logic(ctx, mips32_op, rd, rs, rt);
15695                 break;
15696                 /* Set less than */
15697             case SLT:
15698                 mips32_op = OPC_SLT;
15699                 goto do_slt;
15700             case SLTU:
15701                 mips32_op = OPC_SLTU;
15702             do_slt:
15703                 gen_slt(ctx, mips32_op, rd, rs, rt);
15704                 break;
15705             default:
15706                 goto pool32a_invalid;
15707             }
15708             break;
15709         case 0x18:
15710             minor = (ctx->opcode >> 6) & 0xf;
15711             switch (minor) {
15712                 /* Conditional moves */
15713             case MOVN: /* MUL */
15714                 if (ctx->insn_flags & ISA_MIPS32R6) {
15715                     /* MUL */
15716                     gen_r6_muldiv(ctx, R6_OPC_MUL, rd, rs, rt);
15717                 } else {
15718                     /* MOVN */
15719                     gen_cond_move(ctx, OPC_MOVN, rd, rs, rt);
15720                 }
15721                 break;
15722             case MOVZ: /* MUH */
15723                 if (ctx->insn_flags & ISA_MIPS32R6) {
15724                     /* MUH */
15725                     gen_r6_muldiv(ctx, R6_OPC_MUH, rd, rs, rt);
15726                 } else {
15727                     /* MOVZ */
15728                     gen_cond_move(ctx, OPC_MOVZ, rd, rs, rt);
15729                 }
15730                 break;
15731             case MULU:
15732                 check_insn(ctx, ISA_MIPS32R6);
15733                 gen_r6_muldiv(ctx, R6_OPC_MULU, rd, rs, rt);
15734                 break;
15735             case MUHU:
15736                 check_insn(ctx, ISA_MIPS32R6);
15737                 gen_r6_muldiv(ctx, R6_OPC_MUHU, rd, rs, rt);
15738                 break;
15739             case LWXS: /* DIV */
15740                 if (ctx->insn_flags & ISA_MIPS32R6) {
15741                     /* DIV */
15742                     gen_r6_muldiv(ctx, R6_OPC_DIV, rd, rs, rt);
15743                 } else {
15744                     /* LWXS */
15745                     gen_ldxs(ctx, rs, rt, rd);
15746                 }
15747                 break;
15748             case MOD:
15749                 check_insn(ctx, ISA_MIPS32R6);
15750                 gen_r6_muldiv(ctx, R6_OPC_MOD, rd, rs, rt);
15751                 break;
15752             case R6_DIVU:
15753                 check_insn(ctx, ISA_MIPS32R6);
15754                 gen_r6_muldiv(ctx, R6_OPC_DIVU, rd, rs, rt);
15755                 break;
15756             case MODU:
15757                 check_insn(ctx, ISA_MIPS32R6);
15758                 gen_r6_muldiv(ctx, R6_OPC_MODU, rd, rs, rt);
15759                 break;
15760             default:
15761                 goto pool32a_invalid;
15762             }
15763             break;
15764         case INS:
15765             gen_bitops(ctx, OPC_INS, rt, rs, rr, rd);
15766             return;
15767         case LSA:
15768             check_insn(ctx, ISA_MIPS32R6);
15769             gen_lsa(ctx, OPC_LSA, rd, rs, rt,
15770                     extract32(ctx->opcode, 9, 2));
15771             break;
15772         case ALIGN:
15773             check_insn(ctx, ISA_MIPS32R6);
15774             gen_align(ctx, 32, rd, rs, rt, extract32(ctx->opcode, 9, 2));
15775             break;
15776         case EXT:
15777             gen_bitops(ctx, OPC_EXT, rt, rs, rr, rd);
15778             return;
15779         case POOL32AXF:
15780             gen_pool32axf(env, ctx, rt, rs);
15781             break;
15782         case BREAK32:
15783             generate_exception_end(ctx, EXCP_BREAK);
15784             break;
15785         case SIGRIE:
15786             check_insn(ctx, ISA_MIPS32R6);
15787             generate_exception_end(ctx, EXCP_RI);
15788             break;
15789         default:
15790         pool32a_invalid:
15791                 MIPS_INVAL("pool32a");
15792                 generate_exception_end(ctx, EXCP_RI);
15793                 break;
15794         }
15795         break;
15796     case POOL32B:
15797         minor = (ctx->opcode >> 12) & 0xf;
15798         switch (minor) {
15799         case CACHE:
15800             check_cp0_enabled(ctx);
15801             if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
15802                 gen_cache_operation(ctx, rt, rs, imm);
15803             }
15804             break;
15805         case LWC2:
15806         case SWC2:
15807             /* COP2: Not implemented. */
15808             generate_exception_err(ctx, EXCP_CpU, 2);
15809             break;
15810 #ifdef TARGET_MIPS64
15811         case LDP:
15812         case SDP:
15813             check_insn(ctx, ISA_MIPS3);
15814             check_mips_64(ctx);
15815 #endif
15816             /* fall through */
15817         case LWP:
15818         case SWP:
15819             gen_ldst_pair(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
15820             break;
15821 #ifdef TARGET_MIPS64
15822         case LDM:
15823         case SDM:
15824             check_insn(ctx, ISA_MIPS3);
15825             check_mips_64(ctx);
15826 #endif
15827             /* fall through */
15828         case LWM32:
15829         case SWM32:
15830             gen_ldst_multiple(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
15831             break;
15832         default:
15833             MIPS_INVAL("pool32b");
15834             generate_exception_end(ctx, EXCP_RI);
15835             break;
15836         }
15837         break;
15838     case POOL32F:
15839         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
15840             minor = ctx->opcode & 0x3f;
15841             check_cp1_enabled(ctx);
15842             switch (minor) {
15843             case ALNV_PS:
15844                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15845                 mips32_op = OPC_ALNV_PS;
15846                 goto do_madd;
15847             case MADD_S:
15848                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15849                 mips32_op = OPC_MADD_S;
15850                 goto do_madd;
15851             case MADD_D:
15852                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15853                 mips32_op = OPC_MADD_D;
15854                 goto do_madd;
15855             case MADD_PS:
15856                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15857                 mips32_op = OPC_MADD_PS;
15858                 goto do_madd;
15859             case MSUB_S:
15860                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15861                 mips32_op = OPC_MSUB_S;
15862                 goto do_madd;
15863             case MSUB_D:
15864                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15865                 mips32_op = OPC_MSUB_D;
15866                 goto do_madd;
15867             case MSUB_PS:
15868                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15869                 mips32_op = OPC_MSUB_PS;
15870                 goto do_madd;
15871             case NMADD_S:
15872                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15873                 mips32_op = OPC_NMADD_S;
15874                 goto do_madd;
15875             case NMADD_D:
15876                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15877                 mips32_op = OPC_NMADD_D;
15878                 goto do_madd;
15879             case NMADD_PS:
15880                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15881                 mips32_op = OPC_NMADD_PS;
15882                 goto do_madd;
15883             case NMSUB_S:
15884                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15885                 mips32_op = OPC_NMSUB_S;
15886                 goto do_madd;
15887             case NMSUB_D:
15888                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15889                 mips32_op = OPC_NMSUB_D;
15890                 goto do_madd;
15891             case NMSUB_PS:
15892                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15893                 mips32_op = OPC_NMSUB_PS;
15894             do_madd:
15895                 gen_flt3_arith(ctx, mips32_op, rd, rr, rs, rt);
15896                 break;
15897             case CABS_COND_FMT:
15898                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15899                 cond = (ctx->opcode >> 6) & 0xf;
15900                 cc = (ctx->opcode >> 13) & 0x7;
15901                 fmt = (ctx->opcode >> 10) & 0x3;
15902                 switch (fmt) {
15903                 case 0x0:
15904                     gen_cmpabs_s(ctx, cond, rt, rs, cc);
15905                     break;
15906                 case 0x1:
15907                     gen_cmpabs_d(ctx, cond, rt, rs, cc);
15908                     break;
15909                 case 0x2:
15910                     gen_cmpabs_ps(ctx, cond, rt, rs, cc);
15911                     break;
15912                 default:
15913                     goto pool32f_invalid;
15914                 }
15915                 break;
15916             case C_COND_FMT:
15917                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15918                 cond = (ctx->opcode >> 6) & 0xf;
15919                 cc = (ctx->opcode >> 13) & 0x7;
15920                 fmt = (ctx->opcode >> 10) & 0x3;
15921                 switch (fmt) {
15922                 case 0x0:
15923                     gen_cmp_s(ctx, cond, rt, rs, cc);
15924                     break;
15925                 case 0x1:
15926                     gen_cmp_d(ctx, cond, rt, rs, cc);
15927                     break;
15928                 case 0x2:
15929                     gen_cmp_ps(ctx, cond, rt, rs, cc);
15930                     break;
15931                 default:
15932                     goto pool32f_invalid;
15933                 }
15934                 break;
15935             case CMP_CONDN_S:
15936                 check_insn(ctx, ISA_MIPS32R6);
15937                 gen_r6_cmp_s(ctx, (ctx->opcode >> 6) & 0x1f, rt, rs, rd);
15938                 break;
15939             case CMP_CONDN_D:
15940                 check_insn(ctx, ISA_MIPS32R6);
15941                 gen_r6_cmp_d(ctx, (ctx->opcode >> 6) & 0x1f, rt, rs, rd);
15942                 break;
15943             case POOL32FXF:
15944                 gen_pool32fxf(ctx, rt, rs);
15945                 break;
15946             case 0x00:
15947                 /* PLL foo */
15948                 switch ((ctx->opcode >> 6) & 0x7) {
15949                 case PLL_PS:
15950                     mips32_op = OPC_PLL_PS;
15951                     goto do_ps;
15952                 case PLU_PS:
15953                     mips32_op = OPC_PLU_PS;
15954                     goto do_ps;
15955                 case PUL_PS:
15956                     mips32_op = OPC_PUL_PS;
15957                     goto do_ps;
15958                 case PUU_PS:
15959                     mips32_op = OPC_PUU_PS;
15960                     goto do_ps;
15961                 case CVT_PS_S:
15962                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15963                     mips32_op = OPC_CVT_PS_S;
15964                 do_ps:
15965                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
15966                     break;
15967                 default:
15968                     goto pool32f_invalid;
15969                 }
15970                 break;
15971             case MIN_FMT:
15972                 check_insn(ctx, ISA_MIPS32R6);
15973                 switch ((ctx->opcode >> 9) & 0x3) {
15974                 case FMT_SDPS_S:
15975                     gen_farith(ctx, OPC_MIN_S, rt, rs, rd, 0);
15976                     break;
15977                 case FMT_SDPS_D:
15978                     gen_farith(ctx, OPC_MIN_D, rt, rs, rd, 0);
15979                     break;
15980                 default:
15981                     goto pool32f_invalid;
15982                 }
15983                 break;
15984             case 0x08:
15985                 /* [LS][WDU]XC1 */
15986                 switch ((ctx->opcode >> 6) & 0x7) {
15987                 case LWXC1:
15988                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15989                     mips32_op = OPC_LWXC1;
15990                     goto do_ldst_cp1;
15991                 case SWXC1:
15992                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15993                     mips32_op = OPC_SWXC1;
15994                     goto do_ldst_cp1;
15995                 case LDXC1:
15996                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15997                     mips32_op = OPC_LDXC1;
15998                     goto do_ldst_cp1;
15999                 case SDXC1:
16000                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
16001                     mips32_op = OPC_SDXC1;
16002                     goto do_ldst_cp1;
16003                 case LUXC1:
16004                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
16005                     mips32_op = OPC_LUXC1;
16006                     goto do_ldst_cp1;
16007                 case SUXC1:
16008                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
16009                     mips32_op = OPC_SUXC1;
16010                 do_ldst_cp1:
16011                     gen_flt3_ldst(ctx, mips32_op, rd, rd, rt, rs);
16012                     break;
16013                 default:
16014                     goto pool32f_invalid;
16015                 }
16016                 break;
16017             case MAX_FMT:
16018                 check_insn(ctx, ISA_MIPS32R6);
16019                 switch ((ctx->opcode >> 9) & 0x3) {
16020                 case FMT_SDPS_S:
16021                     gen_farith(ctx, OPC_MAX_S, rt, rs, rd, 0);
16022                     break;
16023                 case FMT_SDPS_D:
16024                     gen_farith(ctx, OPC_MAX_D, rt, rs, rd, 0);
16025                     break;
16026                 default:
16027                     goto pool32f_invalid;
16028                 }
16029                 break;
16030             case 0x18:
16031                 /* 3D insns */
16032                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
16033                 fmt = (ctx->opcode >> 9) & 0x3;
16034                 switch ((ctx->opcode >> 6) & 0x7) {
16035                 case RSQRT2_FMT:
16036                     switch (fmt) {
16037                     case FMT_SDPS_S:
16038                         mips32_op = OPC_RSQRT2_S;
16039                         goto do_3d;
16040                     case FMT_SDPS_D:
16041                         mips32_op = OPC_RSQRT2_D;
16042                         goto do_3d;
16043                     case FMT_SDPS_PS:
16044                         mips32_op = OPC_RSQRT2_PS;
16045                         goto do_3d;
16046                     default:
16047                         goto pool32f_invalid;
16048                     }
16049                     break;
16050                 case RECIP2_FMT:
16051                     switch (fmt) {
16052                     case FMT_SDPS_S:
16053                         mips32_op = OPC_RECIP2_S;
16054                         goto do_3d;
16055                     case FMT_SDPS_D:
16056                         mips32_op = OPC_RECIP2_D;
16057                         goto do_3d;
16058                     case FMT_SDPS_PS:
16059                         mips32_op = OPC_RECIP2_PS;
16060                         goto do_3d;
16061                     default:
16062                         goto pool32f_invalid;
16063                     }
16064                     break;
16065                 case ADDR_PS:
16066                     mips32_op = OPC_ADDR_PS;
16067                     goto do_3d;
16068                 case MULR_PS:
16069                     mips32_op = OPC_MULR_PS;
16070                 do_3d:
16071                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
16072                     break;
16073                 default:
16074                     goto pool32f_invalid;
16075                 }
16076                 break;
16077             case 0x20:
16078                 /* MOV[FT].fmt, PREFX, RINT.fmt, CLASS.fmt*/
16079                 cc = (ctx->opcode >> 13) & 0x7;
16080                 fmt = (ctx->opcode >> 9) & 0x3;
16081                 switch ((ctx->opcode >> 6) & 0x7) {
16082                 case MOVF_FMT: /* RINT_FMT */
16083                     if (ctx->insn_flags & ISA_MIPS32R6) {
16084                         /* RINT_FMT */
16085                         switch (fmt) {
16086                         case FMT_SDPS_S:
16087                             gen_farith(ctx, OPC_RINT_S, 0, rt, rs, 0);
16088                             break;
16089                         case FMT_SDPS_D:
16090                             gen_farith(ctx, OPC_RINT_D, 0, rt, rs, 0);
16091                             break;
16092                         default:
16093                             goto pool32f_invalid;
16094                         }
16095                     } else {
16096                         /* MOVF_FMT */
16097                         switch (fmt) {
16098                         case FMT_SDPS_S:
16099                             gen_movcf_s(ctx, rs, rt, cc, 0);
16100                             break;
16101                         case FMT_SDPS_D:
16102                             gen_movcf_d(ctx, rs, rt, cc, 0);
16103                             break;
16104                         case FMT_SDPS_PS:
16105                             check_ps(ctx);
16106                             gen_movcf_ps(ctx, rs, rt, cc, 0);
16107                             break;
16108                         default:
16109                             goto pool32f_invalid;
16110                         }
16111                     }
16112                     break;
16113                 case MOVT_FMT: /* CLASS_FMT */
16114                     if (ctx->insn_flags & ISA_MIPS32R6) {
16115                         /* CLASS_FMT */
16116                         switch (fmt) {
16117                         case FMT_SDPS_S:
16118                             gen_farith(ctx, OPC_CLASS_S, 0, rt, rs, 0);
16119                             break;
16120                         case FMT_SDPS_D:
16121                             gen_farith(ctx, OPC_CLASS_D, 0, rt, rs, 0);
16122                             break;
16123                         default:
16124                             goto pool32f_invalid;
16125                         }
16126                     } else {
16127                         /* MOVT_FMT */
16128                         switch (fmt) {
16129                         case FMT_SDPS_S:
16130                             gen_movcf_s(ctx, rs, rt, cc, 1);
16131                             break;
16132                         case FMT_SDPS_D:
16133                             gen_movcf_d(ctx, rs, rt, cc, 1);
16134                             break;
16135                         case FMT_SDPS_PS:
16136                             check_ps(ctx);
16137                             gen_movcf_ps(ctx, rs, rt, cc, 1);
16138                             break;
16139                         default:
16140                             goto pool32f_invalid;
16141                         }
16142                     }
16143                     break;
16144                 case PREFX:
16145                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
16146                     break;
16147                 default:
16148                     goto pool32f_invalid;
16149                 }
16150                 break;
16151 #define FINSN_3ARG_SDPS(prfx)                           \
16152                 switch ((ctx->opcode >> 8) & 0x3) {     \
16153                 case FMT_SDPS_S:                        \
16154                     mips32_op = OPC_##prfx##_S;         \
16155                     goto do_fpop;                       \
16156                 case FMT_SDPS_D:                        \
16157                     mips32_op = OPC_##prfx##_D;         \
16158                     goto do_fpop;                       \
16159                 case FMT_SDPS_PS:                       \
16160                     check_ps(ctx);                      \
16161                     mips32_op = OPC_##prfx##_PS;        \
16162                     goto do_fpop;                       \
16163                 default:                                \
16164                     goto pool32f_invalid;               \
16165                 }
16166             case MINA_FMT:
16167                 check_insn(ctx, ISA_MIPS32R6);
16168                 switch ((ctx->opcode >> 9) & 0x3) {
16169                 case FMT_SDPS_S:
16170                     gen_farith(ctx, OPC_MINA_S, rt, rs, rd, 0);
16171                     break;
16172                 case FMT_SDPS_D:
16173                     gen_farith(ctx, OPC_MINA_D, rt, rs, rd, 0);
16174                     break;
16175                 default:
16176                     goto pool32f_invalid;
16177                 }
16178                 break;
16179             case MAXA_FMT:
16180                 check_insn(ctx, ISA_MIPS32R6);
16181                 switch ((ctx->opcode >> 9) & 0x3) {
16182                 case FMT_SDPS_S:
16183                     gen_farith(ctx, OPC_MAXA_S, rt, rs, rd, 0);
16184                     break;
16185                 case FMT_SDPS_D:
16186                     gen_farith(ctx, OPC_MAXA_D, rt, rs, rd, 0);
16187                     break;
16188                 default:
16189                     goto pool32f_invalid;
16190                 }
16191                 break;
16192             case 0x30:
16193                 /* regular FP ops */
16194                 switch ((ctx->opcode >> 6) & 0x3) {
16195                 case ADD_FMT:
16196                     FINSN_3ARG_SDPS(ADD);
16197                     break;
16198                 case SUB_FMT:
16199                     FINSN_3ARG_SDPS(SUB);
16200                     break;
16201                 case MUL_FMT:
16202                     FINSN_3ARG_SDPS(MUL);
16203                     break;
16204                 case DIV_FMT:
16205                     fmt = (ctx->opcode >> 8) & 0x3;
16206                     if (fmt == 1) {
16207                         mips32_op = OPC_DIV_D;
16208                     } else if (fmt == 0) {
16209                         mips32_op = OPC_DIV_S;
16210                     } else {
16211                         goto pool32f_invalid;
16212                     }
16213                     goto do_fpop;
16214                 default:
16215                     goto pool32f_invalid;
16216                 }
16217                 break;
16218             case 0x38:
16219                 /* cmovs */
16220                 switch ((ctx->opcode >> 6) & 0x7) {
16221                 case MOVN_FMT: /* SELEQZ_FMT */
16222                     if (ctx->insn_flags & ISA_MIPS32R6) {
16223                         /* SELEQZ_FMT */
16224                         switch ((ctx->opcode >> 9) & 0x3) {
16225                         case FMT_SDPS_S:
16226                             gen_sel_s(ctx, OPC_SELEQZ_S, rd, rt, rs);
16227                             break;
16228                         case FMT_SDPS_D:
16229                             gen_sel_d(ctx, OPC_SELEQZ_D, rd, rt, rs);
16230                             break;
16231                         default:
16232                             goto pool32f_invalid;
16233                         }
16234                     } else {
16235                         /* MOVN_FMT */
16236                         FINSN_3ARG_SDPS(MOVN);
16237                     }
16238                     break;
16239                 case MOVN_FMT_04:
16240                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
16241                     FINSN_3ARG_SDPS(MOVN);
16242                     break;
16243                 case MOVZ_FMT: /* SELNEZ_FMT */
16244                     if (ctx->insn_flags & ISA_MIPS32R6) {
16245                         /* SELNEZ_FMT */
16246                         switch ((ctx->opcode >> 9) & 0x3) {
16247                         case FMT_SDPS_S:
16248                             gen_sel_s(ctx, OPC_SELNEZ_S, rd, rt, rs);
16249                             break;
16250                         case FMT_SDPS_D:
16251                             gen_sel_d(ctx, OPC_SELNEZ_D, rd, rt, rs);
16252                             break;
16253                         default:
16254                             goto pool32f_invalid;
16255                         }
16256                     } else {
16257                         /* MOVZ_FMT */
16258                         FINSN_3ARG_SDPS(MOVZ);
16259                     }
16260                     break;
16261                 case MOVZ_FMT_05:
16262                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
16263                     FINSN_3ARG_SDPS(MOVZ);
16264                     break;
16265                 case SEL_FMT:
16266                     check_insn(ctx, ISA_MIPS32R6);
16267                     switch ((ctx->opcode >> 9) & 0x3) {
16268                     case FMT_SDPS_S:
16269                         gen_sel_s(ctx, OPC_SEL_S, rd, rt, rs);
16270                         break;
16271                     case FMT_SDPS_D:
16272                         gen_sel_d(ctx, OPC_SEL_D, rd, rt, rs);
16273                         break;
16274                     default:
16275                         goto pool32f_invalid;
16276                     }
16277                     break;
16278                 case MADDF_FMT:
16279                     check_insn(ctx, ISA_MIPS32R6);
16280                     switch ((ctx->opcode >> 9) & 0x3) {
16281                     case FMT_SDPS_S:
16282                         mips32_op = OPC_MADDF_S;
16283                         goto do_fpop;
16284                     case FMT_SDPS_D:
16285                         mips32_op = OPC_MADDF_D;
16286                         goto do_fpop;
16287                     default:
16288                         goto pool32f_invalid;
16289                     }
16290                     break;
16291                 case MSUBF_FMT:
16292                     check_insn(ctx, ISA_MIPS32R6);
16293                     switch ((ctx->opcode >> 9) & 0x3) {
16294                     case FMT_SDPS_S:
16295                         mips32_op = OPC_MSUBF_S;
16296                         goto do_fpop;
16297                     case FMT_SDPS_D:
16298                         mips32_op = OPC_MSUBF_D;
16299                         goto do_fpop;
16300                     default:
16301                         goto pool32f_invalid;
16302                     }
16303                     break;
16304                 default:
16305                     goto pool32f_invalid;
16306                 }
16307                 break;
16308             do_fpop:
16309                 gen_farith(ctx, mips32_op, rt, rs, rd, 0);
16310                 break;
16311             default:
16312             pool32f_invalid:
16313                 MIPS_INVAL("pool32f");
16314                 generate_exception_end(ctx, EXCP_RI);
16315                 break;
16316             }
16317         } else {
16318             generate_exception_err(ctx, EXCP_CpU, 1);
16319         }
16320         break;
16321     case POOL32I:
16322         minor = (ctx->opcode >> 21) & 0x1f;
16323         switch (minor) {
16324         case BLTZ:
16325             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16326             gen_compute_branch(ctx, OPC_BLTZ, 4, rs, -1, imm << 1, 4);
16327             break;
16328         case BLTZAL:
16329             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16330             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 4);
16331             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16332             break;
16333         case BLTZALS:
16334             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16335             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 2);
16336             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16337             break;
16338         case BGEZ:
16339             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16340             gen_compute_branch(ctx, OPC_BGEZ, 4, rs, -1, imm << 1, 4);
16341             break;
16342         case BGEZAL:
16343             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16344             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 4);
16345             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16346             break;
16347         case BGEZALS:
16348             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16349             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 2);
16350             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16351             break;
16352         case BLEZ:
16353             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16354             gen_compute_branch(ctx, OPC_BLEZ, 4, rs, -1, imm << 1, 4);
16355             break;
16356         case BGTZ:
16357             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16358             gen_compute_branch(ctx, OPC_BGTZ, 4, rs, -1, imm << 1, 4);
16359             break;
16360
16361             /* Traps */
16362         case TLTI: /* BC1EQZC */
16363             if (ctx->insn_flags & ISA_MIPS32R6) {
16364                 /* BC1EQZC */
16365                 check_cp1_enabled(ctx);
16366                 gen_compute_branch1_r6(ctx, OPC_BC1EQZ, rs, imm << 1, 0);
16367             } else {
16368                 /* TLTI */
16369                 mips32_op = OPC_TLTI;
16370                 goto do_trapi;
16371             }
16372             break;
16373         case TGEI: /* BC1NEZC */
16374             if (ctx->insn_flags & ISA_MIPS32R6) {
16375                 /* BC1NEZC */
16376                 check_cp1_enabled(ctx);
16377                 gen_compute_branch1_r6(ctx, OPC_BC1NEZ, rs, imm << 1, 0);
16378             } else {
16379                 /* TGEI */
16380                 mips32_op = OPC_TGEI;
16381                 goto do_trapi;
16382             }
16383             break;
16384         case TLTIU:
16385             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16386             mips32_op = OPC_TLTIU;
16387             goto do_trapi;
16388         case TGEIU:
16389             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16390             mips32_op = OPC_TGEIU;
16391             goto do_trapi;
16392         case TNEI: /* SYNCI */
16393             if (ctx->insn_flags & ISA_MIPS32R6) {
16394                 /* SYNCI */
16395                 /* Break the TB to be able to sync copied instructions
16396                    immediately */
16397                 ctx->base.is_jmp = DISAS_STOP;
16398             } else {
16399                 /* TNEI */
16400                 mips32_op = OPC_TNEI;
16401                 goto do_trapi;
16402             }
16403             break;
16404         case TEQI:
16405             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16406             mips32_op = OPC_TEQI;
16407         do_trapi:
16408             gen_trap(ctx, mips32_op, rs, -1, imm);
16409             break;
16410
16411         case BNEZC:
16412         case BEQZC:
16413             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16414             gen_compute_branch(ctx, minor == BNEZC ? OPC_BNE : OPC_BEQ,
16415                                4, rs, 0, imm << 1, 0);
16416             /* Compact branches don't have a delay slot, so just let
16417                the normal delay slot handling take us to the branch
16418                target. */
16419             break;
16420         case LUI:
16421             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16422             gen_logic_imm(ctx, OPC_LUI, rs, 0, imm);
16423             break;
16424         case SYNCI:
16425             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16426             /* Break the TB to be able to sync copied instructions
16427                immediately */
16428             ctx->base.is_jmp = DISAS_STOP;
16429             break;
16430         case BC2F:
16431         case BC2T:
16432             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16433             /* COP2: Not implemented. */
16434             generate_exception_err(ctx, EXCP_CpU, 2);
16435             break;
16436         case BC1F:
16437             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16438             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1FANY2 : OPC_BC1F;
16439             goto do_cp1branch;
16440         case BC1T:
16441             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16442             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1TANY2 : OPC_BC1T;
16443             goto do_cp1branch;
16444         case BC1ANY4F:
16445             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16446             mips32_op = OPC_BC1FANY4;
16447             goto do_cp1mips3d;
16448         case BC1ANY4T:
16449             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16450             mips32_op = OPC_BC1TANY4;
16451         do_cp1mips3d:
16452             check_cop1x(ctx);
16453             check_insn(ctx, ASE_MIPS3D);
16454             /* Fall through */
16455         do_cp1branch:
16456             if (env->CP0_Config1 & (1 << CP0C1_FP)) {
16457                 check_cp1_enabled(ctx);
16458                 gen_compute_branch1(ctx, mips32_op,
16459                                     (ctx->opcode >> 18) & 0x7, imm << 1);
16460             } else {
16461                 generate_exception_err(ctx, EXCP_CpU, 1);
16462             }
16463             break;
16464         case BPOSGE64:
16465         case BPOSGE32:
16466             /* MIPS DSP: not implemented */
16467             /* Fall through */
16468         default:
16469             MIPS_INVAL("pool32i");
16470             generate_exception_end(ctx, EXCP_RI);
16471             break;
16472         }
16473         break;
16474     case POOL32C:
16475         minor = (ctx->opcode >> 12) & 0xf;
16476         offset = sextract32(ctx->opcode, 0,
16477                             (ctx->insn_flags & ISA_MIPS32R6) ? 9 : 12);
16478         switch (minor) {
16479         case LWL:
16480             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16481             mips32_op = OPC_LWL;
16482             goto do_ld_lr;
16483         case SWL:
16484             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16485             mips32_op = OPC_SWL;
16486             goto do_st_lr;
16487         case LWR:
16488             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16489             mips32_op = OPC_LWR;
16490             goto do_ld_lr;
16491         case SWR:
16492             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16493             mips32_op = OPC_SWR;
16494             goto do_st_lr;
16495 #if defined(TARGET_MIPS64)
16496         case LDL:
16497             check_insn(ctx, ISA_MIPS3);
16498             check_mips_64(ctx);
16499             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16500             mips32_op = OPC_LDL;
16501             goto do_ld_lr;
16502         case SDL:
16503             check_insn(ctx, ISA_MIPS3);
16504             check_mips_64(ctx);
16505             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16506             mips32_op = OPC_SDL;
16507             goto do_st_lr;
16508         case LDR:
16509             check_insn(ctx, ISA_MIPS3);
16510             check_mips_64(ctx);
16511             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16512             mips32_op = OPC_LDR;
16513             goto do_ld_lr;
16514         case SDR:
16515             check_insn(ctx, ISA_MIPS3);
16516             check_mips_64(ctx);
16517             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16518             mips32_op = OPC_SDR;
16519             goto do_st_lr;
16520         case LWU:
16521             check_insn(ctx, ISA_MIPS3);
16522             check_mips_64(ctx);
16523             mips32_op = OPC_LWU;
16524             goto do_ld_lr;
16525         case LLD:
16526             check_insn(ctx, ISA_MIPS3);
16527             check_mips_64(ctx);
16528             mips32_op = OPC_LLD;
16529             goto do_ld_lr;
16530 #endif
16531         case LL:
16532             mips32_op = OPC_LL;
16533             goto do_ld_lr;
16534         do_ld_lr:
16535             gen_ld(ctx, mips32_op, rt, rs, offset);
16536             break;
16537         do_st_lr:
16538             gen_st(ctx, mips32_op, rt, rs, offset);
16539             break;
16540         case SC:
16541             gen_st_cond(ctx, OPC_SC, rt, rs, offset);
16542             break;
16543 #if defined(TARGET_MIPS64)
16544         case SCD:
16545             check_insn(ctx, ISA_MIPS3);
16546             check_mips_64(ctx);
16547             gen_st_cond(ctx, OPC_SCD, rt, rs, offset);
16548             break;
16549 #endif
16550         case LD_EVA:
16551             if (!ctx->eva) {
16552                 MIPS_INVAL("pool32c ld-eva");
16553                 generate_exception_end(ctx, EXCP_RI);
16554                 break;
16555             }
16556             check_cp0_enabled(ctx);
16557
16558             minor2 = (ctx->opcode >> 9) & 0x7;
16559             offset = sextract32(ctx->opcode, 0, 9);
16560             switch (minor2) {
16561             case LBUE:
16562                 mips32_op = OPC_LBUE;
16563                 goto do_ld_lr;
16564             case LHUE:
16565                 mips32_op = OPC_LHUE;
16566                 goto do_ld_lr;
16567             case LWLE:
16568                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
16569                 mips32_op = OPC_LWLE;
16570                 goto do_ld_lr;
16571             case LWRE:
16572                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
16573                 mips32_op = OPC_LWRE;
16574                 goto do_ld_lr;
16575             case LBE:
16576                 mips32_op = OPC_LBE;
16577                 goto do_ld_lr;
16578             case LHE:
16579                 mips32_op = OPC_LHE;
16580                 goto do_ld_lr;
16581             case LLE:
16582                 mips32_op = OPC_LLE;
16583                 goto do_ld_lr;
16584             case LWE:
16585                 mips32_op = OPC_LWE;
16586                 goto do_ld_lr;
16587             };
16588             break;
16589         case ST_EVA:
16590             if (!ctx->eva) {
16591                 MIPS_INVAL("pool32c st-eva");
16592                 generate_exception_end(ctx, EXCP_RI);
16593                 break;
16594             }
16595             check_cp0_enabled(ctx);
16596
16597             minor2 = (ctx->opcode >> 9) & 0x7;
16598             offset = sextract32(ctx->opcode, 0, 9);
16599             switch (minor2) {
16600             case SWLE:
16601                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
16602                 mips32_op = OPC_SWLE;
16603                 goto do_st_lr;
16604             case SWRE:
16605                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
16606                 mips32_op = OPC_SWRE;
16607                 goto do_st_lr;
16608             case PREFE:
16609                 /* Treat as no-op */
16610                 if ((ctx->insn_flags & ISA_MIPS32R6) && (rt >= 24)) {
16611                     /* hint codes 24-31 are reserved and signal RI */
16612                     generate_exception(ctx, EXCP_RI);
16613                 }
16614                 break;
16615             case CACHEE:
16616                 /* Treat as no-op */
16617                 if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
16618                     gen_cache_operation(ctx, rt, rs, offset);
16619                 }
16620                 break;
16621             case SBE:
16622                 mips32_op = OPC_SBE;
16623                 goto do_st_lr;
16624             case SHE:
16625                 mips32_op = OPC_SHE;
16626                 goto do_st_lr;
16627             case SCE:
16628                 gen_st_cond(ctx, OPC_SCE, rt, rs, offset);
16629                 break;
16630             case SWE:
16631                 mips32_op = OPC_SWE;
16632                 goto do_st_lr;
16633             };
16634             break;
16635         case PREF:
16636             /* Treat as no-op */
16637             if ((ctx->insn_flags & ISA_MIPS32R6) && (rt >= 24)) {
16638                 /* hint codes 24-31 are reserved and signal RI */
16639                 generate_exception(ctx, EXCP_RI);
16640             }
16641             break;
16642         default:
16643             MIPS_INVAL("pool32c");
16644             generate_exception_end(ctx, EXCP_RI);
16645             break;
16646         }
16647         break;
16648     case ADDI32: /* AUI, LUI */
16649         if (ctx->insn_flags & ISA_MIPS32R6) {
16650             /* AUI, LUI */
16651             gen_logic_imm(ctx, OPC_LUI, rt, rs, imm);
16652         } else {
16653             /* ADDI32 */
16654             mips32_op = OPC_ADDI;
16655             goto do_addi;
16656         }
16657         break;
16658     case ADDIU32:
16659         mips32_op = OPC_ADDIU;
16660     do_addi:
16661         gen_arith_imm(ctx, mips32_op, rt, rs, imm);
16662         break;
16663
16664         /* Logical operations */
16665     case ORI32:
16666         mips32_op = OPC_ORI;
16667         goto do_logici;
16668     case XORI32:
16669         mips32_op = OPC_XORI;
16670         goto do_logici;
16671     case ANDI32:
16672         mips32_op = OPC_ANDI;
16673     do_logici:
16674         gen_logic_imm(ctx, mips32_op, rt, rs, imm);
16675         break;
16676
16677         /* Set less than immediate */
16678     case SLTI32:
16679         mips32_op = OPC_SLTI;
16680         goto do_slti;
16681     case SLTIU32:
16682         mips32_op = OPC_SLTIU;
16683     do_slti:
16684         gen_slt_imm(ctx, mips32_op, rt, rs, imm);
16685         break;
16686     case JALX32:
16687         check_insn_opc_removed(ctx, ISA_MIPS32R6);
16688         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
16689         gen_compute_branch(ctx, OPC_JALX, 4, rt, rs, offset, 4);
16690         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16691         break;
16692     case JALS32: /* BOVC, BEQC, BEQZALC */
16693         if (ctx->insn_flags & ISA_MIPS32R6) {
16694             if (rs >= rt) {
16695                 /* BOVC */
16696                 mips32_op = OPC_BOVC;
16697             } else if (rs < rt && rs == 0) {
16698                 /* BEQZALC */
16699                 mips32_op = OPC_BEQZALC;
16700             } else {
16701                 /* BEQC */
16702                 mips32_op = OPC_BEQC;
16703             }
16704             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16705         } else {
16706             /* JALS32 */
16707             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 1;
16708             gen_compute_branch(ctx, OPC_JAL, 4, rt, rs, offset, 2);
16709             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16710         }
16711         break;
16712     case BEQ32: /* BC */
16713         if (ctx->insn_flags & ISA_MIPS32R6) {
16714             /* BC */
16715             gen_compute_compact_branch(ctx, OPC_BC, 0, 0,
16716                                        sextract32(ctx->opcode << 1, 0, 27));
16717         } else {
16718             /* BEQ32 */
16719             gen_compute_branch(ctx, OPC_BEQ, 4, rt, rs, imm << 1, 4);
16720         }
16721         break;
16722     case BNE32: /* BALC */
16723         if (ctx->insn_flags & ISA_MIPS32R6) {
16724             /* BALC */
16725             gen_compute_compact_branch(ctx, OPC_BALC, 0, 0,
16726                                        sextract32(ctx->opcode << 1, 0, 27));
16727         } else {
16728             /* BNE32 */
16729             gen_compute_branch(ctx, OPC_BNE, 4, rt, rs, imm << 1, 4);
16730         }
16731         break;
16732     case J32: /* BGTZC, BLTZC, BLTC */
16733         if (ctx->insn_flags & ISA_MIPS32R6) {
16734             if (rs == 0 && rt != 0) {
16735                 /* BGTZC */
16736                 mips32_op = OPC_BGTZC;
16737             } else if (rs != 0 && rt != 0 && rs == rt) {
16738                 /* BLTZC */
16739                 mips32_op = OPC_BLTZC;
16740             } else {
16741                 /* BLTC */
16742                 mips32_op = OPC_BLTC;
16743             }
16744             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16745         } else {
16746             /* J32 */
16747             gen_compute_branch(ctx, OPC_J, 4, rt, rs,
16748                                (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
16749         }
16750         break;
16751     case JAL32: /* BLEZC, BGEZC, BGEC */
16752         if (ctx->insn_flags & ISA_MIPS32R6) {
16753             if (rs == 0 && rt != 0) {
16754                 /* BLEZC */
16755                 mips32_op = OPC_BLEZC;
16756             } else if (rs != 0 && rt != 0 && rs == rt) {
16757                 /* BGEZC */
16758                 mips32_op = OPC_BGEZC;
16759             } else {
16760                 /* BGEC */
16761                 mips32_op = OPC_BGEC;
16762             }
16763             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16764         } else {
16765             /* JAL32 */
16766             gen_compute_branch(ctx, OPC_JAL, 4, rt, rs,
16767                                (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
16768             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16769         }
16770         break;
16771         /* Floating point (COP1) */
16772     case LWC132:
16773         mips32_op = OPC_LWC1;
16774         goto do_cop1;
16775     case LDC132:
16776         mips32_op = OPC_LDC1;
16777         goto do_cop1;
16778     case SWC132:
16779         mips32_op = OPC_SWC1;
16780         goto do_cop1;
16781     case SDC132:
16782         mips32_op = OPC_SDC1;
16783     do_cop1:
16784         gen_cop1_ldst(ctx, mips32_op, rt, rs, imm);
16785         break;
16786     case ADDIUPC: /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */
16787         if (ctx->insn_flags & ISA_MIPS32R6) {
16788             /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */
16789             switch ((ctx->opcode >> 16) & 0x1f) {
16790             case ADDIUPC_00:
16791             case ADDIUPC_01:
16792             case ADDIUPC_02:
16793             case ADDIUPC_03:
16794             case ADDIUPC_04:
16795             case ADDIUPC_05:
16796             case ADDIUPC_06:
16797             case ADDIUPC_07:
16798                 gen_pcrel(ctx, OPC_ADDIUPC, ctx->base.pc_next & ~0x3, rt);
16799                 break;
16800             case AUIPC:
16801                 gen_pcrel(ctx, OPC_AUIPC, ctx->base.pc_next, rt);
16802                 break;
16803             case ALUIPC:
16804                 gen_pcrel(ctx, OPC_ALUIPC, ctx->base.pc_next, rt);
16805                 break;
16806             case LWPC_08:
16807             case LWPC_09:
16808             case LWPC_0A:
16809             case LWPC_0B:
16810             case LWPC_0C:
16811             case LWPC_0D:
16812             case LWPC_0E:
16813             case LWPC_0F:
16814                 gen_pcrel(ctx, R6_OPC_LWPC, ctx->base.pc_next & ~0x3, rt);
16815                 break;
16816             default:
16817                 generate_exception(ctx, EXCP_RI);
16818                 break;
16819             }
16820         } else {
16821             /* ADDIUPC */
16822             int reg = mmreg(ZIMM(ctx->opcode, 23, 3));
16823             offset = SIMM(ctx->opcode, 0, 23) << 2;
16824
16825             gen_addiupc(ctx, reg, offset, 0, 0);
16826         }
16827         break;
16828     case BNVC: /* BNEC, BNEZALC */
16829         check_insn(ctx, ISA_MIPS32R6);
16830         if (rs >= rt) {
16831             /* BNVC */
16832             mips32_op = OPC_BNVC;
16833         } else if (rs < rt && rs == 0) {
16834             /* BNEZALC */
16835             mips32_op = OPC_BNEZALC;
16836         } else {
16837             /* BNEC */
16838             mips32_op = OPC_BNEC;
16839         }
16840         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16841         break;
16842     case R6_BNEZC: /* JIALC */
16843         check_insn(ctx, ISA_MIPS32R6);
16844         if (rt != 0) {
16845             /* BNEZC */
16846             gen_compute_compact_branch(ctx, OPC_BNEZC, rt, 0,
16847                                        sextract32(ctx->opcode << 1, 0, 22));
16848         } else {
16849             /* JIALC */
16850             gen_compute_compact_branch(ctx, OPC_JIALC, 0, rs, imm);
16851         }
16852         break;
16853     case R6_BEQZC: /* JIC */
16854         check_insn(ctx, ISA_MIPS32R6);
16855         if (rt != 0) {
16856             /* BEQZC */
16857             gen_compute_compact_branch(ctx, OPC_BEQZC, rt, 0,
16858                                        sextract32(ctx->opcode << 1, 0, 22));
16859         } else {
16860             /* JIC */
16861             gen_compute_compact_branch(ctx, OPC_JIC, 0, rs, imm);
16862         }
16863         break;
16864     case BLEZALC: /* BGEZALC, BGEUC */
16865         check_insn(ctx, ISA_MIPS32R6);
16866         if (rs == 0 && rt != 0) {
16867             /* BLEZALC */
16868             mips32_op = OPC_BLEZALC;
16869         } else if (rs != 0 && rt != 0 && rs == rt) {
16870             /* BGEZALC */
16871             mips32_op = OPC_BGEZALC;
16872         } else {
16873             /* BGEUC */
16874             mips32_op = OPC_BGEUC;
16875         }
16876         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16877         break;
16878     case BGTZALC: /* BLTZALC, BLTUC */
16879         check_insn(ctx, ISA_MIPS32R6);
16880         if (rs == 0 && rt != 0) {
16881             /* BGTZALC */
16882             mips32_op = OPC_BGTZALC;
16883         } else if (rs != 0 && rt != 0 && rs == rt) {
16884             /* BLTZALC */
16885             mips32_op = OPC_BLTZALC;
16886         } else {
16887             /* BLTUC */
16888             mips32_op = OPC_BLTUC;
16889         }
16890         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16891         break;
16892         /* Loads and stores */
16893     case LB32:
16894         mips32_op = OPC_LB;
16895         goto do_ld;
16896     case LBU32:
16897         mips32_op = OPC_LBU;
16898         goto do_ld;
16899     case LH32:
16900         mips32_op = OPC_LH;
16901         goto do_ld;
16902     case LHU32:
16903         mips32_op = OPC_LHU;
16904         goto do_ld;
16905     case LW32:
16906         mips32_op = OPC_LW;
16907         goto do_ld;
16908 #ifdef TARGET_MIPS64
16909     case LD32:
16910         check_insn(ctx, ISA_MIPS3);
16911         check_mips_64(ctx);
16912         mips32_op = OPC_LD;
16913         goto do_ld;
16914     case SD32:
16915         check_insn(ctx, ISA_MIPS3);
16916         check_mips_64(ctx);
16917         mips32_op = OPC_SD;
16918         goto do_st;
16919 #endif
16920     case SB32:
16921         mips32_op = OPC_SB;
16922         goto do_st;
16923     case SH32:
16924         mips32_op = OPC_SH;
16925         goto do_st;
16926     case SW32:
16927         mips32_op = OPC_SW;
16928         goto do_st;
16929     do_ld:
16930         gen_ld(ctx, mips32_op, rt, rs, imm);
16931         break;
16932     do_st:
16933         gen_st(ctx, mips32_op, rt, rs, imm);
16934         break;
16935     default:
16936         generate_exception_end(ctx, EXCP_RI);
16937         break;
16938     }
16939 }
16940
16941 static int decode_micromips_opc (CPUMIPSState *env, DisasContext *ctx)
16942 {
16943     uint32_t op;
16944
16945     /* make sure instructions are on a halfword boundary */
16946     if (ctx->base.pc_next & 0x1) {
16947         env->CP0_BadVAddr = ctx->base.pc_next;
16948         generate_exception_end(ctx, EXCP_AdEL);
16949         return 2;
16950     }
16951
16952     op = (ctx->opcode >> 10) & 0x3f;
16953     /* Enforce properly-sized instructions in a delay slot */
16954     if (ctx->hflags & MIPS_HFLAG_BDS_STRICT) {
16955         switch (op & 0x7) { /* MSB-3..MSB-5 */
16956         case 0:
16957         /* POOL32A, POOL32B, POOL32I, POOL32C */
16958         case 4:
16959         /* ADDI32, ADDIU32, ORI32, XORI32, SLTI32, SLTIU32, ANDI32, JALX32 */
16960         case 5:
16961         /* LBU32, LHU32, POOL32F, JALS32, BEQ32, BNE32, J32, JAL32 */
16962         case 6:
16963         /* SB32, SH32, ADDIUPC, SWC132, SDC132, SW32 */
16964         case 7:
16965         /* LB32, LH32, LWC132, LDC132, LW32 */
16966             if (ctx->hflags & MIPS_HFLAG_BDS16) {
16967                 generate_exception_end(ctx, EXCP_RI);
16968                 return 2;
16969             }
16970             break;
16971         case 1:
16972         /* POOL16A, POOL16B, POOL16C, LWGP16, POOL16F */
16973         case 2:
16974         /* LBU16, LHU16, LWSP16, LW16, SB16, SH16, SWSP16, SW16 */
16975         case 3:
16976         /* MOVE16, ANDI16, POOL16D, POOL16E, BEQZ16, BNEZ16, B16, LI16 */
16977             if (ctx->hflags & MIPS_HFLAG_BDS32) {
16978                 generate_exception_end(ctx, EXCP_RI);
16979                 return 2;
16980             }
16981             break;
16982         }
16983     }
16984
16985     switch (op) {
16986     case POOL16A:
16987         {
16988             int rd = mmreg(uMIPS_RD(ctx->opcode));
16989             int rs1 = mmreg(uMIPS_RS1(ctx->opcode));
16990             int rs2 = mmreg(uMIPS_RS2(ctx->opcode));
16991             uint32_t opc = 0;
16992
16993             switch (ctx->opcode & 0x1) {
16994             case ADDU16:
16995                 opc = OPC_ADDU;
16996                 break;
16997             case SUBU16:
16998                 opc = OPC_SUBU;
16999                 break;
17000             }
17001             if (ctx->insn_flags & ISA_MIPS32R6) {
17002                 /* In the Release 6 the register number location in
17003                  * the instruction encoding has changed.
17004                  */
17005                 gen_arith(ctx, opc, rs1, rd, rs2);
17006             } else {
17007                 gen_arith(ctx, opc, rd, rs1, rs2);
17008             }
17009         }
17010         break;
17011     case POOL16B:
17012         {
17013             int rd = mmreg(uMIPS_RD(ctx->opcode));
17014             int rs = mmreg(uMIPS_RS(ctx->opcode));
17015             int amount = (ctx->opcode >> 1) & 0x7;
17016             uint32_t opc = 0;
17017             amount = amount == 0 ? 8 : amount;
17018
17019             switch (ctx->opcode & 0x1) {
17020             case SLL16:
17021                 opc = OPC_SLL;
17022                 break;
17023             case SRL16:
17024                 opc = OPC_SRL;
17025                 break;
17026             }
17027
17028             gen_shift_imm(ctx, opc, rd, rs, amount);
17029         }
17030         break;
17031     case POOL16C:
17032         if (ctx->insn_flags & ISA_MIPS32R6) {
17033             gen_pool16c_r6_insn(ctx);
17034         } else {
17035             gen_pool16c_insn(ctx);
17036         }
17037         break;
17038     case LWGP16:
17039         {
17040             int rd = mmreg(uMIPS_RD(ctx->opcode));
17041             int rb = 28;            /* GP */
17042             int16_t offset = SIMM(ctx->opcode, 0, 7) << 2;
17043
17044             gen_ld(ctx, OPC_LW, rd, rb, offset);
17045         }
17046         break;
17047     case POOL16F:
17048         check_insn_opc_removed(ctx, ISA_MIPS32R6);
17049         if (ctx->opcode & 1) {
17050             generate_exception_end(ctx, EXCP_RI);
17051         } else {
17052             /* MOVEP */
17053             int enc_dest = uMIPS_RD(ctx->opcode);
17054             int enc_rt = uMIPS_RS2(ctx->opcode);
17055             int enc_rs = uMIPS_RS1(ctx->opcode);
17056             gen_movep(ctx, enc_dest, enc_rt, enc_rs);
17057         }
17058         break;
17059     case LBU16:
17060         {
17061             int rd = mmreg(uMIPS_RD(ctx->opcode));
17062             int rb = mmreg(uMIPS_RS(ctx->opcode));
17063             int16_t offset = ZIMM(ctx->opcode, 0, 4);
17064             offset = (offset == 0xf ? -1 : offset);
17065
17066             gen_ld(ctx, OPC_LBU, rd, rb, offset);
17067         }
17068         break;
17069     case LHU16:
17070         {
17071             int rd = mmreg(uMIPS_RD(ctx->opcode));
17072             int rb = mmreg(uMIPS_RS(ctx->opcode));
17073             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
17074
17075             gen_ld(ctx, OPC_LHU, rd, rb, offset);
17076         }
17077         break;
17078     case LWSP16:
17079         {
17080             int rd = (ctx->opcode >> 5) & 0x1f;
17081             int rb = 29;            /* SP */
17082             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
17083
17084             gen_ld(ctx, OPC_LW, rd, rb, offset);
17085         }
17086         break;
17087     case LW16:
17088         {
17089             int rd = mmreg(uMIPS_RD(ctx->opcode));
17090             int rb = mmreg(uMIPS_RS(ctx->opcode));
17091             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
17092
17093             gen_ld(ctx, OPC_LW, rd, rb, offset);
17094         }
17095         break;
17096     case SB16:
17097         {
17098             int rd = mmreg2(uMIPS_RD(ctx->opcode));
17099             int rb = mmreg(uMIPS_RS(ctx->opcode));
17100             int16_t offset = ZIMM(ctx->opcode, 0, 4);
17101
17102             gen_st(ctx, OPC_SB, rd, rb, offset);
17103         }
17104         break;
17105     case SH16:
17106         {
17107             int rd = mmreg2(uMIPS_RD(ctx->opcode));
17108             int rb = mmreg(uMIPS_RS(ctx->opcode));
17109             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
17110
17111             gen_st(ctx, OPC_SH, rd, rb, offset);
17112         }
17113         break;
17114     case SWSP16:
17115         {
17116             int rd = (ctx->opcode >> 5) & 0x1f;
17117             int rb = 29;            /* SP */
17118             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
17119
17120             gen_st(ctx, OPC_SW, rd, rb, offset);
17121         }
17122         break;
17123     case SW16:
17124         {
17125             int rd = mmreg2(uMIPS_RD(ctx->opcode));
17126             int rb = mmreg(uMIPS_RS(ctx->opcode));
17127             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
17128
17129             gen_st(ctx, OPC_SW, rd, rb, offset);
17130         }
17131         break;
17132     case MOVE16:
17133         {
17134             int rd = uMIPS_RD5(ctx->opcode);
17135             int rs = uMIPS_RS5(ctx->opcode);
17136
17137             gen_arith(ctx, OPC_ADDU, rd, rs, 0);
17138         }
17139         break;
17140     case ANDI16:
17141         gen_andi16(ctx);
17142         break;
17143     case POOL16D:
17144         switch (ctx->opcode & 0x1) {
17145         case ADDIUS5:
17146             gen_addius5(ctx);
17147             break;
17148         case ADDIUSP:
17149             gen_addiusp(ctx);
17150             break;
17151         }
17152         break;
17153     case POOL16E:
17154         switch (ctx->opcode & 0x1) {
17155         case ADDIUR2:
17156             gen_addiur2(ctx);
17157             break;
17158         case ADDIUR1SP:
17159             gen_addiur1sp(ctx);
17160             break;
17161         }
17162         break;
17163     case B16: /* BC16 */
17164         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0,
17165                            sextract32(ctx->opcode, 0, 10) << 1,
17166                            (ctx->insn_flags & ISA_MIPS32R6) ? 0 : 4);
17167         break;
17168     case BNEZ16: /* BNEZC16 */
17169     case BEQZ16: /* BEQZC16 */
17170         gen_compute_branch(ctx, op == BNEZ16 ? OPC_BNE : OPC_BEQ, 2,
17171                            mmreg(uMIPS_RD(ctx->opcode)),
17172                            0, sextract32(ctx->opcode, 0, 7) << 1,
17173                            (ctx->insn_flags & ISA_MIPS32R6) ? 0 : 4);
17174
17175         break;
17176     case LI16:
17177         {
17178             int reg = mmreg(uMIPS_RD(ctx->opcode));
17179             int imm = ZIMM(ctx->opcode, 0, 7);
17180
17181             imm = (imm == 0x7f ? -1 : imm);
17182             tcg_gen_movi_tl(cpu_gpr[reg], imm);
17183         }
17184         break;
17185     case RES_29:
17186     case RES_31:
17187     case RES_39:
17188         generate_exception_end(ctx, EXCP_RI);
17189         break;
17190     default:
17191         decode_micromips32_opc(env, ctx);
17192         return 4;
17193     }
17194
17195     return 2;
17196 }
17197
17198 /*
17199  *
17200  * nanoMIPS opcodes
17201  *
17202  */
17203
17204 /* MAJOR, P16, and P32 pools opcodes */
17205 enum {
17206     NM_P_ADDIU      = 0x00,
17207     NM_ADDIUPC      = 0x01,
17208     NM_MOVE_BALC    = 0x02,
17209     NM_P16_MV       = 0x04,
17210     NM_LW16         = 0x05,
17211     NM_BC16         = 0x06,
17212     NM_P16_SR       = 0x07,
17213
17214     NM_POOL32A      = 0x08,
17215     NM_P_BAL        = 0x0a,
17216     NM_P16_SHIFT    = 0x0c,
17217     NM_LWSP16       = 0x0d,
17218     NM_BALC16       = 0x0e,
17219     NM_P16_4X4      = 0x0f,
17220
17221     NM_P_GP_W       = 0x10,
17222     NM_P_GP_BH      = 0x11,
17223     NM_P_J          = 0x12,
17224     NM_P16C         = 0x14,
17225     NM_LWGP16       = 0x15,
17226     NM_P16_LB       = 0x17,
17227
17228     NM_P48I         = 0x18,
17229     NM_P16_A1       = 0x1c,
17230     NM_LW4X4        = 0x1d,
17231     NM_P16_LH       = 0x1f,
17232
17233     NM_P_U12        = 0x20,
17234     NM_P_LS_U12     = 0x21,
17235     NM_P_BR1        = 0x22,
17236     NM_P16_A2       = 0x24,
17237     NM_SW16         = 0x25,
17238     NM_BEQZC16      = 0x26,
17239
17240     NM_POOL32F      = 0x28,
17241     NM_P_LS_S9      = 0x29,
17242     NM_P_BR2        = 0x2a,
17243
17244     NM_P16_ADDU     = 0x2c,
17245     NM_SWSP16       = 0x2d,
17246     NM_BNEZC16      = 0x2e,
17247     NM_MOVEP        = 0x2f,
17248
17249     NM_POOL32S      = 0x30,
17250     NM_P_BRI        = 0x32,
17251     NM_LI16         = 0x34,
17252     NM_SWGP16       = 0x35,
17253     NM_P16_BR       = 0x36,
17254
17255     NM_P_LUI        = 0x38,
17256     NM_ANDI16       = 0x3c,
17257     NM_SW4X4        = 0x3d,
17258     NM_MOVEPREV     = 0x3f,
17259 };
17260
17261 /* POOL32A instruction pool */
17262 enum {
17263     NM_POOL32A0    = 0x00,
17264     NM_SPECIAL2    = 0x01,
17265     NM_COP2_1      = 0x02,
17266     NM_UDI         = 0x03,
17267     NM_POOL32A5    = 0x05,
17268     NM_POOL32A7    = 0x07,
17269 };
17270
17271 /* P.GP.W instruction pool */
17272 enum {
17273     NM_ADDIUGP_W = 0x00,
17274     NM_LWGP      = 0x02,
17275     NM_SWGP      = 0x03,
17276 };
17277
17278 /* P48I instruction pool */
17279 enum {
17280     NM_LI48        = 0x00,
17281     NM_ADDIU48     = 0x01,
17282     NM_ADDIUGP48   = 0x02,
17283     NM_ADDIUPC48   = 0x03,
17284     NM_LWPC48      = 0x0b,
17285     NM_SWPC48      = 0x0f,
17286 };
17287
17288 /* P.U12 instruction pool */
17289 enum {
17290     NM_ORI      = 0x00,
17291     NM_XORI     = 0x01,
17292     NM_ANDI     = 0x02,
17293     NM_P_SR     = 0x03,
17294     NM_SLTI     = 0x04,
17295     NM_SLTIU    = 0x05,
17296     NM_SEQI     = 0x06,
17297     NM_ADDIUNEG = 0x08,
17298     NM_P_SHIFT  = 0x0c,
17299     NM_P_ROTX   = 0x0d,
17300     NM_P_INS    = 0x0e,
17301     NM_P_EXT    = 0x0f,
17302 };
17303
17304 /* POOL32F instruction pool */
17305 enum {
17306     NM_POOL32F_0   = 0x00,
17307     NM_POOL32F_3   = 0x03,
17308     NM_POOL32F_5   = 0x05,
17309 };
17310
17311 /* POOL32S instruction pool */
17312 enum {
17313     NM_POOL32S_0   = 0x00,
17314     NM_POOL32S_4   = 0x04,
17315 };
17316
17317 /* P.LUI instruction pool */
17318 enum {
17319     NM_LUI      = 0x00,
17320     NM_ALUIPC   = 0x01,
17321 };
17322
17323 /* P.GP.BH instruction pool */
17324 enum {
17325     NM_LBGP      = 0x00,
17326     NM_SBGP      = 0x01,
17327     NM_LBUGP     = 0x02,
17328     NM_ADDIUGP_B = 0x03,
17329     NM_P_GP_LH   = 0x04,
17330     NM_P_GP_SH   = 0x05,
17331     NM_P_GP_CP1  = 0x06,
17332 };
17333
17334 /* P.LS.U12 instruction pool */
17335 enum {
17336     NM_LB        = 0x00,
17337     NM_SB        = 0x01,
17338     NM_LBU       = 0x02,
17339     NM_P_PREFU12 = 0x03,
17340     NM_LH        = 0x04,
17341     NM_SH        = 0x05,
17342     NM_LHU       = 0x06,
17343     NM_LWU       = 0x07,
17344     NM_LW        = 0x08,
17345     NM_SW        = 0x09,
17346     NM_LWC1      = 0x0a,
17347     NM_SWC1      = 0x0b,
17348     NM_LDC1      = 0x0e,
17349     NM_SDC1      = 0x0f,
17350 };
17351
17352 /* P.LS.S9 instruction pool */
17353 enum {
17354     NM_P_LS_S0         = 0x00,
17355     NM_P_LS_S1         = 0x01,
17356     NM_P_LS_E0         = 0x02,
17357     NM_P_LS_WM         = 0x04,
17358     NM_P_LS_UAWM       = 0x05,
17359 };
17360
17361 /* P.BAL instruction pool */
17362 enum {
17363     NM_BC       = 0x00,
17364     NM_BALC     = 0x01,
17365 };
17366
17367 /* P.J instruction pool */
17368 enum {
17369     NM_JALRC    = 0x00,
17370     NM_JALRC_HB = 0x01,
17371     NM_P_BALRSC = 0x08,
17372 };
17373
17374 /* P.BR1 instruction pool */
17375 enum {
17376     NM_BEQC     = 0x00,
17377     NM_P_BR3A   = 0x01,
17378     NM_BGEC     = 0x02,
17379     NM_BGEUC    = 0x03,
17380 };
17381
17382 /* P.BR2 instruction pool */
17383 enum {
17384     NM_BNEC     = 0x00,
17385     NM_BLTC     = 0x02,
17386     NM_BLTUC    = 0x03,
17387 };
17388
17389 /* P.BRI instruction pool */
17390 enum {
17391     NM_BEQIC    = 0x00,
17392     NM_BBEQZC   = 0x01,
17393     NM_BGEIC    = 0x02,
17394     NM_BGEIUC   = 0x03,
17395     NM_BNEIC    = 0x04,
17396     NM_BBNEZC   = 0x05,
17397     NM_BLTIC    = 0x06,
17398     NM_BLTIUC   = 0x07,
17399 };
17400
17401 /* P16.SHIFT instruction pool */
17402 enum {
17403     NM_SLL16    = 0x00,
17404     NM_SRL16    = 0x01,
17405 };
17406
17407 /* POOL16C instruction pool */
17408 enum {
17409     NM_POOL16C_0  = 0x00,
17410     NM_LWXS16     = 0x01,
17411 };
17412
17413 /* P16.A1 instruction pool */
17414 enum {
17415     NM_ADDIUR1SP = 0x01,
17416 };
17417
17418 /* P16.A2 instruction pool */
17419 enum {
17420     NM_ADDIUR2  = 0x00,
17421     NM_P_ADDIURS5  = 0x01,
17422 };
17423
17424 /* P16.ADDU instruction pool */
17425 enum {
17426     NM_ADDU16     = 0x00,
17427     NM_SUBU16     = 0x01,
17428 };
17429
17430 /* P16.SR instruction pool */
17431 enum {
17432     NM_SAVE16        = 0x00,
17433     NM_RESTORE_JRC16 = 0x01,
17434 };
17435
17436 /* P16.4X4 instruction pool */
17437 enum {
17438     NM_ADDU4X4      = 0x00,
17439     NM_MUL4X4       = 0x01,
17440 };
17441
17442 /* P16.LB instruction pool */
17443 enum {
17444     NM_LB16       = 0x00,
17445     NM_SB16       = 0x01,
17446     NM_LBU16      = 0x02,
17447 };
17448
17449 /* P16.LH  instruction pool */
17450 enum {
17451     NM_LH16     = 0x00,
17452     NM_SH16     = 0x01,
17453     NM_LHU16    = 0x02,
17454 };
17455
17456 /* P.RI instruction pool */
17457 enum {
17458     NM_SIGRIE       = 0x00,
17459     NM_P_SYSCALL    = 0x01,
17460     NM_BREAK        = 0x02,
17461     NM_SDBBP        = 0x03,
17462 };
17463
17464 /* POOL32A0 instruction pool */
17465 enum {
17466     NM_P_TRAP   = 0x00,
17467     NM_SEB      = 0x01,
17468     NM_SLLV     = 0x02,
17469     NM_MUL      = 0x03,
17470     NM_MFC0     = 0x06,
17471     NM_MFHC0    = 0x07,
17472     NM_SEH      = 0x09,
17473     NM_SRLV     = 0x0a,
17474     NM_MUH      = 0x0b,
17475     NM_MTC0     = 0x0e,
17476     NM_MTHC0    = 0x0f,
17477     NM_SRAV     = 0x12,
17478     NM_MULU     = 0x13,
17479     NM_ROTRV    = 0x1a,
17480     NM_MUHU     = 0x1b,
17481     NM_ADD      = 0x22,
17482     NM_DIV      = 0x23,
17483     NM_ADDU     = 0x2a,
17484     NM_MOD      = 0x2b,
17485     NM_SUB      = 0x32,
17486     NM_DIVU     = 0x33,
17487     NM_RDHWR    = 0x38,
17488     NM_SUBU     = 0x3a,
17489     NM_MODU     = 0x3b,
17490     NM_P_CMOVE  = 0x42,
17491     NM_FORK     = 0x45,
17492     NM_MFTR     = 0x46,
17493     NM_MFHTR    = 0x47,
17494     NM_AND      = 0x4a,
17495     NM_YIELD    = 0x4d,
17496     NM_MTTR     = 0x4e,
17497     NM_MTHTR    = 0x4f,
17498     NM_OR       = 0x52,
17499     NM_D_E_MT_VPE = 0x56,
17500     NM_NOR      = 0x5a,
17501     NM_XOR      = 0x62,
17502     NM_SLT      = 0x6a,
17503     NM_P_SLTU   = 0x72,
17504     NM_SOV      = 0x7a,
17505 };
17506
17507 /* CRC32 instruction pool */
17508 enum {
17509     NM_CRC32B   = 0x00,
17510     NM_CRC32H   = 0x01,
17511     NM_CRC32W   = 0x02,
17512     NM_CRC32CB  = 0x04,
17513     NM_CRC32CH  = 0x05,
17514     NM_CRC32CW  = 0x06,
17515 };
17516
17517 /* POOL32A5 instruction pool */
17518 enum {
17519     NM_CMP_EQ_PH        = 0x00,
17520     NM_CMP_LT_PH        = 0x08,
17521     NM_CMP_LE_PH        = 0x10,
17522     NM_CMPGU_EQ_QB      = 0x18,
17523     NM_CMPGU_LT_QB      = 0x20,
17524     NM_CMPGU_LE_QB      = 0x28,
17525     NM_CMPGDU_EQ_QB     = 0x30,
17526     NM_CMPGDU_LT_QB     = 0x38,
17527     NM_CMPGDU_LE_QB     = 0x40,
17528     NM_CMPU_EQ_QB       = 0x48,
17529     NM_CMPU_LT_QB       = 0x50,
17530     NM_CMPU_LE_QB       = 0x58,
17531     NM_ADDQ_S_W         = 0x60,
17532     NM_SUBQ_S_W         = 0x68,
17533     NM_ADDSC            = 0x70,
17534     NM_ADDWC            = 0x78,
17535
17536     NM_ADDQ_S_PH   = 0x01,
17537     NM_ADDQH_R_PH  = 0x09,
17538     NM_ADDQH_R_W   = 0x11,
17539     NM_ADDU_S_QB   = 0x19,
17540     NM_ADDU_S_PH   = 0x21,
17541     NM_ADDUH_R_QB  = 0x29,
17542     NM_SHRAV_R_PH  = 0x31,
17543     NM_SHRAV_R_QB  = 0x39,
17544     NM_SUBQ_S_PH   = 0x41,
17545     NM_SUBQH_R_PH  = 0x49,
17546     NM_SUBQH_R_W   = 0x51,
17547     NM_SUBU_S_QB   = 0x59,
17548     NM_SUBU_S_PH   = 0x61,
17549     NM_SUBUH_R_QB  = 0x69,
17550     NM_SHLLV_S_PH  = 0x71,
17551     NM_PRECR_SRA_R_PH_W = 0x79,
17552
17553     NM_MULEU_S_PH_QBL   = 0x12,
17554     NM_MULEU_S_PH_QBR   = 0x1a,
17555     NM_MULQ_RS_PH       = 0x22,
17556     NM_MULQ_S_PH        = 0x2a,
17557     NM_MULQ_RS_W        = 0x32,
17558     NM_MULQ_S_W         = 0x3a,
17559     NM_APPEND           = 0x42,
17560     NM_MODSUB           = 0x52,
17561     NM_SHRAV_R_W        = 0x5a,
17562     NM_SHRLV_PH         = 0x62,
17563     NM_SHRLV_QB         = 0x6a,
17564     NM_SHLLV_QB         = 0x72,
17565     NM_SHLLV_S_W        = 0x7a,
17566
17567     NM_SHILO            = 0x03,
17568
17569     NM_MULEQ_S_W_PHL    = 0x04,
17570     NM_MULEQ_S_W_PHR    = 0x0c,
17571
17572     NM_MUL_S_PH         = 0x05,
17573     NM_PRECR_QB_PH      = 0x0d,
17574     NM_PRECRQ_QB_PH     = 0x15,
17575     NM_PRECRQ_PH_W      = 0x1d,
17576     NM_PRECRQ_RS_PH_W   = 0x25,
17577     NM_PRECRQU_S_QB_PH  = 0x2d,
17578     NM_PACKRL_PH        = 0x35,
17579     NM_PICK_QB          = 0x3d,
17580     NM_PICK_PH          = 0x45,
17581
17582     NM_SHRA_R_W         = 0x5e,
17583     NM_SHRA_R_PH        = 0x66,
17584     NM_SHLL_S_PH        = 0x76,
17585     NM_SHLL_S_W         = 0x7e,
17586
17587     NM_REPL_PH          = 0x07
17588 };
17589
17590 /* POOL32A7 instruction pool */
17591 enum {
17592     NM_P_LSX        = 0x00,
17593     NM_LSA          = 0x01,
17594     NM_EXTW         = 0x03,
17595     NM_POOL32AXF    = 0x07,
17596 };
17597
17598 /* P.SR instruction pool */
17599 enum {
17600     NM_PP_SR           = 0x00,
17601     NM_P_SR_F          = 0x01,
17602 };
17603
17604 /* P.SHIFT instruction pool */
17605 enum {
17606     NM_P_SLL        = 0x00,
17607     NM_SRL          = 0x02,
17608     NM_SRA          = 0x04,
17609     NM_ROTR         = 0x06,
17610 };
17611
17612 /* P.ROTX instruction pool */
17613 enum {
17614     NM_ROTX         = 0x00,
17615 };
17616
17617 /* P.INS instruction pool */
17618 enum {
17619     NM_INS          = 0x00,
17620 };
17621
17622 /* P.EXT instruction pool */
17623 enum {
17624     NM_EXT          = 0x00,
17625 };
17626
17627 /* POOL32F_0 (fmt) instruction pool */
17628 enum {
17629     NM_RINT_S              = 0x04,
17630     NM_RINT_D              = 0x44,
17631     NM_ADD_S               = 0x06,
17632     NM_SELEQZ_S            = 0x07,
17633     NM_SELEQZ_D            = 0x47,
17634     NM_CLASS_S             = 0x0c,
17635     NM_CLASS_D             = 0x4c,
17636     NM_SUB_S               = 0x0e,
17637     NM_SELNEZ_S            = 0x0f,
17638     NM_SELNEZ_D            = 0x4f,
17639     NM_MUL_S               = 0x16,
17640     NM_SEL_S               = 0x17,
17641     NM_SEL_D               = 0x57,
17642     NM_DIV_S               = 0x1e,
17643     NM_ADD_D               = 0x26,
17644     NM_SUB_D               = 0x2e,
17645     NM_MUL_D               = 0x36,
17646     NM_MADDF_S             = 0x37,
17647     NM_MADDF_D             = 0x77,
17648     NM_DIV_D               = 0x3e,
17649     NM_MSUBF_S             = 0x3f,
17650     NM_MSUBF_D             = 0x7f,
17651 };
17652
17653 /* POOL32F_3  instruction pool */
17654 enum {
17655     NM_MIN_FMT         = 0x00,
17656     NM_MAX_FMT         = 0x01,
17657     NM_MINA_FMT        = 0x04,
17658     NM_MAXA_FMT        = 0x05,
17659     NM_POOL32FXF       = 0x07,
17660 };
17661
17662 /* POOL32F_5  instruction pool */
17663 enum {
17664     NM_CMP_CONDN_S     = 0x00,
17665     NM_CMP_CONDN_D     = 0x02,
17666 };
17667
17668 /* P.GP.LH instruction pool */
17669 enum {
17670     NM_LHGP    = 0x00,
17671     NM_LHUGP   = 0x01,
17672 };
17673
17674 /* P.GP.SH instruction pool */
17675 enum {
17676     NM_SHGP    = 0x00,
17677 };
17678
17679 /* P.GP.CP1 instruction pool */
17680 enum {
17681     NM_LWC1GP       = 0x00,
17682     NM_SWC1GP       = 0x01,
17683     NM_LDC1GP       = 0x02,
17684     NM_SDC1GP       = 0x03,
17685 };
17686
17687 /* P.LS.S0 instruction pool */
17688 enum {
17689     NM_LBS9     = 0x00,
17690     NM_LHS9     = 0x04,
17691     NM_LWS9     = 0x08,
17692     NM_LDS9     = 0x0c,
17693
17694     NM_SBS9     = 0x01,
17695     NM_SHS9     = 0x05,
17696     NM_SWS9     = 0x09,
17697     NM_SDS9     = 0x0d,
17698
17699     NM_LBUS9    = 0x02,
17700     NM_LHUS9    = 0x06,
17701     NM_LWC1S9   = 0x0a,
17702     NM_LDC1S9   = 0x0e,
17703
17704     NM_P_PREFS9 = 0x03,
17705     NM_LWUS9    = 0x07,
17706     NM_SWC1S9   = 0x0b,
17707     NM_SDC1S9   = 0x0f,
17708 };
17709
17710 /* P.LS.S1 instruction pool */
17711 enum {
17712     NM_ASET_ACLR = 0x02,
17713     NM_UALH      = 0x04,
17714     NM_UASH      = 0x05,
17715     NM_CACHE     = 0x07,
17716     NM_P_LL      = 0x0a,
17717     NM_P_SC      = 0x0b,
17718 };
17719
17720 /* P.LS.E0 instruction pool */
17721 enum {
17722     NM_LBE      = 0x00,
17723     NM_SBE      = 0x01,
17724     NM_LBUE     = 0x02,
17725     NM_P_PREFE  = 0x03,
17726     NM_LHE      = 0x04,
17727     NM_SHE      = 0x05,
17728     NM_LHUE     = 0x06,
17729     NM_CACHEE   = 0x07,
17730     NM_LWE      = 0x08,
17731     NM_SWE      = 0x09,
17732     NM_P_LLE    = 0x0a,
17733     NM_P_SCE    = 0x0b,
17734 };
17735
17736 /* P.PREFE instruction pool */
17737 enum {
17738     NM_SYNCIE   = 0x00,
17739     NM_PREFE    = 0x01,
17740 };
17741
17742 /* P.LLE instruction pool */
17743 enum {
17744     NM_LLE      = 0x00,
17745     NM_LLWPE    = 0x01,
17746 };
17747
17748 /* P.SCE instruction pool */
17749 enum {
17750     NM_SCE      = 0x00,
17751     NM_SCWPE    = 0x01,
17752 };
17753
17754 /* P.LS.WM instruction pool */
17755 enum {
17756     NM_LWM       = 0x00,
17757     NM_SWM       = 0x01,
17758 };
17759
17760 /* P.LS.UAWM instruction pool */
17761 enum {
17762     NM_UALWM       = 0x00,
17763     NM_UASWM       = 0x01,
17764 };
17765
17766 /* P.BR3A instruction pool */
17767 enum {
17768     NM_BC1EQZC          = 0x00,
17769     NM_BC1NEZC          = 0x01,
17770     NM_BC2EQZC          = 0x02,
17771     NM_BC2NEZC          = 0x03,
17772     NM_BPOSGE32C        = 0x04,
17773 };
17774
17775 /* P16.RI instruction pool */
17776 enum {
17777     NM_P16_SYSCALL  = 0x01,
17778     NM_BREAK16      = 0x02,
17779     NM_SDBBP16      = 0x03,
17780 };
17781
17782 /* POOL16C_0 instruction pool */
17783 enum {
17784     NM_POOL16C_00      = 0x00,
17785 };
17786
17787 /* P16.JRC instruction pool */
17788 enum {
17789     NM_JRC          = 0x00,
17790     NM_JALRC16      = 0x01,
17791 };
17792
17793 /* P.SYSCALL instruction pool */
17794 enum {
17795     NM_SYSCALL      = 0x00,
17796     NM_HYPCALL      = 0x01,
17797 };
17798
17799 /* P.TRAP instruction pool */
17800 enum {
17801     NM_TEQ          = 0x00,
17802     NM_TNE          = 0x01,
17803 };
17804
17805 /* P.CMOVE instruction pool */
17806 enum {
17807     NM_MOVZ            = 0x00,
17808     NM_MOVN            = 0x01,
17809 };
17810
17811 /* POOL32Axf instruction pool */
17812 enum {
17813     NM_POOL32AXF_1 = 0x01,
17814     NM_POOL32AXF_2 = 0x02,
17815     NM_POOL32AXF_4 = 0x04,
17816     NM_POOL32AXF_5 = 0x05,
17817     NM_POOL32AXF_7 = 0x07,
17818 };
17819
17820 /* POOL32Axf_1 instruction pool */
17821 enum {
17822     NM_POOL32AXF_1_0 = 0x00,
17823     NM_POOL32AXF_1_1 = 0x01,
17824     NM_POOL32AXF_1_3 = 0x03,
17825     NM_POOL32AXF_1_4 = 0x04,
17826     NM_POOL32AXF_1_5 = 0x05,
17827     NM_POOL32AXF_1_7 = 0x07,
17828 };
17829
17830 /* POOL32Axf_2 instruction pool */
17831 enum {
17832     NM_POOL32AXF_2_0_7     = 0x00,
17833     NM_POOL32AXF_2_8_15    = 0x01,
17834     NM_POOL32AXF_2_16_23   = 0x02,
17835     NM_POOL32AXF_2_24_31   = 0x03,
17836 };
17837
17838 /* POOL32Axf_7 instruction pool */
17839 enum {
17840     NM_SHRA_R_QB    = 0x0,
17841     NM_SHRL_PH      = 0x1,
17842     NM_REPL_QB      = 0x2,
17843 };
17844
17845 /* POOL32Axf_1_0 instruction pool */
17846 enum {
17847     NM_MFHI = 0x0,
17848     NM_MFLO = 0x1,
17849     NM_MTHI = 0x2,
17850     NM_MTLO = 0x3,
17851 };
17852
17853 /* POOL32Axf_1_1 instruction pool */
17854 enum {
17855     NM_MTHLIP = 0x0,
17856     NM_SHILOV = 0x1,
17857 };
17858
17859 /* POOL32Axf_1_3 instruction pool */
17860 enum {
17861     NM_RDDSP    = 0x0,
17862     NM_WRDSP    = 0x1,
17863     NM_EXTP     = 0x2,
17864     NM_EXTPDP   = 0x3,
17865 };
17866
17867 /* POOL32Axf_1_4 instruction pool */
17868 enum {
17869     NM_SHLL_QB  = 0x0,
17870     NM_SHRL_QB  = 0x1,
17871 };
17872
17873 /* POOL32Axf_1_5 instruction pool */
17874 enum {
17875     NM_MAQ_S_W_PHR   = 0x0,
17876     NM_MAQ_S_W_PHL   = 0x1,
17877     NM_MAQ_SA_W_PHR  = 0x2,
17878     NM_MAQ_SA_W_PHL  = 0x3,
17879 };
17880
17881 /* POOL32Axf_1_7 instruction pool */
17882 enum {
17883     NM_EXTR_W       = 0x0,
17884     NM_EXTR_R_W     = 0x1,
17885     NM_EXTR_RS_W    = 0x2,
17886     NM_EXTR_S_H     = 0x3,
17887 };
17888
17889 /* POOL32Axf_2_0_7 instruction pool */
17890 enum {
17891     NM_DPA_W_PH     = 0x0,
17892     NM_DPAQ_S_W_PH  = 0x1,
17893     NM_DPS_W_PH     = 0x2,
17894     NM_DPSQ_S_W_PH  = 0x3,
17895     NM_BALIGN       = 0x4,
17896     NM_MADD         = 0x5,
17897     NM_MULT         = 0x6,
17898     NM_EXTRV_W      = 0x7,
17899 };
17900
17901 /* POOL32Axf_2_8_15 instruction pool */
17902 enum {
17903     NM_DPAX_W_PH    = 0x0,
17904     NM_DPAQ_SA_L_W  = 0x1,
17905     NM_DPSX_W_PH    = 0x2,
17906     NM_DPSQ_SA_L_W  = 0x3,
17907     NM_MADDU        = 0x5,
17908     NM_MULTU        = 0x6,
17909     NM_EXTRV_R_W    = 0x7,
17910 };
17911
17912 /* POOL32Axf_2_16_23 instruction pool */
17913 enum {
17914     NM_DPAU_H_QBL       = 0x0,
17915     NM_DPAQX_S_W_PH     = 0x1,
17916     NM_DPSU_H_QBL       = 0x2,
17917     NM_DPSQX_S_W_PH     = 0x3,
17918     NM_EXTPV            = 0x4,
17919     NM_MSUB             = 0x5,
17920     NM_MULSA_W_PH       = 0x6,
17921     NM_EXTRV_RS_W       = 0x7,
17922 };
17923
17924 /* POOL32Axf_2_24_31 instruction pool */
17925 enum {
17926     NM_DPAU_H_QBR       = 0x0,
17927     NM_DPAQX_SA_W_PH    = 0x1,
17928     NM_DPSU_H_QBR       = 0x2,
17929     NM_DPSQX_SA_W_PH    = 0x3,
17930     NM_EXTPDPV          = 0x4,
17931     NM_MSUBU            = 0x5,
17932     NM_MULSAQ_S_W_PH    = 0x6,
17933     NM_EXTRV_S_H        = 0x7,
17934 };
17935
17936 /* POOL32Axf_{4, 5} instruction pool */
17937 enum {
17938     NM_CLO      = 0x25,
17939     NM_CLZ      = 0x2d,
17940
17941     NM_TLBP     = 0x01,
17942     NM_TLBR     = 0x09,
17943     NM_TLBWI    = 0x11,
17944     NM_TLBWR    = 0x19,
17945     NM_TLBINV   = 0x03,
17946     NM_TLBINVF  = 0x0b,
17947     NM_DI       = 0x23,
17948     NM_EI       = 0x2b,
17949     NM_RDPGPR   = 0x70,
17950     NM_WRPGPR   = 0x78,
17951     NM_WAIT     = 0x61,
17952     NM_DERET    = 0x71,
17953     NM_ERETX    = 0x79,
17954
17955     /* nanoMIPS DSP instructions */
17956     NM_ABSQ_S_QB        = 0x00,
17957     NM_ABSQ_S_PH        = 0x08,
17958     NM_ABSQ_S_W         = 0x10,
17959     NM_PRECEQ_W_PHL     = 0x28,
17960     NM_PRECEQ_W_PHR     = 0x30,
17961     NM_PRECEQU_PH_QBL   = 0x38,
17962     NM_PRECEQU_PH_QBR   = 0x48,
17963     NM_PRECEU_PH_QBL    = 0x58,
17964     NM_PRECEU_PH_QBR    = 0x68,
17965     NM_PRECEQU_PH_QBLA  = 0x39,
17966     NM_PRECEQU_PH_QBRA  = 0x49,
17967     NM_PRECEU_PH_QBLA   = 0x59,
17968     NM_PRECEU_PH_QBRA   = 0x69,
17969     NM_REPLV_PH         = 0x01,
17970     NM_REPLV_QB         = 0x09,
17971     NM_BITREV           = 0x18,
17972     NM_INSV             = 0x20,
17973     NM_RADDU_W_QB       = 0x78,
17974
17975     NM_BITSWAP          = 0x05,
17976     NM_WSBH             = 0x3d,
17977 };
17978
17979 /* PP.SR instruction pool */
17980 enum {
17981     NM_SAVE         = 0x00,
17982     NM_RESTORE      = 0x02,
17983     NM_RESTORE_JRC  = 0x03,
17984 };
17985
17986 /* P.SR.F instruction pool */
17987 enum {
17988     NM_SAVEF        = 0x00,
17989     NM_RESTOREF     = 0x01,
17990 };
17991
17992 /* P16.SYSCALL  instruction pool */
17993 enum {
17994     NM_SYSCALL16     = 0x00,
17995     NM_HYPCALL16     = 0x01,
17996 };
17997
17998 /* POOL16C_00 instruction pool */
17999 enum {
18000     NM_NOT16           = 0x00,
18001     NM_XOR16           = 0x01,
18002     NM_AND16           = 0x02,
18003     NM_OR16            = 0x03,
18004 };
18005
18006 /* PP.LSX and PP.LSXS instruction pool */
18007 enum {
18008     NM_LBX      = 0x00,
18009     NM_LHX      = 0x04,
18010     NM_LWX      = 0x08,
18011     NM_LDX      = 0x0c,
18012
18013     NM_SBX      = 0x01,
18014     NM_SHX      = 0x05,
18015     NM_SWX      = 0x09,
18016     NM_SDX      = 0x0d,
18017
18018     NM_LBUX     = 0x02,
18019     NM_LHUX     = 0x06,
18020     NM_LWC1X    = 0x0a,
18021     NM_LDC1X    = 0x0e,
18022
18023     NM_LWUX     = 0x07,
18024     NM_SWC1X    = 0x0b,
18025     NM_SDC1X    = 0x0f,
18026
18027     NM_LHXS     = 0x04,
18028     NM_LWXS     = 0x08,
18029     NM_LDXS     = 0x0c,
18030
18031     NM_SHXS     = 0x05,
18032     NM_SWXS     = 0x09,
18033     NM_SDXS     = 0x0d,
18034
18035     NM_LHUXS    = 0x06,
18036     NM_LWC1XS   = 0x0a,
18037     NM_LDC1XS   = 0x0e,
18038
18039     NM_LWUXS    = 0x07,
18040     NM_SWC1XS   = 0x0b,
18041     NM_SDC1XS   = 0x0f,
18042 };
18043
18044 /* ERETx instruction pool */
18045 enum {
18046     NM_ERET     = 0x00,
18047     NM_ERETNC   = 0x01,
18048 };
18049
18050 /* POOL32FxF_{0, 1} insturction pool */
18051 enum {
18052     NM_CFC1     = 0x40,
18053     NM_CTC1     = 0x60,
18054     NM_MFC1     = 0x80,
18055     NM_MTC1     = 0xa0,
18056     NM_MFHC1    = 0xc0,
18057     NM_MTHC1    = 0xe0,
18058
18059     NM_CVT_S_PL = 0x84,
18060     NM_CVT_S_PU = 0xa4,
18061
18062     NM_CVT_L_S     = 0x004,
18063     NM_CVT_L_D     = 0x104,
18064     NM_CVT_W_S     = 0x024,
18065     NM_CVT_W_D     = 0x124,
18066
18067     NM_RSQRT_S     = 0x008,
18068     NM_RSQRT_D     = 0x108,
18069
18070     NM_SQRT_S      = 0x028,
18071     NM_SQRT_D      = 0x128,
18072
18073     NM_RECIP_S     = 0x048,
18074     NM_RECIP_D     = 0x148,
18075
18076     NM_FLOOR_L_S   = 0x00c,
18077     NM_FLOOR_L_D   = 0x10c,
18078
18079     NM_FLOOR_W_S   = 0x02c,
18080     NM_FLOOR_W_D   = 0x12c,
18081
18082     NM_CEIL_L_S    = 0x04c,
18083     NM_CEIL_L_D    = 0x14c,
18084     NM_CEIL_W_S    = 0x06c,
18085     NM_CEIL_W_D    = 0x16c,
18086     NM_TRUNC_L_S   = 0x08c,
18087     NM_TRUNC_L_D   = 0x18c,
18088     NM_TRUNC_W_S   = 0x0ac,
18089     NM_TRUNC_W_D   = 0x1ac,
18090     NM_ROUND_L_S   = 0x0cc,
18091     NM_ROUND_L_D   = 0x1cc,
18092     NM_ROUND_W_S   = 0x0ec,
18093     NM_ROUND_W_D   = 0x1ec,
18094
18095     NM_MOV_S       = 0x01,
18096     NM_MOV_D       = 0x81,
18097     NM_ABS_S       = 0x0d,
18098     NM_ABS_D       = 0x8d,
18099     NM_NEG_S       = 0x2d,
18100     NM_NEG_D       = 0xad,
18101     NM_CVT_D_S     = 0x04d,
18102     NM_CVT_D_W     = 0x0cd,
18103     NM_CVT_D_L     = 0x14d,
18104     NM_CVT_S_D     = 0x06d,
18105     NM_CVT_S_W     = 0x0ed,
18106     NM_CVT_S_L     = 0x16d,
18107 };
18108
18109 /* P.LL instruction pool */
18110 enum {
18111     NM_LL       = 0x00,
18112     NM_LLWP     = 0x01,
18113 };
18114
18115 /* P.SC instruction pool */
18116 enum {
18117     NM_SC       = 0x00,
18118     NM_SCWP     = 0x01,
18119 };
18120
18121 /* P.DVP instruction pool */
18122 enum {
18123     NM_DVP      = 0x00,
18124     NM_EVP      = 0x01,
18125 };
18126
18127
18128 /*
18129  *
18130  * nanoMIPS decoding engine
18131  *
18132  */
18133
18134
18135 /* extraction utilities */
18136
18137 #define NANOMIPS_EXTRACT_RD(op) ((op >> 7) & 0x7)
18138 #define NANOMIPS_EXTRACT_RS(op) ((op >> 4) & 0x7)
18139 #define NANOMIPS_EXTRACT_RS2(op) uMIPS_RS(op)
18140 #define NANOMIPS_EXTRACT_RS1(op) ((op >> 1) & 0x7)
18141 #define NANOMIPS_EXTRACT_RD5(op) ((op >> 5) & 0x1f)
18142 #define NANOMIPS_EXTRACT_RS5(op) (op & 0x1f)
18143
18144 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr3'). */
18145 static inline int decode_gpr_gpr3(int r)
18146 {
18147     static const int map[] = { 16, 17, 18, 19,  4,  5,  6,  7 };
18148
18149     return map[r & 0x7];
18150 }
18151
18152 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr3.src.store'). */
18153 static inline int decode_gpr_gpr3_src_store(int r)
18154 {
18155     static const int map[] = {  0, 17, 18, 19,  4,  5,  6,  7 };
18156
18157     return map[r & 0x7];
18158 }
18159
18160 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr4'). */
18161 static inline int decode_gpr_gpr4(int r)
18162 {
18163     static const int map[] = {  8,  9, 10, 11,  4,  5,  6,  7,
18164                                16, 17, 18, 19, 20, 21, 22, 23 };
18165
18166     return map[r & 0xf];
18167 }
18168
18169 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr4.zero'). */
18170 static inline int decode_gpr_gpr4_zero(int r)
18171 {
18172     static const int map[] = {  8,  9, 10,  0,  4,  5,  6,  7,
18173                                16, 17, 18, 19, 20, 21, 22, 23 };
18174
18175     return map[r & 0xf];
18176 }
18177
18178
18179 /* extraction utilities */
18180
18181 #define NANOMIPS_EXTRACT_RD(op) ((op >> 7) & 0x7)
18182 #define NANOMIPS_EXTRACT_RS(op) ((op >> 4) & 0x7)
18183 #define NANOMIPS_EXTRACT_RS2(op) uMIPS_RS(op)
18184 #define NANOMIPS_EXTRACT_RS1(op) ((op >> 1) & 0x7)
18185 #define NANOMIPS_EXTRACT_RD5(op) ((op >> 5) & 0x1f)
18186 #define NANOMIPS_EXTRACT_RS5(op) (op & 0x1f)
18187
18188
18189 static void gen_adjust_sp(DisasContext *ctx, int u)
18190 {
18191     gen_op_addr_addi(ctx, cpu_gpr[29], cpu_gpr[29], u);
18192 }
18193
18194 static void gen_save(DisasContext *ctx, uint8_t rt, uint8_t count,
18195                      uint8_t gp, uint16_t u)
18196 {
18197     int counter = 0;
18198     TCGv va = tcg_temp_new();
18199     TCGv t0 = tcg_temp_new();
18200
18201     while (counter != count) {
18202         bool use_gp = gp && (counter == count - 1);
18203         int this_rt = use_gp ? 28 : (rt & 0x10) | ((rt + counter) & 0x1f);
18204         int this_offset = -((counter + 1) << 2);
18205         gen_base_offset_addr(ctx, va, 29, this_offset);
18206         gen_load_gpr(t0, this_rt);
18207         tcg_gen_qemu_st_tl(t0, va, ctx->mem_idx,
18208                            (MO_TEUL | ctx->default_tcg_memop_mask));
18209         counter++;
18210     }
18211
18212     /* adjust stack pointer */
18213     gen_adjust_sp(ctx, -u);
18214
18215     tcg_temp_free(t0);
18216     tcg_temp_free(va);
18217 }
18218
18219 static void gen_restore(DisasContext *ctx, uint8_t rt, uint8_t count,
18220                         uint8_t gp, uint16_t u)
18221 {
18222     int counter = 0;
18223     TCGv va = tcg_temp_new();
18224     TCGv t0 = tcg_temp_new();
18225
18226     while (counter != count) {
18227         bool use_gp = gp && (counter == count - 1);
18228         int this_rt = use_gp ? 28 : (rt & 0x10) | ((rt + counter) & 0x1f);
18229         int this_offset = u - ((counter + 1) << 2);
18230         gen_base_offset_addr(ctx, va, 29, this_offset);
18231         tcg_gen_qemu_ld_tl(t0, va, ctx->mem_idx, MO_TESL |
18232                         ctx->default_tcg_memop_mask);
18233         tcg_gen_ext32s_tl(t0, t0);
18234         gen_store_gpr(t0, this_rt);
18235         counter++;
18236     }
18237
18238     /* adjust stack pointer */
18239     gen_adjust_sp(ctx, u);
18240
18241     tcg_temp_free(t0);
18242     tcg_temp_free(va);
18243 }
18244
18245 static void gen_pool16c_nanomips_insn(DisasContext *ctx)
18246 {
18247     int rt = decode_gpr_gpr3(NANOMIPS_EXTRACT_RD(ctx->opcode));
18248     int rs = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS(ctx->opcode));
18249
18250     switch (extract32(ctx->opcode, 2, 2)) {
18251     case NM_NOT16:
18252         gen_logic(ctx, OPC_NOR, rt, rs, 0);
18253         break;
18254     case NM_AND16:
18255         gen_logic(ctx, OPC_AND, rt, rt, rs);
18256         break;
18257     case NM_XOR16:
18258         gen_logic(ctx, OPC_XOR, rt, rt, rs);
18259         break;
18260     case NM_OR16:
18261         gen_logic(ctx, OPC_OR, rt, rt, rs);
18262         break;
18263     }
18264 }
18265
18266 static void gen_pool32a0_nanomips_insn(CPUMIPSState *env, DisasContext *ctx)
18267 {
18268     int rt = extract32(ctx->opcode, 21, 5);
18269     int rs = extract32(ctx->opcode, 16, 5);
18270     int rd = extract32(ctx->opcode, 11, 5);
18271
18272     switch (extract32(ctx->opcode, 3, 7)) {
18273     case NM_P_TRAP:
18274         switch (extract32(ctx->opcode, 10, 1)) {
18275         case NM_TEQ:
18276             check_nms(ctx);
18277             gen_trap(ctx, OPC_TEQ, rs, rt, -1);
18278             break;
18279         case NM_TNE:
18280             check_nms(ctx);
18281             gen_trap(ctx, OPC_TNE, rs, rt, -1);
18282             break;
18283         }
18284         break;
18285     case NM_RDHWR:
18286         check_nms(ctx);
18287         gen_rdhwr(ctx, rt, rs, extract32(ctx->opcode, 11, 3));
18288         break;
18289     case NM_SEB:
18290         check_nms(ctx);
18291         gen_bshfl(ctx, OPC_SEB, rs, rt);
18292         break;
18293     case NM_SEH:
18294         gen_bshfl(ctx, OPC_SEH, rs, rt);
18295         break;
18296     case NM_SLLV:
18297         gen_shift(ctx, OPC_SLLV, rd, rt, rs);
18298         break;
18299     case NM_SRLV:
18300         gen_shift(ctx, OPC_SRLV, rd, rt, rs);
18301         break;
18302     case NM_SRAV:
18303         gen_shift(ctx, OPC_SRAV, rd, rt, rs);
18304         break;
18305     case NM_ROTRV:
18306         gen_shift(ctx, OPC_ROTRV, rd, rt, rs);
18307         break;
18308     case NM_ADD:
18309         gen_arith(ctx, OPC_ADD, rd, rs, rt);
18310         break;
18311     case NM_ADDU:
18312         gen_arith(ctx, OPC_ADDU, rd, rs, rt);
18313         break;
18314     case NM_SUB:
18315         check_nms(ctx);
18316         gen_arith(ctx, OPC_SUB, rd, rs, rt);
18317         break;
18318     case NM_SUBU:
18319         gen_arith(ctx, OPC_SUBU, rd, rs, rt);
18320         break;
18321     case NM_P_CMOVE:
18322         switch (extract32(ctx->opcode, 10, 1)) {
18323         case NM_MOVZ:
18324             gen_cond_move(ctx, OPC_MOVZ, rd, rs, rt);
18325             break;
18326         case NM_MOVN:
18327             gen_cond_move(ctx, OPC_MOVN, rd, rs, rt);
18328             break;
18329         }
18330         break;
18331     case NM_AND:
18332         gen_logic(ctx, OPC_AND, rd, rs, rt);
18333         break;
18334     case NM_OR:
18335         gen_logic(ctx, OPC_OR, rd, rs, rt);
18336         break;
18337     case NM_NOR:
18338         gen_logic(ctx, OPC_NOR, rd, rs, rt);
18339         break;
18340     case NM_XOR:
18341         gen_logic(ctx, OPC_XOR, rd, rs, rt);
18342         break;
18343     case NM_SLT:
18344         gen_slt(ctx, OPC_SLT, rd, rs, rt);
18345         break;
18346     case NM_P_SLTU:
18347         if (rd == 0) {
18348             /* P_DVP */
18349 #ifndef CONFIG_USER_ONLY
18350             TCGv t0 = tcg_temp_new();
18351             switch (extract32(ctx->opcode, 10, 1)) {
18352             case NM_DVP:
18353                 if (ctx->vp) {
18354                     check_cp0_enabled(ctx);
18355                     gen_helper_dvp(t0, cpu_env);
18356                     gen_store_gpr(t0, rt);
18357                 }
18358                 break;
18359             case NM_EVP:
18360                 if (ctx->vp) {
18361                     check_cp0_enabled(ctx);
18362                     gen_helper_evp(t0, cpu_env);
18363                     gen_store_gpr(t0, rt);
18364                 }
18365                 break;
18366             }
18367             tcg_temp_free(t0);
18368 #endif
18369         } else {
18370             gen_slt(ctx, OPC_SLTU, rd, rs, rt);
18371         }
18372         break;
18373     case NM_SOV:
18374         {
18375             TCGv t0 = tcg_temp_new();
18376             TCGv t1 = tcg_temp_new();
18377             TCGv t2 = tcg_temp_new();
18378
18379             gen_load_gpr(t1, rs);
18380             gen_load_gpr(t2, rt);
18381             tcg_gen_add_tl(t0, t1, t2);
18382             tcg_gen_ext32s_tl(t0, t0);
18383             tcg_gen_xor_tl(t1, t1, t2);
18384             tcg_gen_xor_tl(t2, t0, t2);
18385             tcg_gen_andc_tl(t1, t2, t1);
18386
18387             /* operands of same sign, result different sign */
18388             tcg_gen_setcondi_tl(TCG_COND_LT, t0, t1, 0);
18389             gen_store_gpr(t0, rd);
18390
18391             tcg_temp_free(t0);
18392             tcg_temp_free(t1);
18393             tcg_temp_free(t2);
18394         }
18395         break;
18396     case NM_MUL:
18397         gen_r6_muldiv(ctx, R6_OPC_MUL, rd, rs, rt);
18398         break;
18399     case NM_MUH:
18400         gen_r6_muldiv(ctx, R6_OPC_MUH, rd, rs, rt);
18401         break;
18402     case NM_MULU:
18403         gen_r6_muldiv(ctx, R6_OPC_MULU, rd, rs, rt);
18404         break;
18405     case NM_MUHU:
18406         gen_r6_muldiv(ctx, R6_OPC_MUHU, rd, rs, rt);
18407         break;
18408     case NM_DIV:
18409         gen_r6_muldiv(ctx, R6_OPC_DIV, rd, rs, rt);
18410         break;
18411     case NM_MOD:
18412         gen_r6_muldiv(ctx, R6_OPC_MOD, rd, rs, rt);
18413         break;
18414     case NM_DIVU:
18415         gen_r6_muldiv(ctx, R6_OPC_DIVU, rd, rs, rt);
18416         break;
18417     case NM_MODU:
18418         gen_r6_muldiv(ctx, R6_OPC_MODU, rd, rs, rt);
18419         break;
18420 #ifndef CONFIG_USER_ONLY
18421     case NM_MFC0:
18422         check_cp0_enabled(ctx);
18423         if (rt == 0) {
18424             /* Treat as NOP. */
18425             break;
18426         }
18427         gen_mfc0(ctx, cpu_gpr[rt], rs, extract32(ctx->opcode, 11, 3));
18428         break;
18429     case NM_MTC0:
18430         check_cp0_enabled(ctx);
18431         {
18432             TCGv t0 = tcg_temp_new();
18433
18434             gen_load_gpr(t0, rt);
18435             gen_mtc0(ctx, t0, rs, extract32(ctx->opcode, 11, 3));
18436             tcg_temp_free(t0);
18437         }
18438         break;
18439     case NM_D_E_MT_VPE:
18440         {
18441             uint8_t sc = extract32(ctx->opcode, 10, 1);
18442             TCGv t0 = tcg_temp_new();
18443
18444             switch (sc) {
18445             case 0:
18446                 if (rs == 1) {
18447                     /* DMT */
18448                     check_cp0_mt(ctx);
18449                     gen_helper_dmt(t0);
18450                     gen_store_gpr(t0, rt);
18451                 } else if (rs == 0) {
18452                     /* DVPE */
18453                     check_cp0_mt(ctx);
18454                     gen_helper_dvpe(t0, cpu_env);
18455                     gen_store_gpr(t0, rt);
18456                 } else {
18457                     generate_exception_end(ctx, EXCP_RI);
18458                 }
18459                 break;
18460             case 1:
18461                 if (rs == 1) {
18462                     /* EMT */
18463                     check_cp0_mt(ctx);
18464                     gen_helper_emt(t0);
18465                     gen_store_gpr(t0, rt);
18466                 } else if (rs == 0) {
18467                     /* EVPE */
18468                     check_cp0_mt(ctx);
18469                     gen_helper_evpe(t0, cpu_env);
18470                     gen_store_gpr(t0, rt);
18471                 } else {
18472                     generate_exception_end(ctx, EXCP_RI);
18473                 }
18474                 break;
18475             }
18476
18477             tcg_temp_free(t0);
18478         }
18479         break;
18480     case NM_FORK:
18481         check_mt(ctx);
18482         {
18483             TCGv t0 = tcg_temp_new();
18484             TCGv t1 = tcg_temp_new();
18485
18486             gen_load_gpr(t0, rt);
18487             gen_load_gpr(t1, rs);
18488             gen_helper_fork(t0, t1);
18489             tcg_temp_free(t0);
18490             tcg_temp_free(t1);
18491         }
18492         break;
18493     case NM_MFTR:
18494     case NM_MFHTR:
18495         check_cp0_enabled(ctx);
18496         if (rd == 0) {
18497             /* Treat as NOP. */
18498             return;
18499         }
18500         gen_mftr(env, ctx, rs, rt, extract32(ctx->opcode, 10, 1),
18501                  extract32(ctx->opcode, 11, 5), extract32(ctx->opcode, 3, 1));
18502         break;
18503     case NM_MTTR:
18504     case NM_MTHTR:
18505         check_cp0_enabled(ctx);
18506         gen_mttr(env, ctx, rs, rt, extract32(ctx->opcode, 10, 1),
18507                  extract32(ctx->opcode, 11, 5), extract32(ctx->opcode, 3, 1));
18508         break;
18509     case NM_YIELD:
18510         check_mt(ctx);
18511         {
18512             TCGv t0 = tcg_temp_new();
18513
18514             gen_load_gpr(t0, rs);
18515             gen_helper_yield(t0, cpu_env, t0);
18516             gen_store_gpr(t0, rt);
18517             tcg_temp_free(t0);
18518         }
18519         break;
18520 #endif
18521     default:
18522         generate_exception_end(ctx, EXCP_RI);
18523         break;
18524     }
18525 }
18526
18527 /* dsp */
18528 static void gen_pool32axf_1_5_nanomips_insn(DisasContext *ctx, uint32_t opc,
18529                                             int ret, int v1, int v2)
18530 {
18531     TCGv_i32 t0;
18532     TCGv v0_t;
18533     TCGv v1_t;
18534
18535     t0 = tcg_temp_new_i32();
18536
18537     v0_t = tcg_temp_new();
18538     v1_t = tcg_temp_new();
18539
18540     tcg_gen_movi_i32(t0, v2 >> 3);
18541
18542     gen_load_gpr(v0_t, ret);
18543     gen_load_gpr(v1_t, v1);
18544
18545     switch (opc) {
18546     case NM_MAQ_S_W_PHR:
18547         check_dsp(ctx);
18548         gen_helper_maq_s_w_phr(t0, v1_t, v0_t, cpu_env);
18549         break;
18550     case NM_MAQ_S_W_PHL:
18551         check_dsp(ctx);
18552         gen_helper_maq_s_w_phl(t0, v1_t, v0_t, cpu_env);
18553         break;
18554     case NM_MAQ_SA_W_PHR:
18555         check_dsp(ctx);
18556         gen_helper_maq_sa_w_phr(t0, v1_t, v0_t, cpu_env);
18557         break;
18558     case NM_MAQ_SA_W_PHL:
18559         check_dsp(ctx);
18560         gen_helper_maq_sa_w_phl(t0, v1_t, v0_t, cpu_env);
18561         break;
18562     default:
18563         generate_exception_end(ctx, EXCP_RI);
18564         break;
18565     }
18566
18567     tcg_temp_free_i32(t0);
18568
18569     tcg_temp_free(v0_t);
18570     tcg_temp_free(v1_t);
18571 }
18572
18573
18574 static void gen_pool32axf_1_nanomips_insn(DisasContext *ctx, uint32_t opc,
18575                                     int ret, int v1, int v2)
18576 {
18577     int16_t imm;
18578     TCGv t0 = tcg_temp_new();
18579     TCGv t1 = tcg_temp_new();
18580     TCGv v0_t = tcg_temp_new();
18581
18582     gen_load_gpr(v0_t, v1);
18583
18584     switch (opc) {
18585     case NM_POOL32AXF_1_0:
18586         check_dsp(ctx);
18587         switch (extract32(ctx->opcode, 12, 2)) {
18588         case NM_MFHI:
18589             gen_HILO(ctx, OPC_MFHI, v2 >> 3, ret);
18590             break;
18591         case NM_MFLO:
18592             gen_HILO(ctx, OPC_MFLO, v2 >> 3, ret);
18593             break;
18594         case NM_MTHI:
18595             gen_HILO(ctx, OPC_MTHI, v2 >> 3, v1);
18596             break;
18597         case NM_MTLO:
18598             gen_HILO(ctx, OPC_MTLO, v2 >> 3, v1);
18599             break;
18600         }
18601         break;
18602     case NM_POOL32AXF_1_1:
18603         check_dsp(ctx);
18604         switch (extract32(ctx->opcode, 12, 2)) {
18605         case NM_MTHLIP:
18606             tcg_gen_movi_tl(t0, v2);
18607             gen_helper_mthlip(t0, v0_t, cpu_env);
18608             break;
18609         case NM_SHILOV:
18610             tcg_gen_movi_tl(t0, v2 >> 3);
18611             gen_helper_shilo(t0, v0_t, cpu_env);
18612             break;
18613         default:
18614             generate_exception_end(ctx, EXCP_RI);
18615             break;
18616         }
18617         break;
18618     case NM_POOL32AXF_1_3:
18619         check_dsp(ctx);
18620         imm = extract32(ctx->opcode, 14, 7);
18621         switch (extract32(ctx->opcode, 12, 2)) {
18622         case NM_RDDSP:
18623             tcg_gen_movi_tl(t0, imm);
18624             gen_helper_rddsp(t0, t0, cpu_env);
18625             gen_store_gpr(t0, ret);
18626             break;
18627         case NM_WRDSP:
18628             gen_load_gpr(t0, ret);
18629             tcg_gen_movi_tl(t1, imm);
18630             gen_helper_wrdsp(t0, t1, cpu_env);
18631             break;
18632         case NM_EXTP:
18633             tcg_gen_movi_tl(t0, v2 >> 3);
18634             tcg_gen_movi_tl(t1, v1);
18635             gen_helper_extp(t0, t0, t1, cpu_env);
18636             gen_store_gpr(t0, ret);
18637             break;
18638         case NM_EXTPDP:
18639             tcg_gen_movi_tl(t0, v2 >> 3);
18640             tcg_gen_movi_tl(t1, v1);
18641             gen_helper_extpdp(t0, t0, t1, cpu_env);
18642             gen_store_gpr(t0, ret);
18643             break;
18644         }
18645         break;
18646     case NM_POOL32AXF_1_4:
18647         check_dsp(ctx);
18648         tcg_gen_movi_tl(t0, v2 >> 2);
18649         switch (extract32(ctx->opcode, 12, 1)) {
18650         case NM_SHLL_QB:
18651             gen_helper_shll_qb(t0, t0, v0_t, cpu_env);
18652             gen_store_gpr(t0, ret);
18653             break;
18654         case NM_SHRL_QB:
18655             gen_helper_shrl_qb(t0, t0, v0_t);
18656             gen_store_gpr(t0, ret);
18657             break;
18658         }
18659         break;
18660     case NM_POOL32AXF_1_5:
18661         opc = extract32(ctx->opcode, 12, 2);
18662         gen_pool32axf_1_5_nanomips_insn(ctx, opc, ret, v1, v2);
18663         break;
18664     case NM_POOL32AXF_1_7:
18665         check_dsp(ctx);
18666         tcg_gen_movi_tl(t0, v2 >> 3);
18667         tcg_gen_movi_tl(t1, v1);
18668         switch (extract32(ctx->opcode, 12, 2)) {
18669         case NM_EXTR_W:
18670             gen_helper_extr_w(t0, t0, t1, cpu_env);
18671             gen_store_gpr(t0, ret);
18672             break;
18673         case NM_EXTR_R_W:
18674             gen_helper_extr_r_w(t0, t0, t1, cpu_env);
18675             gen_store_gpr(t0, ret);
18676             break;
18677         case NM_EXTR_RS_W:
18678             gen_helper_extr_rs_w(t0, t0, t1, cpu_env);
18679             gen_store_gpr(t0, ret);
18680             break;
18681         case NM_EXTR_S_H:
18682             gen_helper_extr_s_h(t0, t0, t1, cpu_env);
18683             gen_store_gpr(t0, ret);
18684             break;
18685         }
18686         break;
18687     default:
18688         generate_exception_end(ctx, EXCP_RI);
18689         break;
18690     }
18691
18692     tcg_temp_free(t0);
18693     tcg_temp_free(t1);
18694     tcg_temp_free(v0_t);
18695 }
18696
18697 static void gen_pool32axf_2_multiply(DisasContext *ctx, uint32_t opc,
18698                                     TCGv v0, TCGv v1, int rd)
18699 {
18700     TCGv_i32 t0;
18701
18702     t0 = tcg_temp_new_i32();
18703
18704     tcg_gen_movi_i32(t0, rd >> 3);
18705
18706     switch (opc) {
18707     case NM_POOL32AXF_2_0_7:
18708         switch (extract32(ctx->opcode, 9, 3)) {
18709         case NM_DPA_W_PH:
18710             check_dsp_r2(ctx);
18711             gen_helper_dpa_w_ph(t0, v1, v0, cpu_env);
18712             break;
18713         case NM_DPAQ_S_W_PH:
18714             check_dsp(ctx);
18715             gen_helper_dpaq_s_w_ph(t0, v1, v0, cpu_env);
18716             break;
18717         case NM_DPS_W_PH:
18718             check_dsp_r2(ctx);
18719             gen_helper_dps_w_ph(t0, v1, v0, cpu_env);
18720             break;
18721         case NM_DPSQ_S_W_PH:
18722             check_dsp(ctx);
18723             gen_helper_dpsq_s_w_ph(t0, v1, v0, cpu_env);
18724             break;
18725         default:
18726             generate_exception_end(ctx, EXCP_RI);
18727             break;
18728         }
18729         break;
18730     case NM_POOL32AXF_2_8_15:
18731         switch (extract32(ctx->opcode, 9, 3)) {
18732         case NM_DPAX_W_PH:
18733             check_dsp_r2(ctx);
18734             gen_helper_dpax_w_ph(t0, v0, v1, cpu_env);
18735             break;
18736         case NM_DPAQ_SA_L_W:
18737             check_dsp(ctx);
18738             gen_helper_dpaq_sa_l_w(t0, v0, v1, cpu_env);
18739             break;
18740         case NM_DPSX_W_PH:
18741             check_dsp_r2(ctx);
18742             gen_helper_dpsx_w_ph(t0, v0, v1, cpu_env);
18743             break;
18744         case NM_DPSQ_SA_L_W:
18745             check_dsp(ctx);
18746             gen_helper_dpsq_sa_l_w(t0, v0, v1, cpu_env);
18747             break;
18748         default:
18749             generate_exception_end(ctx, EXCP_RI);
18750             break;
18751         }
18752         break;
18753     case NM_POOL32AXF_2_16_23:
18754         switch (extract32(ctx->opcode, 9, 3)) {
18755         case NM_DPAU_H_QBL:
18756             check_dsp(ctx);
18757             gen_helper_dpau_h_qbl(t0, v0, v1, cpu_env);
18758             break;
18759         case NM_DPAQX_S_W_PH:
18760             check_dsp_r2(ctx);
18761             gen_helper_dpaqx_s_w_ph(t0, v0, v1, cpu_env);
18762             break;
18763         case NM_DPSU_H_QBL:
18764             check_dsp(ctx);
18765             gen_helper_dpsu_h_qbl(t0, v0, v1, cpu_env);
18766             break;
18767         case NM_DPSQX_S_W_PH:
18768             check_dsp_r2(ctx);
18769             gen_helper_dpsqx_s_w_ph(t0, v0, v1, cpu_env);
18770             break;
18771         case NM_MULSA_W_PH:
18772             check_dsp_r2(ctx);
18773             gen_helper_mulsa_w_ph(t0, v0, v1, cpu_env);
18774             break;
18775         default:
18776             generate_exception_end(ctx, EXCP_RI);
18777             break;
18778         }
18779         break;
18780     case NM_POOL32AXF_2_24_31:
18781         switch (extract32(ctx->opcode, 9, 3)) {
18782         case NM_DPAU_H_QBR:
18783             check_dsp(ctx);
18784             gen_helper_dpau_h_qbr(t0, v1, v0, cpu_env);
18785             break;
18786         case NM_DPAQX_SA_W_PH:
18787             check_dsp_r2(ctx);
18788             gen_helper_dpaqx_sa_w_ph(t0, v1, v0, cpu_env);
18789             break;
18790         case NM_DPSU_H_QBR:
18791             check_dsp(ctx);
18792             gen_helper_dpsu_h_qbr(t0, v1, v0, cpu_env);
18793             break;
18794         case NM_DPSQX_SA_W_PH:
18795             check_dsp_r2(ctx);
18796             gen_helper_dpsqx_sa_w_ph(t0, v1, v0, cpu_env);
18797             break;
18798         case NM_MULSAQ_S_W_PH:
18799             check_dsp(ctx);
18800             gen_helper_mulsaq_s_w_ph(t0, v1, v0, cpu_env);
18801             break;
18802         default:
18803             generate_exception_end(ctx, EXCP_RI);
18804             break;
18805         }
18806         break;
18807     default:
18808         generate_exception_end(ctx, EXCP_RI);
18809         break;
18810     }
18811
18812     tcg_temp_free_i32(t0);
18813 }
18814
18815 static void gen_pool32axf_2_nanomips_insn(DisasContext *ctx, uint32_t opc,
18816                                           int rt, int rs, int rd)
18817 {
18818     int ret = rt;
18819     TCGv t0 = tcg_temp_new();
18820     TCGv t1 = tcg_temp_new();
18821     TCGv v0_t = tcg_temp_new();
18822     TCGv v1_t = tcg_temp_new();
18823
18824     gen_load_gpr(v0_t, rt);
18825     gen_load_gpr(v1_t, rs);
18826
18827     switch (opc) {
18828     case NM_POOL32AXF_2_0_7:
18829         switch (extract32(ctx->opcode, 9, 3)) {
18830         case NM_DPA_W_PH:
18831         case NM_DPAQ_S_W_PH:
18832         case NM_DPS_W_PH:
18833         case NM_DPSQ_S_W_PH:
18834             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
18835             break;
18836         case NM_BALIGN:
18837             check_dsp_r2(ctx);
18838             if (rt != 0) {
18839                 gen_load_gpr(t0, rs);
18840                 rd &= 3;
18841                 if (rd != 0 && rd != 2) {
18842                     tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 8 * rd);
18843                     tcg_gen_ext32u_tl(t0, t0);
18844                     tcg_gen_shri_tl(t0, t0, 8 * (4 - rd));
18845                     tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
18846                 }
18847                 tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
18848             }
18849             break;
18850         case NM_MADD:
18851             check_dsp(ctx);
18852             {
18853                 int acc = extract32(ctx->opcode, 14, 2);
18854                 TCGv_i64 t2 = tcg_temp_new_i64();
18855                 TCGv_i64 t3 = tcg_temp_new_i64();
18856
18857                 gen_load_gpr(t0, rt);
18858                 gen_load_gpr(t1, rs);
18859                 tcg_gen_ext_tl_i64(t2, t0);
18860                 tcg_gen_ext_tl_i64(t3, t1);
18861                 tcg_gen_mul_i64(t2, t2, t3);
18862                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
18863                 tcg_gen_add_i64(t2, t2, t3);
18864                 tcg_temp_free_i64(t3);
18865                 gen_move_low32(cpu_LO[acc], t2);
18866                 gen_move_high32(cpu_HI[acc], t2);
18867                 tcg_temp_free_i64(t2);
18868             }
18869             break;
18870         case NM_MULT:
18871             check_dsp(ctx);
18872             {
18873                 int acc = extract32(ctx->opcode, 14, 2);
18874                 TCGv_i32 t2 = tcg_temp_new_i32();
18875                 TCGv_i32 t3 = tcg_temp_new_i32();
18876
18877                 gen_load_gpr(t0, rs);
18878                 gen_load_gpr(t1, rt);
18879                 tcg_gen_trunc_tl_i32(t2, t0);
18880                 tcg_gen_trunc_tl_i32(t3, t1);
18881                 tcg_gen_muls2_i32(t2, t3, t2, t3);
18882                 tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
18883                 tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
18884                 tcg_temp_free_i32(t2);
18885                 tcg_temp_free_i32(t3);
18886             }
18887             break;
18888         case NM_EXTRV_W:
18889             check_dsp(ctx);
18890             gen_load_gpr(v1_t, rs);
18891             tcg_gen_movi_tl(t0, rd >> 3);
18892             gen_helper_extr_w(t0, t0, v1_t, cpu_env);
18893             gen_store_gpr(t0, ret);
18894             break;
18895         }
18896         break;
18897     case NM_POOL32AXF_2_8_15:
18898         switch (extract32(ctx->opcode, 9, 3)) {
18899         case NM_DPAX_W_PH:
18900         case NM_DPAQ_SA_L_W:
18901         case NM_DPSX_W_PH:
18902         case NM_DPSQ_SA_L_W:
18903             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
18904             break;
18905         case NM_MADDU:
18906             check_dsp(ctx);
18907             {
18908                 int acc = extract32(ctx->opcode, 14, 2);
18909                 TCGv_i64 t2 = tcg_temp_new_i64();
18910                 TCGv_i64 t3 = tcg_temp_new_i64();
18911
18912                 gen_load_gpr(t0, rs);
18913                 gen_load_gpr(t1, rt);
18914                 tcg_gen_ext32u_tl(t0, t0);
18915                 tcg_gen_ext32u_tl(t1, t1);
18916                 tcg_gen_extu_tl_i64(t2, t0);
18917                 tcg_gen_extu_tl_i64(t3, t1);
18918                 tcg_gen_mul_i64(t2, t2, t3);
18919                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
18920                 tcg_gen_add_i64(t2, t2, t3);
18921                 tcg_temp_free_i64(t3);
18922                 gen_move_low32(cpu_LO[acc], t2);
18923                 gen_move_high32(cpu_HI[acc], t2);
18924                 tcg_temp_free_i64(t2);
18925             }
18926             break;
18927         case NM_MULTU:
18928             check_dsp(ctx);
18929             {
18930                 int acc = extract32(ctx->opcode, 14, 2);
18931                 TCGv_i32 t2 = tcg_temp_new_i32();
18932                 TCGv_i32 t3 = tcg_temp_new_i32();
18933
18934                 gen_load_gpr(t0, rs);
18935                 gen_load_gpr(t1, rt);
18936                 tcg_gen_trunc_tl_i32(t2, t0);
18937                 tcg_gen_trunc_tl_i32(t3, t1);
18938                 tcg_gen_mulu2_i32(t2, t3, t2, t3);
18939                 tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
18940                 tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
18941                 tcg_temp_free_i32(t2);
18942                 tcg_temp_free_i32(t3);
18943             }
18944             break;
18945         case NM_EXTRV_R_W:
18946             check_dsp(ctx);
18947             tcg_gen_movi_tl(t0, rd >> 3);
18948             gen_helper_extr_r_w(t0, t0, v1_t, cpu_env);
18949             gen_store_gpr(t0, ret);
18950             break;
18951         default:
18952             generate_exception_end(ctx, EXCP_RI);
18953             break;
18954         }
18955         break;
18956     case NM_POOL32AXF_2_16_23:
18957         switch (extract32(ctx->opcode, 9, 3)) {
18958         case NM_DPAU_H_QBL:
18959         case NM_DPAQX_S_W_PH:
18960         case NM_DPSU_H_QBL:
18961         case NM_DPSQX_S_W_PH:
18962         case NM_MULSA_W_PH:
18963             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
18964             break;
18965         case NM_EXTPV:
18966             check_dsp(ctx);
18967             tcg_gen_movi_tl(t0, rd >> 3);
18968             gen_helper_extp(t0, t0, v1_t, cpu_env);
18969             gen_store_gpr(t0, ret);
18970             break;
18971         case NM_MSUB:
18972             check_dsp(ctx);
18973             {
18974                 int acc = extract32(ctx->opcode, 14, 2);
18975                 TCGv_i64 t2 = tcg_temp_new_i64();
18976                 TCGv_i64 t3 = tcg_temp_new_i64();
18977
18978                 gen_load_gpr(t0, rs);
18979                 gen_load_gpr(t1, rt);
18980                 tcg_gen_ext_tl_i64(t2, t0);
18981                 tcg_gen_ext_tl_i64(t3, t1);
18982                 tcg_gen_mul_i64(t2, t2, t3);
18983                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
18984                 tcg_gen_sub_i64(t2, t3, t2);
18985                 tcg_temp_free_i64(t3);
18986                 gen_move_low32(cpu_LO[acc], t2);
18987                 gen_move_high32(cpu_HI[acc], t2);
18988                 tcg_temp_free_i64(t2);
18989             }
18990             break;
18991         case NM_EXTRV_RS_W:
18992             check_dsp(ctx);
18993             tcg_gen_movi_tl(t0, rd >> 3);
18994             gen_helper_extr_rs_w(t0, t0, v1_t, cpu_env);
18995             gen_store_gpr(t0, ret);
18996             break;
18997         }
18998         break;
18999     case NM_POOL32AXF_2_24_31:
19000         switch (extract32(ctx->opcode, 9, 3)) {
19001         case NM_DPAU_H_QBR:
19002         case NM_DPAQX_SA_W_PH:
19003         case NM_DPSU_H_QBR:
19004         case NM_DPSQX_SA_W_PH:
19005         case NM_MULSAQ_S_W_PH:
19006             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
19007             break;
19008         case NM_EXTPDPV:
19009             check_dsp(ctx);
19010             tcg_gen_movi_tl(t0, rd >> 3);
19011             gen_helper_extpdp(t0, t0, v1_t, cpu_env);
19012             gen_store_gpr(t0, ret);
19013             break;
19014         case NM_MSUBU:
19015             check_dsp(ctx);
19016             {
19017                 int acc = extract32(ctx->opcode, 14, 2);
19018                 TCGv_i64 t2 = tcg_temp_new_i64();
19019                 TCGv_i64 t3 = tcg_temp_new_i64();
19020
19021                 gen_load_gpr(t0, rs);
19022                 gen_load_gpr(t1, rt);
19023                 tcg_gen_ext32u_tl(t0, t0);
19024                 tcg_gen_ext32u_tl(t1, t1);
19025                 tcg_gen_extu_tl_i64(t2, t0);
19026                 tcg_gen_extu_tl_i64(t3, t1);
19027                 tcg_gen_mul_i64(t2, t2, t3);
19028                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
19029                 tcg_gen_sub_i64(t2, t3, t2);
19030                 tcg_temp_free_i64(t3);
19031                 gen_move_low32(cpu_LO[acc], t2);
19032                 gen_move_high32(cpu_HI[acc], t2);
19033                 tcg_temp_free_i64(t2);
19034             }
19035             break;
19036         case NM_EXTRV_S_H:
19037             check_dsp(ctx);
19038             tcg_gen_movi_tl(t0, rd >> 3);
19039             gen_helper_extr_s_h(t0, t0, v0_t, cpu_env);
19040             gen_store_gpr(t0, ret);
19041             break;
19042         }
19043         break;
19044     default:
19045         generate_exception_end(ctx, EXCP_RI);
19046         break;
19047     }
19048
19049     tcg_temp_free(t0);
19050     tcg_temp_free(t1);
19051
19052     tcg_temp_free(v0_t);
19053     tcg_temp_free(v1_t);
19054 }
19055
19056 static void gen_pool32axf_4_nanomips_insn(DisasContext *ctx, uint32_t opc,
19057                                           int rt, int rs)
19058 {
19059     int ret = rt;
19060     TCGv t0 = tcg_temp_new();
19061     TCGv v0_t = tcg_temp_new();
19062
19063     gen_load_gpr(v0_t, rs);
19064
19065     switch (opc) {
19066     case NM_ABSQ_S_QB:
19067         check_dsp_r2(ctx);
19068         gen_helper_absq_s_qb(v0_t, v0_t, cpu_env);
19069         gen_store_gpr(v0_t, ret);
19070         break;
19071     case NM_ABSQ_S_PH:
19072         check_dsp(ctx);
19073         gen_helper_absq_s_ph(v0_t, v0_t, cpu_env);
19074         gen_store_gpr(v0_t, ret);
19075         break;
19076     case NM_ABSQ_S_W:
19077         check_dsp(ctx);
19078         gen_helper_absq_s_w(v0_t, v0_t, cpu_env);
19079         gen_store_gpr(v0_t, ret);
19080         break;
19081     case NM_PRECEQ_W_PHL:
19082         check_dsp(ctx);
19083         tcg_gen_andi_tl(v0_t, v0_t, 0xFFFF0000);
19084         tcg_gen_ext32s_tl(v0_t, v0_t);
19085         gen_store_gpr(v0_t, ret);
19086         break;
19087     case NM_PRECEQ_W_PHR:
19088         check_dsp(ctx);
19089         tcg_gen_andi_tl(v0_t, v0_t, 0x0000FFFF);
19090         tcg_gen_shli_tl(v0_t, v0_t, 16);
19091         tcg_gen_ext32s_tl(v0_t, v0_t);
19092         gen_store_gpr(v0_t, ret);
19093         break;
19094     case NM_PRECEQU_PH_QBL:
19095         check_dsp(ctx);
19096         gen_helper_precequ_ph_qbl(v0_t, v0_t);
19097         gen_store_gpr(v0_t, ret);
19098         break;
19099     case NM_PRECEQU_PH_QBR:
19100         check_dsp(ctx);
19101         gen_helper_precequ_ph_qbr(v0_t, v0_t);
19102         gen_store_gpr(v0_t, ret);
19103         break;
19104     case NM_PRECEQU_PH_QBLA:
19105         check_dsp(ctx);
19106         gen_helper_precequ_ph_qbla(v0_t, v0_t);
19107         gen_store_gpr(v0_t, ret);
19108         break;
19109     case NM_PRECEQU_PH_QBRA:
19110         check_dsp(ctx);
19111         gen_helper_precequ_ph_qbra(v0_t, v0_t);
19112         gen_store_gpr(v0_t, ret);
19113         break;
19114     case NM_PRECEU_PH_QBL:
19115         check_dsp(ctx);
19116         gen_helper_preceu_ph_qbl(v0_t, v0_t);
19117         gen_store_gpr(v0_t, ret);
19118         break;
19119     case NM_PRECEU_PH_QBR:
19120         check_dsp(ctx);
19121         gen_helper_preceu_ph_qbr(v0_t, v0_t);
19122         gen_store_gpr(v0_t, ret);
19123         break;
19124     case NM_PRECEU_PH_QBLA:
19125         check_dsp(ctx);
19126         gen_helper_preceu_ph_qbla(v0_t, v0_t);
19127         gen_store_gpr(v0_t, ret);
19128         break;
19129     case NM_PRECEU_PH_QBRA:
19130         check_dsp(ctx);
19131         gen_helper_preceu_ph_qbra(v0_t, v0_t);
19132         gen_store_gpr(v0_t, ret);
19133         break;
19134     case NM_REPLV_PH:
19135         check_dsp(ctx);
19136         tcg_gen_ext16u_tl(v0_t, v0_t);
19137         tcg_gen_shli_tl(t0, v0_t, 16);
19138         tcg_gen_or_tl(v0_t, v0_t, t0);
19139         tcg_gen_ext32s_tl(v0_t, v0_t);
19140         gen_store_gpr(v0_t, ret);
19141         break;
19142     case NM_REPLV_QB:
19143         check_dsp(ctx);
19144         tcg_gen_ext8u_tl(v0_t, v0_t);
19145         tcg_gen_shli_tl(t0, v0_t, 8);
19146         tcg_gen_or_tl(v0_t, v0_t, t0);
19147         tcg_gen_shli_tl(t0, v0_t, 16);
19148         tcg_gen_or_tl(v0_t, v0_t, t0);
19149         tcg_gen_ext32s_tl(v0_t, v0_t);
19150         gen_store_gpr(v0_t, ret);
19151         break;
19152     case NM_BITREV:
19153         check_dsp(ctx);
19154         gen_helper_bitrev(v0_t, v0_t);
19155         gen_store_gpr(v0_t, ret);
19156         break;
19157     case NM_INSV:
19158         check_dsp(ctx);
19159         {
19160             TCGv tv0 = tcg_temp_new();
19161
19162             gen_load_gpr(tv0, rt);
19163             gen_helper_insv(v0_t, cpu_env, v0_t, tv0);
19164             gen_store_gpr(v0_t, ret);
19165             tcg_temp_free(tv0);
19166         }
19167         break;
19168     case NM_RADDU_W_QB:
19169         check_dsp(ctx);
19170         gen_helper_raddu_w_qb(v0_t, v0_t);
19171         gen_store_gpr(v0_t, ret);
19172         break;
19173     case NM_BITSWAP:
19174         gen_bitswap(ctx, OPC_BITSWAP, ret, rs);
19175         break;
19176     case NM_CLO:
19177         check_nms(ctx);
19178         gen_cl(ctx, OPC_CLO, ret, rs);
19179         break;
19180     case NM_CLZ:
19181         check_nms(ctx);
19182         gen_cl(ctx, OPC_CLZ, ret, rs);
19183         break;
19184     case NM_WSBH:
19185         gen_bshfl(ctx, OPC_WSBH, ret, rs);
19186         break;
19187     default:
19188         generate_exception_end(ctx, EXCP_RI);
19189         break;
19190     }
19191
19192     tcg_temp_free(v0_t);
19193     tcg_temp_free(t0);
19194 }
19195
19196 static void gen_pool32axf_7_nanomips_insn(DisasContext *ctx, uint32_t opc,
19197                                           int rt, int rs, int rd)
19198 {
19199     TCGv t0 = tcg_temp_new();
19200     TCGv rs_t = tcg_temp_new();
19201
19202     gen_load_gpr(rs_t, rs);
19203
19204     switch (opc) {
19205     case NM_SHRA_R_QB:
19206         check_dsp_r2(ctx);
19207         tcg_gen_movi_tl(t0, rd >> 2);
19208         switch (extract32(ctx->opcode, 12, 1)) {
19209         case 0:
19210             /* NM_SHRA_QB */
19211             gen_helper_shra_qb(t0, t0, rs_t);
19212             gen_store_gpr(t0, rt);
19213             break;
19214         case 1:
19215             /* NM_SHRA_R_QB */
19216             gen_helper_shra_r_qb(t0, t0, rs_t);
19217             gen_store_gpr(t0, rt);
19218             break;
19219         }
19220         break;
19221     case NM_SHRL_PH:
19222         check_dsp_r2(ctx);
19223         tcg_gen_movi_tl(t0, rd >> 1);
19224         gen_helper_shrl_ph(t0, t0, rs_t);
19225         gen_store_gpr(t0, rt);
19226         break;
19227     case NM_REPL_QB:
19228         check_dsp(ctx);
19229         {
19230             int16_t imm;
19231             target_long result;
19232             imm = extract32(ctx->opcode, 13, 8);
19233             result = (uint32_t)imm << 24 |
19234                      (uint32_t)imm << 16 |
19235                      (uint32_t)imm << 8  |
19236                      (uint32_t)imm;
19237             result = (int32_t)result;
19238             tcg_gen_movi_tl(t0, result);
19239             gen_store_gpr(t0, rt);
19240         }
19241         break;
19242     default:
19243         generate_exception_end(ctx, EXCP_RI);
19244         break;
19245     }
19246     tcg_temp_free(t0);
19247     tcg_temp_free(rs_t);
19248 }
19249
19250
19251 static void gen_pool32axf_nanomips_insn(CPUMIPSState *env, DisasContext *ctx)
19252 {
19253     int rt = extract32(ctx->opcode, 21, 5);
19254     int rs = extract32(ctx->opcode, 16, 5);
19255     int rd = extract32(ctx->opcode, 11, 5);
19256
19257     switch (extract32(ctx->opcode, 6, 3)) {
19258     case NM_POOL32AXF_1:
19259         {
19260             int32_t op1 = extract32(ctx->opcode, 9, 3);
19261             gen_pool32axf_1_nanomips_insn(ctx, op1, rt, rs, rd);
19262         }
19263         break;
19264     case NM_POOL32AXF_2:
19265         {
19266             int32_t op1 = extract32(ctx->opcode, 12, 2);
19267             gen_pool32axf_2_nanomips_insn(ctx, op1, rt, rs, rd);
19268         }
19269         break;
19270     case NM_POOL32AXF_4:
19271         {
19272             int32_t op1 = extract32(ctx->opcode, 9, 7);
19273             gen_pool32axf_4_nanomips_insn(ctx, op1, rt, rs);
19274         }
19275         break;
19276     case NM_POOL32AXF_5:
19277         switch (extract32(ctx->opcode, 9, 7)) {
19278 #ifndef CONFIG_USER_ONLY
19279         case NM_TLBP:
19280             gen_cp0(env, ctx, OPC_TLBP, 0, 0);
19281             break;
19282         case NM_TLBR:
19283             gen_cp0(env, ctx, OPC_TLBR, 0, 0);
19284             break;
19285         case NM_TLBWI:
19286             gen_cp0(env, ctx, OPC_TLBWI, 0, 0);
19287             break;
19288         case NM_TLBWR:
19289             gen_cp0(env, ctx, OPC_TLBWR, 0, 0);
19290             break;
19291         case NM_TLBINV:
19292             gen_cp0(env, ctx, OPC_TLBINV, 0, 0);
19293             break;
19294         case NM_TLBINVF:
19295             gen_cp0(env, ctx, OPC_TLBINVF, 0, 0);
19296             break;
19297         case NM_DI:
19298             check_cp0_enabled(ctx);
19299             {
19300                 TCGv t0 = tcg_temp_new();
19301
19302                 save_cpu_state(ctx, 1);
19303                 gen_helper_di(t0, cpu_env);
19304                 gen_store_gpr(t0, rt);
19305             /* Stop translation as we may have switched the execution mode */
19306                 ctx->base.is_jmp = DISAS_STOP;
19307                 tcg_temp_free(t0);
19308             }
19309             break;
19310         case NM_EI:
19311             check_cp0_enabled(ctx);
19312             {
19313                 TCGv t0 = tcg_temp_new();
19314
19315                 save_cpu_state(ctx, 1);
19316                 gen_helper_ei(t0, cpu_env);
19317                 gen_store_gpr(t0, rt);
19318             /* Stop translation as we may have switched the execution mode */
19319                 ctx->base.is_jmp = DISAS_STOP;
19320                 tcg_temp_free(t0);
19321             }
19322             break;
19323         case NM_RDPGPR:
19324             gen_load_srsgpr(rs, rt);
19325             break;
19326         case NM_WRPGPR:
19327             gen_store_srsgpr(rs, rt);
19328             break;
19329         case NM_WAIT:
19330             gen_cp0(env, ctx, OPC_WAIT, 0, 0);
19331             break;
19332         case NM_DERET:
19333             gen_cp0(env, ctx, OPC_DERET, 0, 0);
19334             break;
19335         case NM_ERETX:
19336             gen_cp0(env, ctx, OPC_ERET, 0, 0);
19337             break;
19338 #endif
19339         default:
19340             generate_exception_end(ctx, EXCP_RI);
19341             break;
19342         }
19343         break;
19344     case NM_POOL32AXF_7:
19345         {
19346             int32_t op1 = extract32(ctx->opcode, 9, 3);
19347             gen_pool32axf_7_nanomips_insn(ctx, op1, rt, rs, rd);
19348         }
19349         break;
19350     default:
19351         generate_exception_end(ctx, EXCP_RI);
19352         break;
19353     }
19354 }
19355
19356 /* Immediate Value Compact Branches */
19357 static void gen_compute_imm_branch(DisasContext *ctx, uint32_t opc,
19358                                    int rt, int32_t imm, int32_t offset)
19359 {
19360     TCGCond cond;
19361     int bcond_compute = 0;
19362     TCGv t0 = tcg_temp_new();
19363     TCGv t1 = tcg_temp_new();
19364
19365     gen_load_gpr(t0, rt);
19366     tcg_gen_movi_tl(t1, imm);
19367     ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19368
19369     /* Load needed operands and calculate btarget */
19370     switch (opc) {
19371     case NM_BEQIC:
19372         if (rt == 0 && imm == 0) {
19373             /* Unconditional branch */
19374         } else if (rt == 0 && imm != 0) {
19375             /* Treat as NOP */
19376             goto out;
19377         } else {
19378             bcond_compute = 1;
19379             cond = TCG_COND_EQ;
19380         }
19381         break;
19382     case NM_BBEQZC:
19383     case NM_BBNEZC:
19384         check_nms(ctx);
19385         if (imm >= 32 && !(ctx->hflags & MIPS_HFLAG_64)) {
19386             generate_exception_end(ctx, EXCP_RI);
19387             goto out;
19388         } else if (rt == 0 && opc == NM_BBEQZC) {
19389             /* Unconditional branch */
19390         } else if (rt == 0 && opc == NM_BBNEZC) {
19391             /* Treat as NOP */
19392             goto out;
19393         } else {
19394             tcg_gen_shri_tl(t0, t0, imm);
19395             tcg_gen_andi_tl(t0, t0, 1);
19396             tcg_gen_movi_tl(t1, 0);
19397             bcond_compute = 1;
19398             if (opc == NM_BBEQZC) {
19399                 cond = TCG_COND_EQ;
19400             } else {
19401                 cond = TCG_COND_NE;
19402             }
19403         }
19404         break;
19405     case NM_BNEIC:
19406         if (rt == 0 && imm == 0) {
19407             /* Treat as NOP */
19408             goto out;
19409         } else if (rt == 0 && imm != 0) {
19410             /* Unconditional branch */
19411         } else {
19412             bcond_compute = 1;
19413             cond = TCG_COND_NE;
19414         }
19415         break;
19416     case NM_BGEIC:
19417         if (rt == 0 && imm == 0) {
19418             /* Unconditional branch */
19419         } else  {
19420             bcond_compute = 1;
19421             cond = TCG_COND_GE;
19422         }
19423         break;
19424     case NM_BLTIC:
19425         bcond_compute = 1;
19426         cond = TCG_COND_LT;
19427         break;
19428     case NM_BGEIUC:
19429         if (rt == 0 && imm == 0) {
19430             /* Unconditional branch */
19431         } else  {
19432             bcond_compute = 1;
19433             cond = TCG_COND_GEU;
19434         }
19435         break;
19436     case NM_BLTIUC:
19437         bcond_compute = 1;
19438         cond = TCG_COND_LTU;
19439         break;
19440     default:
19441         MIPS_INVAL("Immediate Value Compact branch");
19442         generate_exception_end(ctx, EXCP_RI);
19443         goto out;
19444     }
19445
19446     if (bcond_compute == 0) {
19447         /* Uncoditional compact branch */
19448         gen_goto_tb(ctx, 0, ctx->btarget);
19449     } else {
19450         /* Conditional compact branch */
19451         TCGLabel *fs = gen_new_label();
19452
19453         tcg_gen_brcond_tl(tcg_invert_cond(cond), t0, t1, fs);
19454
19455         gen_goto_tb(ctx, 1, ctx->btarget);
19456         gen_set_label(fs);
19457
19458         gen_goto_tb(ctx, 0, ctx->base.pc_next + 4);
19459     }
19460
19461 out:
19462     tcg_temp_free(t0);
19463     tcg_temp_free(t1);
19464 }
19465
19466 /* P.BALRSC type nanoMIPS R6 branches: BALRSC and BRSC */
19467 static void gen_compute_nanomips_pbalrsc_branch(DisasContext *ctx, int rs,
19468                                                 int rt)
19469 {
19470     TCGv t0 = tcg_temp_new();
19471     TCGv t1 = tcg_temp_new();
19472
19473     /* load rs */
19474     gen_load_gpr(t0, rs);
19475
19476     /* link */
19477     if (rt != 0) {
19478         tcg_gen_movi_tl(cpu_gpr[rt], ctx->base.pc_next + 4);
19479     }
19480
19481     /* calculate btarget */
19482     tcg_gen_shli_tl(t0, t0, 1);
19483     tcg_gen_movi_tl(t1, ctx->base.pc_next + 4);
19484     gen_op_addr_add(ctx, btarget, t1, t0);
19485
19486     /* unconditional branch to register */
19487     tcg_gen_mov_tl(cpu_PC, btarget);
19488     tcg_gen_lookup_and_goto_ptr();
19489
19490     tcg_temp_free(t0);
19491     tcg_temp_free(t1);
19492 }
19493
19494 /* nanoMIPS Branches */
19495 static void gen_compute_compact_branch_nm(DisasContext *ctx, uint32_t opc,
19496                                        int rs, int rt, int32_t offset)
19497 {
19498     int bcond_compute = 0;
19499     TCGv t0 = tcg_temp_new();
19500     TCGv t1 = tcg_temp_new();
19501
19502     /* Load needed operands and calculate btarget */
19503     switch (opc) {
19504     /* compact branch */
19505     case OPC_BGEC:
19506     case OPC_BLTC:
19507         gen_load_gpr(t0, rs);
19508         gen_load_gpr(t1, rt);
19509         bcond_compute = 1;
19510         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19511         break;
19512     case OPC_BGEUC:
19513     case OPC_BLTUC:
19514         if (rs == 0 || rs == rt) {
19515             /* OPC_BLEZALC, OPC_BGEZALC */
19516             /* OPC_BGTZALC, OPC_BLTZALC */
19517             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4);
19518         }
19519         gen_load_gpr(t0, rs);
19520         gen_load_gpr(t1, rt);
19521         bcond_compute = 1;
19522         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19523         break;
19524     case OPC_BC:
19525         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19526         break;
19527     case OPC_BEQZC:
19528         if (rs != 0) {
19529             /* OPC_BEQZC, OPC_BNEZC */
19530             gen_load_gpr(t0, rs);
19531             bcond_compute = 1;
19532             ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19533         } else {
19534             /* OPC_JIC, OPC_JIALC */
19535             TCGv tbase = tcg_temp_new();
19536             TCGv toffset = tcg_temp_new();
19537
19538             gen_load_gpr(tbase, rt);
19539             tcg_gen_movi_tl(toffset, offset);
19540             gen_op_addr_add(ctx, btarget, tbase, toffset);
19541             tcg_temp_free(tbase);
19542             tcg_temp_free(toffset);
19543         }
19544         break;
19545     default:
19546         MIPS_INVAL("Compact branch/jump");
19547         generate_exception_end(ctx, EXCP_RI);
19548         goto out;
19549     }
19550
19551     if (bcond_compute == 0) {
19552         /* Uncoditional compact branch */
19553         switch (opc) {
19554         case OPC_BC:
19555             gen_goto_tb(ctx, 0, ctx->btarget);
19556             break;
19557         default:
19558             MIPS_INVAL("Compact branch/jump");
19559             generate_exception_end(ctx, EXCP_RI);
19560             goto out;
19561         }
19562     } else {
19563         /* Conditional compact branch */
19564         TCGLabel *fs = gen_new_label();
19565
19566         switch (opc) {
19567         case OPC_BGEUC:
19568             if (rs == 0 && rt != 0) {
19569                 /* OPC_BLEZALC */
19570                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
19571             } else if (rs != 0 && rt != 0 && rs == rt) {
19572                 /* OPC_BGEZALC */
19573                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
19574             } else {
19575                 /* OPC_BGEUC */
19576                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GEU), t0, t1, fs);
19577             }
19578             break;
19579         case OPC_BLTUC:
19580             if (rs == 0 && rt != 0) {
19581                 /* OPC_BGTZALC */
19582                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
19583             } else if (rs != 0 && rt != 0 && rs == rt) {
19584                 /* OPC_BLTZALC */
19585                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
19586             } else {
19587                 /* OPC_BLTUC */
19588                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LTU), t0, t1, fs);
19589             }
19590             break;
19591         case OPC_BGEC:
19592             if (rs == 0 && rt != 0) {
19593                 /* OPC_BLEZC */
19594                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
19595             } else if (rs != 0 && rt != 0 && rs == rt) {
19596                 /* OPC_BGEZC */
19597                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
19598             } else {
19599                 /* OPC_BGEC */
19600                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GE), t0, t1, fs);
19601             }
19602             break;
19603         case OPC_BLTC:
19604             if (rs == 0 && rt != 0) {
19605                 /* OPC_BGTZC */
19606                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
19607             } else if (rs != 0 && rt != 0 && rs == rt) {
19608                 /* OPC_BLTZC */
19609                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
19610             } else {
19611                 /* OPC_BLTC */
19612                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LT), t0, t1, fs);
19613             }
19614             break;
19615         case OPC_BEQZC:
19616             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t0, 0, fs);
19617             break;
19618         default:
19619             MIPS_INVAL("Compact conditional branch/jump");
19620             generate_exception_end(ctx, EXCP_RI);
19621             goto out;
19622         }
19623
19624         /* Generating branch here as compact branches don't have delay slot */
19625         gen_goto_tb(ctx, 1, ctx->btarget);
19626         gen_set_label(fs);
19627
19628         gen_goto_tb(ctx, 0, ctx->base.pc_next + 4);
19629     }
19630
19631 out:
19632     tcg_temp_free(t0);
19633     tcg_temp_free(t1);
19634 }
19635
19636
19637 /* nanoMIPS CP1 Branches */
19638 static void gen_compute_branch_cp1_nm(DisasContext *ctx, uint32_t op,
19639                                    int32_t ft, int32_t offset)
19640 {
19641     target_ulong btarget;
19642     TCGv_i64 t0 = tcg_temp_new_i64();
19643
19644     gen_load_fpr64(ctx, t0, ft);
19645     tcg_gen_andi_i64(t0, t0, 1);
19646
19647     btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19648
19649     switch (op) {
19650     case NM_BC1EQZC:
19651         tcg_gen_xori_i64(t0, t0, 1);
19652         ctx->hflags |= MIPS_HFLAG_BC;
19653         break;
19654     case NM_BC1NEZC:
19655         /* t0 already set */
19656         ctx->hflags |= MIPS_HFLAG_BC;
19657         break;
19658     default:
19659         MIPS_INVAL("cp1 cond branch");
19660         generate_exception_end(ctx, EXCP_RI);
19661         goto out;
19662     }
19663
19664     tcg_gen_trunc_i64_tl(bcond, t0);
19665
19666     ctx->btarget = btarget;
19667
19668 out:
19669     tcg_temp_free_i64(t0);
19670 }
19671
19672
19673 static void gen_p_lsx(DisasContext *ctx, int rd, int rs, int rt)
19674 {
19675     TCGv t0, t1;
19676     t0 = tcg_temp_new();
19677     t1 = tcg_temp_new();
19678
19679     gen_load_gpr(t0, rs);
19680     gen_load_gpr(t1, rt);
19681
19682     if ((extract32(ctx->opcode, 6, 1)) == 1) {
19683         /* PP.LSXS instructions require shifting */
19684         switch (extract32(ctx->opcode, 7, 4)) {
19685         case NM_SHXS:
19686             check_nms(ctx);
19687         case NM_LHXS:
19688         case NM_LHUXS:
19689             tcg_gen_shli_tl(t0, t0, 1);
19690             break;
19691         case NM_SWXS:
19692             check_nms(ctx);
19693         case NM_LWXS:
19694         case NM_LWC1XS:
19695         case NM_SWC1XS:
19696             tcg_gen_shli_tl(t0, t0, 2);
19697             break;
19698         case NM_LDC1XS:
19699         case NM_SDC1XS:
19700             tcg_gen_shli_tl(t0, t0, 3);
19701             break;
19702         }
19703     }
19704     gen_op_addr_add(ctx, t0, t0, t1);
19705
19706     switch (extract32(ctx->opcode, 7, 4)) {
19707     case NM_LBX:
19708         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19709                            MO_SB);
19710         gen_store_gpr(t0, rd);
19711         break;
19712     case NM_LHX:
19713     /*case NM_LHXS:*/
19714         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19715                            MO_TESW);
19716         gen_store_gpr(t0, rd);
19717         break;
19718     case NM_LWX:
19719     /*case NM_LWXS:*/
19720         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19721                            MO_TESL);
19722         gen_store_gpr(t0, rd);
19723         break;
19724     case NM_LBUX:
19725         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19726                            MO_UB);
19727         gen_store_gpr(t0, rd);
19728         break;
19729     case NM_LHUX:
19730     /*case NM_LHUXS:*/
19731         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19732                            MO_TEUW);
19733         gen_store_gpr(t0, rd);
19734         break;
19735     case NM_SBX:
19736         check_nms(ctx);
19737         gen_load_gpr(t1, rd);
19738         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx,
19739                            MO_8);
19740         break;
19741     case NM_SHX:
19742     /*case NM_SHXS:*/
19743         check_nms(ctx);
19744         gen_load_gpr(t1, rd);
19745         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx,
19746                            MO_TEUW);
19747         break;
19748     case NM_SWX:
19749     /*case NM_SWXS:*/
19750         check_nms(ctx);
19751         gen_load_gpr(t1, rd);
19752         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx,
19753                            MO_TEUL);
19754         break;
19755     case NM_LWC1X:
19756     /*case NM_LWC1XS:*/
19757     case NM_LDC1X:
19758     /*case NM_LDC1XS:*/
19759     case NM_SWC1X:
19760     /*case NM_SWC1XS:*/
19761     case NM_SDC1X:
19762     /*case NM_SDC1XS:*/
19763         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
19764             check_cp1_enabled(ctx);
19765             switch (extract32(ctx->opcode, 7, 4)) {
19766             case NM_LWC1X:
19767             /*case NM_LWC1XS:*/
19768                 gen_flt_ldst(ctx, OPC_LWC1, rd, t0);
19769                 break;
19770             case NM_LDC1X:
19771             /*case NM_LDC1XS:*/
19772                 gen_flt_ldst(ctx, OPC_LDC1, rd, t0);
19773                 break;
19774             case NM_SWC1X:
19775             /*case NM_SWC1XS:*/
19776                 gen_flt_ldst(ctx, OPC_SWC1, rd, t0);
19777                 break;
19778             case NM_SDC1X:
19779             /*case NM_SDC1XS:*/
19780                 gen_flt_ldst(ctx, OPC_SDC1, rd, t0);
19781                 break;
19782             }
19783         } else {
19784             generate_exception_err(ctx, EXCP_CpU, 1);
19785         }
19786         break;
19787     default:
19788         generate_exception_end(ctx, EXCP_RI);
19789         break;
19790     }
19791
19792     tcg_temp_free(t0);
19793     tcg_temp_free(t1);
19794 }
19795
19796 static void gen_pool32f_nanomips_insn(DisasContext *ctx)
19797 {
19798     int rt, rs, rd;
19799
19800     rt = extract32(ctx->opcode, 21, 5);
19801     rs = extract32(ctx->opcode, 16, 5);
19802     rd = extract32(ctx->opcode, 11, 5);
19803
19804     if (!(ctx->CP0_Config1 & (1 << CP0C1_FP))) {
19805         generate_exception_end(ctx, EXCP_RI);
19806         return;
19807     }
19808     check_cp1_enabled(ctx);
19809     switch (extract32(ctx->opcode, 0, 3)) {
19810     case NM_POOL32F_0:
19811         switch (extract32(ctx->opcode, 3, 7)) {
19812         case NM_RINT_S:
19813             gen_farith(ctx, OPC_RINT_S, 0, rt, rs, 0);
19814             break;
19815         case NM_RINT_D:
19816             gen_farith(ctx, OPC_RINT_D, 0, rt, rs, 0);
19817             break;
19818         case NM_CLASS_S:
19819             gen_farith(ctx, OPC_CLASS_S, 0, rt, rs, 0);
19820             break;
19821         case NM_CLASS_D:
19822             gen_farith(ctx, OPC_CLASS_D, 0, rt, rs, 0);
19823             break;
19824         case NM_ADD_S:
19825             gen_farith(ctx, OPC_ADD_S, rt, rs, rd, 0);
19826             break;
19827         case NM_ADD_D:
19828             gen_farith(ctx, OPC_ADD_D, rt, rs, rd, 0);
19829             break;
19830         case NM_SUB_S:
19831             gen_farith(ctx, OPC_SUB_S, rt, rs, rd, 0);
19832             break;
19833         case NM_SUB_D:
19834             gen_farith(ctx, OPC_SUB_D, rt, rs, rd, 0);
19835             break;
19836         case NM_MUL_S:
19837             gen_farith(ctx, OPC_MUL_S, rt, rs, rd, 0);
19838             break;
19839         case NM_MUL_D:
19840             gen_farith(ctx, OPC_MUL_D, rt, rs, rd, 0);
19841             break;
19842         case NM_DIV_S:
19843             gen_farith(ctx, OPC_DIV_S, rt, rs, rd, 0);
19844             break;
19845         case NM_DIV_D:
19846             gen_farith(ctx, OPC_DIV_D, rt, rs, rd, 0);
19847             break;
19848         case NM_SELEQZ_S:
19849             gen_sel_s(ctx, OPC_SELEQZ_S, rd, rt, rs);
19850             break;
19851         case NM_SELEQZ_D:
19852             gen_sel_d(ctx, OPC_SELEQZ_D, rd, rt, rs);
19853             break;
19854         case NM_SELNEZ_S:
19855             gen_sel_s(ctx, OPC_SELNEZ_S, rd, rt, rs);
19856             break;
19857         case NM_SELNEZ_D:
19858             gen_sel_d(ctx, OPC_SELNEZ_D, rd, rt, rs);
19859             break;
19860         case NM_SEL_S:
19861             gen_sel_s(ctx, OPC_SEL_S, rd, rt, rs);
19862             break;
19863         case NM_SEL_D:
19864             gen_sel_d(ctx, OPC_SEL_D, rd, rt, rs);
19865             break;
19866         case NM_MADDF_S:
19867             gen_farith(ctx, OPC_MADDF_S, rt, rs, rd, 0);
19868             break;
19869         case NM_MADDF_D:
19870             gen_farith(ctx, OPC_MADDF_D, rt, rs, rd, 0);
19871             break;
19872         case NM_MSUBF_S:
19873             gen_farith(ctx, OPC_MSUBF_S, rt, rs, rd, 0);
19874             break;
19875         case NM_MSUBF_D:
19876             gen_farith(ctx, OPC_MSUBF_D, rt, rs, rd, 0);
19877             break;
19878         default:
19879             generate_exception_end(ctx, EXCP_RI);
19880             break;
19881         }
19882         break;
19883     case NM_POOL32F_3:
19884         switch (extract32(ctx->opcode, 3, 3)) {
19885         case NM_MIN_FMT:
19886             switch (extract32(ctx->opcode, 9, 1)) {
19887             case FMT_SDPS_S:
19888                 gen_farith(ctx, OPC_MIN_S, rt, rs, rd, 0);
19889                 break;
19890             case FMT_SDPS_D:
19891                 gen_farith(ctx, OPC_MIN_D, rt, rs, rd, 0);
19892                 break;
19893             }
19894             break;
19895         case NM_MAX_FMT:
19896             switch (extract32(ctx->opcode, 9, 1)) {
19897             case FMT_SDPS_S:
19898                 gen_farith(ctx, OPC_MAX_S, rt, rs, rd, 0);
19899                 break;
19900             case FMT_SDPS_D:
19901                 gen_farith(ctx, OPC_MAX_D, rt, rs, rd, 0);
19902                 break;
19903             }
19904             break;
19905         case NM_MINA_FMT:
19906             switch (extract32(ctx->opcode, 9, 1)) {
19907             case FMT_SDPS_S:
19908                 gen_farith(ctx, OPC_MINA_S, rt, rs, rd, 0);
19909                 break;
19910             case FMT_SDPS_D:
19911                 gen_farith(ctx, OPC_MINA_D, rt, rs, rd, 0);
19912                 break;
19913             }
19914             break;
19915         case NM_MAXA_FMT:
19916             switch (extract32(ctx->opcode, 9, 1)) {
19917             case FMT_SDPS_S:
19918                 gen_farith(ctx, OPC_MAXA_S, rt, rs, rd, 0);
19919                 break;
19920             case FMT_SDPS_D:
19921                 gen_farith(ctx, OPC_MAXA_D, rt, rs, rd, 0);
19922                 break;
19923             }
19924             break;
19925         case NM_POOL32FXF:
19926             switch (extract32(ctx->opcode, 6, 8)) {
19927             case NM_CFC1:
19928                 gen_cp1(ctx, OPC_CFC1, rt, rs);
19929                 break;
19930             case NM_CTC1:
19931                 gen_cp1(ctx, OPC_CTC1, rt, rs);
19932                 break;
19933             case NM_MFC1:
19934                 gen_cp1(ctx, OPC_MFC1, rt, rs);
19935                 break;
19936             case NM_MTC1:
19937                 gen_cp1(ctx, OPC_MTC1, rt, rs);
19938                 break;
19939             case NM_MFHC1:
19940                 gen_cp1(ctx, OPC_MFHC1, rt, rs);
19941                 break;
19942             case NM_MTHC1:
19943                 gen_cp1(ctx, OPC_MTHC1, rt, rs);
19944                 break;
19945             case NM_CVT_S_PL:
19946                 gen_farith(ctx, OPC_CVT_S_PL, -1, rs, rt, 0);
19947                 break;
19948             case NM_CVT_S_PU:
19949                 gen_farith(ctx, OPC_CVT_S_PU, -1, rs, rt, 0);
19950                 break;
19951             default:
19952                 switch (extract32(ctx->opcode, 6, 9)) {
19953                 case NM_CVT_L_S:
19954                     gen_farith(ctx, OPC_CVT_L_S, -1, rs, rt, 0);
19955                     break;
19956                 case NM_CVT_L_D:
19957                     gen_farith(ctx, OPC_CVT_L_D, -1, rs, rt, 0);
19958                     break;
19959                 case NM_CVT_W_S:
19960                     gen_farith(ctx, OPC_CVT_W_S, -1, rs, rt, 0);
19961                     break;
19962                 case NM_CVT_W_D:
19963                     gen_farith(ctx, OPC_CVT_W_D, -1, rs, rt, 0);
19964                     break;
19965                 case NM_RSQRT_S:
19966                     gen_farith(ctx, OPC_RSQRT_S, -1, rs, rt, 0);
19967                     break;
19968                 case NM_RSQRT_D:
19969                     gen_farith(ctx, OPC_RSQRT_D, -1, rs, rt, 0);
19970                     break;
19971                 case NM_SQRT_S:
19972                     gen_farith(ctx, OPC_SQRT_S, -1, rs, rt, 0);
19973                     break;
19974                 case NM_SQRT_D:
19975                     gen_farith(ctx, OPC_SQRT_D, -1, rs, rt, 0);
19976                     break;
19977                 case NM_RECIP_S:
19978                     gen_farith(ctx, OPC_RECIP_S, -1, rs, rt, 0);
19979                     break;
19980                 case NM_RECIP_D:
19981                     gen_farith(ctx, OPC_RECIP_D, -1, rs, rt, 0);
19982                     break;
19983                 case NM_FLOOR_L_S:
19984                     gen_farith(ctx, OPC_FLOOR_L_S, -1, rs, rt, 0);
19985                     break;
19986                 case NM_FLOOR_L_D:
19987                     gen_farith(ctx, OPC_FLOOR_L_D, -1, rs, rt, 0);
19988                     break;
19989                 case NM_FLOOR_W_S:
19990                     gen_farith(ctx, OPC_FLOOR_W_S, -1, rs, rt, 0);
19991                     break;
19992                 case NM_FLOOR_W_D:
19993                     gen_farith(ctx, OPC_FLOOR_W_D, -1, rs, rt, 0);
19994                     break;
19995                 case NM_CEIL_L_S:
19996                     gen_farith(ctx, OPC_CEIL_L_S, -1, rs, rt, 0);
19997                     break;
19998                 case NM_CEIL_L_D:
19999                     gen_farith(ctx, OPC_CEIL_L_D, -1, rs, rt, 0);
20000                     break;
20001                 case NM_CEIL_W_S:
20002                     gen_farith(ctx, OPC_CEIL_W_S, -1, rs, rt, 0);
20003                     break;
20004                 case NM_CEIL_W_D:
20005                     gen_farith(ctx, OPC_CEIL_W_D, -1, rs, rt, 0);
20006                     break;
20007                 case NM_TRUNC_L_S:
20008                     gen_farith(ctx, OPC_TRUNC_L_S, -1, rs, rt, 0);
20009                     break;
20010                 case NM_TRUNC_L_D:
20011                     gen_farith(ctx, OPC_TRUNC_L_D, -1, rs, rt, 0);
20012                     break;
20013                 case NM_TRUNC_W_S:
20014                     gen_farith(ctx, OPC_TRUNC_W_S, -1, rs, rt, 0);
20015                     break;
20016                 case NM_TRUNC_W_D:
20017                     gen_farith(ctx, OPC_TRUNC_W_D, -1, rs, rt, 0);
20018                     break;
20019                 case NM_ROUND_L_S:
20020                     gen_farith(ctx, OPC_ROUND_L_S, -1, rs, rt, 0);
20021                     break;
20022                 case NM_ROUND_L_D:
20023                     gen_farith(ctx, OPC_ROUND_L_D, -1, rs, rt, 0);
20024                     break;
20025                 case NM_ROUND_W_S:
20026                     gen_farith(ctx, OPC_ROUND_W_S, -1, rs, rt, 0);
20027                     break;
20028                 case NM_ROUND_W_D:
20029                     gen_farith(ctx, OPC_ROUND_W_D, -1, rs, rt, 0);
20030                     break;
20031                 case NM_MOV_S:
20032                     gen_farith(ctx, OPC_MOV_S, -1, rs, rt, 0);
20033                     break;
20034                 case NM_MOV_D:
20035                     gen_farith(ctx, OPC_MOV_D, -1, rs, rt, 0);
20036                     break;
20037                 case NM_ABS_S:
20038                     gen_farith(ctx, OPC_ABS_S, -1, rs, rt, 0);
20039                     break;
20040                 case NM_ABS_D:
20041                     gen_farith(ctx, OPC_ABS_D, -1, rs, rt, 0);
20042                     break;
20043                 case NM_NEG_S:
20044                     gen_farith(ctx, OPC_NEG_S, -1, rs, rt, 0);
20045                     break;
20046                 case NM_NEG_D:
20047                     gen_farith(ctx, OPC_NEG_D, -1, rs, rt, 0);
20048                     break;
20049                 case NM_CVT_D_S:
20050                     gen_farith(ctx, OPC_CVT_D_S, -1, rs, rt, 0);
20051                     break;
20052                 case NM_CVT_D_W:
20053                     gen_farith(ctx, OPC_CVT_D_W, -1, rs, rt, 0);
20054                     break;
20055                 case NM_CVT_D_L:
20056                     gen_farith(ctx, OPC_CVT_D_L, -1, rs, rt, 0);
20057                     break;
20058                 case NM_CVT_S_D:
20059                     gen_farith(ctx, OPC_CVT_S_D, -1, rs, rt, 0);
20060                     break;
20061                 case NM_CVT_S_W:
20062                     gen_farith(ctx, OPC_CVT_S_W, -1, rs, rt, 0);
20063                     break;
20064                 case NM_CVT_S_L:
20065                     gen_farith(ctx, OPC_CVT_S_L, -1, rs, rt, 0);
20066                     break;
20067                 default:
20068                     generate_exception_end(ctx, EXCP_RI);
20069                     break;
20070                 }
20071                 break;
20072             }
20073             break;
20074         }
20075         break;
20076     case NM_POOL32F_5:
20077         switch (extract32(ctx->opcode, 3, 3)) {
20078         case NM_CMP_CONDN_S:
20079             gen_r6_cmp_s(ctx, extract32(ctx->opcode, 6, 5), rt, rs, rd);
20080             break;
20081         case NM_CMP_CONDN_D:
20082             gen_r6_cmp_d(ctx, extract32(ctx->opcode, 6, 5), rt, rs, rd);
20083             break;
20084         default:
20085             generate_exception_end(ctx, EXCP_RI);
20086             break;
20087         }
20088         break;
20089     default:
20090         generate_exception_end(ctx, EXCP_RI);
20091         break;
20092     }
20093 }
20094
20095 static void gen_pool32a5_nanomips_insn(DisasContext *ctx, int opc,
20096                                        int rd, int rs, int rt)
20097 {
20098     int ret = rd;
20099     TCGv t0 = tcg_temp_new();
20100     TCGv v1_t = tcg_temp_new();
20101     TCGv v2_t = tcg_temp_new();
20102
20103     gen_load_gpr(v1_t, rs);
20104     gen_load_gpr(v2_t, rt);
20105
20106     switch (opc) {
20107     case NM_CMP_EQ_PH:
20108         check_dsp(ctx);
20109         gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
20110         break;
20111     case NM_CMP_LT_PH:
20112         check_dsp(ctx);
20113         gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
20114         break;
20115     case NM_CMP_LE_PH:
20116         check_dsp(ctx);
20117         gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
20118         break;
20119     case NM_CMPU_EQ_QB:
20120         check_dsp(ctx);
20121         gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
20122         break;
20123     case NM_CMPU_LT_QB:
20124         check_dsp(ctx);
20125         gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
20126         break;
20127     case NM_CMPU_LE_QB:
20128         check_dsp(ctx);
20129         gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
20130         break;
20131     case NM_CMPGU_EQ_QB:
20132         check_dsp(ctx);
20133         gen_helper_cmpgu_eq_qb(v1_t, v1_t, v2_t);
20134         gen_store_gpr(v1_t, ret);
20135         break;
20136     case NM_CMPGU_LT_QB:
20137         check_dsp(ctx);
20138         gen_helper_cmpgu_lt_qb(v1_t, v1_t, v2_t);
20139         gen_store_gpr(v1_t, ret);
20140         break;
20141     case NM_CMPGU_LE_QB:
20142         check_dsp(ctx);
20143         gen_helper_cmpgu_le_qb(v1_t, v1_t, v2_t);
20144         gen_store_gpr(v1_t, ret);
20145         break;
20146     case NM_CMPGDU_EQ_QB:
20147         check_dsp_r2(ctx);
20148         gen_helper_cmpgu_eq_qb(v1_t, v1_t, v2_t);
20149         tcg_gen_deposit_tl(cpu_dspctrl, cpu_dspctrl, v1_t, 24, 4);
20150         gen_store_gpr(v1_t, ret);
20151         break;
20152     case NM_CMPGDU_LT_QB:
20153         check_dsp_r2(ctx);
20154         gen_helper_cmpgu_lt_qb(v1_t, v1_t, v2_t);
20155         tcg_gen_deposit_tl(cpu_dspctrl, cpu_dspctrl, v1_t, 24, 4);
20156         gen_store_gpr(v1_t, ret);
20157         break;
20158     case NM_CMPGDU_LE_QB:
20159         check_dsp_r2(ctx);
20160         gen_helper_cmpgu_le_qb(v1_t, v1_t, v2_t);
20161         tcg_gen_deposit_tl(cpu_dspctrl, cpu_dspctrl, v1_t, 24, 4);
20162         gen_store_gpr(v1_t, ret);
20163         break;
20164     case NM_PACKRL_PH:
20165         check_dsp(ctx);
20166         gen_helper_packrl_ph(v1_t, v1_t, v2_t);
20167         gen_store_gpr(v1_t, ret);
20168         break;
20169     case NM_PICK_QB:
20170         check_dsp(ctx);
20171         gen_helper_pick_qb(v1_t, v1_t, v2_t, cpu_env);
20172         gen_store_gpr(v1_t, ret);
20173         break;
20174     case NM_PICK_PH:
20175         check_dsp(ctx);
20176         gen_helper_pick_ph(v1_t, v1_t, v2_t, cpu_env);
20177         gen_store_gpr(v1_t, ret);
20178         break;
20179     case NM_ADDQ_S_W:
20180         check_dsp(ctx);
20181         gen_helper_addq_s_w(v1_t, v1_t, v2_t, cpu_env);
20182         gen_store_gpr(v1_t, ret);
20183         break;
20184     case NM_SUBQ_S_W:
20185         check_dsp(ctx);
20186         gen_helper_subq_s_w(v1_t, v1_t, v2_t, cpu_env);
20187         gen_store_gpr(v1_t, ret);
20188         break;
20189     case NM_ADDSC:
20190         check_dsp(ctx);
20191         gen_helper_addsc(v1_t, v1_t, v2_t, cpu_env);
20192         gen_store_gpr(v1_t, ret);
20193         break;
20194     case NM_ADDWC:
20195         check_dsp(ctx);
20196         gen_helper_addwc(v1_t, v1_t, v2_t, cpu_env);
20197         gen_store_gpr(v1_t, ret);
20198         break;
20199     case NM_ADDQ_S_PH:
20200         check_dsp(ctx);
20201         switch (extract32(ctx->opcode, 10, 1)) {
20202         case 0:
20203             /* ADDQ_PH */
20204             gen_helper_addq_ph(v1_t, v1_t, v2_t, cpu_env);
20205             gen_store_gpr(v1_t, ret);
20206             break;
20207         case 1:
20208             /* ADDQ_S_PH */
20209             gen_helper_addq_s_ph(v1_t, v1_t, v2_t, cpu_env);
20210             gen_store_gpr(v1_t, ret);
20211             break;
20212         }
20213         break;
20214     case NM_ADDQH_R_PH:
20215         check_dsp_r2(ctx);
20216         switch (extract32(ctx->opcode, 10, 1)) {
20217         case 0:
20218             /* ADDQH_PH */
20219             gen_helper_addqh_ph(v1_t, v1_t, v2_t);
20220             gen_store_gpr(v1_t, ret);
20221             break;
20222         case 1:
20223             /* ADDQH_R_PH */
20224             gen_helper_addqh_r_ph(v1_t, v1_t, v2_t);
20225             gen_store_gpr(v1_t, ret);
20226             break;
20227         }
20228         break;
20229     case NM_ADDQH_R_W:
20230         check_dsp_r2(ctx);
20231         switch (extract32(ctx->opcode, 10, 1)) {
20232         case 0:
20233             /* ADDQH_W */
20234             gen_helper_addqh_w(v1_t, v1_t, v2_t);
20235             gen_store_gpr(v1_t, ret);
20236             break;
20237         case 1:
20238             /* ADDQH_R_W */
20239             gen_helper_addqh_r_w(v1_t, v1_t, v2_t);
20240             gen_store_gpr(v1_t, ret);
20241             break;
20242         }
20243         break;
20244     case NM_ADDU_S_QB:
20245         check_dsp(ctx);
20246         switch (extract32(ctx->opcode, 10, 1)) {
20247         case 0:
20248             /* ADDU_QB */
20249             gen_helper_addu_qb(v1_t, v1_t, v2_t, cpu_env);
20250             gen_store_gpr(v1_t, ret);
20251             break;
20252         case 1:
20253             /* ADDU_S_QB */
20254             gen_helper_addu_s_qb(v1_t, v1_t, v2_t, cpu_env);
20255             gen_store_gpr(v1_t, ret);
20256             break;
20257         }
20258         break;
20259     case NM_ADDU_S_PH:
20260         check_dsp_r2(ctx);
20261         switch (extract32(ctx->opcode, 10, 1)) {
20262         case 0:
20263             /* ADDU_PH */
20264             gen_helper_addu_ph(v1_t, v1_t, v2_t, cpu_env);
20265             gen_store_gpr(v1_t, ret);
20266             break;
20267         case 1:
20268             /* ADDU_S_PH */
20269             gen_helper_addu_s_ph(v1_t, v1_t, v2_t, cpu_env);
20270             gen_store_gpr(v1_t, ret);
20271             break;
20272         }
20273         break;
20274     case NM_ADDUH_R_QB:
20275         check_dsp_r2(ctx);
20276         switch (extract32(ctx->opcode, 10, 1)) {
20277         case 0:
20278             /* ADDUH_QB */
20279             gen_helper_adduh_qb(v1_t, v1_t, v2_t);
20280             gen_store_gpr(v1_t, ret);
20281             break;
20282         case 1:
20283             /* ADDUH_R_QB */
20284             gen_helper_adduh_r_qb(v1_t, v1_t, v2_t);
20285             gen_store_gpr(v1_t, ret);
20286             break;
20287         }
20288         break;
20289     case NM_SHRAV_R_PH:
20290         check_dsp(ctx);
20291         switch (extract32(ctx->opcode, 10, 1)) {
20292         case 0:
20293             /* SHRAV_PH */
20294             gen_helper_shra_ph(v1_t, v1_t, v2_t);
20295             gen_store_gpr(v1_t, ret);
20296             break;
20297         case 1:
20298             /* SHRAV_R_PH */
20299             gen_helper_shra_r_ph(v1_t, v1_t, v2_t);
20300             gen_store_gpr(v1_t, ret);
20301             break;
20302         }
20303         break;
20304     case NM_SHRAV_R_QB:
20305         check_dsp_r2(ctx);
20306         switch (extract32(ctx->opcode, 10, 1)) {
20307         case 0:
20308             /* SHRAV_QB */
20309             gen_helper_shra_qb(v1_t, v1_t, v2_t);
20310             gen_store_gpr(v1_t, ret);
20311             break;
20312         case 1:
20313             /* SHRAV_R_QB */
20314             gen_helper_shra_r_qb(v1_t, v1_t, v2_t);
20315             gen_store_gpr(v1_t, ret);
20316             break;
20317         }
20318         break;
20319     case NM_SUBQ_S_PH:
20320         check_dsp(ctx);
20321         switch (extract32(ctx->opcode, 10, 1)) {
20322         case 0:
20323             /* SUBQ_PH */
20324             gen_helper_subq_ph(v1_t, v1_t, v2_t, cpu_env);
20325             gen_store_gpr(v1_t, ret);
20326             break;
20327         case 1:
20328             /* SUBQ_S_PH */
20329             gen_helper_subq_s_ph(v1_t, v1_t, v2_t, cpu_env);
20330             gen_store_gpr(v1_t, ret);
20331             break;
20332         }
20333         break;
20334     case NM_SUBQH_R_PH:
20335         check_dsp_r2(ctx);
20336         switch (extract32(ctx->opcode, 10, 1)) {
20337         case 0:
20338             /* SUBQH_PH */
20339             gen_helper_subqh_ph(v1_t, v1_t, v2_t);
20340             gen_store_gpr(v1_t, ret);
20341             break;
20342         case 1:
20343             /* SUBQH_R_PH */
20344             gen_helper_subqh_r_ph(v1_t, v1_t, v2_t);
20345             gen_store_gpr(v1_t, ret);
20346             break;
20347         }
20348         break;
20349     case NM_SUBQH_R_W:
20350         check_dsp_r2(ctx);
20351         switch (extract32(ctx->opcode, 10, 1)) {
20352         case 0:
20353             /* SUBQH_W */
20354             gen_helper_subqh_w(v1_t, v1_t, v2_t);
20355             gen_store_gpr(v1_t, ret);
20356             break;
20357         case 1:
20358             /* SUBQH_R_W */
20359             gen_helper_subqh_r_w(v1_t, v1_t, v2_t);
20360             gen_store_gpr(v1_t, ret);
20361             break;
20362         }
20363         break;
20364     case NM_SUBU_S_QB:
20365         check_dsp(ctx);
20366         switch (extract32(ctx->opcode, 10, 1)) {
20367         case 0:
20368             /* SUBU_QB */
20369             gen_helper_subu_qb(v1_t, v1_t, v2_t, cpu_env);
20370             gen_store_gpr(v1_t, ret);
20371             break;
20372         case 1:
20373             /* SUBU_S_QB */
20374             gen_helper_subu_s_qb(v1_t, v1_t, v2_t, cpu_env);
20375             gen_store_gpr(v1_t, ret);
20376             break;
20377         }
20378         break;
20379     case NM_SUBU_S_PH:
20380         check_dsp_r2(ctx);
20381         switch (extract32(ctx->opcode, 10, 1)) {
20382         case 0:
20383             /* SUBU_PH */
20384             gen_helper_subu_ph(v1_t, v1_t, v2_t, cpu_env);
20385             gen_store_gpr(v1_t, ret);
20386             break;
20387         case 1:
20388             /* SUBU_S_PH */
20389             gen_helper_subu_s_ph(v1_t, v1_t, v2_t, cpu_env);
20390             gen_store_gpr(v1_t, ret);
20391             break;
20392         }
20393         break;
20394     case NM_SUBUH_R_QB:
20395         check_dsp_r2(ctx);
20396         switch (extract32(ctx->opcode, 10, 1)) {
20397         case 0:
20398             /* SUBUH_QB */
20399             gen_helper_subuh_qb(v1_t, v1_t, v2_t);
20400             gen_store_gpr(v1_t, ret);
20401             break;
20402         case 1:
20403             /* SUBUH_R_QB */
20404             gen_helper_subuh_r_qb(v1_t, v1_t, v2_t);
20405             gen_store_gpr(v1_t, ret);
20406             break;
20407         }
20408         break;
20409     case NM_SHLLV_S_PH:
20410         check_dsp(ctx);
20411         switch (extract32(ctx->opcode, 10, 1)) {
20412         case 0:
20413             /* SHLLV_PH */
20414             gen_helper_shll_ph(v1_t, v1_t, v2_t, cpu_env);
20415             gen_store_gpr(v1_t, ret);
20416             break;
20417         case 1:
20418             /* SHLLV_S_PH */
20419             gen_helper_shll_s_ph(v1_t, v1_t, v2_t, cpu_env);
20420             gen_store_gpr(v1_t, ret);
20421             break;
20422         }
20423         break;
20424     case NM_PRECR_SRA_R_PH_W:
20425         check_dsp_r2(ctx);
20426         switch (extract32(ctx->opcode, 10, 1)) {
20427         case 0:
20428             /* PRECR_SRA_PH_W */
20429             {
20430                 TCGv_i32 sa_t = tcg_const_i32(rd);
20431                 gen_helper_precr_sra_ph_w(v1_t, sa_t, v1_t,
20432                                           cpu_gpr[rt]);
20433                 gen_store_gpr(v1_t, rt);
20434                 tcg_temp_free_i32(sa_t);
20435             }
20436             break;
20437         case 1:
20438             /* PRECR_SRA_R_PH_W */
20439             {
20440                 TCGv_i32 sa_t = tcg_const_i32(rd);
20441                 gen_helper_precr_sra_r_ph_w(v1_t, sa_t, v1_t,
20442                                             cpu_gpr[rt]);
20443                 gen_store_gpr(v1_t, rt);
20444                 tcg_temp_free_i32(sa_t);
20445             }
20446             break;
20447        }
20448         break;
20449     case NM_MULEU_S_PH_QBL:
20450         check_dsp(ctx);
20451         gen_helper_muleu_s_ph_qbl(v1_t, v1_t, v2_t, cpu_env);
20452         gen_store_gpr(v1_t, ret);
20453         break;
20454     case NM_MULEU_S_PH_QBR:
20455         check_dsp(ctx);
20456         gen_helper_muleu_s_ph_qbr(v1_t, v1_t, v2_t, cpu_env);
20457         gen_store_gpr(v1_t, ret);
20458         break;
20459     case NM_MULQ_RS_PH:
20460         check_dsp(ctx);
20461         gen_helper_mulq_rs_ph(v1_t, v1_t, v2_t, cpu_env);
20462         gen_store_gpr(v1_t, ret);
20463         break;
20464     case NM_MULQ_S_PH:
20465         check_dsp_r2(ctx);
20466         gen_helper_mulq_s_ph(v1_t, v1_t, v2_t, cpu_env);
20467         gen_store_gpr(v1_t, ret);
20468         break;
20469     case NM_MULQ_RS_W:
20470         check_dsp_r2(ctx);
20471         gen_helper_mulq_rs_w(v1_t, v1_t, v2_t, cpu_env);
20472         gen_store_gpr(v1_t, ret);
20473         break;
20474     case NM_MULQ_S_W:
20475         check_dsp_r2(ctx);
20476         gen_helper_mulq_s_w(v1_t, v1_t, v2_t, cpu_env);
20477         gen_store_gpr(v1_t, ret);
20478         break;
20479     case NM_APPEND:
20480         check_dsp_r2(ctx);
20481         gen_load_gpr(t0, rs);
20482         if (rd != 0) {
20483             tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], rd, 32 - rd);
20484         }
20485         tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
20486         break;
20487     case NM_MODSUB:
20488         check_dsp(ctx);
20489         gen_helper_modsub(v1_t, v1_t, v2_t);
20490         gen_store_gpr(v1_t, ret);
20491         break;
20492     case NM_SHRAV_R_W:
20493         check_dsp(ctx);
20494         gen_helper_shra_r_w(v1_t, v1_t, v2_t);
20495         gen_store_gpr(v1_t, ret);
20496         break;
20497     case NM_SHRLV_PH:
20498         check_dsp_r2(ctx);
20499         gen_helper_shrl_ph(v1_t, v1_t, v2_t);
20500         gen_store_gpr(v1_t, ret);
20501         break;
20502     case NM_SHRLV_QB:
20503         check_dsp(ctx);
20504         gen_helper_shrl_qb(v1_t, v1_t, v2_t);
20505         gen_store_gpr(v1_t, ret);
20506         break;
20507     case NM_SHLLV_QB:
20508         check_dsp(ctx);
20509         gen_helper_shll_qb(v1_t, v1_t, v2_t, cpu_env);
20510         gen_store_gpr(v1_t, ret);
20511         break;
20512     case NM_SHLLV_S_W:
20513         check_dsp(ctx);
20514         gen_helper_shll_s_w(v1_t, v1_t, v2_t, cpu_env);
20515         gen_store_gpr(v1_t, ret);
20516         break;
20517     case NM_SHILO:
20518         check_dsp(ctx);
20519         {
20520             TCGv tv0 = tcg_temp_new();
20521             TCGv tv1 = tcg_temp_new();
20522             int16_t imm = extract32(ctx->opcode, 16, 7);
20523
20524             tcg_gen_movi_tl(tv0, rd >> 3);
20525             tcg_gen_movi_tl(tv1, imm);
20526             gen_helper_shilo(tv0, tv1, cpu_env);
20527         }
20528         break;
20529     case NM_MULEQ_S_W_PHL:
20530         check_dsp(ctx);
20531         gen_helper_muleq_s_w_phl(v1_t, v1_t, v2_t, cpu_env);
20532         gen_store_gpr(v1_t, ret);
20533         break;
20534     case NM_MULEQ_S_W_PHR:
20535         check_dsp(ctx);
20536         gen_helper_muleq_s_w_phr(v1_t, v1_t, v2_t, cpu_env);
20537         gen_store_gpr(v1_t, ret);
20538         break;
20539     case NM_MUL_S_PH:
20540         check_dsp_r2(ctx);
20541         switch (extract32(ctx->opcode, 10, 1)) {
20542         case 0:
20543             /* MUL_PH */
20544             gen_helper_mul_ph(v1_t, v1_t, v2_t, cpu_env);
20545             gen_store_gpr(v1_t, ret);
20546             break;
20547         case 1:
20548             /* MUL_S_PH */
20549             gen_helper_mul_s_ph(v1_t, v1_t, v2_t, cpu_env);
20550             gen_store_gpr(v1_t, ret);
20551             break;
20552         }
20553         break;
20554     case NM_PRECR_QB_PH:
20555         check_dsp_r2(ctx);
20556         gen_helper_precr_qb_ph(v1_t, v1_t, v2_t);
20557         gen_store_gpr(v1_t, ret);
20558         break;
20559     case NM_PRECRQ_QB_PH:
20560         check_dsp(ctx);
20561         gen_helper_precrq_qb_ph(v1_t, v1_t, v2_t);
20562         gen_store_gpr(v1_t, ret);
20563         break;
20564     case NM_PRECRQ_PH_W:
20565         check_dsp(ctx);
20566         gen_helper_precrq_ph_w(v1_t, v1_t, v2_t);
20567         gen_store_gpr(v1_t, ret);
20568         break;
20569     case NM_PRECRQ_RS_PH_W:
20570         check_dsp(ctx);
20571         gen_helper_precrq_rs_ph_w(v1_t, v1_t, v2_t, cpu_env);
20572         gen_store_gpr(v1_t, ret);
20573         break;
20574     case NM_PRECRQU_S_QB_PH:
20575         check_dsp(ctx);
20576         gen_helper_precrqu_s_qb_ph(v1_t, v1_t, v2_t, cpu_env);
20577         gen_store_gpr(v1_t, ret);
20578         break;
20579     case NM_SHRA_R_W:
20580         check_dsp(ctx);
20581         tcg_gen_movi_tl(t0, rd);
20582         gen_helper_shra_r_w(v1_t, t0, v1_t);
20583         gen_store_gpr(v1_t, rt);
20584         break;
20585     case NM_SHRA_R_PH:
20586         check_dsp(ctx);
20587         tcg_gen_movi_tl(t0, rd >> 1);
20588         switch (extract32(ctx->opcode, 10, 1)) {
20589         case 0:
20590             /* SHRA_PH */
20591             gen_helper_shra_ph(v1_t, t0, v1_t);
20592             gen_store_gpr(v1_t, rt);
20593             break;
20594         case 1:
20595             /* SHRA_R_PH */
20596             gen_helper_shra_r_ph(v1_t, t0, v1_t);
20597             gen_store_gpr(v1_t, rt);
20598             break;
20599         }
20600         break;
20601     case NM_SHLL_S_PH:
20602         check_dsp(ctx);
20603         tcg_gen_movi_tl(t0, rd >> 1);
20604         switch (extract32(ctx->opcode, 10, 2)) {
20605         case 0:
20606             /* SHLL_PH */
20607             gen_helper_shll_ph(v1_t, t0, v1_t, cpu_env);
20608             gen_store_gpr(v1_t, rt);
20609             break;
20610         case 2:
20611             /* SHLL_S_PH */
20612             gen_helper_shll_s_ph(v1_t, t0, v1_t, cpu_env);
20613             gen_store_gpr(v1_t, rt);
20614             break;
20615         default:
20616             generate_exception_end(ctx, EXCP_RI);
20617             break;
20618         }
20619         break;
20620     case NM_SHLL_S_W:
20621         check_dsp(ctx);
20622         tcg_gen_movi_tl(t0, rd);
20623         gen_helper_shll_s_w(v1_t, t0, v1_t, cpu_env);
20624         gen_store_gpr(v1_t, rt);
20625         break;
20626     case NM_REPL_PH:
20627         check_dsp(ctx);
20628         {
20629             int16_t imm;
20630             imm = sextract32(ctx->opcode, 11, 11);
20631             imm = (int16_t)(imm << 6) >> 6;
20632             if (rt != 0) {
20633                 tcg_gen_movi_tl(cpu_gpr[rt], dup_const(MO_16, imm));
20634             }
20635         }
20636         break;
20637     default:
20638         generate_exception_end(ctx, EXCP_RI);
20639         break;
20640     }
20641 }
20642
20643 static int decode_nanomips_32_48_opc(CPUMIPSState *env, DisasContext *ctx)
20644 {
20645     uint16_t insn;
20646     uint32_t op;
20647     int rt, rs, rd;
20648     int offset;
20649     int imm;
20650
20651     insn = cpu_lduw_code(env, ctx->base.pc_next + 2);
20652     ctx->opcode = (ctx->opcode << 16) | insn;
20653
20654     rt = extract32(ctx->opcode, 21, 5);
20655     rs = extract32(ctx->opcode, 16, 5);
20656     rd = extract32(ctx->opcode, 11, 5);
20657
20658     op = extract32(ctx->opcode, 26, 6);
20659     switch (op) {
20660     case NM_P_ADDIU:
20661         if (rt == 0) {
20662             /* P.RI */
20663             switch (extract32(ctx->opcode, 19, 2)) {
20664             case NM_SIGRIE:
20665             default:
20666                 generate_exception_end(ctx, EXCP_RI);
20667                 break;
20668             case NM_P_SYSCALL:
20669                 if ((extract32(ctx->opcode, 18, 1)) == NM_SYSCALL) {
20670                     generate_exception_end(ctx, EXCP_SYSCALL);
20671                 } else {
20672                     generate_exception_end(ctx, EXCP_RI);
20673                 }
20674                 break;
20675             case NM_BREAK:
20676                 generate_exception_end(ctx, EXCP_BREAK);
20677                 break;
20678             case NM_SDBBP:
20679                 if (is_uhi(extract32(ctx->opcode, 0, 19))) {
20680                     gen_helper_do_semihosting(cpu_env);
20681                 } else {
20682                     if (ctx->hflags & MIPS_HFLAG_SBRI) {
20683                         generate_exception_end(ctx, EXCP_RI);
20684                     } else {
20685                         generate_exception_end(ctx, EXCP_DBp);
20686                     }
20687                 }
20688                 break;
20689             }
20690         } else {
20691             /* NM_ADDIU */
20692             imm = extract32(ctx->opcode, 0, 16);
20693             if (rs != 0) {
20694                 tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], imm);
20695             } else {
20696                 tcg_gen_movi_tl(cpu_gpr[rt], imm);
20697             }
20698             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
20699         }
20700         break;
20701     case NM_ADDIUPC:
20702         if (rt != 0) {
20703             offset = sextract32(ctx->opcode, 0, 1) << 21 |
20704                      extract32(ctx->opcode, 1, 20) << 1;
20705             target_long addr = addr_add(ctx, ctx->base.pc_next + 4, offset);
20706             tcg_gen_movi_tl(cpu_gpr[rt], addr);
20707         }
20708         break;
20709     case NM_POOL32A:
20710         switch (ctx->opcode & 0x07) {
20711         case NM_POOL32A0:
20712             gen_pool32a0_nanomips_insn(env, ctx);
20713             break;
20714         case NM_POOL32A5:
20715             {
20716                 int32_t op1 = extract32(ctx->opcode, 3, 7);
20717                 gen_pool32a5_nanomips_insn(ctx, op1, rd, rs, rt);
20718             }
20719             break;
20720         case NM_POOL32A7:
20721             switch (extract32(ctx->opcode, 3, 3)) {
20722             case NM_P_LSX:
20723                 gen_p_lsx(ctx, rd, rs, rt);
20724                 break;
20725             case NM_LSA:
20726                 /* In nanoMIPS, the shift field directly encodes the shift
20727                  * amount, meaning that the supported shift values are in
20728                  * the range 0 to 3 (instead of 1 to 4 in MIPSR6). */
20729                 gen_lsa(ctx, OPC_LSA, rd, rs, rt,
20730                         extract32(ctx->opcode, 9, 2) - 1);
20731                 break;
20732             case NM_EXTW:
20733                 gen_ext(ctx, 32, rd, rs, rt, extract32(ctx->opcode, 6, 5));
20734                 break;
20735             case NM_POOL32AXF:
20736                 gen_pool32axf_nanomips_insn(env, ctx);
20737                 break;
20738             default:
20739                 generate_exception_end(ctx, EXCP_RI);
20740                 break;
20741             }
20742             break;
20743         default:
20744             generate_exception_end(ctx, EXCP_RI);
20745             break;
20746         }
20747         break;
20748     case NM_P_GP_W:
20749         switch (ctx->opcode & 0x03) {
20750         case NM_ADDIUGP_W:
20751             if (rt != 0) {
20752                 offset = extract32(ctx->opcode, 0, 21);
20753                 gen_op_addr_addi(ctx, cpu_gpr[rt], cpu_gpr[28], offset);
20754             }
20755             break;
20756         case NM_LWGP:
20757             gen_ld(ctx, OPC_LW, rt, 28, extract32(ctx->opcode, 2, 19) << 2);
20758             break;
20759         case NM_SWGP:
20760             gen_st(ctx, OPC_SW, rt, 28, extract32(ctx->opcode, 2, 19) << 2);
20761             break;
20762         default:
20763             generate_exception_end(ctx, EXCP_RI);
20764             break;
20765         }
20766         break;
20767     case NM_P48I:
20768         {
20769             insn = cpu_lduw_code(env, ctx->base.pc_next + 4);
20770             target_long addr_off = extract32(ctx->opcode, 0, 16) | insn << 16;
20771             switch (extract32(ctx->opcode, 16, 5)) {
20772             case NM_LI48:
20773                 check_nms(ctx);
20774                 if (rt != 0) {
20775                     tcg_gen_movi_tl(cpu_gpr[rt], addr_off);
20776                 }
20777                 break;
20778             case NM_ADDIU48:
20779                 check_nms(ctx);
20780                 if (rt != 0) {
20781                     tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rt], addr_off);
20782                     tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
20783                 }
20784                 break;
20785             case NM_ADDIUGP48:
20786                 check_nms(ctx);
20787                 if (rt != 0) {
20788                     gen_op_addr_addi(ctx, cpu_gpr[rt], cpu_gpr[28], addr_off);
20789                 }
20790                 break;
20791             case NM_ADDIUPC48:
20792                 check_nms(ctx);
20793                 if (rt != 0) {
20794                     target_long addr = addr_add(ctx, ctx->base.pc_next + 6,
20795                                                 addr_off);
20796
20797                     tcg_gen_movi_tl(cpu_gpr[rt], addr);
20798                 }
20799                 break;
20800             case NM_LWPC48:
20801                 check_nms(ctx);
20802                 if (rt != 0) {
20803                     TCGv t0;
20804                     t0 = tcg_temp_new();
20805
20806                     target_long addr = addr_add(ctx, ctx->base.pc_next + 6,
20807                                                 addr_off);
20808
20809                     tcg_gen_movi_tl(t0, addr);
20810                     tcg_gen_qemu_ld_tl(cpu_gpr[rt], t0, ctx->mem_idx, MO_TESL);
20811                     tcg_temp_free(t0);
20812                 }
20813                 break;
20814             case NM_SWPC48:
20815                 check_nms(ctx);
20816                 {
20817                     TCGv t0, t1;
20818                     t0 = tcg_temp_new();
20819                     t1 = tcg_temp_new();
20820
20821                     target_long addr = addr_add(ctx, ctx->base.pc_next + 6,
20822                                                 addr_off);
20823
20824                     tcg_gen_movi_tl(t0, addr);
20825                     gen_load_gpr(t1, rt);
20826
20827                     tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
20828
20829                     tcg_temp_free(t0);
20830                     tcg_temp_free(t1);
20831                 }
20832                 break;
20833             default:
20834                 generate_exception_end(ctx, EXCP_RI);
20835                 break;
20836             }
20837             return 6;
20838         }
20839     case NM_P_U12:
20840         switch (extract32(ctx->opcode, 12, 4)) {
20841         case NM_ORI:
20842             gen_logic_imm(ctx, OPC_ORI, rt, rs, extract32(ctx->opcode, 0, 12));
20843             break;
20844         case NM_XORI:
20845             gen_logic_imm(ctx, OPC_XORI, rt, rs, extract32(ctx->opcode, 0, 12));
20846             break;
20847         case NM_ANDI:
20848             gen_logic_imm(ctx, OPC_ANDI, rt, rs, extract32(ctx->opcode, 0, 12));
20849             break;
20850         case NM_P_SR:
20851             switch (extract32(ctx->opcode, 20, 1)) {
20852             case NM_PP_SR:
20853                 switch (ctx->opcode & 3) {
20854                 case NM_SAVE:
20855                     gen_save(ctx, rt, extract32(ctx->opcode, 16, 4),
20856                              extract32(ctx->opcode, 2, 1),
20857                              extract32(ctx->opcode, 3, 9) << 3);
20858                     break;
20859                 case NM_RESTORE:
20860                 case NM_RESTORE_JRC:
20861                     gen_restore(ctx, rt, extract32(ctx->opcode, 16, 4),
20862                                 extract32(ctx->opcode, 2, 1),
20863                                 extract32(ctx->opcode, 3, 9) << 3);
20864                     if ((ctx->opcode & 3) == NM_RESTORE_JRC) {
20865                         gen_compute_branch_nm(ctx, OPC_JR, 2, 31, 0, 0);
20866                     }
20867                     break;
20868                 default:
20869                     generate_exception_end(ctx, EXCP_RI);
20870                     break;
20871                 }
20872                 break;
20873             case NM_P_SR_F:
20874                 generate_exception_end(ctx, EXCP_RI);
20875                 break;
20876             }
20877             break;
20878         case NM_SLTI:
20879             gen_slt_imm(ctx, OPC_SLTI, rt, rs, extract32(ctx->opcode, 0, 12));
20880             break;
20881         case NM_SLTIU:
20882             gen_slt_imm(ctx, OPC_SLTIU, rt, rs, extract32(ctx->opcode, 0, 12));
20883             break;
20884         case NM_SEQI:
20885             {
20886                 TCGv t0 = tcg_temp_new();
20887
20888                 imm = extract32(ctx->opcode, 0, 12);
20889                 gen_load_gpr(t0, rs);
20890                 tcg_gen_setcondi_tl(TCG_COND_EQ, t0, t0, imm);
20891                 gen_store_gpr(t0, rt);
20892
20893                 tcg_temp_free(t0);
20894             }
20895             break;
20896         case NM_ADDIUNEG:
20897             imm = (int16_t) extract32(ctx->opcode, 0, 12);
20898             gen_arith_imm(ctx, OPC_ADDIU, rt, rs, -imm);
20899             break;
20900         case NM_P_SHIFT:
20901             {
20902                 int shift = extract32(ctx->opcode, 0, 5);
20903                 switch (extract32(ctx->opcode, 5, 4)) {
20904                 case NM_P_SLL:
20905                     if (rt == 0 && shift == 0) {
20906                         /* NOP */
20907                     } else if (rt == 0 && shift == 3) {
20908                         /* EHB - treat as NOP */
20909                     } else if (rt == 0 && shift == 5) {
20910                         /* PAUSE - treat as NOP */
20911                     } else if (rt == 0 && shift == 6) {
20912                         /* SYNC */
20913                         gen_sync(extract32(ctx->opcode, 16, 5));
20914                     } else {
20915                         /* SLL */
20916                         gen_shift_imm(ctx, OPC_SLL, rt, rs,
20917                                       extract32(ctx->opcode, 0, 5));
20918                     }
20919                     break;
20920                 case NM_SRL:
20921                     gen_shift_imm(ctx, OPC_SRL, rt, rs,
20922                                   extract32(ctx->opcode, 0, 5));
20923                     break;
20924                 case NM_SRA:
20925                     gen_shift_imm(ctx, OPC_SRA, rt, rs,
20926                                   extract32(ctx->opcode, 0, 5));
20927                     break;
20928                 case NM_ROTR:
20929                     gen_shift_imm(ctx, OPC_ROTR, rt, rs,
20930                                   extract32(ctx->opcode, 0, 5));
20931                     break;
20932                 }
20933             }
20934             break;
20935         case NM_P_ROTX:
20936             check_nms(ctx);
20937             if (rt != 0) {
20938                 TCGv t0 = tcg_temp_new();
20939                 TCGv_i32 shift = tcg_const_i32(extract32(ctx->opcode, 0, 5));
20940                 TCGv_i32 shiftx = tcg_const_i32(extract32(ctx->opcode, 7, 4)
20941                                                 << 1);
20942                 TCGv_i32 stripe = tcg_const_i32(extract32(ctx->opcode, 6, 1));
20943
20944                 gen_load_gpr(t0, rs);
20945                 gen_helper_rotx(cpu_gpr[rt], t0, shift, shiftx, stripe);
20946                 tcg_temp_free(t0);
20947
20948                 tcg_temp_free_i32(shift);
20949                 tcg_temp_free_i32(shiftx);
20950                 tcg_temp_free_i32(stripe);
20951             }
20952             break;
20953         case NM_P_INS:
20954             switch (((ctx->opcode >> 10) & 2) |
20955                     (extract32(ctx->opcode, 5, 1))) {
20956             case NM_INS:
20957                 check_nms(ctx);
20958                 gen_bitops(ctx, OPC_INS, rt, rs, extract32(ctx->opcode, 0, 5),
20959                            extract32(ctx->opcode, 6, 5));
20960                 break;
20961             default:
20962                 generate_exception_end(ctx, EXCP_RI);
20963                 break;
20964             }
20965             break;
20966         case NM_P_EXT:
20967             switch (((ctx->opcode >> 10) & 2) |
20968                     (extract32(ctx->opcode, 5, 1))) {
20969             case NM_EXT:
20970                 check_nms(ctx);
20971                 gen_bitops(ctx, OPC_EXT, rt, rs, extract32(ctx->opcode, 0, 5),
20972                            extract32(ctx->opcode, 6, 5));
20973                 break;
20974             default:
20975                 generate_exception_end(ctx, EXCP_RI);
20976                 break;
20977             }
20978             break;
20979         default:
20980             generate_exception_end(ctx, EXCP_RI);
20981             break;
20982         }
20983         break;
20984     case NM_POOL32F:
20985         gen_pool32f_nanomips_insn(ctx);
20986         break;
20987     case NM_POOL32S:
20988         break;
20989     case NM_P_LUI:
20990         switch (extract32(ctx->opcode, 1, 1)) {
20991         case NM_LUI:
20992             if (rt != 0) {
20993                 tcg_gen_movi_tl(cpu_gpr[rt],
20994                                 sextract32(ctx->opcode, 0, 1) << 31 |
20995                                 extract32(ctx->opcode, 2, 10) << 21 |
20996                                 extract32(ctx->opcode, 12, 9) << 12);
20997             }
20998             break;
20999         case NM_ALUIPC:
21000             if (rt != 0) {
21001                 offset = sextract32(ctx->opcode, 0, 1) << 31 |
21002                          extract32(ctx->opcode, 2, 10) << 21 |
21003                          extract32(ctx->opcode, 12, 9) << 12;
21004                 target_long addr;
21005                 addr = ~0xFFF & addr_add(ctx, ctx->base.pc_next + 4, offset);
21006                 tcg_gen_movi_tl(cpu_gpr[rt], addr);
21007             }
21008             break;
21009         }
21010         break;
21011     case NM_P_GP_BH:
21012         {
21013             uint32_t u = extract32(ctx->opcode, 0, 18);
21014
21015             switch (extract32(ctx->opcode, 18, 3)) {
21016             case NM_LBGP:
21017                 gen_ld(ctx, OPC_LB, rt, 28, u);
21018                 break;
21019             case NM_SBGP:
21020                 gen_st(ctx, OPC_SB, rt, 28, u);
21021                 break;
21022             case NM_LBUGP:
21023                 gen_ld(ctx, OPC_LBU, rt, 28, u);
21024                 break;
21025             case NM_ADDIUGP_B:
21026                 if (rt != 0) {
21027                     gen_op_addr_addi(ctx, cpu_gpr[rt], cpu_gpr[28], u);
21028                 }
21029                 break;
21030             case NM_P_GP_LH:
21031                 u &= ~1;
21032                 switch (ctx->opcode & 1) {
21033                 case NM_LHGP:
21034                     gen_ld(ctx, OPC_LH, rt, 28, u);
21035                     break;
21036                 case NM_LHUGP:
21037                     gen_ld(ctx, OPC_LHU, rt, 28, u);
21038                     break;
21039                 }
21040                 break;
21041             case NM_P_GP_SH:
21042                 u &= ~1;
21043                 switch (ctx->opcode & 1) {
21044                 case NM_SHGP:
21045                     gen_st(ctx, OPC_SH, rt, 28, u);
21046                     break;
21047                 default:
21048                     generate_exception_end(ctx, EXCP_RI);
21049                     break;
21050                 }
21051                 break;
21052             case NM_P_GP_CP1:
21053                 u &= ~0x3;
21054                 switch (ctx->opcode & 0x3) {
21055                 case NM_LWC1GP:
21056                     gen_cop1_ldst(ctx, OPC_LWC1, rt, 28, u);
21057                     break;
21058                 case NM_LDC1GP:
21059                     gen_cop1_ldst(ctx, OPC_LDC1, rt, 28, u);
21060                     break;
21061                 case NM_SWC1GP:
21062                     gen_cop1_ldst(ctx, OPC_SWC1, rt, 28, u);
21063                     break;
21064                 case NM_SDC1GP:
21065                     gen_cop1_ldst(ctx, OPC_SDC1, rt, 28, u);
21066                     break;
21067                 }
21068                 break;
21069             default:
21070                 generate_exception_end(ctx, EXCP_RI);
21071                 break;
21072             }
21073         }
21074         break;
21075     case NM_P_LS_U12:
21076         {
21077             uint32_t u = extract32(ctx->opcode, 0, 12);
21078
21079             switch (extract32(ctx->opcode, 12, 4)) {
21080             case NM_P_PREFU12:
21081                 if (rt == 31) {
21082                     /* SYNCI */
21083                     /* Break the TB to be able to sync copied instructions
21084                        immediately */
21085                     ctx->base.is_jmp = DISAS_STOP;
21086                 } else {
21087                     /* PREF */
21088                     /* Treat as NOP. */
21089                 }
21090                 break;
21091             case NM_LB:
21092                 gen_ld(ctx, OPC_LB, rt, rs, u);
21093                 break;
21094             case NM_LH:
21095                 gen_ld(ctx, OPC_LH, rt, rs, u);
21096                 break;
21097             case NM_LW:
21098                 gen_ld(ctx, OPC_LW, rt, rs, u);
21099                 break;
21100             case NM_LBU:
21101                 gen_ld(ctx, OPC_LBU, rt, rs, u);
21102                 break;
21103             case NM_LHU:
21104                 gen_ld(ctx, OPC_LHU, rt, rs, u);
21105                 break;
21106             case NM_SB:
21107                 gen_st(ctx, OPC_SB, rt, rs, u);
21108                 break;
21109             case NM_SH:
21110                 gen_st(ctx, OPC_SH, rt, rs, u);
21111                 break;
21112             case NM_SW:
21113                 gen_st(ctx, OPC_SW, rt, rs, u);
21114                 break;
21115             case NM_LWC1:
21116                 gen_cop1_ldst(ctx, OPC_LWC1, rt, rs, u);
21117                 break;
21118             case NM_LDC1:
21119                 gen_cop1_ldst(ctx, OPC_LDC1, rt, rs, u);
21120                 break;
21121             case NM_SWC1:
21122                 gen_cop1_ldst(ctx, OPC_SWC1, rt, rs, u);
21123                 break;
21124             case NM_SDC1:
21125                 gen_cop1_ldst(ctx, OPC_SDC1, rt, rs, u);
21126                 break;
21127             default:
21128                 generate_exception_end(ctx, EXCP_RI);
21129                 break;
21130             }
21131         }
21132         break;
21133     case NM_P_LS_S9:
21134         {
21135             int32_t s = (sextract32(ctx->opcode, 15, 1) << 8) |
21136                         extract32(ctx->opcode, 0, 8);
21137
21138             switch (extract32(ctx->opcode, 8, 3)) {
21139             case NM_P_LS_S0:
21140                 switch (extract32(ctx->opcode, 11, 4)) {
21141                 case NM_LBS9:
21142                     gen_ld(ctx, OPC_LB, rt, rs, s);
21143                     break;
21144                 case NM_LHS9:
21145                     gen_ld(ctx, OPC_LH, rt, rs, s);
21146                     break;
21147                 case NM_LWS9:
21148                     gen_ld(ctx, OPC_LW, rt, rs, s);
21149                     break;
21150                 case NM_LBUS9:
21151                     gen_ld(ctx, OPC_LBU, rt, rs, s);
21152                     break;
21153                 case NM_LHUS9:
21154                     gen_ld(ctx, OPC_LHU, rt, rs, s);
21155                     break;
21156                 case NM_SBS9:
21157                     gen_st(ctx, OPC_SB, rt, rs, s);
21158                     break;
21159                 case NM_SHS9:
21160                     gen_st(ctx, OPC_SH, rt, rs, s);
21161                     break;
21162                 case NM_SWS9:
21163                     gen_st(ctx, OPC_SW, rt, rs, s);
21164                     break;
21165                 case NM_LWC1S9:
21166                     gen_cop1_ldst(ctx, OPC_LWC1, rt, rs, s);
21167                     break;
21168                 case NM_LDC1S9:
21169                     gen_cop1_ldst(ctx, OPC_LDC1, rt, rs, s);
21170                     break;
21171                 case NM_SWC1S9:
21172                     gen_cop1_ldst(ctx, OPC_SWC1, rt, rs, s);
21173                     break;
21174                 case NM_SDC1S9:
21175                     gen_cop1_ldst(ctx, OPC_SDC1, rt, rs, s);
21176                     break;
21177                 case NM_P_PREFS9:
21178                     if (rt == 31) {
21179                         /* SYNCI */
21180                         /* Break the TB to be able to sync copied instructions
21181                            immediately */
21182                         ctx->base.is_jmp = DISAS_STOP;
21183                     } else {
21184                         /* PREF */
21185                         /* Treat as NOP. */
21186                     }
21187                     break;
21188                 default:
21189                     generate_exception_end(ctx, EXCP_RI);
21190                     break;
21191                 }
21192                 break;
21193             case NM_P_LS_S1:
21194                 switch (extract32(ctx->opcode, 11, 4)) {
21195                 case NM_UALH:
21196                 case NM_UASH:
21197                     check_nms(ctx);
21198                     {
21199                         TCGv t0 = tcg_temp_new();
21200                         TCGv t1 = tcg_temp_new();
21201
21202                         gen_base_offset_addr(ctx, t0, rs, s);
21203
21204                         switch (extract32(ctx->opcode, 11, 4)) {
21205                         case NM_UALH:
21206                             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW |
21207                                                MO_UNALN);
21208                             gen_store_gpr(t0, rt);
21209                             break;
21210                         case NM_UASH:
21211                             gen_load_gpr(t1, rt);
21212                             tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUW |
21213                                                MO_UNALN);
21214                             break;
21215                         }
21216                         tcg_temp_free(t0);
21217                         tcg_temp_free(t1);
21218                     }
21219                     break;
21220                 case NM_P_LL:
21221                     switch (ctx->opcode & 0x03) {
21222                     case NM_LL:
21223                         gen_ld(ctx, OPC_LL, rt, rs, s);
21224                         break;
21225                     case NM_LLWP:
21226                         check_xnp(ctx);
21227                         gen_llwp(ctx, rs, 0, rt, extract32(ctx->opcode, 3, 5));
21228                         break;
21229                     }
21230                     break;
21231                 case NM_P_SC:
21232                     switch (ctx->opcode & 0x03) {
21233                     case NM_SC:
21234                         gen_st_cond(ctx, OPC_SC, rt, rs, s);
21235                         break;
21236                     case NM_SCWP:
21237                         check_xnp(ctx);
21238                         gen_scwp(ctx, rs, 0, rt, extract32(ctx->opcode, 3, 5));
21239                         break;
21240                     }
21241                     break;
21242                 case NM_CACHE:
21243                     check_cp0_enabled(ctx);
21244                     if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
21245                         gen_cache_operation(ctx, rt, rs, s);
21246                     }
21247                     break;
21248                 }
21249                 break;
21250             case NM_P_LS_E0:
21251                 switch (extract32(ctx->opcode, 11, 4)) {
21252                 case NM_LBE:
21253                     check_eva(ctx);
21254                     check_cp0_enabled(ctx);
21255                     gen_ld(ctx, OPC_LBE, rt, rs, s);
21256                     break;
21257                 case NM_SBE:
21258                     check_eva(ctx);
21259                     check_cp0_enabled(ctx);
21260                     gen_st(ctx, OPC_SBE, rt, rs, s);
21261                     break;
21262                 case NM_LBUE:
21263                     check_eva(ctx);
21264                     check_cp0_enabled(ctx);
21265                     gen_ld(ctx, OPC_LBUE, rt, rs, s);
21266                     break;
21267                 case NM_P_PREFE:
21268                     if (rt == 31) {
21269                         /* case NM_SYNCIE */
21270                         check_eva(ctx);
21271                         check_cp0_enabled(ctx);
21272                         /* Break the TB to be able to sync copied instructions
21273                            immediately */
21274                         ctx->base.is_jmp = DISAS_STOP;
21275                     } else {
21276                         /* case NM_PREFE */
21277                         check_eva(ctx);
21278                         check_cp0_enabled(ctx);
21279                         /* Treat as NOP. */
21280                     }
21281                     break;
21282                 case NM_LHE:
21283                     check_eva(ctx);
21284                     check_cp0_enabled(ctx);
21285                     gen_ld(ctx, OPC_LHE, rt, rs, s);
21286                     break;
21287                 case NM_SHE:
21288                     check_eva(ctx);
21289                     check_cp0_enabled(ctx);
21290                     gen_st(ctx, OPC_SHE, rt, rs, s);
21291                     break;
21292                 case NM_LHUE:
21293                     check_eva(ctx);
21294                     check_cp0_enabled(ctx);
21295                     gen_ld(ctx, OPC_LHUE, rt, rs, s);
21296                     break;
21297                 case NM_CACHEE:
21298                     check_nms_dl_il_sl_tl_l2c(ctx);
21299                     gen_cache_operation(ctx, rt, rs, s);
21300                     break;
21301                 case NM_LWE:
21302                     check_eva(ctx);
21303                     check_cp0_enabled(ctx);
21304                     gen_ld(ctx, OPC_LWE, rt, rs, s);
21305                     break;
21306                 case NM_SWE:
21307                     check_eva(ctx);
21308                     check_cp0_enabled(ctx);
21309                     gen_st(ctx, OPC_SWE, rt, rs, s);
21310                     break;
21311                 case NM_P_LLE:
21312                     switch (extract32(ctx->opcode, 2, 2)) {
21313                     case NM_LLE:
21314                         check_xnp(ctx);
21315                         check_eva(ctx);
21316                         check_cp0_enabled(ctx);
21317                         gen_ld(ctx, OPC_LLE, rt, rs, s);
21318                         break;
21319                     case NM_LLWPE:
21320                         check_xnp(ctx);
21321                         check_eva(ctx);
21322                         check_cp0_enabled(ctx);
21323                         gen_llwp(ctx, rs, 0, rt, extract32(ctx->opcode, 3, 5));
21324                     default:
21325                         generate_exception_end(ctx, EXCP_RI);
21326                         break;
21327                     }
21328                     break;
21329                 case NM_P_SCE:
21330                     switch (extract32(ctx->opcode, 2, 2)) {
21331                     case NM_SCE:
21332                         check_xnp(ctx);
21333                         check_eva(ctx);
21334                         check_cp0_enabled(ctx);
21335                         gen_st_cond(ctx, OPC_SCE, rt, rs, s);
21336                         break;
21337                     case NM_SCWPE:
21338                         check_xnp(ctx);
21339                         check_eva(ctx);
21340                         check_cp0_enabled(ctx);
21341                         gen_scwp(ctx, rs, 0, rt, extract32(ctx->opcode, 3, 5));
21342                     default:
21343                         generate_exception_end(ctx, EXCP_RI);
21344                         break;
21345                     }
21346                     break;
21347                 }
21348                 break;
21349             case NM_P_LS_WM:
21350             case NM_P_LS_UAWM:
21351                 check_nms(ctx);
21352                 {
21353                     int count = extract32(ctx->opcode, 12, 3);
21354                     int counter = 0;
21355
21356                     offset = sextract32(ctx->opcode, 15, 1) << 8 |
21357                              extract32(ctx->opcode, 0, 8);
21358                     TCGv va = tcg_temp_new();
21359                     TCGv t1 = tcg_temp_new();
21360                     TCGMemOp memop = (extract32(ctx->opcode, 8, 3)) ==
21361                                       NM_P_LS_UAWM ? MO_UNALN : 0;
21362
21363                     count = (count == 0) ? 8 : count;
21364                     while (counter != count) {
21365                         int this_rt = ((rt + counter) & 0x1f) | (rt & 0x10);
21366                         int this_offset = offset + (counter << 2);
21367
21368                         gen_base_offset_addr(ctx, va, rs, this_offset);
21369
21370                         switch (extract32(ctx->opcode, 11, 1)) {
21371                         case NM_LWM:
21372                             tcg_gen_qemu_ld_tl(t1, va, ctx->mem_idx,
21373                                                memop | MO_TESL);
21374                             gen_store_gpr(t1, this_rt);
21375                             if ((this_rt == rs) &&
21376                                 (counter != (count - 1))) {
21377                                 /* UNPREDICTABLE */
21378                             }
21379                             break;
21380                         case NM_SWM:
21381                             this_rt = (rt == 0) ? 0 : this_rt;
21382                             gen_load_gpr(t1, this_rt);
21383                             tcg_gen_qemu_st_tl(t1, va, ctx->mem_idx,
21384                                                memop | MO_TEUL);
21385                             break;
21386                         }
21387                         counter++;
21388                     }
21389                     tcg_temp_free(va);
21390                     tcg_temp_free(t1);
21391                 }
21392                 break;
21393             default:
21394                 generate_exception_end(ctx, EXCP_RI);
21395                 break;
21396             }
21397         }
21398         break;
21399     case NM_MOVE_BALC:
21400         check_nms(ctx);
21401         {
21402             TCGv t0 = tcg_temp_new();
21403             int32_t s = sextract32(ctx->opcode, 0, 1) << 21 |
21404                         extract32(ctx->opcode, 1, 20) << 1;
21405             rd = (extract32(ctx->opcode, 24, 1)) == 0 ? 4 : 5;
21406             rt = decode_gpr_gpr4_zero(extract32(ctx->opcode, 25, 1) << 3 |
21407                             extract32(ctx->opcode, 21, 3));
21408             gen_load_gpr(t0, rt);
21409             tcg_gen_mov_tl(cpu_gpr[rd], t0);
21410             gen_compute_branch_nm(ctx, OPC_BGEZAL, 4, 0, 0, s);
21411             tcg_temp_free(t0);
21412         }
21413         break;
21414     case NM_P_BAL:
21415         {
21416             int32_t s = sextract32(ctx->opcode, 0, 1) << 25 |
21417                         extract32(ctx->opcode, 1, 24) << 1;
21418
21419             if ((extract32(ctx->opcode, 25, 1)) == 0) {
21420                 /* BC */
21421                 gen_compute_branch_nm(ctx, OPC_BEQ, 4, 0, 0, s);
21422             } else {
21423                 /* BALC */
21424                 gen_compute_branch_nm(ctx, OPC_BGEZAL, 4, 0, 0, s);
21425             }
21426         }
21427         break;
21428     case NM_P_J:
21429         switch (extract32(ctx->opcode, 12, 4)) {
21430         case NM_JALRC:
21431         case NM_JALRC_HB:
21432             gen_compute_branch_nm(ctx, OPC_JALR, 4, rs, rt, 0);
21433             break;
21434         case NM_P_BALRSC:
21435             gen_compute_nanomips_pbalrsc_branch(ctx, rs, rt);
21436             break;
21437         default:
21438             generate_exception_end(ctx, EXCP_RI);
21439             break;
21440         }
21441         break;
21442     case NM_P_BR1:
21443         {
21444             int32_t s = sextract32(ctx->opcode, 0, 1) << 14 |
21445                         extract32(ctx->opcode, 1, 13) << 1;
21446             switch (extract32(ctx->opcode, 14, 2)) {
21447             case NM_BEQC:
21448                 check_nms(ctx);
21449                 gen_compute_branch_nm(ctx, OPC_BEQ, 4, rs, rt, s);
21450                 break;
21451             case NM_P_BR3A:
21452                 s = sextract32(ctx->opcode, 0, 1) << 14 |
21453                     extract32(ctx->opcode, 1, 13) << 1;
21454                 check_cp1_enabled(ctx);
21455                 switch (extract32(ctx->opcode, 16, 5)) {
21456                 case NM_BC1EQZC:
21457                     gen_compute_branch_cp1_nm(ctx, OPC_BC1EQZ, rt, s);
21458                     break;
21459                 case NM_BC1NEZC:
21460                     gen_compute_branch_cp1_nm(ctx, OPC_BC1NEZ, rt, s);
21461                     break;
21462                 case NM_BPOSGE32C:
21463                     check_dsp_r3(ctx);
21464                     {
21465                         int32_t imm = extract32(ctx->opcode, 1, 13) |
21466                                       extract32(ctx->opcode, 0, 1) << 13;
21467
21468                         gen_compute_branch_nm(ctx, OPC_BPOSGE32, 4, -1, -2,
21469                                               imm);
21470                     }
21471                     break;
21472                 default:
21473                     generate_exception_end(ctx, EXCP_RI);
21474                     break;
21475                 }
21476                 break;
21477             case NM_BGEC:
21478                 if (rs == rt) {
21479                     gen_compute_compact_branch_nm(ctx, OPC_BC, rs, rt, s);
21480                 } else {
21481                     gen_compute_compact_branch_nm(ctx, OPC_BGEC, rs, rt, s);
21482                 }
21483                 break;
21484             case NM_BGEUC:
21485                 if (rs == rt || rt == 0) {
21486                     gen_compute_compact_branch_nm(ctx, OPC_BC, 0, 0, s);
21487                 } else if (rs == 0) {
21488                     gen_compute_compact_branch_nm(ctx, OPC_BEQZC, rt, 0, s);
21489                 } else {
21490                     gen_compute_compact_branch_nm(ctx, OPC_BGEUC, rs, rt, s);
21491                 }
21492                 break;
21493             }
21494         }
21495         break;
21496     case NM_P_BR2:
21497         {
21498             int32_t s = sextract32(ctx->opcode, 0, 1) << 14 |
21499                         extract32(ctx->opcode, 1, 13) << 1;
21500             switch (extract32(ctx->opcode, 14, 2)) {
21501             case NM_BNEC:
21502                 check_nms(ctx);
21503                 gen_compute_branch_nm(ctx, OPC_BNE, 4, rs, rt, s);
21504                 break;
21505             case NM_BLTC:
21506                 if (rs != 0 && rt != 0 && rs == rt) {
21507                     /* NOP */
21508                     ctx->hflags |= MIPS_HFLAG_FBNSLOT;
21509                 } else {
21510                     gen_compute_compact_branch_nm(ctx, OPC_BLTC, rs, rt, s);
21511                 }
21512                 break;
21513             case NM_BLTUC:
21514                 if (rs == 0 || rs == rt) {
21515                     /* NOP */
21516                     ctx->hflags |= MIPS_HFLAG_FBNSLOT;
21517                 } else {
21518                     gen_compute_compact_branch_nm(ctx, OPC_BLTUC, rs, rt, s);
21519                 }
21520                 break;
21521             default:
21522                 generate_exception_end(ctx, EXCP_RI);
21523                 break;
21524             }
21525         }
21526         break;
21527     case NM_P_BRI:
21528         {
21529             int32_t s = sextract32(ctx->opcode, 0, 1) << 11 |
21530                         extract32(ctx->opcode, 1, 10) << 1;
21531             uint32_t u = extract32(ctx->opcode, 11, 7);
21532
21533             gen_compute_imm_branch(ctx, extract32(ctx->opcode, 18, 3),
21534                                    rt, u, s);
21535         }
21536         break;
21537     default:
21538         generate_exception_end(ctx, EXCP_RI);
21539         break;
21540     }
21541     return 4;
21542 }
21543
21544 static int decode_nanomips_opc(CPUMIPSState *env, DisasContext *ctx)
21545 {
21546     uint32_t op;
21547     int rt = decode_gpr_gpr3(NANOMIPS_EXTRACT_RD(ctx->opcode));
21548     int rs = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS(ctx->opcode));
21549     int rd = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS1(ctx->opcode));
21550     int offset;
21551     int imm;
21552
21553     /* make sure instructions are on a halfword boundary */
21554     if (ctx->base.pc_next & 0x1) {
21555         TCGv tmp = tcg_const_tl(ctx->base.pc_next);
21556         tcg_gen_st_tl(tmp, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
21557         tcg_temp_free(tmp);
21558         generate_exception_end(ctx, EXCP_AdEL);
21559         return 2;
21560     }
21561
21562     op = extract32(ctx->opcode, 10, 6);
21563     switch (op) {
21564     case NM_P16_MV:
21565         rt = NANOMIPS_EXTRACT_RD5(ctx->opcode);
21566         if (rt != 0) {
21567             /* MOVE */
21568             rs = NANOMIPS_EXTRACT_RS5(ctx->opcode);
21569             gen_arith(ctx, OPC_ADDU, rt, rs, 0);
21570         } else {
21571             /* P16.RI */
21572             switch (extract32(ctx->opcode, 3, 2)) {
21573             case NM_P16_SYSCALL:
21574                 if (extract32(ctx->opcode, 2, 1) == 0) {
21575                     generate_exception_end(ctx, EXCP_SYSCALL);
21576                 } else {
21577                     generate_exception_end(ctx, EXCP_RI);
21578                 }
21579                 break;
21580             case NM_BREAK16:
21581                 generate_exception_end(ctx, EXCP_BREAK);
21582                 break;
21583             case NM_SDBBP16:
21584                 if (is_uhi(extract32(ctx->opcode, 0, 3))) {
21585                     gen_helper_do_semihosting(cpu_env);
21586                 } else {
21587                     if (ctx->hflags & MIPS_HFLAG_SBRI) {
21588                         generate_exception_end(ctx, EXCP_RI);
21589                     } else {
21590                         generate_exception_end(ctx, EXCP_DBp);
21591                     }
21592                 }
21593                 break;
21594             default:
21595                 generate_exception_end(ctx, EXCP_RI);
21596                 break;
21597             }
21598         }
21599         break;
21600     case NM_P16_SHIFT:
21601         {
21602             int shift = extract32(ctx->opcode, 0, 3);
21603             uint32_t opc = 0;
21604             shift = (shift == 0) ? 8 : shift;
21605
21606             switch (extract32(ctx->opcode, 3, 1)) {
21607             case NM_SLL16:
21608                 opc = OPC_SLL;
21609                 break;
21610             case NM_SRL16:
21611                 opc = OPC_SRL;
21612                 break;
21613             }
21614             gen_shift_imm(ctx, opc, rt, rs, shift);
21615         }
21616         break;
21617     case NM_P16C:
21618         switch (ctx->opcode & 1) {
21619         case NM_POOL16C_0:
21620             gen_pool16c_nanomips_insn(ctx);
21621             break;
21622         case NM_LWXS16:
21623             gen_ldxs(ctx, rt, rs, rd);
21624             break;
21625         }
21626         break;
21627     case NM_P16_A1:
21628         switch (extract32(ctx->opcode, 6, 1)) {
21629         case NM_ADDIUR1SP:
21630             imm = extract32(ctx->opcode, 0, 6) << 2;
21631             gen_arith_imm(ctx, OPC_ADDIU, rt, 29, imm);
21632             break;
21633         default:
21634             generate_exception_end(ctx, EXCP_RI);
21635             break;
21636         }
21637         break;
21638     case NM_P16_A2:
21639         switch (extract32(ctx->opcode, 3, 1)) {
21640         case NM_ADDIUR2:
21641             imm = extract32(ctx->opcode, 0, 3) << 2;
21642             gen_arith_imm(ctx, OPC_ADDIU, rt, rs, imm);
21643             break;
21644         case NM_P_ADDIURS5:
21645             rt = extract32(ctx->opcode, 5, 5);
21646             if (rt != 0) {
21647                 /* imm = sign_extend(s[3] . s[2:0] , from_nbits = 4) */
21648                 imm = (sextract32(ctx->opcode, 4, 1) << 3) |
21649                       (extract32(ctx->opcode, 0, 3));
21650                 gen_arith_imm(ctx, OPC_ADDIU, rt, rt, imm);
21651             }
21652             break;
21653         }
21654         break;
21655     case NM_P16_ADDU:
21656         switch (ctx->opcode & 0x1) {
21657         case NM_ADDU16:
21658             gen_arith(ctx, OPC_ADDU, rd, rs, rt);
21659             break;
21660         case NM_SUBU16:
21661             gen_arith(ctx, OPC_SUBU, rd, rs, rt);
21662             break;
21663         }
21664         break;
21665     case NM_P16_4X4:
21666         rt = (extract32(ctx->opcode, 9, 1) << 3) |
21667               extract32(ctx->opcode, 5, 3);
21668         rs = (extract32(ctx->opcode, 4, 1) << 3) |
21669               extract32(ctx->opcode, 0, 3);
21670         rt = decode_gpr_gpr4(rt);
21671         rs = decode_gpr_gpr4(rs);
21672         switch ((extract32(ctx->opcode, 7, 2) & 0x2) |
21673                 (extract32(ctx->opcode, 3, 1))) {
21674         case NM_ADDU4X4:
21675             check_nms(ctx);
21676             gen_arith(ctx, OPC_ADDU, rt, rs, rt);
21677             break;
21678         case NM_MUL4X4:
21679             check_nms(ctx);
21680             gen_r6_muldiv(ctx, R6_OPC_MUL, rt, rs, rt);
21681             break;
21682         default:
21683             generate_exception_end(ctx, EXCP_RI);
21684             break;
21685         }
21686         break;
21687     case NM_LI16:
21688         {
21689             int imm = extract32(ctx->opcode, 0, 7);
21690             imm = (imm == 0x7f ? -1 : imm);
21691             if (rt != 0) {
21692                 tcg_gen_movi_tl(cpu_gpr[rt], imm);
21693             }
21694         }
21695         break;
21696     case NM_ANDI16:
21697         {
21698             uint32_t u = extract32(ctx->opcode, 0, 4);
21699             u = (u == 12) ? 0xff :
21700                 (u == 13) ? 0xffff : u;
21701             gen_logic_imm(ctx, OPC_ANDI, rt, rs, u);
21702         }
21703         break;
21704     case NM_P16_LB:
21705         offset = extract32(ctx->opcode, 0, 2);
21706         switch (extract32(ctx->opcode, 2, 2)) {
21707         case NM_LB16:
21708             gen_ld(ctx, OPC_LB, rt, rs, offset);
21709             break;
21710         case NM_SB16:
21711             rt = decode_gpr_gpr3_src_store(
21712                      NANOMIPS_EXTRACT_RD(ctx->opcode));
21713             gen_st(ctx, OPC_SB, rt, rs, offset);
21714             break;
21715         case NM_LBU16:
21716             gen_ld(ctx, OPC_LBU, rt, rs, offset);
21717             break;
21718         default:
21719             generate_exception_end(ctx, EXCP_RI);
21720             break;
21721         }
21722         break;
21723     case NM_P16_LH:
21724         offset = extract32(ctx->opcode, 1, 2) << 1;
21725         switch ((extract32(ctx->opcode, 3, 1) << 1) | (ctx->opcode & 1)) {
21726         case NM_LH16:
21727             gen_ld(ctx, OPC_LH, rt, rs, offset);
21728             break;
21729         case NM_SH16:
21730             rt = decode_gpr_gpr3_src_store(
21731                      NANOMIPS_EXTRACT_RD(ctx->opcode));
21732             gen_st(ctx, OPC_SH, rt, rs, offset);
21733             break;
21734         case NM_LHU16:
21735             gen_ld(ctx, OPC_LHU, rt, rs, offset);
21736             break;
21737         default:
21738             generate_exception_end(ctx, EXCP_RI);
21739             break;
21740         }
21741         break;
21742     case NM_LW16:
21743         offset = extract32(ctx->opcode, 0, 4) << 2;
21744         gen_ld(ctx, OPC_LW, rt, rs, offset);
21745         break;
21746     case NM_LWSP16:
21747         rt = NANOMIPS_EXTRACT_RD5(ctx->opcode);
21748         offset = extract32(ctx->opcode, 0, 5) << 2;
21749         gen_ld(ctx, OPC_LW, rt, 29, offset);
21750         break;
21751     case NM_LW4X4:
21752         check_nms(ctx);
21753         rt = (extract32(ctx->opcode, 9, 1) << 3) |
21754              extract32(ctx->opcode, 5, 3);
21755         rs = (extract32(ctx->opcode, 4, 1) << 3) |
21756              extract32(ctx->opcode, 0, 3);
21757         offset = (extract32(ctx->opcode, 3, 1) << 3) |
21758                  (extract32(ctx->opcode, 8, 1) << 2);
21759         rt = decode_gpr_gpr4(rt);
21760         rs = decode_gpr_gpr4(rs);
21761         gen_ld(ctx, OPC_LW, rt, rs, offset);
21762         break;
21763     case NM_SW4X4:
21764         check_nms(ctx);
21765         rt = (extract32(ctx->opcode, 9, 1) << 3) |
21766              extract32(ctx->opcode, 5, 3);
21767         rs = (extract32(ctx->opcode, 4, 1) << 3) |
21768              extract32(ctx->opcode, 0, 3);
21769         offset = (extract32(ctx->opcode, 3, 1) << 3) |
21770                  (extract32(ctx->opcode, 8, 1) << 2);
21771         rt = decode_gpr_gpr4_zero(rt);
21772         rs = decode_gpr_gpr4(rs);
21773         gen_st(ctx, OPC_SW, rt, rs, offset);
21774         break;
21775     case NM_LWGP16:
21776         offset = extract32(ctx->opcode, 0, 7) << 2;
21777         gen_ld(ctx, OPC_LW, rt, 28, offset);
21778         break;
21779     case NM_SWSP16:
21780         rt = NANOMIPS_EXTRACT_RD5(ctx->opcode);
21781         offset = extract32(ctx->opcode, 0, 5) << 2;
21782         gen_st(ctx, OPC_SW, rt, 29, offset);
21783         break;
21784     case NM_SW16:
21785         rt = decode_gpr_gpr3_src_store(
21786                  NANOMIPS_EXTRACT_RD(ctx->opcode));
21787         rs = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS(ctx->opcode));
21788         offset = extract32(ctx->opcode, 0, 4) << 2;
21789         gen_st(ctx, OPC_SW, rt, rs, offset);
21790         break;
21791     case NM_SWGP16:
21792         rt = decode_gpr_gpr3_src_store(
21793                  NANOMIPS_EXTRACT_RD(ctx->opcode));
21794         offset = extract32(ctx->opcode, 0, 7) << 2;
21795         gen_st(ctx, OPC_SW, rt, 28, offset);
21796         break;
21797     case NM_BC16:
21798         gen_compute_branch_nm(ctx, OPC_BEQ, 2, 0, 0,
21799                            (sextract32(ctx->opcode, 0, 1) << 10) |
21800                            (extract32(ctx->opcode, 1, 9) << 1));
21801         break;
21802     case NM_BALC16:
21803         gen_compute_branch_nm(ctx, OPC_BGEZAL, 2, 0, 0,
21804                            (sextract32(ctx->opcode, 0, 1) << 10) |
21805                            (extract32(ctx->opcode, 1, 9) << 1));
21806         break;
21807     case NM_BEQZC16:
21808         gen_compute_branch_nm(ctx, OPC_BEQ, 2, rt, 0,
21809                            (sextract32(ctx->opcode, 0, 1) << 7) |
21810                            (extract32(ctx->opcode, 1, 6) << 1));
21811         break;
21812     case NM_BNEZC16:
21813         gen_compute_branch_nm(ctx, OPC_BNE, 2, rt, 0,
21814                            (sextract32(ctx->opcode, 0, 1) << 7) |
21815                            (extract32(ctx->opcode, 1, 6) << 1));
21816         break;
21817     case NM_P16_BR:
21818         switch (ctx->opcode & 0xf) {
21819         case 0:
21820             /* P16.JRC */
21821             switch (extract32(ctx->opcode, 4, 1)) {
21822             case NM_JRC:
21823                 gen_compute_branch_nm(ctx, OPC_JR, 2,
21824                                    extract32(ctx->opcode, 5, 5), 0, 0);
21825                 break;
21826             case NM_JALRC16:
21827                 gen_compute_branch_nm(ctx, OPC_JALR, 2,
21828                                    extract32(ctx->opcode, 5, 5), 31, 0);
21829                 break;
21830             }
21831             break;
21832         default:
21833             {
21834                 /* P16.BRI */
21835                 uint32_t opc = extract32(ctx->opcode, 4, 3) <
21836                                extract32(ctx->opcode, 7, 3) ? OPC_BEQ : OPC_BNE;
21837                 gen_compute_branch_nm(ctx, opc, 2, rs, rt,
21838                                    extract32(ctx->opcode, 0, 4) << 1);
21839             }
21840             break;
21841         }
21842         break;
21843     case NM_P16_SR:
21844         {
21845             int count = extract32(ctx->opcode, 0, 4);
21846             int u = extract32(ctx->opcode, 4, 4) << 4;
21847
21848             rt = 30 + extract32(ctx->opcode, 9, 1);
21849             switch (extract32(ctx->opcode, 8, 1)) {
21850             case NM_SAVE16:
21851                 gen_save(ctx, rt, count, 0, u);
21852                 break;
21853             case NM_RESTORE_JRC16:
21854                 gen_restore(ctx, rt, count, 0, u);
21855                 gen_compute_branch_nm(ctx, OPC_JR, 2, 31, 0, 0);
21856                 break;
21857             }
21858         }
21859         break;
21860     case NM_MOVEP:
21861     case NM_MOVEPREV:
21862         check_nms(ctx);
21863         {
21864             static const int gpr2reg1[] = {4, 5, 6, 7};
21865             static const int gpr2reg2[] = {5, 6, 7, 8};
21866             int re;
21867             int rd2 = extract32(ctx->opcode, 3, 1) << 1 |
21868                       extract32(ctx->opcode, 8, 1);
21869             int r1 = gpr2reg1[rd2];
21870             int r2 = gpr2reg2[rd2];
21871             int r3 = extract32(ctx->opcode, 4, 1) << 3 |
21872                      extract32(ctx->opcode, 0, 3);
21873             int r4 = extract32(ctx->opcode, 9, 1) << 3 |
21874                      extract32(ctx->opcode, 5, 3);
21875             TCGv t0 = tcg_temp_new();
21876             TCGv t1 = tcg_temp_new();
21877             if (op == NM_MOVEP) {
21878                 rd = r1;
21879                 re = r2;
21880                 rs = decode_gpr_gpr4_zero(r3);
21881                 rt = decode_gpr_gpr4_zero(r4);
21882             } else {
21883                 rd = decode_gpr_gpr4(r3);
21884                 re = decode_gpr_gpr4(r4);
21885                 rs = r1;
21886                 rt = r2;
21887             }
21888             gen_load_gpr(t0, rs);
21889             gen_load_gpr(t1, rt);
21890             tcg_gen_mov_tl(cpu_gpr[rd], t0);
21891             tcg_gen_mov_tl(cpu_gpr[re], t1);
21892             tcg_temp_free(t0);
21893             tcg_temp_free(t1);
21894         }
21895         break;
21896     default:
21897         return decode_nanomips_32_48_opc(env, ctx);
21898     }
21899
21900     return 2;
21901 }
21902
21903
21904 /* SmartMIPS extension to MIPS32 */
21905
21906 #if defined(TARGET_MIPS64)
21907
21908 /* MDMX extension to MIPS64 */
21909
21910 #endif
21911
21912 /* MIPSDSP functions. */
21913 static void gen_mipsdsp_ld(DisasContext *ctx, uint32_t opc,
21914                            int rd, int base, int offset)
21915 {
21916     TCGv t0;
21917
21918     check_dsp(ctx);
21919     t0 = tcg_temp_new();
21920
21921     if (base == 0) {
21922         gen_load_gpr(t0, offset);
21923     } else if (offset == 0) {
21924         gen_load_gpr(t0, base);
21925     } else {
21926         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[offset]);
21927     }
21928
21929     switch (opc) {
21930     case OPC_LBUX:
21931         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
21932         gen_store_gpr(t0, rd);
21933         break;
21934     case OPC_LHX:
21935         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW);
21936         gen_store_gpr(t0, rd);
21937         break;
21938     case OPC_LWX:
21939         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
21940         gen_store_gpr(t0, rd);
21941         break;
21942 #if defined(TARGET_MIPS64)
21943     case OPC_LDX:
21944         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
21945         gen_store_gpr(t0, rd);
21946         break;
21947 #endif
21948     }
21949     tcg_temp_free(t0);
21950 }
21951
21952 static void gen_mipsdsp_arith(DisasContext *ctx, uint32_t op1, uint32_t op2,
21953                               int ret, int v1, int v2)
21954 {
21955     TCGv v1_t;
21956     TCGv v2_t;
21957
21958     if (ret == 0) {
21959         /* Treat as NOP. */
21960         return;
21961     }
21962
21963     v1_t = tcg_temp_new();
21964     v2_t = tcg_temp_new();
21965
21966     gen_load_gpr(v1_t, v1);
21967     gen_load_gpr(v2_t, v2);
21968
21969     switch (op1) {
21970     /* OPC_MULT_G_2E is equal OPC_ADDUH_QB_DSP */
21971     case OPC_MULT_G_2E:
21972         check_dsp_r2(ctx);
21973         switch (op2) {
21974         case OPC_ADDUH_QB:
21975             gen_helper_adduh_qb(cpu_gpr[ret], v1_t, v2_t);
21976             break;
21977         case OPC_ADDUH_R_QB:
21978             gen_helper_adduh_r_qb(cpu_gpr[ret], v1_t, v2_t);
21979             break;
21980         case OPC_ADDQH_PH:
21981             gen_helper_addqh_ph(cpu_gpr[ret], v1_t, v2_t);
21982             break;
21983         case OPC_ADDQH_R_PH:
21984             gen_helper_addqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
21985             break;
21986         case OPC_ADDQH_W:
21987             gen_helper_addqh_w(cpu_gpr[ret], v1_t, v2_t);
21988             break;
21989         case OPC_ADDQH_R_W:
21990             gen_helper_addqh_r_w(cpu_gpr[ret], v1_t, v2_t);
21991             break;
21992         case OPC_SUBUH_QB:
21993             gen_helper_subuh_qb(cpu_gpr[ret], v1_t, v2_t);
21994             break;
21995         case OPC_SUBUH_R_QB:
21996             gen_helper_subuh_r_qb(cpu_gpr[ret], v1_t, v2_t);
21997             break;
21998         case OPC_SUBQH_PH:
21999             gen_helper_subqh_ph(cpu_gpr[ret], v1_t, v2_t);
22000             break;
22001         case OPC_SUBQH_R_PH:
22002             gen_helper_subqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
22003             break;
22004         case OPC_SUBQH_W:
22005             gen_helper_subqh_w(cpu_gpr[ret], v1_t, v2_t);
22006             break;
22007         case OPC_SUBQH_R_W:
22008             gen_helper_subqh_r_w(cpu_gpr[ret], v1_t, v2_t);
22009             break;
22010         }
22011         break;
22012     case OPC_ABSQ_S_PH_DSP:
22013         switch (op2) {
22014         case OPC_ABSQ_S_QB:
22015             check_dsp_r2(ctx);
22016             gen_helper_absq_s_qb(cpu_gpr[ret], v2_t, cpu_env);
22017             break;
22018         case OPC_ABSQ_S_PH:
22019             check_dsp(ctx);
22020             gen_helper_absq_s_ph(cpu_gpr[ret], v2_t, cpu_env);
22021             break;
22022         case OPC_ABSQ_S_W:
22023             check_dsp(ctx);
22024             gen_helper_absq_s_w(cpu_gpr[ret], v2_t, cpu_env);
22025             break;
22026         case OPC_PRECEQ_W_PHL:
22027             check_dsp(ctx);
22028             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFF0000);
22029             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
22030             break;
22031         case OPC_PRECEQ_W_PHR:
22032             check_dsp(ctx);
22033             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0x0000FFFF);
22034             tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 16);
22035             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
22036             break;
22037         case OPC_PRECEQU_PH_QBL:
22038             check_dsp(ctx);
22039             gen_helper_precequ_ph_qbl(cpu_gpr[ret], v2_t);
22040             break;
22041         case OPC_PRECEQU_PH_QBR:
22042             check_dsp(ctx);
22043             gen_helper_precequ_ph_qbr(cpu_gpr[ret], v2_t);
22044             break;
22045         case OPC_PRECEQU_PH_QBLA:
22046             check_dsp(ctx);
22047             gen_helper_precequ_ph_qbla(cpu_gpr[ret], v2_t);
22048             break;
22049         case OPC_PRECEQU_PH_QBRA:
22050             check_dsp(ctx);
22051             gen_helper_precequ_ph_qbra(cpu_gpr[ret], v2_t);
22052             break;
22053         case OPC_PRECEU_PH_QBL:
22054             check_dsp(ctx);
22055             gen_helper_preceu_ph_qbl(cpu_gpr[ret], v2_t);
22056             break;
22057         case OPC_PRECEU_PH_QBR:
22058             check_dsp(ctx);
22059             gen_helper_preceu_ph_qbr(cpu_gpr[ret], v2_t);
22060             break;
22061         case OPC_PRECEU_PH_QBLA:
22062             check_dsp(ctx);
22063             gen_helper_preceu_ph_qbla(cpu_gpr[ret], v2_t);
22064             break;
22065         case OPC_PRECEU_PH_QBRA:
22066             check_dsp(ctx);
22067             gen_helper_preceu_ph_qbra(cpu_gpr[ret], v2_t);
22068             break;
22069         }
22070         break;
22071     case OPC_ADDU_QB_DSP:
22072         switch (op2) {
22073         case OPC_ADDQ_PH:
22074             check_dsp(ctx);
22075             gen_helper_addq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22076             break;
22077         case OPC_ADDQ_S_PH:
22078             check_dsp(ctx);
22079             gen_helper_addq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22080             break;
22081         case OPC_ADDQ_S_W:
22082             check_dsp(ctx);
22083             gen_helper_addq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22084             break;
22085         case OPC_ADDU_QB:
22086             check_dsp(ctx);
22087             gen_helper_addu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22088             break;
22089         case OPC_ADDU_S_QB:
22090             check_dsp(ctx);
22091             gen_helper_addu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22092             break;
22093         case OPC_ADDU_PH:
22094             check_dsp_r2(ctx);
22095             gen_helper_addu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22096             break;
22097         case OPC_ADDU_S_PH:
22098             check_dsp_r2(ctx);
22099             gen_helper_addu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22100             break;
22101         case OPC_SUBQ_PH:
22102             check_dsp(ctx);
22103             gen_helper_subq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22104             break;
22105         case OPC_SUBQ_S_PH:
22106             check_dsp(ctx);
22107             gen_helper_subq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22108             break;
22109         case OPC_SUBQ_S_W:
22110             check_dsp(ctx);
22111             gen_helper_subq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22112             break;
22113         case OPC_SUBU_QB:
22114             check_dsp(ctx);
22115             gen_helper_subu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22116             break;
22117         case OPC_SUBU_S_QB:
22118             check_dsp(ctx);
22119             gen_helper_subu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22120             break;
22121         case OPC_SUBU_PH:
22122             check_dsp_r2(ctx);
22123             gen_helper_subu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22124             break;
22125         case OPC_SUBU_S_PH:
22126             check_dsp_r2(ctx);
22127             gen_helper_subu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22128             break;
22129         case OPC_ADDSC:
22130             check_dsp(ctx);
22131             gen_helper_addsc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22132             break;
22133         case OPC_ADDWC:
22134             check_dsp(ctx);
22135             gen_helper_addwc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22136             break;
22137         case OPC_MODSUB:
22138             check_dsp(ctx);
22139             gen_helper_modsub(cpu_gpr[ret], v1_t, v2_t);
22140             break;
22141         case OPC_RADDU_W_QB:
22142             check_dsp(ctx);
22143             gen_helper_raddu_w_qb(cpu_gpr[ret], v1_t);
22144             break;
22145         }
22146         break;
22147     case OPC_CMPU_EQ_QB_DSP:
22148         switch (op2) {
22149         case OPC_PRECR_QB_PH:
22150             check_dsp_r2(ctx);
22151             gen_helper_precr_qb_ph(cpu_gpr[ret], v1_t, v2_t);
22152             break;
22153         case OPC_PRECRQ_QB_PH:
22154             check_dsp(ctx);
22155             gen_helper_precrq_qb_ph(cpu_gpr[ret], v1_t, v2_t);
22156             break;
22157         case OPC_PRECR_SRA_PH_W:
22158             check_dsp_r2(ctx);
22159             {
22160                 TCGv_i32 sa_t = tcg_const_i32(v2);
22161                 gen_helper_precr_sra_ph_w(cpu_gpr[ret], sa_t, v1_t,
22162                                           cpu_gpr[ret]);
22163                 tcg_temp_free_i32(sa_t);
22164                 break;
22165             }
22166         case OPC_PRECR_SRA_R_PH_W:
22167             check_dsp_r2(ctx);
22168             {
22169                 TCGv_i32 sa_t = tcg_const_i32(v2);
22170                 gen_helper_precr_sra_r_ph_w(cpu_gpr[ret], sa_t, v1_t,
22171                                             cpu_gpr[ret]);
22172                 tcg_temp_free_i32(sa_t);
22173                 break;
22174             }
22175         case OPC_PRECRQ_PH_W:
22176             check_dsp(ctx);
22177             gen_helper_precrq_ph_w(cpu_gpr[ret], v1_t, v2_t);
22178             break;
22179         case OPC_PRECRQ_RS_PH_W:
22180             check_dsp(ctx);
22181             gen_helper_precrq_rs_ph_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22182             break;
22183         case OPC_PRECRQU_S_QB_PH:
22184             check_dsp(ctx);
22185             gen_helper_precrqu_s_qb_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22186             break;
22187         }
22188         break;
22189 #ifdef TARGET_MIPS64
22190     case OPC_ABSQ_S_QH_DSP:
22191         switch (op2) {
22192         case OPC_PRECEQ_L_PWL:
22193             check_dsp(ctx);
22194             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFFFFFF00000000ull);
22195             break;
22196         case OPC_PRECEQ_L_PWR:
22197             check_dsp(ctx);
22198             tcg_gen_shli_tl(cpu_gpr[ret], v2_t, 32);
22199             break;
22200         case OPC_PRECEQ_PW_QHL:
22201             check_dsp(ctx);
22202             gen_helper_preceq_pw_qhl(cpu_gpr[ret], v2_t);
22203             break;
22204         case OPC_PRECEQ_PW_QHR:
22205             check_dsp(ctx);
22206             gen_helper_preceq_pw_qhr(cpu_gpr[ret], v2_t);
22207             break;
22208         case OPC_PRECEQ_PW_QHLA:
22209             check_dsp(ctx);
22210             gen_helper_preceq_pw_qhla(cpu_gpr[ret], v2_t);
22211             break;
22212         case OPC_PRECEQ_PW_QHRA:
22213             check_dsp(ctx);
22214             gen_helper_preceq_pw_qhra(cpu_gpr[ret], v2_t);
22215             break;
22216         case OPC_PRECEQU_QH_OBL:
22217             check_dsp(ctx);
22218             gen_helper_precequ_qh_obl(cpu_gpr[ret], v2_t);
22219             break;
22220         case OPC_PRECEQU_QH_OBR:
22221             check_dsp(ctx);
22222             gen_helper_precequ_qh_obr(cpu_gpr[ret], v2_t);
22223             break;
22224         case OPC_PRECEQU_QH_OBLA:
22225             check_dsp(ctx);
22226             gen_helper_precequ_qh_obla(cpu_gpr[ret], v2_t);
22227             break;
22228         case OPC_PRECEQU_QH_OBRA:
22229             check_dsp(ctx);
22230             gen_helper_precequ_qh_obra(cpu_gpr[ret], v2_t);
22231             break;
22232         case OPC_PRECEU_QH_OBL:
22233             check_dsp(ctx);
22234             gen_helper_preceu_qh_obl(cpu_gpr[ret], v2_t);
22235             break;
22236         case OPC_PRECEU_QH_OBR:
22237             check_dsp(ctx);
22238             gen_helper_preceu_qh_obr(cpu_gpr[ret], v2_t);
22239             break;
22240         case OPC_PRECEU_QH_OBLA:
22241             check_dsp(ctx);
22242             gen_helper_preceu_qh_obla(cpu_gpr[ret], v2_t);
22243             break;
22244         case OPC_PRECEU_QH_OBRA:
22245             check_dsp(ctx);
22246             gen_helper_preceu_qh_obra(cpu_gpr[ret], v2_t);
22247             break;
22248         case OPC_ABSQ_S_OB:
22249             check_dsp_r2(ctx);
22250             gen_helper_absq_s_ob(cpu_gpr[ret], v2_t, cpu_env);
22251             break;
22252         case OPC_ABSQ_S_PW:
22253             check_dsp(ctx);
22254             gen_helper_absq_s_pw(cpu_gpr[ret], v2_t, cpu_env);
22255             break;
22256         case OPC_ABSQ_S_QH:
22257             check_dsp(ctx);
22258             gen_helper_absq_s_qh(cpu_gpr[ret], v2_t, cpu_env);
22259             break;
22260         }
22261         break;
22262     case OPC_ADDU_OB_DSP:
22263         switch (op2) {
22264         case OPC_RADDU_L_OB:
22265             check_dsp(ctx);
22266             gen_helper_raddu_l_ob(cpu_gpr[ret], v1_t);
22267             break;
22268         case OPC_SUBQ_PW:
22269             check_dsp(ctx);
22270             gen_helper_subq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22271             break;
22272         case OPC_SUBQ_S_PW:
22273             check_dsp(ctx);
22274             gen_helper_subq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22275             break;
22276         case OPC_SUBQ_QH:
22277             check_dsp(ctx);
22278             gen_helper_subq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22279             break;
22280         case OPC_SUBQ_S_QH:
22281             check_dsp(ctx);
22282             gen_helper_subq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22283             break;
22284         case OPC_SUBU_OB:
22285             check_dsp(ctx);
22286             gen_helper_subu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22287             break;
22288         case OPC_SUBU_S_OB:
22289             check_dsp(ctx);
22290             gen_helper_subu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22291             break;
22292         case OPC_SUBU_QH:
22293             check_dsp_r2(ctx);
22294             gen_helper_subu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22295             break;
22296         case OPC_SUBU_S_QH:
22297             check_dsp_r2(ctx);
22298             gen_helper_subu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22299             break;
22300         case OPC_SUBUH_OB:
22301             check_dsp_r2(ctx);
22302             gen_helper_subuh_ob(cpu_gpr[ret], v1_t, v2_t);
22303             break;
22304         case OPC_SUBUH_R_OB:
22305             check_dsp_r2(ctx);
22306             gen_helper_subuh_r_ob(cpu_gpr[ret], v1_t, v2_t);
22307             break;
22308         case OPC_ADDQ_PW:
22309             check_dsp(ctx);
22310             gen_helper_addq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22311             break;
22312         case OPC_ADDQ_S_PW:
22313             check_dsp(ctx);
22314             gen_helper_addq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22315             break;
22316         case OPC_ADDQ_QH:
22317             check_dsp(ctx);
22318             gen_helper_addq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22319             break;
22320         case OPC_ADDQ_S_QH:
22321             check_dsp(ctx);
22322             gen_helper_addq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22323             break;
22324         case OPC_ADDU_OB:
22325             check_dsp(ctx);
22326             gen_helper_addu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22327             break;
22328         case OPC_ADDU_S_OB:
22329             check_dsp(ctx);
22330             gen_helper_addu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22331             break;
22332         case OPC_ADDU_QH:
22333             check_dsp_r2(ctx);
22334             gen_helper_addu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22335             break;
22336         case OPC_ADDU_S_QH:
22337             check_dsp_r2(ctx);
22338             gen_helper_addu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22339             break;
22340         case OPC_ADDUH_OB:
22341             check_dsp_r2(ctx);
22342             gen_helper_adduh_ob(cpu_gpr[ret], v1_t, v2_t);
22343             break;
22344         case OPC_ADDUH_R_OB:
22345             check_dsp_r2(ctx);
22346             gen_helper_adduh_r_ob(cpu_gpr[ret], v1_t, v2_t);
22347             break;
22348         }
22349         break;
22350     case OPC_CMPU_EQ_OB_DSP:
22351         switch (op2) {
22352         case OPC_PRECR_OB_QH:
22353             check_dsp_r2(ctx);
22354             gen_helper_precr_ob_qh(cpu_gpr[ret], v1_t, v2_t);
22355             break;
22356         case OPC_PRECR_SRA_QH_PW:
22357             check_dsp_r2(ctx);
22358             {
22359                 TCGv_i32 ret_t = tcg_const_i32(ret);
22360                 gen_helper_precr_sra_qh_pw(v2_t, v1_t, v2_t, ret_t);
22361                 tcg_temp_free_i32(ret_t);
22362                 break;
22363             }
22364         case OPC_PRECR_SRA_R_QH_PW:
22365             check_dsp_r2(ctx);
22366             {
22367                 TCGv_i32 sa_v = tcg_const_i32(ret);
22368                 gen_helper_precr_sra_r_qh_pw(v2_t, v1_t, v2_t, sa_v);
22369                 tcg_temp_free_i32(sa_v);
22370                 break;
22371             }
22372         case OPC_PRECRQ_OB_QH:
22373             check_dsp(ctx);
22374             gen_helper_precrq_ob_qh(cpu_gpr[ret], v1_t, v2_t);
22375             break;
22376         case OPC_PRECRQ_PW_L:
22377             check_dsp(ctx);
22378             gen_helper_precrq_pw_l(cpu_gpr[ret], v1_t, v2_t);
22379             break;
22380         case OPC_PRECRQ_QH_PW:
22381             check_dsp(ctx);
22382             gen_helper_precrq_qh_pw(cpu_gpr[ret], v1_t, v2_t);
22383             break;
22384         case OPC_PRECRQ_RS_QH_PW:
22385             check_dsp(ctx);
22386             gen_helper_precrq_rs_qh_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22387             break;
22388         case OPC_PRECRQU_S_OB_QH:
22389             check_dsp(ctx);
22390             gen_helper_precrqu_s_ob_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22391             break;
22392         }
22393         break;
22394 #endif
22395     }
22396
22397     tcg_temp_free(v1_t);
22398     tcg_temp_free(v2_t);
22399 }
22400
22401 static void gen_mipsdsp_shift(DisasContext *ctx, uint32_t opc,
22402                               int ret, int v1, int v2)
22403 {
22404     uint32_t op2;
22405     TCGv t0;
22406     TCGv v1_t;
22407     TCGv v2_t;
22408
22409     if (ret == 0) {
22410         /* Treat as NOP. */
22411         return;
22412     }
22413
22414     t0 = tcg_temp_new();
22415     v1_t = tcg_temp_new();
22416     v2_t = tcg_temp_new();
22417
22418     tcg_gen_movi_tl(t0, v1);
22419     gen_load_gpr(v1_t, v1);
22420     gen_load_gpr(v2_t, v2);
22421
22422     switch (opc) {
22423     case OPC_SHLL_QB_DSP:
22424         {
22425             op2 = MASK_SHLL_QB(ctx->opcode);
22426             switch (op2) {
22427             case OPC_SHLL_QB:
22428                 check_dsp(ctx);
22429                 gen_helper_shll_qb(cpu_gpr[ret], t0, v2_t, cpu_env);
22430                 break;
22431             case OPC_SHLLV_QB:
22432                 check_dsp(ctx);
22433                 gen_helper_shll_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22434                 break;
22435             case OPC_SHLL_PH:
22436                 check_dsp(ctx);
22437                 gen_helper_shll_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
22438                 break;
22439             case OPC_SHLLV_PH:
22440                 check_dsp(ctx);
22441                 gen_helper_shll_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22442                 break;
22443             case OPC_SHLL_S_PH:
22444                 check_dsp(ctx);
22445                 gen_helper_shll_s_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
22446                 break;
22447             case OPC_SHLLV_S_PH:
22448                 check_dsp(ctx);
22449                 gen_helper_shll_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22450                 break;
22451             case OPC_SHLL_S_W:
22452                 check_dsp(ctx);
22453                 gen_helper_shll_s_w(cpu_gpr[ret], t0, v2_t, cpu_env);
22454                 break;
22455             case OPC_SHLLV_S_W:
22456                 check_dsp(ctx);
22457                 gen_helper_shll_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22458                 break;
22459             case OPC_SHRL_QB:
22460                 check_dsp(ctx);
22461                 gen_helper_shrl_qb(cpu_gpr[ret], t0, v2_t);
22462                 break;
22463             case OPC_SHRLV_QB:
22464                 check_dsp(ctx);
22465                 gen_helper_shrl_qb(cpu_gpr[ret], v1_t, v2_t);
22466                 break;
22467             case OPC_SHRL_PH:
22468                 check_dsp_r2(ctx);
22469                 gen_helper_shrl_ph(cpu_gpr[ret], t0, v2_t);
22470                 break;
22471             case OPC_SHRLV_PH:
22472                 check_dsp_r2(ctx);
22473                 gen_helper_shrl_ph(cpu_gpr[ret], v1_t, v2_t);
22474                 break;
22475             case OPC_SHRA_QB:
22476                 check_dsp_r2(ctx);
22477                 gen_helper_shra_qb(cpu_gpr[ret], t0, v2_t);
22478                 break;
22479             case OPC_SHRA_R_QB:
22480                 check_dsp_r2(ctx);
22481                 gen_helper_shra_r_qb(cpu_gpr[ret], t0, v2_t);
22482                 break;
22483             case OPC_SHRAV_QB:
22484                 check_dsp_r2(ctx);
22485                 gen_helper_shra_qb(cpu_gpr[ret], v1_t, v2_t);
22486                 break;
22487             case OPC_SHRAV_R_QB:
22488                 check_dsp_r2(ctx);
22489                 gen_helper_shra_r_qb(cpu_gpr[ret], v1_t, v2_t);
22490                 break;
22491             case OPC_SHRA_PH:
22492                 check_dsp(ctx);
22493                 gen_helper_shra_ph(cpu_gpr[ret], t0, v2_t);
22494                 break;
22495             case OPC_SHRA_R_PH:
22496                 check_dsp(ctx);
22497                 gen_helper_shra_r_ph(cpu_gpr[ret], t0, v2_t);
22498                 break;
22499             case OPC_SHRAV_PH:
22500                 check_dsp(ctx);
22501                 gen_helper_shra_ph(cpu_gpr[ret], v1_t, v2_t);
22502                 break;
22503             case OPC_SHRAV_R_PH:
22504                 check_dsp(ctx);
22505                 gen_helper_shra_r_ph(cpu_gpr[ret], v1_t, v2_t);
22506                 break;
22507             case OPC_SHRA_R_W:
22508                 check_dsp(ctx);
22509                 gen_helper_shra_r_w(cpu_gpr[ret], t0, v2_t);
22510                 break;
22511             case OPC_SHRAV_R_W:
22512                 check_dsp(ctx);
22513                 gen_helper_shra_r_w(cpu_gpr[ret], v1_t, v2_t);
22514                 break;
22515             default:            /* Invalid */
22516                 MIPS_INVAL("MASK SHLL.QB");
22517                 generate_exception_end(ctx, EXCP_RI);
22518                 break;
22519             }
22520             break;
22521         }
22522 #ifdef TARGET_MIPS64
22523     case OPC_SHLL_OB_DSP:
22524         op2 = MASK_SHLL_OB(ctx->opcode);
22525         switch (op2) {
22526         case OPC_SHLL_PW:
22527             check_dsp(ctx);
22528             gen_helper_shll_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
22529             break;
22530         case OPC_SHLLV_PW:
22531             check_dsp(ctx);
22532             gen_helper_shll_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22533             break;
22534         case OPC_SHLL_S_PW:
22535             check_dsp(ctx);
22536             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
22537             break;
22538         case OPC_SHLLV_S_PW:
22539             check_dsp(ctx);
22540             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22541             break;
22542         case OPC_SHLL_OB:
22543             check_dsp(ctx);
22544             gen_helper_shll_ob(cpu_gpr[ret], v2_t, t0, cpu_env);
22545             break;
22546         case OPC_SHLLV_OB:
22547             check_dsp(ctx);
22548             gen_helper_shll_ob(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22549             break;
22550         case OPC_SHLL_QH:
22551             check_dsp(ctx);
22552             gen_helper_shll_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
22553             break;
22554         case OPC_SHLLV_QH:
22555             check_dsp(ctx);
22556             gen_helper_shll_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22557             break;
22558         case OPC_SHLL_S_QH:
22559             check_dsp(ctx);
22560             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
22561             break;
22562         case OPC_SHLLV_S_QH:
22563             check_dsp(ctx);
22564             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22565             break;
22566         case OPC_SHRA_OB:
22567             check_dsp_r2(ctx);
22568             gen_helper_shra_ob(cpu_gpr[ret], v2_t, t0);
22569             break;
22570         case OPC_SHRAV_OB:
22571             check_dsp_r2(ctx);
22572             gen_helper_shra_ob(cpu_gpr[ret], v2_t, v1_t);
22573             break;
22574         case OPC_SHRA_R_OB:
22575             check_dsp_r2(ctx);
22576             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, t0);
22577             break;
22578         case OPC_SHRAV_R_OB:
22579             check_dsp_r2(ctx);
22580             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, v1_t);
22581             break;
22582         case OPC_SHRA_PW:
22583             check_dsp(ctx);
22584             gen_helper_shra_pw(cpu_gpr[ret], v2_t, t0);
22585             break;
22586         case OPC_SHRAV_PW:
22587             check_dsp(ctx);
22588             gen_helper_shra_pw(cpu_gpr[ret], v2_t, v1_t);
22589             break;
22590         case OPC_SHRA_R_PW:
22591             check_dsp(ctx);
22592             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, t0);
22593             break;
22594         case OPC_SHRAV_R_PW:
22595             check_dsp(ctx);
22596             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, v1_t);
22597             break;
22598         case OPC_SHRA_QH:
22599             check_dsp(ctx);
22600             gen_helper_shra_qh(cpu_gpr[ret], v2_t, t0);
22601             break;
22602         case OPC_SHRAV_QH:
22603             check_dsp(ctx);
22604             gen_helper_shra_qh(cpu_gpr[ret], v2_t, v1_t);
22605             break;
22606         case OPC_SHRA_R_QH:
22607             check_dsp(ctx);
22608             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, t0);
22609             break;
22610         case OPC_SHRAV_R_QH:
22611             check_dsp(ctx);
22612             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, v1_t);
22613             break;
22614         case OPC_SHRL_OB:
22615             check_dsp(ctx);
22616             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, t0);
22617             break;
22618         case OPC_SHRLV_OB:
22619             check_dsp(ctx);
22620             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, v1_t);
22621             break;
22622         case OPC_SHRL_QH:
22623             check_dsp_r2(ctx);
22624             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, t0);
22625             break;
22626         case OPC_SHRLV_QH:
22627             check_dsp_r2(ctx);
22628             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, v1_t);
22629             break;
22630         default:            /* Invalid */
22631             MIPS_INVAL("MASK SHLL.OB");
22632             generate_exception_end(ctx, EXCP_RI);
22633             break;
22634         }
22635         break;
22636 #endif
22637     }
22638
22639     tcg_temp_free(t0);
22640     tcg_temp_free(v1_t);
22641     tcg_temp_free(v2_t);
22642 }
22643
22644 static void gen_mipsdsp_multiply(DisasContext *ctx, uint32_t op1, uint32_t op2,
22645                                  int ret, int v1, int v2, int check_ret)
22646 {
22647     TCGv_i32 t0;
22648     TCGv v1_t;
22649     TCGv v2_t;
22650
22651     if ((ret == 0) && (check_ret == 1)) {
22652         /* Treat as NOP. */
22653         return;
22654     }
22655
22656     t0 = tcg_temp_new_i32();
22657     v1_t = tcg_temp_new();
22658     v2_t = tcg_temp_new();
22659
22660     tcg_gen_movi_i32(t0, ret);
22661     gen_load_gpr(v1_t, v1);
22662     gen_load_gpr(v2_t, v2);
22663
22664     switch (op1) {
22665     /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
22666      * the same mask and op1. */
22667     case OPC_MULT_G_2E:
22668         check_dsp_r2(ctx);
22669         switch (op2) {
22670         case  OPC_MUL_PH:
22671             gen_helper_mul_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22672             break;
22673         case  OPC_MUL_S_PH:
22674             gen_helper_mul_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22675             break;
22676         case OPC_MULQ_S_W:
22677             gen_helper_mulq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22678             break;
22679         case OPC_MULQ_RS_W:
22680             gen_helper_mulq_rs_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22681             break;
22682         }
22683         break;
22684     case OPC_DPA_W_PH_DSP:
22685         switch (op2) {
22686         case OPC_DPAU_H_QBL:
22687             check_dsp(ctx);
22688             gen_helper_dpau_h_qbl(t0, v1_t, v2_t, cpu_env);
22689             break;
22690         case OPC_DPAU_H_QBR:
22691             check_dsp(ctx);
22692             gen_helper_dpau_h_qbr(t0, v1_t, v2_t, cpu_env);
22693             break;
22694         case OPC_DPSU_H_QBL:
22695             check_dsp(ctx);
22696             gen_helper_dpsu_h_qbl(t0, v1_t, v2_t, cpu_env);
22697             break;
22698         case OPC_DPSU_H_QBR:
22699             check_dsp(ctx);
22700             gen_helper_dpsu_h_qbr(t0, v1_t, v2_t, cpu_env);
22701             break;
22702         case OPC_DPA_W_PH:
22703             check_dsp_r2(ctx);
22704             gen_helper_dpa_w_ph(t0, v1_t, v2_t, cpu_env);
22705             break;
22706         case OPC_DPAX_W_PH:
22707             check_dsp_r2(ctx);
22708             gen_helper_dpax_w_ph(t0, v1_t, v2_t, cpu_env);
22709             break;
22710         case OPC_DPAQ_S_W_PH:
22711             check_dsp(ctx);
22712             gen_helper_dpaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
22713             break;
22714         case OPC_DPAQX_S_W_PH:
22715             check_dsp_r2(ctx);
22716             gen_helper_dpaqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
22717             break;
22718         case OPC_DPAQX_SA_W_PH:
22719             check_dsp_r2(ctx);
22720             gen_helper_dpaqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
22721             break;
22722         case OPC_DPS_W_PH:
22723             check_dsp_r2(ctx);
22724             gen_helper_dps_w_ph(t0, v1_t, v2_t, cpu_env);
22725             break;
22726         case OPC_DPSX_W_PH:
22727             check_dsp_r2(ctx);
22728             gen_helper_dpsx_w_ph(t0, v1_t, v2_t, cpu_env);
22729             break;
22730         case OPC_DPSQ_S_W_PH:
22731             check_dsp(ctx);
22732             gen_helper_dpsq_s_w_ph(t0, v1_t, v2_t, cpu_env);
22733             break;
22734         case OPC_DPSQX_S_W_PH:
22735             check_dsp_r2(ctx);
22736             gen_helper_dpsqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
22737             break;
22738         case OPC_DPSQX_SA_W_PH:
22739             check_dsp_r2(ctx);
22740             gen_helper_dpsqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
22741             break;
22742         case OPC_MULSAQ_S_W_PH:
22743             check_dsp(ctx);
22744             gen_helper_mulsaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
22745             break;
22746         case OPC_DPAQ_SA_L_W:
22747             check_dsp(ctx);
22748             gen_helper_dpaq_sa_l_w(t0, v1_t, v2_t, cpu_env);
22749             break;
22750         case OPC_DPSQ_SA_L_W:
22751             check_dsp(ctx);
22752             gen_helper_dpsq_sa_l_w(t0, v1_t, v2_t, cpu_env);
22753             break;
22754         case OPC_MAQ_S_W_PHL:
22755             check_dsp(ctx);
22756             gen_helper_maq_s_w_phl(t0, v1_t, v2_t, cpu_env);
22757             break;
22758         case OPC_MAQ_S_W_PHR:
22759             check_dsp(ctx);
22760             gen_helper_maq_s_w_phr(t0, v1_t, v2_t, cpu_env);
22761             break;
22762         case OPC_MAQ_SA_W_PHL:
22763             check_dsp(ctx);
22764             gen_helper_maq_sa_w_phl(t0, v1_t, v2_t, cpu_env);
22765             break;
22766         case OPC_MAQ_SA_W_PHR:
22767             check_dsp(ctx);
22768             gen_helper_maq_sa_w_phr(t0, v1_t, v2_t, cpu_env);
22769             break;
22770         case OPC_MULSA_W_PH:
22771             check_dsp_r2(ctx);
22772             gen_helper_mulsa_w_ph(t0, v1_t, v2_t, cpu_env);
22773             break;
22774         }
22775         break;
22776 #ifdef TARGET_MIPS64
22777     case OPC_DPAQ_W_QH_DSP:
22778         {
22779             int ac = ret & 0x03;
22780             tcg_gen_movi_i32(t0, ac);
22781
22782             switch (op2) {
22783             case OPC_DMADD:
22784                 check_dsp(ctx);
22785                 gen_helper_dmadd(v1_t, v2_t, t0, cpu_env);
22786                 break;
22787             case OPC_DMADDU:
22788                 check_dsp(ctx);
22789                 gen_helper_dmaddu(v1_t, v2_t, t0, cpu_env);
22790                 break;
22791             case OPC_DMSUB:
22792                 check_dsp(ctx);
22793                 gen_helper_dmsub(v1_t, v2_t, t0, cpu_env);
22794                 break;
22795             case OPC_DMSUBU:
22796                 check_dsp(ctx);
22797                 gen_helper_dmsubu(v1_t, v2_t, t0, cpu_env);
22798                 break;
22799             case OPC_DPA_W_QH:
22800                 check_dsp_r2(ctx);
22801                 gen_helper_dpa_w_qh(v1_t, v2_t, t0, cpu_env);
22802                 break;
22803             case OPC_DPAQ_S_W_QH:
22804                 check_dsp(ctx);
22805                 gen_helper_dpaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
22806                 break;
22807             case OPC_DPAQ_SA_L_PW:
22808                 check_dsp(ctx);
22809                 gen_helper_dpaq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
22810                 break;
22811             case OPC_DPAU_H_OBL:
22812                 check_dsp(ctx);
22813                 gen_helper_dpau_h_obl(v1_t, v2_t, t0, cpu_env);
22814                 break;
22815             case OPC_DPAU_H_OBR:
22816                 check_dsp(ctx);
22817                 gen_helper_dpau_h_obr(v1_t, v2_t, t0, cpu_env);
22818                 break;
22819             case OPC_DPS_W_QH:
22820                 check_dsp_r2(ctx);
22821                 gen_helper_dps_w_qh(v1_t, v2_t, t0, cpu_env);
22822                 break;
22823             case OPC_DPSQ_S_W_QH:
22824                 check_dsp(ctx);
22825                 gen_helper_dpsq_s_w_qh(v1_t, v2_t, t0, cpu_env);
22826                 break;
22827             case OPC_DPSQ_SA_L_PW:
22828                 check_dsp(ctx);
22829                 gen_helper_dpsq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
22830                 break;
22831             case OPC_DPSU_H_OBL:
22832                 check_dsp(ctx);
22833                 gen_helper_dpsu_h_obl(v1_t, v2_t, t0, cpu_env);
22834                 break;
22835             case OPC_DPSU_H_OBR:
22836                 check_dsp(ctx);
22837                 gen_helper_dpsu_h_obr(v1_t, v2_t, t0, cpu_env);
22838                 break;
22839             case OPC_MAQ_S_L_PWL:
22840                 check_dsp(ctx);
22841                 gen_helper_maq_s_l_pwl(v1_t, v2_t, t0, cpu_env);
22842                 break;
22843             case OPC_MAQ_S_L_PWR:
22844                 check_dsp(ctx);
22845                 gen_helper_maq_s_l_pwr(v1_t, v2_t, t0, cpu_env);
22846                 break;
22847             case OPC_MAQ_S_W_QHLL:
22848                 check_dsp(ctx);
22849                 gen_helper_maq_s_w_qhll(v1_t, v2_t, t0, cpu_env);
22850                 break;
22851             case OPC_MAQ_SA_W_QHLL:
22852                 check_dsp(ctx);
22853                 gen_helper_maq_sa_w_qhll(v1_t, v2_t, t0, cpu_env);
22854                 break;
22855             case OPC_MAQ_S_W_QHLR:
22856                 check_dsp(ctx);
22857                 gen_helper_maq_s_w_qhlr(v1_t, v2_t, t0, cpu_env);
22858                 break;
22859             case OPC_MAQ_SA_W_QHLR:
22860                 check_dsp(ctx);
22861                 gen_helper_maq_sa_w_qhlr(v1_t, v2_t, t0, cpu_env);
22862                 break;
22863             case OPC_MAQ_S_W_QHRL:
22864                 check_dsp(ctx);
22865                 gen_helper_maq_s_w_qhrl(v1_t, v2_t, t0, cpu_env);
22866                 break;
22867             case OPC_MAQ_SA_W_QHRL:
22868                 check_dsp(ctx);
22869                 gen_helper_maq_sa_w_qhrl(v1_t, v2_t, t0, cpu_env);
22870                 break;
22871             case OPC_MAQ_S_W_QHRR:
22872                 check_dsp(ctx);
22873                 gen_helper_maq_s_w_qhrr(v1_t, v2_t, t0, cpu_env);
22874                 break;
22875             case OPC_MAQ_SA_W_QHRR:
22876                 check_dsp(ctx);
22877                 gen_helper_maq_sa_w_qhrr(v1_t, v2_t, t0, cpu_env);
22878                 break;
22879             case OPC_MULSAQ_S_L_PW:
22880                 check_dsp(ctx);
22881                 gen_helper_mulsaq_s_l_pw(v1_t, v2_t, t0, cpu_env);
22882                 break;
22883             case OPC_MULSAQ_S_W_QH:
22884                 check_dsp(ctx);
22885                 gen_helper_mulsaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
22886                 break;
22887             }
22888         }
22889         break;
22890 #endif
22891     case OPC_ADDU_QB_DSP:
22892         switch (op2) {
22893         case OPC_MULEU_S_PH_QBL:
22894             check_dsp(ctx);
22895             gen_helper_muleu_s_ph_qbl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22896             break;
22897         case OPC_MULEU_S_PH_QBR:
22898             check_dsp(ctx);
22899             gen_helper_muleu_s_ph_qbr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22900             break;
22901         case OPC_MULQ_RS_PH:
22902             check_dsp(ctx);
22903             gen_helper_mulq_rs_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22904             break;
22905         case OPC_MULEQ_S_W_PHL:
22906             check_dsp(ctx);
22907             gen_helper_muleq_s_w_phl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22908             break;
22909         case OPC_MULEQ_S_W_PHR:
22910             check_dsp(ctx);
22911             gen_helper_muleq_s_w_phr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22912             break;
22913         case OPC_MULQ_S_PH:
22914             check_dsp_r2(ctx);
22915             gen_helper_mulq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22916             break;
22917         }
22918         break;
22919 #ifdef TARGET_MIPS64
22920     case OPC_ADDU_OB_DSP:
22921         switch (op2) {
22922         case OPC_MULEQ_S_PW_QHL:
22923             check_dsp(ctx);
22924             gen_helper_muleq_s_pw_qhl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22925             break;
22926         case OPC_MULEQ_S_PW_QHR:
22927             check_dsp(ctx);
22928             gen_helper_muleq_s_pw_qhr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22929             break;
22930         case OPC_MULEU_S_QH_OBL:
22931             check_dsp(ctx);
22932             gen_helper_muleu_s_qh_obl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22933             break;
22934         case OPC_MULEU_S_QH_OBR:
22935             check_dsp(ctx);
22936             gen_helper_muleu_s_qh_obr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22937             break;
22938         case OPC_MULQ_RS_QH:
22939             check_dsp(ctx);
22940             gen_helper_mulq_rs_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22941             break;
22942         }
22943         break;
22944 #endif
22945     }
22946
22947     tcg_temp_free_i32(t0);
22948     tcg_temp_free(v1_t);
22949     tcg_temp_free(v2_t);
22950 }
22951
22952 static void gen_mipsdsp_bitinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
22953                                 int ret, int val)
22954 {
22955     int16_t imm;
22956     TCGv t0;
22957     TCGv val_t;
22958
22959     if (ret == 0) {
22960         /* Treat as NOP. */
22961         return;
22962     }
22963
22964     t0 = tcg_temp_new();
22965     val_t = tcg_temp_new();
22966     gen_load_gpr(val_t, val);
22967
22968     switch (op1) {
22969     case OPC_ABSQ_S_PH_DSP:
22970         switch (op2) {
22971         case OPC_BITREV:
22972             check_dsp(ctx);
22973             gen_helper_bitrev(cpu_gpr[ret], val_t);
22974             break;
22975         case OPC_REPL_QB:
22976             check_dsp(ctx);
22977             {
22978                 target_long result;
22979                 imm = (ctx->opcode >> 16) & 0xFF;
22980                 result = (uint32_t)imm << 24 |
22981                          (uint32_t)imm << 16 |
22982                          (uint32_t)imm << 8  |
22983                          (uint32_t)imm;
22984                 result = (int32_t)result;
22985                 tcg_gen_movi_tl(cpu_gpr[ret], result);
22986             }
22987             break;
22988         case OPC_REPLV_QB:
22989             check_dsp(ctx);
22990             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
22991             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
22992             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22993             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
22994             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22995             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
22996             break;
22997         case OPC_REPL_PH:
22998             check_dsp(ctx);
22999             {
23000                 imm = (ctx->opcode >> 16) & 0x03FF;
23001                 imm = (int16_t)(imm << 6) >> 6;
23002                 tcg_gen_movi_tl(cpu_gpr[ret], \
23003                                 (target_long)((int32_t)imm << 16 | \
23004                                 (uint16_t)imm));
23005             }
23006             break;
23007         case OPC_REPLV_PH:
23008             check_dsp(ctx);
23009             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
23010             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
23011             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
23012             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
23013             break;
23014         }
23015         break;
23016 #ifdef TARGET_MIPS64
23017     case OPC_ABSQ_S_QH_DSP:
23018         switch (op2) {
23019         case OPC_REPL_OB:
23020             check_dsp(ctx);
23021             {
23022                 target_long temp;
23023
23024                 imm = (ctx->opcode >> 16) & 0xFF;
23025                 temp = ((uint64_t)imm << 8) | (uint64_t)imm;
23026                 temp = (temp << 16) | temp;
23027                 temp = (temp << 32) | temp;
23028                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
23029                 break;
23030             }
23031         case OPC_REPL_PW:
23032             check_dsp(ctx);
23033             {
23034                 target_long temp;
23035
23036                 imm = (ctx->opcode >> 16) & 0x03FF;
23037                 imm = (int16_t)(imm << 6) >> 6;
23038                 temp = ((target_long)imm << 32) \
23039                        | ((target_long)imm & 0xFFFFFFFF);
23040                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
23041                 break;
23042             }
23043         case OPC_REPL_QH:
23044             check_dsp(ctx);
23045             {
23046                 target_long temp;
23047
23048                 imm = (ctx->opcode >> 16) & 0x03FF;
23049                 imm = (int16_t)(imm << 6) >> 6;
23050
23051                 temp = ((uint64_t)(uint16_t)imm << 48) |
23052                        ((uint64_t)(uint16_t)imm << 32) |
23053                        ((uint64_t)(uint16_t)imm << 16) |
23054                        (uint64_t)(uint16_t)imm;
23055                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
23056                 break;
23057             }
23058         case OPC_REPLV_OB:
23059             check_dsp(ctx);
23060             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
23061             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
23062             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
23063             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
23064             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
23065             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
23066             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
23067             break;
23068         case OPC_REPLV_PW:
23069             check_dsp(ctx);
23070             tcg_gen_ext32u_i64(cpu_gpr[ret], val_t);
23071             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
23072             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
23073             break;
23074         case OPC_REPLV_QH:
23075             check_dsp(ctx);
23076             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
23077             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
23078             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
23079             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
23080             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
23081             break;
23082         }
23083         break;
23084 #endif
23085     }
23086     tcg_temp_free(t0);
23087     tcg_temp_free(val_t);
23088 }
23089
23090 static void gen_mipsdsp_add_cmp_pick(DisasContext *ctx,
23091                                      uint32_t op1, uint32_t op2,
23092                                      int ret, int v1, int v2, int check_ret)
23093 {
23094     TCGv t1;
23095     TCGv v1_t;
23096     TCGv v2_t;
23097
23098     if ((ret == 0) && (check_ret == 1)) {
23099         /* Treat as NOP. */
23100         return;
23101     }
23102
23103     t1 = tcg_temp_new();
23104     v1_t = tcg_temp_new();
23105     v2_t = tcg_temp_new();
23106
23107     gen_load_gpr(v1_t, v1);
23108     gen_load_gpr(v2_t, v2);
23109
23110     switch (op1) {
23111     case OPC_CMPU_EQ_QB_DSP:
23112         switch (op2) {
23113         case OPC_CMPU_EQ_QB:
23114             check_dsp(ctx);
23115             gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
23116             break;
23117         case OPC_CMPU_LT_QB:
23118             check_dsp(ctx);
23119             gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
23120             break;
23121         case OPC_CMPU_LE_QB:
23122             check_dsp(ctx);
23123             gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
23124             break;
23125         case OPC_CMPGU_EQ_QB:
23126             check_dsp(ctx);
23127             gen_helper_cmpgu_eq_qb(cpu_gpr[ret], v1_t, v2_t);
23128             break;
23129         case OPC_CMPGU_LT_QB:
23130             check_dsp(ctx);
23131             gen_helper_cmpgu_lt_qb(cpu_gpr[ret], v1_t, v2_t);
23132             break;
23133         case OPC_CMPGU_LE_QB:
23134             check_dsp(ctx);
23135             gen_helper_cmpgu_le_qb(cpu_gpr[ret], v1_t, v2_t);
23136             break;
23137         case OPC_CMPGDU_EQ_QB:
23138             check_dsp_r2(ctx);
23139             gen_helper_cmpgu_eq_qb(t1, v1_t, v2_t);
23140             tcg_gen_mov_tl(cpu_gpr[ret], t1);
23141             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
23142             tcg_gen_shli_tl(t1, t1, 24);
23143             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
23144             break;
23145         case OPC_CMPGDU_LT_QB:
23146             check_dsp_r2(ctx);
23147             gen_helper_cmpgu_lt_qb(t1, v1_t, v2_t);
23148             tcg_gen_mov_tl(cpu_gpr[ret], t1);
23149             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
23150             tcg_gen_shli_tl(t1, t1, 24);
23151             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
23152             break;
23153         case OPC_CMPGDU_LE_QB:
23154             check_dsp_r2(ctx);
23155             gen_helper_cmpgu_le_qb(t1, v1_t, v2_t);
23156             tcg_gen_mov_tl(cpu_gpr[ret], t1);
23157             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
23158             tcg_gen_shli_tl(t1, t1, 24);
23159             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
23160             break;
23161         case OPC_CMP_EQ_PH:
23162             check_dsp(ctx);
23163             gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
23164             break;
23165         case OPC_CMP_LT_PH:
23166             check_dsp(ctx);
23167             gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
23168             break;
23169         case OPC_CMP_LE_PH:
23170             check_dsp(ctx);
23171             gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
23172             break;
23173         case OPC_PICK_QB:
23174             check_dsp(ctx);
23175             gen_helper_pick_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
23176             break;
23177         case OPC_PICK_PH:
23178             check_dsp(ctx);
23179             gen_helper_pick_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
23180             break;
23181         case OPC_PACKRL_PH:
23182             check_dsp(ctx);
23183             gen_helper_packrl_ph(cpu_gpr[ret], v1_t, v2_t);
23184             break;
23185         }
23186         break;
23187 #ifdef TARGET_MIPS64
23188     case OPC_CMPU_EQ_OB_DSP:
23189         switch (op2) {
23190         case OPC_CMP_EQ_PW:
23191             check_dsp(ctx);
23192             gen_helper_cmp_eq_pw(v1_t, v2_t, cpu_env);
23193             break;
23194         case OPC_CMP_LT_PW:
23195             check_dsp(ctx);
23196             gen_helper_cmp_lt_pw(v1_t, v2_t, cpu_env);
23197             break;
23198         case OPC_CMP_LE_PW:
23199             check_dsp(ctx);
23200             gen_helper_cmp_le_pw(v1_t, v2_t, cpu_env);
23201             break;
23202         case OPC_CMP_EQ_QH:
23203             check_dsp(ctx);
23204             gen_helper_cmp_eq_qh(v1_t, v2_t, cpu_env);
23205             break;
23206         case OPC_CMP_LT_QH:
23207             check_dsp(ctx);
23208             gen_helper_cmp_lt_qh(v1_t, v2_t, cpu_env);
23209             break;
23210         case OPC_CMP_LE_QH:
23211             check_dsp(ctx);
23212             gen_helper_cmp_le_qh(v1_t, v2_t, cpu_env);
23213             break;
23214         case OPC_CMPGDU_EQ_OB:
23215             check_dsp_r2(ctx);
23216             gen_helper_cmpgdu_eq_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
23217             break;
23218         case OPC_CMPGDU_LT_OB:
23219             check_dsp_r2(ctx);
23220             gen_helper_cmpgdu_lt_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
23221             break;
23222         case OPC_CMPGDU_LE_OB:
23223             check_dsp_r2(ctx);
23224             gen_helper_cmpgdu_le_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
23225             break;
23226         case OPC_CMPGU_EQ_OB:
23227             check_dsp(ctx);
23228             gen_helper_cmpgu_eq_ob(cpu_gpr[ret], v1_t, v2_t);
23229             break;
23230         case OPC_CMPGU_LT_OB:
23231             check_dsp(ctx);
23232             gen_helper_cmpgu_lt_ob(cpu_gpr[ret], v1_t, v2_t);
23233             break;
23234         case OPC_CMPGU_LE_OB:
23235             check_dsp(ctx);
23236             gen_helper_cmpgu_le_ob(cpu_gpr[ret], v1_t, v2_t);
23237             break;
23238         case OPC_CMPU_EQ_OB:
23239             check_dsp(ctx);
23240             gen_helper_cmpu_eq_ob(v1_t, v2_t, cpu_env);
23241             break;
23242         case OPC_CMPU_LT_OB:
23243             check_dsp(ctx);
23244             gen_helper_cmpu_lt_ob(v1_t, v2_t, cpu_env);
23245             break;
23246         case OPC_CMPU_LE_OB:
23247             check_dsp(ctx);
23248             gen_helper_cmpu_le_ob(v1_t, v2_t, cpu_env);
23249             break;
23250         case OPC_PACKRL_PW:
23251             check_dsp(ctx);
23252             gen_helper_packrl_pw(cpu_gpr[ret], v1_t, v2_t);
23253             break;
23254         case OPC_PICK_OB:
23255             check_dsp(ctx);
23256             gen_helper_pick_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
23257             break;
23258         case OPC_PICK_PW:
23259             check_dsp(ctx);
23260             gen_helper_pick_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
23261             break;
23262         case OPC_PICK_QH:
23263             check_dsp(ctx);
23264             gen_helper_pick_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
23265             break;
23266         }
23267         break;
23268 #endif
23269     }
23270
23271     tcg_temp_free(t1);
23272     tcg_temp_free(v1_t);
23273     tcg_temp_free(v2_t);
23274 }
23275
23276 static void gen_mipsdsp_append(CPUMIPSState *env, DisasContext *ctx,
23277                                uint32_t op1, int rt, int rs, int sa)
23278 {
23279     TCGv t0;
23280
23281     check_dsp_r2(ctx);
23282
23283     if (rt == 0) {
23284         /* Treat as NOP. */
23285         return;
23286     }
23287
23288     t0 = tcg_temp_new();
23289     gen_load_gpr(t0, rs);
23290
23291     switch (op1) {
23292     case OPC_APPEND_DSP:
23293         switch (MASK_APPEND(ctx->opcode)) {
23294         case OPC_APPEND:
23295             if (sa != 0) {
23296                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 32 - sa);
23297             }
23298             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
23299             break;
23300         case OPC_PREPEND:
23301             if (sa != 0) {
23302                 tcg_gen_ext32u_tl(cpu_gpr[rt], cpu_gpr[rt]);
23303                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
23304                 tcg_gen_shli_tl(t0, t0, 32 - sa);
23305                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
23306             }
23307             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
23308             break;
23309         case OPC_BALIGN:
23310             sa &= 3;
23311             if (sa != 0 && sa != 2) {
23312                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
23313                 tcg_gen_ext32u_tl(t0, t0);
23314                 tcg_gen_shri_tl(t0, t0, 8 * (4 - sa));
23315                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
23316             }
23317             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
23318             break;
23319         default:            /* Invalid */
23320             MIPS_INVAL("MASK APPEND");
23321             generate_exception_end(ctx, EXCP_RI);
23322             break;
23323         }
23324         break;
23325 #ifdef TARGET_MIPS64
23326     case OPC_DAPPEND_DSP:
23327         switch (MASK_DAPPEND(ctx->opcode)) {
23328         case OPC_DAPPEND:
23329             if (sa != 0) {
23330                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 64 - sa);
23331             }
23332             break;
23333         case OPC_PREPENDD:
23334             tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], 0x20 | sa);
23335             tcg_gen_shli_tl(t0, t0, 64 - (0x20 | sa));
23336             tcg_gen_or_tl(cpu_gpr[rt], t0, t0);
23337             break;
23338         case OPC_PREPENDW:
23339             if (sa != 0) {
23340                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
23341                 tcg_gen_shli_tl(t0, t0, 64 - sa);
23342                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
23343             }
23344             break;
23345         case OPC_DBALIGN:
23346             sa &= 7;
23347             if (sa != 0 && sa != 2 && sa != 4) {
23348                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
23349                 tcg_gen_shri_tl(t0, t0, 8 * (8 - sa));
23350                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
23351             }
23352             break;
23353         default:            /* Invalid */
23354             MIPS_INVAL("MASK DAPPEND");
23355             generate_exception_end(ctx, EXCP_RI);
23356             break;
23357         }
23358         break;
23359 #endif
23360     }
23361     tcg_temp_free(t0);
23362 }
23363
23364 static void gen_mipsdsp_accinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
23365                                 int ret, int v1, int v2, int check_ret)
23366
23367 {
23368     TCGv t0;
23369     TCGv t1;
23370     TCGv v1_t;
23371     TCGv v2_t;
23372     int16_t imm;
23373
23374     if ((ret == 0) && (check_ret == 1)) {
23375         /* Treat as NOP. */
23376         return;
23377     }
23378
23379     t0 = tcg_temp_new();
23380     t1 = tcg_temp_new();
23381     v1_t = tcg_temp_new();
23382     v2_t = tcg_temp_new();
23383
23384     gen_load_gpr(v1_t, v1);
23385     gen_load_gpr(v2_t, v2);
23386
23387     switch (op1) {
23388     case OPC_EXTR_W_DSP:
23389         check_dsp(ctx);
23390         switch (op2) {
23391         case OPC_EXTR_W:
23392             tcg_gen_movi_tl(t0, v2);
23393             tcg_gen_movi_tl(t1, v1);
23394             gen_helper_extr_w(cpu_gpr[ret], t0, t1, cpu_env);
23395             break;
23396         case OPC_EXTR_R_W:
23397             tcg_gen_movi_tl(t0, v2);
23398             tcg_gen_movi_tl(t1, v1);
23399             gen_helper_extr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
23400             break;
23401         case OPC_EXTR_RS_W:
23402             tcg_gen_movi_tl(t0, v2);
23403             tcg_gen_movi_tl(t1, v1);
23404             gen_helper_extr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
23405             break;
23406         case OPC_EXTR_S_H:
23407             tcg_gen_movi_tl(t0, v2);
23408             tcg_gen_movi_tl(t1, v1);
23409             gen_helper_extr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
23410             break;
23411         case OPC_EXTRV_S_H:
23412             tcg_gen_movi_tl(t0, v2);
23413             gen_helper_extr_s_h(cpu_gpr[ret], t0, v1_t, cpu_env);
23414             break;
23415         case OPC_EXTRV_W:
23416             tcg_gen_movi_tl(t0, v2);
23417             gen_helper_extr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23418             break;
23419         case OPC_EXTRV_R_W:
23420             tcg_gen_movi_tl(t0, v2);
23421             gen_helper_extr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23422             break;
23423         case OPC_EXTRV_RS_W:
23424             tcg_gen_movi_tl(t0, v2);
23425             gen_helper_extr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23426             break;
23427         case OPC_EXTP:
23428             tcg_gen_movi_tl(t0, v2);
23429             tcg_gen_movi_tl(t1, v1);
23430             gen_helper_extp(cpu_gpr[ret], t0, t1, cpu_env);
23431             break;
23432         case OPC_EXTPV:
23433             tcg_gen_movi_tl(t0, v2);
23434             gen_helper_extp(cpu_gpr[ret], t0, v1_t, cpu_env);
23435             break;
23436         case OPC_EXTPDP:
23437             tcg_gen_movi_tl(t0, v2);
23438             tcg_gen_movi_tl(t1, v1);
23439             gen_helper_extpdp(cpu_gpr[ret], t0, t1, cpu_env);
23440             break;
23441         case OPC_EXTPDPV:
23442             tcg_gen_movi_tl(t0, v2);
23443             gen_helper_extpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
23444             break;
23445         case OPC_SHILO:
23446             imm = (ctx->opcode >> 20) & 0x3F;
23447             tcg_gen_movi_tl(t0, ret);
23448             tcg_gen_movi_tl(t1, imm);
23449             gen_helper_shilo(t0, t1, cpu_env);
23450             break;
23451         case OPC_SHILOV:
23452             tcg_gen_movi_tl(t0, ret);
23453             gen_helper_shilo(t0, v1_t, cpu_env);
23454             break;
23455         case OPC_MTHLIP:
23456             tcg_gen_movi_tl(t0, ret);
23457             gen_helper_mthlip(t0, v1_t, cpu_env);
23458             break;
23459         case OPC_WRDSP:
23460             imm = (ctx->opcode >> 11) & 0x3FF;
23461             tcg_gen_movi_tl(t0, imm);
23462             gen_helper_wrdsp(v1_t, t0, cpu_env);
23463             break;
23464         case OPC_RDDSP:
23465             imm = (ctx->opcode >> 16) & 0x03FF;
23466             tcg_gen_movi_tl(t0, imm);
23467             gen_helper_rddsp(cpu_gpr[ret], t0, cpu_env);
23468             break;
23469         }
23470         break;
23471 #ifdef TARGET_MIPS64
23472     case OPC_DEXTR_W_DSP:
23473         check_dsp(ctx);
23474         switch (op2) {
23475         case OPC_DMTHLIP:
23476             tcg_gen_movi_tl(t0, ret);
23477             gen_helper_dmthlip(v1_t, t0, cpu_env);
23478             break;
23479         case OPC_DSHILO:
23480             {
23481                 int shift = (ctx->opcode >> 19) & 0x7F;
23482                 int ac = (ctx->opcode >> 11) & 0x03;
23483                 tcg_gen_movi_tl(t0, shift);
23484                 tcg_gen_movi_tl(t1, ac);
23485                 gen_helper_dshilo(t0, t1, cpu_env);
23486                 break;
23487             }
23488         case OPC_DSHILOV:
23489             {
23490                 int ac = (ctx->opcode >> 11) & 0x03;
23491                 tcg_gen_movi_tl(t0, ac);
23492                 gen_helper_dshilo(v1_t, t0, cpu_env);
23493                 break;
23494             }
23495         case OPC_DEXTP:
23496             tcg_gen_movi_tl(t0, v2);
23497             tcg_gen_movi_tl(t1, v1);
23498
23499             gen_helper_dextp(cpu_gpr[ret], t0, t1, cpu_env);
23500             break;
23501         case OPC_DEXTPV:
23502             tcg_gen_movi_tl(t0, v2);
23503             gen_helper_dextp(cpu_gpr[ret], t0, v1_t, cpu_env);
23504             break;
23505         case OPC_DEXTPDP:
23506             tcg_gen_movi_tl(t0, v2);
23507             tcg_gen_movi_tl(t1, v1);
23508             gen_helper_dextpdp(cpu_gpr[ret], t0, t1, cpu_env);
23509             break;
23510         case OPC_DEXTPDPV:
23511             tcg_gen_movi_tl(t0, v2);
23512             gen_helper_dextpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
23513             break;
23514         case OPC_DEXTR_L:
23515             tcg_gen_movi_tl(t0, v2);
23516             tcg_gen_movi_tl(t1, v1);
23517             gen_helper_dextr_l(cpu_gpr[ret], t0, t1, cpu_env);
23518             break;
23519         case OPC_DEXTR_R_L:
23520             tcg_gen_movi_tl(t0, v2);
23521             tcg_gen_movi_tl(t1, v1);
23522             gen_helper_dextr_r_l(cpu_gpr[ret], t0, t1, cpu_env);
23523             break;
23524         case OPC_DEXTR_RS_L:
23525             tcg_gen_movi_tl(t0, v2);
23526             tcg_gen_movi_tl(t1, v1);
23527             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, t1, cpu_env);
23528             break;
23529         case OPC_DEXTR_W:
23530             tcg_gen_movi_tl(t0, v2);
23531             tcg_gen_movi_tl(t1, v1);
23532             gen_helper_dextr_w(cpu_gpr[ret], t0, t1, cpu_env);
23533             break;
23534         case OPC_DEXTR_R_W:
23535             tcg_gen_movi_tl(t0, v2);
23536             tcg_gen_movi_tl(t1, v1);
23537             gen_helper_dextr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
23538             break;
23539         case OPC_DEXTR_RS_W:
23540             tcg_gen_movi_tl(t0, v2);
23541             tcg_gen_movi_tl(t1, v1);
23542             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
23543             break;
23544         case OPC_DEXTR_S_H:
23545             tcg_gen_movi_tl(t0, v2);
23546             tcg_gen_movi_tl(t1, v1);
23547             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
23548             break;
23549         case OPC_DEXTRV_S_H:
23550             tcg_gen_movi_tl(t0, v2);
23551             tcg_gen_movi_tl(t1, v1);
23552             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
23553             break;
23554         case OPC_DEXTRV_L:
23555             tcg_gen_movi_tl(t0, v2);
23556             gen_helper_dextr_l(cpu_gpr[ret], t0, v1_t, cpu_env);
23557             break;
23558         case OPC_DEXTRV_R_L:
23559             tcg_gen_movi_tl(t0, v2);
23560             gen_helper_dextr_r_l(cpu_gpr[ret], t0, v1_t, cpu_env);
23561             break;
23562         case OPC_DEXTRV_RS_L:
23563             tcg_gen_movi_tl(t0, v2);
23564             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, v1_t, cpu_env);
23565             break;
23566         case OPC_DEXTRV_W:
23567             tcg_gen_movi_tl(t0, v2);
23568             gen_helper_dextr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23569             break;
23570         case OPC_DEXTRV_R_W:
23571             tcg_gen_movi_tl(t0, v2);
23572             gen_helper_dextr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23573             break;
23574         case OPC_DEXTRV_RS_W:
23575             tcg_gen_movi_tl(t0, v2);
23576             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23577             break;
23578         }
23579         break;
23580 #endif
23581     }
23582
23583     tcg_temp_free(t0);
23584     tcg_temp_free(t1);
23585     tcg_temp_free(v1_t);
23586     tcg_temp_free(v2_t);
23587 }
23588
23589 /* End MIPSDSP functions. */
23590
23591 static void decode_opc_special_r6(CPUMIPSState *env, DisasContext *ctx)
23592 {
23593     int rs, rt, rd, sa;
23594     uint32_t op1, op2;
23595
23596     rs = (ctx->opcode >> 21) & 0x1f;
23597     rt = (ctx->opcode >> 16) & 0x1f;
23598     rd = (ctx->opcode >> 11) & 0x1f;
23599     sa = (ctx->opcode >> 6) & 0x1f;
23600
23601     op1 = MASK_SPECIAL(ctx->opcode);
23602     switch (op1) {
23603     case OPC_LSA:
23604         gen_lsa(ctx, op1, rd, rs, rt, extract32(ctx->opcode, 6, 2));
23605         break;
23606     case OPC_MULT:
23607     case OPC_MULTU:
23608     case OPC_DIV:
23609     case OPC_DIVU:
23610         op2 = MASK_R6_MULDIV(ctx->opcode);
23611         switch (op2) {
23612         case R6_OPC_MUL:
23613         case R6_OPC_MUH:
23614         case R6_OPC_MULU:
23615         case R6_OPC_MUHU:
23616         case R6_OPC_DIV:
23617         case R6_OPC_MOD:
23618         case R6_OPC_DIVU:
23619         case R6_OPC_MODU:
23620             gen_r6_muldiv(ctx, op2, rd, rs, rt);
23621             break;
23622         default:
23623             MIPS_INVAL("special_r6 muldiv");
23624             generate_exception_end(ctx, EXCP_RI);
23625             break;
23626         }
23627         break;
23628     case OPC_SELEQZ:
23629     case OPC_SELNEZ:
23630         gen_cond_move(ctx, op1, rd, rs, rt);
23631         break;
23632     case R6_OPC_CLO:
23633     case R6_OPC_CLZ:
23634         if (rt == 0 && sa == 1) {
23635             /* Major opcode and function field is shared with preR6 MFHI/MTHI.
23636                We need additionally to check other fields */
23637             gen_cl(ctx, op1, rd, rs);
23638         } else {
23639             generate_exception_end(ctx, EXCP_RI);
23640         }
23641         break;
23642     case R6_OPC_SDBBP:
23643         if (is_uhi(extract32(ctx->opcode, 6, 20))) {
23644             gen_helper_do_semihosting(cpu_env);
23645         } else {
23646             if (ctx->hflags & MIPS_HFLAG_SBRI) {
23647                 generate_exception_end(ctx, EXCP_RI);
23648             } else {
23649                 generate_exception_end(ctx, EXCP_DBp);
23650             }
23651         }
23652         break;
23653 #if defined(TARGET_MIPS64)
23654     case OPC_DLSA:
23655         check_mips_64(ctx);
23656         gen_lsa(ctx, op1, rd, rs, rt, extract32(ctx->opcode, 6, 2));
23657         break;
23658     case R6_OPC_DCLO:
23659     case R6_OPC_DCLZ:
23660         if (rt == 0 && sa == 1) {
23661             /* Major opcode and function field is shared with preR6 MFHI/MTHI.
23662                We need additionally to check other fields */
23663             check_mips_64(ctx);
23664             gen_cl(ctx, op1, rd, rs);
23665         } else {
23666             generate_exception_end(ctx, EXCP_RI);
23667         }
23668         break;
23669     case OPC_DMULT:
23670     case OPC_DMULTU:
23671     case OPC_DDIV:
23672     case OPC_DDIVU:
23673
23674         op2 = MASK_R6_MULDIV(ctx->opcode);
23675         switch (op2) {
23676         case R6_OPC_DMUL:
23677         case R6_OPC_DMUH:
23678         case R6_OPC_DMULU:
23679         case R6_OPC_DMUHU:
23680         case R6_OPC_DDIV:
23681         case R6_OPC_DMOD:
23682         case R6_OPC_DDIVU:
23683         case R6_OPC_DMODU:
23684             check_mips_64(ctx);
23685             gen_r6_muldiv(ctx, op2, rd, rs, rt);
23686             break;
23687         default:
23688             MIPS_INVAL("special_r6 muldiv");
23689             generate_exception_end(ctx, EXCP_RI);
23690             break;
23691         }
23692         break;
23693 #endif
23694     default:            /* Invalid */
23695         MIPS_INVAL("special_r6");
23696         generate_exception_end(ctx, EXCP_RI);
23697         break;
23698     }
23699 }
23700
23701 static void decode_opc_special_legacy(CPUMIPSState *env, DisasContext *ctx)
23702 {
23703     int rs, rt, rd, sa;
23704     uint32_t op1;
23705
23706     rs = (ctx->opcode >> 21) & 0x1f;
23707     rt = (ctx->opcode >> 16) & 0x1f;
23708     rd = (ctx->opcode >> 11) & 0x1f;
23709     sa = (ctx->opcode >> 6) & 0x1f;
23710
23711     op1 = MASK_SPECIAL(ctx->opcode);
23712     switch (op1) {
23713     case OPC_MOVN:         /* Conditional move */
23714     case OPC_MOVZ:
23715         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32 |
23716                    INSN_LOONGSON2E | INSN_LOONGSON2F | INSN_R5900);
23717         gen_cond_move(ctx, op1, rd, rs, rt);
23718         break;
23719     case OPC_MFHI:          /* Move from HI/LO */
23720     case OPC_MFLO:
23721         gen_HILO(ctx, op1, rs & 3, rd);
23722         break;
23723     case OPC_MTHI:
23724     case OPC_MTLO:          /* Move to HI/LO */
23725         gen_HILO(ctx, op1, rd & 3, rs);
23726         break;
23727     case OPC_MOVCI:
23728         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
23729         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
23730             check_cp1_enabled(ctx);
23731             gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7,
23732                       (ctx->opcode >> 16) & 1);
23733         } else {
23734             generate_exception_err(ctx, EXCP_CpU, 1);
23735         }
23736         break;
23737     case OPC_MULT:
23738     case OPC_MULTU:
23739         if (sa) {
23740             check_insn(ctx, INSN_VR54XX);
23741             op1 = MASK_MUL_VR54XX(ctx->opcode);
23742             gen_mul_vr54xx(ctx, op1, rd, rs, rt);
23743         } else if (ctx->insn_flags & INSN_R5900) {
23744             gen_mul_txx9(ctx, op1, rd, rs, rt);
23745         } else {
23746             gen_muldiv(ctx, op1, rd & 3, rs, rt);
23747         }
23748         break;
23749     case OPC_DIV:
23750     case OPC_DIVU:
23751         gen_muldiv(ctx, op1, 0, rs, rt);
23752         break;
23753 #if defined(TARGET_MIPS64)
23754     case OPC_DMULT:
23755     case OPC_DMULTU:
23756     case OPC_DDIV:
23757     case OPC_DDIVU:
23758         check_insn(ctx, ISA_MIPS3);
23759         check_insn_opc_user_only(ctx, INSN_R5900);
23760         check_mips_64(ctx);
23761         gen_muldiv(ctx, op1, 0, rs, rt);
23762         break;
23763 #endif
23764     case OPC_JR:
23765         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
23766         break;
23767     case OPC_SPIM:
23768 #ifdef MIPS_STRICT_STANDARD
23769         MIPS_INVAL("SPIM");
23770         generate_exception_end(ctx, EXCP_RI);
23771 #else
23772         /* Implemented as RI exception for now. */
23773         MIPS_INVAL("spim (unofficial)");
23774         generate_exception_end(ctx, EXCP_RI);
23775 #endif
23776         break;
23777     default:            /* Invalid */
23778         MIPS_INVAL("special_legacy");
23779         generate_exception_end(ctx, EXCP_RI);
23780         break;
23781     }
23782 }
23783
23784 static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx)
23785 {
23786     int rs, rt, rd, sa;
23787     uint32_t op1;
23788
23789     rs = (ctx->opcode >> 21) & 0x1f;
23790     rt = (ctx->opcode >> 16) & 0x1f;
23791     rd = (ctx->opcode >> 11) & 0x1f;
23792     sa = (ctx->opcode >> 6) & 0x1f;
23793
23794     op1 = MASK_SPECIAL(ctx->opcode);
23795     switch (op1) {
23796     case OPC_SLL:          /* Shift with immediate */
23797         if (sa == 5 && rd == 0 &&
23798             rs == 0 && rt == 0) { /* PAUSE */
23799             if ((ctx->insn_flags & ISA_MIPS32R6) &&
23800                 (ctx->hflags & MIPS_HFLAG_BMASK)) {
23801                 generate_exception_end(ctx, EXCP_RI);
23802                 break;
23803             }
23804         }
23805         /* Fallthrough */
23806     case OPC_SRA:
23807         gen_shift_imm(ctx, op1, rd, rt, sa);
23808         break;
23809     case OPC_SRL:
23810         switch ((ctx->opcode >> 21) & 0x1f) {
23811         case 1:
23812             /* rotr is decoded as srl on non-R2 CPUs */
23813             if (ctx->insn_flags & ISA_MIPS32R2) {
23814                 op1 = OPC_ROTR;
23815             }
23816             /* Fallthrough */
23817         case 0:
23818             gen_shift_imm(ctx, op1, rd, rt, sa);
23819             break;
23820         default:
23821             generate_exception_end(ctx, EXCP_RI);
23822             break;
23823         }
23824         break;
23825     case OPC_ADD:
23826     case OPC_ADDU:
23827     case OPC_SUB:
23828     case OPC_SUBU:
23829         gen_arith(ctx, op1, rd, rs, rt);
23830         break;
23831     case OPC_SLLV:         /* Shifts */
23832     case OPC_SRAV:
23833         gen_shift(ctx, op1, rd, rs, rt);
23834         break;
23835     case OPC_SRLV:
23836         switch ((ctx->opcode >> 6) & 0x1f) {
23837         case 1:
23838             /* rotrv is decoded as srlv on non-R2 CPUs */
23839             if (ctx->insn_flags & ISA_MIPS32R2) {
23840                 op1 = OPC_ROTRV;
23841             }
23842             /* Fallthrough */
23843         case 0:
23844             gen_shift(ctx, op1, rd, rs, rt);
23845             break;
23846         default:
23847             generate_exception_end(ctx, EXCP_RI);
23848             break;
23849         }
23850         break;
23851     case OPC_SLT:          /* Set on less than */
23852     case OPC_SLTU:
23853         gen_slt(ctx, op1, rd, rs, rt);
23854         break;
23855     case OPC_AND:          /* Logic*/
23856     case OPC_OR:
23857     case OPC_NOR:
23858     case OPC_XOR:
23859         gen_logic(ctx, op1, rd, rs, rt);
23860         break;
23861     case OPC_JALR:
23862         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
23863         break;
23864     case OPC_TGE: /* Traps */
23865     case OPC_TGEU:
23866     case OPC_TLT:
23867     case OPC_TLTU:
23868     case OPC_TEQ:
23869     case OPC_TNE:
23870         check_insn(ctx, ISA_MIPS2);
23871         gen_trap(ctx, op1, rs, rt, -1);
23872         break;
23873     case OPC_LSA: /* OPC_PMON */
23874         if ((ctx->insn_flags & ISA_MIPS32R6) ||
23875             (env->CP0_Config3 & (1 << CP0C3_MSAP))) {
23876             decode_opc_special_r6(env, ctx);
23877         } else {
23878             /* Pmon entry point, also R4010 selsl */
23879 #ifdef MIPS_STRICT_STANDARD
23880             MIPS_INVAL("PMON / selsl");
23881             generate_exception_end(ctx, EXCP_RI);
23882 #else
23883             gen_helper_0e0i(pmon, sa);
23884 #endif
23885         }
23886         break;
23887     case OPC_SYSCALL:
23888         generate_exception_end(ctx, EXCP_SYSCALL);
23889         break;
23890     case OPC_BREAK:
23891         generate_exception_end(ctx, EXCP_BREAK);
23892         break;
23893     case OPC_SYNC:
23894         check_insn(ctx, ISA_MIPS2);
23895         gen_sync(extract32(ctx->opcode, 6, 5));
23896         break;
23897
23898 #if defined(TARGET_MIPS64)
23899         /* MIPS64 specific opcodes */
23900     case OPC_DSLL:
23901     case OPC_DSRA:
23902     case OPC_DSLL32:
23903     case OPC_DSRA32:
23904         check_insn(ctx, ISA_MIPS3);
23905         check_mips_64(ctx);
23906         gen_shift_imm(ctx, op1, rd, rt, sa);
23907         break;
23908     case OPC_DSRL:
23909         switch ((ctx->opcode >> 21) & 0x1f) {
23910         case 1:
23911             /* drotr is decoded as dsrl on non-R2 CPUs */
23912             if (ctx->insn_flags & ISA_MIPS32R2) {
23913                 op1 = OPC_DROTR;
23914             }
23915             /* Fallthrough */
23916         case 0:
23917             check_insn(ctx, ISA_MIPS3);
23918             check_mips_64(ctx);
23919             gen_shift_imm(ctx, op1, rd, rt, sa);
23920             break;
23921         default:
23922             generate_exception_end(ctx, EXCP_RI);
23923             break;
23924         }
23925         break;
23926     case OPC_DSRL32:
23927         switch ((ctx->opcode >> 21) & 0x1f) {
23928         case 1:
23929             /* drotr32 is decoded as dsrl32 on non-R2 CPUs */
23930             if (ctx->insn_flags & ISA_MIPS32R2) {
23931                 op1 = OPC_DROTR32;
23932             }
23933             /* Fallthrough */
23934         case 0:
23935             check_insn(ctx, ISA_MIPS3);
23936             check_mips_64(ctx);
23937             gen_shift_imm(ctx, op1, rd, rt, sa);
23938             break;
23939         default:
23940             generate_exception_end(ctx, EXCP_RI);
23941             break;
23942         }
23943         break;
23944     case OPC_DADD:
23945     case OPC_DADDU:
23946     case OPC_DSUB:
23947     case OPC_DSUBU:
23948         check_insn(ctx, ISA_MIPS3);
23949         check_mips_64(ctx);
23950         gen_arith(ctx, op1, rd, rs, rt);
23951         break;
23952     case OPC_DSLLV:
23953     case OPC_DSRAV:
23954         check_insn(ctx, ISA_MIPS3);
23955         check_mips_64(ctx);
23956         gen_shift(ctx, op1, rd, rs, rt);
23957         break;
23958     case OPC_DSRLV:
23959         switch ((ctx->opcode >> 6) & 0x1f) {
23960         case 1:
23961             /* drotrv is decoded as dsrlv on non-R2 CPUs */
23962             if (ctx->insn_flags & ISA_MIPS32R2) {
23963                 op1 = OPC_DROTRV;
23964             }
23965             /* Fallthrough */
23966         case 0:
23967             check_insn(ctx, ISA_MIPS3);
23968             check_mips_64(ctx);
23969             gen_shift(ctx, op1, rd, rs, rt);
23970             break;
23971         default:
23972             generate_exception_end(ctx, EXCP_RI);
23973             break;
23974         }
23975         break;
23976     case OPC_DLSA:
23977         if ((ctx->insn_flags & ISA_MIPS32R6) ||
23978             (env->CP0_Config3 & (1 << CP0C3_MSAP))) {
23979             decode_opc_special_r6(env, ctx);
23980         }
23981         break;
23982 #endif
23983     default:
23984         if (ctx->insn_flags & ISA_MIPS32R6) {
23985             decode_opc_special_r6(env, ctx);
23986         } else {
23987             decode_opc_special_legacy(env, ctx);
23988         }
23989     }
23990 }
23991
23992 static void decode_opc_special2_legacy(CPUMIPSState *env, DisasContext *ctx)
23993 {
23994     int rs, rt, rd;
23995     uint32_t op1;
23996
23997     check_insn_opc_removed(ctx, ISA_MIPS32R6);
23998
23999     rs = (ctx->opcode >> 21) & 0x1f;
24000     rt = (ctx->opcode >> 16) & 0x1f;
24001     rd = (ctx->opcode >> 11) & 0x1f;
24002
24003     op1 = MASK_SPECIAL2(ctx->opcode);
24004     switch (op1) {
24005     case OPC_MADD: /* Multiply and add/sub */
24006     case OPC_MADDU:
24007     case OPC_MSUB:
24008     case OPC_MSUBU:
24009         check_insn(ctx, ISA_MIPS32);
24010         gen_muldiv(ctx, op1, rd & 3, rs, rt);
24011         break;
24012     case OPC_MUL:
24013         gen_arith(ctx, op1, rd, rs, rt);
24014         break;
24015     case OPC_DIV_G_2F:
24016     case OPC_DIVU_G_2F:
24017     case OPC_MULT_G_2F:
24018     case OPC_MULTU_G_2F:
24019     case OPC_MOD_G_2F:
24020     case OPC_MODU_G_2F:
24021         check_insn(ctx, INSN_LOONGSON2F);
24022         gen_loongson_integer(ctx, op1, rd, rs, rt);
24023         break;
24024     case OPC_CLO:
24025     case OPC_CLZ:
24026         check_insn(ctx, ISA_MIPS32);
24027         gen_cl(ctx, op1, rd, rs);
24028         break;
24029     case OPC_SDBBP:
24030         if (is_uhi(extract32(ctx->opcode, 6, 20))) {
24031             gen_helper_do_semihosting(cpu_env);
24032         } else {
24033             /* XXX: not clear which exception should be raised
24034              *      when in debug mode...
24035              */
24036             check_insn(ctx, ISA_MIPS32);
24037             generate_exception_end(ctx, EXCP_DBp);
24038         }
24039         break;
24040 #if defined(TARGET_MIPS64)
24041     case OPC_DCLO:
24042     case OPC_DCLZ:
24043         check_insn(ctx, ISA_MIPS64);
24044         check_mips_64(ctx);
24045         gen_cl(ctx, op1, rd, rs);
24046         break;
24047     case OPC_DMULT_G_2F:
24048     case OPC_DMULTU_G_2F:
24049     case OPC_DDIV_G_2F:
24050     case OPC_DDIVU_G_2F:
24051     case OPC_DMOD_G_2F:
24052     case OPC_DMODU_G_2F:
24053         check_insn(ctx, INSN_LOONGSON2F);
24054         gen_loongson_integer(ctx, op1, rd, rs, rt);
24055         break;
24056 #endif
24057     default:            /* Invalid */
24058         MIPS_INVAL("special2_legacy");
24059         generate_exception_end(ctx, EXCP_RI);
24060         break;
24061     }
24062 }
24063
24064 static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx)
24065 {
24066     int rs, rt, rd, sa;
24067     uint32_t op1, op2;
24068     int16_t imm;
24069
24070     rs = (ctx->opcode >> 21) & 0x1f;
24071     rt = (ctx->opcode >> 16) & 0x1f;
24072     rd = (ctx->opcode >> 11) & 0x1f;
24073     sa = (ctx->opcode >> 6) & 0x1f;
24074     imm = (int16_t)ctx->opcode >> 7;
24075
24076     op1 = MASK_SPECIAL3(ctx->opcode);
24077     switch (op1) {
24078     case R6_OPC_PREF:
24079         if (rt >= 24) {
24080             /* hint codes 24-31 are reserved and signal RI */
24081             generate_exception_end(ctx, EXCP_RI);
24082         }
24083         /* Treat as NOP. */
24084         break;
24085     case R6_OPC_CACHE:
24086         check_cp0_enabled(ctx);
24087         if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
24088             gen_cache_operation(ctx, rt, rs, imm);
24089         }
24090         break;
24091     case R6_OPC_SC:
24092         gen_st_cond(ctx, op1, rt, rs, imm);
24093         break;
24094     case R6_OPC_LL:
24095         gen_ld(ctx, op1, rt, rs, imm);
24096         break;
24097     case OPC_BSHFL:
24098         {
24099             if (rd == 0) {
24100                 /* Treat as NOP. */
24101                 break;
24102             }
24103             op2 = MASK_BSHFL(ctx->opcode);
24104             switch (op2) {
24105             case OPC_ALIGN:
24106             case OPC_ALIGN_1:
24107             case OPC_ALIGN_2:
24108             case OPC_ALIGN_3:
24109                 gen_align(ctx, 32, rd, rs, rt, sa & 3);
24110                 break;
24111             case OPC_BITSWAP:
24112                 gen_bitswap(ctx, op2, rd, rt);
24113                 break;
24114             }
24115         }
24116         break;
24117 #if defined(TARGET_MIPS64)
24118     case R6_OPC_SCD:
24119         gen_st_cond(ctx, op1, rt, rs, imm);
24120         break;
24121     case R6_OPC_LLD:
24122         gen_ld(ctx, op1, rt, rs, imm);
24123         break;
24124     case OPC_DBSHFL:
24125         check_mips_64(ctx);
24126         {
24127             if (rd == 0) {
24128                 /* Treat as NOP. */
24129                 break;
24130             }
24131             op2 = MASK_DBSHFL(ctx->opcode);
24132             switch (op2) {
24133             case OPC_DALIGN:
24134             case OPC_DALIGN_1:
24135             case OPC_DALIGN_2:
24136             case OPC_DALIGN_3:
24137             case OPC_DALIGN_4:
24138             case OPC_DALIGN_5:
24139             case OPC_DALIGN_6:
24140             case OPC_DALIGN_7:
24141                 gen_align(ctx, 64, rd, rs, rt, sa & 7);
24142                 break;
24143             case OPC_DBITSWAP:
24144                 gen_bitswap(ctx, op2, rd, rt);
24145                 break;
24146             }
24147
24148         }
24149         break;
24150 #endif
24151     default:            /* Invalid */
24152         MIPS_INVAL("special3_r6");
24153         generate_exception_end(ctx, EXCP_RI);
24154         break;
24155     }
24156 }
24157
24158 static void decode_opc_special3_legacy(CPUMIPSState *env, DisasContext *ctx)
24159 {
24160     int rs, rt, rd;
24161     uint32_t op1, op2;
24162
24163     rs = (ctx->opcode >> 21) & 0x1f;
24164     rt = (ctx->opcode >> 16) & 0x1f;
24165     rd = (ctx->opcode >> 11) & 0x1f;
24166
24167     op1 = MASK_SPECIAL3(ctx->opcode);
24168     switch (op1) {
24169     case OPC_DIV_G_2E:
24170     case OPC_DIVU_G_2E:
24171     case OPC_MOD_G_2E:
24172     case OPC_MODU_G_2E:
24173     case OPC_MULT_G_2E:
24174     case OPC_MULTU_G_2E:
24175         /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
24176          * the same mask and op1. */
24177         if ((ctx->insn_flags & ASE_DSP_R2) && (op1 == OPC_MULT_G_2E)) {
24178             op2 = MASK_ADDUH_QB(ctx->opcode);
24179             switch (op2) {
24180             case OPC_ADDUH_QB:
24181             case OPC_ADDUH_R_QB:
24182             case OPC_ADDQH_PH:
24183             case OPC_ADDQH_R_PH:
24184             case OPC_ADDQH_W:
24185             case OPC_ADDQH_R_W:
24186             case OPC_SUBUH_QB:
24187             case OPC_SUBUH_R_QB:
24188             case OPC_SUBQH_PH:
24189             case OPC_SUBQH_R_PH:
24190             case OPC_SUBQH_W:
24191             case OPC_SUBQH_R_W:
24192                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24193                 break;
24194             case OPC_MUL_PH:
24195             case OPC_MUL_S_PH:
24196             case OPC_MULQ_S_W:
24197             case OPC_MULQ_RS_W:
24198                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
24199                 break;
24200             default:
24201                 MIPS_INVAL("MASK ADDUH.QB");
24202                 generate_exception_end(ctx, EXCP_RI);
24203                 break;
24204             }
24205         } else if (ctx->insn_flags & INSN_LOONGSON2E) {
24206             gen_loongson_integer(ctx, op1, rd, rs, rt);
24207         } else {
24208             generate_exception_end(ctx, EXCP_RI);
24209         }
24210         break;
24211     case OPC_LX_DSP:
24212         op2 = MASK_LX(ctx->opcode);
24213         switch (op2) {
24214 #if defined(TARGET_MIPS64)
24215         case OPC_LDX:
24216 #endif
24217         case OPC_LBUX:
24218         case OPC_LHX:
24219         case OPC_LWX:
24220             gen_mipsdsp_ld(ctx, op2, rd, rs, rt);
24221             break;
24222         default:            /* Invalid */
24223             MIPS_INVAL("MASK LX");
24224             generate_exception_end(ctx, EXCP_RI);
24225             break;
24226         }
24227         break;
24228     case OPC_ABSQ_S_PH_DSP:
24229         op2 = MASK_ABSQ_S_PH(ctx->opcode);
24230         switch (op2) {
24231         case OPC_ABSQ_S_QB:
24232         case OPC_ABSQ_S_PH:
24233         case OPC_ABSQ_S_W:
24234         case OPC_PRECEQ_W_PHL:
24235         case OPC_PRECEQ_W_PHR:
24236         case OPC_PRECEQU_PH_QBL:
24237         case OPC_PRECEQU_PH_QBR:
24238         case OPC_PRECEQU_PH_QBLA:
24239         case OPC_PRECEQU_PH_QBRA:
24240         case OPC_PRECEU_PH_QBL:
24241         case OPC_PRECEU_PH_QBR:
24242         case OPC_PRECEU_PH_QBLA:
24243         case OPC_PRECEU_PH_QBRA:
24244             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24245             break;
24246         case OPC_BITREV:
24247         case OPC_REPL_QB:
24248         case OPC_REPLV_QB:
24249         case OPC_REPL_PH:
24250         case OPC_REPLV_PH:
24251             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
24252             break;
24253         default:
24254             MIPS_INVAL("MASK ABSQ_S.PH");
24255             generate_exception_end(ctx, EXCP_RI);
24256             break;
24257         }
24258         break;
24259     case OPC_ADDU_QB_DSP:
24260         op2 = MASK_ADDU_QB(ctx->opcode);
24261         switch (op2) {
24262         case OPC_ADDQ_PH:
24263         case OPC_ADDQ_S_PH:
24264         case OPC_ADDQ_S_W:
24265         case OPC_ADDU_QB:
24266         case OPC_ADDU_S_QB:
24267         case OPC_ADDU_PH:
24268         case OPC_ADDU_S_PH:
24269         case OPC_SUBQ_PH:
24270         case OPC_SUBQ_S_PH:
24271         case OPC_SUBQ_S_W:
24272         case OPC_SUBU_QB:
24273         case OPC_SUBU_S_QB:
24274         case OPC_SUBU_PH:
24275         case OPC_SUBU_S_PH:
24276         case OPC_ADDSC:
24277         case OPC_ADDWC:
24278         case OPC_MODSUB:
24279         case OPC_RADDU_W_QB:
24280             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24281             break;
24282         case OPC_MULEU_S_PH_QBL:
24283         case OPC_MULEU_S_PH_QBR:
24284         case OPC_MULQ_RS_PH:
24285         case OPC_MULEQ_S_W_PHL:
24286         case OPC_MULEQ_S_W_PHR:
24287         case OPC_MULQ_S_PH:
24288             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
24289             break;
24290         default:            /* Invalid */
24291             MIPS_INVAL("MASK ADDU.QB");
24292             generate_exception_end(ctx, EXCP_RI);
24293             break;
24294
24295         }
24296         break;
24297     case OPC_CMPU_EQ_QB_DSP:
24298         op2 = MASK_CMPU_EQ_QB(ctx->opcode);
24299         switch (op2) {
24300         case OPC_PRECR_SRA_PH_W:
24301         case OPC_PRECR_SRA_R_PH_W:
24302             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
24303             break;
24304         case OPC_PRECR_QB_PH:
24305         case OPC_PRECRQ_QB_PH:
24306         case OPC_PRECRQ_PH_W:
24307         case OPC_PRECRQ_RS_PH_W:
24308         case OPC_PRECRQU_S_QB_PH:
24309             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24310             break;
24311         case OPC_CMPU_EQ_QB:
24312         case OPC_CMPU_LT_QB:
24313         case OPC_CMPU_LE_QB:
24314         case OPC_CMP_EQ_PH:
24315         case OPC_CMP_LT_PH:
24316         case OPC_CMP_LE_PH:
24317             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
24318             break;
24319         case OPC_CMPGU_EQ_QB:
24320         case OPC_CMPGU_LT_QB:
24321         case OPC_CMPGU_LE_QB:
24322         case OPC_CMPGDU_EQ_QB:
24323         case OPC_CMPGDU_LT_QB:
24324         case OPC_CMPGDU_LE_QB:
24325         case OPC_PICK_QB:
24326         case OPC_PICK_PH:
24327         case OPC_PACKRL_PH:
24328             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
24329             break;
24330         default:            /* Invalid */
24331             MIPS_INVAL("MASK CMPU.EQ.QB");
24332             generate_exception_end(ctx, EXCP_RI);
24333             break;
24334         }
24335         break;
24336     case OPC_SHLL_QB_DSP:
24337         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
24338         break;
24339     case OPC_DPA_W_PH_DSP:
24340         op2 = MASK_DPA_W_PH(ctx->opcode);
24341         switch (op2) {
24342         case OPC_DPAU_H_QBL:
24343         case OPC_DPAU_H_QBR:
24344         case OPC_DPSU_H_QBL:
24345         case OPC_DPSU_H_QBR:
24346         case OPC_DPA_W_PH:
24347         case OPC_DPAX_W_PH:
24348         case OPC_DPAQ_S_W_PH:
24349         case OPC_DPAQX_S_W_PH:
24350         case OPC_DPAQX_SA_W_PH:
24351         case OPC_DPS_W_PH:
24352         case OPC_DPSX_W_PH:
24353         case OPC_DPSQ_S_W_PH:
24354         case OPC_DPSQX_S_W_PH:
24355         case OPC_DPSQX_SA_W_PH:
24356         case OPC_MULSAQ_S_W_PH:
24357         case OPC_DPAQ_SA_L_W:
24358         case OPC_DPSQ_SA_L_W:
24359         case OPC_MAQ_S_W_PHL:
24360         case OPC_MAQ_S_W_PHR:
24361         case OPC_MAQ_SA_W_PHL:
24362         case OPC_MAQ_SA_W_PHR:
24363         case OPC_MULSA_W_PH:
24364             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
24365             break;
24366         default:            /* Invalid */
24367             MIPS_INVAL("MASK DPAW.PH");
24368             generate_exception_end(ctx, EXCP_RI);
24369             break;
24370         }
24371         break;
24372     case OPC_INSV_DSP:
24373         op2 = MASK_INSV(ctx->opcode);
24374         switch (op2) {
24375         case OPC_INSV:
24376             check_dsp(ctx);
24377             {
24378                 TCGv t0, t1;
24379
24380                 if (rt == 0) {
24381                     break;
24382                 }
24383
24384                 t0 = tcg_temp_new();
24385                 t1 = tcg_temp_new();
24386
24387                 gen_load_gpr(t0, rt);
24388                 gen_load_gpr(t1, rs);
24389
24390                 gen_helper_insv(cpu_gpr[rt], cpu_env, t1, t0);
24391
24392                 tcg_temp_free(t0);
24393                 tcg_temp_free(t1);
24394                 break;
24395             }
24396         default:            /* Invalid */
24397             MIPS_INVAL("MASK INSV");
24398             generate_exception_end(ctx, EXCP_RI);
24399             break;
24400         }
24401         break;
24402     case OPC_APPEND_DSP:
24403         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
24404         break;
24405     case OPC_EXTR_W_DSP:
24406         op2 = MASK_EXTR_W(ctx->opcode);
24407         switch (op2) {
24408         case OPC_EXTR_W:
24409         case OPC_EXTR_R_W:
24410         case OPC_EXTR_RS_W:
24411         case OPC_EXTR_S_H:
24412         case OPC_EXTRV_S_H:
24413         case OPC_EXTRV_W:
24414         case OPC_EXTRV_R_W:
24415         case OPC_EXTRV_RS_W:
24416         case OPC_EXTP:
24417         case OPC_EXTPV:
24418         case OPC_EXTPDP:
24419         case OPC_EXTPDPV:
24420             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
24421             break;
24422         case OPC_RDDSP:
24423             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 1);
24424             break;
24425         case OPC_SHILO:
24426         case OPC_SHILOV:
24427         case OPC_MTHLIP:
24428         case OPC_WRDSP:
24429             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
24430             break;
24431         default:            /* Invalid */
24432             MIPS_INVAL("MASK EXTR.W");
24433             generate_exception_end(ctx, EXCP_RI);
24434             break;
24435         }
24436         break;
24437 #if defined(TARGET_MIPS64)
24438     case OPC_DDIV_G_2E:
24439     case OPC_DDIVU_G_2E:
24440     case OPC_DMULT_G_2E:
24441     case OPC_DMULTU_G_2E:
24442     case OPC_DMOD_G_2E:
24443     case OPC_DMODU_G_2E:
24444         check_insn(ctx, INSN_LOONGSON2E);
24445         gen_loongson_integer(ctx, op1, rd, rs, rt);
24446         break;
24447     case OPC_ABSQ_S_QH_DSP:
24448         op2 = MASK_ABSQ_S_QH(ctx->opcode);
24449         switch (op2) {
24450         case OPC_PRECEQ_L_PWL:
24451         case OPC_PRECEQ_L_PWR:
24452         case OPC_PRECEQ_PW_QHL:
24453         case OPC_PRECEQ_PW_QHR:
24454         case OPC_PRECEQ_PW_QHLA:
24455         case OPC_PRECEQ_PW_QHRA:
24456         case OPC_PRECEQU_QH_OBL:
24457         case OPC_PRECEQU_QH_OBR:
24458         case OPC_PRECEQU_QH_OBLA:
24459         case OPC_PRECEQU_QH_OBRA:
24460         case OPC_PRECEU_QH_OBL:
24461         case OPC_PRECEU_QH_OBR:
24462         case OPC_PRECEU_QH_OBLA:
24463         case OPC_PRECEU_QH_OBRA:
24464         case OPC_ABSQ_S_OB:
24465         case OPC_ABSQ_S_PW:
24466         case OPC_ABSQ_S_QH:
24467             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24468             break;
24469         case OPC_REPL_OB:
24470         case OPC_REPL_PW:
24471         case OPC_REPL_QH:
24472         case OPC_REPLV_OB:
24473         case OPC_REPLV_PW:
24474         case OPC_REPLV_QH:
24475             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
24476             break;
24477         default:            /* Invalid */
24478             MIPS_INVAL("MASK ABSQ_S.QH");
24479             generate_exception_end(ctx, EXCP_RI);
24480             break;
24481         }
24482         break;
24483     case OPC_ADDU_OB_DSP:
24484         op2 = MASK_ADDU_OB(ctx->opcode);
24485         switch (op2) {
24486         case OPC_RADDU_L_OB:
24487         case OPC_SUBQ_PW:
24488         case OPC_SUBQ_S_PW:
24489         case OPC_SUBQ_QH:
24490         case OPC_SUBQ_S_QH:
24491         case OPC_SUBU_OB:
24492         case OPC_SUBU_S_OB:
24493         case OPC_SUBU_QH:
24494         case OPC_SUBU_S_QH:
24495         case OPC_SUBUH_OB:
24496         case OPC_SUBUH_R_OB:
24497         case OPC_ADDQ_PW:
24498         case OPC_ADDQ_S_PW:
24499         case OPC_ADDQ_QH:
24500         case OPC_ADDQ_S_QH:
24501         case OPC_ADDU_OB:
24502         case OPC_ADDU_S_OB:
24503         case OPC_ADDU_QH:
24504         case OPC_ADDU_S_QH:
24505         case OPC_ADDUH_OB:
24506         case OPC_ADDUH_R_OB:
24507             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24508             break;
24509         case OPC_MULEQ_S_PW_QHL:
24510         case OPC_MULEQ_S_PW_QHR:
24511         case OPC_MULEU_S_QH_OBL:
24512         case OPC_MULEU_S_QH_OBR:
24513         case OPC_MULQ_RS_QH:
24514             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
24515             break;
24516         default:            /* Invalid */
24517             MIPS_INVAL("MASK ADDU.OB");
24518             generate_exception_end(ctx, EXCP_RI);
24519             break;
24520         }
24521         break;
24522     case OPC_CMPU_EQ_OB_DSP:
24523         op2 = MASK_CMPU_EQ_OB(ctx->opcode);
24524         switch (op2) {
24525         case OPC_PRECR_SRA_QH_PW:
24526         case OPC_PRECR_SRA_R_QH_PW:
24527             /* Return value is rt. */
24528             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
24529             break;
24530         case OPC_PRECR_OB_QH:
24531         case OPC_PRECRQ_OB_QH:
24532         case OPC_PRECRQ_PW_L:
24533         case OPC_PRECRQ_QH_PW:
24534         case OPC_PRECRQ_RS_QH_PW:
24535         case OPC_PRECRQU_S_OB_QH:
24536             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24537             break;
24538         case OPC_CMPU_EQ_OB:
24539         case OPC_CMPU_LT_OB:
24540         case OPC_CMPU_LE_OB:
24541         case OPC_CMP_EQ_QH:
24542         case OPC_CMP_LT_QH:
24543         case OPC_CMP_LE_QH:
24544         case OPC_CMP_EQ_PW:
24545         case OPC_CMP_LT_PW:
24546         case OPC_CMP_LE_PW:
24547             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
24548             break;
24549         case OPC_CMPGDU_EQ_OB:
24550         case OPC_CMPGDU_LT_OB:
24551         case OPC_CMPGDU_LE_OB:
24552         case OPC_CMPGU_EQ_OB:
24553         case OPC_CMPGU_LT_OB:
24554         case OPC_CMPGU_LE_OB:
24555         case OPC_PACKRL_PW:
24556         case OPC_PICK_OB:
24557         case OPC_PICK_PW:
24558         case OPC_PICK_QH:
24559             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
24560             break;
24561         default:            /* Invalid */
24562             MIPS_INVAL("MASK CMPU_EQ.OB");
24563             generate_exception_end(ctx, EXCP_RI);
24564             break;
24565         }
24566         break;
24567     case OPC_DAPPEND_DSP:
24568         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
24569         break;
24570     case OPC_DEXTR_W_DSP:
24571         op2 = MASK_DEXTR_W(ctx->opcode);
24572         switch (op2) {
24573         case OPC_DEXTP:
24574         case OPC_DEXTPDP:
24575         case OPC_DEXTPDPV:
24576         case OPC_DEXTPV:
24577         case OPC_DEXTR_L:
24578         case OPC_DEXTR_R_L:
24579         case OPC_DEXTR_RS_L:
24580         case OPC_DEXTR_W:
24581         case OPC_DEXTR_R_W:
24582         case OPC_DEXTR_RS_W:
24583         case OPC_DEXTR_S_H:
24584         case OPC_DEXTRV_L:
24585         case OPC_DEXTRV_R_L:
24586         case OPC_DEXTRV_RS_L:
24587         case OPC_DEXTRV_S_H:
24588         case OPC_DEXTRV_W:
24589         case OPC_DEXTRV_R_W:
24590         case OPC_DEXTRV_RS_W:
24591             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
24592             break;
24593         case OPC_DMTHLIP:
24594         case OPC_DSHILO:
24595         case OPC_DSHILOV:
24596             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
24597             break;
24598         default:            /* Invalid */
24599             MIPS_INVAL("MASK EXTR.W");
24600             generate_exception_end(ctx, EXCP_RI);
24601             break;
24602         }
24603         break;
24604     case OPC_DPAQ_W_QH_DSP:
24605         op2 = MASK_DPAQ_W_QH(ctx->opcode);
24606         switch (op2) {
24607         case OPC_DPAU_H_OBL:
24608         case OPC_DPAU_H_OBR:
24609         case OPC_DPSU_H_OBL:
24610         case OPC_DPSU_H_OBR:
24611         case OPC_DPA_W_QH:
24612         case OPC_DPAQ_S_W_QH:
24613         case OPC_DPS_W_QH:
24614         case OPC_DPSQ_S_W_QH:
24615         case OPC_MULSAQ_S_W_QH:
24616         case OPC_DPAQ_SA_L_PW:
24617         case OPC_DPSQ_SA_L_PW:
24618         case OPC_MULSAQ_S_L_PW:
24619             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
24620             break;
24621         case OPC_MAQ_S_W_QHLL:
24622         case OPC_MAQ_S_W_QHLR:
24623         case OPC_MAQ_S_W_QHRL:
24624         case OPC_MAQ_S_W_QHRR:
24625         case OPC_MAQ_SA_W_QHLL:
24626         case OPC_MAQ_SA_W_QHLR:
24627         case OPC_MAQ_SA_W_QHRL:
24628         case OPC_MAQ_SA_W_QHRR:
24629         case OPC_MAQ_S_L_PWL:
24630         case OPC_MAQ_S_L_PWR:
24631         case OPC_DMADD:
24632         case OPC_DMADDU:
24633         case OPC_DMSUB:
24634         case OPC_DMSUBU:
24635             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
24636             break;
24637         default:            /* Invalid */
24638             MIPS_INVAL("MASK DPAQ.W.QH");
24639             generate_exception_end(ctx, EXCP_RI);
24640             break;
24641         }
24642         break;
24643     case OPC_DINSV_DSP:
24644         op2 = MASK_INSV(ctx->opcode);
24645         switch (op2) {
24646         case OPC_DINSV:
24647         {
24648             TCGv t0, t1;
24649
24650             if (rt == 0) {
24651                 break;
24652             }
24653             check_dsp(ctx);
24654
24655             t0 = tcg_temp_new();
24656             t1 = tcg_temp_new();
24657
24658             gen_load_gpr(t0, rt);
24659             gen_load_gpr(t1, rs);
24660
24661             gen_helper_dinsv(cpu_gpr[rt], cpu_env, t1, t0);
24662
24663             tcg_temp_free(t0);
24664             tcg_temp_free(t1);
24665             break;
24666         }
24667         default:            /* Invalid */
24668             MIPS_INVAL("MASK DINSV");
24669             generate_exception_end(ctx, EXCP_RI);
24670             break;
24671         }
24672         break;
24673     case OPC_SHLL_OB_DSP:
24674         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
24675         break;
24676 #endif
24677     default:            /* Invalid */
24678         MIPS_INVAL("special3_legacy");
24679         generate_exception_end(ctx, EXCP_RI);
24680         break;
24681     }
24682 }
24683
24684 static void decode_tx79_mmi0(CPUMIPSState *env, DisasContext *ctx)
24685 {
24686     uint32_t opc = MASK_TX79_MMI0(ctx->opcode);
24687
24688     switch (opc) {
24689     case TX79_MMI0_PADDW:     /* TODO: TX79_MMI0_PADDW */
24690     case TX79_MMI0_PSUBW:     /* TODO: TX79_MMI0_PSUBW */
24691     case TX79_MMI0_PCGTW:     /* TODO: TX79_MMI0_PCGTW */
24692     case TX79_MMI0_PMAXW:     /* TODO: TX79_MMI0_PMAXW */
24693     case TX79_MMI0_PADDH:     /* TODO: TX79_MMI0_PADDH */
24694     case TX79_MMI0_PSUBH:     /* TODO: TX79_MMI0_PSUBH */
24695     case TX79_MMI0_PCGTH:     /* TODO: TX79_MMI0_PCGTH */
24696     case TX79_MMI0_PMAXH:     /* TODO: TX79_MMI0_PMAXH */
24697     case TX79_MMI0_PADDB:     /* TODO: TX79_MMI0_PADDB */
24698     case TX79_MMI0_PSUBB:     /* TODO: TX79_MMI0_PSUBB */
24699     case TX79_MMI0_PCGTB:     /* TODO: TX79_MMI0_PCGTB */
24700     case TX79_MMI0_PADDSW:    /* TODO: TX79_MMI0_PADDSW */
24701     case TX79_MMI0_PSUBSW:    /* TODO: TX79_MMI0_PSUBSW */
24702     case TX79_MMI0_PEXTLW:    /* TODO: TX79_MMI0_PEXTLW */
24703     case TX79_MMI0_PPACW:     /* TODO: TX79_MMI0_PPACW */
24704     case TX79_MMI0_PADDSH:    /* TODO: TX79_MMI0_PADDSH */
24705     case TX79_MMI0_PSUBSH:    /* TODO: TX79_MMI0_PSUBSH */
24706     case TX79_MMI0_PEXTLH:    /* TODO: TX79_MMI0_PEXTLH */
24707     case TX79_MMI0_PPACH:     /* TODO: TX79_MMI0_PPACH */
24708     case TX79_MMI0_PADDSB:    /* TODO: TX79_MMI0_PADDSB */
24709     case TX79_MMI0_PSUBSB:    /* TODO: TX79_MMI0_PSUBSB */
24710     case TX79_MMI0_PEXTLB:    /* TODO: TX79_MMI0_PEXTLB */
24711     case TX79_MMI0_PPACB:     /* TODO: TX79_MMI0_PPACB */
24712     case TX79_MMI0_PEXT5:     /* TODO: TX79_MMI0_PEXT5 */
24713     case TX79_MMI0_PPAC5:     /* TODO: TX79_MMI0_PPAC5 */
24714         generate_exception_end(ctx, EXCP_RI); /* TODO: TX79_MMI_CLASS_MMI0 */
24715         break;
24716     default:
24717         MIPS_INVAL("TX79 MMI class MMI0");
24718         generate_exception_end(ctx, EXCP_RI);
24719         break;
24720     }
24721 }
24722
24723 static void decode_tx79_mmi1(CPUMIPSState *env, DisasContext *ctx)
24724 {
24725     uint32_t opc = MASK_TX79_MMI1(ctx->opcode);
24726
24727     switch (opc) {
24728     case TX79_MMI1_PABSW:     /* TODO: TX79_MMI1_PABSW */
24729     case TX79_MMI1_PCEQW:     /* TODO: TX79_MMI1_PCEQW */
24730     case TX79_MMI1_PMINW:     /* TODO: TX79_MMI1_PMINW */
24731     case TX79_MMI1_PADSBH:    /* TODO: TX79_MMI1_PADSBH */
24732     case TX79_MMI1_PABSH:     /* TODO: TX79_MMI1_PABSH */
24733     case TX79_MMI1_PCEQH:     /* TODO: TX79_MMI1_PCEQH */
24734     case TX79_MMI1_PMINH:     /* TODO: TX79_MMI1_PMINH */
24735     case TX79_MMI1_PCEQB:     /* TODO: TX79_MMI1_PCEQB */
24736     case TX79_MMI1_PADDUW:    /* TODO: TX79_MMI1_PADDUW */
24737     case TX79_MMI1_PSUBUW:    /* TODO: TX79_MMI1_PSUBUW */
24738     case TX79_MMI1_PEXTUW:    /* TODO: TX79_MMI1_PEXTUW */
24739     case TX79_MMI1_PADDUH:    /* TODO: TX79_MMI1_PADDUH */
24740     case TX79_MMI1_PSUBUH:    /* TODO: TX79_MMI1_PSUBUH */
24741     case TX79_MMI1_PEXTUH:    /* TODO: TX79_MMI1_PEXTUH */
24742     case TX79_MMI1_PADDUB:    /* TODO: TX79_MMI1_PADDUB */
24743     case TX79_MMI1_PSUBUB:    /* TODO: TX79_MMI1_PSUBUB */
24744     case TX79_MMI1_PEXTUB:    /* TODO: TX79_MMI1_PEXTUB */
24745     case TX79_MMI1_QFSRV:     /* TODO: TX79_MMI1_QFSRV */
24746         generate_exception_end(ctx, EXCP_RI); /* TODO: TX79_MMI_CLASS_MMI1 */
24747         break;
24748     default:
24749         MIPS_INVAL("TX79 MMI class MMI1");
24750         generate_exception_end(ctx, EXCP_RI);
24751         break;
24752     }
24753 }
24754
24755 static void decode_tx79_mmi2(CPUMIPSState *env, DisasContext *ctx)
24756 {
24757     uint32_t opc = MASK_TX79_MMI2(ctx->opcode);
24758
24759     switch (opc) {
24760     case TX79_MMI2_PMADDW:    /* TODO: TX79_MMI2_PMADDW */
24761     case TX79_MMI2_PSLLVW:    /* TODO: TX79_MMI2_PSLLVW */
24762     case TX79_MMI2_PSRLVW:    /* TODO: TX79_MMI2_PSRLVW */
24763     case TX79_MMI2_PMSUBW:    /* TODO: TX79_MMI2_PMSUBW */
24764     case TX79_MMI2_PMFHI:     /* TODO: TX79_MMI2_PMFHI */
24765     case TX79_MMI2_PMFLO:     /* TODO: TX79_MMI2_PMFLO */
24766     case TX79_MMI2_PINTH:     /* TODO: TX79_MMI2_PINTH */
24767     case TX79_MMI2_PMULTW:    /* TODO: TX79_MMI2_PMULTW */
24768     case TX79_MMI2_PDIVW:     /* TODO: TX79_MMI2_PDIVW */
24769     case TX79_MMI2_PCPYLD:    /* TODO: TX79_MMI2_PCPYLD */
24770     case TX79_MMI2_PMADDH:    /* TODO: TX79_MMI2_PMADDH */
24771     case TX79_MMI2_PHMADH:    /* TODO: TX79_MMI2_PHMADH */
24772     case TX79_MMI2_PAND:      /* TODO: TX79_MMI2_PAND */
24773     case TX79_MMI2_PXOR:      /* TODO: TX79_MMI2_PXOR */
24774     case TX79_MMI2_PMSUBH:    /* TODO: TX79_MMI2_PMSUBH */
24775     case TX79_MMI2_PHMSBH:    /* TODO: TX79_MMI2_PHMSBH */
24776     case TX79_MMI2_PEXEH:     /* TODO: TX79_MMI2_PEXEH */
24777     case TX79_MMI2_PREVH:     /* TODO: TX79_MMI2_PREVH */
24778     case TX79_MMI2_PMULTH:    /* TODO: TX79_MMI2_PMULTH */
24779     case TX79_MMI2_PDIVBW:    /* TODO: TX79_MMI2_PDIVBW */
24780     case TX79_MMI2_PEXEW:     /* TODO: TX79_MMI2_PEXEW */
24781     case TX79_MMI2_PROT3W:    /* TODO: TX79_MMI2_PROT3W */
24782         generate_exception_end(ctx, EXCP_RI); /* TODO: TX79_MMI_CLASS_MMI2 */
24783         break;
24784     default:
24785         MIPS_INVAL("TX79 MMI class MMI2");
24786         generate_exception_end(ctx, EXCP_RI);
24787         break;
24788     }
24789 }
24790
24791 static void decode_tx79_mmi3(CPUMIPSState *env, DisasContext *ctx)
24792 {
24793     uint32_t opc = MASK_TX79_MMI3(ctx->opcode);
24794
24795     switch (opc) {
24796     case TX79_MMI3_PMADDUW:    /* TODO: TX79_MMI3_PMADDUW */
24797     case TX79_MMI3_PSRAVW:     /* TODO: TX79_MMI3_PSRAVW */
24798     case TX79_MMI3_PMTHI:      /* TODO: TX79_MMI3_PMTHI */
24799     case TX79_MMI3_PMTLO:      /* TODO: TX79_MMI3_PMTLO */
24800     case TX79_MMI3_PINTEH:     /* TODO: TX79_MMI3_PINTEH */
24801     case TX79_MMI3_PMULTUW:    /* TODO: TX79_MMI3_PMULTUW */
24802     case TX79_MMI3_PDIVUW:     /* TODO: TX79_MMI3_PDIVUW */
24803     case TX79_MMI3_PCPYUD:     /* TODO: TX79_MMI3_PCPYUD */
24804     case TX79_MMI3_POR:        /* TODO: TX79_MMI3_POR */
24805     case TX79_MMI3_PNOR:       /* TODO: TX79_MMI3_PNOR */
24806     case TX79_MMI3_PEXCH:      /* TODO: TX79_MMI3_PEXCH */
24807     case TX79_MMI3_PCPYH:      /* TODO: TX79_MMI3_PCPYH */
24808     case TX79_MMI3_PEXCW:      /* TODO: TX79_MMI3_PEXCW */
24809         generate_exception_end(ctx, EXCP_RI); /* TODO: TX79_MMI_CLASS_MMI3 */
24810         break;
24811     default:
24812         MIPS_INVAL("TX79 MMI class MMI3");
24813         generate_exception_end(ctx, EXCP_RI);
24814         break;
24815     }
24816 }
24817
24818 static void decode_tx79_mmi(CPUMIPSState *env, DisasContext *ctx)
24819 {
24820     uint32_t opc = MASK_TX79_MMI(ctx->opcode);
24821     int rs = extract32(ctx->opcode, 21, 5);
24822     int rt = extract32(ctx->opcode, 16, 5);
24823     int rd = extract32(ctx->opcode, 11, 5);
24824
24825     switch (opc) {
24826     case TX79_MMI_CLASS_MMI0:
24827         decode_tx79_mmi0(env, ctx);
24828         break;
24829     case TX79_MMI_CLASS_MMI1:
24830         decode_tx79_mmi1(env, ctx);
24831         break;
24832     case TX79_MMI_CLASS_MMI2:
24833         decode_tx79_mmi2(env, ctx);
24834         break;
24835     case TX79_MMI_CLASS_MMI3:
24836         decode_tx79_mmi3(env, ctx);
24837         break;
24838     case TX79_MMI_MULT1:
24839     case TX79_MMI_MULTU1:
24840         gen_mul_txx9(ctx, opc, rd, rs, rt);
24841         break;
24842     case TX79_MMI_DIV1:
24843     case TX79_MMI_DIVU1:
24844         gen_muldiv(ctx, opc, 1, rs, rt);
24845         break;
24846     case TX79_MMI_MTLO1:
24847     case TX79_MMI_MTHI1:
24848         gen_HILO(ctx, opc, 1, rs);
24849         break;
24850     case TX79_MMI_MFLO1:
24851     case TX79_MMI_MFHI1:
24852         gen_HILO(ctx, opc, 1, rd);
24853         break;
24854     case TX79_MMI_MADD:          /* TODO: TX79_MMI_MADD */
24855     case TX79_MMI_MADDU:         /* TODO: TX79_MMI_MADDU */
24856     case TX79_MMI_PLZCW:         /* TODO: TX79_MMI_PLZCW */
24857     case TX79_MMI_MADD1:         /* TODO: TX79_MMI_MADD1 */
24858     case TX79_MMI_MADDU1:        /* TODO: TX79_MMI_MADDU1 */
24859     case TX79_MMI_PMFHL:         /* TODO: TX79_MMI_PMFHL */
24860     case TX79_MMI_PMTHL:         /* TODO: TX79_MMI_PMTHL */
24861     case TX79_MMI_PSLLH:         /* TODO: TX79_MMI_PSLLH */
24862     case TX79_MMI_PSRLH:         /* TODO: TX79_MMI_PSRLH */
24863     case TX79_MMI_PSRAH:         /* TODO: TX79_MMI_PSRAH */
24864     case TX79_MMI_PSLLW:         /* TODO: TX79_MMI_PSLLW */
24865     case TX79_MMI_PSRLW:         /* TODO: TX79_MMI_PSRLW */
24866     case TX79_MMI_PSRAW:         /* TODO: TX79_MMI_PSRAW */
24867         generate_exception_end(ctx, EXCP_RI);    /* TODO: TX79_CLASS_MMI */
24868         break;
24869     default:
24870         MIPS_INVAL("TX79 MMI class");
24871         generate_exception_end(ctx, EXCP_RI);
24872         break;
24873     }
24874 }
24875
24876 static void decode_tx79_lq(CPUMIPSState *env, DisasContext *ctx)
24877 {
24878     generate_exception_end(ctx, EXCP_RI);    /* TODO: TX79_LQ */
24879 }
24880
24881 static void gen_tx79_sq(DisasContext *ctx, int base, int rt, int offset)
24882 {
24883     generate_exception_end(ctx, EXCP_RI);    /* TODO: TX79_SQ */
24884 }
24885
24886 /*
24887  * The TX79-specific instruction Store Quadword
24888  *
24889  * +--------+-------+-------+------------------------+
24890  * | 011111 |  base |   rt  |           offset       | SQ
24891  * +--------+-------+-------+------------------------+
24892  *      6       5       5                 16
24893  *
24894  * has the same opcode as the Read Hardware Register instruction
24895  *
24896  * +--------+-------+-------+-------+-------+--------+
24897  * | 011111 | 00000 |   rt  |   rd  | 00000 | 111011 | RDHWR
24898  * +--------+-------+-------+-------+-------+--------+
24899  *      6       5       5       5       5        6
24900  *
24901  * that is required, trapped and emulated by the Linux kernel. However, all
24902  * RDHWR encodings yield address error exceptions on the TX79 since the SQ
24903  * offset is odd. Therefore all valid SQ instructions can execute normally.
24904  * In user mode, QEMU must verify the upper and lower 11 bits to distinguish
24905  * between SQ and RDHWR, as the Linux kernel does.
24906  */
24907 static void decode_tx79_sq(CPUMIPSState *env, DisasContext *ctx)
24908 {
24909     int base = extract32(ctx->opcode, 21, 5);
24910     int rt = extract32(ctx->opcode, 16, 5);
24911     int offset = extract32(ctx->opcode, 0, 16);
24912
24913 #ifdef CONFIG_USER_ONLY
24914     uint32_t op1 = MASK_SPECIAL3(ctx->opcode);
24915     uint32_t op2 = extract32(ctx->opcode, 6, 5);
24916
24917     if (base == 0 && op2 == 0 && op1 == OPC_RDHWR) {
24918         int rd = extract32(ctx->opcode, 11, 5);
24919
24920         gen_rdhwr(ctx, rt, rd, 0);
24921         return;
24922     }
24923 #endif
24924
24925     gen_tx79_sq(ctx, base, rt, offset);
24926 }
24927
24928 static void decode_opc_special3(CPUMIPSState *env, DisasContext *ctx)
24929 {
24930     int rs, rt, rd, sa;
24931     uint32_t op1, op2;
24932     int16_t imm;
24933
24934     rs = (ctx->opcode >> 21) & 0x1f;
24935     rt = (ctx->opcode >> 16) & 0x1f;
24936     rd = (ctx->opcode >> 11) & 0x1f;
24937     sa = (ctx->opcode >> 6) & 0x1f;
24938     imm = sextract32(ctx->opcode, 7, 9);
24939
24940     op1 = MASK_SPECIAL3(ctx->opcode);
24941
24942     /*
24943      * EVA loads and stores overlap Loongson 2E instructions decoded by
24944      * decode_opc_special3_legacy(), so be careful to allow their decoding when
24945      * EVA is absent.
24946      */
24947     if (ctx->eva) {
24948         switch (op1) {
24949         case OPC_LWLE:
24950         case OPC_LWRE:
24951             check_insn_opc_removed(ctx, ISA_MIPS32R6);
24952             /* fall through */
24953         case OPC_LBUE:
24954         case OPC_LHUE:
24955         case OPC_LBE:
24956         case OPC_LHE:
24957         case OPC_LLE:
24958         case OPC_LWE:
24959             check_cp0_enabled(ctx);
24960             gen_ld(ctx, op1, rt, rs, imm);
24961             return;
24962         case OPC_SWLE:
24963         case OPC_SWRE:
24964             check_insn_opc_removed(ctx, ISA_MIPS32R6);
24965             /* fall through */
24966         case OPC_SBE:
24967         case OPC_SHE:
24968         case OPC_SWE:
24969             check_cp0_enabled(ctx);
24970             gen_st(ctx, op1, rt, rs, imm);
24971             return;
24972         case OPC_SCE:
24973             check_cp0_enabled(ctx);
24974             gen_st_cond(ctx, op1, rt, rs, imm);
24975             return;
24976         case OPC_CACHEE:
24977             check_cp0_enabled(ctx);
24978             if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
24979                 gen_cache_operation(ctx, rt, rs, imm);
24980             }
24981             /* Treat as NOP. */
24982             return;
24983         case OPC_PREFE:
24984             check_cp0_enabled(ctx);
24985             /* Treat as NOP. */
24986             return;
24987         }
24988     }
24989
24990     switch (op1) {
24991     case OPC_EXT:
24992     case OPC_INS:
24993         check_insn(ctx, ISA_MIPS32R2);
24994         gen_bitops(ctx, op1, rt, rs, sa, rd);
24995         break;
24996     case OPC_BSHFL:
24997         op2 = MASK_BSHFL(ctx->opcode);
24998         switch (op2) {
24999         case OPC_ALIGN:
25000         case OPC_ALIGN_1:
25001         case OPC_ALIGN_2:
25002         case OPC_ALIGN_3:
25003         case OPC_BITSWAP:
25004             check_insn(ctx, ISA_MIPS32R6);
25005             decode_opc_special3_r6(env, ctx);
25006             break;
25007         default:
25008             check_insn(ctx, ISA_MIPS32R2);
25009             gen_bshfl(ctx, op2, rt, rd);
25010             break;
25011         }
25012         break;
25013 #if defined(TARGET_MIPS64)
25014     case OPC_DEXTM:
25015     case OPC_DEXTU:
25016     case OPC_DEXT:
25017     case OPC_DINSM:
25018     case OPC_DINSU:
25019     case OPC_DINS:
25020         check_insn(ctx, ISA_MIPS64R2);
25021         check_mips_64(ctx);
25022         gen_bitops(ctx, op1, rt, rs, sa, rd);
25023         break;
25024     case OPC_DBSHFL:
25025         op2 = MASK_DBSHFL(ctx->opcode);
25026         switch (op2) {
25027         case OPC_DALIGN:
25028         case OPC_DALIGN_1:
25029         case OPC_DALIGN_2:
25030         case OPC_DALIGN_3:
25031         case OPC_DALIGN_4:
25032         case OPC_DALIGN_5:
25033         case OPC_DALIGN_6:
25034         case OPC_DALIGN_7:
25035         case OPC_DBITSWAP:
25036             check_insn(ctx, ISA_MIPS32R6);
25037             decode_opc_special3_r6(env, ctx);
25038             break;
25039         default:
25040             check_insn(ctx, ISA_MIPS64R2);
25041             check_mips_64(ctx);
25042             op2 = MASK_DBSHFL(ctx->opcode);
25043             gen_bshfl(ctx, op2, rt, rd);
25044             break;
25045         }
25046         break;
25047 #endif
25048     case OPC_RDHWR:
25049         gen_rdhwr(ctx, rt, rd, extract32(ctx->opcode, 6, 3));
25050         break;
25051     case OPC_FORK:
25052         check_mt(ctx);
25053         {
25054             TCGv t0 = tcg_temp_new();
25055             TCGv t1 = tcg_temp_new();
25056
25057             gen_load_gpr(t0, rt);
25058             gen_load_gpr(t1, rs);
25059             gen_helper_fork(t0, t1);
25060             tcg_temp_free(t0);
25061             tcg_temp_free(t1);
25062         }
25063         break;
25064     case OPC_YIELD:
25065         check_mt(ctx);
25066         {
25067             TCGv t0 = tcg_temp_new();
25068
25069             gen_load_gpr(t0, rs);
25070             gen_helper_yield(t0, cpu_env, t0);
25071             gen_store_gpr(t0, rd);
25072             tcg_temp_free(t0);
25073         }
25074         break;
25075     default:
25076         if (ctx->insn_flags & ISA_MIPS32R6) {
25077             decode_opc_special3_r6(env, ctx);
25078         } else {
25079             decode_opc_special3_legacy(env, ctx);
25080         }
25081     }
25082 }
25083
25084 /* MIPS SIMD Architecture (MSA)  */
25085 static inline int check_msa_access(DisasContext *ctx)
25086 {
25087     if (unlikely((ctx->hflags & MIPS_HFLAG_FPU) &&
25088                  !(ctx->hflags & MIPS_HFLAG_F64))) {
25089         generate_exception_end(ctx, EXCP_RI);
25090         return 0;
25091     }
25092
25093     if (unlikely(!(ctx->hflags & MIPS_HFLAG_MSA))) {
25094         if (ctx->insn_flags & ASE_MSA) {
25095             generate_exception_end(ctx, EXCP_MSADIS);
25096             return 0;
25097         } else {
25098             generate_exception_end(ctx, EXCP_RI);
25099             return 0;
25100         }
25101     }
25102     return 1;
25103 }
25104
25105 static void gen_check_zero_element(TCGv tresult, uint8_t df, uint8_t wt)
25106 {
25107     /* generates tcg ops to check if any element is 0 */
25108     /* Note this function only works with MSA_WRLEN = 128 */
25109     uint64_t eval_zero_or_big = 0;
25110     uint64_t eval_big = 0;
25111     TCGv_i64 t0 = tcg_temp_new_i64();
25112     TCGv_i64 t1 = tcg_temp_new_i64();
25113     switch (df) {
25114     case DF_BYTE:
25115         eval_zero_or_big = 0x0101010101010101ULL;
25116         eval_big = 0x8080808080808080ULL;
25117         break;
25118     case DF_HALF:
25119         eval_zero_or_big = 0x0001000100010001ULL;
25120         eval_big = 0x8000800080008000ULL;
25121         break;
25122     case DF_WORD:
25123         eval_zero_or_big = 0x0000000100000001ULL;
25124         eval_big = 0x8000000080000000ULL;
25125         break;
25126     case DF_DOUBLE:
25127         eval_zero_or_big = 0x0000000000000001ULL;
25128         eval_big = 0x8000000000000000ULL;
25129         break;
25130     }
25131     tcg_gen_subi_i64(t0, msa_wr_d[wt<<1], eval_zero_or_big);
25132     tcg_gen_andc_i64(t0, t0, msa_wr_d[wt<<1]);
25133     tcg_gen_andi_i64(t0, t0, eval_big);
25134     tcg_gen_subi_i64(t1, msa_wr_d[(wt<<1)+1], eval_zero_or_big);
25135     tcg_gen_andc_i64(t1, t1, msa_wr_d[(wt<<1)+1]);
25136     tcg_gen_andi_i64(t1, t1, eval_big);
25137     tcg_gen_or_i64(t0, t0, t1);
25138     /* if all bits are zero then all elements are not zero */
25139     /* if some bit is non-zero then some element is zero */
25140     tcg_gen_setcondi_i64(TCG_COND_NE, t0, t0, 0);
25141     tcg_gen_trunc_i64_tl(tresult, t0);
25142     tcg_temp_free_i64(t0);
25143     tcg_temp_free_i64(t1);
25144 }
25145
25146 static void gen_msa_branch(CPUMIPSState *env, DisasContext *ctx, uint32_t op1)
25147 {
25148     uint8_t df = (ctx->opcode >> 21) & 0x3;
25149     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
25150     int64_t s16 = (int16_t)ctx->opcode;
25151
25152     check_msa_access(ctx);
25153
25154     if (ctx->hflags & MIPS_HFLAG_BMASK) {
25155         generate_exception_end(ctx, EXCP_RI);
25156         return;
25157     }
25158     switch (op1) {
25159     case OPC_BZ_V:
25160     case OPC_BNZ_V:
25161         {
25162             TCGv_i64 t0 = tcg_temp_new_i64();
25163             tcg_gen_or_i64(t0, msa_wr_d[wt<<1], msa_wr_d[(wt<<1)+1]);
25164             tcg_gen_setcondi_i64((op1 == OPC_BZ_V) ?
25165                     TCG_COND_EQ : TCG_COND_NE, t0, t0, 0);
25166             tcg_gen_trunc_i64_tl(bcond, t0);
25167             tcg_temp_free_i64(t0);
25168         }
25169         break;
25170     case OPC_BZ_B:
25171     case OPC_BZ_H:
25172     case OPC_BZ_W:
25173     case OPC_BZ_D:
25174         gen_check_zero_element(bcond, df, wt);
25175         break;
25176     case OPC_BNZ_B:
25177     case OPC_BNZ_H:
25178     case OPC_BNZ_W:
25179     case OPC_BNZ_D:
25180         gen_check_zero_element(bcond, df, wt);
25181         tcg_gen_setcondi_tl(TCG_COND_EQ, bcond, bcond, 0);
25182         break;
25183     }
25184
25185     ctx->btarget = ctx->base.pc_next + (s16 << 2) + 4;
25186
25187     ctx->hflags |= MIPS_HFLAG_BC;
25188     ctx->hflags |= MIPS_HFLAG_BDS32;
25189 }
25190
25191 static void gen_msa_i8(CPUMIPSState *env, DisasContext *ctx)
25192 {
25193 #define MASK_MSA_I8(op)    (MASK_MSA_MINOR(op) | (op & (0x03 << 24)))
25194     uint8_t i8 = (ctx->opcode >> 16) & 0xff;
25195     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25196     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25197
25198     TCGv_i32 twd = tcg_const_i32(wd);
25199     TCGv_i32 tws = tcg_const_i32(ws);
25200     TCGv_i32 ti8 = tcg_const_i32(i8);
25201
25202     switch (MASK_MSA_I8(ctx->opcode)) {
25203     case OPC_ANDI_B:
25204         gen_helper_msa_andi_b(cpu_env, twd, tws, ti8);
25205         break;
25206     case OPC_ORI_B:
25207         gen_helper_msa_ori_b(cpu_env, twd, tws, ti8);
25208         break;
25209     case OPC_NORI_B:
25210         gen_helper_msa_nori_b(cpu_env, twd, tws, ti8);
25211         break;
25212     case OPC_XORI_B:
25213         gen_helper_msa_xori_b(cpu_env, twd, tws, ti8);
25214         break;
25215     case OPC_BMNZI_B:
25216         gen_helper_msa_bmnzi_b(cpu_env, twd, tws, ti8);
25217         break;
25218     case OPC_BMZI_B:
25219         gen_helper_msa_bmzi_b(cpu_env, twd, tws, ti8);
25220         break;
25221     case OPC_BSELI_B:
25222         gen_helper_msa_bseli_b(cpu_env, twd, tws, ti8);
25223         break;
25224     case OPC_SHF_B:
25225     case OPC_SHF_H:
25226     case OPC_SHF_W:
25227         {
25228             uint8_t df = (ctx->opcode >> 24) & 0x3;
25229             if (df == DF_DOUBLE) {
25230                 generate_exception_end(ctx, EXCP_RI);
25231             } else {
25232                 TCGv_i32 tdf = tcg_const_i32(df);
25233                 gen_helper_msa_shf_df(cpu_env, tdf, twd, tws, ti8);
25234                 tcg_temp_free_i32(tdf);
25235             }
25236         }
25237         break;
25238     default:
25239         MIPS_INVAL("MSA instruction");
25240         generate_exception_end(ctx, EXCP_RI);
25241         break;
25242     }
25243
25244     tcg_temp_free_i32(twd);
25245     tcg_temp_free_i32(tws);
25246     tcg_temp_free_i32(ti8);
25247 }
25248
25249 static void gen_msa_i5(CPUMIPSState *env, DisasContext *ctx)
25250 {
25251 #define MASK_MSA_I5(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
25252     uint8_t df = (ctx->opcode >> 21) & 0x3;
25253     int8_t s5 = (int8_t) sextract32(ctx->opcode, 16, 5);
25254     uint8_t u5 = (ctx->opcode >> 16) & 0x1f;
25255     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25256     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25257
25258     TCGv_i32 tdf = tcg_const_i32(df);
25259     TCGv_i32 twd = tcg_const_i32(wd);
25260     TCGv_i32 tws = tcg_const_i32(ws);
25261     TCGv_i32 timm = tcg_temp_new_i32();
25262     tcg_gen_movi_i32(timm, u5);
25263
25264     switch (MASK_MSA_I5(ctx->opcode)) {
25265     case OPC_ADDVI_df:
25266         gen_helper_msa_addvi_df(cpu_env, tdf, twd, tws, timm);
25267         break;
25268     case OPC_SUBVI_df:
25269         gen_helper_msa_subvi_df(cpu_env, tdf, twd, tws, timm);
25270         break;
25271     case OPC_MAXI_S_df:
25272         tcg_gen_movi_i32(timm, s5);
25273         gen_helper_msa_maxi_s_df(cpu_env, tdf, twd, tws, timm);
25274         break;
25275     case OPC_MAXI_U_df:
25276         gen_helper_msa_maxi_u_df(cpu_env, tdf, twd, tws, timm);
25277         break;
25278     case OPC_MINI_S_df:
25279         tcg_gen_movi_i32(timm, s5);
25280         gen_helper_msa_mini_s_df(cpu_env, tdf, twd, tws, timm);
25281         break;
25282     case OPC_MINI_U_df:
25283         gen_helper_msa_mini_u_df(cpu_env, tdf, twd, tws, timm);
25284         break;
25285     case OPC_CEQI_df:
25286         tcg_gen_movi_i32(timm, s5);
25287         gen_helper_msa_ceqi_df(cpu_env, tdf, twd, tws, timm);
25288         break;
25289     case OPC_CLTI_S_df:
25290         tcg_gen_movi_i32(timm, s5);
25291         gen_helper_msa_clti_s_df(cpu_env, tdf, twd, tws, timm);
25292         break;
25293     case OPC_CLTI_U_df:
25294         gen_helper_msa_clti_u_df(cpu_env, tdf, twd, tws, timm);
25295         break;
25296     case OPC_CLEI_S_df:
25297         tcg_gen_movi_i32(timm, s5);
25298         gen_helper_msa_clei_s_df(cpu_env, tdf, twd, tws, timm);
25299         break;
25300     case OPC_CLEI_U_df:
25301         gen_helper_msa_clei_u_df(cpu_env, tdf, twd, tws, timm);
25302         break;
25303     case OPC_LDI_df:
25304         {
25305             int32_t s10 = sextract32(ctx->opcode, 11, 10);
25306             tcg_gen_movi_i32(timm, s10);
25307             gen_helper_msa_ldi_df(cpu_env, tdf, twd, timm);
25308         }
25309         break;
25310     default:
25311         MIPS_INVAL("MSA instruction");
25312         generate_exception_end(ctx, EXCP_RI);
25313         break;
25314     }
25315
25316     tcg_temp_free_i32(tdf);
25317     tcg_temp_free_i32(twd);
25318     tcg_temp_free_i32(tws);
25319     tcg_temp_free_i32(timm);
25320 }
25321
25322 static void gen_msa_bit(CPUMIPSState *env, DisasContext *ctx)
25323 {
25324 #define MASK_MSA_BIT(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
25325     uint8_t dfm = (ctx->opcode >> 16) & 0x7f;
25326     uint32_t df = 0, m = 0;
25327     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25328     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25329
25330     TCGv_i32 tdf;
25331     TCGv_i32 tm;
25332     TCGv_i32 twd;
25333     TCGv_i32 tws;
25334
25335     if ((dfm & 0x40) == 0x00) {
25336         m = dfm & 0x3f;
25337         df = DF_DOUBLE;
25338     } else if ((dfm & 0x60) == 0x40) {
25339         m = dfm & 0x1f;
25340         df = DF_WORD;
25341     } else if ((dfm & 0x70) == 0x60) {
25342         m = dfm & 0x0f;
25343         df = DF_HALF;
25344     } else if ((dfm & 0x78) == 0x70) {
25345         m = dfm & 0x7;
25346         df = DF_BYTE;
25347     } else {
25348         generate_exception_end(ctx, EXCP_RI);
25349         return;
25350     }
25351
25352     tdf = tcg_const_i32(df);
25353     tm  = tcg_const_i32(m);
25354     twd = tcg_const_i32(wd);
25355     tws = tcg_const_i32(ws);
25356
25357     switch (MASK_MSA_BIT(ctx->opcode)) {
25358     case OPC_SLLI_df:
25359         gen_helper_msa_slli_df(cpu_env, tdf, twd, tws, tm);
25360         break;
25361     case OPC_SRAI_df:
25362         gen_helper_msa_srai_df(cpu_env, tdf, twd, tws, tm);
25363         break;
25364     case OPC_SRLI_df:
25365         gen_helper_msa_srli_df(cpu_env, tdf, twd, tws, tm);
25366         break;
25367     case OPC_BCLRI_df:
25368         gen_helper_msa_bclri_df(cpu_env, tdf, twd, tws, tm);
25369         break;
25370     case OPC_BSETI_df:
25371         gen_helper_msa_bseti_df(cpu_env, tdf, twd, tws, tm);
25372         break;
25373     case OPC_BNEGI_df:
25374         gen_helper_msa_bnegi_df(cpu_env, tdf, twd, tws, tm);
25375         break;
25376     case OPC_BINSLI_df:
25377         gen_helper_msa_binsli_df(cpu_env, tdf, twd, tws, tm);
25378         break;
25379     case OPC_BINSRI_df:
25380         gen_helper_msa_binsri_df(cpu_env, tdf, twd, tws, tm);
25381         break;
25382     case OPC_SAT_S_df:
25383         gen_helper_msa_sat_s_df(cpu_env, tdf, twd, tws, tm);
25384         break;
25385     case OPC_SAT_U_df:
25386         gen_helper_msa_sat_u_df(cpu_env, tdf, twd, tws, tm);
25387         break;
25388     case OPC_SRARI_df:
25389         gen_helper_msa_srari_df(cpu_env, tdf, twd, tws, tm);
25390         break;
25391     case OPC_SRLRI_df:
25392         gen_helper_msa_srlri_df(cpu_env, tdf, twd, tws, tm);
25393         break;
25394     default:
25395         MIPS_INVAL("MSA instruction");
25396         generate_exception_end(ctx, EXCP_RI);
25397         break;
25398     }
25399
25400     tcg_temp_free_i32(tdf);
25401     tcg_temp_free_i32(tm);
25402     tcg_temp_free_i32(twd);
25403     tcg_temp_free_i32(tws);
25404 }
25405
25406 static void gen_msa_3r(CPUMIPSState *env, DisasContext *ctx)
25407 {
25408 #define MASK_MSA_3R(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
25409     uint8_t df = (ctx->opcode >> 21) & 0x3;
25410     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
25411     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25412     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25413
25414     TCGv_i32 tdf = tcg_const_i32(df);
25415     TCGv_i32 twd = tcg_const_i32(wd);
25416     TCGv_i32 tws = tcg_const_i32(ws);
25417     TCGv_i32 twt = tcg_const_i32(wt);
25418
25419     switch (MASK_MSA_3R(ctx->opcode)) {
25420     case OPC_SLL_df:
25421         gen_helper_msa_sll_df(cpu_env, tdf, twd, tws, twt);
25422         break;
25423     case OPC_ADDV_df:
25424         gen_helper_msa_addv_df(cpu_env, tdf, twd, tws, twt);
25425         break;
25426     case OPC_CEQ_df:
25427         gen_helper_msa_ceq_df(cpu_env, tdf, twd, tws, twt);
25428         break;
25429     case OPC_ADD_A_df:
25430         gen_helper_msa_add_a_df(cpu_env, tdf, twd, tws, twt);
25431         break;
25432     case OPC_SUBS_S_df:
25433         gen_helper_msa_subs_s_df(cpu_env, tdf, twd, tws, twt);
25434         break;
25435     case OPC_MULV_df:
25436         gen_helper_msa_mulv_df(cpu_env, tdf, twd, tws, twt);
25437         break;
25438     case OPC_SLD_df:
25439         gen_helper_msa_sld_df(cpu_env, tdf, twd, tws, twt);
25440         break;
25441     case OPC_VSHF_df:
25442         gen_helper_msa_vshf_df(cpu_env, tdf, twd, tws, twt);
25443         break;
25444     case OPC_SRA_df:
25445         gen_helper_msa_sra_df(cpu_env, tdf, twd, tws, twt);
25446         break;
25447     case OPC_SUBV_df:
25448         gen_helper_msa_subv_df(cpu_env, tdf, twd, tws, twt);
25449         break;
25450     case OPC_ADDS_A_df:
25451         gen_helper_msa_adds_a_df(cpu_env, tdf, twd, tws, twt);
25452         break;
25453     case OPC_SUBS_U_df:
25454         gen_helper_msa_subs_u_df(cpu_env, tdf, twd, tws, twt);
25455         break;
25456     case OPC_MADDV_df:
25457         gen_helper_msa_maddv_df(cpu_env, tdf, twd, tws, twt);
25458         break;
25459     case OPC_SPLAT_df:
25460         gen_helper_msa_splat_df(cpu_env, tdf, twd, tws, twt);
25461         break;
25462     case OPC_SRAR_df:
25463         gen_helper_msa_srar_df(cpu_env, tdf, twd, tws, twt);
25464         break;
25465     case OPC_SRL_df:
25466         gen_helper_msa_srl_df(cpu_env, tdf, twd, tws, twt);
25467         break;
25468     case OPC_MAX_S_df:
25469         gen_helper_msa_max_s_df(cpu_env, tdf, twd, tws, twt);
25470         break;
25471     case OPC_CLT_S_df:
25472         gen_helper_msa_clt_s_df(cpu_env, tdf, twd, tws, twt);
25473         break;
25474     case OPC_ADDS_S_df:
25475         gen_helper_msa_adds_s_df(cpu_env, tdf, twd, tws, twt);
25476         break;
25477     case OPC_SUBSUS_U_df:
25478         gen_helper_msa_subsus_u_df(cpu_env, tdf, twd, tws, twt);
25479         break;
25480     case OPC_MSUBV_df:
25481         gen_helper_msa_msubv_df(cpu_env, tdf, twd, tws, twt);
25482         break;
25483     case OPC_PCKEV_df:
25484         gen_helper_msa_pckev_df(cpu_env, tdf, twd, tws, twt);
25485         break;
25486     case OPC_SRLR_df:
25487         gen_helper_msa_srlr_df(cpu_env, tdf, twd, tws, twt);
25488         break;
25489     case OPC_BCLR_df:
25490         gen_helper_msa_bclr_df(cpu_env, tdf, twd, tws, twt);
25491         break;
25492     case OPC_MAX_U_df:
25493         gen_helper_msa_max_u_df(cpu_env, tdf, twd, tws, twt);
25494         break;
25495     case OPC_CLT_U_df:
25496         gen_helper_msa_clt_u_df(cpu_env, tdf, twd, tws, twt);
25497         break;
25498     case OPC_ADDS_U_df:
25499         gen_helper_msa_adds_u_df(cpu_env, tdf, twd, tws, twt);
25500         break;
25501     case OPC_SUBSUU_S_df:
25502         gen_helper_msa_subsuu_s_df(cpu_env, tdf, twd, tws, twt);
25503         break;
25504     case OPC_PCKOD_df:
25505         gen_helper_msa_pckod_df(cpu_env, tdf, twd, tws, twt);
25506         break;
25507     case OPC_BSET_df:
25508         gen_helper_msa_bset_df(cpu_env, tdf, twd, tws, twt);
25509         break;
25510     case OPC_MIN_S_df:
25511         gen_helper_msa_min_s_df(cpu_env, tdf, twd, tws, twt);
25512         break;
25513     case OPC_CLE_S_df:
25514         gen_helper_msa_cle_s_df(cpu_env, tdf, twd, tws, twt);
25515         break;
25516     case OPC_AVE_S_df:
25517         gen_helper_msa_ave_s_df(cpu_env, tdf, twd, tws, twt);
25518         break;
25519     case OPC_ASUB_S_df:
25520         gen_helper_msa_asub_s_df(cpu_env, tdf, twd, tws, twt);
25521         break;
25522     case OPC_DIV_S_df:
25523         gen_helper_msa_div_s_df(cpu_env, tdf, twd, tws, twt);
25524         break;
25525     case OPC_ILVL_df:
25526         gen_helper_msa_ilvl_df(cpu_env, tdf, twd, tws, twt);
25527         break;
25528     case OPC_BNEG_df:
25529         gen_helper_msa_bneg_df(cpu_env, tdf, twd, tws, twt);
25530         break;
25531     case OPC_MIN_U_df:
25532         gen_helper_msa_min_u_df(cpu_env, tdf, twd, tws, twt);
25533         break;
25534     case OPC_CLE_U_df:
25535         gen_helper_msa_cle_u_df(cpu_env, tdf, twd, tws, twt);
25536         break;
25537     case OPC_AVE_U_df:
25538         gen_helper_msa_ave_u_df(cpu_env, tdf, twd, tws, twt);
25539         break;
25540     case OPC_ASUB_U_df:
25541         gen_helper_msa_asub_u_df(cpu_env, tdf, twd, tws, twt);
25542         break;
25543     case OPC_DIV_U_df:
25544         gen_helper_msa_div_u_df(cpu_env, tdf, twd, tws, twt);
25545         break;
25546     case OPC_ILVR_df:
25547         gen_helper_msa_ilvr_df(cpu_env, tdf, twd, tws, twt);
25548         break;
25549     case OPC_BINSL_df:
25550         gen_helper_msa_binsl_df(cpu_env, tdf, twd, tws, twt);
25551         break;
25552     case OPC_MAX_A_df:
25553         gen_helper_msa_max_a_df(cpu_env, tdf, twd, tws, twt);
25554         break;
25555     case OPC_AVER_S_df:
25556         gen_helper_msa_aver_s_df(cpu_env, tdf, twd, tws, twt);
25557         break;
25558     case OPC_MOD_S_df:
25559         gen_helper_msa_mod_s_df(cpu_env, tdf, twd, tws, twt);
25560         break;
25561     case OPC_ILVEV_df:
25562         gen_helper_msa_ilvev_df(cpu_env, tdf, twd, tws, twt);
25563         break;
25564     case OPC_BINSR_df:
25565         gen_helper_msa_binsr_df(cpu_env, tdf, twd, tws, twt);
25566         break;
25567     case OPC_MIN_A_df:
25568         gen_helper_msa_min_a_df(cpu_env, tdf, twd, tws, twt);
25569         break;
25570     case OPC_AVER_U_df:
25571         gen_helper_msa_aver_u_df(cpu_env, tdf, twd, tws, twt);
25572         break;
25573     case OPC_MOD_U_df:
25574         gen_helper_msa_mod_u_df(cpu_env, tdf, twd, tws, twt);
25575         break;
25576     case OPC_ILVOD_df:
25577         gen_helper_msa_ilvod_df(cpu_env, tdf, twd, tws, twt);
25578         break;
25579
25580     case OPC_DOTP_S_df:
25581     case OPC_DOTP_U_df:
25582     case OPC_DPADD_S_df:
25583     case OPC_DPADD_U_df:
25584     case OPC_DPSUB_S_df:
25585     case OPC_HADD_S_df:
25586     case OPC_DPSUB_U_df:
25587     case OPC_HADD_U_df:
25588     case OPC_HSUB_S_df:
25589     case OPC_HSUB_U_df:
25590         if (df == DF_BYTE) {
25591             generate_exception_end(ctx, EXCP_RI);
25592             break;
25593         }
25594         switch (MASK_MSA_3R(ctx->opcode)) {
25595         case OPC_DOTP_S_df:
25596             gen_helper_msa_dotp_s_df(cpu_env, tdf, twd, tws, twt);
25597             break;
25598         case OPC_DOTP_U_df:
25599             gen_helper_msa_dotp_u_df(cpu_env, tdf, twd, tws, twt);
25600             break;
25601         case OPC_DPADD_S_df:
25602             gen_helper_msa_dpadd_s_df(cpu_env, tdf, twd, tws, twt);
25603             break;
25604         case OPC_DPADD_U_df:
25605             gen_helper_msa_dpadd_u_df(cpu_env, tdf, twd, tws, twt);
25606             break;
25607         case OPC_DPSUB_S_df:
25608             gen_helper_msa_dpsub_s_df(cpu_env, tdf, twd, tws, twt);
25609             break;
25610         case OPC_HADD_S_df:
25611             gen_helper_msa_hadd_s_df(cpu_env, tdf, twd, tws, twt);
25612             break;
25613         case OPC_DPSUB_U_df:
25614             gen_helper_msa_dpsub_u_df(cpu_env, tdf, twd, tws, twt);
25615             break;
25616         case OPC_HADD_U_df:
25617             gen_helper_msa_hadd_u_df(cpu_env, tdf, twd, tws, twt);
25618             break;
25619         case OPC_HSUB_S_df:
25620             gen_helper_msa_hsub_s_df(cpu_env, tdf, twd, tws, twt);
25621             break;
25622         case OPC_HSUB_U_df:
25623             gen_helper_msa_hsub_u_df(cpu_env, tdf, twd, tws, twt);
25624             break;
25625         }
25626         break;
25627     default:
25628         MIPS_INVAL("MSA instruction");
25629         generate_exception_end(ctx, EXCP_RI);
25630         break;
25631     }
25632     tcg_temp_free_i32(twd);
25633     tcg_temp_free_i32(tws);
25634     tcg_temp_free_i32(twt);
25635     tcg_temp_free_i32(tdf);
25636 }
25637
25638 static void gen_msa_elm_3e(CPUMIPSState *env, DisasContext *ctx)
25639 {
25640 #define MASK_MSA_ELM_DF3E(op)   (MASK_MSA_MINOR(op) | (op & (0x3FF << 16)))
25641     uint8_t source = (ctx->opcode >> 11) & 0x1f;
25642     uint8_t dest = (ctx->opcode >> 6) & 0x1f;
25643     TCGv telm = tcg_temp_new();
25644     TCGv_i32 tsr = tcg_const_i32(source);
25645     TCGv_i32 tdt = tcg_const_i32(dest);
25646
25647     switch (MASK_MSA_ELM_DF3E(ctx->opcode)) {
25648     case OPC_CTCMSA:
25649         gen_load_gpr(telm, source);
25650         gen_helper_msa_ctcmsa(cpu_env, telm, tdt);
25651         break;
25652     case OPC_CFCMSA:
25653         gen_helper_msa_cfcmsa(telm, cpu_env, tsr);
25654         gen_store_gpr(telm, dest);
25655         break;
25656     case OPC_MOVE_V:
25657         gen_helper_msa_move_v(cpu_env, tdt, tsr);
25658         break;
25659     default:
25660         MIPS_INVAL("MSA instruction");
25661         generate_exception_end(ctx, EXCP_RI);
25662         break;
25663     }
25664
25665     tcg_temp_free(telm);
25666     tcg_temp_free_i32(tdt);
25667     tcg_temp_free_i32(tsr);
25668 }
25669
25670 static void gen_msa_elm_df(CPUMIPSState *env, DisasContext *ctx, uint32_t df,
25671         uint32_t n)
25672 {
25673 #define MASK_MSA_ELM(op)    (MASK_MSA_MINOR(op) | (op & (0xf << 22)))
25674     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25675     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25676
25677     TCGv_i32 tws = tcg_const_i32(ws);
25678     TCGv_i32 twd = tcg_const_i32(wd);
25679     TCGv_i32 tn  = tcg_const_i32(n);
25680     TCGv_i32 tdf = tcg_const_i32(df);
25681
25682     switch (MASK_MSA_ELM(ctx->opcode)) {
25683     case OPC_SLDI_df:
25684         gen_helper_msa_sldi_df(cpu_env, tdf, twd, tws, tn);
25685         break;
25686     case OPC_SPLATI_df:
25687         gen_helper_msa_splati_df(cpu_env, tdf, twd, tws, tn);
25688         break;
25689     case OPC_INSVE_df:
25690         gen_helper_msa_insve_df(cpu_env, tdf, twd, tws, tn);
25691         break;
25692     case OPC_COPY_S_df:
25693     case OPC_COPY_U_df:
25694     case OPC_INSERT_df:
25695 #if !defined(TARGET_MIPS64)
25696         /* Double format valid only for MIPS64 */
25697         if (df == DF_DOUBLE) {
25698             generate_exception_end(ctx, EXCP_RI);
25699             break;
25700         }
25701 #endif
25702         switch (MASK_MSA_ELM(ctx->opcode)) {
25703         case OPC_COPY_S_df:
25704             if (likely(wd != 0)) {
25705                 gen_helper_msa_copy_s_df(cpu_env, tdf, twd, tws, tn);
25706             }
25707             break;
25708         case OPC_COPY_U_df:
25709             if (likely(wd != 0)) {
25710                 gen_helper_msa_copy_u_df(cpu_env, tdf, twd, tws, tn);
25711             }
25712             break;
25713         case OPC_INSERT_df:
25714             gen_helper_msa_insert_df(cpu_env, tdf, twd, tws, tn);
25715             break;
25716         }
25717         break;
25718     default:
25719         MIPS_INVAL("MSA instruction");
25720         generate_exception_end(ctx, EXCP_RI);
25721     }
25722     tcg_temp_free_i32(twd);
25723     tcg_temp_free_i32(tws);
25724     tcg_temp_free_i32(tn);
25725     tcg_temp_free_i32(tdf);
25726 }
25727
25728 static void gen_msa_elm(CPUMIPSState *env, DisasContext *ctx)
25729 {
25730     uint8_t dfn = (ctx->opcode >> 16) & 0x3f;
25731     uint32_t df = 0, n = 0;
25732
25733     if ((dfn & 0x30) == 0x00) {
25734         n = dfn & 0x0f;
25735         df = DF_BYTE;
25736     } else if ((dfn & 0x38) == 0x20) {
25737         n = dfn & 0x07;
25738         df = DF_HALF;
25739     } else if ((dfn & 0x3c) == 0x30) {
25740         n = dfn & 0x03;
25741         df = DF_WORD;
25742     } else if ((dfn & 0x3e) == 0x38) {
25743         n = dfn & 0x01;
25744         df = DF_DOUBLE;
25745     } else if (dfn == 0x3E) {
25746         /* CTCMSA, CFCMSA, MOVE.V */
25747         gen_msa_elm_3e(env, ctx);
25748         return;
25749     } else {
25750         generate_exception_end(ctx, EXCP_RI);
25751         return;
25752     }
25753
25754     gen_msa_elm_df(env, ctx, df, n);
25755 }
25756
25757 static void gen_msa_3rf(CPUMIPSState *env, DisasContext *ctx)
25758 {
25759 #define MASK_MSA_3RF(op)    (MASK_MSA_MINOR(op) | (op & (0xf << 22)))
25760     uint8_t df = (ctx->opcode >> 21) & 0x1;
25761     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
25762     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25763     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25764
25765     TCGv_i32 twd = tcg_const_i32(wd);
25766     TCGv_i32 tws = tcg_const_i32(ws);
25767     TCGv_i32 twt = tcg_const_i32(wt);
25768     TCGv_i32 tdf = tcg_temp_new_i32();
25769
25770     /* adjust df value for floating-point instruction */
25771     tcg_gen_movi_i32(tdf, df + 2);
25772
25773     switch (MASK_MSA_3RF(ctx->opcode)) {
25774     case OPC_FCAF_df:
25775         gen_helper_msa_fcaf_df(cpu_env, tdf, twd, tws, twt);
25776         break;
25777     case OPC_FADD_df:
25778         gen_helper_msa_fadd_df(cpu_env, tdf, twd, tws, twt);
25779         break;
25780     case OPC_FCUN_df:
25781         gen_helper_msa_fcun_df(cpu_env, tdf, twd, tws, twt);
25782         break;
25783     case OPC_FSUB_df:
25784         gen_helper_msa_fsub_df(cpu_env, tdf, twd, tws, twt);
25785         break;
25786     case OPC_FCOR_df:
25787         gen_helper_msa_fcor_df(cpu_env, tdf, twd, tws, twt);
25788         break;
25789     case OPC_FCEQ_df:
25790         gen_helper_msa_fceq_df(cpu_env, tdf, twd, tws, twt);
25791         break;
25792     case OPC_FMUL_df:
25793         gen_helper_msa_fmul_df(cpu_env, tdf, twd, tws, twt);
25794         break;
25795     case OPC_FCUNE_df:
25796         gen_helper_msa_fcune_df(cpu_env, tdf, twd, tws, twt);
25797         break;
25798     case OPC_FCUEQ_df:
25799         gen_helper_msa_fcueq_df(cpu_env, tdf, twd, tws, twt);
25800         break;
25801     case OPC_FDIV_df:
25802         gen_helper_msa_fdiv_df(cpu_env, tdf, twd, tws, twt);
25803         break;
25804     case OPC_FCNE_df:
25805         gen_helper_msa_fcne_df(cpu_env, tdf, twd, tws, twt);
25806         break;
25807     case OPC_FCLT_df:
25808         gen_helper_msa_fclt_df(cpu_env, tdf, twd, tws, twt);
25809         break;
25810     case OPC_FMADD_df:
25811         gen_helper_msa_fmadd_df(cpu_env, tdf, twd, tws, twt);
25812         break;
25813     case OPC_MUL_Q_df:
25814         tcg_gen_movi_i32(tdf, df + 1);
25815         gen_helper_msa_mul_q_df(cpu_env, tdf, twd, tws, twt);
25816         break;
25817     case OPC_FCULT_df:
25818         gen_helper_msa_fcult_df(cpu_env, tdf, twd, tws, twt);
25819         break;
25820     case OPC_FMSUB_df:
25821         gen_helper_msa_fmsub_df(cpu_env, tdf, twd, tws, twt);
25822         break;
25823     case OPC_MADD_Q_df:
25824         tcg_gen_movi_i32(tdf, df + 1);
25825         gen_helper_msa_madd_q_df(cpu_env, tdf, twd, tws, twt);
25826         break;
25827     case OPC_FCLE_df:
25828         gen_helper_msa_fcle_df(cpu_env, tdf, twd, tws, twt);
25829         break;
25830     case OPC_MSUB_Q_df:
25831         tcg_gen_movi_i32(tdf, df + 1);
25832         gen_helper_msa_msub_q_df(cpu_env, tdf, twd, tws, twt);
25833         break;
25834     case OPC_FCULE_df:
25835         gen_helper_msa_fcule_df(cpu_env, tdf, twd, tws, twt);
25836         break;
25837     case OPC_FEXP2_df:
25838         gen_helper_msa_fexp2_df(cpu_env, tdf, twd, tws, twt);
25839         break;
25840     case OPC_FSAF_df:
25841         gen_helper_msa_fsaf_df(cpu_env, tdf, twd, tws, twt);
25842         break;
25843     case OPC_FEXDO_df:
25844         gen_helper_msa_fexdo_df(cpu_env, tdf, twd, tws, twt);
25845         break;
25846     case OPC_FSUN_df:
25847         gen_helper_msa_fsun_df(cpu_env, tdf, twd, tws, twt);
25848         break;
25849     case OPC_FSOR_df:
25850         gen_helper_msa_fsor_df(cpu_env, tdf, twd, tws, twt);
25851         break;
25852     case OPC_FSEQ_df:
25853         gen_helper_msa_fseq_df(cpu_env, tdf, twd, tws, twt);
25854         break;
25855     case OPC_FTQ_df:
25856         gen_helper_msa_ftq_df(cpu_env, tdf, twd, tws, twt);
25857         break;
25858     case OPC_FSUNE_df:
25859         gen_helper_msa_fsune_df(cpu_env, tdf, twd, tws, twt);
25860         break;
25861     case OPC_FSUEQ_df:
25862         gen_helper_msa_fsueq_df(cpu_env, tdf, twd, tws, twt);
25863         break;
25864     case OPC_FSNE_df:
25865         gen_helper_msa_fsne_df(cpu_env, tdf, twd, tws, twt);
25866         break;
25867     case OPC_FSLT_df:
25868         gen_helper_msa_fslt_df(cpu_env, tdf, twd, tws, twt);
25869         break;
25870     case OPC_FMIN_df:
25871         gen_helper_msa_fmin_df(cpu_env, tdf, twd, tws, twt);
25872         break;
25873     case OPC_MULR_Q_df:
25874         tcg_gen_movi_i32(tdf, df + 1);
25875         gen_helper_msa_mulr_q_df(cpu_env, tdf, twd, tws, twt);
25876         break;
25877     case OPC_FSULT_df:
25878         gen_helper_msa_fsult_df(cpu_env, tdf, twd, tws, twt);
25879         break;
25880     case OPC_FMIN_A_df:
25881         gen_helper_msa_fmin_a_df(cpu_env, tdf, twd, tws, twt);
25882         break;
25883     case OPC_MADDR_Q_df:
25884         tcg_gen_movi_i32(tdf, df + 1);
25885         gen_helper_msa_maddr_q_df(cpu_env, tdf, twd, tws, twt);
25886         break;
25887     case OPC_FSLE_df:
25888         gen_helper_msa_fsle_df(cpu_env, tdf, twd, tws, twt);
25889         break;
25890     case OPC_FMAX_df:
25891         gen_helper_msa_fmax_df(cpu_env, tdf, twd, tws, twt);
25892         break;
25893     case OPC_MSUBR_Q_df:
25894         tcg_gen_movi_i32(tdf, df + 1);
25895         gen_helper_msa_msubr_q_df(cpu_env, tdf, twd, tws, twt);
25896         break;
25897     case OPC_FSULE_df:
25898         gen_helper_msa_fsule_df(cpu_env, tdf, twd, tws, twt);
25899         break;
25900     case OPC_FMAX_A_df:
25901         gen_helper_msa_fmax_a_df(cpu_env, tdf, twd, tws, twt);
25902         break;
25903     default:
25904         MIPS_INVAL("MSA instruction");
25905         generate_exception_end(ctx, EXCP_RI);
25906         break;
25907     }
25908
25909     tcg_temp_free_i32(twd);
25910     tcg_temp_free_i32(tws);
25911     tcg_temp_free_i32(twt);
25912     tcg_temp_free_i32(tdf);
25913 }
25914
25915 static void gen_msa_2r(CPUMIPSState *env, DisasContext *ctx)
25916 {
25917 #define MASK_MSA_2R(op)     (MASK_MSA_MINOR(op) | (op & (0x1f << 21)) | \
25918                             (op & (0x7 << 18)))
25919     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
25920     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25921     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25922     uint8_t df = (ctx->opcode >> 16) & 0x3;
25923     TCGv_i32 twd = tcg_const_i32(wd);
25924     TCGv_i32 tws = tcg_const_i32(ws);
25925     TCGv_i32 twt = tcg_const_i32(wt);
25926     TCGv_i32 tdf = tcg_const_i32(df);
25927
25928     switch (MASK_MSA_2R(ctx->opcode)) {
25929     case OPC_FILL_df:
25930 #if !defined(TARGET_MIPS64)
25931         /* Double format valid only for MIPS64 */
25932         if (df == DF_DOUBLE) {
25933             generate_exception_end(ctx, EXCP_RI);
25934             break;
25935         }
25936 #endif
25937         gen_helper_msa_fill_df(cpu_env, tdf, twd, tws); /* trs */
25938         break;
25939     case OPC_PCNT_df:
25940         gen_helper_msa_pcnt_df(cpu_env, tdf, twd, tws);
25941         break;
25942     case OPC_NLOC_df:
25943         gen_helper_msa_nloc_df(cpu_env, tdf, twd, tws);
25944         break;
25945     case OPC_NLZC_df:
25946         gen_helper_msa_nlzc_df(cpu_env, tdf, twd, tws);
25947         break;
25948     default:
25949         MIPS_INVAL("MSA instruction");
25950         generate_exception_end(ctx, EXCP_RI);
25951         break;
25952     }
25953
25954     tcg_temp_free_i32(twd);
25955     tcg_temp_free_i32(tws);
25956     tcg_temp_free_i32(twt);
25957     tcg_temp_free_i32(tdf);
25958 }
25959
25960 static void gen_msa_2rf(CPUMIPSState *env, DisasContext *ctx)
25961 {
25962 #define MASK_MSA_2RF(op)    (MASK_MSA_MINOR(op) | (op & (0x1f << 21)) | \
25963                             (op & (0xf << 17)))
25964     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
25965     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25966     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25967     uint8_t df = (ctx->opcode >> 16) & 0x1;
25968     TCGv_i32 twd = tcg_const_i32(wd);
25969     TCGv_i32 tws = tcg_const_i32(ws);
25970     TCGv_i32 twt = tcg_const_i32(wt);
25971     /* adjust df value for floating-point instruction */
25972     TCGv_i32 tdf = tcg_const_i32(df + 2);
25973
25974     switch (MASK_MSA_2RF(ctx->opcode)) {
25975     case OPC_FCLASS_df:
25976         gen_helper_msa_fclass_df(cpu_env, tdf, twd, tws);
25977         break;
25978     case OPC_FTRUNC_S_df:
25979         gen_helper_msa_ftrunc_s_df(cpu_env, tdf, twd, tws);
25980         break;
25981     case OPC_FTRUNC_U_df:
25982         gen_helper_msa_ftrunc_u_df(cpu_env, tdf, twd, tws);
25983         break;
25984     case OPC_FSQRT_df:
25985         gen_helper_msa_fsqrt_df(cpu_env, tdf, twd, tws);
25986         break;
25987     case OPC_FRSQRT_df:
25988         gen_helper_msa_frsqrt_df(cpu_env, tdf, twd, tws);
25989         break;
25990     case OPC_FRCP_df:
25991         gen_helper_msa_frcp_df(cpu_env, tdf, twd, tws);
25992         break;
25993     case OPC_FRINT_df:
25994         gen_helper_msa_frint_df(cpu_env, tdf, twd, tws);
25995         break;
25996     case OPC_FLOG2_df:
25997         gen_helper_msa_flog2_df(cpu_env, tdf, twd, tws);
25998         break;
25999     case OPC_FEXUPL_df:
26000         gen_helper_msa_fexupl_df(cpu_env, tdf, twd, tws);
26001         break;
26002     case OPC_FEXUPR_df:
26003         gen_helper_msa_fexupr_df(cpu_env, tdf, twd, tws);
26004         break;
26005     case OPC_FFQL_df:
26006         gen_helper_msa_ffql_df(cpu_env, tdf, twd, tws);
26007         break;
26008     case OPC_FFQR_df:
26009         gen_helper_msa_ffqr_df(cpu_env, tdf, twd, tws);
26010         break;
26011     case OPC_FTINT_S_df:
26012         gen_helper_msa_ftint_s_df(cpu_env, tdf, twd, tws);
26013         break;
26014     case OPC_FTINT_U_df:
26015         gen_helper_msa_ftint_u_df(cpu_env, tdf, twd, tws);
26016         break;
26017     case OPC_FFINT_S_df:
26018         gen_helper_msa_ffint_s_df(cpu_env, tdf, twd, tws);
26019         break;
26020     case OPC_FFINT_U_df:
26021         gen_helper_msa_ffint_u_df(cpu_env, tdf, twd, tws);
26022         break;
26023     }
26024
26025     tcg_temp_free_i32(twd);
26026     tcg_temp_free_i32(tws);
26027     tcg_temp_free_i32(twt);
26028     tcg_temp_free_i32(tdf);
26029 }
26030
26031 static void gen_msa_vec_v(CPUMIPSState *env, DisasContext *ctx)
26032 {
26033 #define MASK_MSA_VEC(op)    (MASK_MSA_MINOR(op) | (op & (0x1f << 21)))
26034     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
26035     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
26036     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
26037     TCGv_i32 twd = tcg_const_i32(wd);
26038     TCGv_i32 tws = tcg_const_i32(ws);
26039     TCGv_i32 twt = tcg_const_i32(wt);
26040
26041     switch (MASK_MSA_VEC(ctx->opcode)) {
26042     case OPC_AND_V:
26043         gen_helper_msa_and_v(cpu_env, twd, tws, twt);
26044         break;
26045     case OPC_OR_V:
26046         gen_helper_msa_or_v(cpu_env, twd, tws, twt);
26047         break;
26048     case OPC_NOR_V:
26049         gen_helper_msa_nor_v(cpu_env, twd, tws, twt);
26050         break;
26051     case OPC_XOR_V:
26052         gen_helper_msa_xor_v(cpu_env, twd, tws, twt);
26053         break;
26054     case OPC_BMNZ_V:
26055         gen_helper_msa_bmnz_v(cpu_env, twd, tws, twt);
26056         break;
26057     case OPC_BMZ_V:
26058         gen_helper_msa_bmz_v(cpu_env, twd, tws, twt);
26059         break;
26060     case OPC_BSEL_V:
26061         gen_helper_msa_bsel_v(cpu_env, twd, tws, twt);
26062         break;
26063     default:
26064         MIPS_INVAL("MSA instruction");
26065         generate_exception_end(ctx, EXCP_RI);
26066         break;
26067     }
26068
26069     tcg_temp_free_i32(twd);
26070     tcg_temp_free_i32(tws);
26071     tcg_temp_free_i32(twt);
26072 }
26073
26074 static void gen_msa_vec(CPUMIPSState *env, DisasContext *ctx)
26075 {
26076     switch (MASK_MSA_VEC(ctx->opcode)) {
26077     case OPC_AND_V:
26078     case OPC_OR_V:
26079     case OPC_NOR_V:
26080     case OPC_XOR_V:
26081     case OPC_BMNZ_V:
26082     case OPC_BMZ_V:
26083     case OPC_BSEL_V:
26084         gen_msa_vec_v(env, ctx);
26085         break;
26086     case OPC_MSA_2R:
26087         gen_msa_2r(env, ctx);
26088         break;
26089     case OPC_MSA_2RF:
26090         gen_msa_2rf(env, ctx);
26091         break;
26092     default:
26093         MIPS_INVAL("MSA instruction");
26094         generate_exception_end(ctx, EXCP_RI);
26095         break;
26096     }
26097 }
26098
26099 static void gen_msa(CPUMIPSState *env, DisasContext *ctx)
26100 {
26101     uint32_t opcode = ctx->opcode;
26102     check_insn(ctx, ASE_MSA);
26103     check_msa_access(ctx);
26104
26105     switch (MASK_MSA_MINOR(opcode)) {
26106     case OPC_MSA_I8_00:
26107     case OPC_MSA_I8_01:
26108     case OPC_MSA_I8_02:
26109         gen_msa_i8(env, ctx);
26110         break;
26111     case OPC_MSA_I5_06:
26112     case OPC_MSA_I5_07:
26113         gen_msa_i5(env, ctx);
26114         break;
26115     case OPC_MSA_BIT_09:
26116     case OPC_MSA_BIT_0A:
26117         gen_msa_bit(env, ctx);
26118         break;
26119     case OPC_MSA_3R_0D:
26120     case OPC_MSA_3R_0E:
26121     case OPC_MSA_3R_0F:
26122     case OPC_MSA_3R_10:
26123     case OPC_MSA_3R_11:
26124     case OPC_MSA_3R_12:
26125     case OPC_MSA_3R_13:
26126     case OPC_MSA_3R_14:
26127     case OPC_MSA_3R_15:
26128         gen_msa_3r(env, ctx);
26129         break;
26130     case OPC_MSA_ELM:
26131         gen_msa_elm(env, ctx);
26132         break;
26133     case OPC_MSA_3RF_1A:
26134     case OPC_MSA_3RF_1B:
26135     case OPC_MSA_3RF_1C:
26136         gen_msa_3rf(env, ctx);
26137         break;
26138     case OPC_MSA_VEC:
26139         gen_msa_vec(env, ctx);
26140         break;
26141     case OPC_LD_B:
26142     case OPC_LD_H:
26143     case OPC_LD_W:
26144     case OPC_LD_D:
26145     case OPC_ST_B:
26146     case OPC_ST_H:
26147     case OPC_ST_W:
26148     case OPC_ST_D:
26149         {
26150             int32_t s10 = sextract32(ctx->opcode, 16, 10);
26151             uint8_t rs = (ctx->opcode >> 11) & 0x1f;
26152             uint8_t wd = (ctx->opcode >> 6) & 0x1f;
26153             uint8_t df = (ctx->opcode >> 0) & 0x3;
26154
26155             TCGv_i32 twd = tcg_const_i32(wd);
26156             TCGv taddr = tcg_temp_new();
26157             gen_base_offset_addr(ctx, taddr, rs, s10 << df);
26158
26159             switch (MASK_MSA_MINOR(opcode)) {
26160             case OPC_LD_B:
26161                 gen_helper_msa_ld_b(cpu_env, twd, taddr);
26162                 break;
26163             case OPC_LD_H:
26164                 gen_helper_msa_ld_h(cpu_env, twd, taddr);
26165                 break;
26166             case OPC_LD_W:
26167                 gen_helper_msa_ld_w(cpu_env, twd, taddr);
26168                 break;
26169             case OPC_LD_D:
26170                 gen_helper_msa_ld_d(cpu_env, twd, taddr);
26171                 break;
26172             case OPC_ST_B:
26173                 gen_helper_msa_st_b(cpu_env, twd, taddr);
26174                 break;
26175             case OPC_ST_H:
26176                 gen_helper_msa_st_h(cpu_env, twd, taddr);
26177                 break;
26178             case OPC_ST_W:
26179                 gen_helper_msa_st_w(cpu_env, twd, taddr);
26180                 break;
26181             case OPC_ST_D:
26182                 gen_helper_msa_st_d(cpu_env, twd, taddr);
26183                 break;
26184             }
26185
26186             tcg_temp_free_i32(twd);
26187             tcg_temp_free(taddr);
26188         }
26189         break;
26190     default:
26191         MIPS_INVAL("MSA instruction");
26192         generate_exception_end(ctx, EXCP_RI);
26193         break;
26194     }
26195
26196 }
26197
26198 static void decode_opc(CPUMIPSState *env, DisasContext *ctx)
26199 {
26200     int32_t offset;
26201     int rs, rt, rd, sa;
26202     uint32_t op, op1;
26203     int16_t imm;
26204
26205     /* make sure instructions are on a word boundary */
26206     if (ctx->base.pc_next & 0x3) {
26207         env->CP0_BadVAddr = ctx->base.pc_next;
26208         generate_exception_err(ctx, EXCP_AdEL, EXCP_INST_NOTAVAIL);
26209         return;
26210     }
26211
26212     /* Handle blikely not taken case */
26213     if ((ctx->hflags & MIPS_HFLAG_BMASK_BASE) == MIPS_HFLAG_BL) {
26214         TCGLabel *l1 = gen_new_label();
26215
26216         tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
26217         tcg_gen_movi_i32(hflags, ctx->hflags & ~MIPS_HFLAG_BMASK);
26218         gen_goto_tb(ctx, 1, ctx->base.pc_next + 4);
26219         gen_set_label(l1);
26220     }
26221
26222     op = MASK_OP_MAJOR(ctx->opcode);
26223     rs = (ctx->opcode >> 21) & 0x1f;
26224     rt = (ctx->opcode >> 16) & 0x1f;
26225     rd = (ctx->opcode >> 11) & 0x1f;
26226     sa = (ctx->opcode >> 6) & 0x1f;
26227     imm = (int16_t)ctx->opcode;
26228     switch (op) {
26229     case OPC_SPECIAL:
26230         decode_opc_special(env, ctx);
26231         break;
26232     case OPC_SPECIAL2:
26233         if ((ctx->insn_flags & INSN_R5900) && (ctx->insn_flags & ASE_MMI)) {
26234             decode_tx79_mmi(env, ctx);
26235         } else {
26236             decode_opc_special2_legacy(env, ctx);
26237         }
26238         break;
26239     case OPC_SPECIAL3:
26240         if (ctx->insn_flags & INSN_R5900) {
26241             decode_tx79_sq(env, ctx);    /* TX79_SQ */
26242         } else {
26243             decode_opc_special3(env, ctx);
26244         }
26245         break;
26246     case OPC_REGIMM:
26247         op1 = MASK_REGIMM(ctx->opcode);
26248         switch (op1) {
26249         case OPC_BLTZL: /* REGIMM branches */
26250         case OPC_BGEZL:
26251         case OPC_BLTZALL:
26252         case OPC_BGEZALL:
26253             check_insn(ctx, ISA_MIPS2);
26254             check_insn_opc_removed(ctx, ISA_MIPS32R6);
26255             /* Fallthrough */
26256         case OPC_BLTZ:
26257         case OPC_BGEZ:
26258             gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
26259             break;
26260         case OPC_BLTZAL:
26261         case OPC_BGEZAL:
26262             if (ctx->insn_flags & ISA_MIPS32R6) {
26263                 if (rs == 0) {
26264                     /* OPC_NAL, OPC_BAL */
26265                     gen_compute_branch(ctx, op1, 4, 0, -1, imm << 2, 4);
26266                 } else {
26267                     generate_exception_end(ctx, EXCP_RI);
26268                 }
26269             } else {
26270                 gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
26271             }
26272             break;
26273         case OPC_TGEI: /* REGIMM traps */
26274         case OPC_TGEIU:
26275         case OPC_TLTI:
26276         case OPC_TLTIU:
26277         case OPC_TEQI:
26278
26279         case OPC_TNEI:
26280             check_insn(ctx, ISA_MIPS2);
26281             check_insn_opc_removed(ctx, ISA_MIPS32R6);
26282             gen_trap(ctx, op1, rs, -1, imm);
26283             break;
26284         case OPC_SIGRIE:
26285             check_insn(ctx, ISA_MIPS32R6);
26286             generate_exception_end(ctx, EXCP_RI);
26287             break;
26288         case OPC_SYNCI:
26289             check_insn(ctx, ISA_MIPS32R2);
26290             /* Break the TB to be able to sync copied instructions
26291                immediately */
26292             ctx->base.is_jmp = DISAS_STOP;
26293             break;
26294         case OPC_BPOSGE32:    /* MIPS DSP branch */
26295 #if defined(TARGET_MIPS64)
26296         case OPC_BPOSGE64:
26297 #endif
26298             check_dsp(ctx);
26299             gen_compute_branch(ctx, op1, 4, -1, -2, (int32_t)imm << 2, 4);
26300             break;
26301 #if defined(TARGET_MIPS64)
26302         case OPC_DAHI:
26303             check_insn(ctx, ISA_MIPS32R6);
26304             check_mips_64(ctx);
26305             if (rs != 0) {
26306                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 32);
26307             }
26308             break;
26309         case OPC_DATI:
26310             check_insn(ctx, ISA_MIPS32R6);
26311             check_mips_64(ctx);
26312             if (rs != 0) {
26313                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 48);
26314             }
26315             break;
26316 #endif
26317         default:            /* Invalid */
26318             MIPS_INVAL("regimm");
26319             generate_exception_end(ctx, EXCP_RI);
26320             break;
26321         }
26322         break;
26323     case OPC_CP0:
26324         check_cp0_enabled(ctx);
26325         op1 = MASK_CP0(ctx->opcode);
26326         switch (op1) {
26327         case OPC_MFC0:
26328         case OPC_MTC0:
26329         case OPC_MFTR:
26330         case OPC_MTTR:
26331         case OPC_MFHC0:
26332         case OPC_MTHC0:
26333 #if defined(TARGET_MIPS64)
26334         case OPC_DMFC0:
26335         case OPC_DMTC0:
26336 #endif
26337 #ifndef CONFIG_USER_ONLY
26338             gen_cp0(env, ctx, op1, rt, rd);
26339 #endif /* !CONFIG_USER_ONLY */
26340             break;
26341         case OPC_C0:
26342         case OPC_C0_1:
26343         case OPC_C0_2:
26344         case OPC_C0_3:
26345         case OPC_C0_4:
26346         case OPC_C0_5:
26347         case OPC_C0_6:
26348         case OPC_C0_7:
26349         case OPC_C0_8:
26350         case OPC_C0_9:
26351         case OPC_C0_A:
26352         case OPC_C0_B:
26353         case OPC_C0_C:
26354         case OPC_C0_D:
26355         case OPC_C0_E:
26356         case OPC_C0_F:
26357 #ifndef CONFIG_USER_ONLY
26358             gen_cp0(env, ctx, MASK_C0(ctx->opcode), rt, rd);
26359 #endif /* !CONFIG_USER_ONLY */
26360             break;
26361         case OPC_MFMC0:
26362 #ifndef CONFIG_USER_ONLY
26363             {
26364                 uint32_t op2;
26365                 TCGv t0 = tcg_temp_new();
26366
26367                 op2 = MASK_MFMC0(ctx->opcode);
26368                 switch (op2) {
26369                 case OPC_DMT:
26370                     check_cp0_mt(ctx);
26371                     gen_helper_dmt(t0);
26372                     gen_store_gpr(t0, rt);
26373                     break;
26374                 case OPC_EMT:
26375                     check_cp0_mt(ctx);
26376                     gen_helper_emt(t0);
26377                     gen_store_gpr(t0, rt);
26378                     break;
26379                 case OPC_DVPE:
26380                     check_cp0_mt(ctx);
26381                     gen_helper_dvpe(t0, cpu_env);
26382                     gen_store_gpr(t0, rt);
26383                     break;
26384                 case OPC_EVPE:
26385                     check_cp0_mt(ctx);
26386                     gen_helper_evpe(t0, cpu_env);
26387                     gen_store_gpr(t0, rt);
26388                     break;
26389                 case OPC_DVP:
26390                     check_insn(ctx, ISA_MIPS32R6);
26391                     if (ctx->vp) {
26392                         gen_helper_dvp(t0, cpu_env);
26393                         gen_store_gpr(t0, rt);
26394                     }
26395                     break;
26396                 case OPC_EVP:
26397                     check_insn(ctx, ISA_MIPS32R6);
26398                     if (ctx->vp) {
26399                         gen_helper_evp(t0, cpu_env);
26400                         gen_store_gpr(t0, rt);
26401                     }
26402                     break;
26403                 case OPC_DI:
26404                     check_insn(ctx, ISA_MIPS32R2);
26405                     save_cpu_state(ctx, 1);
26406                     gen_helper_di(t0, cpu_env);
26407                     gen_store_gpr(t0, rt);
26408                     /* Stop translation as we may have switched
26409                        the execution mode.  */
26410                     ctx->base.is_jmp = DISAS_STOP;
26411                     break;
26412                 case OPC_EI:
26413                     check_insn(ctx, ISA_MIPS32R2);
26414                     save_cpu_state(ctx, 1);
26415                     gen_helper_ei(t0, cpu_env);
26416                     gen_store_gpr(t0, rt);
26417                     /* DISAS_STOP isn't sufficient, we need to ensure we break
26418                        out of translated code to check for pending interrupts */
26419                     gen_save_pc(ctx->base.pc_next + 4);
26420                     ctx->base.is_jmp = DISAS_EXIT;
26421                     break;
26422                 default:            /* Invalid */
26423                     MIPS_INVAL("mfmc0");
26424                     generate_exception_end(ctx, EXCP_RI);
26425                     break;
26426                 }
26427                 tcg_temp_free(t0);
26428             }
26429 #endif /* !CONFIG_USER_ONLY */
26430             break;
26431         case OPC_RDPGPR:
26432             check_insn(ctx, ISA_MIPS32R2);
26433             gen_load_srsgpr(rt, rd);
26434             break;
26435         case OPC_WRPGPR:
26436             check_insn(ctx, ISA_MIPS32R2);
26437             gen_store_srsgpr(rt, rd);
26438             break;
26439         default:
26440             MIPS_INVAL("cp0");
26441             generate_exception_end(ctx, EXCP_RI);
26442             break;
26443         }
26444         break;
26445     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC, OPC_ADDI */
26446         if (ctx->insn_flags & ISA_MIPS32R6) {
26447             /* OPC_BOVC, OPC_BEQZALC, OPC_BEQC */
26448             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26449         } else {
26450             /* OPC_ADDI */
26451             /* Arithmetic with immediate opcode */
26452             gen_arith_imm(ctx, op, rt, rs, imm);
26453         }
26454         break;
26455     case OPC_ADDIU:
26456          gen_arith_imm(ctx, op, rt, rs, imm);
26457          break;
26458     case OPC_SLTI: /* Set on less than with immediate opcode */
26459     case OPC_SLTIU:
26460          gen_slt_imm(ctx, op, rt, rs, imm);
26461          break;
26462     case OPC_ANDI: /* Arithmetic with immediate opcode */
26463     case OPC_LUI: /* OPC_AUI */
26464     case OPC_ORI:
26465     case OPC_XORI:
26466          gen_logic_imm(ctx, op, rt, rs, imm);
26467          break;
26468     case OPC_J: /* Jump */
26469     case OPC_JAL:
26470          offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
26471          gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
26472          break;
26473     /* Branch */
26474     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC, OPC_BLEZL */
26475         if (ctx->insn_flags & ISA_MIPS32R6) {
26476             if (rt == 0) {
26477                 generate_exception_end(ctx, EXCP_RI);
26478                 break;
26479             }
26480             /* OPC_BLEZC, OPC_BGEZC, OPC_BGEC */
26481             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26482         } else {
26483             /* OPC_BLEZL */
26484             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
26485         }
26486         break;
26487     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC, OPC_BGTZL */
26488         if (ctx->insn_flags & ISA_MIPS32R6) {
26489             if (rt == 0) {
26490                 generate_exception_end(ctx, EXCP_RI);
26491                 break;
26492             }
26493             /* OPC_BGTZC, OPC_BLTZC, OPC_BLTC */
26494             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26495         } else {
26496             /* OPC_BGTZL */
26497             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
26498         }
26499         break;
26500     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC, OPC_BLEZ */
26501         if (rt == 0) {
26502             /* OPC_BLEZ */
26503             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
26504         } else {
26505             check_insn(ctx, ISA_MIPS32R6);
26506             /* OPC_BLEZALC, OPC_BGEZALC, OPC_BGEUC */
26507             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26508         }
26509         break;
26510     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC, OPC_BGTZ */
26511         if (rt == 0) {
26512             /* OPC_BGTZ */
26513             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
26514         } else {
26515             check_insn(ctx, ISA_MIPS32R6);
26516             /* OPC_BGTZALC, OPC_BLTZALC, OPC_BLTUC */
26517             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26518         }
26519         break;
26520     case OPC_BEQL:
26521     case OPC_BNEL:
26522         check_insn(ctx, ISA_MIPS2);
26523          check_insn_opc_removed(ctx, ISA_MIPS32R6);
26524         /* Fallthrough */
26525     case OPC_BEQ:
26526     case OPC_BNE:
26527          gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
26528          break;
26529     case OPC_LL: /* Load and stores */
26530         check_insn(ctx, ISA_MIPS2);
26531         check_insn_opc_user_only(ctx, INSN_R5900);
26532         /* Fallthrough */
26533     case OPC_LWL:
26534     case OPC_LWR:
26535         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26536          /* Fallthrough */
26537     case OPC_LB:
26538     case OPC_LH:
26539     case OPC_LW:
26540     case OPC_LWPC:
26541     case OPC_LBU:
26542     case OPC_LHU:
26543          gen_ld(ctx, op, rt, rs, imm);
26544          break;
26545     case OPC_SWL:
26546     case OPC_SWR:
26547         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26548         /* fall through */
26549     case OPC_SB:
26550     case OPC_SH:
26551     case OPC_SW:
26552          gen_st(ctx, op, rt, rs, imm);
26553          break;
26554     case OPC_SC:
26555         check_insn(ctx, ISA_MIPS2);
26556          check_insn_opc_removed(ctx, ISA_MIPS32R6);
26557         check_insn_opc_user_only(ctx, INSN_R5900);
26558          gen_st_cond(ctx, op, rt, rs, imm);
26559          break;
26560     case OPC_CACHE:
26561         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26562         check_cp0_enabled(ctx);
26563         check_insn(ctx, ISA_MIPS3 | ISA_MIPS32);
26564         if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
26565             gen_cache_operation(ctx, rt, rs, imm);
26566         }
26567         /* Treat as NOP. */
26568         break;
26569     case OPC_PREF:
26570         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26571         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32 |
26572                    INSN_R5900);
26573         /* Treat as NOP. */
26574         break;
26575
26576     /* Floating point (COP1). */
26577     case OPC_LWC1:
26578     case OPC_LDC1:
26579     case OPC_SWC1:
26580     case OPC_SDC1:
26581         gen_cop1_ldst(ctx, op, rt, rs, imm);
26582         break;
26583
26584     case OPC_CP1:
26585         op1 = MASK_CP1(ctx->opcode);
26586
26587         switch (op1) {
26588         case OPC_MFHC1:
26589         case OPC_MTHC1:
26590             check_cp1_enabled(ctx);
26591             check_insn(ctx, ISA_MIPS32R2);
26592             /* fall through */
26593         case OPC_MFC1:
26594         case OPC_CFC1:
26595         case OPC_MTC1:
26596         case OPC_CTC1:
26597             check_cp1_enabled(ctx);
26598             gen_cp1(ctx, op1, rt, rd);
26599             break;
26600 #if defined(TARGET_MIPS64)
26601         case OPC_DMFC1:
26602         case OPC_DMTC1:
26603             check_cp1_enabled(ctx);
26604             check_insn(ctx, ISA_MIPS3);
26605             check_mips_64(ctx);
26606             gen_cp1(ctx, op1, rt, rd);
26607             break;
26608 #endif
26609         case OPC_BC1EQZ: /* OPC_BC1ANY2 */
26610             check_cp1_enabled(ctx);
26611             if (ctx->insn_flags & ISA_MIPS32R6) {
26612                 /* OPC_BC1EQZ */
26613                 gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
26614                                        rt, imm << 2, 4);
26615             } else {
26616                 /* OPC_BC1ANY2 */
26617                 check_cop1x(ctx);
26618                 check_insn(ctx, ASE_MIPS3D);
26619                 gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
26620                                     (rt >> 2) & 0x7, imm << 2);
26621             }
26622             break;
26623         case OPC_BC1NEZ:
26624             check_cp1_enabled(ctx);
26625             check_insn(ctx, ISA_MIPS32R6);
26626             gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
26627                                    rt, imm << 2, 4);
26628             break;
26629         case OPC_BC1ANY4:
26630             check_cp1_enabled(ctx);
26631             check_insn_opc_removed(ctx, ISA_MIPS32R6);
26632             check_cop1x(ctx);
26633             check_insn(ctx, ASE_MIPS3D);
26634             /* fall through */
26635         case OPC_BC1:
26636             check_cp1_enabled(ctx);
26637             check_insn_opc_removed(ctx, ISA_MIPS32R6);
26638             gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
26639                                 (rt >> 2) & 0x7, imm << 2);
26640             break;
26641         case OPC_PS_FMT:
26642             check_ps(ctx);
26643             /* fall through */
26644         case OPC_S_FMT:
26645         case OPC_D_FMT:
26646             check_cp1_enabled(ctx);
26647             gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
26648                        (imm >> 8) & 0x7);
26649             break;
26650         case OPC_W_FMT:
26651         case OPC_L_FMT:
26652         {
26653             int r6_op = ctx->opcode & FOP(0x3f, 0x1f);
26654             check_cp1_enabled(ctx);
26655             if (ctx->insn_flags & ISA_MIPS32R6) {
26656                 switch (r6_op) {
26657                 case R6_OPC_CMP_AF_S:
26658                 case R6_OPC_CMP_UN_S:
26659                 case R6_OPC_CMP_EQ_S:
26660                 case R6_OPC_CMP_UEQ_S:
26661                 case R6_OPC_CMP_LT_S:
26662                 case R6_OPC_CMP_ULT_S:
26663                 case R6_OPC_CMP_LE_S:
26664                 case R6_OPC_CMP_ULE_S:
26665                 case R6_OPC_CMP_SAF_S:
26666                 case R6_OPC_CMP_SUN_S:
26667                 case R6_OPC_CMP_SEQ_S:
26668                 case R6_OPC_CMP_SEUQ_S:
26669                 case R6_OPC_CMP_SLT_S:
26670                 case R6_OPC_CMP_SULT_S:
26671                 case R6_OPC_CMP_SLE_S:
26672                 case R6_OPC_CMP_SULE_S:
26673                 case R6_OPC_CMP_OR_S:
26674                 case R6_OPC_CMP_UNE_S:
26675                 case R6_OPC_CMP_NE_S:
26676                 case R6_OPC_CMP_SOR_S:
26677                 case R6_OPC_CMP_SUNE_S:
26678                 case R6_OPC_CMP_SNE_S:
26679                     gen_r6_cmp_s(ctx, ctx->opcode & 0x1f, rt, rd, sa);
26680                     break;
26681                 case R6_OPC_CMP_AF_D:
26682                 case R6_OPC_CMP_UN_D:
26683                 case R6_OPC_CMP_EQ_D:
26684                 case R6_OPC_CMP_UEQ_D:
26685                 case R6_OPC_CMP_LT_D:
26686                 case R6_OPC_CMP_ULT_D:
26687                 case R6_OPC_CMP_LE_D:
26688                 case R6_OPC_CMP_ULE_D:
26689                 case R6_OPC_CMP_SAF_D:
26690                 case R6_OPC_CMP_SUN_D:
26691                 case R6_OPC_CMP_SEQ_D:
26692                 case R6_OPC_CMP_SEUQ_D:
26693                 case R6_OPC_CMP_SLT_D:
26694                 case R6_OPC_CMP_SULT_D:
26695                 case R6_OPC_CMP_SLE_D:
26696                 case R6_OPC_CMP_SULE_D:
26697                 case R6_OPC_CMP_OR_D:
26698                 case R6_OPC_CMP_UNE_D:
26699                 case R6_OPC_CMP_NE_D:
26700                 case R6_OPC_CMP_SOR_D:
26701                 case R6_OPC_CMP_SUNE_D:
26702                 case R6_OPC_CMP_SNE_D:
26703                     gen_r6_cmp_d(ctx, ctx->opcode & 0x1f, rt, rd, sa);
26704                     break;
26705                 default:
26706                     gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f),
26707                                rt, rd, sa, (imm >> 8) & 0x7);
26708
26709                     break;
26710                 }
26711             } else {
26712                 gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
26713                            (imm >> 8) & 0x7);
26714             }
26715             break;
26716         }
26717         case OPC_BZ_V:
26718         case OPC_BNZ_V:
26719         case OPC_BZ_B:
26720         case OPC_BZ_H:
26721         case OPC_BZ_W:
26722         case OPC_BZ_D:
26723         case OPC_BNZ_B:
26724         case OPC_BNZ_H:
26725         case OPC_BNZ_W:
26726         case OPC_BNZ_D:
26727             check_insn(ctx, ASE_MSA);
26728             gen_msa_branch(env, ctx, op1);
26729             break;
26730         default:
26731             MIPS_INVAL("cp1");
26732             generate_exception_end(ctx, EXCP_RI);
26733             break;
26734         }
26735         break;
26736
26737     /* Compact branches [R6] and COP2 [non-R6] */
26738     case OPC_BC: /* OPC_LWC2 */
26739     case OPC_BALC: /* OPC_SWC2 */
26740         if (ctx->insn_flags & ISA_MIPS32R6) {
26741             /* OPC_BC, OPC_BALC */
26742             gen_compute_compact_branch(ctx, op, 0, 0,
26743                                        sextract32(ctx->opcode << 2, 0, 28));
26744         } else {
26745             /* OPC_LWC2, OPC_SWC2 */
26746             /* COP2: Not implemented. */
26747             generate_exception_err(ctx, EXCP_CpU, 2);
26748         }
26749         break;
26750     case OPC_BEQZC: /* OPC_JIC, OPC_LDC2 */
26751     case OPC_BNEZC: /* OPC_JIALC, OPC_SDC2 */
26752         if (ctx->insn_flags & ISA_MIPS32R6) {
26753             if (rs != 0) {
26754                 /* OPC_BEQZC, OPC_BNEZC */
26755                 gen_compute_compact_branch(ctx, op, rs, 0,
26756                                            sextract32(ctx->opcode << 2, 0, 23));
26757             } else {
26758                 /* OPC_JIC, OPC_JIALC */
26759                 gen_compute_compact_branch(ctx, op, 0, rt, imm);
26760             }
26761         } else {
26762             /* OPC_LWC2, OPC_SWC2 */
26763             /* COP2: Not implemented. */
26764             generate_exception_err(ctx, EXCP_CpU, 2);
26765         }
26766         break;
26767     case OPC_CP2:
26768         check_insn(ctx, INSN_LOONGSON2F);
26769         /* Note that these instructions use different fields.  */
26770         gen_loongson_multimedia(ctx, sa, rd, rt);
26771         break;
26772
26773     case OPC_CP3:
26774         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26775         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
26776             check_cp1_enabled(ctx);
26777             op1 = MASK_CP3(ctx->opcode);
26778             switch (op1) {
26779             case OPC_LUXC1:
26780             case OPC_SUXC1:
26781                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS32R2);
26782                 /* Fallthrough */
26783             case OPC_LWXC1:
26784             case OPC_LDXC1:
26785             case OPC_SWXC1:
26786             case OPC_SDXC1:
26787                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
26788                 gen_flt3_ldst(ctx, op1, sa, rd, rs, rt);
26789                 break;
26790             case OPC_PREFX:
26791                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
26792                 /* Treat as NOP. */
26793                 break;
26794             case OPC_ALNV_PS:
26795                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS32R2);
26796                 /* Fallthrough */
26797             case OPC_MADD_S:
26798             case OPC_MADD_D:
26799             case OPC_MADD_PS:
26800             case OPC_MSUB_S:
26801             case OPC_MSUB_D:
26802             case OPC_MSUB_PS:
26803             case OPC_NMADD_S:
26804             case OPC_NMADD_D:
26805             case OPC_NMADD_PS:
26806             case OPC_NMSUB_S:
26807             case OPC_NMSUB_D:
26808             case OPC_NMSUB_PS:
26809                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
26810                 gen_flt3_arith(ctx, op1, sa, rs, rd, rt);
26811                 break;
26812             default:
26813                 MIPS_INVAL("cp3");
26814                 generate_exception_end(ctx, EXCP_RI);
26815                 break;
26816             }
26817         } else {
26818             generate_exception_err(ctx, EXCP_CpU, 1);
26819         }
26820         break;
26821
26822 #if defined(TARGET_MIPS64)
26823     /* MIPS64 opcodes */
26824     case OPC_LLD:
26825         check_insn_opc_user_only(ctx, INSN_R5900);
26826         /* fall through */
26827     case OPC_LDL:
26828     case OPC_LDR:
26829         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26830         /* fall through */
26831     case OPC_LWU:
26832     case OPC_LD:
26833         check_insn(ctx, ISA_MIPS3);
26834         check_mips_64(ctx);
26835         gen_ld(ctx, op, rt, rs, imm);
26836         break;
26837     case OPC_SDL:
26838     case OPC_SDR:
26839         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26840         /* fall through */
26841     case OPC_SD:
26842         check_insn(ctx, ISA_MIPS3);
26843         check_mips_64(ctx);
26844         gen_st(ctx, op, rt, rs, imm);
26845         break;
26846     case OPC_SCD:
26847         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26848         check_insn(ctx, ISA_MIPS3);
26849         check_insn_opc_user_only(ctx, INSN_R5900);
26850         check_mips_64(ctx);
26851         gen_st_cond(ctx, op, rt, rs, imm);
26852         break;
26853     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC, OPC_DADDI */
26854         if (ctx->insn_flags & ISA_MIPS32R6) {
26855             /* OPC_BNVC, OPC_BNEZALC, OPC_BNEC */
26856             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26857         } else {
26858             /* OPC_DADDI */
26859             check_insn(ctx, ISA_MIPS3);
26860             check_mips_64(ctx);
26861             gen_arith_imm(ctx, op, rt, rs, imm);
26862         }
26863         break;
26864     case OPC_DADDIU:
26865         check_insn(ctx, ISA_MIPS3);
26866         check_mips_64(ctx);
26867         gen_arith_imm(ctx, op, rt, rs, imm);
26868         break;
26869 #else
26870     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
26871         if (ctx->insn_flags & ISA_MIPS32R6) {
26872             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26873         } else {
26874             MIPS_INVAL("major opcode");
26875             generate_exception_end(ctx, EXCP_RI);
26876         }
26877         break;
26878 #endif
26879     case OPC_DAUI: /* OPC_JALX */
26880         if (ctx->insn_flags & ISA_MIPS32R6) {
26881 #if defined(TARGET_MIPS64)
26882             /* OPC_DAUI */
26883             check_mips_64(ctx);
26884             if (rs == 0) {
26885                 generate_exception(ctx, EXCP_RI);
26886             } else if (rt != 0) {
26887                 TCGv t0 = tcg_temp_new();
26888                 gen_load_gpr(t0, rs);
26889                 tcg_gen_addi_tl(cpu_gpr[rt], t0, imm << 16);
26890                 tcg_temp_free(t0);
26891             }
26892 #else
26893             generate_exception_end(ctx, EXCP_RI);
26894             MIPS_INVAL("major opcode");
26895 #endif
26896         } else {
26897             /* OPC_JALX */
26898             check_insn(ctx, ASE_MIPS16 | ASE_MICROMIPS);
26899             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
26900             gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
26901         }
26902         break;
26903     case OPC_MSA: /* OPC_MDMX */
26904         if (ctx->insn_flags & INSN_R5900) {
26905             decode_tx79_lq(env, ctx);    /* TX79_LQ */
26906         } else {
26907             /* MDMX: Not implemented. */
26908             gen_msa(env, ctx);
26909         }
26910         break;
26911     case OPC_PCREL:
26912         check_insn(ctx, ISA_MIPS32R6);
26913         gen_pcrel(ctx, ctx->opcode, ctx->base.pc_next, rs);
26914         break;
26915     default:            /* Invalid */
26916         MIPS_INVAL("major opcode");
26917         generate_exception_end(ctx, EXCP_RI);
26918         break;
26919     }
26920 }
26921
26922 static void mips_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
26923 {
26924     DisasContext *ctx = container_of(dcbase, DisasContext, base);
26925     CPUMIPSState *env = cs->env_ptr;
26926
26927     ctx->page_start = ctx->base.pc_first & TARGET_PAGE_MASK;
26928     ctx->saved_pc = -1;
26929     ctx->insn_flags = env->insn_flags;
26930     ctx->CP0_Config1 = env->CP0_Config1;
26931     ctx->CP0_Config2 = env->CP0_Config2;
26932     ctx->CP0_Config3 = env->CP0_Config3;
26933     ctx->CP0_Config5 = env->CP0_Config5;
26934     ctx->btarget = 0;
26935     ctx->kscrexist = (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff;
26936     ctx->rxi = (env->CP0_Config3 >> CP0C3_RXI) & 1;
26937     ctx->ie = (env->CP0_Config4 >> CP0C4_IE) & 3;
26938     ctx->bi = (env->CP0_Config3 >> CP0C3_BI) & 1;
26939     ctx->bp = (env->CP0_Config3 >> CP0C3_BP) & 1;
26940     ctx->PAMask = env->PAMask;
26941     ctx->mvh = (env->CP0_Config5 >> CP0C5_MVH) & 1;
26942     ctx->eva = (env->CP0_Config5 >> CP0C5_EVA) & 1;
26943     ctx->sc = (env->CP0_Config3 >> CP0C3_SC) & 1;
26944     ctx->CP0_LLAddr_shift = env->CP0_LLAddr_shift;
26945     ctx->cmgcr = (env->CP0_Config3 >> CP0C3_CMGCR) & 1;
26946     /* Restore delay slot state from the tb context.  */
26947     ctx->hflags = (uint32_t)ctx->base.tb->flags; /* FIXME: maybe use 64 bits? */
26948     ctx->ulri = (env->CP0_Config3 >> CP0C3_ULRI) & 1;
26949     ctx->ps = ((env->active_fpu.fcr0 >> FCR0_PS) & 1) ||
26950              (env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F));
26951     ctx->vp = (env->CP0_Config5 >> CP0C5_VP) & 1;
26952     ctx->mrp = (env->CP0_Config5 >> CP0C5_MRP) & 1;
26953     ctx->nan2008 = (env->active_fpu.fcr31 >> FCR31_NAN2008) & 1;
26954     ctx->abs2008 = (env->active_fpu.fcr31 >> FCR31_ABS2008) & 1;
26955     restore_cpu_state(env, ctx);
26956 #ifdef CONFIG_USER_ONLY
26957         ctx->mem_idx = MIPS_HFLAG_UM;
26958 #else
26959         ctx->mem_idx = hflags_mmu_index(ctx->hflags);
26960 #endif
26961     ctx->default_tcg_memop_mask = (ctx->insn_flags & ISA_MIPS32R6) ?
26962                                   MO_UNALN : MO_ALIGN;
26963
26964     LOG_DISAS("\ntb %p idx %d hflags %04x\n", ctx->base.tb, ctx->mem_idx,
26965               ctx->hflags);
26966 }
26967
26968 static void mips_tr_tb_start(DisasContextBase *dcbase, CPUState *cs)
26969 {
26970 }
26971
26972 static void mips_tr_insn_start(DisasContextBase *dcbase, CPUState *cs)
26973 {
26974     DisasContext *ctx = container_of(dcbase, DisasContext, base);
26975
26976     tcg_gen_insn_start(ctx->base.pc_next, ctx->hflags & MIPS_HFLAG_BMASK,
26977                        ctx->btarget);
26978 }
26979
26980 static bool mips_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *cs,
26981                                      const CPUBreakpoint *bp)
26982 {
26983     DisasContext *ctx = container_of(dcbase, DisasContext, base);
26984
26985     save_cpu_state(ctx, 1);
26986     ctx->base.is_jmp = DISAS_NORETURN;
26987     gen_helper_raise_exception_debug(cpu_env);
26988     /* The address covered by the breakpoint must be included in
26989        [tb->pc, tb->pc + tb->size) in order to for it to be
26990        properly cleared -- thus we increment the PC here so that
26991        the logic setting tb->size below does the right thing.  */
26992     ctx->base.pc_next += 4;
26993     return true;
26994 }
26995
26996 static void mips_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
26997 {
26998     CPUMIPSState *env = cs->env_ptr;
26999     DisasContext *ctx = container_of(dcbase, DisasContext, base);
27000     int insn_bytes;
27001     int is_slot;
27002
27003     is_slot = ctx->hflags & MIPS_HFLAG_BMASK;
27004     if (ctx->insn_flags & ISA_NANOMIPS32) {
27005         ctx->opcode = cpu_lduw_code(env, ctx->base.pc_next);
27006         insn_bytes = decode_nanomips_opc(env, ctx);
27007     } else if (!(ctx->hflags & MIPS_HFLAG_M16)) {
27008         ctx->opcode = cpu_ldl_code(env, ctx->base.pc_next);
27009         insn_bytes = 4;
27010         decode_opc(env, ctx);
27011     } else if (ctx->insn_flags & ASE_MICROMIPS) {
27012         ctx->opcode = cpu_lduw_code(env, ctx->base.pc_next);
27013         insn_bytes = decode_micromips_opc(env, ctx);
27014     } else if (ctx->insn_flags & ASE_MIPS16) {
27015         ctx->opcode = cpu_lduw_code(env, ctx->base.pc_next);
27016         insn_bytes = decode_mips16_opc(env, ctx);
27017     } else {
27018         generate_exception_end(ctx, EXCP_RI);
27019         g_assert(ctx->base.is_jmp == DISAS_NORETURN);
27020         return;
27021     }
27022
27023     if (ctx->hflags & MIPS_HFLAG_BMASK) {
27024         if (!(ctx->hflags & (MIPS_HFLAG_BDS16 | MIPS_HFLAG_BDS32 |
27025                              MIPS_HFLAG_FBNSLOT))) {
27026             /* force to generate branch as there is neither delay nor
27027                forbidden slot */
27028             is_slot = 1;
27029         }
27030         if ((ctx->hflags & MIPS_HFLAG_M16) &&
27031             (ctx->hflags & MIPS_HFLAG_FBNSLOT)) {
27032             /* Force to generate branch as microMIPS R6 doesn't restrict
27033                branches in the forbidden slot. */
27034             is_slot = 1;
27035         }
27036     }
27037     if (is_slot) {
27038         gen_branch(ctx, insn_bytes);
27039     }
27040     ctx->base.pc_next += insn_bytes;
27041
27042     if (ctx->base.is_jmp != DISAS_NEXT) {
27043         return;
27044     }
27045     /* Execute a branch and its delay slot as a single instruction.
27046        This is what GDB expects and is consistent with what the
27047        hardware does (e.g. if a delay slot instruction faults, the
27048        reported PC is the PC of the branch).  */
27049     if (ctx->base.singlestep_enabled &&
27050         (ctx->hflags & MIPS_HFLAG_BMASK) == 0) {
27051         ctx->base.is_jmp = DISAS_TOO_MANY;
27052     }
27053     if (ctx->base.pc_next - ctx->page_start >= TARGET_PAGE_SIZE) {
27054         ctx->base.is_jmp = DISAS_TOO_MANY;
27055     }
27056 }
27057
27058 static void mips_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
27059 {
27060     DisasContext *ctx = container_of(dcbase, DisasContext, base);
27061
27062     if (ctx->base.singlestep_enabled && ctx->base.is_jmp != DISAS_NORETURN) {
27063         save_cpu_state(ctx, ctx->base.is_jmp != DISAS_EXIT);
27064         gen_helper_raise_exception_debug(cpu_env);
27065     } else {
27066         switch (ctx->base.is_jmp) {
27067         case DISAS_STOP:
27068             gen_save_pc(ctx->base.pc_next);
27069             tcg_gen_lookup_and_goto_ptr();
27070             break;
27071         case DISAS_NEXT:
27072         case DISAS_TOO_MANY:
27073             save_cpu_state(ctx, 0);
27074             gen_goto_tb(ctx, 0, ctx->base.pc_next);
27075             break;
27076         case DISAS_EXIT:
27077             tcg_gen_exit_tb(NULL, 0);
27078             break;
27079         case DISAS_NORETURN:
27080             break;
27081         default:
27082             g_assert_not_reached();
27083         }
27084     }
27085 }
27086
27087 static void mips_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
27088 {
27089     qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
27090     log_target_disas(cs, dcbase->pc_first, dcbase->tb->size);
27091 }
27092
27093 static const TranslatorOps mips_tr_ops = {
27094     .init_disas_context = mips_tr_init_disas_context,
27095     .tb_start           = mips_tr_tb_start,
27096     .insn_start         = mips_tr_insn_start,
27097     .breakpoint_check   = mips_tr_breakpoint_check,
27098     .translate_insn     = mips_tr_translate_insn,
27099     .tb_stop            = mips_tr_tb_stop,
27100     .disas_log          = mips_tr_disas_log,
27101 };
27102
27103 void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
27104 {
27105     DisasContext ctx;
27106
27107     translator_loop(&mips_tr_ops, &ctx.base, cs, tb);
27108 }
27109
27110 static void fpu_dump_state(CPUMIPSState *env, FILE *f, fprintf_function fpu_fprintf,
27111                            int flags)
27112 {
27113     int i;
27114     int is_fpu64 = !!(env->hflags & MIPS_HFLAG_F64);
27115
27116 #define printfpr(fp)                                                    \
27117     do {                                                                \
27118         if (is_fpu64)                                                   \
27119             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
27120                         " fd:%13g fs:%13g psu: %13g\n",                 \
27121                         (fp)->w[FP_ENDIAN_IDX], (fp)->d,                \
27122                         (double)(fp)->fd,                               \
27123                         (double)(fp)->fs[FP_ENDIAN_IDX],                \
27124                         (double)(fp)->fs[!FP_ENDIAN_IDX]);              \
27125         else {                                                          \
27126             fpr_t tmp;                                                  \
27127             tmp.w[FP_ENDIAN_IDX] = (fp)->w[FP_ENDIAN_IDX];              \
27128             tmp.w[!FP_ENDIAN_IDX] = ((fp) + 1)->w[FP_ENDIAN_IDX];       \
27129             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
27130                         " fd:%13g fs:%13g psu:%13g\n",                  \
27131                         tmp.w[FP_ENDIAN_IDX], tmp.d,                    \
27132                         (double)tmp.fd,                                 \
27133                         (double)tmp.fs[FP_ENDIAN_IDX],                  \
27134                         (double)tmp.fs[!FP_ENDIAN_IDX]);                \
27135         }                                                               \
27136     } while(0)
27137
27138
27139     fpu_fprintf(f, "CP1 FCR0 0x%08x  FCR31 0x%08x  SR.FR %d  fp_status 0x%02x\n",
27140                 env->active_fpu.fcr0, env->active_fpu.fcr31, is_fpu64,
27141                 get_float_exception_flags(&env->active_fpu.fp_status));
27142     for (i = 0; i < 32; (is_fpu64) ? i++ : (i += 2)) {
27143         fpu_fprintf(f, "%3s: ", fregnames[i]);
27144         printfpr(&env->active_fpu.fpr[i]);
27145     }
27146
27147 #undef printfpr
27148 }
27149
27150 void mips_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
27151                          int flags)
27152 {
27153     MIPSCPU *cpu = MIPS_CPU(cs);
27154     CPUMIPSState *env = &cpu->env;
27155     int i;
27156
27157     cpu_fprintf(f, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx
27158                 " LO=0x" TARGET_FMT_lx " ds %04x "
27159                 TARGET_FMT_lx " " TARGET_FMT_ld "\n",
27160                 env->active_tc.PC, env->active_tc.HI[0], env->active_tc.LO[0],
27161                 env->hflags, env->btarget, env->bcond);
27162     for (i = 0; i < 32; i++) {
27163         if ((i & 3) == 0)
27164             cpu_fprintf(f, "GPR%02d:", i);
27165         cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], env->active_tc.gpr[i]);
27166         if ((i & 3) == 3)
27167             cpu_fprintf(f, "\n");
27168     }
27169
27170     cpu_fprintf(f, "CP0 Status  0x%08x Cause   0x%08x EPC    0x" TARGET_FMT_lx "\n",
27171                 env->CP0_Status, env->CP0_Cause, env->CP0_EPC);
27172     cpu_fprintf(f, "    Config0 0x%08x Config1 0x%08x LLAddr 0x%016"
27173                 PRIx64 "\n",
27174                 env->CP0_Config0, env->CP0_Config1, env->lladdr);
27175     cpu_fprintf(f, "    Config2 0x%08x Config3 0x%08x\n",
27176                 env->CP0_Config2, env->CP0_Config3);
27177     cpu_fprintf(f, "    Config4 0x%08x Config5 0x%08x\n",
27178                 env->CP0_Config4, env->CP0_Config5);
27179     if ((flags & CPU_DUMP_FPU) && (env->hflags & MIPS_HFLAG_FPU)) {
27180         fpu_dump_state(env, f, cpu_fprintf, flags);
27181     }
27182 }
27183
27184 void mips_tcg_init(void)
27185 {
27186     int i;
27187
27188     cpu_gpr[0] = NULL;
27189     for (i = 1; i < 32; i++)
27190         cpu_gpr[i] = tcg_global_mem_new(cpu_env,
27191                                         offsetof(CPUMIPSState, active_tc.gpr[i]),
27192                                         regnames[i]);
27193
27194     for (i = 0; i < 32; i++) {
27195         int off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[0]);
27196         msa_wr_d[i * 2] =
27197                 tcg_global_mem_new_i64(cpu_env, off, msaregnames[i * 2]);
27198         /* The scalar floating-point unit (FPU) registers are mapped on
27199          * the MSA vector registers. */
27200         fpu_f64[i] = msa_wr_d[i * 2];
27201         off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[1]);
27202         msa_wr_d[i * 2 + 1] =
27203                 tcg_global_mem_new_i64(cpu_env, off, msaregnames[i * 2 + 1]);
27204     }
27205
27206     cpu_PC = tcg_global_mem_new(cpu_env,
27207                                 offsetof(CPUMIPSState, active_tc.PC), "PC");
27208     for (i = 0; i < MIPS_DSP_ACC; i++) {
27209         cpu_HI[i] = tcg_global_mem_new(cpu_env,
27210                                        offsetof(CPUMIPSState, active_tc.HI[i]),
27211                                        regnames_HI[i]);
27212         cpu_LO[i] = tcg_global_mem_new(cpu_env,
27213                                        offsetof(CPUMIPSState, active_tc.LO[i]),
27214                                        regnames_LO[i]);
27215     }
27216     cpu_dspctrl = tcg_global_mem_new(cpu_env,
27217                                      offsetof(CPUMIPSState, active_tc.DSPControl),
27218                                      "DSPControl");
27219     bcond = tcg_global_mem_new(cpu_env,
27220                                offsetof(CPUMIPSState, bcond), "bcond");
27221     btarget = tcg_global_mem_new(cpu_env,
27222                                  offsetof(CPUMIPSState, btarget), "btarget");
27223     hflags = tcg_global_mem_new_i32(cpu_env,
27224                                     offsetof(CPUMIPSState, hflags), "hflags");
27225
27226     fpu_fcr0 = tcg_global_mem_new_i32(cpu_env,
27227                                       offsetof(CPUMIPSState, active_fpu.fcr0),
27228                                       "fcr0");
27229     fpu_fcr31 = tcg_global_mem_new_i32(cpu_env,
27230                                        offsetof(CPUMIPSState, active_fpu.fcr31),
27231                                        "fcr31");
27232 }
27233
27234 #include "translate_init.inc.c"
27235
27236 void cpu_mips_realize_env(CPUMIPSState *env)
27237 {
27238     env->exception_base = (int32_t)0xBFC00000;
27239
27240 #ifndef CONFIG_USER_ONLY
27241     mmu_init(env, env->cpu_model);
27242 #endif
27243     fpu_init(env, env->cpu_model);
27244     mvp_init(env, env->cpu_model);
27245 }
27246
27247 bool cpu_supports_cps_smp(const char *cpu_type)
27248 {
27249     const MIPSCPUClass *mcc = MIPS_CPU_CLASS(object_class_by_name(cpu_type));
27250     return (mcc->cpu_def->CP0_Config3 & (1 << CP0C3_CMGCR)) != 0;
27251 }
27252
27253 bool cpu_supports_isa(const char *cpu_type, unsigned int isa)
27254 {
27255     const MIPSCPUClass *mcc = MIPS_CPU_CLASS(object_class_by_name(cpu_type));
27256     return (mcc->cpu_def->insn_flags & isa) != 0;
27257 }
27258
27259 void cpu_set_exception_base(int vp_index, target_ulong address)
27260 {
27261     MIPSCPU *vp = MIPS_CPU(qemu_get_cpu(vp_index));
27262     vp->env.exception_base = address;
27263 }
27264
27265 void cpu_state_reset(CPUMIPSState *env)
27266 {
27267     MIPSCPU *cpu = mips_env_get_cpu(env);
27268     CPUState *cs = CPU(cpu);
27269
27270     /* Reset registers to their default values */
27271     env->CP0_PRid = env->cpu_model->CP0_PRid;
27272     env->CP0_Config0 = env->cpu_model->CP0_Config0;
27273 #ifdef TARGET_WORDS_BIGENDIAN
27274     env->CP0_Config0 |= (1 << CP0C0_BE);
27275 #endif
27276     env->CP0_Config1 = env->cpu_model->CP0_Config1;
27277     env->CP0_Config2 = env->cpu_model->CP0_Config2;
27278     env->CP0_Config3 = env->cpu_model->CP0_Config3;
27279     env->CP0_Config4 = env->cpu_model->CP0_Config4;
27280     env->CP0_Config4_rw_bitmask = env->cpu_model->CP0_Config4_rw_bitmask;
27281     env->CP0_Config5 = env->cpu_model->CP0_Config5;
27282     env->CP0_Config5_rw_bitmask = env->cpu_model->CP0_Config5_rw_bitmask;
27283     env->CP0_Config6 = env->cpu_model->CP0_Config6;
27284     env->CP0_Config7 = env->cpu_model->CP0_Config7;
27285     env->CP0_LLAddr_rw_bitmask = env->cpu_model->CP0_LLAddr_rw_bitmask
27286                                  << env->cpu_model->CP0_LLAddr_shift;
27287     env->CP0_LLAddr_shift = env->cpu_model->CP0_LLAddr_shift;
27288     env->SYNCI_Step = env->cpu_model->SYNCI_Step;
27289     env->CCRes = env->cpu_model->CCRes;
27290     env->CP0_Status_rw_bitmask = env->cpu_model->CP0_Status_rw_bitmask;
27291     env->CP0_TCStatus_rw_bitmask = env->cpu_model->CP0_TCStatus_rw_bitmask;
27292     env->CP0_SRSCtl = env->cpu_model->CP0_SRSCtl;
27293     env->current_tc = 0;
27294     env->SEGBITS = env->cpu_model->SEGBITS;
27295     env->SEGMask = (target_ulong)((1ULL << env->cpu_model->SEGBITS) - 1);
27296 #if defined(TARGET_MIPS64)
27297     if (env->cpu_model->insn_flags & ISA_MIPS3) {
27298         env->SEGMask |= 3ULL << 62;
27299     }
27300 #endif
27301     env->PABITS = env->cpu_model->PABITS;
27302     env->CP0_SRSConf0_rw_bitmask = env->cpu_model->CP0_SRSConf0_rw_bitmask;
27303     env->CP0_SRSConf0 = env->cpu_model->CP0_SRSConf0;
27304     env->CP0_SRSConf1_rw_bitmask = env->cpu_model->CP0_SRSConf1_rw_bitmask;
27305     env->CP0_SRSConf1 = env->cpu_model->CP0_SRSConf1;
27306     env->CP0_SRSConf2_rw_bitmask = env->cpu_model->CP0_SRSConf2_rw_bitmask;
27307     env->CP0_SRSConf2 = env->cpu_model->CP0_SRSConf2;
27308     env->CP0_SRSConf3_rw_bitmask = env->cpu_model->CP0_SRSConf3_rw_bitmask;
27309     env->CP0_SRSConf3 = env->cpu_model->CP0_SRSConf3;
27310     env->CP0_SRSConf4_rw_bitmask = env->cpu_model->CP0_SRSConf4_rw_bitmask;
27311     env->CP0_SRSConf4 = env->cpu_model->CP0_SRSConf4;
27312     env->CP0_PageGrain_rw_bitmask = env->cpu_model->CP0_PageGrain_rw_bitmask;
27313     env->CP0_PageGrain = env->cpu_model->CP0_PageGrain;
27314     env->CP0_EBaseWG_rw_bitmask = env->cpu_model->CP0_EBaseWG_rw_bitmask;
27315     env->active_fpu.fcr0 = env->cpu_model->CP1_fcr0;
27316     env->active_fpu.fcr31_rw_bitmask = env->cpu_model->CP1_fcr31_rw_bitmask;
27317     env->active_fpu.fcr31 = env->cpu_model->CP1_fcr31;
27318     env->msair = env->cpu_model->MSAIR;
27319     env->insn_flags = env->cpu_model->insn_flags;
27320
27321 #if defined(CONFIG_USER_ONLY)
27322     env->CP0_Status = (MIPS_HFLAG_UM << CP0St_KSU);
27323 # ifdef TARGET_MIPS64
27324     /* Enable 64-bit register mode.  */
27325     env->CP0_Status |= (1 << CP0St_PX);
27326 # endif
27327 # ifdef TARGET_ABI_MIPSN64
27328     /* Enable 64-bit address mode.  */
27329     env->CP0_Status |= (1 << CP0St_UX);
27330 # endif
27331     /* Enable access to the CPUNum, SYNCI_Step, CC, and CCRes RDHWR
27332        hardware registers.  */
27333     env->CP0_HWREna |= 0x0000000F;
27334     if (env->CP0_Config1 & (1 << CP0C1_FP)) {
27335         env->CP0_Status |= (1 << CP0St_CU1);
27336     }
27337     if (env->CP0_Config3 & (1 << CP0C3_DSPP)) {
27338         env->CP0_Status |= (1 << CP0St_MX);
27339     }
27340 # if defined(TARGET_MIPS64)
27341     /* For MIPS64, init FR bit to 1 if FPU unit is there and bit is writable. */
27342     if ((env->CP0_Config1 & (1 << CP0C1_FP)) &&
27343         (env->CP0_Status_rw_bitmask & (1 << CP0St_FR))) {
27344         env->CP0_Status |= (1 << CP0St_FR);
27345     }
27346 # endif
27347 #else
27348     if (env->hflags & MIPS_HFLAG_BMASK) {
27349         /* If the exception was raised from a delay slot,
27350            come back to the jump.  */
27351         env->CP0_ErrorEPC = (env->active_tc.PC
27352                              - (env->hflags & MIPS_HFLAG_B16 ? 2 : 4));
27353     } else {
27354         env->CP0_ErrorEPC = env->active_tc.PC;
27355     }
27356     env->active_tc.PC = env->exception_base;
27357     env->CP0_Random = env->tlb->nb_tlb - 1;
27358     env->tlb->tlb_in_use = env->tlb->nb_tlb;
27359     env->CP0_Wired = 0;
27360     env->CP0_GlobalNumber = (cs->cpu_index & 0xFF) << CP0GN_VPId;
27361     env->CP0_EBase = (cs->cpu_index & 0x3FF);
27362     if (mips_um_ksegs_enabled()) {
27363         env->CP0_EBase |= 0x40000000;
27364     } else {
27365         env->CP0_EBase |= (int32_t)0x80000000;
27366     }
27367     if (env->CP0_Config3 & (1 << CP0C3_CMGCR)) {
27368         env->CP0_CMGCRBase = 0x1fbf8000 >> 4;
27369     }
27370     env->CP0_EntryHi_ASID_mask = (env->CP0_Config4 & (1 << CP0C4_AE)) ?
27371                                  0x3ff : 0xff;
27372     env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
27373     /* vectored interrupts not implemented, timer on int 7,
27374        no performance counters. */
27375     env->CP0_IntCtl = 0xe0000000;
27376     {
27377         int i;
27378
27379         for (i = 0; i < 7; i++) {
27380             env->CP0_WatchLo[i] = 0;
27381             env->CP0_WatchHi[i] = 0x80000000;
27382         }
27383         env->CP0_WatchLo[7] = 0;
27384         env->CP0_WatchHi[7] = 0;
27385     }
27386     /* Count register increments in debug mode, EJTAG version 1 */
27387     env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
27388
27389     cpu_mips_store_count(env, 1);
27390
27391     if (env->CP0_Config3 & (1 << CP0C3_MT)) {
27392         int i;
27393
27394         /* Only TC0 on VPE 0 starts as active.  */
27395         for (i = 0; i < ARRAY_SIZE(env->tcs); i++) {
27396             env->tcs[i].CP0_TCBind = cs->cpu_index << CP0TCBd_CurVPE;
27397             env->tcs[i].CP0_TCHalt = 1;
27398         }
27399         env->active_tc.CP0_TCHalt = 1;
27400         cs->halted = 1;
27401
27402         if (cs->cpu_index == 0) {
27403             /* VPE0 starts up enabled.  */
27404             env->mvp->CP0_MVPControl |= (1 << CP0MVPCo_EVP);
27405             env->CP0_VPEConf0 |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA);
27406
27407             /* TC0 starts up unhalted.  */
27408             cs->halted = 0;
27409             env->active_tc.CP0_TCHalt = 0;
27410             env->tcs[0].CP0_TCHalt = 0;
27411             /* With thread 0 active.  */
27412             env->active_tc.CP0_TCStatus = (1 << CP0TCSt_A);
27413             env->tcs[0].CP0_TCStatus = (1 << CP0TCSt_A);
27414         }
27415     }
27416
27417     /*
27418      * Configure default legacy segmentation control. We use this regardless of
27419      * whether segmentation control is presented to the guest.
27420      */
27421     /* KSeg3 (seg0 0xE0000000..0xFFFFFFFF) */
27422     env->CP0_SegCtl0 =   (CP0SC_AM_MK << CP0SC_AM);
27423     /* KSeg2 (seg1 0xC0000000..0xDFFFFFFF) */
27424     env->CP0_SegCtl0 |= ((CP0SC_AM_MSK << CP0SC_AM)) << 16;
27425     /* KSeg1 (seg2 0xA0000000..0x9FFFFFFF) */
27426     env->CP0_SegCtl1 =   (0 << CP0SC_PA) | (CP0SC_AM_UK << CP0SC_AM) |
27427                          (2 << CP0SC_C);
27428     /* KSeg0 (seg3 0x80000000..0x9FFFFFFF) */
27429     env->CP0_SegCtl1 |= ((0 << CP0SC_PA) | (CP0SC_AM_UK << CP0SC_AM) |
27430                          (3 << CP0SC_C)) << 16;
27431     /* USeg (seg4 0x40000000..0x7FFFFFFF) */
27432     env->CP0_SegCtl2 =   (2 << CP0SC_PA) | (CP0SC_AM_MUSK << CP0SC_AM) |
27433                          (1 << CP0SC_EU) | (2 << CP0SC_C);
27434     /* USeg (seg5 0x00000000..0x3FFFFFFF) */
27435     env->CP0_SegCtl2 |= ((0 << CP0SC_PA) | (CP0SC_AM_MUSK << CP0SC_AM) |
27436                          (1 << CP0SC_EU) | (2 << CP0SC_C)) << 16;
27437     /* XKPhys (note, SegCtl2.XR = 0, so XAM won't be used) */
27438     env->CP0_SegCtl1 |= (CP0SC_AM_UK << CP0SC1_XAM);
27439 #endif
27440     if ((env->insn_flags & ISA_MIPS32R6) &&
27441         (env->active_fpu.fcr0 & (1 << FCR0_F64))) {
27442         /* Status.FR = 0 mode in 64-bit FPU not allowed in R6 */
27443         env->CP0_Status |= (1 << CP0St_FR);
27444     }
27445
27446     if (env->insn_flags & ISA_MIPS32R6) {
27447         /* PTW  =  1 */
27448         env->CP0_PWSize = 0x40;
27449         /* GDI  = 12 */
27450         /* UDI  = 12 */
27451         /* MDI  = 12 */
27452         /* PRI  = 12 */
27453         /* PTEI =  2 */
27454         env->CP0_PWField = 0x0C30C302;
27455     } else {
27456         /* GDI  =  0 */
27457         /* UDI  =  0 */
27458         /* MDI  =  0 */
27459         /* PRI  =  0 */
27460         /* PTEI =  2 */
27461         env->CP0_PWField = 0x02;
27462     }
27463
27464     if (env->CP0_Config3 & (1 << CP0C3_ISA) & (1 << (CP0C3_ISA + 1))) {
27465         /*  microMIPS on reset when Config3.ISA is 3 */
27466         env->hflags |= MIPS_HFLAG_M16;
27467     }
27468
27469     /* MSA */
27470     if (env->CP0_Config3 & (1 << CP0C3_MSAP)) {
27471         msa_reset(env);
27472     }
27473
27474     compute_hflags(env);
27475     restore_fp_status(env);
27476     restore_pamask(env);
27477     cs->exception_index = EXCP_NONE;
27478
27479     if (semihosting_get_argc()) {
27480         /* UHI interface can be used to obtain argc and argv */
27481         env->active_tc.gpr[4] = -1;
27482     }
27483 }
27484
27485 void restore_state_to_opc(CPUMIPSState *env, TranslationBlock *tb,
27486                           target_ulong *data)
27487 {
27488     env->active_tc.PC = data[0];
27489     env->hflags &= ~MIPS_HFLAG_BMASK;
27490     env->hflags |= data[1];
27491     switch (env->hflags & MIPS_HFLAG_BMASK_BASE) {
27492     case MIPS_HFLAG_BR:
27493         break;
27494     case MIPS_HFLAG_BC:
27495     case MIPS_HFLAG_BL:
27496     case MIPS_HFLAG_B:
27497         env->btarget = data[2];
27498         break;
27499     }
27500 }
This page took 1.541411 seconds and 4 git commands to generate.