]> Git Repo - qemu.git/blob - target/mips/translate.c
46655bb8ba75047d40541b04509ee2efda3adf54
[qemu.git] / target / mips / translate.c
1 /*
2  *  MIPS32 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 */
467     OPC_ALIGN_END = (0x0B << 6) | OPC_BSHFL, /* 010.00 to 010.11 */
468     OPC_BITSWAP   = (0x00 << 6) | OPC_BSHFL  /* 00000 */
469 };
470
471 /* DBSHFL opcodes */
472 #define MASK_DBSHFL(op)    MASK_SPECIAL3(op) | (op & (0x1F << 6))
473
474 enum {
475     OPC_DSBH       = (0x02 << 6) | OPC_DBSHFL,
476     OPC_DSHD       = (0x05 << 6) | OPC_DBSHFL,
477     OPC_DALIGN     = (0x08 << 6) | OPC_DBSHFL, /* 01.bp */
478     OPC_DALIGN_END = (0x0F << 6) | OPC_DBSHFL, /* 01.000 to 01.111 */
479     OPC_DBITSWAP   = (0x00 << 6) | OPC_DBSHFL, /* 00000 */
480 };
481
482 /* MIPS DSP REGIMM opcodes */
483 enum {
484     OPC_BPOSGE32 = (0x1C << 16) | OPC_REGIMM,
485     OPC_BPOSGE64 = (0x1D << 16) | OPC_REGIMM,
486 };
487
488 #define MASK_LX(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
489 /* MIPS DSP Load */
490 enum {
491     OPC_LBUX = (0x06 << 6) | OPC_LX_DSP,
492     OPC_LHX  = (0x04 << 6) | OPC_LX_DSP,
493     OPC_LWX  = (0x00 << 6) | OPC_LX_DSP,
494     OPC_LDX = (0x08 << 6) | OPC_LX_DSP,
495 };
496
497 #define MASK_ADDU_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
498 enum {
499     /* MIPS DSP Arithmetic Sub-class */
500     OPC_ADDQ_PH        = (0x0A << 6) | OPC_ADDU_QB_DSP,
501     OPC_ADDQ_S_PH      = (0x0E << 6) | OPC_ADDU_QB_DSP,
502     OPC_ADDQ_S_W       = (0x16 << 6) | OPC_ADDU_QB_DSP,
503     OPC_ADDU_QB        = (0x00 << 6) | OPC_ADDU_QB_DSP,
504     OPC_ADDU_S_QB      = (0x04 << 6) | OPC_ADDU_QB_DSP,
505     OPC_ADDU_PH        = (0x08 << 6) | OPC_ADDU_QB_DSP,
506     OPC_ADDU_S_PH      = (0x0C << 6) | OPC_ADDU_QB_DSP,
507     OPC_SUBQ_PH        = (0x0B << 6) | OPC_ADDU_QB_DSP,
508     OPC_SUBQ_S_PH      = (0x0F << 6) | OPC_ADDU_QB_DSP,
509     OPC_SUBQ_S_W       = (0x17 << 6) | OPC_ADDU_QB_DSP,
510     OPC_SUBU_QB        = (0x01 << 6) | OPC_ADDU_QB_DSP,
511     OPC_SUBU_S_QB      = (0x05 << 6) | OPC_ADDU_QB_DSP,
512     OPC_SUBU_PH        = (0x09 << 6) | OPC_ADDU_QB_DSP,
513     OPC_SUBU_S_PH      = (0x0D << 6) | OPC_ADDU_QB_DSP,
514     OPC_ADDSC          = (0x10 << 6) | OPC_ADDU_QB_DSP,
515     OPC_ADDWC          = (0x11 << 6) | OPC_ADDU_QB_DSP,
516     OPC_MODSUB         = (0x12 << 6) | OPC_ADDU_QB_DSP,
517     OPC_RADDU_W_QB     = (0x14 << 6) | OPC_ADDU_QB_DSP,
518     /* MIPS DSP Multiply Sub-class insns */
519     OPC_MULEU_S_PH_QBL = (0x06 << 6) | OPC_ADDU_QB_DSP,
520     OPC_MULEU_S_PH_QBR = (0x07 << 6) | OPC_ADDU_QB_DSP,
521     OPC_MULQ_RS_PH     = (0x1F << 6) | OPC_ADDU_QB_DSP,
522     OPC_MULEQ_S_W_PHL  = (0x1C << 6) | OPC_ADDU_QB_DSP,
523     OPC_MULEQ_S_W_PHR  = (0x1D << 6) | OPC_ADDU_QB_DSP,
524     OPC_MULQ_S_PH      = (0x1E << 6) | OPC_ADDU_QB_DSP,
525 };
526
527 #define OPC_ADDUH_QB_DSP OPC_MULT_G_2E
528 #define MASK_ADDUH_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
529 enum {
530     /* MIPS DSP Arithmetic Sub-class */
531     OPC_ADDUH_QB   = (0x00 << 6) | OPC_ADDUH_QB_DSP,
532     OPC_ADDUH_R_QB = (0x02 << 6) | OPC_ADDUH_QB_DSP,
533     OPC_ADDQH_PH   = (0x08 << 6) | OPC_ADDUH_QB_DSP,
534     OPC_ADDQH_R_PH = (0x0A << 6) | OPC_ADDUH_QB_DSP,
535     OPC_ADDQH_W    = (0x10 << 6) | OPC_ADDUH_QB_DSP,
536     OPC_ADDQH_R_W  = (0x12 << 6) | OPC_ADDUH_QB_DSP,
537     OPC_SUBUH_QB   = (0x01 << 6) | OPC_ADDUH_QB_DSP,
538     OPC_SUBUH_R_QB = (0x03 << 6) | OPC_ADDUH_QB_DSP,
539     OPC_SUBQH_PH   = (0x09 << 6) | OPC_ADDUH_QB_DSP,
540     OPC_SUBQH_R_PH = (0x0B << 6) | OPC_ADDUH_QB_DSP,
541     OPC_SUBQH_W    = (0x11 << 6) | OPC_ADDUH_QB_DSP,
542     OPC_SUBQH_R_W  = (0x13 << 6) | OPC_ADDUH_QB_DSP,
543     /* MIPS DSP Multiply Sub-class insns */
544     OPC_MUL_PH     = (0x0C << 6) | OPC_ADDUH_QB_DSP,
545     OPC_MUL_S_PH   = (0x0E << 6) | OPC_ADDUH_QB_DSP,
546     OPC_MULQ_S_W   = (0x16 << 6) | OPC_ADDUH_QB_DSP,
547     OPC_MULQ_RS_W  = (0x17 << 6) | OPC_ADDUH_QB_DSP,
548 };
549
550 #define MASK_ABSQ_S_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
551 enum {
552     /* MIPS DSP Arithmetic Sub-class */
553     OPC_ABSQ_S_QB       = (0x01 << 6) | OPC_ABSQ_S_PH_DSP,
554     OPC_ABSQ_S_PH       = (0x09 << 6) | OPC_ABSQ_S_PH_DSP,
555     OPC_ABSQ_S_W        = (0x11 << 6) | OPC_ABSQ_S_PH_DSP,
556     OPC_PRECEQ_W_PHL    = (0x0C << 6) | OPC_ABSQ_S_PH_DSP,
557     OPC_PRECEQ_W_PHR    = (0x0D << 6) | OPC_ABSQ_S_PH_DSP,
558     OPC_PRECEQU_PH_QBL  = (0x04 << 6) | OPC_ABSQ_S_PH_DSP,
559     OPC_PRECEQU_PH_QBR  = (0x05 << 6) | OPC_ABSQ_S_PH_DSP,
560     OPC_PRECEQU_PH_QBLA = (0x06 << 6) | OPC_ABSQ_S_PH_DSP,
561     OPC_PRECEQU_PH_QBRA = (0x07 << 6) | OPC_ABSQ_S_PH_DSP,
562     OPC_PRECEU_PH_QBL   = (0x1C << 6) | OPC_ABSQ_S_PH_DSP,
563     OPC_PRECEU_PH_QBR   = (0x1D << 6) | OPC_ABSQ_S_PH_DSP,
564     OPC_PRECEU_PH_QBLA  = (0x1E << 6) | OPC_ABSQ_S_PH_DSP,
565     OPC_PRECEU_PH_QBRA  = (0x1F << 6) | OPC_ABSQ_S_PH_DSP,
566     /* DSP Bit/Manipulation Sub-class */
567     OPC_BITREV          = (0x1B << 6) | OPC_ABSQ_S_PH_DSP,
568     OPC_REPL_QB         = (0x02 << 6) | OPC_ABSQ_S_PH_DSP,
569     OPC_REPLV_QB        = (0x03 << 6) | OPC_ABSQ_S_PH_DSP,
570     OPC_REPL_PH         = (0x0A << 6) | OPC_ABSQ_S_PH_DSP,
571     OPC_REPLV_PH        = (0x0B << 6) | OPC_ABSQ_S_PH_DSP,
572 };
573
574 #define MASK_CMPU_EQ_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
575 enum {
576     /* MIPS DSP Arithmetic Sub-class */
577     OPC_PRECR_QB_PH      = (0x0D << 6) | OPC_CMPU_EQ_QB_DSP,
578     OPC_PRECRQ_QB_PH     = (0x0C << 6) | OPC_CMPU_EQ_QB_DSP,
579     OPC_PRECR_SRA_PH_W   = (0x1E << 6) | OPC_CMPU_EQ_QB_DSP,
580     OPC_PRECR_SRA_R_PH_W = (0x1F << 6) | OPC_CMPU_EQ_QB_DSP,
581     OPC_PRECRQ_PH_W      = (0x14 << 6) | OPC_CMPU_EQ_QB_DSP,
582     OPC_PRECRQ_RS_PH_W   = (0x15 << 6) | OPC_CMPU_EQ_QB_DSP,
583     OPC_PRECRQU_S_QB_PH  = (0x0F << 6) | OPC_CMPU_EQ_QB_DSP,
584     /* DSP Compare-Pick Sub-class */
585     OPC_CMPU_EQ_QB       = (0x00 << 6) | OPC_CMPU_EQ_QB_DSP,
586     OPC_CMPU_LT_QB       = (0x01 << 6) | OPC_CMPU_EQ_QB_DSP,
587     OPC_CMPU_LE_QB       = (0x02 << 6) | OPC_CMPU_EQ_QB_DSP,
588     OPC_CMPGU_EQ_QB      = (0x04 << 6) | OPC_CMPU_EQ_QB_DSP,
589     OPC_CMPGU_LT_QB      = (0x05 << 6) | OPC_CMPU_EQ_QB_DSP,
590     OPC_CMPGU_LE_QB      = (0x06 << 6) | OPC_CMPU_EQ_QB_DSP,
591     OPC_CMPGDU_EQ_QB     = (0x18 << 6) | OPC_CMPU_EQ_QB_DSP,
592     OPC_CMPGDU_LT_QB     = (0x19 << 6) | OPC_CMPU_EQ_QB_DSP,
593     OPC_CMPGDU_LE_QB     = (0x1A << 6) | OPC_CMPU_EQ_QB_DSP,
594     OPC_CMP_EQ_PH        = (0x08 << 6) | OPC_CMPU_EQ_QB_DSP,
595     OPC_CMP_LT_PH        = (0x09 << 6) | OPC_CMPU_EQ_QB_DSP,
596     OPC_CMP_LE_PH        = (0x0A << 6) | OPC_CMPU_EQ_QB_DSP,
597     OPC_PICK_QB          = (0x03 << 6) | OPC_CMPU_EQ_QB_DSP,
598     OPC_PICK_PH          = (0x0B << 6) | OPC_CMPU_EQ_QB_DSP,
599     OPC_PACKRL_PH        = (0x0E << 6) | OPC_CMPU_EQ_QB_DSP,
600 };
601
602 #define MASK_SHLL_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
603 enum {
604     /* MIPS DSP GPR-Based Shift Sub-class */
605     OPC_SHLL_QB    = (0x00 << 6) | OPC_SHLL_QB_DSP,
606     OPC_SHLLV_QB   = (0x02 << 6) | OPC_SHLL_QB_DSP,
607     OPC_SHLL_PH    = (0x08 << 6) | OPC_SHLL_QB_DSP,
608     OPC_SHLLV_PH   = (0x0A << 6) | OPC_SHLL_QB_DSP,
609     OPC_SHLL_S_PH  = (0x0C << 6) | OPC_SHLL_QB_DSP,
610     OPC_SHLLV_S_PH = (0x0E << 6) | OPC_SHLL_QB_DSP,
611     OPC_SHLL_S_W   = (0x14 << 6) | OPC_SHLL_QB_DSP,
612     OPC_SHLLV_S_W  = (0x16 << 6) | OPC_SHLL_QB_DSP,
613     OPC_SHRL_QB    = (0x01 << 6) | OPC_SHLL_QB_DSP,
614     OPC_SHRLV_QB   = (0x03 << 6) | OPC_SHLL_QB_DSP,
615     OPC_SHRL_PH    = (0x19 << 6) | OPC_SHLL_QB_DSP,
616     OPC_SHRLV_PH   = (0x1B << 6) | OPC_SHLL_QB_DSP,
617     OPC_SHRA_QB    = (0x04 << 6) | OPC_SHLL_QB_DSP,
618     OPC_SHRA_R_QB  = (0x05 << 6) | OPC_SHLL_QB_DSP,
619     OPC_SHRAV_QB   = (0x06 << 6) | OPC_SHLL_QB_DSP,
620     OPC_SHRAV_R_QB = (0x07 << 6) | OPC_SHLL_QB_DSP,
621     OPC_SHRA_PH    = (0x09 << 6) | OPC_SHLL_QB_DSP,
622     OPC_SHRAV_PH   = (0x0B << 6) | OPC_SHLL_QB_DSP,
623     OPC_SHRA_R_PH  = (0x0D << 6) | OPC_SHLL_QB_DSP,
624     OPC_SHRAV_R_PH = (0x0F << 6) | OPC_SHLL_QB_DSP,
625     OPC_SHRA_R_W   = (0x15 << 6) | OPC_SHLL_QB_DSP,
626     OPC_SHRAV_R_W  = (0x17 << 6) | OPC_SHLL_QB_DSP,
627 };
628
629 #define MASK_DPA_W_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
630 enum {
631     /* MIPS DSP Multiply Sub-class insns */
632     OPC_DPAU_H_QBL    = (0x03 << 6) | OPC_DPA_W_PH_DSP,
633     OPC_DPAU_H_QBR    = (0x07 << 6) | OPC_DPA_W_PH_DSP,
634     OPC_DPSU_H_QBL    = (0x0B << 6) | OPC_DPA_W_PH_DSP,
635     OPC_DPSU_H_QBR    = (0x0F << 6) | OPC_DPA_W_PH_DSP,
636     OPC_DPA_W_PH      = (0x00 << 6) | OPC_DPA_W_PH_DSP,
637     OPC_DPAX_W_PH     = (0x08 << 6) | OPC_DPA_W_PH_DSP,
638     OPC_DPAQ_S_W_PH   = (0x04 << 6) | OPC_DPA_W_PH_DSP,
639     OPC_DPAQX_S_W_PH  = (0x18 << 6) | OPC_DPA_W_PH_DSP,
640     OPC_DPAQX_SA_W_PH = (0x1A << 6) | OPC_DPA_W_PH_DSP,
641     OPC_DPS_W_PH      = (0x01 << 6) | OPC_DPA_W_PH_DSP,
642     OPC_DPSX_W_PH     = (0x09 << 6) | OPC_DPA_W_PH_DSP,
643     OPC_DPSQ_S_W_PH   = (0x05 << 6) | OPC_DPA_W_PH_DSP,
644     OPC_DPSQX_S_W_PH  = (0x19 << 6) | OPC_DPA_W_PH_DSP,
645     OPC_DPSQX_SA_W_PH = (0x1B << 6) | OPC_DPA_W_PH_DSP,
646     OPC_MULSAQ_S_W_PH = (0x06 << 6) | OPC_DPA_W_PH_DSP,
647     OPC_DPAQ_SA_L_W   = (0x0C << 6) | OPC_DPA_W_PH_DSP,
648     OPC_DPSQ_SA_L_W   = (0x0D << 6) | OPC_DPA_W_PH_DSP,
649     OPC_MAQ_S_W_PHL   = (0x14 << 6) | OPC_DPA_W_PH_DSP,
650     OPC_MAQ_S_W_PHR   = (0x16 << 6) | OPC_DPA_W_PH_DSP,
651     OPC_MAQ_SA_W_PHL  = (0x10 << 6) | OPC_DPA_W_PH_DSP,
652     OPC_MAQ_SA_W_PHR  = (0x12 << 6) | OPC_DPA_W_PH_DSP,
653     OPC_MULSA_W_PH    = (0x02 << 6) | OPC_DPA_W_PH_DSP,
654 };
655
656 #define MASK_INSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
657 enum {
658     /* DSP Bit/Manipulation Sub-class */
659     OPC_INSV = (0x00 << 6) | OPC_INSV_DSP,
660 };
661
662 #define MASK_APPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
663 enum {
664     /* MIPS DSP Append Sub-class */
665     OPC_APPEND  = (0x00 << 6) | OPC_APPEND_DSP,
666     OPC_PREPEND = (0x01 << 6) | OPC_APPEND_DSP,
667     OPC_BALIGN  = (0x10 << 6) | OPC_APPEND_DSP,
668 };
669
670 #define MASK_EXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
671 enum {
672     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
673     OPC_EXTR_W     = (0x00 << 6) | OPC_EXTR_W_DSP,
674     OPC_EXTR_R_W   = (0x04 << 6) | OPC_EXTR_W_DSP,
675     OPC_EXTR_RS_W  = (0x06 << 6) | OPC_EXTR_W_DSP,
676     OPC_EXTR_S_H   = (0x0E << 6) | OPC_EXTR_W_DSP,
677     OPC_EXTRV_S_H  = (0x0F << 6) | OPC_EXTR_W_DSP,
678     OPC_EXTRV_W    = (0x01 << 6) | OPC_EXTR_W_DSP,
679     OPC_EXTRV_R_W  = (0x05 << 6) | OPC_EXTR_W_DSP,
680     OPC_EXTRV_RS_W = (0x07 << 6) | OPC_EXTR_W_DSP,
681     OPC_EXTP       = (0x02 << 6) | OPC_EXTR_W_DSP,
682     OPC_EXTPV      = (0x03 << 6) | OPC_EXTR_W_DSP,
683     OPC_EXTPDP     = (0x0A << 6) | OPC_EXTR_W_DSP,
684     OPC_EXTPDPV    = (0x0B << 6) | OPC_EXTR_W_DSP,
685     OPC_SHILO      = (0x1A << 6) | OPC_EXTR_W_DSP,
686     OPC_SHILOV     = (0x1B << 6) | OPC_EXTR_W_DSP,
687     OPC_MTHLIP     = (0x1F << 6) | OPC_EXTR_W_DSP,
688     OPC_WRDSP      = (0x13 << 6) | OPC_EXTR_W_DSP,
689     OPC_RDDSP      = (0x12 << 6) | OPC_EXTR_W_DSP,
690 };
691
692 #define MASK_ABSQ_S_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
693 enum {
694     /* MIPS DSP Arithmetic Sub-class */
695     OPC_PRECEQ_L_PWL    = (0x14 << 6) | OPC_ABSQ_S_QH_DSP,
696     OPC_PRECEQ_L_PWR    = (0x15 << 6) | OPC_ABSQ_S_QH_DSP,
697     OPC_PRECEQ_PW_QHL   = (0x0C << 6) | OPC_ABSQ_S_QH_DSP,
698     OPC_PRECEQ_PW_QHR   = (0x0D << 6) | OPC_ABSQ_S_QH_DSP,
699     OPC_PRECEQ_PW_QHLA  = (0x0E << 6) | OPC_ABSQ_S_QH_DSP,
700     OPC_PRECEQ_PW_QHRA  = (0x0F << 6) | OPC_ABSQ_S_QH_DSP,
701     OPC_PRECEQU_QH_OBL  = (0x04 << 6) | OPC_ABSQ_S_QH_DSP,
702     OPC_PRECEQU_QH_OBR  = (0x05 << 6) | OPC_ABSQ_S_QH_DSP,
703     OPC_PRECEQU_QH_OBLA = (0x06 << 6) | OPC_ABSQ_S_QH_DSP,
704     OPC_PRECEQU_QH_OBRA = (0x07 << 6) | OPC_ABSQ_S_QH_DSP,
705     OPC_PRECEU_QH_OBL   = (0x1C << 6) | OPC_ABSQ_S_QH_DSP,
706     OPC_PRECEU_QH_OBR   = (0x1D << 6) | OPC_ABSQ_S_QH_DSP,
707     OPC_PRECEU_QH_OBLA  = (0x1E << 6) | OPC_ABSQ_S_QH_DSP,
708     OPC_PRECEU_QH_OBRA  = (0x1F << 6) | OPC_ABSQ_S_QH_DSP,
709     OPC_ABSQ_S_OB       = (0x01 << 6) | OPC_ABSQ_S_QH_DSP,
710     OPC_ABSQ_S_PW       = (0x11 << 6) | OPC_ABSQ_S_QH_DSP,
711     OPC_ABSQ_S_QH       = (0x09 << 6) | OPC_ABSQ_S_QH_DSP,
712     /* DSP Bit/Manipulation Sub-class */
713     OPC_REPL_OB         = (0x02 << 6) | OPC_ABSQ_S_QH_DSP,
714     OPC_REPL_PW         = (0x12 << 6) | OPC_ABSQ_S_QH_DSP,
715     OPC_REPL_QH         = (0x0A << 6) | OPC_ABSQ_S_QH_DSP,
716     OPC_REPLV_OB        = (0x03 << 6) | OPC_ABSQ_S_QH_DSP,
717     OPC_REPLV_PW        = (0x13 << 6) | OPC_ABSQ_S_QH_DSP,
718     OPC_REPLV_QH        = (0x0B << 6) | OPC_ABSQ_S_QH_DSP,
719 };
720
721 #define MASK_ADDU_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
722 enum {
723     /* MIPS DSP Multiply Sub-class insns */
724     OPC_MULEQ_S_PW_QHL = (0x1C << 6) | OPC_ADDU_OB_DSP,
725     OPC_MULEQ_S_PW_QHR = (0x1D << 6) | OPC_ADDU_OB_DSP,
726     OPC_MULEU_S_QH_OBL = (0x06 << 6) | OPC_ADDU_OB_DSP,
727     OPC_MULEU_S_QH_OBR = (0x07 << 6) | OPC_ADDU_OB_DSP,
728     OPC_MULQ_RS_QH     = (0x1F << 6) | OPC_ADDU_OB_DSP,
729     /* MIPS DSP Arithmetic Sub-class */
730     OPC_RADDU_L_OB     = (0x14 << 6) | OPC_ADDU_OB_DSP,
731     OPC_SUBQ_PW        = (0x13 << 6) | OPC_ADDU_OB_DSP,
732     OPC_SUBQ_S_PW      = (0x17 << 6) | OPC_ADDU_OB_DSP,
733     OPC_SUBQ_QH        = (0x0B << 6) | OPC_ADDU_OB_DSP,
734     OPC_SUBQ_S_QH      = (0x0F << 6) | OPC_ADDU_OB_DSP,
735     OPC_SUBU_OB        = (0x01 << 6) | OPC_ADDU_OB_DSP,
736     OPC_SUBU_S_OB      = (0x05 << 6) | OPC_ADDU_OB_DSP,
737     OPC_SUBU_QH        = (0x09 << 6) | OPC_ADDU_OB_DSP,
738     OPC_SUBU_S_QH      = (0x0D << 6) | OPC_ADDU_OB_DSP,
739     OPC_SUBUH_OB       = (0x19 << 6) | OPC_ADDU_OB_DSP,
740     OPC_SUBUH_R_OB     = (0x1B << 6) | OPC_ADDU_OB_DSP,
741     OPC_ADDQ_PW        = (0x12 << 6) | OPC_ADDU_OB_DSP,
742     OPC_ADDQ_S_PW      = (0x16 << 6) | OPC_ADDU_OB_DSP,
743     OPC_ADDQ_QH        = (0x0A << 6) | OPC_ADDU_OB_DSP,
744     OPC_ADDQ_S_QH      = (0x0E << 6) | OPC_ADDU_OB_DSP,
745     OPC_ADDU_OB        = (0x00 << 6) | OPC_ADDU_OB_DSP,
746     OPC_ADDU_S_OB      = (0x04 << 6) | OPC_ADDU_OB_DSP,
747     OPC_ADDU_QH        = (0x08 << 6) | OPC_ADDU_OB_DSP,
748     OPC_ADDU_S_QH      = (0x0C << 6) | OPC_ADDU_OB_DSP,
749     OPC_ADDUH_OB       = (0x18 << 6) | OPC_ADDU_OB_DSP,
750     OPC_ADDUH_R_OB     = (0x1A << 6) | OPC_ADDU_OB_DSP,
751 };
752
753 #define MASK_CMPU_EQ_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
754 enum {
755     /* DSP Compare-Pick Sub-class */
756     OPC_CMP_EQ_PW         = (0x10 << 6) | OPC_CMPU_EQ_OB_DSP,
757     OPC_CMP_LT_PW         = (0x11 << 6) | OPC_CMPU_EQ_OB_DSP,
758     OPC_CMP_LE_PW         = (0x12 << 6) | OPC_CMPU_EQ_OB_DSP,
759     OPC_CMP_EQ_QH         = (0x08 << 6) | OPC_CMPU_EQ_OB_DSP,
760     OPC_CMP_LT_QH         = (0x09 << 6) | OPC_CMPU_EQ_OB_DSP,
761     OPC_CMP_LE_QH         = (0x0A << 6) | OPC_CMPU_EQ_OB_DSP,
762     OPC_CMPGDU_EQ_OB      = (0x18 << 6) | OPC_CMPU_EQ_OB_DSP,
763     OPC_CMPGDU_LT_OB      = (0x19 << 6) | OPC_CMPU_EQ_OB_DSP,
764     OPC_CMPGDU_LE_OB      = (0x1A << 6) | OPC_CMPU_EQ_OB_DSP,
765     OPC_CMPGU_EQ_OB       = (0x04 << 6) | OPC_CMPU_EQ_OB_DSP,
766     OPC_CMPGU_LT_OB       = (0x05 << 6) | OPC_CMPU_EQ_OB_DSP,
767     OPC_CMPGU_LE_OB       = (0x06 << 6) | OPC_CMPU_EQ_OB_DSP,
768     OPC_CMPU_EQ_OB        = (0x00 << 6) | OPC_CMPU_EQ_OB_DSP,
769     OPC_CMPU_LT_OB        = (0x01 << 6) | OPC_CMPU_EQ_OB_DSP,
770     OPC_CMPU_LE_OB        = (0x02 << 6) | OPC_CMPU_EQ_OB_DSP,
771     OPC_PACKRL_PW         = (0x0E << 6) | OPC_CMPU_EQ_OB_DSP,
772     OPC_PICK_OB           = (0x03 << 6) | OPC_CMPU_EQ_OB_DSP,
773     OPC_PICK_PW           = (0x13 << 6) | OPC_CMPU_EQ_OB_DSP,
774     OPC_PICK_QH           = (0x0B << 6) | OPC_CMPU_EQ_OB_DSP,
775     /* MIPS DSP Arithmetic Sub-class */
776     OPC_PRECR_OB_QH       = (0x0D << 6) | OPC_CMPU_EQ_OB_DSP,
777     OPC_PRECR_SRA_QH_PW   = (0x1E << 6) | OPC_CMPU_EQ_OB_DSP,
778     OPC_PRECR_SRA_R_QH_PW = (0x1F << 6) | OPC_CMPU_EQ_OB_DSP,
779     OPC_PRECRQ_OB_QH      = (0x0C << 6) | OPC_CMPU_EQ_OB_DSP,
780     OPC_PRECRQ_PW_L       = (0x1C << 6) | OPC_CMPU_EQ_OB_DSP,
781     OPC_PRECRQ_QH_PW      = (0x14 << 6) | OPC_CMPU_EQ_OB_DSP,
782     OPC_PRECRQ_RS_QH_PW   = (0x15 << 6) | OPC_CMPU_EQ_OB_DSP,
783     OPC_PRECRQU_S_OB_QH   = (0x0F << 6) | OPC_CMPU_EQ_OB_DSP,
784 };
785
786 #define MASK_DAPPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
787 enum {
788     /* DSP Append Sub-class */
789     OPC_DAPPEND  = (0x00 << 6) | OPC_DAPPEND_DSP,
790     OPC_PREPENDD = (0x03 << 6) | OPC_DAPPEND_DSP,
791     OPC_PREPENDW = (0x01 << 6) | OPC_DAPPEND_DSP,
792     OPC_DBALIGN  = (0x10 << 6) | OPC_DAPPEND_DSP,
793 };
794
795 #define MASK_DEXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
796 enum {
797     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
798     OPC_DMTHLIP     = (0x1F << 6) | OPC_DEXTR_W_DSP,
799     OPC_DSHILO      = (0x1A << 6) | OPC_DEXTR_W_DSP,
800     OPC_DEXTP       = (0x02 << 6) | OPC_DEXTR_W_DSP,
801     OPC_DEXTPDP     = (0x0A << 6) | OPC_DEXTR_W_DSP,
802     OPC_DEXTPDPV    = (0x0B << 6) | OPC_DEXTR_W_DSP,
803     OPC_DEXTPV      = (0x03 << 6) | OPC_DEXTR_W_DSP,
804     OPC_DEXTR_L     = (0x10 << 6) | OPC_DEXTR_W_DSP,
805     OPC_DEXTR_R_L   = (0x14 << 6) | OPC_DEXTR_W_DSP,
806     OPC_DEXTR_RS_L  = (0x16 << 6) | OPC_DEXTR_W_DSP,
807     OPC_DEXTR_W     = (0x00 << 6) | OPC_DEXTR_W_DSP,
808     OPC_DEXTR_R_W   = (0x04 << 6) | OPC_DEXTR_W_DSP,
809     OPC_DEXTR_RS_W  = (0x06 << 6) | OPC_DEXTR_W_DSP,
810     OPC_DEXTR_S_H   = (0x0E << 6) | OPC_DEXTR_W_DSP,
811     OPC_DEXTRV_L    = (0x11 << 6) | OPC_DEXTR_W_DSP,
812     OPC_DEXTRV_R_L  = (0x15 << 6) | OPC_DEXTR_W_DSP,
813     OPC_DEXTRV_RS_L = (0x17 << 6) | OPC_DEXTR_W_DSP,
814     OPC_DEXTRV_S_H  = (0x0F << 6) | OPC_DEXTR_W_DSP,
815     OPC_DEXTRV_W    = (0x01 << 6) | OPC_DEXTR_W_DSP,
816     OPC_DEXTRV_R_W  = (0x05 << 6) | OPC_DEXTR_W_DSP,
817     OPC_DEXTRV_RS_W = (0x07 << 6) | OPC_DEXTR_W_DSP,
818     OPC_DSHILOV     = (0x1B << 6) | OPC_DEXTR_W_DSP,
819 };
820
821 #define MASK_DINSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
822 enum {
823     /* DSP Bit/Manipulation Sub-class */
824     OPC_DINSV = (0x00 << 6) | OPC_DINSV_DSP,
825 };
826
827 #define MASK_DPAQ_W_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
828 enum {
829     /* MIPS DSP Multiply Sub-class insns */
830     OPC_DMADD         = (0x19 << 6) | OPC_DPAQ_W_QH_DSP,
831     OPC_DMADDU        = (0x1D << 6) | OPC_DPAQ_W_QH_DSP,
832     OPC_DMSUB         = (0x1B << 6) | OPC_DPAQ_W_QH_DSP,
833     OPC_DMSUBU        = (0x1F << 6) | OPC_DPAQ_W_QH_DSP,
834     OPC_DPA_W_QH      = (0x00 << 6) | OPC_DPAQ_W_QH_DSP,
835     OPC_DPAQ_S_W_QH   = (0x04 << 6) | OPC_DPAQ_W_QH_DSP,
836     OPC_DPAQ_SA_L_PW  = (0x0C << 6) | OPC_DPAQ_W_QH_DSP,
837     OPC_DPAU_H_OBL    = (0x03 << 6) | OPC_DPAQ_W_QH_DSP,
838     OPC_DPAU_H_OBR    = (0x07 << 6) | OPC_DPAQ_W_QH_DSP,
839     OPC_DPS_W_QH      = (0x01 << 6) | OPC_DPAQ_W_QH_DSP,
840     OPC_DPSQ_S_W_QH   = (0x05 << 6) | OPC_DPAQ_W_QH_DSP,
841     OPC_DPSQ_SA_L_PW  = (0x0D << 6) | OPC_DPAQ_W_QH_DSP,
842     OPC_DPSU_H_OBL    = (0x0B << 6) | OPC_DPAQ_W_QH_DSP,
843     OPC_DPSU_H_OBR    = (0x0F << 6) | OPC_DPAQ_W_QH_DSP,
844     OPC_MAQ_S_L_PWL   = (0x1C << 6) | OPC_DPAQ_W_QH_DSP,
845     OPC_MAQ_S_L_PWR   = (0x1E << 6) | OPC_DPAQ_W_QH_DSP,
846     OPC_MAQ_S_W_QHLL  = (0x14 << 6) | OPC_DPAQ_W_QH_DSP,
847     OPC_MAQ_SA_W_QHLL = (0x10 << 6) | OPC_DPAQ_W_QH_DSP,
848     OPC_MAQ_S_W_QHLR  = (0x15 << 6) | OPC_DPAQ_W_QH_DSP,
849     OPC_MAQ_SA_W_QHLR = (0x11 << 6) | OPC_DPAQ_W_QH_DSP,
850     OPC_MAQ_S_W_QHRL  = (0x16 << 6) | OPC_DPAQ_W_QH_DSP,
851     OPC_MAQ_SA_W_QHRL = (0x12 << 6) | OPC_DPAQ_W_QH_DSP,
852     OPC_MAQ_S_W_QHRR  = (0x17 << 6) | OPC_DPAQ_W_QH_DSP,
853     OPC_MAQ_SA_W_QHRR = (0x13 << 6) | OPC_DPAQ_W_QH_DSP,
854     OPC_MULSAQ_S_L_PW = (0x0E << 6) | OPC_DPAQ_W_QH_DSP,
855     OPC_MULSAQ_S_W_QH = (0x06 << 6) | OPC_DPAQ_W_QH_DSP,
856 };
857
858 #define MASK_SHLL_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
859 enum {
860     /* MIPS DSP GPR-Based Shift Sub-class */
861     OPC_SHLL_PW    = (0x10 << 6) | OPC_SHLL_OB_DSP,
862     OPC_SHLL_S_PW  = (0x14 << 6) | OPC_SHLL_OB_DSP,
863     OPC_SHLLV_OB   = (0x02 << 6) | OPC_SHLL_OB_DSP,
864     OPC_SHLLV_PW   = (0x12 << 6) | OPC_SHLL_OB_DSP,
865     OPC_SHLLV_S_PW = (0x16 << 6) | OPC_SHLL_OB_DSP,
866     OPC_SHLLV_QH   = (0x0A << 6) | OPC_SHLL_OB_DSP,
867     OPC_SHLLV_S_QH = (0x0E << 6) | OPC_SHLL_OB_DSP,
868     OPC_SHRA_PW    = (0x11 << 6) | OPC_SHLL_OB_DSP,
869     OPC_SHRA_R_PW  = (0x15 << 6) | OPC_SHLL_OB_DSP,
870     OPC_SHRAV_OB   = (0x06 << 6) | OPC_SHLL_OB_DSP,
871     OPC_SHRAV_R_OB = (0x07 << 6) | OPC_SHLL_OB_DSP,
872     OPC_SHRAV_PW   = (0x13 << 6) | OPC_SHLL_OB_DSP,
873     OPC_SHRAV_R_PW = (0x17 << 6) | OPC_SHLL_OB_DSP,
874     OPC_SHRAV_QH   = (0x0B << 6) | OPC_SHLL_OB_DSP,
875     OPC_SHRAV_R_QH = (0x0F << 6) | OPC_SHLL_OB_DSP,
876     OPC_SHRLV_OB   = (0x03 << 6) | OPC_SHLL_OB_DSP,
877     OPC_SHRLV_QH   = (0x1B << 6) | OPC_SHLL_OB_DSP,
878     OPC_SHLL_OB    = (0x00 << 6) | OPC_SHLL_OB_DSP,
879     OPC_SHLL_QH    = (0x08 << 6) | OPC_SHLL_OB_DSP,
880     OPC_SHLL_S_QH  = (0x0C << 6) | OPC_SHLL_OB_DSP,
881     OPC_SHRA_OB    = (0x04 << 6) | OPC_SHLL_OB_DSP,
882     OPC_SHRA_R_OB  = (0x05 << 6) | OPC_SHLL_OB_DSP,
883     OPC_SHRA_QH    = (0x09 << 6) | OPC_SHLL_OB_DSP,
884     OPC_SHRA_R_QH  = (0x0D << 6) | OPC_SHLL_OB_DSP,
885     OPC_SHRL_OB    = (0x01 << 6) | OPC_SHLL_OB_DSP,
886     OPC_SHRL_QH    = (0x19 << 6) | OPC_SHLL_OB_DSP,
887 };
888
889 /* Coprocessor 0 (rs field) */
890 #define MASK_CP0(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
891
892 enum {
893     OPC_MFC0     = (0x00 << 21) | OPC_CP0,
894     OPC_DMFC0    = (0x01 << 21) | OPC_CP0,
895     OPC_MFHC0    = (0x02 << 21) | OPC_CP0,
896     OPC_MTC0     = (0x04 << 21) | OPC_CP0,
897     OPC_DMTC0    = (0x05 << 21) | OPC_CP0,
898     OPC_MTHC0    = (0x06 << 21) | OPC_CP0,
899     OPC_MFTR     = (0x08 << 21) | OPC_CP0,
900     OPC_RDPGPR   = (0x0A << 21) | OPC_CP0,
901     OPC_MFMC0    = (0x0B << 21) | OPC_CP0,
902     OPC_MTTR     = (0x0C << 21) | OPC_CP0,
903     OPC_WRPGPR   = (0x0E << 21) | OPC_CP0,
904     OPC_C0       = (0x10 << 21) | OPC_CP0,
905     OPC_C0_1     = (0x11 << 21) | OPC_CP0,
906     OPC_C0_2     = (0x12 << 21) | OPC_CP0,
907     OPC_C0_3     = (0x13 << 21) | OPC_CP0,
908     OPC_C0_4     = (0x14 << 21) | OPC_CP0,
909     OPC_C0_5     = (0x15 << 21) | OPC_CP0,
910     OPC_C0_6     = (0x16 << 21) | OPC_CP0,
911     OPC_C0_7     = (0x17 << 21) | OPC_CP0,
912     OPC_C0_8     = (0x18 << 21) | OPC_CP0,
913     OPC_C0_9     = (0x19 << 21) | OPC_CP0,
914     OPC_C0_A     = (0x1A << 21) | OPC_CP0,
915     OPC_C0_B     = (0x1B << 21) | OPC_CP0,
916     OPC_C0_C     = (0x1C << 21) | OPC_CP0,
917     OPC_C0_D     = (0x1D << 21) | OPC_CP0,
918     OPC_C0_E     = (0x1E << 21) | OPC_CP0,
919     OPC_C0_F     = (0x1F << 21) | OPC_CP0,
920 };
921
922 /* MFMC0 opcodes */
923 #define MASK_MFMC0(op)     MASK_CP0(op) | (op & 0xFFFF)
924
925 enum {
926     OPC_DMT      = 0x01 | (0 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
927     OPC_EMT      = 0x01 | (1 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
928     OPC_DVPE     = 0x01 | (0 << 5) | OPC_MFMC0,
929     OPC_EVPE     = 0x01 | (1 << 5) | OPC_MFMC0,
930     OPC_DI       = (0 << 5) | (0x0C << 11) | OPC_MFMC0,
931     OPC_EI       = (1 << 5) | (0x0C << 11) | OPC_MFMC0,
932     OPC_DVP      = 0x04 | (0 << 3) | (1 << 5) | (0 << 11) | OPC_MFMC0,
933     OPC_EVP      = 0x04 | (0 << 3) | (0 << 5) | (0 << 11) | OPC_MFMC0,
934 };
935
936 /* Coprocessor 0 (with rs == C0) */
937 #define MASK_C0(op)        MASK_CP0(op) | (op & 0x3F)
938
939 enum {
940     OPC_TLBR     = 0x01 | OPC_C0,
941     OPC_TLBWI    = 0x02 | OPC_C0,
942     OPC_TLBINV   = 0x03 | OPC_C0,
943     OPC_TLBINVF  = 0x04 | OPC_C0,
944     OPC_TLBWR    = 0x06 | OPC_C0,
945     OPC_TLBP     = 0x08 | OPC_C0,
946     OPC_RFE      = 0x10 | OPC_C0,
947     OPC_ERET     = 0x18 | OPC_C0,
948     OPC_DERET    = 0x1F | OPC_C0,
949     OPC_WAIT     = 0x20 | OPC_C0,
950 };
951
952 /* Coprocessor 1 (rs field) */
953 #define MASK_CP1(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
954
955 /* Values for the fmt field in FP instructions */
956 enum {
957     /* 0 - 15 are reserved */
958     FMT_S = 16,          /* single fp */
959     FMT_D = 17,          /* double fp */
960     FMT_E = 18,          /* extended fp */
961     FMT_Q = 19,          /* quad fp */
962     FMT_W = 20,          /* 32-bit fixed */
963     FMT_L = 21,          /* 64-bit fixed */
964     FMT_PS = 22,         /* paired single fp */
965     /* 23 - 31 are reserved */
966 };
967
968 enum {
969     OPC_MFC1     = (0x00 << 21) | OPC_CP1,
970     OPC_DMFC1    = (0x01 << 21) | OPC_CP1,
971     OPC_CFC1     = (0x02 << 21) | OPC_CP1,
972     OPC_MFHC1    = (0x03 << 21) | OPC_CP1,
973     OPC_MTC1     = (0x04 << 21) | OPC_CP1,
974     OPC_DMTC1    = (0x05 << 21) | OPC_CP1,
975     OPC_CTC1     = (0x06 << 21) | OPC_CP1,
976     OPC_MTHC1    = (0x07 << 21) | OPC_CP1,
977     OPC_BC1      = (0x08 << 21) | OPC_CP1, /* bc */
978     OPC_BC1ANY2  = (0x09 << 21) | OPC_CP1,
979     OPC_BC1ANY4  = (0x0A << 21) | OPC_CP1,
980     OPC_BZ_V     = (0x0B << 21) | OPC_CP1,
981     OPC_BNZ_V    = (0x0F << 21) | OPC_CP1,
982     OPC_S_FMT    = (FMT_S << 21) | OPC_CP1,
983     OPC_D_FMT    = (FMT_D << 21) | OPC_CP1,
984     OPC_E_FMT    = (FMT_E << 21) | OPC_CP1,
985     OPC_Q_FMT    = (FMT_Q << 21) | OPC_CP1,
986     OPC_W_FMT    = (FMT_W << 21) | OPC_CP1,
987     OPC_L_FMT    = (FMT_L << 21) | OPC_CP1,
988     OPC_PS_FMT   = (FMT_PS << 21) | OPC_CP1,
989     OPC_BC1EQZ   = (0x09 << 21) | OPC_CP1,
990     OPC_BC1NEZ   = (0x0D << 21) | OPC_CP1,
991     OPC_BZ_B     = (0x18 << 21) | OPC_CP1,
992     OPC_BZ_H     = (0x19 << 21) | OPC_CP1,
993     OPC_BZ_W     = (0x1A << 21) | OPC_CP1,
994     OPC_BZ_D     = (0x1B << 21) | OPC_CP1,
995     OPC_BNZ_B    = (0x1C << 21) | OPC_CP1,
996     OPC_BNZ_H    = (0x1D << 21) | OPC_CP1,
997     OPC_BNZ_W    = (0x1E << 21) | OPC_CP1,
998     OPC_BNZ_D    = (0x1F << 21) | OPC_CP1,
999 };
1000
1001 #define MASK_CP1_FUNC(op)       MASK_CP1(op) | (op & 0x3F)
1002 #define MASK_BC1(op)            MASK_CP1(op) | (op & (0x3 << 16))
1003
1004 enum {
1005     OPC_BC1F     = (0x00 << 16) | OPC_BC1,
1006     OPC_BC1T     = (0x01 << 16) | OPC_BC1,
1007     OPC_BC1FL    = (0x02 << 16) | OPC_BC1,
1008     OPC_BC1TL    = (0x03 << 16) | OPC_BC1,
1009 };
1010
1011 enum {
1012     OPC_BC1FANY2     = (0x00 << 16) | OPC_BC1ANY2,
1013     OPC_BC1TANY2     = (0x01 << 16) | OPC_BC1ANY2,
1014 };
1015
1016 enum {
1017     OPC_BC1FANY4     = (0x00 << 16) | OPC_BC1ANY4,
1018     OPC_BC1TANY4     = (0x01 << 16) | OPC_BC1ANY4,
1019 };
1020
1021 #define MASK_CP2(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
1022
1023 enum {
1024     OPC_MFC2    = (0x00 << 21) | OPC_CP2,
1025     OPC_DMFC2   = (0x01 << 21) | OPC_CP2,
1026     OPC_CFC2    = (0x02 << 21) | OPC_CP2,
1027     OPC_MFHC2   = (0x03 << 21) | OPC_CP2,
1028     OPC_MTC2    = (0x04 << 21) | OPC_CP2,
1029     OPC_DMTC2   = (0x05 << 21) | OPC_CP2,
1030     OPC_CTC2    = (0x06 << 21) | OPC_CP2,
1031     OPC_MTHC2   = (0x07 << 21) | OPC_CP2,
1032     OPC_BC2     = (0x08 << 21) | OPC_CP2,
1033     OPC_BC2EQZ  = (0x09 << 21) | OPC_CP2,
1034     OPC_BC2NEZ  = (0x0D << 21) | OPC_CP2,
1035 };
1036
1037 #define MASK_LMI(op)  (MASK_OP_MAJOR(op) | (op & (0x1F << 21)) | (op & 0x1F))
1038
1039 enum {
1040     OPC_PADDSH  = (24 << 21) | (0x00) | OPC_CP2,
1041     OPC_PADDUSH = (25 << 21) | (0x00) | OPC_CP2,
1042     OPC_PADDH   = (26 << 21) | (0x00) | OPC_CP2,
1043     OPC_PADDW   = (27 << 21) | (0x00) | OPC_CP2,
1044     OPC_PADDSB  = (28 << 21) | (0x00) | OPC_CP2,
1045     OPC_PADDUSB = (29 << 21) | (0x00) | OPC_CP2,
1046     OPC_PADDB   = (30 << 21) | (0x00) | OPC_CP2,
1047     OPC_PADDD   = (31 << 21) | (0x00) | OPC_CP2,
1048
1049     OPC_PSUBSH  = (24 << 21) | (0x01) | OPC_CP2,
1050     OPC_PSUBUSH = (25 << 21) | (0x01) | OPC_CP2,
1051     OPC_PSUBH   = (26 << 21) | (0x01) | OPC_CP2,
1052     OPC_PSUBW   = (27 << 21) | (0x01) | OPC_CP2,
1053     OPC_PSUBSB  = (28 << 21) | (0x01) | OPC_CP2,
1054     OPC_PSUBUSB = (29 << 21) | (0x01) | OPC_CP2,
1055     OPC_PSUBB   = (30 << 21) | (0x01) | OPC_CP2,
1056     OPC_PSUBD   = (31 << 21) | (0x01) | OPC_CP2,
1057
1058     OPC_PSHUFH   = (24 << 21) | (0x02) | OPC_CP2,
1059     OPC_PACKSSWH = (25 << 21) | (0x02) | OPC_CP2,
1060     OPC_PACKSSHB = (26 << 21) | (0x02) | OPC_CP2,
1061     OPC_PACKUSHB = (27 << 21) | (0x02) | OPC_CP2,
1062     OPC_XOR_CP2  = (28 << 21) | (0x02) | OPC_CP2,
1063     OPC_NOR_CP2  = (29 << 21) | (0x02) | OPC_CP2,
1064     OPC_AND_CP2  = (30 << 21) | (0x02) | OPC_CP2,
1065     OPC_PANDN    = (31 << 21) | (0x02) | OPC_CP2,
1066
1067     OPC_PUNPCKLHW = (24 << 21) | (0x03) | OPC_CP2,
1068     OPC_PUNPCKHHW = (25 << 21) | (0x03) | OPC_CP2,
1069     OPC_PUNPCKLBH = (26 << 21) | (0x03) | OPC_CP2,
1070     OPC_PUNPCKHBH = (27 << 21) | (0x03) | OPC_CP2,
1071     OPC_PINSRH_0  = (28 << 21) | (0x03) | OPC_CP2,
1072     OPC_PINSRH_1  = (29 << 21) | (0x03) | OPC_CP2,
1073     OPC_PINSRH_2  = (30 << 21) | (0x03) | OPC_CP2,
1074     OPC_PINSRH_3  = (31 << 21) | (0x03) | OPC_CP2,
1075
1076     OPC_PAVGH   = (24 << 21) | (0x08) | OPC_CP2,
1077     OPC_PAVGB   = (25 << 21) | (0x08) | OPC_CP2,
1078     OPC_PMAXSH  = (26 << 21) | (0x08) | OPC_CP2,
1079     OPC_PMINSH  = (27 << 21) | (0x08) | OPC_CP2,
1080     OPC_PMAXUB  = (28 << 21) | (0x08) | OPC_CP2,
1081     OPC_PMINUB  = (29 << 21) | (0x08) | OPC_CP2,
1082
1083     OPC_PCMPEQW = (24 << 21) | (0x09) | OPC_CP2,
1084     OPC_PCMPGTW = (25 << 21) | (0x09) | OPC_CP2,
1085     OPC_PCMPEQH = (26 << 21) | (0x09) | OPC_CP2,
1086     OPC_PCMPGTH = (27 << 21) | (0x09) | OPC_CP2,
1087     OPC_PCMPEQB = (28 << 21) | (0x09) | OPC_CP2,
1088     OPC_PCMPGTB = (29 << 21) | (0x09) | OPC_CP2,
1089
1090     OPC_PSLLW   = (24 << 21) | (0x0A) | OPC_CP2,
1091     OPC_PSLLH   = (25 << 21) | (0x0A) | OPC_CP2,
1092     OPC_PMULLH  = (26 << 21) | (0x0A) | OPC_CP2,
1093     OPC_PMULHH  = (27 << 21) | (0x0A) | OPC_CP2,
1094     OPC_PMULUW  = (28 << 21) | (0x0A) | OPC_CP2,
1095     OPC_PMULHUH = (29 << 21) | (0x0A) | OPC_CP2,
1096
1097     OPC_PSRLW     = (24 << 21) | (0x0B) | OPC_CP2,
1098     OPC_PSRLH     = (25 << 21) | (0x0B) | OPC_CP2,
1099     OPC_PSRAW     = (26 << 21) | (0x0B) | OPC_CP2,
1100     OPC_PSRAH     = (27 << 21) | (0x0B) | OPC_CP2,
1101     OPC_PUNPCKLWD = (28 << 21) | (0x0B) | OPC_CP2,
1102     OPC_PUNPCKHWD = (29 << 21) | (0x0B) | OPC_CP2,
1103
1104     OPC_ADDU_CP2 = (24 << 21) | (0x0C) | OPC_CP2,
1105     OPC_OR_CP2   = (25 << 21) | (0x0C) | OPC_CP2,
1106     OPC_ADD_CP2  = (26 << 21) | (0x0C) | OPC_CP2,
1107     OPC_DADD_CP2 = (27 << 21) | (0x0C) | OPC_CP2,
1108     OPC_SEQU_CP2 = (28 << 21) | (0x0C) | OPC_CP2,
1109     OPC_SEQ_CP2  = (29 << 21) | (0x0C) | OPC_CP2,
1110
1111     OPC_SUBU_CP2 = (24 << 21) | (0x0D) | OPC_CP2,
1112     OPC_PASUBUB  = (25 << 21) | (0x0D) | OPC_CP2,
1113     OPC_SUB_CP2  = (26 << 21) | (0x0D) | OPC_CP2,
1114     OPC_DSUB_CP2 = (27 << 21) | (0x0D) | OPC_CP2,
1115     OPC_SLTU_CP2 = (28 << 21) | (0x0D) | OPC_CP2,
1116     OPC_SLT_CP2  = (29 << 21) | (0x0D) | OPC_CP2,
1117
1118     OPC_SLL_CP2  = (24 << 21) | (0x0E) | OPC_CP2,
1119     OPC_DSLL_CP2 = (25 << 21) | (0x0E) | OPC_CP2,
1120     OPC_PEXTRH   = (26 << 21) | (0x0E) | OPC_CP2,
1121     OPC_PMADDHW  = (27 << 21) | (0x0E) | OPC_CP2,
1122     OPC_SLEU_CP2 = (28 << 21) | (0x0E) | OPC_CP2,
1123     OPC_SLE_CP2  = (29 << 21) | (0x0E) | OPC_CP2,
1124
1125     OPC_SRL_CP2  = (24 << 21) | (0x0F) | OPC_CP2,
1126     OPC_DSRL_CP2 = (25 << 21) | (0x0F) | OPC_CP2,
1127     OPC_SRA_CP2  = (26 << 21) | (0x0F) | OPC_CP2,
1128     OPC_DSRA_CP2 = (27 << 21) | (0x0F) | OPC_CP2,
1129     OPC_BIADD    = (28 << 21) | (0x0F) | OPC_CP2,
1130     OPC_PMOVMSKB = (29 << 21) | (0x0F) | OPC_CP2,
1131 };
1132
1133
1134 #define MASK_CP3(op)       MASK_OP_MAJOR(op) | (op & 0x3F)
1135
1136 enum {
1137     OPC_LWXC1   = 0x00 | OPC_CP3,
1138     OPC_LDXC1   = 0x01 | OPC_CP3,
1139     OPC_LUXC1   = 0x05 | OPC_CP3,
1140     OPC_SWXC1   = 0x08 | OPC_CP3,
1141     OPC_SDXC1   = 0x09 | OPC_CP3,
1142     OPC_SUXC1   = 0x0D | OPC_CP3,
1143     OPC_PREFX   = 0x0F | OPC_CP3,
1144     OPC_ALNV_PS = 0x1E | OPC_CP3,
1145     OPC_MADD_S  = 0x20 | OPC_CP3,
1146     OPC_MADD_D  = 0x21 | OPC_CP3,
1147     OPC_MADD_PS = 0x26 | OPC_CP3,
1148     OPC_MSUB_S  = 0x28 | OPC_CP3,
1149     OPC_MSUB_D  = 0x29 | OPC_CP3,
1150     OPC_MSUB_PS = 0x2E | OPC_CP3,
1151     OPC_NMADD_S = 0x30 | OPC_CP3,
1152     OPC_NMADD_D = 0x31 | OPC_CP3,
1153     OPC_NMADD_PS= 0x36 | OPC_CP3,
1154     OPC_NMSUB_S = 0x38 | OPC_CP3,
1155     OPC_NMSUB_D = 0x39 | OPC_CP3,
1156     OPC_NMSUB_PS= 0x3E | OPC_CP3,
1157 };
1158
1159 /* MSA Opcodes */
1160 #define MASK_MSA_MINOR(op)    (MASK_OP_MAJOR(op) | (op & 0x3F))
1161 enum {
1162     OPC_MSA_I8_00   = 0x00 | OPC_MSA,
1163     OPC_MSA_I8_01   = 0x01 | OPC_MSA,
1164     OPC_MSA_I8_02   = 0x02 | OPC_MSA,
1165     OPC_MSA_I5_06   = 0x06 | OPC_MSA,
1166     OPC_MSA_I5_07   = 0x07 | OPC_MSA,
1167     OPC_MSA_BIT_09  = 0x09 | OPC_MSA,
1168     OPC_MSA_BIT_0A  = 0x0A | OPC_MSA,
1169     OPC_MSA_3R_0D   = 0x0D | OPC_MSA,
1170     OPC_MSA_3R_0E   = 0x0E | OPC_MSA,
1171     OPC_MSA_3R_0F   = 0x0F | OPC_MSA,
1172     OPC_MSA_3R_10   = 0x10 | OPC_MSA,
1173     OPC_MSA_3R_11   = 0x11 | OPC_MSA,
1174     OPC_MSA_3R_12   = 0x12 | OPC_MSA,
1175     OPC_MSA_3R_13   = 0x13 | OPC_MSA,
1176     OPC_MSA_3R_14   = 0x14 | OPC_MSA,
1177     OPC_MSA_3R_15   = 0x15 | OPC_MSA,
1178     OPC_MSA_ELM     = 0x19 | OPC_MSA,
1179     OPC_MSA_3RF_1A  = 0x1A | OPC_MSA,
1180     OPC_MSA_3RF_1B  = 0x1B | OPC_MSA,
1181     OPC_MSA_3RF_1C  = 0x1C | OPC_MSA,
1182     OPC_MSA_VEC     = 0x1E | OPC_MSA,
1183
1184     /* MI10 instruction */
1185     OPC_LD_B    = (0x20) | OPC_MSA,
1186     OPC_LD_H    = (0x21) | OPC_MSA,
1187     OPC_LD_W    = (0x22) | OPC_MSA,
1188     OPC_LD_D    = (0x23) | OPC_MSA,
1189     OPC_ST_B    = (0x24) | OPC_MSA,
1190     OPC_ST_H    = (0x25) | OPC_MSA,
1191     OPC_ST_W    = (0x26) | OPC_MSA,
1192     OPC_ST_D    = (0x27) | OPC_MSA,
1193 };
1194
1195 enum {
1196     /* I5 instruction df(bits 22..21) = _b, _h, _w, _d */
1197     OPC_ADDVI_df    = (0x0 << 23) | OPC_MSA_I5_06,
1198     OPC_CEQI_df     = (0x0 << 23) | OPC_MSA_I5_07,
1199     OPC_SUBVI_df    = (0x1 << 23) | OPC_MSA_I5_06,
1200     OPC_MAXI_S_df   = (0x2 << 23) | OPC_MSA_I5_06,
1201     OPC_CLTI_S_df   = (0x2 << 23) | OPC_MSA_I5_07,
1202     OPC_MAXI_U_df   = (0x3 << 23) | OPC_MSA_I5_06,
1203     OPC_CLTI_U_df   = (0x3 << 23) | OPC_MSA_I5_07,
1204     OPC_MINI_S_df   = (0x4 << 23) | OPC_MSA_I5_06,
1205     OPC_CLEI_S_df   = (0x4 << 23) | OPC_MSA_I5_07,
1206     OPC_MINI_U_df   = (0x5 << 23) | OPC_MSA_I5_06,
1207     OPC_CLEI_U_df   = (0x5 << 23) | OPC_MSA_I5_07,
1208     OPC_LDI_df      = (0x6 << 23) | OPC_MSA_I5_07,
1209
1210     /* I8 instruction */
1211     OPC_ANDI_B  = (0x0 << 24) | OPC_MSA_I8_00,
1212     OPC_BMNZI_B = (0x0 << 24) | OPC_MSA_I8_01,
1213     OPC_SHF_B   = (0x0 << 24) | OPC_MSA_I8_02,
1214     OPC_ORI_B   = (0x1 << 24) | OPC_MSA_I8_00,
1215     OPC_BMZI_B  = (0x1 << 24) | OPC_MSA_I8_01,
1216     OPC_SHF_H   = (0x1 << 24) | OPC_MSA_I8_02,
1217     OPC_NORI_B  = (0x2 << 24) | OPC_MSA_I8_00,
1218     OPC_BSELI_B = (0x2 << 24) | OPC_MSA_I8_01,
1219     OPC_SHF_W   = (0x2 << 24) | OPC_MSA_I8_02,
1220     OPC_XORI_B  = (0x3 << 24) | OPC_MSA_I8_00,
1221
1222     /* VEC/2R/2RF instruction */
1223     OPC_AND_V   = (0x00 << 21) | OPC_MSA_VEC,
1224     OPC_OR_V    = (0x01 << 21) | OPC_MSA_VEC,
1225     OPC_NOR_V   = (0x02 << 21) | OPC_MSA_VEC,
1226     OPC_XOR_V   = (0x03 << 21) | OPC_MSA_VEC,
1227     OPC_BMNZ_V  = (0x04 << 21) | OPC_MSA_VEC,
1228     OPC_BMZ_V   = (0x05 << 21) | OPC_MSA_VEC,
1229     OPC_BSEL_V  = (0x06 << 21) | OPC_MSA_VEC,
1230
1231     OPC_MSA_2R      = (0x18 << 21) | OPC_MSA_VEC,
1232     OPC_MSA_2RF     = (0x19 << 21) | OPC_MSA_VEC,
1233
1234     /* 2R instruction df(bits 17..16) = _b, _h, _w, _d */
1235     OPC_FILL_df = (0x00 << 18) | OPC_MSA_2R,
1236     OPC_PCNT_df = (0x01 << 18) | OPC_MSA_2R,
1237     OPC_NLOC_df = (0x02 << 18) | OPC_MSA_2R,
1238     OPC_NLZC_df = (0x03 << 18) | OPC_MSA_2R,
1239
1240     /* 2RF instruction df(bit 16) = _w, _d */
1241     OPC_FCLASS_df   = (0x00 << 17) | OPC_MSA_2RF,
1242     OPC_FTRUNC_S_df = (0x01 << 17) | OPC_MSA_2RF,
1243     OPC_FTRUNC_U_df = (0x02 << 17) | OPC_MSA_2RF,
1244     OPC_FSQRT_df    = (0x03 << 17) | OPC_MSA_2RF,
1245     OPC_FRSQRT_df   = (0x04 << 17) | OPC_MSA_2RF,
1246     OPC_FRCP_df     = (0x05 << 17) | OPC_MSA_2RF,
1247     OPC_FRINT_df    = (0x06 << 17) | OPC_MSA_2RF,
1248     OPC_FLOG2_df    = (0x07 << 17) | OPC_MSA_2RF,
1249     OPC_FEXUPL_df   = (0x08 << 17) | OPC_MSA_2RF,
1250     OPC_FEXUPR_df   = (0x09 << 17) | OPC_MSA_2RF,
1251     OPC_FFQL_df     = (0x0A << 17) | OPC_MSA_2RF,
1252     OPC_FFQR_df     = (0x0B << 17) | OPC_MSA_2RF,
1253     OPC_FTINT_S_df  = (0x0C << 17) | OPC_MSA_2RF,
1254     OPC_FTINT_U_df  = (0x0D << 17) | OPC_MSA_2RF,
1255     OPC_FFINT_S_df  = (0x0E << 17) | OPC_MSA_2RF,
1256     OPC_FFINT_U_df  = (0x0F << 17) | OPC_MSA_2RF,
1257
1258     /* 3R instruction df(bits 22..21) = _b, _h, _w, d */
1259     OPC_SLL_df      = (0x0 << 23) | OPC_MSA_3R_0D,
1260     OPC_ADDV_df     = (0x0 << 23) | OPC_MSA_3R_0E,
1261     OPC_CEQ_df      = (0x0 << 23) | OPC_MSA_3R_0F,
1262     OPC_ADD_A_df    = (0x0 << 23) | OPC_MSA_3R_10,
1263     OPC_SUBS_S_df   = (0x0 << 23) | OPC_MSA_3R_11,
1264     OPC_MULV_df     = (0x0 << 23) | OPC_MSA_3R_12,
1265     OPC_DOTP_S_df   = (0x0 << 23) | OPC_MSA_3R_13,
1266     OPC_SLD_df      = (0x0 << 23) | OPC_MSA_3R_14,
1267     OPC_VSHF_df     = (0x0 << 23) | OPC_MSA_3R_15,
1268     OPC_SRA_df      = (0x1 << 23) | OPC_MSA_3R_0D,
1269     OPC_SUBV_df     = (0x1 << 23) | OPC_MSA_3R_0E,
1270     OPC_ADDS_A_df   = (0x1 << 23) | OPC_MSA_3R_10,
1271     OPC_SUBS_U_df   = (0x1 << 23) | OPC_MSA_3R_11,
1272     OPC_MADDV_df    = (0x1 << 23) | OPC_MSA_3R_12,
1273     OPC_DOTP_U_df   = (0x1 << 23) | OPC_MSA_3R_13,
1274     OPC_SPLAT_df    = (0x1 << 23) | OPC_MSA_3R_14,
1275     OPC_SRAR_df     = (0x1 << 23) | OPC_MSA_3R_15,
1276     OPC_SRL_df      = (0x2 << 23) | OPC_MSA_3R_0D,
1277     OPC_MAX_S_df    = (0x2 << 23) | OPC_MSA_3R_0E,
1278     OPC_CLT_S_df    = (0x2 << 23) | OPC_MSA_3R_0F,
1279     OPC_ADDS_S_df   = (0x2 << 23) | OPC_MSA_3R_10,
1280     OPC_SUBSUS_U_df = (0x2 << 23) | OPC_MSA_3R_11,
1281     OPC_MSUBV_df    = (0x2 << 23) | OPC_MSA_3R_12,
1282     OPC_DPADD_S_df  = (0x2 << 23) | OPC_MSA_3R_13,
1283     OPC_PCKEV_df    = (0x2 << 23) | OPC_MSA_3R_14,
1284     OPC_SRLR_df     = (0x2 << 23) | OPC_MSA_3R_15,
1285     OPC_BCLR_df     = (0x3 << 23) | OPC_MSA_3R_0D,
1286     OPC_MAX_U_df    = (0x3 << 23) | OPC_MSA_3R_0E,
1287     OPC_CLT_U_df    = (0x3 << 23) | OPC_MSA_3R_0F,
1288     OPC_ADDS_U_df   = (0x3 << 23) | OPC_MSA_3R_10,
1289     OPC_SUBSUU_S_df = (0x3 << 23) | OPC_MSA_3R_11,
1290     OPC_DPADD_U_df  = (0x3 << 23) | OPC_MSA_3R_13,
1291     OPC_PCKOD_df    = (0x3 << 23) | OPC_MSA_3R_14,
1292     OPC_BSET_df     = (0x4 << 23) | OPC_MSA_3R_0D,
1293     OPC_MIN_S_df    = (0x4 << 23) | OPC_MSA_3R_0E,
1294     OPC_CLE_S_df    = (0x4 << 23) | OPC_MSA_3R_0F,
1295     OPC_AVE_S_df    = (0x4 << 23) | OPC_MSA_3R_10,
1296     OPC_ASUB_S_df   = (0x4 << 23) | OPC_MSA_3R_11,
1297     OPC_DIV_S_df    = (0x4 << 23) | OPC_MSA_3R_12,
1298     OPC_DPSUB_S_df  = (0x4 << 23) | OPC_MSA_3R_13,
1299     OPC_ILVL_df     = (0x4 << 23) | OPC_MSA_3R_14,
1300     OPC_HADD_S_df   = (0x4 << 23) | OPC_MSA_3R_15,
1301     OPC_BNEG_df     = (0x5 << 23) | OPC_MSA_3R_0D,
1302     OPC_MIN_U_df    = (0x5 << 23) | OPC_MSA_3R_0E,
1303     OPC_CLE_U_df    = (0x5 << 23) | OPC_MSA_3R_0F,
1304     OPC_AVE_U_df    = (0x5 << 23) | OPC_MSA_3R_10,
1305     OPC_ASUB_U_df   = (0x5 << 23) | OPC_MSA_3R_11,
1306     OPC_DIV_U_df    = (0x5 << 23) | OPC_MSA_3R_12,
1307     OPC_DPSUB_U_df  = (0x5 << 23) | OPC_MSA_3R_13,
1308     OPC_ILVR_df     = (0x5 << 23) | OPC_MSA_3R_14,
1309     OPC_HADD_U_df   = (0x5 << 23) | OPC_MSA_3R_15,
1310     OPC_BINSL_df    = (0x6 << 23) | OPC_MSA_3R_0D,
1311     OPC_MAX_A_df    = (0x6 << 23) | OPC_MSA_3R_0E,
1312     OPC_AVER_S_df   = (0x6 << 23) | OPC_MSA_3R_10,
1313     OPC_MOD_S_df    = (0x6 << 23) | OPC_MSA_3R_12,
1314     OPC_ILVEV_df    = (0x6 << 23) | OPC_MSA_3R_14,
1315     OPC_HSUB_S_df   = (0x6 << 23) | OPC_MSA_3R_15,
1316     OPC_BINSR_df    = (0x7 << 23) | OPC_MSA_3R_0D,
1317     OPC_MIN_A_df    = (0x7 << 23) | OPC_MSA_3R_0E,
1318     OPC_AVER_U_df   = (0x7 << 23) | OPC_MSA_3R_10,
1319     OPC_MOD_U_df    = (0x7 << 23) | OPC_MSA_3R_12,
1320     OPC_ILVOD_df    = (0x7 << 23) | OPC_MSA_3R_14,
1321     OPC_HSUB_U_df   = (0x7 << 23) | OPC_MSA_3R_15,
1322
1323     /* ELM instructions df(bits 21..16) = _b, _h, _w, _d */
1324     OPC_SLDI_df     = (0x0 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1325     OPC_CTCMSA      = (0x0 << 22) | (0x3E << 16) | OPC_MSA_ELM,
1326     OPC_SPLATI_df   = (0x1 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1327     OPC_CFCMSA      = (0x1 << 22) | (0x3E << 16) | OPC_MSA_ELM,
1328     OPC_COPY_S_df   = (0x2 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1329     OPC_MOVE_V      = (0x2 << 22) | (0x3E << 16) | OPC_MSA_ELM,
1330     OPC_COPY_U_df   = (0x3 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1331     OPC_INSERT_df   = (0x4 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1332     OPC_INSVE_df    = (0x5 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1333
1334     /* 3RF instruction _df(bit 21) = _w, _d */
1335     OPC_FCAF_df     = (0x0 << 22) | OPC_MSA_3RF_1A,
1336     OPC_FADD_df     = (0x0 << 22) | OPC_MSA_3RF_1B,
1337     OPC_FCUN_df     = (0x1 << 22) | OPC_MSA_3RF_1A,
1338     OPC_FSUB_df     = (0x1 << 22) | OPC_MSA_3RF_1B,
1339     OPC_FCOR_df     = (0x1 << 22) | OPC_MSA_3RF_1C,
1340     OPC_FCEQ_df     = (0x2 << 22) | OPC_MSA_3RF_1A,
1341     OPC_FMUL_df     = (0x2 << 22) | OPC_MSA_3RF_1B,
1342     OPC_FCUNE_df    = (0x2 << 22) | OPC_MSA_3RF_1C,
1343     OPC_FCUEQ_df    = (0x3 << 22) | OPC_MSA_3RF_1A,
1344     OPC_FDIV_df     = (0x3 << 22) | OPC_MSA_3RF_1B,
1345     OPC_FCNE_df     = (0x3 << 22) | OPC_MSA_3RF_1C,
1346     OPC_FCLT_df     = (0x4 << 22) | OPC_MSA_3RF_1A,
1347     OPC_FMADD_df    = (0x4 << 22) | OPC_MSA_3RF_1B,
1348     OPC_MUL_Q_df    = (0x4 << 22) | OPC_MSA_3RF_1C,
1349     OPC_FCULT_df    = (0x5 << 22) | OPC_MSA_3RF_1A,
1350     OPC_FMSUB_df    = (0x5 << 22) | OPC_MSA_3RF_1B,
1351     OPC_MADD_Q_df   = (0x5 << 22) | OPC_MSA_3RF_1C,
1352     OPC_FCLE_df     = (0x6 << 22) | OPC_MSA_3RF_1A,
1353     OPC_MSUB_Q_df   = (0x6 << 22) | OPC_MSA_3RF_1C,
1354     OPC_FCULE_df    = (0x7 << 22) | OPC_MSA_3RF_1A,
1355     OPC_FEXP2_df    = (0x7 << 22) | OPC_MSA_3RF_1B,
1356     OPC_FSAF_df     = (0x8 << 22) | OPC_MSA_3RF_1A,
1357     OPC_FEXDO_df    = (0x8 << 22) | OPC_MSA_3RF_1B,
1358     OPC_FSUN_df     = (0x9 << 22) | OPC_MSA_3RF_1A,
1359     OPC_FSOR_df     = (0x9 << 22) | OPC_MSA_3RF_1C,
1360     OPC_FSEQ_df     = (0xA << 22) | OPC_MSA_3RF_1A,
1361     OPC_FTQ_df      = (0xA << 22) | OPC_MSA_3RF_1B,
1362     OPC_FSUNE_df    = (0xA << 22) | OPC_MSA_3RF_1C,
1363     OPC_FSUEQ_df    = (0xB << 22) | OPC_MSA_3RF_1A,
1364     OPC_FSNE_df     = (0xB << 22) | OPC_MSA_3RF_1C,
1365     OPC_FSLT_df     = (0xC << 22) | OPC_MSA_3RF_1A,
1366     OPC_FMIN_df     = (0xC << 22) | OPC_MSA_3RF_1B,
1367     OPC_MULR_Q_df   = (0xC << 22) | OPC_MSA_3RF_1C,
1368     OPC_FSULT_df    = (0xD << 22) | OPC_MSA_3RF_1A,
1369     OPC_FMIN_A_df   = (0xD << 22) | OPC_MSA_3RF_1B,
1370     OPC_MADDR_Q_df  = (0xD << 22) | OPC_MSA_3RF_1C,
1371     OPC_FSLE_df     = (0xE << 22) | OPC_MSA_3RF_1A,
1372     OPC_FMAX_df     = (0xE << 22) | OPC_MSA_3RF_1B,
1373     OPC_MSUBR_Q_df  = (0xE << 22) | OPC_MSA_3RF_1C,
1374     OPC_FSULE_df    = (0xF << 22) | OPC_MSA_3RF_1A,
1375     OPC_FMAX_A_df   = (0xF << 22) | OPC_MSA_3RF_1B,
1376
1377     /* BIT instruction df(bits 22..16) = _B _H _W _D */
1378     OPC_SLLI_df     = (0x0 << 23) | OPC_MSA_BIT_09,
1379     OPC_SAT_S_df    = (0x0 << 23) | OPC_MSA_BIT_0A,
1380     OPC_SRAI_df     = (0x1 << 23) | OPC_MSA_BIT_09,
1381     OPC_SAT_U_df    = (0x1 << 23) | OPC_MSA_BIT_0A,
1382     OPC_SRLI_df     = (0x2 << 23) | OPC_MSA_BIT_09,
1383     OPC_SRARI_df    = (0x2 << 23) | OPC_MSA_BIT_0A,
1384     OPC_BCLRI_df    = (0x3 << 23) | OPC_MSA_BIT_09,
1385     OPC_SRLRI_df    = (0x3 << 23) | OPC_MSA_BIT_0A,
1386     OPC_BSETI_df    = (0x4 << 23) | OPC_MSA_BIT_09,
1387     OPC_BNEGI_df    = (0x5 << 23) | OPC_MSA_BIT_09,
1388     OPC_BINSLI_df   = (0x6 << 23) | OPC_MSA_BIT_09,
1389     OPC_BINSRI_df   = (0x7 << 23) | OPC_MSA_BIT_09,
1390 };
1391
1392
1393 /*
1394  *    AN OVERVIEW OF MXU EXTENSION INSTRUCTION SET
1395  *    ============================================
1396  *
1397  * MXU (full name: MIPS eXtension/enhanced Unit) is an SIMD extension of MIPS32
1398  * instructions set. It is designed to fit the needs of signal, graphical and
1399  * video processing applications. MXU instruction set is used in Xburst family
1400  * of microprocessors by Ingenic.
1401  *
1402  * MXU unit contains 17 registers called X0-X16. X0 is always zero, and X16 is
1403  * the control register.
1404  *
1405  *   Compiled after:
1406  *
1407  *   "XBurst® Instruction Set Architecture MIPS eXtension/enhanced Unit
1408  *   Programming Manual", Ingenic Semiconductor Co, Ltd., 2017
1409  */
1410
1411
1412 /* global register indices */
1413 static TCGv cpu_gpr[32], cpu_PC;
1414 static TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC];
1415 static TCGv cpu_dspctrl, btarget, bcond;
1416 static TCGv_i32 hflags;
1417 static TCGv_i32 fpu_fcr0, fpu_fcr31;
1418 static TCGv_i64 fpu_f64[32];
1419 static TCGv_i64 msa_wr_d[64];
1420
1421 #include "exec/gen-icount.h"
1422
1423 #define gen_helper_0e0i(name, arg) do {                           \
1424     TCGv_i32 helper_tmp = tcg_const_i32(arg);                     \
1425     gen_helper_##name(cpu_env, helper_tmp);                       \
1426     tcg_temp_free_i32(helper_tmp);                                \
1427     } while(0)
1428
1429 #define gen_helper_0e1i(name, arg1, arg2) do {                    \
1430     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1431     gen_helper_##name(cpu_env, arg1, helper_tmp);                 \
1432     tcg_temp_free_i32(helper_tmp);                                \
1433     } while(0)
1434
1435 #define gen_helper_1e0i(name, ret, arg1) do {                     \
1436     TCGv_i32 helper_tmp = tcg_const_i32(arg1);                    \
1437     gen_helper_##name(ret, cpu_env, helper_tmp);                  \
1438     tcg_temp_free_i32(helper_tmp);                                \
1439     } while(0)
1440
1441 #define gen_helper_1e1i(name, ret, arg1, arg2) do {               \
1442     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1443     gen_helper_##name(ret, cpu_env, arg1, helper_tmp);            \
1444     tcg_temp_free_i32(helper_tmp);                                \
1445     } while(0)
1446
1447 #define gen_helper_0e2i(name, arg1, arg2, arg3) do {              \
1448     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1449     gen_helper_##name(cpu_env, arg1, arg2, helper_tmp);           \
1450     tcg_temp_free_i32(helper_tmp);                                \
1451     } while(0)
1452
1453 #define gen_helper_1e2i(name, ret, arg1, arg2, arg3) do {         \
1454     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1455     gen_helper_##name(ret, cpu_env, arg1, arg2, helper_tmp);      \
1456     tcg_temp_free_i32(helper_tmp);                                \
1457     } while(0)
1458
1459 #define gen_helper_0e3i(name, arg1, arg2, arg3, arg4) do {        \
1460     TCGv_i32 helper_tmp = tcg_const_i32(arg4);                    \
1461     gen_helper_##name(cpu_env, arg1, arg2, arg3, helper_tmp);     \
1462     tcg_temp_free_i32(helper_tmp);                                \
1463     } while(0)
1464
1465 typedef struct DisasContext {
1466     DisasContextBase base;
1467     target_ulong saved_pc;
1468     target_ulong page_start;
1469     uint32_t opcode;
1470     int insn_flags;
1471     int32_t CP0_Config1;
1472     int32_t CP0_Config3;
1473     int32_t CP0_Config5;
1474     /* Routine used to access memory */
1475     int mem_idx;
1476     TCGMemOp default_tcg_memop_mask;
1477     uint32_t hflags, saved_hflags;
1478     target_ulong btarget;
1479     bool ulri;
1480     int kscrexist;
1481     bool rxi;
1482     int ie;
1483     bool bi;
1484     bool bp;
1485     uint64_t PAMask;
1486     bool mvh;
1487     bool eva;
1488     bool sc;
1489     int CP0_LLAddr_shift;
1490     bool ps;
1491     bool vp;
1492     bool cmgcr;
1493     bool mrp;
1494     bool nan2008;
1495     bool abs2008;
1496 } DisasContext;
1497
1498 #define DISAS_STOP       DISAS_TARGET_0
1499 #define DISAS_EXIT       DISAS_TARGET_1
1500
1501 static const char * const regnames[] = {
1502     "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
1503     "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
1504     "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1505     "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
1506 };
1507
1508 static const char * const regnames_HI[] = {
1509     "HI0", "HI1", "HI2", "HI3",
1510 };
1511
1512 static const char * const regnames_LO[] = {
1513     "LO0", "LO1", "LO2", "LO3",
1514 };
1515
1516 static const char * const fregnames[] = {
1517     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
1518     "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
1519     "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1520     "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
1521 };
1522
1523 static const char * const msaregnames[] = {
1524     "w0.d0",  "w0.d1",  "w1.d0",  "w1.d1",
1525     "w2.d0",  "w2.d1",  "w3.d0",  "w3.d1",
1526     "w4.d0",  "w4.d1",  "w5.d0",  "w5.d1",
1527     "w6.d0",  "w6.d1",  "w7.d0",  "w7.d1",
1528     "w8.d0",  "w8.d1",  "w9.d0",  "w9.d1",
1529     "w10.d0", "w10.d1", "w11.d0", "w11.d1",
1530     "w12.d0", "w12.d1", "w13.d0", "w13.d1",
1531     "w14.d0", "w14.d1", "w15.d0", "w15.d1",
1532     "w16.d0", "w16.d1", "w17.d0", "w17.d1",
1533     "w18.d0", "w18.d1", "w19.d0", "w19.d1",
1534     "w20.d0", "w20.d1", "w21.d0", "w21.d1",
1535     "w22.d0", "w22.d1", "w23.d0", "w23.d1",
1536     "w24.d0", "w24.d1", "w25.d0", "w25.d1",
1537     "w26.d0", "w26.d1", "w27.d0", "w27.d1",
1538     "w28.d0", "w28.d1", "w29.d0", "w29.d1",
1539     "w30.d0", "w30.d1", "w31.d0", "w31.d1",
1540 };
1541
1542 #define LOG_DISAS(...)                                                        \
1543     do {                                                                      \
1544         if (MIPS_DEBUG_DISAS) {                                               \
1545             qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__);                 \
1546         }                                                                     \
1547     } while (0)
1548
1549 #define MIPS_INVAL(op)                                                        \
1550     do {                                                                      \
1551         if (MIPS_DEBUG_DISAS) {                                               \
1552             qemu_log_mask(CPU_LOG_TB_IN_ASM,                                  \
1553                           TARGET_FMT_lx ": %08x Invalid %s %03x %03x %03x\n", \
1554                           ctx->base.pc_next, ctx->opcode, op,                 \
1555                           ctx->opcode >> 26, ctx->opcode & 0x3F,              \
1556                           ((ctx->opcode >> 16) & 0x1F));                      \
1557         }                                                                     \
1558     } while (0)
1559
1560 /* General purpose registers moves. */
1561 static inline void gen_load_gpr (TCGv t, int reg)
1562 {
1563     if (reg == 0)
1564         tcg_gen_movi_tl(t, 0);
1565     else
1566         tcg_gen_mov_tl(t, cpu_gpr[reg]);
1567 }
1568
1569 static inline void gen_store_gpr (TCGv t, int reg)
1570 {
1571     if (reg != 0)
1572         tcg_gen_mov_tl(cpu_gpr[reg], t);
1573 }
1574
1575 /* Moves to/from shadow registers. */
1576 static inline void gen_load_srsgpr (int from, int to)
1577 {
1578     TCGv t0 = tcg_temp_new();
1579
1580     if (from == 0)
1581         tcg_gen_movi_tl(t0, 0);
1582     else {
1583         TCGv_i32 t2 = tcg_temp_new_i32();
1584         TCGv_ptr addr = tcg_temp_new_ptr();
1585
1586         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1587         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1588         tcg_gen_andi_i32(t2, t2, 0xf);
1589         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1590         tcg_gen_ext_i32_ptr(addr, t2);
1591         tcg_gen_add_ptr(addr, cpu_env, addr);
1592
1593         tcg_gen_ld_tl(t0, addr, sizeof(target_ulong) * from);
1594         tcg_temp_free_ptr(addr);
1595         tcg_temp_free_i32(t2);
1596     }
1597     gen_store_gpr(t0, to);
1598     tcg_temp_free(t0);
1599 }
1600
1601 static inline void gen_store_srsgpr (int from, int to)
1602 {
1603     if (to != 0) {
1604         TCGv t0 = tcg_temp_new();
1605         TCGv_i32 t2 = tcg_temp_new_i32();
1606         TCGv_ptr addr = tcg_temp_new_ptr();
1607
1608         gen_load_gpr(t0, from);
1609         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1610         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1611         tcg_gen_andi_i32(t2, t2, 0xf);
1612         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1613         tcg_gen_ext_i32_ptr(addr, t2);
1614         tcg_gen_add_ptr(addr, cpu_env, addr);
1615
1616         tcg_gen_st_tl(t0, addr, sizeof(target_ulong) * to);
1617         tcg_temp_free_ptr(addr);
1618         tcg_temp_free_i32(t2);
1619         tcg_temp_free(t0);
1620     }
1621 }
1622
1623 /* Tests */
1624 static inline void gen_save_pc(target_ulong pc)
1625 {
1626     tcg_gen_movi_tl(cpu_PC, pc);
1627 }
1628
1629 static inline void save_cpu_state(DisasContext *ctx, int do_save_pc)
1630 {
1631     LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags);
1632     if (do_save_pc && ctx->base.pc_next != ctx->saved_pc) {
1633         gen_save_pc(ctx->base.pc_next);
1634         ctx->saved_pc = ctx->base.pc_next;
1635     }
1636     if (ctx->hflags != ctx->saved_hflags) {
1637         tcg_gen_movi_i32(hflags, ctx->hflags);
1638         ctx->saved_hflags = ctx->hflags;
1639         switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1640         case MIPS_HFLAG_BR:
1641             break;
1642         case MIPS_HFLAG_BC:
1643         case MIPS_HFLAG_BL:
1644         case MIPS_HFLAG_B:
1645             tcg_gen_movi_tl(btarget, ctx->btarget);
1646             break;
1647         }
1648     }
1649 }
1650
1651 static inline void restore_cpu_state(CPUMIPSState *env, DisasContext *ctx)
1652 {
1653     ctx->saved_hflags = ctx->hflags;
1654     switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1655     case MIPS_HFLAG_BR:
1656         break;
1657     case MIPS_HFLAG_BC:
1658     case MIPS_HFLAG_BL:
1659     case MIPS_HFLAG_B:
1660         ctx->btarget = env->btarget;
1661         break;
1662     }
1663 }
1664
1665 static inline void generate_exception_err(DisasContext *ctx, int excp, int err)
1666 {
1667     TCGv_i32 texcp = tcg_const_i32(excp);
1668     TCGv_i32 terr = tcg_const_i32(err);
1669     save_cpu_state(ctx, 1);
1670     gen_helper_raise_exception_err(cpu_env, texcp, terr);
1671     tcg_temp_free_i32(terr);
1672     tcg_temp_free_i32(texcp);
1673     ctx->base.is_jmp = DISAS_NORETURN;
1674 }
1675
1676 static inline void generate_exception(DisasContext *ctx, int excp)
1677 {
1678     gen_helper_0e0i(raise_exception, excp);
1679 }
1680
1681 static inline void generate_exception_end(DisasContext *ctx, int excp)
1682 {
1683     generate_exception_err(ctx, excp, 0);
1684 }
1685
1686 /* Floating point register moves. */
1687 static void gen_load_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
1688 {
1689     if (ctx->hflags & MIPS_HFLAG_FRE) {
1690         generate_exception(ctx, EXCP_RI);
1691     }
1692     tcg_gen_extrl_i64_i32(t, fpu_f64[reg]);
1693 }
1694
1695 static void gen_store_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
1696 {
1697     TCGv_i64 t64;
1698     if (ctx->hflags & MIPS_HFLAG_FRE) {
1699         generate_exception(ctx, EXCP_RI);
1700     }
1701     t64 = tcg_temp_new_i64();
1702     tcg_gen_extu_i32_i64(t64, t);
1703     tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 0, 32);
1704     tcg_temp_free_i64(t64);
1705 }
1706
1707 static void gen_load_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
1708 {
1709     if (ctx->hflags & MIPS_HFLAG_F64) {
1710         tcg_gen_extrh_i64_i32(t, fpu_f64[reg]);
1711     } else {
1712         gen_load_fpr32(ctx, t, reg | 1);
1713     }
1714 }
1715
1716 static void gen_store_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
1717 {
1718     if (ctx->hflags & MIPS_HFLAG_F64) {
1719         TCGv_i64 t64 = tcg_temp_new_i64();
1720         tcg_gen_extu_i32_i64(t64, t);
1721         tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 32, 32);
1722         tcg_temp_free_i64(t64);
1723     } else {
1724         gen_store_fpr32(ctx, t, reg | 1);
1725     }
1726 }
1727
1728 static void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1729 {
1730     if (ctx->hflags & MIPS_HFLAG_F64) {
1731         tcg_gen_mov_i64(t, fpu_f64[reg]);
1732     } else {
1733         tcg_gen_concat32_i64(t, fpu_f64[reg & ~1], fpu_f64[reg | 1]);
1734     }
1735 }
1736
1737 static void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1738 {
1739     if (ctx->hflags & MIPS_HFLAG_F64) {
1740         tcg_gen_mov_i64(fpu_f64[reg], t);
1741     } else {
1742         TCGv_i64 t0;
1743         tcg_gen_deposit_i64(fpu_f64[reg & ~1], fpu_f64[reg & ~1], t, 0, 32);
1744         t0 = tcg_temp_new_i64();
1745         tcg_gen_shri_i64(t0, t, 32);
1746         tcg_gen_deposit_i64(fpu_f64[reg | 1], fpu_f64[reg | 1], t0, 0, 32);
1747         tcg_temp_free_i64(t0);
1748     }
1749 }
1750
1751 static inline int get_fp_bit (int cc)
1752 {
1753     if (cc)
1754         return 24 + cc;
1755     else
1756         return 23;
1757 }
1758
1759 /* Addresses computation */
1760 static inline void gen_op_addr_add (DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1)
1761 {
1762     tcg_gen_add_tl(ret, arg0, arg1);
1763
1764 #if defined(TARGET_MIPS64)
1765     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1766         tcg_gen_ext32s_i64(ret, ret);
1767     }
1768 #endif
1769 }
1770
1771 static inline void gen_op_addr_addi(DisasContext *ctx, TCGv ret, TCGv base,
1772                                     target_long ofs)
1773 {
1774     tcg_gen_addi_tl(ret, base, ofs);
1775
1776 #if defined(TARGET_MIPS64)
1777     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1778         tcg_gen_ext32s_i64(ret, ret);
1779     }
1780 #endif
1781 }
1782
1783 /* Addresses computation (translation time) */
1784 static target_long addr_add(DisasContext *ctx, target_long base,
1785                             target_long offset)
1786 {
1787     target_long sum = base + offset;
1788
1789 #if defined(TARGET_MIPS64)
1790     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1791         sum = (int32_t)sum;
1792     }
1793 #endif
1794     return sum;
1795 }
1796
1797 /* Sign-extract the low 32-bits to a target_long.  */
1798 static inline void gen_move_low32(TCGv ret, TCGv_i64 arg)
1799 {
1800 #if defined(TARGET_MIPS64)
1801     tcg_gen_ext32s_i64(ret, arg);
1802 #else
1803     tcg_gen_extrl_i64_i32(ret, arg);
1804 #endif
1805 }
1806
1807 /* Sign-extract the high 32-bits to a target_long.  */
1808 static inline void gen_move_high32(TCGv ret, TCGv_i64 arg)
1809 {
1810 #if defined(TARGET_MIPS64)
1811     tcg_gen_sari_i64(ret, arg, 32);
1812 #else
1813     tcg_gen_extrh_i64_i32(ret, arg);
1814 #endif
1815 }
1816
1817 static inline void check_cp0_enabled(DisasContext *ctx)
1818 {
1819     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0)))
1820         generate_exception_err(ctx, EXCP_CpU, 0);
1821 }
1822
1823 static inline void check_cp1_enabled(DisasContext *ctx)
1824 {
1825     if (unlikely(!(ctx->hflags & MIPS_HFLAG_FPU)))
1826         generate_exception_err(ctx, EXCP_CpU, 1);
1827 }
1828
1829 /* Verify that the processor is running with COP1X instructions enabled.
1830    This is associated with the nabla symbol in the MIPS32 and MIPS64
1831    opcode tables.  */
1832
1833 static inline void check_cop1x(DisasContext *ctx)
1834 {
1835     if (unlikely(!(ctx->hflags & MIPS_HFLAG_COP1X)))
1836         generate_exception_end(ctx, EXCP_RI);
1837 }
1838
1839 /* Verify that the processor is running with 64-bit floating-point
1840    operations enabled.  */
1841
1842 static inline void check_cp1_64bitmode(DisasContext *ctx)
1843 {
1844     if (unlikely(~ctx->hflags & (MIPS_HFLAG_F64 | MIPS_HFLAG_COP1X)))
1845         generate_exception_end(ctx, EXCP_RI);
1846 }
1847
1848 /*
1849  * Verify if floating point register is valid; an operation is not defined
1850  * if bit 0 of any register specification is set and the FR bit in the
1851  * Status register equals zero, since the register numbers specify an
1852  * even-odd pair of adjacent coprocessor general registers. When the FR bit
1853  * in the Status register equals one, both even and odd register numbers
1854  * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers.
1855  *
1856  * Multiple 64 bit wide registers can be checked by calling
1857  * gen_op_cp1_registers(freg1 | freg2 | ... | fregN);
1858  */
1859 static inline void check_cp1_registers(DisasContext *ctx, int regs)
1860 {
1861     if (unlikely(!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1)))
1862         generate_exception_end(ctx, EXCP_RI);
1863 }
1864
1865 /* Verify that the processor is running with DSP instructions enabled.
1866    This is enabled by CP0 Status register MX(24) bit.
1867  */
1868
1869 static inline void check_dsp(DisasContext *ctx)
1870 {
1871     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP))) {
1872         if (ctx->insn_flags & ASE_DSP) {
1873             generate_exception_end(ctx, EXCP_DSPDIS);
1874         } else {
1875             generate_exception_end(ctx, EXCP_RI);
1876         }
1877     }
1878 }
1879
1880 static inline void check_dspr2(DisasContext *ctx)
1881 {
1882     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSPR2))) {
1883         if (ctx->insn_flags & ASE_DSP) {
1884             generate_exception_end(ctx, EXCP_DSPDIS);
1885         } else {
1886             generate_exception_end(ctx, EXCP_RI);
1887         }
1888     }
1889 }
1890
1891 /* This code generates a "reserved instruction" exception if the
1892    CPU does not support the instruction set corresponding to flags. */
1893 static inline void check_insn(DisasContext *ctx, int flags)
1894 {
1895     if (unlikely(!(ctx->insn_flags & flags))) {
1896         generate_exception_end(ctx, EXCP_RI);
1897     }
1898 }
1899
1900 /* This code generates a "reserved instruction" exception if the
1901    CPU has corresponding flag set which indicates that the instruction
1902    has been removed. */
1903 static inline void check_insn_opc_removed(DisasContext *ctx, int flags)
1904 {
1905     if (unlikely(ctx->insn_flags & flags)) {
1906         generate_exception_end(ctx, EXCP_RI);
1907     }
1908 }
1909
1910 /* This code generates a "reserved instruction" exception if the
1911    CPU does not support 64-bit paired-single (PS) floating point data type */
1912 static inline void check_ps(DisasContext *ctx)
1913 {
1914     if (unlikely(!ctx->ps)) {
1915         generate_exception(ctx, EXCP_RI);
1916     }
1917     check_cp1_64bitmode(ctx);
1918 }
1919
1920 #ifdef TARGET_MIPS64
1921 /* This code generates a "reserved instruction" exception if 64-bit
1922    instructions are not enabled. */
1923 static inline void check_mips_64(DisasContext *ctx)
1924 {
1925     if (unlikely(!(ctx->hflags & MIPS_HFLAG_64)))
1926         generate_exception_end(ctx, EXCP_RI);
1927 }
1928 #endif
1929
1930 #ifndef CONFIG_USER_ONLY
1931 static inline void check_mvh(DisasContext *ctx)
1932 {
1933     if (unlikely(!ctx->mvh)) {
1934         generate_exception(ctx, EXCP_RI);
1935     }
1936 }
1937 #endif
1938
1939 /*
1940  * This code generates a "reserved instruction" exception if the
1941  * Config5 XNP bit is set.
1942  */
1943 static inline void check_xnp(DisasContext *ctx)
1944 {
1945     if (unlikely(ctx->CP0_Config5 & (1 << CP0C5_XNP))) {
1946         generate_exception_end(ctx, EXCP_RI);
1947     }
1948 }
1949
1950 /*
1951  * This code generates a "reserved instruction" exception if the
1952  * Config3 MT bit is NOT set.
1953  */
1954 static inline void check_mt(DisasContext *ctx)
1955 {
1956     if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_MT)))) {
1957         generate_exception_end(ctx, EXCP_RI);
1958     }
1959 }
1960
1961 #ifndef CONFIG_USER_ONLY
1962 /*
1963  * This code generates a "coprocessor unusable" exception if CP0 is not
1964  * available, and, if that is not the case, generates a "reserved instruction"
1965  * exception if the Config5 MT bit is NOT set. This is needed for availability
1966  * control of some of MT ASE instructions.
1967  */
1968 static inline void check_cp0_mt(DisasContext *ctx)
1969 {
1970     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0))) {
1971         generate_exception_err(ctx, EXCP_CpU, 0);
1972     } else {
1973         if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_MT)))) {
1974             generate_exception_err(ctx, EXCP_RI, 0);
1975         }
1976     }
1977 }
1978 #endif
1979
1980 /*
1981  * This code generates a "reserved instruction" exception if the
1982  * Config5 NMS bit is set.
1983  */
1984 static inline void check_nms(DisasContext *ctx)
1985 {
1986     if (unlikely(ctx->CP0_Config5 & (1 << CP0C5_NMS))) {
1987         generate_exception_end(ctx, EXCP_RI);
1988     }
1989 }
1990
1991
1992 /* Define small wrappers for gen_load_fpr* so that we have a uniform
1993    calling interface for 32 and 64-bit FPRs.  No sense in changing
1994    all callers for gen_load_fpr32 when we need the CTX parameter for
1995    this one use.  */
1996 #define gen_ldcmp_fpr32(ctx, x, y) gen_load_fpr32(ctx, x, y)
1997 #define gen_ldcmp_fpr64(ctx, x, y) gen_load_fpr64(ctx, x, y)
1998 #define FOP_CONDS(type, abs, fmt, ifmt, bits)                                 \
1999 static inline void gen_cmp ## type ## _ ## fmt(DisasContext *ctx, int n,      \
2000                                                int ft, int fs, int cc)        \
2001 {                                                                             \
2002     TCGv_i##bits fp0 = tcg_temp_new_i##bits ();                               \
2003     TCGv_i##bits fp1 = tcg_temp_new_i##bits ();                               \
2004     switch (ifmt) {                                                           \
2005     case FMT_PS:                                                              \
2006         check_ps(ctx);                                                        \
2007         break;                                                                \
2008     case FMT_D:                                                               \
2009         if (abs) {                                                            \
2010             check_cop1x(ctx);                                                 \
2011         }                                                                     \
2012         check_cp1_registers(ctx, fs | ft);                                    \
2013         break;                                                                \
2014     case FMT_S:                                                               \
2015         if (abs) {                                                            \
2016             check_cop1x(ctx);                                                 \
2017         }                                                                     \
2018         break;                                                                \
2019     }                                                                         \
2020     gen_ldcmp_fpr##bits (ctx, fp0, fs);                                       \
2021     gen_ldcmp_fpr##bits (ctx, fp1, ft);                                       \
2022     switch (n) {                                                              \
2023     case  0: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc);    break;\
2024     case  1: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc);   break;\
2025     case  2: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc);   break;\
2026     case  3: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc);  break;\
2027     case  4: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc);  break;\
2028     case  5: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc);  break;\
2029     case  6: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc);  break;\
2030     case  7: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc);  break;\
2031     case  8: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc);   break;\
2032     case  9: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc); break;\
2033     case 10: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc);  break;\
2034     case 11: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc);  break;\
2035     case 12: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc);   break;\
2036     case 13: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc);  break;\
2037     case 14: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc);   break;\
2038     case 15: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc);  break;\
2039     default: abort();                                                         \
2040     }                                                                         \
2041     tcg_temp_free_i##bits (fp0);                                              \
2042     tcg_temp_free_i##bits (fp1);                                              \
2043 }
2044
2045 FOP_CONDS(, 0, d, FMT_D, 64)
2046 FOP_CONDS(abs, 1, d, FMT_D, 64)
2047 FOP_CONDS(, 0, s, FMT_S, 32)
2048 FOP_CONDS(abs, 1, s, FMT_S, 32)
2049 FOP_CONDS(, 0, ps, FMT_PS, 64)
2050 FOP_CONDS(abs, 1, ps, FMT_PS, 64)
2051 #undef FOP_CONDS
2052
2053 #define FOP_CONDNS(fmt, ifmt, bits, STORE)                              \
2054 static inline void gen_r6_cmp_ ## fmt(DisasContext * ctx, int n,        \
2055                                       int ft, int fs, int fd)           \
2056 {                                                                       \
2057     TCGv_i ## bits fp0 = tcg_temp_new_i ## bits();                      \
2058     TCGv_i ## bits fp1 = tcg_temp_new_i ## bits();                      \
2059     if (ifmt == FMT_D) {                                                \
2060         check_cp1_registers(ctx, fs | ft | fd);                         \
2061     }                                                                   \
2062     gen_ldcmp_fpr ## bits(ctx, fp0, fs);                                \
2063     gen_ldcmp_fpr ## bits(ctx, fp1, ft);                                \
2064     switch (n) {                                                        \
2065     case  0:                                                            \
2066         gen_helper_r6_cmp_ ## fmt ## _af(fp0, cpu_env, fp0, fp1);       \
2067         break;                                                          \
2068     case  1:                                                            \
2069         gen_helper_r6_cmp_ ## fmt ## _un(fp0, cpu_env, fp0, fp1);       \
2070         break;                                                          \
2071     case  2:                                                            \
2072         gen_helper_r6_cmp_ ## fmt ## _eq(fp0, cpu_env, fp0, fp1);       \
2073         break;                                                          \
2074     case  3:                                                            \
2075         gen_helper_r6_cmp_ ## fmt ## _ueq(fp0, cpu_env, fp0, fp1);      \
2076         break;                                                          \
2077     case  4:                                                            \
2078         gen_helper_r6_cmp_ ## fmt ## _lt(fp0, cpu_env, fp0, fp1);       \
2079         break;                                                          \
2080     case  5:                                                            \
2081         gen_helper_r6_cmp_ ## fmt ## _ult(fp0, cpu_env, fp0, fp1);      \
2082         break;                                                          \
2083     case  6:                                                            \
2084         gen_helper_r6_cmp_ ## fmt ## _le(fp0, cpu_env, fp0, fp1);       \
2085         break;                                                          \
2086     case  7:                                                            \
2087         gen_helper_r6_cmp_ ## fmt ## _ule(fp0, cpu_env, fp0, fp1);      \
2088         break;                                                          \
2089     case  8:                                                            \
2090         gen_helper_r6_cmp_ ## fmt ## _saf(fp0, cpu_env, fp0, fp1);      \
2091         break;                                                          \
2092     case  9:                                                            \
2093         gen_helper_r6_cmp_ ## fmt ## _sun(fp0, cpu_env, fp0, fp1);      \
2094         break;                                                          \
2095     case 10:                                                            \
2096         gen_helper_r6_cmp_ ## fmt ## _seq(fp0, cpu_env, fp0, fp1);      \
2097         break;                                                          \
2098     case 11:                                                            \
2099         gen_helper_r6_cmp_ ## fmt ## _sueq(fp0, cpu_env, fp0, fp1);     \
2100         break;                                                          \
2101     case 12:                                                            \
2102         gen_helper_r6_cmp_ ## fmt ## _slt(fp0, cpu_env, fp0, fp1);      \
2103         break;                                                          \
2104     case 13:                                                            \
2105         gen_helper_r6_cmp_ ## fmt ## _sult(fp0, cpu_env, fp0, fp1);     \
2106         break;                                                          \
2107     case 14:                                                            \
2108         gen_helper_r6_cmp_ ## fmt ## _sle(fp0, cpu_env, fp0, fp1);      \
2109         break;                                                          \
2110     case 15:                                                            \
2111         gen_helper_r6_cmp_ ## fmt ## _sule(fp0, cpu_env, fp0, fp1);     \
2112         break;                                                          \
2113     case 17:                                                            \
2114         gen_helper_r6_cmp_ ## fmt ## _or(fp0, cpu_env, fp0, fp1);       \
2115         break;                                                          \
2116     case 18:                                                            \
2117         gen_helper_r6_cmp_ ## fmt ## _une(fp0, cpu_env, fp0, fp1);      \
2118         break;                                                          \
2119     case 19:                                                            \
2120         gen_helper_r6_cmp_ ## fmt ## _ne(fp0, cpu_env, fp0, fp1);       \
2121         break;                                                          \
2122     case 25:                                                            \
2123         gen_helper_r6_cmp_ ## fmt ## _sor(fp0, cpu_env, fp0, fp1);      \
2124         break;                                                          \
2125     case 26:                                                            \
2126         gen_helper_r6_cmp_ ## fmt ## _sune(fp0, cpu_env, fp0, fp1);     \
2127         break;                                                          \
2128     case 27:                                                            \
2129         gen_helper_r6_cmp_ ## fmt ## _sne(fp0, cpu_env, fp0, fp1);      \
2130         break;                                                          \
2131     default:                                                            \
2132         abort();                                                        \
2133     }                                                                   \
2134     STORE;                                                              \
2135     tcg_temp_free_i ## bits (fp0);                                      \
2136     tcg_temp_free_i ## bits (fp1);                                      \
2137 }
2138
2139 FOP_CONDNS(d, FMT_D, 64, gen_store_fpr64(ctx, fp0, fd))
2140 FOP_CONDNS(s, FMT_S, 32, gen_store_fpr32(ctx, fp0, fd))
2141 #undef FOP_CONDNS
2142 #undef gen_ldcmp_fpr32
2143 #undef gen_ldcmp_fpr64
2144
2145 /* load/store instructions. */
2146 #ifdef CONFIG_USER_ONLY
2147 #define OP_LD_ATOMIC(insn,fname)                                           \
2148 static inline void op_ld_##insn(TCGv ret, TCGv arg1, int mem_idx,          \
2149                                 DisasContext *ctx)                         \
2150 {                                                                          \
2151     TCGv t0 = tcg_temp_new();                                              \
2152     tcg_gen_mov_tl(t0, arg1);                                              \
2153     tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                         \
2154     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                \
2155     tcg_gen_st_tl(ret, cpu_env, offsetof(CPUMIPSState, llval));                \
2156     tcg_temp_free(t0);                                                     \
2157 }
2158 #else
2159 #define OP_LD_ATOMIC(insn,fname)                                           \
2160 static inline void op_ld_##insn(TCGv ret, TCGv arg1, int mem_idx,          \
2161                                 DisasContext *ctx)                         \
2162 {                                                                          \
2163     gen_helper_1e1i(insn, ret, arg1, mem_idx);                             \
2164 }
2165 #endif
2166 OP_LD_ATOMIC(ll,ld32s);
2167 #if defined(TARGET_MIPS64)
2168 OP_LD_ATOMIC(lld,ld64);
2169 #endif
2170 #undef OP_LD_ATOMIC
2171
2172 #ifdef CONFIG_USER_ONLY
2173 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
2174 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, int mem_idx,   \
2175                                 DisasContext *ctx)                           \
2176 {                                                                            \
2177     TCGv t0 = tcg_temp_new();                                                \
2178     TCGLabel *l1 = gen_new_label();                                          \
2179     TCGLabel *l2 = gen_new_label();                                          \
2180                                                                              \
2181     tcg_gen_andi_tl(t0, arg2, almask);                                       \
2182     tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1);                              \
2183     tcg_gen_st_tl(arg2, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));          \
2184     generate_exception(ctx, EXCP_AdES);                                      \
2185     gen_set_label(l1);                                                       \
2186     tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                  \
2187     tcg_gen_brcond_tl(TCG_COND_NE, arg2, t0, l2);                            \
2188     tcg_gen_movi_tl(t0, rt | ((almask << 3) & 0x20));                        \
2189     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, llreg));                   \
2190     tcg_gen_st_tl(arg1, cpu_env, offsetof(CPUMIPSState, llnewval));              \
2191     generate_exception_end(ctx, EXCP_SC);                                    \
2192     gen_set_label(l2);                                                       \
2193     tcg_gen_movi_tl(t0, 0);                                                  \
2194     gen_store_gpr(t0, rt);                                                   \
2195     tcg_temp_free(t0);                                                       \
2196 }
2197 #else
2198 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
2199 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, int mem_idx,   \
2200                                 DisasContext *ctx)                           \
2201 {                                                                            \
2202     TCGv t0 = tcg_temp_new();                                                \
2203     gen_helper_1e2i(insn, t0, arg1, arg2, mem_idx);                          \
2204     gen_store_gpr(t0, rt);                                                   \
2205     tcg_temp_free(t0);                                                       \
2206 }
2207 #endif
2208 OP_ST_ATOMIC(sc,st32,ld32s,0x3);
2209 #if defined(TARGET_MIPS64)
2210 OP_ST_ATOMIC(scd,st64,ld64,0x7);
2211 #endif
2212 #undef OP_ST_ATOMIC
2213
2214 static void gen_base_offset_addr (DisasContext *ctx, TCGv addr,
2215                                   int base, int offset)
2216 {
2217     if (base == 0) {
2218         tcg_gen_movi_tl(addr, offset);
2219     } else if (offset == 0) {
2220         gen_load_gpr(addr, base);
2221     } else {
2222         tcg_gen_movi_tl(addr, offset);
2223         gen_op_addr_add(ctx, addr, cpu_gpr[base], addr);
2224     }
2225 }
2226
2227 static target_ulong pc_relative_pc (DisasContext *ctx)
2228 {
2229     target_ulong pc = ctx->base.pc_next;
2230
2231     if (ctx->hflags & MIPS_HFLAG_BMASK) {
2232         int branch_bytes = ctx->hflags & MIPS_HFLAG_BDS16 ? 2 : 4;
2233
2234         pc -= branch_bytes;
2235     }
2236
2237     pc &= ~(target_ulong)3;
2238     return pc;
2239 }
2240
2241 /* Load */
2242 static void gen_ld(DisasContext *ctx, uint32_t opc,
2243                    int rt, int base, int offset)
2244 {
2245     TCGv t0, t1, t2;
2246     int mem_idx = ctx->mem_idx;
2247
2248     if (rt == 0 && ctx->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)) {
2249         /* Loongson CPU uses a load to zero register for prefetch.
2250            We emulate it as a NOP. On other CPU we must perform the
2251            actual memory access. */
2252         return;
2253     }
2254
2255     t0 = tcg_temp_new();
2256     gen_base_offset_addr(ctx, t0, base, offset);
2257
2258     switch (opc) {
2259 #if defined(TARGET_MIPS64)
2260     case OPC_LWU:
2261         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL |
2262                            ctx->default_tcg_memop_mask);
2263         gen_store_gpr(t0, rt);
2264         break;
2265     case OPC_LD:
2266         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ |
2267                            ctx->default_tcg_memop_mask);
2268         gen_store_gpr(t0, rt);
2269         break;
2270     case OPC_LLD:
2271     case R6_OPC_LLD:
2272         op_ld_lld(t0, t0, mem_idx, ctx);
2273         gen_store_gpr(t0, rt);
2274         break;
2275     case OPC_LDL:
2276         t1 = tcg_temp_new();
2277         /* Do a byte access to possibly trigger a page
2278            fault with the unaligned address.  */
2279         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
2280         tcg_gen_andi_tl(t1, t0, 7);
2281 #ifndef TARGET_WORDS_BIGENDIAN
2282         tcg_gen_xori_tl(t1, t1, 7);
2283 #endif
2284         tcg_gen_shli_tl(t1, t1, 3);
2285         tcg_gen_andi_tl(t0, t0, ~7);
2286         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
2287         tcg_gen_shl_tl(t0, t0, t1);
2288         t2 = tcg_const_tl(-1);
2289         tcg_gen_shl_tl(t2, t2, t1);
2290         gen_load_gpr(t1, rt);
2291         tcg_gen_andc_tl(t1, t1, t2);
2292         tcg_temp_free(t2);
2293         tcg_gen_or_tl(t0, t0, t1);
2294         tcg_temp_free(t1);
2295         gen_store_gpr(t0, rt);
2296         break;
2297     case OPC_LDR:
2298         t1 = tcg_temp_new();
2299         /* Do a byte access to possibly trigger a page
2300            fault with the unaligned address.  */
2301         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
2302         tcg_gen_andi_tl(t1, t0, 7);
2303 #ifdef TARGET_WORDS_BIGENDIAN
2304         tcg_gen_xori_tl(t1, t1, 7);
2305 #endif
2306         tcg_gen_shli_tl(t1, t1, 3);
2307         tcg_gen_andi_tl(t0, t0, ~7);
2308         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
2309         tcg_gen_shr_tl(t0, t0, t1);
2310         tcg_gen_xori_tl(t1, t1, 63);
2311         t2 = tcg_const_tl(0xfffffffffffffffeull);
2312         tcg_gen_shl_tl(t2, t2, t1);
2313         gen_load_gpr(t1, rt);
2314         tcg_gen_and_tl(t1, t1, t2);
2315         tcg_temp_free(t2);
2316         tcg_gen_or_tl(t0, t0, t1);
2317         tcg_temp_free(t1);
2318         gen_store_gpr(t0, rt);
2319         break;
2320     case OPC_LDPC:
2321         t1 = tcg_const_tl(pc_relative_pc(ctx));
2322         gen_op_addr_add(ctx, t0, t0, t1);
2323         tcg_temp_free(t1);
2324         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
2325         gen_store_gpr(t0, rt);
2326         break;
2327 #endif
2328     case OPC_LWPC:
2329         t1 = tcg_const_tl(pc_relative_pc(ctx));
2330         gen_op_addr_add(ctx, t0, t0, t1);
2331         tcg_temp_free(t1);
2332         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESL);
2333         gen_store_gpr(t0, rt);
2334         break;
2335     case OPC_LWE:
2336         mem_idx = MIPS_HFLAG_UM;
2337         /* fall through */
2338     case OPC_LW:
2339         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESL |
2340                            ctx->default_tcg_memop_mask);
2341         gen_store_gpr(t0, rt);
2342         break;
2343     case OPC_LHE:
2344         mem_idx = MIPS_HFLAG_UM;
2345         /* fall through */
2346     case OPC_LH:
2347         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESW |
2348                            ctx->default_tcg_memop_mask);
2349         gen_store_gpr(t0, rt);
2350         break;
2351     case OPC_LHUE:
2352         mem_idx = MIPS_HFLAG_UM;
2353         /* fall through */
2354     case OPC_LHU:
2355         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUW |
2356                            ctx->default_tcg_memop_mask);
2357         gen_store_gpr(t0, rt);
2358         break;
2359     case OPC_LBE:
2360         mem_idx = MIPS_HFLAG_UM;
2361         /* fall through */
2362     case OPC_LB:
2363         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_SB);
2364         gen_store_gpr(t0, rt);
2365         break;
2366     case OPC_LBUE:
2367         mem_idx = MIPS_HFLAG_UM;
2368         /* fall through */
2369     case OPC_LBU:
2370         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_UB);
2371         gen_store_gpr(t0, rt);
2372         break;
2373     case OPC_LWLE:
2374         mem_idx = MIPS_HFLAG_UM;
2375         /* fall through */
2376     case OPC_LWL:
2377         t1 = tcg_temp_new();
2378         /* Do a byte access to possibly trigger a page
2379            fault with the unaligned address.  */
2380         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
2381         tcg_gen_andi_tl(t1, t0, 3);
2382 #ifndef TARGET_WORDS_BIGENDIAN
2383         tcg_gen_xori_tl(t1, t1, 3);
2384 #endif
2385         tcg_gen_shli_tl(t1, t1, 3);
2386         tcg_gen_andi_tl(t0, t0, ~3);
2387         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL);
2388         tcg_gen_shl_tl(t0, t0, t1);
2389         t2 = tcg_const_tl(-1);
2390         tcg_gen_shl_tl(t2, t2, t1);
2391         gen_load_gpr(t1, rt);
2392         tcg_gen_andc_tl(t1, t1, t2);
2393         tcg_temp_free(t2);
2394         tcg_gen_or_tl(t0, t0, t1);
2395         tcg_temp_free(t1);
2396         tcg_gen_ext32s_tl(t0, t0);
2397         gen_store_gpr(t0, rt);
2398         break;
2399     case OPC_LWRE:
2400         mem_idx = MIPS_HFLAG_UM;
2401         /* fall through */
2402     case OPC_LWR:
2403         t1 = tcg_temp_new();
2404         /* Do a byte access to possibly trigger a page
2405            fault with the unaligned address.  */
2406         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
2407         tcg_gen_andi_tl(t1, t0, 3);
2408 #ifdef TARGET_WORDS_BIGENDIAN
2409         tcg_gen_xori_tl(t1, t1, 3);
2410 #endif
2411         tcg_gen_shli_tl(t1, t1, 3);
2412         tcg_gen_andi_tl(t0, t0, ~3);
2413         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL);
2414         tcg_gen_shr_tl(t0, t0, t1);
2415         tcg_gen_xori_tl(t1, t1, 31);
2416         t2 = tcg_const_tl(0xfffffffeull);
2417         tcg_gen_shl_tl(t2, t2, t1);
2418         gen_load_gpr(t1, rt);
2419         tcg_gen_and_tl(t1, t1, t2);
2420         tcg_temp_free(t2);
2421         tcg_gen_or_tl(t0, t0, t1);
2422         tcg_temp_free(t1);
2423         tcg_gen_ext32s_tl(t0, t0);
2424         gen_store_gpr(t0, rt);
2425         break;
2426     case OPC_LLE:
2427         mem_idx = MIPS_HFLAG_UM;
2428         /* fall through */
2429     case OPC_LL:
2430     case R6_OPC_LL:
2431         op_ld_ll(t0, t0, mem_idx, ctx);
2432         gen_store_gpr(t0, rt);
2433         break;
2434     }
2435     tcg_temp_free(t0);
2436 }
2437
2438 static void gen_llwp(DisasContext *ctx, uint32_t base, int16_t offset,
2439                     uint32_t reg1, uint32_t reg2)
2440 {
2441     TCGv taddr = tcg_temp_new();
2442     TCGv_i64 tval = tcg_temp_new_i64();
2443     TCGv tmp1 = tcg_temp_new();
2444     TCGv tmp2 = tcg_temp_new();
2445
2446     gen_base_offset_addr(ctx, taddr, base, offset);
2447     tcg_gen_qemu_ld64(tval, taddr, ctx->mem_idx);
2448 #ifdef TARGET_WORDS_BIGENDIAN
2449     tcg_gen_extr_i64_tl(tmp2, tmp1, tval);
2450 #else
2451     tcg_gen_extr_i64_tl(tmp1, tmp2, tval);
2452 #endif
2453     gen_store_gpr(tmp1, reg1);
2454     tcg_temp_free(tmp1);
2455     gen_store_gpr(tmp2, reg2);
2456     tcg_temp_free(tmp2);
2457     tcg_gen_st_i64(tval, cpu_env, offsetof(CPUMIPSState, llval_wp));
2458     tcg_temp_free_i64(tval);
2459     tcg_gen_st_tl(taddr, cpu_env, offsetof(CPUMIPSState, lladdr));
2460     tcg_temp_free(taddr);
2461 }
2462
2463 /* Store */
2464 static void gen_st (DisasContext *ctx, uint32_t opc, int rt,
2465                     int base, int offset)
2466 {
2467     TCGv t0 = tcg_temp_new();
2468     TCGv t1 = tcg_temp_new();
2469     int mem_idx = ctx->mem_idx;
2470
2471     gen_base_offset_addr(ctx, t0, base, offset);
2472     gen_load_gpr(t1, rt);
2473     switch (opc) {
2474 #if defined(TARGET_MIPS64)
2475     case OPC_SD:
2476         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEQ |
2477                            ctx->default_tcg_memop_mask);
2478         break;
2479     case OPC_SDL:
2480         gen_helper_0e2i(sdl, t1, t0, mem_idx);
2481         break;
2482     case OPC_SDR:
2483         gen_helper_0e2i(sdr, t1, t0, mem_idx);
2484         break;
2485 #endif
2486     case OPC_SWE:
2487         mem_idx = MIPS_HFLAG_UM;
2488         /* fall through */
2489     case OPC_SW:
2490         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEUL |
2491                            ctx->default_tcg_memop_mask);
2492         break;
2493     case OPC_SHE:
2494         mem_idx = MIPS_HFLAG_UM;
2495         /* fall through */
2496     case OPC_SH:
2497         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEUW |
2498                            ctx->default_tcg_memop_mask);
2499         break;
2500     case OPC_SBE:
2501         mem_idx = MIPS_HFLAG_UM;
2502         /* fall through */
2503     case OPC_SB:
2504         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_8);
2505         break;
2506     case OPC_SWLE:
2507         mem_idx = MIPS_HFLAG_UM;
2508         /* fall through */
2509     case OPC_SWL:
2510         gen_helper_0e2i(swl, t1, t0, mem_idx);
2511         break;
2512     case OPC_SWRE:
2513         mem_idx = MIPS_HFLAG_UM;
2514         /* fall through */
2515     case OPC_SWR:
2516         gen_helper_0e2i(swr, t1, t0, mem_idx);
2517         break;
2518     }
2519     tcg_temp_free(t0);
2520     tcg_temp_free(t1);
2521 }
2522
2523
2524 /* Store conditional */
2525 static void gen_st_cond (DisasContext *ctx, uint32_t opc, int rt,
2526                          int base, int16_t offset)
2527 {
2528     TCGv t0, t1;
2529     int mem_idx = ctx->mem_idx;
2530
2531 #ifdef CONFIG_USER_ONLY
2532     t0 = tcg_temp_local_new();
2533     t1 = tcg_temp_local_new();
2534 #else
2535     t0 = tcg_temp_new();
2536     t1 = tcg_temp_new();
2537 #endif
2538     gen_base_offset_addr(ctx, t0, base, offset);
2539     gen_load_gpr(t1, rt);
2540     switch (opc) {
2541 #if defined(TARGET_MIPS64)
2542     case OPC_SCD:
2543     case R6_OPC_SCD:
2544         op_st_scd(t1, t0, rt, mem_idx, ctx);
2545         break;
2546 #endif
2547     case OPC_SCE:
2548         mem_idx = MIPS_HFLAG_UM;
2549         /* fall through */
2550     case OPC_SC:
2551     case R6_OPC_SC:
2552         op_st_sc(t1, t0, rt, mem_idx, ctx);
2553         break;
2554     }
2555     tcg_temp_free(t1);
2556     tcg_temp_free(t0);
2557 }
2558
2559 static void gen_scwp(DisasContext *ctx, uint32_t base, int16_t offset,
2560                     uint32_t reg1, uint32_t reg2)
2561 {
2562     TCGv taddr = tcg_temp_local_new();
2563     TCGv lladdr = tcg_temp_local_new();
2564     TCGv_i64 tval = tcg_temp_new_i64();
2565     TCGv_i64 llval = tcg_temp_new_i64();
2566     TCGv_i64 val = tcg_temp_new_i64();
2567     TCGv tmp1 = tcg_temp_new();
2568     TCGv tmp2 = tcg_temp_new();
2569     TCGLabel *lab_fail = gen_new_label();
2570     TCGLabel *lab_done = gen_new_label();
2571
2572     gen_base_offset_addr(ctx, taddr, base, offset);
2573
2574     tcg_gen_ld_tl(lladdr, cpu_env, offsetof(CPUMIPSState, lladdr));
2575     tcg_gen_brcond_tl(TCG_COND_NE, taddr, lladdr, lab_fail);
2576
2577     gen_load_gpr(tmp1, reg1);
2578     gen_load_gpr(tmp2, reg2);
2579
2580 #ifdef TARGET_WORDS_BIGENDIAN
2581     tcg_gen_concat_tl_i64(tval, tmp2, tmp1);
2582 #else
2583     tcg_gen_concat_tl_i64(tval, tmp1, tmp2);
2584 #endif
2585
2586     tcg_gen_ld_i64(llval, cpu_env, offsetof(CPUMIPSState, llval_wp));
2587     tcg_gen_atomic_cmpxchg_i64(val, taddr, llval, tval,
2588                                ctx->mem_idx, MO_64);
2589     if (reg1 != 0) {
2590         tcg_gen_movi_tl(cpu_gpr[reg1], 1);
2591     }
2592     tcg_gen_brcond_i64(TCG_COND_EQ, val, llval, lab_done);
2593
2594     gen_set_label(lab_fail);
2595
2596     if (reg1 != 0) {
2597         tcg_gen_movi_tl(cpu_gpr[reg1], 0);
2598     }
2599     gen_set_label(lab_done);
2600     tcg_gen_movi_tl(lladdr, -1);
2601     tcg_gen_st_tl(lladdr, cpu_env, offsetof(CPUMIPSState, lladdr));
2602 }
2603
2604 /* Load and store */
2605 static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
2606                           TCGv t0)
2607 {
2608     /* Don't do NOP if destination is zero: we must perform the actual
2609        memory access. */
2610     switch (opc) {
2611     case OPC_LWC1:
2612         {
2613             TCGv_i32 fp0 = tcg_temp_new_i32();
2614             tcg_gen_qemu_ld_i32(fp0, t0, ctx->mem_idx, MO_TESL |
2615                                 ctx->default_tcg_memop_mask);
2616             gen_store_fpr32(ctx, fp0, ft);
2617             tcg_temp_free_i32(fp0);
2618         }
2619         break;
2620     case OPC_SWC1:
2621         {
2622             TCGv_i32 fp0 = tcg_temp_new_i32();
2623             gen_load_fpr32(ctx, fp0, ft);
2624             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL |
2625                                 ctx->default_tcg_memop_mask);
2626             tcg_temp_free_i32(fp0);
2627         }
2628         break;
2629     case OPC_LDC1:
2630         {
2631             TCGv_i64 fp0 = tcg_temp_new_i64();
2632             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
2633                                 ctx->default_tcg_memop_mask);
2634             gen_store_fpr64(ctx, fp0, ft);
2635             tcg_temp_free_i64(fp0);
2636         }
2637         break;
2638     case OPC_SDC1:
2639         {
2640             TCGv_i64 fp0 = tcg_temp_new_i64();
2641             gen_load_fpr64(ctx, fp0, ft);
2642             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
2643                                 ctx->default_tcg_memop_mask);
2644             tcg_temp_free_i64(fp0);
2645         }
2646         break;
2647     default:
2648         MIPS_INVAL("flt_ldst");
2649         generate_exception_end(ctx, EXCP_RI);
2650         break;
2651     }
2652 }
2653
2654 static void gen_cop1_ldst(DisasContext *ctx, uint32_t op, int rt,
2655                           int rs, int16_t imm)
2656 {
2657     TCGv t0 = tcg_temp_new();
2658
2659     if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
2660         check_cp1_enabled(ctx);
2661         switch (op) {
2662         case OPC_LDC1:
2663         case OPC_SDC1:
2664             check_insn(ctx, ISA_MIPS2);
2665             /* Fallthrough */
2666         default:
2667             gen_base_offset_addr(ctx, t0, rs, imm);
2668             gen_flt_ldst(ctx, op, rt, t0);
2669         }
2670     } else {
2671         generate_exception_err(ctx, EXCP_CpU, 1);
2672     }
2673     tcg_temp_free(t0);
2674 }
2675
2676 /* Arithmetic with immediate operand */
2677 static void gen_arith_imm(DisasContext *ctx, uint32_t opc,
2678                           int rt, int rs, int imm)
2679 {
2680     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2681
2682     if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) {
2683         /* If no destination, treat it as a NOP.
2684            For addi, we must generate the overflow exception when needed. */
2685         return;
2686     }
2687     switch (opc) {
2688     case OPC_ADDI:
2689         {
2690             TCGv t0 = tcg_temp_local_new();
2691             TCGv t1 = tcg_temp_new();
2692             TCGv t2 = tcg_temp_new();
2693             TCGLabel *l1 = gen_new_label();
2694
2695             gen_load_gpr(t1, rs);
2696             tcg_gen_addi_tl(t0, t1, uimm);
2697             tcg_gen_ext32s_tl(t0, t0);
2698
2699             tcg_gen_xori_tl(t1, t1, ~uimm);
2700             tcg_gen_xori_tl(t2, t0, uimm);
2701             tcg_gen_and_tl(t1, t1, t2);
2702             tcg_temp_free(t2);
2703             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2704             tcg_temp_free(t1);
2705             /* operands of same sign, result different sign */
2706             generate_exception(ctx, EXCP_OVERFLOW);
2707             gen_set_label(l1);
2708             tcg_gen_ext32s_tl(t0, t0);
2709             gen_store_gpr(t0, rt);
2710             tcg_temp_free(t0);
2711         }
2712         break;
2713     case OPC_ADDIU:
2714         if (rs != 0) {
2715             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2716             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
2717         } else {
2718             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2719         }
2720         break;
2721 #if defined(TARGET_MIPS64)
2722     case OPC_DADDI:
2723         {
2724             TCGv t0 = tcg_temp_local_new();
2725             TCGv t1 = tcg_temp_new();
2726             TCGv t2 = tcg_temp_new();
2727             TCGLabel *l1 = gen_new_label();
2728
2729             gen_load_gpr(t1, rs);
2730             tcg_gen_addi_tl(t0, t1, uimm);
2731
2732             tcg_gen_xori_tl(t1, t1, ~uimm);
2733             tcg_gen_xori_tl(t2, t0, uimm);
2734             tcg_gen_and_tl(t1, t1, t2);
2735             tcg_temp_free(t2);
2736             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2737             tcg_temp_free(t1);
2738             /* operands of same sign, result different sign */
2739             generate_exception(ctx, EXCP_OVERFLOW);
2740             gen_set_label(l1);
2741             gen_store_gpr(t0, rt);
2742             tcg_temp_free(t0);
2743         }
2744         break;
2745     case OPC_DADDIU:
2746         if (rs != 0) {
2747             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2748         } else {
2749             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2750         }
2751         break;
2752 #endif
2753     }
2754 }
2755
2756 /* Logic with immediate operand */
2757 static void gen_logic_imm(DisasContext *ctx, uint32_t opc,
2758                           int rt, int rs, int16_t imm)
2759 {
2760     target_ulong uimm;
2761
2762     if (rt == 0) {
2763         /* If no destination, treat it as a NOP. */
2764         return;
2765     }
2766     uimm = (uint16_t)imm;
2767     switch (opc) {
2768     case OPC_ANDI:
2769         if (likely(rs != 0))
2770             tcg_gen_andi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2771         else
2772             tcg_gen_movi_tl(cpu_gpr[rt], 0);
2773         break;
2774     case OPC_ORI:
2775         if (rs != 0)
2776             tcg_gen_ori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2777         else
2778             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2779         break;
2780     case OPC_XORI:
2781         if (likely(rs != 0))
2782             tcg_gen_xori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2783         else
2784             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2785         break;
2786     case OPC_LUI:
2787         if (rs != 0 && (ctx->insn_flags & ISA_MIPS32R6)) {
2788             /* OPC_AUI */
2789             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], imm << 16);
2790             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
2791         } else {
2792             tcg_gen_movi_tl(cpu_gpr[rt], imm << 16);
2793         }
2794         break;
2795
2796     default:
2797         break;
2798     }
2799 }
2800
2801 /* Set on less than with immediate operand */
2802 static void gen_slt_imm(DisasContext *ctx, uint32_t opc,
2803                         int rt, int rs, int16_t imm)
2804 {
2805     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2806     TCGv t0;
2807
2808     if (rt == 0) {
2809         /* If no destination, treat it as a NOP. */
2810         return;
2811     }
2812     t0 = tcg_temp_new();
2813     gen_load_gpr(t0, rs);
2814     switch (opc) {
2815     case OPC_SLTI:
2816         tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr[rt], t0, uimm);
2817         break;
2818     case OPC_SLTIU:
2819         tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr[rt], t0, uimm);
2820         break;
2821     }
2822     tcg_temp_free(t0);
2823 }
2824
2825 /* Shifts with immediate operand */
2826 static void gen_shift_imm(DisasContext *ctx, uint32_t opc,
2827                           int rt, int rs, int16_t imm)
2828 {
2829     target_ulong uimm = ((uint16_t)imm) & 0x1f;
2830     TCGv t0;
2831
2832     if (rt == 0) {
2833         /* If no destination, treat it as a NOP. */
2834         return;
2835     }
2836
2837     t0 = tcg_temp_new();
2838     gen_load_gpr(t0, rs);
2839     switch (opc) {
2840     case OPC_SLL:
2841         tcg_gen_shli_tl(t0, t0, uimm);
2842         tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2843         break;
2844     case OPC_SRA:
2845         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2846         break;
2847     case OPC_SRL:
2848         if (uimm != 0) {
2849             tcg_gen_ext32u_tl(t0, t0);
2850             tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2851         } else {
2852             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2853         }
2854         break;
2855     case OPC_ROTR:
2856         if (uimm != 0) {
2857             TCGv_i32 t1 = tcg_temp_new_i32();
2858
2859             tcg_gen_trunc_tl_i32(t1, t0);
2860             tcg_gen_rotri_i32(t1, t1, uimm);
2861             tcg_gen_ext_i32_tl(cpu_gpr[rt], t1);
2862             tcg_temp_free_i32(t1);
2863         } else {
2864             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2865         }
2866         break;
2867 #if defined(TARGET_MIPS64)
2868     case OPC_DSLL:
2869         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm);
2870         break;
2871     case OPC_DSRA:
2872         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2873         break;
2874     case OPC_DSRL:
2875         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2876         break;
2877     case OPC_DROTR:
2878         if (uimm != 0) {
2879             tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm);
2880         } else {
2881             tcg_gen_mov_tl(cpu_gpr[rt], t0);
2882         }
2883         break;
2884     case OPC_DSLL32:
2885         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm + 32);
2886         break;
2887     case OPC_DSRA32:
2888         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm + 32);
2889         break;
2890     case OPC_DSRL32:
2891         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm + 32);
2892         break;
2893     case OPC_DROTR32:
2894         tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm + 32);
2895         break;
2896 #endif
2897     }
2898     tcg_temp_free(t0);
2899 }
2900
2901 /* Arithmetic */
2902 static void gen_arith(DisasContext *ctx, uint32_t opc,
2903                       int rd, int rs, int rt)
2904 {
2905     if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB
2906        && opc != OPC_DADD && opc != OPC_DSUB) {
2907         /* If no destination, treat it as a NOP.
2908            For add & sub, we must generate the overflow exception when needed. */
2909         return;
2910     }
2911
2912     switch (opc) {
2913     case OPC_ADD:
2914         {
2915             TCGv t0 = tcg_temp_local_new();
2916             TCGv t1 = tcg_temp_new();
2917             TCGv t2 = tcg_temp_new();
2918             TCGLabel *l1 = gen_new_label();
2919
2920             gen_load_gpr(t1, rs);
2921             gen_load_gpr(t2, rt);
2922             tcg_gen_add_tl(t0, t1, t2);
2923             tcg_gen_ext32s_tl(t0, t0);
2924             tcg_gen_xor_tl(t1, t1, t2);
2925             tcg_gen_xor_tl(t2, t0, t2);
2926             tcg_gen_andc_tl(t1, t2, t1);
2927             tcg_temp_free(t2);
2928             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2929             tcg_temp_free(t1);
2930             /* operands of same sign, result different sign */
2931             generate_exception(ctx, EXCP_OVERFLOW);
2932             gen_set_label(l1);
2933             gen_store_gpr(t0, rd);
2934             tcg_temp_free(t0);
2935         }
2936         break;
2937     case OPC_ADDU:
2938         if (rs != 0 && rt != 0) {
2939             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2940             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2941         } else if (rs == 0 && rt != 0) {
2942             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2943         } else if (rs != 0 && rt == 0) {
2944             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2945         } else {
2946             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2947         }
2948         break;
2949     case OPC_SUB:
2950         {
2951             TCGv t0 = tcg_temp_local_new();
2952             TCGv t1 = tcg_temp_new();
2953             TCGv t2 = tcg_temp_new();
2954             TCGLabel *l1 = gen_new_label();
2955
2956             gen_load_gpr(t1, rs);
2957             gen_load_gpr(t2, rt);
2958             tcg_gen_sub_tl(t0, t1, t2);
2959             tcg_gen_ext32s_tl(t0, t0);
2960             tcg_gen_xor_tl(t2, t1, t2);
2961             tcg_gen_xor_tl(t1, t0, t1);
2962             tcg_gen_and_tl(t1, t1, t2);
2963             tcg_temp_free(t2);
2964             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2965             tcg_temp_free(t1);
2966             /* operands of different sign, first operand and result different sign */
2967             generate_exception(ctx, EXCP_OVERFLOW);
2968             gen_set_label(l1);
2969             gen_store_gpr(t0, rd);
2970             tcg_temp_free(t0);
2971         }
2972         break;
2973     case OPC_SUBU:
2974         if (rs != 0 && rt != 0) {
2975             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2976             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2977         } else if (rs == 0 && rt != 0) {
2978             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2979             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2980         } else if (rs != 0 && rt == 0) {
2981             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2982         } else {
2983             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2984         }
2985         break;
2986 #if defined(TARGET_MIPS64)
2987     case OPC_DADD:
2988         {
2989             TCGv t0 = tcg_temp_local_new();
2990             TCGv t1 = tcg_temp_new();
2991             TCGv t2 = tcg_temp_new();
2992             TCGLabel *l1 = gen_new_label();
2993
2994             gen_load_gpr(t1, rs);
2995             gen_load_gpr(t2, rt);
2996             tcg_gen_add_tl(t0, t1, t2);
2997             tcg_gen_xor_tl(t1, t1, t2);
2998             tcg_gen_xor_tl(t2, t0, t2);
2999             tcg_gen_andc_tl(t1, t2, t1);
3000             tcg_temp_free(t2);
3001             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
3002             tcg_temp_free(t1);
3003             /* operands of same sign, result different sign */
3004             generate_exception(ctx, EXCP_OVERFLOW);
3005             gen_set_label(l1);
3006             gen_store_gpr(t0, rd);
3007             tcg_temp_free(t0);
3008         }
3009         break;
3010     case OPC_DADDU:
3011         if (rs != 0 && rt != 0) {
3012             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
3013         } else if (rs == 0 && rt != 0) {
3014             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
3015         } else if (rs != 0 && rt == 0) {
3016             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
3017         } else {
3018             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3019         }
3020         break;
3021     case OPC_DSUB:
3022         {
3023             TCGv t0 = tcg_temp_local_new();
3024             TCGv t1 = tcg_temp_new();
3025             TCGv t2 = tcg_temp_new();
3026             TCGLabel *l1 = gen_new_label();
3027
3028             gen_load_gpr(t1, rs);
3029             gen_load_gpr(t2, rt);
3030             tcg_gen_sub_tl(t0, t1, t2);
3031             tcg_gen_xor_tl(t2, t1, t2);
3032             tcg_gen_xor_tl(t1, t0, t1);
3033             tcg_gen_and_tl(t1, t1, t2);
3034             tcg_temp_free(t2);
3035             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
3036             tcg_temp_free(t1);
3037             /* operands of different sign, first operand and result different sign */
3038             generate_exception(ctx, EXCP_OVERFLOW);
3039             gen_set_label(l1);
3040             gen_store_gpr(t0, rd);
3041             tcg_temp_free(t0);
3042         }
3043         break;
3044     case OPC_DSUBU:
3045         if (rs != 0 && rt != 0) {
3046             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
3047         } else if (rs == 0 && rt != 0) {
3048             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
3049         } else if (rs != 0 && rt == 0) {
3050             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
3051         } else {
3052             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3053         }
3054         break;
3055 #endif
3056     case OPC_MUL:
3057         if (likely(rs != 0 && rt != 0)) {
3058             tcg_gen_mul_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
3059             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3060         } else {
3061             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3062         }
3063         break;
3064     }
3065 }
3066
3067 /* Conditional move */
3068 static void gen_cond_move(DisasContext *ctx, uint32_t opc,
3069                           int rd, int rs, int rt)
3070 {
3071     TCGv t0, t1, t2;
3072
3073     if (rd == 0) {
3074         /* If no destination, treat it as a NOP. */
3075         return;
3076     }
3077
3078     t0 = tcg_temp_new();
3079     gen_load_gpr(t0, rt);
3080     t1 = tcg_const_tl(0);
3081     t2 = tcg_temp_new();
3082     gen_load_gpr(t2, rs);
3083     switch (opc) {
3084     case OPC_MOVN:
3085         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
3086         break;
3087     case OPC_MOVZ:
3088         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
3089         break;
3090     case OPC_SELNEZ:
3091         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, t1);
3092         break;
3093     case OPC_SELEQZ:
3094         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, t1);
3095         break;
3096     }
3097     tcg_temp_free(t2);
3098     tcg_temp_free(t1);
3099     tcg_temp_free(t0);
3100 }
3101
3102 /* Logic */
3103 static void gen_logic(DisasContext *ctx, uint32_t opc,
3104                       int rd, int rs, int rt)
3105 {
3106     if (rd == 0) {
3107         /* If no destination, treat it as a NOP. */
3108         return;
3109     }
3110
3111     switch (opc) {
3112     case OPC_AND:
3113         if (likely(rs != 0 && rt != 0)) {
3114             tcg_gen_and_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
3115         } else {
3116             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3117         }
3118         break;
3119     case OPC_NOR:
3120         if (rs != 0 && rt != 0) {
3121             tcg_gen_nor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
3122         } else if (rs == 0 && rt != 0) {
3123             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rt]);
3124         } else if (rs != 0 && rt == 0) {
3125             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rs]);
3126         } else {
3127             tcg_gen_movi_tl(cpu_gpr[rd], ~((target_ulong)0));
3128         }
3129         break;
3130     case OPC_OR:
3131         if (likely(rs != 0 && rt != 0)) {
3132             tcg_gen_or_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
3133         } else if (rs == 0 && rt != 0) {
3134             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
3135         } else if (rs != 0 && rt == 0) {
3136             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
3137         } else {
3138             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3139         }
3140         break;
3141     case OPC_XOR:
3142         if (likely(rs != 0 && rt != 0)) {
3143             tcg_gen_xor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
3144         } else if (rs == 0 && rt != 0) {
3145             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
3146         } else if (rs != 0 && rt == 0) {
3147             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
3148         } else {
3149             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3150         }
3151         break;
3152     }
3153 }
3154
3155 /* Set on lower than */
3156 static void gen_slt(DisasContext *ctx, uint32_t opc,
3157                     int rd, int rs, int rt)
3158 {
3159     TCGv t0, t1;
3160
3161     if (rd == 0) {
3162         /* If no destination, treat it as a NOP. */
3163         return;
3164     }
3165
3166     t0 = tcg_temp_new();
3167     t1 = tcg_temp_new();
3168     gen_load_gpr(t0, rs);
3169     gen_load_gpr(t1, rt);
3170     switch (opc) {
3171     case OPC_SLT:
3172         tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr[rd], t0, t1);
3173         break;
3174     case OPC_SLTU:
3175         tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr[rd], t0, t1);
3176         break;
3177     }
3178     tcg_temp_free(t0);
3179     tcg_temp_free(t1);
3180 }
3181
3182 /* Shifts */
3183 static void gen_shift(DisasContext *ctx, uint32_t opc,
3184                       int rd, int rs, int rt)
3185 {
3186     TCGv t0, t1;
3187
3188     if (rd == 0) {
3189         /* If no destination, treat it as a NOP.
3190            For add & sub, we must generate the overflow exception when needed. */
3191         return;
3192     }
3193
3194     t0 = tcg_temp_new();
3195     t1 = tcg_temp_new();
3196     gen_load_gpr(t0, rs);
3197     gen_load_gpr(t1, rt);
3198     switch (opc) {
3199     case OPC_SLLV:
3200         tcg_gen_andi_tl(t0, t0, 0x1f);
3201         tcg_gen_shl_tl(t0, t1, t0);
3202         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
3203         break;
3204     case OPC_SRAV:
3205         tcg_gen_andi_tl(t0, t0, 0x1f);
3206         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
3207         break;
3208     case OPC_SRLV:
3209         tcg_gen_ext32u_tl(t1, t1);
3210         tcg_gen_andi_tl(t0, t0, 0x1f);
3211         tcg_gen_shr_tl(t0, t1, t0);
3212         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
3213         break;
3214     case OPC_ROTRV:
3215         {
3216             TCGv_i32 t2 = tcg_temp_new_i32();
3217             TCGv_i32 t3 = tcg_temp_new_i32();
3218
3219             tcg_gen_trunc_tl_i32(t2, t0);
3220             tcg_gen_trunc_tl_i32(t3, t1);
3221             tcg_gen_andi_i32(t2, t2, 0x1f);
3222             tcg_gen_rotr_i32(t2, t3, t2);
3223             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3224             tcg_temp_free_i32(t2);
3225             tcg_temp_free_i32(t3);
3226         }
3227         break;
3228 #if defined(TARGET_MIPS64)
3229     case OPC_DSLLV:
3230         tcg_gen_andi_tl(t0, t0, 0x3f);
3231         tcg_gen_shl_tl(cpu_gpr[rd], t1, t0);
3232         break;
3233     case OPC_DSRAV:
3234         tcg_gen_andi_tl(t0, t0, 0x3f);
3235         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
3236         break;
3237     case OPC_DSRLV:
3238         tcg_gen_andi_tl(t0, t0, 0x3f);
3239         tcg_gen_shr_tl(cpu_gpr[rd], t1, t0);
3240         break;
3241     case OPC_DROTRV:
3242         tcg_gen_andi_tl(t0, t0, 0x3f);
3243         tcg_gen_rotr_tl(cpu_gpr[rd], t1, t0);
3244         break;
3245 #endif
3246     }
3247     tcg_temp_free(t0);
3248     tcg_temp_free(t1);
3249 }
3250
3251 /* Arithmetic on HI/LO registers */
3252 static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
3253 {
3254     if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
3255         /* Treat as NOP. */
3256         return;
3257     }
3258
3259     if (acc != 0) {
3260         check_dsp(ctx);
3261     }
3262
3263     switch (opc) {
3264     case OPC_MFHI:
3265 #if defined(TARGET_MIPS64)
3266         if (acc != 0) {
3267             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_HI[acc]);
3268         } else
3269 #endif
3270         {
3271             tcg_gen_mov_tl(cpu_gpr[reg], cpu_HI[acc]);
3272         }
3273         break;
3274     case OPC_MFLO:
3275 #if defined(TARGET_MIPS64)
3276         if (acc != 0) {
3277             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_LO[acc]);
3278         } else
3279 #endif
3280         {
3281             tcg_gen_mov_tl(cpu_gpr[reg], cpu_LO[acc]);
3282         }
3283         break;
3284     case OPC_MTHI:
3285         if (reg != 0) {
3286 #if defined(TARGET_MIPS64)
3287             if (acc != 0) {
3288                 tcg_gen_ext32s_tl(cpu_HI[acc], cpu_gpr[reg]);
3289             } else
3290 #endif
3291             {
3292                 tcg_gen_mov_tl(cpu_HI[acc], cpu_gpr[reg]);
3293             }
3294         } else {
3295             tcg_gen_movi_tl(cpu_HI[acc], 0);
3296         }
3297         break;
3298     case OPC_MTLO:
3299         if (reg != 0) {
3300 #if defined(TARGET_MIPS64)
3301             if (acc != 0) {
3302                 tcg_gen_ext32s_tl(cpu_LO[acc], cpu_gpr[reg]);
3303             } else
3304 #endif
3305             {
3306                 tcg_gen_mov_tl(cpu_LO[acc], cpu_gpr[reg]);
3307             }
3308         } else {
3309             tcg_gen_movi_tl(cpu_LO[acc], 0);
3310         }
3311         break;
3312     }
3313 }
3314
3315 static inline void gen_r6_ld(target_long addr, int reg, int memidx,
3316                              TCGMemOp memop)
3317 {
3318     TCGv t0 = tcg_const_tl(addr);
3319     tcg_gen_qemu_ld_tl(t0, t0, memidx, memop);
3320     gen_store_gpr(t0, reg);
3321     tcg_temp_free(t0);
3322 }
3323
3324 static inline void gen_pcrel(DisasContext *ctx, int opc, target_ulong pc,
3325                              int rs)
3326 {
3327     target_long offset;
3328     target_long addr;
3329
3330     switch (MASK_OPC_PCREL_TOP2BITS(opc)) {
3331     case OPC_ADDIUPC:
3332         if (rs != 0) {
3333             offset = sextract32(ctx->opcode << 2, 0, 21);
3334             addr = addr_add(ctx, pc, offset);
3335             tcg_gen_movi_tl(cpu_gpr[rs], addr);
3336         }
3337         break;
3338     case R6_OPC_LWPC:
3339         offset = sextract32(ctx->opcode << 2, 0, 21);
3340         addr = addr_add(ctx, pc, offset);
3341         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TESL);
3342         break;
3343 #if defined(TARGET_MIPS64)
3344     case OPC_LWUPC:
3345         check_mips_64(ctx);
3346         offset = sextract32(ctx->opcode << 2, 0, 21);
3347         addr = addr_add(ctx, pc, offset);
3348         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEUL);
3349         break;
3350 #endif
3351     default:
3352         switch (MASK_OPC_PCREL_TOP5BITS(opc)) {
3353         case OPC_AUIPC:
3354             if (rs != 0) {
3355                 offset = sextract32(ctx->opcode, 0, 16) << 16;
3356                 addr = addr_add(ctx, pc, offset);
3357                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
3358             }
3359             break;
3360         case OPC_ALUIPC:
3361             if (rs != 0) {
3362                 offset = sextract32(ctx->opcode, 0, 16) << 16;
3363                 addr = ~0xFFFF & addr_add(ctx, pc, offset);
3364                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
3365             }
3366             break;
3367 #if defined(TARGET_MIPS64)
3368         case R6_OPC_LDPC: /* bits 16 and 17 are part of immediate */
3369         case R6_OPC_LDPC + (1 << 16):
3370         case R6_OPC_LDPC + (2 << 16):
3371         case R6_OPC_LDPC + (3 << 16):
3372             check_mips_64(ctx);
3373             offset = sextract32(ctx->opcode << 3, 0, 21);
3374             addr = addr_add(ctx, (pc & ~0x7), offset);
3375             gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEQ);
3376             break;
3377 #endif
3378         default:
3379             MIPS_INVAL("OPC_PCREL");
3380             generate_exception_end(ctx, EXCP_RI);
3381             break;
3382         }
3383         break;
3384     }
3385 }
3386
3387 static void gen_r6_muldiv(DisasContext *ctx, int opc, int rd, int rs, int rt)
3388 {
3389     TCGv t0, t1;
3390
3391     if (rd == 0) {
3392         /* Treat as NOP. */
3393         return;
3394     }
3395
3396     t0 = tcg_temp_new();
3397     t1 = tcg_temp_new();
3398
3399     gen_load_gpr(t0, rs);
3400     gen_load_gpr(t1, rt);
3401
3402     switch (opc) {
3403     case R6_OPC_DIV:
3404         {
3405             TCGv t2 = tcg_temp_new();
3406             TCGv t3 = tcg_temp_new();
3407             tcg_gen_ext32s_tl(t0, t0);
3408             tcg_gen_ext32s_tl(t1, t1);
3409             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3410             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3411             tcg_gen_and_tl(t2, t2, t3);
3412             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3413             tcg_gen_or_tl(t2, t2, t3);
3414             tcg_gen_movi_tl(t3, 0);
3415             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3416             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3417             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3418             tcg_temp_free(t3);
3419             tcg_temp_free(t2);
3420         }
3421         break;
3422     case R6_OPC_MOD:
3423         {
3424             TCGv t2 = tcg_temp_new();
3425             TCGv t3 = tcg_temp_new();
3426             tcg_gen_ext32s_tl(t0, t0);
3427             tcg_gen_ext32s_tl(t1, t1);
3428             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3429             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3430             tcg_gen_and_tl(t2, t2, t3);
3431             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3432             tcg_gen_or_tl(t2, t2, t3);
3433             tcg_gen_movi_tl(t3, 0);
3434             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3435             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3436             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3437             tcg_temp_free(t3);
3438             tcg_temp_free(t2);
3439         }
3440         break;
3441     case R6_OPC_DIVU:
3442         {
3443             TCGv t2 = tcg_const_tl(0);
3444             TCGv t3 = tcg_const_tl(1);
3445             tcg_gen_ext32u_tl(t0, t0);
3446             tcg_gen_ext32u_tl(t1, t1);
3447             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3448             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3449             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3450             tcg_temp_free(t3);
3451             tcg_temp_free(t2);
3452         }
3453         break;
3454     case R6_OPC_MODU:
3455         {
3456             TCGv t2 = tcg_const_tl(0);
3457             TCGv t3 = tcg_const_tl(1);
3458             tcg_gen_ext32u_tl(t0, t0);
3459             tcg_gen_ext32u_tl(t1, t1);
3460             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3461             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3462             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3463             tcg_temp_free(t3);
3464             tcg_temp_free(t2);
3465         }
3466         break;
3467     case R6_OPC_MUL:
3468         {
3469             TCGv_i32 t2 = tcg_temp_new_i32();
3470             TCGv_i32 t3 = tcg_temp_new_i32();
3471             tcg_gen_trunc_tl_i32(t2, t0);
3472             tcg_gen_trunc_tl_i32(t3, t1);
3473             tcg_gen_mul_i32(t2, t2, t3);
3474             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3475             tcg_temp_free_i32(t2);
3476             tcg_temp_free_i32(t3);
3477         }
3478         break;
3479     case R6_OPC_MUH:
3480         {
3481             TCGv_i32 t2 = tcg_temp_new_i32();
3482             TCGv_i32 t3 = tcg_temp_new_i32();
3483             tcg_gen_trunc_tl_i32(t2, t0);
3484             tcg_gen_trunc_tl_i32(t3, t1);
3485             tcg_gen_muls2_i32(t2, t3, t2, t3);
3486             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
3487             tcg_temp_free_i32(t2);
3488             tcg_temp_free_i32(t3);
3489         }
3490         break;
3491     case R6_OPC_MULU:
3492         {
3493             TCGv_i32 t2 = tcg_temp_new_i32();
3494             TCGv_i32 t3 = tcg_temp_new_i32();
3495             tcg_gen_trunc_tl_i32(t2, t0);
3496             tcg_gen_trunc_tl_i32(t3, t1);
3497             tcg_gen_mul_i32(t2, t2, t3);
3498             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3499             tcg_temp_free_i32(t2);
3500             tcg_temp_free_i32(t3);
3501         }
3502         break;
3503     case R6_OPC_MUHU:
3504         {
3505             TCGv_i32 t2 = tcg_temp_new_i32();
3506             TCGv_i32 t3 = tcg_temp_new_i32();
3507             tcg_gen_trunc_tl_i32(t2, t0);
3508             tcg_gen_trunc_tl_i32(t3, t1);
3509             tcg_gen_mulu2_i32(t2, t3, t2, t3);
3510             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
3511             tcg_temp_free_i32(t2);
3512             tcg_temp_free_i32(t3);
3513         }
3514         break;
3515 #if defined(TARGET_MIPS64)
3516     case R6_OPC_DDIV:
3517         {
3518             TCGv t2 = tcg_temp_new();
3519             TCGv t3 = tcg_temp_new();
3520             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3521             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3522             tcg_gen_and_tl(t2, t2, t3);
3523             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3524             tcg_gen_or_tl(t2, t2, t3);
3525             tcg_gen_movi_tl(t3, 0);
3526             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3527             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3528             tcg_temp_free(t3);
3529             tcg_temp_free(t2);
3530         }
3531         break;
3532     case R6_OPC_DMOD:
3533         {
3534             TCGv t2 = tcg_temp_new();
3535             TCGv t3 = tcg_temp_new();
3536             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3537             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3538             tcg_gen_and_tl(t2, t2, t3);
3539             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3540             tcg_gen_or_tl(t2, t2, t3);
3541             tcg_gen_movi_tl(t3, 0);
3542             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3543             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3544             tcg_temp_free(t3);
3545             tcg_temp_free(t2);
3546         }
3547         break;
3548     case R6_OPC_DDIVU:
3549         {
3550             TCGv t2 = tcg_const_tl(0);
3551             TCGv t3 = tcg_const_tl(1);
3552             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3553             tcg_gen_divu_i64(cpu_gpr[rd], t0, t1);
3554             tcg_temp_free(t3);
3555             tcg_temp_free(t2);
3556         }
3557         break;
3558     case R6_OPC_DMODU:
3559         {
3560             TCGv t2 = tcg_const_tl(0);
3561             TCGv t3 = tcg_const_tl(1);
3562             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3563             tcg_gen_remu_i64(cpu_gpr[rd], t0, t1);
3564             tcg_temp_free(t3);
3565             tcg_temp_free(t2);
3566         }
3567         break;
3568     case R6_OPC_DMUL:
3569         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
3570         break;
3571     case R6_OPC_DMUH:
3572         {
3573             TCGv t2 = tcg_temp_new();
3574             tcg_gen_muls2_i64(t2, cpu_gpr[rd], t0, t1);
3575             tcg_temp_free(t2);
3576         }
3577         break;
3578     case R6_OPC_DMULU:
3579         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
3580         break;
3581     case R6_OPC_DMUHU:
3582         {
3583             TCGv t2 = tcg_temp_new();
3584             tcg_gen_mulu2_i64(t2, cpu_gpr[rd], t0, t1);
3585             tcg_temp_free(t2);
3586         }
3587         break;
3588 #endif
3589     default:
3590         MIPS_INVAL("r6 mul/div");
3591         generate_exception_end(ctx, EXCP_RI);
3592         goto out;
3593     }
3594  out:
3595     tcg_temp_free(t0);
3596     tcg_temp_free(t1);
3597 }
3598
3599 static void gen_muldiv(DisasContext *ctx, uint32_t opc,
3600                        int acc, int rs, int rt)
3601 {
3602     TCGv t0, t1;
3603
3604     t0 = tcg_temp_new();
3605     t1 = tcg_temp_new();
3606
3607     gen_load_gpr(t0, rs);
3608     gen_load_gpr(t1, rt);
3609
3610     if (acc != 0) {
3611         check_dsp(ctx);
3612     }
3613
3614     switch (opc) {
3615     case OPC_DIV:
3616         {
3617             TCGv t2 = tcg_temp_new();
3618             TCGv t3 = tcg_temp_new();
3619             tcg_gen_ext32s_tl(t0, t0);
3620             tcg_gen_ext32s_tl(t1, t1);
3621             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3622             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3623             tcg_gen_and_tl(t2, t2, t3);
3624             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3625             tcg_gen_or_tl(t2, t2, t3);
3626             tcg_gen_movi_tl(t3, 0);
3627             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3628             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
3629             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
3630             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
3631             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
3632             tcg_temp_free(t3);
3633             tcg_temp_free(t2);
3634         }
3635         break;
3636     case OPC_DIVU:
3637         {
3638             TCGv t2 = tcg_const_tl(0);
3639             TCGv t3 = tcg_const_tl(1);
3640             tcg_gen_ext32u_tl(t0, t0);
3641             tcg_gen_ext32u_tl(t1, t1);
3642             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3643             tcg_gen_divu_tl(cpu_LO[acc], t0, t1);
3644             tcg_gen_remu_tl(cpu_HI[acc], t0, t1);
3645             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
3646             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
3647             tcg_temp_free(t3);
3648             tcg_temp_free(t2);
3649         }
3650         break;
3651     case OPC_MULT:
3652         {
3653             TCGv_i32 t2 = tcg_temp_new_i32();
3654             TCGv_i32 t3 = tcg_temp_new_i32();
3655             tcg_gen_trunc_tl_i32(t2, t0);
3656             tcg_gen_trunc_tl_i32(t3, t1);
3657             tcg_gen_muls2_i32(t2, t3, t2, t3);
3658             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3659             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3660             tcg_temp_free_i32(t2);
3661             tcg_temp_free_i32(t3);
3662         }
3663         break;
3664     case OPC_MULTU:
3665         {
3666             TCGv_i32 t2 = tcg_temp_new_i32();
3667             TCGv_i32 t3 = tcg_temp_new_i32();
3668             tcg_gen_trunc_tl_i32(t2, t0);
3669             tcg_gen_trunc_tl_i32(t3, t1);
3670             tcg_gen_mulu2_i32(t2, t3, t2, t3);
3671             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3672             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3673             tcg_temp_free_i32(t2);
3674             tcg_temp_free_i32(t3);
3675         }
3676         break;
3677 #if defined(TARGET_MIPS64)
3678     case OPC_DDIV:
3679         {
3680             TCGv t2 = tcg_temp_new();
3681             TCGv t3 = tcg_temp_new();
3682             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3683             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3684             tcg_gen_and_tl(t2, t2, t3);
3685             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3686             tcg_gen_or_tl(t2, t2, t3);
3687             tcg_gen_movi_tl(t3, 0);
3688             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3689             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
3690             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
3691             tcg_temp_free(t3);
3692             tcg_temp_free(t2);
3693         }
3694         break;
3695     case OPC_DDIVU:
3696         {
3697             TCGv t2 = tcg_const_tl(0);
3698             TCGv t3 = tcg_const_tl(1);
3699             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3700             tcg_gen_divu_i64(cpu_LO[acc], t0, t1);
3701             tcg_gen_remu_i64(cpu_HI[acc], t0, t1);
3702             tcg_temp_free(t3);
3703             tcg_temp_free(t2);
3704         }
3705         break;
3706     case OPC_DMULT:
3707         tcg_gen_muls2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
3708         break;
3709     case OPC_DMULTU:
3710         tcg_gen_mulu2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
3711         break;
3712 #endif
3713     case OPC_MADD:
3714         {
3715             TCGv_i64 t2 = tcg_temp_new_i64();
3716             TCGv_i64 t3 = tcg_temp_new_i64();
3717
3718             tcg_gen_ext_tl_i64(t2, t0);
3719             tcg_gen_ext_tl_i64(t3, t1);
3720             tcg_gen_mul_i64(t2, t2, t3);
3721             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3722             tcg_gen_add_i64(t2, t2, t3);
3723             tcg_temp_free_i64(t3);
3724             gen_move_low32(cpu_LO[acc], t2);
3725             gen_move_high32(cpu_HI[acc], t2);
3726             tcg_temp_free_i64(t2);
3727         }
3728         break;
3729     case OPC_MADDU:
3730         {
3731             TCGv_i64 t2 = tcg_temp_new_i64();
3732             TCGv_i64 t3 = tcg_temp_new_i64();
3733
3734             tcg_gen_ext32u_tl(t0, t0);
3735             tcg_gen_ext32u_tl(t1, t1);
3736             tcg_gen_extu_tl_i64(t2, t0);
3737             tcg_gen_extu_tl_i64(t3, t1);
3738             tcg_gen_mul_i64(t2, t2, t3);
3739             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3740             tcg_gen_add_i64(t2, t2, t3);
3741             tcg_temp_free_i64(t3);
3742             gen_move_low32(cpu_LO[acc], t2);
3743             gen_move_high32(cpu_HI[acc], t2);
3744             tcg_temp_free_i64(t2);
3745         }
3746         break;
3747     case OPC_MSUB:
3748         {
3749             TCGv_i64 t2 = tcg_temp_new_i64();
3750             TCGv_i64 t3 = tcg_temp_new_i64();
3751
3752             tcg_gen_ext_tl_i64(t2, t0);
3753             tcg_gen_ext_tl_i64(t3, t1);
3754             tcg_gen_mul_i64(t2, t2, t3);
3755             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3756             tcg_gen_sub_i64(t2, t3, t2);
3757             tcg_temp_free_i64(t3);
3758             gen_move_low32(cpu_LO[acc], t2);
3759             gen_move_high32(cpu_HI[acc], t2);
3760             tcg_temp_free_i64(t2);
3761         }
3762         break;
3763     case OPC_MSUBU:
3764         {
3765             TCGv_i64 t2 = tcg_temp_new_i64();
3766             TCGv_i64 t3 = tcg_temp_new_i64();
3767
3768             tcg_gen_ext32u_tl(t0, t0);
3769             tcg_gen_ext32u_tl(t1, t1);
3770             tcg_gen_extu_tl_i64(t2, t0);
3771             tcg_gen_extu_tl_i64(t3, t1);
3772             tcg_gen_mul_i64(t2, t2, t3);
3773             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3774             tcg_gen_sub_i64(t2, t3, t2);
3775             tcg_temp_free_i64(t3);
3776             gen_move_low32(cpu_LO[acc], t2);
3777             gen_move_high32(cpu_HI[acc], t2);
3778             tcg_temp_free_i64(t2);
3779         }
3780         break;
3781     default:
3782         MIPS_INVAL("mul/div");
3783         generate_exception_end(ctx, EXCP_RI);
3784         goto out;
3785     }
3786  out:
3787     tcg_temp_free(t0);
3788     tcg_temp_free(t1);
3789 }
3790
3791 static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc,
3792                             int rd, int rs, int rt)
3793 {
3794     TCGv t0 = tcg_temp_new();
3795     TCGv t1 = tcg_temp_new();
3796
3797     gen_load_gpr(t0, rs);
3798     gen_load_gpr(t1, rt);
3799
3800     switch (opc) {
3801     case OPC_VR54XX_MULS:
3802         gen_helper_muls(t0, cpu_env, t0, t1);
3803         break;
3804     case OPC_VR54XX_MULSU:
3805         gen_helper_mulsu(t0, cpu_env, t0, t1);
3806         break;
3807     case OPC_VR54XX_MACC:
3808         gen_helper_macc(t0, cpu_env, t0, t1);
3809         break;
3810     case OPC_VR54XX_MACCU:
3811         gen_helper_maccu(t0, cpu_env, t0, t1);
3812         break;
3813     case OPC_VR54XX_MSAC:
3814         gen_helper_msac(t0, cpu_env, t0, t1);
3815         break;
3816     case OPC_VR54XX_MSACU:
3817         gen_helper_msacu(t0, cpu_env, t0, t1);
3818         break;
3819     case OPC_VR54XX_MULHI:
3820         gen_helper_mulhi(t0, cpu_env, t0, t1);
3821         break;
3822     case OPC_VR54XX_MULHIU:
3823         gen_helper_mulhiu(t0, cpu_env, t0, t1);
3824         break;
3825     case OPC_VR54XX_MULSHI:
3826         gen_helper_mulshi(t0, cpu_env, t0, t1);
3827         break;
3828     case OPC_VR54XX_MULSHIU:
3829         gen_helper_mulshiu(t0, cpu_env, t0, t1);
3830         break;
3831     case OPC_VR54XX_MACCHI:
3832         gen_helper_macchi(t0, cpu_env, t0, t1);
3833         break;
3834     case OPC_VR54XX_MACCHIU:
3835         gen_helper_macchiu(t0, cpu_env, t0, t1);
3836         break;
3837     case OPC_VR54XX_MSACHI:
3838         gen_helper_msachi(t0, cpu_env, t0, t1);
3839         break;
3840     case OPC_VR54XX_MSACHIU:
3841         gen_helper_msachiu(t0, cpu_env, t0, t1);
3842         break;
3843     default:
3844         MIPS_INVAL("mul vr54xx");
3845         generate_exception_end(ctx, EXCP_RI);
3846         goto out;
3847     }
3848     gen_store_gpr(t0, rd);
3849
3850  out:
3851     tcg_temp_free(t0);
3852     tcg_temp_free(t1);
3853 }
3854
3855 static void gen_cl (DisasContext *ctx, uint32_t opc,
3856                     int rd, int rs)
3857 {
3858     TCGv t0;
3859
3860     if (rd == 0) {
3861         /* Treat as NOP. */
3862         return;
3863     }
3864     t0 = cpu_gpr[rd];
3865     gen_load_gpr(t0, rs);
3866
3867     switch (opc) {
3868     case OPC_CLO:
3869     case R6_OPC_CLO:
3870 #if defined(TARGET_MIPS64)
3871     case OPC_DCLO:
3872     case R6_OPC_DCLO:
3873 #endif
3874         tcg_gen_not_tl(t0, t0);
3875         break;
3876     }
3877
3878     switch (opc) {
3879     case OPC_CLO:
3880     case R6_OPC_CLO:
3881     case OPC_CLZ:
3882     case R6_OPC_CLZ:
3883         tcg_gen_ext32u_tl(t0, t0);
3884         tcg_gen_clzi_tl(t0, t0, TARGET_LONG_BITS);
3885         tcg_gen_subi_tl(t0, t0, TARGET_LONG_BITS - 32);
3886         break;
3887 #if defined(TARGET_MIPS64)
3888     case OPC_DCLO:
3889     case R6_OPC_DCLO:
3890     case OPC_DCLZ:
3891     case R6_OPC_DCLZ:
3892         tcg_gen_clzi_i64(t0, t0, 64);
3893         break;
3894 #endif
3895     }
3896 }
3897
3898 /* Godson integer instructions */
3899 static void gen_loongson_integer(DisasContext *ctx, uint32_t opc,
3900                                  int rd, int rs, int rt)
3901 {
3902     TCGv t0, t1;
3903
3904     if (rd == 0) {
3905         /* Treat as NOP. */
3906         return;
3907     }
3908
3909     switch (opc) {
3910     case OPC_MULT_G_2E:
3911     case OPC_MULT_G_2F:
3912     case OPC_MULTU_G_2E:
3913     case OPC_MULTU_G_2F:
3914 #if defined(TARGET_MIPS64)
3915     case OPC_DMULT_G_2E:
3916     case OPC_DMULT_G_2F:
3917     case OPC_DMULTU_G_2E:
3918     case OPC_DMULTU_G_2F:
3919 #endif
3920         t0 = tcg_temp_new();
3921         t1 = tcg_temp_new();
3922         break;
3923     default:
3924         t0 = tcg_temp_local_new();
3925         t1 = tcg_temp_local_new();
3926         break;
3927     }
3928
3929     gen_load_gpr(t0, rs);
3930     gen_load_gpr(t1, rt);
3931
3932     switch (opc) {
3933     case OPC_MULT_G_2E:
3934     case OPC_MULT_G_2F:
3935         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3936         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3937         break;
3938     case OPC_MULTU_G_2E:
3939     case OPC_MULTU_G_2F:
3940         tcg_gen_ext32u_tl(t0, t0);
3941         tcg_gen_ext32u_tl(t1, t1);
3942         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3943         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3944         break;
3945     case OPC_DIV_G_2E:
3946     case OPC_DIV_G_2F:
3947         {
3948             TCGLabel *l1 = gen_new_label();
3949             TCGLabel *l2 = gen_new_label();
3950             TCGLabel *l3 = gen_new_label();
3951             tcg_gen_ext32s_tl(t0, t0);
3952             tcg_gen_ext32s_tl(t1, t1);
3953             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3954             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3955             tcg_gen_br(l3);
3956             gen_set_label(l1);
3957             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3958             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3959             tcg_gen_mov_tl(cpu_gpr[rd], t0);
3960             tcg_gen_br(l3);
3961             gen_set_label(l2);
3962             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3963             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3964             gen_set_label(l3);
3965         }
3966         break;
3967     case OPC_DIVU_G_2E:
3968     case OPC_DIVU_G_2F:
3969         {
3970             TCGLabel *l1 = gen_new_label();
3971             TCGLabel *l2 = gen_new_label();
3972             tcg_gen_ext32u_tl(t0, t0);
3973             tcg_gen_ext32u_tl(t1, t1);
3974             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3975             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3976             tcg_gen_br(l2);
3977             gen_set_label(l1);
3978             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3979             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3980             gen_set_label(l2);
3981         }
3982         break;
3983     case OPC_MOD_G_2E:
3984     case OPC_MOD_G_2F:
3985         {
3986             TCGLabel *l1 = gen_new_label();
3987             TCGLabel *l2 = gen_new_label();
3988             TCGLabel *l3 = gen_new_label();
3989             tcg_gen_ext32u_tl(t0, t0);
3990             tcg_gen_ext32u_tl(t1, t1);
3991             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3992             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3993             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3994             gen_set_label(l1);
3995             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3996             tcg_gen_br(l3);
3997             gen_set_label(l2);
3998             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3999             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4000             gen_set_label(l3);
4001         }
4002         break;
4003     case OPC_MODU_G_2E:
4004     case OPC_MODU_G_2F:
4005         {
4006             TCGLabel *l1 = gen_new_label();
4007             TCGLabel *l2 = gen_new_label();
4008             tcg_gen_ext32u_tl(t0, t0);
4009             tcg_gen_ext32u_tl(t1, t1);
4010             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4011             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4012             tcg_gen_br(l2);
4013             gen_set_label(l1);
4014             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
4015             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4016             gen_set_label(l2);
4017         }
4018         break;
4019 #if defined(TARGET_MIPS64)
4020     case OPC_DMULT_G_2E:
4021     case OPC_DMULT_G_2F:
4022         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
4023         break;
4024     case OPC_DMULTU_G_2E:
4025     case OPC_DMULTU_G_2F:
4026         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
4027         break;
4028     case OPC_DDIV_G_2E:
4029     case OPC_DDIV_G_2F:
4030         {
4031             TCGLabel *l1 = gen_new_label();
4032             TCGLabel *l2 = gen_new_label();
4033             TCGLabel *l3 = gen_new_label();
4034             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4035             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4036             tcg_gen_br(l3);
4037             gen_set_label(l1);
4038             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
4039             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
4040             tcg_gen_mov_tl(cpu_gpr[rd], t0);
4041             tcg_gen_br(l3);
4042             gen_set_label(l2);
4043             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
4044             gen_set_label(l3);
4045         }
4046         break;
4047     case OPC_DDIVU_G_2E:
4048     case OPC_DDIVU_G_2F:
4049         {
4050             TCGLabel *l1 = gen_new_label();
4051             TCGLabel *l2 = gen_new_label();
4052             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4053             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4054             tcg_gen_br(l2);
4055             gen_set_label(l1);
4056             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
4057             gen_set_label(l2);
4058         }
4059         break;
4060     case OPC_DMOD_G_2E:
4061     case OPC_DMOD_G_2F:
4062         {
4063             TCGLabel *l1 = gen_new_label();
4064             TCGLabel *l2 = gen_new_label();
4065             TCGLabel *l3 = gen_new_label();
4066             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
4067             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
4068             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
4069             gen_set_label(l1);
4070             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4071             tcg_gen_br(l3);
4072             gen_set_label(l2);
4073             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
4074             gen_set_label(l3);
4075         }
4076         break;
4077     case OPC_DMODU_G_2E:
4078     case OPC_DMODU_G_2F:
4079         {
4080             TCGLabel *l1 = gen_new_label();
4081             TCGLabel *l2 = gen_new_label();
4082             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4083             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4084             tcg_gen_br(l2);
4085             gen_set_label(l1);
4086             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
4087             gen_set_label(l2);
4088         }
4089         break;
4090 #endif
4091     }
4092
4093     tcg_temp_free(t0);
4094     tcg_temp_free(t1);
4095 }
4096
4097 /* Loongson multimedia instructions */
4098 static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt)
4099 {
4100     uint32_t opc, shift_max;
4101     TCGv_i64 t0, t1;
4102
4103     opc = MASK_LMI(ctx->opcode);
4104     switch (opc) {
4105     case OPC_ADD_CP2:
4106     case OPC_SUB_CP2:
4107     case OPC_DADD_CP2:
4108     case OPC_DSUB_CP2:
4109         t0 = tcg_temp_local_new_i64();
4110         t1 = tcg_temp_local_new_i64();
4111         break;
4112     default:
4113         t0 = tcg_temp_new_i64();
4114         t1 = tcg_temp_new_i64();
4115         break;
4116     }
4117
4118     check_cp1_enabled(ctx);
4119     gen_load_fpr64(ctx, t0, rs);
4120     gen_load_fpr64(ctx, t1, rt);
4121
4122 #define LMI_HELPER(UP, LO) \
4123     case OPC_##UP: gen_helper_##LO(t0, t0, t1); break
4124 #define LMI_HELPER_1(UP, LO) \
4125     case OPC_##UP: gen_helper_##LO(t0, t0); break
4126 #define LMI_DIRECT(UP, LO, OP) \
4127     case OPC_##UP: tcg_gen_##OP##_i64(t0, t0, t1); break
4128
4129     switch (opc) {
4130     LMI_HELPER(PADDSH, paddsh);
4131     LMI_HELPER(PADDUSH, paddush);
4132     LMI_HELPER(PADDH, paddh);
4133     LMI_HELPER(PADDW, paddw);
4134     LMI_HELPER(PADDSB, paddsb);
4135     LMI_HELPER(PADDUSB, paddusb);
4136     LMI_HELPER(PADDB, paddb);
4137
4138     LMI_HELPER(PSUBSH, psubsh);
4139     LMI_HELPER(PSUBUSH, psubush);
4140     LMI_HELPER(PSUBH, psubh);
4141     LMI_HELPER(PSUBW, psubw);
4142     LMI_HELPER(PSUBSB, psubsb);
4143     LMI_HELPER(PSUBUSB, psubusb);
4144     LMI_HELPER(PSUBB, psubb);
4145
4146     LMI_HELPER(PSHUFH, pshufh);
4147     LMI_HELPER(PACKSSWH, packsswh);
4148     LMI_HELPER(PACKSSHB, packsshb);
4149     LMI_HELPER(PACKUSHB, packushb);
4150
4151     LMI_HELPER(PUNPCKLHW, punpcklhw);
4152     LMI_HELPER(PUNPCKHHW, punpckhhw);
4153     LMI_HELPER(PUNPCKLBH, punpcklbh);
4154     LMI_HELPER(PUNPCKHBH, punpckhbh);
4155     LMI_HELPER(PUNPCKLWD, punpcklwd);
4156     LMI_HELPER(PUNPCKHWD, punpckhwd);
4157
4158     LMI_HELPER(PAVGH, pavgh);
4159     LMI_HELPER(PAVGB, pavgb);
4160     LMI_HELPER(PMAXSH, pmaxsh);
4161     LMI_HELPER(PMINSH, pminsh);
4162     LMI_HELPER(PMAXUB, pmaxub);
4163     LMI_HELPER(PMINUB, pminub);
4164
4165     LMI_HELPER(PCMPEQW, pcmpeqw);
4166     LMI_HELPER(PCMPGTW, pcmpgtw);
4167     LMI_HELPER(PCMPEQH, pcmpeqh);
4168     LMI_HELPER(PCMPGTH, pcmpgth);
4169     LMI_HELPER(PCMPEQB, pcmpeqb);
4170     LMI_HELPER(PCMPGTB, pcmpgtb);
4171
4172     LMI_HELPER(PSLLW, psllw);
4173     LMI_HELPER(PSLLH, psllh);
4174     LMI_HELPER(PSRLW, psrlw);
4175     LMI_HELPER(PSRLH, psrlh);
4176     LMI_HELPER(PSRAW, psraw);
4177     LMI_HELPER(PSRAH, psrah);
4178
4179     LMI_HELPER(PMULLH, pmullh);
4180     LMI_HELPER(PMULHH, pmulhh);
4181     LMI_HELPER(PMULHUH, pmulhuh);
4182     LMI_HELPER(PMADDHW, pmaddhw);
4183
4184     LMI_HELPER(PASUBUB, pasubub);
4185     LMI_HELPER_1(BIADD, biadd);
4186     LMI_HELPER_1(PMOVMSKB, pmovmskb);
4187
4188     LMI_DIRECT(PADDD, paddd, add);
4189     LMI_DIRECT(PSUBD, psubd, sub);
4190     LMI_DIRECT(XOR_CP2, xor, xor);
4191     LMI_DIRECT(NOR_CP2, nor, nor);
4192     LMI_DIRECT(AND_CP2, and, and);
4193     LMI_DIRECT(OR_CP2, or, or);
4194
4195     case OPC_PANDN:
4196         tcg_gen_andc_i64(t0, t1, t0);
4197         break;
4198
4199     case OPC_PINSRH_0:
4200         tcg_gen_deposit_i64(t0, t0, t1, 0, 16);
4201         break;
4202     case OPC_PINSRH_1:
4203         tcg_gen_deposit_i64(t0, t0, t1, 16, 16);
4204         break;
4205     case OPC_PINSRH_2:
4206         tcg_gen_deposit_i64(t0, t0, t1, 32, 16);
4207         break;
4208     case OPC_PINSRH_3:
4209         tcg_gen_deposit_i64(t0, t0, t1, 48, 16);
4210         break;
4211
4212     case OPC_PEXTRH:
4213         tcg_gen_andi_i64(t1, t1, 3);
4214         tcg_gen_shli_i64(t1, t1, 4);
4215         tcg_gen_shr_i64(t0, t0, t1);
4216         tcg_gen_ext16u_i64(t0, t0);
4217         break;
4218
4219     case OPC_ADDU_CP2:
4220         tcg_gen_add_i64(t0, t0, t1);
4221         tcg_gen_ext32s_i64(t0, t0);
4222         break;
4223     case OPC_SUBU_CP2:
4224         tcg_gen_sub_i64(t0, t0, t1);
4225         tcg_gen_ext32s_i64(t0, t0);
4226         break;
4227
4228     case OPC_SLL_CP2:
4229         shift_max = 32;
4230         goto do_shift;
4231     case OPC_SRL_CP2:
4232         shift_max = 32;
4233         goto do_shift;
4234     case OPC_SRA_CP2:
4235         shift_max = 32;
4236         goto do_shift;
4237     case OPC_DSLL_CP2:
4238         shift_max = 64;
4239         goto do_shift;
4240     case OPC_DSRL_CP2:
4241         shift_max = 64;
4242         goto do_shift;
4243     case OPC_DSRA_CP2:
4244         shift_max = 64;
4245         goto do_shift;
4246     do_shift:
4247         /* Make sure shift count isn't TCG undefined behaviour.  */
4248         tcg_gen_andi_i64(t1, t1, shift_max - 1);
4249
4250         switch (opc) {
4251         case OPC_SLL_CP2:
4252         case OPC_DSLL_CP2:
4253             tcg_gen_shl_i64(t0, t0, t1);
4254             break;
4255         case OPC_SRA_CP2:
4256         case OPC_DSRA_CP2:
4257             /* Since SRA is UndefinedResult without sign-extended inputs,
4258                we can treat SRA and DSRA the same.  */
4259             tcg_gen_sar_i64(t0, t0, t1);
4260             break;
4261         case OPC_SRL_CP2:
4262             /* We want to shift in zeros for SRL; zero-extend first.  */
4263             tcg_gen_ext32u_i64(t0, t0);
4264             /* FALLTHRU */
4265         case OPC_DSRL_CP2:
4266             tcg_gen_shr_i64(t0, t0, t1);
4267             break;
4268         }
4269
4270         if (shift_max == 32) {
4271             tcg_gen_ext32s_i64(t0, t0);
4272         }
4273
4274         /* Shifts larger than MAX produce zero.  */
4275         tcg_gen_setcondi_i64(TCG_COND_LTU, t1, t1, shift_max);
4276         tcg_gen_neg_i64(t1, t1);
4277         tcg_gen_and_i64(t0, t0, t1);
4278         break;
4279
4280     case OPC_ADD_CP2:
4281     case OPC_DADD_CP2:
4282         {
4283             TCGv_i64 t2 = tcg_temp_new_i64();
4284             TCGLabel *lab = gen_new_label();
4285
4286             tcg_gen_mov_i64(t2, t0);
4287             tcg_gen_add_i64(t0, t1, t2);
4288             if (opc == OPC_ADD_CP2) {
4289                 tcg_gen_ext32s_i64(t0, t0);
4290             }
4291             tcg_gen_xor_i64(t1, t1, t2);
4292             tcg_gen_xor_i64(t2, t2, t0);
4293             tcg_gen_andc_i64(t1, t2, t1);
4294             tcg_temp_free_i64(t2);
4295             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
4296             generate_exception(ctx, EXCP_OVERFLOW);
4297             gen_set_label(lab);
4298             break;
4299         }
4300
4301     case OPC_SUB_CP2:
4302     case OPC_DSUB_CP2:
4303         {
4304             TCGv_i64 t2 = tcg_temp_new_i64();
4305             TCGLabel *lab = gen_new_label();
4306
4307             tcg_gen_mov_i64(t2, t0);
4308             tcg_gen_sub_i64(t0, t1, t2);
4309             if (opc == OPC_SUB_CP2) {
4310                 tcg_gen_ext32s_i64(t0, t0);
4311             }
4312             tcg_gen_xor_i64(t1, t1, t2);
4313             tcg_gen_xor_i64(t2, t2, t0);
4314             tcg_gen_and_i64(t1, t1, t2);
4315             tcg_temp_free_i64(t2);
4316             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
4317             generate_exception(ctx, EXCP_OVERFLOW);
4318             gen_set_label(lab);
4319             break;
4320         }
4321
4322     case OPC_PMULUW:
4323         tcg_gen_ext32u_i64(t0, t0);
4324         tcg_gen_ext32u_i64(t1, t1);
4325         tcg_gen_mul_i64(t0, t0, t1);
4326         break;
4327
4328     case OPC_SEQU_CP2:
4329     case OPC_SEQ_CP2:
4330     case OPC_SLTU_CP2:
4331     case OPC_SLT_CP2:
4332     case OPC_SLEU_CP2:
4333     case OPC_SLE_CP2:
4334         /* ??? Document is unclear: Set FCC[CC].  Does that mean the
4335            FD field is the CC field?  */
4336     default:
4337         MIPS_INVAL("loongson_cp2");
4338         generate_exception_end(ctx, EXCP_RI);
4339         return;
4340     }
4341
4342 #undef LMI_HELPER
4343 #undef LMI_DIRECT
4344
4345     gen_store_fpr64(ctx, t0, rd);
4346
4347     tcg_temp_free_i64(t0);
4348     tcg_temp_free_i64(t1);
4349 }
4350
4351 /* Traps */
4352 static void gen_trap (DisasContext *ctx, uint32_t opc,
4353                       int rs, int rt, int16_t imm)
4354 {
4355     int cond;
4356     TCGv t0 = tcg_temp_new();
4357     TCGv t1 = tcg_temp_new();
4358
4359     cond = 0;
4360     /* Load needed operands */
4361     switch (opc) {
4362     case OPC_TEQ:
4363     case OPC_TGE:
4364     case OPC_TGEU:
4365     case OPC_TLT:
4366     case OPC_TLTU:
4367     case OPC_TNE:
4368         /* Compare two registers */
4369         if (rs != rt) {
4370             gen_load_gpr(t0, rs);
4371             gen_load_gpr(t1, rt);
4372             cond = 1;
4373         }
4374         break;
4375     case OPC_TEQI:
4376     case OPC_TGEI:
4377     case OPC_TGEIU:
4378     case OPC_TLTI:
4379     case OPC_TLTIU:
4380     case OPC_TNEI:
4381         /* Compare register to immediate */
4382         if (rs != 0 || imm != 0) {
4383             gen_load_gpr(t0, rs);
4384             tcg_gen_movi_tl(t1, (int32_t)imm);
4385             cond = 1;
4386         }
4387         break;
4388     }
4389     if (cond == 0) {
4390         switch (opc) {
4391         case OPC_TEQ:   /* rs == rs */
4392         case OPC_TEQI:  /* r0 == 0  */
4393         case OPC_TGE:   /* rs >= rs */
4394         case OPC_TGEI:  /* r0 >= 0  */
4395         case OPC_TGEU:  /* rs >= rs unsigned */
4396         case OPC_TGEIU: /* r0 >= 0  unsigned */
4397             /* Always trap */
4398             generate_exception_end(ctx, EXCP_TRAP);
4399             break;
4400         case OPC_TLT:   /* rs < rs           */
4401         case OPC_TLTI:  /* r0 < 0            */
4402         case OPC_TLTU:  /* rs < rs unsigned  */
4403         case OPC_TLTIU: /* r0 < 0  unsigned  */
4404         case OPC_TNE:   /* rs != rs          */
4405         case OPC_TNEI:  /* r0 != 0           */
4406             /* Never trap: treat as NOP. */
4407             break;
4408         }
4409     } else {
4410         TCGLabel *l1 = gen_new_label();
4411
4412         switch (opc) {
4413         case OPC_TEQ:
4414         case OPC_TEQI:
4415             tcg_gen_brcond_tl(TCG_COND_NE, t0, t1, l1);
4416             break;
4417         case OPC_TGE:
4418         case OPC_TGEI:
4419             tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1);
4420             break;
4421         case OPC_TGEU:
4422         case OPC_TGEIU:
4423             tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1);
4424             break;
4425         case OPC_TLT:
4426         case OPC_TLTI:
4427             tcg_gen_brcond_tl(TCG_COND_GE, t0, t1, l1);
4428             break;
4429         case OPC_TLTU:
4430         case OPC_TLTIU:
4431             tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1);
4432             break;
4433         case OPC_TNE:
4434         case OPC_TNEI:
4435             tcg_gen_brcond_tl(TCG_COND_EQ, t0, t1, l1);
4436             break;
4437         }
4438         generate_exception(ctx, EXCP_TRAP);
4439         gen_set_label(l1);
4440     }
4441     tcg_temp_free(t0);
4442     tcg_temp_free(t1);
4443 }
4444
4445 static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest)
4446 {
4447     if (unlikely(ctx->base.singlestep_enabled)) {
4448         return false;
4449     }
4450
4451 #ifndef CONFIG_USER_ONLY
4452     return (ctx->base.tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK);
4453 #else
4454     return true;
4455 #endif
4456 }
4457
4458 static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
4459 {
4460     if (use_goto_tb(ctx, dest)) {
4461         tcg_gen_goto_tb(n);
4462         gen_save_pc(dest);
4463         tcg_gen_exit_tb(ctx->base.tb, n);
4464     } else {
4465         gen_save_pc(dest);
4466         if (ctx->base.singlestep_enabled) {
4467             save_cpu_state(ctx, 0);
4468             gen_helper_raise_exception_debug(cpu_env);
4469         }
4470         tcg_gen_lookup_and_goto_ptr();
4471     }
4472 }
4473
4474 /* Branches (before delay slot) */
4475 static void gen_compute_branch (DisasContext *ctx, uint32_t opc,
4476                                 int insn_bytes,
4477                                 int rs, int rt, int32_t offset,
4478                                 int delayslot_size)
4479 {
4480     target_ulong btgt = -1;
4481     int blink = 0;
4482     int bcond_compute = 0;
4483     TCGv t0 = tcg_temp_new();
4484     TCGv t1 = tcg_temp_new();
4485
4486     if (ctx->hflags & MIPS_HFLAG_BMASK) {
4487 #ifdef MIPS_DEBUG_DISAS
4488         LOG_DISAS("Branch in delay / forbidden slot at PC 0x"
4489                   TARGET_FMT_lx "\n", ctx->base.pc_next);
4490 #endif
4491         generate_exception_end(ctx, EXCP_RI);
4492         goto out;
4493     }
4494
4495     /* Load needed operands */
4496     switch (opc) {
4497     case OPC_BEQ:
4498     case OPC_BEQL:
4499     case OPC_BNE:
4500     case OPC_BNEL:
4501         /* Compare two registers */
4502         if (rs != rt) {
4503             gen_load_gpr(t0, rs);
4504             gen_load_gpr(t1, rt);
4505             bcond_compute = 1;
4506         }
4507         btgt = ctx->base.pc_next + insn_bytes + offset;
4508         break;
4509     case OPC_BGEZ:
4510     case OPC_BGEZAL:
4511     case OPC_BGEZALL:
4512     case OPC_BGEZL:
4513     case OPC_BGTZ:
4514     case OPC_BGTZL:
4515     case OPC_BLEZ:
4516     case OPC_BLEZL:
4517     case OPC_BLTZ:
4518     case OPC_BLTZAL:
4519     case OPC_BLTZALL:
4520     case OPC_BLTZL:
4521         /* Compare to zero */
4522         if (rs != 0) {
4523             gen_load_gpr(t0, rs);
4524             bcond_compute = 1;
4525         }
4526         btgt = ctx->base.pc_next + insn_bytes + offset;
4527         break;
4528     case OPC_BPOSGE32:
4529 #if defined(TARGET_MIPS64)
4530     case OPC_BPOSGE64:
4531         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x7F);
4532 #else
4533         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
4534 #endif
4535         bcond_compute = 1;
4536         btgt = ctx->base.pc_next + insn_bytes + offset;
4537         break;
4538     case OPC_J:
4539     case OPC_JAL:
4540     case OPC_JALX:
4541         /* Jump to immediate */
4542         btgt = ((ctx->base.pc_next + insn_bytes) & (int32_t)0xF0000000) |
4543             (uint32_t)offset;
4544         break;
4545     case OPC_JR:
4546     case OPC_JALR:
4547         /* Jump to register */
4548         if (offset != 0 && offset != 16) {
4549             /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
4550                others are reserved. */
4551             MIPS_INVAL("jump hint");
4552             generate_exception_end(ctx, EXCP_RI);
4553             goto out;
4554         }
4555         gen_load_gpr(btarget, rs);
4556         break;
4557     default:
4558         MIPS_INVAL("branch/jump");
4559         generate_exception_end(ctx, EXCP_RI);
4560         goto out;
4561     }
4562     if (bcond_compute == 0) {
4563         /* No condition to be computed */
4564         switch (opc) {
4565         case OPC_BEQ:     /* rx == rx        */
4566         case OPC_BEQL:    /* rx == rx likely */
4567         case OPC_BGEZ:    /* 0 >= 0          */
4568         case OPC_BGEZL:   /* 0 >= 0 likely   */
4569         case OPC_BLEZ:    /* 0 <= 0          */
4570         case OPC_BLEZL:   /* 0 <= 0 likely   */
4571             /* Always take */
4572             ctx->hflags |= MIPS_HFLAG_B;
4573             break;
4574         case OPC_BGEZAL:  /* 0 >= 0          */
4575         case OPC_BGEZALL: /* 0 >= 0 likely   */
4576             /* Always take and link */
4577             blink = 31;
4578             ctx->hflags |= MIPS_HFLAG_B;
4579             break;
4580         case OPC_BNE:     /* rx != rx        */
4581         case OPC_BGTZ:    /* 0 > 0           */
4582         case OPC_BLTZ:    /* 0 < 0           */
4583             /* Treat as NOP. */
4584             goto out;
4585         case OPC_BLTZAL:  /* 0 < 0           */
4586             /* Handle as an unconditional branch to get correct delay
4587                slot checking.  */
4588             blink = 31;
4589             btgt = ctx->base.pc_next + insn_bytes + delayslot_size;
4590             ctx->hflags |= MIPS_HFLAG_B;
4591             break;
4592         case OPC_BLTZALL: /* 0 < 0 likely */
4593             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 8);
4594             /* Skip the instruction in the delay slot */
4595             ctx->base.pc_next += 4;
4596             goto out;
4597         case OPC_BNEL:    /* rx != rx likely */
4598         case OPC_BGTZL:   /* 0 > 0 likely */
4599         case OPC_BLTZL:   /* 0 < 0 likely */
4600             /* Skip the instruction in the delay slot */
4601             ctx->base.pc_next += 4;
4602             goto out;
4603         case OPC_J:
4604             ctx->hflags |= MIPS_HFLAG_B;
4605             break;
4606         case OPC_JALX:
4607             ctx->hflags |= MIPS_HFLAG_BX;
4608             /* Fallthrough */
4609         case OPC_JAL:
4610             blink = 31;
4611             ctx->hflags |= MIPS_HFLAG_B;
4612             break;
4613         case OPC_JR:
4614             ctx->hflags |= MIPS_HFLAG_BR;
4615             break;
4616         case OPC_JALR:
4617             blink = rt;
4618             ctx->hflags |= MIPS_HFLAG_BR;
4619             break;
4620         default:
4621             MIPS_INVAL("branch/jump");
4622             generate_exception_end(ctx, EXCP_RI);
4623             goto out;
4624         }
4625     } else {
4626         switch (opc) {
4627         case OPC_BEQ:
4628             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
4629             goto not_likely;
4630         case OPC_BEQL:
4631             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
4632             goto likely;
4633         case OPC_BNE:
4634             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
4635             goto not_likely;
4636         case OPC_BNEL:
4637             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
4638             goto likely;
4639         case OPC_BGEZ:
4640             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4641             goto not_likely;
4642         case OPC_BGEZL:
4643             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4644             goto likely;
4645         case OPC_BGEZAL:
4646             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4647             blink = 31;
4648             goto not_likely;
4649         case OPC_BGEZALL:
4650             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4651             blink = 31;
4652             goto likely;
4653         case OPC_BGTZ:
4654             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
4655             goto not_likely;
4656         case OPC_BGTZL:
4657             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
4658             goto likely;
4659         case OPC_BLEZ:
4660             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
4661             goto not_likely;
4662         case OPC_BLEZL:
4663             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
4664             goto likely;
4665         case OPC_BLTZ:
4666             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
4667             goto not_likely;
4668         case OPC_BLTZL:
4669             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
4670             goto likely;
4671         case OPC_BPOSGE32:
4672             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
4673             goto not_likely;
4674 #if defined(TARGET_MIPS64)
4675         case OPC_BPOSGE64:
4676             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 64);
4677             goto not_likely;
4678 #endif
4679         case OPC_BLTZAL:
4680             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
4681             blink = 31;
4682         not_likely:
4683             ctx->hflags |= MIPS_HFLAG_BC;
4684             break;
4685         case OPC_BLTZALL:
4686             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
4687             blink = 31;
4688         likely:
4689             ctx->hflags |= MIPS_HFLAG_BL;
4690             break;
4691         default:
4692             MIPS_INVAL("conditional branch/jump");
4693             generate_exception_end(ctx, EXCP_RI);
4694             goto out;
4695         }
4696     }
4697
4698     ctx->btarget = btgt;
4699
4700     switch (delayslot_size) {
4701     case 2:
4702         ctx->hflags |= MIPS_HFLAG_BDS16;
4703         break;
4704     case 4:
4705         ctx->hflags |= MIPS_HFLAG_BDS32;
4706         break;
4707     }
4708
4709     if (blink > 0) {
4710         int post_delay = insn_bytes + delayslot_size;
4711         int lowbit = !!(ctx->hflags & MIPS_HFLAG_M16);
4712
4713         tcg_gen_movi_tl(cpu_gpr[blink],
4714                         ctx->base.pc_next + post_delay + lowbit);
4715     }
4716
4717  out:
4718     if (insn_bytes == 2)
4719         ctx->hflags |= MIPS_HFLAG_B16;
4720     tcg_temp_free(t0);
4721     tcg_temp_free(t1);
4722 }
4723
4724
4725 /* nanoMIPS Branches */
4726 static void gen_compute_branch_nm(DisasContext *ctx, uint32_t opc,
4727                                 int insn_bytes,
4728                                 int rs, int rt, int32_t offset)
4729 {
4730     target_ulong btgt = -1;
4731     int bcond_compute = 0;
4732     TCGv t0 = tcg_temp_new();
4733     TCGv t1 = tcg_temp_new();
4734
4735     /* Load needed operands */
4736     switch (opc) {
4737     case OPC_BEQ:
4738     case OPC_BNE:
4739         /* Compare two registers */
4740         if (rs != rt) {
4741             gen_load_gpr(t0, rs);
4742             gen_load_gpr(t1, rt);
4743             bcond_compute = 1;
4744         }
4745         btgt = ctx->base.pc_next + insn_bytes + offset;
4746         break;
4747     case OPC_BGEZAL:
4748         /* Compare to zero */
4749         if (rs != 0) {
4750             gen_load_gpr(t0, rs);
4751             bcond_compute = 1;
4752         }
4753         btgt = ctx->base.pc_next + insn_bytes + offset;
4754         break;
4755     case OPC_BPOSGE32:
4756         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
4757         bcond_compute = 1;
4758         btgt = ctx->base.pc_next + insn_bytes + offset;
4759         break;
4760     case OPC_JR:
4761     case OPC_JALR:
4762         /* Jump to register */
4763         if (offset != 0 && offset != 16) {
4764             /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
4765                others are reserved. */
4766             MIPS_INVAL("jump hint");
4767             generate_exception_end(ctx, EXCP_RI);
4768             goto out;
4769         }
4770         gen_load_gpr(btarget, rs);
4771         break;
4772     default:
4773         MIPS_INVAL("branch/jump");
4774         generate_exception_end(ctx, EXCP_RI);
4775         goto out;
4776     }
4777     if (bcond_compute == 0) {
4778         /* No condition to be computed */
4779         switch (opc) {
4780         case OPC_BEQ:     /* rx == rx        */
4781             /* Always take */
4782             ctx->hflags |= MIPS_HFLAG_B;
4783             break;
4784         case OPC_BGEZAL:  /* 0 >= 0          */
4785             /* Always take and link */
4786             tcg_gen_movi_tl(cpu_gpr[31],
4787                             ctx->base.pc_next + insn_bytes);
4788             ctx->hflags |= MIPS_HFLAG_B;
4789             break;
4790         case OPC_BNE:     /* rx != rx        */
4791             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 8);
4792             /* Skip the instruction in the delay slot */
4793             ctx->base.pc_next += 4;
4794             goto out;
4795         case OPC_JR:
4796             ctx->hflags |= MIPS_HFLAG_BR;
4797             break;
4798         case OPC_JALR:
4799             if (rt > 0) {
4800                 tcg_gen_movi_tl(cpu_gpr[rt],
4801                                 ctx->base.pc_next + insn_bytes);
4802             }
4803             ctx->hflags |= MIPS_HFLAG_BR;
4804             break;
4805         default:
4806             MIPS_INVAL("branch/jump");
4807             generate_exception_end(ctx, EXCP_RI);
4808             goto out;
4809         }
4810     } else {
4811         switch (opc) {
4812         case OPC_BEQ:
4813             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
4814             goto not_likely;
4815         case OPC_BNE:
4816             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
4817             goto not_likely;
4818         case OPC_BGEZAL:
4819             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4820             tcg_gen_movi_tl(cpu_gpr[31],
4821                             ctx->base.pc_next + insn_bytes);
4822             goto not_likely;
4823         case OPC_BPOSGE32:
4824             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
4825         not_likely:
4826             ctx->hflags |= MIPS_HFLAG_BC;
4827             break;
4828         default:
4829             MIPS_INVAL("conditional branch/jump");
4830             generate_exception_end(ctx, EXCP_RI);
4831             goto out;
4832         }
4833     }
4834
4835     ctx->btarget = btgt;
4836
4837  out:
4838     if (insn_bytes == 2) {
4839         ctx->hflags |= MIPS_HFLAG_B16;
4840     }
4841     tcg_temp_free(t0);
4842     tcg_temp_free(t1);
4843 }
4844
4845
4846 /* special3 bitfield operations */
4847 static void gen_bitops (DisasContext *ctx, uint32_t opc, int rt,
4848                         int rs, int lsb, int msb)
4849 {
4850     TCGv t0 = tcg_temp_new();
4851     TCGv t1 = tcg_temp_new();
4852
4853     gen_load_gpr(t1, rs);
4854     switch (opc) {
4855     case OPC_EXT:
4856         if (lsb + msb > 31) {
4857             goto fail;
4858         }
4859         if (msb != 31) {
4860             tcg_gen_extract_tl(t0, t1, lsb, msb + 1);
4861         } else {
4862             /* The two checks together imply that lsb == 0,
4863                so this is a simple sign-extension.  */
4864             tcg_gen_ext32s_tl(t0, t1);
4865         }
4866         break;
4867 #if defined(TARGET_MIPS64)
4868     case OPC_DEXTU:
4869         lsb += 32;
4870         goto do_dext;
4871     case OPC_DEXTM:
4872         msb += 32;
4873         goto do_dext;
4874     case OPC_DEXT:
4875     do_dext:
4876         if (lsb + msb > 63) {
4877             goto fail;
4878         }
4879         tcg_gen_extract_tl(t0, t1, lsb, msb + 1);
4880         break;
4881 #endif
4882     case OPC_INS:
4883         if (lsb > msb) {
4884             goto fail;
4885         }
4886         gen_load_gpr(t0, rt);
4887         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
4888         tcg_gen_ext32s_tl(t0, t0);
4889         break;
4890 #if defined(TARGET_MIPS64)
4891     case OPC_DINSU:
4892         lsb += 32;
4893         /* FALLTHRU */
4894     case OPC_DINSM:
4895         msb += 32;
4896         /* FALLTHRU */
4897     case OPC_DINS:
4898         if (lsb > msb) {
4899             goto fail;
4900         }
4901         gen_load_gpr(t0, rt);
4902         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
4903         break;
4904 #endif
4905     default:
4906 fail:
4907         MIPS_INVAL("bitops");
4908         generate_exception_end(ctx, EXCP_RI);
4909         tcg_temp_free(t0);
4910         tcg_temp_free(t1);
4911         return;
4912     }
4913     gen_store_gpr(t0, rt);
4914     tcg_temp_free(t0);
4915     tcg_temp_free(t1);
4916 }
4917
4918 static void gen_bshfl (DisasContext *ctx, uint32_t op2, int rt, int rd)
4919 {
4920     TCGv t0;
4921
4922     if (rd == 0) {
4923         /* If no destination, treat it as a NOP. */
4924         return;
4925     }
4926
4927     t0 = tcg_temp_new();
4928     gen_load_gpr(t0, rt);
4929     switch (op2) {
4930     case OPC_WSBH:
4931         {
4932             TCGv t1 = tcg_temp_new();
4933             TCGv t2 = tcg_const_tl(0x00FF00FF);
4934
4935             tcg_gen_shri_tl(t1, t0, 8);
4936             tcg_gen_and_tl(t1, t1, t2);
4937             tcg_gen_and_tl(t0, t0, t2);
4938             tcg_gen_shli_tl(t0, t0, 8);
4939             tcg_gen_or_tl(t0, t0, t1);
4940             tcg_temp_free(t2);
4941             tcg_temp_free(t1);
4942             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
4943         }
4944         break;
4945     case OPC_SEB:
4946         tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
4947         break;
4948     case OPC_SEH:
4949         tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
4950         break;
4951 #if defined(TARGET_MIPS64)
4952     case OPC_DSBH:
4953         {
4954             TCGv t1 = tcg_temp_new();
4955             TCGv t2 = tcg_const_tl(0x00FF00FF00FF00FFULL);
4956
4957             tcg_gen_shri_tl(t1, t0, 8);
4958             tcg_gen_and_tl(t1, t1, t2);
4959             tcg_gen_and_tl(t0, t0, t2);
4960             tcg_gen_shli_tl(t0, t0, 8);
4961             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
4962             tcg_temp_free(t2);
4963             tcg_temp_free(t1);
4964         }
4965         break;
4966     case OPC_DSHD:
4967         {
4968             TCGv t1 = tcg_temp_new();
4969             TCGv t2 = tcg_const_tl(0x0000FFFF0000FFFFULL);
4970
4971             tcg_gen_shri_tl(t1, t0, 16);
4972             tcg_gen_and_tl(t1, t1, t2);
4973             tcg_gen_and_tl(t0, t0, t2);
4974             tcg_gen_shli_tl(t0, t0, 16);
4975             tcg_gen_or_tl(t0, t0, t1);
4976             tcg_gen_shri_tl(t1, t0, 32);
4977             tcg_gen_shli_tl(t0, t0, 32);
4978             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
4979             tcg_temp_free(t2);
4980             tcg_temp_free(t1);
4981         }
4982         break;
4983 #endif
4984     default:
4985         MIPS_INVAL("bsfhl");
4986         generate_exception_end(ctx, EXCP_RI);
4987         tcg_temp_free(t0);
4988         return;
4989     }
4990     tcg_temp_free(t0);
4991 }
4992
4993 static void gen_lsa(DisasContext *ctx, int opc, int rd, int rs, int rt,
4994                     int imm2)
4995 {
4996     TCGv t0;
4997     TCGv t1;
4998     if (rd == 0) {
4999         /* Treat as NOP. */
5000         return;
5001     }
5002     t0 = tcg_temp_new();
5003     t1 = tcg_temp_new();
5004     gen_load_gpr(t0, rs);
5005     gen_load_gpr(t1, rt);
5006     tcg_gen_shli_tl(t0, t0, imm2 + 1);
5007     tcg_gen_add_tl(cpu_gpr[rd], t0, t1);
5008     if (opc == OPC_LSA) {
5009         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
5010     }
5011
5012     tcg_temp_free(t1);
5013     tcg_temp_free(t0);
5014
5015     return;
5016 }
5017
5018 static void gen_align_bits(DisasContext *ctx, int wordsz, int rd, int rs,
5019                            int rt, int bits)
5020 {
5021     TCGv t0;
5022     if (rd == 0) {
5023         /* Treat as NOP. */
5024         return;
5025     }
5026     t0 = tcg_temp_new();
5027     if (bits == 0 || bits == wordsz) {
5028         if (bits == 0) {
5029             gen_load_gpr(t0, rt);
5030         } else {
5031             gen_load_gpr(t0, rs);
5032         }
5033         switch (wordsz) {
5034         case 32:
5035             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
5036             break;
5037 #if defined(TARGET_MIPS64)
5038         case 64:
5039             tcg_gen_mov_tl(cpu_gpr[rd], t0);
5040             break;
5041 #endif
5042         }
5043     } else {
5044         TCGv t1 = tcg_temp_new();
5045         gen_load_gpr(t0, rt);
5046         gen_load_gpr(t1, rs);
5047         switch (wordsz) {
5048         case 32:
5049             {
5050                 TCGv_i64 t2 = tcg_temp_new_i64();
5051                 tcg_gen_concat_tl_i64(t2, t1, t0);
5052                 tcg_gen_shri_i64(t2, t2, 32 - bits);
5053                 gen_move_low32(cpu_gpr[rd], t2);
5054                 tcg_temp_free_i64(t2);
5055             }
5056             break;
5057 #if defined(TARGET_MIPS64)
5058         case 64:
5059             tcg_gen_shli_tl(t0, t0, bits);
5060             tcg_gen_shri_tl(t1, t1, 64 - bits);
5061             tcg_gen_or_tl(cpu_gpr[rd], t1, t0);
5062             break;
5063 #endif
5064         }
5065         tcg_temp_free(t1);
5066     }
5067
5068     tcg_temp_free(t0);
5069 }
5070
5071 static void gen_align(DisasContext *ctx, int wordsz, int rd, int rs, int rt,
5072                       int bp)
5073 {
5074     gen_align_bits(ctx, wordsz, rd, rs, rt, bp * 8);
5075 }
5076
5077 static void gen_ext(DisasContext *ctx, int wordsz, int rd, int rs, int rt,
5078                     int shift)
5079 {
5080     gen_align_bits(ctx, wordsz, rd, rs, rt, wordsz - shift);
5081 }
5082
5083 static void gen_bitswap(DisasContext *ctx, int opc, int rd, int rt)
5084 {
5085     TCGv t0;
5086     if (rd == 0) {
5087         /* Treat as NOP. */
5088         return;
5089     }
5090     t0 = tcg_temp_new();
5091     gen_load_gpr(t0, rt);
5092     switch (opc) {
5093     case OPC_BITSWAP:
5094         gen_helper_bitswap(cpu_gpr[rd], t0);
5095         break;
5096 #if defined(TARGET_MIPS64)
5097     case OPC_DBITSWAP:
5098         gen_helper_dbitswap(cpu_gpr[rd], t0);
5099         break;
5100 #endif
5101     }
5102     tcg_temp_free(t0);
5103 }
5104
5105 #ifndef CONFIG_USER_ONLY
5106 /* CP0 (MMU and control) */
5107 static inline void gen_mthc0_entrylo(TCGv arg, target_ulong off)
5108 {
5109     TCGv_i64 t0 = tcg_temp_new_i64();
5110     TCGv_i64 t1 = tcg_temp_new_i64();
5111
5112     tcg_gen_ext_tl_i64(t0, arg);
5113     tcg_gen_ld_i64(t1, cpu_env, off);
5114 #if defined(TARGET_MIPS64)
5115     tcg_gen_deposit_i64(t1, t1, t0, 30, 32);
5116 #else
5117     tcg_gen_concat32_i64(t1, t1, t0);
5118 #endif
5119     tcg_gen_st_i64(t1, cpu_env, off);
5120     tcg_temp_free_i64(t1);
5121     tcg_temp_free_i64(t0);
5122 }
5123
5124 static inline void gen_mthc0_store64(TCGv arg, target_ulong off)
5125 {
5126     TCGv_i64 t0 = tcg_temp_new_i64();
5127     TCGv_i64 t1 = tcg_temp_new_i64();
5128
5129     tcg_gen_ext_tl_i64(t0, arg);
5130     tcg_gen_ld_i64(t1, cpu_env, off);
5131     tcg_gen_concat32_i64(t1, t1, t0);
5132     tcg_gen_st_i64(t1, cpu_env, off);
5133     tcg_temp_free_i64(t1);
5134     tcg_temp_free_i64(t0);
5135 }
5136
5137 static inline void gen_mfhc0_entrylo(TCGv arg, target_ulong off)
5138 {
5139     TCGv_i64 t0 = tcg_temp_new_i64();
5140
5141     tcg_gen_ld_i64(t0, cpu_env, off);
5142 #if defined(TARGET_MIPS64)
5143     tcg_gen_shri_i64(t0, t0, 30);
5144 #else
5145     tcg_gen_shri_i64(t0, t0, 32);
5146 #endif
5147     gen_move_low32(arg, t0);
5148     tcg_temp_free_i64(t0);
5149 }
5150
5151 static inline void gen_mfhc0_load64(TCGv arg, target_ulong off, int shift)
5152 {
5153     TCGv_i64 t0 = tcg_temp_new_i64();
5154
5155     tcg_gen_ld_i64(t0, cpu_env, off);
5156     tcg_gen_shri_i64(t0, t0, 32 + shift);
5157     gen_move_low32(arg, t0);
5158     tcg_temp_free_i64(t0);
5159 }
5160
5161 static inline void gen_mfc0_load32 (TCGv arg, target_ulong off)
5162 {
5163     TCGv_i32 t0 = tcg_temp_new_i32();
5164
5165     tcg_gen_ld_i32(t0, cpu_env, off);
5166     tcg_gen_ext_i32_tl(arg, t0);
5167     tcg_temp_free_i32(t0);
5168 }
5169
5170 static inline void gen_mfc0_load64 (TCGv arg, target_ulong off)
5171 {
5172     tcg_gen_ld_tl(arg, cpu_env, off);
5173     tcg_gen_ext32s_tl(arg, arg);
5174 }
5175
5176 static inline void gen_mtc0_store32 (TCGv arg, target_ulong off)
5177 {
5178     TCGv_i32 t0 = tcg_temp_new_i32();
5179
5180     tcg_gen_trunc_tl_i32(t0, arg);
5181     tcg_gen_st_i32(t0, cpu_env, off);
5182     tcg_temp_free_i32(t0);
5183 }
5184
5185 #define CP0_CHECK(c)                            \
5186     do {                                        \
5187         if (!(c)) {                             \
5188             goto cp0_unimplemented;             \
5189         }                                       \
5190     } while (0)
5191
5192 static void gen_mfhc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5193 {
5194     const char *rn = "invalid";
5195
5196     switch (reg) {
5197     case 2:
5198         switch (sel) {
5199         case 0:
5200             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
5201             gen_mfhc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo0));
5202             rn = "EntryLo0";
5203             break;
5204         default:
5205             goto cp0_unimplemented;
5206         }
5207         break;
5208     case 3:
5209         switch (sel) {
5210         case 0:
5211             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
5212             gen_mfhc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo1));
5213             rn = "EntryLo1";
5214             break;
5215         default:
5216             goto cp0_unimplemented;
5217         }
5218         break;
5219     case 17:
5220         switch (sel) {
5221         case 0:
5222             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, lladdr),
5223                              ctx->CP0_LLAddr_shift);
5224             rn = "LLAddr";
5225             break;
5226         case 1:
5227             CP0_CHECK(ctx->mrp);
5228             gen_helper_mfhc0_maar(arg, cpu_env);
5229             rn = "MAAR";
5230             break;
5231         default:
5232             goto cp0_unimplemented;
5233         }
5234         break;
5235     case 28:
5236         switch (sel) {
5237         case 0:
5238         case 2:
5239         case 4:
5240         case 6:
5241             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, CP0_TagLo), 0);
5242             rn = "TagLo";
5243             break;
5244         default:
5245             goto cp0_unimplemented;
5246         }
5247         break;
5248     default:
5249         goto cp0_unimplemented;
5250     }
5251     trace_mips_translate_c0("mfhc0", rn, reg, sel);
5252     return;
5253
5254 cp0_unimplemented:
5255     qemu_log_mask(LOG_UNIMP, "mfhc0 %s (reg %d sel %d)\n", rn, reg, sel);
5256     tcg_gen_movi_tl(arg, 0);
5257 }
5258
5259 static void gen_mthc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5260 {
5261     const char *rn = "invalid";
5262     uint64_t mask = ctx->PAMask >> 36;
5263
5264     switch (reg) {
5265     case 2:
5266         switch (sel) {
5267         case 0:
5268             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
5269             tcg_gen_andi_tl(arg, arg, mask);
5270             gen_mthc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo0));
5271             rn = "EntryLo0";
5272             break;
5273         default:
5274             goto cp0_unimplemented;
5275         }
5276         break;
5277     case 3:
5278         switch (sel) {
5279         case 0:
5280             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
5281             tcg_gen_andi_tl(arg, arg, mask);
5282             gen_mthc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo1));
5283             rn = "EntryLo1";
5284             break;
5285         default:
5286             goto cp0_unimplemented;
5287         }
5288         break;
5289     case 17:
5290         switch (sel) {
5291         case 0:
5292             /* LLAddr is read-only (the only exception is bit 0 if LLB is
5293                supported); the CP0_LLAddr_rw_bitmask does not seem to be
5294                relevant for modern MIPS cores supporting MTHC0, therefore
5295                treating MTHC0 to LLAddr as NOP. */
5296             rn = "LLAddr";
5297             break;
5298         case 1:
5299             CP0_CHECK(ctx->mrp);
5300             gen_helper_mthc0_maar(cpu_env, arg);
5301             rn = "MAAR";
5302             break;
5303         default:
5304             goto cp0_unimplemented;
5305         }
5306         break;
5307     case 28:
5308         switch (sel) {
5309         case 0:
5310         case 2:
5311         case 4:
5312         case 6:
5313             tcg_gen_andi_tl(arg, arg, mask);
5314             gen_mthc0_store64(arg, offsetof(CPUMIPSState, CP0_TagLo));
5315             rn = "TagLo";
5316             break;
5317         default:
5318             goto cp0_unimplemented;
5319         }
5320         break;
5321     default:
5322         goto cp0_unimplemented;
5323     }
5324     trace_mips_translate_c0("mthc0", rn, reg, sel);
5325
5326 cp0_unimplemented:
5327     qemu_log_mask(LOG_UNIMP, "mthc0 %s (reg %d sel %d)\n", rn, reg, sel);
5328 }
5329
5330 static inline void gen_mfc0_unimplemented(DisasContext *ctx, TCGv arg)
5331 {
5332     if (ctx->insn_flags & ISA_MIPS32R6) {
5333         tcg_gen_movi_tl(arg, 0);
5334     } else {
5335         tcg_gen_movi_tl(arg, ~0);
5336     }
5337 }
5338
5339 static void gen_mfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5340 {
5341     const char *rn = "invalid";
5342
5343     if (sel != 0)
5344         check_insn(ctx, ISA_MIPS32);
5345
5346     switch (reg) {
5347     case 0:
5348         switch (sel) {
5349         case 0:
5350             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
5351             rn = "Index";
5352             break;
5353         case 1:
5354             CP0_CHECK(ctx->insn_flags & ASE_MT);
5355             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
5356             rn = "MVPControl";
5357             break;
5358         case 2:
5359             CP0_CHECK(ctx->insn_flags & ASE_MT);
5360             gen_helper_mfc0_mvpconf0(arg, cpu_env);
5361             rn = "MVPConf0";
5362             break;
5363         case 3:
5364             CP0_CHECK(ctx->insn_flags & ASE_MT);
5365             gen_helper_mfc0_mvpconf1(arg, cpu_env);
5366             rn = "MVPConf1";
5367             break;
5368         case 4:
5369             CP0_CHECK(ctx->vp);
5370             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPControl));
5371             rn = "VPControl";
5372             break;
5373         default:
5374             goto cp0_unimplemented;
5375         }
5376         break;
5377     case 1:
5378         switch (sel) {
5379         case 0:
5380             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
5381             gen_helper_mfc0_random(arg, cpu_env);
5382             rn = "Random";
5383             break;
5384         case 1:
5385             CP0_CHECK(ctx->insn_flags & ASE_MT);
5386             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
5387             rn = "VPEControl";
5388             break;
5389         case 2:
5390             CP0_CHECK(ctx->insn_flags & ASE_MT);
5391             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
5392             rn = "VPEConf0";
5393             break;
5394         case 3:
5395             CP0_CHECK(ctx->insn_flags & ASE_MT);
5396             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
5397             rn = "VPEConf1";
5398             break;
5399         case 4:
5400             CP0_CHECK(ctx->insn_flags & ASE_MT);
5401             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_YQMask));
5402             rn = "YQMask";
5403             break;
5404         case 5:
5405             CP0_CHECK(ctx->insn_flags & ASE_MT);
5406             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
5407             rn = "VPESchedule";
5408             break;
5409         case 6:
5410             CP0_CHECK(ctx->insn_flags & ASE_MT);
5411             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
5412             rn = "VPEScheFBack";
5413             break;
5414         case 7:
5415             CP0_CHECK(ctx->insn_flags & ASE_MT);
5416             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
5417             rn = "VPEOpt";
5418             break;
5419         default:
5420             goto cp0_unimplemented;
5421         }
5422         break;
5423     case 2:
5424         switch (sel) {
5425         case 0:
5426             {
5427                 TCGv_i64 tmp = tcg_temp_new_i64();
5428                 tcg_gen_ld_i64(tmp, cpu_env,
5429                                offsetof(CPUMIPSState, CP0_EntryLo0));
5430 #if defined(TARGET_MIPS64)
5431                 if (ctx->rxi) {
5432                     /* Move RI/XI fields to bits 31:30 */
5433                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
5434                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
5435                 }
5436 #endif
5437                 gen_move_low32(arg, tmp);
5438                 tcg_temp_free_i64(tmp);
5439             }
5440             rn = "EntryLo0";
5441             break;
5442         case 1:
5443             CP0_CHECK(ctx->insn_flags & ASE_MT);
5444             gen_helper_mfc0_tcstatus(arg, cpu_env);
5445             rn = "TCStatus";
5446             break;
5447         case 2:
5448             CP0_CHECK(ctx->insn_flags & ASE_MT);
5449             gen_helper_mfc0_tcbind(arg, cpu_env);
5450             rn = "TCBind";
5451             break;
5452         case 3:
5453             CP0_CHECK(ctx->insn_flags & ASE_MT);
5454             gen_helper_mfc0_tcrestart(arg, cpu_env);
5455             rn = "TCRestart";
5456             break;
5457         case 4:
5458             CP0_CHECK(ctx->insn_flags & ASE_MT);
5459             gen_helper_mfc0_tchalt(arg, cpu_env);
5460             rn = "TCHalt";
5461             break;
5462         case 5:
5463             CP0_CHECK(ctx->insn_flags & ASE_MT);
5464             gen_helper_mfc0_tccontext(arg, cpu_env);
5465             rn = "TCContext";
5466             break;
5467         case 6:
5468             CP0_CHECK(ctx->insn_flags & ASE_MT);
5469             gen_helper_mfc0_tcschedule(arg, cpu_env);
5470             rn = "TCSchedule";
5471             break;
5472         case 7:
5473             CP0_CHECK(ctx->insn_flags & ASE_MT);
5474             gen_helper_mfc0_tcschefback(arg, cpu_env);
5475             rn = "TCScheFBack";
5476             break;
5477         default:
5478             goto cp0_unimplemented;
5479         }
5480         break;
5481     case 3:
5482         switch (sel) {
5483         case 0:
5484             {
5485                 TCGv_i64 tmp = tcg_temp_new_i64();
5486                 tcg_gen_ld_i64(tmp, cpu_env,
5487                                offsetof(CPUMIPSState, CP0_EntryLo1));
5488 #if defined(TARGET_MIPS64)
5489                 if (ctx->rxi) {
5490                     /* Move RI/XI fields to bits 31:30 */
5491                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
5492                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
5493                 }
5494 #endif
5495                 gen_move_low32(arg, tmp);
5496                 tcg_temp_free_i64(tmp);
5497             }
5498             rn = "EntryLo1";
5499             break;
5500         case 1:
5501             CP0_CHECK(ctx->vp);
5502             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_GlobalNumber));
5503             rn = "GlobalNumber";
5504             break;
5505         default:
5506             goto cp0_unimplemented;
5507         }
5508         break;
5509     case 4:
5510         switch (sel) {
5511         case 0:
5512             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
5513             tcg_gen_ext32s_tl(arg, arg);
5514             rn = "Context";
5515             break;
5516         case 1:
5517 //            gen_helper_mfc0_contextconfig(arg); /* SmartMIPS ASE */
5518             rn = "ContextConfig";
5519             goto cp0_unimplemented;
5520         case 2:
5521             CP0_CHECK(ctx->ulri);
5522             tcg_gen_ld_tl(arg, cpu_env,
5523                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
5524             tcg_gen_ext32s_tl(arg, arg);
5525             rn = "UserLocal";
5526             break;
5527         default:
5528             goto cp0_unimplemented;
5529         }
5530         break;
5531     case 5:
5532         switch (sel) {
5533         case 0:
5534             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
5535             rn = "PageMask";
5536             break;
5537         case 1:
5538             check_insn(ctx, ISA_MIPS32R2);
5539             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
5540             rn = "PageGrain";
5541             break;
5542         case 2:
5543             CP0_CHECK(ctx->sc);
5544             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl0));
5545             tcg_gen_ext32s_tl(arg, arg);
5546             rn = "SegCtl0";
5547             break;
5548         case 3:
5549             CP0_CHECK(ctx->sc);
5550             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl1));
5551             tcg_gen_ext32s_tl(arg, arg);
5552             rn = "SegCtl1";
5553             break;
5554         case 4:
5555             CP0_CHECK(ctx->sc);
5556             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl2));
5557             tcg_gen_ext32s_tl(arg, arg);
5558             rn = "SegCtl2";
5559             break;
5560         default:
5561             goto cp0_unimplemented;
5562         }
5563         break;
5564     case 6:
5565         switch (sel) {
5566         case 0:
5567             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
5568             rn = "Wired";
5569             break;
5570         case 1:
5571             check_insn(ctx, ISA_MIPS32R2);
5572             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
5573             rn = "SRSConf0";
5574             break;
5575         case 2:
5576             check_insn(ctx, ISA_MIPS32R2);
5577             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
5578             rn = "SRSConf1";
5579             break;
5580         case 3:
5581             check_insn(ctx, ISA_MIPS32R2);
5582             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
5583             rn = "SRSConf2";
5584             break;
5585         case 4:
5586             check_insn(ctx, ISA_MIPS32R2);
5587             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
5588             rn = "SRSConf3";
5589             break;
5590         case 5:
5591             check_insn(ctx, ISA_MIPS32R2);
5592             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
5593             rn = "SRSConf4";
5594             break;
5595         default:
5596             goto cp0_unimplemented;
5597         }
5598         break;
5599     case 7:
5600         switch (sel) {
5601         case 0:
5602             check_insn(ctx, ISA_MIPS32R2);
5603             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
5604             rn = "HWREna";
5605             break;
5606         default:
5607             goto cp0_unimplemented;
5608         }
5609         break;
5610     case 8:
5611         switch (sel) {
5612         case 0:
5613             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
5614             tcg_gen_ext32s_tl(arg, arg);
5615             rn = "BadVAddr";
5616             break;
5617         case 1:
5618             CP0_CHECK(ctx->bi);
5619             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
5620             rn = "BadInstr";
5621             break;
5622         case 2:
5623             CP0_CHECK(ctx->bp);
5624             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
5625             rn = "BadInstrP";
5626             break;
5627         case 3:
5628             CP0_CHECK(ctx->bi);
5629             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrX));
5630             tcg_gen_andi_tl(arg, arg, ~0xffff);
5631             rn = "BadInstrX";
5632             break;
5633        default:
5634             goto cp0_unimplemented;
5635         }
5636         break;
5637     case 9:
5638         switch (sel) {
5639         case 0:
5640             /* Mark as an IO operation because we read the time.  */
5641             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
5642                 gen_io_start();
5643             }
5644             gen_helper_mfc0_count(arg, cpu_env);
5645             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
5646                 gen_io_end();
5647             }
5648             /* Break the TB to be able to take timer interrupts immediately
5649                after reading count. DISAS_STOP isn't sufficient, we need to
5650                ensure we break completely out of translated code.  */
5651             gen_save_pc(ctx->base.pc_next + 4);
5652             ctx->base.is_jmp = DISAS_EXIT;
5653             rn = "Count";
5654             break;
5655         /* 6,7 are implementation dependent */
5656         default:
5657             goto cp0_unimplemented;
5658         }
5659         break;
5660     case 10:
5661         switch (sel) {
5662         case 0:
5663             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
5664             tcg_gen_ext32s_tl(arg, arg);
5665             rn = "EntryHi";
5666             break;
5667         default:
5668             goto cp0_unimplemented;
5669         }
5670         break;
5671     case 11:
5672         switch (sel) {
5673         case 0:
5674             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
5675             rn = "Compare";
5676             break;
5677         /* 6,7 are implementation dependent */
5678         default:
5679             goto cp0_unimplemented;
5680         }
5681         break;
5682     case 12:
5683         switch (sel) {
5684         case 0:
5685             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
5686             rn = "Status";
5687             break;
5688         case 1:
5689             check_insn(ctx, ISA_MIPS32R2);
5690             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
5691             rn = "IntCtl";
5692             break;
5693         case 2:
5694             check_insn(ctx, ISA_MIPS32R2);
5695             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
5696             rn = "SRSCtl";
5697             break;
5698         case 3:
5699             check_insn(ctx, ISA_MIPS32R2);
5700             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
5701             rn = "SRSMap";
5702             break;
5703         default:
5704             goto cp0_unimplemented;
5705        }
5706         break;
5707     case 13:
5708         switch (sel) {
5709         case 0:
5710             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
5711             rn = "Cause";
5712             break;
5713         default:
5714             goto cp0_unimplemented;
5715        }
5716         break;
5717     case 14:
5718         switch (sel) {
5719         case 0:
5720             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
5721             tcg_gen_ext32s_tl(arg, arg);
5722             rn = "EPC";
5723             break;
5724         default:
5725             goto cp0_unimplemented;
5726         }
5727         break;
5728     case 15:
5729         switch (sel) {
5730         case 0:
5731             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
5732             rn = "PRid";
5733             break;
5734         case 1:
5735             check_insn(ctx, ISA_MIPS32R2);
5736             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EBase));
5737             tcg_gen_ext32s_tl(arg, arg);
5738             rn = "EBase";
5739             break;
5740         case 3:
5741             check_insn(ctx, ISA_MIPS32R2);
5742             CP0_CHECK(ctx->cmgcr);
5743             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_CMGCRBase));
5744             tcg_gen_ext32s_tl(arg, arg);
5745             rn = "CMGCRBase";
5746             break;
5747         default:
5748             goto cp0_unimplemented;
5749        }
5750         break;
5751     case 16:
5752         switch (sel) {
5753         case 0:
5754             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
5755             rn = "Config";
5756             break;
5757         case 1:
5758             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
5759             rn = "Config1";
5760             break;
5761         case 2:
5762             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
5763             rn = "Config2";
5764             break;
5765         case 3:
5766             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
5767             rn = "Config3";
5768             break;
5769         case 4:
5770             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
5771             rn = "Config4";
5772             break;
5773         case 5:
5774             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
5775             rn = "Config5";
5776             break;
5777         /* 6,7 are implementation dependent */
5778         case 6:
5779             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
5780             rn = "Config6";
5781             break;
5782         case 7:
5783             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
5784             rn = "Config7";
5785             break;
5786         default:
5787             goto cp0_unimplemented;
5788         }
5789         break;
5790     case 17:
5791         switch (sel) {
5792         case 0:
5793             gen_helper_mfc0_lladdr(arg, cpu_env);
5794             rn = "LLAddr";
5795             break;
5796         case 1:
5797             CP0_CHECK(ctx->mrp);
5798             gen_helper_mfc0_maar(arg, cpu_env);
5799             rn = "MAAR";
5800             break;
5801         case 2:
5802             CP0_CHECK(ctx->mrp);
5803             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MAARI));
5804             rn = "MAARI";
5805             break;
5806         default:
5807             goto cp0_unimplemented;
5808         }
5809         break;
5810     case 18:
5811         switch (sel) {
5812         case 0:
5813         case 1:
5814         case 2:
5815         case 3:
5816         case 4:
5817         case 5:
5818         case 6:
5819         case 7:
5820             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
5821             gen_helper_1e0i(mfc0_watchlo, arg, sel);
5822             rn = "WatchLo";
5823             break;
5824         default:
5825             goto cp0_unimplemented;
5826         }
5827         break;
5828     case 19:
5829         switch (sel) {
5830         case 0:
5831         case 1:
5832         case 2:
5833         case 3:
5834         case 4:
5835         case 5:
5836         case 6:
5837         case 7:
5838             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
5839             gen_helper_1e0i(mfc0_watchhi, arg, sel);
5840             rn = "WatchHi";
5841             break;
5842         default:
5843             goto cp0_unimplemented;
5844         }
5845         break;
5846     case 20:
5847         switch (sel) {
5848         case 0:
5849 #if defined(TARGET_MIPS64)
5850             check_insn(ctx, ISA_MIPS3);
5851             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
5852             tcg_gen_ext32s_tl(arg, arg);
5853             rn = "XContext";
5854             break;
5855 #endif
5856         default:
5857             goto cp0_unimplemented;
5858         }
5859         break;
5860     case 21:
5861        /* Officially reserved, but sel 0 is used for R1x000 framemask */
5862         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
5863         switch (sel) {
5864         case 0:
5865             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
5866             rn = "Framemask";
5867             break;
5868         default:
5869             goto cp0_unimplemented;
5870         }
5871         break;
5872     case 22:
5873         tcg_gen_movi_tl(arg, 0); /* unimplemented */
5874         rn = "'Diagnostic"; /* implementation dependent */
5875         break;
5876     case 23:
5877         switch (sel) {
5878         case 0:
5879             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
5880             rn = "Debug";
5881             break;
5882         case 1:
5883 //            gen_helper_mfc0_tracecontrol(arg); /* PDtrace support */
5884             rn = "TraceControl";
5885             goto cp0_unimplemented;
5886         case 2:
5887 //            gen_helper_mfc0_tracecontrol2(arg); /* PDtrace support */
5888             rn = "TraceControl2";
5889             goto cp0_unimplemented;
5890         case 3:
5891 //            gen_helper_mfc0_usertracedata(arg); /* PDtrace support */
5892             rn = "UserTraceData";
5893             goto cp0_unimplemented;
5894         case 4:
5895 //            gen_helper_mfc0_tracebpc(arg); /* PDtrace support */
5896             rn = "TraceBPC";
5897             goto cp0_unimplemented;
5898         default:
5899             goto cp0_unimplemented;
5900         }
5901         break;
5902     case 24:
5903         switch (sel) {
5904         case 0:
5905             /* EJTAG support */
5906             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
5907             tcg_gen_ext32s_tl(arg, arg);
5908             rn = "DEPC";
5909             break;
5910         default:
5911             goto cp0_unimplemented;
5912         }
5913         break;
5914     case 25:
5915         switch (sel) {
5916         case 0:
5917             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
5918             rn = "Performance0";
5919             break;
5920         case 1:
5921 //            gen_helper_mfc0_performance1(arg);
5922             rn = "Performance1";
5923             goto cp0_unimplemented;
5924         case 2:
5925 //            gen_helper_mfc0_performance2(arg);
5926             rn = "Performance2";
5927             goto cp0_unimplemented;
5928         case 3:
5929 //            gen_helper_mfc0_performance3(arg);
5930             rn = "Performance3";
5931             goto cp0_unimplemented;
5932         case 4:
5933 //            gen_helper_mfc0_performance4(arg);
5934             rn = "Performance4";
5935             goto cp0_unimplemented;
5936         case 5:
5937 //            gen_helper_mfc0_performance5(arg);
5938             rn = "Performance5";
5939             goto cp0_unimplemented;
5940         case 6:
5941 //            gen_helper_mfc0_performance6(arg);
5942             rn = "Performance6";
5943             goto cp0_unimplemented;
5944         case 7:
5945 //            gen_helper_mfc0_performance7(arg);
5946             rn = "Performance7";
5947             goto cp0_unimplemented;
5948         default:
5949             goto cp0_unimplemented;
5950         }
5951         break;
5952     case 26:
5953         switch (sel) {
5954         case 0:
5955             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_ErrCtl));
5956             rn = "ErrCtl";
5957             break;
5958         default:
5959             goto cp0_unimplemented;
5960         }
5961         break;
5962     case 27:
5963         switch (sel) {
5964         case 0:
5965         case 1:
5966         case 2:
5967         case 3:
5968             tcg_gen_movi_tl(arg, 0); /* unimplemented */
5969             rn = "CacheErr";
5970             break;
5971         default:
5972             goto cp0_unimplemented;
5973         }
5974         break;
5975     case 28:
5976         switch (sel) {
5977         case 0:
5978         case 2:
5979         case 4:
5980         case 6:
5981             {
5982                 TCGv_i64 tmp = tcg_temp_new_i64();
5983                 tcg_gen_ld_i64(tmp, cpu_env, offsetof(CPUMIPSState, CP0_TagLo));
5984                 gen_move_low32(arg, tmp);
5985                 tcg_temp_free_i64(tmp);
5986             }
5987             rn = "TagLo";
5988             break;
5989         case 1:
5990         case 3:
5991         case 5:
5992         case 7:
5993             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
5994             rn = "DataLo";
5995             break;
5996         default:
5997             goto cp0_unimplemented;
5998         }
5999         break;
6000     case 29:
6001         switch (sel) {
6002         case 0:
6003         case 2:
6004         case 4:
6005         case 6:
6006             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
6007             rn = "TagHi";
6008             break;
6009         case 1:
6010         case 3:
6011         case 5:
6012         case 7:
6013             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
6014             rn = "DataHi";
6015             break;
6016         default:
6017             goto cp0_unimplemented;
6018         }
6019         break;
6020     case 30:
6021         switch (sel) {
6022         case 0:
6023             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
6024             tcg_gen_ext32s_tl(arg, arg);
6025             rn = "ErrorEPC";
6026             break;
6027         default:
6028             goto cp0_unimplemented;
6029         }
6030         break;
6031     case 31:
6032         switch (sel) {
6033         case 0:
6034             /* EJTAG support */
6035             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
6036             rn = "DESAVE";
6037             break;
6038         case 2:
6039         case 3:
6040         case 4:
6041         case 5:
6042         case 6:
6043         case 7:
6044             CP0_CHECK(ctx->kscrexist & (1 << sel));
6045             tcg_gen_ld_tl(arg, cpu_env,
6046                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
6047             tcg_gen_ext32s_tl(arg, arg);
6048             rn = "KScratch";
6049             break;
6050         default:
6051             goto cp0_unimplemented;
6052         }
6053         break;
6054     default:
6055        goto cp0_unimplemented;
6056     }
6057     trace_mips_translate_c0("mfc0", rn, reg, sel);
6058     return;
6059
6060 cp0_unimplemented:
6061     qemu_log_mask(LOG_UNIMP, "mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
6062     gen_mfc0_unimplemented(ctx, arg);
6063 }
6064
6065 static void gen_mtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6066 {
6067     const char *rn = "invalid";
6068
6069     if (sel != 0)
6070         check_insn(ctx, ISA_MIPS32);
6071
6072     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
6073         gen_io_start();
6074     }
6075
6076     switch (reg) {
6077     case 0:
6078         switch (sel) {
6079         case 0:
6080             gen_helper_mtc0_index(cpu_env, arg);
6081             rn = "Index";
6082             break;
6083         case 1:
6084             CP0_CHECK(ctx->insn_flags & ASE_MT);
6085             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
6086             rn = "MVPControl";
6087             break;
6088         case 2:
6089             CP0_CHECK(ctx->insn_flags & ASE_MT);
6090             /* ignored */
6091             rn = "MVPConf0";
6092             break;
6093         case 3:
6094             CP0_CHECK(ctx->insn_flags & ASE_MT);
6095             /* ignored */
6096             rn = "MVPConf1";
6097             break;
6098         case 4:
6099             CP0_CHECK(ctx->vp);
6100             /* ignored */
6101             rn = "VPControl";
6102             break;
6103         default:
6104             goto cp0_unimplemented;
6105         }
6106         break;
6107     case 1:
6108         switch (sel) {
6109         case 0:
6110             /* ignored */
6111             rn = "Random";
6112             break;
6113         case 1:
6114             CP0_CHECK(ctx->insn_flags & ASE_MT);
6115             gen_helper_mtc0_vpecontrol(cpu_env, arg);
6116             rn = "VPEControl";
6117             break;
6118         case 2:
6119             CP0_CHECK(ctx->insn_flags & ASE_MT);
6120             gen_helper_mtc0_vpeconf0(cpu_env, arg);
6121             rn = "VPEConf0";
6122             break;
6123         case 3:
6124             CP0_CHECK(ctx->insn_flags & ASE_MT);
6125             gen_helper_mtc0_vpeconf1(cpu_env, arg);
6126             rn = "VPEConf1";
6127             break;
6128         case 4:
6129             CP0_CHECK(ctx->insn_flags & ASE_MT);
6130             gen_helper_mtc0_yqmask(cpu_env, arg);
6131             rn = "YQMask";
6132             break;
6133         case 5:
6134             CP0_CHECK(ctx->insn_flags & ASE_MT);
6135             tcg_gen_st_tl(arg, cpu_env,
6136                           offsetof(CPUMIPSState, CP0_VPESchedule));
6137             rn = "VPESchedule";
6138             break;
6139         case 6:
6140             CP0_CHECK(ctx->insn_flags & ASE_MT);
6141             tcg_gen_st_tl(arg, cpu_env,
6142                           offsetof(CPUMIPSState, CP0_VPEScheFBack));
6143             rn = "VPEScheFBack";
6144             break;
6145         case 7:
6146             CP0_CHECK(ctx->insn_flags & ASE_MT);
6147             gen_helper_mtc0_vpeopt(cpu_env, arg);
6148             rn = "VPEOpt";
6149             break;
6150         default:
6151             goto cp0_unimplemented;
6152         }
6153         break;
6154     case 2:
6155         switch (sel) {
6156         case 0:
6157             gen_helper_mtc0_entrylo0(cpu_env, arg);
6158             rn = "EntryLo0";
6159             break;
6160         case 1:
6161             CP0_CHECK(ctx->insn_flags & ASE_MT);
6162             gen_helper_mtc0_tcstatus(cpu_env, arg);
6163             rn = "TCStatus";
6164             break;
6165         case 2:
6166             CP0_CHECK(ctx->insn_flags & ASE_MT);
6167             gen_helper_mtc0_tcbind(cpu_env, arg);
6168             rn = "TCBind";
6169             break;
6170         case 3:
6171             CP0_CHECK(ctx->insn_flags & ASE_MT);
6172             gen_helper_mtc0_tcrestart(cpu_env, arg);
6173             rn = "TCRestart";
6174             break;
6175         case 4:
6176             CP0_CHECK(ctx->insn_flags & ASE_MT);
6177             gen_helper_mtc0_tchalt(cpu_env, arg);
6178             rn = "TCHalt";
6179             break;
6180         case 5:
6181             CP0_CHECK(ctx->insn_flags & ASE_MT);
6182             gen_helper_mtc0_tccontext(cpu_env, arg);
6183             rn = "TCContext";
6184             break;
6185         case 6:
6186             CP0_CHECK(ctx->insn_flags & ASE_MT);
6187             gen_helper_mtc0_tcschedule(cpu_env, arg);
6188             rn = "TCSchedule";
6189             break;
6190         case 7:
6191             CP0_CHECK(ctx->insn_flags & ASE_MT);
6192             gen_helper_mtc0_tcschefback(cpu_env, arg);
6193             rn = "TCScheFBack";
6194             break;
6195         default:
6196             goto cp0_unimplemented;
6197         }
6198         break;
6199     case 3:
6200         switch (sel) {
6201         case 0:
6202             gen_helper_mtc0_entrylo1(cpu_env, arg);
6203             rn = "EntryLo1";
6204             break;
6205         case 1:
6206             CP0_CHECK(ctx->vp);
6207             /* ignored */
6208             rn = "GlobalNumber";
6209             break;
6210         default:
6211             goto cp0_unimplemented;
6212         }
6213         break;
6214     case 4:
6215         switch (sel) {
6216         case 0:
6217             gen_helper_mtc0_context(cpu_env, arg);
6218             rn = "Context";
6219             break;
6220         case 1:
6221 //            gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
6222             rn = "ContextConfig";
6223             goto cp0_unimplemented;
6224         case 2:
6225             CP0_CHECK(ctx->ulri);
6226             tcg_gen_st_tl(arg, cpu_env,
6227                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
6228             rn = "UserLocal";
6229             break;
6230         default:
6231             goto cp0_unimplemented;
6232         }
6233         break;
6234     case 5:
6235         switch (sel) {
6236         case 0:
6237             gen_helper_mtc0_pagemask(cpu_env, arg);
6238             rn = "PageMask";
6239             break;
6240         case 1:
6241             check_insn(ctx, ISA_MIPS32R2);
6242             gen_helper_mtc0_pagegrain(cpu_env, arg);
6243             rn = "PageGrain";
6244             ctx->base.is_jmp = DISAS_STOP;
6245             break;
6246         case 2:
6247             CP0_CHECK(ctx->sc);
6248             gen_helper_mtc0_segctl0(cpu_env, arg);
6249             rn = "SegCtl0";
6250             break;
6251         case 3:
6252             CP0_CHECK(ctx->sc);
6253             gen_helper_mtc0_segctl1(cpu_env, arg);
6254             rn = "SegCtl1";
6255             break;
6256         case 4:
6257             CP0_CHECK(ctx->sc);
6258             gen_helper_mtc0_segctl2(cpu_env, arg);
6259             rn = "SegCtl2";
6260             break;
6261         default:
6262             goto cp0_unimplemented;
6263         }
6264         break;
6265     case 6:
6266         switch (sel) {
6267         case 0:
6268             gen_helper_mtc0_wired(cpu_env, arg);
6269             rn = "Wired";
6270             break;
6271         case 1:
6272             check_insn(ctx, ISA_MIPS32R2);
6273             gen_helper_mtc0_srsconf0(cpu_env, arg);
6274             rn = "SRSConf0";
6275             break;
6276         case 2:
6277             check_insn(ctx, ISA_MIPS32R2);
6278             gen_helper_mtc0_srsconf1(cpu_env, arg);
6279             rn = "SRSConf1";
6280             break;
6281         case 3:
6282             check_insn(ctx, ISA_MIPS32R2);
6283             gen_helper_mtc0_srsconf2(cpu_env, arg);
6284             rn = "SRSConf2";
6285             break;
6286         case 4:
6287             check_insn(ctx, ISA_MIPS32R2);
6288             gen_helper_mtc0_srsconf3(cpu_env, arg);
6289             rn = "SRSConf3";
6290             break;
6291         case 5:
6292             check_insn(ctx, ISA_MIPS32R2);
6293             gen_helper_mtc0_srsconf4(cpu_env, arg);
6294             rn = "SRSConf4";
6295             break;
6296         default:
6297             goto cp0_unimplemented;
6298         }
6299         break;
6300     case 7:
6301         switch (sel) {
6302         case 0:
6303             check_insn(ctx, ISA_MIPS32R2);
6304             gen_helper_mtc0_hwrena(cpu_env, arg);
6305             ctx->base.is_jmp = DISAS_STOP;
6306             rn = "HWREna";
6307             break;
6308         default:
6309             goto cp0_unimplemented;
6310         }
6311         break;
6312     case 8:
6313         switch (sel) {
6314         case 0:
6315             /* ignored */
6316             rn = "BadVAddr";
6317             break;
6318         case 1:
6319             /* ignored */
6320             rn = "BadInstr";
6321             break;
6322         case 2:
6323             /* ignored */
6324             rn = "BadInstrP";
6325             break;
6326         case 3:
6327             /* ignored */
6328             rn = "BadInstrX";
6329             break;
6330         default:
6331             goto cp0_unimplemented;
6332         }
6333         break;
6334     case 9:
6335         switch (sel) {
6336         case 0:
6337             gen_helper_mtc0_count(cpu_env, arg);
6338             rn = "Count";
6339             break;
6340         /* 6,7 are implementation dependent */
6341         default:
6342             goto cp0_unimplemented;
6343         }
6344         break;
6345     case 10:
6346         switch (sel) {
6347         case 0:
6348             gen_helper_mtc0_entryhi(cpu_env, arg);
6349             rn = "EntryHi";
6350             break;
6351         default:
6352             goto cp0_unimplemented;
6353         }
6354         break;
6355     case 11:
6356         switch (sel) {
6357         case 0:
6358             gen_helper_mtc0_compare(cpu_env, arg);
6359             rn = "Compare";
6360             break;
6361         /* 6,7 are implementation dependent */
6362         default:
6363             goto cp0_unimplemented;
6364         }
6365         break;
6366     case 12:
6367         switch (sel) {
6368         case 0:
6369             save_cpu_state(ctx, 1);
6370             gen_helper_mtc0_status(cpu_env, arg);
6371             /* DISAS_STOP isn't good enough here, hflags may have changed. */
6372             gen_save_pc(ctx->base.pc_next + 4);
6373             ctx->base.is_jmp = DISAS_EXIT;
6374             rn = "Status";
6375             break;
6376         case 1:
6377             check_insn(ctx, ISA_MIPS32R2);
6378             gen_helper_mtc0_intctl(cpu_env, arg);
6379             /* Stop translation as we may have switched the execution mode */
6380             ctx->base.is_jmp = DISAS_STOP;
6381             rn = "IntCtl";
6382             break;
6383         case 2:
6384             check_insn(ctx, ISA_MIPS32R2);
6385             gen_helper_mtc0_srsctl(cpu_env, arg);
6386             /* Stop translation as we may have switched the execution mode */
6387             ctx->base.is_jmp = DISAS_STOP;
6388             rn = "SRSCtl";
6389             break;
6390         case 3:
6391             check_insn(ctx, ISA_MIPS32R2);
6392             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
6393             /* Stop translation as we may have switched the execution mode */
6394             ctx->base.is_jmp = DISAS_STOP;
6395             rn = "SRSMap";
6396             break;
6397         default:
6398             goto cp0_unimplemented;
6399         }
6400         break;
6401     case 13:
6402         switch (sel) {
6403         case 0:
6404             save_cpu_state(ctx, 1);
6405             gen_helper_mtc0_cause(cpu_env, arg);
6406             /* Stop translation as we may have triggered an interrupt.
6407              * DISAS_STOP isn't sufficient, we need to ensure we break out of
6408              * translated code to check for pending interrupts.  */
6409             gen_save_pc(ctx->base.pc_next + 4);
6410             ctx->base.is_jmp = DISAS_EXIT;
6411             rn = "Cause";
6412             break;
6413         default:
6414             goto cp0_unimplemented;
6415         }
6416         break;
6417     case 14:
6418         switch (sel) {
6419         case 0:
6420             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
6421             rn = "EPC";
6422             break;
6423         default:
6424             goto cp0_unimplemented;
6425         }
6426         break;
6427     case 15:
6428         switch (sel) {
6429         case 0:
6430             /* ignored */
6431             rn = "PRid";
6432             break;
6433         case 1:
6434             check_insn(ctx, ISA_MIPS32R2);
6435             gen_helper_mtc0_ebase(cpu_env, arg);
6436             rn = "EBase";
6437             break;
6438         default:
6439             goto cp0_unimplemented;
6440         }
6441         break;
6442     case 16:
6443         switch (sel) {
6444         case 0:
6445             gen_helper_mtc0_config0(cpu_env, arg);
6446             rn = "Config";
6447             /* Stop translation as we may have switched the execution mode */
6448             ctx->base.is_jmp = DISAS_STOP;
6449             break;
6450         case 1:
6451             /* ignored, read only */
6452             rn = "Config1";
6453             break;
6454         case 2:
6455             gen_helper_mtc0_config2(cpu_env, arg);
6456             rn = "Config2";
6457             /* Stop translation as we may have switched the execution mode */
6458             ctx->base.is_jmp = DISAS_STOP;
6459             break;
6460         case 3:
6461             gen_helper_mtc0_config3(cpu_env, arg);
6462             rn = "Config3";
6463             /* Stop translation as we may have switched the execution mode */
6464             ctx->base.is_jmp = DISAS_STOP;
6465             break;
6466         case 4:
6467             gen_helper_mtc0_config4(cpu_env, arg);
6468             rn = "Config4";
6469             ctx->base.is_jmp = DISAS_STOP;
6470             break;
6471         case 5:
6472             gen_helper_mtc0_config5(cpu_env, arg);
6473             rn = "Config5";
6474             /* Stop translation as we may have switched the execution mode */
6475             ctx->base.is_jmp = DISAS_STOP;
6476             break;
6477         /* 6,7 are implementation dependent */
6478         case 6:
6479             /* ignored */
6480             rn = "Config6";
6481             break;
6482         case 7:
6483             /* ignored */
6484             rn = "Config7";
6485             break;
6486         default:
6487             rn = "Invalid config selector";
6488             goto cp0_unimplemented;
6489         }
6490         break;
6491     case 17:
6492         switch (sel) {
6493         case 0:
6494             gen_helper_mtc0_lladdr(cpu_env, arg);
6495             rn = "LLAddr";
6496             break;
6497         case 1:
6498             CP0_CHECK(ctx->mrp);
6499             gen_helper_mtc0_maar(cpu_env, arg);
6500             rn = "MAAR";
6501             break;
6502         case 2:
6503             CP0_CHECK(ctx->mrp);
6504             gen_helper_mtc0_maari(cpu_env, arg);
6505             rn = "MAARI";
6506             break;
6507         default:
6508             goto cp0_unimplemented;
6509         }
6510         break;
6511     case 18:
6512         switch (sel) {
6513         case 0:
6514         case 1:
6515         case 2:
6516         case 3:
6517         case 4:
6518         case 5:
6519         case 6:
6520         case 7:
6521             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
6522             gen_helper_0e1i(mtc0_watchlo, arg, sel);
6523             rn = "WatchLo";
6524             break;
6525         default:
6526             goto cp0_unimplemented;
6527         }
6528         break;
6529     case 19:
6530         switch (sel) {
6531         case 0:
6532         case 1:
6533         case 2:
6534         case 3:
6535         case 4:
6536         case 5:
6537         case 6:
6538         case 7:
6539             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
6540             gen_helper_0e1i(mtc0_watchhi, arg, sel);
6541             rn = "WatchHi";
6542             break;
6543         default:
6544             goto cp0_unimplemented;
6545         }
6546         break;
6547     case 20:
6548         switch (sel) {
6549         case 0:
6550 #if defined(TARGET_MIPS64)
6551             check_insn(ctx, ISA_MIPS3);
6552             gen_helper_mtc0_xcontext(cpu_env, arg);
6553             rn = "XContext";
6554             break;
6555 #endif
6556         default:
6557             goto cp0_unimplemented;
6558         }
6559         break;
6560     case 21:
6561        /* Officially reserved, but sel 0 is used for R1x000 framemask */
6562         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
6563         switch (sel) {
6564         case 0:
6565             gen_helper_mtc0_framemask(cpu_env, arg);
6566             rn = "Framemask";
6567             break;
6568         default:
6569             goto cp0_unimplemented;
6570         }
6571         break;
6572     case 22:
6573         /* ignored */
6574         rn = "Diagnostic"; /* implementation dependent */
6575         break;
6576     case 23:
6577         switch (sel) {
6578         case 0:
6579             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
6580             /* DISAS_STOP isn't good enough here, hflags may have changed. */
6581             gen_save_pc(ctx->base.pc_next + 4);
6582             ctx->base.is_jmp = DISAS_EXIT;
6583             rn = "Debug";
6584             break;
6585         case 1:
6586 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
6587             rn = "TraceControl";
6588             /* Stop translation as we may have switched the execution mode */
6589             ctx->base.is_jmp = DISAS_STOP;
6590             goto cp0_unimplemented;
6591         case 2:
6592 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
6593             rn = "TraceControl2";
6594             /* Stop translation as we may have switched the execution mode */
6595             ctx->base.is_jmp = DISAS_STOP;
6596             goto cp0_unimplemented;
6597         case 3:
6598             /* Stop translation as we may have switched the execution mode */
6599             ctx->base.is_jmp = DISAS_STOP;
6600 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
6601             rn = "UserTraceData";
6602             /* Stop translation as we may have switched the execution mode */
6603             ctx->base.is_jmp = DISAS_STOP;
6604             goto cp0_unimplemented;
6605         case 4:
6606 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
6607             /* Stop translation as we may have switched the execution mode */
6608             ctx->base.is_jmp = DISAS_STOP;
6609             rn = "TraceBPC";
6610             goto cp0_unimplemented;
6611         default:
6612             goto cp0_unimplemented;
6613         }
6614         break;
6615     case 24:
6616         switch (sel) {
6617         case 0:
6618             /* EJTAG support */
6619             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
6620             rn = "DEPC";
6621             break;
6622         default:
6623             goto cp0_unimplemented;
6624         }
6625         break;
6626     case 25:
6627         switch (sel) {
6628         case 0:
6629             gen_helper_mtc0_performance0(cpu_env, arg);
6630             rn = "Performance0";
6631             break;
6632         case 1:
6633 //            gen_helper_mtc0_performance1(arg);
6634             rn = "Performance1";
6635             goto cp0_unimplemented;
6636         case 2:
6637 //            gen_helper_mtc0_performance2(arg);
6638             rn = "Performance2";
6639             goto cp0_unimplemented;
6640         case 3:
6641 //            gen_helper_mtc0_performance3(arg);
6642             rn = "Performance3";
6643             goto cp0_unimplemented;
6644         case 4:
6645 //            gen_helper_mtc0_performance4(arg);
6646             rn = "Performance4";
6647             goto cp0_unimplemented;
6648         case 5:
6649 //            gen_helper_mtc0_performance5(arg);
6650             rn = "Performance5";
6651             goto cp0_unimplemented;
6652         case 6:
6653 //            gen_helper_mtc0_performance6(arg);
6654             rn = "Performance6";
6655             goto cp0_unimplemented;
6656         case 7:
6657 //            gen_helper_mtc0_performance7(arg);
6658             rn = "Performance7";
6659             goto cp0_unimplemented;
6660         default:
6661             goto cp0_unimplemented;
6662         }
6663        break;
6664     case 26:
6665         switch (sel) {
6666         case 0:
6667             gen_helper_mtc0_errctl(cpu_env, arg);
6668             ctx->base.is_jmp = DISAS_STOP;
6669             rn = "ErrCtl";
6670             break;
6671         default:
6672             goto cp0_unimplemented;
6673         }
6674         break;
6675     case 27:
6676         switch (sel) {
6677         case 0:
6678         case 1:
6679         case 2:
6680         case 3:
6681             /* ignored */
6682             rn = "CacheErr";
6683             break;
6684         default:
6685             goto cp0_unimplemented;
6686         }
6687        break;
6688     case 28:
6689         switch (sel) {
6690         case 0:
6691         case 2:
6692         case 4:
6693         case 6:
6694             gen_helper_mtc0_taglo(cpu_env, arg);
6695             rn = "TagLo";
6696             break;
6697         case 1:
6698         case 3:
6699         case 5:
6700         case 7:
6701             gen_helper_mtc0_datalo(cpu_env, arg);
6702             rn = "DataLo";
6703             break;
6704         default:
6705             goto cp0_unimplemented;
6706         }
6707         break;
6708     case 29:
6709         switch (sel) {
6710         case 0:
6711         case 2:
6712         case 4:
6713         case 6:
6714             gen_helper_mtc0_taghi(cpu_env, arg);
6715             rn = "TagHi";
6716             break;
6717         case 1:
6718         case 3:
6719         case 5:
6720         case 7:
6721             gen_helper_mtc0_datahi(cpu_env, arg);
6722             rn = "DataHi";
6723             break;
6724         default:
6725             rn = "invalid sel";
6726             goto cp0_unimplemented;
6727         }
6728        break;
6729     case 30:
6730         switch (sel) {
6731         case 0:
6732             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
6733             rn = "ErrorEPC";
6734             break;
6735         default:
6736             goto cp0_unimplemented;
6737         }
6738         break;
6739     case 31:
6740         switch (sel) {
6741         case 0:
6742             /* EJTAG support */
6743             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
6744             rn = "DESAVE";
6745             break;
6746         case 2:
6747         case 3:
6748         case 4:
6749         case 5:
6750         case 6:
6751         case 7:
6752             CP0_CHECK(ctx->kscrexist & (1 << sel));
6753             tcg_gen_st_tl(arg, cpu_env,
6754                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
6755             rn = "KScratch";
6756             break;
6757         default:
6758             goto cp0_unimplemented;
6759         }
6760         break;
6761     default:
6762        goto cp0_unimplemented;
6763     }
6764     trace_mips_translate_c0("mtc0", rn, reg, sel);
6765
6766     /* For simplicity assume that all writes can cause interrupts.  */
6767     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
6768         gen_io_end();
6769         /* DISAS_STOP isn't sufficient, we need to ensure we break out of
6770          * translated code to check for pending interrupts.  */
6771         gen_save_pc(ctx->base.pc_next + 4);
6772         ctx->base.is_jmp = DISAS_EXIT;
6773     }
6774     return;
6775
6776 cp0_unimplemented:
6777     qemu_log_mask(LOG_UNIMP, "mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
6778 }
6779
6780 #if defined(TARGET_MIPS64)
6781 static void gen_dmfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6782 {
6783     const char *rn = "invalid";
6784
6785     if (sel != 0)
6786         check_insn(ctx, ISA_MIPS64);
6787
6788     switch (reg) {
6789     case 0:
6790         switch (sel) {
6791         case 0:
6792             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
6793             rn = "Index";
6794             break;
6795         case 1:
6796             CP0_CHECK(ctx->insn_flags & ASE_MT);
6797             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
6798             rn = "MVPControl";
6799             break;
6800         case 2:
6801             CP0_CHECK(ctx->insn_flags & ASE_MT);
6802             gen_helper_mfc0_mvpconf0(arg, cpu_env);
6803             rn = "MVPConf0";
6804             break;
6805         case 3:
6806             CP0_CHECK(ctx->insn_flags & ASE_MT);
6807             gen_helper_mfc0_mvpconf1(arg, cpu_env);
6808             rn = "MVPConf1";
6809             break;
6810         case 4:
6811             CP0_CHECK(ctx->vp);
6812             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPControl));
6813             rn = "VPControl";
6814             break;
6815         default:
6816             goto cp0_unimplemented;
6817         }
6818         break;
6819     case 1:
6820         switch (sel) {
6821         case 0:
6822             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
6823             gen_helper_mfc0_random(arg, cpu_env);
6824             rn = "Random";
6825             break;
6826         case 1:
6827             CP0_CHECK(ctx->insn_flags & ASE_MT);
6828             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
6829             rn = "VPEControl";
6830             break;
6831         case 2:
6832             CP0_CHECK(ctx->insn_flags & ASE_MT);
6833             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
6834             rn = "VPEConf0";
6835             break;
6836         case 3:
6837             CP0_CHECK(ctx->insn_flags & ASE_MT);
6838             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
6839             rn = "VPEConf1";
6840             break;
6841         case 4:
6842             CP0_CHECK(ctx->insn_flags & ASE_MT);
6843             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_YQMask));
6844             rn = "YQMask";
6845             break;
6846         case 5:
6847             CP0_CHECK(ctx->insn_flags & ASE_MT);
6848             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
6849             rn = "VPESchedule";
6850             break;
6851         case 6:
6852             CP0_CHECK(ctx->insn_flags & ASE_MT);
6853             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
6854             rn = "VPEScheFBack";
6855             break;
6856         case 7:
6857             CP0_CHECK(ctx->insn_flags & ASE_MT);
6858             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
6859             rn = "VPEOpt";
6860             break;
6861         default:
6862             goto cp0_unimplemented;
6863         }
6864         break;
6865     case 2:
6866         switch (sel) {
6867         case 0:
6868             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0));
6869             rn = "EntryLo0";
6870             break;
6871         case 1:
6872             CP0_CHECK(ctx->insn_flags & ASE_MT);
6873             gen_helper_mfc0_tcstatus(arg, cpu_env);
6874             rn = "TCStatus";
6875             break;
6876         case 2:
6877             CP0_CHECK(ctx->insn_flags & ASE_MT);
6878             gen_helper_mfc0_tcbind(arg, cpu_env);
6879             rn = "TCBind";
6880             break;
6881         case 3:
6882             CP0_CHECK(ctx->insn_flags & ASE_MT);
6883             gen_helper_dmfc0_tcrestart(arg, cpu_env);
6884             rn = "TCRestart";
6885             break;
6886         case 4:
6887             CP0_CHECK(ctx->insn_flags & ASE_MT);
6888             gen_helper_dmfc0_tchalt(arg, cpu_env);
6889             rn = "TCHalt";
6890             break;
6891         case 5:
6892             CP0_CHECK(ctx->insn_flags & ASE_MT);
6893             gen_helper_dmfc0_tccontext(arg, cpu_env);
6894             rn = "TCContext";
6895             break;
6896         case 6:
6897             CP0_CHECK(ctx->insn_flags & ASE_MT);
6898             gen_helper_dmfc0_tcschedule(arg, cpu_env);
6899             rn = "TCSchedule";
6900             break;
6901         case 7:
6902             CP0_CHECK(ctx->insn_flags & ASE_MT);
6903             gen_helper_dmfc0_tcschefback(arg, cpu_env);
6904             rn = "TCScheFBack";
6905             break;
6906         default:
6907             goto cp0_unimplemented;
6908         }
6909         break;
6910     case 3:
6911         switch (sel) {
6912         case 0:
6913             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
6914             rn = "EntryLo1";
6915             break;
6916         case 1:
6917             CP0_CHECK(ctx->vp);
6918             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_GlobalNumber));
6919             rn = "GlobalNumber";
6920             break;
6921         default:
6922             goto cp0_unimplemented;
6923         }
6924         break;
6925     case 4:
6926         switch (sel) {
6927         case 0:
6928             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
6929             rn = "Context";
6930             break;
6931         case 1:
6932 //            gen_helper_dmfc0_contextconfig(arg); /* SmartMIPS ASE */
6933             rn = "ContextConfig";
6934             goto cp0_unimplemented;
6935         case 2:
6936             CP0_CHECK(ctx->ulri);
6937             tcg_gen_ld_tl(arg, cpu_env,
6938                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
6939             rn = "UserLocal";
6940             break;
6941         default:
6942             goto cp0_unimplemented;
6943         }
6944         break;
6945     case 5:
6946         switch (sel) {
6947         case 0:
6948             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
6949             rn = "PageMask";
6950             break;
6951         case 1:
6952             check_insn(ctx, ISA_MIPS32R2);
6953             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
6954             rn = "PageGrain";
6955             break;
6956         case 2:
6957             CP0_CHECK(ctx->sc);
6958             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl0));
6959             rn = "SegCtl0";
6960             break;
6961         case 3:
6962             CP0_CHECK(ctx->sc);
6963             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl1));
6964             rn = "SegCtl1";
6965             break;
6966         case 4:
6967             CP0_CHECK(ctx->sc);
6968             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl2));
6969             rn = "SegCtl2";
6970             break;
6971         default:
6972             goto cp0_unimplemented;
6973         }
6974         break;
6975     case 6:
6976         switch (sel) {
6977         case 0:
6978             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
6979             rn = "Wired";
6980             break;
6981         case 1:
6982             check_insn(ctx, ISA_MIPS32R2);
6983             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
6984             rn = "SRSConf0";
6985             break;
6986         case 2:
6987             check_insn(ctx, ISA_MIPS32R2);
6988             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
6989             rn = "SRSConf1";
6990             break;
6991         case 3:
6992             check_insn(ctx, ISA_MIPS32R2);
6993             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
6994             rn = "SRSConf2";
6995             break;
6996         case 4:
6997             check_insn(ctx, ISA_MIPS32R2);
6998             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
6999             rn = "SRSConf3";
7000             break;
7001         case 5:
7002             check_insn(ctx, ISA_MIPS32R2);
7003             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
7004             rn = "SRSConf4";
7005             break;
7006         default:
7007             goto cp0_unimplemented;
7008         }
7009         break;
7010     case 7:
7011         switch (sel) {
7012         case 0:
7013             check_insn(ctx, ISA_MIPS32R2);
7014             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
7015             rn = "HWREna";
7016             break;
7017         default:
7018             goto cp0_unimplemented;
7019         }
7020         break;
7021     case 8:
7022         switch (sel) {
7023         case 0:
7024             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
7025             rn = "BadVAddr";
7026             break;
7027         case 1:
7028             CP0_CHECK(ctx->bi);
7029             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
7030             rn = "BadInstr";
7031             break;
7032         case 2:
7033             CP0_CHECK(ctx->bp);
7034             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
7035             rn = "BadInstrP";
7036             break;
7037         case 3:
7038             CP0_CHECK(ctx->bi);
7039             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrX));
7040             tcg_gen_andi_tl(arg, arg, ~0xffff);
7041             rn = "BadInstrX";
7042             break;
7043         default:
7044             goto cp0_unimplemented;
7045         }
7046         break;
7047     case 9:
7048         switch (sel) {
7049         case 0:
7050             /* Mark as an IO operation because we read the time.  */
7051             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
7052                 gen_io_start();
7053             }
7054             gen_helper_mfc0_count(arg, cpu_env);
7055             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
7056                 gen_io_end();
7057             }
7058             /* Break the TB to be able to take timer interrupts immediately
7059                after reading count. DISAS_STOP isn't sufficient, we need to
7060                ensure we break completely out of translated code.  */
7061             gen_save_pc(ctx->base.pc_next + 4);
7062             ctx->base.is_jmp = DISAS_EXIT;
7063             rn = "Count";
7064             break;
7065         /* 6,7 are implementation dependent */
7066         default:
7067             goto cp0_unimplemented;
7068         }
7069         break;
7070     case 10:
7071         switch (sel) {
7072         case 0:
7073             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
7074             rn = "EntryHi";
7075             break;
7076         default:
7077             goto cp0_unimplemented;
7078         }
7079         break;
7080     case 11:
7081         switch (sel) {
7082         case 0:
7083             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
7084             rn = "Compare";
7085             break;
7086         /* 6,7 are implementation dependent */
7087         default:
7088             goto cp0_unimplemented;
7089         }
7090         break;
7091     case 12:
7092         switch (sel) {
7093         case 0:
7094             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
7095             rn = "Status";
7096             break;
7097         case 1:
7098             check_insn(ctx, ISA_MIPS32R2);
7099             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
7100             rn = "IntCtl";
7101             break;
7102         case 2:
7103             check_insn(ctx, ISA_MIPS32R2);
7104             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
7105             rn = "SRSCtl";
7106             break;
7107         case 3:
7108             check_insn(ctx, ISA_MIPS32R2);
7109             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
7110             rn = "SRSMap";
7111             break;
7112         default:
7113             goto cp0_unimplemented;
7114         }
7115         break;
7116     case 13:
7117         switch (sel) {
7118         case 0:
7119             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
7120             rn = "Cause";
7121             break;
7122         default:
7123             goto cp0_unimplemented;
7124         }
7125         break;
7126     case 14:
7127         switch (sel) {
7128         case 0:
7129             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
7130             rn = "EPC";
7131             break;
7132         default:
7133             goto cp0_unimplemented;
7134         }
7135         break;
7136     case 15:
7137         switch (sel) {
7138         case 0:
7139             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
7140             rn = "PRid";
7141             break;
7142         case 1:
7143             check_insn(ctx, ISA_MIPS32R2);
7144             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EBase));
7145             rn = "EBase";
7146             break;
7147         case 3:
7148             check_insn(ctx, ISA_MIPS32R2);
7149             CP0_CHECK(ctx->cmgcr);
7150             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_CMGCRBase));
7151             rn = "CMGCRBase";
7152             break;
7153         default:
7154             goto cp0_unimplemented;
7155         }
7156         break;
7157     case 16:
7158         switch (sel) {
7159         case 0:
7160             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
7161             rn = "Config";
7162             break;
7163         case 1:
7164             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
7165             rn = "Config1";
7166             break;
7167         case 2:
7168             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
7169             rn = "Config2";
7170             break;
7171         case 3:
7172             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
7173             rn = "Config3";
7174             break;
7175         case 4:
7176             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
7177             rn = "Config4";
7178             break;
7179         case 5:
7180             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
7181             rn = "Config5";
7182             break;
7183        /* 6,7 are implementation dependent */
7184         case 6:
7185             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
7186             rn = "Config6";
7187             break;
7188         case 7:
7189             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
7190             rn = "Config7";
7191             break;
7192         default:
7193             goto cp0_unimplemented;
7194         }
7195         break;
7196     case 17:
7197         switch (sel) {
7198         case 0:
7199             gen_helper_dmfc0_lladdr(arg, cpu_env);
7200             rn = "LLAddr";
7201             break;
7202         case 1:
7203             CP0_CHECK(ctx->mrp);
7204             gen_helper_dmfc0_maar(arg, cpu_env);
7205             rn = "MAAR";
7206             break;
7207         case 2:
7208             CP0_CHECK(ctx->mrp);
7209             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MAARI));
7210             rn = "MAARI";
7211             break;
7212         default:
7213             goto cp0_unimplemented;
7214         }
7215         break;
7216     case 18:
7217         switch (sel) {
7218         case 0:
7219         case 1:
7220         case 2:
7221         case 3:
7222         case 4:
7223         case 5:
7224         case 6:
7225         case 7:
7226             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7227             gen_helper_1e0i(dmfc0_watchlo, arg, sel);
7228             rn = "WatchLo";
7229             break;
7230         default:
7231             goto cp0_unimplemented;
7232         }
7233         break;
7234     case 19:
7235         switch (sel) {
7236         case 0:
7237         case 1:
7238         case 2:
7239         case 3:
7240         case 4:
7241         case 5:
7242         case 6:
7243         case 7:
7244             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7245             gen_helper_1e0i(mfc0_watchhi, arg, sel);
7246             rn = "WatchHi";
7247             break;
7248         default:
7249             goto cp0_unimplemented;
7250         }
7251         break;
7252     case 20:
7253         switch (sel) {
7254         case 0:
7255             check_insn(ctx, ISA_MIPS3);
7256             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
7257             rn = "XContext";
7258             break;
7259         default:
7260             goto cp0_unimplemented;
7261         }
7262         break;
7263     case 21:
7264        /* Officially reserved, but sel 0 is used for R1x000 framemask */
7265         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
7266         switch (sel) {
7267         case 0:
7268             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
7269             rn = "Framemask";
7270             break;
7271         default:
7272             goto cp0_unimplemented;
7273         }
7274         break;
7275     case 22:
7276         tcg_gen_movi_tl(arg, 0); /* unimplemented */
7277         rn = "'Diagnostic"; /* implementation dependent */
7278         break;
7279     case 23:
7280         switch (sel) {
7281         case 0:
7282             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
7283             rn = "Debug";
7284             break;
7285         case 1:
7286 //            gen_helper_dmfc0_tracecontrol(arg, cpu_env); /* PDtrace support */
7287             rn = "TraceControl";
7288             goto cp0_unimplemented;
7289         case 2:
7290 //            gen_helper_dmfc0_tracecontrol2(arg, cpu_env); /* PDtrace support */
7291             rn = "TraceControl2";
7292             goto cp0_unimplemented;
7293         case 3:
7294 //            gen_helper_dmfc0_usertracedata(arg, cpu_env); /* PDtrace support */
7295             rn = "UserTraceData";
7296             goto cp0_unimplemented;
7297         case 4:
7298 //            gen_helper_dmfc0_tracebpc(arg, cpu_env); /* PDtrace support */
7299             rn = "TraceBPC";
7300             goto cp0_unimplemented;
7301         default:
7302             goto cp0_unimplemented;
7303         }
7304         break;
7305     case 24:
7306         switch (sel) {
7307         case 0:
7308             /* EJTAG support */
7309             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
7310             rn = "DEPC";
7311             break;
7312         default:
7313             goto cp0_unimplemented;
7314         }
7315         break;
7316     case 25:
7317         switch (sel) {
7318         case 0:
7319             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
7320             rn = "Performance0";
7321             break;
7322         case 1:
7323 //            gen_helper_dmfc0_performance1(arg);
7324             rn = "Performance1";
7325             goto cp0_unimplemented;
7326         case 2:
7327 //            gen_helper_dmfc0_performance2(arg);
7328             rn = "Performance2";
7329             goto cp0_unimplemented;
7330         case 3:
7331 //            gen_helper_dmfc0_performance3(arg);
7332             rn = "Performance3";
7333             goto cp0_unimplemented;
7334         case 4:
7335 //            gen_helper_dmfc0_performance4(arg);
7336             rn = "Performance4";
7337             goto cp0_unimplemented;
7338         case 5:
7339 //            gen_helper_dmfc0_performance5(arg);
7340             rn = "Performance5";
7341             goto cp0_unimplemented;
7342         case 6:
7343 //            gen_helper_dmfc0_performance6(arg);
7344             rn = "Performance6";
7345             goto cp0_unimplemented;
7346         case 7:
7347 //            gen_helper_dmfc0_performance7(arg);
7348             rn = "Performance7";
7349             goto cp0_unimplemented;
7350         default:
7351             goto cp0_unimplemented;
7352         }
7353         break;
7354     case 26:
7355         switch (sel) {
7356         case 0:
7357             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_ErrCtl));
7358             rn = "ErrCtl";
7359             break;
7360         default:
7361             goto cp0_unimplemented;
7362         }
7363         break;
7364     case 27:
7365         switch (sel) {
7366         /* ignored */
7367         case 0:
7368         case 1:
7369         case 2:
7370         case 3:
7371             tcg_gen_movi_tl(arg, 0); /* unimplemented */
7372             rn = "CacheErr";
7373             break;
7374         default:
7375             goto cp0_unimplemented;
7376         }
7377         break;
7378     case 28:
7379         switch (sel) {
7380         case 0:
7381         case 2:
7382         case 4:
7383         case 6:
7384             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
7385             rn = "TagLo";
7386             break;
7387         case 1:
7388         case 3:
7389         case 5:
7390         case 7:
7391             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
7392             rn = "DataLo";
7393             break;
7394         default:
7395             goto cp0_unimplemented;
7396         }
7397         break;
7398     case 29:
7399         switch (sel) {
7400         case 0:
7401         case 2:
7402         case 4:
7403         case 6:
7404             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
7405             rn = "TagHi";
7406             break;
7407         case 1:
7408         case 3:
7409         case 5:
7410         case 7:
7411             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
7412             rn = "DataHi";
7413             break;
7414         default:
7415             goto cp0_unimplemented;
7416         }
7417         break;
7418     case 30:
7419         switch (sel) {
7420         case 0:
7421             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
7422             rn = "ErrorEPC";
7423             break;
7424         default:
7425             goto cp0_unimplemented;
7426         }
7427         break;
7428     case 31:
7429         switch (sel) {
7430         case 0:
7431             /* EJTAG support */
7432             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
7433             rn = "DESAVE";
7434             break;
7435         case 2:
7436         case 3:
7437         case 4:
7438         case 5:
7439         case 6:
7440         case 7:
7441             CP0_CHECK(ctx->kscrexist & (1 << sel));
7442             tcg_gen_ld_tl(arg, cpu_env,
7443                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
7444             rn = "KScratch";
7445             break;
7446         default:
7447             goto cp0_unimplemented;
7448         }
7449         break;
7450     default:
7451         goto cp0_unimplemented;
7452     }
7453     trace_mips_translate_c0("dmfc0", rn, reg, sel);
7454     return;
7455
7456 cp0_unimplemented:
7457     qemu_log_mask(LOG_UNIMP, "dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
7458     gen_mfc0_unimplemented(ctx, arg);
7459 }
7460
7461 static void gen_dmtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
7462 {
7463     const char *rn = "invalid";
7464
7465     if (sel != 0)
7466         check_insn(ctx, ISA_MIPS64);
7467
7468     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
7469         gen_io_start();
7470     }
7471
7472     switch (reg) {
7473     case 0:
7474         switch (sel) {
7475         case 0:
7476             gen_helper_mtc0_index(cpu_env, arg);
7477             rn = "Index";
7478             break;
7479         case 1:
7480             CP0_CHECK(ctx->insn_flags & ASE_MT);
7481             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
7482             rn = "MVPControl";
7483             break;
7484         case 2:
7485             CP0_CHECK(ctx->insn_flags & ASE_MT);
7486             /* ignored */
7487             rn = "MVPConf0";
7488             break;
7489         case 3:
7490             CP0_CHECK(ctx->insn_flags & ASE_MT);
7491             /* ignored */
7492             rn = "MVPConf1";
7493             break;
7494         case 4:
7495             CP0_CHECK(ctx->vp);
7496             /* ignored */
7497             rn = "VPControl";
7498             break;
7499         default:
7500             goto cp0_unimplemented;
7501         }
7502         break;
7503     case 1:
7504         switch (sel) {
7505         case 0:
7506             /* ignored */
7507             rn = "Random";
7508             break;
7509         case 1:
7510             CP0_CHECK(ctx->insn_flags & ASE_MT);
7511             gen_helper_mtc0_vpecontrol(cpu_env, arg);
7512             rn = "VPEControl";
7513             break;
7514         case 2:
7515             CP0_CHECK(ctx->insn_flags & ASE_MT);
7516             gen_helper_mtc0_vpeconf0(cpu_env, arg);
7517             rn = "VPEConf0";
7518             break;
7519         case 3:
7520             CP0_CHECK(ctx->insn_flags & ASE_MT);
7521             gen_helper_mtc0_vpeconf1(cpu_env, arg);
7522             rn = "VPEConf1";
7523             break;
7524         case 4:
7525             CP0_CHECK(ctx->insn_flags & ASE_MT);
7526             gen_helper_mtc0_yqmask(cpu_env, arg);
7527             rn = "YQMask";
7528             break;
7529         case 5:
7530             CP0_CHECK(ctx->insn_flags & ASE_MT);
7531             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
7532             rn = "VPESchedule";
7533             break;
7534         case 6:
7535             CP0_CHECK(ctx->insn_flags & ASE_MT);
7536             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
7537             rn = "VPEScheFBack";
7538             break;
7539         case 7:
7540             CP0_CHECK(ctx->insn_flags & ASE_MT);
7541             gen_helper_mtc0_vpeopt(cpu_env, arg);
7542             rn = "VPEOpt";
7543             break;
7544         default:
7545             goto cp0_unimplemented;
7546         }
7547         break;
7548     case 2:
7549         switch (sel) {
7550         case 0:
7551             gen_helper_dmtc0_entrylo0(cpu_env, arg);
7552             rn = "EntryLo0";
7553             break;
7554         case 1:
7555             CP0_CHECK(ctx->insn_flags & ASE_MT);
7556             gen_helper_mtc0_tcstatus(cpu_env, arg);
7557             rn = "TCStatus";
7558             break;
7559         case 2:
7560             CP0_CHECK(ctx->insn_flags & ASE_MT);
7561             gen_helper_mtc0_tcbind(cpu_env, arg);
7562             rn = "TCBind";
7563             break;
7564         case 3:
7565             CP0_CHECK(ctx->insn_flags & ASE_MT);
7566             gen_helper_mtc0_tcrestart(cpu_env, arg);
7567             rn = "TCRestart";
7568             break;
7569         case 4:
7570             CP0_CHECK(ctx->insn_flags & ASE_MT);
7571             gen_helper_mtc0_tchalt(cpu_env, arg);
7572             rn = "TCHalt";
7573             break;
7574         case 5:
7575             CP0_CHECK(ctx->insn_flags & ASE_MT);
7576             gen_helper_mtc0_tccontext(cpu_env, arg);
7577             rn = "TCContext";
7578             break;
7579         case 6:
7580             CP0_CHECK(ctx->insn_flags & ASE_MT);
7581             gen_helper_mtc0_tcschedule(cpu_env, arg);
7582             rn = "TCSchedule";
7583             break;
7584         case 7:
7585             CP0_CHECK(ctx->insn_flags & ASE_MT);
7586             gen_helper_mtc0_tcschefback(cpu_env, arg);
7587             rn = "TCScheFBack";
7588             break;
7589         default:
7590             goto cp0_unimplemented;
7591         }
7592         break;
7593     case 3:
7594         switch (sel) {
7595         case 0:
7596             gen_helper_dmtc0_entrylo1(cpu_env, arg);
7597             rn = "EntryLo1";
7598             break;
7599         case 1:
7600             CP0_CHECK(ctx->vp);
7601             /* ignored */
7602             rn = "GlobalNumber";
7603             break;
7604         default:
7605             goto cp0_unimplemented;
7606         }
7607         break;
7608     case 4:
7609         switch (sel) {
7610         case 0:
7611             gen_helper_mtc0_context(cpu_env, arg);
7612             rn = "Context";
7613             break;
7614         case 1:
7615 //           gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
7616             rn = "ContextConfig";
7617             goto cp0_unimplemented;
7618         case 2:
7619             CP0_CHECK(ctx->ulri);
7620             tcg_gen_st_tl(arg, cpu_env,
7621                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
7622             rn = "UserLocal";
7623             break;
7624         default:
7625             goto cp0_unimplemented;
7626         }
7627         break;
7628     case 5:
7629         switch (sel) {
7630         case 0:
7631             gen_helper_mtc0_pagemask(cpu_env, arg);
7632             rn = "PageMask";
7633             break;
7634         case 1:
7635             check_insn(ctx, ISA_MIPS32R2);
7636             gen_helper_mtc0_pagegrain(cpu_env, arg);
7637             rn = "PageGrain";
7638             break;
7639         case 2:
7640             CP0_CHECK(ctx->sc);
7641             gen_helper_mtc0_segctl0(cpu_env, arg);
7642             rn = "SegCtl0";
7643             break;
7644         case 3:
7645             CP0_CHECK(ctx->sc);
7646             gen_helper_mtc0_segctl1(cpu_env, arg);
7647             rn = "SegCtl1";
7648             break;
7649         case 4:
7650             CP0_CHECK(ctx->sc);
7651             gen_helper_mtc0_segctl2(cpu_env, arg);
7652             rn = "SegCtl2";
7653             break;
7654         default:
7655             goto cp0_unimplemented;
7656         }
7657         break;
7658     case 6:
7659         switch (sel) {
7660         case 0:
7661             gen_helper_mtc0_wired(cpu_env, arg);
7662             rn = "Wired";
7663             break;
7664         case 1:
7665             check_insn(ctx, ISA_MIPS32R2);
7666             gen_helper_mtc0_srsconf0(cpu_env, arg);
7667             rn = "SRSConf0";
7668             break;
7669         case 2:
7670             check_insn(ctx, ISA_MIPS32R2);
7671             gen_helper_mtc0_srsconf1(cpu_env, arg);
7672             rn = "SRSConf1";
7673             break;
7674         case 3:
7675             check_insn(ctx, ISA_MIPS32R2);
7676             gen_helper_mtc0_srsconf2(cpu_env, arg);
7677             rn = "SRSConf2";
7678             break;
7679         case 4:
7680             check_insn(ctx, ISA_MIPS32R2);
7681             gen_helper_mtc0_srsconf3(cpu_env, arg);
7682             rn = "SRSConf3";
7683             break;
7684         case 5:
7685             check_insn(ctx, ISA_MIPS32R2);
7686             gen_helper_mtc0_srsconf4(cpu_env, arg);
7687             rn = "SRSConf4";
7688             break;
7689         default:
7690             goto cp0_unimplemented;
7691         }
7692         break;
7693     case 7:
7694         switch (sel) {
7695         case 0:
7696             check_insn(ctx, ISA_MIPS32R2);
7697             gen_helper_mtc0_hwrena(cpu_env, arg);
7698             ctx->base.is_jmp = DISAS_STOP;
7699             rn = "HWREna";
7700             break;
7701         default:
7702             goto cp0_unimplemented;
7703         }
7704         break;
7705     case 8:
7706         switch (sel) {
7707         case 0:
7708             /* ignored */
7709             rn = "BadVAddr";
7710             break;
7711         case 1:
7712             /* ignored */
7713             rn = "BadInstr";
7714             break;
7715         case 2:
7716             /* ignored */
7717             rn = "BadInstrP";
7718             break;
7719         case 3:
7720             /* ignored */
7721             rn = "BadInstrX";
7722             break;
7723         default:
7724             goto cp0_unimplemented;
7725         }
7726         break;
7727     case 9:
7728         switch (sel) {
7729         case 0:
7730             gen_helper_mtc0_count(cpu_env, arg);
7731             rn = "Count";
7732             break;
7733         /* 6,7 are implementation dependent */
7734         default:
7735             goto cp0_unimplemented;
7736         }
7737         /* Stop translation as we may have switched the execution mode */
7738         ctx->base.is_jmp = DISAS_STOP;
7739         break;
7740     case 10:
7741         switch (sel) {
7742         case 0:
7743             gen_helper_mtc0_entryhi(cpu_env, arg);
7744             rn = "EntryHi";
7745             break;
7746         default:
7747             goto cp0_unimplemented;
7748         }
7749         break;
7750     case 11:
7751         switch (sel) {
7752         case 0:
7753             gen_helper_mtc0_compare(cpu_env, arg);
7754             rn = "Compare";
7755             break;
7756         /* 6,7 are implementation dependent */
7757         default:
7758             goto cp0_unimplemented;
7759         }
7760         /* Stop translation as we may have switched the execution mode */
7761         ctx->base.is_jmp = DISAS_STOP;
7762         break;
7763     case 12:
7764         switch (sel) {
7765         case 0:
7766             save_cpu_state(ctx, 1);
7767             gen_helper_mtc0_status(cpu_env, arg);
7768             /* DISAS_STOP isn't good enough here, hflags may have changed. */
7769             gen_save_pc(ctx->base.pc_next + 4);
7770             ctx->base.is_jmp = DISAS_EXIT;
7771             rn = "Status";
7772             break;
7773         case 1:
7774             check_insn(ctx, ISA_MIPS32R2);
7775             gen_helper_mtc0_intctl(cpu_env, arg);
7776             /* Stop translation as we may have switched the execution mode */
7777             ctx->base.is_jmp = DISAS_STOP;
7778             rn = "IntCtl";
7779             break;
7780         case 2:
7781             check_insn(ctx, ISA_MIPS32R2);
7782             gen_helper_mtc0_srsctl(cpu_env, arg);
7783             /* Stop translation as we may have switched the execution mode */
7784             ctx->base.is_jmp = DISAS_STOP;
7785             rn = "SRSCtl";
7786             break;
7787         case 3:
7788             check_insn(ctx, ISA_MIPS32R2);
7789             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
7790             /* Stop translation as we may have switched the execution mode */
7791             ctx->base.is_jmp = DISAS_STOP;
7792             rn = "SRSMap";
7793             break;
7794         default:
7795             goto cp0_unimplemented;
7796         }
7797         break;
7798     case 13:
7799         switch (sel) {
7800         case 0:
7801             save_cpu_state(ctx, 1);
7802             gen_helper_mtc0_cause(cpu_env, arg);
7803             /* Stop translation as we may have triggered an interrupt.
7804              * DISAS_STOP isn't sufficient, we need to ensure we break out of
7805              * translated code to check for pending interrupts.  */
7806             gen_save_pc(ctx->base.pc_next + 4);
7807             ctx->base.is_jmp = DISAS_EXIT;
7808             rn = "Cause";
7809             break;
7810         default:
7811             goto cp0_unimplemented;
7812         }
7813         break;
7814     case 14:
7815         switch (sel) {
7816         case 0:
7817             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
7818             rn = "EPC";
7819             break;
7820         default:
7821             goto cp0_unimplemented;
7822         }
7823         break;
7824     case 15:
7825         switch (sel) {
7826         case 0:
7827             /* ignored */
7828             rn = "PRid";
7829             break;
7830         case 1:
7831             check_insn(ctx, ISA_MIPS32R2);
7832             gen_helper_mtc0_ebase(cpu_env, arg);
7833             rn = "EBase";
7834             break;
7835         default:
7836             goto cp0_unimplemented;
7837         }
7838         break;
7839     case 16:
7840         switch (sel) {
7841         case 0:
7842             gen_helper_mtc0_config0(cpu_env, arg);
7843             rn = "Config";
7844             /* Stop translation as we may have switched the execution mode */
7845             ctx->base.is_jmp = DISAS_STOP;
7846             break;
7847         case 1:
7848             /* ignored, read only */
7849             rn = "Config1";
7850             break;
7851         case 2:
7852             gen_helper_mtc0_config2(cpu_env, arg);
7853             rn = "Config2";
7854             /* Stop translation as we may have switched the execution mode */
7855             ctx->base.is_jmp = DISAS_STOP;
7856             break;
7857         case 3:
7858             gen_helper_mtc0_config3(cpu_env, arg);
7859             rn = "Config3";
7860             /* Stop translation as we may have switched the execution mode */
7861             ctx->base.is_jmp = DISAS_STOP;
7862             break;
7863         case 4:
7864             /* currently ignored */
7865             rn = "Config4";
7866             break;
7867         case 5:
7868             gen_helper_mtc0_config5(cpu_env, arg);
7869             rn = "Config5";
7870             /* Stop translation as we may have switched the execution mode */
7871             ctx->base.is_jmp = DISAS_STOP;
7872             break;
7873         /* 6,7 are implementation dependent */
7874         default:
7875             rn = "Invalid config selector";
7876             goto cp0_unimplemented;
7877         }
7878         break;
7879     case 17:
7880         switch (sel) {
7881         case 0:
7882             gen_helper_mtc0_lladdr(cpu_env, arg);
7883             rn = "LLAddr";
7884             break;
7885         case 1:
7886             CP0_CHECK(ctx->mrp);
7887             gen_helper_mtc0_maar(cpu_env, arg);
7888             rn = "MAAR";
7889             break;
7890         case 2:
7891             CP0_CHECK(ctx->mrp);
7892             gen_helper_mtc0_maari(cpu_env, arg);
7893             rn = "MAARI";
7894             break;
7895         default:
7896             goto cp0_unimplemented;
7897         }
7898         break;
7899     case 18:
7900         switch (sel) {
7901         case 0:
7902         case 1:
7903         case 2:
7904         case 3:
7905         case 4:
7906         case 5:
7907         case 6:
7908         case 7:
7909             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7910             gen_helper_0e1i(mtc0_watchlo, arg, sel);
7911             rn = "WatchLo";
7912             break;
7913         default:
7914             goto cp0_unimplemented;
7915         }
7916         break;
7917     case 19:
7918         switch (sel) {
7919         case 0:
7920         case 1:
7921         case 2:
7922         case 3:
7923         case 4:
7924         case 5:
7925         case 6:
7926         case 7:
7927             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7928             gen_helper_0e1i(mtc0_watchhi, arg, sel);
7929             rn = "WatchHi";
7930             break;
7931         default:
7932             goto cp0_unimplemented;
7933         }
7934         break;
7935     case 20:
7936         switch (sel) {
7937         case 0:
7938             check_insn(ctx, ISA_MIPS3);
7939             gen_helper_mtc0_xcontext(cpu_env, arg);
7940             rn = "XContext";
7941             break;
7942         default:
7943             goto cp0_unimplemented;
7944         }
7945         break;
7946     case 21:
7947        /* Officially reserved, but sel 0 is used for R1x000 framemask */
7948         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
7949         switch (sel) {
7950         case 0:
7951             gen_helper_mtc0_framemask(cpu_env, arg);
7952             rn = "Framemask";
7953             break;
7954         default:
7955             goto cp0_unimplemented;
7956         }
7957         break;
7958     case 22:
7959         /* ignored */
7960         rn = "Diagnostic"; /* implementation dependent */
7961         break;
7962     case 23:
7963         switch (sel) {
7964         case 0:
7965             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
7966             /* DISAS_STOP isn't good enough here, hflags may have changed. */
7967             gen_save_pc(ctx->base.pc_next + 4);
7968             ctx->base.is_jmp = DISAS_EXIT;
7969             rn = "Debug";
7970             break;
7971         case 1:
7972 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
7973             /* Stop translation as we may have switched the execution mode */
7974             ctx->base.is_jmp = DISAS_STOP;
7975             rn = "TraceControl";
7976             goto cp0_unimplemented;
7977         case 2:
7978 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
7979             /* Stop translation as we may have switched the execution mode */
7980             ctx->base.is_jmp = DISAS_STOP;
7981             rn = "TraceControl2";
7982             goto cp0_unimplemented;
7983         case 3:
7984 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
7985             /* Stop translation as we may have switched the execution mode */
7986             ctx->base.is_jmp = DISAS_STOP;
7987             rn = "UserTraceData";
7988             goto cp0_unimplemented;
7989         case 4:
7990 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
7991             /* Stop translation as we may have switched the execution mode */
7992             ctx->base.is_jmp = DISAS_STOP;
7993             rn = "TraceBPC";
7994             goto cp0_unimplemented;
7995         default:
7996             goto cp0_unimplemented;
7997         }
7998         break;
7999     case 24:
8000         switch (sel) {
8001         case 0:
8002             /* EJTAG support */
8003             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
8004             rn = "DEPC";
8005             break;
8006         default:
8007             goto cp0_unimplemented;
8008         }
8009         break;
8010     case 25:
8011         switch (sel) {
8012         case 0:
8013             gen_helper_mtc0_performance0(cpu_env, arg);
8014             rn = "Performance0";
8015             break;
8016         case 1:
8017 //            gen_helper_mtc0_performance1(cpu_env, arg);
8018             rn = "Performance1";
8019             goto cp0_unimplemented;
8020         case 2:
8021 //            gen_helper_mtc0_performance2(cpu_env, arg);
8022             rn = "Performance2";
8023             goto cp0_unimplemented;
8024         case 3:
8025 //            gen_helper_mtc0_performance3(cpu_env, arg);
8026             rn = "Performance3";
8027             goto cp0_unimplemented;
8028         case 4:
8029 //            gen_helper_mtc0_performance4(cpu_env, arg);
8030             rn = "Performance4";
8031             goto cp0_unimplemented;
8032         case 5:
8033 //            gen_helper_mtc0_performance5(cpu_env, arg);
8034             rn = "Performance5";
8035             goto cp0_unimplemented;
8036         case 6:
8037 //            gen_helper_mtc0_performance6(cpu_env, arg);
8038             rn = "Performance6";
8039             goto cp0_unimplemented;
8040         case 7:
8041 //            gen_helper_mtc0_performance7(cpu_env, arg);
8042             rn = "Performance7";
8043             goto cp0_unimplemented;
8044         default:
8045             goto cp0_unimplemented;
8046         }
8047         break;
8048     case 26:
8049         switch (sel) {
8050         case 0:
8051             gen_helper_mtc0_errctl(cpu_env, arg);
8052             ctx->base.is_jmp = DISAS_STOP;
8053             rn = "ErrCtl";
8054             break;
8055         default:
8056             goto cp0_unimplemented;
8057         }
8058         break;
8059     case 27:
8060         switch (sel) {
8061         case 0:
8062         case 1:
8063         case 2:
8064         case 3:
8065             /* ignored */
8066             rn = "CacheErr";
8067             break;
8068         default:
8069             goto cp0_unimplemented;
8070         }
8071         break;
8072     case 28:
8073         switch (sel) {
8074         case 0:
8075         case 2:
8076         case 4:
8077         case 6:
8078             gen_helper_mtc0_taglo(cpu_env, arg);
8079             rn = "TagLo";
8080             break;
8081         case 1:
8082         case 3:
8083         case 5:
8084         case 7:
8085             gen_helper_mtc0_datalo(cpu_env, arg);
8086             rn = "DataLo";
8087             break;
8088         default:
8089             goto cp0_unimplemented;
8090         }
8091         break;
8092     case 29:
8093         switch (sel) {
8094         case 0:
8095         case 2:
8096         case 4:
8097         case 6:
8098             gen_helper_mtc0_taghi(cpu_env, arg);
8099             rn = "TagHi";
8100             break;
8101         case 1:
8102         case 3:
8103         case 5:
8104         case 7:
8105             gen_helper_mtc0_datahi(cpu_env, arg);
8106             rn = "DataHi";
8107             break;
8108         default:
8109             rn = "invalid sel";
8110             goto cp0_unimplemented;
8111         }
8112         break;
8113     case 30:
8114         switch (sel) {
8115         case 0:
8116             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
8117             rn = "ErrorEPC";
8118             break;
8119         default:
8120             goto cp0_unimplemented;
8121         }
8122         break;
8123     case 31:
8124         switch (sel) {
8125         case 0:
8126             /* EJTAG support */
8127             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
8128             rn = "DESAVE";
8129             break;
8130         case 2:
8131         case 3:
8132         case 4:
8133         case 5:
8134         case 6:
8135         case 7:
8136             CP0_CHECK(ctx->kscrexist & (1 << sel));
8137             tcg_gen_st_tl(arg, cpu_env,
8138                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
8139             rn = "KScratch";
8140             break;
8141         default:
8142             goto cp0_unimplemented;
8143         }
8144         break;
8145     default:
8146         goto cp0_unimplemented;
8147     }
8148     trace_mips_translate_c0("dmtc0", rn, reg, sel);
8149
8150     /* For simplicity assume that all writes can cause interrupts.  */
8151     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
8152         gen_io_end();
8153         /* DISAS_STOP isn't sufficient, we need to ensure we break out of
8154          * translated code to check for pending interrupts.  */
8155         gen_save_pc(ctx->base.pc_next + 4);
8156         ctx->base.is_jmp = DISAS_EXIT;
8157     }
8158     return;
8159
8160 cp0_unimplemented:
8161     qemu_log_mask(LOG_UNIMP, "dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
8162 }
8163 #endif /* TARGET_MIPS64 */
8164
8165 static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd,
8166                      int u, int sel, int h)
8167 {
8168     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
8169     TCGv t0 = tcg_temp_local_new();
8170
8171     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
8172         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
8173          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
8174         tcg_gen_movi_tl(t0, -1);
8175     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
8176              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
8177         tcg_gen_movi_tl(t0, -1);
8178     else if (u == 0) {
8179         switch (rt) {
8180         case 1:
8181             switch (sel) {
8182             case 1:
8183                 gen_helper_mftc0_vpecontrol(t0, cpu_env);
8184                 break;
8185             case 2:
8186                 gen_helper_mftc0_vpeconf0(t0, cpu_env);
8187                 break;
8188             default:
8189                 goto die;
8190                 break;
8191             }
8192             break;
8193         case 2:
8194             switch (sel) {
8195             case 1:
8196                 gen_helper_mftc0_tcstatus(t0, cpu_env);
8197                 break;
8198             case 2:
8199                 gen_helper_mftc0_tcbind(t0, cpu_env);
8200                 break;
8201             case 3:
8202                 gen_helper_mftc0_tcrestart(t0, cpu_env);
8203                 break;
8204             case 4:
8205                 gen_helper_mftc0_tchalt(t0, cpu_env);
8206                 break;
8207             case 5:
8208                 gen_helper_mftc0_tccontext(t0, cpu_env);
8209                 break;
8210             case 6:
8211                 gen_helper_mftc0_tcschedule(t0, cpu_env);
8212                 break;
8213             case 7:
8214                 gen_helper_mftc0_tcschefback(t0, cpu_env);
8215                 break;
8216             default:
8217                 gen_mfc0(ctx, t0, rt, sel);
8218                 break;
8219             }
8220             break;
8221         case 10:
8222             switch (sel) {
8223             case 0:
8224                 gen_helper_mftc0_entryhi(t0, cpu_env);
8225                 break;
8226             default:
8227                 gen_mfc0(ctx, t0, rt, sel);
8228                 break;
8229             }
8230         case 12:
8231             switch (sel) {
8232             case 0:
8233                 gen_helper_mftc0_status(t0, cpu_env);
8234                 break;
8235             default:
8236                 gen_mfc0(ctx, t0, rt, sel);
8237                 break;
8238             }
8239         case 13:
8240             switch (sel) {
8241             case 0:
8242                 gen_helper_mftc0_cause(t0, cpu_env);
8243                 break;
8244             default:
8245                 goto die;
8246                 break;
8247             }
8248             break;
8249         case 14:
8250             switch (sel) {
8251             case 0:
8252                 gen_helper_mftc0_epc(t0, cpu_env);
8253                 break;
8254             default:
8255                 goto die;
8256                 break;
8257             }
8258             break;
8259         case 15:
8260             switch (sel) {
8261             case 1:
8262                 gen_helper_mftc0_ebase(t0, cpu_env);
8263                 break;
8264             default:
8265                 goto die;
8266                 break;
8267             }
8268             break;
8269         case 16:
8270             switch (sel) {
8271             case 0:
8272             case 1:
8273             case 2:
8274             case 3:
8275             case 4:
8276             case 5:
8277             case 6:
8278             case 7:
8279                 gen_helper_mftc0_configx(t0, cpu_env, tcg_const_tl(sel));
8280                 break;
8281             default:
8282                 goto die;
8283                 break;
8284             }
8285             break;
8286         case 23:
8287             switch (sel) {
8288             case 0:
8289                 gen_helper_mftc0_debug(t0, cpu_env);
8290                 break;
8291             default:
8292                 gen_mfc0(ctx, t0, rt, sel);
8293                 break;
8294             }
8295             break;
8296         default:
8297             gen_mfc0(ctx, t0, rt, sel);
8298         }
8299     } else switch (sel) {
8300     /* GPR registers. */
8301     case 0:
8302         gen_helper_1e0i(mftgpr, t0, rt);
8303         break;
8304     /* Auxiliary CPU registers */
8305     case 1:
8306         switch (rt) {
8307         case 0:
8308             gen_helper_1e0i(mftlo, t0, 0);
8309             break;
8310         case 1:
8311             gen_helper_1e0i(mfthi, t0, 0);
8312             break;
8313         case 2:
8314             gen_helper_1e0i(mftacx, t0, 0);
8315             break;
8316         case 4:
8317             gen_helper_1e0i(mftlo, t0, 1);
8318             break;
8319         case 5:
8320             gen_helper_1e0i(mfthi, t0, 1);
8321             break;
8322         case 6:
8323             gen_helper_1e0i(mftacx, t0, 1);
8324             break;
8325         case 8:
8326             gen_helper_1e0i(mftlo, t0, 2);
8327             break;
8328         case 9:
8329             gen_helper_1e0i(mfthi, t0, 2);
8330             break;
8331         case 10:
8332             gen_helper_1e0i(mftacx, t0, 2);
8333             break;
8334         case 12:
8335             gen_helper_1e0i(mftlo, t0, 3);
8336             break;
8337         case 13:
8338             gen_helper_1e0i(mfthi, t0, 3);
8339             break;
8340         case 14:
8341             gen_helper_1e0i(mftacx, t0, 3);
8342             break;
8343         case 16:
8344             gen_helper_mftdsp(t0, cpu_env);
8345             break;
8346         default:
8347             goto die;
8348         }
8349         break;
8350     /* Floating point (COP1). */
8351     case 2:
8352         /* XXX: For now we support only a single FPU context. */
8353         if (h == 0) {
8354             TCGv_i32 fp0 = tcg_temp_new_i32();
8355
8356             gen_load_fpr32(ctx, fp0, rt);
8357             tcg_gen_ext_i32_tl(t0, fp0);
8358             tcg_temp_free_i32(fp0);
8359         } else {
8360             TCGv_i32 fp0 = tcg_temp_new_i32();
8361
8362             gen_load_fpr32h(ctx, fp0, rt);
8363             tcg_gen_ext_i32_tl(t0, fp0);
8364             tcg_temp_free_i32(fp0);
8365         }
8366         break;
8367     case 3:
8368         /* XXX: For now we support only a single FPU context. */
8369         gen_helper_1e0i(cfc1, t0, rt);
8370         break;
8371     /* COP2: Not implemented. */
8372     case 4:
8373     case 5:
8374         /* fall through */
8375     default:
8376         goto die;
8377     }
8378     trace_mips_translate_tr("mftr", rt, u, sel, h);
8379     gen_store_gpr(t0, rd);
8380     tcg_temp_free(t0);
8381     return;
8382
8383 die:
8384     tcg_temp_free(t0);
8385     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
8386     generate_exception_end(ctx, EXCP_RI);
8387 }
8388
8389 static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt,
8390                      int u, int sel, int h)
8391 {
8392     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
8393     TCGv t0 = tcg_temp_local_new();
8394
8395     gen_load_gpr(t0, rt);
8396     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
8397         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
8398          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
8399         /* NOP */ ;
8400     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
8401              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
8402         /* NOP */ ;
8403     else if (u == 0) {
8404         switch (rd) {
8405         case 1:
8406             switch (sel) {
8407             case 1:
8408                 gen_helper_mttc0_vpecontrol(cpu_env, t0);
8409                 break;
8410             case 2:
8411                 gen_helper_mttc0_vpeconf0(cpu_env, t0);
8412                 break;
8413             default:
8414                 goto die;
8415                 break;
8416             }
8417             break;
8418         case 2:
8419             switch (sel) {
8420             case 1:
8421                 gen_helper_mttc0_tcstatus(cpu_env, t0);
8422                 break;
8423             case 2:
8424                 gen_helper_mttc0_tcbind(cpu_env, t0);
8425                 break;
8426             case 3:
8427                 gen_helper_mttc0_tcrestart(cpu_env, t0);
8428                 break;
8429             case 4:
8430                 gen_helper_mttc0_tchalt(cpu_env, t0);
8431                 break;
8432             case 5:
8433                 gen_helper_mttc0_tccontext(cpu_env, t0);
8434                 break;
8435             case 6:
8436                 gen_helper_mttc0_tcschedule(cpu_env, t0);
8437                 break;
8438             case 7:
8439                 gen_helper_mttc0_tcschefback(cpu_env, t0);
8440                 break;
8441             default:
8442                 gen_mtc0(ctx, t0, rd, sel);
8443                 break;
8444             }
8445             break;
8446         case 10:
8447             switch (sel) {
8448             case 0:
8449                 gen_helper_mttc0_entryhi(cpu_env, t0);
8450                 break;
8451             default:
8452                 gen_mtc0(ctx, t0, rd, sel);
8453                 break;
8454             }
8455         case 12:
8456             switch (sel) {
8457             case 0:
8458                 gen_helper_mttc0_status(cpu_env, t0);
8459                 break;
8460             default:
8461                 gen_mtc0(ctx, t0, rd, sel);
8462                 break;
8463             }
8464         case 13:
8465             switch (sel) {
8466             case 0:
8467                 gen_helper_mttc0_cause(cpu_env, t0);
8468                 break;
8469             default:
8470                 goto die;
8471                 break;
8472             }
8473             break;
8474         case 15:
8475             switch (sel) {
8476             case 1:
8477                 gen_helper_mttc0_ebase(cpu_env, t0);
8478                 break;
8479             default:
8480                 goto die;
8481                 break;
8482             }
8483             break;
8484         case 23:
8485             switch (sel) {
8486             case 0:
8487                 gen_helper_mttc0_debug(cpu_env, t0);
8488                 break;
8489             default:
8490                 gen_mtc0(ctx, t0, rd, sel);
8491                 break;
8492             }
8493             break;
8494         default:
8495             gen_mtc0(ctx, t0, rd, sel);
8496         }
8497     } else switch (sel) {
8498     /* GPR registers. */
8499     case 0:
8500         gen_helper_0e1i(mttgpr, t0, rd);
8501         break;
8502     /* Auxiliary CPU registers */
8503     case 1:
8504         switch (rd) {
8505         case 0:
8506             gen_helper_0e1i(mttlo, t0, 0);
8507             break;
8508         case 1:
8509             gen_helper_0e1i(mtthi, t0, 0);
8510             break;
8511         case 2:
8512             gen_helper_0e1i(mttacx, t0, 0);
8513             break;
8514         case 4:
8515             gen_helper_0e1i(mttlo, t0, 1);
8516             break;
8517         case 5:
8518             gen_helper_0e1i(mtthi, t0, 1);
8519             break;
8520         case 6:
8521             gen_helper_0e1i(mttacx, t0, 1);
8522             break;
8523         case 8:
8524             gen_helper_0e1i(mttlo, t0, 2);
8525             break;
8526         case 9:
8527             gen_helper_0e1i(mtthi, t0, 2);
8528             break;
8529         case 10:
8530             gen_helper_0e1i(mttacx, t0, 2);
8531             break;
8532         case 12:
8533             gen_helper_0e1i(mttlo, t0, 3);
8534             break;
8535         case 13:
8536             gen_helper_0e1i(mtthi, t0, 3);
8537             break;
8538         case 14:
8539             gen_helper_0e1i(mttacx, t0, 3);
8540             break;
8541         case 16:
8542             gen_helper_mttdsp(cpu_env, t0);
8543             break;
8544         default:
8545             goto die;
8546         }
8547         break;
8548     /* Floating point (COP1). */
8549     case 2:
8550         /* XXX: For now we support only a single FPU context. */
8551         if (h == 0) {
8552             TCGv_i32 fp0 = tcg_temp_new_i32();
8553
8554             tcg_gen_trunc_tl_i32(fp0, t0);
8555             gen_store_fpr32(ctx, fp0, rd);
8556             tcg_temp_free_i32(fp0);
8557         } else {
8558             TCGv_i32 fp0 = tcg_temp_new_i32();
8559
8560             tcg_gen_trunc_tl_i32(fp0, t0);
8561             gen_store_fpr32h(ctx, fp0, rd);
8562             tcg_temp_free_i32(fp0);
8563         }
8564         break;
8565     case 3:
8566         /* XXX: For now we support only a single FPU context. */
8567         {
8568             TCGv_i32 fs_tmp = tcg_const_i32(rd);
8569
8570             gen_helper_0e2i(ctc1, t0, fs_tmp, rt);
8571             tcg_temp_free_i32(fs_tmp);
8572         }
8573         /* Stop translation as we may have changed hflags */
8574         ctx->base.is_jmp = DISAS_STOP;
8575         break;
8576     /* COP2: Not implemented. */
8577     case 4:
8578     case 5:
8579         /* fall through */
8580     default:
8581         goto die;
8582     }
8583     trace_mips_translate_tr("mttr", rd, u, sel, h);
8584     tcg_temp_free(t0);
8585     return;
8586
8587 die:
8588     tcg_temp_free(t0);
8589     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
8590     generate_exception_end(ctx, EXCP_RI);
8591 }
8592
8593 static void gen_cp0 (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, int rt, int rd)
8594 {
8595     const char *opn = "ldst";
8596
8597     check_cp0_enabled(ctx);
8598     switch (opc) {
8599     case OPC_MFC0:
8600         if (rt == 0) {
8601             /* Treat as NOP. */
8602             return;
8603         }
8604         gen_mfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
8605         opn = "mfc0";
8606         break;
8607     case OPC_MTC0:
8608         {
8609             TCGv t0 = tcg_temp_new();
8610
8611             gen_load_gpr(t0, rt);
8612             gen_mtc0(ctx, t0, rd, ctx->opcode & 0x7);
8613             tcg_temp_free(t0);
8614         }
8615         opn = "mtc0";
8616         break;
8617 #if defined(TARGET_MIPS64)
8618     case OPC_DMFC0:
8619         check_insn(ctx, ISA_MIPS3);
8620         if (rt == 0) {
8621             /* Treat as NOP. */
8622             return;
8623         }
8624         gen_dmfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
8625         opn = "dmfc0";
8626         break;
8627     case OPC_DMTC0:
8628         check_insn(ctx, ISA_MIPS3);
8629         {
8630             TCGv t0 = tcg_temp_new();
8631
8632             gen_load_gpr(t0, rt);
8633             gen_dmtc0(ctx, t0, rd, ctx->opcode & 0x7);
8634             tcg_temp_free(t0);
8635         }
8636         opn = "dmtc0";
8637         break;
8638 #endif
8639     case OPC_MFHC0:
8640         check_mvh(ctx);
8641         if (rt == 0) {
8642             /* Treat as NOP. */
8643             return;
8644         }
8645         gen_mfhc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
8646         opn = "mfhc0";
8647         break;
8648     case OPC_MTHC0:
8649         check_mvh(ctx);
8650         {
8651             TCGv t0 = tcg_temp_new();
8652             gen_load_gpr(t0, rt);
8653             gen_mthc0(ctx, t0, rd, ctx->opcode & 0x7);
8654             tcg_temp_free(t0);
8655         }
8656         opn = "mthc0";
8657         break;
8658     case OPC_MFTR:
8659         check_cp0_enabled(ctx);
8660         if (rd == 0) {
8661             /* Treat as NOP. */
8662             return;
8663         }
8664         gen_mftr(env, ctx, rt, rd, (ctx->opcode >> 5) & 1,
8665                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
8666         opn = "mftr";
8667         break;
8668     case OPC_MTTR:
8669         check_cp0_enabled(ctx);
8670         gen_mttr(env, ctx, rd, rt, (ctx->opcode >> 5) & 1,
8671                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
8672         opn = "mttr";
8673         break;
8674     case OPC_TLBWI:
8675         opn = "tlbwi";
8676         if (!env->tlb->helper_tlbwi)
8677             goto die;
8678         gen_helper_tlbwi(cpu_env);
8679         break;
8680     case OPC_TLBINV:
8681         opn = "tlbinv";
8682         if (ctx->ie >= 2) {
8683             if (!env->tlb->helper_tlbinv) {
8684                 goto die;
8685             }
8686             gen_helper_tlbinv(cpu_env);
8687         } /* treat as nop if TLBINV not supported */
8688         break;
8689     case OPC_TLBINVF:
8690         opn = "tlbinvf";
8691         if (ctx->ie >= 2) {
8692             if (!env->tlb->helper_tlbinvf) {
8693                 goto die;
8694             }
8695             gen_helper_tlbinvf(cpu_env);
8696         } /* treat as nop if TLBINV not supported */
8697         break;
8698     case OPC_TLBWR:
8699         opn = "tlbwr";
8700         if (!env->tlb->helper_tlbwr)
8701             goto die;
8702         gen_helper_tlbwr(cpu_env);
8703         break;
8704     case OPC_TLBP:
8705         opn = "tlbp";
8706         if (!env->tlb->helper_tlbp)
8707             goto die;
8708         gen_helper_tlbp(cpu_env);
8709         break;
8710     case OPC_TLBR:
8711         opn = "tlbr";
8712         if (!env->tlb->helper_tlbr)
8713             goto die;
8714         gen_helper_tlbr(cpu_env);
8715         break;
8716     case OPC_ERET: /* OPC_ERETNC */
8717         if ((ctx->insn_flags & ISA_MIPS32R6) &&
8718             (ctx->hflags & MIPS_HFLAG_BMASK)) {
8719             goto die;
8720         } else {
8721             int bit_shift = (ctx->hflags & MIPS_HFLAG_M16) ? 16 : 6;
8722             if (ctx->opcode & (1 << bit_shift)) {
8723                 /* OPC_ERETNC */
8724                 opn = "eretnc";
8725                 check_insn(ctx, ISA_MIPS32R5);
8726                 gen_helper_eretnc(cpu_env);
8727             } else {
8728                 /* OPC_ERET */
8729                 opn = "eret";
8730                 check_insn(ctx, ISA_MIPS2);
8731                 gen_helper_eret(cpu_env);
8732             }
8733             ctx->base.is_jmp = DISAS_EXIT;
8734         }
8735         break;
8736     case OPC_DERET:
8737         opn = "deret";
8738         check_insn(ctx, ISA_MIPS32);
8739         if ((ctx->insn_flags & ISA_MIPS32R6) &&
8740             (ctx->hflags & MIPS_HFLAG_BMASK)) {
8741             goto die;
8742         }
8743         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
8744             MIPS_INVAL(opn);
8745             generate_exception_end(ctx, EXCP_RI);
8746         } else {
8747             gen_helper_deret(cpu_env);
8748             ctx->base.is_jmp = DISAS_EXIT;
8749         }
8750         break;
8751     case OPC_WAIT:
8752         opn = "wait";
8753         check_insn(ctx, ISA_MIPS3 | ISA_MIPS32);
8754         if ((ctx->insn_flags & ISA_MIPS32R6) &&
8755             (ctx->hflags & MIPS_HFLAG_BMASK)) {
8756             goto die;
8757         }
8758         /* If we get an exception, we want to restart at next instruction */
8759         ctx->base.pc_next += 4;
8760         save_cpu_state(ctx, 1);
8761         ctx->base.pc_next -= 4;
8762         gen_helper_wait(cpu_env);
8763         ctx->base.is_jmp = DISAS_NORETURN;
8764         break;
8765     default:
8766  die:
8767         MIPS_INVAL(opn);
8768         generate_exception_end(ctx, EXCP_RI);
8769         return;
8770     }
8771     (void)opn; /* avoid a compiler warning */
8772 }
8773 #endif /* !CONFIG_USER_ONLY */
8774
8775 /* CP1 Branches (before delay slot) */
8776 static void gen_compute_branch1(DisasContext *ctx, uint32_t op,
8777                                 int32_t cc, int32_t offset)
8778 {
8779     target_ulong btarget;
8780     TCGv_i32 t0 = tcg_temp_new_i32();
8781
8782     if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->hflags & MIPS_HFLAG_BMASK)) {
8783         generate_exception_end(ctx, EXCP_RI);
8784         goto out;
8785     }
8786
8787     if (cc != 0)
8788         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
8789
8790     btarget = ctx->base.pc_next + 4 + offset;
8791
8792     switch (op) {
8793     case OPC_BC1F:
8794         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8795         tcg_gen_not_i32(t0, t0);
8796         tcg_gen_andi_i32(t0, t0, 1);
8797         tcg_gen_extu_i32_tl(bcond, t0);
8798         goto not_likely;
8799     case OPC_BC1FL:
8800         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8801         tcg_gen_not_i32(t0, t0);
8802         tcg_gen_andi_i32(t0, t0, 1);
8803         tcg_gen_extu_i32_tl(bcond, t0);
8804         goto likely;
8805     case OPC_BC1T:
8806         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8807         tcg_gen_andi_i32(t0, t0, 1);
8808         tcg_gen_extu_i32_tl(bcond, t0);
8809         goto not_likely;
8810     case OPC_BC1TL:
8811         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8812         tcg_gen_andi_i32(t0, t0, 1);
8813         tcg_gen_extu_i32_tl(bcond, t0);
8814     likely:
8815         ctx->hflags |= MIPS_HFLAG_BL;
8816         break;
8817     case OPC_BC1FANY2:
8818         {
8819             TCGv_i32 t1 = tcg_temp_new_i32();
8820             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8821             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
8822             tcg_gen_nand_i32(t0, t0, t1);
8823             tcg_temp_free_i32(t1);
8824             tcg_gen_andi_i32(t0, t0, 1);
8825             tcg_gen_extu_i32_tl(bcond, t0);
8826         }
8827         goto not_likely;
8828     case OPC_BC1TANY2:
8829         {
8830             TCGv_i32 t1 = tcg_temp_new_i32();
8831             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8832             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
8833             tcg_gen_or_i32(t0, t0, t1);
8834             tcg_temp_free_i32(t1);
8835             tcg_gen_andi_i32(t0, t0, 1);
8836             tcg_gen_extu_i32_tl(bcond, t0);
8837         }
8838         goto not_likely;
8839     case OPC_BC1FANY4:
8840         {
8841             TCGv_i32 t1 = tcg_temp_new_i32();
8842             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8843             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
8844             tcg_gen_and_i32(t0, t0, t1);
8845             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
8846             tcg_gen_and_i32(t0, t0, t1);
8847             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
8848             tcg_gen_nand_i32(t0, t0, t1);
8849             tcg_temp_free_i32(t1);
8850             tcg_gen_andi_i32(t0, t0, 1);
8851             tcg_gen_extu_i32_tl(bcond, t0);
8852         }
8853         goto not_likely;
8854     case OPC_BC1TANY4:
8855         {
8856             TCGv_i32 t1 = tcg_temp_new_i32();
8857             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8858             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
8859             tcg_gen_or_i32(t0, t0, t1);
8860             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
8861             tcg_gen_or_i32(t0, t0, t1);
8862             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
8863             tcg_gen_or_i32(t0, t0, t1);
8864             tcg_temp_free_i32(t1);
8865             tcg_gen_andi_i32(t0, t0, 1);
8866             tcg_gen_extu_i32_tl(bcond, t0);
8867         }
8868     not_likely:
8869         ctx->hflags |= MIPS_HFLAG_BC;
8870         break;
8871     default:
8872         MIPS_INVAL("cp1 cond branch");
8873         generate_exception_end(ctx, EXCP_RI);
8874         goto out;
8875     }
8876     ctx->btarget = btarget;
8877     ctx->hflags |= MIPS_HFLAG_BDS32;
8878  out:
8879     tcg_temp_free_i32(t0);
8880 }
8881
8882 /* R6 CP1 Branches */
8883 static void gen_compute_branch1_r6(DisasContext *ctx, uint32_t op,
8884                                    int32_t ft, int32_t offset,
8885                                    int delayslot_size)
8886 {
8887     target_ulong btarget;
8888     TCGv_i64 t0 = tcg_temp_new_i64();
8889
8890     if (ctx->hflags & MIPS_HFLAG_BMASK) {
8891 #ifdef MIPS_DEBUG_DISAS
8892         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
8893                   "\n", ctx->base.pc_next);
8894 #endif
8895         generate_exception_end(ctx, EXCP_RI);
8896         goto out;
8897     }
8898
8899     gen_load_fpr64(ctx, t0, ft);
8900     tcg_gen_andi_i64(t0, t0, 1);
8901
8902     btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
8903
8904     switch (op) {
8905     case OPC_BC1EQZ:
8906         tcg_gen_xori_i64(t0, t0, 1);
8907         ctx->hflags |= MIPS_HFLAG_BC;
8908         break;
8909     case OPC_BC1NEZ:
8910         /* t0 already set */
8911         ctx->hflags |= MIPS_HFLAG_BC;
8912         break;
8913     default:
8914         MIPS_INVAL("cp1 cond branch");
8915         generate_exception_end(ctx, EXCP_RI);
8916         goto out;
8917     }
8918
8919     tcg_gen_trunc_i64_tl(bcond, t0);
8920
8921     ctx->btarget = btarget;
8922
8923     switch (delayslot_size) {
8924     case 2:
8925         ctx->hflags |= MIPS_HFLAG_BDS16;
8926         break;
8927     case 4:
8928         ctx->hflags |= MIPS_HFLAG_BDS32;
8929         break;
8930     }
8931
8932 out:
8933     tcg_temp_free_i64(t0);
8934 }
8935
8936 /* Coprocessor 1 (FPU) */
8937
8938 #define FOP(func, fmt) (((fmt) << 21) | (func))
8939
8940 enum fopcode {
8941     OPC_ADD_S = FOP(0, FMT_S),
8942     OPC_SUB_S = FOP(1, FMT_S),
8943     OPC_MUL_S = FOP(2, FMT_S),
8944     OPC_DIV_S = FOP(3, FMT_S),
8945     OPC_SQRT_S = FOP(4, FMT_S),
8946     OPC_ABS_S = FOP(5, FMT_S),
8947     OPC_MOV_S = FOP(6, FMT_S),
8948     OPC_NEG_S = FOP(7, FMT_S),
8949     OPC_ROUND_L_S = FOP(8, FMT_S),
8950     OPC_TRUNC_L_S = FOP(9, FMT_S),
8951     OPC_CEIL_L_S = FOP(10, FMT_S),
8952     OPC_FLOOR_L_S = FOP(11, FMT_S),
8953     OPC_ROUND_W_S = FOP(12, FMT_S),
8954     OPC_TRUNC_W_S = FOP(13, FMT_S),
8955     OPC_CEIL_W_S = FOP(14, FMT_S),
8956     OPC_FLOOR_W_S = FOP(15, FMT_S),
8957     OPC_SEL_S = FOP(16, FMT_S),
8958     OPC_MOVCF_S = FOP(17, FMT_S),
8959     OPC_MOVZ_S = FOP(18, FMT_S),
8960     OPC_MOVN_S = FOP(19, FMT_S),
8961     OPC_SELEQZ_S = FOP(20, FMT_S),
8962     OPC_RECIP_S = FOP(21, FMT_S),
8963     OPC_RSQRT_S = FOP(22, FMT_S),
8964     OPC_SELNEZ_S = FOP(23, FMT_S),
8965     OPC_MADDF_S = FOP(24, FMT_S),
8966     OPC_MSUBF_S = FOP(25, FMT_S),
8967     OPC_RINT_S = FOP(26, FMT_S),
8968     OPC_CLASS_S = FOP(27, FMT_S),
8969     OPC_MIN_S = FOP(28, FMT_S),
8970     OPC_RECIP2_S = FOP(28, FMT_S),
8971     OPC_MINA_S = FOP(29, FMT_S),
8972     OPC_RECIP1_S = FOP(29, FMT_S),
8973     OPC_MAX_S = FOP(30, FMT_S),
8974     OPC_RSQRT1_S = FOP(30, FMT_S),
8975     OPC_MAXA_S = FOP(31, FMT_S),
8976     OPC_RSQRT2_S = FOP(31, FMT_S),
8977     OPC_CVT_D_S = FOP(33, FMT_S),
8978     OPC_CVT_W_S = FOP(36, FMT_S),
8979     OPC_CVT_L_S = FOP(37, FMT_S),
8980     OPC_CVT_PS_S = FOP(38, FMT_S),
8981     OPC_CMP_F_S = FOP (48, FMT_S),
8982     OPC_CMP_UN_S = FOP (49, FMT_S),
8983     OPC_CMP_EQ_S = FOP (50, FMT_S),
8984     OPC_CMP_UEQ_S = FOP (51, FMT_S),
8985     OPC_CMP_OLT_S = FOP (52, FMT_S),
8986     OPC_CMP_ULT_S = FOP (53, FMT_S),
8987     OPC_CMP_OLE_S = FOP (54, FMT_S),
8988     OPC_CMP_ULE_S = FOP (55, FMT_S),
8989     OPC_CMP_SF_S = FOP (56, FMT_S),
8990     OPC_CMP_NGLE_S = FOP (57, FMT_S),
8991     OPC_CMP_SEQ_S = FOP (58, FMT_S),
8992     OPC_CMP_NGL_S = FOP (59, FMT_S),
8993     OPC_CMP_LT_S = FOP (60, FMT_S),
8994     OPC_CMP_NGE_S = FOP (61, FMT_S),
8995     OPC_CMP_LE_S = FOP (62, FMT_S),
8996     OPC_CMP_NGT_S = FOP (63, FMT_S),
8997
8998     OPC_ADD_D = FOP(0, FMT_D),
8999     OPC_SUB_D = FOP(1, FMT_D),
9000     OPC_MUL_D = FOP(2, FMT_D),
9001     OPC_DIV_D = FOP(3, FMT_D),
9002     OPC_SQRT_D = FOP(4, FMT_D),
9003     OPC_ABS_D = FOP(5, FMT_D),
9004     OPC_MOV_D = FOP(6, FMT_D),
9005     OPC_NEG_D = FOP(7, FMT_D),
9006     OPC_ROUND_L_D = FOP(8, FMT_D),
9007     OPC_TRUNC_L_D = FOP(9, FMT_D),
9008     OPC_CEIL_L_D = FOP(10, FMT_D),
9009     OPC_FLOOR_L_D = FOP(11, FMT_D),
9010     OPC_ROUND_W_D = FOP(12, FMT_D),
9011     OPC_TRUNC_W_D = FOP(13, FMT_D),
9012     OPC_CEIL_W_D = FOP(14, FMT_D),
9013     OPC_FLOOR_W_D = FOP(15, FMT_D),
9014     OPC_SEL_D = FOP(16, FMT_D),
9015     OPC_MOVCF_D = FOP(17, FMT_D),
9016     OPC_MOVZ_D = FOP(18, FMT_D),
9017     OPC_MOVN_D = FOP(19, FMT_D),
9018     OPC_SELEQZ_D = FOP(20, FMT_D),
9019     OPC_RECIP_D = FOP(21, FMT_D),
9020     OPC_RSQRT_D = FOP(22, FMT_D),
9021     OPC_SELNEZ_D = FOP(23, FMT_D),
9022     OPC_MADDF_D = FOP(24, FMT_D),
9023     OPC_MSUBF_D = FOP(25, FMT_D),
9024     OPC_RINT_D = FOP(26, FMT_D),
9025     OPC_CLASS_D = FOP(27, FMT_D),
9026     OPC_MIN_D = FOP(28, FMT_D),
9027     OPC_RECIP2_D = FOP(28, FMT_D),
9028     OPC_MINA_D = FOP(29, FMT_D),
9029     OPC_RECIP1_D = FOP(29, FMT_D),
9030     OPC_MAX_D = FOP(30, FMT_D),
9031     OPC_RSQRT1_D = FOP(30, FMT_D),
9032     OPC_MAXA_D = FOP(31, FMT_D),
9033     OPC_RSQRT2_D = FOP(31, FMT_D),
9034     OPC_CVT_S_D = FOP(32, FMT_D),
9035     OPC_CVT_W_D = FOP(36, FMT_D),
9036     OPC_CVT_L_D = FOP(37, FMT_D),
9037     OPC_CMP_F_D = FOP (48, FMT_D),
9038     OPC_CMP_UN_D = FOP (49, FMT_D),
9039     OPC_CMP_EQ_D = FOP (50, FMT_D),
9040     OPC_CMP_UEQ_D = FOP (51, FMT_D),
9041     OPC_CMP_OLT_D = FOP (52, FMT_D),
9042     OPC_CMP_ULT_D = FOP (53, FMT_D),
9043     OPC_CMP_OLE_D = FOP (54, FMT_D),
9044     OPC_CMP_ULE_D = FOP (55, FMT_D),
9045     OPC_CMP_SF_D = FOP (56, FMT_D),
9046     OPC_CMP_NGLE_D = FOP (57, FMT_D),
9047     OPC_CMP_SEQ_D = FOP (58, FMT_D),
9048     OPC_CMP_NGL_D = FOP (59, FMT_D),
9049     OPC_CMP_LT_D = FOP (60, FMT_D),
9050     OPC_CMP_NGE_D = FOP (61, FMT_D),
9051     OPC_CMP_LE_D = FOP (62, FMT_D),
9052     OPC_CMP_NGT_D = FOP (63, FMT_D),
9053
9054     OPC_CVT_S_W = FOP(32, FMT_W),
9055     OPC_CVT_D_W = FOP(33, FMT_W),
9056     OPC_CVT_S_L = FOP(32, FMT_L),
9057     OPC_CVT_D_L = FOP(33, FMT_L),
9058     OPC_CVT_PS_PW = FOP(38, FMT_W),
9059
9060     OPC_ADD_PS = FOP(0, FMT_PS),
9061     OPC_SUB_PS = FOP(1, FMT_PS),
9062     OPC_MUL_PS = FOP(2, FMT_PS),
9063     OPC_DIV_PS = FOP(3, FMT_PS),
9064     OPC_ABS_PS = FOP(5, FMT_PS),
9065     OPC_MOV_PS = FOP(6, FMT_PS),
9066     OPC_NEG_PS = FOP(7, FMT_PS),
9067     OPC_MOVCF_PS = FOP(17, FMT_PS),
9068     OPC_MOVZ_PS = FOP(18, FMT_PS),
9069     OPC_MOVN_PS = FOP(19, FMT_PS),
9070     OPC_ADDR_PS = FOP(24, FMT_PS),
9071     OPC_MULR_PS = FOP(26, FMT_PS),
9072     OPC_RECIP2_PS = FOP(28, FMT_PS),
9073     OPC_RECIP1_PS = FOP(29, FMT_PS),
9074     OPC_RSQRT1_PS = FOP(30, FMT_PS),
9075     OPC_RSQRT2_PS = FOP(31, FMT_PS),
9076
9077     OPC_CVT_S_PU = FOP(32, FMT_PS),
9078     OPC_CVT_PW_PS = FOP(36, FMT_PS),
9079     OPC_CVT_S_PL = FOP(40, FMT_PS),
9080     OPC_PLL_PS = FOP(44, FMT_PS),
9081     OPC_PLU_PS = FOP(45, FMT_PS),
9082     OPC_PUL_PS = FOP(46, FMT_PS),
9083     OPC_PUU_PS = FOP(47, FMT_PS),
9084     OPC_CMP_F_PS = FOP (48, FMT_PS),
9085     OPC_CMP_UN_PS = FOP (49, FMT_PS),
9086     OPC_CMP_EQ_PS = FOP (50, FMT_PS),
9087     OPC_CMP_UEQ_PS = FOP (51, FMT_PS),
9088     OPC_CMP_OLT_PS = FOP (52, FMT_PS),
9089     OPC_CMP_ULT_PS = FOP (53, FMT_PS),
9090     OPC_CMP_OLE_PS = FOP (54, FMT_PS),
9091     OPC_CMP_ULE_PS = FOP (55, FMT_PS),
9092     OPC_CMP_SF_PS = FOP (56, FMT_PS),
9093     OPC_CMP_NGLE_PS = FOP (57, FMT_PS),
9094     OPC_CMP_SEQ_PS = FOP (58, FMT_PS),
9095     OPC_CMP_NGL_PS = FOP (59, FMT_PS),
9096     OPC_CMP_LT_PS = FOP (60, FMT_PS),
9097     OPC_CMP_NGE_PS = FOP (61, FMT_PS),
9098     OPC_CMP_LE_PS = FOP (62, FMT_PS),
9099     OPC_CMP_NGT_PS = FOP (63, FMT_PS),
9100 };
9101
9102 enum r6_f_cmp_op {
9103     R6_OPC_CMP_AF_S   = FOP(0, FMT_W),
9104     R6_OPC_CMP_UN_S   = FOP(1, FMT_W),
9105     R6_OPC_CMP_EQ_S   = FOP(2, FMT_W),
9106     R6_OPC_CMP_UEQ_S  = FOP(3, FMT_W),
9107     R6_OPC_CMP_LT_S   = FOP(4, FMT_W),
9108     R6_OPC_CMP_ULT_S  = FOP(5, FMT_W),
9109     R6_OPC_CMP_LE_S   = FOP(6, FMT_W),
9110     R6_OPC_CMP_ULE_S  = FOP(7, FMT_W),
9111     R6_OPC_CMP_SAF_S  = FOP(8, FMT_W),
9112     R6_OPC_CMP_SUN_S  = FOP(9, FMT_W),
9113     R6_OPC_CMP_SEQ_S  = FOP(10, FMT_W),
9114     R6_OPC_CMP_SEUQ_S = FOP(11, FMT_W),
9115     R6_OPC_CMP_SLT_S  = FOP(12, FMT_W),
9116     R6_OPC_CMP_SULT_S = FOP(13, FMT_W),
9117     R6_OPC_CMP_SLE_S  = FOP(14, FMT_W),
9118     R6_OPC_CMP_SULE_S = FOP(15, FMT_W),
9119     R6_OPC_CMP_OR_S   = FOP(17, FMT_W),
9120     R6_OPC_CMP_UNE_S  = FOP(18, FMT_W),
9121     R6_OPC_CMP_NE_S   = FOP(19, FMT_W),
9122     R6_OPC_CMP_SOR_S  = FOP(25, FMT_W),
9123     R6_OPC_CMP_SUNE_S = FOP(26, FMT_W),
9124     R6_OPC_CMP_SNE_S  = FOP(27, FMT_W),
9125
9126     R6_OPC_CMP_AF_D   = FOP(0, FMT_L),
9127     R6_OPC_CMP_UN_D   = FOP(1, FMT_L),
9128     R6_OPC_CMP_EQ_D   = FOP(2, FMT_L),
9129     R6_OPC_CMP_UEQ_D  = FOP(3, FMT_L),
9130     R6_OPC_CMP_LT_D   = FOP(4, FMT_L),
9131     R6_OPC_CMP_ULT_D  = FOP(5, FMT_L),
9132     R6_OPC_CMP_LE_D   = FOP(6, FMT_L),
9133     R6_OPC_CMP_ULE_D  = FOP(7, FMT_L),
9134     R6_OPC_CMP_SAF_D  = FOP(8, FMT_L),
9135     R6_OPC_CMP_SUN_D  = FOP(9, FMT_L),
9136     R6_OPC_CMP_SEQ_D  = FOP(10, FMT_L),
9137     R6_OPC_CMP_SEUQ_D = FOP(11, FMT_L),
9138     R6_OPC_CMP_SLT_D  = FOP(12, FMT_L),
9139     R6_OPC_CMP_SULT_D = FOP(13, FMT_L),
9140     R6_OPC_CMP_SLE_D  = FOP(14, FMT_L),
9141     R6_OPC_CMP_SULE_D = FOP(15, FMT_L),
9142     R6_OPC_CMP_OR_D   = FOP(17, FMT_L),
9143     R6_OPC_CMP_UNE_D  = FOP(18, FMT_L),
9144     R6_OPC_CMP_NE_D   = FOP(19, FMT_L),
9145     R6_OPC_CMP_SOR_D  = FOP(25, FMT_L),
9146     R6_OPC_CMP_SUNE_D = FOP(26, FMT_L),
9147     R6_OPC_CMP_SNE_D  = FOP(27, FMT_L),
9148 };
9149 static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
9150 {
9151     TCGv t0 = tcg_temp_new();
9152
9153     switch (opc) {
9154     case OPC_MFC1:
9155         {
9156             TCGv_i32 fp0 = tcg_temp_new_i32();
9157
9158             gen_load_fpr32(ctx, fp0, fs);
9159             tcg_gen_ext_i32_tl(t0, fp0);
9160             tcg_temp_free_i32(fp0);
9161         }
9162         gen_store_gpr(t0, rt);
9163         break;
9164     case OPC_MTC1:
9165         gen_load_gpr(t0, rt);
9166         {
9167             TCGv_i32 fp0 = tcg_temp_new_i32();
9168
9169             tcg_gen_trunc_tl_i32(fp0, t0);
9170             gen_store_fpr32(ctx, fp0, fs);
9171             tcg_temp_free_i32(fp0);
9172         }
9173         break;
9174     case OPC_CFC1:
9175         gen_helper_1e0i(cfc1, t0, fs);
9176         gen_store_gpr(t0, rt);
9177         break;
9178     case OPC_CTC1:
9179         gen_load_gpr(t0, rt);
9180         save_cpu_state(ctx, 0);
9181         {
9182             TCGv_i32 fs_tmp = tcg_const_i32(fs);
9183
9184             gen_helper_0e2i(ctc1, t0, fs_tmp, rt);
9185             tcg_temp_free_i32(fs_tmp);
9186         }
9187         /* Stop translation as we may have changed hflags */
9188         ctx->base.is_jmp = DISAS_STOP;
9189         break;
9190 #if defined(TARGET_MIPS64)
9191     case OPC_DMFC1:
9192         gen_load_fpr64(ctx, t0, fs);
9193         gen_store_gpr(t0, rt);
9194         break;
9195     case OPC_DMTC1:
9196         gen_load_gpr(t0, rt);
9197         gen_store_fpr64(ctx, t0, fs);
9198         break;
9199 #endif
9200     case OPC_MFHC1:
9201         {
9202             TCGv_i32 fp0 = tcg_temp_new_i32();
9203
9204             gen_load_fpr32h(ctx, fp0, fs);
9205             tcg_gen_ext_i32_tl(t0, fp0);
9206             tcg_temp_free_i32(fp0);
9207         }
9208         gen_store_gpr(t0, rt);
9209         break;
9210     case OPC_MTHC1:
9211         gen_load_gpr(t0, rt);
9212         {
9213             TCGv_i32 fp0 = tcg_temp_new_i32();
9214
9215             tcg_gen_trunc_tl_i32(fp0, t0);
9216             gen_store_fpr32h(ctx, fp0, fs);
9217             tcg_temp_free_i32(fp0);
9218         }
9219         break;
9220     default:
9221         MIPS_INVAL("cp1 move");
9222         generate_exception_end(ctx, EXCP_RI);
9223         goto out;
9224     }
9225
9226  out:
9227     tcg_temp_free(t0);
9228 }
9229
9230 static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
9231 {
9232     TCGLabel *l1;
9233     TCGCond cond;
9234     TCGv_i32 t0;
9235
9236     if (rd == 0) {
9237         /* Treat as NOP. */
9238         return;
9239     }
9240
9241     if (tf)
9242         cond = TCG_COND_EQ;
9243     else
9244         cond = TCG_COND_NE;
9245
9246     l1 = gen_new_label();
9247     t0 = tcg_temp_new_i32();
9248     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
9249     tcg_gen_brcondi_i32(cond, t0, 0, l1);
9250     tcg_temp_free_i32(t0);
9251     if (rs == 0) {
9252         tcg_gen_movi_tl(cpu_gpr[rd], 0);
9253     } else {
9254         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
9255     }
9256     gen_set_label(l1);
9257 }
9258
9259 static inline void gen_movcf_s(DisasContext *ctx, int fs, int fd, int cc,
9260                                int tf)
9261 {
9262     int cond;
9263     TCGv_i32 t0 = tcg_temp_new_i32();
9264     TCGLabel *l1 = gen_new_label();
9265
9266     if (tf)
9267         cond = TCG_COND_EQ;
9268     else
9269         cond = TCG_COND_NE;
9270
9271     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
9272     tcg_gen_brcondi_i32(cond, t0, 0, l1);
9273     gen_load_fpr32(ctx, t0, fs);
9274     gen_store_fpr32(ctx, t0, fd);
9275     gen_set_label(l1);
9276     tcg_temp_free_i32(t0);
9277 }
9278
9279 static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf)
9280 {
9281     int cond;
9282     TCGv_i32 t0 = tcg_temp_new_i32();
9283     TCGv_i64 fp0;
9284     TCGLabel *l1 = gen_new_label();
9285
9286     if (tf)
9287         cond = TCG_COND_EQ;
9288     else
9289         cond = TCG_COND_NE;
9290
9291     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
9292     tcg_gen_brcondi_i32(cond, t0, 0, l1);
9293     tcg_temp_free_i32(t0);
9294     fp0 = tcg_temp_new_i64();
9295     gen_load_fpr64(ctx, fp0, fs);
9296     gen_store_fpr64(ctx, fp0, fd);
9297     tcg_temp_free_i64(fp0);
9298     gen_set_label(l1);
9299 }
9300
9301 static inline void gen_movcf_ps(DisasContext *ctx, int fs, int fd,
9302                                 int cc, int tf)
9303 {
9304     int cond;
9305     TCGv_i32 t0 = tcg_temp_new_i32();
9306     TCGLabel *l1 = gen_new_label();
9307     TCGLabel *l2 = gen_new_label();
9308
9309     if (tf)
9310         cond = TCG_COND_EQ;
9311     else
9312         cond = TCG_COND_NE;
9313
9314     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
9315     tcg_gen_brcondi_i32(cond, t0, 0, l1);
9316     gen_load_fpr32(ctx, t0, fs);
9317     gen_store_fpr32(ctx, t0, fd);
9318     gen_set_label(l1);
9319
9320     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc+1));
9321     tcg_gen_brcondi_i32(cond, t0, 0, l2);
9322     gen_load_fpr32h(ctx, t0, fs);
9323     gen_store_fpr32h(ctx, t0, fd);
9324     tcg_temp_free_i32(t0);
9325     gen_set_label(l2);
9326 }
9327
9328 static void gen_sel_s(DisasContext *ctx, enum fopcode op1, int fd, int ft,
9329                       int fs)
9330 {
9331     TCGv_i32 t1 = tcg_const_i32(0);
9332     TCGv_i32 fp0 = tcg_temp_new_i32();
9333     TCGv_i32 fp1 = tcg_temp_new_i32();
9334     TCGv_i32 fp2 = tcg_temp_new_i32();
9335     gen_load_fpr32(ctx, fp0, fd);
9336     gen_load_fpr32(ctx, fp1, ft);
9337     gen_load_fpr32(ctx, fp2, fs);
9338
9339     switch (op1) {
9340     case OPC_SEL_S:
9341         tcg_gen_andi_i32(fp0, fp0, 1);
9342         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
9343         break;
9344     case OPC_SELEQZ_S:
9345         tcg_gen_andi_i32(fp1, fp1, 1);
9346         tcg_gen_movcond_i32(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
9347         break;
9348     case OPC_SELNEZ_S:
9349         tcg_gen_andi_i32(fp1, fp1, 1);
9350         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
9351         break;
9352     default:
9353         MIPS_INVAL("gen_sel_s");
9354         generate_exception_end(ctx, EXCP_RI);
9355         break;
9356     }
9357
9358     gen_store_fpr32(ctx, fp0, fd);
9359     tcg_temp_free_i32(fp2);
9360     tcg_temp_free_i32(fp1);
9361     tcg_temp_free_i32(fp0);
9362     tcg_temp_free_i32(t1);
9363 }
9364
9365 static void gen_sel_d(DisasContext *ctx, enum fopcode op1, int fd, int ft,
9366                       int fs)
9367 {
9368     TCGv_i64 t1 = tcg_const_i64(0);
9369     TCGv_i64 fp0 = tcg_temp_new_i64();
9370     TCGv_i64 fp1 = tcg_temp_new_i64();
9371     TCGv_i64 fp2 = tcg_temp_new_i64();
9372     gen_load_fpr64(ctx, fp0, fd);
9373     gen_load_fpr64(ctx, fp1, ft);
9374     gen_load_fpr64(ctx, fp2, fs);
9375
9376     switch (op1) {
9377     case OPC_SEL_D:
9378         tcg_gen_andi_i64(fp0, fp0, 1);
9379         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
9380         break;
9381     case OPC_SELEQZ_D:
9382         tcg_gen_andi_i64(fp1, fp1, 1);
9383         tcg_gen_movcond_i64(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
9384         break;
9385     case OPC_SELNEZ_D:
9386         tcg_gen_andi_i64(fp1, fp1, 1);
9387         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
9388         break;
9389     default:
9390         MIPS_INVAL("gen_sel_d");
9391         generate_exception_end(ctx, EXCP_RI);
9392         break;
9393     }
9394
9395     gen_store_fpr64(ctx, fp0, fd);
9396     tcg_temp_free_i64(fp2);
9397     tcg_temp_free_i64(fp1);
9398     tcg_temp_free_i64(fp0);
9399     tcg_temp_free_i64(t1);
9400 }
9401
9402 static void gen_farith (DisasContext *ctx, enum fopcode op1,
9403                         int ft, int fs, int fd, int cc)
9404 {
9405     uint32_t func = ctx->opcode & 0x3f;
9406     switch (op1) {
9407     case OPC_ADD_S:
9408         {
9409             TCGv_i32 fp0 = tcg_temp_new_i32();
9410             TCGv_i32 fp1 = tcg_temp_new_i32();
9411
9412             gen_load_fpr32(ctx, fp0, fs);
9413             gen_load_fpr32(ctx, fp1, ft);
9414             gen_helper_float_add_s(fp0, cpu_env, fp0, fp1);
9415             tcg_temp_free_i32(fp1);
9416             gen_store_fpr32(ctx, fp0, fd);
9417             tcg_temp_free_i32(fp0);
9418         }
9419         break;
9420     case OPC_SUB_S:
9421         {
9422             TCGv_i32 fp0 = tcg_temp_new_i32();
9423             TCGv_i32 fp1 = tcg_temp_new_i32();
9424
9425             gen_load_fpr32(ctx, fp0, fs);
9426             gen_load_fpr32(ctx, fp1, ft);
9427             gen_helper_float_sub_s(fp0, cpu_env, fp0, fp1);
9428             tcg_temp_free_i32(fp1);
9429             gen_store_fpr32(ctx, fp0, fd);
9430             tcg_temp_free_i32(fp0);
9431         }
9432         break;
9433     case OPC_MUL_S:
9434         {
9435             TCGv_i32 fp0 = tcg_temp_new_i32();
9436             TCGv_i32 fp1 = tcg_temp_new_i32();
9437
9438             gen_load_fpr32(ctx, fp0, fs);
9439             gen_load_fpr32(ctx, fp1, ft);
9440             gen_helper_float_mul_s(fp0, cpu_env, fp0, fp1);
9441             tcg_temp_free_i32(fp1);
9442             gen_store_fpr32(ctx, fp0, fd);
9443             tcg_temp_free_i32(fp0);
9444         }
9445         break;
9446     case OPC_DIV_S:
9447         {
9448             TCGv_i32 fp0 = tcg_temp_new_i32();
9449             TCGv_i32 fp1 = tcg_temp_new_i32();
9450
9451             gen_load_fpr32(ctx, fp0, fs);
9452             gen_load_fpr32(ctx, fp1, ft);
9453             gen_helper_float_div_s(fp0, cpu_env, fp0, fp1);
9454             tcg_temp_free_i32(fp1);
9455             gen_store_fpr32(ctx, fp0, fd);
9456             tcg_temp_free_i32(fp0);
9457         }
9458         break;
9459     case OPC_SQRT_S:
9460         {
9461             TCGv_i32 fp0 = tcg_temp_new_i32();
9462
9463             gen_load_fpr32(ctx, fp0, fs);
9464             gen_helper_float_sqrt_s(fp0, cpu_env, fp0);
9465             gen_store_fpr32(ctx, fp0, fd);
9466             tcg_temp_free_i32(fp0);
9467         }
9468         break;
9469     case OPC_ABS_S:
9470         {
9471             TCGv_i32 fp0 = tcg_temp_new_i32();
9472
9473             gen_load_fpr32(ctx, fp0, fs);
9474             if (ctx->abs2008) {
9475                 tcg_gen_andi_i32(fp0, fp0, 0x7fffffffUL);
9476             } else {
9477                 gen_helper_float_abs_s(fp0, fp0);
9478             }
9479             gen_store_fpr32(ctx, fp0, fd);
9480             tcg_temp_free_i32(fp0);
9481         }
9482         break;
9483     case OPC_MOV_S:
9484         {
9485             TCGv_i32 fp0 = tcg_temp_new_i32();
9486
9487             gen_load_fpr32(ctx, fp0, fs);
9488             gen_store_fpr32(ctx, fp0, fd);
9489             tcg_temp_free_i32(fp0);
9490         }
9491         break;
9492     case OPC_NEG_S:
9493         {
9494             TCGv_i32 fp0 = tcg_temp_new_i32();
9495
9496             gen_load_fpr32(ctx, fp0, fs);
9497             if (ctx->abs2008) {
9498                 tcg_gen_xori_i32(fp0, fp0, 1UL << 31);
9499             } else {
9500                 gen_helper_float_chs_s(fp0, fp0);
9501             }
9502             gen_store_fpr32(ctx, fp0, fd);
9503             tcg_temp_free_i32(fp0);
9504         }
9505         break;
9506     case OPC_ROUND_L_S:
9507         check_cp1_64bitmode(ctx);
9508         {
9509             TCGv_i32 fp32 = tcg_temp_new_i32();
9510             TCGv_i64 fp64 = tcg_temp_new_i64();
9511
9512             gen_load_fpr32(ctx, fp32, fs);
9513             if (ctx->nan2008) {
9514                 gen_helper_float_round_2008_l_s(fp64, cpu_env, fp32);
9515             } else {
9516                 gen_helper_float_round_l_s(fp64, cpu_env, fp32);
9517             }
9518             tcg_temp_free_i32(fp32);
9519             gen_store_fpr64(ctx, fp64, fd);
9520             tcg_temp_free_i64(fp64);
9521         }
9522         break;
9523     case OPC_TRUNC_L_S:
9524         check_cp1_64bitmode(ctx);
9525         {
9526             TCGv_i32 fp32 = tcg_temp_new_i32();
9527             TCGv_i64 fp64 = tcg_temp_new_i64();
9528
9529             gen_load_fpr32(ctx, fp32, fs);
9530             if (ctx->nan2008) {
9531                 gen_helper_float_trunc_2008_l_s(fp64, cpu_env, fp32);
9532             } else {
9533                 gen_helper_float_trunc_l_s(fp64, cpu_env, fp32);
9534             }
9535             tcg_temp_free_i32(fp32);
9536             gen_store_fpr64(ctx, fp64, fd);
9537             tcg_temp_free_i64(fp64);
9538         }
9539         break;
9540     case OPC_CEIL_L_S:
9541         check_cp1_64bitmode(ctx);
9542         {
9543             TCGv_i32 fp32 = tcg_temp_new_i32();
9544             TCGv_i64 fp64 = tcg_temp_new_i64();
9545
9546             gen_load_fpr32(ctx, fp32, fs);
9547             if (ctx->nan2008) {
9548                 gen_helper_float_ceil_2008_l_s(fp64, cpu_env, fp32);
9549             } else {
9550                 gen_helper_float_ceil_l_s(fp64, cpu_env, fp32);
9551             }
9552             tcg_temp_free_i32(fp32);
9553             gen_store_fpr64(ctx, fp64, fd);
9554             tcg_temp_free_i64(fp64);
9555         }
9556         break;
9557     case OPC_FLOOR_L_S:
9558         check_cp1_64bitmode(ctx);
9559         {
9560             TCGv_i32 fp32 = tcg_temp_new_i32();
9561             TCGv_i64 fp64 = tcg_temp_new_i64();
9562
9563             gen_load_fpr32(ctx, fp32, fs);
9564             if (ctx->nan2008) {
9565                 gen_helper_float_floor_2008_l_s(fp64, cpu_env, fp32);
9566             } else {
9567                 gen_helper_float_floor_l_s(fp64, cpu_env, fp32);
9568             }
9569             tcg_temp_free_i32(fp32);
9570             gen_store_fpr64(ctx, fp64, fd);
9571             tcg_temp_free_i64(fp64);
9572         }
9573         break;
9574     case OPC_ROUND_W_S:
9575         {
9576             TCGv_i32 fp0 = tcg_temp_new_i32();
9577
9578             gen_load_fpr32(ctx, fp0, fs);
9579             if (ctx->nan2008) {
9580                 gen_helper_float_round_2008_w_s(fp0, cpu_env, fp0);
9581             } else {
9582                 gen_helper_float_round_w_s(fp0, cpu_env, fp0);
9583             }
9584             gen_store_fpr32(ctx, fp0, fd);
9585             tcg_temp_free_i32(fp0);
9586         }
9587         break;
9588     case OPC_TRUNC_W_S:
9589         {
9590             TCGv_i32 fp0 = tcg_temp_new_i32();
9591
9592             gen_load_fpr32(ctx, fp0, fs);
9593             if (ctx->nan2008) {
9594                 gen_helper_float_trunc_2008_w_s(fp0, cpu_env, fp0);
9595             } else {
9596                 gen_helper_float_trunc_w_s(fp0, cpu_env, fp0);
9597             }
9598             gen_store_fpr32(ctx, fp0, fd);
9599             tcg_temp_free_i32(fp0);
9600         }
9601         break;
9602     case OPC_CEIL_W_S:
9603         {
9604             TCGv_i32 fp0 = tcg_temp_new_i32();
9605
9606             gen_load_fpr32(ctx, fp0, fs);
9607             if (ctx->nan2008) {
9608                 gen_helper_float_ceil_2008_w_s(fp0, cpu_env, fp0);
9609             } else {
9610                 gen_helper_float_ceil_w_s(fp0, cpu_env, fp0);
9611             }
9612             gen_store_fpr32(ctx, fp0, fd);
9613             tcg_temp_free_i32(fp0);
9614         }
9615         break;
9616     case OPC_FLOOR_W_S:
9617         {
9618             TCGv_i32 fp0 = tcg_temp_new_i32();
9619
9620             gen_load_fpr32(ctx, fp0, fs);
9621             if (ctx->nan2008) {
9622                 gen_helper_float_floor_2008_w_s(fp0, cpu_env, fp0);
9623             } else {
9624                 gen_helper_float_floor_w_s(fp0, cpu_env, fp0);
9625             }
9626             gen_store_fpr32(ctx, fp0, fd);
9627             tcg_temp_free_i32(fp0);
9628         }
9629         break;
9630     case OPC_SEL_S:
9631         check_insn(ctx, ISA_MIPS32R6);
9632         gen_sel_s(ctx, op1, fd, ft, fs);
9633         break;
9634     case OPC_SELEQZ_S:
9635         check_insn(ctx, ISA_MIPS32R6);
9636         gen_sel_s(ctx, op1, fd, ft, fs);
9637         break;
9638     case OPC_SELNEZ_S:
9639         check_insn(ctx, ISA_MIPS32R6);
9640         gen_sel_s(ctx, op1, fd, ft, fs);
9641         break;
9642     case OPC_MOVCF_S:
9643         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9644         gen_movcf_s(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
9645         break;
9646     case OPC_MOVZ_S:
9647         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9648         {
9649             TCGLabel *l1 = gen_new_label();
9650             TCGv_i32 fp0;
9651
9652             if (ft != 0) {
9653                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
9654             }
9655             fp0 = tcg_temp_new_i32();
9656             gen_load_fpr32(ctx, fp0, fs);
9657             gen_store_fpr32(ctx, fp0, fd);
9658             tcg_temp_free_i32(fp0);
9659             gen_set_label(l1);
9660         }
9661         break;
9662     case OPC_MOVN_S:
9663         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9664         {
9665             TCGLabel *l1 = gen_new_label();
9666             TCGv_i32 fp0;
9667
9668             if (ft != 0) {
9669                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
9670                 fp0 = tcg_temp_new_i32();
9671                 gen_load_fpr32(ctx, fp0, fs);
9672                 gen_store_fpr32(ctx, fp0, fd);
9673                 tcg_temp_free_i32(fp0);
9674                 gen_set_label(l1);
9675             }
9676         }
9677         break;
9678     case OPC_RECIP_S:
9679         {
9680             TCGv_i32 fp0 = tcg_temp_new_i32();
9681
9682             gen_load_fpr32(ctx, fp0, fs);
9683             gen_helper_float_recip_s(fp0, cpu_env, fp0);
9684             gen_store_fpr32(ctx, fp0, fd);
9685             tcg_temp_free_i32(fp0);
9686         }
9687         break;
9688     case OPC_RSQRT_S:
9689         {
9690             TCGv_i32 fp0 = tcg_temp_new_i32();
9691
9692             gen_load_fpr32(ctx, fp0, fs);
9693             gen_helper_float_rsqrt_s(fp0, cpu_env, fp0);
9694             gen_store_fpr32(ctx, fp0, fd);
9695             tcg_temp_free_i32(fp0);
9696         }
9697         break;
9698     case OPC_MADDF_S:
9699         check_insn(ctx, ISA_MIPS32R6);
9700         {
9701             TCGv_i32 fp0 = tcg_temp_new_i32();
9702             TCGv_i32 fp1 = tcg_temp_new_i32();
9703             TCGv_i32 fp2 = tcg_temp_new_i32();
9704             gen_load_fpr32(ctx, fp0, fs);
9705             gen_load_fpr32(ctx, fp1, ft);
9706             gen_load_fpr32(ctx, fp2, fd);
9707             gen_helper_float_maddf_s(fp2, cpu_env, fp0, fp1, fp2);
9708             gen_store_fpr32(ctx, fp2, fd);
9709             tcg_temp_free_i32(fp2);
9710             tcg_temp_free_i32(fp1);
9711             tcg_temp_free_i32(fp0);
9712         }
9713         break;
9714     case OPC_MSUBF_S:
9715         check_insn(ctx, ISA_MIPS32R6);
9716         {
9717             TCGv_i32 fp0 = tcg_temp_new_i32();
9718             TCGv_i32 fp1 = tcg_temp_new_i32();
9719             TCGv_i32 fp2 = tcg_temp_new_i32();
9720             gen_load_fpr32(ctx, fp0, fs);
9721             gen_load_fpr32(ctx, fp1, ft);
9722             gen_load_fpr32(ctx, fp2, fd);
9723             gen_helper_float_msubf_s(fp2, cpu_env, fp0, fp1, fp2);
9724             gen_store_fpr32(ctx, fp2, fd);
9725             tcg_temp_free_i32(fp2);
9726             tcg_temp_free_i32(fp1);
9727             tcg_temp_free_i32(fp0);
9728         }
9729         break;
9730     case OPC_RINT_S:
9731         check_insn(ctx, ISA_MIPS32R6);
9732         {
9733             TCGv_i32 fp0 = tcg_temp_new_i32();
9734             gen_load_fpr32(ctx, fp0, fs);
9735             gen_helper_float_rint_s(fp0, cpu_env, fp0);
9736             gen_store_fpr32(ctx, fp0, fd);
9737             tcg_temp_free_i32(fp0);
9738         }
9739         break;
9740     case OPC_CLASS_S:
9741         check_insn(ctx, ISA_MIPS32R6);
9742         {
9743             TCGv_i32 fp0 = tcg_temp_new_i32();
9744             gen_load_fpr32(ctx, fp0, fs);
9745             gen_helper_float_class_s(fp0, cpu_env, fp0);
9746             gen_store_fpr32(ctx, fp0, fd);
9747             tcg_temp_free_i32(fp0);
9748         }
9749         break;
9750     case OPC_MIN_S: /* OPC_RECIP2_S */
9751         if (ctx->insn_flags & ISA_MIPS32R6) {
9752             /* OPC_MIN_S */
9753             TCGv_i32 fp0 = tcg_temp_new_i32();
9754             TCGv_i32 fp1 = tcg_temp_new_i32();
9755             TCGv_i32 fp2 = tcg_temp_new_i32();
9756             gen_load_fpr32(ctx, fp0, fs);
9757             gen_load_fpr32(ctx, fp1, ft);
9758             gen_helper_float_min_s(fp2, cpu_env, fp0, fp1);
9759             gen_store_fpr32(ctx, fp2, fd);
9760             tcg_temp_free_i32(fp2);
9761             tcg_temp_free_i32(fp1);
9762             tcg_temp_free_i32(fp0);
9763         } else {
9764             /* OPC_RECIP2_S */
9765             check_cp1_64bitmode(ctx);
9766             {
9767                 TCGv_i32 fp0 = tcg_temp_new_i32();
9768                 TCGv_i32 fp1 = tcg_temp_new_i32();
9769
9770                 gen_load_fpr32(ctx, fp0, fs);
9771                 gen_load_fpr32(ctx, fp1, ft);
9772                 gen_helper_float_recip2_s(fp0, cpu_env, fp0, fp1);
9773                 tcg_temp_free_i32(fp1);
9774                 gen_store_fpr32(ctx, fp0, fd);
9775                 tcg_temp_free_i32(fp0);
9776             }
9777         }
9778         break;
9779     case OPC_MINA_S: /* OPC_RECIP1_S */
9780         if (ctx->insn_flags & ISA_MIPS32R6) {
9781             /* OPC_MINA_S */
9782             TCGv_i32 fp0 = tcg_temp_new_i32();
9783             TCGv_i32 fp1 = tcg_temp_new_i32();
9784             TCGv_i32 fp2 = tcg_temp_new_i32();
9785             gen_load_fpr32(ctx, fp0, fs);
9786             gen_load_fpr32(ctx, fp1, ft);
9787             gen_helper_float_mina_s(fp2, cpu_env, fp0, fp1);
9788             gen_store_fpr32(ctx, fp2, fd);
9789             tcg_temp_free_i32(fp2);
9790             tcg_temp_free_i32(fp1);
9791             tcg_temp_free_i32(fp0);
9792         } else {
9793             /* OPC_RECIP1_S */
9794             check_cp1_64bitmode(ctx);
9795             {
9796                 TCGv_i32 fp0 = tcg_temp_new_i32();
9797
9798                 gen_load_fpr32(ctx, fp0, fs);
9799                 gen_helper_float_recip1_s(fp0, cpu_env, fp0);
9800                 gen_store_fpr32(ctx, fp0, fd);
9801                 tcg_temp_free_i32(fp0);
9802             }
9803         }
9804         break;
9805     case OPC_MAX_S: /* OPC_RSQRT1_S */
9806         if (ctx->insn_flags & ISA_MIPS32R6) {
9807             /* OPC_MAX_S */
9808             TCGv_i32 fp0 = tcg_temp_new_i32();
9809             TCGv_i32 fp1 = tcg_temp_new_i32();
9810             gen_load_fpr32(ctx, fp0, fs);
9811             gen_load_fpr32(ctx, fp1, ft);
9812             gen_helper_float_max_s(fp1, cpu_env, fp0, fp1);
9813             gen_store_fpr32(ctx, fp1, fd);
9814             tcg_temp_free_i32(fp1);
9815             tcg_temp_free_i32(fp0);
9816         } else {
9817             /* OPC_RSQRT1_S */
9818             check_cp1_64bitmode(ctx);
9819             {
9820                 TCGv_i32 fp0 = tcg_temp_new_i32();
9821
9822                 gen_load_fpr32(ctx, fp0, fs);
9823                 gen_helper_float_rsqrt1_s(fp0, cpu_env, fp0);
9824                 gen_store_fpr32(ctx, fp0, fd);
9825                 tcg_temp_free_i32(fp0);
9826             }
9827         }
9828         break;
9829     case OPC_MAXA_S: /* OPC_RSQRT2_S */
9830         if (ctx->insn_flags & ISA_MIPS32R6) {
9831             /* OPC_MAXA_S */
9832             TCGv_i32 fp0 = tcg_temp_new_i32();
9833             TCGv_i32 fp1 = tcg_temp_new_i32();
9834             gen_load_fpr32(ctx, fp0, fs);
9835             gen_load_fpr32(ctx, fp1, ft);
9836             gen_helper_float_maxa_s(fp1, cpu_env, fp0, fp1);
9837             gen_store_fpr32(ctx, fp1, fd);
9838             tcg_temp_free_i32(fp1);
9839             tcg_temp_free_i32(fp0);
9840         } else {
9841             /* OPC_RSQRT2_S */
9842             check_cp1_64bitmode(ctx);
9843             {
9844                 TCGv_i32 fp0 = tcg_temp_new_i32();
9845                 TCGv_i32 fp1 = tcg_temp_new_i32();
9846
9847                 gen_load_fpr32(ctx, fp0, fs);
9848                 gen_load_fpr32(ctx, fp1, ft);
9849                 gen_helper_float_rsqrt2_s(fp0, cpu_env, fp0, fp1);
9850                 tcg_temp_free_i32(fp1);
9851                 gen_store_fpr32(ctx, fp0, fd);
9852                 tcg_temp_free_i32(fp0);
9853             }
9854         }
9855         break;
9856     case OPC_CVT_D_S:
9857         check_cp1_registers(ctx, fd);
9858         {
9859             TCGv_i32 fp32 = tcg_temp_new_i32();
9860             TCGv_i64 fp64 = tcg_temp_new_i64();
9861
9862             gen_load_fpr32(ctx, fp32, fs);
9863             gen_helper_float_cvtd_s(fp64, cpu_env, fp32);
9864             tcg_temp_free_i32(fp32);
9865             gen_store_fpr64(ctx, fp64, fd);
9866             tcg_temp_free_i64(fp64);
9867         }
9868         break;
9869     case OPC_CVT_W_S:
9870         {
9871             TCGv_i32 fp0 = tcg_temp_new_i32();
9872
9873             gen_load_fpr32(ctx, fp0, fs);
9874             if (ctx->nan2008) {
9875                 gen_helper_float_cvt_2008_w_s(fp0, cpu_env, fp0);
9876             } else {
9877                 gen_helper_float_cvt_w_s(fp0, cpu_env, fp0);
9878             }
9879             gen_store_fpr32(ctx, fp0, fd);
9880             tcg_temp_free_i32(fp0);
9881         }
9882         break;
9883     case OPC_CVT_L_S:
9884         check_cp1_64bitmode(ctx);
9885         {
9886             TCGv_i32 fp32 = tcg_temp_new_i32();
9887             TCGv_i64 fp64 = tcg_temp_new_i64();
9888
9889             gen_load_fpr32(ctx, fp32, fs);
9890             if (ctx->nan2008) {
9891                 gen_helper_float_cvt_2008_l_s(fp64, cpu_env, fp32);
9892             } else {
9893                 gen_helper_float_cvt_l_s(fp64, cpu_env, fp32);
9894             }
9895             tcg_temp_free_i32(fp32);
9896             gen_store_fpr64(ctx, fp64, fd);
9897             tcg_temp_free_i64(fp64);
9898         }
9899         break;
9900     case OPC_CVT_PS_S:
9901         check_ps(ctx);
9902         {
9903             TCGv_i64 fp64 = tcg_temp_new_i64();
9904             TCGv_i32 fp32_0 = tcg_temp_new_i32();
9905             TCGv_i32 fp32_1 = tcg_temp_new_i32();
9906
9907             gen_load_fpr32(ctx, fp32_0, fs);
9908             gen_load_fpr32(ctx, fp32_1, ft);
9909             tcg_gen_concat_i32_i64(fp64, fp32_1, fp32_0);
9910             tcg_temp_free_i32(fp32_1);
9911             tcg_temp_free_i32(fp32_0);
9912             gen_store_fpr64(ctx, fp64, fd);
9913             tcg_temp_free_i64(fp64);
9914         }
9915         break;
9916     case OPC_CMP_F_S:
9917     case OPC_CMP_UN_S:
9918     case OPC_CMP_EQ_S:
9919     case OPC_CMP_UEQ_S:
9920     case OPC_CMP_OLT_S:
9921     case OPC_CMP_ULT_S:
9922     case OPC_CMP_OLE_S:
9923     case OPC_CMP_ULE_S:
9924     case OPC_CMP_SF_S:
9925     case OPC_CMP_NGLE_S:
9926     case OPC_CMP_SEQ_S:
9927     case OPC_CMP_NGL_S:
9928     case OPC_CMP_LT_S:
9929     case OPC_CMP_NGE_S:
9930     case OPC_CMP_LE_S:
9931     case OPC_CMP_NGT_S:
9932         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9933         if (ctx->opcode & (1 << 6)) {
9934             gen_cmpabs_s(ctx, func-48, ft, fs, cc);
9935         } else {
9936             gen_cmp_s(ctx, func-48, ft, fs, cc);
9937         }
9938         break;
9939     case OPC_ADD_D:
9940         check_cp1_registers(ctx, fs | ft | fd);
9941         {
9942             TCGv_i64 fp0 = tcg_temp_new_i64();
9943             TCGv_i64 fp1 = tcg_temp_new_i64();
9944
9945             gen_load_fpr64(ctx, fp0, fs);
9946             gen_load_fpr64(ctx, fp1, ft);
9947             gen_helper_float_add_d(fp0, cpu_env, fp0, fp1);
9948             tcg_temp_free_i64(fp1);
9949             gen_store_fpr64(ctx, fp0, fd);
9950             tcg_temp_free_i64(fp0);
9951         }
9952         break;
9953     case OPC_SUB_D:
9954         check_cp1_registers(ctx, fs | ft | fd);
9955         {
9956             TCGv_i64 fp0 = tcg_temp_new_i64();
9957             TCGv_i64 fp1 = tcg_temp_new_i64();
9958
9959             gen_load_fpr64(ctx, fp0, fs);
9960             gen_load_fpr64(ctx, fp1, ft);
9961             gen_helper_float_sub_d(fp0, cpu_env, fp0, fp1);
9962             tcg_temp_free_i64(fp1);
9963             gen_store_fpr64(ctx, fp0, fd);
9964             tcg_temp_free_i64(fp0);
9965         }
9966         break;
9967     case OPC_MUL_D:
9968         check_cp1_registers(ctx, fs | ft | fd);
9969         {
9970             TCGv_i64 fp0 = tcg_temp_new_i64();
9971             TCGv_i64 fp1 = tcg_temp_new_i64();
9972
9973             gen_load_fpr64(ctx, fp0, fs);
9974             gen_load_fpr64(ctx, fp1, ft);
9975             gen_helper_float_mul_d(fp0, cpu_env, fp0, fp1);
9976             tcg_temp_free_i64(fp1);
9977             gen_store_fpr64(ctx, fp0, fd);
9978             tcg_temp_free_i64(fp0);
9979         }
9980         break;
9981     case OPC_DIV_D:
9982         check_cp1_registers(ctx, fs | ft | fd);
9983         {
9984             TCGv_i64 fp0 = tcg_temp_new_i64();
9985             TCGv_i64 fp1 = tcg_temp_new_i64();
9986
9987             gen_load_fpr64(ctx, fp0, fs);
9988             gen_load_fpr64(ctx, fp1, ft);
9989             gen_helper_float_div_d(fp0, cpu_env, fp0, fp1);
9990             tcg_temp_free_i64(fp1);
9991             gen_store_fpr64(ctx, fp0, fd);
9992             tcg_temp_free_i64(fp0);
9993         }
9994         break;
9995     case OPC_SQRT_D:
9996         check_cp1_registers(ctx, fs | fd);
9997         {
9998             TCGv_i64 fp0 = tcg_temp_new_i64();
9999
10000             gen_load_fpr64(ctx, fp0, fs);
10001             gen_helper_float_sqrt_d(fp0, cpu_env, fp0);
10002             gen_store_fpr64(ctx, fp0, fd);
10003             tcg_temp_free_i64(fp0);
10004         }
10005         break;
10006     case OPC_ABS_D:
10007         check_cp1_registers(ctx, fs | fd);
10008         {
10009             TCGv_i64 fp0 = tcg_temp_new_i64();
10010
10011             gen_load_fpr64(ctx, fp0, fs);
10012             if (ctx->abs2008) {
10013                 tcg_gen_andi_i64(fp0, fp0, 0x7fffffffffffffffULL);
10014             } else {
10015                 gen_helper_float_abs_d(fp0, fp0);
10016             }
10017             gen_store_fpr64(ctx, fp0, fd);
10018             tcg_temp_free_i64(fp0);
10019         }
10020         break;
10021     case OPC_MOV_D:
10022         check_cp1_registers(ctx, fs | fd);
10023         {
10024             TCGv_i64 fp0 = tcg_temp_new_i64();
10025
10026             gen_load_fpr64(ctx, fp0, fs);
10027             gen_store_fpr64(ctx, fp0, fd);
10028             tcg_temp_free_i64(fp0);
10029         }
10030         break;
10031     case OPC_NEG_D:
10032         check_cp1_registers(ctx, fs | fd);
10033         {
10034             TCGv_i64 fp0 = tcg_temp_new_i64();
10035
10036             gen_load_fpr64(ctx, fp0, fs);
10037             if (ctx->abs2008) {
10038                 tcg_gen_xori_i64(fp0, fp0, 1ULL << 63);
10039             } else {
10040                 gen_helper_float_chs_d(fp0, fp0);
10041             }
10042             gen_store_fpr64(ctx, fp0, fd);
10043             tcg_temp_free_i64(fp0);
10044         }
10045         break;
10046     case OPC_ROUND_L_D:
10047         check_cp1_64bitmode(ctx);
10048         {
10049             TCGv_i64 fp0 = tcg_temp_new_i64();
10050
10051             gen_load_fpr64(ctx, fp0, fs);
10052             if (ctx->nan2008) {
10053                 gen_helper_float_round_2008_l_d(fp0, cpu_env, fp0);
10054             } else {
10055                 gen_helper_float_round_l_d(fp0, cpu_env, fp0);
10056             }
10057             gen_store_fpr64(ctx, fp0, fd);
10058             tcg_temp_free_i64(fp0);
10059         }
10060         break;
10061     case OPC_TRUNC_L_D:
10062         check_cp1_64bitmode(ctx);
10063         {
10064             TCGv_i64 fp0 = tcg_temp_new_i64();
10065
10066             gen_load_fpr64(ctx, fp0, fs);
10067             if (ctx->nan2008) {
10068                 gen_helper_float_trunc_2008_l_d(fp0, cpu_env, fp0);
10069             } else {
10070                 gen_helper_float_trunc_l_d(fp0, cpu_env, fp0);
10071             }
10072             gen_store_fpr64(ctx, fp0, fd);
10073             tcg_temp_free_i64(fp0);
10074         }
10075         break;
10076     case OPC_CEIL_L_D:
10077         check_cp1_64bitmode(ctx);
10078         {
10079             TCGv_i64 fp0 = tcg_temp_new_i64();
10080
10081             gen_load_fpr64(ctx, fp0, fs);
10082             if (ctx->nan2008) {
10083                 gen_helper_float_ceil_2008_l_d(fp0, cpu_env, fp0);
10084             } else {
10085                 gen_helper_float_ceil_l_d(fp0, cpu_env, fp0);
10086             }
10087             gen_store_fpr64(ctx, fp0, fd);
10088             tcg_temp_free_i64(fp0);
10089         }
10090         break;
10091     case OPC_FLOOR_L_D:
10092         check_cp1_64bitmode(ctx);
10093         {
10094             TCGv_i64 fp0 = tcg_temp_new_i64();
10095
10096             gen_load_fpr64(ctx, fp0, fs);
10097             if (ctx->nan2008) {
10098                 gen_helper_float_floor_2008_l_d(fp0, cpu_env, fp0);
10099             } else {
10100                 gen_helper_float_floor_l_d(fp0, cpu_env, fp0);
10101             }
10102             gen_store_fpr64(ctx, fp0, fd);
10103             tcg_temp_free_i64(fp0);
10104         }
10105         break;
10106     case OPC_ROUND_W_D:
10107         check_cp1_registers(ctx, fs);
10108         {
10109             TCGv_i32 fp32 = tcg_temp_new_i32();
10110             TCGv_i64 fp64 = tcg_temp_new_i64();
10111
10112             gen_load_fpr64(ctx, fp64, fs);
10113             if (ctx->nan2008) {
10114                 gen_helper_float_round_2008_w_d(fp32, cpu_env, fp64);
10115             } else {
10116                 gen_helper_float_round_w_d(fp32, cpu_env, fp64);
10117             }
10118             tcg_temp_free_i64(fp64);
10119             gen_store_fpr32(ctx, fp32, fd);
10120             tcg_temp_free_i32(fp32);
10121         }
10122         break;
10123     case OPC_TRUNC_W_D:
10124         check_cp1_registers(ctx, fs);
10125         {
10126             TCGv_i32 fp32 = tcg_temp_new_i32();
10127             TCGv_i64 fp64 = tcg_temp_new_i64();
10128
10129             gen_load_fpr64(ctx, fp64, fs);
10130             if (ctx->nan2008) {
10131                 gen_helper_float_trunc_2008_w_d(fp32, cpu_env, fp64);
10132             } else {
10133                 gen_helper_float_trunc_w_d(fp32, cpu_env, fp64);
10134             }
10135             tcg_temp_free_i64(fp64);
10136             gen_store_fpr32(ctx, fp32, fd);
10137             tcg_temp_free_i32(fp32);
10138         }
10139         break;
10140     case OPC_CEIL_W_D:
10141         check_cp1_registers(ctx, fs);
10142         {
10143             TCGv_i32 fp32 = tcg_temp_new_i32();
10144             TCGv_i64 fp64 = tcg_temp_new_i64();
10145
10146             gen_load_fpr64(ctx, fp64, fs);
10147             if (ctx->nan2008) {
10148                 gen_helper_float_ceil_2008_w_d(fp32, cpu_env, fp64);
10149             } else {
10150                 gen_helper_float_ceil_w_d(fp32, cpu_env, fp64);
10151             }
10152             tcg_temp_free_i64(fp64);
10153             gen_store_fpr32(ctx, fp32, fd);
10154             tcg_temp_free_i32(fp32);
10155         }
10156         break;
10157     case OPC_FLOOR_W_D:
10158         check_cp1_registers(ctx, fs);
10159         {
10160             TCGv_i32 fp32 = tcg_temp_new_i32();
10161             TCGv_i64 fp64 = tcg_temp_new_i64();
10162
10163             gen_load_fpr64(ctx, fp64, fs);
10164             if (ctx->nan2008) {
10165                 gen_helper_float_floor_2008_w_d(fp32, cpu_env, fp64);
10166             } else {
10167                 gen_helper_float_floor_w_d(fp32, cpu_env, fp64);
10168             }
10169             tcg_temp_free_i64(fp64);
10170             gen_store_fpr32(ctx, fp32, fd);
10171             tcg_temp_free_i32(fp32);
10172         }
10173         break;
10174     case OPC_SEL_D:
10175         check_insn(ctx, ISA_MIPS32R6);
10176         gen_sel_d(ctx, op1, fd, ft, fs);
10177         break;
10178     case OPC_SELEQZ_D:
10179         check_insn(ctx, ISA_MIPS32R6);
10180         gen_sel_d(ctx, op1, fd, ft, fs);
10181         break;
10182     case OPC_SELNEZ_D:
10183         check_insn(ctx, ISA_MIPS32R6);
10184         gen_sel_d(ctx, op1, fd, ft, fs);
10185         break;
10186     case OPC_MOVCF_D:
10187         check_insn_opc_removed(ctx, ISA_MIPS32R6);
10188         gen_movcf_d(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
10189         break;
10190     case OPC_MOVZ_D:
10191         check_insn_opc_removed(ctx, ISA_MIPS32R6);
10192         {
10193             TCGLabel *l1 = gen_new_label();
10194             TCGv_i64 fp0;
10195
10196             if (ft != 0) {
10197                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
10198             }
10199             fp0 = tcg_temp_new_i64();
10200             gen_load_fpr64(ctx, fp0, fs);
10201             gen_store_fpr64(ctx, fp0, fd);
10202             tcg_temp_free_i64(fp0);
10203             gen_set_label(l1);
10204         }
10205         break;
10206     case OPC_MOVN_D:
10207         check_insn_opc_removed(ctx, ISA_MIPS32R6);
10208         {
10209             TCGLabel *l1 = gen_new_label();
10210             TCGv_i64 fp0;
10211
10212             if (ft != 0) {
10213                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
10214                 fp0 = tcg_temp_new_i64();
10215                 gen_load_fpr64(ctx, fp0, fs);
10216                 gen_store_fpr64(ctx, fp0, fd);
10217                 tcg_temp_free_i64(fp0);
10218                 gen_set_label(l1);
10219             }
10220         }
10221         break;
10222     case OPC_RECIP_D:
10223         check_cp1_registers(ctx, fs | fd);
10224         {
10225             TCGv_i64 fp0 = tcg_temp_new_i64();
10226
10227             gen_load_fpr64(ctx, fp0, fs);
10228             gen_helper_float_recip_d(fp0, cpu_env, fp0);
10229             gen_store_fpr64(ctx, fp0, fd);
10230             tcg_temp_free_i64(fp0);
10231         }
10232         break;
10233     case OPC_RSQRT_D:
10234         check_cp1_registers(ctx, fs | fd);
10235         {
10236             TCGv_i64 fp0 = tcg_temp_new_i64();
10237
10238             gen_load_fpr64(ctx, fp0, fs);
10239             gen_helper_float_rsqrt_d(fp0, cpu_env, fp0);
10240             gen_store_fpr64(ctx, fp0, fd);
10241             tcg_temp_free_i64(fp0);
10242         }
10243         break;
10244     case OPC_MADDF_D:
10245         check_insn(ctx, ISA_MIPS32R6);
10246         {
10247             TCGv_i64 fp0 = tcg_temp_new_i64();
10248             TCGv_i64 fp1 = tcg_temp_new_i64();
10249             TCGv_i64 fp2 = tcg_temp_new_i64();
10250             gen_load_fpr64(ctx, fp0, fs);
10251             gen_load_fpr64(ctx, fp1, ft);
10252             gen_load_fpr64(ctx, fp2, fd);
10253             gen_helper_float_maddf_d(fp2, cpu_env, fp0, fp1, fp2);
10254             gen_store_fpr64(ctx, fp2, fd);
10255             tcg_temp_free_i64(fp2);
10256             tcg_temp_free_i64(fp1);
10257             tcg_temp_free_i64(fp0);
10258         }
10259         break;
10260     case OPC_MSUBF_D:
10261         check_insn(ctx, ISA_MIPS32R6);
10262         {
10263             TCGv_i64 fp0 = tcg_temp_new_i64();
10264             TCGv_i64 fp1 = tcg_temp_new_i64();
10265             TCGv_i64 fp2 = tcg_temp_new_i64();
10266             gen_load_fpr64(ctx, fp0, fs);
10267             gen_load_fpr64(ctx, fp1, ft);
10268             gen_load_fpr64(ctx, fp2, fd);
10269             gen_helper_float_msubf_d(fp2, cpu_env, fp0, fp1, fp2);
10270             gen_store_fpr64(ctx, fp2, fd);
10271             tcg_temp_free_i64(fp2);
10272             tcg_temp_free_i64(fp1);
10273             tcg_temp_free_i64(fp0);
10274         }
10275         break;
10276     case OPC_RINT_D:
10277         check_insn(ctx, ISA_MIPS32R6);
10278         {
10279             TCGv_i64 fp0 = tcg_temp_new_i64();
10280             gen_load_fpr64(ctx, fp0, fs);
10281             gen_helper_float_rint_d(fp0, cpu_env, fp0);
10282             gen_store_fpr64(ctx, fp0, fd);
10283             tcg_temp_free_i64(fp0);
10284         }
10285         break;
10286     case OPC_CLASS_D:
10287         check_insn(ctx, ISA_MIPS32R6);
10288         {
10289             TCGv_i64 fp0 = tcg_temp_new_i64();
10290             gen_load_fpr64(ctx, fp0, fs);
10291             gen_helper_float_class_d(fp0, cpu_env, fp0);
10292             gen_store_fpr64(ctx, fp0, fd);
10293             tcg_temp_free_i64(fp0);
10294         }
10295         break;
10296     case OPC_MIN_D: /* OPC_RECIP2_D */
10297         if (ctx->insn_flags & ISA_MIPS32R6) {
10298             /* OPC_MIN_D */
10299             TCGv_i64 fp0 = tcg_temp_new_i64();
10300             TCGv_i64 fp1 = tcg_temp_new_i64();
10301             gen_load_fpr64(ctx, fp0, fs);
10302             gen_load_fpr64(ctx, fp1, ft);
10303             gen_helper_float_min_d(fp1, cpu_env, fp0, fp1);
10304             gen_store_fpr64(ctx, fp1, fd);
10305             tcg_temp_free_i64(fp1);
10306             tcg_temp_free_i64(fp0);
10307         } else {
10308             /* OPC_RECIP2_D */
10309             check_cp1_64bitmode(ctx);
10310             {
10311                 TCGv_i64 fp0 = tcg_temp_new_i64();
10312                 TCGv_i64 fp1 = tcg_temp_new_i64();
10313
10314                 gen_load_fpr64(ctx, fp0, fs);
10315                 gen_load_fpr64(ctx, fp1, ft);
10316                 gen_helper_float_recip2_d(fp0, cpu_env, fp0, fp1);
10317                 tcg_temp_free_i64(fp1);
10318                 gen_store_fpr64(ctx, fp0, fd);
10319                 tcg_temp_free_i64(fp0);
10320             }
10321         }
10322         break;
10323     case OPC_MINA_D: /* OPC_RECIP1_D */
10324         if (ctx->insn_flags & ISA_MIPS32R6) {
10325             /* OPC_MINA_D */
10326             TCGv_i64 fp0 = tcg_temp_new_i64();
10327             TCGv_i64 fp1 = tcg_temp_new_i64();
10328             gen_load_fpr64(ctx, fp0, fs);
10329             gen_load_fpr64(ctx, fp1, ft);
10330             gen_helper_float_mina_d(fp1, cpu_env, fp0, fp1);
10331             gen_store_fpr64(ctx, fp1, fd);
10332             tcg_temp_free_i64(fp1);
10333             tcg_temp_free_i64(fp0);
10334         } else {
10335             /* OPC_RECIP1_D */
10336             check_cp1_64bitmode(ctx);
10337             {
10338                 TCGv_i64 fp0 = tcg_temp_new_i64();
10339
10340                 gen_load_fpr64(ctx, fp0, fs);
10341                 gen_helper_float_recip1_d(fp0, cpu_env, fp0);
10342                 gen_store_fpr64(ctx, fp0, fd);
10343                 tcg_temp_free_i64(fp0);
10344             }
10345         }
10346         break;
10347     case OPC_MAX_D: /*  OPC_RSQRT1_D */
10348         if (ctx->insn_flags & ISA_MIPS32R6) {
10349             /* OPC_MAX_D */
10350             TCGv_i64 fp0 = tcg_temp_new_i64();
10351             TCGv_i64 fp1 = tcg_temp_new_i64();
10352             gen_load_fpr64(ctx, fp0, fs);
10353             gen_load_fpr64(ctx, fp1, ft);
10354             gen_helper_float_max_d(fp1, cpu_env, fp0, fp1);
10355             gen_store_fpr64(ctx, fp1, fd);
10356             tcg_temp_free_i64(fp1);
10357             tcg_temp_free_i64(fp0);
10358         } else {
10359             /* OPC_RSQRT1_D */
10360             check_cp1_64bitmode(ctx);
10361             {
10362                 TCGv_i64 fp0 = tcg_temp_new_i64();
10363
10364                 gen_load_fpr64(ctx, fp0, fs);
10365                 gen_helper_float_rsqrt1_d(fp0, cpu_env, fp0);
10366                 gen_store_fpr64(ctx, fp0, fd);
10367                 tcg_temp_free_i64(fp0);
10368             }
10369         }
10370         break;
10371     case OPC_MAXA_D: /* OPC_RSQRT2_D */
10372         if (ctx->insn_flags & ISA_MIPS32R6) {
10373             /* OPC_MAXA_D */
10374             TCGv_i64 fp0 = tcg_temp_new_i64();
10375             TCGv_i64 fp1 = tcg_temp_new_i64();
10376             gen_load_fpr64(ctx, fp0, fs);
10377             gen_load_fpr64(ctx, fp1, ft);
10378             gen_helper_float_maxa_d(fp1, cpu_env, fp0, fp1);
10379             gen_store_fpr64(ctx, fp1, fd);
10380             tcg_temp_free_i64(fp1);
10381             tcg_temp_free_i64(fp0);
10382         } else {
10383             /* OPC_RSQRT2_D */
10384             check_cp1_64bitmode(ctx);
10385             {
10386                 TCGv_i64 fp0 = tcg_temp_new_i64();
10387                 TCGv_i64 fp1 = tcg_temp_new_i64();
10388
10389                 gen_load_fpr64(ctx, fp0, fs);
10390                 gen_load_fpr64(ctx, fp1, ft);
10391                 gen_helper_float_rsqrt2_d(fp0, cpu_env, fp0, fp1);
10392                 tcg_temp_free_i64(fp1);
10393                 gen_store_fpr64(ctx, fp0, fd);
10394                 tcg_temp_free_i64(fp0);
10395             }
10396         }
10397         break;
10398     case OPC_CMP_F_D:
10399     case OPC_CMP_UN_D:
10400     case OPC_CMP_EQ_D:
10401     case OPC_CMP_UEQ_D:
10402     case OPC_CMP_OLT_D:
10403     case OPC_CMP_ULT_D:
10404     case OPC_CMP_OLE_D:
10405     case OPC_CMP_ULE_D:
10406     case OPC_CMP_SF_D:
10407     case OPC_CMP_NGLE_D:
10408     case OPC_CMP_SEQ_D:
10409     case OPC_CMP_NGL_D:
10410     case OPC_CMP_LT_D:
10411     case OPC_CMP_NGE_D:
10412     case OPC_CMP_LE_D:
10413     case OPC_CMP_NGT_D:
10414         check_insn_opc_removed(ctx, ISA_MIPS32R6);
10415         if (ctx->opcode & (1 << 6)) {
10416             gen_cmpabs_d(ctx, func-48, ft, fs, cc);
10417         } else {
10418             gen_cmp_d(ctx, func-48, ft, fs, cc);
10419         }
10420         break;
10421     case OPC_CVT_S_D:
10422         check_cp1_registers(ctx, fs);
10423         {
10424             TCGv_i32 fp32 = tcg_temp_new_i32();
10425             TCGv_i64 fp64 = tcg_temp_new_i64();
10426
10427             gen_load_fpr64(ctx, fp64, fs);
10428             gen_helper_float_cvts_d(fp32, cpu_env, fp64);
10429             tcg_temp_free_i64(fp64);
10430             gen_store_fpr32(ctx, fp32, fd);
10431             tcg_temp_free_i32(fp32);
10432         }
10433         break;
10434     case OPC_CVT_W_D:
10435         check_cp1_registers(ctx, fs);
10436         {
10437             TCGv_i32 fp32 = tcg_temp_new_i32();
10438             TCGv_i64 fp64 = tcg_temp_new_i64();
10439
10440             gen_load_fpr64(ctx, fp64, fs);
10441             if (ctx->nan2008) {
10442                 gen_helper_float_cvt_2008_w_d(fp32, cpu_env, fp64);
10443             } else {
10444                 gen_helper_float_cvt_w_d(fp32, cpu_env, fp64);
10445             }
10446             tcg_temp_free_i64(fp64);
10447             gen_store_fpr32(ctx, fp32, fd);
10448             tcg_temp_free_i32(fp32);
10449         }
10450         break;
10451     case OPC_CVT_L_D:
10452         check_cp1_64bitmode(ctx);
10453         {
10454             TCGv_i64 fp0 = tcg_temp_new_i64();
10455
10456             gen_load_fpr64(ctx, fp0, fs);
10457             if (ctx->nan2008) {
10458                 gen_helper_float_cvt_2008_l_d(fp0, cpu_env, fp0);
10459             } else {
10460                 gen_helper_float_cvt_l_d(fp0, cpu_env, fp0);
10461             }
10462             gen_store_fpr64(ctx, fp0, fd);
10463             tcg_temp_free_i64(fp0);
10464         }
10465         break;
10466     case OPC_CVT_S_W:
10467         {
10468             TCGv_i32 fp0 = tcg_temp_new_i32();
10469
10470             gen_load_fpr32(ctx, fp0, fs);
10471             gen_helper_float_cvts_w(fp0, cpu_env, fp0);
10472             gen_store_fpr32(ctx, fp0, fd);
10473             tcg_temp_free_i32(fp0);
10474         }
10475         break;
10476     case OPC_CVT_D_W:
10477         check_cp1_registers(ctx, fd);
10478         {
10479             TCGv_i32 fp32 = tcg_temp_new_i32();
10480             TCGv_i64 fp64 = tcg_temp_new_i64();
10481
10482             gen_load_fpr32(ctx, fp32, fs);
10483             gen_helper_float_cvtd_w(fp64, cpu_env, fp32);
10484             tcg_temp_free_i32(fp32);
10485             gen_store_fpr64(ctx, fp64, fd);
10486             tcg_temp_free_i64(fp64);
10487         }
10488         break;
10489     case OPC_CVT_S_L:
10490         check_cp1_64bitmode(ctx);
10491         {
10492             TCGv_i32 fp32 = tcg_temp_new_i32();
10493             TCGv_i64 fp64 = tcg_temp_new_i64();
10494
10495             gen_load_fpr64(ctx, fp64, fs);
10496             gen_helper_float_cvts_l(fp32, cpu_env, fp64);
10497             tcg_temp_free_i64(fp64);
10498             gen_store_fpr32(ctx, fp32, fd);
10499             tcg_temp_free_i32(fp32);
10500         }
10501         break;
10502     case OPC_CVT_D_L:
10503         check_cp1_64bitmode(ctx);
10504         {
10505             TCGv_i64 fp0 = tcg_temp_new_i64();
10506
10507             gen_load_fpr64(ctx, fp0, fs);
10508             gen_helper_float_cvtd_l(fp0, cpu_env, fp0);
10509             gen_store_fpr64(ctx, fp0, fd);
10510             tcg_temp_free_i64(fp0);
10511         }
10512         break;
10513     case OPC_CVT_PS_PW:
10514         check_ps(ctx);
10515         {
10516             TCGv_i64 fp0 = tcg_temp_new_i64();
10517
10518             gen_load_fpr64(ctx, fp0, fs);
10519             gen_helper_float_cvtps_pw(fp0, cpu_env, fp0);
10520             gen_store_fpr64(ctx, fp0, fd);
10521             tcg_temp_free_i64(fp0);
10522         }
10523         break;
10524     case OPC_ADD_PS:
10525         check_ps(ctx);
10526         {
10527             TCGv_i64 fp0 = tcg_temp_new_i64();
10528             TCGv_i64 fp1 = tcg_temp_new_i64();
10529
10530             gen_load_fpr64(ctx, fp0, fs);
10531             gen_load_fpr64(ctx, fp1, ft);
10532             gen_helper_float_add_ps(fp0, cpu_env, fp0, fp1);
10533             tcg_temp_free_i64(fp1);
10534             gen_store_fpr64(ctx, fp0, fd);
10535             tcg_temp_free_i64(fp0);
10536         }
10537         break;
10538     case OPC_SUB_PS:
10539         check_ps(ctx);
10540         {
10541             TCGv_i64 fp0 = tcg_temp_new_i64();
10542             TCGv_i64 fp1 = tcg_temp_new_i64();
10543
10544             gen_load_fpr64(ctx, fp0, fs);
10545             gen_load_fpr64(ctx, fp1, ft);
10546             gen_helper_float_sub_ps(fp0, cpu_env, fp0, fp1);
10547             tcg_temp_free_i64(fp1);
10548             gen_store_fpr64(ctx, fp0, fd);
10549             tcg_temp_free_i64(fp0);
10550         }
10551         break;
10552     case OPC_MUL_PS:
10553         check_ps(ctx);
10554         {
10555             TCGv_i64 fp0 = tcg_temp_new_i64();
10556             TCGv_i64 fp1 = tcg_temp_new_i64();
10557
10558             gen_load_fpr64(ctx, fp0, fs);
10559             gen_load_fpr64(ctx, fp1, ft);
10560             gen_helper_float_mul_ps(fp0, cpu_env, fp0, fp1);
10561             tcg_temp_free_i64(fp1);
10562             gen_store_fpr64(ctx, fp0, fd);
10563             tcg_temp_free_i64(fp0);
10564         }
10565         break;
10566     case OPC_ABS_PS:
10567         check_ps(ctx);
10568         {
10569             TCGv_i64 fp0 = tcg_temp_new_i64();
10570
10571             gen_load_fpr64(ctx, fp0, fs);
10572             gen_helper_float_abs_ps(fp0, fp0);
10573             gen_store_fpr64(ctx, fp0, fd);
10574             tcg_temp_free_i64(fp0);
10575         }
10576         break;
10577     case OPC_MOV_PS:
10578         check_ps(ctx);
10579         {
10580             TCGv_i64 fp0 = tcg_temp_new_i64();
10581
10582             gen_load_fpr64(ctx, fp0, fs);
10583             gen_store_fpr64(ctx, fp0, fd);
10584             tcg_temp_free_i64(fp0);
10585         }
10586         break;
10587     case OPC_NEG_PS:
10588         check_ps(ctx);
10589         {
10590             TCGv_i64 fp0 = tcg_temp_new_i64();
10591
10592             gen_load_fpr64(ctx, fp0, fs);
10593             gen_helper_float_chs_ps(fp0, fp0);
10594             gen_store_fpr64(ctx, fp0, fd);
10595             tcg_temp_free_i64(fp0);
10596         }
10597         break;
10598     case OPC_MOVCF_PS:
10599         check_ps(ctx);
10600         gen_movcf_ps(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
10601         break;
10602     case OPC_MOVZ_PS:
10603         check_ps(ctx);
10604         {
10605             TCGLabel *l1 = gen_new_label();
10606             TCGv_i64 fp0;
10607
10608             if (ft != 0)
10609                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
10610             fp0 = tcg_temp_new_i64();
10611             gen_load_fpr64(ctx, fp0, fs);
10612             gen_store_fpr64(ctx, fp0, fd);
10613             tcg_temp_free_i64(fp0);
10614             gen_set_label(l1);
10615         }
10616         break;
10617     case OPC_MOVN_PS:
10618         check_ps(ctx);
10619         {
10620             TCGLabel *l1 = gen_new_label();
10621             TCGv_i64 fp0;
10622
10623             if (ft != 0) {
10624                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
10625                 fp0 = tcg_temp_new_i64();
10626                 gen_load_fpr64(ctx, fp0, fs);
10627                 gen_store_fpr64(ctx, fp0, fd);
10628                 tcg_temp_free_i64(fp0);
10629                 gen_set_label(l1);
10630             }
10631         }
10632         break;
10633     case OPC_ADDR_PS:
10634         check_ps(ctx);
10635         {
10636             TCGv_i64 fp0 = tcg_temp_new_i64();
10637             TCGv_i64 fp1 = tcg_temp_new_i64();
10638
10639             gen_load_fpr64(ctx, fp0, ft);
10640             gen_load_fpr64(ctx, fp1, fs);
10641             gen_helper_float_addr_ps(fp0, cpu_env, fp0, fp1);
10642             tcg_temp_free_i64(fp1);
10643             gen_store_fpr64(ctx, fp0, fd);
10644             tcg_temp_free_i64(fp0);
10645         }
10646         break;
10647     case OPC_MULR_PS:
10648         check_ps(ctx);
10649         {
10650             TCGv_i64 fp0 = tcg_temp_new_i64();
10651             TCGv_i64 fp1 = tcg_temp_new_i64();
10652
10653             gen_load_fpr64(ctx, fp0, ft);
10654             gen_load_fpr64(ctx, fp1, fs);
10655             gen_helper_float_mulr_ps(fp0, cpu_env, fp0, fp1);
10656             tcg_temp_free_i64(fp1);
10657             gen_store_fpr64(ctx, fp0, fd);
10658             tcg_temp_free_i64(fp0);
10659         }
10660         break;
10661     case OPC_RECIP2_PS:
10662         check_ps(ctx);
10663         {
10664             TCGv_i64 fp0 = tcg_temp_new_i64();
10665             TCGv_i64 fp1 = tcg_temp_new_i64();
10666
10667             gen_load_fpr64(ctx, fp0, fs);
10668             gen_load_fpr64(ctx, fp1, ft);
10669             gen_helper_float_recip2_ps(fp0, cpu_env, fp0, fp1);
10670             tcg_temp_free_i64(fp1);
10671             gen_store_fpr64(ctx, fp0, fd);
10672             tcg_temp_free_i64(fp0);
10673         }
10674         break;
10675     case OPC_RECIP1_PS:
10676         check_ps(ctx);
10677         {
10678             TCGv_i64 fp0 = tcg_temp_new_i64();
10679
10680             gen_load_fpr64(ctx, fp0, fs);
10681             gen_helper_float_recip1_ps(fp0, cpu_env, fp0);
10682             gen_store_fpr64(ctx, fp0, fd);
10683             tcg_temp_free_i64(fp0);
10684         }
10685         break;
10686     case OPC_RSQRT1_PS:
10687         check_ps(ctx);
10688         {
10689             TCGv_i64 fp0 = tcg_temp_new_i64();
10690
10691             gen_load_fpr64(ctx, fp0, fs);
10692             gen_helper_float_rsqrt1_ps(fp0, cpu_env, fp0);
10693             gen_store_fpr64(ctx, fp0, fd);
10694             tcg_temp_free_i64(fp0);
10695         }
10696         break;
10697     case OPC_RSQRT2_PS:
10698         check_ps(ctx);
10699         {
10700             TCGv_i64 fp0 = tcg_temp_new_i64();
10701             TCGv_i64 fp1 = tcg_temp_new_i64();
10702
10703             gen_load_fpr64(ctx, fp0, fs);
10704             gen_load_fpr64(ctx, fp1, ft);
10705             gen_helper_float_rsqrt2_ps(fp0, cpu_env, fp0, fp1);
10706             tcg_temp_free_i64(fp1);
10707             gen_store_fpr64(ctx, fp0, fd);
10708             tcg_temp_free_i64(fp0);
10709         }
10710         break;
10711     case OPC_CVT_S_PU:
10712         check_cp1_64bitmode(ctx);
10713         {
10714             TCGv_i32 fp0 = tcg_temp_new_i32();
10715
10716             gen_load_fpr32h(ctx, fp0, fs);
10717             gen_helper_float_cvts_pu(fp0, cpu_env, fp0);
10718             gen_store_fpr32(ctx, fp0, fd);
10719             tcg_temp_free_i32(fp0);
10720         }
10721         break;
10722     case OPC_CVT_PW_PS:
10723         check_ps(ctx);
10724         {
10725             TCGv_i64 fp0 = tcg_temp_new_i64();
10726
10727             gen_load_fpr64(ctx, fp0, fs);
10728             gen_helper_float_cvtpw_ps(fp0, cpu_env, fp0);
10729             gen_store_fpr64(ctx, fp0, fd);
10730             tcg_temp_free_i64(fp0);
10731         }
10732         break;
10733     case OPC_CVT_S_PL:
10734         check_cp1_64bitmode(ctx);
10735         {
10736             TCGv_i32 fp0 = tcg_temp_new_i32();
10737
10738             gen_load_fpr32(ctx, fp0, fs);
10739             gen_helper_float_cvts_pl(fp0, cpu_env, fp0);
10740             gen_store_fpr32(ctx, fp0, fd);
10741             tcg_temp_free_i32(fp0);
10742         }
10743         break;
10744     case OPC_PLL_PS:
10745         check_ps(ctx);
10746         {
10747             TCGv_i32 fp0 = tcg_temp_new_i32();
10748             TCGv_i32 fp1 = tcg_temp_new_i32();
10749
10750             gen_load_fpr32(ctx, fp0, fs);
10751             gen_load_fpr32(ctx, fp1, ft);
10752             gen_store_fpr32h(ctx, fp0, fd);
10753             gen_store_fpr32(ctx, fp1, fd);
10754             tcg_temp_free_i32(fp0);
10755             tcg_temp_free_i32(fp1);
10756         }
10757         break;
10758     case OPC_PLU_PS:
10759         check_ps(ctx);
10760         {
10761             TCGv_i32 fp0 = tcg_temp_new_i32();
10762             TCGv_i32 fp1 = tcg_temp_new_i32();
10763
10764             gen_load_fpr32(ctx, fp0, fs);
10765             gen_load_fpr32h(ctx, fp1, ft);
10766             gen_store_fpr32(ctx, fp1, fd);
10767             gen_store_fpr32h(ctx, fp0, fd);
10768             tcg_temp_free_i32(fp0);
10769             tcg_temp_free_i32(fp1);
10770         }
10771         break;
10772     case OPC_PUL_PS:
10773         check_ps(ctx);
10774         {
10775             TCGv_i32 fp0 = tcg_temp_new_i32();
10776             TCGv_i32 fp1 = tcg_temp_new_i32();
10777
10778             gen_load_fpr32h(ctx, fp0, fs);
10779             gen_load_fpr32(ctx, fp1, ft);
10780             gen_store_fpr32(ctx, fp1, fd);
10781             gen_store_fpr32h(ctx, fp0, fd);
10782             tcg_temp_free_i32(fp0);
10783             tcg_temp_free_i32(fp1);
10784         }
10785         break;
10786     case OPC_PUU_PS:
10787         check_ps(ctx);
10788         {
10789             TCGv_i32 fp0 = tcg_temp_new_i32();
10790             TCGv_i32 fp1 = tcg_temp_new_i32();
10791
10792             gen_load_fpr32h(ctx, fp0, fs);
10793             gen_load_fpr32h(ctx, fp1, ft);
10794             gen_store_fpr32(ctx, fp1, fd);
10795             gen_store_fpr32h(ctx, fp0, fd);
10796             tcg_temp_free_i32(fp0);
10797             tcg_temp_free_i32(fp1);
10798         }
10799         break;
10800     case OPC_CMP_F_PS:
10801     case OPC_CMP_UN_PS:
10802     case OPC_CMP_EQ_PS:
10803     case OPC_CMP_UEQ_PS:
10804     case OPC_CMP_OLT_PS:
10805     case OPC_CMP_ULT_PS:
10806     case OPC_CMP_OLE_PS:
10807     case OPC_CMP_ULE_PS:
10808     case OPC_CMP_SF_PS:
10809     case OPC_CMP_NGLE_PS:
10810     case OPC_CMP_SEQ_PS:
10811     case OPC_CMP_NGL_PS:
10812     case OPC_CMP_LT_PS:
10813     case OPC_CMP_NGE_PS:
10814     case OPC_CMP_LE_PS:
10815     case OPC_CMP_NGT_PS:
10816         if (ctx->opcode & (1 << 6)) {
10817             gen_cmpabs_ps(ctx, func-48, ft, fs, cc);
10818         } else {
10819             gen_cmp_ps(ctx, func-48, ft, fs, cc);
10820         }
10821         break;
10822     default:
10823         MIPS_INVAL("farith");
10824         generate_exception_end(ctx, EXCP_RI);
10825         return;
10826     }
10827 }
10828
10829 /* Coprocessor 3 (FPU) */
10830 static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
10831                            int fd, int fs, int base, int index)
10832 {
10833     TCGv t0 = tcg_temp_new();
10834
10835     if (base == 0) {
10836         gen_load_gpr(t0, index);
10837     } else if (index == 0) {
10838         gen_load_gpr(t0, base);
10839     } else {
10840         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[index]);
10841     }
10842     /* Don't do NOP if destination is zero: we must perform the actual
10843        memory access. */
10844     switch (opc) {
10845     case OPC_LWXC1:
10846         check_cop1x(ctx);
10847         {
10848             TCGv_i32 fp0 = tcg_temp_new_i32();
10849
10850             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
10851             tcg_gen_trunc_tl_i32(fp0, t0);
10852             gen_store_fpr32(ctx, fp0, fd);
10853             tcg_temp_free_i32(fp0);
10854         }
10855         break;
10856     case OPC_LDXC1:
10857         check_cop1x(ctx);
10858         check_cp1_registers(ctx, fd);
10859         {
10860             TCGv_i64 fp0 = tcg_temp_new_i64();
10861             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
10862             gen_store_fpr64(ctx, fp0, fd);
10863             tcg_temp_free_i64(fp0);
10864         }
10865         break;
10866     case OPC_LUXC1:
10867         check_cp1_64bitmode(ctx);
10868         tcg_gen_andi_tl(t0, t0, ~0x7);
10869         {
10870             TCGv_i64 fp0 = tcg_temp_new_i64();
10871
10872             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
10873             gen_store_fpr64(ctx, fp0, fd);
10874             tcg_temp_free_i64(fp0);
10875         }
10876         break;
10877     case OPC_SWXC1:
10878         check_cop1x(ctx);
10879         {
10880             TCGv_i32 fp0 = tcg_temp_new_i32();
10881             gen_load_fpr32(ctx, fp0, fs);
10882             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL);
10883             tcg_temp_free_i32(fp0);
10884         }
10885         break;
10886     case OPC_SDXC1:
10887         check_cop1x(ctx);
10888         check_cp1_registers(ctx, fs);
10889         {
10890             TCGv_i64 fp0 = tcg_temp_new_i64();
10891             gen_load_fpr64(ctx, fp0, fs);
10892             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
10893             tcg_temp_free_i64(fp0);
10894         }
10895         break;
10896     case OPC_SUXC1:
10897         check_cp1_64bitmode(ctx);
10898         tcg_gen_andi_tl(t0, t0, ~0x7);
10899         {
10900             TCGv_i64 fp0 = tcg_temp_new_i64();
10901             gen_load_fpr64(ctx, fp0, fs);
10902             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
10903             tcg_temp_free_i64(fp0);
10904         }
10905         break;
10906     }
10907     tcg_temp_free(t0);
10908 }
10909
10910 static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
10911                             int fd, int fr, int fs, int ft)
10912 {
10913     switch (opc) {
10914     case OPC_ALNV_PS:
10915         check_ps(ctx);
10916         {
10917             TCGv t0 = tcg_temp_local_new();
10918             TCGv_i32 fp = tcg_temp_new_i32();
10919             TCGv_i32 fph = tcg_temp_new_i32();
10920             TCGLabel *l1 = gen_new_label();
10921             TCGLabel *l2 = gen_new_label();
10922
10923             gen_load_gpr(t0, fr);
10924             tcg_gen_andi_tl(t0, t0, 0x7);
10925
10926             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);
10927             gen_load_fpr32(ctx, fp, fs);
10928             gen_load_fpr32h(ctx, fph, fs);
10929             gen_store_fpr32(ctx, fp, fd);
10930             gen_store_fpr32h(ctx, fph, fd);
10931             tcg_gen_br(l2);
10932             gen_set_label(l1);
10933             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 4, l2);
10934             tcg_temp_free(t0);
10935 #ifdef TARGET_WORDS_BIGENDIAN
10936             gen_load_fpr32(ctx, fp, fs);
10937             gen_load_fpr32h(ctx, fph, ft);
10938             gen_store_fpr32h(ctx, fp, fd);
10939             gen_store_fpr32(ctx, fph, fd);
10940 #else
10941             gen_load_fpr32h(ctx, fph, fs);
10942             gen_load_fpr32(ctx, fp, ft);
10943             gen_store_fpr32(ctx, fph, fd);
10944             gen_store_fpr32h(ctx, fp, fd);
10945 #endif
10946             gen_set_label(l2);
10947             tcg_temp_free_i32(fp);
10948             tcg_temp_free_i32(fph);
10949         }
10950         break;
10951     case OPC_MADD_S:
10952         check_cop1x(ctx);
10953         {
10954             TCGv_i32 fp0 = tcg_temp_new_i32();
10955             TCGv_i32 fp1 = tcg_temp_new_i32();
10956             TCGv_i32 fp2 = tcg_temp_new_i32();
10957
10958             gen_load_fpr32(ctx, fp0, fs);
10959             gen_load_fpr32(ctx, fp1, ft);
10960             gen_load_fpr32(ctx, fp2, fr);
10961             gen_helper_float_madd_s(fp2, cpu_env, fp0, fp1, fp2);
10962             tcg_temp_free_i32(fp0);
10963             tcg_temp_free_i32(fp1);
10964             gen_store_fpr32(ctx, fp2, fd);
10965             tcg_temp_free_i32(fp2);
10966         }
10967         break;
10968     case OPC_MADD_D:
10969         check_cop1x(ctx);
10970         check_cp1_registers(ctx, fd | fs | ft | fr);
10971         {
10972             TCGv_i64 fp0 = tcg_temp_new_i64();
10973             TCGv_i64 fp1 = tcg_temp_new_i64();
10974             TCGv_i64 fp2 = tcg_temp_new_i64();
10975
10976             gen_load_fpr64(ctx, fp0, fs);
10977             gen_load_fpr64(ctx, fp1, ft);
10978             gen_load_fpr64(ctx, fp2, fr);
10979             gen_helper_float_madd_d(fp2, cpu_env, fp0, fp1, fp2);
10980             tcg_temp_free_i64(fp0);
10981             tcg_temp_free_i64(fp1);
10982             gen_store_fpr64(ctx, fp2, fd);
10983             tcg_temp_free_i64(fp2);
10984         }
10985         break;
10986     case OPC_MADD_PS:
10987         check_ps(ctx);
10988         {
10989             TCGv_i64 fp0 = tcg_temp_new_i64();
10990             TCGv_i64 fp1 = tcg_temp_new_i64();
10991             TCGv_i64 fp2 = tcg_temp_new_i64();
10992
10993             gen_load_fpr64(ctx, fp0, fs);
10994             gen_load_fpr64(ctx, fp1, ft);
10995             gen_load_fpr64(ctx, fp2, fr);
10996             gen_helper_float_madd_ps(fp2, cpu_env, fp0, fp1, fp2);
10997             tcg_temp_free_i64(fp0);
10998             tcg_temp_free_i64(fp1);
10999             gen_store_fpr64(ctx, fp2, fd);
11000             tcg_temp_free_i64(fp2);
11001         }
11002         break;
11003     case OPC_MSUB_S:
11004         check_cop1x(ctx);
11005         {
11006             TCGv_i32 fp0 = tcg_temp_new_i32();
11007             TCGv_i32 fp1 = tcg_temp_new_i32();
11008             TCGv_i32 fp2 = tcg_temp_new_i32();
11009
11010             gen_load_fpr32(ctx, fp0, fs);
11011             gen_load_fpr32(ctx, fp1, ft);
11012             gen_load_fpr32(ctx, fp2, fr);
11013             gen_helper_float_msub_s(fp2, cpu_env, fp0, fp1, fp2);
11014             tcg_temp_free_i32(fp0);
11015             tcg_temp_free_i32(fp1);
11016             gen_store_fpr32(ctx, fp2, fd);
11017             tcg_temp_free_i32(fp2);
11018         }
11019         break;
11020     case OPC_MSUB_D:
11021         check_cop1x(ctx);
11022         check_cp1_registers(ctx, fd | fs | ft | fr);
11023         {
11024             TCGv_i64 fp0 = tcg_temp_new_i64();
11025             TCGv_i64 fp1 = tcg_temp_new_i64();
11026             TCGv_i64 fp2 = tcg_temp_new_i64();
11027
11028             gen_load_fpr64(ctx, fp0, fs);
11029             gen_load_fpr64(ctx, fp1, ft);
11030             gen_load_fpr64(ctx, fp2, fr);
11031             gen_helper_float_msub_d(fp2, cpu_env, fp0, fp1, fp2);
11032             tcg_temp_free_i64(fp0);
11033             tcg_temp_free_i64(fp1);
11034             gen_store_fpr64(ctx, fp2, fd);
11035             tcg_temp_free_i64(fp2);
11036         }
11037         break;
11038     case OPC_MSUB_PS:
11039         check_ps(ctx);
11040         {
11041             TCGv_i64 fp0 = tcg_temp_new_i64();
11042             TCGv_i64 fp1 = tcg_temp_new_i64();
11043             TCGv_i64 fp2 = tcg_temp_new_i64();
11044
11045             gen_load_fpr64(ctx, fp0, fs);
11046             gen_load_fpr64(ctx, fp1, ft);
11047             gen_load_fpr64(ctx, fp2, fr);
11048             gen_helper_float_msub_ps(fp2, cpu_env, fp0, fp1, fp2);
11049             tcg_temp_free_i64(fp0);
11050             tcg_temp_free_i64(fp1);
11051             gen_store_fpr64(ctx, fp2, fd);
11052             tcg_temp_free_i64(fp2);
11053         }
11054         break;
11055     case OPC_NMADD_S:
11056         check_cop1x(ctx);
11057         {
11058             TCGv_i32 fp0 = tcg_temp_new_i32();
11059             TCGv_i32 fp1 = tcg_temp_new_i32();
11060             TCGv_i32 fp2 = tcg_temp_new_i32();
11061
11062             gen_load_fpr32(ctx, fp0, fs);
11063             gen_load_fpr32(ctx, fp1, ft);
11064             gen_load_fpr32(ctx, fp2, fr);
11065             gen_helper_float_nmadd_s(fp2, cpu_env, fp0, fp1, fp2);
11066             tcg_temp_free_i32(fp0);
11067             tcg_temp_free_i32(fp1);
11068             gen_store_fpr32(ctx, fp2, fd);
11069             tcg_temp_free_i32(fp2);
11070         }
11071         break;
11072     case OPC_NMADD_D:
11073         check_cop1x(ctx);
11074         check_cp1_registers(ctx, fd | fs | ft | fr);
11075         {
11076             TCGv_i64 fp0 = tcg_temp_new_i64();
11077             TCGv_i64 fp1 = tcg_temp_new_i64();
11078             TCGv_i64 fp2 = tcg_temp_new_i64();
11079
11080             gen_load_fpr64(ctx, fp0, fs);
11081             gen_load_fpr64(ctx, fp1, ft);
11082             gen_load_fpr64(ctx, fp2, fr);
11083             gen_helper_float_nmadd_d(fp2, cpu_env, fp0, fp1, fp2);
11084             tcg_temp_free_i64(fp0);
11085             tcg_temp_free_i64(fp1);
11086             gen_store_fpr64(ctx, fp2, fd);
11087             tcg_temp_free_i64(fp2);
11088         }
11089         break;
11090     case OPC_NMADD_PS:
11091         check_ps(ctx);
11092         {
11093             TCGv_i64 fp0 = tcg_temp_new_i64();
11094             TCGv_i64 fp1 = tcg_temp_new_i64();
11095             TCGv_i64 fp2 = tcg_temp_new_i64();
11096
11097             gen_load_fpr64(ctx, fp0, fs);
11098             gen_load_fpr64(ctx, fp1, ft);
11099             gen_load_fpr64(ctx, fp2, fr);
11100             gen_helper_float_nmadd_ps(fp2, cpu_env, fp0, fp1, fp2);
11101             tcg_temp_free_i64(fp0);
11102             tcg_temp_free_i64(fp1);
11103             gen_store_fpr64(ctx, fp2, fd);
11104             tcg_temp_free_i64(fp2);
11105         }
11106         break;
11107     case OPC_NMSUB_S:
11108         check_cop1x(ctx);
11109         {
11110             TCGv_i32 fp0 = tcg_temp_new_i32();
11111             TCGv_i32 fp1 = tcg_temp_new_i32();
11112             TCGv_i32 fp2 = tcg_temp_new_i32();
11113
11114             gen_load_fpr32(ctx, fp0, fs);
11115             gen_load_fpr32(ctx, fp1, ft);
11116             gen_load_fpr32(ctx, fp2, fr);
11117             gen_helper_float_nmsub_s(fp2, cpu_env, fp0, fp1, fp2);
11118             tcg_temp_free_i32(fp0);
11119             tcg_temp_free_i32(fp1);
11120             gen_store_fpr32(ctx, fp2, fd);
11121             tcg_temp_free_i32(fp2);
11122         }
11123         break;
11124     case OPC_NMSUB_D:
11125         check_cop1x(ctx);
11126         check_cp1_registers(ctx, fd | fs | ft | fr);
11127         {
11128             TCGv_i64 fp0 = tcg_temp_new_i64();
11129             TCGv_i64 fp1 = tcg_temp_new_i64();
11130             TCGv_i64 fp2 = tcg_temp_new_i64();
11131
11132             gen_load_fpr64(ctx, fp0, fs);
11133             gen_load_fpr64(ctx, fp1, ft);
11134             gen_load_fpr64(ctx, fp2, fr);
11135             gen_helper_float_nmsub_d(fp2, cpu_env, fp0, fp1, fp2);
11136             tcg_temp_free_i64(fp0);
11137             tcg_temp_free_i64(fp1);
11138             gen_store_fpr64(ctx, fp2, fd);
11139             tcg_temp_free_i64(fp2);
11140         }
11141         break;
11142     case OPC_NMSUB_PS:
11143         check_ps(ctx);
11144         {
11145             TCGv_i64 fp0 = tcg_temp_new_i64();
11146             TCGv_i64 fp1 = tcg_temp_new_i64();
11147             TCGv_i64 fp2 = tcg_temp_new_i64();
11148
11149             gen_load_fpr64(ctx, fp0, fs);
11150             gen_load_fpr64(ctx, fp1, ft);
11151             gen_load_fpr64(ctx, fp2, fr);
11152             gen_helper_float_nmsub_ps(fp2, cpu_env, fp0, fp1, fp2);
11153             tcg_temp_free_i64(fp0);
11154             tcg_temp_free_i64(fp1);
11155             gen_store_fpr64(ctx, fp2, fd);
11156             tcg_temp_free_i64(fp2);
11157         }
11158         break;
11159     default:
11160         MIPS_INVAL("flt3_arith");
11161         generate_exception_end(ctx, EXCP_RI);
11162         return;
11163     }
11164 }
11165
11166 static void gen_rdhwr(DisasContext *ctx, int rt, int rd, int sel)
11167 {
11168     TCGv t0;
11169
11170 #if !defined(CONFIG_USER_ONLY)
11171     /* The Linux kernel will emulate rdhwr if it's not supported natively.
11172        Therefore only check the ISA in system mode.  */
11173     check_insn(ctx, ISA_MIPS32R2);
11174 #endif
11175     t0 = tcg_temp_new();
11176
11177     switch (rd) {
11178     case 0:
11179         gen_helper_rdhwr_cpunum(t0, cpu_env);
11180         gen_store_gpr(t0, rt);
11181         break;
11182     case 1:
11183         gen_helper_rdhwr_synci_step(t0, cpu_env);
11184         gen_store_gpr(t0, rt);
11185         break;
11186     case 2:
11187         if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
11188             gen_io_start();
11189         }
11190         gen_helper_rdhwr_cc(t0, cpu_env);
11191         if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
11192             gen_io_end();
11193         }
11194         gen_store_gpr(t0, rt);
11195         /* Break the TB to be able to take timer interrupts immediately
11196            after reading count. DISAS_STOP isn't sufficient, we need to ensure
11197            we break completely out of translated code.  */
11198         gen_save_pc(ctx->base.pc_next + 4);
11199         ctx->base.is_jmp = DISAS_EXIT;
11200         break;
11201     case 3:
11202         gen_helper_rdhwr_ccres(t0, cpu_env);
11203         gen_store_gpr(t0, rt);
11204         break;
11205     case 4:
11206         check_insn(ctx, ISA_MIPS32R6);
11207         if (sel != 0) {
11208             /* Performance counter registers are not implemented other than
11209              * control register 0.
11210              */
11211             generate_exception(ctx, EXCP_RI);
11212         }
11213         gen_helper_rdhwr_performance(t0, cpu_env);
11214         gen_store_gpr(t0, rt);
11215         break;
11216     case 5:
11217         check_insn(ctx, ISA_MIPS32R6);
11218         gen_helper_rdhwr_xnp(t0, cpu_env);
11219         gen_store_gpr(t0, rt);
11220         break;
11221     case 29:
11222 #if defined(CONFIG_USER_ONLY)
11223         tcg_gen_ld_tl(t0, cpu_env,
11224                       offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
11225         gen_store_gpr(t0, rt);
11226         break;
11227 #else
11228         if ((ctx->hflags & MIPS_HFLAG_CP0) ||
11229             (ctx->hflags & MIPS_HFLAG_HWRENA_ULR)) {
11230             tcg_gen_ld_tl(t0, cpu_env,
11231                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
11232             gen_store_gpr(t0, rt);
11233         } else {
11234             generate_exception_end(ctx, EXCP_RI);
11235         }
11236         break;
11237 #endif
11238     default:            /* Invalid */
11239         MIPS_INVAL("rdhwr");
11240         generate_exception_end(ctx, EXCP_RI);
11241         break;
11242     }
11243     tcg_temp_free(t0);
11244 }
11245
11246 static inline void clear_branch_hflags(DisasContext *ctx)
11247 {
11248     ctx->hflags &= ~MIPS_HFLAG_BMASK;
11249     if (ctx->base.is_jmp == DISAS_NEXT) {
11250         save_cpu_state(ctx, 0);
11251     } else {
11252         /* it is not safe to save ctx->hflags as hflags may be changed
11253            in execution time by the instruction in delay / forbidden slot. */
11254         tcg_gen_andi_i32(hflags, hflags, ~MIPS_HFLAG_BMASK);
11255     }
11256 }
11257
11258 static void gen_branch(DisasContext *ctx, int insn_bytes)
11259 {
11260     if (ctx->hflags & MIPS_HFLAG_BMASK) {
11261         int proc_hflags = ctx->hflags & MIPS_HFLAG_BMASK;
11262         /* Branches completion */
11263         clear_branch_hflags(ctx);
11264         ctx->base.is_jmp = DISAS_NORETURN;
11265         /* FIXME: Need to clear can_do_io.  */
11266         switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) {
11267         case MIPS_HFLAG_FBNSLOT:
11268             gen_goto_tb(ctx, 0, ctx->base.pc_next + insn_bytes);
11269             break;
11270         case MIPS_HFLAG_B:
11271             /* unconditional branch */
11272             if (proc_hflags & MIPS_HFLAG_BX) {
11273                 tcg_gen_xori_i32(hflags, hflags, MIPS_HFLAG_M16);
11274             }
11275             gen_goto_tb(ctx, 0, ctx->btarget);
11276             break;
11277         case MIPS_HFLAG_BL:
11278             /* blikely taken case */
11279             gen_goto_tb(ctx, 0, ctx->btarget);
11280             break;
11281         case MIPS_HFLAG_BC:
11282             /* Conditional branch */
11283             {
11284                 TCGLabel *l1 = gen_new_label();
11285
11286                 tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
11287                 gen_goto_tb(ctx, 1, ctx->base.pc_next + insn_bytes);
11288                 gen_set_label(l1);
11289                 gen_goto_tb(ctx, 0, ctx->btarget);
11290             }
11291             break;
11292         case MIPS_HFLAG_BR:
11293             /* unconditional branch to register */
11294             if (ctx->insn_flags & (ASE_MIPS16 | ASE_MICROMIPS)) {
11295                 TCGv t0 = tcg_temp_new();
11296                 TCGv_i32 t1 = tcg_temp_new_i32();
11297
11298                 tcg_gen_andi_tl(t0, btarget, 0x1);
11299                 tcg_gen_trunc_tl_i32(t1, t0);
11300                 tcg_temp_free(t0);
11301                 tcg_gen_andi_i32(hflags, hflags, ~(uint32_t)MIPS_HFLAG_M16);
11302                 tcg_gen_shli_i32(t1, t1, MIPS_HFLAG_M16_SHIFT);
11303                 tcg_gen_or_i32(hflags, hflags, t1);
11304                 tcg_temp_free_i32(t1);
11305
11306                 tcg_gen_andi_tl(cpu_PC, btarget, ~(target_ulong)0x1);
11307             } else {
11308                 tcg_gen_mov_tl(cpu_PC, btarget);
11309             }
11310             if (ctx->base.singlestep_enabled) {
11311                 save_cpu_state(ctx, 0);
11312                 gen_helper_raise_exception_debug(cpu_env);
11313             }
11314             tcg_gen_lookup_and_goto_ptr();
11315             break;
11316         default:
11317             fprintf(stderr, "unknown branch 0x%x\n", proc_hflags);
11318             abort();
11319         }
11320     }
11321 }
11322
11323 /* Compact Branches */
11324 static void gen_compute_compact_branch(DisasContext *ctx, uint32_t opc,
11325                                        int rs, int rt, int32_t offset)
11326 {
11327     int bcond_compute = 0;
11328     TCGv t0 = tcg_temp_new();
11329     TCGv t1 = tcg_temp_new();
11330     int m16_lowbit = (ctx->hflags & MIPS_HFLAG_M16) != 0;
11331
11332     if (ctx->hflags & MIPS_HFLAG_BMASK) {
11333 #ifdef MIPS_DEBUG_DISAS
11334         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
11335                   "\n", ctx->base.pc_next);
11336 #endif
11337         generate_exception_end(ctx, EXCP_RI);
11338         goto out;
11339     }
11340
11341     /* Load needed operands and calculate btarget */
11342     switch (opc) {
11343     /* compact branch */
11344     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
11345     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
11346         gen_load_gpr(t0, rs);
11347         gen_load_gpr(t1, rt);
11348         bcond_compute = 1;
11349         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
11350         if (rs <= rt && rs == 0) {
11351             /* OPC_BEQZALC, OPC_BNEZALC */
11352             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
11353         }
11354         break;
11355     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
11356     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
11357         gen_load_gpr(t0, rs);
11358         gen_load_gpr(t1, rt);
11359         bcond_compute = 1;
11360         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
11361         break;
11362     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
11363     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
11364         if (rs == 0 || rs == rt) {
11365             /* OPC_BLEZALC, OPC_BGEZALC */
11366             /* OPC_BGTZALC, OPC_BLTZALC */
11367             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
11368         }
11369         gen_load_gpr(t0, rs);
11370         gen_load_gpr(t1, rt);
11371         bcond_compute = 1;
11372         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
11373         break;
11374     case OPC_BC:
11375     case OPC_BALC:
11376         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
11377         break;
11378     case OPC_BEQZC:
11379     case OPC_BNEZC:
11380         if (rs != 0) {
11381             /* OPC_BEQZC, OPC_BNEZC */
11382             gen_load_gpr(t0, rs);
11383             bcond_compute = 1;
11384             ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
11385         } else {
11386             /* OPC_JIC, OPC_JIALC */
11387             TCGv tbase = tcg_temp_new();
11388             TCGv toffset = tcg_temp_new();
11389
11390             gen_load_gpr(tbase, rt);
11391             tcg_gen_movi_tl(toffset, offset);
11392             gen_op_addr_add(ctx, btarget, tbase, toffset);
11393             tcg_temp_free(tbase);
11394             tcg_temp_free(toffset);
11395         }
11396         break;
11397     default:
11398         MIPS_INVAL("Compact branch/jump");
11399         generate_exception_end(ctx, EXCP_RI);
11400         goto out;
11401     }
11402
11403     if (bcond_compute == 0) {
11404         /* Uncoditional compact branch */
11405         switch (opc) {
11406         case OPC_JIALC:
11407             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
11408             /* Fallthrough */
11409         case OPC_JIC:
11410             ctx->hflags |= MIPS_HFLAG_BR;
11411             break;
11412         case OPC_BALC:
11413             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
11414             /* Fallthrough */
11415         case OPC_BC:
11416             ctx->hflags |= MIPS_HFLAG_B;
11417             break;
11418         default:
11419             MIPS_INVAL("Compact branch/jump");
11420             generate_exception_end(ctx, EXCP_RI);
11421             goto out;
11422         }
11423
11424         /* Generating branch here as compact branches don't have delay slot */
11425         gen_branch(ctx, 4);
11426     } else {
11427         /* Conditional compact branch */
11428         TCGLabel *fs = gen_new_label();
11429         save_cpu_state(ctx, 0);
11430
11431         switch (opc) {
11432         case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
11433             if (rs == 0 && rt != 0) {
11434                 /* OPC_BLEZALC */
11435                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
11436             } else if (rs != 0 && rt != 0 && rs == rt) {
11437                 /* OPC_BGEZALC */
11438                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
11439             } else {
11440                 /* OPC_BGEUC */
11441                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GEU), t0, t1, fs);
11442             }
11443             break;
11444         case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
11445             if (rs == 0 && rt != 0) {
11446                 /* OPC_BGTZALC */
11447                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
11448             } else if (rs != 0 && rt != 0 && rs == rt) {
11449                 /* OPC_BLTZALC */
11450                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
11451             } else {
11452                 /* OPC_BLTUC */
11453                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LTU), t0, t1, fs);
11454             }
11455             break;
11456         case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
11457             if (rs == 0 && rt != 0) {
11458                 /* OPC_BLEZC */
11459                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
11460             } else if (rs != 0 && rt != 0 && rs == rt) {
11461                 /* OPC_BGEZC */
11462                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
11463             } else {
11464                 /* OPC_BGEC */
11465                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GE), t0, t1, fs);
11466             }
11467             break;
11468         case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
11469             if (rs == 0 && rt != 0) {
11470                 /* OPC_BGTZC */
11471                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
11472             } else if (rs != 0 && rt != 0 && rs == rt) {
11473                 /* OPC_BLTZC */
11474                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
11475             } else {
11476                 /* OPC_BLTC */
11477                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LT), t0, t1, fs);
11478             }
11479             break;
11480         case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
11481         case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
11482             if (rs >= rt) {
11483                 /* OPC_BOVC, OPC_BNVC */
11484                 TCGv t2 = tcg_temp_new();
11485                 TCGv t3 = tcg_temp_new();
11486                 TCGv t4 = tcg_temp_new();
11487                 TCGv input_overflow = tcg_temp_new();
11488
11489                 gen_load_gpr(t0, rs);
11490                 gen_load_gpr(t1, rt);
11491                 tcg_gen_ext32s_tl(t2, t0);
11492                 tcg_gen_setcond_tl(TCG_COND_NE, input_overflow, t2, t0);
11493                 tcg_gen_ext32s_tl(t3, t1);
11494                 tcg_gen_setcond_tl(TCG_COND_NE, t4, t3, t1);
11495                 tcg_gen_or_tl(input_overflow, input_overflow, t4);
11496
11497                 tcg_gen_add_tl(t4, t2, t3);
11498                 tcg_gen_ext32s_tl(t4, t4);
11499                 tcg_gen_xor_tl(t2, t2, t3);
11500                 tcg_gen_xor_tl(t3, t4, t3);
11501                 tcg_gen_andc_tl(t2, t3, t2);
11502                 tcg_gen_setcondi_tl(TCG_COND_LT, t4, t2, 0);
11503                 tcg_gen_or_tl(t4, t4, input_overflow);
11504                 if (opc == OPC_BOVC) {
11505                     /* OPC_BOVC */
11506                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t4, 0, fs);
11507                 } else {
11508                     /* OPC_BNVC */
11509                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t4, 0, fs);
11510                 }
11511                 tcg_temp_free(input_overflow);
11512                 tcg_temp_free(t4);
11513                 tcg_temp_free(t3);
11514                 tcg_temp_free(t2);
11515             } else if (rs < rt && rs == 0) {
11516                 /* OPC_BEQZALC, OPC_BNEZALC */
11517                 if (opc == OPC_BEQZALC) {
11518                     /* OPC_BEQZALC */
11519                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t1, 0, fs);
11520                 } else {
11521                     /* OPC_BNEZALC */
11522                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t1, 0, fs);
11523                 }
11524             } else {
11525                 /* OPC_BEQC, OPC_BNEC */
11526                 if (opc == OPC_BEQC) {
11527                     /* OPC_BEQC */
11528                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_EQ), t0, t1, fs);
11529                 } else {
11530                     /* OPC_BNEC */
11531                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_NE), t0, t1, fs);
11532                 }
11533             }
11534             break;
11535         case OPC_BEQZC:
11536             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t0, 0, fs);
11537             break;
11538         case OPC_BNEZC:
11539             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t0, 0, fs);
11540             break;
11541         default:
11542             MIPS_INVAL("Compact conditional branch/jump");
11543             generate_exception_end(ctx, EXCP_RI);
11544             goto out;
11545         }
11546
11547         /* Generating branch here as compact branches don't have delay slot */
11548         gen_goto_tb(ctx, 1, ctx->btarget);
11549         gen_set_label(fs);
11550
11551         ctx->hflags |= MIPS_HFLAG_FBNSLOT;
11552     }
11553
11554 out:
11555     tcg_temp_free(t0);
11556     tcg_temp_free(t1);
11557 }
11558
11559 /* ISA extensions (ASEs) */
11560 /* MIPS16 extension to MIPS32 */
11561
11562 /* MIPS16 major opcodes */
11563 enum {
11564   M16_OPC_ADDIUSP = 0x00,
11565   M16_OPC_ADDIUPC = 0x01,
11566   M16_OPC_B = 0x02,
11567   M16_OPC_JAL = 0x03,
11568   M16_OPC_BEQZ = 0x04,
11569   M16_OPC_BNEQZ = 0x05,
11570   M16_OPC_SHIFT = 0x06,
11571   M16_OPC_LD = 0x07,
11572   M16_OPC_RRIA = 0x08,
11573   M16_OPC_ADDIU8 = 0x09,
11574   M16_OPC_SLTI = 0x0a,
11575   M16_OPC_SLTIU = 0x0b,
11576   M16_OPC_I8 = 0x0c,
11577   M16_OPC_LI = 0x0d,
11578   M16_OPC_CMPI = 0x0e,
11579   M16_OPC_SD = 0x0f,
11580   M16_OPC_LB = 0x10,
11581   M16_OPC_LH = 0x11,
11582   M16_OPC_LWSP = 0x12,
11583   M16_OPC_LW = 0x13,
11584   M16_OPC_LBU = 0x14,
11585   M16_OPC_LHU = 0x15,
11586   M16_OPC_LWPC = 0x16,
11587   M16_OPC_LWU = 0x17,
11588   M16_OPC_SB = 0x18,
11589   M16_OPC_SH = 0x19,
11590   M16_OPC_SWSP = 0x1a,
11591   M16_OPC_SW = 0x1b,
11592   M16_OPC_RRR = 0x1c,
11593   M16_OPC_RR = 0x1d,
11594   M16_OPC_EXTEND = 0x1e,
11595   M16_OPC_I64 = 0x1f
11596 };
11597
11598 /* I8 funct field */
11599 enum {
11600   I8_BTEQZ = 0x0,
11601   I8_BTNEZ = 0x1,
11602   I8_SWRASP = 0x2,
11603   I8_ADJSP = 0x3,
11604   I8_SVRS = 0x4,
11605   I8_MOV32R = 0x5,
11606   I8_MOVR32 = 0x7
11607 };
11608
11609 /* RRR f field */
11610 enum {
11611   RRR_DADDU = 0x0,
11612   RRR_ADDU = 0x1,
11613   RRR_DSUBU = 0x2,
11614   RRR_SUBU = 0x3
11615 };
11616
11617 /* RR funct field */
11618 enum {
11619   RR_JR = 0x00,
11620   RR_SDBBP = 0x01,
11621   RR_SLT = 0x02,
11622   RR_SLTU = 0x03,
11623   RR_SLLV = 0x04,
11624   RR_BREAK = 0x05,
11625   RR_SRLV = 0x06,
11626   RR_SRAV = 0x07,
11627   RR_DSRL = 0x08,
11628   RR_CMP = 0x0a,
11629   RR_NEG = 0x0b,
11630   RR_AND = 0x0c,
11631   RR_OR = 0x0d,
11632   RR_XOR = 0x0e,
11633   RR_NOT = 0x0f,
11634   RR_MFHI = 0x10,
11635   RR_CNVT = 0x11,
11636   RR_MFLO = 0x12,
11637   RR_DSRA = 0x13,
11638   RR_DSLLV = 0x14,
11639   RR_DSRLV = 0x16,
11640   RR_DSRAV = 0x17,
11641   RR_MULT = 0x18,
11642   RR_MULTU = 0x19,
11643   RR_DIV = 0x1a,
11644   RR_DIVU = 0x1b,
11645   RR_DMULT = 0x1c,
11646   RR_DMULTU = 0x1d,
11647   RR_DDIV = 0x1e,
11648   RR_DDIVU = 0x1f
11649 };
11650
11651 /* I64 funct field */
11652 enum {
11653   I64_LDSP = 0x0,
11654   I64_SDSP = 0x1,
11655   I64_SDRASP = 0x2,
11656   I64_DADJSP = 0x3,
11657   I64_LDPC = 0x4,
11658   I64_DADDIU5 = 0x5,
11659   I64_DADDIUPC = 0x6,
11660   I64_DADDIUSP = 0x7
11661 };
11662
11663 /* RR ry field for CNVT */
11664 enum {
11665   RR_RY_CNVT_ZEB = 0x0,
11666   RR_RY_CNVT_ZEH = 0x1,
11667   RR_RY_CNVT_ZEW = 0x2,
11668   RR_RY_CNVT_SEB = 0x4,
11669   RR_RY_CNVT_SEH = 0x5,
11670   RR_RY_CNVT_SEW = 0x6,
11671 };
11672
11673 static int xlat (int r)
11674 {
11675   static int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
11676
11677   return map[r];
11678 }
11679
11680 static void gen_mips16_save (DisasContext *ctx,
11681                              int xsregs, int aregs,
11682                              int do_ra, int do_s0, int do_s1,
11683                              int framesize)
11684 {
11685     TCGv t0 = tcg_temp_new();
11686     TCGv t1 = tcg_temp_new();
11687     TCGv t2 = tcg_temp_new();
11688     int args, astatic;
11689
11690     switch (aregs) {
11691     case 0:
11692     case 1:
11693     case 2:
11694     case 3:
11695     case 11:
11696         args = 0;
11697         break;
11698     case 4:
11699     case 5:
11700     case 6:
11701     case 7:
11702         args = 1;
11703         break;
11704     case 8:
11705     case 9:
11706     case 10:
11707         args = 2;
11708         break;
11709     case 12:
11710     case 13:
11711         args = 3;
11712         break;
11713     case 14:
11714         args = 4;
11715         break;
11716     default:
11717         generate_exception_end(ctx, EXCP_RI);
11718         return;
11719     }
11720
11721     switch (args) {
11722     case 4:
11723         gen_base_offset_addr(ctx, t0, 29, 12);
11724         gen_load_gpr(t1, 7);
11725         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
11726         /* Fall through */
11727     case 3:
11728         gen_base_offset_addr(ctx, t0, 29, 8);
11729         gen_load_gpr(t1, 6);
11730         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
11731         /* Fall through */
11732     case 2:
11733         gen_base_offset_addr(ctx, t0, 29, 4);
11734         gen_load_gpr(t1, 5);
11735         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
11736         /* Fall through */
11737     case 1:
11738         gen_base_offset_addr(ctx, t0, 29, 0);
11739         gen_load_gpr(t1, 4);
11740         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
11741     }
11742
11743     gen_load_gpr(t0, 29);
11744
11745 #define DECR_AND_STORE(reg) do {                                 \
11746         tcg_gen_movi_tl(t2, -4);                                 \
11747         gen_op_addr_add(ctx, t0, t0, t2);                        \
11748         gen_load_gpr(t1, reg);                                   \
11749         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL); \
11750     } while (0)
11751
11752     if (do_ra) {
11753         DECR_AND_STORE(31);
11754     }
11755
11756     switch (xsregs) {
11757     case 7:
11758         DECR_AND_STORE(30);
11759         /* Fall through */
11760     case 6:
11761         DECR_AND_STORE(23);
11762         /* Fall through */
11763     case 5:
11764         DECR_AND_STORE(22);
11765         /* Fall through */
11766     case 4:
11767         DECR_AND_STORE(21);
11768         /* Fall through */
11769     case 3:
11770         DECR_AND_STORE(20);
11771         /* Fall through */
11772     case 2:
11773         DECR_AND_STORE(19);
11774         /* Fall through */
11775     case 1:
11776         DECR_AND_STORE(18);
11777     }
11778
11779     if (do_s1) {
11780         DECR_AND_STORE(17);
11781     }
11782     if (do_s0) {
11783         DECR_AND_STORE(16);
11784     }
11785
11786     switch (aregs) {
11787     case 0:
11788     case 4:
11789     case 8:
11790     case 12:
11791     case 14:
11792         astatic = 0;
11793         break;
11794     case 1:
11795     case 5:
11796     case 9:
11797     case 13:
11798         astatic = 1;
11799         break;
11800     case 2:
11801     case 6:
11802     case 10:
11803         astatic = 2;
11804         break;
11805     case 3:
11806     case 7:
11807         astatic = 3;
11808         break;
11809     case 11:
11810         astatic = 4;
11811         break;
11812     default:
11813         generate_exception_end(ctx, EXCP_RI);
11814         return;
11815     }
11816
11817     if (astatic > 0) {
11818         DECR_AND_STORE(7);
11819         if (astatic > 1) {
11820             DECR_AND_STORE(6);
11821             if (astatic > 2) {
11822                 DECR_AND_STORE(5);
11823                 if (astatic > 3) {
11824                     DECR_AND_STORE(4);
11825                 }
11826             }
11827         }
11828     }
11829 #undef DECR_AND_STORE
11830
11831     tcg_gen_movi_tl(t2, -framesize);
11832     gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
11833     tcg_temp_free(t0);
11834     tcg_temp_free(t1);
11835     tcg_temp_free(t2);
11836 }
11837
11838 static void gen_mips16_restore (DisasContext *ctx,
11839                                 int xsregs, int aregs,
11840                                 int do_ra, int do_s0, int do_s1,
11841                                 int framesize)
11842 {
11843     int astatic;
11844     TCGv t0 = tcg_temp_new();
11845     TCGv t1 = tcg_temp_new();
11846     TCGv t2 = tcg_temp_new();
11847
11848     tcg_gen_movi_tl(t2, framesize);
11849     gen_op_addr_add(ctx, t0, cpu_gpr[29], t2);
11850
11851 #define DECR_AND_LOAD(reg) do {                            \
11852         tcg_gen_movi_tl(t2, -4);                           \
11853         gen_op_addr_add(ctx, t0, t0, t2);                  \
11854         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL); \
11855         gen_store_gpr(t1, reg);                            \
11856     } while (0)
11857
11858     if (do_ra) {
11859         DECR_AND_LOAD(31);
11860     }
11861
11862     switch (xsregs) {
11863     case 7:
11864         DECR_AND_LOAD(30);
11865         /* Fall through */
11866     case 6:
11867         DECR_AND_LOAD(23);
11868         /* Fall through */
11869     case 5:
11870         DECR_AND_LOAD(22);
11871         /* Fall through */
11872     case 4:
11873         DECR_AND_LOAD(21);
11874         /* Fall through */
11875     case 3:
11876         DECR_AND_LOAD(20);
11877         /* Fall through */
11878     case 2:
11879         DECR_AND_LOAD(19);
11880         /* Fall through */
11881     case 1:
11882         DECR_AND_LOAD(18);
11883     }
11884
11885     if (do_s1) {
11886         DECR_AND_LOAD(17);
11887     }
11888     if (do_s0) {
11889         DECR_AND_LOAD(16);
11890     }
11891
11892     switch (aregs) {
11893     case 0:
11894     case 4:
11895     case 8:
11896     case 12:
11897     case 14:
11898         astatic = 0;
11899         break;
11900     case 1:
11901     case 5:
11902     case 9:
11903     case 13:
11904         astatic = 1;
11905         break;
11906     case 2:
11907     case 6:
11908     case 10:
11909         astatic = 2;
11910         break;
11911     case 3:
11912     case 7:
11913         astatic = 3;
11914         break;
11915     case 11:
11916         astatic = 4;
11917         break;
11918     default:
11919         generate_exception_end(ctx, EXCP_RI);
11920         return;
11921     }
11922
11923     if (astatic > 0) {
11924         DECR_AND_LOAD(7);
11925         if (astatic > 1) {
11926             DECR_AND_LOAD(6);
11927             if (astatic > 2) {
11928                 DECR_AND_LOAD(5);
11929                 if (astatic > 3) {
11930                     DECR_AND_LOAD(4);
11931                 }
11932             }
11933         }
11934     }
11935 #undef DECR_AND_LOAD
11936
11937     tcg_gen_movi_tl(t2, framesize);
11938     gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
11939     tcg_temp_free(t0);
11940     tcg_temp_free(t1);
11941     tcg_temp_free(t2);
11942 }
11943
11944 static void gen_addiupc (DisasContext *ctx, int rx, int imm,
11945                          int is_64_bit, int extended)
11946 {
11947     TCGv t0;
11948
11949     if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
11950         generate_exception_end(ctx, EXCP_RI);
11951         return;
11952     }
11953
11954     t0 = tcg_temp_new();
11955
11956     tcg_gen_movi_tl(t0, pc_relative_pc(ctx));
11957     tcg_gen_addi_tl(cpu_gpr[rx], t0, imm);
11958     if (!is_64_bit) {
11959         tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
11960     }
11961
11962     tcg_temp_free(t0);
11963 }
11964
11965 static void gen_cache_operation(DisasContext *ctx, uint32_t op, int base,
11966                                 int16_t offset)
11967 {
11968     TCGv_i32 t0 = tcg_const_i32(op);
11969     TCGv t1 = tcg_temp_new();
11970     gen_base_offset_addr(ctx, t1, base, offset);
11971     gen_helper_cache(cpu_env, t1, t0);
11972 }
11973
11974 #if defined(TARGET_MIPS64)
11975 static void decode_i64_mips16 (DisasContext *ctx,
11976                                int ry, int funct, int16_t offset,
11977                                int extended)
11978 {
11979     switch (funct) {
11980     case I64_LDSP:
11981         check_insn(ctx, ISA_MIPS3);
11982         check_mips_64(ctx);
11983         offset = extended ? offset : offset << 3;
11984         gen_ld(ctx, OPC_LD, ry, 29, offset);
11985         break;
11986     case I64_SDSP:
11987         check_insn(ctx, ISA_MIPS3);
11988         check_mips_64(ctx);
11989         offset = extended ? offset : offset << 3;
11990         gen_st(ctx, OPC_SD, ry, 29, offset);
11991         break;
11992     case I64_SDRASP:
11993         check_insn(ctx, ISA_MIPS3);
11994         check_mips_64(ctx);
11995         offset = extended ? offset : (ctx->opcode & 0xff) << 3;
11996         gen_st(ctx, OPC_SD, 31, 29, offset);
11997         break;
11998     case I64_DADJSP:
11999         check_insn(ctx, ISA_MIPS3);
12000         check_mips_64(ctx);
12001         offset = extended ? offset : ((int8_t)ctx->opcode) << 3;
12002         gen_arith_imm(ctx, OPC_DADDIU, 29, 29, offset);
12003         break;
12004     case I64_LDPC:
12005         check_insn(ctx, ISA_MIPS3);
12006         check_mips_64(ctx);
12007         if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
12008             generate_exception_end(ctx, EXCP_RI);
12009         } else {
12010             offset = extended ? offset : offset << 3;
12011             gen_ld(ctx, OPC_LDPC, ry, 0, offset);
12012         }
12013         break;
12014     case I64_DADDIU5:
12015         check_insn(ctx, ISA_MIPS3);
12016         check_mips_64(ctx);
12017         offset = extended ? offset : ((int8_t)(offset << 3)) >> 3;
12018         gen_arith_imm(ctx, OPC_DADDIU, ry, ry, offset);
12019         break;
12020     case I64_DADDIUPC:
12021         check_insn(ctx, ISA_MIPS3);
12022         check_mips_64(ctx);
12023         offset = extended ? offset : offset << 2;
12024         gen_addiupc(ctx, ry, offset, 1, extended);
12025         break;
12026     case I64_DADDIUSP:
12027         check_insn(ctx, ISA_MIPS3);
12028         check_mips_64(ctx);
12029         offset = extended ? offset : offset << 2;
12030         gen_arith_imm(ctx, OPC_DADDIU, ry, 29, offset);
12031         break;
12032     }
12033 }
12034 #endif
12035
12036 static int decode_extended_mips16_opc (CPUMIPSState *env, DisasContext *ctx)
12037 {
12038     int extend = cpu_lduw_code(env, ctx->base.pc_next + 2);
12039     int op, rx, ry, funct, sa;
12040     int16_t imm, offset;
12041
12042     ctx->opcode = (ctx->opcode << 16) | extend;
12043     op = (ctx->opcode >> 11) & 0x1f;
12044     sa = (ctx->opcode >> 22) & 0x1f;
12045     funct = (ctx->opcode >> 8) & 0x7;
12046     rx = xlat((ctx->opcode >> 8) & 0x7);
12047     ry = xlat((ctx->opcode >> 5) & 0x7);
12048     offset = imm = (int16_t) (((ctx->opcode >> 16) & 0x1f) << 11
12049                               | ((ctx->opcode >> 21) & 0x3f) << 5
12050                               | (ctx->opcode & 0x1f));
12051
12052     /* The extended opcodes cleverly reuse the opcodes from their 16-bit
12053        counterparts.  */
12054     switch (op) {
12055     case M16_OPC_ADDIUSP:
12056         gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
12057         break;
12058     case M16_OPC_ADDIUPC:
12059         gen_addiupc(ctx, rx, imm, 0, 1);
12060         break;
12061     case M16_OPC_B:
12062         gen_compute_branch(ctx, OPC_BEQ, 4, 0, 0, offset << 1, 0);
12063         /* No delay slot, so just process as a normal instruction */
12064         break;
12065     case M16_OPC_BEQZ:
12066         gen_compute_branch(ctx, OPC_BEQ, 4, rx, 0, offset << 1, 0);
12067         /* No delay slot, so just process as a normal instruction */
12068         break;
12069     case M16_OPC_BNEQZ:
12070         gen_compute_branch(ctx, OPC_BNE, 4, rx, 0, offset << 1, 0);
12071         /* No delay slot, so just process as a normal instruction */
12072         break;
12073     case M16_OPC_SHIFT:
12074         switch (ctx->opcode & 0x3) {
12075         case 0x0:
12076             gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
12077             break;
12078         case 0x1:
12079 #if defined(TARGET_MIPS64)
12080             check_mips_64(ctx);
12081             gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
12082 #else
12083             generate_exception_end(ctx, EXCP_RI);
12084 #endif
12085             break;
12086         case 0x2:
12087             gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
12088             break;
12089         case 0x3:
12090             gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
12091             break;
12092         }
12093         break;
12094 #if defined(TARGET_MIPS64)
12095     case M16_OPC_LD:
12096         check_insn(ctx, ISA_MIPS3);
12097         check_mips_64(ctx);
12098         gen_ld(ctx, OPC_LD, ry, rx, offset);
12099         break;
12100 #endif
12101     case M16_OPC_RRIA:
12102         imm = ctx->opcode & 0xf;
12103         imm = imm | ((ctx->opcode >> 20) & 0x7f) << 4;
12104         imm = imm | ((ctx->opcode >> 16) & 0xf) << 11;
12105         imm = (int16_t) (imm << 1) >> 1;
12106         if ((ctx->opcode >> 4) & 0x1) {
12107 #if defined(TARGET_MIPS64)
12108             check_mips_64(ctx);
12109             gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
12110 #else
12111             generate_exception_end(ctx, EXCP_RI);
12112 #endif
12113         } else {
12114             gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
12115         }
12116         break;
12117     case M16_OPC_ADDIU8:
12118         gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
12119         break;
12120     case M16_OPC_SLTI:
12121         gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
12122         break;
12123     case M16_OPC_SLTIU:
12124         gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
12125         break;
12126     case M16_OPC_I8:
12127         switch (funct) {
12128         case I8_BTEQZ:
12129             gen_compute_branch(ctx, OPC_BEQ, 4, 24, 0, offset << 1, 0);
12130             break;
12131         case I8_BTNEZ:
12132             gen_compute_branch(ctx, OPC_BNE, 4, 24, 0, offset << 1, 0);
12133             break;
12134         case I8_SWRASP:
12135             gen_st(ctx, OPC_SW, 31, 29, imm);
12136             break;
12137         case I8_ADJSP:
12138             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm);
12139             break;
12140         case I8_SVRS:
12141             check_insn(ctx, ISA_MIPS32);
12142             {
12143                 int xsregs = (ctx->opcode >> 24) & 0x7;
12144                 int aregs = (ctx->opcode >> 16) & 0xf;
12145                 int do_ra = (ctx->opcode >> 6) & 0x1;
12146                 int do_s0 = (ctx->opcode >> 5) & 0x1;
12147                 int do_s1 = (ctx->opcode >> 4) & 0x1;
12148                 int framesize = (((ctx->opcode >> 20) & 0xf) << 4
12149                                  | (ctx->opcode & 0xf)) << 3;
12150
12151                 if (ctx->opcode & (1 << 7)) {
12152                     gen_mips16_save(ctx, xsregs, aregs,
12153                                     do_ra, do_s0, do_s1,
12154                                     framesize);
12155                 } else {
12156                     gen_mips16_restore(ctx, xsregs, aregs,
12157                                        do_ra, do_s0, do_s1,
12158                                        framesize);
12159                 }
12160             }
12161             break;
12162         default:
12163             generate_exception_end(ctx, EXCP_RI);
12164             break;
12165         }
12166         break;
12167     case M16_OPC_LI:
12168         tcg_gen_movi_tl(cpu_gpr[rx], (uint16_t) imm);
12169         break;
12170     case M16_OPC_CMPI:
12171         tcg_gen_xori_tl(cpu_gpr[24], cpu_gpr[rx], (uint16_t) imm);
12172         break;
12173 #if defined(TARGET_MIPS64)
12174     case M16_OPC_SD:
12175         check_insn(ctx, ISA_MIPS3);
12176         check_mips_64(ctx);
12177         gen_st(ctx, OPC_SD, ry, rx, offset);
12178         break;
12179 #endif
12180     case M16_OPC_LB:
12181         gen_ld(ctx, OPC_LB, ry, rx, offset);
12182         break;
12183     case M16_OPC_LH:
12184         gen_ld(ctx, OPC_LH, ry, rx, offset);
12185         break;
12186     case M16_OPC_LWSP:
12187         gen_ld(ctx, OPC_LW, rx, 29, offset);
12188         break;
12189     case M16_OPC_LW:
12190         gen_ld(ctx, OPC_LW, ry, rx, offset);
12191         break;
12192     case M16_OPC_LBU:
12193         gen_ld(ctx, OPC_LBU, ry, rx, offset);
12194         break;
12195     case M16_OPC_LHU:
12196         gen_ld(ctx, OPC_LHU, ry, rx, offset);
12197         break;
12198     case M16_OPC_LWPC:
12199         gen_ld(ctx, OPC_LWPC, rx, 0, offset);
12200         break;
12201 #if defined(TARGET_MIPS64)
12202     case M16_OPC_LWU:
12203         check_insn(ctx, ISA_MIPS3);
12204         check_mips_64(ctx);
12205         gen_ld(ctx, OPC_LWU, ry, rx, offset);
12206         break;
12207 #endif
12208     case M16_OPC_SB:
12209         gen_st(ctx, OPC_SB, ry, rx, offset);
12210         break;
12211     case M16_OPC_SH:
12212         gen_st(ctx, OPC_SH, ry, rx, offset);
12213         break;
12214     case M16_OPC_SWSP:
12215         gen_st(ctx, OPC_SW, rx, 29, offset);
12216         break;
12217     case M16_OPC_SW:
12218         gen_st(ctx, OPC_SW, ry, rx, offset);
12219         break;
12220 #if defined(TARGET_MIPS64)
12221     case M16_OPC_I64:
12222         decode_i64_mips16(ctx, ry, funct, offset, 1);
12223         break;
12224 #endif
12225     default:
12226         generate_exception_end(ctx, EXCP_RI);
12227         break;
12228     }
12229
12230     return 4;
12231 }
12232
12233 static inline bool is_uhi(int sdbbp_code)
12234 {
12235 #ifdef CONFIG_USER_ONLY
12236     return false;
12237 #else
12238     return semihosting_enabled() && sdbbp_code == 1;
12239 #endif
12240 }
12241
12242 static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx)
12243 {
12244     int rx, ry;
12245     int sa;
12246     int op, cnvt_op, op1, offset;
12247     int funct;
12248     int n_bytes;
12249
12250     op = (ctx->opcode >> 11) & 0x1f;
12251     sa = (ctx->opcode >> 2) & 0x7;
12252     sa = sa == 0 ? 8 : sa;
12253     rx = xlat((ctx->opcode >> 8) & 0x7);
12254     cnvt_op = (ctx->opcode >> 5) & 0x7;
12255     ry = xlat((ctx->opcode >> 5) & 0x7);
12256     op1 = offset = ctx->opcode & 0x1f;
12257
12258     n_bytes = 2;
12259
12260     switch (op) {
12261     case M16_OPC_ADDIUSP:
12262         {
12263             int16_t imm = ((uint8_t) ctx->opcode) << 2;
12264
12265             gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
12266         }
12267         break;
12268     case M16_OPC_ADDIUPC:
12269         gen_addiupc(ctx, rx, ((uint8_t) ctx->opcode) << 2, 0, 0);
12270         break;
12271     case M16_OPC_B:
12272         offset = (ctx->opcode & 0x7ff) << 1;
12273         offset = (int16_t)(offset << 4) >> 4;
12274         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0, offset, 0);
12275         /* No delay slot, so just process as a normal instruction */
12276         break;
12277     case M16_OPC_JAL:
12278         offset = cpu_lduw_code(env, ctx->base.pc_next + 2);
12279         offset = (((ctx->opcode & 0x1f) << 21)
12280                   | ((ctx->opcode >> 5) & 0x1f) << 16
12281                   | offset) << 2;
12282         op = ((ctx->opcode >> 10) & 0x1) ? OPC_JALX : OPC_JAL;
12283         gen_compute_branch(ctx, op, 4, rx, ry, offset, 2);
12284         n_bytes = 4;
12285         break;
12286     case M16_OPC_BEQZ:
12287         gen_compute_branch(ctx, OPC_BEQ, 2, rx, 0,
12288                            ((int8_t)ctx->opcode) << 1, 0);
12289         /* No delay slot, so just process as a normal instruction */
12290         break;
12291     case M16_OPC_BNEQZ:
12292         gen_compute_branch(ctx, OPC_BNE, 2, rx, 0,
12293                            ((int8_t)ctx->opcode) << 1, 0);
12294         /* No delay slot, so just process as a normal instruction */
12295         break;
12296     case M16_OPC_SHIFT:
12297         switch (ctx->opcode & 0x3) {
12298         case 0x0:
12299             gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
12300             break;
12301         case 0x1:
12302 #if defined(TARGET_MIPS64)
12303             check_insn(ctx, ISA_MIPS3);
12304             check_mips_64(ctx);
12305             gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
12306 #else
12307             generate_exception_end(ctx, EXCP_RI);
12308 #endif
12309             break;
12310         case 0x2:
12311             gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
12312             break;
12313         case 0x3:
12314             gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
12315             break;
12316         }
12317         break;
12318 #if defined(TARGET_MIPS64)
12319     case M16_OPC_LD:
12320         check_insn(ctx, ISA_MIPS3);
12321         check_mips_64(ctx);
12322         gen_ld(ctx, OPC_LD, ry, rx, offset << 3);
12323         break;
12324 #endif
12325     case M16_OPC_RRIA:
12326         {
12327             int16_t imm = (int8_t)((ctx->opcode & 0xf) << 4) >> 4;
12328
12329             if ((ctx->opcode >> 4) & 1) {
12330 #if defined(TARGET_MIPS64)
12331                 check_insn(ctx, ISA_MIPS3);
12332                 check_mips_64(ctx);
12333                 gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
12334 #else
12335                 generate_exception_end(ctx, EXCP_RI);
12336 #endif
12337             } else {
12338                 gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
12339             }
12340         }
12341         break;
12342     case M16_OPC_ADDIU8:
12343         {
12344             int16_t imm = (int8_t) ctx->opcode;
12345
12346             gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
12347         }
12348         break;
12349     case M16_OPC_SLTI:
12350         {
12351             int16_t imm = (uint8_t) ctx->opcode;
12352             gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
12353         }
12354         break;
12355     case M16_OPC_SLTIU:
12356         {
12357             int16_t imm = (uint8_t) ctx->opcode;
12358             gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
12359         }
12360         break;
12361     case M16_OPC_I8:
12362         {
12363             int reg32;
12364
12365             funct = (ctx->opcode >> 8) & 0x7;
12366             switch (funct) {
12367             case I8_BTEQZ:
12368                 gen_compute_branch(ctx, OPC_BEQ, 2, 24, 0,
12369                                    ((int8_t)ctx->opcode) << 1, 0);
12370                 break;
12371             case I8_BTNEZ:
12372                 gen_compute_branch(ctx, OPC_BNE, 2, 24, 0,
12373                                    ((int8_t)ctx->opcode) << 1, 0);
12374                 break;
12375             case I8_SWRASP:
12376                 gen_st(ctx, OPC_SW, 31, 29, (ctx->opcode & 0xff) << 2);
12377                 break;
12378             case I8_ADJSP:
12379                 gen_arith_imm(ctx, OPC_ADDIU, 29, 29,
12380                               ((int8_t)ctx->opcode) << 3);
12381                 break;
12382             case I8_SVRS:
12383                 check_insn(ctx, ISA_MIPS32);
12384                 {
12385                     int do_ra = ctx->opcode & (1 << 6);
12386                     int do_s0 = ctx->opcode & (1 << 5);
12387                     int do_s1 = ctx->opcode & (1 << 4);
12388                     int framesize = ctx->opcode & 0xf;
12389
12390                     if (framesize == 0) {
12391                         framesize = 128;
12392                     } else {
12393                         framesize = framesize << 3;
12394                     }
12395
12396                     if (ctx->opcode & (1 << 7)) {
12397                         gen_mips16_save(ctx, 0, 0,
12398                                         do_ra, do_s0, do_s1, framesize);
12399                     } else {
12400                         gen_mips16_restore(ctx, 0, 0,
12401                                            do_ra, do_s0, do_s1, framesize);
12402                     }
12403                 }
12404                 break;
12405             case I8_MOV32R:
12406                 {
12407                     int rz = xlat(ctx->opcode & 0x7);
12408
12409                     reg32 = (((ctx->opcode >> 3) & 0x3) << 3) |
12410                         ((ctx->opcode >> 5) & 0x7);
12411                     gen_arith(ctx, OPC_ADDU, reg32, rz, 0);
12412                 }
12413                 break;
12414             case I8_MOVR32:
12415                 reg32 = ctx->opcode & 0x1f;
12416                 gen_arith(ctx, OPC_ADDU, ry, reg32, 0);
12417                 break;
12418             default:
12419                 generate_exception_end(ctx, EXCP_RI);
12420                 break;
12421             }
12422         }
12423         break;
12424     case M16_OPC_LI:
12425         {
12426             int16_t imm = (uint8_t) ctx->opcode;
12427
12428             gen_arith_imm(ctx, OPC_ADDIU, rx, 0, imm);
12429         }
12430         break;
12431     case M16_OPC_CMPI:
12432         {
12433             int16_t imm = (uint8_t) ctx->opcode;
12434             gen_logic_imm(ctx, OPC_XORI, 24, rx, imm);
12435         }
12436         break;
12437 #if defined(TARGET_MIPS64)
12438     case M16_OPC_SD:
12439         check_insn(ctx, ISA_MIPS3);
12440         check_mips_64(ctx);
12441         gen_st(ctx, OPC_SD, ry, rx, offset << 3);
12442         break;
12443 #endif
12444     case M16_OPC_LB:
12445         gen_ld(ctx, OPC_LB, ry, rx, offset);
12446         break;
12447     case M16_OPC_LH:
12448         gen_ld(ctx, OPC_LH, ry, rx, offset << 1);
12449         break;
12450     case M16_OPC_LWSP:
12451         gen_ld(ctx, OPC_LW, rx, 29, ((uint8_t)ctx->opcode) << 2);
12452         break;
12453     case M16_OPC_LW:
12454         gen_ld(ctx, OPC_LW, ry, rx, offset << 2);
12455         break;
12456     case M16_OPC_LBU:
12457         gen_ld(ctx, OPC_LBU, ry, rx, offset);
12458         break;
12459     case M16_OPC_LHU:
12460         gen_ld(ctx, OPC_LHU, ry, rx, offset << 1);
12461         break;
12462     case M16_OPC_LWPC:
12463         gen_ld(ctx, OPC_LWPC, rx, 0, ((uint8_t)ctx->opcode) << 2);
12464         break;
12465 #if defined (TARGET_MIPS64)
12466     case M16_OPC_LWU:
12467         check_insn(ctx, ISA_MIPS3);
12468         check_mips_64(ctx);
12469         gen_ld(ctx, OPC_LWU, ry, rx, offset << 2);
12470         break;
12471 #endif
12472     case M16_OPC_SB:
12473         gen_st(ctx, OPC_SB, ry, rx, offset);
12474         break;
12475     case M16_OPC_SH:
12476         gen_st(ctx, OPC_SH, ry, rx, offset << 1);
12477         break;
12478     case M16_OPC_SWSP:
12479         gen_st(ctx, OPC_SW, rx, 29, ((uint8_t)ctx->opcode) << 2);
12480         break;
12481     case M16_OPC_SW:
12482         gen_st(ctx, OPC_SW, ry, rx, offset << 2);
12483         break;
12484     case M16_OPC_RRR:
12485         {
12486             int rz = xlat((ctx->opcode >> 2) & 0x7);
12487             int mips32_op;
12488
12489             switch (ctx->opcode & 0x3) {
12490             case RRR_ADDU:
12491                 mips32_op = OPC_ADDU;
12492                 break;
12493             case RRR_SUBU:
12494                 mips32_op = OPC_SUBU;
12495                 break;
12496 #if defined(TARGET_MIPS64)
12497             case RRR_DADDU:
12498                 mips32_op = OPC_DADDU;
12499                 check_insn(ctx, ISA_MIPS3);
12500                 check_mips_64(ctx);
12501                 break;
12502             case RRR_DSUBU:
12503                 mips32_op = OPC_DSUBU;
12504                 check_insn(ctx, ISA_MIPS3);
12505                 check_mips_64(ctx);
12506                 break;
12507 #endif
12508             default:
12509                 generate_exception_end(ctx, EXCP_RI);
12510                 goto done;
12511             }
12512
12513             gen_arith(ctx, mips32_op, rz, rx, ry);
12514         done:
12515             ;
12516         }
12517         break;
12518     case M16_OPC_RR:
12519         switch (op1) {
12520         case RR_JR:
12521             {
12522                 int nd = (ctx->opcode >> 7) & 0x1;
12523                 int link = (ctx->opcode >> 6) & 0x1;
12524                 int ra = (ctx->opcode >> 5) & 0x1;
12525
12526                 if (nd) {
12527                     check_insn(ctx, ISA_MIPS32);
12528                 }
12529
12530                 if (link) {
12531                     op = OPC_JALR;
12532                 } else {
12533                     op = OPC_JR;
12534                 }
12535
12536                 gen_compute_branch(ctx, op, 2, ra ? 31 : rx, 31, 0,
12537                                    (nd ? 0 : 2));
12538             }
12539             break;
12540         case RR_SDBBP:
12541             if (is_uhi(extract32(ctx->opcode, 5, 6))) {
12542                 gen_helper_do_semihosting(cpu_env);
12543             } else {
12544                 /* XXX: not clear which exception should be raised
12545                  *      when in debug mode...
12546                  */
12547                 check_insn(ctx, ISA_MIPS32);
12548                 generate_exception_end(ctx, EXCP_DBp);
12549             }
12550             break;
12551         case RR_SLT:
12552             gen_slt(ctx, OPC_SLT, 24, rx, ry);
12553             break;
12554         case RR_SLTU:
12555             gen_slt(ctx, OPC_SLTU, 24, rx, ry);
12556             break;
12557         case RR_BREAK:
12558             generate_exception_end(ctx, EXCP_BREAK);
12559             break;
12560         case RR_SLLV:
12561             gen_shift(ctx, OPC_SLLV, ry, rx, ry);
12562             break;
12563         case RR_SRLV:
12564             gen_shift(ctx, OPC_SRLV, ry, rx, ry);
12565             break;
12566         case RR_SRAV:
12567             gen_shift(ctx, OPC_SRAV, ry, rx, ry);
12568             break;
12569 #if defined (TARGET_MIPS64)
12570         case RR_DSRL:
12571             check_insn(ctx, ISA_MIPS3);
12572             check_mips_64(ctx);
12573             gen_shift_imm(ctx, OPC_DSRL, ry, ry, sa);
12574             break;
12575 #endif
12576         case RR_CMP:
12577             gen_logic(ctx, OPC_XOR, 24, rx, ry);
12578             break;
12579         case RR_NEG:
12580             gen_arith(ctx, OPC_SUBU, rx, 0, ry);
12581             break;
12582         case RR_AND:
12583             gen_logic(ctx, OPC_AND, rx, rx, ry);
12584             break;
12585         case RR_OR:
12586             gen_logic(ctx, OPC_OR, rx, rx, ry);
12587             break;
12588         case RR_XOR:
12589             gen_logic(ctx, OPC_XOR, rx, rx, ry);
12590             break;
12591         case RR_NOT:
12592             gen_logic(ctx, OPC_NOR, rx, ry, 0);
12593             break;
12594         case RR_MFHI:
12595             gen_HILO(ctx, OPC_MFHI, 0, rx);
12596             break;
12597         case RR_CNVT:
12598             check_insn(ctx, ISA_MIPS32);
12599             switch (cnvt_op) {
12600             case RR_RY_CNVT_ZEB:
12601                 tcg_gen_ext8u_tl(cpu_gpr[rx], cpu_gpr[rx]);
12602                 break;
12603             case RR_RY_CNVT_ZEH:
12604                 tcg_gen_ext16u_tl(cpu_gpr[rx], cpu_gpr[rx]);
12605                 break;
12606             case RR_RY_CNVT_SEB:
12607                 tcg_gen_ext8s_tl(cpu_gpr[rx], cpu_gpr[rx]);
12608                 break;
12609             case RR_RY_CNVT_SEH:
12610                 tcg_gen_ext16s_tl(cpu_gpr[rx], cpu_gpr[rx]);
12611                 break;
12612 #if defined (TARGET_MIPS64)
12613             case RR_RY_CNVT_ZEW:
12614                 check_insn(ctx, ISA_MIPS64);
12615                 check_mips_64(ctx);
12616                 tcg_gen_ext32u_tl(cpu_gpr[rx], cpu_gpr[rx]);
12617                 break;
12618             case RR_RY_CNVT_SEW:
12619                 check_insn(ctx, ISA_MIPS64);
12620                 check_mips_64(ctx);
12621                 tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
12622                 break;
12623 #endif
12624             default:
12625                 generate_exception_end(ctx, EXCP_RI);
12626                 break;
12627             }
12628             break;
12629         case RR_MFLO:
12630             gen_HILO(ctx, OPC_MFLO, 0, rx);
12631             break;
12632 #if defined (TARGET_MIPS64)
12633         case RR_DSRA:
12634             check_insn(ctx, ISA_MIPS3);
12635             check_mips_64(ctx);
12636             gen_shift_imm(ctx, OPC_DSRA, ry, ry, sa);
12637             break;
12638         case RR_DSLLV:
12639             check_insn(ctx, ISA_MIPS3);
12640             check_mips_64(ctx);
12641             gen_shift(ctx, OPC_DSLLV, ry, rx, ry);
12642             break;
12643         case RR_DSRLV:
12644             check_insn(ctx, ISA_MIPS3);
12645             check_mips_64(ctx);
12646             gen_shift(ctx, OPC_DSRLV, ry, rx, ry);
12647             break;
12648         case RR_DSRAV:
12649             check_insn(ctx, ISA_MIPS3);
12650             check_mips_64(ctx);
12651             gen_shift(ctx, OPC_DSRAV, ry, rx, ry);
12652             break;
12653 #endif
12654         case RR_MULT:
12655             gen_muldiv(ctx, OPC_MULT, 0, rx, ry);
12656             break;
12657         case RR_MULTU:
12658             gen_muldiv(ctx, OPC_MULTU, 0, rx, ry);
12659             break;
12660         case RR_DIV:
12661             gen_muldiv(ctx, OPC_DIV, 0, rx, ry);
12662             break;
12663         case RR_DIVU:
12664             gen_muldiv(ctx, OPC_DIVU, 0, rx, ry);
12665             break;
12666 #if defined (TARGET_MIPS64)
12667         case RR_DMULT:
12668             check_insn(ctx, ISA_MIPS3);
12669             check_mips_64(ctx);
12670             gen_muldiv(ctx, OPC_DMULT, 0, rx, ry);
12671             break;
12672         case RR_DMULTU:
12673             check_insn(ctx, ISA_MIPS3);
12674             check_mips_64(ctx);
12675             gen_muldiv(ctx, OPC_DMULTU, 0, rx, ry);
12676             break;
12677         case RR_DDIV:
12678             check_insn(ctx, ISA_MIPS3);
12679             check_mips_64(ctx);
12680             gen_muldiv(ctx, OPC_DDIV, 0, rx, ry);
12681             break;
12682         case RR_DDIVU:
12683             check_insn(ctx, ISA_MIPS3);
12684             check_mips_64(ctx);
12685             gen_muldiv(ctx, OPC_DDIVU, 0, rx, ry);
12686             break;
12687 #endif
12688         default:
12689             generate_exception_end(ctx, EXCP_RI);
12690             break;
12691         }
12692         break;
12693     case M16_OPC_EXTEND:
12694         decode_extended_mips16_opc(env, ctx);
12695         n_bytes = 4;
12696         break;
12697 #if defined(TARGET_MIPS64)
12698     case M16_OPC_I64:
12699         funct = (ctx->opcode >> 8) & 0x7;
12700         decode_i64_mips16(ctx, ry, funct, offset, 0);
12701         break;
12702 #endif
12703     default:
12704         generate_exception_end(ctx, EXCP_RI);
12705         break;
12706     }
12707
12708     return n_bytes;
12709 }
12710
12711 /* microMIPS extension to MIPS32/MIPS64 */
12712
12713 /*
12714  * microMIPS32/microMIPS64 major opcodes
12715  *
12716  * 1. MIPS Architecture for Programmers Volume II-B:
12717  *      The microMIPS32 Instruction Set (Revision 3.05)
12718  *
12719  *    Table 6.2 microMIPS32 Encoding of Major Opcode Field
12720  *
12721  * 2. MIPS Architecture For Programmers Volume II-A:
12722  *      The MIPS64 Instruction Set (Revision 3.51)
12723  */
12724
12725 enum {
12726     POOL32A = 0x00,
12727     POOL16A = 0x01,
12728     LBU16 = 0x02,
12729     MOVE16 = 0x03,
12730     ADDI32 = 0x04,
12731     R6_LUI = 0x04,
12732     AUI = 0x04,
12733     LBU32 = 0x05,
12734     SB32 = 0x06,
12735     LB32 = 0x07,
12736
12737     POOL32B = 0x08,
12738     POOL16B = 0x09,
12739     LHU16 = 0x0a,
12740     ANDI16 = 0x0b,
12741     ADDIU32 = 0x0c,
12742     LHU32 = 0x0d,
12743     SH32 = 0x0e,
12744     LH32 = 0x0f,
12745
12746     POOL32I = 0x10,
12747     POOL16C = 0x11,
12748     LWSP16 = 0x12,
12749     POOL16D = 0x13,
12750     ORI32 = 0x14,
12751     POOL32F = 0x15,
12752     POOL32S = 0x16,  /* MIPS64 */
12753     DADDIU32 = 0x17, /* MIPS64 */
12754
12755     POOL32C = 0x18,
12756     LWGP16 = 0x19,
12757     LW16 = 0x1a,
12758     POOL16E = 0x1b,
12759     XORI32 = 0x1c,
12760     JALS32 = 0x1d,
12761     BOVC = 0x1d,
12762     BEQC = 0x1d,
12763     BEQZALC = 0x1d,
12764     ADDIUPC = 0x1e,
12765     PCREL = 0x1e,
12766     BNVC = 0x1f,
12767     BNEC = 0x1f,
12768     BNEZALC = 0x1f,
12769
12770     R6_BEQZC = 0x20,
12771     JIC = 0x20,
12772     POOL16F = 0x21,
12773     SB16 = 0x22,
12774     BEQZ16 = 0x23,
12775     BEQZC16 = 0x23,
12776     SLTI32 = 0x24,
12777     BEQ32 = 0x25,
12778     BC = 0x25,
12779     SWC132 = 0x26,
12780     LWC132 = 0x27,
12781
12782     /* 0x29 is reserved */
12783     RES_29 = 0x29,
12784     R6_BNEZC = 0x28,
12785     JIALC = 0x28,
12786     SH16 = 0x2a,
12787     BNEZ16 = 0x2b,
12788     BNEZC16 = 0x2b,
12789     SLTIU32 = 0x2c,
12790     BNE32 = 0x2d,
12791     BALC = 0x2d,
12792     SDC132 = 0x2e,
12793     LDC132 = 0x2f,
12794
12795     /* 0x31 is reserved */
12796     RES_31 = 0x31,
12797     BLEZALC = 0x30,
12798     BGEZALC = 0x30,
12799     BGEUC = 0x30,
12800     SWSP16 = 0x32,
12801     B16 = 0x33,
12802     BC16 = 0x33,
12803     ANDI32 = 0x34,
12804     J32 = 0x35,
12805     BGTZC = 0x35,
12806     BLTZC = 0x35,
12807     BLTC = 0x35,
12808     SD32 = 0x36, /* MIPS64 */
12809     LD32 = 0x37, /* MIPS64 */
12810
12811     /* 0x39 is reserved */
12812     RES_39 = 0x39,
12813     BGTZALC = 0x38,
12814     BLTZALC = 0x38,
12815     BLTUC = 0x38,
12816     SW16 = 0x3a,
12817     LI16 = 0x3b,
12818     JALX32 = 0x3c,
12819     JAL32 = 0x3d,
12820     BLEZC = 0x3d,
12821     BGEZC = 0x3d,
12822     BGEC = 0x3d,
12823     SW32 = 0x3e,
12824     LW32 = 0x3f
12825 };
12826
12827 /* PCREL Instructions perform PC-Relative address calculation. bits 20..16 */
12828 enum {
12829     ADDIUPC_00 = 0x00,
12830     ADDIUPC_01 = 0x01,
12831     ADDIUPC_02 = 0x02,
12832     ADDIUPC_03 = 0x03,
12833     ADDIUPC_04 = 0x04,
12834     ADDIUPC_05 = 0x05,
12835     ADDIUPC_06 = 0x06,
12836     ADDIUPC_07 = 0x07,
12837     AUIPC = 0x1e,
12838     ALUIPC = 0x1f,
12839     LWPC_08 = 0x08,
12840     LWPC_09 = 0x09,
12841     LWPC_0A = 0x0A,
12842     LWPC_0B = 0x0B,
12843     LWPC_0C = 0x0C,
12844     LWPC_0D = 0x0D,
12845     LWPC_0E = 0x0E,
12846     LWPC_0F = 0x0F,
12847 };
12848
12849 /* POOL32A encoding of minor opcode field */
12850
12851 enum {
12852     /* These opcodes are distinguished only by bits 9..6; those bits are
12853      * what are recorded below. */
12854     SLL32 = 0x0,
12855     SRL32 = 0x1,
12856     SRA = 0x2,
12857     ROTR = 0x3,
12858     SELEQZ = 0x5,
12859     SELNEZ = 0x6,
12860     R6_RDHWR = 0x7,
12861
12862     SLLV = 0x0,
12863     SRLV = 0x1,
12864     SRAV = 0x2,
12865     ROTRV = 0x3,
12866     ADD = 0x4,
12867     ADDU32 = 0x5,
12868     SUB = 0x6,
12869     SUBU32 = 0x7,
12870     MUL = 0x8,
12871     AND = 0x9,
12872     OR32 = 0xa,
12873     NOR = 0xb,
12874     XOR32 = 0xc,
12875     SLT = 0xd,
12876     SLTU = 0xe,
12877
12878     MOVN = 0x0,
12879     R6_MUL  = 0x0,
12880     MOVZ = 0x1,
12881     MUH  = 0x1,
12882     MULU = 0x2,
12883     MUHU = 0x3,
12884     LWXS = 0x4,
12885     R6_DIV  = 0x4,
12886     MOD  = 0x5,
12887     R6_DIVU = 0x6,
12888     MODU = 0x7,
12889
12890     /* The following can be distinguished by their lower 6 bits. */
12891     BREAK32 = 0x07,
12892     INS = 0x0c,
12893     LSA = 0x0f,
12894     ALIGN = 0x1f,
12895     EXT = 0x2c,
12896     POOL32AXF = 0x3c,
12897     SIGRIE = 0x3f
12898 };
12899
12900 /* POOL32AXF encoding of minor opcode field extension */
12901
12902 /*
12903  * 1. MIPS Architecture for Programmers Volume II-B:
12904  *      The microMIPS32 Instruction Set (Revision 3.05)
12905  *
12906  *    Table 6.5 POOL32Axf Encoding of Minor Opcode Extension Field
12907  *
12908  * 2. MIPS Architecture for Programmers VolumeIV-e:
12909  *      The MIPS DSP Application-Specific Extension
12910  *        to the microMIPS32 Architecture (Revision 2.34)
12911  *
12912  *    Table 5.5 POOL32Axf Encoding of Minor Opcode Extension Field
12913  */
12914
12915 enum {
12916     /* bits 11..6 */
12917     TEQ = 0x00,
12918     TGE = 0x08,
12919     TGEU = 0x10,
12920     TLT = 0x20,
12921     TLTU = 0x28,
12922     TNE = 0x30,
12923
12924     MFC0 = 0x03,
12925     MTC0 = 0x0b,
12926
12927     /* begin of microMIPS32 DSP */
12928
12929     /* bits 13..12 for 0x01 */
12930     MFHI_ACC = 0x0,
12931     MFLO_ACC = 0x1,
12932     MTHI_ACC = 0x2,
12933     MTLO_ACC = 0x3,
12934
12935     /* bits 13..12 for 0x2a */
12936     MADD_ACC = 0x0,
12937     MADDU_ACC = 0x1,
12938     MSUB_ACC = 0x2,
12939     MSUBU_ACC = 0x3,
12940
12941     /* bits 13..12 for 0x32 */
12942     MULT_ACC = 0x0,
12943     MULTU_ACC = 0x1,
12944
12945     /* end of microMIPS32 DSP */
12946
12947     /* bits 15..12 for 0x2c */
12948     BITSWAP = 0x0,
12949     SEB = 0x2,
12950     SEH = 0x3,
12951     CLO = 0x4,
12952     CLZ = 0x5,
12953     RDHWR = 0x6,
12954     WSBH = 0x7,
12955     MULT = 0x8,
12956     MULTU = 0x9,
12957     DIV = 0xa,
12958     DIVU = 0xb,
12959     MADD = 0xc,
12960     MADDU = 0xd,
12961     MSUB = 0xe,
12962     MSUBU = 0xf,
12963
12964     /* bits 15..12 for 0x34 */
12965     MFC2 = 0x4,
12966     MTC2 = 0x5,
12967     MFHC2 = 0x8,
12968     MTHC2 = 0x9,
12969     CFC2 = 0xc,
12970     CTC2 = 0xd,
12971
12972     /* bits 15..12 for 0x3c */
12973     JALR = 0x0,
12974     JR = 0x0,                   /* alias */
12975     JALRC = 0x0,
12976     JRC = 0x0,
12977     JALR_HB = 0x1,
12978     JALRC_HB = 0x1,
12979     JALRS = 0x4,
12980     JALRS_HB = 0x5,
12981
12982     /* bits 15..12 for 0x05 */
12983     RDPGPR = 0xe,
12984     WRPGPR = 0xf,
12985
12986     /* bits 15..12 for 0x0d */
12987     TLBP = 0x0,
12988     TLBR = 0x1,
12989     TLBWI = 0x2,
12990     TLBWR = 0x3,
12991     TLBINV = 0x4,
12992     TLBINVF = 0x5,
12993     WAIT = 0x9,
12994     IRET = 0xd,
12995     DERET = 0xe,
12996     ERET = 0xf,
12997
12998     /* bits 15..12 for 0x15 */
12999     DMT = 0x0,
13000     DVPE = 0x1,
13001     EMT = 0x2,
13002     EVPE = 0x3,
13003
13004     /* bits 15..12 for 0x1d */
13005     DI = 0x4,
13006     EI = 0x5,
13007
13008     /* bits 15..12 for 0x2d */
13009     SYNC = 0x6,
13010     SYSCALL = 0x8,
13011     SDBBP = 0xd,
13012
13013     /* bits 15..12 for 0x35 */
13014     MFHI32 = 0x0,
13015     MFLO32 = 0x1,
13016     MTHI32 = 0x2,
13017     MTLO32 = 0x3,
13018 };
13019
13020 /* POOL32B encoding of minor opcode field (bits 15..12) */
13021
13022 enum {
13023     LWC2 = 0x0,
13024     LWP = 0x1,
13025     LDP = 0x4,
13026     LWM32 = 0x5,
13027     CACHE = 0x6,
13028     LDM = 0x7,
13029     SWC2 = 0x8,
13030     SWP = 0x9,
13031     SDP = 0xc,
13032     SWM32 = 0xd,
13033     SDM = 0xf
13034 };
13035
13036 /* POOL32C encoding of minor opcode field (bits 15..12) */
13037
13038 enum {
13039     LWL = 0x0,
13040     SWL = 0x8,
13041     LWR = 0x1,
13042     SWR = 0x9,
13043     PREF = 0x2,
13044     ST_EVA = 0xa,
13045     LL = 0x3,
13046     SC = 0xb,
13047     LDL = 0x4,
13048     SDL = 0xc,
13049     LDR = 0x5,
13050     SDR = 0xd,
13051     LD_EVA = 0x6,
13052     LWU = 0xe,
13053     LLD = 0x7,
13054     SCD = 0xf
13055 };
13056
13057 /* POOL32C LD-EVA encoding of minor opcode field (bits 11..9) */
13058
13059 enum {
13060     LBUE = 0x0,
13061     LHUE = 0x1,
13062     LWLE = 0x2,
13063     LWRE = 0x3,
13064     LBE = 0x4,
13065     LHE = 0x5,
13066     LLE = 0x6,
13067     LWE = 0x7,
13068 };
13069
13070 /* POOL32C ST-EVA encoding of minor opcode field (bits 11..9) */
13071
13072 enum {
13073     SWLE = 0x0,
13074     SWRE = 0x1,
13075     PREFE = 0x2,
13076     CACHEE = 0x3,
13077     SBE = 0x4,
13078     SHE = 0x5,
13079     SCE = 0x6,
13080     SWE = 0x7,
13081 };
13082
13083 /* POOL32F encoding of minor opcode field (bits 5..0) */
13084
13085 enum {
13086     /* These are the bit 7..6 values */
13087     ADD_FMT = 0x0,
13088
13089     SUB_FMT = 0x1,
13090
13091     MUL_FMT = 0x2,
13092
13093     DIV_FMT = 0x3,
13094
13095     /* These are the bit 8..6 values */
13096     MOVN_FMT = 0x0,
13097     RSQRT2_FMT = 0x0,
13098     MOVF_FMT = 0x0,
13099     RINT_FMT = 0x0,
13100     SELNEZ_FMT = 0x0,
13101
13102     MOVZ_FMT = 0x1,
13103     LWXC1 = 0x1,
13104     MOVT_FMT = 0x1,
13105     CLASS_FMT = 0x1,
13106     SELEQZ_FMT = 0x1,
13107
13108     PLL_PS = 0x2,
13109     SWXC1 = 0x2,
13110     SEL_FMT = 0x2,
13111
13112     PLU_PS = 0x3,
13113     LDXC1 = 0x3,
13114
13115     MOVN_FMT_04 = 0x4,
13116     PUL_PS = 0x4,
13117     SDXC1 = 0x4,
13118     RECIP2_FMT = 0x4,
13119
13120     MOVZ_FMT_05 = 0x05,
13121     PUU_PS = 0x5,
13122     LUXC1 = 0x5,
13123
13124     CVT_PS_S = 0x6,
13125     SUXC1 = 0x6,
13126     ADDR_PS = 0x6,
13127     PREFX = 0x6,
13128     MADDF_FMT = 0x6,
13129
13130     MULR_PS = 0x7,
13131     MSUBF_FMT = 0x7,
13132
13133     MADD_S = 0x01,
13134     MADD_D = 0x09,
13135     MADD_PS = 0x11,
13136     ALNV_PS = 0x19,
13137     MSUB_S = 0x21,
13138     MSUB_D = 0x29,
13139     MSUB_PS = 0x31,
13140
13141     NMADD_S = 0x02,
13142     NMADD_D = 0x0a,
13143     NMADD_PS = 0x12,
13144     NMSUB_S = 0x22,
13145     NMSUB_D = 0x2a,
13146     NMSUB_PS = 0x32,
13147
13148     MIN_FMT = 0x3,
13149     MAX_FMT = 0xb,
13150     MINA_FMT = 0x23,
13151     MAXA_FMT = 0x2b,
13152     POOL32FXF = 0x3b,
13153
13154     CABS_COND_FMT = 0x1c,              /* MIPS3D */
13155     C_COND_FMT = 0x3c,
13156
13157     CMP_CONDN_S = 0x5,
13158     CMP_CONDN_D = 0x15
13159 };
13160
13161 /* POOL32Fxf encoding of minor opcode extension field */
13162
13163 enum {
13164     CVT_L = 0x04,
13165     RSQRT_FMT = 0x08,
13166     FLOOR_L = 0x0c,
13167     CVT_PW_PS = 0x1c,
13168     CVT_W = 0x24,
13169     SQRT_FMT = 0x28,
13170     FLOOR_W = 0x2c,
13171     CVT_PS_PW = 0x3c,
13172     CFC1 = 0x40,
13173     RECIP_FMT = 0x48,
13174     CEIL_L = 0x4c,
13175     CTC1 = 0x60,
13176     CEIL_W = 0x6c,
13177     MFC1 = 0x80,
13178     CVT_S_PL = 0x84,
13179     TRUNC_L = 0x8c,
13180     MTC1 = 0xa0,
13181     CVT_S_PU = 0xa4,
13182     TRUNC_W = 0xac,
13183     MFHC1 = 0xc0,
13184     ROUND_L = 0xcc,
13185     MTHC1 = 0xe0,
13186     ROUND_W = 0xec,
13187
13188     MOV_FMT = 0x01,
13189     MOVF = 0x05,
13190     ABS_FMT = 0x0d,
13191     RSQRT1_FMT = 0x1d,
13192     MOVT = 0x25,
13193     NEG_FMT = 0x2d,
13194     CVT_D = 0x4d,
13195     RECIP1_FMT = 0x5d,
13196     CVT_S = 0x6d
13197 };
13198
13199 /* POOL32I encoding of minor opcode field (bits 25..21) */
13200
13201 enum {
13202     BLTZ = 0x00,
13203     BLTZAL = 0x01,
13204     BGEZ = 0x02,
13205     BGEZAL = 0x03,
13206     BLEZ = 0x04,
13207     BNEZC = 0x05,
13208     BGTZ = 0x06,
13209     BEQZC = 0x07,
13210     TLTI = 0x08,
13211     BC1EQZC = 0x08,
13212     TGEI = 0x09,
13213     BC1NEZC = 0x09,
13214     TLTIU = 0x0a,
13215     BC2EQZC = 0x0a,
13216     TGEIU = 0x0b,
13217     BC2NEZC = 0x0a,
13218     TNEI = 0x0c,
13219     R6_SYNCI = 0x0c,
13220     LUI = 0x0d,
13221     TEQI = 0x0e,
13222     SYNCI = 0x10,
13223     BLTZALS = 0x11,
13224     BGEZALS = 0x13,
13225     BC2F = 0x14,
13226     BC2T = 0x15,
13227     BPOSGE64 = 0x1a,
13228     BPOSGE32 = 0x1b,
13229     /* These overlap and are distinguished by bit16 of the instruction */
13230     BC1F = 0x1c,
13231     BC1T = 0x1d,
13232     BC1ANY2F = 0x1c,
13233     BC1ANY2T = 0x1d,
13234     BC1ANY4F = 0x1e,
13235     BC1ANY4T = 0x1f
13236 };
13237
13238 /* POOL16A encoding of minor opcode field */
13239
13240 enum {
13241     ADDU16 = 0x0,
13242     SUBU16 = 0x1
13243 };
13244
13245 /* POOL16B encoding of minor opcode field */
13246
13247 enum {
13248     SLL16 = 0x0,
13249     SRL16 = 0x1
13250 };
13251
13252 /* POOL16C encoding of minor opcode field */
13253
13254 enum {
13255     NOT16 = 0x00,
13256     XOR16 = 0x04,
13257     AND16 = 0x08,
13258     OR16 = 0x0c,
13259     LWM16 = 0x10,
13260     SWM16 = 0x14,
13261     JR16 = 0x18,
13262     JRC16 = 0x1a,
13263     JALR16 = 0x1c,
13264     JALR16S = 0x1e,
13265     MFHI16 = 0x20,
13266     MFLO16 = 0x24,
13267     BREAK16 = 0x28,
13268     SDBBP16 = 0x2c,
13269     JRADDIUSP = 0x30
13270 };
13271
13272 /* R6 POOL16C encoding of minor opcode field (bits 0..5) */
13273
13274 enum {
13275     R6_NOT16    = 0x00,
13276     R6_AND16    = 0x01,
13277     R6_LWM16    = 0x02,
13278     R6_JRC16    = 0x03,
13279     MOVEP       = 0x04,
13280     MOVEP_05    = 0x05,
13281     MOVEP_06    = 0x06,
13282     MOVEP_07    = 0x07,
13283     R6_XOR16    = 0x08,
13284     R6_OR16     = 0x09,
13285     R6_SWM16    = 0x0a,
13286     JALRC16     = 0x0b,
13287     MOVEP_0C    = 0x0c,
13288     MOVEP_0D    = 0x0d,
13289     MOVEP_0E    = 0x0e,
13290     MOVEP_0F    = 0x0f,
13291     JRCADDIUSP  = 0x13,
13292     R6_BREAK16  = 0x1b,
13293     R6_SDBBP16  = 0x3b
13294 };
13295
13296 /* POOL16D encoding of minor opcode field */
13297
13298 enum {
13299     ADDIUS5 = 0x0,
13300     ADDIUSP = 0x1
13301 };
13302
13303 /* POOL16E encoding of minor opcode field */
13304
13305 enum {
13306     ADDIUR2 = 0x0,
13307     ADDIUR1SP = 0x1
13308 };
13309
13310 static int mmreg (int r)
13311 {
13312     static const int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
13313
13314     return map[r];
13315 }
13316
13317 /* Used for 16-bit store instructions.  */
13318 static int mmreg2 (int r)
13319 {
13320     static const int map[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
13321
13322     return map[r];
13323 }
13324
13325 #define uMIPS_RD(op) ((op >> 7) & 0x7)
13326 #define uMIPS_RS(op) ((op >> 4) & 0x7)
13327 #define uMIPS_RS2(op) uMIPS_RS(op)
13328 #define uMIPS_RS1(op) ((op >> 1) & 0x7)
13329 #define uMIPS_RD5(op) ((op >> 5) & 0x1f)
13330 #define uMIPS_RS5(op) (op & 0x1f)
13331
13332 /* Signed immediate */
13333 #define SIMM(op, start, width)                                          \
13334     ((int32_t)(((op >> start) & ((~0U) >> (32-width)))                 \
13335                << (32-width))                                           \
13336      >> (32-width))
13337 /* Zero-extended immediate */
13338 #define ZIMM(op, start, width) ((op >> start) & ((~0U) >> (32-width)))
13339
13340 static void gen_addiur1sp(DisasContext *ctx)
13341 {
13342     int rd = mmreg(uMIPS_RD(ctx->opcode));
13343
13344     gen_arith_imm(ctx, OPC_ADDIU, rd, 29, ((ctx->opcode >> 1) & 0x3f) << 2);
13345 }
13346
13347 static void gen_addiur2(DisasContext *ctx)
13348 {
13349     static const int decoded_imm[] = { 1, 4, 8, 12, 16, 20, 24, -1 };
13350     int rd = mmreg(uMIPS_RD(ctx->opcode));
13351     int rs = mmreg(uMIPS_RS(ctx->opcode));
13352
13353     gen_arith_imm(ctx, OPC_ADDIU, rd, rs, decoded_imm[ZIMM(ctx->opcode, 1, 3)]);
13354 }
13355
13356 static void gen_addiusp(DisasContext *ctx)
13357 {
13358     int encoded = ZIMM(ctx->opcode, 1, 9);
13359     int decoded;
13360
13361     if (encoded <= 1) {
13362         decoded = 256 + encoded;
13363     } else if (encoded <= 255) {
13364         decoded = encoded;
13365     } else if (encoded <= 509) {
13366         decoded = encoded - 512;
13367     } else {
13368         decoded = encoded - 768;
13369     }
13370
13371     gen_arith_imm(ctx, OPC_ADDIU, 29, 29, decoded << 2);
13372 }
13373
13374 static void gen_addius5(DisasContext *ctx)
13375 {
13376     int imm = SIMM(ctx->opcode, 1, 4);
13377     int rd = (ctx->opcode >> 5) & 0x1f;
13378
13379     gen_arith_imm(ctx, OPC_ADDIU, rd, rd, imm);
13380 }
13381
13382 static void gen_andi16(DisasContext *ctx)
13383 {
13384     static const int decoded_imm[] = { 128, 1, 2, 3, 4, 7, 8, 15, 16,
13385                                  31, 32, 63, 64, 255, 32768, 65535 };
13386     int rd = mmreg(uMIPS_RD(ctx->opcode));
13387     int rs = mmreg(uMIPS_RS(ctx->opcode));
13388     int encoded = ZIMM(ctx->opcode, 0, 4);
13389
13390     gen_logic_imm(ctx, OPC_ANDI, rd, rs, decoded_imm[encoded]);
13391 }
13392
13393 static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist,
13394                                int base, int16_t offset)
13395 {
13396     TCGv t0, t1;
13397     TCGv_i32 t2;
13398
13399     if (ctx->hflags & MIPS_HFLAG_BMASK) {
13400         generate_exception_end(ctx, EXCP_RI);
13401         return;
13402     }
13403
13404     t0 = tcg_temp_new();
13405
13406     gen_base_offset_addr(ctx, t0, base, offset);
13407
13408     t1 = tcg_const_tl(reglist);
13409     t2 = tcg_const_i32(ctx->mem_idx);
13410
13411     save_cpu_state(ctx, 1);
13412     switch (opc) {
13413     case LWM32:
13414         gen_helper_lwm(cpu_env, t0, t1, t2);
13415         break;
13416     case SWM32:
13417         gen_helper_swm(cpu_env, t0, t1, t2);
13418         break;
13419 #ifdef TARGET_MIPS64
13420     case LDM:
13421         gen_helper_ldm(cpu_env, t0, t1, t2);
13422         break;
13423     case SDM:
13424         gen_helper_sdm(cpu_env, t0, t1, t2);
13425         break;
13426 #endif
13427     }
13428     tcg_temp_free(t0);
13429     tcg_temp_free(t1);
13430     tcg_temp_free_i32(t2);
13431 }
13432
13433
13434 static void gen_pool16c_insn(DisasContext *ctx)
13435 {
13436     int rd = mmreg((ctx->opcode >> 3) & 0x7);
13437     int rs = mmreg(ctx->opcode & 0x7);
13438
13439     switch (((ctx->opcode) >> 4) & 0x3f) {
13440     case NOT16 + 0:
13441     case NOT16 + 1:
13442     case NOT16 + 2:
13443     case NOT16 + 3:
13444         gen_logic(ctx, OPC_NOR, rd, rs, 0);
13445         break;
13446     case XOR16 + 0:
13447     case XOR16 + 1:
13448     case XOR16 + 2:
13449     case XOR16 + 3:
13450         gen_logic(ctx, OPC_XOR, rd, rd, rs);
13451         break;
13452     case AND16 + 0:
13453     case AND16 + 1:
13454     case AND16 + 2:
13455     case AND16 + 3:
13456         gen_logic(ctx, OPC_AND, rd, rd, rs);
13457         break;
13458     case OR16 + 0:
13459     case OR16 + 1:
13460     case OR16 + 2:
13461     case OR16 + 3:
13462         gen_logic(ctx, OPC_OR, rd, rd, rs);
13463         break;
13464     case LWM16 + 0:
13465     case LWM16 + 1:
13466     case LWM16 + 2:
13467     case LWM16 + 3:
13468         {
13469             static const int lwm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
13470             int offset = ZIMM(ctx->opcode, 0, 4);
13471
13472             gen_ldst_multiple(ctx, LWM32, lwm_convert[(ctx->opcode >> 4) & 0x3],
13473                               29, offset << 2);
13474         }
13475         break;
13476     case SWM16 + 0:
13477     case SWM16 + 1:
13478     case SWM16 + 2:
13479     case SWM16 + 3:
13480         {
13481             static const int swm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
13482             int offset = ZIMM(ctx->opcode, 0, 4);
13483
13484             gen_ldst_multiple(ctx, SWM32, swm_convert[(ctx->opcode >> 4) & 0x3],
13485                               29, offset << 2);
13486         }
13487         break;
13488     case JR16 + 0:
13489     case JR16 + 1:
13490         {
13491             int reg = ctx->opcode & 0x1f;
13492
13493             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 4);
13494         }
13495         break;
13496     case JRC16 + 0:
13497     case JRC16 + 1:
13498         {
13499             int reg = ctx->opcode & 0x1f;
13500             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 0);
13501             /* Let normal delay slot handling in our caller take us
13502                to the branch target.  */
13503         }
13504         break;
13505     case JALR16 + 0:
13506     case JALR16 + 1:
13507         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 4);
13508         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13509         break;
13510     case JALR16S + 0:
13511     case JALR16S + 1:
13512         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 2);
13513         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13514         break;
13515     case MFHI16 + 0:
13516     case MFHI16 + 1:
13517         gen_HILO(ctx, OPC_MFHI, 0, uMIPS_RS5(ctx->opcode));
13518         break;
13519     case MFLO16 + 0:
13520     case MFLO16 + 1:
13521         gen_HILO(ctx, OPC_MFLO, 0, uMIPS_RS5(ctx->opcode));
13522         break;
13523     case BREAK16:
13524         generate_exception_end(ctx, EXCP_BREAK);
13525         break;
13526     case SDBBP16:
13527         if (is_uhi(extract32(ctx->opcode, 0, 4))) {
13528             gen_helper_do_semihosting(cpu_env);
13529         } else {
13530             /* XXX: not clear which exception should be raised
13531              *      when in debug mode...
13532              */
13533             check_insn(ctx, ISA_MIPS32);
13534             generate_exception_end(ctx, EXCP_DBp);
13535         }
13536         break;
13537     case JRADDIUSP + 0:
13538     case JRADDIUSP + 1:
13539         {
13540             int imm = ZIMM(ctx->opcode, 0, 5);
13541             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
13542             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
13543             /* Let normal delay slot handling in our caller take us
13544                to the branch target.  */
13545         }
13546         break;
13547     default:
13548         generate_exception_end(ctx, EXCP_RI);
13549         break;
13550     }
13551 }
13552
13553 static inline void gen_movep(DisasContext *ctx, int enc_dest, int enc_rt,
13554                              int enc_rs)
13555 {
13556     int rd, rs, re, rt;
13557     static const int rd_enc[] = { 5, 5, 6, 4, 4, 4, 4, 4 };
13558     static const int re_enc[] = { 6, 7, 7, 21, 22, 5, 6, 7 };
13559     static const int rs_rt_enc[] = { 0, 17, 2, 3, 16, 18, 19, 20 };
13560     rd = rd_enc[enc_dest];
13561     re = re_enc[enc_dest];
13562     rs = rs_rt_enc[enc_rs];
13563     rt = rs_rt_enc[enc_rt];
13564     if (rs) {
13565         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
13566     } else {
13567         tcg_gen_movi_tl(cpu_gpr[rd], 0);
13568     }
13569     if (rt) {
13570         tcg_gen_mov_tl(cpu_gpr[re], cpu_gpr[rt]);
13571     } else {
13572         tcg_gen_movi_tl(cpu_gpr[re], 0);
13573     }
13574 }
13575
13576 static void gen_pool16c_r6_insn(DisasContext *ctx)
13577 {
13578     int rt = mmreg((ctx->opcode >> 7) & 0x7);
13579     int rs = mmreg((ctx->opcode >> 4) & 0x7);
13580
13581     switch (ctx->opcode & 0xf) {
13582     case R6_NOT16:
13583         gen_logic(ctx, OPC_NOR, rt, rs, 0);
13584         break;
13585     case R6_AND16:
13586         gen_logic(ctx, OPC_AND, rt, rt, rs);
13587         break;
13588     case R6_LWM16:
13589         {
13590             int lwm_converted = 0x11 + extract32(ctx->opcode, 8, 2);
13591             int offset = extract32(ctx->opcode, 4, 4);
13592             gen_ldst_multiple(ctx, LWM32, lwm_converted, 29, offset << 2);
13593         }
13594         break;
13595     case R6_JRC16: /* JRCADDIUSP */
13596         if ((ctx->opcode >> 4) & 1) {
13597             /* JRCADDIUSP */
13598             int imm = extract32(ctx->opcode, 5, 5);
13599             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
13600             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
13601         } else {
13602             /* JRC16 */
13603             rs = extract32(ctx->opcode, 5, 5);
13604             gen_compute_branch(ctx, OPC_JR, 2, rs, 0, 0, 0);
13605         }
13606         break;
13607     case MOVEP:
13608     case MOVEP_05:
13609     case MOVEP_06:
13610     case MOVEP_07:
13611     case MOVEP_0C:
13612     case MOVEP_0D:
13613     case MOVEP_0E:
13614     case MOVEP_0F:
13615         {
13616             int enc_dest = uMIPS_RD(ctx->opcode);
13617             int enc_rt = uMIPS_RS2(ctx->opcode);
13618             int enc_rs = (ctx->opcode & 3) | ((ctx->opcode >> 1) & 4);
13619             gen_movep(ctx, enc_dest, enc_rt, enc_rs);
13620         }
13621         break;
13622     case R6_XOR16:
13623         gen_logic(ctx, OPC_XOR, rt, rt, rs);
13624         break;
13625     case R6_OR16:
13626         gen_logic(ctx, OPC_OR, rt, rt, rs);
13627         break;
13628     case R6_SWM16:
13629         {
13630             int swm_converted = 0x11 + extract32(ctx->opcode, 8, 2);
13631             int offset = extract32(ctx->opcode, 4, 4);
13632             gen_ldst_multiple(ctx, SWM32, swm_converted, 29, offset << 2);
13633         }
13634         break;
13635     case JALRC16: /* BREAK16, SDBBP16 */
13636         switch (ctx->opcode & 0x3f) {
13637         case JALRC16:
13638         case JALRC16 + 0x20:
13639             /* JALRC16 */
13640             gen_compute_branch(ctx, OPC_JALR, 2, (ctx->opcode >> 5) & 0x1f,
13641                                31, 0, 0);
13642             break;
13643         case R6_BREAK16:
13644             /* BREAK16 */
13645             generate_exception(ctx, EXCP_BREAK);
13646             break;
13647         case R6_SDBBP16:
13648             /* SDBBP16 */
13649             if (is_uhi(extract32(ctx->opcode, 6, 4))) {
13650                 gen_helper_do_semihosting(cpu_env);
13651             } else {
13652                 if (ctx->hflags & MIPS_HFLAG_SBRI) {
13653                     generate_exception(ctx, EXCP_RI);
13654                 } else {
13655                     generate_exception(ctx, EXCP_DBp);
13656                 }
13657             }
13658             break;
13659         }
13660         break;
13661     default:
13662         generate_exception(ctx, EXCP_RI);
13663         break;
13664     }
13665 }
13666
13667 static void gen_ldxs (DisasContext *ctx, int base, int index, int rd)
13668 {
13669     TCGv t0 = tcg_temp_new();
13670     TCGv t1 = tcg_temp_new();
13671
13672     gen_load_gpr(t0, base);
13673
13674     if (index != 0) {
13675         gen_load_gpr(t1, index);
13676         tcg_gen_shli_tl(t1, t1, 2);
13677         gen_op_addr_add(ctx, t0, t1, t0);
13678     }
13679
13680     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
13681     gen_store_gpr(t1, rd);
13682
13683     tcg_temp_free(t0);
13684     tcg_temp_free(t1);
13685 }
13686
13687 static void gen_ldst_pair (DisasContext *ctx, uint32_t opc, int rd,
13688                            int base, int16_t offset)
13689 {
13690     TCGv t0, t1;
13691
13692     if (ctx->hflags & MIPS_HFLAG_BMASK || rd == 31) {
13693         generate_exception_end(ctx, EXCP_RI);
13694         return;
13695     }
13696
13697     t0 = tcg_temp_new();
13698     t1 = tcg_temp_new();
13699
13700     gen_base_offset_addr(ctx, t0, base, offset);
13701
13702     switch (opc) {
13703     case LWP:
13704         if (rd == base) {
13705             generate_exception_end(ctx, EXCP_RI);
13706             return;
13707         }
13708         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
13709         gen_store_gpr(t1, rd);
13710         tcg_gen_movi_tl(t1, 4);
13711         gen_op_addr_add(ctx, t0, t0, t1);
13712         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
13713         gen_store_gpr(t1, rd+1);
13714         break;
13715     case SWP:
13716         gen_load_gpr(t1, rd);
13717         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
13718         tcg_gen_movi_tl(t1, 4);
13719         gen_op_addr_add(ctx, t0, t0, t1);
13720         gen_load_gpr(t1, rd+1);
13721         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
13722         break;
13723 #ifdef TARGET_MIPS64
13724     case LDP:
13725         if (rd == base) {
13726             generate_exception_end(ctx, EXCP_RI);
13727             return;
13728         }
13729         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
13730         gen_store_gpr(t1, rd);
13731         tcg_gen_movi_tl(t1, 8);
13732         gen_op_addr_add(ctx, t0, t0, t1);
13733         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
13734         gen_store_gpr(t1, rd+1);
13735         break;
13736     case SDP:
13737         gen_load_gpr(t1, rd);
13738         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
13739         tcg_gen_movi_tl(t1, 8);
13740         gen_op_addr_add(ctx, t0, t0, t1);
13741         gen_load_gpr(t1, rd+1);
13742         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
13743         break;
13744 #endif
13745     }
13746     tcg_temp_free(t0);
13747     tcg_temp_free(t1);
13748 }
13749
13750 static void gen_sync(int stype)
13751 {
13752     TCGBar tcg_mo = TCG_BAR_SC;
13753
13754     switch (stype) {
13755     case 0x4: /* SYNC_WMB */
13756         tcg_mo |= TCG_MO_ST_ST;
13757         break;
13758     case 0x10: /* SYNC_MB */
13759         tcg_mo |= TCG_MO_ALL;
13760         break;
13761     case 0x11: /* SYNC_ACQUIRE */
13762         tcg_mo |= TCG_MO_LD_LD | TCG_MO_LD_ST;
13763         break;
13764     case 0x12: /* SYNC_RELEASE */
13765         tcg_mo |= TCG_MO_ST_ST | TCG_MO_LD_ST;
13766         break;
13767     case 0x13: /* SYNC_RMB */
13768         tcg_mo |= TCG_MO_LD_LD;
13769         break;
13770     default:
13771         tcg_mo |= TCG_MO_ALL;
13772         break;
13773     }
13774
13775     tcg_gen_mb(tcg_mo);
13776 }
13777
13778 static void gen_pool32axf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs)
13779 {
13780     int extension = (ctx->opcode >> 6) & 0x3f;
13781     int minor = (ctx->opcode >> 12) & 0xf;
13782     uint32_t mips32_op;
13783
13784     switch (extension) {
13785     case TEQ:
13786         mips32_op = OPC_TEQ;
13787         goto do_trap;
13788     case TGE:
13789         mips32_op = OPC_TGE;
13790         goto do_trap;
13791     case TGEU:
13792         mips32_op = OPC_TGEU;
13793         goto do_trap;
13794     case TLT:
13795         mips32_op = OPC_TLT;
13796         goto do_trap;
13797     case TLTU:
13798         mips32_op = OPC_TLTU;
13799         goto do_trap;
13800     case TNE:
13801         mips32_op = OPC_TNE;
13802     do_trap:
13803         gen_trap(ctx, mips32_op, rs, rt, -1);
13804         break;
13805 #ifndef CONFIG_USER_ONLY
13806     case MFC0:
13807     case MFC0 + 32:
13808         check_cp0_enabled(ctx);
13809         if (rt == 0) {
13810             /* Treat as NOP. */
13811             break;
13812         }
13813         gen_mfc0(ctx, cpu_gpr[rt], rs, (ctx->opcode >> 11) & 0x7);
13814         break;
13815     case MTC0:
13816     case MTC0 + 32:
13817         check_cp0_enabled(ctx);
13818         {
13819             TCGv t0 = tcg_temp_new();
13820
13821             gen_load_gpr(t0, rt);
13822             gen_mtc0(ctx, t0, rs, (ctx->opcode >> 11) & 0x7);
13823             tcg_temp_free(t0);
13824         }
13825         break;
13826 #endif
13827     case 0x2a:
13828         switch (minor & 3) {
13829         case MADD_ACC:
13830             gen_muldiv(ctx, OPC_MADD, (ctx->opcode >> 14) & 3, rs, rt);
13831             break;
13832         case MADDU_ACC:
13833             gen_muldiv(ctx, OPC_MADDU, (ctx->opcode >> 14) & 3, rs, rt);
13834             break;
13835         case MSUB_ACC:
13836             gen_muldiv(ctx, OPC_MSUB, (ctx->opcode >> 14) & 3, rs, rt);
13837             break;
13838         case MSUBU_ACC:
13839             gen_muldiv(ctx, OPC_MSUBU, (ctx->opcode >> 14) & 3, rs, rt);
13840             break;
13841         default:
13842             goto pool32axf_invalid;
13843         }
13844         break;
13845     case 0x32:
13846         switch (minor & 3) {
13847         case MULT_ACC:
13848             gen_muldiv(ctx, OPC_MULT, (ctx->opcode >> 14) & 3, rs, rt);
13849             break;
13850         case MULTU_ACC:
13851             gen_muldiv(ctx, OPC_MULTU, (ctx->opcode >> 14) & 3, rs, rt);
13852             break;
13853         default:
13854             goto pool32axf_invalid;
13855         }
13856         break;
13857     case 0x2c:
13858         switch (minor) {
13859         case BITSWAP:
13860             check_insn(ctx, ISA_MIPS32R6);
13861             gen_bitswap(ctx, OPC_BITSWAP, rs, rt);
13862             break;
13863         case SEB:
13864             gen_bshfl(ctx, OPC_SEB, rs, rt);
13865             break;
13866         case SEH:
13867             gen_bshfl(ctx, OPC_SEH, rs, rt);
13868             break;
13869         case CLO:
13870             mips32_op = OPC_CLO;
13871             goto do_cl;
13872         case CLZ:
13873             mips32_op = OPC_CLZ;
13874         do_cl:
13875             check_insn(ctx, ISA_MIPS32);
13876             gen_cl(ctx, mips32_op, rt, rs);
13877             break;
13878         case RDHWR:
13879             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13880             gen_rdhwr(ctx, rt, rs, 0);
13881             break;
13882         case WSBH:
13883             gen_bshfl(ctx, OPC_WSBH, rs, rt);
13884             break;
13885         case MULT:
13886             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13887             mips32_op = OPC_MULT;
13888             goto do_mul;
13889         case MULTU:
13890             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13891             mips32_op = OPC_MULTU;
13892             goto do_mul;
13893         case DIV:
13894             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13895             mips32_op = OPC_DIV;
13896             goto do_div;
13897         case DIVU:
13898             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13899             mips32_op = OPC_DIVU;
13900             goto do_div;
13901         do_div:
13902             check_insn(ctx, ISA_MIPS32);
13903             gen_muldiv(ctx, mips32_op, 0, rs, rt);
13904             break;
13905         case MADD:
13906             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13907             mips32_op = OPC_MADD;
13908             goto do_mul;
13909         case MADDU:
13910             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13911             mips32_op = OPC_MADDU;
13912             goto do_mul;
13913         case MSUB:
13914             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13915             mips32_op = OPC_MSUB;
13916             goto do_mul;
13917         case MSUBU:
13918             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13919             mips32_op = OPC_MSUBU;
13920         do_mul:
13921             check_insn(ctx, ISA_MIPS32);
13922             gen_muldiv(ctx, mips32_op, 0, rs, rt);
13923             break;
13924         default:
13925             goto pool32axf_invalid;
13926         }
13927         break;
13928     case 0x34:
13929         switch (minor) {
13930         case MFC2:
13931         case MTC2:
13932         case MFHC2:
13933         case MTHC2:
13934         case CFC2:
13935         case CTC2:
13936             generate_exception_err(ctx, EXCP_CpU, 2);
13937             break;
13938         default:
13939             goto pool32axf_invalid;
13940         }
13941         break;
13942     case 0x3c:
13943         switch (minor) {
13944         case JALR:    /* JALRC */
13945         case JALR_HB: /* JALRC_HB */
13946             if (ctx->insn_flags & ISA_MIPS32R6) {
13947                 /* JALRC, JALRC_HB */
13948                 gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 0);
13949             } else {
13950                 /* JALR, JALR_HB */
13951                 gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 4);
13952                 ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13953             }
13954             break;
13955         case JALRS:
13956         case JALRS_HB:
13957             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13958             gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 2);
13959             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13960             break;
13961         default:
13962             goto pool32axf_invalid;
13963         }
13964         break;
13965     case 0x05:
13966         switch (minor) {
13967         case RDPGPR:
13968             check_cp0_enabled(ctx);
13969             check_insn(ctx, ISA_MIPS32R2);
13970             gen_load_srsgpr(rs, rt);
13971             break;
13972         case WRPGPR:
13973             check_cp0_enabled(ctx);
13974             check_insn(ctx, ISA_MIPS32R2);
13975             gen_store_srsgpr(rs, rt);
13976             break;
13977         default:
13978             goto pool32axf_invalid;
13979         }
13980         break;
13981 #ifndef CONFIG_USER_ONLY
13982     case 0x0d:
13983         switch (minor) {
13984         case TLBP:
13985             mips32_op = OPC_TLBP;
13986             goto do_cp0;
13987         case TLBR:
13988             mips32_op = OPC_TLBR;
13989             goto do_cp0;
13990         case TLBWI:
13991             mips32_op = OPC_TLBWI;
13992             goto do_cp0;
13993         case TLBWR:
13994             mips32_op = OPC_TLBWR;
13995             goto do_cp0;
13996         case TLBINV:
13997             mips32_op = OPC_TLBINV;
13998             goto do_cp0;
13999         case TLBINVF:
14000             mips32_op = OPC_TLBINVF;
14001             goto do_cp0;
14002         case WAIT:
14003             mips32_op = OPC_WAIT;
14004             goto do_cp0;
14005         case DERET:
14006             mips32_op = OPC_DERET;
14007             goto do_cp0;
14008         case ERET:
14009             mips32_op = OPC_ERET;
14010         do_cp0:
14011             gen_cp0(env, ctx, mips32_op, rt, rs);
14012             break;
14013         default:
14014             goto pool32axf_invalid;
14015         }
14016         break;
14017     case 0x1d:
14018         switch (minor) {
14019         case DI:
14020             check_cp0_enabled(ctx);
14021             {
14022                 TCGv t0 = tcg_temp_new();
14023
14024                 save_cpu_state(ctx, 1);
14025                 gen_helper_di(t0, cpu_env);
14026                 gen_store_gpr(t0, rs);
14027                 /* Stop translation as we may have switched the execution mode */
14028                 ctx->base.is_jmp = DISAS_STOP;
14029                 tcg_temp_free(t0);
14030             }
14031             break;
14032         case EI:
14033             check_cp0_enabled(ctx);
14034             {
14035                 TCGv t0 = tcg_temp_new();
14036
14037                 save_cpu_state(ctx, 1);
14038                 gen_helper_ei(t0, cpu_env);
14039                 gen_store_gpr(t0, rs);
14040                 /* DISAS_STOP isn't sufficient, we need to ensure we break out
14041                    of translated code to check for pending interrupts.  */
14042                 gen_save_pc(ctx->base.pc_next + 4);
14043                 ctx->base.is_jmp = DISAS_EXIT;
14044                 tcg_temp_free(t0);
14045             }
14046             break;
14047         default:
14048             goto pool32axf_invalid;
14049         }
14050         break;
14051 #endif
14052     case 0x2d:
14053         switch (minor) {
14054         case SYNC:
14055             gen_sync(extract32(ctx->opcode, 16, 5));
14056             break;
14057         case SYSCALL:
14058             generate_exception_end(ctx, EXCP_SYSCALL);
14059             break;
14060         case SDBBP:
14061             if (is_uhi(extract32(ctx->opcode, 16, 10))) {
14062                 gen_helper_do_semihosting(cpu_env);
14063             } else {
14064                 check_insn(ctx, ISA_MIPS32);
14065                 if (ctx->hflags & MIPS_HFLAG_SBRI) {
14066                     generate_exception_end(ctx, EXCP_RI);
14067                 } else {
14068                     generate_exception_end(ctx, EXCP_DBp);
14069                 }
14070             }
14071             break;
14072         default:
14073             goto pool32axf_invalid;
14074         }
14075         break;
14076     case 0x01:
14077         switch (minor & 3) {
14078         case MFHI_ACC:
14079             gen_HILO(ctx, OPC_MFHI, minor >> 2, rs);
14080             break;
14081         case MFLO_ACC:
14082             gen_HILO(ctx, OPC_MFLO, minor >> 2, rs);
14083             break;
14084         case MTHI_ACC:
14085             gen_HILO(ctx, OPC_MTHI, minor >> 2, rs);
14086             break;
14087         case MTLO_ACC:
14088             gen_HILO(ctx, OPC_MTLO, minor >> 2, rs);
14089             break;
14090         default:
14091             goto pool32axf_invalid;
14092         }
14093         break;
14094     case 0x35:
14095         check_insn_opc_removed(ctx, ISA_MIPS32R6);
14096         switch (minor) {
14097         case MFHI32:
14098             gen_HILO(ctx, OPC_MFHI, 0, rs);
14099             break;
14100         case MFLO32:
14101             gen_HILO(ctx, OPC_MFLO, 0, rs);
14102             break;
14103         case MTHI32:
14104             gen_HILO(ctx, OPC_MTHI, 0, rs);
14105             break;
14106         case MTLO32:
14107             gen_HILO(ctx, OPC_MTLO, 0, rs);
14108             break;
14109         default:
14110             goto pool32axf_invalid;
14111         }
14112         break;
14113     default:
14114     pool32axf_invalid:
14115         MIPS_INVAL("pool32axf");
14116         generate_exception_end(ctx, EXCP_RI);
14117         break;
14118     }
14119 }
14120
14121 /* Values for microMIPS fmt field.  Variable-width, depending on which
14122    formats the instruction supports.  */
14123
14124 enum {
14125     FMT_SD_S = 0,
14126     FMT_SD_D = 1,
14127
14128     FMT_SDPS_S = 0,
14129     FMT_SDPS_D = 1,
14130     FMT_SDPS_PS = 2,
14131
14132     FMT_SWL_S = 0,
14133     FMT_SWL_W = 1,
14134     FMT_SWL_L = 2,
14135
14136     FMT_DWL_D = 0,
14137     FMT_DWL_W = 1,
14138     FMT_DWL_L = 2
14139 };
14140
14141 static void gen_pool32fxf(DisasContext *ctx, int rt, int rs)
14142 {
14143     int extension = (ctx->opcode >> 6) & 0x3ff;
14144     uint32_t mips32_op;
14145
14146 #define FLOAT_1BIT_FMT(opc, fmt) (fmt << 8) | opc
14147 #define FLOAT_2BIT_FMT(opc, fmt) (fmt << 7) | opc
14148 #define COND_FLOAT_MOV(opc, cond) (cond << 7) | opc
14149
14150     switch (extension) {
14151     case FLOAT_1BIT_FMT(CFC1, 0):
14152         mips32_op = OPC_CFC1;
14153         goto do_cp1;
14154     case FLOAT_1BIT_FMT(CTC1, 0):
14155         mips32_op = OPC_CTC1;
14156         goto do_cp1;
14157     case FLOAT_1BIT_FMT(MFC1, 0):
14158         mips32_op = OPC_MFC1;
14159         goto do_cp1;
14160     case FLOAT_1BIT_FMT(MTC1, 0):
14161         mips32_op = OPC_MTC1;
14162         goto do_cp1;
14163     case FLOAT_1BIT_FMT(MFHC1, 0):
14164         mips32_op = OPC_MFHC1;
14165         goto do_cp1;
14166     case FLOAT_1BIT_FMT(MTHC1, 0):
14167         mips32_op = OPC_MTHC1;
14168     do_cp1:
14169         gen_cp1(ctx, mips32_op, rt, rs);
14170         break;
14171
14172         /* Reciprocal square root */
14173     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_S):
14174         mips32_op = OPC_RSQRT_S;
14175         goto do_unaryfp;
14176     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_D):
14177         mips32_op = OPC_RSQRT_D;
14178         goto do_unaryfp;
14179
14180         /* Square root */
14181     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_S):
14182         mips32_op = OPC_SQRT_S;
14183         goto do_unaryfp;
14184     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_D):
14185         mips32_op = OPC_SQRT_D;
14186         goto do_unaryfp;
14187
14188         /* Reciprocal */
14189     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_S):
14190         mips32_op = OPC_RECIP_S;
14191         goto do_unaryfp;
14192     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_D):
14193         mips32_op = OPC_RECIP_D;
14194         goto do_unaryfp;
14195
14196         /* Floor */
14197     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_S):
14198         mips32_op = OPC_FLOOR_L_S;
14199         goto do_unaryfp;
14200     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_D):
14201         mips32_op = OPC_FLOOR_L_D;
14202         goto do_unaryfp;
14203     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_S):
14204         mips32_op = OPC_FLOOR_W_S;
14205         goto do_unaryfp;
14206     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_D):
14207         mips32_op = OPC_FLOOR_W_D;
14208         goto do_unaryfp;
14209
14210         /* Ceiling */
14211     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_S):
14212         mips32_op = OPC_CEIL_L_S;
14213         goto do_unaryfp;
14214     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_D):
14215         mips32_op = OPC_CEIL_L_D;
14216         goto do_unaryfp;
14217     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_S):
14218         mips32_op = OPC_CEIL_W_S;
14219         goto do_unaryfp;
14220     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_D):
14221         mips32_op = OPC_CEIL_W_D;
14222         goto do_unaryfp;
14223
14224         /* Truncation */
14225     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_S):
14226         mips32_op = OPC_TRUNC_L_S;
14227         goto do_unaryfp;
14228     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_D):
14229         mips32_op = OPC_TRUNC_L_D;
14230         goto do_unaryfp;
14231     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_S):
14232         mips32_op = OPC_TRUNC_W_S;
14233         goto do_unaryfp;
14234     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_D):
14235         mips32_op = OPC_TRUNC_W_D;
14236         goto do_unaryfp;
14237
14238         /* Round */
14239     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_S):
14240         mips32_op = OPC_ROUND_L_S;
14241         goto do_unaryfp;
14242     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_D):
14243         mips32_op = OPC_ROUND_L_D;
14244         goto do_unaryfp;
14245     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_S):
14246         mips32_op = OPC_ROUND_W_S;
14247         goto do_unaryfp;
14248     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_D):
14249         mips32_op = OPC_ROUND_W_D;
14250         goto do_unaryfp;
14251
14252         /* Integer to floating-point conversion */
14253     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_S):
14254         mips32_op = OPC_CVT_L_S;
14255         goto do_unaryfp;
14256     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_D):
14257         mips32_op = OPC_CVT_L_D;
14258         goto do_unaryfp;
14259     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_S):
14260         mips32_op = OPC_CVT_W_S;
14261         goto do_unaryfp;
14262     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_D):
14263         mips32_op = OPC_CVT_W_D;
14264         goto do_unaryfp;
14265
14266         /* Paired-foo conversions */
14267     case FLOAT_1BIT_FMT(CVT_S_PL, 0):
14268         mips32_op = OPC_CVT_S_PL;
14269         goto do_unaryfp;
14270     case FLOAT_1BIT_FMT(CVT_S_PU, 0):
14271         mips32_op = OPC_CVT_S_PU;
14272         goto do_unaryfp;
14273     case FLOAT_1BIT_FMT(CVT_PW_PS, 0):
14274         mips32_op = OPC_CVT_PW_PS;
14275         goto do_unaryfp;
14276     case FLOAT_1BIT_FMT(CVT_PS_PW, 0):
14277         mips32_op = OPC_CVT_PS_PW;
14278         goto do_unaryfp;
14279
14280         /* Floating-point moves */
14281     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_S):
14282         mips32_op = OPC_MOV_S;
14283         goto do_unaryfp;
14284     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_D):
14285         mips32_op = OPC_MOV_D;
14286         goto do_unaryfp;
14287     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_PS):
14288         mips32_op = OPC_MOV_PS;
14289         goto do_unaryfp;
14290
14291         /* Absolute value */
14292     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_S):
14293         mips32_op = OPC_ABS_S;
14294         goto do_unaryfp;
14295     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_D):
14296         mips32_op = OPC_ABS_D;
14297         goto do_unaryfp;
14298     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_PS):
14299         mips32_op = OPC_ABS_PS;
14300         goto do_unaryfp;
14301
14302         /* Negation */
14303     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_S):
14304         mips32_op = OPC_NEG_S;
14305         goto do_unaryfp;
14306     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_D):
14307         mips32_op = OPC_NEG_D;
14308         goto do_unaryfp;
14309     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_PS):
14310         mips32_op = OPC_NEG_PS;
14311         goto do_unaryfp;
14312
14313         /* Reciprocal square root step */
14314     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_S):
14315         mips32_op = OPC_RSQRT1_S;
14316         goto do_unaryfp;
14317     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_D):
14318         mips32_op = OPC_RSQRT1_D;
14319         goto do_unaryfp;
14320     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_PS):
14321         mips32_op = OPC_RSQRT1_PS;
14322         goto do_unaryfp;
14323
14324         /* Reciprocal step */
14325     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_S):
14326         mips32_op = OPC_RECIP1_S;
14327         goto do_unaryfp;
14328     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_D):
14329         mips32_op = OPC_RECIP1_S;
14330         goto do_unaryfp;
14331     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_PS):
14332         mips32_op = OPC_RECIP1_PS;
14333         goto do_unaryfp;
14334
14335         /* Conversions from double */
14336     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_S):
14337         mips32_op = OPC_CVT_D_S;
14338         goto do_unaryfp;
14339     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_W):
14340         mips32_op = OPC_CVT_D_W;
14341         goto do_unaryfp;
14342     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_L):
14343         mips32_op = OPC_CVT_D_L;
14344         goto do_unaryfp;
14345
14346         /* Conversions from single */
14347     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_D):
14348         mips32_op = OPC_CVT_S_D;
14349         goto do_unaryfp;
14350     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_W):
14351         mips32_op = OPC_CVT_S_W;
14352         goto do_unaryfp;
14353     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_L):
14354         mips32_op = OPC_CVT_S_L;
14355     do_unaryfp:
14356         gen_farith(ctx, mips32_op, -1, rs, rt, 0);
14357         break;
14358
14359         /* Conditional moves on floating-point codes */
14360     case COND_FLOAT_MOV(MOVT, 0):
14361     case COND_FLOAT_MOV(MOVT, 1):
14362     case COND_FLOAT_MOV(MOVT, 2):
14363     case COND_FLOAT_MOV(MOVT, 3):
14364     case COND_FLOAT_MOV(MOVT, 4):
14365     case COND_FLOAT_MOV(MOVT, 5):
14366     case COND_FLOAT_MOV(MOVT, 6):
14367     case COND_FLOAT_MOV(MOVT, 7):
14368         check_insn_opc_removed(ctx, ISA_MIPS32R6);
14369         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 1);
14370         break;
14371     case COND_FLOAT_MOV(MOVF, 0):
14372     case COND_FLOAT_MOV(MOVF, 1):
14373     case COND_FLOAT_MOV(MOVF, 2):
14374     case COND_FLOAT_MOV(MOVF, 3):
14375     case COND_FLOAT_MOV(MOVF, 4):
14376     case COND_FLOAT_MOV(MOVF, 5):
14377     case COND_FLOAT_MOV(MOVF, 6):
14378     case COND_FLOAT_MOV(MOVF, 7):
14379         check_insn_opc_removed(ctx, ISA_MIPS32R6);
14380         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 0);
14381         break;
14382     default:
14383         MIPS_INVAL("pool32fxf");
14384         generate_exception_end(ctx, EXCP_RI);
14385         break;
14386     }
14387 }
14388
14389 static void decode_micromips32_opc(CPUMIPSState *env, DisasContext *ctx)
14390 {
14391     int32_t offset;
14392     uint16_t insn;
14393     int rt, rs, rd, rr;
14394     int16_t imm;
14395     uint32_t op, minor, minor2, mips32_op;
14396     uint32_t cond, fmt, cc;
14397
14398     insn = cpu_lduw_code(env, ctx->base.pc_next + 2);
14399     ctx->opcode = (ctx->opcode << 16) | insn;
14400
14401     rt = (ctx->opcode >> 21) & 0x1f;
14402     rs = (ctx->opcode >> 16) & 0x1f;
14403     rd = (ctx->opcode >> 11) & 0x1f;
14404     rr = (ctx->opcode >> 6) & 0x1f;
14405     imm = (int16_t) ctx->opcode;
14406
14407     op = (ctx->opcode >> 26) & 0x3f;
14408     switch (op) {
14409     case POOL32A:
14410         minor = ctx->opcode & 0x3f;
14411         switch (minor) {
14412         case 0x00:
14413             minor = (ctx->opcode >> 6) & 0xf;
14414             switch (minor) {
14415             case SLL32:
14416                 mips32_op = OPC_SLL;
14417                 goto do_shifti;
14418             case SRA:
14419                 mips32_op = OPC_SRA;
14420                 goto do_shifti;
14421             case SRL32:
14422                 mips32_op = OPC_SRL;
14423                 goto do_shifti;
14424             case ROTR:
14425                 mips32_op = OPC_ROTR;
14426             do_shifti:
14427                 gen_shift_imm(ctx, mips32_op, rt, rs, rd);
14428                 break;
14429             case SELEQZ:
14430                 check_insn(ctx, ISA_MIPS32R6);
14431                 gen_cond_move(ctx, OPC_SELEQZ, rd, rs, rt);
14432                 break;
14433             case SELNEZ:
14434                 check_insn(ctx, ISA_MIPS32R6);
14435                 gen_cond_move(ctx, OPC_SELNEZ, rd, rs, rt);
14436                 break;
14437             case R6_RDHWR:
14438                 check_insn(ctx, ISA_MIPS32R6);
14439                 gen_rdhwr(ctx, rt, rs, extract32(ctx->opcode, 11, 3));
14440                 break;
14441             default:
14442                 goto pool32a_invalid;
14443             }
14444             break;
14445         case 0x10:
14446             minor = (ctx->opcode >> 6) & 0xf;
14447             switch (minor) {
14448                 /* Arithmetic */
14449             case ADD:
14450                 mips32_op = OPC_ADD;
14451                 goto do_arith;
14452             case ADDU32:
14453                 mips32_op = OPC_ADDU;
14454                 goto do_arith;
14455             case SUB:
14456                 mips32_op = OPC_SUB;
14457                 goto do_arith;
14458             case SUBU32:
14459                 mips32_op = OPC_SUBU;
14460                 goto do_arith;
14461             case MUL:
14462                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14463                 mips32_op = OPC_MUL;
14464             do_arith:
14465                 gen_arith(ctx, mips32_op, rd, rs, rt);
14466                 break;
14467                 /* Shifts */
14468             case SLLV:
14469                 mips32_op = OPC_SLLV;
14470                 goto do_shift;
14471             case SRLV:
14472                 mips32_op = OPC_SRLV;
14473                 goto do_shift;
14474             case SRAV:
14475                 mips32_op = OPC_SRAV;
14476                 goto do_shift;
14477             case ROTRV:
14478                 mips32_op = OPC_ROTRV;
14479             do_shift:
14480                 gen_shift(ctx, mips32_op, rd, rs, rt);
14481                 break;
14482                 /* Logical operations */
14483             case AND:
14484                 mips32_op = OPC_AND;
14485                 goto do_logic;
14486             case OR32:
14487                 mips32_op = OPC_OR;
14488                 goto do_logic;
14489             case NOR:
14490                 mips32_op = OPC_NOR;
14491                 goto do_logic;
14492             case XOR32:
14493                 mips32_op = OPC_XOR;
14494             do_logic:
14495                 gen_logic(ctx, mips32_op, rd, rs, rt);
14496                 break;
14497                 /* Set less than */
14498             case SLT:
14499                 mips32_op = OPC_SLT;
14500                 goto do_slt;
14501             case SLTU:
14502                 mips32_op = OPC_SLTU;
14503             do_slt:
14504                 gen_slt(ctx, mips32_op, rd, rs, rt);
14505                 break;
14506             default:
14507                 goto pool32a_invalid;
14508             }
14509             break;
14510         case 0x18:
14511             minor = (ctx->opcode >> 6) & 0xf;
14512             switch (minor) {
14513                 /* Conditional moves */
14514             case MOVN: /* MUL */
14515                 if (ctx->insn_flags & ISA_MIPS32R6) {
14516                     /* MUL */
14517                     gen_r6_muldiv(ctx, R6_OPC_MUL, rd, rs, rt);
14518                 } else {
14519                     /* MOVN */
14520                     gen_cond_move(ctx, OPC_MOVN, rd, rs, rt);
14521                 }
14522                 break;
14523             case MOVZ: /* MUH */
14524                 if (ctx->insn_flags & ISA_MIPS32R6) {
14525                     /* MUH */
14526                     gen_r6_muldiv(ctx, R6_OPC_MUH, rd, rs, rt);
14527                 } else {
14528                     /* MOVZ */
14529                     gen_cond_move(ctx, OPC_MOVZ, rd, rs, rt);
14530                 }
14531                 break;
14532             case MULU:
14533                 check_insn(ctx, ISA_MIPS32R6);
14534                 gen_r6_muldiv(ctx, R6_OPC_MULU, rd, rs, rt);
14535                 break;
14536             case MUHU:
14537                 check_insn(ctx, ISA_MIPS32R6);
14538                 gen_r6_muldiv(ctx, R6_OPC_MUHU, rd, rs, rt);
14539                 break;
14540             case LWXS: /* DIV */
14541                 if (ctx->insn_flags & ISA_MIPS32R6) {
14542                     /* DIV */
14543                     gen_r6_muldiv(ctx, R6_OPC_DIV, rd, rs, rt);
14544                 } else {
14545                     /* LWXS */
14546                     gen_ldxs(ctx, rs, rt, rd);
14547                 }
14548                 break;
14549             case MOD:
14550                 check_insn(ctx, ISA_MIPS32R6);
14551                 gen_r6_muldiv(ctx, R6_OPC_MOD, rd, rs, rt);
14552                 break;
14553             case R6_DIVU:
14554                 check_insn(ctx, ISA_MIPS32R6);
14555                 gen_r6_muldiv(ctx, R6_OPC_DIVU, rd, rs, rt);
14556                 break;
14557             case MODU:
14558                 check_insn(ctx, ISA_MIPS32R6);
14559                 gen_r6_muldiv(ctx, R6_OPC_MODU, rd, rs, rt);
14560                 break;
14561             default:
14562                 goto pool32a_invalid;
14563             }
14564             break;
14565         case INS:
14566             gen_bitops(ctx, OPC_INS, rt, rs, rr, rd);
14567             return;
14568         case LSA:
14569             check_insn(ctx, ISA_MIPS32R6);
14570             gen_lsa(ctx, OPC_LSA, rd, rs, rt,
14571                     extract32(ctx->opcode, 9, 2));
14572             break;
14573         case ALIGN:
14574             check_insn(ctx, ISA_MIPS32R6);
14575             gen_align(ctx, 32, rd, rs, rt, extract32(ctx->opcode, 9, 2));
14576             break;
14577         case EXT:
14578             gen_bitops(ctx, OPC_EXT, rt, rs, rr, rd);
14579             return;
14580         case POOL32AXF:
14581             gen_pool32axf(env, ctx, rt, rs);
14582             break;
14583         case BREAK32:
14584             generate_exception_end(ctx, EXCP_BREAK);
14585             break;
14586         case SIGRIE:
14587             check_insn(ctx, ISA_MIPS32R6);
14588             generate_exception_end(ctx, EXCP_RI);
14589             break;
14590         default:
14591         pool32a_invalid:
14592                 MIPS_INVAL("pool32a");
14593                 generate_exception_end(ctx, EXCP_RI);
14594                 break;
14595         }
14596         break;
14597     case POOL32B:
14598         minor = (ctx->opcode >> 12) & 0xf;
14599         switch (minor) {
14600         case CACHE:
14601             check_cp0_enabled(ctx);
14602             if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
14603                 gen_cache_operation(ctx, rt, rs, imm);
14604             }
14605             break;
14606         case LWC2:
14607         case SWC2:
14608             /* COP2: Not implemented. */
14609             generate_exception_err(ctx, EXCP_CpU, 2);
14610             break;
14611 #ifdef TARGET_MIPS64
14612         case LDP:
14613         case SDP:
14614             check_insn(ctx, ISA_MIPS3);
14615             check_mips_64(ctx);
14616 #endif
14617             /* fall through */
14618         case LWP:
14619         case SWP:
14620             gen_ldst_pair(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
14621             break;
14622 #ifdef TARGET_MIPS64
14623         case LDM:
14624         case SDM:
14625             check_insn(ctx, ISA_MIPS3);
14626             check_mips_64(ctx);
14627 #endif
14628             /* fall through */
14629         case LWM32:
14630         case SWM32:
14631             gen_ldst_multiple(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
14632             break;
14633         default:
14634             MIPS_INVAL("pool32b");
14635             generate_exception_end(ctx, EXCP_RI);
14636             break;
14637         }
14638         break;
14639     case POOL32F:
14640         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
14641             minor = ctx->opcode & 0x3f;
14642             check_cp1_enabled(ctx);
14643             switch (minor) {
14644             case ALNV_PS:
14645                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14646                 mips32_op = OPC_ALNV_PS;
14647                 goto do_madd;
14648             case MADD_S:
14649                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14650                 mips32_op = OPC_MADD_S;
14651                 goto do_madd;
14652             case MADD_D:
14653                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14654                 mips32_op = OPC_MADD_D;
14655                 goto do_madd;
14656             case MADD_PS:
14657                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14658                 mips32_op = OPC_MADD_PS;
14659                 goto do_madd;
14660             case MSUB_S:
14661                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14662                 mips32_op = OPC_MSUB_S;
14663                 goto do_madd;
14664             case MSUB_D:
14665                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14666                 mips32_op = OPC_MSUB_D;
14667                 goto do_madd;
14668             case MSUB_PS:
14669                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14670                 mips32_op = OPC_MSUB_PS;
14671                 goto do_madd;
14672             case NMADD_S:
14673                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14674                 mips32_op = OPC_NMADD_S;
14675                 goto do_madd;
14676             case NMADD_D:
14677                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14678                 mips32_op = OPC_NMADD_D;
14679                 goto do_madd;
14680             case NMADD_PS:
14681                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14682                 mips32_op = OPC_NMADD_PS;
14683                 goto do_madd;
14684             case NMSUB_S:
14685                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14686                 mips32_op = OPC_NMSUB_S;
14687                 goto do_madd;
14688             case NMSUB_D:
14689                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14690                 mips32_op = OPC_NMSUB_D;
14691                 goto do_madd;
14692             case NMSUB_PS:
14693                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14694                 mips32_op = OPC_NMSUB_PS;
14695             do_madd:
14696                 gen_flt3_arith(ctx, mips32_op, rd, rr, rs, rt);
14697                 break;
14698             case CABS_COND_FMT:
14699                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14700                 cond = (ctx->opcode >> 6) & 0xf;
14701                 cc = (ctx->opcode >> 13) & 0x7;
14702                 fmt = (ctx->opcode >> 10) & 0x3;
14703                 switch (fmt) {
14704                 case 0x0:
14705                     gen_cmpabs_s(ctx, cond, rt, rs, cc);
14706                     break;
14707                 case 0x1:
14708                     gen_cmpabs_d(ctx, cond, rt, rs, cc);
14709                     break;
14710                 case 0x2:
14711                     gen_cmpabs_ps(ctx, cond, rt, rs, cc);
14712                     break;
14713                 default:
14714                     goto pool32f_invalid;
14715                 }
14716                 break;
14717             case C_COND_FMT:
14718                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14719                 cond = (ctx->opcode >> 6) & 0xf;
14720                 cc = (ctx->opcode >> 13) & 0x7;
14721                 fmt = (ctx->opcode >> 10) & 0x3;
14722                 switch (fmt) {
14723                 case 0x0:
14724                     gen_cmp_s(ctx, cond, rt, rs, cc);
14725                     break;
14726                 case 0x1:
14727                     gen_cmp_d(ctx, cond, rt, rs, cc);
14728                     break;
14729                 case 0x2:
14730                     gen_cmp_ps(ctx, cond, rt, rs, cc);
14731                     break;
14732                 default:
14733                     goto pool32f_invalid;
14734                 }
14735                 break;
14736             case CMP_CONDN_S:
14737                 check_insn(ctx, ISA_MIPS32R6);
14738                 gen_r6_cmp_s(ctx, (ctx->opcode >> 6) & 0x1f, rt, rs, rd);
14739                 break;
14740             case CMP_CONDN_D:
14741                 check_insn(ctx, ISA_MIPS32R6);
14742                 gen_r6_cmp_d(ctx, (ctx->opcode >> 6) & 0x1f, rt, rs, rd);
14743                 break;
14744             case POOL32FXF:
14745                 gen_pool32fxf(ctx, rt, rs);
14746                 break;
14747             case 0x00:
14748                 /* PLL foo */
14749                 switch ((ctx->opcode >> 6) & 0x7) {
14750                 case PLL_PS:
14751                     mips32_op = OPC_PLL_PS;
14752                     goto do_ps;
14753                 case PLU_PS:
14754                     mips32_op = OPC_PLU_PS;
14755                     goto do_ps;
14756                 case PUL_PS:
14757                     mips32_op = OPC_PUL_PS;
14758                     goto do_ps;
14759                 case PUU_PS:
14760                     mips32_op = OPC_PUU_PS;
14761                     goto do_ps;
14762                 case CVT_PS_S:
14763                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14764                     mips32_op = OPC_CVT_PS_S;
14765                 do_ps:
14766                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
14767                     break;
14768                 default:
14769                     goto pool32f_invalid;
14770                 }
14771                 break;
14772             case MIN_FMT:
14773                 check_insn(ctx, ISA_MIPS32R6);
14774                 switch ((ctx->opcode >> 9) & 0x3) {
14775                 case FMT_SDPS_S:
14776                     gen_farith(ctx, OPC_MIN_S, rt, rs, rd, 0);
14777                     break;
14778                 case FMT_SDPS_D:
14779                     gen_farith(ctx, OPC_MIN_D, rt, rs, rd, 0);
14780                     break;
14781                 default:
14782                     goto pool32f_invalid;
14783                 }
14784                 break;
14785             case 0x08:
14786                 /* [LS][WDU]XC1 */
14787                 switch ((ctx->opcode >> 6) & 0x7) {
14788                 case LWXC1:
14789                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14790                     mips32_op = OPC_LWXC1;
14791                     goto do_ldst_cp1;
14792                 case SWXC1:
14793                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14794                     mips32_op = OPC_SWXC1;
14795                     goto do_ldst_cp1;
14796                 case LDXC1:
14797                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14798                     mips32_op = OPC_LDXC1;
14799                     goto do_ldst_cp1;
14800                 case SDXC1:
14801                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14802                     mips32_op = OPC_SDXC1;
14803                     goto do_ldst_cp1;
14804                 case LUXC1:
14805                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14806                     mips32_op = OPC_LUXC1;
14807                     goto do_ldst_cp1;
14808                 case SUXC1:
14809                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14810                     mips32_op = OPC_SUXC1;
14811                 do_ldst_cp1:
14812                     gen_flt3_ldst(ctx, mips32_op, rd, rd, rt, rs);
14813                     break;
14814                 default:
14815                     goto pool32f_invalid;
14816                 }
14817                 break;
14818             case MAX_FMT:
14819                 check_insn(ctx, ISA_MIPS32R6);
14820                 switch ((ctx->opcode >> 9) & 0x3) {
14821                 case FMT_SDPS_S:
14822                     gen_farith(ctx, OPC_MAX_S, rt, rs, rd, 0);
14823                     break;
14824                 case FMT_SDPS_D:
14825                     gen_farith(ctx, OPC_MAX_D, rt, rs, rd, 0);
14826                     break;
14827                 default:
14828                     goto pool32f_invalid;
14829                 }
14830                 break;
14831             case 0x18:
14832                 /* 3D insns */
14833                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14834                 fmt = (ctx->opcode >> 9) & 0x3;
14835                 switch ((ctx->opcode >> 6) & 0x7) {
14836                 case RSQRT2_FMT:
14837                     switch (fmt) {
14838                     case FMT_SDPS_S:
14839                         mips32_op = OPC_RSQRT2_S;
14840                         goto do_3d;
14841                     case FMT_SDPS_D:
14842                         mips32_op = OPC_RSQRT2_D;
14843                         goto do_3d;
14844                     case FMT_SDPS_PS:
14845                         mips32_op = OPC_RSQRT2_PS;
14846                         goto do_3d;
14847                     default:
14848                         goto pool32f_invalid;
14849                     }
14850                     break;
14851                 case RECIP2_FMT:
14852                     switch (fmt) {
14853                     case FMT_SDPS_S:
14854                         mips32_op = OPC_RECIP2_S;
14855                         goto do_3d;
14856                     case FMT_SDPS_D:
14857                         mips32_op = OPC_RECIP2_D;
14858                         goto do_3d;
14859                     case FMT_SDPS_PS:
14860                         mips32_op = OPC_RECIP2_PS;
14861                         goto do_3d;
14862                     default:
14863                         goto pool32f_invalid;
14864                     }
14865                     break;
14866                 case ADDR_PS:
14867                     mips32_op = OPC_ADDR_PS;
14868                     goto do_3d;
14869                 case MULR_PS:
14870                     mips32_op = OPC_MULR_PS;
14871                 do_3d:
14872                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
14873                     break;
14874                 default:
14875                     goto pool32f_invalid;
14876                 }
14877                 break;
14878             case 0x20:
14879                 /* MOV[FT].fmt, PREFX, RINT.fmt, CLASS.fmt*/
14880                 cc = (ctx->opcode >> 13) & 0x7;
14881                 fmt = (ctx->opcode >> 9) & 0x3;
14882                 switch ((ctx->opcode >> 6) & 0x7) {
14883                 case MOVF_FMT: /* RINT_FMT */
14884                     if (ctx->insn_flags & ISA_MIPS32R6) {
14885                         /* RINT_FMT */
14886                         switch (fmt) {
14887                         case FMT_SDPS_S:
14888                             gen_farith(ctx, OPC_RINT_S, 0, rt, rs, 0);
14889                             break;
14890                         case FMT_SDPS_D:
14891                             gen_farith(ctx, OPC_RINT_D, 0, rt, rs, 0);
14892                             break;
14893                         default:
14894                             goto pool32f_invalid;
14895                         }
14896                     } else {
14897                         /* MOVF_FMT */
14898                         switch (fmt) {
14899                         case FMT_SDPS_S:
14900                             gen_movcf_s(ctx, rs, rt, cc, 0);
14901                             break;
14902                         case FMT_SDPS_D:
14903                             gen_movcf_d(ctx, rs, rt, cc, 0);
14904                             break;
14905                         case FMT_SDPS_PS:
14906                             check_ps(ctx);
14907                             gen_movcf_ps(ctx, rs, rt, cc, 0);
14908                             break;
14909                         default:
14910                             goto pool32f_invalid;
14911                         }
14912                     }
14913                     break;
14914                 case MOVT_FMT: /* CLASS_FMT */
14915                     if (ctx->insn_flags & ISA_MIPS32R6) {
14916                         /* CLASS_FMT */
14917                         switch (fmt) {
14918                         case FMT_SDPS_S:
14919                             gen_farith(ctx, OPC_CLASS_S, 0, rt, rs, 0);
14920                             break;
14921                         case FMT_SDPS_D:
14922                             gen_farith(ctx, OPC_CLASS_D, 0, rt, rs, 0);
14923                             break;
14924                         default:
14925                             goto pool32f_invalid;
14926                         }
14927                     } else {
14928                         /* MOVT_FMT */
14929                         switch (fmt) {
14930                         case FMT_SDPS_S:
14931                             gen_movcf_s(ctx, rs, rt, cc, 1);
14932                             break;
14933                         case FMT_SDPS_D:
14934                             gen_movcf_d(ctx, rs, rt, cc, 1);
14935                             break;
14936                         case FMT_SDPS_PS:
14937                             check_ps(ctx);
14938                             gen_movcf_ps(ctx, rs, rt, cc, 1);
14939                             break;
14940                         default:
14941                             goto pool32f_invalid;
14942                         }
14943                     }
14944                     break;
14945                 case PREFX:
14946                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14947                     break;
14948                 default:
14949                     goto pool32f_invalid;
14950                 }
14951                 break;
14952 #define FINSN_3ARG_SDPS(prfx)                           \
14953                 switch ((ctx->opcode >> 8) & 0x3) {     \
14954                 case FMT_SDPS_S:                        \
14955                     mips32_op = OPC_##prfx##_S;         \
14956                     goto do_fpop;                       \
14957                 case FMT_SDPS_D:                        \
14958                     mips32_op = OPC_##prfx##_D;         \
14959                     goto do_fpop;                       \
14960                 case FMT_SDPS_PS:                       \
14961                     check_ps(ctx);                      \
14962                     mips32_op = OPC_##prfx##_PS;        \
14963                     goto do_fpop;                       \
14964                 default:                                \
14965                     goto pool32f_invalid;               \
14966                 }
14967             case MINA_FMT:
14968                 check_insn(ctx, ISA_MIPS32R6);
14969                 switch ((ctx->opcode >> 9) & 0x3) {
14970                 case FMT_SDPS_S:
14971                     gen_farith(ctx, OPC_MINA_S, rt, rs, rd, 0);
14972                     break;
14973                 case FMT_SDPS_D:
14974                     gen_farith(ctx, OPC_MINA_D, rt, rs, rd, 0);
14975                     break;
14976                 default:
14977                     goto pool32f_invalid;
14978                 }
14979                 break;
14980             case MAXA_FMT:
14981                 check_insn(ctx, ISA_MIPS32R6);
14982                 switch ((ctx->opcode >> 9) & 0x3) {
14983                 case FMT_SDPS_S:
14984                     gen_farith(ctx, OPC_MAXA_S, rt, rs, rd, 0);
14985                     break;
14986                 case FMT_SDPS_D:
14987                     gen_farith(ctx, OPC_MAXA_D, rt, rs, rd, 0);
14988                     break;
14989                 default:
14990                     goto pool32f_invalid;
14991                 }
14992                 break;
14993             case 0x30:
14994                 /* regular FP ops */
14995                 switch ((ctx->opcode >> 6) & 0x3) {
14996                 case ADD_FMT:
14997                     FINSN_3ARG_SDPS(ADD);
14998                     break;
14999                 case SUB_FMT:
15000                     FINSN_3ARG_SDPS(SUB);
15001                     break;
15002                 case MUL_FMT:
15003                     FINSN_3ARG_SDPS(MUL);
15004                     break;
15005                 case DIV_FMT:
15006                     fmt = (ctx->opcode >> 8) & 0x3;
15007                     if (fmt == 1) {
15008                         mips32_op = OPC_DIV_D;
15009                     } else if (fmt == 0) {
15010                         mips32_op = OPC_DIV_S;
15011                     } else {
15012                         goto pool32f_invalid;
15013                     }
15014                     goto do_fpop;
15015                 default:
15016                     goto pool32f_invalid;
15017                 }
15018                 break;
15019             case 0x38:
15020                 /* cmovs */
15021                 switch ((ctx->opcode >> 6) & 0x7) {
15022                 case MOVN_FMT: /* SELNEZ_FMT */
15023                     if (ctx->insn_flags & ISA_MIPS32R6) {
15024                         /* SELNEZ_FMT */
15025                         switch ((ctx->opcode >> 9) & 0x3) {
15026                         case FMT_SDPS_S:
15027                             gen_sel_s(ctx, OPC_SELNEZ_S, rd, rt, rs);
15028                             break;
15029                         case FMT_SDPS_D:
15030                             gen_sel_d(ctx, OPC_SELNEZ_D, rd, rt, rs);
15031                             break;
15032                         default:
15033                             goto pool32f_invalid;
15034                         }
15035                     } else {
15036                         /* MOVN_FMT */
15037                         FINSN_3ARG_SDPS(MOVN);
15038                     }
15039                     break;
15040                 case MOVN_FMT_04:
15041                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15042                     FINSN_3ARG_SDPS(MOVN);
15043                     break;
15044                 case MOVZ_FMT: /* SELEQZ_FMT */
15045                     if (ctx->insn_flags & ISA_MIPS32R6) {
15046                         /* SELEQZ_FMT */
15047                         switch ((ctx->opcode >> 9) & 0x3) {
15048                         case FMT_SDPS_S:
15049                             gen_sel_s(ctx, OPC_SELEQZ_S, rd, rt, rs);
15050                             break;
15051                         case FMT_SDPS_D:
15052                             gen_sel_d(ctx, OPC_SELEQZ_D, rd, rt, rs);
15053                             break;
15054                         default:
15055                             goto pool32f_invalid;
15056                         }
15057                     } else {
15058                         /* MOVZ_FMT */
15059                         FINSN_3ARG_SDPS(MOVZ);
15060                     }
15061                     break;
15062                 case MOVZ_FMT_05:
15063                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15064                     FINSN_3ARG_SDPS(MOVZ);
15065                     break;
15066                 case SEL_FMT:
15067                     check_insn(ctx, ISA_MIPS32R6);
15068                     switch ((ctx->opcode >> 9) & 0x3) {
15069                     case FMT_SDPS_S:
15070                         gen_sel_s(ctx, OPC_SEL_S, rd, rt, rs);
15071                         break;
15072                     case FMT_SDPS_D:
15073                         gen_sel_d(ctx, OPC_SEL_D, rd, rt, rs);
15074                         break;
15075                     default:
15076                         goto pool32f_invalid;
15077                     }
15078                     break;
15079                 case MADDF_FMT:
15080                     check_insn(ctx, ISA_MIPS32R6);
15081                     switch ((ctx->opcode >> 9) & 0x3) {
15082                     case FMT_SDPS_S:
15083                         mips32_op = OPC_MADDF_S;
15084                         goto do_fpop;
15085                     case FMT_SDPS_D:
15086                         mips32_op = OPC_MADDF_D;
15087                         goto do_fpop;
15088                     default:
15089                         goto pool32f_invalid;
15090                     }
15091                     break;
15092                 case MSUBF_FMT:
15093                     check_insn(ctx, ISA_MIPS32R6);
15094                     switch ((ctx->opcode >> 9) & 0x3) {
15095                     case FMT_SDPS_S:
15096                         mips32_op = OPC_MSUBF_S;
15097                         goto do_fpop;
15098                     case FMT_SDPS_D:
15099                         mips32_op = OPC_MSUBF_D;
15100                         goto do_fpop;
15101                     default:
15102                         goto pool32f_invalid;
15103                     }
15104                     break;
15105                 default:
15106                     goto pool32f_invalid;
15107                 }
15108                 break;
15109             do_fpop:
15110                 gen_farith(ctx, mips32_op, rt, rs, rd, 0);
15111                 break;
15112             default:
15113             pool32f_invalid:
15114                 MIPS_INVAL("pool32f");
15115                 generate_exception_end(ctx, EXCP_RI);
15116                 break;
15117             }
15118         } else {
15119             generate_exception_err(ctx, EXCP_CpU, 1);
15120         }
15121         break;
15122     case POOL32I:
15123         minor = (ctx->opcode >> 21) & 0x1f;
15124         switch (minor) {
15125         case BLTZ:
15126             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15127             gen_compute_branch(ctx, OPC_BLTZ, 4, rs, -1, imm << 1, 4);
15128             break;
15129         case BLTZAL:
15130             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15131             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 4);
15132             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15133             break;
15134         case BLTZALS:
15135             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15136             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 2);
15137             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15138             break;
15139         case BGEZ:
15140             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15141             gen_compute_branch(ctx, OPC_BGEZ, 4, rs, -1, imm << 1, 4);
15142             break;
15143         case BGEZAL:
15144             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15145             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 4);
15146             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15147             break;
15148         case BGEZALS:
15149             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15150             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 2);
15151             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15152             break;
15153         case BLEZ:
15154             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15155             gen_compute_branch(ctx, OPC_BLEZ, 4, rs, -1, imm << 1, 4);
15156             break;
15157         case BGTZ:
15158             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15159             gen_compute_branch(ctx, OPC_BGTZ, 4, rs, -1, imm << 1, 4);
15160             break;
15161
15162             /* Traps */
15163         case TLTI: /* BC1EQZC */
15164             if (ctx->insn_flags & ISA_MIPS32R6) {
15165                 /* BC1EQZC */
15166                 check_cp1_enabled(ctx);
15167                 gen_compute_branch1_r6(ctx, OPC_BC1EQZ, rs, imm << 1, 0);
15168             } else {
15169                 /* TLTI */
15170                 mips32_op = OPC_TLTI;
15171                 goto do_trapi;
15172             }
15173             break;
15174         case TGEI: /* BC1NEZC */
15175             if (ctx->insn_flags & ISA_MIPS32R6) {
15176                 /* BC1NEZC */
15177                 check_cp1_enabled(ctx);
15178                 gen_compute_branch1_r6(ctx, OPC_BC1NEZ, rs, imm << 1, 0);
15179             } else {
15180                 /* TGEI */
15181                 mips32_op = OPC_TGEI;
15182                 goto do_trapi;
15183             }
15184             break;
15185         case TLTIU:
15186             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15187             mips32_op = OPC_TLTIU;
15188             goto do_trapi;
15189         case TGEIU:
15190             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15191             mips32_op = OPC_TGEIU;
15192             goto do_trapi;
15193         case TNEI: /* SYNCI */
15194             if (ctx->insn_flags & ISA_MIPS32R6) {
15195                 /* SYNCI */
15196                 /* Break the TB to be able to sync copied instructions
15197                    immediately */
15198                 ctx->base.is_jmp = DISAS_STOP;
15199             } else {
15200                 /* TNEI */
15201                 mips32_op = OPC_TNEI;
15202                 goto do_trapi;
15203             }
15204             break;
15205         case TEQI:
15206             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15207             mips32_op = OPC_TEQI;
15208         do_trapi:
15209             gen_trap(ctx, mips32_op, rs, -1, imm);
15210             break;
15211
15212         case BNEZC:
15213         case BEQZC:
15214             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15215             gen_compute_branch(ctx, minor == BNEZC ? OPC_BNE : OPC_BEQ,
15216                                4, rs, 0, imm << 1, 0);
15217             /* Compact branches don't have a delay slot, so just let
15218                the normal delay slot handling take us to the branch
15219                target. */
15220             break;
15221         case LUI:
15222             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15223             gen_logic_imm(ctx, OPC_LUI, rs, 0, imm);
15224             break;
15225         case SYNCI:
15226             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15227             /* Break the TB to be able to sync copied instructions
15228                immediately */
15229             ctx->base.is_jmp = DISAS_STOP;
15230             break;
15231         case BC2F:
15232         case BC2T:
15233             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15234             /* COP2: Not implemented. */
15235             generate_exception_err(ctx, EXCP_CpU, 2);
15236             break;
15237         case BC1F:
15238             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15239             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1FANY2 : OPC_BC1F;
15240             goto do_cp1branch;
15241         case BC1T:
15242             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15243             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1TANY2 : OPC_BC1T;
15244             goto do_cp1branch;
15245         case BC1ANY4F:
15246             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15247             mips32_op = OPC_BC1FANY4;
15248             goto do_cp1mips3d;
15249         case BC1ANY4T:
15250             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15251             mips32_op = OPC_BC1TANY4;
15252         do_cp1mips3d:
15253             check_cop1x(ctx);
15254             check_insn(ctx, ASE_MIPS3D);
15255             /* Fall through */
15256         do_cp1branch:
15257             if (env->CP0_Config1 & (1 << CP0C1_FP)) {
15258                 check_cp1_enabled(ctx);
15259                 gen_compute_branch1(ctx, mips32_op,
15260                                     (ctx->opcode >> 18) & 0x7, imm << 1);
15261             } else {
15262                 generate_exception_err(ctx, EXCP_CpU, 1);
15263             }
15264             break;
15265         case BPOSGE64:
15266         case BPOSGE32:
15267             /* MIPS DSP: not implemented */
15268             /* Fall through */
15269         default:
15270             MIPS_INVAL("pool32i");
15271             generate_exception_end(ctx, EXCP_RI);
15272             break;
15273         }
15274         break;
15275     case POOL32C:
15276         minor = (ctx->opcode >> 12) & 0xf;
15277         offset = sextract32(ctx->opcode, 0,
15278                             (ctx->insn_flags & ISA_MIPS32R6) ? 9 : 12);
15279         switch (minor) {
15280         case LWL:
15281             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15282             mips32_op = OPC_LWL;
15283             goto do_ld_lr;
15284         case SWL:
15285             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15286             mips32_op = OPC_SWL;
15287             goto do_st_lr;
15288         case LWR:
15289             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15290             mips32_op = OPC_LWR;
15291             goto do_ld_lr;
15292         case SWR:
15293             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15294             mips32_op = OPC_SWR;
15295             goto do_st_lr;
15296 #if defined(TARGET_MIPS64)
15297         case LDL:
15298             check_insn(ctx, ISA_MIPS3);
15299             check_mips_64(ctx);
15300             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15301             mips32_op = OPC_LDL;
15302             goto do_ld_lr;
15303         case SDL:
15304             check_insn(ctx, ISA_MIPS3);
15305             check_mips_64(ctx);
15306             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15307             mips32_op = OPC_SDL;
15308             goto do_st_lr;
15309         case LDR:
15310             check_insn(ctx, ISA_MIPS3);
15311             check_mips_64(ctx);
15312             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15313             mips32_op = OPC_LDR;
15314             goto do_ld_lr;
15315         case SDR:
15316             check_insn(ctx, ISA_MIPS3);
15317             check_mips_64(ctx);
15318             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15319             mips32_op = OPC_SDR;
15320             goto do_st_lr;
15321         case LWU:
15322             check_insn(ctx, ISA_MIPS3);
15323             check_mips_64(ctx);
15324             mips32_op = OPC_LWU;
15325             goto do_ld_lr;
15326         case LLD:
15327             check_insn(ctx, ISA_MIPS3);
15328             check_mips_64(ctx);
15329             mips32_op = OPC_LLD;
15330             goto do_ld_lr;
15331 #endif
15332         case LL:
15333             mips32_op = OPC_LL;
15334             goto do_ld_lr;
15335         do_ld_lr:
15336             gen_ld(ctx, mips32_op, rt, rs, offset);
15337             break;
15338         do_st_lr:
15339             gen_st(ctx, mips32_op, rt, rs, offset);
15340             break;
15341         case SC:
15342             gen_st_cond(ctx, OPC_SC, rt, rs, offset);
15343             break;
15344 #if defined(TARGET_MIPS64)
15345         case SCD:
15346             check_insn(ctx, ISA_MIPS3);
15347             check_mips_64(ctx);
15348             gen_st_cond(ctx, OPC_SCD, rt, rs, offset);
15349             break;
15350 #endif
15351         case LD_EVA:
15352             if (!ctx->eva) {
15353                 MIPS_INVAL("pool32c ld-eva");
15354                 generate_exception_end(ctx, EXCP_RI);
15355                 break;
15356             }
15357             check_cp0_enabled(ctx);
15358
15359             minor2 = (ctx->opcode >> 9) & 0x7;
15360             offset = sextract32(ctx->opcode, 0, 9);
15361             switch (minor2) {
15362             case LBUE:
15363                 mips32_op = OPC_LBUE;
15364                 goto do_ld_lr;
15365             case LHUE:
15366                 mips32_op = OPC_LHUE;
15367                 goto do_ld_lr;
15368             case LWLE:
15369                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15370                 mips32_op = OPC_LWLE;
15371                 goto do_ld_lr;
15372             case LWRE:
15373                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15374                 mips32_op = OPC_LWRE;
15375                 goto do_ld_lr;
15376             case LBE:
15377                 mips32_op = OPC_LBE;
15378                 goto do_ld_lr;
15379             case LHE:
15380                 mips32_op = OPC_LHE;
15381                 goto do_ld_lr;
15382             case LLE:
15383                 mips32_op = OPC_LLE;
15384                 goto do_ld_lr;
15385             case LWE:
15386                 mips32_op = OPC_LWE;
15387                 goto do_ld_lr;
15388             };
15389             break;
15390         case ST_EVA:
15391             if (!ctx->eva) {
15392                 MIPS_INVAL("pool32c st-eva");
15393                 generate_exception_end(ctx, EXCP_RI);
15394                 break;
15395             }
15396             check_cp0_enabled(ctx);
15397
15398             minor2 = (ctx->opcode >> 9) & 0x7;
15399             offset = sextract32(ctx->opcode, 0, 9);
15400             switch (minor2) {
15401             case SWLE:
15402                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15403                 mips32_op = OPC_SWLE;
15404                 goto do_st_lr;
15405             case SWRE:
15406                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15407                 mips32_op = OPC_SWRE;
15408                 goto do_st_lr;
15409             case PREFE:
15410                 /* Treat as no-op */
15411                 if ((ctx->insn_flags & ISA_MIPS32R6) && (rt >= 24)) {
15412                     /* hint codes 24-31 are reserved and signal RI */
15413                     generate_exception(ctx, EXCP_RI);
15414                 }
15415                 break;
15416             case CACHEE:
15417                 /* Treat as no-op */
15418                 if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
15419                     gen_cache_operation(ctx, rt, rs, offset);
15420                 }
15421                 break;
15422             case SBE:
15423                 mips32_op = OPC_SBE;
15424                 goto do_st_lr;
15425             case SHE:
15426                 mips32_op = OPC_SHE;
15427                 goto do_st_lr;
15428             case SCE:
15429                 gen_st_cond(ctx, OPC_SCE, rt, rs, offset);
15430                 break;
15431             case SWE:
15432                 mips32_op = OPC_SWE;
15433                 goto do_st_lr;
15434             };
15435             break;
15436         case PREF:
15437             /* Treat as no-op */
15438             if ((ctx->insn_flags & ISA_MIPS32R6) && (rt >= 24)) {
15439                 /* hint codes 24-31 are reserved and signal RI */
15440                 generate_exception(ctx, EXCP_RI);
15441             }
15442             break;
15443         default:
15444             MIPS_INVAL("pool32c");
15445             generate_exception_end(ctx, EXCP_RI);
15446             break;
15447         }
15448         break;
15449     case ADDI32: /* AUI, LUI */
15450         if (ctx->insn_flags & ISA_MIPS32R6) {
15451             /* AUI, LUI */
15452             gen_logic_imm(ctx, OPC_LUI, rt, rs, imm);
15453         } else {
15454             /* ADDI32 */
15455             mips32_op = OPC_ADDI;
15456             goto do_addi;
15457         }
15458         break;
15459     case ADDIU32:
15460         mips32_op = OPC_ADDIU;
15461     do_addi:
15462         gen_arith_imm(ctx, mips32_op, rt, rs, imm);
15463         break;
15464
15465         /* Logical operations */
15466     case ORI32:
15467         mips32_op = OPC_ORI;
15468         goto do_logici;
15469     case XORI32:
15470         mips32_op = OPC_XORI;
15471         goto do_logici;
15472     case ANDI32:
15473         mips32_op = OPC_ANDI;
15474     do_logici:
15475         gen_logic_imm(ctx, mips32_op, rt, rs, imm);
15476         break;
15477
15478         /* Set less than immediate */
15479     case SLTI32:
15480         mips32_op = OPC_SLTI;
15481         goto do_slti;
15482     case SLTIU32:
15483         mips32_op = OPC_SLTIU;
15484     do_slti:
15485         gen_slt_imm(ctx, mips32_op, rt, rs, imm);
15486         break;
15487     case JALX32:
15488         check_insn_opc_removed(ctx, ISA_MIPS32R6);
15489         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
15490         gen_compute_branch(ctx, OPC_JALX, 4, rt, rs, offset, 4);
15491         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15492         break;
15493     case JALS32: /* BOVC, BEQC, BEQZALC */
15494         if (ctx->insn_flags & ISA_MIPS32R6) {
15495             if (rs >= rt) {
15496                 /* BOVC */
15497                 mips32_op = OPC_BOVC;
15498             } else if (rs < rt && rs == 0) {
15499                 /* BEQZALC */
15500                 mips32_op = OPC_BEQZALC;
15501             } else {
15502                 /* BEQC */
15503                 mips32_op = OPC_BEQC;
15504             }
15505             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
15506         } else {
15507             /* JALS32 */
15508             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 1;
15509             gen_compute_branch(ctx, OPC_JAL, 4, rt, rs, offset, 2);
15510             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15511         }
15512         break;
15513     case BEQ32: /* BC */
15514         if (ctx->insn_flags & ISA_MIPS32R6) {
15515             /* BC */
15516             gen_compute_compact_branch(ctx, OPC_BC, 0, 0,
15517                                        sextract32(ctx->opcode << 1, 0, 27));
15518         } else {
15519             /* BEQ32 */
15520             gen_compute_branch(ctx, OPC_BEQ, 4, rt, rs, imm << 1, 4);
15521         }
15522         break;
15523     case BNE32: /* BALC */
15524         if (ctx->insn_flags & ISA_MIPS32R6) {
15525             /* BALC */
15526             gen_compute_compact_branch(ctx, OPC_BALC, 0, 0,
15527                                        sextract32(ctx->opcode << 1, 0, 27));
15528         } else {
15529             /* BNE32 */
15530             gen_compute_branch(ctx, OPC_BNE, 4, rt, rs, imm << 1, 4);
15531         }
15532         break;
15533     case J32: /* BGTZC, BLTZC, BLTC */
15534         if (ctx->insn_flags & ISA_MIPS32R6) {
15535             if (rs == 0 && rt != 0) {
15536                 /* BGTZC */
15537                 mips32_op = OPC_BGTZC;
15538             } else if (rs != 0 && rt != 0 && rs == rt) {
15539                 /* BLTZC */
15540                 mips32_op = OPC_BLTZC;
15541             } else {
15542                 /* BLTC */
15543                 mips32_op = OPC_BLTC;
15544             }
15545             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
15546         } else {
15547             /* J32 */
15548             gen_compute_branch(ctx, OPC_J, 4, rt, rs,
15549                                (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
15550         }
15551         break;
15552     case JAL32: /* BLEZC, BGEZC, BGEC */
15553         if (ctx->insn_flags & ISA_MIPS32R6) {
15554             if (rs == 0 && rt != 0) {
15555                 /* BLEZC */
15556                 mips32_op = OPC_BLEZC;
15557             } else if (rs != 0 && rt != 0 && rs == rt) {
15558                 /* BGEZC */
15559                 mips32_op = OPC_BGEZC;
15560             } else {
15561                 /* BGEC */
15562                 mips32_op = OPC_BGEC;
15563             }
15564             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
15565         } else {
15566             /* JAL32 */
15567             gen_compute_branch(ctx, OPC_JAL, 4, rt, rs,
15568                                (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
15569             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15570         }
15571         break;
15572         /* Floating point (COP1) */
15573     case LWC132:
15574         mips32_op = OPC_LWC1;
15575         goto do_cop1;
15576     case LDC132:
15577         mips32_op = OPC_LDC1;
15578         goto do_cop1;
15579     case SWC132:
15580         mips32_op = OPC_SWC1;
15581         goto do_cop1;
15582     case SDC132:
15583         mips32_op = OPC_SDC1;
15584     do_cop1:
15585         gen_cop1_ldst(ctx, mips32_op, rt, rs, imm);
15586         break;
15587     case ADDIUPC: /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */
15588         if (ctx->insn_flags & ISA_MIPS32R6) {
15589             /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */
15590             switch ((ctx->opcode >> 16) & 0x1f) {
15591             case ADDIUPC_00:
15592             case ADDIUPC_01:
15593             case ADDIUPC_02:
15594             case ADDIUPC_03:
15595             case ADDIUPC_04:
15596             case ADDIUPC_05:
15597             case ADDIUPC_06:
15598             case ADDIUPC_07:
15599                 gen_pcrel(ctx, OPC_ADDIUPC, ctx->base.pc_next & ~0x3, rt);
15600                 break;
15601             case AUIPC:
15602                 gen_pcrel(ctx, OPC_AUIPC, ctx->base.pc_next, rt);
15603                 break;
15604             case ALUIPC:
15605                 gen_pcrel(ctx, OPC_ALUIPC, ctx->base.pc_next, rt);
15606                 break;
15607             case LWPC_08:
15608             case LWPC_09:
15609             case LWPC_0A:
15610             case LWPC_0B:
15611             case LWPC_0C:
15612             case LWPC_0D:
15613             case LWPC_0E:
15614             case LWPC_0F:
15615                 gen_pcrel(ctx, R6_OPC_LWPC, ctx->base.pc_next & ~0x3, rt);
15616                 break;
15617             default:
15618                 generate_exception(ctx, EXCP_RI);
15619                 break;
15620             }
15621         } else {
15622             /* ADDIUPC */
15623             int reg = mmreg(ZIMM(ctx->opcode, 23, 3));
15624             offset = SIMM(ctx->opcode, 0, 23) << 2;
15625
15626             gen_addiupc(ctx, reg, offset, 0, 0);
15627         }
15628         break;
15629     case BNVC: /* BNEC, BNEZALC */
15630         check_insn(ctx, ISA_MIPS32R6);
15631         if (rs >= rt) {
15632             /* BNVC */
15633             mips32_op = OPC_BNVC;
15634         } else if (rs < rt && rs == 0) {
15635             /* BNEZALC */
15636             mips32_op = OPC_BNEZALC;
15637         } else {
15638             /* BNEC */
15639             mips32_op = OPC_BNEC;
15640         }
15641         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
15642         break;
15643     case R6_BNEZC: /* JIALC */
15644         check_insn(ctx, ISA_MIPS32R6);
15645         if (rt != 0) {
15646             /* BNEZC */
15647             gen_compute_compact_branch(ctx, OPC_BNEZC, rt, 0,
15648                                        sextract32(ctx->opcode << 1, 0, 22));
15649         } else {
15650             /* JIALC */
15651             gen_compute_compact_branch(ctx, OPC_JIALC, 0, rs, imm);
15652         }
15653         break;
15654     case R6_BEQZC: /* JIC */
15655         check_insn(ctx, ISA_MIPS32R6);
15656         if (rt != 0) {
15657             /* BEQZC */
15658             gen_compute_compact_branch(ctx, OPC_BEQZC, rt, 0,
15659                                        sextract32(ctx->opcode << 1, 0, 22));
15660         } else {
15661             /* JIC */
15662             gen_compute_compact_branch(ctx, OPC_JIC, 0, rs, imm);
15663         }
15664         break;
15665     case BLEZALC: /* BGEZALC, BGEUC */
15666         check_insn(ctx, ISA_MIPS32R6);
15667         if (rs == 0 && rt != 0) {
15668             /* BLEZALC */
15669             mips32_op = OPC_BLEZALC;
15670         } else if (rs != 0 && rt != 0 && rs == rt) {
15671             /* BGEZALC */
15672             mips32_op = OPC_BGEZALC;
15673         } else {
15674             /* BGEUC */
15675             mips32_op = OPC_BGEUC;
15676         }
15677         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
15678         break;
15679     case BGTZALC: /* BLTZALC, BLTUC */
15680         check_insn(ctx, ISA_MIPS32R6);
15681         if (rs == 0 && rt != 0) {
15682             /* BGTZALC */
15683             mips32_op = OPC_BGTZALC;
15684         } else if (rs != 0 && rt != 0 && rs == rt) {
15685             /* BLTZALC */
15686             mips32_op = OPC_BLTZALC;
15687         } else {
15688             /* BLTUC */
15689             mips32_op = OPC_BLTUC;
15690         }
15691         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
15692         break;
15693         /* Loads and stores */
15694     case LB32:
15695         mips32_op = OPC_LB;
15696         goto do_ld;
15697     case LBU32:
15698         mips32_op = OPC_LBU;
15699         goto do_ld;
15700     case LH32:
15701         mips32_op = OPC_LH;
15702         goto do_ld;
15703     case LHU32:
15704         mips32_op = OPC_LHU;
15705         goto do_ld;
15706     case LW32:
15707         mips32_op = OPC_LW;
15708         goto do_ld;
15709 #ifdef TARGET_MIPS64
15710     case LD32:
15711         check_insn(ctx, ISA_MIPS3);
15712         check_mips_64(ctx);
15713         mips32_op = OPC_LD;
15714         goto do_ld;
15715     case SD32:
15716         check_insn(ctx, ISA_MIPS3);
15717         check_mips_64(ctx);
15718         mips32_op = OPC_SD;
15719         goto do_st;
15720 #endif
15721     case SB32:
15722         mips32_op = OPC_SB;
15723         goto do_st;
15724     case SH32:
15725         mips32_op = OPC_SH;
15726         goto do_st;
15727     case SW32:
15728         mips32_op = OPC_SW;
15729         goto do_st;
15730     do_ld:
15731         gen_ld(ctx, mips32_op, rt, rs, imm);
15732         break;
15733     do_st:
15734         gen_st(ctx, mips32_op, rt, rs, imm);
15735         break;
15736     default:
15737         generate_exception_end(ctx, EXCP_RI);
15738         break;
15739     }
15740 }
15741
15742 static int decode_micromips_opc (CPUMIPSState *env, DisasContext *ctx)
15743 {
15744     uint32_t op;
15745
15746     /* make sure instructions are on a halfword boundary */
15747     if (ctx->base.pc_next & 0x1) {
15748         env->CP0_BadVAddr = ctx->base.pc_next;
15749         generate_exception_end(ctx, EXCP_AdEL);
15750         return 2;
15751     }
15752
15753     op = (ctx->opcode >> 10) & 0x3f;
15754     /* Enforce properly-sized instructions in a delay slot */
15755     if (ctx->hflags & MIPS_HFLAG_BDS_STRICT) {
15756         switch (op & 0x7) { /* MSB-3..MSB-5 */
15757         case 0:
15758         /* POOL32A, POOL32B, POOL32I, POOL32C */
15759         case 4:
15760         /* ADDI32, ADDIU32, ORI32, XORI32, SLTI32, SLTIU32, ANDI32, JALX32 */
15761         case 5:
15762         /* LBU32, LHU32, POOL32F, JALS32, BEQ32, BNE32, J32, JAL32 */
15763         case 6:
15764         /* SB32, SH32, ADDIUPC, SWC132, SDC132, SW32 */
15765         case 7:
15766         /* LB32, LH32, LWC132, LDC132, LW32 */
15767             if (ctx->hflags & MIPS_HFLAG_BDS16) {
15768                 generate_exception_end(ctx, EXCP_RI);
15769                 return 2;
15770             }
15771             break;
15772         case 1:
15773         /* POOL16A, POOL16B, POOL16C, LWGP16, POOL16F */
15774         case 2:
15775         /* LBU16, LHU16, LWSP16, LW16, SB16, SH16, SWSP16, SW16 */
15776         case 3:
15777         /* MOVE16, ANDI16, POOL16D, POOL16E, BEQZ16, BNEZ16, B16, LI16 */
15778             if (ctx->hflags & MIPS_HFLAG_BDS32) {
15779                 generate_exception_end(ctx, EXCP_RI);
15780                 return 2;
15781             }
15782             break;
15783         }
15784     }
15785
15786     switch (op) {
15787     case POOL16A:
15788         {
15789             int rd = mmreg(uMIPS_RD(ctx->opcode));
15790             int rs1 = mmreg(uMIPS_RS1(ctx->opcode));
15791             int rs2 = mmreg(uMIPS_RS2(ctx->opcode));
15792             uint32_t opc = 0;
15793
15794             switch (ctx->opcode & 0x1) {
15795             case ADDU16:
15796                 opc = OPC_ADDU;
15797                 break;
15798             case SUBU16:
15799                 opc = OPC_SUBU;
15800                 break;
15801             }
15802             if (ctx->insn_flags & ISA_MIPS32R6) {
15803                 /* In the Release 6 the register number location in
15804                  * the instruction encoding has changed.
15805                  */
15806                 gen_arith(ctx, opc, rs1, rd, rs2);
15807             } else {
15808                 gen_arith(ctx, opc, rd, rs1, rs2);
15809             }
15810         }
15811         break;
15812     case POOL16B:
15813         {
15814             int rd = mmreg(uMIPS_RD(ctx->opcode));
15815             int rs = mmreg(uMIPS_RS(ctx->opcode));
15816             int amount = (ctx->opcode >> 1) & 0x7;
15817             uint32_t opc = 0;
15818             amount = amount == 0 ? 8 : amount;
15819
15820             switch (ctx->opcode & 0x1) {
15821             case SLL16:
15822                 opc = OPC_SLL;
15823                 break;
15824             case SRL16:
15825                 opc = OPC_SRL;
15826                 break;
15827             }
15828
15829             gen_shift_imm(ctx, opc, rd, rs, amount);
15830         }
15831         break;
15832     case POOL16C:
15833         if (ctx->insn_flags & ISA_MIPS32R6) {
15834             gen_pool16c_r6_insn(ctx);
15835         } else {
15836             gen_pool16c_insn(ctx);
15837         }
15838         break;
15839     case LWGP16:
15840         {
15841             int rd = mmreg(uMIPS_RD(ctx->opcode));
15842             int rb = 28;            /* GP */
15843             int16_t offset = SIMM(ctx->opcode, 0, 7) << 2;
15844
15845             gen_ld(ctx, OPC_LW, rd, rb, offset);
15846         }
15847         break;
15848     case POOL16F:
15849         check_insn_opc_removed(ctx, ISA_MIPS32R6);
15850         if (ctx->opcode & 1) {
15851             generate_exception_end(ctx, EXCP_RI);
15852         } else {
15853             /* MOVEP */
15854             int enc_dest = uMIPS_RD(ctx->opcode);
15855             int enc_rt = uMIPS_RS2(ctx->opcode);
15856             int enc_rs = uMIPS_RS1(ctx->opcode);
15857             gen_movep(ctx, enc_dest, enc_rt, enc_rs);
15858         }
15859         break;
15860     case LBU16:
15861         {
15862             int rd = mmreg(uMIPS_RD(ctx->opcode));
15863             int rb = mmreg(uMIPS_RS(ctx->opcode));
15864             int16_t offset = ZIMM(ctx->opcode, 0, 4);
15865             offset = (offset == 0xf ? -1 : offset);
15866
15867             gen_ld(ctx, OPC_LBU, rd, rb, offset);
15868         }
15869         break;
15870     case LHU16:
15871         {
15872             int rd = mmreg(uMIPS_RD(ctx->opcode));
15873             int rb = mmreg(uMIPS_RS(ctx->opcode));
15874             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
15875
15876             gen_ld(ctx, OPC_LHU, rd, rb, offset);
15877         }
15878         break;
15879     case LWSP16:
15880         {
15881             int rd = (ctx->opcode >> 5) & 0x1f;
15882             int rb = 29;            /* SP */
15883             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
15884
15885             gen_ld(ctx, OPC_LW, rd, rb, offset);
15886         }
15887         break;
15888     case LW16:
15889         {
15890             int rd = mmreg(uMIPS_RD(ctx->opcode));
15891             int rb = mmreg(uMIPS_RS(ctx->opcode));
15892             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
15893
15894             gen_ld(ctx, OPC_LW, rd, rb, offset);
15895         }
15896         break;
15897     case SB16:
15898         {
15899             int rd = mmreg2(uMIPS_RD(ctx->opcode));
15900             int rb = mmreg(uMIPS_RS(ctx->opcode));
15901             int16_t offset = ZIMM(ctx->opcode, 0, 4);
15902
15903             gen_st(ctx, OPC_SB, rd, rb, offset);
15904         }
15905         break;
15906     case SH16:
15907         {
15908             int rd = mmreg2(uMIPS_RD(ctx->opcode));
15909             int rb = mmreg(uMIPS_RS(ctx->opcode));
15910             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
15911
15912             gen_st(ctx, OPC_SH, rd, rb, offset);
15913         }
15914         break;
15915     case SWSP16:
15916         {
15917             int rd = (ctx->opcode >> 5) & 0x1f;
15918             int rb = 29;            /* SP */
15919             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
15920
15921             gen_st(ctx, OPC_SW, rd, rb, offset);
15922         }
15923         break;
15924     case SW16:
15925         {
15926             int rd = mmreg2(uMIPS_RD(ctx->opcode));
15927             int rb = mmreg(uMIPS_RS(ctx->opcode));
15928             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
15929
15930             gen_st(ctx, OPC_SW, rd, rb, offset);
15931         }
15932         break;
15933     case MOVE16:
15934         {
15935             int rd = uMIPS_RD5(ctx->opcode);
15936             int rs = uMIPS_RS5(ctx->opcode);
15937
15938             gen_arith(ctx, OPC_ADDU, rd, rs, 0);
15939         }
15940         break;
15941     case ANDI16:
15942         gen_andi16(ctx);
15943         break;
15944     case POOL16D:
15945         switch (ctx->opcode & 0x1) {
15946         case ADDIUS5:
15947             gen_addius5(ctx);
15948             break;
15949         case ADDIUSP:
15950             gen_addiusp(ctx);
15951             break;
15952         }
15953         break;
15954     case POOL16E:
15955         switch (ctx->opcode & 0x1) {
15956         case ADDIUR2:
15957             gen_addiur2(ctx);
15958             break;
15959         case ADDIUR1SP:
15960             gen_addiur1sp(ctx);
15961             break;
15962         }
15963         break;
15964     case B16: /* BC16 */
15965         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0,
15966                            sextract32(ctx->opcode, 0, 10) << 1,
15967                            (ctx->insn_flags & ISA_MIPS32R6) ? 0 : 4);
15968         break;
15969     case BNEZ16: /* BNEZC16 */
15970     case BEQZ16: /* BEQZC16 */
15971         gen_compute_branch(ctx, op == BNEZ16 ? OPC_BNE : OPC_BEQ, 2,
15972                            mmreg(uMIPS_RD(ctx->opcode)),
15973                            0, sextract32(ctx->opcode, 0, 7) << 1,
15974                            (ctx->insn_flags & ISA_MIPS32R6) ? 0 : 4);
15975
15976         break;
15977     case LI16:
15978         {
15979             int reg = mmreg(uMIPS_RD(ctx->opcode));
15980             int imm = ZIMM(ctx->opcode, 0, 7);
15981
15982             imm = (imm == 0x7f ? -1 : imm);
15983             tcg_gen_movi_tl(cpu_gpr[reg], imm);
15984         }
15985         break;
15986     case RES_29:
15987     case RES_31:
15988     case RES_39:
15989         generate_exception_end(ctx, EXCP_RI);
15990         break;
15991     default:
15992         decode_micromips32_opc(env, ctx);
15993         return 4;
15994     }
15995
15996     return 2;
15997 }
15998
15999 /*
16000  *
16001  * nanoMIPS opcodes
16002  *
16003  */
16004
16005 /* MAJOR, P16, and P32 pools opcodes */
16006 enum {
16007     NM_P_ADDIU      = 0x00,
16008     NM_ADDIUPC      = 0x01,
16009     NM_MOVE_BALC    = 0x02,
16010     NM_P16_MV       = 0x04,
16011     NM_LW16         = 0x05,
16012     NM_BC16         = 0x06,
16013     NM_P16_SR       = 0x07,
16014
16015     NM_POOL32A      = 0x08,
16016     NM_P_BAL        = 0x0a,
16017     NM_P16_SHIFT    = 0x0c,
16018     NM_LWSP16       = 0x0d,
16019     NM_BALC16       = 0x0e,
16020     NM_P16_4X4      = 0x0f,
16021
16022     NM_P_GP_W       = 0x10,
16023     NM_P_GP_BH      = 0x11,
16024     NM_P_J          = 0x12,
16025     NM_P16C         = 0x14,
16026     NM_LWGP16       = 0x15,
16027     NM_P16_LB       = 0x17,
16028
16029     NM_P48I         = 0x18,
16030     NM_P16_A1       = 0x1c,
16031     NM_LW4X4        = 0x1d,
16032     NM_P16_LH       = 0x1f,
16033
16034     NM_P_U12        = 0x20,
16035     NM_P_LS_U12     = 0x21,
16036     NM_P_BR1        = 0x22,
16037     NM_P16_A2       = 0x24,
16038     NM_SW16         = 0x25,
16039     NM_BEQZC16      = 0x26,
16040
16041     NM_POOL32F      = 0x28,
16042     NM_P_LS_S9      = 0x29,
16043     NM_P_BR2        = 0x2a,
16044
16045     NM_P16_ADDU     = 0x2c,
16046     NM_SWSP16       = 0x2d,
16047     NM_BNEZC16      = 0x2e,
16048     NM_MOVEP        = 0x2f,
16049
16050     NM_POOL32S      = 0x30,
16051     NM_P_BRI        = 0x32,
16052     NM_LI16         = 0x34,
16053     NM_SWGP16       = 0x35,
16054     NM_P16_BR       = 0x36,
16055
16056     NM_P_LUI        = 0x38,
16057     NM_ANDI16       = 0x3c,
16058     NM_SW4X4        = 0x3d,
16059     NM_MOVEPREV     = 0x3f,
16060 };
16061
16062 /* POOL32A instruction pool */
16063 enum {
16064     NM_POOL32A0    = 0x00,
16065     NM_SPECIAL2    = 0x01,
16066     NM_COP2_1      = 0x02,
16067     NM_UDI         = 0x03,
16068     NM_POOL32A5    = 0x05,
16069     NM_POOL32A7    = 0x07,
16070 };
16071
16072 /* P.GP.W instruction pool */
16073 enum {
16074     NM_ADDIUGP_W = 0x00,
16075     NM_LWGP      = 0x02,
16076     NM_SWGP      = 0x03,
16077 };
16078
16079 /* P48I instruction pool */
16080 enum {
16081     NM_LI48        = 0x00,
16082     NM_ADDIU48     = 0x01,
16083     NM_ADDIUGP48   = 0x02,
16084     NM_ADDIUPC48   = 0x03,
16085     NM_LWPC48      = 0x0b,
16086     NM_SWPC48      = 0x0f,
16087 };
16088
16089 /* P.U12 instruction pool */
16090 enum {
16091     NM_ORI      = 0x00,
16092     NM_XORI     = 0x01,
16093     NM_ANDI     = 0x02,
16094     NM_P_SR     = 0x03,
16095     NM_SLTI     = 0x04,
16096     NM_SLTIU    = 0x05,
16097     NM_SEQI     = 0x06,
16098     NM_ADDIUNEG = 0x08,
16099     NM_P_SHIFT  = 0x0c,
16100     NM_P_ROTX   = 0x0d,
16101     NM_P_INS    = 0x0e,
16102     NM_P_EXT    = 0x0f,
16103 };
16104
16105 /* POOL32F instruction pool */
16106 enum {
16107     NM_POOL32F_0   = 0x00,
16108     NM_POOL32F_3   = 0x03,
16109     NM_POOL32F_5   = 0x05,
16110 };
16111
16112 /* POOL32S instruction pool */
16113 enum {
16114     NM_POOL32S_0   = 0x00,
16115     NM_POOL32S_4   = 0x04,
16116 };
16117
16118 /* P.LUI instruction pool */
16119 enum {
16120     NM_LUI      = 0x00,
16121     NM_ALUIPC   = 0x01,
16122 };
16123
16124 /* P.GP.BH instruction pool */
16125 enum {
16126     NM_LBGP      = 0x00,
16127     NM_SBGP      = 0x01,
16128     NM_LBUGP     = 0x02,
16129     NM_ADDIUGP_B = 0x03,
16130     NM_P_GP_LH   = 0x04,
16131     NM_P_GP_SH   = 0x05,
16132     NM_P_GP_CP1  = 0x06,
16133 };
16134
16135 /* P.LS.U12 instruction pool */
16136 enum {
16137     NM_LB        = 0x00,
16138     NM_SB        = 0x01,
16139     NM_LBU       = 0x02,
16140     NM_P_PREFU12 = 0x03,
16141     NM_LH        = 0x04,
16142     NM_SH        = 0x05,
16143     NM_LHU       = 0x06,
16144     NM_LWU       = 0x07,
16145     NM_LW        = 0x08,
16146     NM_SW        = 0x09,
16147     NM_LWC1      = 0x0a,
16148     NM_SWC1      = 0x0b,
16149     NM_LDC1      = 0x0e,
16150     NM_SDC1      = 0x0f,
16151 };
16152
16153 /* P.LS.S9 instruction pool */
16154 enum {
16155     NM_P_LS_S0         = 0x00,
16156     NM_P_LS_S1         = 0x01,
16157     NM_P_LS_E0         = 0x02,
16158     NM_P_LS_WM         = 0x04,
16159     NM_P_LS_UAWM       = 0x05,
16160 };
16161
16162 /* P.BAL instruction pool */
16163 enum {
16164     NM_BC       = 0x00,
16165     NM_BALC     = 0x01,
16166 };
16167
16168 /* P.J instruction pool */
16169 enum {
16170     NM_JALRC    = 0x00,
16171     NM_JALRC_HB = 0x01,
16172     NM_P_BALRSC = 0x08,
16173 };
16174
16175 /* P.BR1 instruction pool */
16176 enum {
16177     NM_BEQC     = 0x00,
16178     NM_P_BR3A   = 0x01,
16179     NM_BGEC     = 0x02,
16180     NM_BGEUC    = 0x03,
16181 };
16182
16183 /* P.BR2 instruction pool */
16184 enum {
16185     NM_BNEC     = 0x00,
16186     NM_BLTC     = 0x02,
16187     NM_BLTUC    = 0x03,
16188 };
16189
16190 /* P.BRI instruction pool */
16191 enum {
16192     NM_BEQIC    = 0x00,
16193     NM_BBEQZC   = 0x01,
16194     NM_BGEIC    = 0x02,
16195     NM_BGEIUC   = 0x03,
16196     NM_BNEIC    = 0x04,
16197     NM_BBNEZC   = 0x05,
16198     NM_BLTIC    = 0x06,
16199     NM_BLTIUC   = 0x07,
16200 };
16201
16202 /* P16.SHIFT instruction pool */
16203 enum {
16204     NM_SLL16    = 0x00,
16205     NM_SRL16    = 0x01,
16206 };
16207
16208 /* POOL16C instruction pool */
16209 enum {
16210     NM_POOL16C_0  = 0x00,
16211     NM_LWXS16     = 0x01,
16212 };
16213
16214 /* P16.A1 instruction pool */
16215 enum {
16216     NM_ADDIUR1SP = 0x01,
16217 };
16218
16219 /* P16.A2 instruction pool */
16220 enum {
16221     NM_ADDIUR2  = 0x00,
16222     NM_P_ADDIURS5  = 0x01,
16223 };
16224
16225 /* P16.ADDU instruction pool */
16226 enum {
16227     NM_ADDU16     = 0x00,
16228     NM_SUBU16     = 0x01,
16229 };
16230
16231 /* P16.SR instruction pool */
16232 enum {
16233     NM_SAVE16        = 0x00,
16234     NM_RESTORE_JRC16 = 0x01,
16235 };
16236
16237 /* P16.4X4 instruction pool */
16238 enum {
16239     NM_ADDU4X4      = 0x00,
16240     NM_MUL4X4       = 0x01,
16241 };
16242
16243 /* P16.LB instruction pool */
16244 enum {
16245     NM_LB16       = 0x00,
16246     NM_SB16       = 0x01,
16247     NM_LBU16      = 0x02,
16248 };
16249
16250 /* P16.LH  instruction pool */
16251 enum {
16252     NM_LH16     = 0x00,
16253     NM_SH16     = 0x01,
16254     NM_LHU16    = 0x02,
16255 };
16256
16257 /* P.RI instruction pool */
16258 enum {
16259     NM_SIGRIE       = 0x00,
16260     NM_P_SYSCALL    = 0x01,
16261     NM_BREAK        = 0x02,
16262     NM_SDBBP        = 0x03,
16263 };
16264
16265 /* POOL32A0 instruction pool */
16266 enum {
16267     NM_P_TRAP   = 0x00,
16268     NM_SEB      = 0x01,
16269     NM_SLLV     = 0x02,
16270     NM_MUL      = 0x03,
16271     NM_MFC0     = 0x06,
16272     NM_MFHC0    = 0x07,
16273     NM_SEH      = 0x09,
16274     NM_SRLV     = 0x0a,
16275     NM_MUH      = 0x0b,
16276     NM_MTC0     = 0x0e,
16277     NM_MTHC0    = 0x0f,
16278     NM_SRAV     = 0x12,
16279     NM_MULU     = 0x13,
16280     NM_ROTRV    = 0x1a,
16281     NM_MUHU     = 0x1b,
16282     NM_ADD      = 0x22,
16283     NM_DIV      = 0x23,
16284     NM_ADDU     = 0x2a,
16285     NM_MOD      = 0x2b,
16286     NM_SUB      = 0x32,
16287     NM_DIVU     = 0x33,
16288     NM_RDHWR    = 0x38,
16289     NM_SUBU     = 0x3a,
16290     NM_MODU     = 0x3b,
16291     NM_P_CMOVE  = 0x42,
16292     NM_FORK     = 0x45,
16293     NM_MFTR     = 0x46,
16294     NM_MFHTR    = 0x47,
16295     NM_AND      = 0x4a,
16296     NM_YIELD    = 0x4d,
16297     NM_MTTR     = 0x4e,
16298     NM_MTHTR    = 0x4f,
16299     NM_OR       = 0x52,
16300     NM_D_E_MT_VPE = 0x56,
16301     NM_NOR      = 0x5a,
16302     NM_XOR      = 0x62,
16303     NM_SLT      = 0x6a,
16304     NM_P_SLTU   = 0x72,
16305     NM_SOV      = 0x7a,
16306 };
16307
16308 /* POOL32A5 instruction pool */
16309 enum {
16310     NM_CMP_EQ_PH        = 0x00,
16311     NM_CMP_LT_PH        = 0x08,
16312     NM_CMP_LE_PH        = 0x10,
16313     NM_CMPGU_EQ_QB      = 0x18,
16314     NM_CMPGU_LT_QB      = 0x20,
16315     NM_CMPGU_LE_QB      = 0x28,
16316     NM_CMPGDU_EQ_QB     = 0x30,
16317     NM_CMPGDU_LT_QB     = 0x38,
16318     NM_CMPGDU_LE_QB     = 0x40,
16319     NM_CMPU_EQ_QB       = 0x48,
16320     NM_CMPU_LT_QB       = 0x50,
16321     NM_CMPU_LE_QB       = 0x58,
16322     NM_ADDQ_S_W         = 0x60,
16323     NM_SUBQ_S_W         = 0x68,
16324     NM_ADDSC            = 0x70,
16325     NM_ADDWC            = 0x78,
16326
16327     NM_ADDQ_S_PH   = 0x01,
16328     NM_ADDQH_R_PH  = 0x09,
16329     NM_ADDQH_R_W   = 0x11,
16330     NM_ADDU_S_QB   = 0x19,
16331     NM_ADDU_S_PH   = 0x21,
16332     NM_ADDUH_R_QB  = 0x29,
16333     NM_SHRAV_R_PH  = 0x31,
16334     NM_SHRAV_R_QB  = 0x39,
16335     NM_SUBQ_S_PH   = 0x41,
16336     NM_SUBQH_R_PH  = 0x49,
16337     NM_SUBQH_R_W   = 0x51,
16338     NM_SUBU_S_QB   = 0x59,
16339     NM_SUBU_S_PH   = 0x61,
16340     NM_SUBUH_R_QB  = 0x69,
16341     NM_SHLLV_S_PH  = 0x71,
16342     NM_PRECR_SRA_R_PH_W = 0x79,
16343
16344     NM_MULEU_S_PH_QBL   = 0x12,
16345     NM_MULEU_S_PH_QBR   = 0x1a,
16346     NM_MULQ_RS_PH       = 0x22,
16347     NM_MULQ_S_PH        = 0x2a,
16348     NM_MULQ_RS_W        = 0x32,
16349     NM_MULQ_S_W         = 0x3a,
16350     NM_APPEND           = 0x42,
16351     NM_MODSUB           = 0x52,
16352     NM_SHRAV_R_W        = 0x5a,
16353     NM_SHRLV_PH         = 0x62,
16354     NM_SHRLV_QB         = 0x6a,
16355     NM_SHLLV_QB         = 0x72,
16356     NM_SHLLV_S_W        = 0x7a,
16357
16358     NM_SHILO            = 0x03,
16359
16360     NM_MULEQ_S_W_PHL    = 0x04,
16361     NM_MULEQ_S_W_PHR    = 0x0c,
16362
16363     NM_MUL_S_PH         = 0x05,
16364     NM_PRECR_QB_PH      = 0x0d,
16365     NM_PRECRQ_QB_PH     = 0x15,
16366     NM_PRECRQ_PH_W      = 0x1d,
16367     NM_PRECRQ_RS_PH_W   = 0x25,
16368     NM_PRECRQU_S_QB_PH  = 0x2d,
16369     NM_PACKRL_PH        = 0x35,
16370     NM_PICK_QB          = 0x3d,
16371     NM_PICK_PH          = 0x45,
16372
16373     NM_SHRA_R_W         = 0x5e,
16374     NM_SHRA_R_PH        = 0x66,
16375     NM_SHLL_S_PH        = 0x76,
16376     NM_SHLL_S_W         = 0x7e,
16377
16378     NM_REPL_PH          = 0x07
16379 };
16380
16381 /* POOL32A7 instruction pool */
16382 enum {
16383     NM_P_LSX        = 0x00,
16384     NM_LSA          = 0x01,
16385     NM_EXTW         = 0x03,
16386     NM_POOL32AXF    = 0x07,
16387 };
16388
16389 /* P.SR instruction pool */
16390 enum {
16391     NM_PP_SR           = 0x00,
16392     NM_P_SR_F          = 0x01,
16393 };
16394
16395 /* P.SHIFT instruction pool */
16396 enum {
16397     NM_P_SLL        = 0x00,
16398     NM_SRL          = 0x02,
16399     NM_SRA          = 0x04,
16400     NM_ROTR         = 0x06,
16401 };
16402
16403 /* P.ROTX instruction pool */
16404 enum {
16405     NM_ROTX         = 0x00,
16406 };
16407
16408 /* P.INS instruction pool */
16409 enum {
16410     NM_INS          = 0x00,
16411 };
16412
16413 /* P.EXT instruction pool */
16414 enum {
16415     NM_EXT          = 0x00,
16416 };
16417
16418 /* POOL32F_0 (fmt) instruction pool */
16419 enum {
16420     NM_RINT_S              = 0x04,
16421     NM_RINT_D              = 0x44,
16422     NM_ADD_S               = 0x06,
16423     NM_SELEQZ_S            = 0x07,
16424     NM_SELEQZ_D            = 0x47,
16425     NM_CLASS_S             = 0x0c,
16426     NM_CLASS_D             = 0x4c,
16427     NM_SUB_S               = 0x0e,
16428     NM_SELNEZ_S            = 0x0f,
16429     NM_SELNEZ_D            = 0x4f,
16430     NM_MUL_S               = 0x16,
16431     NM_SEL_S               = 0x17,
16432     NM_SEL_D               = 0x57,
16433     NM_DIV_S               = 0x1e,
16434     NM_ADD_D               = 0x26,
16435     NM_SUB_D               = 0x2e,
16436     NM_MUL_D               = 0x36,
16437     NM_MADDF_S             = 0x37,
16438     NM_MADDF_D             = 0x77,
16439     NM_DIV_D               = 0x3e,
16440     NM_MSUBF_S             = 0x3f,
16441     NM_MSUBF_D             = 0x7f,
16442 };
16443
16444 /* POOL32F_3  instruction pool */
16445 enum {
16446     NM_MIN_FMT         = 0x00,
16447     NM_MAX_FMT         = 0x01,
16448     NM_MINA_FMT        = 0x04,
16449     NM_MAXA_FMT        = 0x05,
16450     NM_POOL32FXF       = 0x07,
16451 };
16452
16453 /* POOL32F_5  instruction pool */
16454 enum {
16455     NM_CMP_CONDN_S     = 0x00,
16456     NM_CMP_CONDN_D     = 0x02,
16457 };
16458
16459 /* P.GP.LH instruction pool */
16460 enum {
16461     NM_LHGP    = 0x00,
16462     NM_LHUGP   = 0x01,
16463 };
16464
16465 /* P.GP.SH instruction pool */
16466 enum {
16467     NM_SHGP    = 0x00,
16468 };
16469
16470 /* P.GP.CP1 instruction pool */
16471 enum {
16472     NM_LWC1GP       = 0x00,
16473     NM_SWC1GP       = 0x01,
16474     NM_LDC1GP       = 0x02,
16475     NM_SDC1GP       = 0x03,
16476 };
16477
16478 /* P.LS.S0 instruction pool */
16479 enum {
16480     NM_LBS9     = 0x00,
16481     NM_LHS9     = 0x04,
16482     NM_LWS9     = 0x08,
16483     NM_LDS9     = 0x0c,
16484
16485     NM_SBS9     = 0x01,
16486     NM_SHS9     = 0x05,
16487     NM_SWS9     = 0x09,
16488     NM_SDS9     = 0x0d,
16489
16490     NM_LBUS9    = 0x02,
16491     NM_LHUS9    = 0x06,
16492     NM_LWC1S9   = 0x0a,
16493     NM_LDC1S9   = 0x0e,
16494
16495     NM_P_PREFS9 = 0x03,
16496     NM_LWUS9    = 0x07,
16497     NM_SWC1S9   = 0x0b,
16498     NM_SDC1S9   = 0x0f,
16499 };
16500
16501 /* P.LS.S1 instruction pool */
16502 enum {
16503     NM_ASET_ACLR = 0x02,
16504     NM_UALH      = 0x04,
16505     NM_UASH      = 0x05,
16506     NM_CACHE     = 0x07,
16507     NM_P_LL      = 0x0a,
16508     NM_P_SC      = 0x0b,
16509 };
16510
16511 /* P.LS.WM instruction pool */
16512 enum {
16513     NM_LWM       = 0x00,
16514     NM_SWM       = 0x01,
16515 };
16516
16517 /* P.LS.UAWM instruction pool */
16518 enum {
16519     NM_UALWM       = 0x00,
16520     NM_UASWM       = 0x01,
16521 };
16522
16523 /* P.BR3A instruction pool */
16524 enum {
16525     NM_BC1EQZC          = 0x00,
16526     NM_BC1NEZC          = 0x01,
16527     NM_BC2EQZC          = 0x02,
16528     NM_BC2NEZC          = 0x03,
16529     NM_BPOSGE32C        = 0x04,
16530 };
16531
16532 /* P16.RI instruction pool */
16533 enum {
16534     NM_P16_SYSCALL  = 0x01,
16535     NM_BREAK16      = 0x02,
16536     NM_SDBBP16      = 0x03,
16537 };
16538
16539 /* POOL16C_0 instruction pool */
16540 enum {
16541     NM_POOL16C_00      = 0x00,
16542 };
16543
16544 /* P16.JRC instruction pool */
16545 enum {
16546     NM_JRC          = 0x00,
16547     NM_JALRC16      = 0x01,
16548 };
16549
16550 /* P.SYSCALL instruction pool */
16551 enum {
16552     NM_SYSCALL      = 0x00,
16553     NM_HYPCALL      = 0x01,
16554 };
16555
16556 /* P.TRAP instruction pool */
16557 enum {
16558     NM_TEQ          = 0x00,
16559     NM_TNE          = 0x01,
16560 };
16561
16562 /* P.CMOVE instruction pool */
16563 enum {
16564     NM_MOVZ            = 0x00,
16565     NM_MOVN            = 0x01,
16566 };
16567
16568 /* POOL32Axf instruction pool */
16569 enum {
16570     NM_POOL32AXF_1 = 0x01,
16571     NM_POOL32AXF_2 = 0x02,
16572     NM_POOL32AXF_4 = 0x04,
16573     NM_POOL32AXF_5 = 0x05,
16574     NM_POOL32AXF_7 = 0x07,
16575 };
16576
16577 /* POOL32Axf_1 instruction pool */
16578 enum {
16579     NM_POOL32AXF_1_0 = 0x00,
16580     NM_POOL32AXF_1_1 = 0x01,
16581     NM_POOL32AXF_1_3 = 0x03,
16582     NM_POOL32AXF_1_4 = 0x04,
16583     NM_POOL32AXF_1_5 = 0x05,
16584     NM_POOL32AXF_1_7 = 0x07,
16585 };
16586
16587 /* POOL32Axf_2 instruction pool */
16588 enum {
16589     NM_POOL32AXF_2_0_7     = 0x00,
16590     NM_POOL32AXF_2_8_15    = 0x01,
16591     NM_POOL32AXF_2_16_23   = 0x02,
16592     NM_POOL32AXF_2_24_31   = 0x03,
16593 };
16594
16595 /* POOL32Axf_7 instruction pool */
16596 enum {
16597     NM_SHRA_R_QB    = 0x0,
16598     NM_SHRL_PH      = 0x1,
16599     NM_REPL_QB      = 0x2,
16600 };
16601
16602 /* POOL32Axf_1_0 instruction pool */
16603 enum {
16604     NM_MFHI = 0x0,
16605     NM_MFLO = 0x1,
16606     NM_MTHI = 0x2,
16607     NM_MTLO = 0x3,
16608 };
16609
16610 /* POOL32Axf_1_1 instruction pool */
16611 enum {
16612     NM_MTHLIP = 0x0,
16613     NM_SHILOV = 0x1,
16614 };
16615
16616 /* POOL32Axf_1_3 instruction pool */
16617 enum {
16618     NM_RDDSP    = 0x0,
16619     NM_WRDSP    = 0x1,
16620     NM_EXTP     = 0x2,
16621     NM_EXTPDP   = 0x3,
16622 };
16623
16624 /* POOL32Axf_1_4 instruction pool */
16625 enum {
16626     NM_SHLL_QB  = 0x0,
16627     NM_SHRL_QB  = 0x1,
16628 };
16629
16630 /* POOL32Axf_1_5 instruction pool */
16631 enum {
16632     NM_MAQ_S_W_PHR   = 0x0,
16633     NM_MAQ_S_W_PHL   = 0x1,
16634     NM_MAQ_SA_W_PHR  = 0x2,
16635     NM_MAQ_SA_W_PHL  = 0x3,
16636 };
16637
16638 /* POOL32Axf_1_7 instruction pool */
16639 enum {
16640     NM_EXTR_W       = 0x0,
16641     NM_EXTR_R_W     = 0x1,
16642     NM_EXTR_RS_W    = 0x2,
16643     NM_EXTR_S_H     = 0x3,
16644 };
16645
16646 /* POOL32Axf_2_0_7 instruction pool */
16647 enum {
16648     NM_DPA_W_PH     = 0x0,
16649     NM_DPAQ_S_W_PH  = 0x1,
16650     NM_DPS_W_PH     = 0x2,
16651     NM_DPSQ_S_W_PH  = 0x3,
16652     NM_BALIGN       = 0x4,
16653     NM_MADD         = 0x5,
16654     NM_MULT         = 0x6,
16655     NM_EXTRV_W      = 0x7,
16656 };
16657
16658 /* POOL32Axf_2_8_15 instruction pool */
16659 enum {
16660     NM_DPAX_W_PH    = 0x0,
16661     NM_DPAQ_SA_L_W  = 0x1,
16662     NM_DPSX_W_PH    = 0x2,
16663     NM_DPSQ_SA_L_W  = 0x3,
16664     NM_MADDU        = 0x5,
16665     NM_MULTU        = 0x6,
16666     NM_EXTRV_R_W    = 0x7,
16667 };
16668
16669 /* POOL32Axf_2_16_23 instruction pool */
16670 enum {
16671     NM_DPAU_H_QBL       = 0x0,
16672     NM_DPAQX_S_W_PH     = 0x1,
16673     NM_DPSU_H_QBL       = 0x2,
16674     NM_DPSQX_S_W_PH     = 0x3,
16675     NM_EXTPV            = 0x4,
16676     NM_MSUB             = 0x5,
16677     NM_MULSA_W_PH       = 0x6,
16678     NM_EXTRV_RS_W       = 0x7,
16679 };
16680
16681 /* POOL32Axf_2_24_31 instruction pool */
16682 enum {
16683     NM_DPAU_H_QBR       = 0x0,
16684     NM_DPAQX_SA_W_PH    = 0x1,
16685     NM_DPSU_H_QBR       = 0x2,
16686     NM_DPSQX_SA_W_PH    = 0x3,
16687     NM_EXTPDPV          = 0x4,
16688     NM_MSUBU            = 0x5,
16689     NM_MULSAQ_S_W_PH    = 0x6,
16690     NM_EXTRV_S_H        = 0x7,
16691 };
16692
16693 /* POOL32Axf_{4, 5} instruction pool */
16694 enum {
16695     NM_CLO      = 0x25,
16696     NM_CLZ      = 0x2d,
16697
16698     NM_TLBP     = 0x01,
16699     NM_TLBR     = 0x09,
16700     NM_TLBWI    = 0x11,
16701     NM_TLBWR    = 0x19,
16702     NM_TLBINV   = 0x03,
16703     NM_TLBINVF  = 0x0b,
16704     NM_DI       = 0x23,
16705     NM_EI       = 0x2b,
16706     NM_RDPGPR   = 0x70,
16707     NM_WRPGPR   = 0x78,
16708     NM_WAIT     = 0x61,
16709     NM_DERET    = 0x71,
16710     NM_ERETX    = 0x79,
16711
16712     /* nanoMIPS DSP instructions */
16713     NM_ABSQ_S_QB        = 0x00,
16714     NM_ABSQ_S_PH        = 0x08,
16715     NM_ABSQ_S_W         = 0x10,
16716     NM_PRECEQ_W_PHL     = 0x28,
16717     NM_PRECEQ_W_PHR     = 0x30,
16718     NM_PRECEQU_PH_QBL   = 0x38,
16719     NM_PRECEQU_PH_QBR   = 0x48,
16720     NM_PRECEU_PH_QBL    = 0x58,
16721     NM_PRECEU_PH_QBR    = 0x68,
16722     NM_PRECEQU_PH_QBLA  = 0x39,
16723     NM_PRECEQU_PH_QBRA  = 0x49,
16724     NM_PRECEU_PH_QBLA   = 0x59,
16725     NM_PRECEU_PH_QBRA   = 0x69,
16726     NM_REPLV_PH         = 0x01,
16727     NM_REPLV_QB         = 0x09,
16728     NM_BITREV           = 0x18,
16729     NM_INSV             = 0x20,
16730     NM_RADDU_W_QB       = 0x78,
16731
16732     NM_BITSWAP          = 0x05,
16733     NM_WSBH             = 0x3d,
16734 };
16735
16736 /* PP.SR instruction pool */
16737 enum {
16738     NM_SAVE         = 0x00,
16739     NM_RESTORE      = 0x02,
16740     NM_RESTORE_JRC  = 0x03,
16741 };
16742
16743 /* P.SR.F instruction pool */
16744 enum {
16745     NM_SAVEF        = 0x00,
16746     NM_RESTOREF     = 0x01,
16747 };
16748
16749 /* P16.SYSCALL  instruction pool */
16750 enum {
16751     NM_SYSCALL16     = 0x00,
16752     NM_HYPCALL16     = 0x01,
16753 };
16754
16755 /* POOL16C_00 instruction pool */
16756 enum {
16757     NM_NOT16           = 0x00,
16758     NM_XOR16           = 0x01,
16759     NM_AND16           = 0x02,
16760     NM_OR16            = 0x03,
16761 };
16762
16763 /* PP.LSX and PP.LSXS instruction pool */
16764 enum {
16765     NM_LBX      = 0x00,
16766     NM_LHX      = 0x04,
16767     NM_LWX      = 0x08,
16768     NM_LDX      = 0x0c,
16769
16770     NM_SBX      = 0x01,
16771     NM_SHX      = 0x05,
16772     NM_SWX      = 0x09,
16773     NM_SDX      = 0x0d,
16774
16775     NM_LBUX     = 0x02,
16776     NM_LHUX     = 0x06,
16777     NM_LWC1X    = 0x0a,
16778     NM_LDC1X    = 0x0e,
16779
16780     NM_LWUX     = 0x07,
16781     NM_SWC1X    = 0x0b,
16782     NM_SDC1X    = 0x0f,
16783
16784     NM_LHXS     = 0x04,
16785     NM_LWXS     = 0x08,
16786     NM_LDXS     = 0x0c,
16787
16788     NM_SHXS     = 0x05,
16789     NM_SWXS     = 0x09,
16790     NM_SDXS     = 0x0d,
16791
16792     NM_LHUXS    = 0x06,
16793     NM_LWC1XS   = 0x0a,
16794     NM_LDC1XS   = 0x0e,
16795
16796     NM_LWUXS    = 0x07,
16797     NM_SWC1XS   = 0x0b,
16798     NM_SDC1XS   = 0x0f,
16799 };
16800
16801 /* ERETx instruction pool */
16802 enum {
16803     NM_ERET     = 0x00,
16804     NM_ERETNC   = 0x01,
16805 };
16806
16807 /* POOL32FxF_{0, 1} insturction pool */
16808 enum {
16809     NM_CFC1     = 0x40,
16810     NM_CTC1     = 0x60,
16811     NM_MFC1     = 0x80,
16812     NM_MTC1     = 0xa0,
16813     NM_MFHC1    = 0xc0,
16814     NM_MTHC1    = 0xe0,
16815
16816     NM_CVT_S_PL = 0x84,
16817     NM_CVT_S_PU = 0xa4,
16818
16819     NM_CVT_L_S     = 0x004,
16820     NM_CVT_L_D     = 0x104,
16821     NM_CVT_W_S     = 0x024,
16822     NM_CVT_W_D     = 0x124,
16823
16824     NM_RSQRT_S     = 0x008,
16825     NM_RSQRT_D     = 0x108,
16826
16827     NM_SQRT_S      = 0x028,
16828     NM_SQRT_D      = 0x128,
16829
16830     NM_RECIP_S     = 0x048,
16831     NM_RECIP_D     = 0x148,
16832
16833     NM_FLOOR_L_S   = 0x00c,
16834     NM_FLOOR_L_D   = 0x10c,
16835
16836     NM_FLOOR_W_S   = 0x02c,
16837     NM_FLOOR_W_D   = 0x12c,
16838
16839     NM_CEIL_L_S    = 0x04c,
16840     NM_CEIL_L_D    = 0x14c,
16841     NM_CEIL_W_S    = 0x06c,
16842     NM_CEIL_W_D    = 0x16c,
16843     NM_TRUNC_L_S   = 0x08c,
16844     NM_TRUNC_L_D   = 0x18c,
16845     NM_TRUNC_W_S   = 0x0ac,
16846     NM_TRUNC_W_D   = 0x1ac,
16847     NM_ROUND_L_S   = 0x0cc,
16848     NM_ROUND_L_D   = 0x1cc,
16849     NM_ROUND_W_S   = 0x0ec,
16850     NM_ROUND_W_D   = 0x1ec,
16851
16852     NM_MOV_S       = 0x01,
16853     NM_MOV_D       = 0x81,
16854     NM_ABS_S       = 0x0d,
16855     NM_ABS_D       = 0x8d,
16856     NM_NEG_S       = 0x2d,
16857     NM_NEG_D       = 0xad,
16858     NM_CVT_D_S     = 0x04d,
16859     NM_CVT_D_W     = 0x0cd,
16860     NM_CVT_D_L     = 0x14d,
16861     NM_CVT_S_D     = 0x06d,
16862     NM_CVT_S_W     = 0x0ed,
16863     NM_CVT_S_L     = 0x16d,
16864 };
16865
16866 /* P.LL instruction pool */
16867 enum {
16868     NM_LL       = 0x00,
16869     NM_LLWP     = 0x01,
16870 };
16871
16872 /* P.SC instruction pool */
16873 enum {
16874     NM_SC       = 0x00,
16875     NM_SCWP     = 0x01,
16876 };
16877
16878 /* P.DVP instruction pool */
16879 enum {
16880     NM_DVP      = 0x00,
16881     NM_EVP      = 0x01,
16882 };
16883
16884
16885 /*
16886  *
16887  * nanoMIPS decoding engine
16888  *
16889  */
16890
16891
16892 /* extraction utilities */
16893
16894 #define NANOMIPS_EXTRACT_RD(op) ((op >> 7) & 0x7)
16895 #define NANOMIPS_EXTRACT_RS(op) ((op >> 4) & 0x7)
16896 #define NANOMIPS_EXTRACT_RS2(op) uMIPS_RS(op)
16897 #define NANOMIPS_EXTRACT_RS1(op) ((op >> 1) & 0x7)
16898 #define NANOMIPS_EXTRACT_RD5(op) ((op >> 5) & 0x1f)
16899 #define NANOMIPS_EXTRACT_RS5(op) (op & 0x1f)
16900
16901 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr3'). */
16902 static inline int decode_gpr_gpr3(int r)
16903 {
16904     static const int map[] = { 16, 17, 18, 19,  4,  5,  6,  7 };
16905
16906     return map[r & 0x7];
16907 }
16908
16909 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr3.src.store'). */
16910 static inline int decode_gpr_gpr3_src_store(int r)
16911 {
16912     static const int map[] = {  0, 17, 18, 19,  4,  5,  6,  7 };
16913
16914     return map[r & 0x7];
16915 }
16916
16917 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr4'). */
16918 static inline int decode_gpr_gpr4(int r)
16919 {
16920     static const int map[] = {  8,  9, 10, 11,  4,  5,  6,  7,
16921                                16, 17, 18, 19, 20, 21, 22, 23 };
16922
16923     return map[r & 0xf];
16924 }
16925
16926 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr4.zero'). */
16927 static inline int decode_gpr_gpr4_zero(int r)
16928 {
16929     static const int map[] = {  8,  9, 10,  0,  4,  5,  6,  7,
16930                                16, 17, 18, 19, 20, 21, 22, 23 };
16931
16932     return map[r & 0xf];
16933 }
16934
16935
16936 /* extraction utilities */
16937
16938 #define NANOMIPS_EXTRACT_RD(op) ((op >> 7) & 0x7)
16939 #define NANOMIPS_EXTRACT_RS(op) ((op >> 4) & 0x7)
16940 #define NANOMIPS_EXTRACT_RS2(op) uMIPS_RS(op)
16941 #define NANOMIPS_EXTRACT_RS1(op) ((op >> 1) & 0x7)
16942 #define NANOMIPS_EXTRACT_RD5(op) ((op >> 5) & 0x1f)
16943 #define NANOMIPS_EXTRACT_RS5(op) (op & 0x1f)
16944
16945
16946 static void gen_adjust_sp(DisasContext *ctx, int u)
16947 {
16948     gen_op_addr_addi(ctx, cpu_gpr[29], cpu_gpr[29], u);
16949 }
16950
16951 static void gen_save(DisasContext *ctx, uint8_t rt, uint8_t count,
16952                      uint8_t gp, uint16_t u)
16953 {
16954     int counter = 0;
16955     TCGv va = tcg_temp_new();
16956     TCGv t0 = tcg_temp_new();
16957
16958     while (counter != count) {
16959         bool use_gp = gp && (counter == count - 1);
16960         int this_rt = use_gp ? 28 : (rt & 0x10) | ((rt + counter) & 0x1f);
16961         int this_offset = -((counter + 1) << 2);
16962         gen_base_offset_addr(ctx, va, 29, this_offset);
16963         gen_load_gpr(t0, this_rt);
16964         tcg_gen_qemu_st_tl(t0, va, ctx->mem_idx,
16965                            (MO_TEUL | ctx->default_tcg_memop_mask));
16966         counter++;
16967     }
16968
16969     /* adjust stack pointer */
16970     gen_adjust_sp(ctx, -u);
16971
16972     tcg_temp_free(t0);
16973     tcg_temp_free(va);
16974 }
16975
16976 static void gen_restore(DisasContext *ctx, uint8_t rt, uint8_t count,
16977                         uint8_t gp, uint16_t u)
16978 {
16979     int counter = 0;
16980     TCGv va = tcg_temp_new();
16981     TCGv t0 = tcg_temp_new();
16982
16983     while (counter != count) {
16984         bool use_gp = gp && (counter == count - 1);
16985         int this_rt = use_gp ? 28 : (rt & 0x10) | ((rt + counter) & 0x1f);
16986         int this_offset = u - ((counter + 1) << 2);
16987         gen_base_offset_addr(ctx, va, 29, this_offset);
16988         tcg_gen_qemu_ld_tl(t0, va, ctx->mem_idx, MO_TESL |
16989                         ctx->default_tcg_memop_mask);
16990         tcg_gen_ext32s_tl(t0, t0);
16991         gen_store_gpr(t0, this_rt);
16992         counter++;
16993     }
16994
16995     /* adjust stack pointer */
16996     gen_adjust_sp(ctx, u);
16997
16998     tcg_temp_free(t0);
16999     tcg_temp_free(va);
17000 }
17001
17002 static void gen_pool16c_nanomips_insn(DisasContext *ctx)
17003 {
17004     int rt = decode_gpr_gpr3(NANOMIPS_EXTRACT_RD(ctx->opcode));
17005     int rs = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS(ctx->opcode));
17006
17007     switch (extract32(ctx->opcode, 2, 2)) {
17008     case NM_NOT16:
17009         gen_logic(ctx, OPC_NOR, rt, rs, 0);
17010         break;
17011     case NM_AND16:
17012         gen_logic(ctx, OPC_AND, rt, rt, rs);
17013         break;
17014     case NM_XOR16:
17015         gen_logic(ctx, OPC_XOR, rt, rt, rs);
17016         break;
17017     case NM_OR16:
17018         gen_logic(ctx, OPC_OR, rt, rt, rs);
17019         break;
17020     }
17021 }
17022
17023 static void gen_pool32a0_nanomips_insn(CPUMIPSState *env, DisasContext *ctx)
17024 {
17025     int rt = extract32(ctx->opcode, 21, 5);
17026     int rs = extract32(ctx->opcode, 16, 5);
17027     int rd = extract32(ctx->opcode, 11, 5);
17028
17029     switch (extract32(ctx->opcode, 3, 7)) {
17030     case NM_P_TRAP:
17031         switch (extract32(ctx->opcode, 10, 1)) {
17032         case NM_TEQ:
17033             check_nms(ctx);
17034             gen_trap(ctx, OPC_TEQ, rs, rt, -1);
17035             break;
17036         case NM_TNE:
17037             check_nms(ctx);
17038             gen_trap(ctx, OPC_TNE, rs, rt, -1);
17039             break;
17040         }
17041         break;
17042     case NM_RDHWR:
17043         check_nms(ctx);
17044         gen_rdhwr(ctx, rt, rs, extract32(ctx->opcode, 11, 3));
17045         break;
17046     case NM_SEB:
17047         check_nms(ctx);
17048         gen_bshfl(ctx, OPC_SEB, rs, rt);
17049         break;
17050     case NM_SEH:
17051         gen_bshfl(ctx, OPC_SEH, rs, rt);
17052         break;
17053     case NM_SLLV:
17054         gen_shift(ctx, OPC_SLLV, rd, rt, rs);
17055         break;
17056     case NM_SRLV:
17057         gen_shift(ctx, OPC_SRLV, rd, rt, rs);
17058         break;
17059     case NM_SRAV:
17060         gen_shift(ctx, OPC_SRAV, rd, rt, rs);
17061         break;
17062     case NM_ROTRV:
17063         gen_shift(ctx, OPC_ROTRV, rd, rt, rs);
17064         break;
17065     case NM_ADD:
17066         gen_arith(ctx, OPC_ADD, rd, rs, rt);
17067         break;
17068     case NM_ADDU:
17069         gen_arith(ctx, OPC_ADDU, rd, rs, rt);
17070         break;
17071     case NM_SUB:
17072         check_nms(ctx);
17073         gen_arith(ctx, OPC_SUB, rd, rs, rt);
17074         break;
17075     case NM_SUBU:
17076         gen_arith(ctx, OPC_SUBU, rd, rs, rt);
17077         break;
17078     case NM_P_CMOVE:
17079         switch (extract32(ctx->opcode, 10, 1)) {
17080         case NM_MOVZ:
17081             gen_cond_move(ctx, OPC_MOVZ, rd, rs, rt);
17082             break;
17083         case NM_MOVN:
17084             gen_cond_move(ctx, OPC_MOVN, rd, rs, rt);
17085             break;
17086         }
17087         break;
17088     case NM_AND:
17089         gen_logic(ctx, OPC_AND, rd, rs, rt);
17090         break;
17091     case NM_OR:
17092         gen_logic(ctx, OPC_OR, rd, rs, rt);
17093         break;
17094     case NM_NOR:
17095         gen_logic(ctx, OPC_NOR, rd, rs, rt);
17096         break;
17097     case NM_XOR:
17098         gen_logic(ctx, OPC_XOR, rd, rs, rt);
17099         break;
17100     case NM_SLT:
17101         gen_slt(ctx, OPC_SLT, rd, rs, rt);
17102         break;
17103     case NM_P_SLTU:
17104         if (rd == 0) {
17105             /* P_DVP */
17106 #ifndef CONFIG_USER_ONLY
17107             TCGv t0 = tcg_temp_new();
17108             switch (extract32(ctx->opcode, 10, 1)) {
17109             case NM_DVP:
17110                 if (ctx->vp) {
17111                     check_cp0_enabled(ctx);
17112                     gen_helper_dvp(t0, cpu_env);
17113                     gen_store_gpr(t0, rt);
17114                 }
17115                 break;
17116             case NM_EVP:
17117                 if (ctx->vp) {
17118                     check_cp0_enabled(ctx);
17119                     gen_helper_evp(t0, cpu_env);
17120                     gen_store_gpr(t0, rt);
17121                 }
17122                 break;
17123             }
17124             tcg_temp_free(t0);
17125 #endif
17126         } else {
17127             gen_slt(ctx, OPC_SLTU, rd, rs, rt);
17128         }
17129         break;
17130     case NM_SOV:
17131         {
17132             TCGv t0 = tcg_temp_new();
17133             TCGv t1 = tcg_temp_new();
17134             TCGv t2 = tcg_temp_new();
17135
17136             gen_load_gpr(t1, rs);
17137             gen_load_gpr(t2, rt);
17138             tcg_gen_add_tl(t0, t1, t2);
17139             tcg_gen_ext32s_tl(t0, t0);
17140             tcg_gen_xor_tl(t1, t1, t2);
17141             tcg_gen_xor_tl(t2, t0, t2);
17142             tcg_gen_andc_tl(t1, t2, t1);
17143
17144             /* operands of same sign, result different sign */
17145             tcg_gen_setcondi_tl(TCG_COND_LT, t0, t1, 0);
17146             gen_store_gpr(t0, rd);
17147
17148             tcg_temp_free(t0);
17149             tcg_temp_free(t1);
17150             tcg_temp_free(t2);
17151         }
17152         break;
17153     case NM_MUL:
17154         gen_r6_muldiv(ctx, R6_OPC_MUL, rd, rs, rt);
17155         break;
17156     case NM_MUH:
17157         gen_r6_muldiv(ctx, R6_OPC_MUH, rd, rs, rt);
17158         break;
17159     case NM_MULU:
17160         gen_r6_muldiv(ctx, R6_OPC_MULU, rd, rs, rt);
17161         break;
17162     case NM_MUHU:
17163         gen_r6_muldiv(ctx, R6_OPC_MUHU, rd, rs, rt);
17164         break;
17165     case NM_DIV:
17166         gen_r6_muldiv(ctx, R6_OPC_DIV, rd, rs, rt);
17167         break;
17168     case NM_MOD:
17169         gen_r6_muldiv(ctx, R6_OPC_MOD, rd, rs, rt);
17170         break;
17171     case NM_DIVU:
17172         gen_r6_muldiv(ctx, R6_OPC_DIVU, rd, rs, rt);
17173         break;
17174     case NM_MODU:
17175         gen_r6_muldiv(ctx, R6_OPC_MODU, rd, rs, rt);
17176         break;
17177 #ifndef CONFIG_USER_ONLY
17178     case NM_MFC0:
17179         check_cp0_enabled(ctx);
17180         if (rt == 0) {
17181             /* Treat as NOP. */
17182             break;
17183         }
17184         gen_mfc0(ctx, cpu_gpr[rt], rs, extract32(ctx->opcode, 11, 3));
17185         break;
17186     case NM_MTC0:
17187         check_cp0_enabled(ctx);
17188         {
17189             TCGv t0 = tcg_temp_new();
17190
17191             gen_load_gpr(t0, rt);
17192             gen_mtc0(ctx, t0, rs, extract32(ctx->opcode, 11, 3));
17193             tcg_temp_free(t0);
17194         }
17195         break;
17196     case NM_D_E_MT_VPE:
17197         {
17198             uint8_t sc = extract32(ctx->opcode, 10, 1);
17199             TCGv t0 = tcg_temp_new();
17200
17201             switch (sc) {
17202             case 0:
17203                 if (rs == 1) {
17204                     /* DMT */
17205                     check_cp0_mt(ctx);
17206                     gen_helper_dmt(t0);
17207                     gen_store_gpr(t0, rt);
17208                 } else if (rs == 0) {
17209                     /* DVPE */
17210                     check_cp0_mt(ctx);
17211                     gen_helper_dvpe(t0, cpu_env);
17212                     gen_store_gpr(t0, rt);
17213                 } else {
17214                     generate_exception_end(ctx, EXCP_RI);
17215                 }
17216                 break;
17217             case 1:
17218                 if (rs == 1) {
17219                     /* EMT */
17220                     check_cp0_mt(ctx);
17221                     gen_helper_emt(t0);
17222                     gen_store_gpr(t0, rt);
17223                 } else if (rs == 0) {
17224                     /* EVPE */
17225                     check_cp0_mt(ctx);
17226                     gen_helper_evpe(t0, cpu_env);
17227                     gen_store_gpr(t0, rt);
17228                 } else {
17229                     generate_exception_end(ctx, EXCP_RI);
17230                 }
17231                 break;
17232             }
17233
17234             tcg_temp_free(t0);
17235         }
17236         break;
17237     case NM_FORK:
17238         check_mt(ctx);
17239         {
17240             TCGv t0 = tcg_temp_new();
17241             TCGv t1 = tcg_temp_new();
17242
17243             gen_load_gpr(t0, rt);
17244             gen_load_gpr(t1, rs);
17245             gen_helper_fork(t0, t1);
17246             tcg_temp_free(t0);
17247             tcg_temp_free(t1);
17248         }
17249         break;
17250     case NM_MFTR:
17251     case NM_MFHTR:
17252         check_cp0_enabled(ctx);
17253         if (rd == 0) {
17254             /* Treat as NOP. */
17255             return;
17256         }
17257         gen_mftr(env, ctx, rs, rt, extract32(ctx->opcode, 10, 1),
17258                  extract32(ctx->opcode, 11, 5), extract32(ctx->opcode, 3, 1));
17259         break;
17260     case NM_MTTR:
17261     case NM_MTHTR:
17262         check_cp0_enabled(ctx);
17263         gen_mttr(env, ctx, rs, rt, extract32(ctx->opcode, 10, 1),
17264                  extract32(ctx->opcode, 11, 5), extract32(ctx->opcode, 3, 1));
17265         break;
17266     case NM_YIELD:
17267         check_mt(ctx);
17268         {
17269             TCGv t0 = tcg_temp_new();
17270
17271             gen_load_gpr(t0, rs);
17272             gen_helper_yield(t0, cpu_env, t0);
17273             gen_store_gpr(t0, rt);
17274             tcg_temp_free(t0);
17275         }
17276         break;
17277 #endif
17278     default:
17279         generate_exception_end(ctx, EXCP_RI);
17280         break;
17281     }
17282 }
17283
17284 /* dsp */
17285 static void gen_pool32axf_1_5_nanomips_insn(DisasContext *ctx, uint32_t opc,
17286                                             int ret, int v1, int v2)
17287 {
17288     TCGv_i32 t0;
17289     TCGv v0_t;
17290     TCGv v1_t;
17291
17292     t0 = tcg_temp_new_i32();
17293
17294     v0_t = tcg_temp_new();
17295     v1_t = tcg_temp_new();
17296
17297     tcg_gen_movi_i32(t0, v2 >> 3);
17298
17299     gen_load_gpr(v0_t, ret);
17300     gen_load_gpr(v1_t, v1);
17301
17302     switch (opc) {
17303     case NM_MAQ_S_W_PHR:
17304         check_dsp(ctx);
17305         gen_helper_maq_s_w_phr(t0, v1_t, v0_t, cpu_env);
17306         break;
17307     case NM_MAQ_S_W_PHL:
17308         check_dsp(ctx);
17309         gen_helper_maq_s_w_phl(t0, v1_t, v0_t, cpu_env);
17310         break;
17311     case NM_MAQ_SA_W_PHR:
17312         check_dsp(ctx);
17313         gen_helper_maq_sa_w_phr(t0, v1_t, v0_t, cpu_env);
17314         break;
17315     case NM_MAQ_SA_W_PHL:
17316         check_dsp(ctx);
17317         gen_helper_maq_sa_w_phl(t0, v1_t, v0_t, cpu_env);
17318         break;
17319     default:
17320         generate_exception_end(ctx, EXCP_RI);
17321         break;
17322     }
17323
17324     tcg_temp_free_i32(t0);
17325
17326     tcg_temp_free(v0_t);
17327     tcg_temp_free(v1_t);
17328 }
17329
17330
17331 static void gen_pool32axf_1_nanomips_insn(DisasContext *ctx, uint32_t opc,
17332                                     int ret, int v1, int v2)
17333 {
17334     int16_t imm;
17335     TCGv t0 = tcg_temp_new();
17336     TCGv t1 = tcg_temp_new();
17337     TCGv v0_t = tcg_temp_new();
17338
17339     gen_load_gpr(v0_t, v1);
17340
17341     switch (opc) {
17342     case NM_POOL32AXF_1_0:
17343         check_dsp(ctx);
17344         switch (extract32(ctx->opcode, 12, 2)) {
17345         case NM_MFHI:
17346             gen_HILO(ctx, OPC_MFHI, v2 >> 3, ret);
17347             break;
17348         case NM_MFLO:
17349             gen_HILO(ctx, OPC_MFLO, v2 >> 3, ret);
17350             break;
17351         case NM_MTHI:
17352             gen_HILO(ctx, OPC_MTHI, v2 >> 3, v1);
17353             break;
17354         case NM_MTLO:
17355             gen_HILO(ctx, OPC_MTLO, v2 >> 3, v1);
17356             break;
17357         }
17358         break;
17359     case NM_POOL32AXF_1_1:
17360         check_dsp(ctx);
17361         switch (extract32(ctx->opcode, 12, 2)) {
17362         case NM_MTHLIP:
17363             tcg_gen_movi_tl(t0, v2);
17364             gen_helper_mthlip(t0, v0_t, cpu_env);
17365             break;
17366         case NM_SHILOV:
17367             tcg_gen_movi_tl(t0, v2 >> 3);
17368             gen_helper_shilo(t0, v0_t, cpu_env);
17369             break;
17370         default:
17371             generate_exception_end(ctx, EXCP_RI);
17372             break;
17373         }
17374         break;
17375     case NM_POOL32AXF_1_3:
17376         check_dsp(ctx);
17377         imm = extract32(ctx->opcode, 14, 7);
17378         switch (extract32(ctx->opcode, 12, 2)) {
17379         case NM_RDDSP:
17380             tcg_gen_movi_tl(t0, imm);
17381             gen_helper_rddsp(t0, t0, cpu_env);
17382             gen_store_gpr(t0, ret);
17383             break;
17384         case NM_WRDSP:
17385             gen_load_gpr(t0, ret);
17386             tcg_gen_movi_tl(t1, imm);
17387             gen_helper_wrdsp(t0, t1, cpu_env);
17388             break;
17389         case NM_EXTP:
17390             tcg_gen_movi_tl(t0, v2 >> 3);
17391             tcg_gen_movi_tl(t1, v1);
17392             gen_helper_extp(t0, t0, t1, cpu_env);
17393             gen_store_gpr(t0, ret);
17394             break;
17395         case NM_EXTPDP:
17396             tcg_gen_movi_tl(t0, v2 >> 3);
17397             tcg_gen_movi_tl(t1, v1);
17398             gen_helper_extpdp(t0, t0, t1, cpu_env);
17399             gen_store_gpr(t0, ret);
17400             break;
17401         }
17402         break;
17403     case NM_POOL32AXF_1_4:
17404         check_dsp(ctx);
17405         tcg_gen_movi_tl(t0, v2 >> 2);
17406         switch (extract32(ctx->opcode, 12, 1)) {
17407         case NM_SHLL_QB:
17408             gen_helper_shll_qb(t0, t0, v0_t, cpu_env);
17409             gen_store_gpr(t0, ret);
17410             break;
17411         case NM_SHRL_QB:
17412             gen_helper_shrl_qb(t0, t0, v0_t);
17413             gen_store_gpr(t0, ret);
17414             break;
17415         }
17416         break;
17417     case NM_POOL32AXF_1_5:
17418         opc = extract32(ctx->opcode, 12, 2);
17419         gen_pool32axf_1_5_nanomips_insn(ctx, opc, ret, v1, v2);
17420         break;
17421     case NM_POOL32AXF_1_7:
17422         check_dsp(ctx);
17423         tcg_gen_movi_tl(t0, v2 >> 3);
17424         tcg_gen_movi_tl(t1, v1);
17425         switch (extract32(ctx->opcode, 12, 2)) {
17426         case NM_EXTR_W:
17427             gen_helper_extr_w(t0, t0, t1, cpu_env);
17428             gen_store_gpr(t0, ret);
17429             break;
17430         case NM_EXTR_R_W:
17431             gen_helper_extr_r_w(t0, t0, t1, cpu_env);
17432             gen_store_gpr(t0, ret);
17433             break;
17434         case NM_EXTR_RS_W:
17435             gen_helper_extr_rs_w(t0, t0, t1, cpu_env);
17436             gen_store_gpr(t0, ret);
17437             break;
17438         case NM_EXTR_S_H:
17439             gen_helper_extr_s_h(t0, t0, t1, cpu_env);
17440             gen_store_gpr(t0, ret);
17441             break;
17442         }
17443         break;
17444     default:
17445         generate_exception_end(ctx, EXCP_RI);
17446         break;
17447     }
17448
17449     tcg_temp_free(t0);
17450     tcg_temp_free(t1);
17451     tcg_temp_free(v0_t);
17452 }
17453
17454 static void gen_pool32axf_2_multiply(DisasContext *ctx, uint32_t opc,
17455                                     TCGv v0, TCGv v1, int rd)
17456 {
17457     TCGv_i32 t0;
17458
17459     t0 = tcg_temp_new_i32();
17460
17461     tcg_gen_movi_i32(t0, rd >> 3);
17462
17463     switch (opc) {
17464     case NM_POOL32AXF_2_0_7:
17465         switch (extract32(ctx->opcode, 9, 3)) {
17466         case NM_DPA_W_PH:
17467             check_dspr2(ctx);
17468             gen_helper_dpa_w_ph(t0, v1, v0, cpu_env);
17469             break;
17470         case NM_DPAQ_S_W_PH:
17471             check_dsp(ctx);
17472             gen_helper_dpaq_s_w_ph(t0, v1, v0, cpu_env);
17473             break;
17474         case NM_DPS_W_PH:
17475             check_dspr2(ctx);
17476             gen_helper_dps_w_ph(t0, v1, v0, cpu_env);
17477             break;
17478         case NM_DPSQ_S_W_PH:
17479             check_dsp(ctx);
17480             gen_helper_dpsq_s_w_ph(t0, v1, v0, cpu_env);
17481             break;
17482         default:
17483             generate_exception_end(ctx, EXCP_RI);
17484             break;
17485         }
17486         break;
17487     case NM_POOL32AXF_2_8_15:
17488         switch (extract32(ctx->opcode, 9, 3)) {
17489         case NM_DPAX_W_PH:
17490             check_dspr2(ctx);
17491             gen_helper_dpax_w_ph(t0, v0, v1, cpu_env);
17492             break;
17493         case NM_DPAQ_SA_L_W:
17494             check_dsp(ctx);
17495             gen_helper_dpaq_sa_l_w(t0, v0, v1, cpu_env);
17496             break;
17497         case NM_DPSX_W_PH:
17498             check_dspr2(ctx);
17499             gen_helper_dpsx_w_ph(t0, v0, v1, cpu_env);
17500             break;
17501         case NM_DPSQ_SA_L_W:
17502             check_dsp(ctx);
17503             gen_helper_dpsq_sa_l_w(t0, v0, v1, cpu_env);
17504             break;
17505         default:
17506             generate_exception_end(ctx, EXCP_RI);
17507             break;
17508         }
17509         break;
17510     case NM_POOL32AXF_2_16_23:
17511         switch (extract32(ctx->opcode, 9, 3)) {
17512         case NM_DPAU_H_QBL:
17513             check_dsp(ctx);
17514             gen_helper_dpau_h_qbl(t0, v0, v1, cpu_env);
17515             break;
17516         case NM_DPAQX_S_W_PH:
17517             check_dspr2(ctx);
17518             gen_helper_dpaqx_s_w_ph(t0, v0, v1, cpu_env);
17519             break;
17520         case NM_DPSU_H_QBL:
17521             check_dsp(ctx);
17522             gen_helper_dpsu_h_qbl(t0, v0, v1, cpu_env);
17523             break;
17524         case NM_DPSQX_S_W_PH:
17525             check_dspr2(ctx);
17526             gen_helper_dpsqx_s_w_ph(t0, v0, v1, cpu_env);
17527             break;
17528         case NM_MULSA_W_PH:
17529             check_dspr2(ctx);
17530             gen_helper_mulsa_w_ph(t0, v0, v1, cpu_env);
17531             break;
17532         default:
17533             generate_exception_end(ctx, EXCP_RI);
17534             break;
17535         }
17536         break;
17537     case NM_POOL32AXF_2_24_31:
17538         switch (extract32(ctx->opcode, 9, 3)) {
17539         case NM_DPAU_H_QBR:
17540             check_dsp(ctx);
17541             gen_helper_dpau_h_qbr(t0, v1, v0, cpu_env);
17542             break;
17543         case NM_DPAQX_SA_W_PH:
17544             check_dspr2(ctx);
17545             gen_helper_dpaqx_sa_w_ph(t0, v1, v0, cpu_env);
17546             break;
17547         case NM_DPSU_H_QBR:
17548             check_dsp(ctx);
17549             gen_helper_dpsu_h_qbr(t0, v1, v0, cpu_env);
17550             break;
17551         case NM_DPSQX_SA_W_PH:
17552             check_dspr2(ctx);
17553             gen_helper_dpsqx_sa_w_ph(t0, v1, v0, cpu_env);
17554             break;
17555         case NM_MULSAQ_S_W_PH:
17556             check_dsp(ctx);
17557             gen_helper_mulsaq_s_w_ph(t0, v1, v0, cpu_env);
17558             break;
17559         default:
17560             generate_exception_end(ctx, EXCP_RI);
17561             break;
17562         }
17563         break;
17564     default:
17565         generate_exception_end(ctx, EXCP_RI);
17566         break;
17567     }
17568
17569     tcg_temp_free_i32(t0);
17570 }
17571
17572 static void gen_pool32axf_2_nanomips_insn(DisasContext *ctx, uint32_t opc,
17573                                           int rt, int rs, int rd)
17574 {
17575     int ret = rt;
17576     TCGv t0 = tcg_temp_new();
17577     TCGv t1 = tcg_temp_new();
17578     TCGv v0_t = tcg_temp_new();
17579     TCGv v1_t = tcg_temp_new();
17580
17581     gen_load_gpr(v0_t, rt);
17582     gen_load_gpr(v1_t, rs);
17583
17584     switch (opc) {
17585     case NM_POOL32AXF_2_0_7:
17586         switch (extract32(ctx->opcode, 9, 3)) {
17587         case NM_DPA_W_PH:
17588         case NM_DPAQ_S_W_PH:
17589         case NM_DPS_W_PH:
17590         case NM_DPSQ_S_W_PH:
17591             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
17592             break;
17593         case NM_BALIGN:
17594             check_dspr2(ctx);
17595             if (rt != 0) {
17596                 gen_load_gpr(t0, rs);
17597                 rd &= 3;
17598                 if (rd != 0 && rd != 2) {
17599                     tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 8 * rd);
17600                     tcg_gen_ext32u_tl(t0, t0);
17601                     tcg_gen_shri_tl(t0, t0, 8 * (4 - rd));
17602                     tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
17603                 }
17604                 tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
17605             }
17606             break;
17607         case NM_MADD:
17608             check_dsp(ctx);
17609             {
17610                 int acc = extract32(ctx->opcode, 14, 2);
17611                 TCGv_i64 t2 = tcg_temp_new_i64();
17612                 TCGv_i64 t3 = tcg_temp_new_i64();
17613
17614                 gen_load_gpr(t0, rt);
17615                 gen_load_gpr(t1, rs);
17616                 tcg_gen_ext_tl_i64(t2, t0);
17617                 tcg_gen_ext_tl_i64(t3, t1);
17618                 tcg_gen_mul_i64(t2, t2, t3);
17619                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
17620                 tcg_gen_add_i64(t2, t2, t3);
17621                 tcg_temp_free_i64(t3);
17622                 gen_move_low32(cpu_LO[acc], t2);
17623                 gen_move_high32(cpu_HI[acc], t2);
17624                 tcg_temp_free_i64(t2);
17625             }
17626             break;
17627         case NM_MULT:
17628             check_dsp(ctx);
17629             {
17630                 int acc = extract32(ctx->opcode, 14, 2);
17631                 TCGv_i32 t2 = tcg_temp_new_i32();
17632                 TCGv_i32 t3 = tcg_temp_new_i32();
17633
17634                 gen_load_gpr(t0, rs);
17635                 gen_load_gpr(t1, rt);
17636                 tcg_gen_trunc_tl_i32(t2, t0);
17637                 tcg_gen_trunc_tl_i32(t3, t1);
17638                 tcg_gen_muls2_i32(t2, t3, t2, t3);
17639                 tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
17640                 tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
17641                 tcg_temp_free_i32(t2);
17642                 tcg_temp_free_i32(t3);
17643             }
17644             break;
17645         case NM_EXTRV_W:
17646             check_dsp(ctx);
17647             gen_load_gpr(v1_t, rs);
17648             tcg_gen_movi_tl(t0, rd >> 3);
17649             gen_helper_extr_w(t0, t0, v1_t, cpu_env);
17650             gen_store_gpr(t0, ret);
17651             break;
17652         }
17653         break;
17654     case NM_POOL32AXF_2_8_15:
17655         switch (extract32(ctx->opcode, 9, 3)) {
17656         case NM_DPAX_W_PH:
17657         case NM_DPAQ_SA_L_W:
17658         case NM_DPSX_W_PH:
17659         case NM_DPSQ_SA_L_W:
17660             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
17661             break;
17662         case NM_MADDU:
17663             check_dsp(ctx);
17664             {
17665                 int acc = extract32(ctx->opcode, 14, 2);
17666                 TCGv_i64 t2 = tcg_temp_new_i64();
17667                 TCGv_i64 t3 = tcg_temp_new_i64();
17668
17669                 gen_load_gpr(t0, rs);
17670                 gen_load_gpr(t1, rt);
17671                 tcg_gen_ext32u_tl(t0, t0);
17672                 tcg_gen_ext32u_tl(t1, t1);
17673                 tcg_gen_extu_tl_i64(t2, t0);
17674                 tcg_gen_extu_tl_i64(t3, t1);
17675                 tcg_gen_mul_i64(t2, t2, t3);
17676                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
17677                 tcg_gen_add_i64(t2, t2, t3);
17678                 tcg_temp_free_i64(t3);
17679                 gen_move_low32(cpu_LO[acc], t2);
17680                 gen_move_high32(cpu_HI[acc], t2);
17681                 tcg_temp_free_i64(t2);
17682             }
17683             break;
17684         case NM_MULTU:
17685             check_dsp(ctx);
17686             {
17687                 int acc = extract32(ctx->opcode, 14, 2);
17688                 TCGv_i32 t2 = tcg_temp_new_i32();
17689                 TCGv_i32 t3 = tcg_temp_new_i32();
17690
17691                 gen_load_gpr(t0, rs);
17692                 gen_load_gpr(t1, rt);
17693                 tcg_gen_trunc_tl_i32(t2, t0);
17694                 tcg_gen_trunc_tl_i32(t3, t1);
17695                 tcg_gen_mulu2_i32(t2, t3, t2, t3);
17696                 tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
17697                 tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
17698                 tcg_temp_free_i32(t2);
17699                 tcg_temp_free_i32(t3);
17700             }
17701             break;
17702         case NM_EXTRV_R_W:
17703             check_dsp(ctx);
17704             tcg_gen_movi_tl(t0, rd >> 3);
17705             gen_helper_extr_r_w(t0, t0, v1_t, cpu_env);
17706             gen_store_gpr(t0, ret);
17707             break;
17708         default:
17709             generate_exception_end(ctx, EXCP_RI);
17710             break;
17711         }
17712         break;
17713     case NM_POOL32AXF_2_16_23:
17714         switch (extract32(ctx->opcode, 9, 3)) {
17715         case NM_DPAU_H_QBL:
17716         case NM_DPAQX_S_W_PH:
17717         case NM_DPSU_H_QBL:
17718         case NM_DPSQX_S_W_PH:
17719         case NM_MULSA_W_PH:
17720             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
17721             break;
17722         case NM_EXTPV:
17723             check_dsp(ctx);
17724             tcg_gen_movi_tl(t0, rd >> 3);
17725             gen_helper_extp(t0, t0, v1_t, cpu_env);
17726             gen_store_gpr(t0, ret);
17727             break;
17728         case NM_MSUB:
17729             check_dsp(ctx);
17730             {
17731                 int acc = extract32(ctx->opcode, 14, 2);
17732                 TCGv_i64 t2 = tcg_temp_new_i64();
17733                 TCGv_i64 t3 = tcg_temp_new_i64();
17734
17735                 gen_load_gpr(t0, rs);
17736                 gen_load_gpr(t1, rt);
17737                 tcg_gen_ext_tl_i64(t2, t0);
17738                 tcg_gen_ext_tl_i64(t3, t1);
17739                 tcg_gen_mul_i64(t2, t2, t3);
17740                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
17741                 tcg_gen_sub_i64(t2, t3, t2);
17742                 tcg_temp_free_i64(t3);
17743                 gen_move_low32(cpu_LO[acc], t2);
17744                 gen_move_high32(cpu_HI[acc], t2);
17745                 tcg_temp_free_i64(t2);
17746             }
17747             break;
17748         case NM_EXTRV_RS_W:
17749             check_dsp(ctx);
17750             tcg_gen_movi_tl(t0, rd >> 3);
17751             gen_helper_extr_rs_w(t0, t0, v1_t, cpu_env);
17752             gen_store_gpr(t0, ret);
17753             break;
17754         }
17755         break;
17756     case NM_POOL32AXF_2_24_31:
17757         switch (extract32(ctx->opcode, 9, 3)) {
17758         case NM_DPAU_H_QBR:
17759         case NM_DPAQX_SA_W_PH:
17760         case NM_DPSU_H_QBR:
17761         case NM_DPSQX_SA_W_PH:
17762         case NM_MULSAQ_S_W_PH:
17763             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
17764             break;
17765         case NM_EXTPDPV:
17766             check_dsp(ctx);
17767             tcg_gen_movi_tl(t0, rd >> 3);
17768             gen_helper_extpdp(t0, t0, v1_t, cpu_env);
17769             gen_store_gpr(t0, ret);
17770             break;
17771         case NM_MSUBU:
17772             check_dsp(ctx);
17773             {
17774                 int acc = extract32(ctx->opcode, 14, 2);
17775                 TCGv_i64 t2 = tcg_temp_new_i64();
17776                 TCGv_i64 t3 = tcg_temp_new_i64();
17777
17778                 gen_load_gpr(t0, rs);
17779                 gen_load_gpr(t1, rt);
17780                 tcg_gen_ext32u_tl(t0, t0);
17781                 tcg_gen_ext32u_tl(t1, t1);
17782                 tcg_gen_extu_tl_i64(t2, t0);
17783                 tcg_gen_extu_tl_i64(t3, t1);
17784                 tcg_gen_mul_i64(t2, t2, t3);
17785                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
17786                 tcg_gen_sub_i64(t2, t3, t2);
17787                 tcg_temp_free_i64(t3);
17788                 gen_move_low32(cpu_LO[acc], t2);
17789                 gen_move_high32(cpu_HI[acc], t2);
17790                 tcg_temp_free_i64(t2);
17791             }
17792             break;
17793         case NM_EXTRV_S_H:
17794             check_dsp(ctx);
17795             tcg_gen_movi_tl(t0, rd >> 3);
17796             gen_helper_extr_s_h(t0, t0, v0_t, cpu_env);
17797             gen_store_gpr(t0, ret);
17798             break;
17799         }
17800         break;
17801     default:
17802         generate_exception_end(ctx, EXCP_RI);
17803         break;
17804     }
17805
17806     tcg_temp_free(t0);
17807     tcg_temp_free(t1);
17808
17809     tcg_temp_free(v0_t);
17810     tcg_temp_free(v1_t);
17811 }
17812
17813 static void gen_pool32axf_4_nanomips_insn(DisasContext *ctx, uint32_t opc,
17814                                           int rt, int rs)
17815 {
17816     int ret = rt;
17817     TCGv t0 = tcg_temp_new();
17818     TCGv v0_t = tcg_temp_new();
17819
17820     gen_load_gpr(v0_t, rs);
17821
17822     switch (opc) {
17823     case NM_ABSQ_S_QB:
17824         check_dspr2(ctx);
17825         gen_helper_absq_s_qb(v0_t, v0_t, cpu_env);
17826         gen_store_gpr(v0_t, ret);
17827         break;
17828     case NM_ABSQ_S_PH:
17829         check_dsp(ctx);
17830         gen_helper_absq_s_ph(v0_t, v0_t, cpu_env);
17831         gen_store_gpr(v0_t, ret);
17832         break;
17833     case NM_ABSQ_S_W:
17834         check_dsp(ctx);
17835         gen_helper_absq_s_w(v0_t, v0_t, cpu_env);
17836         gen_store_gpr(v0_t, ret);
17837         break;
17838     case NM_PRECEQ_W_PHL:
17839         check_dsp(ctx);
17840         tcg_gen_andi_tl(v0_t, v0_t, 0xFFFF0000);
17841         tcg_gen_ext32s_tl(v0_t, v0_t);
17842         gen_store_gpr(v0_t, ret);
17843         break;
17844     case NM_PRECEQ_W_PHR:
17845         check_dsp(ctx);
17846         tcg_gen_andi_tl(v0_t, v0_t, 0x0000FFFF);
17847         tcg_gen_shli_tl(v0_t, v0_t, 16);
17848         tcg_gen_ext32s_tl(v0_t, v0_t);
17849         gen_store_gpr(v0_t, ret);
17850         break;
17851     case NM_PRECEQU_PH_QBL:
17852         check_dsp(ctx);
17853         gen_helper_precequ_ph_qbl(v0_t, v0_t);
17854         gen_store_gpr(v0_t, ret);
17855         break;
17856     case NM_PRECEQU_PH_QBR:
17857         check_dsp(ctx);
17858         gen_helper_precequ_ph_qbr(v0_t, v0_t);
17859         gen_store_gpr(v0_t, ret);
17860         break;
17861     case NM_PRECEQU_PH_QBLA:
17862         check_dsp(ctx);
17863         gen_helper_precequ_ph_qbla(v0_t, v0_t);
17864         gen_store_gpr(v0_t, ret);
17865         break;
17866     case NM_PRECEQU_PH_QBRA:
17867         check_dsp(ctx);
17868         gen_helper_precequ_ph_qbra(v0_t, v0_t);
17869         gen_store_gpr(v0_t, ret);
17870         break;
17871     case NM_PRECEU_PH_QBL:
17872         check_dsp(ctx);
17873         gen_helper_preceu_ph_qbl(v0_t, v0_t);
17874         gen_store_gpr(v0_t, ret);
17875         break;
17876     case NM_PRECEU_PH_QBR:
17877         check_dsp(ctx);
17878         gen_helper_preceu_ph_qbr(v0_t, v0_t);
17879         gen_store_gpr(v0_t, ret);
17880         break;
17881     case NM_PRECEU_PH_QBLA:
17882         check_dsp(ctx);
17883         gen_helper_preceu_ph_qbla(v0_t, v0_t);
17884         gen_store_gpr(v0_t, ret);
17885         break;
17886     case NM_PRECEU_PH_QBRA:
17887         check_dsp(ctx);
17888         gen_helper_preceu_ph_qbra(v0_t, v0_t);
17889         gen_store_gpr(v0_t, ret);
17890         break;
17891     case NM_REPLV_PH:
17892         check_dsp(ctx);
17893         tcg_gen_ext16u_tl(v0_t, v0_t);
17894         tcg_gen_shli_tl(t0, v0_t, 16);
17895         tcg_gen_or_tl(v0_t, v0_t, t0);
17896         tcg_gen_ext32s_tl(v0_t, v0_t);
17897         gen_store_gpr(v0_t, ret);
17898         break;
17899     case NM_REPLV_QB:
17900         check_dsp(ctx);
17901         tcg_gen_ext8u_tl(v0_t, v0_t);
17902         tcg_gen_shli_tl(t0, v0_t, 8);
17903         tcg_gen_or_tl(v0_t, v0_t, t0);
17904         tcg_gen_shli_tl(t0, v0_t, 16);
17905         tcg_gen_or_tl(v0_t, v0_t, t0);
17906         tcg_gen_ext32s_tl(v0_t, v0_t);
17907         gen_store_gpr(v0_t, ret);
17908         break;
17909     case NM_BITREV:
17910         check_dsp(ctx);
17911         gen_helper_bitrev(v0_t, v0_t);
17912         gen_store_gpr(v0_t, ret);
17913         break;
17914     case NM_INSV:
17915         check_dsp(ctx);
17916         {
17917             TCGv tv0 = tcg_temp_new();
17918
17919             gen_load_gpr(tv0, rt);
17920             gen_helper_insv(v0_t, cpu_env, v0_t, tv0);
17921             gen_store_gpr(v0_t, ret);
17922             tcg_temp_free(tv0);
17923         }
17924         break;
17925     case NM_RADDU_W_QB:
17926         check_dsp(ctx);
17927         gen_helper_raddu_w_qb(v0_t, v0_t);
17928         gen_store_gpr(v0_t, ret);
17929         break;
17930     case NM_BITSWAP:
17931         gen_bitswap(ctx, OPC_BITSWAP, ret, rs);
17932         break;
17933     case NM_CLO:
17934         check_nms(ctx);
17935         gen_cl(ctx, OPC_CLO, ret, rs);
17936         break;
17937     case NM_CLZ:
17938         check_nms(ctx);
17939         gen_cl(ctx, OPC_CLZ, ret, rs);
17940         break;
17941     case NM_WSBH:
17942         gen_bshfl(ctx, OPC_WSBH, ret, rs);
17943         break;
17944     default:
17945         generate_exception_end(ctx, EXCP_RI);
17946         break;
17947     }
17948
17949     tcg_temp_free(v0_t);
17950     tcg_temp_free(t0);
17951 }
17952
17953 static void gen_pool32axf_7_nanomips_insn(DisasContext *ctx, uint32_t opc,
17954                                           int rt, int rs, int rd)
17955 {
17956     TCGv t0 = tcg_temp_new();
17957     TCGv rs_t = tcg_temp_new();
17958
17959     gen_load_gpr(rs_t, rs);
17960
17961     switch (opc) {
17962     case NM_SHRA_R_QB:
17963         check_dspr2(ctx);
17964         tcg_gen_movi_tl(t0, rd >> 2);
17965         switch (extract32(ctx->opcode, 12, 1)) {
17966         case 0:
17967             /* NM_SHRA_QB */
17968             gen_helper_shra_qb(t0, t0, rs_t);
17969             gen_store_gpr(t0, rt);
17970             break;
17971         case 1:
17972             /* NM_SHRA_R_QB */
17973             gen_helper_shra_r_qb(t0, t0, rs_t);
17974             gen_store_gpr(t0, rt);
17975             break;
17976         }
17977         break;
17978     case NM_SHRL_PH:
17979         check_dspr2(ctx);
17980         tcg_gen_movi_tl(t0, rd >> 1);
17981         gen_helper_shrl_ph(t0, t0, rs_t);
17982         gen_store_gpr(t0, rt);
17983         break;
17984     case NM_REPL_QB:
17985         check_dsp(ctx);
17986         {
17987             int16_t imm;
17988             target_long result;
17989             imm = extract32(ctx->opcode, 13, 8);
17990             result = (uint32_t)imm << 24 |
17991                      (uint32_t)imm << 16 |
17992                      (uint32_t)imm << 8  |
17993                      (uint32_t)imm;
17994             result = (int32_t)result;
17995             tcg_gen_movi_tl(t0, result);
17996             gen_store_gpr(t0, rt);
17997         }
17998         break;
17999     default:
18000         generate_exception_end(ctx, EXCP_RI);
18001         break;
18002     }
18003     tcg_temp_free(t0);
18004     tcg_temp_free(rs_t);
18005 }
18006
18007
18008 static void gen_pool32axf_nanomips_insn(CPUMIPSState *env, DisasContext *ctx)
18009 {
18010     int rt = extract32(ctx->opcode, 21, 5);
18011     int rs = extract32(ctx->opcode, 16, 5);
18012     int rd = extract32(ctx->opcode, 11, 5);
18013
18014     switch (extract32(ctx->opcode, 6, 3)) {
18015     case NM_POOL32AXF_1:
18016         {
18017             int32_t op1 = extract32(ctx->opcode, 9, 3);
18018             gen_pool32axf_1_nanomips_insn(ctx, op1, rt, rs, rd);
18019         }
18020         break;
18021     case NM_POOL32AXF_2:
18022         {
18023             int32_t op1 = extract32(ctx->opcode, 12, 2);
18024             gen_pool32axf_2_nanomips_insn(ctx, op1, rt, rs, rd);
18025         }
18026         break;
18027     case NM_POOL32AXF_4:
18028         {
18029             int32_t op1 = extract32(ctx->opcode, 9, 7);
18030             gen_pool32axf_4_nanomips_insn(ctx, op1, rt, rs);
18031         }
18032         break;
18033     case NM_POOL32AXF_5:
18034         switch (extract32(ctx->opcode, 9, 7)) {
18035 #ifndef CONFIG_USER_ONLY
18036         case NM_TLBP:
18037             gen_cp0(env, ctx, OPC_TLBP, 0, 0);
18038             break;
18039         case NM_TLBR:
18040             gen_cp0(env, ctx, OPC_TLBR, 0, 0);
18041             break;
18042         case NM_TLBWI:
18043             gen_cp0(env, ctx, OPC_TLBWI, 0, 0);
18044             break;
18045         case NM_TLBWR:
18046             gen_cp0(env, ctx, OPC_TLBWR, 0, 0);
18047             break;
18048         case NM_TLBINV:
18049             gen_cp0(env, ctx, OPC_TLBINV, 0, 0);
18050             break;
18051         case NM_TLBINVF:
18052             gen_cp0(env, ctx, OPC_TLBINVF, 0, 0);
18053             break;
18054         case NM_DI:
18055             check_cp0_enabled(ctx);
18056             {
18057                 TCGv t0 = tcg_temp_new();
18058
18059                 save_cpu_state(ctx, 1);
18060                 gen_helper_di(t0, cpu_env);
18061                 gen_store_gpr(t0, rt);
18062             /* Stop translation as we may have switched the execution mode */
18063                 ctx->base.is_jmp = DISAS_STOP;
18064                 tcg_temp_free(t0);
18065             }
18066             break;
18067         case NM_EI:
18068             check_cp0_enabled(ctx);
18069             {
18070                 TCGv t0 = tcg_temp_new();
18071
18072                 save_cpu_state(ctx, 1);
18073                 gen_helper_ei(t0, cpu_env);
18074                 gen_store_gpr(t0, rt);
18075             /* Stop translation as we may have switched the execution mode */
18076                 ctx->base.is_jmp = DISAS_STOP;
18077                 tcg_temp_free(t0);
18078             }
18079             break;
18080         case NM_RDPGPR:
18081             gen_load_srsgpr(rs, rt);
18082             break;
18083         case NM_WRPGPR:
18084             gen_store_srsgpr(rs, rt);
18085             break;
18086         case NM_WAIT:
18087             gen_cp0(env, ctx, OPC_WAIT, 0, 0);
18088             break;
18089         case NM_DERET:
18090             gen_cp0(env, ctx, OPC_DERET, 0, 0);
18091             break;
18092         case NM_ERETX:
18093             gen_cp0(env, ctx, OPC_ERET, 0, 0);
18094             break;
18095 #endif
18096         default:
18097             generate_exception_end(ctx, EXCP_RI);
18098             break;
18099         }
18100         break;
18101     case NM_POOL32AXF_7:
18102         {
18103             int32_t op1 = extract32(ctx->opcode, 9, 3);
18104             gen_pool32axf_7_nanomips_insn(ctx, op1, rt, rs, rd);
18105         }
18106         break;
18107     default:
18108         generate_exception_end(ctx, EXCP_RI);
18109         break;
18110     }
18111 }
18112
18113 /* Immediate Value Compact Branches */
18114 static void gen_compute_imm_branch(DisasContext *ctx, uint32_t opc,
18115                                    int rt, int32_t imm, int32_t offset)
18116 {
18117     TCGCond cond;
18118     int bcond_compute = 0;
18119     TCGv t0 = tcg_temp_new();
18120     TCGv t1 = tcg_temp_new();
18121
18122     gen_load_gpr(t0, rt);
18123     tcg_gen_movi_tl(t1, imm);
18124     ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
18125
18126     /* Load needed operands and calculate btarget */
18127     switch (opc) {
18128     case NM_BEQIC:
18129         if (rt == 0 && imm == 0) {
18130             /* Unconditional branch */
18131         } else if (rt == 0 && imm != 0) {
18132             /* Treat as NOP */
18133             goto out;
18134         } else {
18135             bcond_compute = 1;
18136             cond = TCG_COND_EQ;
18137         }
18138         break;
18139     case NM_BBEQZC:
18140     case NM_BBNEZC:
18141         check_nms(ctx);
18142         if (imm >= 32 && !(ctx->hflags & MIPS_HFLAG_64)) {
18143             generate_exception_end(ctx, EXCP_RI);
18144             goto out;
18145         } else if (rt == 0 && opc == NM_BBEQZC) {
18146             /* Unconditional branch */
18147         } else if (rt == 0 && opc == NM_BBNEZC) {
18148             /* Treat as NOP */
18149             goto out;
18150         } else {
18151             tcg_gen_shri_tl(t0, t0, imm);
18152             tcg_gen_andi_tl(t0, t0, 1);
18153             tcg_gen_movi_tl(t1, 0);
18154             bcond_compute = 1;
18155             if (opc == NM_BBEQZC) {
18156                 cond = TCG_COND_EQ;
18157             } else {
18158                 cond = TCG_COND_NE;
18159             }
18160         }
18161         break;
18162     case NM_BNEIC:
18163         if (rt == 0 && imm == 0) {
18164             /* Treat as NOP */
18165             goto out;
18166         } else if (rt == 0 && imm != 0) {
18167             /* Unconditional branch */
18168         } else {
18169             bcond_compute = 1;
18170             cond = TCG_COND_NE;
18171         }
18172         break;
18173     case NM_BGEIC:
18174         if (rt == 0 && imm == 0) {
18175             /* Unconditional branch */
18176         } else  {
18177             bcond_compute = 1;
18178             cond = TCG_COND_GE;
18179         }
18180         break;
18181     case NM_BLTIC:
18182         bcond_compute = 1;
18183         cond = TCG_COND_LT;
18184         break;
18185     case NM_BGEIUC:
18186         if (rt == 0 && imm == 0) {
18187             /* Unconditional branch */
18188         } else  {
18189             bcond_compute = 1;
18190             cond = TCG_COND_GEU;
18191         }
18192         break;
18193     case NM_BLTIUC:
18194         bcond_compute = 1;
18195         cond = TCG_COND_LTU;
18196         break;
18197     default:
18198         MIPS_INVAL("Immediate Value Compact branch");
18199         generate_exception_end(ctx, EXCP_RI);
18200         goto out;
18201     }
18202
18203     if (bcond_compute == 0) {
18204         /* Uncoditional compact branch */
18205         gen_goto_tb(ctx, 0, ctx->btarget);
18206     } else {
18207         /* Conditional compact branch */
18208         TCGLabel *fs = gen_new_label();
18209
18210         tcg_gen_brcond_tl(tcg_invert_cond(cond), t0, t1, fs);
18211
18212         gen_goto_tb(ctx, 1, ctx->btarget);
18213         gen_set_label(fs);
18214
18215         gen_goto_tb(ctx, 0, ctx->base.pc_next + 4);
18216     }
18217
18218 out:
18219     tcg_temp_free(t0);
18220     tcg_temp_free(t1);
18221 }
18222
18223 /* P.BALRSC type nanoMIPS R6 branches: BALRSC and BRSC */
18224 static void gen_compute_nanomips_pbalrsc_branch(DisasContext *ctx, int rs,
18225                                                 int rt)
18226 {
18227     TCGv t0 = tcg_temp_new();
18228     TCGv t1 = tcg_temp_new();
18229
18230     /* load rs */
18231     gen_load_gpr(t0, rs);
18232
18233     /* link */
18234     if (rt != 0) {
18235         tcg_gen_movi_tl(cpu_gpr[rt], ctx->base.pc_next + 4);
18236     }
18237
18238     /* calculate btarget */
18239     tcg_gen_shli_tl(t0, t0, 1);
18240     tcg_gen_movi_tl(t1, ctx->base.pc_next + 4);
18241     gen_op_addr_add(ctx, btarget, t1, t0);
18242
18243     /* unconditional branch to register */
18244     tcg_gen_mov_tl(cpu_PC, btarget);
18245     tcg_gen_lookup_and_goto_ptr();
18246
18247     tcg_temp_free(t0);
18248     tcg_temp_free(t1);
18249 }
18250
18251 /* nanoMIPS Branches */
18252 static void gen_compute_compact_branch_nm(DisasContext *ctx, uint32_t opc,
18253                                        int rs, int rt, int32_t offset)
18254 {
18255     int bcond_compute = 0;
18256     TCGv t0 = tcg_temp_new();
18257     TCGv t1 = tcg_temp_new();
18258
18259     /* Load needed operands and calculate btarget */
18260     switch (opc) {
18261     /* compact branch */
18262     case OPC_BGEC:
18263     case OPC_BLTC:
18264         gen_load_gpr(t0, rs);
18265         gen_load_gpr(t1, rt);
18266         bcond_compute = 1;
18267         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
18268         break;
18269     case OPC_BGEUC:
18270     case OPC_BLTUC:
18271         if (rs == 0 || rs == rt) {
18272             /* OPC_BLEZALC, OPC_BGEZALC */
18273             /* OPC_BGTZALC, OPC_BLTZALC */
18274             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4);
18275         }
18276         gen_load_gpr(t0, rs);
18277         gen_load_gpr(t1, rt);
18278         bcond_compute = 1;
18279         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
18280         break;
18281     case OPC_BC:
18282         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
18283         break;
18284     case OPC_BEQZC:
18285         if (rs != 0) {
18286             /* OPC_BEQZC, OPC_BNEZC */
18287             gen_load_gpr(t0, rs);
18288             bcond_compute = 1;
18289             ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
18290         } else {
18291             /* OPC_JIC, OPC_JIALC */
18292             TCGv tbase = tcg_temp_new();
18293             TCGv toffset = tcg_temp_new();
18294
18295             gen_load_gpr(tbase, rt);
18296             tcg_gen_movi_tl(toffset, offset);
18297             gen_op_addr_add(ctx, btarget, tbase, toffset);
18298             tcg_temp_free(tbase);
18299             tcg_temp_free(toffset);
18300         }
18301         break;
18302     default:
18303         MIPS_INVAL("Compact branch/jump");
18304         generate_exception_end(ctx, EXCP_RI);
18305         goto out;
18306     }
18307
18308     if (bcond_compute == 0) {
18309         /* Uncoditional compact branch */
18310         switch (opc) {
18311         case OPC_BC:
18312             gen_goto_tb(ctx, 0, ctx->btarget);
18313             break;
18314         default:
18315             MIPS_INVAL("Compact branch/jump");
18316             generate_exception_end(ctx, EXCP_RI);
18317             goto out;
18318         }
18319     } else {
18320         /* Conditional compact branch */
18321         TCGLabel *fs = gen_new_label();
18322
18323         switch (opc) {
18324         case OPC_BGEUC:
18325             if (rs == 0 && rt != 0) {
18326                 /* OPC_BLEZALC */
18327                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
18328             } else if (rs != 0 && rt != 0 && rs == rt) {
18329                 /* OPC_BGEZALC */
18330                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
18331             } else {
18332                 /* OPC_BGEUC */
18333                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GEU), t0, t1, fs);
18334             }
18335             break;
18336         case OPC_BLTUC:
18337             if (rs == 0 && rt != 0) {
18338                 /* OPC_BGTZALC */
18339                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
18340             } else if (rs != 0 && rt != 0 && rs == rt) {
18341                 /* OPC_BLTZALC */
18342                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
18343             } else {
18344                 /* OPC_BLTUC */
18345                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LTU), t0, t1, fs);
18346             }
18347             break;
18348         case OPC_BGEC:
18349             if (rs == 0 && rt != 0) {
18350                 /* OPC_BLEZC */
18351                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
18352             } else if (rs != 0 && rt != 0 && rs == rt) {
18353                 /* OPC_BGEZC */
18354                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
18355             } else {
18356                 /* OPC_BGEC */
18357                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GE), t0, t1, fs);
18358             }
18359             break;
18360         case OPC_BLTC:
18361             if (rs == 0 && rt != 0) {
18362                 /* OPC_BGTZC */
18363                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
18364             } else if (rs != 0 && rt != 0 && rs == rt) {
18365                 /* OPC_BLTZC */
18366                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
18367             } else {
18368                 /* OPC_BLTC */
18369                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LT), t0, t1, fs);
18370             }
18371             break;
18372         case OPC_BEQZC:
18373             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t0, 0, fs);
18374             break;
18375         default:
18376             MIPS_INVAL("Compact conditional branch/jump");
18377             generate_exception_end(ctx, EXCP_RI);
18378             goto out;
18379         }
18380
18381         /* Generating branch here as compact branches don't have delay slot */
18382         gen_goto_tb(ctx, 1, ctx->btarget);
18383         gen_set_label(fs);
18384
18385         gen_goto_tb(ctx, 0, ctx->base.pc_next + 4);
18386     }
18387
18388 out:
18389     tcg_temp_free(t0);
18390     tcg_temp_free(t1);
18391 }
18392
18393
18394 /* nanoMIPS CP1 Branches */
18395 static void gen_compute_branch_cp1_nm(DisasContext *ctx, uint32_t op,
18396                                    int32_t ft, int32_t offset)
18397 {
18398     target_ulong btarget;
18399     TCGv_i64 t0 = tcg_temp_new_i64();
18400
18401     gen_load_fpr64(ctx, t0, ft);
18402     tcg_gen_andi_i64(t0, t0, 1);
18403
18404     btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
18405
18406     switch (op) {
18407     case NM_BC1EQZC:
18408         tcg_gen_xori_i64(t0, t0, 1);
18409         ctx->hflags |= MIPS_HFLAG_BC;
18410         break;
18411     case NM_BC1NEZC:
18412         /* t0 already set */
18413         ctx->hflags |= MIPS_HFLAG_BC;
18414         break;
18415     default:
18416         MIPS_INVAL("cp1 cond branch");
18417         generate_exception_end(ctx, EXCP_RI);
18418         goto out;
18419     }
18420
18421     tcg_gen_trunc_i64_tl(bcond, t0);
18422
18423     ctx->btarget = btarget;
18424
18425 out:
18426     tcg_temp_free_i64(t0);
18427 }
18428
18429
18430 static void gen_p_lsx(DisasContext *ctx, int rd, int rs, int rt)
18431 {
18432     TCGv t0, t1;
18433     t0 = tcg_temp_new();
18434     t1 = tcg_temp_new();
18435
18436     gen_load_gpr(t0, rs);
18437     gen_load_gpr(t1, rt);
18438
18439     if ((extract32(ctx->opcode, 6, 1)) == 1) {
18440         /* PP.LSXS instructions require shifting */
18441         switch (extract32(ctx->opcode, 7, 4)) {
18442         case NM_SHXS:
18443             check_nms(ctx);
18444         case NM_LHXS:
18445         case NM_LHUXS:
18446             tcg_gen_shli_tl(t0, t0, 1);
18447             break;
18448         case NM_SWXS:
18449             check_nms(ctx);
18450         case NM_LWXS:
18451         case NM_LWC1XS:
18452         case NM_SWC1XS:
18453             tcg_gen_shli_tl(t0, t0, 2);
18454             break;
18455         case NM_LDC1XS:
18456         case NM_SDC1XS:
18457             tcg_gen_shli_tl(t0, t0, 3);
18458             break;
18459         }
18460     }
18461     gen_op_addr_add(ctx, t0, t0, t1);
18462
18463     switch (extract32(ctx->opcode, 7, 4)) {
18464     case NM_LBX:
18465         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
18466                            MO_SB);
18467         gen_store_gpr(t0, rd);
18468         break;
18469     case NM_LHX:
18470     /*case NM_LHXS:*/
18471         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
18472                            MO_TESW);
18473         gen_store_gpr(t0, rd);
18474         break;
18475     case NM_LWX:
18476     /*case NM_LWXS:*/
18477         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
18478                            MO_TESL);
18479         gen_store_gpr(t0, rd);
18480         break;
18481     case NM_LBUX:
18482         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
18483                            MO_UB);
18484         gen_store_gpr(t0, rd);
18485         break;
18486     case NM_LHUX:
18487     /*case NM_LHUXS:*/
18488         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
18489                            MO_TEUW);
18490         gen_store_gpr(t0, rd);
18491         break;
18492     case NM_SBX:
18493         check_nms(ctx);
18494         gen_load_gpr(t1, rd);
18495         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx,
18496                            MO_8);
18497         break;
18498     case NM_SHX:
18499     /*case NM_SHXS:*/
18500         check_nms(ctx);
18501         gen_load_gpr(t1, rd);
18502         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx,
18503                            MO_TEUW);
18504         break;
18505     case NM_SWX:
18506     /*case NM_SWXS:*/
18507         check_nms(ctx);
18508         gen_load_gpr(t1, rd);
18509         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx,
18510                            MO_TEUL);
18511         break;
18512     case NM_LWC1X:
18513     /*case NM_LWC1XS:*/
18514     case NM_LDC1X:
18515     /*case NM_LDC1XS:*/
18516     case NM_SWC1X:
18517     /*case NM_SWC1XS:*/
18518     case NM_SDC1X:
18519     /*case NM_SDC1XS:*/
18520         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
18521             check_cp1_enabled(ctx);
18522             switch (extract32(ctx->opcode, 7, 4)) {
18523             case NM_LWC1X:
18524             /*case NM_LWC1XS:*/
18525                 gen_flt_ldst(ctx, OPC_LWC1, rd, t0);
18526                 break;
18527             case NM_LDC1X:
18528             /*case NM_LDC1XS:*/
18529                 gen_flt_ldst(ctx, OPC_LDC1, rd, t0);
18530                 break;
18531             case NM_SWC1X:
18532             /*case NM_SWC1XS:*/
18533                 gen_flt_ldst(ctx, OPC_SWC1, rd, t0);
18534                 break;
18535             case NM_SDC1X:
18536             /*case NM_SDC1XS:*/
18537                 gen_flt_ldst(ctx, OPC_SDC1, rd, t0);
18538                 break;
18539             }
18540         } else {
18541             generate_exception_err(ctx, EXCP_CpU, 1);
18542         }
18543         break;
18544     default:
18545         generate_exception_end(ctx, EXCP_RI);
18546         break;
18547     }
18548
18549     tcg_temp_free(t0);
18550     tcg_temp_free(t1);
18551 }
18552
18553 static void gen_pool32f_nanomips_insn(DisasContext *ctx)
18554 {
18555     int rt, rs, rd;
18556
18557     rt = extract32(ctx->opcode, 21, 5);
18558     rs = extract32(ctx->opcode, 16, 5);
18559     rd = extract32(ctx->opcode, 11, 5);
18560
18561     if (!(ctx->CP0_Config1 & (1 << CP0C1_FP))) {
18562         generate_exception_end(ctx, EXCP_RI);
18563         return;
18564     }
18565     check_cp1_enabled(ctx);
18566     switch (extract32(ctx->opcode, 0, 3)) {
18567     case NM_POOL32F_0:
18568         switch (extract32(ctx->opcode, 3, 7)) {
18569         case NM_RINT_S:
18570             gen_farith(ctx, OPC_RINT_S, 0, rt, rs, 0);
18571             break;
18572         case NM_RINT_D:
18573             gen_farith(ctx, OPC_RINT_D, 0, rt, rs, 0);
18574             break;
18575         case NM_CLASS_S:
18576             gen_farith(ctx, OPC_CLASS_S, 0, rt, rs, 0);
18577             break;
18578         case NM_CLASS_D:
18579             gen_farith(ctx, OPC_CLASS_D, 0, rt, rs, 0);
18580             break;
18581         case NM_ADD_S:
18582             gen_farith(ctx, OPC_ADD_S, rt, rs, rd, 0);
18583             break;
18584         case NM_ADD_D:
18585             gen_farith(ctx, OPC_ADD_D, rt, rs, rd, 0);
18586             break;
18587         case NM_SUB_S:
18588             gen_farith(ctx, OPC_SUB_S, rt, rs, rd, 0);
18589             break;
18590         case NM_SUB_D:
18591             gen_farith(ctx, OPC_SUB_D, rt, rs, rd, 0);
18592             break;
18593         case NM_MUL_S:
18594             gen_farith(ctx, OPC_MUL_S, rt, rs, rd, 0);
18595             break;
18596         case NM_MUL_D:
18597             gen_farith(ctx, OPC_MUL_D, rt, rs, rd, 0);
18598             break;
18599         case NM_DIV_S:
18600             gen_farith(ctx, OPC_DIV_S, rt, rs, rd, 0);
18601             break;
18602         case NM_DIV_D:
18603             gen_farith(ctx, OPC_DIV_D, rt, rs, rd, 0);
18604             break;
18605         case NM_SELEQZ_S:
18606             gen_sel_s(ctx, OPC_SELEQZ_S, rd, rt, rs);
18607             break;
18608         case NM_SELEQZ_D:
18609             gen_sel_d(ctx, OPC_SELEQZ_D, rd, rt, rs);
18610             break;
18611         case NM_SELNEZ_S:
18612             gen_sel_s(ctx, OPC_SELNEZ_S, rd, rt, rs);
18613             break;
18614         case NM_SELNEZ_D:
18615             gen_sel_d(ctx, OPC_SELNEZ_D, rd, rt, rs);
18616             break;
18617         case NM_SEL_S:
18618             gen_sel_s(ctx, OPC_SEL_S, rd, rt, rs);
18619             break;
18620         case NM_SEL_D:
18621             gen_sel_d(ctx, OPC_SEL_D, rd, rt, rs);
18622             break;
18623         case NM_MADDF_S:
18624             gen_farith(ctx, OPC_MADDF_S, rt, rs, rd, 0);
18625             break;
18626         case NM_MADDF_D:
18627             gen_farith(ctx, OPC_MADDF_D, rt, rs, rd, 0);
18628             break;
18629         case NM_MSUBF_S:
18630             gen_farith(ctx, OPC_MSUBF_S, rt, rs, rd, 0);
18631             break;
18632         case NM_MSUBF_D:
18633             gen_farith(ctx, OPC_MSUBF_D, rt, rs, rd, 0);
18634             break;
18635         default:
18636             generate_exception_end(ctx, EXCP_RI);
18637             break;
18638         }
18639         break;
18640     case NM_POOL32F_3:
18641         switch (extract32(ctx->opcode, 3, 3)) {
18642         case NM_MIN_FMT:
18643             switch (extract32(ctx->opcode, 9, 1)) {
18644             case FMT_SDPS_S:
18645                 gen_farith(ctx, OPC_MIN_S, rt, rs, rd, 0);
18646                 break;
18647             case FMT_SDPS_D:
18648                 gen_farith(ctx, OPC_MIN_D, rt, rs, rd, 0);
18649                 break;
18650             }
18651             break;
18652         case NM_MAX_FMT:
18653             switch (extract32(ctx->opcode, 9, 1)) {
18654             case FMT_SDPS_S:
18655                 gen_farith(ctx, OPC_MAX_S, rt, rs, rd, 0);
18656                 break;
18657             case FMT_SDPS_D:
18658                 gen_farith(ctx, OPC_MAX_D, rt, rs, rd, 0);
18659                 break;
18660             }
18661             break;
18662         case NM_MINA_FMT:
18663             switch (extract32(ctx->opcode, 9, 1)) {
18664             case FMT_SDPS_S:
18665                 gen_farith(ctx, OPC_MINA_S, rt, rs, rd, 0);
18666                 break;
18667             case FMT_SDPS_D:
18668                 gen_farith(ctx, OPC_MINA_D, rt, rs, rd, 0);
18669                 break;
18670             }
18671             break;
18672         case NM_MAXA_FMT:
18673             switch (extract32(ctx->opcode, 9, 1)) {
18674             case FMT_SDPS_S:
18675                 gen_farith(ctx, OPC_MAXA_S, rt, rs, rd, 0);
18676                 break;
18677             case FMT_SDPS_D:
18678                 gen_farith(ctx, OPC_MAXA_D, rt, rs, rd, 0);
18679                 break;
18680             }
18681             break;
18682         case NM_POOL32FXF:
18683             switch (extract32(ctx->opcode, 6, 8)) {
18684             case NM_CFC1:
18685                 gen_cp1(ctx, OPC_CFC1, rt, rs);
18686                 break;
18687             case NM_CTC1:
18688                 gen_cp1(ctx, OPC_CTC1, rt, rs);
18689                 break;
18690             case NM_MFC1:
18691                 gen_cp1(ctx, OPC_MFC1, rt, rs);
18692                 break;
18693             case NM_MTC1:
18694                 gen_cp1(ctx, OPC_MTC1, rt, rs);
18695                 break;
18696             case NM_MFHC1:
18697                 gen_cp1(ctx, OPC_MFHC1, rt, rs);
18698                 break;
18699             case NM_MTHC1:
18700                 gen_cp1(ctx, OPC_MTHC1, rt, rs);
18701                 break;
18702             case NM_CVT_S_PL:
18703                 gen_farith(ctx, OPC_CVT_S_PL, -1, rs, rt, 0);
18704                 break;
18705             case NM_CVT_S_PU:
18706                 gen_farith(ctx, OPC_CVT_S_PU, -1, rs, rt, 0);
18707                 break;
18708             default:
18709                 switch (extract32(ctx->opcode, 6, 9)) {
18710                 case NM_CVT_L_S:
18711                     gen_farith(ctx, OPC_CVT_L_S, -1, rs, rt, 0);
18712                     break;
18713                 case NM_CVT_L_D:
18714                     gen_farith(ctx, OPC_CVT_L_D, -1, rs, rt, 0);
18715                     break;
18716                 case NM_CVT_W_S:
18717                     gen_farith(ctx, OPC_CVT_W_S, -1, rs, rt, 0);
18718                     break;
18719                 case NM_CVT_W_D:
18720                     gen_farith(ctx, OPC_CVT_W_D, -1, rs, rt, 0);
18721                     break;
18722                 case NM_RSQRT_S:
18723                     gen_farith(ctx, OPC_RSQRT_S, -1, rs, rt, 0);
18724                     break;
18725                 case NM_RSQRT_D:
18726                     gen_farith(ctx, OPC_RSQRT_D, -1, rs, rt, 0);
18727                     break;
18728                 case NM_SQRT_S:
18729                     gen_farith(ctx, OPC_SQRT_S, -1, rs, rt, 0);
18730                     break;
18731                 case NM_SQRT_D:
18732                     gen_farith(ctx, OPC_SQRT_D, -1, rs, rt, 0);
18733                     break;
18734                 case NM_RECIP_S:
18735                     gen_farith(ctx, OPC_RECIP_S, -1, rs, rt, 0);
18736                     break;
18737                 case NM_RECIP_D:
18738                     gen_farith(ctx, OPC_RECIP_D, -1, rs, rt, 0);
18739                     break;
18740                 case NM_FLOOR_L_S:
18741                     gen_farith(ctx, OPC_FLOOR_L_S, -1, rs, rt, 0);
18742                     break;
18743                 case NM_FLOOR_L_D:
18744                     gen_farith(ctx, OPC_FLOOR_L_D, -1, rs, rt, 0);
18745                     break;
18746                 case NM_FLOOR_W_S:
18747                     gen_farith(ctx, OPC_FLOOR_W_S, -1, rs, rt, 0);
18748                     break;
18749                 case NM_FLOOR_W_D:
18750                     gen_farith(ctx, OPC_FLOOR_W_D, -1, rs, rt, 0);
18751                     break;
18752                 case NM_CEIL_L_S:
18753                     gen_farith(ctx, OPC_CEIL_L_S, -1, rs, rt, 0);
18754                     break;
18755                 case NM_CEIL_L_D:
18756                     gen_farith(ctx, OPC_CEIL_L_D, -1, rs, rt, 0);
18757                     break;
18758                 case NM_CEIL_W_S:
18759                     gen_farith(ctx, OPC_CEIL_W_S, -1, rs, rt, 0);
18760                     break;
18761                 case NM_CEIL_W_D:
18762                     gen_farith(ctx, OPC_CEIL_W_D, -1, rs, rt, 0);
18763                     break;
18764                 case NM_TRUNC_L_S:
18765                     gen_farith(ctx, OPC_TRUNC_L_S, -1, rs, rt, 0);
18766                     break;
18767                 case NM_TRUNC_L_D:
18768                     gen_farith(ctx, OPC_TRUNC_L_D, -1, rs, rt, 0);
18769                     break;
18770                 case NM_TRUNC_W_S:
18771                     gen_farith(ctx, OPC_TRUNC_W_S, -1, rs, rt, 0);
18772                     break;
18773                 case NM_TRUNC_W_D:
18774                     gen_farith(ctx, OPC_TRUNC_W_D, -1, rs, rt, 0);
18775                     break;
18776                 case NM_ROUND_L_S:
18777                     gen_farith(ctx, OPC_ROUND_L_S, -1, rs, rt, 0);
18778                     break;
18779                 case NM_ROUND_L_D:
18780                     gen_farith(ctx, OPC_ROUND_L_D, -1, rs, rt, 0);
18781                     break;
18782                 case NM_ROUND_W_S:
18783                     gen_farith(ctx, OPC_ROUND_W_S, -1, rs, rt, 0);
18784                     break;
18785                 case NM_ROUND_W_D:
18786                     gen_farith(ctx, OPC_ROUND_W_D, -1, rs, rt, 0);
18787                     break;
18788                 case NM_MOV_S:
18789                     gen_farith(ctx, OPC_MOV_S, -1, rs, rt, 0);
18790                     break;
18791                 case NM_MOV_D:
18792                     gen_farith(ctx, OPC_MOV_D, -1, rs, rt, 0);
18793                     break;
18794                 case NM_ABS_S:
18795                     gen_farith(ctx, OPC_ABS_S, -1, rs, rt, 0);
18796                     break;
18797                 case NM_ABS_D:
18798                     gen_farith(ctx, OPC_ABS_D, -1, rs, rt, 0);
18799                     break;
18800                 case NM_NEG_S:
18801                     gen_farith(ctx, OPC_NEG_S, -1, rs, rt, 0);
18802                     break;
18803                 case NM_NEG_D:
18804                     gen_farith(ctx, OPC_NEG_D, -1, rs, rt, 0);
18805                     break;
18806                 case NM_CVT_D_S:
18807                     gen_farith(ctx, OPC_CVT_D_S, -1, rs, rt, 0);
18808                     break;
18809                 case NM_CVT_D_W:
18810                     gen_farith(ctx, OPC_CVT_D_W, -1, rs, rt, 0);
18811                     break;
18812                 case NM_CVT_D_L:
18813                     gen_farith(ctx, OPC_CVT_D_L, -1, rs, rt, 0);
18814                     break;
18815                 case NM_CVT_S_D:
18816                     gen_farith(ctx, OPC_CVT_S_D, -1, rs, rt, 0);
18817                     break;
18818                 case NM_CVT_S_W:
18819                     gen_farith(ctx, OPC_CVT_S_W, -1, rs, rt, 0);
18820                     break;
18821                 case NM_CVT_S_L:
18822                     gen_farith(ctx, OPC_CVT_S_L, -1, rs, rt, 0);
18823                     break;
18824                 default:
18825                     generate_exception_end(ctx, EXCP_RI);
18826                     break;
18827                 }
18828                 break;
18829             }
18830             break;
18831         }
18832         break;
18833     case NM_POOL32F_5:
18834         switch (extract32(ctx->opcode, 3, 3)) {
18835         case NM_CMP_CONDN_S:
18836             gen_r6_cmp_s(ctx, extract32(ctx->opcode, 6, 5), rt, rs, rd);
18837             break;
18838         case NM_CMP_CONDN_D:
18839             gen_r6_cmp_d(ctx, extract32(ctx->opcode, 6, 5), rt, rs, rd);
18840             break;
18841         default:
18842             generate_exception_end(ctx, EXCP_RI);
18843             break;
18844         }
18845         break;
18846     default:
18847         generate_exception_end(ctx, EXCP_RI);
18848         break;
18849     }
18850 }
18851
18852 static void gen_pool32a5_nanomips_insn(DisasContext *ctx, int opc,
18853                                        int rd, int rs, int rt)
18854 {
18855     int ret = rd;
18856     TCGv t0 = tcg_temp_new();
18857     TCGv v1_t = tcg_temp_new();
18858     TCGv v2_t = tcg_temp_new();
18859
18860     gen_load_gpr(v1_t, rs);
18861     gen_load_gpr(v2_t, rt);
18862
18863     switch (opc) {
18864     case NM_CMP_EQ_PH:
18865         check_dsp(ctx);
18866         gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
18867         break;
18868     case NM_CMP_LT_PH:
18869         check_dsp(ctx);
18870         gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
18871         break;
18872     case NM_CMP_LE_PH:
18873         check_dsp(ctx);
18874         gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
18875         break;
18876     case NM_CMPU_EQ_QB:
18877         check_dsp(ctx);
18878         gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
18879         break;
18880     case NM_CMPU_LT_QB:
18881         check_dsp(ctx);
18882         gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
18883         break;
18884     case NM_CMPU_LE_QB:
18885         check_dsp(ctx);
18886         gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
18887         break;
18888     case NM_CMPGU_EQ_QB:
18889         check_dsp(ctx);
18890         gen_helper_cmpgu_eq_qb(v1_t, v1_t, v2_t);
18891         gen_store_gpr(v1_t, ret);
18892         break;
18893     case NM_CMPGU_LT_QB:
18894         check_dsp(ctx);
18895         gen_helper_cmpgu_lt_qb(v1_t, v1_t, v2_t);
18896         gen_store_gpr(v1_t, ret);
18897         break;
18898     case NM_CMPGU_LE_QB:
18899         check_dsp(ctx);
18900         gen_helper_cmpgu_le_qb(v1_t, v1_t, v2_t);
18901         gen_store_gpr(v1_t, ret);
18902         break;
18903     case NM_CMPGDU_EQ_QB:
18904         check_dspr2(ctx);
18905         gen_helper_cmpgu_eq_qb(v1_t, v1_t, v2_t);
18906         tcg_gen_deposit_tl(cpu_dspctrl, cpu_dspctrl, v1_t, 24, 4);
18907         gen_store_gpr(v1_t, ret);
18908         break;
18909     case NM_CMPGDU_LT_QB:
18910         check_dspr2(ctx);
18911         gen_helper_cmpgu_lt_qb(v1_t, v1_t, v2_t);
18912         tcg_gen_deposit_tl(cpu_dspctrl, cpu_dspctrl, v1_t, 24, 4);
18913         gen_store_gpr(v1_t, ret);
18914         break;
18915     case NM_CMPGDU_LE_QB:
18916         check_dspr2(ctx);
18917         gen_helper_cmpgu_le_qb(v1_t, v1_t, v2_t);
18918         tcg_gen_deposit_tl(cpu_dspctrl, cpu_dspctrl, v1_t, 24, 4);
18919         gen_store_gpr(v1_t, ret);
18920         break;
18921     case NM_PACKRL_PH:
18922         check_dsp(ctx);
18923         gen_helper_packrl_ph(v1_t, v1_t, v2_t);
18924         gen_store_gpr(v1_t, ret);
18925         break;
18926     case NM_PICK_QB:
18927         check_dsp(ctx);
18928         gen_helper_pick_qb(v1_t, v1_t, v2_t, cpu_env);
18929         gen_store_gpr(v1_t, ret);
18930         break;
18931     case NM_PICK_PH:
18932         check_dsp(ctx);
18933         gen_helper_pick_ph(v1_t, v1_t, v2_t, cpu_env);
18934         gen_store_gpr(v1_t, ret);
18935         break;
18936     case NM_ADDQ_S_W:
18937         check_dsp(ctx);
18938         gen_helper_addq_s_w(v1_t, v1_t, v2_t, cpu_env);
18939         gen_store_gpr(v1_t, ret);
18940         break;
18941     case NM_SUBQ_S_W:
18942         check_dsp(ctx);
18943         gen_helper_subq_s_w(v1_t, v1_t, v2_t, cpu_env);
18944         gen_store_gpr(v1_t, ret);
18945         break;
18946     case NM_ADDSC:
18947         check_dsp(ctx);
18948         gen_helper_addsc(v1_t, v1_t, v2_t, cpu_env);
18949         gen_store_gpr(v1_t, ret);
18950         break;
18951     case NM_ADDWC:
18952         check_dsp(ctx);
18953         gen_helper_addwc(v1_t, v1_t, v2_t, cpu_env);
18954         gen_store_gpr(v1_t, ret);
18955         break;
18956     case NM_ADDQ_S_PH:
18957         check_dsp(ctx);
18958         switch (extract32(ctx->opcode, 10, 1)) {
18959         case 0:
18960             /* ADDQ_PH */
18961             gen_helper_addq_ph(v1_t, v1_t, v2_t, cpu_env);
18962             gen_store_gpr(v1_t, ret);
18963             break;
18964         case 1:
18965             /* ADDQ_S_PH */
18966             gen_helper_addq_s_ph(v1_t, v1_t, v2_t, cpu_env);
18967             gen_store_gpr(v1_t, ret);
18968             break;
18969         }
18970         break;
18971     case NM_ADDQH_R_PH:
18972         check_dspr2(ctx);
18973         switch (extract32(ctx->opcode, 10, 1)) {
18974         case 0:
18975             /* ADDQH_PH */
18976             gen_helper_addqh_ph(v1_t, v1_t, v2_t);
18977             gen_store_gpr(v1_t, ret);
18978             break;
18979         case 1:
18980             /* ADDQH_R_PH */
18981             gen_helper_addqh_r_ph(v1_t, v1_t, v2_t);
18982             gen_store_gpr(v1_t, ret);
18983             break;
18984         }
18985         break;
18986     case NM_ADDQH_R_W:
18987         check_dspr2(ctx);
18988         switch (extract32(ctx->opcode, 10, 1)) {
18989         case 0:
18990             /* ADDQH_W */
18991             gen_helper_addqh_w(v1_t, v1_t, v2_t);
18992             gen_store_gpr(v1_t, ret);
18993             break;
18994         case 1:
18995             /* ADDQH_R_W */
18996             gen_helper_addqh_r_w(v1_t, v1_t, v2_t);
18997             gen_store_gpr(v1_t, ret);
18998             break;
18999         }
19000         break;
19001     case NM_ADDU_S_QB:
19002         check_dsp(ctx);
19003         switch (extract32(ctx->opcode, 10, 1)) {
19004         case 0:
19005             /* ADDU_QB */
19006             gen_helper_addu_qb(v1_t, v1_t, v2_t, cpu_env);
19007             gen_store_gpr(v1_t, ret);
19008             break;
19009         case 1:
19010             /* ADDU_S_QB */
19011             gen_helper_addu_s_qb(v1_t, v1_t, v2_t, cpu_env);
19012             gen_store_gpr(v1_t, ret);
19013             break;
19014         }
19015         break;
19016     case NM_ADDU_S_PH:
19017         check_dspr2(ctx);
19018         switch (extract32(ctx->opcode, 10, 1)) {
19019         case 0:
19020             /* ADDU_PH */
19021             gen_helper_addu_ph(v1_t, v1_t, v2_t, cpu_env);
19022             gen_store_gpr(v1_t, ret);
19023             break;
19024         case 1:
19025             /* ADDU_S_PH */
19026             gen_helper_addu_s_ph(v1_t, v1_t, v2_t, cpu_env);
19027             gen_store_gpr(v1_t, ret);
19028             break;
19029         }
19030         break;
19031     case NM_ADDUH_R_QB:
19032         check_dspr2(ctx);
19033         switch (extract32(ctx->opcode, 10, 1)) {
19034         case 0:
19035             /* ADDUH_QB */
19036             gen_helper_adduh_qb(v1_t, v1_t, v2_t);
19037             gen_store_gpr(v1_t, ret);
19038             break;
19039         case 1:
19040             /* ADDUH_R_QB */
19041             gen_helper_adduh_r_qb(v1_t, v1_t, v2_t);
19042             gen_store_gpr(v1_t, ret);
19043             break;
19044         }
19045         break;
19046     case NM_SHRAV_R_PH:
19047         check_dsp(ctx);
19048         switch (extract32(ctx->opcode, 10, 1)) {
19049         case 0:
19050             /* SHRAV_PH */
19051             gen_helper_shra_ph(v1_t, v1_t, v2_t);
19052             gen_store_gpr(v1_t, ret);
19053             break;
19054         case 1:
19055             /* SHRAV_R_PH */
19056             gen_helper_shra_r_ph(v1_t, v1_t, v2_t);
19057             gen_store_gpr(v1_t, ret);
19058             break;
19059         }
19060         break;
19061     case NM_SHRAV_R_QB:
19062         check_dspr2(ctx);
19063         switch (extract32(ctx->opcode, 10, 1)) {
19064         case 0:
19065             /* SHRAV_QB */
19066             gen_helper_shra_qb(v1_t, v1_t, v2_t);
19067             gen_store_gpr(v1_t, ret);
19068             break;
19069         case 1:
19070             /* SHRAV_R_QB */
19071             gen_helper_shra_r_qb(v1_t, v1_t, v2_t);
19072             gen_store_gpr(v1_t, ret);
19073             break;
19074         }
19075         break;
19076     case NM_SUBQ_S_PH:
19077         check_dsp(ctx);
19078         switch (extract32(ctx->opcode, 10, 1)) {
19079         case 0:
19080             /* SUBQ_PH */
19081             gen_helper_subq_ph(v1_t, v1_t, v2_t, cpu_env);
19082             gen_store_gpr(v1_t, ret);
19083             break;
19084         case 1:
19085             /* SUBQ_S_PH */
19086             gen_helper_subq_s_ph(v1_t, v1_t, v2_t, cpu_env);
19087             gen_store_gpr(v1_t, ret);
19088             break;
19089         }
19090         break;
19091     case NM_SUBQH_R_PH:
19092         check_dspr2(ctx);
19093         switch (extract32(ctx->opcode, 10, 1)) {
19094         case 0:
19095             /* SUBQH_PH */
19096             gen_helper_subqh_ph(v1_t, v1_t, v2_t);
19097             gen_store_gpr(v1_t, ret);
19098             break;
19099         case 1:
19100             /* SUBQH_R_PH */
19101             gen_helper_subqh_r_ph(v1_t, v1_t, v2_t);
19102             gen_store_gpr(v1_t, ret);
19103             break;
19104         }
19105         break;
19106     case NM_SUBQH_R_W:
19107         check_dspr2(ctx);
19108         switch (extract32(ctx->opcode, 10, 1)) {
19109         case 0:
19110             /* SUBQH_W */
19111             gen_helper_subqh_w(v1_t, v1_t, v2_t);
19112             gen_store_gpr(v1_t, ret);
19113             break;
19114         case 1:
19115             /* SUBQH_R_W */
19116             gen_helper_subqh_r_w(v1_t, v1_t, v2_t);
19117             gen_store_gpr(v1_t, ret);
19118             break;
19119         }
19120         break;
19121     case NM_SUBU_S_QB:
19122         check_dsp(ctx);
19123         switch (extract32(ctx->opcode, 10, 1)) {
19124         case 0:
19125             /* SUBU_QB */
19126             gen_helper_subu_qb(v1_t, v1_t, v2_t, cpu_env);
19127             gen_store_gpr(v1_t, ret);
19128             break;
19129         case 1:
19130             /* SUBU_S_QB */
19131             gen_helper_subu_s_qb(v1_t, v1_t, v2_t, cpu_env);
19132             gen_store_gpr(v1_t, ret);
19133             break;
19134         }
19135         break;
19136     case NM_SUBU_S_PH:
19137         check_dspr2(ctx);
19138         switch (extract32(ctx->opcode, 10, 1)) {
19139         case 0:
19140             /* SUBU_PH */
19141             gen_helper_subu_ph(v1_t, v1_t, v2_t, cpu_env);
19142             gen_store_gpr(v1_t, ret);
19143             break;
19144         case 1:
19145             /* SUBU_S_PH */
19146             gen_helper_subu_s_ph(v1_t, v1_t, v2_t, cpu_env);
19147             gen_store_gpr(v1_t, ret);
19148             break;
19149         }
19150         break;
19151     case NM_SUBUH_R_QB:
19152         check_dspr2(ctx);
19153         switch (extract32(ctx->opcode, 10, 1)) {
19154         case 0:
19155             /* SUBUH_QB */
19156             gen_helper_subuh_qb(v1_t, v1_t, v2_t);
19157             gen_store_gpr(v1_t, ret);
19158             break;
19159         case 1:
19160             /* SUBUH_R_QB */
19161             gen_helper_subuh_r_qb(v1_t, v1_t, v2_t);
19162             gen_store_gpr(v1_t, ret);
19163             break;
19164         }
19165         break;
19166     case NM_SHLLV_S_PH:
19167         check_dsp(ctx);
19168         switch (extract32(ctx->opcode, 10, 1)) {
19169         case 0:
19170             /* SHLLV_PH */
19171             gen_helper_shll_ph(v1_t, v1_t, v2_t, cpu_env);
19172             gen_store_gpr(v1_t, ret);
19173             break;
19174         case 1:
19175             /* SHLLV_S_PH */
19176             gen_helper_shll_s_ph(v1_t, v1_t, v2_t, cpu_env);
19177             gen_store_gpr(v1_t, ret);
19178             break;
19179         }
19180         break;
19181     case NM_PRECR_SRA_R_PH_W:
19182         check_dspr2(ctx);
19183         switch (extract32(ctx->opcode, 10, 1)) {
19184         case 0:
19185             /* PRECR_SRA_PH_W */
19186             {
19187                 TCGv_i32 sa_t = tcg_const_i32(rd);
19188                 gen_helper_precr_sra_ph_w(v1_t, sa_t, v1_t,
19189                                           cpu_gpr[rt]);
19190                 gen_store_gpr(v1_t, rt);
19191                 tcg_temp_free_i32(sa_t);
19192             }
19193             break;
19194         case 1:
19195             /* PRECR_SRA_R_PH_W */
19196             {
19197                 TCGv_i32 sa_t = tcg_const_i32(rd);
19198                 gen_helper_precr_sra_r_ph_w(v1_t, sa_t, v1_t,
19199                                             cpu_gpr[rt]);
19200                 gen_store_gpr(v1_t, rt);
19201                 tcg_temp_free_i32(sa_t);
19202             }
19203             break;
19204        }
19205         break;
19206     case NM_MULEU_S_PH_QBL:
19207         check_dsp(ctx);
19208         gen_helper_muleu_s_ph_qbl(v1_t, v1_t, v2_t, cpu_env);
19209         gen_store_gpr(v1_t, ret);
19210         break;
19211     case NM_MULEU_S_PH_QBR:
19212         check_dsp(ctx);
19213         gen_helper_muleu_s_ph_qbr(v1_t, v1_t, v2_t, cpu_env);
19214         gen_store_gpr(v1_t, ret);
19215         break;
19216     case NM_MULQ_RS_PH:
19217         check_dsp(ctx);
19218         gen_helper_mulq_rs_ph(v1_t, v1_t, v2_t, cpu_env);
19219         gen_store_gpr(v1_t, ret);
19220         break;
19221     case NM_MULQ_S_PH:
19222         check_dspr2(ctx);
19223         gen_helper_mulq_s_ph(v1_t, v1_t, v2_t, cpu_env);
19224         gen_store_gpr(v1_t, ret);
19225         break;
19226     case NM_MULQ_RS_W:
19227         check_dspr2(ctx);
19228         gen_helper_mulq_rs_w(v1_t, v1_t, v2_t, cpu_env);
19229         gen_store_gpr(v1_t, ret);
19230         break;
19231     case NM_MULQ_S_W:
19232         check_dspr2(ctx);
19233         gen_helper_mulq_s_w(v1_t, v1_t, v2_t, cpu_env);
19234         gen_store_gpr(v1_t, ret);
19235         break;
19236     case NM_APPEND:
19237         check_dspr2(ctx);
19238         gen_load_gpr(t0, rs);
19239         if (rd != 0) {
19240             tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], rd, 32 - rd);
19241         }
19242         tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
19243         break;
19244     case NM_MODSUB:
19245         check_dsp(ctx);
19246         gen_helper_modsub(v1_t, v1_t, v2_t);
19247         gen_store_gpr(v1_t, ret);
19248         break;
19249     case NM_SHRAV_R_W:
19250         check_dsp(ctx);
19251         gen_helper_shra_r_w(v1_t, v1_t, v2_t);
19252         gen_store_gpr(v1_t, ret);
19253         break;
19254     case NM_SHRLV_PH:
19255         check_dspr2(ctx);
19256         gen_helper_shrl_ph(v1_t, v1_t, v2_t);
19257         gen_store_gpr(v1_t, ret);
19258         break;
19259     case NM_SHRLV_QB:
19260         check_dsp(ctx);
19261         gen_helper_shrl_qb(v1_t, v1_t, v2_t);
19262         gen_store_gpr(v1_t, ret);
19263         break;
19264     case NM_SHLLV_QB:
19265         check_dsp(ctx);
19266         gen_helper_shll_qb(v1_t, v1_t, v2_t, cpu_env);
19267         gen_store_gpr(v1_t, ret);
19268         break;
19269     case NM_SHLLV_S_W:
19270         check_dsp(ctx);
19271         gen_helper_shll_s_w(v1_t, v1_t, v2_t, cpu_env);
19272         gen_store_gpr(v1_t, ret);
19273         break;
19274     case NM_SHILO:
19275         check_dsp(ctx);
19276         {
19277             TCGv tv0 = tcg_temp_new();
19278             TCGv tv1 = tcg_temp_new();
19279             int16_t imm = extract32(ctx->opcode, 16, 7);
19280
19281             tcg_gen_movi_tl(tv0, rd >> 3);
19282             tcg_gen_movi_tl(tv1, imm);
19283             gen_helper_shilo(tv0, tv1, cpu_env);
19284         }
19285         break;
19286     case NM_MULEQ_S_W_PHL:
19287         check_dsp(ctx);
19288         gen_helper_muleq_s_w_phl(v1_t, v1_t, v2_t, cpu_env);
19289         gen_store_gpr(v1_t, ret);
19290         break;
19291     case NM_MULEQ_S_W_PHR:
19292         check_dsp(ctx);
19293         gen_helper_muleq_s_w_phr(v1_t, v1_t, v2_t, cpu_env);
19294         gen_store_gpr(v1_t, ret);
19295         break;
19296     case NM_MUL_S_PH:
19297         check_dspr2(ctx);
19298         switch (extract32(ctx->opcode, 10, 1)) {
19299         case 0:
19300             /* MUL_PH */
19301             gen_helper_mul_ph(v1_t, v1_t, v2_t, cpu_env);
19302             gen_store_gpr(v1_t, ret);
19303             break;
19304         case 1:
19305             /* MUL_S_PH */
19306             gen_helper_mul_s_ph(v1_t, v1_t, v2_t, cpu_env);
19307             gen_store_gpr(v1_t, ret);
19308             break;
19309         }
19310         break;
19311     case NM_PRECR_QB_PH:
19312         check_dspr2(ctx);
19313         gen_helper_precr_qb_ph(v1_t, v1_t, v2_t);
19314         gen_store_gpr(v1_t, ret);
19315         break;
19316     case NM_PRECRQ_QB_PH:
19317         check_dsp(ctx);
19318         gen_helper_precrq_qb_ph(v1_t, v1_t, v2_t);
19319         gen_store_gpr(v1_t, ret);
19320         break;
19321     case NM_PRECRQ_PH_W:
19322         check_dsp(ctx);
19323         gen_helper_precrq_ph_w(v1_t, v1_t, v2_t);
19324         gen_store_gpr(v1_t, ret);
19325         break;
19326     case NM_PRECRQ_RS_PH_W:
19327         check_dsp(ctx);
19328         gen_helper_precrq_rs_ph_w(v1_t, v1_t, v2_t, cpu_env);
19329         gen_store_gpr(v1_t, ret);
19330         break;
19331     case NM_PRECRQU_S_QB_PH:
19332         check_dsp(ctx);
19333         gen_helper_precrqu_s_qb_ph(v1_t, v1_t, v2_t, cpu_env);
19334         gen_store_gpr(v1_t, ret);
19335         break;
19336     case NM_SHRA_R_W:
19337         check_dsp(ctx);
19338         tcg_gen_movi_tl(t0, rd);
19339         gen_helper_shra_r_w(v1_t, t0, v1_t);
19340         gen_store_gpr(v1_t, rt);
19341         break;
19342     case NM_SHRA_R_PH:
19343         check_dsp(ctx);
19344         tcg_gen_movi_tl(t0, rd >> 1);
19345         switch (extract32(ctx->opcode, 10, 1)) {
19346         case 0:
19347             /* SHRA_PH */
19348             gen_helper_shra_ph(v1_t, t0, v1_t);
19349             break;
19350             gen_store_gpr(v1_t, rt);
19351         case 1:
19352             /* SHRA_R_PH */
19353             gen_helper_shra_r_ph(v1_t, t0, v1_t);
19354             gen_store_gpr(v1_t, rt);
19355             break;
19356         }
19357         break;
19358     case NM_SHLL_S_PH:
19359         check_dsp(ctx);
19360         tcg_gen_movi_tl(t0, rd >> 1);
19361         switch (extract32(ctx->opcode, 10, 2)) {
19362         case 0:
19363             /* SHLL_PH */
19364             gen_helper_shll_ph(v1_t, t0, v1_t, cpu_env);
19365             gen_store_gpr(v1_t, rt);
19366             break;
19367         case 2:
19368             /* SHLL_S_PH */
19369             gen_helper_shll_s_ph(v1_t, t0, v1_t, cpu_env);
19370             gen_store_gpr(v1_t, rt);
19371             break;
19372         default:
19373             generate_exception_end(ctx, EXCP_RI);
19374             break;
19375         }
19376         break;
19377     case NM_SHLL_S_W:
19378         check_dsp(ctx);
19379         tcg_gen_movi_tl(t0, rd);
19380         gen_helper_shll_s_w(v1_t, t0, v1_t, cpu_env);
19381         gen_store_gpr(v1_t, rt);
19382         break;
19383     case NM_REPL_PH:
19384         check_dsp(ctx);
19385         {
19386             int16_t imm;
19387             imm = sextract32(ctx->opcode, 11, 11);
19388             imm = (int16_t)(imm << 6) >> 6;
19389             if (rt != 0) {
19390                 tcg_gen_movi_tl(cpu_gpr[rt], dup_const(MO_16, imm));
19391             }
19392         }
19393         break;
19394     default:
19395         generate_exception_end(ctx, EXCP_RI);
19396         break;
19397     }
19398 }
19399
19400 static int decode_nanomips_32_48_opc(CPUMIPSState *env, DisasContext *ctx)
19401 {
19402     uint16_t insn;
19403     uint32_t op;
19404     int rt, rs, rd;
19405     int offset;
19406     int imm;
19407
19408     insn = cpu_lduw_code(env, ctx->base.pc_next + 2);
19409     ctx->opcode = (ctx->opcode << 16) | insn;
19410
19411     rt = extract32(ctx->opcode, 21, 5);
19412     rs = extract32(ctx->opcode, 16, 5);
19413     rd = extract32(ctx->opcode, 11, 5);
19414
19415     op = extract32(ctx->opcode, 26, 6);
19416     switch (op) {
19417     case NM_P_ADDIU:
19418         if (rt == 0) {
19419             /* P.RI */
19420             switch (extract32(ctx->opcode, 19, 2)) {
19421             case NM_SIGRIE:
19422             default:
19423                 generate_exception_end(ctx, EXCP_RI);
19424                 break;
19425             case NM_P_SYSCALL:
19426                 if ((extract32(ctx->opcode, 18, 1)) == NM_SYSCALL) {
19427                     generate_exception_end(ctx, EXCP_SYSCALL);
19428                 } else {
19429                     generate_exception_end(ctx, EXCP_RI);
19430                 }
19431                 break;
19432             case NM_BREAK:
19433                 generate_exception_end(ctx, EXCP_BREAK);
19434                 break;
19435             case NM_SDBBP:
19436                 if (is_uhi(extract32(ctx->opcode, 0, 19))) {
19437                     gen_helper_do_semihosting(cpu_env);
19438                 } else {
19439                     if (ctx->hflags & MIPS_HFLAG_SBRI) {
19440                         generate_exception_end(ctx, EXCP_RI);
19441                     } else {
19442                         generate_exception_end(ctx, EXCP_DBp);
19443                     }
19444                 }
19445                 break;
19446             }
19447         } else {
19448             /* NM_ADDIU */
19449             imm = extract32(ctx->opcode, 0, 16);
19450             if (rs != 0) {
19451                 tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], imm);
19452             } else {
19453                 tcg_gen_movi_tl(cpu_gpr[rt], imm);
19454             }
19455             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
19456         }
19457         break;
19458     case NM_ADDIUPC:
19459         if (rt != 0) {
19460             offset = sextract32(ctx->opcode, 0, 1) << 21 |
19461                      extract32(ctx->opcode, 1, 20) << 1;
19462             target_long addr = addr_add(ctx, ctx->base.pc_next + 4, offset);
19463             tcg_gen_movi_tl(cpu_gpr[rt], addr);
19464         }
19465         break;
19466     case NM_POOL32A:
19467         switch (ctx->opcode & 0x07) {
19468         case NM_POOL32A0:
19469             gen_pool32a0_nanomips_insn(env, ctx);
19470             break;
19471         case NM_POOL32A5:
19472             {
19473                 int32_t op1 = extract32(ctx->opcode, 3, 7);
19474                 gen_pool32a5_nanomips_insn(ctx, op1, rd, rs, rt);
19475             }
19476             break;
19477         case NM_POOL32A7:
19478             switch (extract32(ctx->opcode, 3, 3)) {
19479             case NM_P_LSX:
19480                 gen_p_lsx(ctx, rd, rs, rt);
19481                 break;
19482             case NM_LSA:
19483                 /* In nanoMIPS, the shift field directly encodes the shift
19484                  * amount, meaning that the supported shift values are in
19485                  * the range 0 to 3 (instead of 1 to 4 in MIPSR6). */
19486                 gen_lsa(ctx, OPC_LSA, rd, rs, rt,
19487                         extract32(ctx->opcode, 9, 2) - 1);
19488                 break;
19489             case NM_EXTW:
19490                 gen_ext(ctx, 32, rd, rs, rt, extract32(ctx->opcode, 6, 5));
19491                 break;
19492             case NM_POOL32AXF:
19493                 gen_pool32axf_nanomips_insn(env, ctx);
19494                 break;
19495             default:
19496                 generate_exception_end(ctx, EXCP_RI);
19497                 break;
19498             }
19499             break;
19500         default:
19501             generate_exception_end(ctx, EXCP_RI);
19502             break;
19503         }
19504         break;
19505     case NM_P_GP_W:
19506         switch (ctx->opcode & 0x03) {
19507         case NM_ADDIUGP_W:
19508             if (rt != 0) {
19509                 offset = extract32(ctx->opcode, 0, 21);
19510                 gen_op_addr_addi(ctx, cpu_gpr[rt], cpu_gpr[28], offset);
19511             }
19512             break;
19513         case NM_LWGP:
19514             gen_ld(ctx, OPC_LW, rt, 28, extract32(ctx->opcode, 2, 19) << 2);
19515             break;
19516         case NM_SWGP:
19517             gen_st(ctx, OPC_SW, rt, 28, extract32(ctx->opcode, 2, 19) << 2);
19518             break;
19519         default:
19520             generate_exception_end(ctx, EXCP_RI);
19521             break;
19522         }
19523         break;
19524     case NM_P48I:
19525         {
19526             insn = cpu_lduw_code(env, ctx->base.pc_next + 4);
19527             target_long addr_off = extract32(ctx->opcode, 0, 16) | insn << 16;
19528             switch (extract32(ctx->opcode, 16, 5)) {
19529             case NM_LI48:
19530                 check_nms(ctx);
19531                 if (rt != 0) {
19532                     tcg_gen_movi_tl(cpu_gpr[rt], addr_off);
19533                 }
19534                 break;
19535             case NM_ADDIU48:
19536                 check_nms(ctx);
19537                 if (rt != 0) {
19538                     tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rt], addr_off);
19539                     tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
19540                 }
19541                 break;
19542             case NM_ADDIUGP48:
19543                 check_nms(ctx);
19544                 if (rt != 0) {
19545                     gen_op_addr_addi(ctx, cpu_gpr[rt], cpu_gpr[28], addr_off);
19546                 }
19547                 break;
19548             case NM_ADDIUPC48:
19549                 check_nms(ctx);
19550                 if (rt != 0) {
19551                     target_long addr = addr_add(ctx, ctx->base.pc_next + 6,
19552                                                 addr_off);
19553
19554                     tcg_gen_movi_tl(cpu_gpr[rt], addr);
19555                 }
19556                 break;
19557             case NM_LWPC48:
19558                 check_nms(ctx);
19559                 if (rt != 0) {
19560                     TCGv t0;
19561                     t0 = tcg_temp_new();
19562
19563                     target_long addr = addr_add(ctx, ctx->base.pc_next + 6,
19564                                                 addr_off);
19565
19566                     tcg_gen_movi_tl(t0, addr);
19567                     tcg_gen_qemu_ld_tl(cpu_gpr[rt], t0, ctx->mem_idx, MO_TESL);
19568                     tcg_temp_free(t0);
19569                 }
19570                 break;
19571             case NM_SWPC48:
19572                 check_nms(ctx);
19573                 {
19574                     TCGv t0, t1;
19575                     t0 = tcg_temp_new();
19576                     t1 = tcg_temp_new();
19577
19578                     target_long addr = addr_add(ctx, ctx->base.pc_next + 6,
19579                                                 addr_off);
19580
19581                     tcg_gen_movi_tl(t0, addr);
19582                     gen_load_gpr(t1, rt);
19583
19584                     tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
19585
19586                     tcg_temp_free(t0);
19587                     tcg_temp_free(t1);
19588                 }
19589                 break;
19590             default:
19591                 generate_exception_end(ctx, EXCP_RI);
19592                 break;
19593             }
19594             return 6;
19595         }
19596     case NM_P_U12:
19597         switch (extract32(ctx->opcode, 12, 4)) {
19598         case NM_ORI:
19599             gen_logic_imm(ctx, OPC_ORI, rt, rs, extract32(ctx->opcode, 0, 12));
19600             break;
19601         case NM_XORI:
19602             gen_logic_imm(ctx, OPC_XORI, rt, rs, extract32(ctx->opcode, 0, 12));
19603             break;
19604         case NM_ANDI:
19605             gen_logic_imm(ctx, OPC_ANDI, rt, rs, extract32(ctx->opcode, 0, 12));
19606             break;
19607         case NM_P_SR:
19608             switch (extract32(ctx->opcode, 20, 1)) {
19609             case NM_PP_SR:
19610                 switch (ctx->opcode & 3) {
19611                 case NM_SAVE:
19612                     gen_save(ctx, rt, extract32(ctx->opcode, 16, 4),
19613                              extract32(ctx->opcode, 2, 1),
19614                              extract32(ctx->opcode, 3, 9) << 3);
19615                     break;
19616                 case NM_RESTORE:
19617                 case NM_RESTORE_JRC:
19618                     gen_restore(ctx, rt, extract32(ctx->opcode, 16, 4),
19619                                 extract32(ctx->opcode, 2, 1),
19620                                 extract32(ctx->opcode, 3, 9) << 3);
19621                     if ((ctx->opcode & 3) == NM_RESTORE_JRC) {
19622                         gen_compute_branch_nm(ctx, OPC_JR, 2, 31, 0, 0);
19623                     }
19624                     break;
19625                 default:
19626                     generate_exception_end(ctx, EXCP_RI);
19627                     break;
19628                 }
19629                 break;
19630             case NM_P_SR_F:
19631                 generate_exception_end(ctx, EXCP_RI);
19632                 break;
19633             }
19634             break;
19635         case NM_SLTI:
19636             gen_slt_imm(ctx, OPC_SLTI, rt, rs, extract32(ctx->opcode, 0, 12));
19637             break;
19638         case NM_SLTIU:
19639             gen_slt_imm(ctx, OPC_SLTIU, rt, rs, extract32(ctx->opcode, 0, 12));
19640             break;
19641         case NM_SEQI:
19642             {
19643                 TCGv t0 = tcg_temp_new();
19644
19645                 imm = extract32(ctx->opcode, 0, 12);
19646                 gen_load_gpr(t0, rs);
19647                 tcg_gen_setcondi_tl(TCG_COND_EQ, t0, t0, imm);
19648                 gen_store_gpr(t0, rt);
19649
19650                 tcg_temp_free(t0);
19651             }
19652             break;
19653         case NM_ADDIUNEG:
19654             imm = (int16_t) extract32(ctx->opcode, 0, 12);
19655             gen_arith_imm(ctx, OPC_ADDIU, rt, rs, -imm);
19656             break;
19657         case NM_P_SHIFT:
19658             {
19659                 int shift = extract32(ctx->opcode, 0, 5);
19660                 switch (extract32(ctx->opcode, 5, 4)) {
19661                 case NM_P_SLL:
19662                     if (rt == 0 && shift == 0) {
19663                         /* NOP */
19664                     } else if (rt == 0 && shift == 3) {
19665                         /* EHB - treat as NOP */
19666                     } else if (rt == 0 && shift == 5) {
19667                         /* PAUSE - treat as NOP */
19668                     } else if (rt == 0 && shift == 6) {
19669                         /* SYNC */
19670                         gen_sync(extract32(ctx->opcode, 16, 5));
19671                     } else {
19672                         /* SLL */
19673                         gen_shift_imm(ctx, OPC_SLL, rt, rs,
19674                                       extract32(ctx->opcode, 0, 5));
19675                     }
19676                     break;
19677                 case NM_SRL:
19678                     gen_shift_imm(ctx, OPC_SRL, rt, rs,
19679                                   extract32(ctx->opcode, 0, 5));
19680                     break;
19681                 case NM_SRA:
19682                     gen_shift_imm(ctx, OPC_SRA, rt, rs,
19683                                   extract32(ctx->opcode, 0, 5));
19684                     break;
19685                 case NM_ROTR:
19686                     gen_shift_imm(ctx, OPC_ROTR, rt, rs,
19687                                   extract32(ctx->opcode, 0, 5));
19688                     break;
19689                 }
19690             }
19691             break;
19692         case NM_P_ROTX:
19693             check_nms(ctx);
19694             if (rt != 0) {
19695                 TCGv t0 = tcg_temp_new();
19696                 TCGv_i32 shift = tcg_const_i32(extract32(ctx->opcode, 0, 5));
19697                 TCGv_i32 shiftx = tcg_const_i32(extract32(ctx->opcode, 7, 4)
19698                                                 << 1);
19699                 TCGv_i32 stripe = tcg_const_i32(extract32(ctx->opcode, 6, 1));
19700
19701                 gen_load_gpr(t0, rs);
19702                 gen_helper_rotx(cpu_gpr[rt], t0, shift, shiftx, stripe);
19703                 tcg_temp_free(t0);
19704
19705                 tcg_temp_free_i32(shift);
19706                 tcg_temp_free_i32(shiftx);
19707                 tcg_temp_free_i32(stripe);
19708             }
19709             break;
19710         case NM_P_INS:
19711             switch (((ctx->opcode >> 10) & 2) |
19712                     (extract32(ctx->opcode, 5, 1))) {
19713             case NM_INS:
19714                 check_nms(ctx);
19715                 gen_bitops(ctx, OPC_INS, rt, rs, extract32(ctx->opcode, 0, 5),
19716                            extract32(ctx->opcode, 6, 5));
19717                 break;
19718             default:
19719                 generate_exception_end(ctx, EXCP_RI);
19720                 break;
19721             }
19722             break;
19723         case NM_P_EXT:
19724             switch (((ctx->opcode >> 10) & 2) |
19725                     (extract32(ctx->opcode, 5, 1))) {
19726             case NM_EXT:
19727                 check_nms(ctx);
19728                 gen_bitops(ctx, OPC_EXT, rt, rs, extract32(ctx->opcode, 0, 5),
19729                            extract32(ctx->opcode, 6, 5));
19730                 break;
19731             default:
19732                 generate_exception_end(ctx, EXCP_RI);
19733                 break;
19734             }
19735             break;
19736         default:
19737             generate_exception_end(ctx, EXCP_RI);
19738             break;
19739         }
19740         break;
19741     case NM_POOL32F:
19742         gen_pool32f_nanomips_insn(ctx);
19743         break;
19744     case NM_POOL32S:
19745         break;
19746     case NM_P_LUI:
19747         switch (extract32(ctx->opcode, 1, 1)) {
19748         case NM_LUI:
19749             if (rt != 0) {
19750                 tcg_gen_movi_tl(cpu_gpr[rt],
19751                                 sextract32(ctx->opcode, 0, 1) << 31 |
19752                                 extract32(ctx->opcode, 2, 10) << 21 |
19753                                 extract32(ctx->opcode, 12, 9) << 12);
19754             }
19755             break;
19756         case NM_ALUIPC:
19757             if (rt != 0) {
19758                 offset = sextract32(ctx->opcode, 0, 1) << 31 |
19759                          extract32(ctx->opcode, 2, 10) << 21 |
19760                          extract32(ctx->opcode, 12, 9) << 12;
19761                 target_long addr;
19762                 addr = ~0xFFF & addr_add(ctx, ctx->base.pc_next + 4, offset);
19763                 tcg_gen_movi_tl(cpu_gpr[rt], addr);
19764             }
19765             break;
19766         }
19767         break;
19768     case NM_P_GP_BH:
19769         {
19770             uint32_t u = extract32(ctx->opcode, 0, 18);
19771
19772             switch (extract32(ctx->opcode, 18, 3)) {
19773             case NM_LBGP:
19774                 gen_ld(ctx, OPC_LB, rt, 28, u);
19775                 break;
19776             case NM_SBGP:
19777                 gen_st(ctx, OPC_SB, rt, 28, u);
19778                 break;
19779             case NM_LBUGP:
19780                 gen_ld(ctx, OPC_LBU, rt, 28, u);
19781                 break;
19782             case NM_ADDIUGP_B:
19783                 if (rt != 0) {
19784                     gen_op_addr_addi(ctx, cpu_gpr[rt], cpu_gpr[28], u);
19785                 }
19786                 break;
19787             case NM_P_GP_LH:
19788                 u &= ~1;
19789                 switch (ctx->opcode & 1) {
19790                 case NM_LHGP:
19791                     gen_ld(ctx, OPC_LH, rt, 28, u);
19792                     break;
19793                 case NM_LHUGP:
19794                     gen_ld(ctx, OPC_LHU, rt, 28, u);
19795                     break;
19796                 }
19797                 break;
19798             case NM_P_GP_SH:
19799                 u &= ~1;
19800                 switch (ctx->opcode & 1) {
19801                 case NM_SHGP:
19802                     gen_st(ctx, OPC_SH, rt, 28, u);
19803                     break;
19804                 default:
19805                     generate_exception_end(ctx, EXCP_RI);
19806                     break;
19807                 }
19808                 break;
19809             case NM_P_GP_CP1:
19810                 u &= ~0x3;
19811                 switch (ctx->opcode & 0x3) {
19812                 case NM_LWC1GP:
19813                     gen_cop1_ldst(ctx, OPC_LWC1, rt, 28, u);
19814                     break;
19815                 case NM_LDC1GP:
19816                     gen_cop1_ldst(ctx, OPC_LDC1, rt, 28, u);
19817                     break;
19818                 case NM_SWC1GP:
19819                     gen_cop1_ldst(ctx, OPC_SWC1, rt, 28, u);
19820                     break;
19821                 case NM_SDC1GP:
19822                     gen_cop1_ldst(ctx, OPC_SDC1, rt, 28, u);
19823                     break;
19824                 }
19825                 break;
19826             default:
19827                 generate_exception_end(ctx, EXCP_RI);
19828                 break;
19829             }
19830         }
19831         break;
19832     case NM_P_LS_U12:
19833         {
19834             uint32_t u = extract32(ctx->opcode, 0, 12);
19835
19836             switch (extract32(ctx->opcode, 12, 4)) {
19837             case NM_P_PREFU12:
19838                 if (rt == 31) {
19839                     /* SYNCI */
19840                     /* Break the TB to be able to sync copied instructions
19841                        immediately */
19842                     ctx->base.is_jmp = DISAS_STOP;
19843                 } else {
19844                     /* PREF */
19845                     /* Treat as NOP. */
19846                 }
19847                 break;
19848             case NM_LB:
19849                 gen_ld(ctx, OPC_LB, rt, rs, u);
19850                 break;
19851             case NM_LH:
19852                 gen_ld(ctx, OPC_LH, rt, rs, u);
19853                 break;
19854             case NM_LW:
19855                 gen_ld(ctx, OPC_LW, rt, rs, u);
19856                 break;
19857             case NM_LBU:
19858                 gen_ld(ctx, OPC_LBU, rt, rs, u);
19859                 break;
19860             case NM_LHU:
19861                 gen_ld(ctx, OPC_LHU, rt, rs, u);
19862                 break;
19863             case NM_SB:
19864                 gen_st(ctx, OPC_SB, rt, rs, u);
19865                 break;
19866             case NM_SH:
19867                 gen_st(ctx, OPC_SH, rt, rs, u);
19868                 break;
19869             case NM_SW:
19870                 gen_st(ctx, OPC_SW, rt, rs, u);
19871                 break;
19872             case NM_LWC1:
19873                 gen_cop1_ldst(ctx, OPC_LWC1, rt, rs, u);
19874                 break;
19875             case NM_LDC1:
19876                 gen_cop1_ldst(ctx, OPC_LDC1, rt, rs, u);
19877                 break;
19878             case NM_SWC1:
19879                 gen_cop1_ldst(ctx, OPC_SWC1, rt, rs, u);
19880                 break;
19881             case NM_SDC1:
19882                 gen_cop1_ldst(ctx, OPC_SDC1, rt, rs, u);
19883                 break;
19884             default:
19885                 generate_exception_end(ctx, EXCP_RI);
19886                 break;
19887             }
19888         }
19889         break;
19890     case NM_P_LS_S9:
19891         {
19892             int32_t s = (sextract32(ctx->opcode, 15, 1) << 8) |
19893                         extract32(ctx->opcode, 0, 8);
19894
19895             switch (extract32(ctx->opcode, 8, 3)) {
19896             case NM_P_LS_S0:
19897                 switch (extract32(ctx->opcode, 11, 4)) {
19898                 case NM_LBS9:
19899                     gen_ld(ctx, OPC_LB, rt, rs, s);
19900                     break;
19901                 case NM_LHS9:
19902                     gen_ld(ctx, OPC_LH, rt, rs, s);
19903                     break;
19904                 case NM_LWS9:
19905                     gen_ld(ctx, OPC_LW, rt, rs, s);
19906                     break;
19907                 case NM_LBUS9:
19908                     gen_ld(ctx, OPC_LBU, rt, rs, s);
19909                     break;
19910                 case NM_LHUS9:
19911                     gen_ld(ctx, OPC_LHU, rt, rs, s);
19912                     break;
19913                 case NM_SBS9:
19914                     gen_st(ctx, OPC_SB, rt, rs, s);
19915                     break;
19916                 case NM_SHS9:
19917                     gen_st(ctx, OPC_SH, rt, rs, s);
19918                     break;
19919                 case NM_SWS9:
19920                     gen_st(ctx, OPC_SW, rt, rs, s);
19921                     break;
19922                 case NM_LWC1S9:
19923                     gen_cop1_ldst(ctx, OPC_LWC1, rt, rs, s);
19924                     break;
19925                 case NM_LDC1S9:
19926                     gen_cop1_ldst(ctx, OPC_LDC1, rt, rs, s);
19927                     break;
19928                 case NM_SWC1S9:
19929                     gen_cop1_ldst(ctx, OPC_SWC1, rt, rs, s);
19930                     break;
19931                 case NM_SDC1S9:
19932                     gen_cop1_ldst(ctx, OPC_SDC1, rt, rs, s);
19933                     break;
19934                 case NM_P_PREFS9:
19935                     if (rt == 31) {
19936                         /* SYNCI */
19937                         /* Break the TB to be able to sync copied instructions
19938                            immediately */
19939                         ctx->base.is_jmp = DISAS_STOP;
19940                     } else {
19941                         /* PREF */
19942                         /* Treat as NOP. */
19943                     }
19944                     break;
19945                 default:
19946                     generate_exception_end(ctx, EXCP_RI);
19947                     break;
19948                 }
19949                 break;
19950             case NM_P_LS_S1:
19951                 switch (extract32(ctx->opcode, 11, 4)) {
19952                 case NM_UALH:
19953                 case NM_UASH:
19954                     check_nms(ctx);
19955                     {
19956                         TCGv t0 = tcg_temp_new();
19957                         TCGv t1 = tcg_temp_new();
19958
19959                         gen_base_offset_addr(ctx, t0, rs, s);
19960
19961                         switch (extract32(ctx->opcode, 11, 4)) {
19962                         case NM_UALH:
19963                             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW |
19964                                                MO_UNALN);
19965                             gen_store_gpr(t0, rt);
19966                             break;
19967                         case NM_UASH:
19968                             gen_load_gpr(t1, rt);
19969                             tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUW |
19970                                                MO_UNALN);
19971                             break;
19972                         }
19973                         tcg_temp_free(t0);
19974                         tcg_temp_free(t1);
19975                     }
19976                     break;
19977                 case NM_P_LL:
19978                     switch (ctx->opcode & 0x03) {
19979                     case NM_LL:
19980                         gen_ld(ctx, OPC_LL, rt, rs, s);
19981                         break;
19982                     case NM_LLWP:
19983                         check_xnp(ctx);
19984                         gen_llwp(ctx, rs, 0, rt, extract32(ctx->opcode, 3, 5));
19985                         break;
19986                     }
19987                     break;
19988                 case NM_P_SC:
19989                     switch (ctx->opcode & 0x03) {
19990                     case NM_SC:
19991                         gen_st_cond(ctx, OPC_SC, rt, rs, s);
19992                         break;
19993                     case NM_SCWP:
19994                         check_xnp(ctx);
19995                         gen_scwp(ctx, rs, 0, rt, extract32(ctx->opcode, 3, 5));
19996                         break;
19997                     }
19998                     break;
19999                 case NM_CACHE:
20000                     check_cp0_enabled(ctx);
20001                     if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
20002                         gen_cache_operation(ctx, rt, rs, s);
20003                     }
20004                     break;
20005                 }
20006                 break;
20007             case NM_P_LS_WM:
20008             case NM_P_LS_UAWM:
20009                 check_nms(ctx);
20010                 {
20011                     int count = extract32(ctx->opcode, 12, 3);
20012                     int counter = 0;
20013
20014                     offset = sextract32(ctx->opcode, 15, 1) << 8 |
20015                              extract32(ctx->opcode, 0, 8);
20016                     TCGv va = tcg_temp_new();
20017                     TCGv t1 = tcg_temp_new();
20018                     TCGMemOp memop = (extract32(ctx->opcode, 8, 3)) ==
20019                                       NM_P_LS_UAWM ? MO_UNALN : 0;
20020
20021                     count = (count == 0) ? 8 : count;
20022                     while (counter != count) {
20023                         int this_rt = ((rt + counter) & 0x1f) | (rt & 0x10);
20024                         int this_offset = offset + (counter << 2);
20025
20026                         gen_base_offset_addr(ctx, va, rs, this_offset);
20027
20028                         switch (extract32(ctx->opcode, 11, 1)) {
20029                         case NM_LWM:
20030                             tcg_gen_qemu_ld_tl(t1, va, ctx->mem_idx,
20031                                                memop | MO_TESL);
20032                             gen_store_gpr(t1, this_rt);
20033                             if ((this_rt == rs) &&
20034                                 (counter != (count - 1))) {
20035                                 /* UNPREDICTABLE */
20036                             }
20037                             break;
20038                         case NM_SWM:
20039                             this_rt = (rt == 0) ? 0 : this_rt;
20040                             gen_load_gpr(t1, this_rt);
20041                             tcg_gen_qemu_st_tl(t1, va, ctx->mem_idx,
20042                                                memop | MO_TEUL);
20043                             break;
20044                         }
20045                         counter++;
20046                     }
20047                     tcg_temp_free(va);
20048                     tcg_temp_free(t1);
20049                 }
20050                 break;
20051             default:
20052                 generate_exception_end(ctx, EXCP_RI);
20053                 break;
20054             }
20055         }
20056         break;
20057     case NM_MOVE_BALC:
20058         check_nms(ctx);
20059         {
20060             TCGv t0 = tcg_temp_new();
20061             int32_t s = sextract32(ctx->opcode, 0, 1) << 21 |
20062                         extract32(ctx->opcode, 1, 20) << 1;
20063             rd = (extract32(ctx->opcode, 24, 1)) == 0 ? 4 : 5;
20064             rt = decode_gpr_gpr4_zero(extract32(ctx->opcode, 25, 1) << 3 |
20065                             extract32(ctx->opcode, 21, 3));
20066             gen_load_gpr(t0, rt);
20067             tcg_gen_mov_tl(cpu_gpr[rd], t0);
20068             gen_compute_branch_nm(ctx, OPC_BGEZAL, 4, 0, 0, s);
20069             tcg_temp_free(t0);
20070         }
20071         break;
20072     case NM_P_BAL:
20073         {
20074             int32_t s = sextract32(ctx->opcode, 0, 1) << 25 |
20075                         extract32(ctx->opcode, 1, 24) << 1;
20076
20077             if ((extract32(ctx->opcode, 25, 1)) == 0) {
20078                 /* BC */
20079                 gen_compute_branch_nm(ctx, OPC_BEQ, 4, 0, 0, s);
20080             } else {
20081                 /* BALC */
20082                 gen_compute_branch_nm(ctx, OPC_BGEZAL, 4, 0, 0, s);
20083             }
20084         }
20085         break;
20086     case NM_P_J:
20087         switch (extract32(ctx->opcode, 12, 4)) {
20088         case NM_JALRC:
20089         case NM_JALRC_HB:
20090             gen_compute_branch_nm(ctx, OPC_JALR, 4, rs, rt, 0);
20091             break;
20092         case NM_P_BALRSC:
20093             gen_compute_nanomips_pbalrsc_branch(ctx, rs, rt);
20094             break;
20095         default:
20096             generate_exception_end(ctx, EXCP_RI);
20097             break;
20098         }
20099         break;
20100     case NM_P_BR1:
20101         {
20102             int32_t s = sextract32(ctx->opcode, 0, 1) << 14 |
20103                         extract32(ctx->opcode, 1, 13) << 1;
20104             switch (extract32(ctx->opcode, 14, 2)) {
20105             case NM_BEQC:
20106                 check_nms(ctx);
20107                 gen_compute_branch_nm(ctx, OPC_BEQ, 4, rs, rt, s);
20108                 break;
20109             case NM_P_BR3A:
20110                 s = sextract32(ctx->opcode, 0, 1) << 14 |
20111                     extract32(ctx->opcode, 1, 13) << 1;
20112                 check_cp1_enabled(ctx);
20113                 switch (extract32(ctx->opcode, 16, 5)) {
20114                 case NM_BC1EQZC:
20115                     gen_compute_branch_cp1_nm(ctx, OPC_BC1EQZ, rt, s);
20116                     break;
20117                 case NM_BC1NEZC:
20118                     gen_compute_branch_cp1_nm(ctx, OPC_BC1NEZ, rt, s);
20119                     break;
20120                 case NM_BPOSGE32C:
20121                     check_dspr2(ctx);
20122                     {
20123                         int32_t imm = extract32(ctx->opcode, 1, 13) |
20124                                       extract32(ctx->opcode, 0, 1) << 13;
20125
20126                         gen_compute_branch_nm(ctx, OPC_BPOSGE32, 4, -1, -2,
20127                                               imm);
20128                     }
20129                     break;
20130                 default:
20131                     generate_exception_end(ctx, EXCP_RI);
20132                     break;
20133                 }
20134                 break;
20135             case NM_BGEC:
20136                 if (rs == rt) {
20137                     gen_compute_compact_branch_nm(ctx, OPC_BC, rs, rt, s);
20138                 } else {
20139                     gen_compute_compact_branch_nm(ctx, OPC_BGEC, rs, rt, s);
20140                 }
20141                 break;
20142             case NM_BGEUC:
20143                 if (rs == rt || rt == 0) {
20144                     gen_compute_compact_branch_nm(ctx, OPC_BC, 0, 0, s);
20145                 } else if (rs == 0) {
20146                     gen_compute_compact_branch_nm(ctx, OPC_BEQZC, rt, 0, s);
20147                 } else {
20148                     gen_compute_compact_branch_nm(ctx, OPC_BGEUC, rs, rt, s);
20149                 }
20150                 break;
20151             }
20152         }
20153         break;
20154     case NM_P_BR2:
20155         {
20156             int32_t s = sextract32(ctx->opcode, 0, 1) << 14 |
20157                         extract32(ctx->opcode, 1, 13) << 1;
20158             switch (extract32(ctx->opcode, 14, 2)) {
20159             case NM_BNEC:
20160                 check_nms(ctx);
20161                 gen_compute_branch_nm(ctx, OPC_BNE, 4, rs, rt, s);
20162                 break;
20163             case NM_BLTC:
20164                 if (rs != 0 && rt != 0 && rs == rt) {
20165                     /* NOP */
20166                     ctx->hflags |= MIPS_HFLAG_FBNSLOT;
20167                 } else {
20168                     gen_compute_compact_branch_nm(ctx, OPC_BLTC, rs, rt, s);
20169                 }
20170                 break;
20171             case NM_BLTUC:
20172                 if (rs == 0 || rs == rt) {
20173                     /* NOP */
20174                     ctx->hflags |= MIPS_HFLAG_FBNSLOT;
20175                 } else {
20176                     gen_compute_compact_branch_nm(ctx, OPC_BLTUC, rs, rt, s);
20177                 }
20178                 break;
20179             default:
20180                 generate_exception_end(ctx, EXCP_RI);
20181                 break;
20182             }
20183         }
20184         break;
20185     case NM_P_BRI:
20186         {
20187             int32_t s = sextract32(ctx->opcode, 0, 1) << 11 |
20188                         extract32(ctx->opcode, 1, 10) << 1;
20189             uint32_t u = extract32(ctx->opcode, 11, 7);
20190
20191             gen_compute_imm_branch(ctx, extract32(ctx->opcode, 18, 3),
20192                                    rt, u, s);
20193         }
20194         break;
20195     default:
20196         generate_exception_end(ctx, EXCP_RI);
20197         break;
20198     }
20199     return 4;
20200 }
20201
20202 static int decode_nanomips_opc(CPUMIPSState *env, DisasContext *ctx)
20203 {
20204     uint32_t op;
20205     int rt = decode_gpr_gpr3(NANOMIPS_EXTRACT_RD(ctx->opcode));
20206     int rs = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS(ctx->opcode));
20207     int rd = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS1(ctx->opcode));
20208     int offset;
20209     int imm;
20210
20211     /* make sure instructions are on a halfword boundary */
20212     if (ctx->base.pc_next & 0x1) {
20213         TCGv tmp = tcg_const_tl(ctx->base.pc_next);
20214         tcg_gen_st_tl(tmp, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
20215         tcg_temp_free(tmp);
20216         generate_exception_end(ctx, EXCP_AdEL);
20217         return 2;
20218     }
20219
20220     op = extract32(ctx->opcode, 10, 6);
20221     switch (op) {
20222     case NM_P16_MV:
20223         rt = NANOMIPS_EXTRACT_RD5(ctx->opcode);
20224         if (rt != 0) {
20225             /* MOVE */
20226             rs = NANOMIPS_EXTRACT_RS5(ctx->opcode);
20227             gen_arith(ctx, OPC_ADDU, rt, rs, 0);
20228         } else {
20229             /* P16.RI */
20230             switch (extract32(ctx->opcode, 3, 2)) {
20231             case NM_P16_SYSCALL:
20232                 if (extract32(ctx->opcode, 2, 1) == 0) {
20233                     generate_exception_end(ctx, EXCP_SYSCALL);
20234                 } else {
20235                     generate_exception_end(ctx, EXCP_RI);
20236                 }
20237                 break;
20238             case NM_BREAK16:
20239                 generate_exception_end(ctx, EXCP_BREAK);
20240                 break;
20241             case NM_SDBBP16:
20242                 if (is_uhi(extract32(ctx->opcode, 0, 3))) {
20243                     gen_helper_do_semihosting(cpu_env);
20244                 } else {
20245                     if (ctx->hflags & MIPS_HFLAG_SBRI) {
20246                         generate_exception_end(ctx, EXCP_RI);
20247                     } else {
20248                         generate_exception_end(ctx, EXCP_DBp);
20249                     }
20250                 }
20251                 break;
20252             default:
20253                 generate_exception_end(ctx, EXCP_RI);
20254                 break;
20255             }
20256         }
20257         break;
20258     case NM_P16_SHIFT:
20259         {
20260             int shift = extract32(ctx->opcode, 0, 3);
20261             uint32_t opc = 0;
20262             shift = (shift == 0) ? 8 : shift;
20263
20264             switch (extract32(ctx->opcode, 3, 1)) {
20265             case NM_SLL16:
20266                 opc = OPC_SLL;
20267                 break;
20268             case NM_SRL16:
20269                 opc = OPC_SRL;
20270                 break;
20271             }
20272             gen_shift_imm(ctx, opc, rt, rs, shift);
20273         }
20274         break;
20275     case NM_P16C:
20276         switch (ctx->opcode & 1) {
20277         case NM_POOL16C_0:
20278             gen_pool16c_nanomips_insn(ctx);
20279             break;
20280         case NM_LWXS16:
20281             gen_ldxs(ctx, rt, rs, rd);
20282             break;
20283         }
20284         break;
20285     case NM_P16_A1:
20286         switch (extract32(ctx->opcode, 6, 1)) {
20287         case NM_ADDIUR1SP:
20288             imm = extract32(ctx->opcode, 0, 6) << 2;
20289             gen_arith_imm(ctx, OPC_ADDIU, rt, 29, imm);
20290             break;
20291         default:
20292             generate_exception_end(ctx, EXCP_RI);
20293             break;
20294         }
20295         break;
20296     case NM_P16_A2:
20297         switch (extract32(ctx->opcode, 3, 1)) {
20298         case NM_ADDIUR2:
20299             imm = extract32(ctx->opcode, 0, 3) << 2;
20300             gen_arith_imm(ctx, OPC_ADDIU, rt, rs, imm);
20301             break;
20302         case NM_P_ADDIURS5:
20303             rt = extract32(ctx->opcode, 5, 5);
20304             if (rt != 0) {
20305                 /* imm = sign_extend(s[3] . s[2:0] , from_nbits = 4) */
20306                 imm = (sextract32(ctx->opcode, 4, 1) << 3) |
20307                       (extract32(ctx->opcode, 0, 3));
20308                 gen_arith_imm(ctx, OPC_ADDIU, rt, rt, imm);
20309             }
20310             break;
20311         }
20312         break;
20313     case NM_P16_ADDU:
20314         switch (ctx->opcode & 0x1) {
20315         case NM_ADDU16:
20316             gen_arith(ctx, OPC_ADDU, rd, rs, rt);
20317             break;
20318         case NM_SUBU16:
20319             gen_arith(ctx, OPC_SUBU, rd, rs, rt);
20320             break;
20321         }
20322         break;
20323     case NM_P16_4X4:
20324         rt = (extract32(ctx->opcode, 9, 1) << 3) |
20325               extract32(ctx->opcode, 5, 3);
20326         rs = (extract32(ctx->opcode, 4, 1) << 3) |
20327               extract32(ctx->opcode, 0, 3);
20328         rt = decode_gpr_gpr4(rt);
20329         rs = decode_gpr_gpr4(rs);
20330         switch ((extract32(ctx->opcode, 7, 2) & 0x2) |
20331                 (extract32(ctx->opcode, 3, 1))) {
20332         case NM_ADDU4X4:
20333             check_nms(ctx);
20334             gen_arith(ctx, OPC_ADDU, rt, rs, rt);
20335             break;
20336         case NM_MUL4X4:
20337             check_nms(ctx);
20338             gen_r6_muldiv(ctx, R6_OPC_MUL, rt, rs, rt);
20339             break;
20340         default:
20341             generate_exception_end(ctx, EXCP_RI);
20342             break;
20343         }
20344         break;
20345     case NM_LI16:
20346         {
20347             int imm = extract32(ctx->opcode, 0, 7);
20348             imm = (imm == 0x7f ? -1 : imm);
20349             if (rt != 0) {
20350                 tcg_gen_movi_tl(cpu_gpr[rt], imm);
20351             }
20352         }
20353         break;
20354     case NM_ANDI16:
20355         {
20356             uint32_t u = extract32(ctx->opcode, 0, 4);
20357             u = (u == 12) ? 0xff :
20358                 (u == 13) ? 0xffff : u;
20359             gen_logic_imm(ctx, OPC_ANDI, rt, rs, u);
20360         }
20361         break;
20362     case NM_P16_LB:
20363         offset = extract32(ctx->opcode, 0, 2);
20364         switch (extract32(ctx->opcode, 2, 2)) {
20365         case NM_LB16:
20366             gen_ld(ctx, OPC_LB, rt, rs, offset);
20367             break;
20368         case NM_SB16:
20369             rt = decode_gpr_gpr3_src_store(
20370                      NANOMIPS_EXTRACT_RD(ctx->opcode));
20371             gen_st(ctx, OPC_SB, rt, rs, offset);
20372             break;
20373         case NM_LBU16:
20374             gen_ld(ctx, OPC_LBU, rt, rs, offset);
20375             break;
20376         default:
20377             generate_exception_end(ctx, EXCP_RI);
20378             break;
20379         }
20380         break;
20381     case NM_P16_LH:
20382         offset = extract32(ctx->opcode, 1, 2) << 1;
20383         switch ((extract32(ctx->opcode, 3, 1) << 1) | (ctx->opcode & 1)) {
20384         case NM_LH16:
20385             gen_ld(ctx, OPC_LH, rt, rs, offset);
20386             break;
20387         case NM_SH16:
20388             rt = decode_gpr_gpr3_src_store(
20389                      NANOMIPS_EXTRACT_RD(ctx->opcode));
20390             gen_st(ctx, OPC_SH, rt, rs, offset);
20391             break;
20392         case NM_LHU16:
20393             gen_ld(ctx, OPC_LHU, rt, rs, offset);
20394             break;
20395         default:
20396             generate_exception_end(ctx, EXCP_RI);
20397             break;
20398         }
20399         break;
20400     case NM_LW16:
20401         offset = extract32(ctx->opcode, 0, 4) << 2;
20402         gen_ld(ctx, OPC_LW, rt, rs, offset);
20403         break;
20404     case NM_LWSP16:
20405         rt = NANOMIPS_EXTRACT_RD5(ctx->opcode);
20406         offset = extract32(ctx->opcode, 0, 5) << 2;
20407         gen_ld(ctx, OPC_LW, rt, 29, offset);
20408         break;
20409     case NM_LW4X4:
20410         check_nms(ctx);
20411         rt = (extract32(ctx->opcode, 9, 1) << 3) |
20412              extract32(ctx->opcode, 5, 3);
20413         rs = (extract32(ctx->opcode, 4, 1) << 3) |
20414              extract32(ctx->opcode, 0, 3);
20415         offset = (extract32(ctx->opcode, 3, 1) << 3) |
20416                  (extract32(ctx->opcode, 8, 1) << 2);
20417         rt = decode_gpr_gpr4(rt);
20418         rs = decode_gpr_gpr4(rs);
20419         gen_ld(ctx, OPC_LW, rt, rs, offset);
20420         break;
20421     case NM_SW4X4:
20422         check_nms(ctx);
20423         rt = (extract32(ctx->opcode, 9, 1) << 3) |
20424              extract32(ctx->opcode, 5, 3);
20425         rs = (extract32(ctx->opcode, 4, 1) << 3) |
20426              extract32(ctx->opcode, 0, 3);
20427         offset = (extract32(ctx->opcode, 3, 1) << 3) |
20428                  (extract32(ctx->opcode, 8, 1) << 2);
20429         rt = decode_gpr_gpr4_zero(rt);
20430         rs = decode_gpr_gpr4(rs);
20431         gen_st(ctx, OPC_SW, rt, rs, offset);
20432         break;
20433     case NM_LWGP16:
20434         offset = extract32(ctx->opcode, 0, 7) << 2;
20435         gen_ld(ctx, OPC_LW, rt, 28, offset);
20436         break;
20437     case NM_SWSP16:
20438         rt = NANOMIPS_EXTRACT_RD5(ctx->opcode);
20439         offset = extract32(ctx->opcode, 0, 5) << 2;
20440         gen_st(ctx, OPC_SW, rt, 29, offset);
20441         break;
20442     case NM_SW16:
20443         rt = decode_gpr_gpr3_src_store(
20444                  NANOMIPS_EXTRACT_RD(ctx->opcode));
20445         rs = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS(ctx->opcode));
20446         offset = extract32(ctx->opcode, 0, 4) << 2;
20447         gen_st(ctx, OPC_SW, rt, rs, offset);
20448         break;
20449     case NM_SWGP16:
20450         rt = decode_gpr_gpr3_src_store(
20451                  NANOMIPS_EXTRACT_RD(ctx->opcode));
20452         offset = extract32(ctx->opcode, 0, 7) << 2;
20453         gen_st(ctx, OPC_SW, rt, 28, offset);
20454         break;
20455     case NM_BC16:
20456         gen_compute_branch_nm(ctx, OPC_BEQ, 2, 0, 0,
20457                            (sextract32(ctx->opcode, 0, 1) << 10) |
20458                            (extract32(ctx->opcode, 1, 9) << 1));
20459         break;
20460     case NM_BALC16:
20461         gen_compute_branch_nm(ctx, OPC_BGEZAL, 2, 0, 0,
20462                            (sextract32(ctx->opcode, 0, 1) << 10) |
20463                            (extract32(ctx->opcode, 1, 9) << 1));
20464         break;
20465     case NM_BEQZC16:
20466         gen_compute_branch_nm(ctx, OPC_BEQ, 2, rt, 0,
20467                            (sextract32(ctx->opcode, 0, 1) << 7) |
20468                            (extract32(ctx->opcode, 1, 6) << 1));
20469         break;
20470     case NM_BNEZC16:
20471         gen_compute_branch_nm(ctx, OPC_BNE, 2, rt, 0,
20472                            (sextract32(ctx->opcode, 0, 1) << 7) |
20473                            (extract32(ctx->opcode, 1, 6) << 1));
20474         break;
20475     case NM_P16_BR:
20476         switch (ctx->opcode & 0xf) {
20477         case 0:
20478             /* P16.JRC */
20479             switch (extract32(ctx->opcode, 4, 1)) {
20480             case NM_JRC:
20481                 gen_compute_branch_nm(ctx, OPC_JR, 2,
20482                                    extract32(ctx->opcode, 5, 5), 0, 0);
20483                 break;
20484             case NM_JALRC16:
20485                 gen_compute_branch_nm(ctx, OPC_JALR, 2,
20486                                    extract32(ctx->opcode, 5, 5), 31, 0);
20487                 break;
20488             }
20489             break;
20490         default:
20491             {
20492                 /* P16.BRI */
20493                 uint32_t opc = extract32(ctx->opcode, 4, 3) <
20494                                extract32(ctx->opcode, 7, 3) ? OPC_BEQ : OPC_BNE;
20495                 gen_compute_branch_nm(ctx, opc, 2, rs, rt,
20496                                    extract32(ctx->opcode, 0, 4) << 1);
20497             }
20498             break;
20499         }
20500         break;
20501     case NM_P16_SR:
20502         {
20503             int count = extract32(ctx->opcode, 0, 4);
20504             int u = extract32(ctx->opcode, 4, 4) << 4;
20505
20506             rt = 30 + extract32(ctx->opcode, 9, 1);
20507             switch (extract32(ctx->opcode, 8, 1)) {
20508             case NM_SAVE16:
20509                 gen_save(ctx, rt, count, 0, u);
20510                 break;
20511             case NM_RESTORE_JRC16:
20512                 gen_restore(ctx, rt, count, 0, u);
20513                 gen_compute_branch_nm(ctx, OPC_JR, 2, 31, 0, 0);
20514                 break;
20515             }
20516         }
20517         break;
20518     case NM_MOVEP:
20519     case NM_MOVEPREV:
20520         check_nms(ctx);
20521         {
20522             static const int gpr2reg1[] = {4, 5, 6, 7};
20523             static const int gpr2reg2[] = {5, 6, 7, 8};
20524             int re;
20525             int rd2 = extract32(ctx->opcode, 3, 1) << 1 |
20526                       extract32(ctx->opcode, 8, 1);
20527             int r1 = gpr2reg1[rd2];
20528             int r2 = gpr2reg2[rd2];
20529             int r3 = extract32(ctx->opcode, 4, 1) << 3 |
20530                      extract32(ctx->opcode, 0, 3);
20531             int r4 = extract32(ctx->opcode, 9, 1) << 3 |
20532                      extract32(ctx->opcode, 5, 3);
20533             TCGv t0 = tcg_temp_new();
20534             TCGv t1 = tcg_temp_new();
20535             if (op == NM_MOVEP) {
20536                 rd = r1;
20537                 re = r2;
20538                 rs = decode_gpr_gpr4_zero(r3);
20539                 rt = decode_gpr_gpr4_zero(r4);
20540             } else {
20541                 rd = decode_gpr_gpr4(r3);
20542                 re = decode_gpr_gpr4(r4);
20543                 rs = r1;
20544                 rt = r2;
20545             }
20546             gen_load_gpr(t0, rs);
20547             gen_load_gpr(t1, rt);
20548             tcg_gen_mov_tl(cpu_gpr[rd], t0);
20549             tcg_gen_mov_tl(cpu_gpr[re], t1);
20550             tcg_temp_free(t0);
20551             tcg_temp_free(t1);
20552         }
20553         break;
20554     default:
20555         return decode_nanomips_32_48_opc(env, ctx);
20556     }
20557
20558     return 2;
20559 }
20560
20561
20562 /* SmartMIPS extension to MIPS32 */
20563
20564 #if defined(TARGET_MIPS64)
20565
20566 /* MDMX extension to MIPS64 */
20567
20568 #endif
20569
20570 /* MIPSDSP functions. */
20571 static void gen_mipsdsp_ld(DisasContext *ctx, uint32_t opc,
20572                            int rd, int base, int offset)
20573 {
20574     TCGv t0;
20575
20576     check_dsp(ctx);
20577     t0 = tcg_temp_new();
20578
20579     if (base == 0) {
20580         gen_load_gpr(t0, offset);
20581     } else if (offset == 0) {
20582         gen_load_gpr(t0, base);
20583     } else {
20584         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[offset]);
20585     }
20586
20587     switch (opc) {
20588     case OPC_LBUX:
20589         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
20590         gen_store_gpr(t0, rd);
20591         break;
20592     case OPC_LHX:
20593         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW);
20594         gen_store_gpr(t0, rd);
20595         break;
20596     case OPC_LWX:
20597         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
20598         gen_store_gpr(t0, rd);
20599         break;
20600 #if defined(TARGET_MIPS64)
20601     case OPC_LDX:
20602         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
20603         gen_store_gpr(t0, rd);
20604         break;
20605 #endif
20606     }
20607     tcg_temp_free(t0);
20608 }
20609
20610 static void gen_mipsdsp_arith(DisasContext *ctx, uint32_t op1, uint32_t op2,
20611                               int ret, int v1, int v2)
20612 {
20613     TCGv v1_t;
20614     TCGv v2_t;
20615
20616     if (ret == 0) {
20617         /* Treat as NOP. */
20618         return;
20619     }
20620
20621     v1_t = tcg_temp_new();
20622     v2_t = tcg_temp_new();
20623
20624     gen_load_gpr(v1_t, v1);
20625     gen_load_gpr(v2_t, v2);
20626
20627     switch (op1) {
20628     /* OPC_MULT_G_2E is equal OPC_ADDUH_QB_DSP */
20629     case OPC_MULT_G_2E:
20630         check_dspr2(ctx);
20631         switch (op2) {
20632         case OPC_ADDUH_QB:
20633             gen_helper_adduh_qb(cpu_gpr[ret], v1_t, v2_t);
20634             break;
20635         case OPC_ADDUH_R_QB:
20636             gen_helper_adduh_r_qb(cpu_gpr[ret], v1_t, v2_t);
20637             break;
20638         case OPC_ADDQH_PH:
20639             gen_helper_addqh_ph(cpu_gpr[ret], v1_t, v2_t);
20640             break;
20641         case OPC_ADDQH_R_PH:
20642             gen_helper_addqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
20643             break;
20644         case OPC_ADDQH_W:
20645             gen_helper_addqh_w(cpu_gpr[ret], v1_t, v2_t);
20646             break;
20647         case OPC_ADDQH_R_W:
20648             gen_helper_addqh_r_w(cpu_gpr[ret], v1_t, v2_t);
20649             break;
20650         case OPC_SUBUH_QB:
20651             gen_helper_subuh_qb(cpu_gpr[ret], v1_t, v2_t);
20652             break;
20653         case OPC_SUBUH_R_QB:
20654             gen_helper_subuh_r_qb(cpu_gpr[ret], v1_t, v2_t);
20655             break;
20656         case OPC_SUBQH_PH:
20657             gen_helper_subqh_ph(cpu_gpr[ret], v1_t, v2_t);
20658             break;
20659         case OPC_SUBQH_R_PH:
20660             gen_helper_subqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
20661             break;
20662         case OPC_SUBQH_W:
20663             gen_helper_subqh_w(cpu_gpr[ret], v1_t, v2_t);
20664             break;
20665         case OPC_SUBQH_R_W:
20666             gen_helper_subqh_r_w(cpu_gpr[ret], v1_t, v2_t);
20667             break;
20668         }
20669         break;
20670     case OPC_ABSQ_S_PH_DSP:
20671         switch (op2) {
20672         case OPC_ABSQ_S_QB:
20673             check_dspr2(ctx);
20674             gen_helper_absq_s_qb(cpu_gpr[ret], v2_t, cpu_env);
20675             break;
20676         case OPC_ABSQ_S_PH:
20677             check_dsp(ctx);
20678             gen_helper_absq_s_ph(cpu_gpr[ret], v2_t, cpu_env);
20679             break;
20680         case OPC_ABSQ_S_W:
20681             check_dsp(ctx);
20682             gen_helper_absq_s_w(cpu_gpr[ret], v2_t, cpu_env);
20683             break;
20684         case OPC_PRECEQ_W_PHL:
20685             check_dsp(ctx);
20686             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFF0000);
20687             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
20688             break;
20689         case OPC_PRECEQ_W_PHR:
20690             check_dsp(ctx);
20691             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0x0000FFFF);
20692             tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 16);
20693             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
20694             break;
20695         case OPC_PRECEQU_PH_QBL:
20696             check_dsp(ctx);
20697             gen_helper_precequ_ph_qbl(cpu_gpr[ret], v2_t);
20698             break;
20699         case OPC_PRECEQU_PH_QBR:
20700             check_dsp(ctx);
20701             gen_helper_precequ_ph_qbr(cpu_gpr[ret], v2_t);
20702             break;
20703         case OPC_PRECEQU_PH_QBLA:
20704             check_dsp(ctx);
20705             gen_helper_precequ_ph_qbla(cpu_gpr[ret], v2_t);
20706             break;
20707         case OPC_PRECEQU_PH_QBRA:
20708             check_dsp(ctx);
20709             gen_helper_precequ_ph_qbra(cpu_gpr[ret], v2_t);
20710             break;
20711         case OPC_PRECEU_PH_QBL:
20712             check_dsp(ctx);
20713             gen_helper_preceu_ph_qbl(cpu_gpr[ret], v2_t);
20714             break;
20715         case OPC_PRECEU_PH_QBR:
20716             check_dsp(ctx);
20717             gen_helper_preceu_ph_qbr(cpu_gpr[ret], v2_t);
20718             break;
20719         case OPC_PRECEU_PH_QBLA:
20720             check_dsp(ctx);
20721             gen_helper_preceu_ph_qbla(cpu_gpr[ret], v2_t);
20722             break;
20723         case OPC_PRECEU_PH_QBRA:
20724             check_dsp(ctx);
20725             gen_helper_preceu_ph_qbra(cpu_gpr[ret], v2_t);
20726             break;
20727         }
20728         break;
20729     case OPC_ADDU_QB_DSP:
20730         switch (op2) {
20731         case OPC_ADDQ_PH:
20732             check_dsp(ctx);
20733             gen_helper_addq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20734             break;
20735         case OPC_ADDQ_S_PH:
20736             check_dsp(ctx);
20737             gen_helper_addq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20738             break;
20739         case OPC_ADDQ_S_W:
20740             check_dsp(ctx);
20741             gen_helper_addq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20742             break;
20743         case OPC_ADDU_QB:
20744             check_dsp(ctx);
20745             gen_helper_addu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20746             break;
20747         case OPC_ADDU_S_QB:
20748             check_dsp(ctx);
20749             gen_helper_addu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20750             break;
20751         case OPC_ADDU_PH:
20752             check_dspr2(ctx);
20753             gen_helper_addu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20754             break;
20755         case OPC_ADDU_S_PH:
20756             check_dspr2(ctx);
20757             gen_helper_addu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20758             break;
20759         case OPC_SUBQ_PH:
20760             check_dsp(ctx);
20761             gen_helper_subq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20762             break;
20763         case OPC_SUBQ_S_PH:
20764             check_dsp(ctx);
20765             gen_helper_subq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20766             break;
20767         case OPC_SUBQ_S_W:
20768             check_dsp(ctx);
20769             gen_helper_subq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20770             break;
20771         case OPC_SUBU_QB:
20772             check_dsp(ctx);
20773             gen_helper_subu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20774             break;
20775         case OPC_SUBU_S_QB:
20776             check_dsp(ctx);
20777             gen_helper_subu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20778             break;
20779         case OPC_SUBU_PH:
20780             check_dspr2(ctx);
20781             gen_helper_subu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20782             break;
20783         case OPC_SUBU_S_PH:
20784             check_dspr2(ctx);
20785             gen_helper_subu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20786             break;
20787         case OPC_ADDSC:
20788             check_dsp(ctx);
20789             gen_helper_addsc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20790             break;
20791         case OPC_ADDWC:
20792             check_dsp(ctx);
20793             gen_helper_addwc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20794             break;
20795         case OPC_MODSUB:
20796             check_dsp(ctx);
20797             gen_helper_modsub(cpu_gpr[ret], v1_t, v2_t);
20798             break;
20799         case OPC_RADDU_W_QB:
20800             check_dsp(ctx);
20801             gen_helper_raddu_w_qb(cpu_gpr[ret], v1_t);
20802             break;
20803         }
20804         break;
20805     case OPC_CMPU_EQ_QB_DSP:
20806         switch (op2) {
20807         case OPC_PRECR_QB_PH:
20808             check_dspr2(ctx);
20809             gen_helper_precr_qb_ph(cpu_gpr[ret], v1_t, v2_t);
20810             break;
20811         case OPC_PRECRQ_QB_PH:
20812             check_dsp(ctx);
20813             gen_helper_precrq_qb_ph(cpu_gpr[ret], v1_t, v2_t);
20814             break;
20815         case OPC_PRECR_SRA_PH_W:
20816             check_dspr2(ctx);
20817             {
20818                 TCGv_i32 sa_t = tcg_const_i32(v2);
20819                 gen_helper_precr_sra_ph_w(cpu_gpr[ret], sa_t, v1_t,
20820                                           cpu_gpr[ret]);
20821                 tcg_temp_free_i32(sa_t);
20822                 break;
20823             }
20824         case OPC_PRECR_SRA_R_PH_W:
20825             check_dspr2(ctx);
20826             {
20827                 TCGv_i32 sa_t = tcg_const_i32(v2);
20828                 gen_helper_precr_sra_r_ph_w(cpu_gpr[ret], sa_t, v1_t,
20829                                             cpu_gpr[ret]);
20830                 tcg_temp_free_i32(sa_t);
20831                 break;
20832             }
20833         case OPC_PRECRQ_PH_W:
20834             check_dsp(ctx);
20835             gen_helper_precrq_ph_w(cpu_gpr[ret], v1_t, v2_t);
20836             break;
20837         case OPC_PRECRQ_RS_PH_W:
20838             check_dsp(ctx);
20839             gen_helper_precrq_rs_ph_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20840             break;
20841         case OPC_PRECRQU_S_QB_PH:
20842             check_dsp(ctx);
20843             gen_helper_precrqu_s_qb_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20844             break;
20845         }
20846         break;
20847 #ifdef TARGET_MIPS64
20848     case OPC_ABSQ_S_QH_DSP:
20849         switch (op2) {
20850         case OPC_PRECEQ_L_PWL:
20851             check_dsp(ctx);
20852             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFFFFFF00000000ull);
20853             break;
20854         case OPC_PRECEQ_L_PWR:
20855             check_dsp(ctx);
20856             tcg_gen_shli_tl(cpu_gpr[ret], v2_t, 32);
20857             break;
20858         case OPC_PRECEQ_PW_QHL:
20859             check_dsp(ctx);
20860             gen_helper_preceq_pw_qhl(cpu_gpr[ret], v2_t);
20861             break;
20862         case OPC_PRECEQ_PW_QHR:
20863             check_dsp(ctx);
20864             gen_helper_preceq_pw_qhr(cpu_gpr[ret], v2_t);
20865             break;
20866         case OPC_PRECEQ_PW_QHLA:
20867             check_dsp(ctx);
20868             gen_helper_preceq_pw_qhla(cpu_gpr[ret], v2_t);
20869             break;
20870         case OPC_PRECEQ_PW_QHRA:
20871             check_dsp(ctx);
20872             gen_helper_preceq_pw_qhra(cpu_gpr[ret], v2_t);
20873             break;
20874         case OPC_PRECEQU_QH_OBL:
20875             check_dsp(ctx);
20876             gen_helper_precequ_qh_obl(cpu_gpr[ret], v2_t);
20877             break;
20878         case OPC_PRECEQU_QH_OBR:
20879             check_dsp(ctx);
20880             gen_helper_precequ_qh_obr(cpu_gpr[ret], v2_t);
20881             break;
20882         case OPC_PRECEQU_QH_OBLA:
20883             check_dsp(ctx);
20884             gen_helper_precequ_qh_obla(cpu_gpr[ret], v2_t);
20885             break;
20886         case OPC_PRECEQU_QH_OBRA:
20887             check_dsp(ctx);
20888             gen_helper_precequ_qh_obra(cpu_gpr[ret], v2_t);
20889             break;
20890         case OPC_PRECEU_QH_OBL:
20891             check_dsp(ctx);
20892             gen_helper_preceu_qh_obl(cpu_gpr[ret], v2_t);
20893             break;
20894         case OPC_PRECEU_QH_OBR:
20895             check_dsp(ctx);
20896             gen_helper_preceu_qh_obr(cpu_gpr[ret], v2_t);
20897             break;
20898         case OPC_PRECEU_QH_OBLA:
20899             check_dsp(ctx);
20900             gen_helper_preceu_qh_obla(cpu_gpr[ret], v2_t);
20901             break;
20902         case OPC_PRECEU_QH_OBRA:
20903             check_dsp(ctx);
20904             gen_helper_preceu_qh_obra(cpu_gpr[ret], v2_t);
20905             break;
20906         case OPC_ABSQ_S_OB:
20907             check_dspr2(ctx);
20908             gen_helper_absq_s_ob(cpu_gpr[ret], v2_t, cpu_env);
20909             break;
20910         case OPC_ABSQ_S_PW:
20911             check_dsp(ctx);
20912             gen_helper_absq_s_pw(cpu_gpr[ret], v2_t, cpu_env);
20913             break;
20914         case OPC_ABSQ_S_QH:
20915             check_dsp(ctx);
20916             gen_helper_absq_s_qh(cpu_gpr[ret], v2_t, cpu_env);
20917             break;
20918         }
20919         break;
20920     case OPC_ADDU_OB_DSP:
20921         switch (op2) {
20922         case OPC_RADDU_L_OB:
20923             check_dsp(ctx);
20924             gen_helper_raddu_l_ob(cpu_gpr[ret], v1_t);
20925             break;
20926         case OPC_SUBQ_PW:
20927             check_dsp(ctx);
20928             gen_helper_subq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20929             break;
20930         case OPC_SUBQ_S_PW:
20931             check_dsp(ctx);
20932             gen_helper_subq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20933             break;
20934         case OPC_SUBQ_QH:
20935             check_dsp(ctx);
20936             gen_helper_subq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20937             break;
20938         case OPC_SUBQ_S_QH:
20939             check_dsp(ctx);
20940             gen_helper_subq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20941             break;
20942         case OPC_SUBU_OB:
20943             check_dsp(ctx);
20944             gen_helper_subu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20945             break;
20946         case OPC_SUBU_S_OB:
20947             check_dsp(ctx);
20948             gen_helper_subu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20949             break;
20950         case OPC_SUBU_QH:
20951             check_dspr2(ctx);
20952             gen_helper_subu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20953             break;
20954         case OPC_SUBU_S_QH:
20955             check_dspr2(ctx);
20956             gen_helper_subu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20957             break;
20958         case OPC_SUBUH_OB:
20959             check_dspr2(ctx);
20960             gen_helper_subuh_ob(cpu_gpr[ret], v1_t, v2_t);
20961             break;
20962         case OPC_SUBUH_R_OB:
20963             check_dspr2(ctx);
20964             gen_helper_subuh_r_ob(cpu_gpr[ret], v1_t, v2_t);
20965             break;
20966         case OPC_ADDQ_PW:
20967             check_dsp(ctx);
20968             gen_helper_addq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20969             break;
20970         case OPC_ADDQ_S_PW:
20971             check_dsp(ctx);
20972             gen_helper_addq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20973             break;
20974         case OPC_ADDQ_QH:
20975             check_dsp(ctx);
20976             gen_helper_addq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20977             break;
20978         case OPC_ADDQ_S_QH:
20979             check_dsp(ctx);
20980             gen_helper_addq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20981             break;
20982         case OPC_ADDU_OB:
20983             check_dsp(ctx);
20984             gen_helper_addu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20985             break;
20986         case OPC_ADDU_S_OB:
20987             check_dsp(ctx);
20988             gen_helper_addu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20989             break;
20990         case OPC_ADDU_QH:
20991             check_dspr2(ctx);
20992             gen_helper_addu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20993             break;
20994         case OPC_ADDU_S_QH:
20995             check_dspr2(ctx);
20996             gen_helper_addu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
20997             break;
20998         case OPC_ADDUH_OB:
20999             check_dspr2(ctx);
21000             gen_helper_adduh_ob(cpu_gpr[ret], v1_t, v2_t);
21001             break;
21002         case OPC_ADDUH_R_OB:
21003             check_dspr2(ctx);
21004             gen_helper_adduh_r_ob(cpu_gpr[ret], v1_t, v2_t);
21005             break;
21006         }
21007         break;
21008     case OPC_CMPU_EQ_OB_DSP:
21009         switch (op2) {
21010         case OPC_PRECR_OB_QH:
21011             check_dspr2(ctx);
21012             gen_helper_precr_ob_qh(cpu_gpr[ret], v1_t, v2_t);
21013             break;
21014         case OPC_PRECR_SRA_QH_PW:
21015             check_dspr2(ctx);
21016             {
21017                 TCGv_i32 ret_t = tcg_const_i32(ret);
21018                 gen_helper_precr_sra_qh_pw(v2_t, v1_t, v2_t, ret_t);
21019                 tcg_temp_free_i32(ret_t);
21020                 break;
21021             }
21022         case OPC_PRECR_SRA_R_QH_PW:
21023             check_dspr2(ctx);
21024             {
21025                 TCGv_i32 sa_v = tcg_const_i32(ret);
21026                 gen_helper_precr_sra_r_qh_pw(v2_t, v1_t, v2_t, sa_v);
21027                 tcg_temp_free_i32(sa_v);
21028                 break;
21029             }
21030         case OPC_PRECRQ_OB_QH:
21031             check_dsp(ctx);
21032             gen_helper_precrq_ob_qh(cpu_gpr[ret], v1_t, v2_t);
21033             break;
21034         case OPC_PRECRQ_PW_L:
21035             check_dsp(ctx);
21036             gen_helper_precrq_pw_l(cpu_gpr[ret], v1_t, v2_t);
21037             break;
21038         case OPC_PRECRQ_QH_PW:
21039             check_dsp(ctx);
21040             gen_helper_precrq_qh_pw(cpu_gpr[ret], v1_t, v2_t);
21041             break;
21042         case OPC_PRECRQ_RS_QH_PW:
21043             check_dsp(ctx);
21044             gen_helper_precrq_rs_qh_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21045             break;
21046         case OPC_PRECRQU_S_OB_QH:
21047             check_dsp(ctx);
21048             gen_helper_precrqu_s_ob_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21049             break;
21050         }
21051         break;
21052 #endif
21053     }
21054
21055     tcg_temp_free(v1_t);
21056     tcg_temp_free(v2_t);
21057 }
21058
21059 static void gen_mipsdsp_shift(DisasContext *ctx, uint32_t opc,
21060                               int ret, int v1, int v2)
21061 {
21062     uint32_t op2;
21063     TCGv t0;
21064     TCGv v1_t;
21065     TCGv v2_t;
21066
21067     if (ret == 0) {
21068         /* Treat as NOP. */
21069         return;
21070     }
21071
21072     t0 = tcg_temp_new();
21073     v1_t = tcg_temp_new();
21074     v2_t = tcg_temp_new();
21075
21076     tcg_gen_movi_tl(t0, v1);
21077     gen_load_gpr(v1_t, v1);
21078     gen_load_gpr(v2_t, v2);
21079
21080     switch (opc) {
21081     case OPC_SHLL_QB_DSP:
21082         {
21083             op2 = MASK_SHLL_QB(ctx->opcode);
21084             switch (op2) {
21085             case OPC_SHLL_QB:
21086                 check_dsp(ctx);
21087                 gen_helper_shll_qb(cpu_gpr[ret], t0, v2_t, cpu_env);
21088                 break;
21089             case OPC_SHLLV_QB:
21090                 check_dsp(ctx);
21091                 gen_helper_shll_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21092                 break;
21093             case OPC_SHLL_PH:
21094                 check_dsp(ctx);
21095                 gen_helper_shll_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
21096                 break;
21097             case OPC_SHLLV_PH:
21098                 check_dsp(ctx);
21099                 gen_helper_shll_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21100                 break;
21101             case OPC_SHLL_S_PH:
21102                 check_dsp(ctx);
21103                 gen_helper_shll_s_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
21104                 break;
21105             case OPC_SHLLV_S_PH:
21106                 check_dsp(ctx);
21107                 gen_helper_shll_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21108                 break;
21109             case OPC_SHLL_S_W:
21110                 check_dsp(ctx);
21111                 gen_helper_shll_s_w(cpu_gpr[ret], t0, v2_t, cpu_env);
21112                 break;
21113             case OPC_SHLLV_S_W:
21114                 check_dsp(ctx);
21115                 gen_helper_shll_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21116                 break;
21117             case OPC_SHRL_QB:
21118                 check_dsp(ctx);
21119                 gen_helper_shrl_qb(cpu_gpr[ret], t0, v2_t);
21120                 break;
21121             case OPC_SHRLV_QB:
21122                 check_dsp(ctx);
21123                 gen_helper_shrl_qb(cpu_gpr[ret], v1_t, v2_t);
21124                 break;
21125             case OPC_SHRL_PH:
21126                 check_dspr2(ctx);
21127                 gen_helper_shrl_ph(cpu_gpr[ret], t0, v2_t);
21128                 break;
21129             case OPC_SHRLV_PH:
21130                 check_dspr2(ctx);
21131                 gen_helper_shrl_ph(cpu_gpr[ret], v1_t, v2_t);
21132                 break;
21133             case OPC_SHRA_QB:
21134                 check_dspr2(ctx);
21135                 gen_helper_shra_qb(cpu_gpr[ret], t0, v2_t);
21136                 break;
21137             case OPC_SHRA_R_QB:
21138                 check_dspr2(ctx);
21139                 gen_helper_shra_r_qb(cpu_gpr[ret], t0, v2_t);
21140                 break;
21141             case OPC_SHRAV_QB:
21142                 check_dspr2(ctx);
21143                 gen_helper_shra_qb(cpu_gpr[ret], v1_t, v2_t);
21144                 break;
21145             case OPC_SHRAV_R_QB:
21146                 check_dspr2(ctx);
21147                 gen_helper_shra_r_qb(cpu_gpr[ret], v1_t, v2_t);
21148                 break;
21149             case OPC_SHRA_PH:
21150                 check_dsp(ctx);
21151                 gen_helper_shra_ph(cpu_gpr[ret], t0, v2_t);
21152                 break;
21153             case OPC_SHRA_R_PH:
21154                 check_dsp(ctx);
21155                 gen_helper_shra_r_ph(cpu_gpr[ret], t0, v2_t);
21156                 break;
21157             case OPC_SHRAV_PH:
21158                 check_dsp(ctx);
21159                 gen_helper_shra_ph(cpu_gpr[ret], v1_t, v2_t);
21160                 break;
21161             case OPC_SHRAV_R_PH:
21162                 check_dsp(ctx);
21163                 gen_helper_shra_r_ph(cpu_gpr[ret], v1_t, v2_t);
21164                 break;
21165             case OPC_SHRA_R_W:
21166                 check_dsp(ctx);
21167                 gen_helper_shra_r_w(cpu_gpr[ret], t0, v2_t);
21168                 break;
21169             case OPC_SHRAV_R_W:
21170                 check_dsp(ctx);
21171                 gen_helper_shra_r_w(cpu_gpr[ret], v1_t, v2_t);
21172                 break;
21173             default:            /* Invalid */
21174                 MIPS_INVAL("MASK SHLL.QB");
21175                 generate_exception_end(ctx, EXCP_RI);
21176                 break;
21177             }
21178             break;
21179         }
21180 #ifdef TARGET_MIPS64
21181     case OPC_SHLL_OB_DSP:
21182         op2 = MASK_SHLL_OB(ctx->opcode);
21183         switch (op2) {
21184         case OPC_SHLL_PW:
21185             check_dsp(ctx);
21186             gen_helper_shll_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
21187             break;
21188         case OPC_SHLLV_PW:
21189             check_dsp(ctx);
21190             gen_helper_shll_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
21191             break;
21192         case OPC_SHLL_S_PW:
21193             check_dsp(ctx);
21194             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
21195             break;
21196         case OPC_SHLLV_S_PW:
21197             check_dsp(ctx);
21198             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
21199             break;
21200         case OPC_SHLL_OB:
21201             check_dsp(ctx);
21202             gen_helper_shll_ob(cpu_gpr[ret], v2_t, t0, cpu_env);
21203             break;
21204         case OPC_SHLLV_OB:
21205             check_dsp(ctx);
21206             gen_helper_shll_ob(cpu_gpr[ret], v2_t, v1_t, cpu_env);
21207             break;
21208         case OPC_SHLL_QH:
21209             check_dsp(ctx);
21210             gen_helper_shll_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
21211             break;
21212         case OPC_SHLLV_QH:
21213             check_dsp(ctx);
21214             gen_helper_shll_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
21215             break;
21216         case OPC_SHLL_S_QH:
21217             check_dsp(ctx);
21218             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
21219             break;
21220         case OPC_SHLLV_S_QH:
21221             check_dsp(ctx);
21222             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
21223             break;
21224         case OPC_SHRA_OB:
21225             check_dspr2(ctx);
21226             gen_helper_shra_ob(cpu_gpr[ret], v2_t, t0);
21227             break;
21228         case OPC_SHRAV_OB:
21229             check_dspr2(ctx);
21230             gen_helper_shra_ob(cpu_gpr[ret], v2_t, v1_t);
21231             break;
21232         case OPC_SHRA_R_OB:
21233             check_dspr2(ctx);
21234             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, t0);
21235             break;
21236         case OPC_SHRAV_R_OB:
21237             check_dspr2(ctx);
21238             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, v1_t);
21239             break;
21240         case OPC_SHRA_PW:
21241             check_dsp(ctx);
21242             gen_helper_shra_pw(cpu_gpr[ret], v2_t, t0);
21243             break;
21244         case OPC_SHRAV_PW:
21245             check_dsp(ctx);
21246             gen_helper_shra_pw(cpu_gpr[ret], v2_t, v1_t);
21247             break;
21248         case OPC_SHRA_R_PW:
21249             check_dsp(ctx);
21250             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, t0);
21251             break;
21252         case OPC_SHRAV_R_PW:
21253             check_dsp(ctx);
21254             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, v1_t);
21255             break;
21256         case OPC_SHRA_QH:
21257             check_dsp(ctx);
21258             gen_helper_shra_qh(cpu_gpr[ret], v2_t, t0);
21259             break;
21260         case OPC_SHRAV_QH:
21261             check_dsp(ctx);
21262             gen_helper_shra_qh(cpu_gpr[ret], v2_t, v1_t);
21263             break;
21264         case OPC_SHRA_R_QH:
21265             check_dsp(ctx);
21266             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, t0);
21267             break;
21268         case OPC_SHRAV_R_QH:
21269             check_dsp(ctx);
21270             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, v1_t);
21271             break;
21272         case OPC_SHRL_OB:
21273             check_dsp(ctx);
21274             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, t0);
21275             break;
21276         case OPC_SHRLV_OB:
21277             check_dsp(ctx);
21278             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, v1_t);
21279             break;
21280         case OPC_SHRL_QH:
21281             check_dspr2(ctx);
21282             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, t0);
21283             break;
21284         case OPC_SHRLV_QH:
21285             check_dspr2(ctx);
21286             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, v1_t);
21287             break;
21288         default:            /* Invalid */
21289             MIPS_INVAL("MASK SHLL.OB");
21290             generate_exception_end(ctx, EXCP_RI);
21291             break;
21292         }
21293         break;
21294 #endif
21295     }
21296
21297     tcg_temp_free(t0);
21298     tcg_temp_free(v1_t);
21299     tcg_temp_free(v2_t);
21300 }
21301
21302 static void gen_mipsdsp_multiply(DisasContext *ctx, uint32_t op1, uint32_t op2,
21303                                  int ret, int v1, int v2, int check_ret)
21304 {
21305     TCGv_i32 t0;
21306     TCGv v1_t;
21307     TCGv v2_t;
21308
21309     if ((ret == 0) && (check_ret == 1)) {
21310         /* Treat as NOP. */
21311         return;
21312     }
21313
21314     t0 = tcg_temp_new_i32();
21315     v1_t = tcg_temp_new();
21316     v2_t = tcg_temp_new();
21317
21318     tcg_gen_movi_i32(t0, ret);
21319     gen_load_gpr(v1_t, v1);
21320     gen_load_gpr(v2_t, v2);
21321
21322     switch (op1) {
21323     /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
21324      * the same mask and op1. */
21325     case OPC_MULT_G_2E:
21326         check_dspr2(ctx);
21327         switch (op2) {
21328         case  OPC_MUL_PH:
21329             gen_helper_mul_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21330             break;
21331         case  OPC_MUL_S_PH:
21332             gen_helper_mul_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21333             break;
21334         case OPC_MULQ_S_W:
21335             gen_helper_mulq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21336             break;
21337         case OPC_MULQ_RS_W:
21338             gen_helper_mulq_rs_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21339             break;
21340         }
21341         break;
21342     case OPC_DPA_W_PH_DSP:
21343         switch (op2) {
21344         case OPC_DPAU_H_QBL:
21345             check_dsp(ctx);
21346             gen_helper_dpau_h_qbl(t0, v1_t, v2_t, cpu_env);
21347             break;
21348         case OPC_DPAU_H_QBR:
21349             check_dsp(ctx);
21350             gen_helper_dpau_h_qbr(t0, v1_t, v2_t, cpu_env);
21351             break;
21352         case OPC_DPSU_H_QBL:
21353             check_dsp(ctx);
21354             gen_helper_dpsu_h_qbl(t0, v1_t, v2_t, cpu_env);
21355             break;
21356         case OPC_DPSU_H_QBR:
21357             check_dsp(ctx);
21358             gen_helper_dpsu_h_qbr(t0, v1_t, v2_t, cpu_env);
21359             break;
21360         case OPC_DPA_W_PH:
21361             check_dspr2(ctx);
21362             gen_helper_dpa_w_ph(t0, v1_t, v2_t, cpu_env);
21363             break;
21364         case OPC_DPAX_W_PH:
21365             check_dspr2(ctx);
21366             gen_helper_dpax_w_ph(t0, v1_t, v2_t, cpu_env);
21367             break;
21368         case OPC_DPAQ_S_W_PH:
21369             check_dsp(ctx);
21370             gen_helper_dpaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
21371             break;
21372         case OPC_DPAQX_S_W_PH:
21373             check_dspr2(ctx);
21374             gen_helper_dpaqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
21375             break;
21376         case OPC_DPAQX_SA_W_PH:
21377             check_dspr2(ctx);
21378             gen_helper_dpaqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
21379             break;
21380         case OPC_DPS_W_PH:
21381             check_dspr2(ctx);
21382             gen_helper_dps_w_ph(t0, v1_t, v2_t, cpu_env);
21383             break;
21384         case OPC_DPSX_W_PH:
21385             check_dspr2(ctx);
21386             gen_helper_dpsx_w_ph(t0, v1_t, v2_t, cpu_env);
21387             break;
21388         case OPC_DPSQ_S_W_PH:
21389             check_dsp(ctx);
21390             gen_helper_dpsq_s_w_ph(t0, v1_t, v2_t, cpu_env);
21391             break;
21392         case OPC_DPSQX_S_W_PH:
21393             check_dspr2(ctx);
21394             gen_helper_dpsqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
21395             break;
21396         case OPC_DPSQX_SA_W_PH:
21397             check_dspr2(ctx);
21398             gen_helper_dpsqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
21399             break;
21400         case OPC_MULSAQ_S_W_PH:
21401             check_dsp(ctx);
21402             gen_helper_mulsaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
21403             break;
21404         case OPC_DPAQ_SA_L_W:
21405             check_dsp(ctx);
21406             gen_helper_dpaq_sa_l_w(t0, v1_t, v2_t, cpu_env);
21407             break;
21408         case OPC_DPSQ_SA_L_W:
21409             check_dsp(ctx);
21410             gen_helper_dpsq_sa_l_w(t0, v1_t, v2_t, cpu_env);
21411             break;
21412         case OPC_MAQ_S_W_PHL:
21413             check_dsp(ctx);
21414             gen_helper_maq_s_w_phl(t0, v1_t, v2_t, cpu_env);
21415             break;
21416         case OPC_MAQ_S_W_PHR:
21417             check_dsp(ctx);
21418             gen_helper_maq_s_w_phr(t0, v1_t, v2_t, cpu_env);
21419             break;
21420         case OPC_MAQ_SA_W_PHL:
21421             check_dsp(ctx);
21422             gen_helper_maq_sa_w_phl(t0, v1_t, v2_t, cpu_env);
21423             break;
21424         case OPC_MAQ_SA_W_PHR:
21425             check_dsp(ctx);
21426             gen_helper_maq_sa_w_phr(t0, v1_t, v2_t, cpu_env);
21427             break;
21428         case OPC_MULSA_W_PH:
21429             check_dspr2(ctx);
21430             gen_helper_mulsa_w_ph(t0, v1_t, v2_t, cpu_env);
21431             break;
21432         }
21433         break;
21434 #ifdef TARGET_MIPS64
21435     case OPC_DPAQ_W_QH_DSP:
21436         {
21437             int ac = ret & 0x03;
21438             tcg_gen_movi_i32(t0, ac);
21439
21440             switch (op2) {
21441             case OPC_DMADD:
21442                 check_dsp(ctx);
21443                 gen_helper_dmadd(v1_t, v2_t, t0, cpu_env);
21444                 break;
21445             case OPC_DMADDU:
21446                 check_dsp(ctx);
21447                 gen_helper_dmaddu(v1_t, v2_t, t0, cpu_env);
21448                 break;
21449             case OPC_DMSUB:
21450                 check_dsp(ctx);
21451                 gen_helper_dmsub(v1_t, v2_t, t0, cpu_env);
21452                 break;
21453             case OPC_DMSUBU:
21454                 check_dsp(ctx);
21455                 gen_helper_dmsubu(v1_t, v2_t, t0, cpu_env);
21456                 break;
21457             case OPC_DPA_W_QH:
21458                 check_dspr2(ctx);
21459                 gen_helper_dpa_w_qh(v1_t, v2_t, t0, cpu_env);
21460                 break;
21461             case OPC_DPAQ_S_W_QH:
21462                 check_dsp(ctx);
21463                 gen_helper_dpaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
21464                 break;
21465             case OPC_DPAQ_SA_L_PW:
21466                 check_dsp(ctx);
21467                 gen_helper_dpaq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
21468                 break;
21469             case OPC_DPAU_H_OBL:
21470                 check_dsp(ctx);
21471                 gen_helper_dpau_h_obl(v1_t, v2_t, t0, cpu_env);
21472                 break;
21473             case OPC_DPAU_H_OBR:
21474                 check_dsp(ctx);
21475                 gen_helper_dpau_h_obr(v1_t, v2_t, t0, cpu_env);
21476                 break;
21477             case OPC_DPS_W_QH:
21478                 check_dspr2(ctx);
21479                 gen_helper_dps_w_qh(v1_t, v2_t, t0, cpu_env);
21480                 break;
21481             case OPC_DPSQ_S_W_QH:
21482                 check_dsp(ctx);
21483                 gen_helper_dpsq_s_w_qh(v1_t, v2_t, t0, cpu_env);
21484                 break;
21485             case OPC_DPSQ_SA_L_PW:
21486                 check_dsp(ctx);
21487                 gen_helper_dpsq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
21488                 break;
21489             case OPC_DPSU_H_OBL:
21490                 check_dsp(ctx);
21491                 gen_helper_dpsu_h_obl(v1_t, v2_t, t0, cpu_env);
21492                 break;
21493             case OPC_DPSU_H_OBR:
21494                 check_dsp(ctx);
21495                 gen_helper_dpsu_h_obr(v1_t, v2_t, t0, cpu_env);
21496                 break;
21497             case OPC_MAQ_S_L_PWL:
21498                 check_dsp(ctx);
21499                 gen_helper_maq_s_l_pwl(v1_t, v2_t, t0, cpu_env);
21500                 break;
21501             case OPC_MAQ_S_L_PWR:
21502                 check_dsp(ctx);
21503                 gen_helper_maq_s_l_pwr(v1_t, v2_t, t0, cpu_env);
21504                 break;
21505             case OPC_MAQ_S_W_QHLL:
21506                 check_dsp(ctx);
21507                 gen_helper_maq_s_w_qhll(v1_t, v2_t, t0, cpu_env);
21508                 break;
21509             case OPC_MAQ_SA_W_QHLL:
21510                 check_dsp(ctx);
21511                 gen_helper_maq_sa_w_qhll(v1_t, v2_t, t0, cpu_env);
21512                 break;
21513             case OPC_MAQ_S_W_QHLR:
21514                 check_dsp(ctx);
21515                 gen_helper_maq_s_w_qhlr(v1_t, v2_t, t0, cpu_env);
21516                 break;
21517             case OPC_MAQ_SA_W_QHLR:
21518                 check_dsp(ctx);
21519                 gen_helper_maq_sa_w_qhlr(v1_t, v2_t, t0, cpu_env);
21520                 break;
21521             case OPC_MAQ_S_W_QHRL:
21522                 check_dsp(ctx);
21523                 gen_helper_maq_s_w_qhrl(v1_t, v2_t, t0, cpu_env);
21524                 break;
21525             case OPC_MAQ_SA_W_QHRL:
21526                 check_dsp(ctx);
21527                 gen_helper_maq_sa_w_qhrl(v1_t, v2_t, t0, cpu_env);
21528                 break;
21529             case OPC_MAQ_S_W_QHRR:
21530                 check_dsp(ctx);
21531                 gen_helper_maq_s_w_qhrr(v1_t, v2_t, t0, cpu_env);
21532                 break;
21533             case OPC_MAQ_SA_W_QHRR:
21534                 check_dsp(ctx);
21535                 gen_helper_maq_sa_w_qhrr(v1_t, v2_t, t0, cpu_env);
21536                 break;
21537             case OPC_MULSAQ_S_L_PW:
21538                 check_dsp(ctx);
21539                 gen_helper_mulsaq_s_l_pw(v1_t, v2_t, t0, cpu_env);
21540                 break;
21541             case OPC_MULSAQ_S_W_QH:
21542                 check_dsp(ctx);
21543                 gen_helper_mulsaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
21544                 break;
21545             }
21546         }
21547         break;
21548 #endif
21549     case OPC_ADDU_QB_DSP:
21550         switch (op2) {
21551         case OPC_MULEU_S_PH_QBL:
21552             check_dsp(ctx);
21553             gen_helper_muleu_s_ph_qbl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21554             break;
21555         case OPC_MULEU_S_PH_QBR:
21556             check_dsp(ctx);
21557             gen_helper_muleu_s_ph_qbr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21558             break;
21559         case OPC_MULQ_RS_PH:
21560             check_dsp(ctx);
21561             gen_helper_mulq_rs_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21562             break;
21563         case OPC_MULEQ_S_W_PHL:
21564             check_dsp(ctx);
21565             gen_helper_muleq_s_w_phl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21566             break;
21567         case OPC_MULEQ_S_W_PHR:
21568             check_dsp(ctx);
21569             gen_helper_muleq_s_w_phr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21570             break;
21571         case OPC_MULQ_S_PH:
21572             check_dspr2(ctx);
21573             gen_helper_mulq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21574             break;
21575         }
21576         break;
21577 #ifdef TARGET_MIPS64
21578     case OPC_ADDU_OB_DSP:
21579         switch (op2) {
21580         case OPC_MULEQ_S_PW_QHL:
21581             check_dsp(ctx);
21582             gen_helper_muleq_s_pw_qhl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21583             break;
21584         case OPC_MULEQ_S_PW_QHR:
21585             check_dsp(ctx);
21586             gen_helper_muleq_s_pw_qhr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21587             break;
21588         case OPC_MULEU_S_QH_OBL:
21589             check_dsp(ctx);
21590             gen_helper_muleu_s_qh_obl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21591             break;
21592         case OPC_MULEU_S_QH_OBR:
21593             check_dsp(ctx);
21594             gen_helper_muleu_s_qh_obr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21595             break;
21596         case OPC_MULQ_RS_QH:
21597             check_dsp(ctx);
21598             gen_helper_mulq_rs_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21599             break;
21600         }
21601         break;
21602 #endif
21603     }
21604
21605     tcg_temp_free_i32(t0);
21606     tcg_temp_free(v1_t);
21607     tcg_temp_free(v2_t);
21608 }
21609
21610 static void gen_mipsdsp_bitinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
21611                                 int ret, int val)
21612 {
21613     int16_t imm;
21614     TCGv t0;
21615     TCGv val_t;
21616
21617     if (ret == 0) {
21618         /* Treat as NOP. */
21619         return;
21620     }
21621
21622     t0 = tcg_temp_new();
21623     val_t = tcg_temp_new();
21624     gen_load_gpr(val_t, val);
21625
21626     switch (op1) {
21627     case OPC_ABSQ_S_PH_DSP:
21628         switch (op2) {
21629         case OPC_BITREV:
21630             check_dsp(ctx);
21631             gen_helper_bitrev(cpu_gpr[ret], val_t);
21632             break;
21633         case OPC_REPL_QB:
21634             check_dsp(ctx);
21635             {
21636                 target_long result;
21637                 imm = (ctx->opcode >> 16) & 0xFF;
21638                 result = (uint32_t)imm << 24 |
21639                          (uint32_t)imm << 16 |
21640                          (uint32_t)imm << 8  |
21641                          (uint32_t)imm;
21642                 result = (int32_t)result;
21643                 tcg_gen_movi_tl(cpu_gpr[ret], result);
21644             }
21645             break;
21646         case OPC_REPLV_QB:
21647             check_dsp(ctx);
21648             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
21649             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
21650             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
21651             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
21652             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
21653             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
21654             break;
21655         case OPC_REPL_PH:
21656             check_dsp(ctx);
21657             {
21658                 imm = (ctx->opcode >> 16) & 0x03FF;
21659                 imm = (int16_t)(imm << 6) >> 6;
21660                 tcg_gen_movi_tl(cpu_gpr[ret], \
21661                                 (target_long)((int32_t)imm << 16 | \
21662                                 (uint16_t)imm));
21663             }
21664             break;
21665         case OPC_REPLV_PH:
21666             check_dsp(ctx);
21667             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
21668             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
21669             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
21670             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
21671             break;
21672         }
21673         break;
21674 #ifdef TARGET_MIPS64
21675     case OPC_ABSQ_S_QH_DSP:
21676         switch (op2) {
21677         case OPC_REPL_OB:
21678             check_dsp(ctx);
21679             {
21680                 target_long temp;
21681
21682                 imm = (ctx->opcode >> 16) & 0xFF;
21683                 temp = ((uint64_t)imm << 8) | (uint64_t)imm;
21684                 temp = (temp << 16) | temp;
21685                 temp = (temp << 32) | temp;
21686                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
21687                 break;
21688             }
21689         case OPC_REPL_PW:
21690             check_dsp(ctx);
21691             {
21692                 target_long temp;
21693
21694                 imm = (ctx->opcode >> 16) & 0x03FF;
21695                 imm = (int16_t)(imm << 6) >> 6;
21696                 temp = ((target_long)imm << 32) \
21697                        | ((target_long)imm & 0xFFFFFFFF);
21698                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
21699                 break;
21700             }
21701         case OPC_REPL_QH:
21702             check_dsp(ctx);
21703             {
21704                 target_long temp;
21705
21706                 imm = (ctx->opcode >> 16) & 0x03FF;
21707                 imm = (int16_t)(imm << 6) >> 6;
21708
21709                 temp = ((uint64_t)(uint16_t)imm << 48) |
21710                        ((uint64_t)(uint16_t)imm << 32) |
21711                        ((uint64_t)(uint16_t)imm << 16) |
21712                        (uint64_t)(uint16_t)imm;
21713                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
21714                 break;
21715             }
21716         case OPC_REPLV_OB:
21717             check_dsp(ctx);
21718             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
21719             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
21720             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
21721             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
21722             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
21723             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
21724             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
21725             break;
21726         case OPC_REPLV_PW:
21727             check_dsp(ctx);
21728             tcg_gen_ext32u_i64(cpu_gpr[ret], val_t);
21729             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
21730             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
21731             break;
21732         case OPC_REPLV_QH:
21733             check_dsp(ctx);
21734             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
21735             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
21736             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
21737             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
21738             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
21739             break;
21740         }
21741         break;
21742 #endif
21743     }
21744     tcg_temp_free(t0);
21745     tcg_temp_free(val_t);
21746 }
21747
21748 static void gen_mipsdsp_add_cmp_pick(DisasContext *ctx,
21749                                      uint32_t op1, uint32_t op2,
21750                                      int ret, int v1, int v2, int check_ret)
21751 {
21752     TCGv t1;
21753     TCGv v1_t;
21754     TCGv v2_t;
21755
21756     if ((ret == 0) && (check_ret == 1)) {
21757         /* Treat as NOP. */
21758         return;
21759     }
21760
21761     t1 = tcg_temp_new();
21762     v1_t = tcg_temp_new();
21763     v2_t = tcg_temp_new();
21764
21765     gen_load_gpr(v1_t, v1);
21766     gen_load_gpr(v2_t, v2);
21767
21768     switch (op1) {
21769     case OPC_CMPU_EQ_QB_DSP:
21770         switch (op2) {
21771         case OPC_CMPU_EQ_QB:
21772             check_dsp(ctx);
21773             gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
21774             break;
21775         case OPC_CMPU_LT_QB:
21776             check_dsp(ctx);
21777             gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
21778             break;
21779         case OPC_CMPU_LE_QB:
21780             check_dsp(ctx);
21781             gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
21782             break;
21783         case OPC_CMPGU_EQ_QB:
21784             check_dsp(ctx);
21785             gen_helper_cmpgu_eq_qb(cpu_gpr[ret], v1_t, v2_t);
21786             break;
21787         case OPC_CMPGU_LT_QB:
21788             check_dsp(ctx);
21789             gen_helper_cmpgu_lt_qb(cpu_gpr[ret], v1_t, v2_t);
21790             break;
21791         case OPC_CMPGU_LE_QB:
21792             check_dsp(ctx);
21793             gen_helper_cmpgu_le_qb(cpu_gpr[ret], v1_t, v2_t);
21794             break;
21795         case OPC_CMPGDU_EQ_QB:
21796             check_dspr2(ctx);
21797             gen_helper_cmpgu_eq_qb(t1, v1_t, v2_t);
21798             tcg_gen_mov_tl(cpu_gpr[ret], t1);
21799             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
21800             tcg_gen_shli_tl(t1, t1, 24);
21801             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
21802             break;
21803         case OPC_CMPGDU_LT_QB:
21804             check_dspr2(ctx);
21805             gen_helper_cmpgu_lt_qb(t1, v1_t, v2_t);
21806             tcg_gen_mov_tl(cpu_gpr[ret], t1);
21807             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
21808             tcg_gen_shli_tl(t1, t1, 24);
21809             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
21810             break;
21811         case OPC_CMPGDU_LE_QB:
21812             check_dspr2(ctx);
21813             gen_helper_cmpgu_le_qb(t1, v1_t, v2_t);
21814             tcg_gen_mov_tl(cpu_gpr[ret], t1);
21815             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
21816             tcg_gen_shli_tl(t1, t1, 24);
21817             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
21818             break;
21819         case OPC_CMP_EQ_PH:
21820             check_dsp(ctx);
21821             gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
21822             break;
21823         case OPC_CMP_LT_PH:
21824             check_dsp(ctx);
21825             gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
21826             break;
21827         case OPC_CMP_LE_PH:
21828             check_dsp(ctx);
21829             gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
21830             break;
21831         case OPC_PICK_QB:
21832             check_dsp(ctx);
21833             gen_helper_pick_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21834             break;
21835         case OPC_PICK_PH:
21836             check_dsp(ctx);
21837             gen_helper_pick_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21838             break;
21839         case OPC_PACKRL_PH:
21840             check_dsp(ctx);
21841             gen_helper_packrl_ph(cpu_gpr[ret], v1_t, v2_t);
21842             break;
21843         }
21844         break;
21845 #ifdef TARGET_MIPS64
21846     case OPC_CMPU_EQ_OB_DSP:
21847         switch (op2) {
21848         case OPC_CMP_EQ_PW:
21849             check_dsp(ctx);
21850             gen_helper_cmp_eq_pw(v1_t, v2_t, cpu_env);
21851             break;
21852         case OPC_CMP_LT_PW:
21853             check_dsp(ctx);
21854             gen_helper_cmp_lt_pw(v1_t, v2_t, cpu_env);
21855             break;
21856         case OPC_CMP_LE_PW:
21857             check_dsp(ctx);
21858             gen_helper_cmp_le_pw(v1_t, v2_t, cpu_env);
21859             break;
21860         case OPC_CMP_EQ_QH:
21861             check_dsp(ctx);
21862             gen_helper_cmp_eq_qh(v1_t, v2_t, cpu_env);
21863             break;
21864         case OPC_CMP_LT_QH:
21865             check_dsp(ctx);
21866             gen_helper_cmp_lt_qh(v1_t, v2_t, cpu_env);
21867             break;
21868         case OPC_CMP_LE_QH:
21869             check_dsp(ctx);
21870             gen_helper_cmp_le_qh(v1_t, v2_t, cpu_env);
21871             break;
21872         case OPC_CMPGDU_EQ_OB:
21873             check_dspr2(ctx);
21874             gen_helper_cmpgdu_eq_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21875             break;
21876         case OPC_CMPGDU_LT_OB:
21877             check_dspr2(ctx);
21878             gen_helper_cmpgdu_lt_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21879             break;
21880         case OPC_CMPGDU_LE_OB:
21881             check_dspr2(ctx);
21882             gen_helper_cmpgdu_le_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21883             break;
21884         case OPC_CMPGU_EQ_OB:
21885             check_dsp(ctx);
21886             gen_helper_cmpgu_eq_ob(cpu_gpr[ret], v1_t, v2_t);
21887             break;
21888         case OPC_CMPGU_LT_OB:
21889             check_dsp(ctx);
21890             gen_helper_cmpgu_lt_ob(cpu_gpr[ret], v1_t, v2_t);
21891             break;
21892         case OPC_CMPGU_LE_OB:
21893             check_dsp(ctx);
21894             gen_helper_cmpgu_le_ob(cpu_gpr[ret], v1_t, v2_t);
21895             break;
21896         case OPC_CMPU_EQ_OB:
21897             check_dsp(ctx);
21898             gen_helper_cmpu_eq_ob(v1_t, v2_t, cpu_env);
21899             break;
21900         case OPC_CMPU_LT_OB:
21901             check_dsp(ctx);
21902             gen_helper_cmpu_lt_ob(v1_t, v2_t, cpu_env);
21903             break;
21904         case OPC_CMPU_LE_OB:
21905             check_dsp(ctx);
21906             gen_helper_cmpu_le_ob(v1_t, v2_t, cpu_env);
21907             break;
21908         case OPC_PACKRL_PW:
21909             check_dsp(ctx);
21910             gen_helper_packrl_pw(cpu_gpr[ret], v1_t, v2_t);
21911             break;
21912         case OPC_PICK_OB:
21913             check_dsp(ctx);
21914             gen_helper_pick_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21915             break;
21916         case OPC_PICK_PW:
21917             check_dsp(ctx);
21918             gen_helper_pick_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21919             break;
21920         case OPC_PICK_QH:
21921             check_dsp(ctx);
21922             gen_helper_pick_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21923             break;
21924         }
21925         break;
21926 #endif
21927     }
21928
21929     tcg_temp_free(t1);
21930     tcg_temp_free(v1_t);
21931     tcg_temp_free(v2_t);
21932 }
21933
21934 static void gen_mipsdsp_append(CPUMIPSState *env, DisasContext *ctx,
21935                                uint32_t op1, int rt, int rs, int sa)
21936 {
21937     TCGv t0;
21938
21939     check_dspr2(ctx);
21940
21941     if (rt == 0) {
21942         /* Treat as NOP. */
21943         return;
21944     }
21945
21946     t0 = tcg_temp_new();
21947     gen_load_gpr(t0, rs);
21948
21949     switch (op1) {
21950     case OPC_APPEND_DSP:
21951         switch (MASK_APPEND(ctx->opcode)) {
21952         case OPC_APPEND:
21953             if (sa != 0) {
21954                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 32 - sa);
21955             }
21956             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
21957             break;
21958         case OPC_PREPEND:
21959             if (sa != 0) {
21960                 tcg_gen_ext32u_tl(cpu_gpr[rt], cpu_gpr[rt]);
21961                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
21962                 tcg_gen_shli_tl(t0, t0, 32 - sa);
21963                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
21964             }
21965             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
21966             break;
21967         case OPC_BALIGN:
21968             sa &= 3;
21969             if (sa != 0 && sa != 2) {
21970                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
21971                 tcg_gen_ext32u_tl(t0, t0);
21972                 tcg_gen_shri_tl(t0, t0, 8 * (4 - sa));
21973                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
21974             }
21975             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
21976             break;
21977         default:            /* Invalid */
21978             MIPS_INVAL("MASK APPEND");
21979             generate_exception_end(ctx, EXCP_RI);
21980             break;
21981         }
21982         break;
21983 #ifdef TARGET_MIPS64
21984     case OPC_DAPPEND_DSP:
21985         switch (MASK_DAPPEND(ctx->opcode)) {
21986         case OPC_DAPPEND:
21987             if (sa != 0) {
21988                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 64 - sa);
21989             }
21990             break;
21991         case OPC_PREPENDD:
21992             tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], 0x20 | sa);
21993             tcg_gen_shli_tl(t0, t0, 64 - (0x20 | sa));
21994             tcg_gen_or_tl(cpu_gpr[rt], t0, t0);
21995             break;
21996         case OPC_PREPENDW:
21997             if (sa != 0) {
21998                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
21999                 tcg_gen_shli_tl(t0, t0, 64 - sa);
22000                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
22001             }
22002             break;
22003         case OPC_DBALIGN:
22004             sa &= 7;
22005             if (sa != 0 && sa != 2 && sa != 4) {
22006                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
22007                 tcg_gen_shri_tl(t0, t0, 8 * (8 - sa));
22008                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
22009             }
22010             break;
22011         default:            /* Invalid */
22012             MIPS_INVAL("MASK DAPPEND");
22013             generate_exception_end(ctx, EXCP_RI);
22014             break;
22015         }
22016         break;
22017 #endif
22018     }
22019     tcg_temp_free(t0);
22020 }
22021
22022 static void gen_mipsdsp_accinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
22023                                 int ret, int v1, int v2, int check_ret)
22024
22025 {
22026     TCGv t0;
22027     TCGv t1;
22028     TCGv v1_t;
22029     TCGv v2_t;
22030     int16_t imm;
22031
22032     if ((ret == 0) && (check_ret == 1)) {
22033         /* Treat as NOP. */
22034         return;
22035     }
22036
22037     t0 = tcg_temp_new();
22038     t1 = tcg_temp_new();
22039     v1_t = tcg_temp_new();
22040     v2_t = tcg_temp_new();
22041
22042     gen_load_gpr(v1_t, v1);
22043     gen_load_gpr(v2_t, v2);
22044
22045     switch (op1) {
22046     case OPC_EXTR_W_DSP:
22047         check_dsp(ctx);
22048         switch (op2) {
22049         case OPC_EXTR_W:
22050             tcg_gen_movi_tl(t0, v2);
22051             tcg_gen_movi_tl(t1, v1);
22052             gen_helper_extr_w(cpu_gpr[ret], t0, t1, cpu_env);
22053             break;
22054         case OPC_EXTR_R_W:
22055             tcg_gen_movi_tl(t0, v2);
22056             tcg_gen_movi_tl(t1, v1);
22057             gen_helper_extr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
22058             break;
22059         case OPC_EXTR_RS_W:
22060             tcg_gen_movi_tl(t0, v2);
22061             tcg_gen_movi_tl(t1, v1);
22062             gen_helper_extr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
22063             break;
22064         case OPC_EXTR_S_H:
22065             tcg_gen_movi_tl(t0, v2);
22066             tcg_gen_movi_tl(t1, v1);
22067             gen_helper_extr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
22068             break;
22069         case OPC_EXTRV_S_H:
22070             tcg_gen_movi_tl(t0, v2);
22071             gen_helper_extr_s_h(cpu_gpr[ret], t0, v1_t, cpu_env);
22072             break;
22073         case OPC_EXTRV_W:
22074             tcg_gen_movi_tl(t0, v2);
22075             gen_helper_extr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
22076             break;
22077         case OPC_EXTRV_R_W:
22078             tcg_gen_movi_tl(t0, v2);
22079             gen_helper_extr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
22080             break;
22081         case OPC_EXTRV_RS_W:
22082             tcg_gen_movi_tl(t0, v2);
22083             gen_helper_extr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
22084             break;
22085         case OPC_EXTP:
22086             tcg_gen_movi_tl(t0, v2);
22087             tcg_gen_movi_tl(t1, v1);
22088             gen_helper_extp(cpu_gpr[ret], t0, t1, cpu_env);
22089             break;
22090         case OPC_EXTPV:
22091             tcg_gen_movi_tl(t0, v2);
22092             gen_helper_extp(cpu_gpr[ret], t0, v1_t, cpu_env);
22093             break;
22094         case OPC_EXTPDP:
22095             tcg_gen_movi_tl(t0, v2);
22096             tcg_gen_movi_tl(t1, v1);
22097             gen_helper_extpdp(cpu_gpr[ret], t0, t1, cpu_env);
22098             break;
22099         case OPC_EXTPDPV:
22100             tcg_gen_movi_tl(t0, v2);
22101             gen_helper_extpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
22102             break;
22103         case OPC_SHILO:
22104             imm = (ctx->opcode >> 20) & 0x3F;
22105             tcg_gen_movi_tl(t0, ret);
22106             tcg_gen_movi_tl(t1, imm);
22107             gen_helper_shilo(t0, t1, cpu_env);
22108             break;
22109         case OPC_SHILOV:
22110             tcg_gen_movi_tl(t0, ret);
22111             gen_helper_shilo(t0, v1_t, cpu_env);
22112             break;
22113         case OPC_MTHLIP:
22114             tcg_gen_movi_tl(t0, ret);
22115             gen_helper_mthlip(t0, v1_t, cpu_env);
22116             break;
22117         case OPC_WRDSP:
22118             imm = (ctx->opcode >> 11) & 0x3FF;
22119             tcg_gen_movi_tl(t0, imm);
22120             gen_helper_wrdsp(v1_t, t0, cpu_env);
22121             break;
22122         case OPC_RDDSP:
22123             imm = (ctx->opcode >> 16) & 0x03FF;
22124             tcg_gen_movi_tl(t0, imm);
22125             gen_helper_rddsp(cpu_gpr[ret], t0, cpu_env);
22126             break;
22127         }
22128         break;
22129 #ifdef TARGET_MIPS64
22130     case OPC_DEXTR_W_DSP:
22131         check_dsp(ctx);
22132         switch (op2) {
22133         case OPC_DMTHLIP:
22134             tcg_gen_movi_tl(t0, ret);
22135             gen_helper_dmthlip(v1_t, t0, cpu_env);
22136             break;
22137         case OPC_DSHILO:
22138             {
22139                 int shift = (ctx->opcode >> 19) & 0x7F;
22140                 int ac = (ctx->opcode >> 11) & 0x03;
22141                 tcg_gen_movi_tl(t0, shift);
22142                 tcg_gen_movi_tl(t1, ac);
22143                 gen_helper_dshilo(t0, t1, cpu_env);
22144                 break;
22145             }
22146         case OPC_DSHILOV:
22147             {
22148                 int ac = (ctx->opcode >> 11) & 0x03;
22149                 tcg_gen_movi_tl(t0, ac);
22150                 gen_helper_dshilo(v1_t, t0, cpu_env);
22151                 break;
22152             }
22153         case OPC_DEXTP:
22154             tcg_gen_movi_tl(t0, v2);
22155             tcg_gen_movi_tl(t1, v1);
22156
22157             gen_helper_dextp(cpu_gpr[ret], t0, t1, cpu_env);
22158             break;
22159         case OPC_DEXTPV:
22160             tcg_gen_movi_tl(t0, v2);
22161             gen_helper_dextp(cpu_gpr[ret], t0, v1_t, cpu_env);
22162             break;
22163         case OPC_DEXTPDP:
22164             tcg_gen_movi_tl(t0, v2);
22165             tcg_gen_movi_tl(t1, v1);
22166             gen_helper_dextpdp(cpu_gpr[ret], t0, t1, cpu_env);
22167             break;
22168         case OPC_DEXTPDPV:
22169             tcg_gen_movi_tl(t0, v2);
22170             gen_helper_dextpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
22171             break;
22172         case OPC_DEXTR_L:
22173             tcg_gen_movi_tl(t0, v2);
22174             tcg_gen_movi_tl(t1, v1);
22175             gen_helper_dextr_l(cpu_gpr[ret], t0, t1, cpu_env);
22176             break;
22177         case OPC_DEXTR_R_L:
22178             tcg_gen_movi_tl(t0, v2);
22179             tcg_gen_movi_tl(t1, v1);
22180             gen_helper_dextr_r_l(cpu_gpr[ret], t0, t1, cpu_env);
22181             break;
22182         case OPC_DEXTR_RS_L:
22183             tcg_gen_movi_tl(t0, v2);
22184             tcg_gen_movi_tl(t1, v1);
22185             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, t1, cpu_env);
22186             break;
22187         case OPC_DEXTR_W:
22188             tcg_gen_movi_tl(t0, v2);
22189             tcg_gen_movi_tl(t1, v1);
22190             gen_helper_dextr_w(cpu_gpr[ret], t0, t1, cpu_env);
22191             break;
22192         case OPC_DEXTR_R_W:
22193             tcg_gen_movi_tl(t0, v2);
22194             tcg_gen_movi_tl(t1, v1);
22195             gen_helper_dextr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
22196             break;
22197         case OPC_DEXTR_RS_W:
22198             tcg_gen_movi_tl(t0, v2);
22199             tcg_gen_movi_tl(t1, v1);
22200             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
22201             break;
22202         case OPC_DEXTR_S_H:
22203             tcg_gen_movi_tl(t0, v2);
22204             tcg_gen_movi_tl(t1, v1);
22205             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
22206             break;
22207         case OPC_DEXTRV_S_H:
22208             tcg_gen_movi_tl(t0, v2);
22209             tcg_gen_movi_tl(t1, v1);
22210             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
22211             break;
22212         case OPC_DEXTRV_L:
22213             tcg_gen_movi_tl(t0, v2);
22214             gen_helper_dextr_l(cpu_gpr[ret], t0, v1_t, cpu_env);
22215             break;
22216         case OPC_DEXTRV_R_L:
22217             tcg_gen_movi_tl(t0, v2);
22218             gen_helper_dextr_r_l(cpu_gpr[ret], t0, v1_t, cpu_env);
22219             break;
22220         case OPC_DEXTRV_RS_L:
22221             tcg_gen_movi_tl(t0, v2);
22222             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, v1_t, cpu_env);
22223             break;
22224         case OPC_DEXTRV_W:
22225             tcg_gen_movi_tl(t0, v2);
22226             gen_helper_dextr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
22227             break;
22228         case OPC_DEXTRV_R_W:
22229             tcg_gen_movi_tl(t0, v2);
22230             gen_helper_dextr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
22231             break;
22232         case OPC_DEXTRV_RS_W:
22233             tcg_gen_movi_tl(t0, v2);
22234             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
22235             break;
22236         }
22237         break;
22238 #endif
22239     }
22240
22241     tcg_temp_free(t0);
22242     tcg_temp_free(t1);
22243     tcg_temp_free(v1_t);
22244     tcg_temp_free(v2_t);
22245 }
22246
22247 /* End MIPSDSP functions. */
22248
22249 static void decode_opc_special_r6(CPUMIPSState *env, DisasContext *ctx)
22250 {
22251     int rs, rt, rd, sa;
22252     uint32_t op1, op2;
22253
22254     rs = (ctx->opcode >> 21) & 0x1f;
22255     rt = (ctx->opcode >> 16) & 0x1f;
22256     rd = (ctx->opcode >> 11) & 0x1f;
22257     sa = (ctx->opcode >> 6) & 0x1f;
22258
22259     op1 = MASK_SPECIAL(ctx->opcode);
22260     switch (op1) {
22261     case OPC_LSA:
22262         gen_lsa(ctx, op1, rd, rs, rt, extract32(ctx->opcode, 6, 2));
22263         break;
22264     case OPC_MULT:
22265     case OPC_MULTU:
22266     case OPC_DIV:
22267     case OPC_DIVU:
22268         op2 = MASK_R6_MULDIV(ctx->opcode);
22269         switch (op2) {
22270         case R6_OPC_MUL:
22271         case R6_OPC_MUH:
22272         case R6_OPC_MULU:
22273         case R6_OPC_MUHU:
22274         case R6_OPC_DIV:
22275         case R6_OPC_MOD:
22276         case R6_OPC_DIVU:
22277         case R6_OPC_MODU:
22278             gen_r6_muldiv(ctx, op2, rd, rs, rt);
22279             break;
22280         default:
22281             MIPS_INVAL("special_r6 muldiv");
22282             generate_exception_end(ctx, EXCP_RI);
22283             break;
22284         }
22285         break;
22286     case OPC_SELEQZ:
22287     case OPC_SELNEZ:
22288         gen_cond_move(ctx, op1, rd, rs, rt);
22289         break;
22290     case R6_OPC_CLO:
22291     case R6_OPC_CLZ:
22292         if (rt == 0 && sa == 1) {
22293             /* Major opcode and function field is shared with preR6 MFHI/MTHI.
22294                We need additionally to check other fields */
22295             gen_cl(ctx, op1, rd, rs);
22296         } else {
22297             generate_exception_end(ctx, EXCP_RI);
22298         }
22299         break;
22300     case R6_OPC_SDBBP:
22301         if (is_uhi(extract32(ctx->opcode, 6, 20))) {
22302             gen_helper_do_semihosting(cpu_env);
22303         } else {
22304             if (ctx->hflags & MIPS_HFLAG_SBRI) {
22305                 generate_exception_end(ctx, EXCP_RI);
22306             } else {
22307                 generate_exception_end(ctx, EXCP_DBp);
22308             }
22309         }
22310         break;
22311 #if defined(TARGET_MIPS64)
22312     case OPC_DLSA:
22313         check_mips_64(ctx);
22314         gen_lsa(ctx, op1, rd, rs, rt, extract32(ctx->opcode, 6, 2));
22315         break;
22316     case R6_OPC_DCLO:
22317     case R6_OPC_DCLZ:
22318         if (rt == 0 && sa == 1) {
22319             /* Major opcode and function field is shared with preR6 MFHI/MTHI.
22320                We need additionally to check other fields */
22321             check_mips_64(ctx);
22322             gen_cl(ctx, op1, rd, rs);
22323         } else {
22324             generate_exception_end(ctx, EXCP_RI);
22325         }
22326         break;
22327     case OPC_DMULT:
22328     case OPC_DMULTU:
22329     case OPC_DDIV:
22330     case OPC_DDIVU:
22331
22332         op2 = MASK_R6_MULDIV(ctx->opcode);
22333         switch (op2) {
22334         case R6_OPC_DMUL:
22335         case R6_OPC_DMUH:
22336         case R6_OPC_DMULU:
22337         case R6_OPC_DMUHU:
22338         case R6_OPC_DDIV:
22339         case R6_OPC_DMOD:
22340         case R6_OPC_DDIVU:
22341         case R6_OPC_DMODU:
22342             check_mips_64(ctx);
22343             gen_r6_muldiv(ctx, op2, rd, rs, rt);
22344             break;
22345         default:
22346             MIPS_INVAL("special_r6 muldiv");
22347             generate_exception_end(ctx, EXCP_RI);
22348             break;
22349         }
22350         break;
22351 #endif
22352     default:            /* Invalid */
22353         MIPS_INVAL("special_r6");
22354         generate_exception_end(ctx, EXCP_RI);
22355         break;
22356     }
22357 }
22358
22359 static void decode_opc_special_legacy(CPUMIPSState *env, DisasContext *ctx)
22360 {
22361     int rs, rt, rd, sa;
22362     uint32_t op1;
22363
22364     rs = (ctx->opcode >> 21) & 0x1f;
22365     rt = (ctx->opcode >> 16) & 0x1f;
22366     rd = (ctx->opcode >> 11) & 0x1f;
22367     sa = (ctx->opcode >> 6) & 0x1f;
22368
22369     op1 = MASK_SPECIAL(ctx->opcode);
22370     switch (op1) {
22371     case OPC_MOVN:         /* Conditional move */
22372     case OPC_MOVZ:
22373         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32 |
22374                    INSN_LOONGSON2E | INSN_LOONGSON2F);
22375         gen_cond_move(ctx, op1, rd, rs, rt);
22376         break;
22377     case OPC_MFHI:          /* Move from HI/LO */
22378     case OPC_MFLO:
22379         gen_HILO(ctx, op1, rs & 3, rd);
22380         break;
22381     case OPC_MTHI:
22382     case OPC_MTLO:          /* Move to HI/LO */
22383         gen_HILO(ctx, op1, rd & 3, rs);
22384         break;
22385     case OPC_MOVCI:
22386         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
22387         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
22388             check_cp1_enabled(ctx);
22389             gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7,
22390                       (ctx->opcode >> 16) & 1);
22391         } else {
22392             generate_exception_err(ctx, EXCP_CpU, 1);
22393         }
22394         break;
22395     case OPC_MULT:
22396     case OPC_MULTU:
22397         if (sa) {
22398             check_insn(ctx, INSN_VR54XX);
22399             op1 = MASK_MUL_VR54XX(ctx->opcode);
22400             gen_mul_vr54xx(ctx, op1, rd, rs, rt);
22401         } else {
22402             gen_muldiv(ctx, op1, rd & 3, rs, rt);
22403         }
22404         break;
22405     case OPC_DIV:
22406     case OPC_DIVU:
22407         gen_muldiv(ctx, op1, 0, rs, rt);
22408         break;
22409 #if defined(TARGET_MIPS64)
22410     case OPC_DMULT:
22411     case OPC_DMULTU:
22412     case OPC_DDIV:
22413     case OPC_DDIVU:
22414         check_insn(ctx, ISA_MIPS3);
22415         check_mips_64(ctx);
22416         gen_muldiv(ctx, op1, 0, rs, rt);
22417         break;
22418 #endif
22419     case OPC_JR:
22420         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
22421         break;
22422     case OPC_SPIM:
22423 #ifdef MIPS_STRICT_STANDARD
22424         MIPS_INVAL("SPIM");
22425         generate_exception_end(ctx, EXCP_RI);
22426 #else
22427         /* Implemented as RI exception for now. */
22428         MIPS_INVAL("spim (unofficial)");
22429         generate_exception_end(ctx, EXCP_RI);
22430 #endif
22431         break;
22432     default:            /* Invalid */
22433         MIPS_INVAL("special_legacy");
22434         generate_exception_end(ctx, EXCP_RI);
22435         break;
22436     }
22437 }
22438
22439 static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx)
22440 {
22441     int rs, rt, rd, sa;
22442     uint32_t op1;
22443
22444     rs = (ctx->opcode >> 21) & 0x1f;
22445     rt = (ctx->opcode >> 16) & 0x1f;
22446     rd = (ctx->opcode >> 11) & 0x1f;
22447     sa = (ctx->opcode >> 6) & 0x1f;
22448
22449     op1 = MASK_SPECIAL(ctx->opcode);
22450     switch (op1) {
22451     case OPC_SLL:          /* Shift with immediate */
22452         if (sa == 5 && rd == 0 &&
22453             rs == 0 && rt == 0) { /* PAUSE */
22454             if ((ctx->insn_flags & ISA_MIPS32R6) &&
22455                 (ctx->hflags & MIPS_HFLAG_BMASK)) {
22456                 generate_exception_end(ctx, EXCP_RI);
22457                 break;
22458             }
22459         }
22460         /* Fallthrough */
22461     case OPC_SRA:
22462         gen_shift_imm(ctx, op1, rd, rt, sa);
22463         break;
22464     case OPC_SRL:
22465         switch ((ctx->opcode >> 21) & 0x1f) {
22466         case 1:
22467             /* rotr is decoded as srl on non-R2 CPUs */
22468             if (ctx->insn_flags & ISA_MIPS32R2) {
22469                 op1 = OPC_ROTR;
22470             }
22471             /* Fallthrough */
22472         case 0:
22473             gen_shift_imm(ctx, op1, rd, rt, sa);
22474             break;
22475         default:
22476             generate_exception_end(ctx, EXCP_RI);
22477             break;
22478         }
22479         break;
22480     case OPC_ADD:
22481     case OPC_ADDU:
22482     case OPC_SUB:
22483     case OPC_SUBU:
22484         gen_arith(ctx, op1, rd, rs, rt);
22485         break;
22486     case OPC_SLLV:         /* Shifts */
22487     case OPC_SRAV:
22488         gen_shift(ctx, op1, rd, rs, rt);
22489         break;
22490     case OPC_SRLV:
22491         switch ((ctx->opcode >> 6) & 0x1f) {
22492         case 1:
22493             /* rotrv is decoded as srlv on non-R2 CPUs */
22494             if (ctx->insn_flags & ISA_MIPS32R2) {
22495                 op1 = OPC_ROTRV;
22496             }
22497             /* Fallthrough */
22498         case 0:
22499             gen_shift(ctx, op1, rd, rs, rt);
22500             break;
22501         default:
22502             generate_exception_end(ctx, EXCP_RI);
22503             break;
22504         }
22505         break;
22506     case OPC_SLT:          /* Set on less than */
22507     case OPC_SLTU:
22508         gen_slt(ctx, op1, rd, rs, rt);
22509         break;
22510     case OPC_AND:          /* Logic*/
22511     case OPC_OR:
22512     case OPC_NOR:
22513     case OPC_XOR:
22514         gen_logic(ctx, op1, rd, rs, rt);
22515         break;
22516     case OPC_JALR:
22517         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
22518         break;
22519     case OPC_TGE: /* Traps */
22520     case OPC_TGEU:
22521     case OPC_TLT:
22522     case OPC_TLTU:
22523     case OPC_TEQ:
22524     case OPC_TNE:
22525         check_insn(ctx, ISA_MIPS2);
22526         gen_trap(ctx, op1, rs, rt, -1);
22527         break;
22528     case OPC_LSA: /* OPC_PMON */
22529         if ((ctx->insn_flags & ISA_MIPS32R6) ||
22530             (env->CP0_Config3 & (1 << CP0C3_MSAP))) {
22531             decode_opc_special_r6(env, ctx);
22532         } else {
22533             /* Pmon entry point, also R4010 selsl */
22534 #ifdef MIPS_STRICT_STANDARD
22535             MIPS_INVAL("PMON / selsl");
22536             generate_exception_end(ctx, EXCP_RI);
22537 #else
22538             gen_helper_0e0i(pmon, sa);
22539 #endif
22540         }
22541         break;
22542     case OPC_SYSCALL:
22543         generate_exception_end(ctx, EXCP_SYSCALL);
22544         break;
22545     case OPC_BREAK:
22546         generate_exception_end(ctx, EXCP_BREAK);
22547         break;
22548     case OPC_SYNC:
22549         check_insn(ctx, ISA_MIPS2);
22550         gen_sync(extract32(ctx->opcode, 6, 5));
22551         break;
22552
22553 #if defined(TARGET_MIPS64)
22554         /* MIPS64 specific opcodes */
22555     case OPC_DSLL:
22556     case OPC_DSRA:
22557     case OPC_DSLL32:
22558     case OPC_DSRA32:
22559         check_insn(ctx, ISA_MIPS3);
22560         check_mips_64(ctx);
22561         gen_shift_imm(ctx, op1, rd, rt, sa);
22562         break;
22563     case OPC_DSRL:
22564         switch ((ctx->opcode >> 21) & 0x1f) {
22565         case 1:
22566             /* drotr is decoded as dsrl on non-R2 CPUs */
22567             if (ctx->insn_flags & ISA_MIPS32R2) {
22568                 op1 = OPC_DROTR;
22569             }
22570             /* Fallthrough */
22571         case 0:
22572             check_insn(ctx, ISA_MIPS3);
22573             check_mips_64(ctx);
22574             gen_shift_imm(ctx, op1, rd, rt, sa);
22575             break;
22576         default:
22577             generate_exception_end(ctx, EXCP_RI);
22578             break;
22579         }
22580         break;
22581     case OPC_DSRL32:
22582         switch ((ctx->opcode >> 21) & 0x1f) {
22583         case 1:
22584             /* drotr32 is decoded as dsrl32 on non-R2 CPUs */
22585             if (ctx->insn_flags & ISA_MIPS32R2) {
22586                 op1 = OPC_DROTR32;
22587             }
22588             /* Fallthrough */
22589         case 0:
22590             check_insn(ctx, ISA_MIPS3);
22591             check_mips_64(ctx);
22592             gen_shift_imm(ctx, op1, rd, rt, sa);
22593             break;
22594         default:
22595             generate_exception_end(ctx, EXCP_RI);
22596             break;
22597         }
22598         break;
22599     case OPC_DADD:
22600     case OPC_DADDU:
22601     case OPC_DSUB:
22602     case OPC_DSUBU:
22603         check_insn(ctx, ISA_MIPS3);
22604         check_mips_64(ctx);
22605         gen_arith(ctx, op1, rd, rs, rt);
22606         break;
22607     case OPC_DSLLV:
22608     case OPC_DSRAV:
22609         check_insn(ctx, ISA_MIPS3);
22610         check_mips_64(ctx);
22611         gen_shift(ctx, op1, rd, rs, rt);
22612         break;
22613     case OPC_DSRLV:
22614         switch ((ctx->opcode >> 6) & 0x1f) {
22615         case 1:
22616             /* drotrv is decoded as dsrlv on non-R2 CPUs */
22617             if (ctx->insn_flags & ISA_MIPS32R2) {
22618                 op1 = OPC_DROTRV;
22619             }
22620             /* Fallthrough */
22621         case 0:
22622             check_insn(ctx, ISA_MIPS3);
22623             check_mips_64(ctx);
22624             gen_shift(ctx, op1, rd, rs, rt);
22625             break;
22626         default:
22627             generate_exception_end(ctx, EXCP_RI);
22628             break;
22629         }
22630         break;
22631     case OPC_DLSA:
22632         if ((ctx->insn_flags & ISA_MIPS32R6) ||
22633             (env->CP0_Config3 & (1 << CP0C3_MSAP))) {
22634             decode_opc_special_r6(env, ctx);
22635         }
22636         break;
22637 #endif
22638     default:
22639         if (ctx->insn_flags & ISA_MIPS32R6) {
22640             decode_opc_special_r6(env, ctx);
22641         } else {
22642             decode_opc_special_legacy(env, ctx);
22643         }
22644     }
22645 }
22646
22647 static void decode_opc_special2_legacy(CPUMIPSState *env, DisasContext *ctx)
22648 {
22649     int rs, rt, rd;
22650     uint32_t op1;
22651
22652     check_insn_opc_removed(ctx, ISA_MIPS32R6);
22653
22654     rs = (ctx->opcode >> 21) & 0x1f;
22655     rt = (ctx->opcode >> 16) & 0x1f;
22656     rd = (ctx->opcode >> 11) & 0x1f;
22657
22658     op1 = MASK_SPECIAL2(ctx->opcode);
22659     switch (op1) {
22660     case OPC_MADD: /* Multiply and add/sub */
22661     case OPC_MADDU:
22662     case OPC_MSUB:
22663     case OPC_MSUBU:
22664         check_insn(ctx, ISA_MIPS32);
22665         gen_muldiv(ctx, op1, rd & 3, rs, rt);
22666         break;
22667     case OPC_MUL:
22668         gen_arith(ctx, op1, rd, rs, rt);
22669         break;
22670     case OPC_DIV_G_2F:
22671     case OPC_DIVU_G_2F:
22672     case OPC_MULT_G_2F:
22673     case OPC_MULTU_G_2F:
22674     case OPC_MOD_G_2F:
22675     case OPC_MODU_G_2F:
22676         check_insn(ctx, INSN_LOONGSON2F);
22677         gen_loongson_integer(ctx, op1, rd, rs, rt);
22678         break;
22679     case OPC_CLO:
22680     case OPC_CLZ:
22681         check_insn(ctx, ISA_MIPS32);
22682         gen_cl(ctx, op1, rd, rs);
22683         break;
22684     case OPC_SDBBP:
22685         if (is_uhi(extract32(ctx->opcode, 6, 20))) {
22686             gen_helper_do_semihosting(cpu_env);
22687         } else {
22688             /* XXX: not clear which exception should be raised
22689              *      when in debug mode...
22690              */
22691             check_insn(ctx, ISA_MIPS32);
22692             generate_exception_end(ctx, EXCP_DBp);
22693         }
22694         break;
22695 #if defined(TARGET_MIPS64)
22696     case OPC_DCLO:
22697     case OPC_DCLZ:
22698         check_insn(ctx, ISA_MIPS64);
22699         check_mips_64(ctx);
22700         gen_cl(ctx, op1, rd, rs);
22701         break;
22702     case OPC_DMULT_G_2F:
22703     case OPC_DMULTU_G_2F:
22704     case OPC_DDIV_G_2F:
22705     case OPC_DDIVU_G_2F:
22706     case OPC_DMOD_G_2F:
22707     case OPC_DMODU_G_2F:
22708         check_insn(ctx, INSN_LOONGSON2F);
22709         gen_loongson_integer(ctx, op1, rd, rs, rt);
22710         break;
22711 #endif
22712     default:            /* Invalid */
22713         MIPS_INVAL("special2_legacy");
22714         generate_exception_end(ctx, EXCP_RI);
22715         break;
22716     }
22717 }
22718
22719 static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx)
22720 {
22721     int rs, rt, rd, sa;
22722     uint32_t op1, op2;
22723     int16_t imm;
22724
22725     rs = (ctx->opcode >> 21) & 0x1f;
22726     rt = (ctx->opcode >> 16) & 0x1f;
22727     rd = (ctx->opcode >> 11) & 0x1f;
22728     sa = (ctx->opcode >> 6) & 0x1f;
22729     imm = (int16_t)ctx->opcode >> 7;
22730
22731     op1 = MASK_SPECIAL3(ctx->opcode);
22732     switch (op1) {
22733     case R6_OPC_PREF:
22734         if (rt >= 24) {
22735             /* hint codes 24-31 are reserved and signal RI */
22736             generate_exception_end(ctx, EXCP_RI);
22737         }
22738         /* Treat as NOP. */
22739         break;
22740     case R6_OPC_CACHE:
22741         check_cp0_enabled(ctx);
22742         if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
22743             gen_cache_operation(ctx, rt, rs, imm);
22744         }
22745         break;
22746     case R6_OPC_SC:
22747         gen_st_cond(ctx, op1, rt, rs, imm);
22748         break;
22749     case R6_OPC_LL:
22750         gen_ld(ctx, op1, rt, rs, imm);
22751         break;
22752     case OPC_BSHFL:
22753         {
22754             if (rd == 0) {
22755                 /* Treat as NOP. */
22756                 break;
22757             }
22758             op2 = MASK_BSHFL(ctx->opcode);
22759             switch (op2) {
22760             case OPC_ALIGN:
22761             case OPC_ALIGN_END:
22762                 gen_align(ctx, 32, rd, rs, rt, sa & 3);
22763                 break;
22764             case OPC_BITSWAP:
22765                 gen_bitswap(ctx, op2, rd, rt);
22766                 break;
22767             }
22768         }
22769         break;
22770 #if defined(TARGET_MIPS64)
22771     case R6_OPC_SCD:
22772         gen_st_cond(ctx, op1, rt, rs, imm);
22773         break;
22774     case R6_OPC_LLD:
22775         gen_ld(ctx, op1, rt, rs, imm);
22776         break;
22777     case OPC_DBSHFL:
22778         check_mips_64(ctx);
22779         {
22780             if (rd == 0) {
22781                 /* Treat as NOP. */
22782                 break;
22783             }
22784             op2 = MASK_DBSHFL(ctx->opcode);
22785             switch (op2) {
22786             case OPC_DALIGN:
22787             case OPC_DALIGN_END:
22788                 gen_align(ctx, 64, rd, rs, rt, sa & 7);
22789                 break;
22790             case OPC_DBITSWAP:
22791                 gen_bitswap(ctx, op2, rd, rt);
22792                 break;
22793             }
22794
22795         }
22796         break;
22797 #endif
22798     default:            /* Invalid */
22799         MIPS_INVAL("special3_r6");
22800         generate_exception_end(ctx, EXCP_RI);
22801         break;
22802     }
22803 }
22804
22805 static void decode_opc_special3_legacy(CPUMIPSState *env, DisasContext *ctx)
22806 {
22807     int rs, rt, rd;
22808     uint32_t op1, op2;
22809
22810     rs = (ctx->opcode >> 21) & 0x1f;
22811     rt = (ctx->opcode >> 16) & 0x1f;
22812     rd = (ctx->opcode >> 11) & 0x1f;
22813
22814     op1 = MASK_SPECIAL3(ctx->opcode);
22815     switch (op1) {
22816     case OPC_DIV_G_2E:
22817     case OPC_DIVU_G_2E:
22818     case OPC_MOD_G_2E:
22819     case OPC_MODU_G_2E:
22820     case OPC_MULT_G_2E:
22821     case OPC_MULTU_G_2E:
22822         /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
22823          * the same mask and op1. */
22824         if ((ctx->insn_flags & ASE_DSPR2) && (op1 == OPC_MULT_G_2E)) {
22825             op2 = MASK_ADDUH_QB(ctx->opcode);
22826             switch (op2) {
22827             case OPC_ADDUH_QB:
22828             case OPC_ADDUH_R_QB:
22829             case OPC_ADDQH_PH:
22830             case OPC_ADDQH_R_PH:
22831             case OPC_ADDQH_W:
22832             case OPC_ADDQH_R_W:
22833             case OPC_SUBUH_QB:
22834             case OPC_SUBUH_R_QB:
22835             case OPC_SUBQH_PH:
22836             case OPC_SUBQH_R_PH:
22837             case OPC_SUBQH_W:
22838             case OPC_SUBQH_R_W:
22839                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
22840                 break;
22841             case OPC_MUL_PH:
22842             case OPC_MUL_S_PH:
22843             case OPC_MULQ_S_W:
22844             case OPC_MULQ_RS_W:
22845                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
22846                 break;
22847             default:
22848                 MIPS_INVAL("MASK ADDUH.QB");
22849                 generate_exception_end(ctx, EXCP_RI);
22850                 break;
22851             }
22852         } else if (ctx->insn_flags & INSN_LOONGSON2E) {
22853             gen_loongson_integer(ctx, op1, rd, rs, rt);
22854         } else {
22855             generate_exception_end(ctx, EXCP_RI);
22856         }
22857         break;
22858     case OPC_LX_DSP:
22859         op2 = MASK_LX(ctx->opcode);
22860         switch (op2) {
22861 #if defined(TARGET_MIPS64)
22862         case OPC_LDX:
22863 #endif
22864         case OPC_LBUX:
22865         case OPC_LHX:
22866         case OPC_LWX:
22867             gen_mipsdsp_ld(ctx, op2, rd, rs, rt);
22868             break;
22869         default:            /* Invalid */
22870             MIPS_INVAL("MASK LX");
22871             generate_exception_end(ctx, EXCP_RI);
22872             break;
22873         }
22874         break;
22875     case OPC_ABSQ_S_PH_DSP:
22876         op2 = MASK_ABSQ_S_PH(ctx->opcode);
22877         switch (op2) {
22878         case OPC_ABSQ_S_QB:
22879         case OPC_ABSQ_S_PH:
22880         case OPC_ABSQ_S_W:
22881         case OPC_PRECEQ_W_PHL:
22882         case OPC_PRECEQ_W_PHR:
22883         case OPC_PRECEQU_PH_QBL:
22884         case OPC_PRECEQU_PH_QBR:
22885         case OPC_PRECEQU_PH_QBLA:
22886         case OPC_PRECEQU_PH_QBRA:
22887         case OPC_PRECEU_PH_QBL:
22888         case OPC_PRECEU_PH_QBR:
22889         case OPC_PRECEU_PH_QBLA:
22890         case OPC_PRECEU_PH_QBRA:
22891             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
22892             break;
22893         case OPC_BITREV:
22894         case OPC_REPL_QB:
22895         case OPC_REPLV_QB:
22896         case OPC_REPL_PH:
22897         case OPC_REPLV_PH:
22898             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
22899             break;
22900         default:
22901             MIPS_INVAL("MASK ABSQ_S.PH");
22902             generate_exception_end(ctx, EXCP_RI);
22903             break;
22904         }
22905         break;
22906     case OPC_ADDU_QB_DSP:
22907         op2 = MASK_ADDU_QB(ctx->opcode);
22908         switch (op2) {
22909         case OPC_ADDQ_PH:
22910         case OPC_ADDQ_S_PH:
22911         case OPC_ADDQ_S_W:
22912         case OPC_ADDU_QB:
22913         case OPC_ADDU_S_QB:
22914         case OPC_ADDU_PH:
22915         case OPC_ADDU_S_PH:
22916         case OPC_SUBQ_PH:
22917         case OPC_SUBQ_S_PH:
22918         case OPC_SUBQ_S_W:
22919         case OPC_SUBU_QB:
22920         case OPC_SUBU_S_QB:
22921         case OPC_SUBU_PH:
22922         case OPC_SUBU_S_PH:
22923         case OPC_ADDSC:
22924         case OPC_ADDWC:
22925         case OPC_MODSUB:
22926         case OPC_RADDU_W_QB:
22927             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
22928             break;
22929         case OPC_MULEU_S_PH_QBL:
22930         case OPC_MULEU_S_PH_QBR:
22931         case OPC_MULQ_RS_PH:
22932         case OPC_MULEQ_S_W_PHL:
22933         case OPC_MULEQ_S_W_PHR:
22934         case OPC_MULQ_S_PH:
22935             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
22936             break;
22937         default:            /* Invalid */
22938             MIPS_INVAL("MASK ADDU.QB");
22939             generate_exception_end(ctx, EXCP_RI);
22940             break;
22941
22942         }
22943         break;
22944     case OPC_CMPU_EQ_QB_DSP:
22945         op2 = MASK_CMPU_EQ_QB(ctx->opcode);
22946         switch (op2) {
22947         case OPC_PRECR_SRA_PH_W:
22948         case OPC_PRECR_SRA_R_PH_W:
22949             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
22950             break;
22951         case OPC_PRECR_QB_PH:
22952         case OPC_PRECRQ_QB_PH:
22953         case OPC_PRECRQ_PH_W:
22954         case OPC_PRECRQ_RS_PH_W:
22955         case OPC_PRECRQU_S_QB_PH:
22956             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
22957             break;
22958         case OPC_CMPU_EQ_QB:
22959         case OPC_CMPU_LT_QB:
22960         case OPC_CMPU_LE_QB:
22961         case OPC_CMP_EQ_PH:
22962         case OPC_CMP_LT_PH:
22963         case OPC_CMP_LE_PH:
22964             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
22965             break;
22966         case OPC_CMPGU_EQ_QB:
22967         case OPC_CMPGU_LT_QB:
22968         case OPC_CMPGU_LE_QB:
22969         case OPC_CMPGDU_EQ_QB:
22970         case OPC_CMPGDU_LT_QB:
22971         case OPC_CMPGDU_LE_QB:
22972         case OPC_PICK_QB:
22973         case OPC_PICK_PH:
22974         case OPC_PACKRL_PH:
22975             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
22976             break;
22977         default:            /* Invalid */
22978             MIPS_INVAL("MASK CMPU.EQ.QB");
22979             generate_exception_end(ctx, EXCP_RI);
22980             break;
22981         }
22982         break;
22983     case OPC_SHLL_QB_DSP:
22984         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
22985         break;
22986     case OPC_DPA_W_PH_DSP:
22987         op2 = MASK_DPA_W_PH(ctx->opcode);
22988         switch (op2) {
22989         case OPC_DPAU_H_QBL:
22990         case OPC_DPAU_H_QBR:
22991         case OPC_DPSU_H_QBL:
22992         case OPC_DPSU_H_QBR:
22993         case OPC_DPA_W_PH:
22994         case OPC_DPAX_W_PH:
22995         case OPC_DPAQ_S_W_PH:
22996         case OPC_DPAQX_S_W_PH:
22997         case OPC_DPAQX_SA_W_PH:
22998         case OPC_DPS_W_PH:
22999         case OPC_DPSX_W_PH:
23000         case OPC_DPSQ_S_W_PH:
23001         case OPC_DPSQX_S_W_PH:
23002         case OPC_DPSQX_SA_W_PH:
23003         case OPC_MULSAQ_S_W_PH:
23004         case OPC_DPAQ_SA_L_W:
23005         case OPC_DPSQ_SA_L_W:
23006         case OPC_MAQ_S_W_PHL:
23007         case OPC_MAQ_S_W_PHR:
23008         case OPC_MAQ_SA_W_PHL:
23009         case OPC_MAQ_SA_W_PHR:
23010         case OPC_MULSA_W_PH:
23011             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
23012             break;
23013         default:            /* Invalid */
23014             MIPS_INVAL("MASK DPAW.PH");
23015             generate_exception_end(ctx, EXCP_RI);
23016             break;
23017         }
23018         break;
23019     case OPC_INSV_DSP:
23020         op2 = MASK_INSV(ctx->opcode);
23021         switch (op2) {
23022         case OPC_INSV:
23023             check_dsp(ctx);
23024             {
23025                 TCGv t0, t1;
23026
23027                 if (rt == 0) {
23028                     break;
23029                 }
23030
23031                 t0 = tcg_temp_new();
23032                 t1 = tcg_temp_new();
23033
23034                 gen_load_gpr(t0, rt);
23035                 gen_load_gpr(t1, rs);
23036
23037                 gen_helper_insv(cpu_gpr[rt], cpu_env, t1, t0);
23038
23039                 tcg_temp_free(t0);
23040                 tcg_temp_free(t1);
23041                 break;
23042             }
23043         default:            /* Invalid */
23044             MIPS_INVAL("MASK INSV");
23045             generate_exception_end(ctx, EXCP_RI);
23046             break;
23047         }
23048         break;
23049     case OPC_APPEND_DSP:
23050         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
23051         break;
23052     case OPC_EXTR_W_DSP:
23053         op2 = MASK_EXTR_W(ctx->opcode);
23054         switch (op2) {
23055         case OPC_EXTR_W:
23056         case OPC_EXTR_R_W:
23057         case OPC_EXTR_RS_W:
23058         case OPC_EXTR_S_H:
23059         case OPC_EXTRV_S_H:
23060         case OPC_EXTRV_W:
23061         case OPC_EXTRV_R_W:
23062         case OPC_EXTRV_RS_W:
23063         case OPC_EXTP:
23064         case OPC_EXTPV:
23065         case OPC_EXTPDP:
23066         case OPC_EXTPDPV:
23067             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
23068             break;
23069         case OPC_RDDSP:
23070             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 1);
23071             break;
23072         case OPC_SHILO:
23073         case OPC_SHILOV:
23074         case OPC_MTHLIP:
23075         case OPC_WRDSP:
23076             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
23077             break;
23078         default:            /* Invalid */
23079             MIPS_INVAL("MASK EXTR.W");
23080             generate_exception_end(ctx, EXCP_RI);
23081             break;
23082         }
23083         break;
23084 #if defined(TARGET_MIPS64)
23085     case OPC_DDIV_G_2E:
23086     case OPC_DDIVU_G_2E:
23087     case OPC_DMULT_G_2E:
23088     case OPC_DMULTU_G_2E:
23089     case OPC_DMOD_G_2E:
23090     case OPC_DMODU_G_2E:
23091         check_insn(ctx, INSN_LOONGSON2E);
23092         gen_loongson_integer(ctx, op1, rd, rs, rt);
23093         break;
23094     case OPC_ABSQ_S_QH_DSP:
23095         op2 = MASK_ABSQ_S_QH(ctx->opcode);
23096         switch (op2) {
23097         case OPC_PRECEQ_L_PWL:
23098         case OPC_PRECEQ_L_PWR:
23099         case OPC_PRECEQ_PW_QHL:
23100         case OPC_PRECEQ_PW_QHR:
23101         case OPC_PRECEQ_PW_QHLA:
23102         case OPC_PRECEQ_PW_QHRA:
23103         case OPC_PRECEQU_QH_OBL:
23104         case OPC_PRECEQU_QH_OBR:
23105         case OPC_PRECEQU_QH_OBLA:
23106         case OPC_PRECEQU_QH_OBRA:
23107         case OPC_PRECEU_QH_OBL:
23108         case OPC_PRECEU_QH_OBR:
23109         case OPC_PRECEU_QH_OBLA:
23110         case OPC_PRECEU_QH_OBRA:
23111         case OPC_ABSQ_S_OB:
23112         case OPC_ABSQ_S_PW:
23113         case OPC_ABSQ_S_QH:
23114             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
23115             break;
23116         case OPC_REPL_OB:
23117         case OPC_REPL_PW:
23118         case OPC_REPL_QH:
23119         case OPC_REPLV_OB:
23120         case OPC_REPLV_PW:
23121         case OPC_REPLV_QH:
23122             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
23123             break;
23124         default:            /* Invalid */
23125             MIPS_INVAL("MASK ABSQ_S.QH");
23126             generate_exception_end(ctx, EXCP_RI);
23127             break;
23128         }
23129         break;
23130     case OPC_ADDU_OB_DSP:
23131         op2 = MASK_ADDU_OB(ctx->opcode);
23132         switch (op2) {
23133         case OPC_RADDU_L_OB:
23134         case OPC_SUBQ_PW:
23135         case OPC_SUBQ_S_PW:
23136         case OPC_SUBQ_QH:
23137         case OPC_SUBQ_S_QH:
23138         case OPC_SUBU_OB:
23139         case OPC_SUBU_S_OB:
23140         case OPC_SUBU_QH:
23141         case OPC_SUBU_S_QH:
23142         case OPC_SUBUH_OB:
23143         case OPC_SUBUH_R_OB:
23144         case OPC_ADDQ_PW:
23145         case OPC_ADDQ_S_PW:
23146         case OPC_ADDQ_QH:
23147         case OPC_ADDQ_S_QH:
23148         case OPC_ADDU_OB:
23149         case OPC_ADDU_S_OB:
23150         case OPC_ADDU_QH:
23151         case OPC_ADDU_S_QH:
23152         case OPC_ADDUH_OB:
23153         case OPC_ADDUH_R_OB:
23154             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
23155             break;
23156         case OPC_MULEQ_S_PW_QHL:
23157         case OPC_MULEQ_S_PW_QHR:
23158         case OPC_MULEU_S_QH_OBL:
23159         case OPC_MULEU_S_QH_OBR:
23160         case OPC_MULQ_RS_QH:
23161             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
23162             break;
23163         default:            /* Invalid */
23164             MIPS_INVAL("MASK ADDU.OB");
23165             generate_exception_end(ctx, EXCP_RI);
23166             break;
23167         }
23168         break;
23169     case OPC_CMPU_EQ_OB_DSP:
23170         op2 = MASK_CMPU_EQ_OB(ctx->opcode);
23171         switch (op2) {
23172         case OPC_PRECR_SRA_QH_PW:
23173         case OPC_PRECR_SRA_R_QH_PW:
23174             /* Return value is rt. */
23175             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
23176             break;
23177         case OPC_PRECR_OB_QH:
23178         case OPC_PRECRQ_OB_QH:
23179         case OPC_PRECRQ_PW_L:
23180         case OPC_PRECRQ_QH_PW:
23181         case OPC_PRECRQ_RS_QH_PW:
23182         case OPC_PRECRQU_S_OB_QH:
23183             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
23184             break;
23185         case OPC_CMPU_EQ_OB:
23186         case OPC_CMPU_LT_OB:
23187         case OPC_CMPU_LE_OB:
23188         case OPC_CMP_EQ_QH:
23189         case OPC_CMP_LT_QH:
23190         case OPC_CMP_LE_QH:
23191         case OPC_CMP_EQ_PW:
23192         case OPC_CMP_LT_PW:
23193         case OPC_CMP_LE_PW:
23194             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
23195             break;
23196         case OPC_CMPGDU_EQ_OB:
23197         case OPC_CMPGDU_LT_OB:
23198         case OPC_CMPGDU_LE_OB:
23199         case OPC_CMPGU_EQ_OB:
23200         case OPC_CMPGU_LT_OB:
23201         case OPC_CMPGU_LE_OB:
23202         case OPC_PACKRL_PW:
23203         case OPC_PICK_OB:
23204         case OPC_PICK_PW:
23205         case OPC_PICK_QH:
23206             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
23207             break;
23208         default:            /* Invalid */
23209             MIPS_INVAL("MASK CMPU_EQ.OB");
23210             generate_exception_end(ctx, EXCP_RI);
23211             break;
23212         }
23213         break;
23214     case OPC_DAPPEND_DSP:
23215         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
23216         break;
23217     case OPC_DEXTR_W_DSP:
23218         op2 = MASK_DEXTR_W(ctx->opcode);
23219         switch (op2) {
23220         case OPC_DEXTP:
23221         case OPC_DEXTPDP:
23222         case OPC_DEXTPDPV:
23223         case OPC_DEXTPV:
23224         case OPC_DEXTR_L:
23225         case OPC_DEXTR_R_L:
23226         case OPC_DEXTR_RS_L:
23227         case OPC_DEXTR_W:
23228         case OPC_DEXTR_R_W:
23229         case OPC_DEXTR_RS_W:
23230         case OPC_DEXTR_S_H:
23231         case OPC_DEXTRV_L:
23232         case OPC_DEXTRV_R_L:
23233         case OPC_DEXTRV_RS_L:
23234         case OPC_DEXTRV_S_H:
23235         case OPC_DEXTRV_W:
23236         case OPC_DEXTRV_R_W:
23237         case OPC_DEXTRV_RS_W:
23238             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
23239             break;
23240         case OPC_DMTHLIP:
23241         case OPC_DSHILO:
23242         case OPC_DSHILOV:
23243             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
23244             break;
23245         default:            /* Invalid */
23246             MIPS_INVAL("MASK EXTR.W");
23247             generate_exception_end(ctx, EXCP_RI);
23248             break;
23249         }
23250         break;
23251     case OPC_DPAQ_W_QH_DSP:
23252         op2 = MASK_DPAQ_W_QH(ctx->opcode);
23253         switch (op2) {
23254         case OPC_DPAU_H_OBL:
23255         case OPC_DPAU_H_OBR:
23256         case OPC_DPSU_H_OBL:
23257         case OPC_DPSU_H_OBR:
23258         case OPC_DPA_W_QH:
23259         case OPC_DPAQ_S_W_QH:
23260         case OPC_DPS_W_QH:
23261         case OPC_DPSQ_S_W_QH:
23262         case OPC_MULSAQ_S_W_QH:
23263         case OPC_DPAQ_SA_L_PW:
23264         case OPC_DPSQ_SA_L_PW:
23265         case OPC_MULSAQ_S_L_PW:
23266             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
23267             break;
23268         case OPC_MAQ_S_W_QHLL:
23269         case OPC_MAQ_S_W_QHLR:
23270         case OPC_MAQ_S_W_QHRL:
23271         case OPC_MAQ_S_W_QHRR:
23272         case OPC_MAQ_SA_W_QHLL:
23273         case OPC_MAQ_SA_W_QHLR:
23274         case OPC_MAQ_SA_W_QHRL:
23275         case OPC_MAQ_SA_W_QHRR:
23276         case OPC_MAQ_S_L_PWL:
23277         case OPC_MAQ_S_L_PWR:
23278         case OPC_DMADD:
23279         case OPC_DMADDU:
23280         case OPC_DMSUB:
23281         case OPC_DMSUBU:
23282             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
23283             break;
23284         default:            /* Invalid */
23285             MIPS_INVAL("MASK DPAQ.W.QH");
23286             generate_exception_end(ctx, EXCP_RI);
23287             break;
23288         }
23289         break;
23290     case OPC_DINSV_DSP:
23291         op2 = MASK_INSV(ctx->opcode);
23292         switch (op2) {
23293         case OPC_DINSV:
23294         {
23295             TCGv t0, t1;
23296
23297             if (rt == 0) {
23298                 break;
23299             }
23300             check_dsp(ctx);
23301
23302             t0 = tcg_temp_new();
23303             t1 = tcg_temp_new();
23304
23305             gen_load_gpr(t0, rt);
23306             gen_load_gpr(t1, rs);
23307
23308             gen_helper_dinsv(cpu_gpr[rt], cpu_env, t1, t0);
23309
23310             tcg_temp_free(t0);
23311             tcg_temp_free(t1);
23312             break;
23313         }
23314         default:            /* Invalid */
23315             MIPS_INVAL("MASK DINSV");
23316             generate_exception_end(ctx, EXCP_RI);
23317             break;
23318         }
23319         break;
23320     case OPC_SHLL_OB_DSP:
23321         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
23322         break;
23323 #endif
23324     default:            /* Invalid */
23325         MIPS_INVAL("special3_legacy");
23326         generate_exception_end(ctx, EXCP_RI);
23327         break;
23328     }
23329 }
23330
23331 static void decode_opc_special3(CPUMIPSState *env, DisasContext *ctx)
23332 {
23333     int rs, rt, rd, sa;
23334     uint32_t op1, op2;
23335     int16_t imm;
23336
23337     rs = (ctx->opcode >> 21) & 0x1f;
23338     rt = (ctx->opcode >> 16) & 0x1f;
23339     rd = (ctx->opcode >> 11) & 0x1f;
23340     sa = (ctx->opcode >> 6) & 0x1f;
23341     imm = sextract32(ctx->opcode, 7, 9);
23342
23343     op1 = MASK_SPECIAL3(ctx->opcode);
23344
23345     /*
23346      * EVA loads and stores overlap Loongson 2E instructions decoded by
23347      * decode_opc_special3_legacy(), so be careful to allow their decoding when
23348      * EVA is absent.
23349      */
23350     if (ctx->eva) {
23351         switch (op1) {
23352         case OPC_LWLE:
23353         case OPC_LWRE:
23354             check_insn_opc_removed(ctx, ISA_MIPS32R6);
23355             /* fall through */
23356         case OPC_LBUE:
23357         case OPC_LHUE:
23358         case OPC_LBE:
23359         case OPC_LHE:
23360         case OPC_LLE:
23361         case OPC_LWE:
23362             check_cp0_enabled(ctx);
23363             gen_ld(ctx, op1, rt, rs, imm);
23364             return;
23365         case OPC_SWLE:
23366         case OPC_SWRE:
23367             check_insn_opc_removed(ctx, ISA_MIPS32R6);
23368             /* fall through */
23369         case OPC_SBE:
23370         case OPC_SHE:
23371         case OPC_SWE:
23372             check_cp0_enabled(ctx);
23373             gen_st(ctx, op1, rt, rs, imm);
23374             return;
23375         case OPC_SCE:
23376             check_cp0_enabled(ctx);
23377             gen_st_cond(ctx, op1, rt, rs, imm);
23378             return;
23379         case OPC_CACHEE:
23380             check_cp0_enabled(ctx);
23381             if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
23382                 gen_cache_operation(ctx, rt, rs, imm);
23383             }
23384             /* Treat as NOP. */
23385             return;
23386         case OPC_PREFE:
23387             check_cp0_enabled(ctx);
23388             /* Treat as NOP. */
23389             return;
23390         }
23391     }
23392
23393     switch (op1) {
23394     case OPC_EXT:
23395     case OPC_INS:
23396         check_insn(ctx, ISA_MIPS32R2);
23397         gen_bitops(ctx, op1, rt, rs, sa, rd);
23398         break;
23399     case OPC_BSHFL:
23400         op2 = MASK_BSHFL(ctx->opcode);
23401         switch (op2) {
23402         case OPC_ALIGN:
23403         case OPC_ALIGN_END:
23404         case OPC_BITSWAP:
23405             check_insn(ctx, ISA_MIPS32R6);
23406             decode_opc_special3_r6(env, ctx);
23407             break;
23408         default:
23409             check_insn(ctx, ISA_MIPS32R2);
23410             gen_bshfl(ctx, op2, rt, rd);
23411             break;
23412         }
23413         break;
23414 #if defined(TARGET_MIPS64)
23415     case OPC_DEXTM:
23416     case OPC_DEXTU:
23417     case OPC_DEXT:
23418     case OPC_DINSM:
23419     case OPC_DINSU:
23420     case OPC_DINS:
23421         check_insn(ctx, ISA_MIPS64R2);
23422         check_mips_64(ctx);
23423         gen_bitops(ctx, op1, rt, rs, sa, rd);
23424         break;
23425     case OPC_DBSHFL:
23426         op2 = MASK_DBSHFL(ctx->opcode);
23427         switch (op2) {
23428         case OPC_DALIGN:
23429         case OPC_DALIGN_END:
23430         case OPC_DBITSWAP:
23431             check_insn(ctx, ISA_MIPS32R6);
23432             decode_opc_special3_r6(env, ctx);
23433             break;
23434         default:
23435             check_insn(ctx, ISA_MIPS64R2);
23436             check_mips_64(ctx);
23437             op2 = MASK_DBSHFL(ctx->opcode);
23438             gen_bshfl(ctx, op2, rt, rd);
23439             break;
23440         }
23441         break;
23442 #endif
23443     case OPC_RDHWR:
23444         gen_rdhwr(ctx, rt, rd, extract32(ctx->opcode, 6, 3));
23445         break;
23446     case OPC_FORK:
23447         check_mt(ctx);
23448         {
23449             TCGv t0 = tcg_temp_new();
23450             TCGv t1 = tcg_temp_new();
23451
23452             gen_load_gpr(t0, rt);
23453             gen_load_gpr(t1, rs);
23454             gen_helper_fork(t0, t1);
23455             tcg_temp_free(t0);
23456             tcg_temp_free(t1);
23457         }
23458         break;
23459     case OPC_YIELD:
23460         check_mt(ctx);
23461         {
23462             TCGv t0 = tcg_temp_new();
23463
23464             gen_load_gpr(t0, rs);
23465             gen_helper_yield(t0, cpu_env, t0);
23466             gen_store_gpr(t0, rd);
23467             tcg_temp_free(t0);
23468         }
23469         break;
23470     default:
23471         if (ctx->insn_flags & ISA_MIPS32R6) {
23472             decode_opc_special3_r6(env, ctx);
23473         } else {
23474             decode_opc_special3_legacy(env, ctx);
23475         }
23476     }
23477 }
23478
23479 /* MIPS SIMD Architecture (MSA)  */
23480 static inline int check_msa_access(DisasContext *ctx)
23481 {
23482     if (unlikely((ctx->hflags & MIPS_HFLAG_FPU) &&
23483                  !(ctx->hflags & MIPS_HFLAG_F64))) {
23484         generate_exception_end(ctx, EXCP_RI);
23485         return 0;
23486     }
23487
23488     if (unlikely(!(ctx->hflags & MIPS_HFLAG_MSA))) {
23489         if (ctx->insn_flags & ASE_MSA) {
23490             generate_exception_end(ctx, EXCP_MSADIS);
23491             return 0;
23492         } else {
23493             generate_exception_end(ctx, EXCP_RI);
23494             return 0;
23495         }
23496     }
23497     return 1;
23498 }
23499
23500 static void gen_check_zero_element(TCGv tresult, uint8_t df, uint8_t wt)
23501 {
23502     /* generates tcg ops to check if any element is 0 */
23503     /* Note this function only works with MSA_WRLEN = 128 */
23504     uint64_t eval_zero_or_big = 0;
23505     uint64_t eval_big = 0;
23506     TCGv_i64 t0 = tcg_temp_new_i64();
23507     TCGv_i64 t1 = tcg_temp_new_i64();
23508     switch (df) {
23509     case DF_BYTE:
23510         eval_zero_or_big = 0x0101010101010101ULL;
23511         eval_big = 0x8080808080808080ULL;
23512         break;
23513     case DF_HALF:
23514         eval_zero_or_big = 0x0001000100010001ULL;
23515         eval_big = 0x8000800080008000ULL;
23516         break;
23517     case DF_WORD:
23518         eval_zero_or_big = 0x0000000100000001ULL;
23519         eval_big = 0x8000000080000000ULL;
23520         break;
23521     case DF_DOUBLE:
23522         eval_zero_or_big = 0x0000000000000001ULL;
23523         eval_big = 0x8000000000000000ULL;
23524         break;
23525     }
23526     tcg_gen_subi_i64(t0, msa_wr_d[wt<<1], eval_zero_or_big);
23527     tcg_gen_andc_i64(t0, t0, msa_wr_d[wt<<1]);
23528     tcg_gen_andi_i64(t0, t0, eval_big);
23529     tcg_gen_subi_i64(t1, msa_wr_d[(wt<<1)+1], eval_zero_or_big);
23530     tcg_gen_andc_i64(t1, t1, msa_wr_d[(wt<<1)+1]);
23531     tcg_gen_andi_i64(t1, t1, eval_big);
23532     tcg_gen_or_i64(t0, t0, t1);
23533     /* if all bits are zero then all elements are not zero */
23534     /* if some bit is non-zero then some element is zero */
23535     tcg_gen_setcondi_i64(TCG_COND_NE, t0, t0, 0);
23536     tcg_gen_trunc_i64_tl(tresult, t0);
23537     tcg_temp_free_i64(t0);
23538     tcg_temp_free_i64(t1);
23539 }
23540
23541 static void gen_msa_branch(CPUMIPSState *env, DisasContext *ctx, uint32_t op1)
23542 {
23543     uint8_t df = (ctx->opcode >> 21) & 0x3;
23544     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
23545     int64_t s16 = (int16_t)ctx->opcode;
23546
23547     check_msa_access(ctx);
23548
23549     if (ctx->hflags & MIPS_HFLAG_BMASK) {
23550         generate_exception_end(ctx, EXCP_RI);
23551         return;
23552     }
23553     switch (op1) {
23554     case OPC_BZ_V:
23555     case OPC_BNZ_V:
23556         {
23557             TCGv_i64 t0 = tcg_temp_new_i64();
23558             tcg_gen_or_i64(t0, msa_wr_d[wt<<1], msa_wr_d[(wt<<1)+1]);
23559             tcg_gen_setcondi_i64((op1 == OPC_BZ_V) ?
23560                     TCG_COND_EQ : TCG_COND_NE, t0, t0, 0);
23561             tcg_gen_trunc_i64_tl(bcond, t0);
23562             tcg_temp_free_i64(t0);
23563         }
23564         break;
23565     case OPC_BZ_B:
23566     case OPC_BZ_H:
23567     case OPC_BZ_W:
23568     case OPC_BZ_D:
23569         gen_check_zero_element(bcond, df, wt);
23570         break;
23571     case OPC_BNZ_B:
23572     case OPC_BNZ_H:
23573     case OPC_BNZ_W:
23574     case OPC_BNZ_D:
23575         gen_check_zero_element(bcond, df, wt);
23576         tcg_gen_setcondi_tl(TCG_COND_EQ, bcond, bcond, 0);
23577         break;
23578     }
23579
23580     ctx->btarget = ctx->base.pc_next + (s16 << 2) + 4;
23581
23582     ctx->hflags |= MIPS_HFLAG_BC;
23583     ctx->hflags |= MIPS_HFLAG_BDS32;
23584 }
23585
23586 static void gen_msa_i8(CPUMIPSState *env, DisasContext *ctx)
23587 {
23588 #define MASK_MSA_I8(op)    (MASK_MSA_MINOR(op) | (op & (0x03 << 24)))
23589     uint8_t i8 = (ctx->opcode >> 16) & 0xff;
23590     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
23591     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
23592
23593     TCGv_i32 twd = tcg_const_i32(wd);
23594     TCGv_i32 tws = tcg_const_i32(ws);
23595     TCGv_i32 ti8 = tcg_const_i32(i8);
23596
23597     switch (MASK_MSA_I8(ctx->opcode)) {
23598     case OPC_ANDI_B:
23599         gen_helper_msa_andi_b(cpu_env, twd, tws, ti8);
23600         break;
23601     case OPC_ORI_B:
23602         gen_helper_msa_ori_b(cpu_env, twd, tws, ti8);
23603         break;
23604     case OPC_NORI_B:
23605         gen_helper_msa_nori_b(cpu_env, twd, tws, ti8);
23606         break;
23607     case OPC_XORI_B:
23608         gen_helper_msa_xori_b(cpu_env, twd, tws, ti8);
23609         break;
23610     case OPC_BMNZI_B:
23611         gen_helper_msa_bmnzi_b(cpu_env, twd, tws, ti8);
23612         break;
23613     case OPC_BMZI_B:
23614         gen_helper_msa_bmzi_b(cpu_env, twd, tws, ti8);
23615         break;
23616     case OPC_BSELI_B:
23617         gen_helper_msa_bseli_b(cpu_env, twd, tws, ti8);
23618         break;
23619     case OPC_SHF_B:
23620     case OPC_SHF_H:
23621     case OPC_SHF_W:
23622         {
23623             uint8_t df = (ctx->opcode >> 24) & 0x3;
23624             if (df == DF_DOUBLE) {
23625                 generate_exception_end(ctx, EXCP_RI);
23626             } else {
23627                 TCGv_i32 tdf = tcg_const_i32(df);
23628                 gen_helper_msa_shf_df(cpu_env, tdf, twd, tws, ti8);
23629                 tcg_temp_free_i32(tdf);
23630             }
23631         }
23632         break;
23633     default:
23634         MIPS_INVAL("MSA instruction");
23635         generate_exception_end(ctx, EXCP_RI);
23636         break;
23637     }
23638
23639     tcg_temp_free_i32(twd);
23640     tcg_temp_free_i32(tws);
23641     tcg_temp_free_i32(ti8);
23642 }
23643
23644 static void gen_msa_i5(CPUMIPSState *env, DisasContext *ctx)
23645 {
23646 #define MASK_MSA_I5(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
23647     uint8_t df = (ctx->opcode >> 21) & 0x3;
23648     int8_t s5 = (int8_t) sextract32(ctx->opcode, 16, 5);
23649     uint8_t u5 = (ctx->opcode >> 16) & 0x1f;
23650     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
23651     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
23652
23653     TCGv_i32 tdf = tcg_const_i32(df);
23654     TCGv_i32 twd = tcg_const_i32(wd);
23655     TCGv_i32 tws = tcg_const_i32(ws);
23656     TCGv_i32 timm = tcg_temp_new_i32();
23657     tcg_gen_movi_i32(timm, u5);
23658
23659     switch (MASK_MSA_I5(ctx->opcode)) {
23660     case OPC_ADDVI_df:
23661         gen_helper_msa_addvi_df(cpu_env, tdf, twd, tws, timm);
23662         break;
23663     case OPC_SUBVI_df:
23664         gen_helper_msa_subvi_df(cpu_env, tdf, twd, tws, timm);
23665         break;
23666     case OPC_MAXI_S_df:
23667         tcg_gen_movi_i32(timm, s5);
23668         gen_helper_msa_maxi_s_df(cpu_env, tdf, twd, tws, timm);
23669         break;
23670     case OPC_MAXI_U_df:
23671         gen_helper_msa_maxi_u_df(cpu_env, tdf, twd, tws, timm);
23672         break;
23673     case OPC_MINI_S_df:
23674         tcg_gen_movi_i32(timm, s5);
23675         gen_helper_msa_mini_s_df(cpu_env, tdf, twd, tws, timm);
23676         break;
23677     case OPC_MINI_U_df:
23678         gen_helper_msa_mini_u_df(cpu_env, tdf, twd, tws, timm);
23679         break;
23680     case OPC_CEQI_df:
23681         tcg_gen_movi_i32(timm, s5);
23682         gen_helper_msa_ceqi_df(cpu_env, tdf, twd, tws, timm);
23683         break;
23684     case OPC_CLTI_S_df:
23685         tcg_gen_movi_i32(timm, s5);
23686         gen_helper_msa_clti_s_df(cpu_env, tdf, twd, tws, timm);
23687         break;
23688     case OPC_CLTI_U_df:
23689         gen_helper_msa_clti_u_df(cpu_env, tdf, twd, tws, timm);
23690         break;
23691     case OPC_CLEI_S_df:
23692         tcg_gen_movi_i32(timm, s5);
23693         gen_helper_msa_clei_s_df(cpu_env, tdf, twd, tws, timm);
23694         break;
23695     case OPC_CLEI_U_df:
23696         gen_helper_msa_clei_u_df(cpu_env, tdf, twd, tws, timm);
23697         break;
23698     case OPC_LDI_df:
23699         {
23700             int32_t s10 = sextract32(ctx->opcode, 11, 10);
23701             tcg_gen_movi_i32(timm, s10);
23702             gen_helper_msa_ldi_df(cpu_env, tdf, twd, timm);
23703         }
23704         break;
23705     default:
23706         MIPS_INVAL("MSA instruction");
23707         generate_exception_end(ctx, EXCP_RI);
23708         break;
23709     }
23710
23711     tcg_temp_free_i32(tdf);
23712     tcg_temp_free_i32(twd);
23713     tcg_temp_free_i32(tws);
23714     tcg_temp_free_i32(timm);
23715 }
23716
23717 static void gen_msa_bit(CPUMIPSState *env, DisasContext *ctx)
23718 {
23719 #define MASK_MSA_BIT(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
23720     uint8_t dfm = (ctx->opcode >> 16) & 0x7f;
23721     uint32_t df = 0, m = 0;
23722     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
23723     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
23724
23725     TCGv_i32 tdf;
23726     TCGv_i32 tm;
23727     TCGv_i32 twd;
23728     TCGv_i32 tws;
23729
23730     if ((dfm & 0x40) == 0x00) {
23731         m = dfm & 0x3f;
23732         df = DF_DOUBLE;
23733     } else if ((dfm & 0x60) == 0x40) {
23734         m = dfm & 0x1f;
23735         df = DF_WORD;
23736     } else if ((dfm & 0x70) == 0x60) {
23737         m = dfm & 0x0f;
23738         df = DF_HALF;
23739     } else if ((dfm & 0x78) == 0x70) {
23740         m = dfm & 0x7;
23741         df = DF_BYTE;
23742     } else {
23743         generate_exception_end(ctx, EXCP_RI);
23744         return;
23745     }
23746
23747     tdf = tcg_const_i32(df);
23748     tm  = tcg_const_i32(m);
23749     twd = tcg_const_i32(wd);
23750     tws = tcg_const_i32(ws);
23751
23752     switch (MASK_MSA_BIT(ctx->opcode)) {
23753     case OPC_SLLI_df:
23754         gen_helper_msa_slli_df(cpu_env, tdf, twd, tws, tm);
23755         break;
23756     case OPC_SRAI_df:
23757         gen_helper_msa_srai_df(cpu_env, tdf, twd, tws, tm);
23758         break;
23759     case OPC_SRLI_df:
23760         gen_helper_msa_srli_df(cpu_env, tdf, twd, tws, tm);
23761         break;
23762     case OPC_BCLRI_df:
23763         gen_helper_msa_bclri_df(cpu_env, tdf, twd, tws, tm);
23764         break;
23765     case OPC_BSETI_df:
23766         gen_helper_msa_bseti_df(cpu_env, tdf, twd, tws, tm);
23767         break;
23768     case OPC_BNEGI_df:
23769         gen_helper_msa_bnegi_df(cpu_env, tdf, twd, tws, tm);
23770         break;
23771     case OPC_BINSLI_df:
23772         gen_helper_msa_binsli_df(cpu_env, tdf, twd, tws, tm);
23773         break;
23774     case OPC_BINSRI_df:
23775         gen_helper_msa_binsri_df(cpu_env, tdf, twd, tws, tm);
23776         break;
23777     case OPC_SAT_S_df:
23778         gen_helper_msa_sat_s_df(cpu_env, tdf, twd, tws, tm);
23779         break;
23780     case OPC_SAT_U_df:
23781         gen_helper_msa_sat_u_df(cpu_env, tdf, twd, tws, tm);
23782         break;
23783     case OPC_SRARI_df:
23784         gen_helper_msa_srari_df(cpu_env, tdf, twd, tws, tm);
23785         break;
23786     case OPC_SRLRI_df:
23787         gen_helper_msa_srlri_df(cpu_env, tdf, twd, tws, tm);
23788         break;
23789     default:
23790         MIPS_INVAL("MSA instruction");
23791         generate_exception_end(ctx, EXCP_RI);
23792         break;
23793     }
23794
23795     tcg_temp_free_i32(tdf);
23796     tcg_temp_free_i32(tm);
23797     tcg_temp_free_i32(twd);
23798     tcg_temp_free_i32(tws);
23799 }
23800
23801 static void gen_msa_3r(CPUMIPSState *env, DisasContext *ctx)
23802 {
23803 #define MASK_MSA_3R(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
23804     uint8_t df = (ctx->opcode >> 21) & 0x3;
23805     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
23806     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
23807     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
23808
23809     TCGv_i32 tdf = tcg_const_i32(df);
23810     TCGv_i32 twd = tcg_const_i32(wd);
23811     TCGv_i32 tws = tcg_const_i32(ws);
23812     TCGv_i32 twt = tcg_const_i32(wt);
23813
23814     switch (MASK_MSA_3R(ctx->opcode)) {
23815     case OPC_SLL_df:
23816         gen_helper_msa_sll_df(cpu_env, tdf, twd, tws, twt);
23817         break;
23818     case OPC_ADDV_df:
23819         gen_helper_msa_addv_df(cpu_env, tdf, twd, tws, twt);
23820         break;
23821     case OPC_CEQ_df:
23822         gen_helper_msa_ceq_df(cpu_env, tdf, twd, tws, twt);
23823         break;
23824     case OPC_ADD_A_df:
23825         gen_helper_msa_add_a_df(cpu_env, tdf, twd, tws, twt);
23826         break;
23827     case OPC_SUBS_S_df:
23828         gen_helper_msa_subs_s_df(cpu_env, tdf, twd, tws, twt);
23829         break;
23830     case OPC_MULV_df:
23831         gen_helper_msa_mulv_df(cpu_env, tdf, twd, tws, twt);
23832         break;
23833     case OPC_SLD_df:
23834         gen_helper_msa_sld_df(cpu_env, tdf, twd, tws, twt);
23835         break;
23836     case OPC_VSHF_df:
23837         gen_helper_msa_vshf_df(cpu_env, tdf, twd, tws, twt);
23838         break;
23839     case OPC_SRA_df:
23840         gen_helper_msa_sra_df(cpu_env, tdf, twd, tws, twt);
23841         break;
23842     case OPC_SUBV_df:
23843         gen_helper_msa_subv_df(cpu_env, tdf, twd, tws, twt);
23844         break;
23845     case OPC_ADDS_A_df:
23846         gen_helper_msa_adds_a_df(cpu_env, tdf, twd, tws, twt);
23847         break;
23848     case OPC_SUBS_U_df:
23849         gen_helper_msa_subs_u_df(cpu_env, tdf, twd, tws, twt);
23850         break;
23851     case OPC_MADDV_df:
23852         gen_helper_msa_maddv_df(cpu_env, tdf, twd, tws, twt);
23853         break;
23854     case OPC_SPLAT_df:
23855         gen_helper_msa_splat_df(cpu_env, tdf, twd, tws, twt);
23856         break;
23857     case OPC_SRAR_df:
23858         gen_helper_msa_srar_df(cpu_env, tdf, twd, tws, twt);
23859         break;
23860     case OPC_SRL_df:
23861         gen_helper_msa_srl_df(cpu_env, tdf, twd, tws, twt);
23862         break;
23863     case OPC_MAX_S_df:
23864         gen_helper_msa_max_s_df(cpu_env, tdf, twd, tws, twt);
23865         break;
23866     case OPC_CLT_S_df:
23867         gen_helper_msa_clt_s_df(cpu_env, tdf, twd, tws, twt);
23868         break;
23869     case OPC_ADDS_S_df:
23870         gen_helper_msa_adds_s_df(cpu_env, tdf, twd, tws, twt);
23871         break;
23872     case OPC_SUBSUS_U_df:
23873         gen_helper_msa_subsus_u_df(cpu_env, tdf, twd, tws, twt);
23874         break;
23875     case OPC_MSUBV_df:
23876         gen_helper_msa_msubv_df(cpu_env, tdf, twd, tws, twt);
23877         break;
23878     case OPC_PCKEV_df:
23879         gen_helper_msa_pckev_df(cpu_env, tdf, twd, tws, twt);
23880         break;
23881     case OPC_SRLR_df:
23882         gen_helper_msa_srlr_df(cpu_env, tdf, twd, tws, twt);
23883         break;
23884     case OPC_BCLR_df:
23885         gen_helper_msa_bclr_df(cpu_env, tdf, twd, tws, twt);
23886         break;
23887     case OPC_MAX_U_df:
23888         gen_helper_msa_max_u_df(cpu_env, tdf, twd, tws, twt);
23889         break;
23890     case OPC_CLT_U_df:
23891         gen_helper_msa_clt_u_df(cpu_env, tdf, twd, tws, twt);
23892         break;
23893     case OPC_ADDS_U_df:
23894         gen_helper_msa_adds_u_df(cpu_env, tdf, twd, tws, twt);
23895         break;
23896     case OPC_SUBSUU_S_df:
23897         gen_helper_msa_subsuu_s_df(cpu_env, tdf, twd, tws, twt);
23898         break;
23899     case OPC_PCKOD_df:
23900         gen_helper_msa_pckod_df(cpu_env, tdf, twd, tws, twt);
23901         break;
23902     case OPC_BSET_df:
23903         gen_helper_msa_bset_df(cpu_env, tdf, twd, tws, twt);
23904         break;
23905     case OPC_MIN_S_df:
23906         gen_helper_msa_min_s_df(cpu_env, tdf, twd, tws, twt);
23907         break;
23908     case OPC_CLE_S_df:
23909         gen_helper_msa_cle_s_df(cpu_env, tdf, twd, tws, twt);
23910         break;
23911     case OPC_AVE_S_df:
23912         gen_helper_msa_ave_s_df(cpu_env, tdf, twd, tws, twt);
23913         break;
23914     case OPC_ASUB_S_df:
23915         gen_helper_msa_asub_s_df(cpu_env, tdf, twd, tws, twt);
23916         break;
23917     case OPC_DIV_S_df:
23918         gen_helper_msa_div_s_df(cpu_env, tdf, twd, tws, twt);
23919         break;
23920     case OPC_ILVL_df:
23921         gen_helper_msa_ilvl_df(cpu_env, tdf, twd, tws, twt);
23922         break;
23923     case OPC_BNEG_df:
23924         gen_helper_msa_bneg_df(cpu_env, tdf, twd, tws, twt);
23925         break;
23926     case OPC_MIN_U_df:
23927         gen_helper_msa_min_u_df(cpu_env, tdf, twd, tws, twt);
23928         break;
23929     case OPC_CLE_U_df:
23930         gen_helper_msa_cle_u_df(cpu_env, tdf, twd, tws, twt);
23931         break;
23932     case OPC_AVE_U_df:
23933         gen_helper_msa_ave_u_df(cpu_env, tdf, twd, tws, twt);
23934         break;
23935     case OPC_ASUB_U_df:
23936         gen_helper_msa_asub_u_df(cpu_env, tdf, twd, tws, twt);
23937         break;
23938     case OPC_DIV_U_df:
23939         gen_helper_msa_div_u_df(cpu_env, tdf, twd, tws, twt);
23940         break;
23941     case OPC_ILVR_df:
23942         gen_helper_msa_ilvr_df(cpu_env, tdf, twd, tws, twt);
23943         break;
23944     case OPC_BINSL_df:
23945         gen_helper_msa_binsl_df(cpu_env, tdf, twd, tws, twt);
23946         break;
23947     case OPC_MAX_A_df:
23948         gen_helper_msa_max_a_df(cpu_env, tdf, twd, tws, twt);
23949         break;
23950     case OPC_AVER_S_df:
23951         gen_helper_msa_aver_s_df(cpu_env, tdf, twd, tws, twt);
23952         break;
23953     case OPC_MOD_S_df:
23954         gen_helper_msa_mod_s_df(cpu_env, tdf, twd, tws, twt);
23955         break;
23956     case OPC_ILVEV_df:
23957         gen_helper_msa_ilvev_df(cpu_env, tdf, twd, tws, twt);
23958         break;
23959     case OPC_BINSR_df:
23960         gen_helper_msa_binsr_df(cpu_env, tdf, twd, tws, twt);
23961         break;
23962     case OPC_MIN_A_df:
23963         gen_helper_msa_min_a_df(cpu_env, tdf, twd, tws, twt);
23964         break;
23965     case OPC_AVER_U_df:
23966         gen_helper_msa_aver_u_df(cpu_env, tdf, twd, tws, twt);
23967         break;
23968     case OPC_MOD_U_df:
23969         gen_helper_msa_mod_u_df(cpu_env, tdf, twd, tws, twt);
23970         break;
23971     case OPC_ILVOD_df:
23972         gen_helper_msa_ilvod_df(cpu_env, tdf, twd, tws, twt);
23973         break;
23974
23975     case OPC_DOTP_S_df:
23976     case OPC_DOTP_U_df:
23977     case OPC_DPADD_S_df:
23978     case OPC_DPADD_U_df:
23979     case OPC_DPSUB_S_df:
23980     case OPC_HADD_S_df:
23981     case OPC_DPSUB_U_df:
23982     case OPC_HADD_U_df:
23983     case OPC_HSUB_S_df:
23984     case OPC_HSUB_U_df:
23985         if (df == DF_BYTE) {
23986             generate_exception_end(ctx, EXCP_RI);
23987             break;
23988         }
23989         switch (MASK_MSA_3R(ctx->opcode)) {
23990         case OPC_DOTP_S_df:
23991             gen_helper_msa_dotp_s_df(cpu_env, tdf, twd, tws, twt);
23992             break;
23993         case OPC_DOTP_U_df:
23994             gen_helper_msa_dotp_u_df(cpu_env, tdf, twd, tws, twt);
23995             break;
23996         case OPC_DPADD_S_df:
23997             gen_helper_msa_dpadd_s_df(cpu_env, tdf, twd, tws, twt);
23998             break;
23999         case OPC_DPADD_U_df:
24000             gen_helper_msa_dpadd_u_df(cpu_env, tdf, twd, tws, twt);
24001             break;
24002         case OPC_DPSUB_S_df:
24003             gen_helper_msa_dpsub_s_df(cpu_env, tdf, twd, tws, twt);
24004             break;
24005         case OPC_HADD_S_df:
24006             gen_helper_msa_hadd_s_df(cpu_env, tdf, twd, tws, twt);
24007             break;
24008         case OPC_DPSUB_U_df:
24009             gen_helper_msa_dpsub_u_df(cpu_env, tdf, twd, tws, twt);
24010             break;
24011         case OPC_HADD_U_df:
24012             gen_helper_msa_hadd_u_df(cpu_env, tdf, twd, tws, twt);
24013             break;
24014         case OPC_HSUB_S_df:
24015             gen_helper_msa_hsub_s_df(cpu_env, tdf, twd, tws, twt);
24016             break;
24017         case OPC_HSUB_U_df:
24018             gen_helper_msa_hsub_u_df(cpu_env, tdf, twd, tws, twt);
24019             break;
24020         }
24021         break;
24022     default:
24023         MIPS_INVAL("MSA instruction");
24024         generate_exception_end(ctx, EXCP_RI);
24025         break;
24026     }
24027     tcg_temp_free_i32(twd);
24028     tcg_temp_free_i32(tws);
24029     tcg_temp_free_i32(twt);
24030     tcg_temp_free_i32(tdf);
24031 }
24032
24033 static void gen_msa_elm_3e(CPUMIPSState *env, DisasContext *ctx)
24034 {
24035 #define MASK_MSA_ELM_DF3E(op)   (MASK_MSA_MINOR(op) | (op & (0x3FF << 16)))
24036     uint8_t source = (ctx->opcode >> 11) & 0x1f;
24037     uint8_t dest = (ctx->opcode >> 6) & 0x1f;
24038     TCGv telm = tcg_temp_new();
24039     TCGv_i32 tsr = tcg_const_i32(source);
24040     TCGv_i32 tdt = tcg_const_i32(dest);
24041
24042     switch (MASK_MSA_ELM_DF3E(ctx->opcode)) {
24043     case OPC_CTCMSA:
24044         gen_load_gpr(telm, source);
24045         gen_helper_msa_ctcmsa(cpu_env, telm, tdt);
24046         break;
24047     case OPC_CFCMSA:
24048         gen_helper_msa_cfcmsa(telm, cpu_env, tsr);
24049         gen_store_gpr(telm, dest);
24050         break;
24051     case OPC_MOVE_V:
24052         gen_helper_msa_move_v(cpu_env, tdt, tsr);
24053         break;
24054     default:
24055         MIPS_INVAL("MSA instruction");
24056         generate_exception_end(ctx, EXCP_RI);
24057         break;
24058     }
24059
24060     tcg_temp_free(telm);
24061     tcg_temp_free_i32(tdt);
24062     tcg_temp_free_i32(tsr);
24063 }
24064
24065 static void gen_msa_elm_df(CPUMIPSState *env, DisasContext *ctx, uint32_t df,
24066         uint32_t n)
24067 {
24068 #define MASK_MSA_ELM(op)    (MASK_MSA_MINOR(op) | (op & (0xf << 22)))
24069     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
24070     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
24071
24072     TCGv_i32 tws = tcg_const_i32(ws);
24073     TCGv_i32 twd = tcg_const_i32(wd);
24074     TCGv_i32 tn  = tcg_const_i32(n);
24075     TCGv_i32 tdf = tcg_const_i32(df);
24076
24077     switch (MASK_MSA_ELM(ctx->opcode)) {
24078     case OPC_SLDI_df:
24079         gen_helper_msa_sldi_df(cpu_env, tdf, twd, tws, tn);
24080         break;
24081     case OPC_SPLATI_df:
24082         gen_helper_msa_splati_df(cpu_env, tdf, twd, tws, tn);
24083         break;
24084     case OPC_INSVE_df:
24085         gen_helper_msa_insve_df(cpu_env, tdf, twd, tws, tn);
24086         break;
24087     case OPC_COPY_S_df:
24088     case OPC_COPY_U_df:
24089     case OPC_INSERT_df:
24090 #if !defined(TARGET_MIPS64)
24091         /* Double format valid only for MIPS64 */
24092         if (df == DF_DOUBLE) {
24093             generate_exception_end(ctx, EXCP_RI);
24094             break;
24095         }
24096 #endif
24097         switch (MASK_MSA_ELM(ctx->opcode)) {
24098         case OPC_COPY_S_df:
24099             if (likely(wd != 0)) {
24100                 gen_helper_msa_copy_s_df(cpu_env, tdf, twd, tws, tn);
24101             }
24102             break;
24103         case OPC_COPY_U_df:
24104             if (likely(wd != 0)) {
24105                 gen_helper_msa_copy_u_df(cpu_env, tdf, twd, tws, tn);
24106             }
24107             break;
24108         case OPC_INSERT_df:
24109             gen_helper_msa_insert_df(cpu_env, tdf, twd, tws, tn);
24110             break;
24111         }
24112         break;
24113     default:
24114         MIPS_INVAL("MSA instruction");
24115         generate_exception_end(ctx, EXCP_RI);
24116     }
24117     tcg_temp_free_i32(twd);
24118     tcg_temp_free_i32(tws);
24119     tcg_temp_free_i32(tn);
24120     tcg_temp_free_i32(tdf);
24121 }
24122
24123 static void gen_msa_elm(CPUMIPSState *env, DisasContext *ctx)
24124 {
24125     uint8_t dfn = (ctx->opcode >> 16) & 0x3f;
24126     uint32_t df = 0, n = 0;
24127
24128     if ((dfn & 0x30) == 0x00) {
24129         n = dfn & 0x0f;
24130         df = DF_BYTE;
24131     } else if ((dfn & 0x38) == 0x20) {
24132         n = dfn & 0x07;
24133         df = DF_HALF;
24134     } else if ((dfn & 0x3c) == 0x30) {
24135         n = dfn & 0x03;
24136         df = DF_WORD;
24137     } else if ((dfn & 0x3e) == 0x38) {
24138         n = dfn & 0x01;
24139         df = DF_DOUBLE;
24140     } else if (dfn == 0x3E) {
24141         /* CTCMSA, CFCMSA, MOVE.V */
24142         gen_msa_elm_3e(env, ctx);
24143         return;
24144     } else {
24145         generate_exception_end(ctx, EXCP_RI);
24146         return;
24147     }
24148
24149     gen_msa_elm_df(env, ctx, df, n);
24150 }
24151
24152 static void gen_msa_3rf(CPUMIPSState *env, DisasContext *ctx)
24153 {
24154 #define MASK_MSA_3RF(op)    (MASK_MSA_MINOR(op) | (op & (0xf << 22)))
24155     uint8_t df = (ctx->opcode >> 21) & 0x1;
24156     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
24157     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
24158     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
24159
24160     TCGv_i32 twd = tcg_const_i32(wd);
24161     TCGv_i32 tws = tcg_const_i32(ws);
24162     TCGv_i32 twt = tcg_const_i32(wt);
24163     TCGv_i32 tdf = tcg_temp_new_i32();
24164
24165     /* adjust df value for floating-point instruction */
24166     tcg_gen_movi_i32(tdf, df + 2);
24167
24168     switch (MASK_MSA_3RF(ctx->opcode)) {
24169     case OPC_FCAF_df:
24170         gen_helper_msa_fcaf_df(cpu_env, tdf, twd, tws, twt);
24171         break;
24172     case OPC_FADD_df:
24173         gen_helper_msa_fadd_df(cpu_env, tdf, twd, tws, twt);
24174         break;
24175     case OPC_FCUN_df:
24176         gen_helper_msa_fcun_df(cpu_env, tdf, twd, tws, twt);
24177         break;
24178     case OPC_FSUB_df:
24179         gen_helper_msa_fsub_df(cpu_env, tdf, twd, tws, twt);
24180         break;
24181     case OPC_FCOR_df:
24182         gen_helper_msa_fcor_df(cpu_env, tdf, twd, tws, twt);
24183         break;
24184     case OPC_FCEQ_df:
24185         gen_helper_msa_fceq_df(cpu_env, tdf, twd, tws, twt);
24186         break;
24187     case OPC_FMUL_df:
24188         gen_helper_msa_fmul_df(cpu_env, tdf, twd, tws, twt);
24189         break;
24190     case OPC_FCUNE_df:
24191         gen_helper_msa_fcune_df(cpu_env, tdf, twd, tws, twt);
24192         break;
24193     case OPC_FCUEQ_df:
24194         gen_helper_msa_fcueq_df(cpu_env, tdf, twd, tws, twt);
24195         break;
24196     case OPC_FDIV_df:
24197         gen_helper_msa_fdiv_df(cpu_env, tdf, twd, tws, twt);
24198         break;
24199     case OPC_FCNE_df:
24200         gen_helper_msa_fcne_df(cpu_env, tdf, twd, tws, twt);
24201         break;
24202     case OPC_FCLT_df:
24203         gen_helper_msa_fclt_df(cpu_env, tdf, twd, tws, twt);
24204         break;
24205     case OPC_FMADD_df:
24206         gen_helper_msa_fmadd_df(cpu_env, tdf, twd, tws, twt);
24207         break;
24208     case OPC_MUL_Q_df:
24209         tcg_gen_movi_i32(tdf, df + 1);
24210         gen_helper_msa_mul_q_df(cpu_env, tdf, twd, tws, twt);
24211         break;
24212     case OPC_FCULT_df:
24213         gen_helper_msa_fcult_df(cpu_env, tdf, twd, tws, twt);
24214         break;
24215     case OPC_FMSUB_df:
24216         gen_helper_msa_fmsub_df(cpu_env, tdf, twd, tws, twt);
24217         break;
24218     case OPC_MADD_Q_df:
24219         tcg_gen_movi_i32(tdf, df + 1);
24220         gen_helper_msa_madd_q_df(cpu_env, tdf, twd, tws, twt);
24221         break;
24222     case OPC_FCLE_df:
24223         gen_helper_msa_fcle_df(cpu_env, tdf, twd, tws, twt);
24224         break;
24225     case OPC_MSUB_Q_df:
24226         tcg_gen_movi_i32(tdf, df + 1);
24227         gen_helper_msa_msub_q_df(cpu_env, tdf, twd, tws, twt);
24228         break;
24229     case OPC_FCULE_df:
24230         gen_helper_msa_fcule_df(cpu_env, tdf, twd, tws, twt);
24231         break;
24232     case OPC_FEXP2_df:
24233         gen_helper_msa_fexp2_df(cpu_env, tdf, twd, tws, twt);
24234         break;
24235     case OPC_FSAF_df:
24236         gen_helper_msa_fsaf_df(cpu_env, tdf, twd, tws, twt);
24237         break;
24238     case OPC_FEXDO_df:
24239         gen_helper_msa_fexdo_df(cpu_env, tdf, twd, tws, twt);
24240         break;
24241     case OPC_FSUN_df:
24242         gen_helper_msa_fsun_df(cpu_env, tdf, twd, tws, twt);
24243         break;
24244     case OPC_FSOR_df:
24245         gen_helper_msa_fsor_df(cpu_env, tdf, twd, tws, twt);
24246         break;
24247     case OPC_FSEQ_df:
24248         gen_helper_msa_fseq_df(cpu_env, tdf, twd, tws, twt);
24249         break;
24250     case OPC_FTQ_df:
24251         gen_helper_msa_ftq_df(cpu_env, tdf, twd, tws, twt);
24252         break;
24253     case OPC_FSUNE_df:
24254         gen_helper_msa_fsune_df(cpu_env, tdf, twd, tws, twt);
24255         break;
24256     case OPC_FSUEQ_df:
24257         gen_helper_msa_fsueq_df(cpu_env, tdf, twd, tws, twt);
24258         break;
24259     case OPC_FSNE_df:
24260         gen_helper_msa_fsne_df(cpu_env, tdf, twd, tws, twt);
24261         break;
24262     case OPC_FSLT_df:
24263         gen_helper_msa_fslt_df(cpu_env, tdf, twd, tws, twt);
24264         break;
24265     case OPC_FMIN_df:
24266         gen_helper_msa_fmin_df(cpu_env, tdf, twd, tws, twt);
24267         break;
24268     case OPC_MULR_Q_df:
24269         tcg_gen_movi_i32(tdf, df + 1);
24270         gen_helper_msa_mulr_q_df(cpu_env, tdf, twd, tws, twt);
24271         break;
24272     case OPC_FSULT_df:
24273         gen_helper_msa_fsult_df(cpu_env, tdf, twd, tws, twt);
24274         break;
24275     case OPC_FMIN_A_df:
24276         gen_helper_msa_fmin_a_df(cpu_env, tdf, twd, tws, twt);
24277         break;
24278     case OPC_MADDR_Q_df:
24279         tcg_gen_movi_i32(tdf, df + 1);
24280         gen_helper_msa_maddr_q_df(cpu_env, tdf, twd, tws, twt);
24281         break;
24282     case OPC_FSLE_df:
24283         gen_helper_msa_fsle_df(cpu_env, tdf, twd, tws, twt);
24284         break;
24285     case OPC_FMAX_df:
24286         gen_helper_msa_fmax_df(cpu_env, tdf, twd, tws, twt);
24287         break;
24288     case OPC_MSUBR_Q_df:
24289         tcg_gen_movi_i32(tdf, df + 1);
24290         gen_helper_msa_msubr_q_df(cpu_env, tdf, twd, tws, twt);
24291         break;
24292     case OPC_FSULE_df:
24293         gen_helper_msa_fsule_df(cpu_env, tdf, twd, tws, twt);
24294         break;
24295     case OPC_FMAX_A_df:
24296         gen_helper_msa_fmax_a_df(cpu_env, tdf, twd, tws, twt);
24297         break;
24298     default:
24299         MIPS_INVAL("MSA instruction");
24300         generate_exception_end(ctx, EXCP_RI);
24301         break;
24302     }
24303
24304     tcg_temp_free_i32(twd);
24305     tcg_temp_free_i32(tws);
24306     tcg_temp_free_i32(twt);
24307     tcg_temp_free_i32(tdf);
24308 }
24309
24310 static void gen_msa_2r(CPUMIPSState *env, DisasContext *ctx)
24311 {
24312 #define MASK_MSA_2R(op)     (MASK_MSA_MINOR(op) | (op & (0x1f << 21)) | \
24313                             (op & (0x7 << 18)))
24314     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
24315     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
24316     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
24317     uint8_t df = (ctx->opcode >> 16) & 0x3;
24318     TCGv_i32 twd = tcg_const_i32(wd);
24319     TCGv_i32 tws = tcg_const_i32(ws);
24320     TCGv_i32 twt = tcg_const_i32(wt);
24321     TCGv_i32 tdf = tcg_const_i32(df);
24322
24323     switch (MASK_MSA_2R(ctx->opcode)) {
24324     case OPC_FILL_df:
24325 #if !defined(TARGET_MIPS64)
24326         /* Double format valid only for MIPS64 */
24327         if (df == DF_DOUBLE) {
24328             generate_exception_end(ctx, EXCP_RI);
24329             break;
24330         }
24331 #endif
24332         gen_helper_msa_fill_df(cpu_env, tdf, twd, tws); /* trs */
24333         break;
24334     case OPC_PCNT_df:
24335         gen_helper_msa_pcnt_df(cpu_env, tdf, twd, tws);
24336         break;
24337     case OPC_NLOC_df:
24338         gen_helper_msa_nloc_df(cpu_env, tdf, twd, tws);
24339         break;
24340     case OPC_NLZC_df:
24341         gen_helper_msa_nlzc_df(cpu_env, tdf, twd, tws);
24342         break;
24343     default:
24344         MIPS_INVAL("MSA instruction");
24345         generate_exception_end(ctx, EXCP_RI);
24346         break;
24347     }
24348
24349     tcg_temp_free_i32(twd);
24350     tcg_temp_free_i32(tws);
24351     tcg_temp_free_i32(twt);
24352     tcg_temp_free_i32(tdf);
24353 }
24354
24355 static void gen_msa_2rf(CPUMIPSState *env, DisasContext *ctx)
24356 {
24357 #define MASK_MSA_2RF(op)    (MASK_MSA_MINOR(op) | (op & (0x1f << 21)) | \
24358                             (op & (0xf << 17)))
24359     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
24360     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
24361     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
24362     uint8_t df = (ctx->opcode >> 16) & 0x1;
24363     TCGv_i32 twd = tcg_const_i32(wd);
24364     TCGv_i32 tws = tcg_const_i32(ws);
24365     TCGv_i32 twt = tcg_const_i32(wt);
24366     /* adjust df value for floating-point instruction */
24367     TCGv_i32 tdf = tcg_const_i32(df + 2);
24368
24369     switch (MASK_MSA_2RF(ctx->opcode)) {
24370     case OPC_FCLASS_df:
24371         gen_helper_msa_fclass_df(cpu_env, tdf, twd, tws);
24372         break;
24373     case OPC_FTRUNC_S_df:
24374         gen_helper_msa_ftrunc_s_df(cpu_env, tdf, twd, tws);
24375         break;
24376     case OPC_FTRUNC_U_df:
24377         gen_helper_msa_ftrunc_u_df(cpu_env, tdf, twd, tws);
24378         break;
24379     case OPC_FSQRT_df:
24380         gen_helper_msa_fsqrt_df(cpu_env, tdf, twd, tws);
24381         break;
24382     case OPC_FRSQRT_df:
24383         gen_helper_msa_frsqrt_df(cpu_env, tdf, twd, tws);
24384         break;
24385     case OPC_FRCP_df:
24386         gen_helper_msa_frcp_df(cpu_env, tdf, twd, tws);
24387         break;
24388     case OPC_FRINT_df:
24389         gen_helper_msa_frint_df(cpu_env, tdf, twd, tws);
24390         break;
24391     case OPC_FLOG2_df:
24392         gen_helper_msa_flog2_df(cpu_env, tdf, twd, tws);
24393         break;
24394     case OPC_FEXUPL_df:
24395         gen_helper_msa_fexupl_df(cpu_env, tdf, twd, tws);
24396         break;
24397     case OPC_FEXUPR_df:
24398         gen_helper_msa_fexupr_df(cpu_env, tdf, twd, tws);
24399         break;
24400     case OPC_FFQL_df:
24401         gen_helper_msa_ffql_df(cpu_env, tdf, twd, tws);
24402         break;
24403     case OPC_FFQR_df:
24404         gen_helper_msa_ffqr_df(cpu_env, tdf, twd, tws);
24405         break;
24406     case OPC_FTINT_S_df:
24407         gen_helper_msa_ftint_s_df(cpu_env, tdf, twd, tws);
24408         break;
24409     case OPC_FTINT_U_df:
24410         gen_helper_msa_ftint_u_df(cpu_env, tdf, twd, tws);
24411         break;
24412     case OPC_FFINT_S_df:
24413         gen_helper_msa_ffint_s_df(cpu_env, tdf, twd, tws);
24414         break;
24415     case OPC_FFINT_U_df:
24416         gen_helper_msa_ffint_u_df(cpu_env, tdf, twd, tws);
24417         break;
24418     }
24419
24420     tcg_temp_free_i32(twd);
24421     tcg_temp_free_i32(tws);
24422     tcg_temp_free_i32(twt);
24423     tcg_temp_free_i32(tdf);
24424 }
24425
24426 static void gen_msa_vec_v(CPUMIPSState *env, DisasContext *ctx)
24427 {
24428 #define MASK_MSA_VEC(op)    (MASK_MSA_MINOR(op) | (op & (0x1f << 21)))
24429     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
24430     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
24431     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
24432     TCGv_i32 twd = tcg_const_i32(wd);
24433     TCGv_i32 tws = tcg_const_i32(ws);
24434     TCGv_i32 twt = tcg_const_i32(wt);
24435
24436     switch (MASK_MSA_VEC(ctx->opcode)) {
24437     case OPC_AND_V:
24438         gen_helper_msa_and_v(cpu_env, twd, tws, twt);
24439         break;
24440     case OPC_OR_V:
24441         gen_helper_msa_or_v(cpu_env, twd, tws, twt);
24442         break;
24443     case OPC_NOR_V:
24444         gen_helper_msa_nor_v(cpu_env, twd, tws, twt);
24445         break;
24446     case OPC_XOR_V:
24447         gen_helper_msa_xor_v(cpu_env, twd, tws, twt);
24448         break;
24449     case OPC_BMNZ_V:
24450         gen_helper_msa_bmnz_v(cpu_env, twd, tws, twt);
24451         break;
24452     case OPC_BMZ_V:
24453         gen_helper_msa_bmz_v(cpu_env, twd, tws, twt);
24454         break;
24455     case OPC_BSEL_V:
24456         gen_helper_msa_bsel_v(cpu_env, twd, tws, twt);
24457         break;
24458     default:
24459         MIPS_INVAL("MSA instruction");
24460         generate_exception_end(ctx, EXCP_RI);
24461         break;
24462     }
24463
24464     tcg_temp_free_i32(twd);
24465     tcg_temp_free_i32(tws);
24466     tcg_temp_free_i32(twt);
24467 }
24468
24469 static void gen_msa_vec(CPUMIPSState *env, DisasContext *ctx)
24470 {
24471     switch (MASK_MSA_VEC(ctx->opcode)) {
24472     case OPC_AND_V:
24473     case OPC_OR_V:
24474     case OPC_NOR_V:
24475     case OPC_XOR_V:
24476     case OPC_BMNZ_V:
24477     case OPC_BMZ_V:
24478     case OPC_BSEL_V:
24479         gen_msa_vec_v(env, ctx);
24480         break;
24481     case OPC_MSA_2R:
24482         gen_msa_2r(env, ctx);
24483         break;
24484     case OPC_MSA_2RF:
24485         gen_msa_2rf(env, ctx);
24486         break;
24487     default:
24488         MIPS_INVAL("MSA instruction");
24489         generate_exception_end(ctx, EXCP_RI);
24490         break;
24491     }
24492 }
24493
24494 static void gen_msa(CPUMIPSState *env, DisasContext *ctx)
24495 {
24496     uint32_t opcode = ctx->opcode;
24497     check_insn(ctx, ASE_MSA);
24498     check_msa_access(ctx);
24499
24500     switch (MASK_MSA_MINOR(opcode)) {
24501     case OPC_MSA_I8_00:
24502     case OPC_MSA_I8_01:
24503     case OPC_MSA_I8_02:
24504         gen_msa_i8(env, ctx);
24505         break;
24506     case OPC_MSA_I5_06:
24507     case OPC_MSA_I5_07:
24508         gen_msa_i5(env, ctx);
24509         break;
24510     case OPC_MSA_BIT_09:
24511     case OPC_MSA_BIT_0A:
24512         gen_msa_bit(env, ctx);
24513         break;
24514     case OPC_MSA_3R_0D:
24515     case OPC_MSA_3R_0E:
24516     case OPC_MSA_3R_0F:
24517     case OPC_MSA_3R_10:
24518     case OPC_MSA_3R_11:
24519     case OPC_MSA_3R_12:
24520     case OPC_MSA_3R_13:
24521     case OPC_MSA_3R_14:
24522     case OPC_MSA_3R_15:
24523         gen_msa_3r(env, ctx);
24524         break;
24525     case OPC_MSA_ELM:
24526         gen_msa_elm(env, ctx);
24527         break;
24528     case OPC_MSA_3RF_1A:
24529     case OPC_MSA_3RF_1B:
24530     case OPC_MSA_3RF_1C:
24531         gen_msa_3rf(env, ctx);
24532         break;
24533     case OPC_MSA_VEC:
24534         gen_msa_vec(env, ctx);
24535         break;
24536     case OPC_LD_B:
24537     case OPC_LD_H:
24538     case OPC_LD_W:
24539     case OPC_LD_D:
24540     case OPC_ST_B:
24541     case OPC_ST_H:
24542     case OPC_ST_W:
24543     case OPC_ST_D:
24544         {
24545             int32_t s10 = sextract32(ctx->opcode, 16, 10);
24546             uint8_t rs = (ctx->opcode >> 11) & 0x1f;
24547             uint8_t wd = (ctx->opcode >> 6) & 0x1f;
24548             uint8_t df = (ctx->opcode >> 0) & 0x3;
24549
24550             TCGv_i32 twd = tcg_const_i32(wd);
24551             TCGv taddr = tcg_temp_new();
24552             gen_base_offset_addr(ctx, taddr, rs, s10 << df);
24553
24554             switch (MASK_MSA_MINOR(opcode)) {
24555             case OPC_LD_B:
24556                 gen_helper_msa_ld_b(cpu_env, twd, taddr);
24557                 break;
24558             case OPC_LD_H:
24559                 gen_helper_msa_ld_h(cpu_env, twd, taddr);
24560                 break;
24561             case OPC_LD_W:
24562                 gen_helper_msa_ld_w(cpu_env, twd, taddr);
24563                 break;
24564             case OPC_LD_D:
24565                 gen_helper_msa_ld_d(cpu_env, twd, taddr);
24566                 break;
24567             case OPC_ST_B:
24568                 gen_helper_msa_st_b(cpu_env, twd, taddr);
24569                 break;
24570             case OPC_ST_H:
24571                 gen_helper_msa_st_h(cpu_env, twd, taddr);
24572                 break;
24573             case OPC_ST_W:
24574                 gen_helper_msa_st_w(cpu_env, twd, taddr);
24575                 break;
24576             case OPC_ST_D:
24577                 gen_helper_msa_st_d(cpu_env, twd, taddr);
24578                 break;
24579             }
24580
24581             tcg_temp_free_i32(twd);
24582             tcg_temp_free(taddr);
24583         }
24584         break;
24585     default:
24586         MIPS_INVAL("MSA instruction");
24587         generate_exception_end(ctx, EXCP_RI);
24588         break;
24589     }
24590
24591 }
24592
24593 static void decode_opc(CPUMIPSState *env, DisasContext *ctx)
24594 {
24595     int32_t offset;
24596     int rs, rt, rd, sa;
24597     uint32_t op, op1;
24598     int16_t imm;
24599
24600     /* make sure instructions are on a word boundary */
24601     if (ctx->base.pc_next & 0x3) {
24602         env->CP0_BadVAddr = ctx->base.pc_next;
24603         generate_exception_err(ctx, EXCP_AdEL, EXCP_INST_NOTAVAIL);
24604         return;
24605     }
24606
24607     /* Handle blikely not taken case */
24608     if ((ctx->hflags & MIPS_HFLAG_BMASK_BASE) == MIPS_HFLAG_BL) {
24609         TCGLabel *l1 = gen_new_label();
24610
24611         tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
24612         tcg_gen_movi_i32(hflags, ctx->hflags & ~MIPS_HFLAG_BMASK);
24613         gen_goto_tb(ctx, 1, ctx->base.pc_next + 4);
24614         gen_set_label(l1);
24615     }
24616
24617     op = MASK_OP_MAJOR(ctx->opcode);
24618     rs = (ctx->opcode >> 21) & 0x1f;
24619     rt = (ctx->opcode >> 16) & 0x1f;
24620     rd = (ctx->opcode >> 11) & 0x1f;
24621     sa = (ctx->opcode >> 6) & 0x1f;
24622     imm = (int16_t)ctx->opcode;
24623     switch (op) {
24624     case OPC_SPECIAL:
24625         decode_opc_special(env, ctx);
24626         break;
24627     case OPC_SPECIAL2:
24628         decode_opc_special2_legacy(env, ctx);
24629         break;
24630     case OPC_SPECIAL3:
24631         decode_opc_special3(env, ctx);
24632         break;
24633     case OPC_REGIMM:
24634         op1 = MASK_REGIMM(ctx->opcode);
24635         switch (op1) {
24636         case OPC_BLTZL: /* REGIMM branches */
24637         case OPC_BGEZL:
24638         case OPC_BLTZALL:
24639         case OPC_BGEZALL:
24640             check_insn(ctx, ISA_MIPS2);
24641             check_insn_opc_removed(ctx, ISA_MIPS32R6);
24642             /* Fallthrough */
24643         case OPC_BLTZ:
24644         case OPC_BGEZ:
24645             gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
24646             break;
24647         case OPC_BLTZAL:
24648         case OPC_BGEZAL:
24649             if (ctx->insn_flags & ISA_MIPS32R6) {
24650                 if (rs == 0) {
24651                     /* OPC_NAL, OPC_BAL */
24652                     gen_compute_branch(ctx, op1, 4, 0, -1, imm << 2, 4);
24653                 } else {
24654                     generate_exception_end(ctx, EXCP_RI);
24655                 }
24656             } else {
24657                 gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
24658             }
24659             break;
24660         case OPC_TGEI: /* REGIMM traps */
24661         case OPC_TGEIU:
24662         case OPC_TLTI:
24663         case OPC_TLTIU:
24664         case OPC_TEQI:
24665
24666         case OPC_TNEI:
24667             check_insn(ctx, ISA_MIPS2);
24668             check_insn_opc_removed(ctx, ISA_MIPS32R6);
24669             gen_trap(ctx, op1, rs, -1, imm);
24670             break;
24671         case OPC_SIGRIE:
24672             check_insn(ctx, ISA_MIPS32R6);
24673             generate_exception_end(ctx, EXCP_RI);
24674             break;
24675         case OPC_SYNCI:
24676             check_insn(ctx, ISA_MIPS32R2);
24677             /* Break the TB to be able to sync copied instructions
24678                immediately */
24679             ctx->base.is_jmp = DISAS_STOP;
24680             break;
24681         case OPC_BPOSGE32:    /* MIPS DSP branch */
24682 #if defined(TARGET_MIPS64)
24683         case OPC_BPOSGE64:
24684 #endif
24685             check_dsp(ctx);
24686             gen_compute_branch(ctx, op1, 4, -1, -2, (int32_t)imm << 2, 4);
24687             break;
24688 #if defined(TARGET_MIPS64)
24689         case OPC_DAHI:
24690             check_insn(ctx, ISA_MIPS32R6);
24691             check_mips_64(ctx);
24692             if (rs != 0) {
24693                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 32);
24694             }
24695             break;
24696         case OPC_DATI:
24697             check_insn(ctx, ISA_MIPS32R6);
24698             check_mips_64(ctx);
24699             if (rs != 0) {
24700                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 48);
24701             }
24702             break;
24703 #endif
24704         default:            /* Invalid */
24705             MIPS_INVAL("regimm");
24706             generate_exception_end(ctx, EXCP_RI);
24707             break;
24708         }
24709         break;
24710     case OPC_CP0:
24711         check_cp0_enabled(ctx);
24712         op1 = MASK_CP0(ctx->opcode);
24713         switch (op1) {
24714         case OPC_MFC0:
24715         case OPC_MTC0:
24716         case OPC_MFTR:
24717         case OPC_MTTR:
24718         case OPC_MFHC0:
24719         case OPC_MTHC0:
24720 #if defined(TARGET_MIPS64)
24721         case OPC_DMFC0:
24722         case OPC_DMTC0:
24723 #endif
24724 #ifndef CONFIG_USER_ONLY
24725             gen_cp0(env, ctx, op1, rt, rd);
24726 #endif /* !CONFIG_USER_ONLY */
24727             break;
24728         case OPC_C0:
24729         case OPC_C0_1:
24730         case OPC_C0_2:
24731         case OPC_C0_3:
24732         case OPC_C0_4:
24733         case OPC_C0_5:
24734         case OPC_C0_6:
24735         case OPC_C0_7:
24736         case OPC_C0_8:
24737         case OPC_C0_9:
24738         case OPC_C0_A:
24739         case OPC_C0_B:
24740         case OPC_C0_C:
24741         case OPC_C0_D:
24742         case OPC_C0_E:
24743         case OPC_C0_F:
24744 #ifndef CONFIG_USER_ONLY
24745             gen_cp0(env, ctx, MASK_C0(ctx->opcode), rt, rd);
24746 #endif /* !CONFIG_USER_ONLY */
24747             break;
24748         case OPC_MFMC0:
24749 #ifndef CONFIG_USER_ONLY
24750             {
24751                 uint32_t op2;
24752                 TCGv t0 = tcg_temp_new();
24753
24754                 op2 = MASK_MFMC0(ctx->opcode);
24755                 switch (op2) {
24756                 case OPC_DMT:
24757                     check_cp0_mt(ctx);
24758                     gen_helper_dmt(t0);
24759                     gen_store_gpr(t0, rt);
24760                     break;
24761                 case OPC_EMT:
24762                     check_cp0_mt(ctx);
24763                     gen_helper_emt(t0);
24764                     gen_store_gpr(t0, rt);
24765                     break;
24766                 case OPC_DVPE:
24767                     check_cp0_mt(ctx);
24768                     gen_helper_dvpe(t0, cpu_env);
24769                     gen_store_gpr(t0, rt);
24770                     break;
24771                 case OPC_EVPE:
24772                     check_cp0_mt(ctx);
24773                     gen_helper_evpe(t0, cpu_env);
24774                     gen_store_gpr(t0, rt);
24775                     break;
24776                 case OPC_DVP:
24777                     check_insn(ctx, ISA_MIPS32R6);
24778                     if (ctx->vp) {
24779                         gen_helper_dvp(t0, cpu_env);
24780                         gen_store_gpr(t0, rt);
24781                     }
24782                     break;
24783                 case OPC_EVP:
24784                     check_insn(ctx, ISA_MIPS32R6);
24785                     if (ctx->vp) {
24786                         gen_helper_evp(t0, cpu_env);
24787                         gen_store_gpr(t0, rt);
24788                     }
24789                     break;
24790                 case OPC_DI:
24791                     check_insn(ctx, ISA_MIPS32R2);
24792                     save_cpu_state(ctx, 1);
24793                     gen_helper_di(t0, cpu_env);
24794                     gen_store_gpr(t0, rt);
24795                     /* Stop translation as we may have switched
24796                        the execution mode.  */
24797                     ctx->base.is_jmp = DISAS_STOP;
24798                     break;
24799                 case OPC_EI:
24800                     check_insn(ctx, ISA_MIPS32R2);
24801                     save_cpu_state(ctx, 1);
24802                     gen_helper_ei(t0, cpu_env);
24803                     gen_store_gpr(t0, rt);
24804                     /* DISAS_STOP isn't sufficient, we need to ensure we break
24805                        out of translated code to check for pending interrupts */
24806                     gen_save_pc(ctx->base.pc_next + 4);
24807                     ctx->base.is_jmp = DISAS_EXIT;
24808                     break;
24809                 default:            /* Invalid */
24810                     MIPS_INVAL("mfmc0");
24811                     generate_exception_end(ctx, EXCP_RI);
24812                     break;
24813                 }
24814                 tcg_temp_free(t0);
24815             }
24816 #endif /* !CONFIG_USER_ONLY */
24817             break;
24818         case OPC_RDPGPR:
24819             check_insn(ctx, ISA_MIPS32R2);
24820             gen_load_srsgpr(rt, rd);
24821             break;
24822         case OPC_WRPGPR:
24823             check_insn(ctx, ISA_MIPS32R2);
24824             gen_store_srsgpr(rt, rd);
24825             break;
24826         default:
24827             MIPS_INVAL("cp0");
24828             generate_exception_end(ctx, EXCP_RI);
24829             break;
24830         }
24831         break;
24832     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC, OPC_ADDI */
24833         if (ctx->insn_flags & ISA_MIPS32R6) {
24834             /* OPC_BOVC, OPC_BEQZALC, OPC_BEQC */
24835             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
24836         } else {
24837             /* OPC_ADDI */
24838             /* Arithmetic with immediate opcode */
24839             gen_arith_imm(ctx, op, rt, rs, imm);
24840         }
24841         break;
24842     case OPC_ADDIU:
24843          gen_arith_imm(ctx, op, rt, rs, imm);
24844          break;
24845     case OPC_SLTI: /* Set on less than with immediate opcode */
24846     case OPC_SLTIU:
24847          gen_slt_imm(ctx, op, rt, rs, imm);
24848          break;
24849     case OPC_ANDI: /* Arithmetic with immediate opcode */
24850     case OPC_LUI: /* OPC_AUI */
24851     case OPC_ORI:
24852     case OPC_XORI:
24853          gen_logic_imm(ctx, op, rt, rs, imm);
24854          break;
24855     case OPC_J: /* Jump */
24856     case OPC_JAL:
24857          offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
24858          gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
24859          break;
24860     /* Branch */
24861     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC, OPC_BLEZL */
24862         if (ctx->insn_flags & ISA_MIPS32R6) {
24863             if (rt == 0) {
24864                 generate_exception_end(ctx, EXCP_RI);
24865                 break;
24866             }
24867             /* OPC_BLEZC, OPC_BGEZC, OPC_BGEC */
24868             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
24869         } else {
24870             /* OPC_BLEZL */
24871             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
24872         }
24873         break;
24874     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC, OPC_BGTZL */
24875         if (ctx->insn_flags & ISA_MIPS32R6) {
24876             if (rt == 0) {
24877                 generate_exception_end(ctx, EXCP_RI);
24878                 break;
24879             }
24880             /* OPC_BGTZC, OPC_BLTZC, OPC_BLTC */
24881             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
24882         } else {
24883             /* OPC_BGTZL */
24884             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
24885         }
24886         break;
24887     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC, OPC_BLEZ */
24888         if (rt == 0) {
24889             /* OPC_BLEZ */
24890             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
24891         } else {
24892             check_insn(ctx, ISA_MIPS32R6);
24893             /* OPC_BLEZALC, OPC_BGEZALC, OPC_BGEUC */
24894             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
24895         }
24896         break;
24897     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC, OPC_BGTZ */
24898         if (rt == 0) {
24899             /* OPC_BGTZ */
24900             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
24901         } else {
24902             check_insn(ctx, ISA_MIPS32R6);
24903             /* OPC_BGTZALC, OPC_BLTZALC, OPC_BLTUC */
24904             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
24905         }
24906         break;
24907     case OPC_BEQL:
24908     case OPC_BNEL:
24909         check_insn(ctx, ISA_MIPS2);
24910          check_insn_opc_removed(ctx, ISA_MIPS32R6);
24911         /* Fallthrough */
24912     case OPC_BEQ:
24913     case OPC_BNE:
24914          gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
24915          break;
24916     case OPC_LL: /* Load and stores */
24917         check_insn(ctx, ISA_MIPS2);
24918         /* Fallthrough */
24919     case OPC_LWL:
24920     case OPC_LWR:
24921         check_insn_opc_removed(ctx, ISA_MIPS32R6);
24922          /* Fallthrough */
24923     case OPC_LB:
24924     case OPC_LH:
24925     case OPC_LW:
24926     case OPC_LWPC:
24927     case OPC_LBU:
24928     case OPC_LHU:
24929          gen_ld(ctx, op, rt, rs, imm);
24930          break;
24931     case OPC_SWL:
24932     case OPC_SWR:
24933         check_insn_opc_removed(ctx, ISA_MIPS32R6);
24934         /* fall through */
24935     case OPC_SB:
24936     case OPC_SH:
24937     case OPC_SW:
24938          gen_st(ctx, op, rt, rs, imm);
24939          break;
24940     case OPC_SC:
24941         check_insn(ctx, ISA_MIPS2);
24942          check_insn_opc_removed(ctx, ISA_MIPS32R6);
24943          gen_st_cond(ctx, op, rt, rs, imm);
24944          break;
24945     case OPC_CACHE:
24946         check_insn_opc_removed(ctx, ISA_MIPS32R6);
24947         check_cp0_enabled(ctx);
24948         check_insn(ctx, ISA_MIPS3 | ISA_MIPS32);
24949         if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
24950             gen_cache_operation(ctx, rt, rs, imm);
24951         }
24952         /* Treat as NOP. */
24953         break;
24954     case OPC_PREF:
24955         check_insn_opc_removed(ctx, ISA_MIPS32R6);
24956         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
24957         /* Treat as NOP. */
24958         break;
24959
24960     /* Floating point (COP1). */
24961     case OPC_LWC1:
24962     case OPC_LDC1:
24963     case OPC_SWC1:
24964     case OPC_SDC1:
24965         gen_cop1_ldst(ctx, op, rt, rs, imm);
24966         break;
24967
24968     case OPC_CP1:
24969         op1 = MASK_CP1(ctx->opcode);
24970
24971         switch (op1) {
24972         case OPC_MFHC1:
24973         case OPC_MTHC1:
24974             check_cp1_enabled(ctx);
24975             check_insn(ctx, ISA_MIPS32R2);
24976             /* fall through */
24977         case OPC_MFC1:
24978         case OPC_CFC1:
24979         case OPC_MTC1:
24980         case OPC_CTC1:
24981             check_cp1_enabled(ctx);
24982             gen_cp1(ctx, op1, rt, rd);
24983             break;
24984 #if defined(TARGET_MIPS64)
24985         case OPC_DMFC1:
24986         case OPC_DMTC1:
24987             check_cp1_enabled(ctx);
24988             check_insn(ctx, ISA_MIPS3);
24989             check_mips_64(ctx);
24990             gen_cp1(ctx, op1, rt, rd);
24991             break;
24992 #endif
24993         case OPC_BC1EQZ: /* OPC_BC1ANY2 */
24994             check_cp1_enabled(ctx);
24995             if (ctx->insn_flags & ISA_MIPS32R6) {
24996                 /* OPC_BC1EQZ */
24997                 gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
24998                                        rt, imm << 2, 4);
24999             } else {
25000                 /* OPC_BC1ANY2 */
25001                 check_cop1x(ctx);
25002                 check_insn(ctx, ASE_MIPS3D);
25003                 gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
25004                                     (rt >> 2) & 0x7, imm << 2);
25005             }
25006             break;
25007         case OPC_BC1NEZ:
25008             check_cp1_enabled(ctx);
25009             check_insn(ctx, ISA_MIPS32R6);
25010             gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
25011                                    rt, imm << 2, 4);
25012             break;
25013         case OPC_BC1ANY4:
25014             check_cp1_enabled(ctx);
25015             check_insn_opc_removed(ctx, ISA_MIPS32R6);
25016             check_cop1x(ctx);
25017             check_insn(ctx, ASE_MIPS3D);
25018             /* fall through */
25019         case OPC_BC1:
25020             check_cp1_enabled(ctx);
25021             check_insn_opc_removed(ctx, ISA_MIPS32R6);
25022             gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
25023                                 (rt >> 2) & 0x7, imm << 2);
25024             break;
25025         case OPC_PS_FMT:
25026             check_ps(ctx);
25027             /* fall through */
25028         case OPC_S_FMT:
25029         case OPC_D_FMT:
25030             check_cp1_enabled(ctx);
25031             gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
25032                        (imm >> 8) & 0x7);
25033             break;
25034         case OPC_W_FMT:
25035         case OPC_L_FMT:
25036         {
25037             int r6_op = ctx->opcode & FOP(0x3f, 0x1f);
25038             check_cp1_enabled(ctx);
25039             if (ctx->insn_flags & ISA_MIPS32R6) {
25040                 switch (r6_op) {
25041                 case R6_OPC_CMP_AF_S:
25042                 case R6_OPC_CMP_UN_S:
25043                 case R6_OPC_CMP_EQ_S:
25044                 case R6_OPC_CMP_UEQ_S:
25045                 case R6_OPC_CMP_LT_S:
25046                 case R6_OPC_CMP_ULT_S:
25047                 case R6_OPC_CMP_LE_S:
25048                 case R6_OPC_CMP_ULE_S:
25049                 case R6_OPC_CMP_SAF_S:
25050                 case R6_OPC_CMP_SUN_S:
25051                 case R6_OPC_CMP_SEQ_S:
25052                 case R6_OPC_CMP_SEUQ_S:
25053                 case R6_OPC_CMP_SLT_S:
25054                 case R6_OPC_CMP_SULT_S:
25055                 case R6_OPC_CMP_SLE_S:
25056                 case R6_OPC_CMP_SULE_S:
25057                 case R6_OPC_CMP_OR_S:
25058                 case R6_OPC_CMP_UNE_S:
25059                 case R6_OPC_CMP_NE_S:
25060                 case R6_OPC_CMP_SOR_S:
25061                 case R6_OPC_CMP_SUNE_S:
25062                 case R6_OPC_CMP_SNE_S:
25063                     gen_r6_cmp_s(ctx, ctx->opcode & 0x1f, rt, rd, sa);
25064                     break;
25065                 case R6_OPC_CMP_AF_D:
25066                 case R6_OPC_CMP_UN_D:
25067                 case R6_OPC_CMP_EQ_D:
25068                 case R6_OPC_CMP_UEQ_D:
25069                 case R6_OPC_CMP_LT_D:
25070                 case R6_OPC_CMP_ULT_D:
25071                 case R6_OPC_CMP_LE_D:
25072                 case R6_OPC_CMP_ULE_D:
25073                 case R6_OPC_CMP_SAF_D:
25074                 case R6_OPC_CMP_SUN_D:
25075                 case R6_OPC_CMP_SEQ_D:
25076                 case R6_OPC_CMP_SEUQ_D:
25077                 case R6_OPC_CMP_SLT_D:
25078                 case R6_OPC_CMP_SULT_D:
25079                 case R6_OPC_CMP_SLE_D:
25080                 case R6_OPC_CMP_SULE_D:
25081                 case R6_OPC_CMP_OR_D:
25082                 case R6_OPC_CMP_UNE_D:
25083                 case R6_OPC_CMP_NE_D:
25084                 case R6_OPC_CMP_SOR_D:
25085                 case R6_OPC_CMP_SUNE_D:
25086                 case R6_OPC_CMP_SNE_D:
25087                     gen_r6_cmp_d(ctx, ctx->opcode & 0x1f, rt, rd, sa);
25088                     break;
25089                 default:
25090                     gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f),
25091                                rt, rd, sa, (imm >> 8) & 0x7);
25092
25093                     break;
25094                 }
25095             } else {
25096                 gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
25097                            (imm >> 8) & 0x7);
25098             }
25099             break;
25100         }
25101         case OPC_BZ_V:
25102         case OPC_BNZ_V:
25103         case OPC_BZ_B:
25104         case OPC_BZ_H:
25105         case OPC_BZ_W:
25106         case OPC_BZ_D:
25107         case OPC_BNZ_B:
25108         case OPC_BNZ_H:
25109         case OPC_BNZ_W:
25110         case OPC_BNZ_D:
25111             check_insn(ctx, ASE_MSA);
25112             gen_msa_branch(env, ctx, op1);
25113             break;
25114         default:
25115             MIPS_INVAL("cp1");
25116             generate_exception_end(ctx, EXCP_RI);
25117             break;
25118         }
25119         break;
25120
25121     /* Compact branches [R6] and COP2 [non-R6] */
25122     case OPC_BC: /* OPC_LWC2 */
25123     case OPC_BALC: /* OPC_SWC2 */
25124         if (ctx->insn_flags & ISA_MIPS32R6) {
25125             /* OPC_BC, OPC_BALC */
25126             gen_compute_compact_branch(ctx, op, 0, 0,
25127                                        sextract32(ctx->opcode << 2, 0, 28));
25128         } else {
25129             /* OPC_LWC2, OPC_SWC2 */
25130             /* COP2: Not implemented. */
25131             generate_exception_err(ctx, EXCP_CpU, 2);
25132         }
25133         break;
25134     case OPC_BEQZC: /* OPC_JIC, OPC_LDC2 */
25135     case OPC_BNEZC: /* OPC_JIALC, OPC_SDC2 */
25136         if (ctx->insn_flags & ISA_MIPS32R6) {
25137             if (rs != 0) {
25138                 /* OPC_BEQZC, OPC_BNEZC */
25139                 gen_compute_compact_branch(ctx, op, rs, 0,
25140                                            sextract32(ctx->opcode << 2, 0, 23));
25141             } else {
25142                 /* OPC_JIC, OPC_JIALC */
25143                 gen_compute_compact_branch(ctx, op, 0, rt, imm);
25144             }
25145         } else {
25146             /* OPC_LWC2, OPC_SWC2 */
25147             /* COP2: Not implemented. */
25148             generate_exception_err(ctx, EXCP_CpU, 2);
25149         }
25150         break;
25151     case OPC_CP2:
25152         check_insn(ctx, INSN_LOONGSON2F);
25153         /* Note that these instructions use different fields.  */
25154         gen_loongson_multimedia(ctx, sa, rd, rt);
25155         break;
25156
25157     case OPC_CP3:
25158         check_insn_opc_removed(ctx, ISA_MIPS32R6);
25159         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
25160             check_cp1_enabled(ctx);
25161             op1 = MASK_CP3(ctx->opcode);
25162             switch (op1) {
25163             case OPC_LUXC1:
25164             case OPC_SUXC1:
25165                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS32R2);
25166                 /* Fallthrough */
25167             case OPC_LWXC1:
25168             case OPC_LDXC1:
25169             case OPC_SWXC1:
25170             case OPC_SDXC1:
25171                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
25172                 gen_flt3_ldst(ctx, op1, sa, rd, rs, rt);
25173                 break;
25174             case OPC_PREFX:
25175                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
25176                 /* Treat as NOP. */
25177                 break;
25178             case OPC_ALNV_PS:
25179                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS32R2);
25180                 /* Fallthrough */
25181             case OPC_MADD_S:
25182             case OPC_MADD_D:
25183             case OPC_MADD_PS:
25184             case OPC_MSUB_S:
25185             case OPC_MSUB_D:
25186             case OPC_MSUB_PS:
25187             case OPC_NMADD_S:
25188             case OPC_NMADD_D:
25189             case OPC_NMADD_PS:
25190             case OPC_NMSUB_S:
25191             case OPC_NMSUB_D:
25192             case OPC_NMSUB_PS:
25193                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
25194                 gen_flt3_arith(ctx, op1, sa, rs, rd, rt);
25195                 break;
25196             default:
25197                 MIPS_INVAL("cp3");
25198                 generate_exception_end(ctx, EXCP_RI);
25199                 break;
25200             }
25201         } else {
25202             generate_exception_err(ctx, EXCP_CpU, 1);
25203         }
25204         break;
25205
25206 #if defined(TARGET_MIPS64)
25207     /* MIPS64 opcodes */
25208     case OPC_LDL:
25209     case OPC_LDR:
25210     case OPC_LLD:
25211         check_insn_opc_removed(ctx, ISA_MIPS32R6);
25212         /* fall through */
25213     case OPC_LWU:
25214     case OPC_LD:
25215         check_insn(ctx, ISA_MIPS3);
25216         check_mips_64(ctx);
25217         gen_ld(ctx, op, rt, rs, imm);
25218         break;
25219     case OPC_SDL:
25220     case OPC_SDR:
25221         check_insn_opc_removed(ctx, ISA_MIPS32R6);
25222         /* fall through */
25223     case OPC_SD:
25224         check_insn(ctx, ISA_MIPS3);
25225         check_mips_64(ctx);
25226         gen_st(ctx, op, rt, rs, imm);
25227         break;
25228     case OPC_SCD:
25229         check_insn_opc_removed(ctx, ISA_MIPS32R6);
25230         check_insn(ctx, ISA_MIPS3);
25231         check_mips_64(ctx);
25232         gen_st_cond(ctx, op, rt, rs, imm);
25233         break;
25234     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC, OPC_DADDI */
25235         if (ctx->insn_flags & ISA_MIPS32R6) {
25236             /* OPC_BNVC, OPC_BNEZALC, OPC_BNEC */
25237             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
25238         } else {
25239             /* OPC_DADDI */
25240             check_insn(ctx, ISA_MIPS3);
25241             check_mips_64(ctx);
25242             gen_arith_imm(ctx, op, rt, rs, imm);
25243         }
25244         break;
25245     case OPC_DADDIU:
25246         check_insn(ctx, ISA_MIPS3);
25247         check_mips_64(ctx);
25248         gen_arith_imm(ctx, op, rt, rs, imm);
25249         break;
25250 #else
25251     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
25252         if (ctx->insn_flags & ISA_MIPS32R6) {
25253             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
25254         } else {
25255             MIPS_INVAL("major opcode");
25256             generate_exception_end(ctx, EXCP_RI);
25257         }
25258         break;
25259 #endif
25260     case OPC_DAUI: /* OPC_JALX */
25261         if (ctx->insn_flags & ISA_MIPS32R6) {
25262 #if defined(TARGET_MIPS64)
25263             /* OPC_DAUI */
25264             check_mips_64(ctx);
25265             if (rs == 0) {
25266                 generate_exception(ctx, EXCP_RI);
25267             } else if (rt != 0) {
25268                 TCGv t0 = tcg_temp_new();
25269                 gen_load_gpr(t0, rs);
25270                 tcg_gen_addi_tl(cpu_gpr[rt], t0, imm << 16);
25271                 tcg_temp_free(t0);
25272             }
25273 #else
25274             generate_exception_end(ctx, EXCP_RI);
25275             MIPS_INVAL("major opcode");
25276 #endif
25277         } else {
25278             /* OPC_JALX */
25279             check_insn(ctx, ASE_MIPS16 | ASE_MICROMIPS);
25280             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
25281             gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
25282         }
25283         break;
25284     case OPC_MSA: /* OPC_MDMX */
25285         /* MDMX: Not implemented. */
25286         gen_msa(env, ctx);
25287         break;
25288     case OPC_PCREL:
25289         check_insn(ctx, ISA_MIPS32R6);
25290         gen_pcrel(ctx, ctx->opcode, ctx->base.pc_next, rs);
25291         break;
25292     default:            /* Invalid */
25293         MIPS_INVAL("major opcode");
25294         generate_exception_end(ctx, EXCP_RI);
25295         break;
25296     }
25297 }
25298
25299 static void mips_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
25300 {
25301     DisasContext *ctx = container_of(dcbase, DisasContext, base);
25302     CPUMIPSState *env = cs->env_ptr;
25303
25304     ctx->page_start = ctx->base.pc_first & TARGET_PAGE_MASK;
25305     ctx->saved_pc = -1;
25306     ctx->insn_flags = env->insn_flags;
25307     ctx->CP0_Config1 = env->CP0_Config1;
25308     ctx->CP0_Config3 = env->CP0_Config3;
25309     ctx->CP0_Config5 = env->CP0_Config5;
25310     ctx->btarget = 0;
25311     ctx->kscrexist = (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff;
25312     ctx->rxi = (env->CP0_Config3 >> CP0C3_RXI) & 1;
25313     ctx->ie = (env->CP0_Config4 >> CP0C4_IE) & 3;
25314     ctx->bi = (env->CP0_Config3 >> CP0C3_BI) & 1;
25315     ctx->bp = (env->CP0_Config3 >> CP0C3_BP) & 1;
25316     ctx->PAMask = env->PAMask;
25317     ctx->mvh = (env->CP0_Config5 >> CP0C5_MVH) & 1;
25318     ctx->eva = (env->CP0_Config5 >> CP0C5_EVA) & 1;
25319     ctx->sc = (env->CP0_Config3 >> CP0C3_SC) & 1;
25320     ctx->CP0_LLAddr_shift = env->CP0_LLAddr_shift;
25321     ctx->cmgcr = (env->CP0_Config3 >> CP0C3_CMGCR) & 1;
25322     /* Restore delay slot state from the tb context.  */
25323     ctx->hflags = (uint32_t)ctx->base.tb->flags; /* FIXME: maybe use 64 bits? */
25324     ctx->ulri = (env->CP0_Config3 >> CP0C3_ULRI) & 1;
25325     ctx->ps = ((env->active_fpu.fcr0 >> FCR0_PS) & 1) ||
25326              (env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F));
25327     ctx->vp = (env->CP0_Config5 >> CP0C5_VP) & 1;
25328     ctx->mrp = (env->CP0_Config5 >> CP0C5_MRP) & 1;
25329     ctx->nan2008 = (env->active_fpu.fcr31 >> FCR31_NAN2008) & 1;
25330     ctx->abs2008 = (env->active_fpu.fcr31 >> FCR31_ABS2008) & 1;
25331     restore_cpu_state(env, ctx);
25332 #ifdef CONFIG_USER_ONLY
25333         ctx->mem_idx = MIPS_HFLAG_UM;
25334 #else
25335         ctx->mem_idx = hflags_mmu_index(ctx->hflags);
25336 #endif
25337     ctx->default_tcg_memop_mask = (ctx->insn_flags & ISA_MIPS32R6) ?
25338                                   MO_UNALN : MO_ALIGN;
25339
25340     LOG_DISAS("\ntb %p idx %d hflags %04x\n", ctx->base.tb, ctx->mem_idx,
25341               ctx->hflags);
25342 }
25343
25344 static void mips_tr_tb_start(DisasContextBase *dcbase, CPUState *cs)
25345 {
25346 }
25347
25348 static void mips_tr_insn_start(DisasContextBase *dcbase, CPUState *cs)
25349 {
25350     DisasContext *ctx = container_of(dcbase, DisasContext, base);
25351
25352     tcg_gen_insn_start(ctx->base.pc_next, ctx->hflags & MIPS_HFLAG_BMASK,
25353                        ctx->btarget);
25354 }
25355
25356 static bool mips_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *cs,
25357                                      const CPUBreakpoint *bp)
25358 {
25359     DisasContext *ctx = container_of(dcbase, DisasContext, base);
25360
25361     save_cpu_state(ctx, 1);
25362     ctx->base.is_jmp = DISAS_NORETURN;
25363     gen_helper_raise_exception_debug(cpu_env);
25364     /* The address covered by the breakpoint must be included in
25365        [tb->pc, tb->pc + tb->size) in order to for it to be
25366        properly cleared -- thus we increment the PC here so that
25367        the logic setting tb->size below does the right thing.  */
25368     ctx->base.pc_next += 4;
25369     return true;
25370 }
25371
25372 static void mips_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
25373 {
25374     CPUMIPSState *env = cs->env_ptr;
25375     DisasContext *ctx = container_of(dcbase, DisasContext, base);
25376     int insn_bytes;
25377     int is_slot;
25378
25379     is_slot = ctx->hflags & MIPS_HFLAG_BMASK;
25380     if (ctx->insn_flags & ISA_NANOMIPS32) {
25381         ctx->opcode = cpu_lduw_code(env, ctx->base.pc_next);
25382         insn_bytes = decode_nanomips_opc(env, ctx);
25383     } else if (!(ctx->hflags & MIPS_HFLAG_M16)) {
25384         ctx->opcode = cpu_ldl_code(env, ctx->base.pc_next);
25385         insn_bytes = 4;
25386         decode_opc(env, ctx);
25387     } else if (ctx->insn_flags & ASE_MICROMIPS) {
25388         ctx->opcode = cpu_lduw_code(env, ctx->base.pc_next);
25389         insn_bytes = decode_micromips_opc(env, ctx);
25390     } else if (ctx->insn_flags & ASE_MIPS16) {
25391         ctx->opcode = cpu_lduw_code(env, ctx->base.pc_next);
25392         insn_bytes = decode_mips16_opc(env, ctx);
25393     } else {
25394         generate_exception_end(ctx, EXCP_RI);
25395         g_assert(ctx->base.is_jmp == DISAS_NORETURN);
25396         return;
25397     }
25398
25399     if (ctx->hflags & MIPS_HFLAG_BMASK) {
25400         if (!(ctx->hflags & (MIPS_HFLAG_BDS16 | MIPS_HFLAG_BDS32 |
25401                              MIPS_HFLAG_FBNSLOT))) {
25402             /* force to generate branch as there is neither delay nor
25403                forbidden slot */
25404             is_slot = 1;
25405         }
25406         if ((ctx->hflags & MIPS_HFLAG_M16) &&
25407             (ctx->hflags & MIPS_HFLAG_FBNSLOT)) {
25408             /* Force to generate branch as microMIPS R6 doesn't restrict
25409                branches in the forbidden slot. */
25410             is_slot = 1;
25411         }
25412     }
25413     if (is_slot) {
25414         gen_branch(ctx, insn_bytes);
25415     }
25416     ctx->base.pc_next += insn_bytes;
25417
25418     if (ctx->base.is_jmp != DISAS_NEXT) {
25419         return;
25420     }
25421     /* Execute a branch and its delay slot as a single instruction.
25422        This is what GDB expects and is consistent with what the
25423        hardware does (e.g. if a delay slot instruction faults, the
25424        reported PC is the PC of the branch).  */
25425     if (ctx->base.singlestep_enabled &&
25426         (ctx->hflags & MIPS_HFLAG_BMASK) == 0) {
25427         ctx->base.is_jmp = DISAS_TOO_MANY;
25428     }
25429     if (ctx->base.pc_next - ctx->page_start >= TARGET_PAGE_SIZE) {
25430         ctx->base.is_jmp = DISAS_TOO_MANY;
25431     }
25432 }
25433
25434 static void mips_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
25435 {
25436     DisasContext *ctx = container_of(dcbase, DisasContext, base);
25437
25438     if (ctx->base.singlestep_enabled && ctx->base.is_jmp != DISAS_NORETURN) {
25439         save_cpu_state(ctx, ctx->base.is_jmp != DISAS_EXIT);
25440         gen_helper_raise_exception_debug(cpu_env);
25441     } else {
25442         switch (ctx->base.is_jmp) {
25443         case DISAS_STOP:
25444             gen_save_pc(ctx->base.pc_next);
25445             tcg_gen_lookup_and_goto_ptr();
25446             break;
25447         case DISAS_NEXT:
25448         case DISAS_TOO_MANY:
25449             save_cpu_state(ctx, 0);
25450             gen_goto_tb(ctx, 0, ctx->base.pc_next);
25451             break;
25452         case DISAS_EXIT:
25453             tcg_gen_exit_tb(NULL, 0);
25454             break;
25455         case DISAS_NORETURN:
25456             break;
25457         default:
25458             g_assert_not_reached();
25459         }
25460     }
25461 }
25462
25463 static void mips_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
25464 {
25465     qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
25466     log_target_disas(cs, dcbase->pc_first, dcbase->tb->size);
25467 }
25468
25469 static const TranslatorOps mips_tr_ops = {
25470     .init_disas_context = mips_tr_init_disas_context,
25471     .tb_start           = mips_tr_tb_start,
25472     .insn_start         = mips_tr_insn_start,
25473     .breakpoint_check   = mips_tr_breakpoint_check,
25474     .translate_insn     = mips_tr_translate_insn,
25475     .tb_stop            = mips_tr_tb_stop,
25476     .disas_log          = mips_tr_disas_log,
25477 };
25478
25479 void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
25480 {
25481     DisasContext ctx;
25482
25483     translator_loop(&mips_tr_ops, &ctx.base, cs, tb);
25484 }
25485
25486 static void fpu_dump_state(CPUMIPSState *env, FILE *f, fprintf_function fpu_fprintf,
25487                            int flags)
25488 {
25489     int i;
25490     int is_fpu64 = !!(env->hflags & MIPS_HFLAG_F64);
25491
25492 #define printfpr(fp)                                                    \
25493     do {                                                                \
25494         if (is_fpu64)                                                   \
25495             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
25496                         " fd:%13g fs:%13g psu: %13g\n",                 \
25497                         (fp)->w[FP_ENDIAN_IDX], (fp)->d,                \
25498                         (double)(fp)->fd,                               \
25499                         (double)(fp)->fs[FP_ENDIAN_IDX],                \
25500                         (double)(fp)->fs[!FP_ENDIAN_IDX]);              \
25501         else {                                                          \
25502             fpr_t tmp;                                                  \
25503             tmp.w[FP_ENDIAN_IDX] = (fp)->w[FP_ENDIAN_IDX];              \
25504             tmp.w[!FP_ENDIAN_IDX] = ((fp) + 1)->w[FP_ENDIAN_IDX];       \
25505             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
25506                         " fd:%13g fs:%13g psu:%13g\n",                  \
25507                         tmp.w[FP_ENDIAN_IDX], tmp.d,                    \
25508                         (double)tmp.fd,                                 \
25509                         (double)tmp.fs[FP_ENDIAN_IDX],                  \
25510                         (double)tmp.fs[!FP_ENDIAN_IDX]);                \
25511         }                                                               \
25512     } while(0)
25513
25514
25515     fpu_fprintf(f, "CP1 FCR0 0x%08x  FCR31 0x%08x  SR.FR %d  fp_status 0x%02x\n",
25516                 env->active_fpu.fcr0, env->active_fpu.fcr31, is_fpu64,
25517                 get_float_exception_flags(&env->active_fpu.fp_status));
25518     for (i = 0; i < 32; (is_fpu64) ? i++ : (i += 2)) {
25519         fpu_fprintf(f, "%3s: ", fregnames[i]);
25520         printfpr(&env->active_fpu.fpr[i]);
25521     }
25522
25523 #undef printfpr
25524 }
25525
25526 void mips_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
25527                          int flags)
25528 {
25529     MIPSCPU *cpu = MIPS_CPU(cs);
25530     CPUMIPSState *env = &cpu->env;
25531     int i;
25532
25533     cpu_fprintf(f, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx
25534                 " LO=0x" TARGET_FMT_lx " ds %04x "
25535                 TARGET_FMT_lx " " TARGET_FMT_ld "\n",
25536                 env->active_tc.PC, env->active_tc.HI[0], env->active_tc.LO[0],
25537                 env->hflags, env->btarget, env->bcond);
25538     for (i = 0; i < 32; i++) {
25539         if ((i & 3) == 0)
25540             cpu_fprintf(f, "GPR%02d:", i);
25541         cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], env->active_tc.gpr[i]);
25542         if ((i & 3) == 3)
25543             cpu_fprintf(f, "\n");
25544     }
25545
25546     cpu_fprintf(f, "CP0 Status  0x%08x Cause   0x%08x EPC    0x" TARGET_FMT_lx "\n",
25547                 env->CP0_Status, env->CP0_Cause, env->CP0_EPC);
25548     cpu_fprintf(f, "    Config0 0x%08x Config1 0x%08x LLAddr 0x%016"
25549                 PRIx64 "\n",
25550                 env->CP0_Config0, env->CP0_Config1, env->lladdr);
25551     cpu_fprintf(f, "    Config2 0x%08x Config3 0x%08x\n",
25552                 env->CP0_Config2, env->CP0_Config3);
25553     cpu_fprintf(f, "    Config4 0x%08x Config5 0x%08x\n",
25554                 env->CP0_Config4, env->CP0_Config5);
25555     if ((flags & CPU_DUMP_FPU) && (env->hflags & MIPS_HFLAG_FPU)) {
25556         fpu_dump_state(env, f, cpu_fprintf, flags);
25557     }
25558 }
25559
25560 void mips_tcg_init(void)
25561 {
25562     int i;
25563
25564     cpu_gpr[0] = NULL;
25565     for (i = 1; i < 32; i++)
25566         cpu_gpr[i] = tcg_global_mem_new(cpu_env,
25567                                         offsetof(CPUMIPSState, active_tc.gpr[i]),
25568                                         regnames[i]);
25569
25570     for (i = 0; i < 32; i++) {
25571         int off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[0]);
25572         msa_wr_d[i * 2] =
25573                 tcg_global_mem_new_i64(cpu_env, off, msaregnames[i * 2]);
25574         /* The scalar floating-point unit (FPU) registers are mapped on
25575          * the MSA vector registers. */
25576         fpu_f64[i] = msa_wr_d[i * 2];
25577         off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[1]);
25578         msa_wr_d[i * 2 + 1] =
25579                 tcg_global_mem_new_i64(cpu_env, off, msaregnames[i * 2 + 1]);
25580     }
25581
25582     cpu_PC = tcg_global_mem_new(cpu_env,
25583                                 offsetof(CPUMIPSState, active_tc.PC), "PC");
25584     for (i = 0; i < MIPS_DSP_ACC; i++) {
25585         cpu_HI[i] = tcg_global_mem_new(cpu_env,
25586                                        offsetof(CPUMIPSState, active_tc.HI[i]),
25587                                        regnames_HI[i]);
25588         cpu_LO[i] = tcg_global_mem_new(cpu_env,
25589                                        offsetof(CPUMIPSState, active_tc.LO[i]),
25590                                        regnames_LO[i]);
25591     }
25592     cpu_dspctrl = tcg_global_mem_new(cpu_env,
25593                                      offsetof(CPUMIPSState, active_tc.DSPControl),
25594                                      "DSPControl");
25595     bcond = tcg_global_mem_new(cpu_env,
25596                                offsetof(CPUMIPSState, bcond), "bcond");
25597     btarget = tcg_global_mem_new(cpu_env,
25598                                  offsetof(CPUMIPSState, btarget), "btarget");
25599     hflags = tcg_global_mem_new_i32(cpu_env,
25600                                     offsetof(CPUMIPSState, hflags), "hflags");
25601
25602     fpu_fcr0 = tcg_global_mem_new_i32(cpu_env,
25603                                       offsetof(CPUMIPSState, active_fpu.fcr0),
25604                                       "fcr0");
25605     fpu_fcr31 = tcg_global_mem_new_i32(cpu_env,
25606                                        offsetof(CPUMIPSState, active_fpu.fcr31),
25607                                        "fcr31");
25608 }
25609
25610 #include "translate_init.inc.c"
25611
25612 void cpu_mips_realize_env(CPUMIPSState *env)
25613 {
25614     env->exception_base = (int32_t)0xBFC00000;
25615
25616 #ifndef CONFIG_USER_ONLY
25617     mmu_init(env, env->cpu_model);
25618 #endif
25619     fpu_init(env, env->cpu_model);
25620     mvp_init(env, env->cpu_model);
25621 }
25622
25623 bool cpu_supports_cps_smp(const char *cpu_type)
25624 {
25625     const MIPSCPUClass *mcc = MIPS_CPU_CLASS(object_class_by_name(cpu_type));
25626     return (mcc->cpu_def->CP0_Config3 & (1 << CP0C3_CMGCR)) != 0;
25627 }
25628
25629 bool cpu_supports_isa(const char *cpu_type, unsigned int isa)
25630 {
25631     const MIPSCPUClass *mcc = MIPS_CPU_CLASS(object_class_by_name(cpu_type));
25632     return (mcc->cpu_def->insn_flags & isa) != 0;
25633 }
25634
25635 void cpu_set_exception_base(int vp_index, target_ulong address)
25636 {
25637     MIPSCPU *vp = MIPS_CPU(qemu_get_cpu(vp_index));
25638     vp->env.exception_base = address;
25639 }
25640
25641 void cpu_state_reset(CPUMIPSState *env)
25642 {
25643     MIPSCPU *cpu = mips_env_get_cpu(env);
25644     CPUState *cs = CPU(cpu);
25645
25646     /* Reset registers to their default values */
25647     env->CP0_PRid = env->cpu_model->CP0_PRid;
25648     env->CP0_Config0 = env->cpu_model->CP0_Config0;
25649 #ifdef TARGET_WORDS_BIGENDIAN
25650     env->CP0_Config0 |= (1 << CP0C0_BE);
25651 #endif
25652     env->CP0_Config1 = env->cpu_model->CP0_Config1;
25653     env->CP0_Config2 = env->cpu_model->CP0_Config2;
25654     env->CP0_Config3 = env->cpu_model->CP0_Config3;
25655     env->CP0_Config4 = env->cpu_model->CP0_Config4;
25656     env->CP0_Config4_rw_bitmask = env->cpu_model->CP0_Config4_rw_bitmask;
25657     env->CP0_Config5 = env->cpu_model->CP0_Config5;
25658     env->CP0_Config5_rw_bitmask = env->cpu_model->CP0_Config5_rw_bitmask;
25659     env->CP0_Config6 = env->cpu_model->CP0_Config6;
25660     env->CP0_Config7 = env->cpu_model->CP0_Config7;
25661     env->CP0_LLAddr_rw_bitmask = env->cpu_model->CP0_LLAddr_rw_bitmask
25662                                  << env->cpu_model->CP0_LLAddr_shift;
25663     env->CP0_LLAddr_shift = env->cpu_model->CP0_LLAddr_shift;
25664     env->SYNCI_Step = env->cpu_model->SYNCI_Step;
25665     env->CCRes = env->cpu_model->CCRes;
25666     env->CP0_Status_rw_bitmask = env->cpu_model->CP0_Status_rw_bitmask;
25667     env->CP0_TCStatus_rw_bitmask = env->cpu_model->CP0_TCStatus_rw_bitmask;
25668     env->CP0_SRSCtl = env->cpu_model->CP0_SRSCtl;
25669     env->current_tc = 0;
25670     env->SEGBITS = env->cpu_model->SEGBITS;
25671     env->SEGMask = (target_ulong)((1ULL << env->cpu_model->SEGBITS) - 1);
25672 #if defined(TARGET_MIPS64)
25673     if (env->cpu_model->insn_flags & ISA_MIPS3) {
25674         env->SEGMask |= 3ULL << 62;
25675     }
25676 #endif
25677     env->PABITS = env->cpu_model->PABITS;
25678     env->CP0_SRSConf0_rw_bitmask = env->cpu_model->CP0_SRSConf0_rw_bitmask;
25679     env->CP0_SRSConf0 = env->cpu_model->CP0_SRSConf0;
25680     env->CP0_SRSConf1_rw_bitmask = env->cpu_model->CP0_SRSConf1_rw_bitmask;
25681     env->CP0_SRSConf1 = env->cpu_model->CP0_SRSConf1;
25682     env->CP0_SRSConf2_rw_bitmask = env->cpu_model->CP0_SRSConf2_rw_bitmask;
25683     env->CP0_SRSConf2 = env->cpu_model->CP0_SRSConf2;
25684     env->CP0_SRSConf3_rw_bitmask = env->cpu_model->CP0_SRSConf3_rw_bitmask;
25685     env->CP0_SRSConf3 = env->cpu_model->CP0_SRSConf3;
25686     env->CP0_SRSConf4_rw_bitmask = env->cpu_model->CP0_SRSConf4_rw_bitmask;
25687     env->CP0_SRSConf4 = env->cpu_model->CP0_SRSConf4;
25688     env->CP0_PageGrain_rw_bitmask = env->cpu_model->CP0_PageGrain_rw_bitmask;
25689     env->CP0_PageGrain = env->cpu_model->CP0_PageGrain;
25690     env->CP0_EBaseWG_rw_bitmask = env->cpu_model->CP0_EBaseWG_rw_bitmask;
25691     env->active_fpu.fcr0 = env->cpu_model->CP1_fcr0;
25692     env->active_fpu.fcr31_rw_bitmask = env->cpu_model->CP1_fcr31_rw_bitmask;
25693     env->active_fpu.fcr31 = env->cpu_model->CP1_fcr31;
25694     env->msair = env->cpu_model->MSAIR;
25695     env->insn_flags = env->cpu_model->insn_flags;
25696
25697 #if defined(CONFIG_USER_ONLY)
25698     env->CP0_Status = (MIPS_HFLAG_UM << CP0St_KSU);
25699 # ifdef TARGET_MIPS64
25700     /* Enable 64-bit register mode.  */
25701     env->CP0_Status |= (1 << CP0St_PX);
25702 # endif
25703 # ifdef TARGET_ABI_MIPSN64
25704     /* Enable 64-bit address mode.  */
25705     env->CP0_Status |= (1 << CP0St_UX);
25706 # endif
25707     /* Enable access to the CPUNum, SYNCI_Step, CC, and CCRes RDHWR
25708        hardware registers.  */
25709     env->CP0_HWREna |= 0x0000000F;
25710     if (env->CP0_Config1 & (1 << CP0C1_FP)) {
25711         env->CP0_Status |= (1 << CP0St_CU1);
25712     }
25713     if (env->CP0_Config3 & (1 << CP0C3_DSPP)) {
25714         env->CP0_Status |= (1 << CP0St_MX);
25715     }
25716 # if defined(TARGET_MIPS64)
25717     /* For MIPS64, init FR bit to 1 if FPU unit is there and bit is writable. */
25718     if ((env->CP0_Config1 & (1 << CP0C1_FP)) &&
25719         (env->CP0_Status_rw_bitmask & (1 << CP0St_FR))) {
25720         env->CP0_Status |= (1 << CP0St_FR);
25721     }
25722 # endif
25723 #else
25724     if (env->hflags & MIPS_HFLAG_BMASK) {
25725         /* If the exception was raised from a delay slot,
25726            come back to the jump.  */
25727         env->CP0_ErrorEPC = (env->active_tc.PC
25728                              - (env->hflags & MIPS_HFLAG_B16 ? 2 : 4));
25729     } else {
25730         env->CP0_ErrorEPC = env->active_tc.PC;
25731     }
25732     env->active_tc.PC = env->exception_base;
25733     env->CP0_Random = env->tlb->nb_tlb - 1;
25734     env->tlb->tlb_in_use = env->tlb->nb_tlb;
25735     env->CP0_Wired = 0;
25736     env->CP0_GlobalNumber = (cs->cpu_index & 0xFF) << CP0GN_VPId;
25737     env->CP0_EBase = (cs->cpu_index & 0x3FF);
25738     if (mips_um_ksegs_enabled()) {
25739         env->CP0_EBase |= 0x40000000;
25740     } else {
25741         env->CP0_EBase |= (int32_t)0x80000000;
25742     }
25743     if (env->CP0_Config3 & (1 << CP0C3_CMGCR)) {
25744         env->CP0_CMGCRBase = 0x1fbf8000 >> 4;
25745     }
25746     env->CP0_EntryHi_ASID_mask = (env->CP0_Config4 & (1 << CP0C4_AE)) ?
25747                                  0x3ff : 0xff;
25748     env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
25749     /* vectored interrupts not implemented, timer on int 7,
25750        no performance counters. */
25751     env->CP0_IntCtl = 0xe0000000;
25752     {
25753         int i;
25754
25755         for (i = 0; i < 7; i++) {
25756             env->CP0_WatchLo[i] = 0;
25757             env->CP0_WatchHi[i] = 0x80000000;
25758         }
25759         env->CP0_WatchLo[7] = 0;
25760         env->CP0_WatchHi[7] = 0;
25761     }
25762     /* Count register increments in debug mode, EJTAG version 1 */
25763     env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
25764
25765     cpu_mips_store_count(env, 1);
25766
25767     if (env->CP0_Config3 & (1 << CP0C3_MT)) {
25768         int i;
25769
25770         /* Only TC0 on VPE 0 starts as active.  */
25771         for (i = 0; i < ARRAY_SIZE(env->tcs); i++) {
25772             env->tcs[i].CP0_TCBind = cs->cpu_index << CP0TCBd_CurVPE;
25773             env->tcs[i].CP0_TCHalt = 1;
25774         }
25775         env->active_tc.CP0_TCHalt = 1;
25776         cs->halted = 1;
25777
25778         if (cs->cpu_index == 0) {
25779             /* VPE0 starts up enabled.  */
25780             env->mvp->CP0_MVPControl |= (1 << CP0MVPCo_EVP);
25781             env->CP0_VPEConf0 |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA);
25782
25783             /* TC0 starts up unhalted.  */
25784             cs->halted = 0;
25785             env->active_tc.CP0_TCHalt = 0;
25786             env->tcs[0].CP0_TCHalt = 0;
25787             /* With thread 0 active.  */
25788             env->active_tc.CP0_TCStatus = (1 << CP0TCSt_A);
25789             env->tcs[0].CP0_TCStatus = (1 << CP0TCSt_A);
25790         }
25791     }
25792
25793     /*
25794      * Configure default legacy segmentation control. We use this regardless of
25795      * whether segmentation control is presented to the guest.
25796      */
25797     /* KSeg3 (seg0 0xE0000000..0xFFFFFFFF) */
25798     env->CP0_SegCtl0 =   (CP0SC_AM_MK << CP0SC_AM);
25799     /* KSeg2 (seg1 0xC0000000..0xDFFFFFFF) */
25800     env->CP0_SegCtl0 |= ((CP0SC_AM_MSK << CP0SC_AM)) << 16;
25801     /* KSeg1 (seg2 0xA0000000..0x9FFFFFFF) */
25802     env->CP0_SegCtl1 =   (0 << CP0SC_PA) | (CP0SC_AM_UK << CP0SC_AM) |
25803                          (2 << CP0SC_C);
25804     /* KSeg0 (seg3 0x80000000..0x9FFFFFFF) */
25805     env->CP0_SegCtl1 |= ((0 << CP0SC_PA) | (CP0SC_AM_UK << CP0SC_AM) |
25806                          (3 << CP0SC_C)) << 16;
25807     /* USeg (seg4 0x40000000..0x7FFFFFFF) */
25808     env->CP0_SegCtl2 =   (2 << CP0SC_PA) | (CP0SC_AM_MUSK << CP0SC_AM) |
25809                          (1 << CP0SC_EU) | (2 << CP0SC_C);
25810     /* USeg (seg5 0x00000000..0x3FFFFFFF) */
25811     env->CP0_SegCtl2 |= ((0 << CP0SC_PA) | (CP0SC_AM_MUSK << CP0SC_AM) |
25812                          (1 << CP0SC_EU) | (2 << CP0SC_C)) << 16;
25813     /* XKPhys (note, SegCtl2.XR = 0, so XAM won't be used) */
25814     env->CP0_SegCtl1 |= (CP0SC_AM_UK << CP0SC1_XAM);
25815 #endif
25816     if ((env->insn_flags & ISA_MIPS32R6) &&
25817         (env->active_fpu.fcr0 & (1 << FCR0_F64))) {
25818         /* Status.FR = 0 mode in 64-bit FPU not allowed in R6 */
25819         env->CP0_Status |= (1 << CP0St_FR);
25820     }
25821
25822     if (env->CP0_Config3 & (1 << CP0C3_ISA) & (1 << (CP0C3_ISA + 1))) {
25823         /*  microMIPS on reset when Config3.ISA is 3 */
25824         env->hflags |= MIPS_HFLAG_M16;
25825     }
25826
25827     /* MSA */
25828     if (env->CP0_Config3 & (1 << CP0C3_MSAP)) {
25829         msa_reset(env);
25830     }
25831
25832     compute_hflags(env);
25833     restore_fp_status(env);
25834     restore_pamask(env);
25835     cs->exception_index = EXCP_NONE;
25836
25837     if (semihosting_get_argc()) {
25838         /* UHI interface can be used to obtain argc and argv */
25839         env->active_tc.gpr[4] = -1;
25840     }
25841 }
25842
25843 void restore_state_to_opc(CPUMIPSState *env, TranslationBlock *tb,
25844                           target_ulong *data)
25845 {
25846     env->active_tc.PC = data[0];
25847     env->hflags &= ~MIPS_HFLAG_BMASK;
25848     env->hflags |= data[1];
25849     switch (env->hflags & MIPS_HFLAG_BMASK_BASE) {
25850     case MIPS_HFLAG_BR:
25851         break;
25852     case MIPS_HFLAG_BC:
25853     case MIPS_HFLAG_BL:
25854     case MIPS_HFLAG_B:
25855         env->btarget = data[2];
25856         break;
25857     }
25858 }
This page took 1.397433 seconds and 2 git commands to generate.