]> Git Repo - qemu.git/blob - target/mips/translate.c
target/mips: Add a placeholder for R5900 MMI1 instruction subclass
[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  * The notation used in MXU assembler mnemonics:
1406  *
1407  *   XRa, XRb, XRc, XRd - MXU registers
1408  *   Rb, Rc, Rd, Rs, Rt - general purpose MIPS registers
1409  *   s12                - a subfield of an instruction code
1410  *   strd2              - a subfield of an instruction code
1411  *   eptn2              - a subfield of an instruction code
1412  *   eptn3              - a subfield of an instruction code
1413  *   optn2              - a subfield of an instruction code
1414  *   optn3              - a subfield of an instruction code
1415  *   sft4               - a subfield of an instruction code
1416  *
1417  * Load/Store instructions           Multiplication instructions
1418  * -----------------------           ---------------------------
1419  *
1420  *  S32LDD XRa, Rb, s12               S32MADD XRa, XRd, Rs, Rt
1421  *  S32STD XRa, Rb, s12               S32MADDU XRa, XRd, Rs, Rt
1422  *  S32LDDV XRa, Rb, rc, strd2        S32SUB XRa, XRd, Rs, Rt
1423  *  S32STDV XRa, Rb, rc, strd2        S32SUBU XRa, XRd, Rs, Rt
1424  *  S32LDI XRa, Rb, s12               S32MUL XRa, XRd, Rs, Rt
1425  *  S32SDI XRa, Rb, s12               S32MULU XRa, XRd, Rs, Rt
1426  *  S32LDIV XRa, Rb, rc, strd2        D16MUL XRa, XRb, XRc, XRd, optn2
1427  *  S32SDIV XRa, Rb, rc, strd2        D16MULE XRa, XRb, XRc, optn2
1428  *  S32LDDR XRa, Rb, s12              D16MULF XRa, XRb, XRc, optn2
1429  *  S32STDR XRa, Rb, s12              D16MAC XRa, XRb, XRc, XRd, aptn2, optn2
1430  *  S32LDDVR XRa, Rb, rc, strd2       D16MACE XRa, XRb, XRc, XRd, aptn2, optn2
1431  *  S32STDVR XRa, Rb, rc, strd2       D16MACF XRa, XRb, XRc, XRd, aptn2, optn2
1432  *  S32LDIR XRa, Rb, s12              D16MADL XRa, XRb, XRc, XRd, aptn2, optn2
1433  *  S32SDIR XRa, Rb, s12              S16MAD XRa, XRb, XRc, XRd, aptn1, optn2
1434  *  S32LDIVR XRa, Rb, rc, strd2       Q8MUL XRa, XRb, XRc, XRd
1435  *  S32SDIVR XRa, Rb, rc, strd2       Q8MULSU XRa, XRb, XRc, XRd
1436  *  S16LDD XRa, Rb, s10, eptn2        Q8MAC XRa, XRb, XRc, XRd, aptn2
1437  *  S16STD XRa, Rb, s10, eptn2        Q8MACSU XRa, XRb, XRc, XRd, aptn2
1438  *  S16LDI XRa, Rb, s10, eptn2        Q8MADL XRa, XRb, XRc, XRd, aptn2
1439  *  S16SDI XRa, Rb, s10, eptn2
1440  *  S8LDD XRa, Rb, s8, eptn3
1441  *  S8STD XRa, Rb, s8, eptn3         Addition and subtraction instructions
1442  *  S8LDI XRa, Rb, s8, eptn3         -------------------------------------
1443  *  S8SDI XRa, Rb, s8, eptn3
1444  *  LXW Rd, Rs, Rt, strd2             D32ADD XRa, XRb, XRc, XRd, eptn2
1445  *  LXH Rd, Rs, Rt, strd2             D32ADDC XRa, XRb, XRc, XRd
1446  *  LXHU Rd, Rs, Rt, strd2            D32ACC XRa, XRb, XRc, XRd, eptn2
1447  *  LXB Rd, Rs, Rt, strd2             D32ACCM XRa, XRb, XRc, XRd, eptn2
1448  *  LXBU Rd, Rs, Rt, strd2            D32ASUM XRa, XRb, XRc, XRd, eptn2
1449  *                                    S32CPS XRa, XRb, XRc
1450  *                                    Q16ADD XRa, XRb, XRc, XRd, eptn2, optn2
1451  * Comparison instructions            Q16ACC XRa, XRb, XRc, XRd, eptn2
1452  * -----------------------            Q16ACCM XRa, XRb, XRc, XRd, eptn2
1453  *                                    D16ASUM XRa, XRb, XRc, XRd, eptn2
1454  *  S32MAX XRa, XRb, XRc              D16CPS XRa, XRb,
1455  *  S32MIN XRa, XRb, XRc              D16AVG XRa, XRb, XRc
1456  *  S32SLT XRa, XRb, XRc              D16AVGR XRa, XRb, XRc
1457  *  S32MOVZ XRa, XRb, XRc             Q8ADD XRa, XRb, XRc, eptn2
1458  *  S32MOVN XRa, XRb, XRc             Q8ADDE XRa, XRb, XRc, XRd, eptn2
1459  *  D16MAX XRa, XRb, XRc              Q8ACCE XRa, XRb, XRc, XRd, eptn2
1460  *  D16MIN XRa, XRb, XRc              Q8ABD XRa, XRb, XRc
1461  *  D16SLT XRa, XRb, XRc              Q8SAD XRa, XRb, XRc, XRd
1462  *  D16MOVZ XRa, XRb, XRc             Q8AVG XRa, XRb, XRc
1463  *  D16MOVN XRa, XRb, XRc             Q8AVGR XRa, XRb, XRc
1464  *  Q8MAX XRa, XRb, XRc               D8SUM XRa, XRb, XRc, XRd
1465  *  Q8MIN XRa, XRb, XRc               D8SUMC XRa, XRb, XRc, XRd
1466  *  Q8SLT XRa, XRb, XRc
1467  *  Q8SLTU XRa, XRb, XRc
1468  *  Q8MOVZ XRa, XRb, XRc             Shift instructions
1469  *  Q8MOVN XRa, XRb, XRc             ------------------
1470  *
1471  *                                    D32SLL XRa, XRb, XRc, XRd, sft4
1472  * Bitwise instructions               D32SLR XRa, XRb, XRc, XRd, sft4
1473  * --------------------               D32SAR XRa, XRb, XRc, XRd, sft4
1474  *                                    D32SARL XRa, XRb, XRc, sft4
1475  *  S32NOR XRa, XRb, XRc              D32SLLV XRa, XRb, Rb
1476  *  S32AND XRa, XRb, XRc              D32SLRV XRa, XRb, Rb
1477  *  S32XOR XRa, XRb, XRc              D32SARV XRa, XRb, Rb
1478  *  S32OR XRa, XRb, XRc               D32SARW XRa, XRb, XRc, Rb
1479  *                                    Q16SLL XRa, XRb, XRc, XRd, sft4
1480  *                                    Q16SLR XRa, XRb, XRc, XRd, sft4
1481  * Miscelaneous instructions          Q16SAR XRa, XRb, XRc, XRd, sft4
1482  * -------------------------          Q16SLLV XRa, XRb, Rb
1483  *                                    Q16SLRV XRa, XRb, Rb
1484  *  S32SFL XRa, XRb, XRc, XRd, optn2  Q16SARV XRa, XRb, Rb
1485  *  S32ALN XRa, XRb, XRc, Rb
1486  *  S32ALNI XRa, XRb, XRc, s3
1487  *  S32LUI XRa, s8, optn3            Move instructions
1488  *  S32EXTR XRa, XRb, Rb, bits5      -----------------
1489  *  S32EXTRV XRa, XRb, Rs, Rt
1490  *  Q16SCOP XRa, XRb, XRc, XRd        S32M2I XRa, Rb
1491  *  Q16SAT XRa, XRb, XRc              S32I2M XRa, Rb
1492  *
1493  *
1494  *              bits
1495  *             05..00
1496  *
1497  *          â”Œâ”€ 000000 â”€ OPC_MXU_S32MADD
1498  *          â”œâ”€ 000001 â”€ OPC_MXU_S32MADDU
1499  *          â”œâ”€ 000010 â”€ <not assigned>
1500  *          â”‚                               20..18
1501  *          â”œâ”€ 000011 â”€ OPC_MXU__POOL00 â”€â”¬â”€ 000 â”€ OPC_MXU_S32MAX
1502  *          â”‚                            â”œâ”€ 001 â”€ OPC_MXU_S32MIN
1503  *          â”‚                            â”œâ”€ 010 â”€ OPC_MXU_D16MAX
1504  *          â”‚                            â”œâ”€ 011 â”€ OPC_MXU_D16MIN
1505  *          â”‚                            â”œâ”€ 100 â”€ OPC_MXU_Q8MAX
1506  *          â”‚                            â”œâ”€ 101 â”€ OPC_MXU_Q8MIN
1507  *          â”‚                            â”œâ”€ 110 â”€ OPC_MXU_Q8SLT
1508  *          â”‚                            â””─ 111 â”€ OPC_MXU_Q8SLTU
1509  *          â”œâ”€ 000100 â”€ OPC_MXU_S32MSUB
1510  *          â”œâ”€ 000101 â”€ OPC_MXU_S32MSUBU    20..18
1511  *          â”œâ”€ 000110 â”€ OPC_MXU__POOL01 â”€â”¬â”€ 000 â”€ OPC_MXU_S32SLT
1512  *          â”‚                            â”œâ”€ 001 â”€ OPC_MXU_D16SLT
1513  *          â”‚                            â”œâ”€ 010 â”€ OPC_MXU_D16AVG
1514  *          â”‚                            â”œâ”€ 011 â”€ OPC_MXU_D16AVGR
1515  *          â”‚                            â”œâ”€ 100 â”€ OPC_MXU_Q8AVG
1516  *          â”‚                            â”œâ”€ 101 â”€ OPC_MXU_Q8AVGR
1517  *          â”‚                            â””─ 111 â”€ OPC_MXU_Q8ADD
1518  *          â”‚
1519  *          â”‚                               20..18
1520  *          â”œâ”€ 000111 â”€ OPC_MXU__POOL02 â”€â”¬â”€ 000 â”€ OPC_MXU_S32CPS
1521  *          â”‚                            â”œâ”€ 010 â”€ OPC_MXU_D16CPS
1522  *          â”‚                            â”œâ”€ 100 â”€ OPC_MXU_Q8ABD
1523  *          â”‚                            â””─ 110 â”€ OPC_MXU_Q16SAT
1524  *          â”œâ”€ 001000 â”€ OPC_MXU_D16MUL
1525  *          â”‚                               25..24
1526  *          â”œâ”€ 001001 â”€ OPC_MXU__POOL03 â”€â”¬â”€ 00 â”€ OPC_MXU_D16MULF
1527  *          â”‚                            â””─ 01 â”€ OPC_MXU_D16MULE
1528  *          â”œâ”€ 001010 â”€ OPC_MXU_D16MAC
1529  *          â”œâ”€ 001011 â”€ OPC_MXU_D16MACF
1530  *          â”œâ”€ 001100 â”€ OPC_MXU_D16MADL
1531  *          â”‚                               25..24
1532  *          â”œâ”€ 001101 â”€ OPC_MXU__POOL04 â”€â”¬â”€ 00 â”€ OPC_MXU_S16MAD
1533  *          â”‚                            â””─ 01 â”€ OPC_MXU_S16MAD_1
1534  *          â”œâ”€ 001110 â”€ OPC_MXU_Q16ADD
1535  *          â”œâ”€ 001111 â”€ OPC_MXU_D16MACE
1536  *          â”‚                               23
1537  *          â”œâ”€ 010000 â”€ OPC_MXU__POOL05 â”€â”¬â”€ 0 â”€ OPC_MXU_S32LDD
1538  *          â”‚                            â””─ 1 â”€ OPC_MXU_S32LDDR
1539  *          â”‚
1540  *          â”‚                               23
1541  *          â”œâ”€ 010001 â”€ OPC_MXU__POOL06 â”€â”¬â”€ 0 â”€ OPC_MXU_S32STD
1542  *          â”‚                            â””─ 1 â”€ OPC_MXU_S32STDR
1543  *          â”‚
1544  *          â”‚                               13..10
1545  *          â”œâ”€ 010010 â”€ OPC_MXU__POOL07 â”€â”¬â”€ 0000 â”€ OPC_MXU_S32LDDV
1546  *          â”‚                            â””─ 0001 â”€ OPC_MXU_S32LDDVR
1547  *          â”‚
1548  *          â”‚                               13..10
1549  *          â”œâ”€ 010011 â”€ OPC_MXU__POOL08 â”€â”¬â”€ 0000 â”€ OPC_MXU_S32STDV
1550  *          â”‚                            â””─ 0001 â”€ OPC_MXU_S32STDVR
1551  *          â”‚
1552  *          â”‚                               23
1553  *          â”œâ”€ 010100 â”€ OPC_MXU__POOL09 â”€â”¬â”€ 0 â”€ OPC_MXU_S32LDI
1554  *          â”‚                            â””─ 1 â”€ OPC_MXU_S32LDIR
1555  *          â”‚
1556  *          â”‚                               23
1557  *          â”œâ”€ 010101 â”€ OPC_MXU__POOL10 â”€â”¬â”€ 0 â”€ OPC_MXU_S32SDI
1558  *          â”‚                            â””─ 1 â”€ OPC_MXU_S32SDIR
1559  *          â”‚
1560  *          â”‚                               13..10
1561  *          â”œâ”€ 010110 â”€ OPC_MXU__POOL11 â”€â”¬â”€ 0000 â”€ OPC_MXU_S32LDIV
1562  *          â”‚                            â””─ 0001 â”€ OPC_MXU_S32LDIVR
1563  *          â”‚
1564  *          â”‚                               13..10
1565  *          â”œâ”€ 010111 â”€ OPC_MXU__POOL12 â”€â”¬â”€ 0000 â”€ OPC_MXU_S32SDIV
1566  *          â”‚                            â””─ 0001 â”€ OPC_MXU_S32SDIVR
1567  *          â”œâ”€ 011000 â”€ OPC_MXU_D32ADD
1568  *          â”‚                               23..22
1569  *   MXU    â”œâ”€ 011001 â”€ OPC_MXU__POOL13 â”€â”¬â”€ 00 â”€ OPC_MXU_D32ACC
1570  * opcodes â”€â”¤                            â”œâ”€ 01 â”€ OPC_MXU_D32ACCM
1571  *          â”‚                            â””─ 10 â”€ OPC_MXU_D32ASUM
1572  *          â”œâ”€ 011010 â”€ <not assigned>
1573  *          â”‚                               23..22
1574  *          â”œâ”€ 011011 â”€ OPC_MXU__POOL14 â”€â”¬â”€ 00 â”€ OPC_MXU_Q16ACC
1575  *          â”‚                            â”œâ”€ 01 â”€ OPC_MXU_Q16ACCM
1576  *          â”‚                            â””─ 10 â”€ OPC_MXU_Q16ASUM
1577  *          â”‚
1578  *          â”‚                               23..22
1579  *          â”œâ”€ 011100 â”€ OPC_MXU__POOL15 â”€â”¬â”€ 00 â”€ OPC_MXU_Q8ADDE
1580  *          â”‚                            â”œâ”€ 01 â”€ OPC_MXU_D8SUM
1581  *          â”œâ”€ 011101 â”€ OPC_MXU_Q8ACCE   â””─ 10 â”€ OPC_MXU_D8SUMC
1582  *          â”œâ”€ 011110 â”€ <not assigned>
1583  *          â”œâ”€ 011111 â”€ <not assigned>
1584  *          â”œâ”€ 100000 â”€ <not assigned>
1585  *          â”œâ”€ 100001 â”€ <not assigned>
1586  *          â”œâ”€ 100010 â”€ OPC_MXU_S8LDD
1587  *          â”œâ”€ 100011 â”€ OPC_MXU_S8STD
1588  *          â”œâ”€ 100100 â”€ OPC_MXU_S8LDI
1589  *          â”œâ”€ 100101 â”€ OPC_MXU_S8SDI
1590  *          â”‚                               15..14
1591  *          â”œâ”€ 100110 â”€ OPC_MXU__POOL16 â”€â”¬â”€ 00 â”€ OPC_MXU_S32MUL
1592  *          â”‚                            â”œâ”€ 00 â”€ OPC_MXU_S32MULU
1593  *          â”‚                            â”œâ”€ 00 â”€ OPC_MXU_S32EXTR
1594  *          â”‚                            â””─ 00 â”€ OPC_MXU_S32EXTRV
1595  *          â”‚
1596  *          â”‚                               20..18
1597  *          â”œâ”€ 100111 â”€ OPC_MXU__POOL17 â”€â”¬â”€ 000 â”€ OPC_MXU_D32SARW
1598  *          â”‚                            â”œâ”€ 001 â”€ OPC_MXU_S32ALN
1599  *          â”œâ”€ 101000 â”€ OPC_MXU_LXB      â”œâ”€ 010 â”€ OPC_MXU_S32ALNI
1600  *          â”œâ”€ 101001 â”€ <not assigned>   â”œâ”€ 011 â”€ OPC_MXU_S32NOR
1601  *          â”œâ”€ 101010 â”€ OPC_MXU_S16LDD   â”œâ”€ 100 â”€ OPC_MXU_S32AND
1602  *          â”œâ”€ 101011 â”€ OPC_MXU_S16STD   â”œâ”€ 101 â”€ OPC_MXU_S32OR
1603  *          â”œâ”€ 101100 â”€ OPC_MXU_S16LDI   â”œâ”€ 110 â”€ OPC_MXU_S32XOR
1604  *          â”œâ”€ 101101 â”€ OPC_MXU_S16SDI   â””─ 111 â”€ OPC_MXU_S32LUI
1605  *          â”œâ”€ 101000 â”€ <not assigned>
1606  *          â”œâ”€ 101001 â”€ <not assigned>
1607  *          â”œâ”€ 101010 â”€ <not assigned>
1608  *          â”œâ”€ 101011 â”€ <not assigned>
1609  *          â”œâ”€ 101100 â”€ <not assigned>
1610  *          â”œâ”€ 101101 â”€ <not assigned>
1611  *          â”œâ”€ 101110 â”€ OPC_MXU_S32M2I
1612  *          â”œâ”€ 101111 â”€ OPC_MXU_S32I2M
1613  *          â”œâ”€ 110000 â”€ OPC_MXU_D32SLL
1614  *          â”œâ”€ 110001 â”€ OPC_MXU_D32SLR
1615  *          â”œâ”€ 110010 â”€ OPC_MXU_D32SARL
1616  *          â”œâ”€ 110011 â”€ OPC_MXU_D32SAR
1617  *          â”œâ”€ 110100 â”€ OPC_MXU_Q16SLL
1618  *          â”œâ”€ 110101 â”€ OPC_MXU_Q16SLR      20..18
1619  *          â”œâ”€ 110110 â”€ OPC_MXU__POOL18 â”€â”¬â”€ 000 â”€ OPC_MXU_D32SLLV
1620  *          â”‚                            â”œâ”€ 001 â”€ OPC_MXU_D32SLRV
1621  *          â”‚                            â”œâ”€ 010 â”€ OPC_MXU_D32SARV
1622  *          â”‚                            â”œâ”€ 011 â”€ OPC_MXU_Q16SLLV
1623  *          â”‚                            â”œâ”€ 100 â”€ OPC_MXU_Q16SLRV
1624  *          â”‚                            â””─ 101 â”€ OPC_MXU_Q16SARV
1625  *          â”œâ”€ 110111 â”€ OPC_MXU_Q16SAR
1626  *          â”‚                               23..22
1627  *          â”œâ”€ 111000 â”€ OPC_MXU__POOL19 â”€â”¬â”€ 00 â”€ OPC_MXU_Q8MUL
1628  *          â”‚                            â””─ 01 â”€ OPC_MXU_Q8MULSU
1629  *          â”‚
1630  *          â”‚                               20..18
1631  *          â”œâ”€ 111001 â”€ OPC_MXU__POOL20 â”€â”¬â”€ 000 â”€ OPC_MXU_Q8MOVZ
1632  *          â”‚                            â”œâ”€ 001 â”€ OPC_MXU_Q8MOVN
1633  *          â”‚                            â”œâ”€ 010 â”€ OPC_MXU_D16MOVZ
1634  *          â”‚                            â”œâ”€ 011 â”€ OPC_MXU_D16MOVN
1635  *          â”‚                            â”œâ”€ 100 â”€ OPC_MXU_S32MOVZ
1636  *          â”‚                            â””─ 101 â”€ OPC_MXU_S32MOV
1637  *          â”‚
1638  *          â”‚                               23..22
1639  *          â”œâ”€ 111010 â”€ OPC_MXU__POOL21 â”€â”¬â”€ 00 â”€ OPC_MXU_Q8MAC
1640  *          â”‚                            â””─ 10 â”€ OPC_MXU_Q8MACSU
1641  *          â”œâ”€ 111011 â”€ OPC_MXU_Q16SCOP
1642  *          â”œâ”€ 111100 â”€ OPC_MXU_Q8MADL
1643  *          â”œâ”€ 111101 â”€ OPC_MXU_S32SFL
1644  *          â”œâ”€ 111110 â”€ OPC_MXU_Q8SAD
1645  *          â””─ 111111 â”€ <not assigned>
1646  *
1647  *
1648  *   Compiled after:
1649  *
1650  *   "XBurst® Instruction Set Architecture MIPS eXtension/enhanced Unit
1651  *   Programming Manual", Ingenic Semiconductor Co, Ltd., 2017
1652  */
1653
1654 enum {
1655     OPC_MXU_S32MADD  = 0x00,
1656     OPC_MXU_S32MADDU = 0x01,
1657     /* not assigned 0x02 */
1658     OPC_MXU__POOL00  = 0x03,
1659     OPC_MXU_S32MSUB  = 0x04,
1660     OPC_MXU_S32MSUBU = 0x05,
1661     OPC_MXU__POOL01  = 0x06,
1662     OPC_MXU__POOL02  = 0x07,
1663     OPC_MXU_D16MUL   = 0x08,
1664     OPC_MXU__POOL03  = 0x09,
1665     OPC_MXU_D16MAC   = 0x0A,
1666     OPC_MXU_D16MACF  = 0x0B,
1667     OPC_MXU_D16MADL  = 0x0C,
1668     OPC_MXU__POOL04  = 0x0D,
1669     OPC_MXU_Q16ADD   = 0x0E,
1670     OPC_MXU_D16MACE  = 0x0F,
1671     OPC_MXU__POOL05  = 0x10,
1672     OPC_MXU__POOL06  = 0x11,
1673     OPC_MXU__POOL07  = 0x12,
1674     OPC_MXU__POOL08  = 0x13,
1675     OPC_MXU__POOL09  = 0x14,
1676     OPC_MXU__POOL10  = 0x15,
1677     OPC_MXU__POOL11  = 0x16,
1678     OPC_MXU__POOL12  = 0x17,
1679     OPC_MXU_D32ADD   = 0x18,
1680     OPC_MXU__POOL13  = 0x19,
1681     /* not assigned 0x1A */
1682     OPC_MXU__POOL14  = 0x1B,
1683     OPC_MXU__POOL15  = 0x1C,
1684     OPC_MXU_Q8ACCE   = 0x1D,
1685     /* not assigned 0x1E */
1686     /* not assigned 0x1F */
1687     /* not assigned 0x20 */
1688     /* not assigned 0x21 */
1689     OPC_MXU_S8LDD    = 0x22,
1690     OPC_MXU_S8STD    = 0x23,
1691     OPC_MXU_S8LDI    = 0x24,
1692     OPC_MXU_S8SDI    = 0x25,
1693     OPC_MXU__POOL16  = 0x26,
1694     OPC_MXU__POOL17  = 0x27,
1695     OPC_MXU_LXB      = 0x28,
1696     /* not assigned 0x29 */
1697     OPC_MXU_S16LDD   = 0x2A,
1698     OPC_MXU_S16STD   = 0x2B,
1699     OPC_MXU_S16LDI   = 0x2C,
1700     OPC_MXU_S16SDI   = 0x2D,
1701     OPC_MXU_S32M2I   = 0x2E,
1702     OPC_MXU_S32I2M   = 0x2F,
1703     OPC_MXU_D32SLL   = 0x30,
1704     OPC_MXU_D32SLR   = 0x31,
1705     OPC_MXU_D32SARL  = 0x32,
1706     OPC_MXU_D32SAR   = 0x33,
1707     OPC_MXU_Q16SLL   = 0x34,
1708     OPC_MXU_Q16SLR   = 0x35,
1709     OPC_MXU__POOL18  = 0x36,
1710     OPC_MXU_Q16SAR   = 0x37,
1711     OPC_MXU__POOL19  = 0x38,
1712     OPC_MXU__POOL20  = 0x39,
1713     OPC_MXU__POOL21  = 0x3A,
1714     OPC_MXU_Q16SCOP  = 0x3B,
1715     OPC_MXU_Q8MADL   = 0x3C,
1716     OPC_MXU_S32SFL   = 0x3D,
1717     OPC_MXU_Q8SAD    = 0x3E,
1718     /* not assigned 0x3F */
1719 };
1720
1721
1722 /*
1723  * MXU pool 00
1724  */
1725 enum {
1726     OPC_MXU_S32MAX   = 0x00,
1727     OPC_MXU_S32MIN   = 0x01,
1728     OPC_MXU_D16MAX   = 0x02,
1729     OPC_MXU_D16MIN   = 0x03,
1730     OPC_MXU_Q8MAX    = 0x04,
1731     OPC_MXU_Q8MIN    = 0x05,
1732     OPC_MXU_Q8SLT    = 0x06,
1733     OPC_MXU_Q8SLTU   = 0x07,
1734 };
1735
1736 /*
1737  * MXU pool 01
1738  */
1739 enum {
1740     OPC_MXU_S32SLT   = 0x00,
1741     OPC_MXU_D16SLT   = 0x01,
1742     OPC_MXU_D16AVG   = 0x02,
1743     OPC_MXU_D16AVGR  = 0x03,
1744     OPC_MXU_Q8AVG    = 0x04,
1745     OPC_MXU_Q8AVGR   = 0x05,
1746     OPC_MXU_Q8ADD    = 0x07,
1747 };
1748
1749 /*
1750  * MXU pool 02
1751  */
1752 enum {
1753     OPC_MXU_S32CPS   = 0x00,
1754     OPC_MXU_D16CPS   = 0x02,
1755     OPC_MXU_Q8ABD    = 0x04,
1756     OPC_MXU_Q16SAT   = 0x06,
1757 };
1758
1759 /*
1760  * MXU pool 03
1761  */
1762 enum {
1763     OPC_MXU_D16MULF  = 0x00,
1764     OPC_MXU_D16MULE  = 0x01,
1765 };
1766
1767 /*
1768  * MXU pool 04
1769  */
1770 enum {
1771     OPC_MXU_S16MAD   = 0x00,
1772     OPC_MXU_S16MAD_1 = 0x01,
1773 };
1774
1775 /*
1776  * MXU pool 05
1777  */
1778 enum {
1779     OPC_MXU_S32LDD   = 0x00,
1780     OPC_MXU_S32LDDR  = 0x01,
1781 };
1782
1783 /*
1784  * MXU pool 06
1785  */
1786 enum {
1787     OPC_MXU_S32STD   = 0x00,
1788     OPC_MXU_S32STDR  = 0x01,
1789 };
1790
1791 /*
1792  * MXU pool 07
1793  */
1794 enum {
1795     OPC_MXU_S32LDDV  = 0x00,
1796     OPC_MXU_S32LDDVR = 0x01,
1797 };
1798
1799 /*
1800  * MXU pool 08
1801  */
1802 enum {
1803     OPC_MXU_S32STDV  = 0x00,
1804     OPC_MXU_S32STDVR = 0x01,
1805 };
1806
1807 /*
1808  * MXU pool 09
1809  */
1810 enum {
1811     OPC_MXU_S32LDI   = 0x00,
1812     OPC_MXU_S32LDIR  = 0x01,
1813 };
1814
1815 /*
1816  * MXU pool 10
1817  */
1818 enum {
1819     OPC_MXU_S32SDI   = 0x00,
1820     OPC_MXU_S32SDIR  = 0x01,
1821 };
1822
1823 /*
1824  * MXU pool 11
1825  */
1826 enum {
1827     OPC_MXU_S32LDIV  = 0x00,
1828     OPC_MXU_S32LDIVR = 0x01,
1829 };
1830
1831 /*
1832  * MXU pool 12
1833  */
1834 enum {
1835     OPC_MXU_S32SDIV  = 0x00,
1836     OPC_MXU_S32SDIVR = 0x01,
1837 };
1838
1839 /*
1840  * MXU pool 13
1841  */
1842 enum {
1843     OPC_MXU_D32ACC   = 0x00,
1844     OPC_MXU_D32ACCM  = 0x01,
1845     OPC_MXU_D32ASUM  = 0x02,
1846 };
1847
1848 /*
1849  * MXU pool 14
1850  */
1851 enum {
1852     OPC_MXU_Q16ACC   = 0x00,
1853     OPC_MXU_Q16ACCM  = 0x01,
1854     OPC_MXU_Q16ASUM  = 0x02,
1855 };
1856
1857 /*
1858  * MXU pool 15
1859  */
1860 enum {
1861     OPC_MXU_Q8ADDE   = 0x00,
1862     OPC_MXU_D8SUM    = 0x01,
1863     OPC_MXU_D8SUMC   = 0x02,
1864 };
1865
1866 /*
1867  * MXU pool 16
1868  */
1869 enum {
1870     OPC_MXU_S32MUL   = 0x00,
1871     OPC_MXU_S32MULU  = 0x01,
1872     OPC_MXU_S32EXTR  = 0x02,
1873     OPC_MXU_S32EXTRV = 0x03,
1874 };
1875
1876 /*
1877  * MXU pool 17
1878  */
1879 enum {
1880     OPC_MXU_D32SARW  = 0x00,
1881     OPC_MXU_S32ALN   = 0x01,
1882     OPC_MXU_S32ALNI  = 0x02,
1883     OPC_MXU_S32NOR   = 0x03,
1884     OPC_MXU_S32AND   = 0x04,
1885     OPC_MXU_S32OR    = 0x05,
1886     OPC_MXU_S32XOR   = 0x06,
1887     OPC_MXU_S32LUI   = 0x07,
1888 };
1889
1890 /*
1891  * MXU pool 18
1892  */
1893 enum {
1894     OPC_MXU_D32SLLV  = 0x00,
1895     OPC_MXU_D32SLRV  = 0x01,
1896     OPC_MXU_D32SARV  = 0x03,
1897     OPC_MXU_Q16SLLV  = 0x04,
1898     OPC_MXU_Q16SLRV  = 0x05,
1899     OPC_MXU_Q16SARV  = 0x07,
1900 };
1901
1902 /*
1903  * MXU pool 19
1904  */
1905 enum {
1906     OPC_MXU_Q8MUL    = 0x00,
1907     OPC_MXU_Q8MULSU  = 0x01,
1908 };
1909
1910 /*
1911  * MXU pool 20
1912  */
1913 enum {
1914     OPC_MXU_Q8MOVZ   = 0x00,
1915     OPC_MXU_Q8MOVN   = 0x01,
1916     OPC_MXU_D16MOVZ  = 0x02,
1917     OPC_MXU_D16MOVN  = 0x03,
1918     OPC_MXU_S32MOVZ  = 0x04,
1919     OPC_MXU_S32MOVN  = 0x05,
1920 };
1921
1922 /*
1923  * MXU pool 21
1924  */
1925 enum {
1926     OPC_MXU_Q8MAC    = 0x00,
1927     OPC_MXU_Q8MACSU  = 0x01,
1928 };
1929
1930 /*
1931  *     Overview of the TX79-specific instruction set
1932  *     =============================================
1933  *
1934  * The R5900 and the C790 have 128-bit wide GPRs, where the upper 64 bits
1935  * are only used by the specific quadword (128-bit) LQ/SQ load/store
1936  * instructions and certain multimedia instructions (MMIs). These MMIs
1937  * configure the 128-bit data path as two 64-bit, four 32-bit, eight 16-bit
1938  * or sixteen 8-bit paths.
1939  *
1940  * Reference:
1941  *
1942  * The Toshiba TX System RISC TX79 Core Architecture manual,
1943  * https://wiki.qemu.org/File:C790.pdf
1944  *
1945  *     Three-Operand Multiply and Multiply-Add (4 instructions)
1946  *     --------------------------------------------------------
1947  * MADD    [rd,] rs, rt      Multiply/Add
1948  * MADDU   [rd,] rs, rt      Multiply/Add Unsigned
1949  * MULT    [rd,] rs, rt      Multiply (3-operand)
1950  * MULTU   [rd,] rs, rt      Multiply Unsigned (3-operand)
1951  *
1952  *     Multiply Instructions for Pipeline 1 (10 instructions)
1953  *     ------------------------------------------------------
1954  * MULT1   [rd,] rs, rt      Multiply Pipeline 1
1955  * MULTU1  [rd,] rs, rt      Multiply Unsigned Pipeline 1
1956  * DIV1    rs, rt            Divide Pipeline 1
1957  * DIVU1   rs, rt            Divide Unsigned Pipeline 1
1958  * MADD1   [rd,] rs, rt      Multiply-Add Pipeline 1
1959  * MADDU1  [rd,] rs, rt      Multiply-Add Unsigned Pipeline 1
1960  * MFHI1   rd                Move From HI1 Register
1961  * MFLO1   rd                Move From LO1 Register
1962  * MTHI1   rs                Move To HI1 Register
1963  * MTLO1   rs                Move To LO1 Register
1964  *
1965  *     Arithmetic (19 instructions)
1966  *     ----------------------------
1967  * PADDB   rd, rs, rt        Parallel Add Byte
1968  * PSUBB   rd, rs, rt        Parallel Subtract Byte
1969  * PADDH   rd, rs, rt        Parallel Add Halfword
1970  * PSUBH   rd, rs, rt        Parallel Subtract Halfword
1971  * PADDW   rd, rs, rt        Parallel Add Word
1972  * PSUBW   rd, rs, rt        Parallel Subtract Word
1973  * PADSBH  rd, rs, rt        Parallel Add/Subtract Halfword
1974  * PADDSB  rd, rs, rt        Parallel Add with Signed Saturation Byte
1975  * PSUBSB  rd, rs, rt        Parallel Subtract with Signed Saturation Byte
1976  * PADDSH  rd, rs, rt        Parallel Add with Signed Saturation Halfword
1977  * PSUBSH  rd, rs, rt        Parallel Subtract with Signed Saturation Halfword
1978  * PADDSW  rd, rs, rt        Parallel Add with Signed Saturation Word
1979  * PSUBSW  rd, rs, rt        Parallel Subtract with Signed Saturation Word
1980  * PADDUB  rd, rs, rt        Parallel Add with Unsigned saturation Byte
1981  * PSUBUB  rd, rs, rt        Parallel Subtract with Unsigned saturation Byte
1982  * PADDUH  rd, rs, rt        Parallel Add with Unsigned saturation Halfword
1983  * PSUBUH  rd, rs, rt        Parallel Subtract with Unsigned saturation Halfword
1984  * PADDUW  rd, rs, rt        Parallel Add with Unsigned saturation Word
1985  * PSUBUW  rd, rs, rt        Parallel Subtract with Unsigned saturation Word
1986  *
1987  *     Min/Max (4 instructions)
1988  *     ------------------------
1989  * PMAXH   rd, rs, rt        Parallel Maximum Halfword
1990  * PMINH   rd, rs, rt        Parallel Minimum Halfword
1991  * PMAXW   rd, rs, rt        Parallel Maximum Word
1992  * PMINW   rd, rs, rt        Parallel Minimum Word
1993  *
1994  *     Absolute (2 instructions)
1995  *     -------------------------
1996  * PABSH   rd, rt            Parallel Absolute Halfword
1997  * PABSW   rd, rt            Parallel Absolute Word
1998  *
1999  *     Logical (4 instructions)
2000  *     ------------------------
2001  * PAND    rd, rs, rt        Parallel AND
2002  * POR     rd, rs, rt        Parallel OR
2003  * PXOR    rd, rs, rt        Parallel XOR
2004  * PNOR    rd, rs, rt        Parallel NOR
2005  *
2006  *     Shift (9 instructions)
2007  *     ----------------------
2008  * PSLLH   rd, rt, sa        Parallel Shift Left Logical Halfword
2009  * PSRLH   rd, rt, sa        Parallel Shift Right Logical Halfword
2010  * PSRAH   rd, rt, sa        Parallel Shift Right Arithmetic Halfword
2011  * PSLLW   rd, rt, sa        Parallel Shift Left Logical Word
2012  * PSRLW   rd, rt, sa        Parallel Shift Right Logical Word
2013  * PSRAW   rd, rt, sa        Parallel Shift Right Arithmetic Word
2014  * PSLLVW  rd, rt, rs        Parallel Shift Left Logical Variable Word
2015  * PSRLVW  rd, rt, rs        Parallel Shift Right Logical Variable Word
2016  * PSRAVW  rd, rt, rs        Parallel Shift Right Arithmetic Variable Word
2017  *
2018  *     Compare (6 instructions)
2019  *     ------------------------
2020  * PCGTB   rd, rs, rt        Parallel Compare for Greater Than Byte
2021  * PCEQB   rd, rs, rt        Parallel Compare for Equal Byte
2022  * PCGTH   rd, rs, rt        Parallel Compare for Greater Than Halfword
2023  * PCEQH   rd, rs, rt        Parallel Compare for Equal Halfword
2024  * PCGTW   rd, rs, rt        Parallel Compare for Greater Than Word
2025  * PCEQW   rd, rs, rt        Parallel Compare for Equal Word
2026  *
2027  *     LZC (1 instruction)
2028  *     -------------------
2029  * PLZCW   rd, rs            Parallel Leading Zero or One Count Word
2030  *
2031  *     Quadword Load and Store (2 instructions)
2032  *     ----------------------------------------
2033  * LQ      rt, offset(base)  Load Quadword
2034  * SQ      rt, offset(base)  Store Quadword
2035  *
2036  *     Multiply and Divide (19 instructions)
2037  *     -------------------------------------
2038  * PMULTW  rd, rs, rt        Parallel Multiply Word
2039  * PMULTUW rd, rs, rt        Parallel Multiply Unsigned Word
2040  * PDIVW   rs, rt            Parallel Divide Word
2041  * PDIVUW  rs, rt            Parallel Divide Unsigned Word
2042  * PMADDW  rd, rs, rt        Parallel Multiply-Add Word
2043  * PMADDUW rd, rs, rt        Parallel Multiply-Add Unsigned Word
2044  * PMSUBW  rd, rs, rt        Parallel Multiply-Subtract Word
2045  * PMULTH  rd, rs, rt        Parallel Multiply Halfword
2046  * PMADDH  rd, rs, rt        Parallel Multiply-Add Halfword
2047  * PMSUBH  rd, rs, rt        Parallel Multiply-Subtract Halfword
2048  * PHMADH  rd, rs, rt        Parallel Horizontal Multiply-Add Halfword
2049  * PHMSBH  rd, rs, rt        Parallel Horizontal Multiply-Subtract Halfword
2050  * PDIVBW  rs, rt            Parallel Divide Broadcast Word
2051  * PMFHI   rd                Parallel Move From HI Register
2052  * PMFLO   rd                Parallel Move From LO Register
2053  * PMTHI   rs                Parallel Move To HI Register
2054  * PMTLO   rs                Parallel Move To LO Register
2055  * PMFHL   rd                Parallel Move From HI/LO Register
2056  * PMTHL   rs                Parallel Move To HI/LO Register
2057  *
2058  *     Pack/Extend (11 instructions)
2059  *     -----------------------------
2060  * PPAC5   rd, rt            Parallel Pack to 5 bits
2061  * PPACB   rd, rs, rt        Parallel Pack to Byte
2062  * PPACH   rd, rs, rt        Parallel Pack to Halfword
2063  * PPACW   rd, rs, rt        Parallel Pack to Word
2064  * PEXT5   rd, rt            Parallel Extend Upper from 5 bits
2065  * PEXTUB  rd, rs, rt        Parallel Extend Upper from Byte
2066  * PEXTLB  rd, rs, rt        Parallel Extend Lower from Byte
2067  * PEXTUH  rd, rs, rt        Parallel Extend Upper from Halfword
2068  * PEXTLH  rd, rs, rt        Parallel Extend Lower from Halfword
2069  * PEXTUW  rd, rs, rt        Parallel Extend Upper from Word
2070  * PEXTLW  rd, rs, rt        Parallel Extend Lower from Word
2071  *
2072  *     Others (16 instructions)
2073  *     ------------------------
2074  * PCPYH   rd, rt            Parallel Copy Halfword
2075  * PCPYLD  rd, rs, rt        Parallel Copy Lower Doubleword
2076  * PCPYUD  rd, rs, rt        Parallel Copy Upper Doubleword
2077  * PREVH   rd, rt            Parallel Reverse Halfword
2078  * PINTH   rd, rs, rt        Parallel Interleave Halfword
2079  * PINTEH  rd, rs, rt        Parallel Interleave Even Halfword
2080  * PEXEH   rd, rt            Parallel Exchange Even Halfword
2081  * PEXCH   rd, rt            Parallel Exchange Center Halfword
2082  * PEXEW   rd, rt            Parallel Exchange Even Word
2083  * PEXCW   rd, rt            Parallel Exchange Center Word
2084  * QFSRV   rd, rs, rt        Quadword Funnel Shift Right Variable
2085  * MFSA    rd                Move from Shift Amount Register
2086  * MTSA    rs                Move to Shift Amount Register
2087  * MTSAB   rs, immediate     Move Byte Count to Shift Amount Register
2088  * MTSAH   rs, immediate     Move Halfword Count to Shift Amount Register
2089  * PROT3W  rd, rt            Parallel Rotate 3 Words
2090  *
2091  *     The TX79-specific Multimedia Instruction encodings
2092  *     ==================================================
2093  *
2094  * TX79 Multimedia Instruction encoding table keys:
2095  *
2096  *     *   This code is reserved for future use. An attempt to execute it
2097  *         causes a Reserved Instruction exception.
2098  *     %   This code indicates an instruction class. The instruction word
2099  *         must be further decoded by examining additional tables that show
2100  *         the values for other instruction fields.
2101  *     #   This code is reserved for the unsupported instructions DMULT,
2102  *         DMULTU, DDIV, DDIVU, LL, LLD, SC, SCD, LWC2 and SWC2. An attempt
2103  *         to execute it causes a Reserved Instruction exception.
2104  *
2105  * TX79 Multimedia Instructions encoded by opcode field (MMI, LQ, SQ):
2106  *
2107  *  31    26                                        0
2108  * +--------+----------------------------------------+
2109  * | opcode |                                        |
2110  * +--------+----------------------------------------+
2111  *
2112  *   opcode  bits 28..26
2113  *     bits |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7
2114  *   31..29 |  000  |  001  |  010  |  011  |  100  |  101  |  110  |  111
2115  *   -------+-------+-------+-------+-------+-------+-------+-------+-------
2116  *    0 000 |SPECIAL| REGIMM|   J   |  JAL  |  BEQ  |  BNE  |  BLEZ |  BGTZ
2117  *    1 001 |  ADDI | ADDIU |  SLTI | SLTIU |  ANDI |  ORI  |  XORI |  LUI
2118  *    2 010 |  COP0 |  COP1 |   *   |   *   |  BEQL |  BNEL | BLEZL | BGTZL
2119  *    3 011 | DADDI | DADDIU|  LDL  |  LDR  |  MMI% |   *   |   LQ  |   SQ
2120  *    4 100 |   LB  |   LH  |  LWL  |   LW  |  LBU  |  LHU  |  LWR  |  LWU
2121  *    5 101 |   SB  |   SH  |  SWL  |   SW  |  SDL  |  SDR  |  SWR  | CACHE
2122  *    6 110 |   #   |  LWC1 |   #   |  PREF |   #   |  LDC1 |   #   |   LD
2123  *    7 111 |   #   |  SWC1 |   #   |   *   |   #   |  SDC1 |   #   |   SD
2124  */
2125
2126 enum {
2127     TX79_CLASS_MMI = 0x1C << 26,    /* Same as OPC_SPECIAL2 */
2128     TX79_LQ        = 0x1E << 26,    /* Same as OPC_MSA */
2129     TX79_SQ        = 0x1F << 26,    /* Same as OPC_SPECIAL3 */
2130 };
2131
2132 /*
2133  * TX79 Multimedia Instructions with opcode field = MMI:
2134  *
2135  *  31    26                                 5      0
2136  * +--------+-------------------------------+--------+
2137  * |   MMI  |                               |function|
2138  * +--------+-------------------------------+--------+
2139  *
2140  * function  bits 2..0
2141  *     bits |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7
2142  *     5..3 |  000  |  001  |  010  |  011  |  100  |  101  |  110  |  111
2143  *   -------+-------+-------+-------+-------+-------+-------+-------+-------
2144  *    0 000 |  MADD | MADDU |   *   |   *   | PLZCW |   *   |   *   |   *
2145  *    1 001 | MMI0% | MMI2% |   *   |   *   |   *   |   *   |   *   |   *
2146  *    2 010 | MFHI1 | MTHI1 | MFLO1 | MTLO1 |   *   |   *   |   *   |   *
2147  *    3 011 | MULT1 | MULTU1|  DIV1 | DIVU1 |   *   |   *   |   *   |   *
2148  *    4 100 | MADD1 | MADDU1|   *   |   *   |   *   |   *   |   *   |   *
2149  *    5 101 | MMI1% | MMI3% |   *   |   *   |   *   |   *   |   *   |   *
2150  *    6 110 | PMFHL | PMTHL |   *   |   *   | PSLLH |   *   | PSRLH | PSRAH
2151  *    7 111 |   *   |   *   |   *   |   *   | PSLLW |   *   | PSRLW | PSRAW
2152  */
2153
2154 #define MASK_TX79_MMI(op) (MASK_OP_MAJOR(op) | ((op) & 0x3F))
2155 enum {
2156     TX79_MMI_MADD       = 0x00 | TX79_CLASS_MMI, /* Same as OPC_MADD */
2157     TX79_MMI_MADDU      = 0x01 | TX79_CLASS_MMI, /* Same as OPC_MADDU */
2158     TX79_MMI_PLZCW      = 0x04 | TX79_CLASS_MMI,
2159     TX79_MMI_CLASS_MMI0 = 0x08 | TX79_CLASS_MMI,
2160     TX79_MMI_CLASS_MMI2 = 0x09 | TX79_CLASS_MMI,
2161     TX79_MMI_MFHI1      = 0x10 | TX79_CLASS_MMI, /* Same minor as OPC_MFHI */
2162     TX79_MMI_MTHI1      = 0x11 | TX79_CLASS_MMI, /* Same minor as OPC_MTHI */
2163     TX79_MMI_MFLO1      = 0x12 | TX79_CLASS_MMI, /* Same minor as OPC_MFLO */
2164     TX79_MMI_MTLO1      = 0x13 | TX79_CLASS_MMI, /* Same minor as OPC_MTLO */
2165     TX79_MMI_MULT1      = 0x18 | TX79_CLASS_MMI, /* Same minor as OPC_MULT */
2166     TX79_MMI_MULTU1     = 0x19 | TX79_CLASS_MMI, /* Same minor as OPC_MULTU */
2167     TX79_MMI_DIV1       = 0x1A | TX79_CLASS_MMI, /* Same minor as OPC_DIV */
2168     TX79_MMI_DIVU1      = 0x1B | TX79_CLASS_MMI, /* Same minor as OPC_DIVU */
2169     TX79_MMI_MADD1      = 0x20 | TX79_CLASS_MMI,
2170     TX79_MMI_MADDU1     = 0x21 | TX79_CLASS_MMI,
2171     TX79_MMI_CLASS_MMI1 = 0x28 | TX79_CLASS_MMI,
2172     TX79_MMI_CLASS_MMI3 = 0x29 | TX79_CLASS_MMI,
2173     TX79_MMI_PMFHL      = 0x30 | TX79_CLASS_MMI,
2174     TX79_MMI_PMTHL      = 0x31 | TX79_CLASS_MMI,
2175     TX79_MMI_PSLLH      = 0x34 | TX79_CLASS_MMI,
2176     TX79_MMI_PSRLH      = 0x36 | TX79_CLASS_MMI,
2177     TX79_MMI_PSRAH      = 0x37 | TX79_CLASS_MMI,
2178     TX79_MMI_PSLLW      = 0x3C | TX79_CLASS_MMI,
2179     TX79_MMI_PSRLW      = 0x3E | TX79_CLASS_MMI,
2180     TX79_MMI_PSRAW      = 0x3F | TX79_CLASS_MMI,
2181 };
2182
2183 /*
2184  * TX79 Multimedia Instructions with opcode field = MMI and bits 5..0 = MMI0:
2185  *
2186  *  31    26                        10     6 5      0
2187  * +--------+----------------------+--------+--------+
2188  * |   MMI  |                      |function|  MMI0  |
2189  * +--------+----------------------+--------+--------+
2190  *
2191  * function  bits 7..6
2192  *     bits |   0   |   1   |   2   |   3
2193  *    10..8 |   00  |   01  |   10  |   11
2194  *   -------+-------+-------+-------+-------
2195  *    0 000 | PADDW | PSUBW | PCGTW | PMAXW
2196  *    1 001 | PADDH | PSUBH | PCGTH | PMAXH
2197  *    2 010 | PADDB | PSUBB | PCGTB |   *
2198  *    3 011 |   *   |   *   |   *   |   *
2199  *    4 100 | PADDSW| PSUBSW| PEXTLW| PPACW
2200  *    5 101 | PADDSH| PSUBSH| PEXTLH| PPACH
2201  *    6 110 | PADDSB| PSUBSB| PEXTLB| PPACB
2202  *    7 111 |   *   |   *   | PEXT5 | PPAC5
2203  */
2204
2205 #define MASK_TX79_MMI0(op) (MASK_OP_MAJOR(op) | ((op) & 0x7FF))
2206 enum {
2207     TX79_MMI0_PADDW  = (0x00 << 6) | TX79_MMI_CLASS_MMI0,
2208     TX79_MMI0_PSUBW  = (0x01 << 6) | TX79_MMI_CLASS_MMI0,
2209     TX79_MMI0_PCGTW  = (0x02 << 6) | TX79_MMI_CLASS_MMI0,
2210     TX79_MMI0_PMAXW  = (0x03 << 6) | TX79_MMI_CLASS_MMI0,
2211     TX79_MMI0_PADDH  = (0x04 << 6) | TX79_MMI_CLASS_MMI0,
2212     TX79_MMI0_PSUBH  = (0x05 << 6) | TX79_MMI_CLASS_MMI0,
2213     TX79_MMI0_PCGTH  = (0x06 << 6) | TX79_MMI_CLASS_MMI0,
2214     TX79_MMI0_PMAXH  = (0x07 << 6) | TX79_MMI_CLASS_MMI0,
2215     TX79_MMI0_PADDB  = (0x08 << 6) | TX79_MMI_CLASS_MMI0,
2216     TX79_MMI0_PSUBB  = (0x09 << 6) | TX79_MMI_CLASS_MMI0,
2217     TX79_MMI0_PCGTB  = (0x0A << 6) | TX79_MMI_CLASS_MMI0,
2218     TX79_MMI0_PADDSW = (0x10 << 6) | TX79_MMI_CLASS_MMI0,
2219     TX79_MMI0_PSUBSW = (0x11 << 6) | TX79_MMI_CLASS_MMI0,
2220     TX79_MMI0_PEXTLW = (0x12 << 6) | TX79_MMI_CLASS_MMI0,
2221     TX79_MMI0_PPACW  = (0x13 << 6) | TX79_MMI_CLASS_MMI0,
2222     TX79_MMI0_PADDSH = (0x14 << 6) | TX79_MMI_CLASS_MMI0,
2223     TX79_MMI0_PSUBSH = (0x15 << 6) | TX79_MMI_CLASS_MMI0,
2224     TX79_MMI0_PEXTLH = (0x16 << 6) | TX79_MMI_CLASS_MMI0,
2225     TX79_MMI0_PPACH  = (0x17 << 6) | TX79_MMI_CLASS_MMI0,
2226     TX79_MMI0_PADDSB = (0x18 << 6) | TX79_MMI_CLASS_MMI0,
2227     TX79_MMI0_PSUBSB = (0x19 << 6) | TX79_MMI_CLASS_MMI0,
2228     TX79_MMI0_PEXTLB = (0x1A << 6) | TX79_MMI_CLASS_MMI0,
2229     TX79_MMI0_PPACB  = (0x1B << 6) | TX79_MMI_CLASS_MMI0,
2230     TX79_MMI0_PEXT5  = (0x1E << 6) | TX79_MMI_CLASS_MMI0,
2231     TX79_MMI0_PPAC5  = (0x1F << 6) | TX79_MMI_CLASS_MMI0,
2232 };
2233
2234 /*
2235  * TX79 Multimedia Instructions with opcode field = MMI and bits 5..0 = MMI1:
2236  *
2237  *  31    26                        10     6 5      0
2238  * +--------+----------------------+--------+--------+
2239  * |   MMI  |                      |function|  MMI1  |
2240  * +--------+----------------------+--------+--------+
2241  *
2242  * function  bits 7..6
2243  *     bits |   0   |   1   |   2   |   3
2244  *    10..8 |   00  |   01  |   10  |   11
2245  *   -------+-------+-------+-------+-------
2246  *    0 000 |   *   | PABSW | PCEQW | PMINW
2247  *    1 001 | PADSBH| PABSH | PCEQH | PMINH
2248  *    2 010 |   *   |   *   | PCEQB |   *
2249  *    3 011 |   *   |   *   |   *   |   *
2250  *    4 100 | PADDUW| PSUBUW| PEXTUW|   *
2251  *    5 101 | PADDUH| PSUBUH| PEXTUH|   *
2252  *    6 110 | PADDUB| PSUBUB| PEXTUB| QFSRV
2253  *    7 111 |   *   |   *   |   *   |   *
2254  */
2255
2256 #define MASK_TX79_MMI1(op) (MASK_OP_MAJOR(op) | ((op) & 0x7FF))
2257 enum {
2258     TX79_MMI1_PABSW  = (0x01 << 6) | TX79_MMI_CLASS_MMI1,
2259     TX79_MMI1_PCEQW  = (0x02 << 6) | TX79_MMI_CLASS_MMI1,
2260     TX79_MMI1_PMINW  = (0x03 << 6) | TX79_MMI_CLASS_MMI1,
2261     TX79_MMI1_PADSBH = (0x04 << 6) | TX79_MMI_CLASS_MMI1,
2262     TX79_MMI1_PABSH  = (0x05 << 6) | TX79_MMI_CLASS_MMI1,
2263     TX79_MMI1_PCEQH  = (0x06 << 6) | TX79_MMI_CLASS_MMI1,
2264     TX79_MMI1_PMINH  = (0x07 << 6) | TX79_MMI_CLASS_MMI1,
2265     TX79_MMI1_PCEQB  = (0x0A << 6) | TX79_MMI_CLASS_MMI1,
2266     TX79_MMI1_PADDUW = (0x10 << 6) | TX79_MMI_CLASS_MMI1,
2267     TX79_MMI1_PSUBUW = (0x11 << 6) | TX79_MMI_CLASS_MMI1,
2268     TX79_MMI1_PEXTUW = (0x12 << 6) | TX79_MMI_CLASS_MMI1,
2269     TX79_MMI1_PADDUH = (0x14 << 6) | TX79_MMI_CLASS_MMI1,
2270     TX79_MMI1_PSUBUH = (0x15 << 6) | TX79_MMI_CLASS_MMI1,
2271     TX79_MMI1_PEXTUH = (0x16 << 6) | TX79_MMI_CLASS_MMI1,
2272     TX79_MMI1_PADDUB = (0x18 << 6) | TX79_MMI_CLASS_MMI1,
2273     TX79_MMI1_PSUBUB = (0x19 << 6) | TX79_MMI_CLASS_MMI1,
2274     TX79_MMI1_PEXTUB = (0x1A << 6) | TX79_MMI_CLASS_MMI1,
2275     TX79_MMI1_QFSRV  = (0x1B << 6) | TX79_MMI_CLASS_MMI1,
2276 };
2277
2278 /*
2279  * TX79 Multimedia Instructions with opcode field = MMI and bits 5..0 = MMI2:
2280  *
2281  *  31    26                        10     6 5      0
2282  * +--------+----------------------+--------+--------+
2283  * |   MMI  |                      |function|  MMI2  |
2284  * +--------+----------------------+--------+--------+
2285  *
2286  * function  bits 7..6
2287  *     bits |   0   |   1   |   2   |   3
2288  *    10..8 |   00  |   01  |   10  |   11
2289  *   -------+-------+-------+-------+-------
2290  *    0 000 | PMADDW|   *   | PSLLVW| PSRLVW
2291  *    1 001 | PMSUBW|   *   |   *   |   *
2292  *    2 010 | PMFHI | PMFLO | PINTH |   *
2293  *    3 011 | PMULTW| PDIVW | PCPYLD|   *
2294  *    4 100 | PMADDH| PHMADH|  PAND |  PXOR
2295  *    5 101 | PMSUBH| PHMSBH|   *   |   *
2296  *    6 110 |   *   |   *   | PEXEH | PREVH
2297  *    7 111 | PMULTH| PDIVBW| PEXEW | PROT3W
2298  */
2299
2300 #define MASK_TX79_MMI2(op) (MASK_OP_MAJOR(op) | ((op) & 0x7FF))
2301 enum {
2302     TX79_MMI2_PMADDW = (0x00 << 6) | TX79_MMI_CLASS_MMI2,
2303     TX79_MMI2_PSLLVW = (0x02 << 6) | TX79_MMI_CLASS_MMI2,
2304     TX79_MMI2_PSRLVW = (0x03 << 6) | TX79_MMI_CLASS_MMI2,
2305     TX79_MMI2_PMSUBW = (0x04 << 6) | TX79_MMI_CLASS_MMI2,
2306     TX79_MMI2_PMFHI  = (0x08 << 6) | TX79_MMI_CLASS_MMI2,
2307     TX79_MMI2_PMFLO  = (0x09 << 6) | TX79_MMI_CLASS_MMI2,
2308     TX79_MMI2_PINTH  = (0x0A << 6) | TX79_MMI_CLASS_MMI2,
2309     TX79_MMI2_PMULTW = (0x0C << 6) | TX79_MMI_CLASS_MMI2,
2310     TX79_MMI2_PDIVW  = (0x0D << 6) | TX79_MMI_CLASS_MMI2,
2311     TX79_MMI2_PCPYLD = (0x0E << 6) | TX79_MMI_CLASS_MMI2,
2312     TX79_MMI2_PMADDH = (0x10 << 6) | TX79_MMI_CLASS_MMI2,
2313     TX79_MMI2_PHMADH = (0x11 << 6) | TX79_MMI_CLASS_MMI2,
2314     TX79_MMI2_PAND   = (0x12 << 6) | TX79_MMI_CLASS_MMI2,
2315     TX79_MMI2_PXOR   = (0x13 << 6) | TX79_MMI_CLASS_MMI2,
2316     TX79_MMI2_PMSUBH = (0x14 << 6) | TX79_MMI_CLASS_MMI2,
2317     TX79_MMI2_PHMSBH = (0x15 << 6) | TX79_MMI_CLASS_MMI2,
2318     TX79_MMI2_PEXEH  = (0x1A << 6) | TX79_MMI_CLASS_MMI2,
2319     TX79_MMI2_PREVH  = (0x1B << 6) | TX79_MMI_CLASS_MMI2,
2320     TX79_MMI2_PMULTH = (0x1C << 6) | TX79_MMI_CLASS_MMI2,
2321     TX79_MMI2_PDIVBW = (0x1D << 6) | TX79_MMI_CLASS_MMI2,
2322     TX79_MMI2_PEXEW  = (0x1E << 6) | TX79_MMI_CLASS_MMI2,
2323     TX79_MMI2_PROT3W = (0x1F << 6) | TX79_MMI_CLASS_MMI2,
2324 };
2325
2326 /*
2327  * TX79 Multimedia Instructions with opcode field = MMI and bits 5..0 = MMI3:
2328  *
2329  *  31    26                        10     6 5      0
2330  * +--------+----------------------+--------+--------+
2331  * |   MMI  |                      |function|  MMI3  |
2332  * +--------+----------------------+--------+--------+
2333  *
2334  * function  bits 7..6
2335  *     bits |   0   |   1   |   2   |   3
2336  *    10..8 |   00  |   01  |   10  |   11
2337  *   -------+-------+-------+-------+-------
2338  *    0 000 |PMADDUW|   *   |   *   | PSRAVW
2339  *    1 001 |   *   |   *   |   *   |   *
2340  *    2 010 | PMTHI | PMTLO | PINTEH|   *
2341  *    3 011 |PMULTUW| PDIVUW| PCPYUD|   *
2342  *    4 100 |   *   |   *   |  POR  |  PNOR
2343  *    5 101 |   *   |   *   |   *   |   *
2344  *    6 110 |   *   |   *   | PEXCH | PCPYH
2345  *    7 111 |   *   |   *   | PEXCW |   *
2346  */
2347
2348 #define MASK_TX79_MMI3(op) (MASK_OP_MAJOR(op) | ((op) & 0x7FF))
2349 enum {
2350     TX79_MMI3_PMADDUW = (0x00 << 6) | TX79_MMI_CLASS_MMI3,
2351     TX79_MMI3_PSRAVW  = (0x03 << 6) | TX79_MMI_CLASS_MMI3,
2352     TX79_MMI3_PMTHI   = (0x08 << 6) | TX79_MMI_CLASS_MMI3,
2353     TX79_MMI3_PMTLO   = (0x09 << 6) | TX79_MMI_CLASS_MMI3,
2354     TX79_MMI3_PINTEH  = (0x0A << 6) | TX79_MMI_CLASS_MMI3,
2355     TX79_MMI3_PMULTUW = (0x0C << 6) | TX79_MMI_CLASS_MMI3,
2356     TX79_MMI3_PDIVUW  = (0x0D << 6) | TX79_MMI_CLASS_MMI3,
2357     TX79_MMI3_PCPYUD  = (0x0E << 6) | TX79_MMI_CLASS_MMI3,
2358     TX79_MMI3_POR     = (0x12 << 6) | TX79_MMI_CLASS_MMI3,
2359     TX79_MMI3_PNOR    = (0x13 << 6) | TX79_MMI_CLASS_MMI3,
2360     TX79_MMI3_PEXCH   = (0x1A << 6) | TX79_MMI_CLASS_MMI3,
2361     TX79_MMI3_PCPYH   = (0x1B << 6) | TX79_MMI_CLASS_MMI3,
2362     TX79_MMI3_PEXCW   = (0x1E << 6) | TX79_MMI_CLASS_MMI3,
2363 };
2364
2365 /* global register indices */
2366 static TCGv cpu_gpr[32], cpu_PC;
2367 static TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC];
2368 static TCGv cpu_dspctrl, btarget, bcond;
2369 static TCGv_i32 hflags;
2370 static TCGv_i32 fpu_fcr0, fpu_fcr31;
2371 static TCGv_i64 fpu_f64[32];
2372 static TCGv_i64 msa_wr_d[64];
2373
2374 #include "exec/gen-icount.h"
2375
2376 #define gen_helper_0e0i(name, arg) do {                           \
2377     TCGv_i32 helper_tmp = tcg_const_i32(arg);                     \
2378     gen_helper_##name(cpu_env, helper_tmp);                       \
2379     tcg_temp_free_i32(helper_tmp);                                \
2380     } while(0)
2381
2382 #define gen_helper_0e1i(name, arg1, arg2) do {                    \
2383     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
2384     gen_helper_##name(cpu_env, arg1, helper_tmp);                 \
2385     tcg_temp_free_i32(helper_tmp);                                \
2386     } while(0)
2387
2388 #define gen_helper_1e0i(name, ret, arg1) do {                     \
2389     TCGv_i32 helper_tmp = tcg_const_i32(arg1);                    \
2390     gen_helper_##name(ret, cpu_env, helper_tmp);                  \
2391     tcg_temp_free_i32(helper_tmp);                                \
2392     } while(0)
2393
2394 #define gen_helper_1e1i(name, ret, arg1, arg2) do {               \
2395     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
2396     gen_helper_##name(ret, cpu_env, arg1, helper_tmp);            \
2397     tcg_temp_free_i32(helper_tmp);                                \
2398     } while(0)
2399
2400 #define gen_helper_0e2i(name, arg1, arg2, arg3) do {              \
2401     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
2402     gen_helper_##name(cpu_env, arg1, arg2, helper_tmp);           \
2403     tcg_temp_free_i32(helper_tmp);                                \
2404     } while(0)
2405
2406 #define gen_helper_1e2i(name, ret, arg1, arg2, arg3) do {         \
2407     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
2408     gen_helper_##name(ret, cpu_env, arg1, arg2, helper_tmp);      \
2409     tcg_temp_free_i32(helper_tmp);                                \
2410     } while(0)
2411
2412 #define gen_helper_0e3i(name, arg1, arg2, arg3, arg4) do {        \
2413     TCGv_i32 helper_tmp = tcg_const_i32(arg4);                    \
2414     gen_helper_##name(cpu_env, arg1, arg2, arg3, helper_tmp);     \
2415     tcg_temp_free_i32(helper_tmp);                                \
2416     } while(0)
2417
2418 typedef struct DisasContext {
2419     DisasContextBase base;
2420     target_ulong saved_pc;
2421     target_ulong page_start;
2422     uint32_t opcode;
2423     uint64_t insn_flags;
2424     int32_t CP0_Config1;
2425     int32_t CP0_Config2;
2426     int32_t CP0_Config3;
2427     int32_t CP0_Config5;
2428     /* Routine used to access memory */
2429     int mem_idx;
2430     TCGMemOp default_tcg_memop_mask;
2431     uint32_t hflags, saved_hflags;
2432     target_ulong btarget;
2433     bool ulri;
2434     int kscrexist;
2435     bool rxi;
2436     int ie;
2437     bool bi;
2438     bool bp;
2439     uint64_t PAMask;
2440     bool mvh;
2441     bool eva;
2442     bool sc;
2443     int CP0_LLAddr_shift;
2444     bool ps;
2445     bool vp;
2446     bool cmgcr;
2447     bool mrp;
2448     bool nan2008;
2449     bool abs2008;
2450 } DisasContext;
2451
2452 #define DISAS_STOP       DISAS_TARGET_0
2453 #define DISAS_EXIT       DISAS_TARGET_1
2454
2455 static const char * const regnames[] = {
2456     "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
2457     "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
2458     "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2459     "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
2460 };
2461
2462 static const char * const regnames_HI[] = {
2463     "HI0", "HI1", "HI2", "HI3",
2464 };
2465
2466 static const char * const regnames_LO[] = {
2467     "LO0", "LO1", "LO2", "LO3",
2468 };
2469
2470 static const char * const fregnames[] = {
2471     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
2472     "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
2473     "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
2474     "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
2475 };
2476
2477 static const char * const msaregnames[] = {
2478     "w0.d0",  "w0.d1",  "w1.d0",  "w1.d1",
2479     "w2.d0",  "w2.d1",  "w3.d0",  "w3.d1",
2480     "w4.d0",  "w4.d1",  "w5.d0",  "w5.d1",
2481     "w6.d0",  "w6.d1",  "w7.d0",  "w7.d1",
2482     "w8.d0",  "w8.d1",  "w9.d0",  "w9.d1",
2483     "w10.d0", "w10.d1", "w11.d0", "w11.d1",
2484     "w12.d0", "w12.d1", "w13.d0", "w13.d1",
2485     "w14.d0", "w14.d1", "w15.d0", "w15.d1",
2486     "w16.d0", "w16.d1", "w17.d0", "w17.d1",
2487     "w18.d0", "w18.d1", "w19.d0", "w19.d1",
2488     "w20.d0", "w20.d1", "w21.d0", "w21.d1",
2489     "w22.d0", "w22.d1", "w23.d0", "w23.d1",
2490     "w24.d0", "w24.d1", "w25.d0", "w25.d1",
2491     "w26.d0", "w26.d1", "w27.d0", "w27.d1",
2492     "w28.d0", "w28.d1", "w29.d0", "w29.d1",
2493     "w30.d0", "w30.d1", "w31.d0", "w31.d1",
2494 };
2495
2496 #define LOG_DISAS(...)                                                        \
2497     do {                                                                      \
2498         if (MIPS_DEBUG_DISAS) {                                               \
2499             qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__);                 \
2500         }                                                                     \
2501     } while (0)
2502
2503 #define MIPS_INVAL(op)                                                        \
2504     do {                                                                      \
2505         if (MIPS_DEBUG_DISAS) {                                               \
2506             qemu_log_mask(CPU_LOG_TB_IN_ASM,                                  \
2507                           TARGET_FMT_lx ": %08x Invalid %s %03x %03x %03x\n", \
2508                           ctx->base.pc_next, ctx->opcode, op,                 \
2509                           ctx->opcode >> 26, ctx->opcode & 0x3F,              \
2510                           ((ctx->opcode >> 16) & 0x1F));                      \
2511         }                                                                     \
2512     } while (0)
2513
2514 /* General purpose registers moves. */
2515 static inline void gen_load_gpr (TCGv t, int reg)
2516 {
2517     if (reg == 0)
2518         tcg_gen_movi_tl(t, 0);
2519     else
2520         tcg_gen_mov_tl(t, cpu_gpr[reg]);
2521 }
2522
2523 static inline void gen_store_gpr (TCGv t, int reg)
2524 {
2525     if (reg != 0)
2526         tcg_gen_mov_tl(cpu_gpr[reg], t);
2527 }
2528
2529 /* Moves to/from shadow registers. */
2530 static inline void gen_load_srsgpr (int from, int to)
2531 {
2532     TCGv t0 = tcg_temp_new();
2533
2534     if (from == 0)
2535         tcg_gen_movi_tl(t0, 0);
2536     else {
2537         TCGv_i32 t2 = tcg_temp_new_i32();
2538         TCGv_ptr addr = tcg_temp_new_ptr();
2539
2540         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
2541         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
2542         tcg_gen_andi_i32(t2, t2, 0xf);
2543         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
2544         tcg_gen_ext_i32_ptr(addr, t2);
2545         tcg_gen_add_ptr(addr, cpu_env, addr);
2546
2547         tcg_gen_ld_tl(t0, addr, sizeof(target_ulong) * from);
2548         tcg_temp_free_ptr(addr);
2549         tcg_temp_free_i32(t2);
2550     }
2551     gen_store_gpr(t0, to);
2552     tcg_temp_free(t0);
2553 }
2554
2555 static inline void gen_store_srsgpr (int from, int to)
2556 {
2557     if (to != 0) {
2558         TCGv t0 = tcg_temp_new();
2559         TCGv_i32 t2 = tcg_temp_new_i32();
2560         TCGv_ptr addr = tcg_temp_new_ptr();
2561
2562         gen_load_gpr(t0, from);
2563         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
2564         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
2565         tcg_gen_andi_i32(t2, t2, 0xf);
2566         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
2567         tcg_gen_ext_i32_ptr(addr, t2);
2568         tcg_gen_add_ptr(addr, cpu_env, addr);
2569
2570         tcg_gen_st_tl(t0, addr, sizeof(target_ulong) * to);
2571         tcg_temp_free_ptr(addr);
2572         tcg_temp_free_i32(t2);
2573         tcg_temp_free(t0);
2574     }
2575 }
2576
2577 /* Tests */
2578 static inline void gen_save_pc(target_ulong pc)
2579 {
2580     tcg_gen_movi_tl(cpu_PC, pc);
2581 }
2582
2583 static inline void save_cpu_state(DisasContext *ctx, int do_save_pc)
2584 {
2585     LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags);
2586     if (do_save_pc && ctx->base.pc_next != ctx->saved_pc) {
2587         gen_save_pc(ctx->base.pc_next);
2588         ctx->saved_pc = ctx->base.pc_next;
2589     }
2590     if (ctx->hflags != ctx->saved_hflags) {
2591         tcg_gen_movi_i32(hflags, ctx->hflags);
2592         ctx->saved_hflags = ctx->hflags;
2593         switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
2594         case MIPS_HFLAG_BR:
2595             break;
2596         case MIPS_HFLAG_BC:
2597         case MIPS_HFLAG_BL:
2598         case MIPS_HFLAG_B:
2599             tcg_gen_movi_tl(btarget, ctx->btarget);
2600             break;
2601         }
2602     }
2603 }
2604
2605 static inline void restore_cpu_state(CPUMIPSState *env, DisasContext *ctx)
2606 {
2607     ctx->saved_hflags = ctx->hflags;
2608     switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
2609     case MIPS_HFLAG_BR:
2610         break;
2611     case MIPS_HFLAG_BC:
2612     case MIPS_HFLAG_BL:
2613     case MIPS_HFLAG_B:
2614         ctx->btarget = env->btarget;
2615         break;
2616     }
2617 }
2618
2619 static inline void generate_exception_err(DisasContext *ctx, int excp, int err)
2620 {
2621     TCGv_i32 texcp = tcg_const_i32(excp);
2622     TCGv_i32 terr = tcg_const_i32(err);
2623     save_cpu_state(ctx, 1);
2624     gen_helper_raise_exception_err(cpu_env, texcp, terr);
2625     tcg_temp_free_i32(terr);
2626     tcg_temp_free_i32(texcp);
2627     ctx->base.is_jmp = DISAS_NORETURN;
2628 }
2629
2630 static inline void generate_exception(DisasContext *ctx, int excp)
2631 {
2632     gen_helper_0e0i(raise_exception, excp);
2633 }
2634
2635 static inline void generate_exception_end(DisasContext *ctx, int excp)
2636 {
2637     generate_exception_err(ctx, excp, 0);
2638 }
2639
2640 /* Floating point register moves. */
2641 static void gen_load_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
2642 {
2643     if (ctx->hflags & MIPS_HFLAG_FRE) {
2644         generate_exception(ctx, EXCP_RI);
2645     }
2646     tcg_gen_extrl_i64_i32(t, fpu_f64[reg]);
2647 }
2648
2649 static void gen_store_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
2650 {
2651     TCGv_i64 t64;
2652     if (ctx->hflags & MIPS_HFLAG_FRE) {
2653         generate_exception(ctx, EXCP_RI);
2654     }
2655     t64 = tcg_temp_new_i64();
2656     tcg_gen_extu_i32_i64(t64, t);
2657     tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 0, 32);
2658     tcg_temp_free_i64(t64);
2659 }
2660
2661 static void gen_load_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
2662 {
2663     if (ctx->hflags & MIPS_HFLAG_F64) {
2664         tcg_gen_extrh_i64_i32(t, fpu_f64[reg]);
2665     } else {
2666         gen_load_fpr32(ctx, t, reg | 1);
2667     }
2668 }
2669
2670 static void gen_store_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
2671 {
2672     if (ctx->hflags & MIPS_HFLAG_F64) {
2673         TCGv_i64 t64 = tcg_temp_new_i64();
2674         tcg_gen_extu_i32_i64(t64, t);
2675         tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 32, 32);
2676         tcg_temp_free_i64(t64);
2677     } else {
2678         gen_store_fpr32(ctx, t, reg | 1);
2679     }
2680 }
2681
2682 static void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
2683 {
2684     if (ctx->hflags & MIPS_HFLAG_F64) {
2685         tcg_gen_mov_i64(t, fpu_f64[reg]);
2686     } else {
2687         tcg_gen_concat32_i64(t, fpu_f64[reg & ~1], fpu_f64[reg | 1]);
2688     }
2689 }
2690
2691 static void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
2692 {
2693     if (ctx->hflags & MIPS_HFLAG_F64) {
2694         tcg_gen_mov_i64(fpu_f64[reg], t);
2695     } else {
2696         TCGv_i64 t0;
2697         tcg_gen_deposit_i64(fpu_f64[reg & ~1], fpu_f64[reg & ~1], t, 0, 32);
2698         t0 = tcg_temp_new_i64();
2699         tcg_gen_shri_i64(t0, t, 32);
2700         tcg_gen_deposit_i64(fpu_f64[reg | 1], fpu_f64[reg | 1], t0, 0, 32);
2701         tcg_temp_free_i64(t0);
2702     }
2703 }
2704
2705 static inline int get_fp_bit (int cc)
2706 {
2707     if (cc)
2708         return 24 + cc;
2709     else
2710         return 23;
2711 }
2712
2713 /* Addresses computation */
2714 static inline void gen_op_addr_add (DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1)
2715 {
2716     tcg_gen_add_tl(ret, arg0, arg1);
2717
2718 #if defined(TARGET_MIPS64)
2719     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
2720         tcg_gen_ext32s_i64(ret, ret);
2721     }
2722 #endif
2723 }
2724
2725 static inline void gen_op_addr_addi(DisasContext *ctx, TCGv ret, TCGv base,
2726                                     target_long ofs)
2727 {
2728     tcg_gen_addi_tl(ret, base, ofs);
2729
2730 #if defined(TARGET_MIPS64)
2731     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
2732         tcg_gen_ext32s_i64(ret, ret);
2733     }
2734 #endif
2735 }
2736
2737 /* Addresses computation (translation time) */
2738 static target_long addr_add(DisasContext *ctx, target_long base,
2739                             target_long offset)
2740 {
2741     target_long sum = base + offset;
2742
2743 #if defined(TARGET_MIPS64)
2744     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
2745         sum = (int32_t)sum;
2746     }
2747 #endif
2748     return sum;
2749 }
2750
2751 /* Sign-extract the low 32-bits to a target_long.  */
2752 static inline void gen_move_low32(TCGv ret, TCGv_i64 arg)
2753 {
2754 #if defined(TARGET_MIPS64)
2755     tcg_gen_ext32s_i64(ret, arg);
2756 #else
2757     tcg_gen_extrl_i64_i32(ret, arg);
2758 #endif
2759 }
2760
2761 /* Sign-extract the high 32-bits to a target_long.  */
2762 static inline void gen_move_high32(TCGv ret, TCGv_i64 arg)
2763 {
2764 #if defined(TARGET_MIPS64)
2765     tcg_gen_sari_i64(ret, arg, 32);
2766 #else
2767     tcg_gen_extrh_i64_i32(ret, arg);
2768 #endif
2769 }
2770
2771 static inline void check_cp0_enabled(DisasContext *ctx)
2772 {
2773     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0)))
2774         generate_exception_err(ctx, EXCP_CpU, 0);
2775 }
2776
2777 static inline void check_cp1_enabled(DisasContext *ctx)
2778 {
2779     if (unlikely(!(ctx->hflags & MIPS_HFLAG_FPU)))
2780         generate_exception_err(ctx, EXCP_CpU, 1);
2781 }
2782
2783 /* Verify that the processor is running with COP1X instructions enabled.
2784    This is associated with the nabla symbol in the MIPS32 and MIPS64
2785    opcode tables.  */
2786
2787 static inline void check_cop1x(DisasContext *ctx)
2788 {
2789     if (unlikely(!(ctx->hflags & MIPS_HFLAG_COP1X)))
2790         generate_exception_end(ctx, EXCP_RI);
2791 }
2792
2793 /* Verify that the processor is running with 64-bit floating-point
2794    operations enabled.  */
2795
2796 static inline void check_cp1_64bitmode(DisasContext *ctx)
2797 {
2798     if (unlikely(~ctx->hflags & (MIPS_HFLAG_F64 | MIPS_HFLAG_COP1X)))
2799         generate_exception_end(ctx, EXCP_RI);
2800 }
2801
2802 /*
2803  * Verify if floating point register is valid; an operation is not defined
2804  * if bit 0 of any register specification is set and the FR bit in the
2805  * Status register equals zero, since the register numbers specify an
2806  * even-odd pair of adjacent coprocessor general registers. When the FR bit
2807  * in the Status register equals one, both even and odd register numbers
2808  * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers.
2809  *
2810  * Multiple 64 bit wide registers can be checked by calling
2811  * gen_op_cp1_registers(freg1 | freg2 | ... | fregN);
2812  */
2813 static inline void check_cp1_registers(DisasContext *ctx, int regs)
2814 {
2815     if (unlikely(!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1)))
2816         generate_exception_end(ctx, EXCP_RI);
2817 }
2818
2819 /* Verify that the processor is running with DSP instructions enabled.
2820    This is enabled by CP0 Status register MX(24) bit.
2821  */
2822
2823 static inline void check_dsp(DisasContext *ctx)
2824 {
2825     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP))) {
2826         if (ctx->insn_flags & ASE_DSP) {
2827             generate_exception_end(ctx, EXCP_DSPDIS);
2828         } else {
2829             generate_exception_end(ctx, EXCP_RI);
2830         }
2831     }
2832 }
2833
2834 static inline void check_dsp_r2(DisasContext *ctx)
2835 {
2836     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP_R2))) {
2837         if (ctx->insn_flags & ASE_DSP) {
2838             generate_exception_end(ctx, EXCP_DSPDIS);
2839         } else {
2840             generate_exception_end(ctx, EXCP_RI);
2841         }
2842     }
2843 }
2844
2845 static inline void check_dsp_r3(DisasContext *ctx)
2846 {
2847     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP_R3))) {
2848         if (ctx->insn_flags & ASE_DSP) {
2849             generate_exception_end(ctx, EXCP_DSPDIS);
2850         } else {
2851             generate_exception_end(ctx, EXCP_RI);
2852         }
2853     }
2854 }
2855
2856 /* This code generates a "reserved instruction" exception if the
2857    CPU does not support the instruction set corresponding to flags. */
2858 static inline void check_insn(DisasContext *ctx, uint64_t flags)
2859 {
2860     if (unlikely(!(ctx->insn_flags & flags))) {
2861         generate_exception_end(ctx, EXCP_RI);
2862     }
2863 }
2864
2865 /* This code generates a "reserved instruction" exception if the
2866    CPU has corresponding flag set which indicates that the instruction
2867    has been removed. */
2868 static inline void check_insn_opc_removed(DisasContext *ctx, uint64_t flags)
2869 {
2870     if (unlikely(ctx->insn_flags & flags)) {
2871         generate_exception_end(ctx, EXCP_RI);
2872     }
2873 }
2874
2875 /* This code generates a "reserved instruction" exception if the
2876    CPU does not support 64-bit paired-single (PS) floating point data type */
2877 static inline void check_ps(DisasContext *ctx)
2878 {
2879     if (unlikely(!ctx->ps)) {
2880         generate_exception(ctx, EXCP_RI);
2881     }
2882     check_cp1_64bitmode(ctx);
2883 }
2884
2885 #ifdef TARGET_MIPS64
2886 /* This code generates a "reserved instruction" exception if 64-bit
2887    instructions are not enabled. */
2888 static inline void check_mips_64(DisasContext *ctx)
2889 {
2890     if (unlikely(!(ctx->hflags & MIPS_HFLAG_64)))
2891         generate_exception_end(ctx, EXCP_RI);
2892 }
2893 #endif
2894
2895 #ifndef CONFIG_USER_ONLY
2896 static inline void check_mvh(DisasContext *ctx)
2897 {
2898     if (unlikely(!ctx->mvh)) {
2899         generate_exception(ctx, EXCP_RI);
2900     }
2901 }
2902 #endif
2903
2904 /*
2905  * This code generates a "reserved instruction" exception if the
2906  * Config5 XNP bit is set.
2907  */
2908 static inline void check_xnp(DisasContext *ctx)
2909 {
2910     if (unlikely(ctx->CP0_Config5 & (1 << CP0C5_XNP))) {
2911         generate_exception_end(ctx, EXCP_RI);
2912     }
2913 }
2914
2915 #ifndef CONFIG_USER_ONLY
2916 /*
2917  * This code generates a "reserved instruction" exception if the
2918  * Config3 PW bit is NOT set.
2919  */
2920 static inline void check_pw(DisasContext *ctx)
2921 {
2922     if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_PW)))) {
2923         generate_exception_end(ctx, EXCP_RI);
2924     }
2925 }
2926 #endif
2927
2928 /*
2929  * This code generates a "reserved instruction" exception if the
2930  * Config3 MT bit is NOT set.
2931  */
2932 static inline void check_mt(DisasContext *ctx)
2933 {
2934     if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_MT)))) {
2935         generate_exception_end(ctx, EXCP_RI);
2936     }
2937 }
2938
2939 #ifndef CONFIG_USER_ONLY
2940 /*
2941  * This code generates a "coprocessor unusable" exception if CP0 is not
2942  * available, and, if that is not the case, generates a "reserved instruction"
2943  * exception if the Config5 MT bit is NOT set. This is needed for availability
2944  * control of some of MT ASE instructions.
2945  */
2946 static inline void check_cp0_mt(DisasContext *ctx)
2947 {
2948     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0))) {
2949         generate_exception_err(ctx, EXCP_CpU, 0);
2950     } else {
2951         if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_MT)))) {
2952             generate_exception_err(ctx, EXCP_RI, 0);
2953         }
2954     }
2955 }
2956 #endif
2957
2958 /*
2959  * This code generates a "reserved instruction" exception if the
2960  * Config5 NMS bit is set.
2961  */
2962 static inline void check_nms(DisasContext *ctx)
2963 {
2964     if (unlikely(ctx->CP0_Config5 & (1 << CP0C5_NMS))) {
2965         generate_exception_end(ctx, EXCP_RI);
2966     }
2967 }
2968
2969
2970 /* Define small wrappers for gen_load_fpr* so that we have a uniform
2971    calling interface for 32 and 64-bit FPRs.  No sense in changing
2972    all callers for gen_load_fpr32 when we need the CTX parameter for
2973    this one use.  */
2974 #define gen_ldcmp_fpr32(ctx, x, y) gen_load_fpr32(ctx, x, y)
2975 #define gen_ldcmp_fpr64(ctx, x, y) gen_load_fpr64(ctx, x, y)
2976 #define FOP_CONDS(type, abs, fmt, ifmt, bits)                                 \
2977 static inline void gen_cmp ## type ## _ ## fmt(DisasContext *ctx, int n,      \
2978                                                int ft, int fs, int cc)        \
2979 {                                                                             \
2980     TCGv_i##bits fp0 = tcg_temp_new_i##bits ();                               \
2981     TCGv_i##bits fp1 = tcg_temp_new_i##bits ();                               \
2982     switch (ifmt) {                                                           \
2983     case FMT_PS:                                                              \
2984         check_ps(ctx);                                                        \
2985         break;                                                                \
2986     case FMT_D:                                                               \
2987         if (abs) {                                                            \
2988             check_cop1x(ctx);                                                 \
2989         }                                                                     \
2990         check_cp1_registers(ctx, fs | ft);                                    \
2991         break;                                                                \
2992     case FMT_S:                                                               \
2993         if (abs) {                                                            \
2994             check_cop1x(ctx);                                                 \
2995         }                                                                     \
2996         break;                                                                \
2997     }                                                                         \
2998     gen_ldcmp_fpr##bits (ctx, fp0, fs);                                       \
2999     gen_ldcmp_fpr##bits (ctx, fp1, ft);                                       \
3000     switch (n) {                                                              \
3001     case  0: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc);    break;\
3002     case  1: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc);   break;\
3003     case  2: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc);   break;\
3004     case  3: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc);  break;\
3005     case  4: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc);  break;\
3006     case  5: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc);  break;\
3007     case  6: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc);  break;\
3008     case  7: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc);  break;\
3009     case  8: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc);   break;\
3010     case  9: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc); break;\
3011     case 10: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc);  break;\
3012     case 11: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc);  break;\
3013     case 12: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc);   break;\
3014     case 13: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc);  break;\
3015     case 14: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc);   break;\
3016     case 15: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc);  break;\
3017     default: abort();                                                         \
3018     }                                                                         \
3019     tcg_temp_free_i##bits (fp0);                                              \
3020     tcg_temp_free_i##bits (fp1);                                              \
3021 }
3022
3023 FOP_CONDS(, 0, d, FMT_D, 64)
3024 FOP_CONDS(abs, 1, d, FMT_D, 64)
3025 FOP_CONDS(, 0, s, FMT_S, 32)
3026 FOP_CONDS(abs, 1, s, FMT_S, 32)
3027 FOP_CONDS(, 0, ps, FMT_PS, 64)
3028 FOP_CONDS(abs, 1, ps, FMT_PS, 64)
3029 #undef FOP_CONDS
3030
3031 #define FOP_CONDNS(fmt, ifmt, bits, STORE)                              \
3032 static inline void gen_r6_cmp_ ## fmt(DisasContext * ctx, int n,        \
3033                                       int ft, int fs, int fd)           \
3034 {                                                                       \
3035     TCGv_i ## bits fp0 = tcg_temp_new_i ## bits();                      \
3036     TCGv_i ## bits fp1 = tcg_temp_new_i ## bits();                      \
3037     if (ifmt == FMT_D) {                                                \
3038         check_cp1_registers(ctx, fs | ft | fd);                         \
3039     }                                                                   \
3040     gen_ldcmp_fpr ## bits(ctx, fp0, fs);                                \
3041     gen_ldcmp_fpr ## bits(ctx, fp1, ft);                                \
3042     switch (n) {                                                        \
3043     case  0:                                                            \
3044         gen_helper_r6_cmp_ ## fmt ## _af(fp0, cpu_env, fp0, fp1);       \
3045         break;                                                          \
3046     case  1:                                                            \
3047         gen_helper_r6_cmp_ ## fmt ## _un(fp0, cpu_env, fp0, fp1);       \
3048         break;                                                          \
3049     case  2:                                                            \
3050         gen_helper_r6_cmp_ ## fmt ## _eq(fp0, cpu_env, fp0, fp1);       \
3051         break;                                                          \
3052     case  3:                                                            \
3053         gen_helper_r6_cmp_ ## fmt ## _ueq(fp0, cpu_env, fp0, fp1);      \
3054         break;                                                          \
3055     case  4:                                                            \
3056         gen_helper_r6_cmp_ ## fmt ## _lt(fp0, cpu_env, fp0, fp1);       \
3057         break;                                                          \
3058     case  5:                                                            \
3059         gen_helper_r6_cmp_ ## fmt ## _ult(fp0, cpu_env, fp0, fp1);      \
3060         break;                                                          \
3061     case  6:                                                            \
3062         gen_helper_r6_cmp_ ## fmt ## _le(fp0, cpu_env, fp0, fp1);       \
3063         break;                                                          \
3064     case  7:                                                            \
3065         gen_helper_r6_cmp_ ## fmt ## _ule(fp0, cpu_env, fp0, fp1);      \
3066         break;                                                          \
3067     case  8:                                                            \
3068         gen_helper_r6_cmp_ ## fmt ## _saf(fp0, cpu_env, fp0, fp1);      \
3069         break;                                                          \
3070     case  9:                                                            \
3071         gen_helper_r6_cmp_ ## fmt ## _sun(fp0, cpu_env, fp0, fp1);      \
3072         break;                                                          \
3073     case 10:                                                            \
3074         gen_helper_r6_cmp_ ## fmt ## _seq(fp0, cpu_env, fp0, fp1);      \
3075         break;                                                          \
3076     case 11:                                                            \
3077         gen_helper_r6_cmp_ ## fmt ## _sueq(fp0, cpu_env, fp0, fp1);     \
3078         break;                                                          \
3079     case 12:                                                            \
3080         gen_helper_r6_cmp_ ## fmt ## _slt(fp0, cpu_env, fp0, fp1);      \
3081         break;                                                          \
3082     case 13:                                                            \
3083         gen_helper_r6_cmp_ ## fmt ## _sult(fp0, cpu_env, fp0, fp1);     \
3084         break;                                                          \
3085     case 14:                                                            \
3086         gen_helper_r6_cmp_ ## fmt ## _sle(fp0, cpu_env, fp0, fp1);      \
3087         break;                                                          \
3088     case 15:                                                            \
3089         gen_helper_r6_cmp_ ## fmt ## _sule(fp0, cpu_env, fp0, fp1);     \
3090         break;                                                          \
3091     case 17:                                                            \
3092         gen_helper_r6_cmp_ ## fmt ## _or(fp0, cpu_env, fp0, fp1);       \
3093         break;                                                          \
3094     case 18:                                                            \
3095         gen_helper_r6_cmp_ ## fmt ## _une(fp0, cpu_env, fp0, fp1);      \
3096         break;                                                          \
3097     case 19:                                                            \
3098         gen_helper_r6_cmp_ ## fmt ## _ne(fp0, cpu_env, fp0, fp1);       \
3099         break;                                                          \
3100     case 25:                                                            \
3101         gen_helper_r6_cmp_ ## fmt ## _sor(fp0, cpu_env, fp0, fp1);      \
3102         break;                                                          \
3103     case 26:                                                            \
3104         gen_helper_r6_cmp_ ## fmt ## _sune(fp0, cpu_env, fp0, fp1);     \
3105         break;                                                          \
3106     case 27:                                                            \
3107         gen_helper_r6_cmp_ ## fmt ## _sne(fp0, cpu_env, fp0, fp1);      \
3108         break;                                                          \
3109     default:                                                            \
3110         abort();                                                        \
3111     }                                                                   \
3112     STORE;                                                              \
3113     tcg_temp_free_i ## bits (fp0);                                      \
3114     tcg_temp_free_i ## bits (fp1);                                      \
3115 }
3116
3117 FOP_CONDNS(d, FMT_D, 64, gen_store_fpr64(ctx, fp0, fd))
3118 FOP_CONDNS(s, FMT_S, 32, gen_store_fpr32(ctx, fp0, fd))
3119 #undef FOP_CONDNS
3120 #undef gen_ldcmp_fpr32
3121 #undef gen_ldcmp_fpr64
3122
3123 /* load/store instructions. */
3124 #ifdef CONFIG_USER_ONLY
3125 #define OP_LD_ATOMIC(insn,fname)                                           \
3126 static inline void op_ld_##insn(TCGv ret, TCGv arg1, int mem_idx,          \
3127                                 DisasContext *ctx)                         \
3128 {                                                                          \
3129     TCGv t0 = tcg_temp_new();                                              \
3130     tcg_gen_mov_tl(t0, arg1);                                              \
3131     tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                         \
3132     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                \
3133     tcg_gen_st_tl(ret, cpu_env, offsetof(CPUMIPSState, llval));                \
3134     tcg_temp_free(t0);                                                     \
3135 }
3136 #else
3137 #define OP_LD_ATOMIC(insn,fname)                                           \
3138 static inline void op_ld_##insn(TCGv ret, TCGv arg1, int mem_idx,          \
3139                                 DisasContext *ctx)                         \
3140 {                                                                          \
3141     gen_helper_1e1i(insn, ret, arg1, mem_idx);                             \
3142 }
3143 #endif
3144 OP_LD_ATOMIC(ll,ld32s);
3145 #if defined(TARGET_MIPS64)
3146 OP_LD_ATOMIC(lld,ld64);
3147 #endif
3148 #undef OP_LD_ATOMIC
3149
3150 #ifdef CONFIG_USER_ONLY
3151 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
3152 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, int mem_idx,   \
3153                                 DisasContext *ctx)                           \
3154 {                                                                            \
3155     TCGv t0 = tcg_temp_new();                                                \
3156     TCGLabel *l1 = gen_new_label();                                          \
3157     TCGLabel *l2 = gen_new_label();                                          \
3158                                                                              \
3159     tcg_gen_andi_tl(t0, arg2, almask);                                       \
3160     tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1);                              \
3161     tcg_gen_st_tl(arg2, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));          \
3162     generate_exception(ctx, EXCP_AdES);                                      \
3163     gen_set_label(l1);                                                       \
3164     tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                  \
3165     tcg_gen_brcond_tl(TCG_COND_NE, arg2, t0, l2);                            \
3166     tcg_gen_movi_tl(t0, rt | ((almask << 3) & 0x20));                        \
3167     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, llreg));                   \
3168     tcg_gen_st_tl(arg1, cpu_env, offsetof(CPUMIPSState, llnewval));              \
3169     generate_exception_end(ctx, EXCP_SC);                                    \
3170     gen_set_label(l2);                                                       \
3171     tcg_gen_movi_tl(t0, 0);                                                  \
3172     gen_store_gpr(t0, rt);                                                   \
3173     tcg_temp_free(t0);                                                       \
3174 }
3175 #else
3176 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
3177 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, int mem_idx,   \
3178                                 DisasContext *ctx)                           \
3179 {                                                                            \
3180     TCGv t0 = tcg_temp_new();                                                \
3181     gen_helper_1e2i(insn, t0, arg1, arg2, mem_idx);                          \
3182     gen_store_gpr(t0, rt);                                                   \
3183     tcg_temp_free(t0);                                                       \
3184 }
3185 #endif
3186 OP_ST_ATOMIC(sc,st32,ld32s,0x3);
3187 #if defined(TARGET_MIPS64)
3188 OP_ST_ATOMIC(scd,st64,ld64,0x7);
3189 #endif
3190 #undef OP_ST_ATOMIC
3191
3192 static void gen_base_offset_addr (DisasContext *ctx, TCGv addr,
3193                                   int base, int offset)
3194 {
3195     if (base == 0) {
3196         tcg_gen_movi_tl(addr, offset);
3197     } else if (offset == 0) {
3198         gen_load_gpr(addr, base);
3199     } else {
3200         tcg_gen_movi_tl(addr, offset);
3201         gen_op_addr_add(ctx, addr, cpu_gpr[base], addr);
3202     }
3203 }
3204
3205 static target_ulong pc_relative_pc (DisasContext *ctx)
3206 {
3207     target_ulong pc = ctx->base.pc_next;
3208
3209     if (ctx->hflags & MIPS_HFLAG_BMASK) {
3210         int branch_bytes = ctx->hflags & MIPS_HFLAG_BDS16 ? 2 : 4;
3211
3212         pc -= branch_bytes;
3213     }
3214
3215     pc &= ~(target_ulong)3;
3216     return pc;
3217 }
3218
3219 /* Load */
3220 static void gen_ld(DisasContext *ctx, uint32_t opc,
3221                    int rt, int base, int offset)
3222 {
3223     TCGv t0, t1, t2;
3224     int mem_idx = ctx->mem_idx;
3225
3226     if (rt == 0 && ctx->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)) {
3227         /* Loongson CPU uses a load to zero register for prefetch.
3228            We emulate it as a NOP. On other CPU we must perform the
3229            actual memory access. */
3230         return;
3231     }
3232
3233     t0 = tcg_temp_new();
3234     gen_base_offset_addr(ctx, t0, base, offset);
3235
3236     switch (opc) {
3237 #if defined(TARGET_MIPS64)
3238     case OPC_LWU:
3239         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL |
3240                            ctx->default_tcg_memop_mask);
3241         gen_store_gpr(t0, rt);
3242         break;
3243     case OPC_LD:
3244         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ |
3245                            ctx->default_tcg_memop_mask);
3246         gen_store_gpr(t0, rt);
3247         break;
3248     case OPC_LLD:
3249     case R6_OPC_LLD:
3250         op_ld_lld(t0, t0, mem_idx, ctx);
3251         gen_store_gpr(t0, rt);
3252         break;
3253     case OPC_LDL:
3254         t1 = tcg_temp_new();
3255         /* Do a byte access to possibly trigger a page
3256            fault with the unaligned address.  */
3257         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
3258         tcg_gen_andi_tl(t1, t0, 7);
3259 #ifndef TARGET_WORDS_BIGENDIAN
3260         tcg_gen_xori_tl(t1, t1, 7);
3261 #endif
3262         tcg_gen_shli_tl(t1, t1, 3);
3263         tcg_gen_andi_tl(t0, t0, ~7);
3264         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
3265         tcg_gen_shl_tl(t0, t0, t1);
3266         t2 = tcg_const_tl(-1);
3267         tcg_gen_shl_tl(t2, t2, t1);
3268         gen_load_gpr(t1, rt);
3269         tcg_gen_andc_tl(t1, t1, t2);
3270         tcg_temp_free(t2);
3271         tcg_gen_or_tl(t0, t0, t1);
3272         tcg_temp_free(t1);
3273         gen_store_gpr(t0, rt);
3274         break;
3275     case OPC_LDR:
3276         t1 = tcg_temp_new();
3277         /* Do a byte access to possibly trigger a page
3278            fault with the unaligned address.  */
3279         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
3280         tcg_gen_andi_tl(t1, t0, 7);
3281 #ifdef TARGET_WORDS_BIGENDIAN
3282         tcg_gen_xori_tl(t1, t1, 7);
3283 #endif
3284         tcg_gen_shli_tl(t1, t1, 3);
3285         tcg_gen_andi_tl(t0, t0, ~7);
3286         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
3287         tcg_gen_shr_tl(t0, t0, t1);
3288         tcg_gen_xori_tl(t1, t1, 63);
3289         t2 = tcg_const_tl(0xfffffffffffffffeull);
3290         tcg_gen_shl_tl(t2, t2, t1);
3291         gen_load_gpr(t1, rt);
3292         tcg_gen_and_tl(t1, t1, t2);
3293         tcg_temp_free(t2);
3294         tcg_gen_or_tl(t0, t0, t1);
3295         tcg_temp_free(t1);
3296         gen_store_gpr(t0, rt);
3297         break;
3298     case OPC_LDPC:
3299         t1 = tcg_const_tl(pc_relative_pc(ctx));
3300         gen_op_addr_add(ctx, t0, t0, t1);
3301         tcg_temp_free(t1);
3302         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
3303         gen_store_gpr(t0, rt);
3304         break;
3305 #endif
3306     case OPC_LWPC:
3307         t1 = tcg_const_tl(pc_relative_pc(ctx));
3308         gen_op_addr_add(ctx, t0, t0, t1);
3309         tcg_temp_free(t1);
3310         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESL);
3311         gen_store_gpr(t0, rt);
3312         break;
3313     case OPC_LWE:
3314         mem_idx = MIPS_HFLAG_UM;
3315         /* fall through */
3316     case OPC_LW:
3317         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESL |
3318                            ctx->default_tcg_memop_mask);
3319         gen_store_gpr(t0, rt);
3320         break;
3321     case OPC_LHE:
3322         mem_idx = MIPS_HFLAG_UM;
3323         /* fall through */
3324     case OPC_LH:
3325         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESW |
3326                            ctx->default_tcg_memop_mask);
3327         gen_store_gpr(t0, rt);
3328         break;
3329     case OPC_LHUE:
3330         mem_idx = MIPS_HFLAG_UM;
3331         /* fall through */
3332     case OPC_LHU:
3333         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUW |
3334                            ctx->default_tcg_memop_mask);
3335         gen_store_gpr(t0, rt);
3336         break;
3337     case OPC_LBE:
3338         mem_idx = MIPS_HFLAG_UM;
3339         /* fall through */
3340     case OPC_LB:
3341         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_SB);
3342         gen_store_gpr(t0, rt);
3343         break;
3344     case OPC_LBUE:
3345         mem_idx = MIPS_HFLAG_UM;
3346         /* fall through */
3347     case OPC_LBU:
3348         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_UB);
3349         gen_store_gpr(t0, rt);
3350         break;
3351     case OPC_LWLE:
3352         mem_idx = MIPS_HFLAG_UM;
3353         /* fall through */
3354     case OPC_LWL:
3355         t1 = tcg_temp_new();
3356         /* Do a byte access to possibly trigger a page
3357            fault with the unaligned address.  */
3358         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
3359         tcg_gen_andi_tl(t1, t0, 3);
3360 #ifndef TARGET_WORDS_BIGENDIAN
3361         tcg_gen_xori_tl(t1, t1, 3);
3362 #endif
3363         tcg_gen_shli_tl(t1, t1, 3);
3364         tcg_gen_andi_tl(t0, t0, ~3);
3365         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL);
3366         tcg_gen_shl_tl(t0, t0, t1);
3367         t2 = tcg_const_tl(-1);
3368         tcg_gen_shl_tl(t2, t2, t1);
3369         gen_load_gpr(t1, rt);
3370         tcg_gen_andc_tl(t1, t1, t2);
3371         tcg_temp_free(t2);
3372         tcg_gen_or_tl(t0, t0, t1);
3373         tcg_temp_free(t1);
3374         tcg_gen_ext32s_tl(t0, t0);
3375         gen_store_gpr(t0, rt);
3376         break;
3377     case OPC_LWRE:
3378         mem_idx = MIPS_HFLAG_UM;
3379         /* fall through */
3380     case OPC_LWR:
3381         t1 = tcg_temp_new();
3382         /* Do a byte access to possibly trigger a page
3383            fault with the unaligned address.  */
3384         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
3385         tcg_gen_andi_tl(t1, t0, 3);
3386 #ifdef TARGET_WORDS_BIGENDIAN
3387         tcg_gen_xori_tl(t1, t1, 3);
3388 #endif
3389         tcg_gen_shli_tl(t1, t1, 3);
3390         tcg_gen_andi_tl(t0, t0, ~3);
3391         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL);
3392         tcg_gen_shr_tl(t0, t0, t1);
3393         tcg_gen_xori_tl(t1, t1, 31);
3394         t2 = tcg_const_tl(0xfffffffeull);
3395         tcg_gen_shl_tl(t2, t2, t1);
3396         gen_load_gpr(t1, rt);
3397         tcg_gen_and_tl(t1, t1, t2);
3398         tcg_temp_free(t2);
3399         tcg_gen_or_tl(t0, t0, t1);
3400         tcg_temp_free(t1);
3401         tcg_gen_ext32s_tl(t0, t0);
3402         gen_store_gpr(t0, rt);
3403         break;
3404     case OPC_LLE:
3405         mem_idx = MIPS_HFLAG_UM;
3406         /* fall through */
3407     case OPC_LL:
3408     case R6_OPC_LL:
3409         op_ld_ll(t0, t0, mem_idx, ctx);
3410         gen_store_gpr(t0, rt);
3411         break;
3412     }
3413     tcg_temp_free(t0);
3414 }
3415
3416 static void gen_llwp(DisasContext *ctx, uint32_t base, int16_t offset,
3417                     uint32_t reg1, uint32_t reg2)
3418 {
3419     TCGv taddr = tcg_temp_new();
3420     TCGv_i64 tval = tcg_temp_new_i64();
3421     TCGv tmp1 = tcg_temp_new();
3422     TCGv tmp2 = tcg_temp_new();
3423
3424     gen_base_offset_addr(ctx, taddr, base, offset);
3425     tcg_gen_qemu_ld64(tval, taddr, ctx->mem_idx);
3426 #ifdef TARGET_WORDS_BIGENDIAN
3427     tcg_gen_extr_i64_tl(tmp2, tmp1, tval);
3428 #else
3429     tcg_gen_extr_i64_tl(tmp1, tmp2, tval);
3430 #endif
3431     gen_store_gpr(tmp1, reg1);
3432     tcg_temp_free(tmp1);
3433     gen_store_gpr(tmp2, reg2);
3434     tcg_temp_free(tmp2);
3435     tcg_gen_st_i64(tval, cpu_env, offsetof(CPUMIPSState, llval_wp));
3436     tcg_temp_free_i64(tval);
3437     tcg_gen_st_tl(taddr, cpu_env, offsetof(CPUMIPSState, lladdr));
3438     tcg_temp_free(taddr);
3439 }
3440
3441 /* Store */
3442 static void gen_st (DisasContext *ctx, uint32_t opc, int rt,
3443                     int base, int offset)
3444 {
3445     TCGv t0 = tcg_temp_new();
3446     TCGv t1 = tcg_temp_new();
3447     int mem_idx = ctx->mem_idx;
3448
3449     gen_base_offset_addr(ctx, t0, base, offset);
3450     gen_load_gpr(t1, rt);
3451     switch (opc) {
3452 #if defined(TARGET_MIPS64)
3453     case OPC_SD:
3454         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEQ |
3455                            ctx->default_tcg_memop_mask);
3456         break;
3457     case OPC_SDL:
3458         gen_helper_0e2i(sdl, t1, t0, mem_idx);
3459         break;
3460     case OPC_SDR:
3461         gen_helper_0e2i(sdr, t1, t0, mem_idx);
3462         break;
3463 #endif
3464     case OPC_SWE:
3465         mem_idx = MIPS_HFLAG_UM;
3466         /* fall through */
3467     case OPC_SW:
3468         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEUL |
3469                            ctx->default_tcg_memop_mask);
3470         break;
3471     case OPC_SHE:
3472         mem_idx = MIPS_HFLAG_UM;
3473         /* fall through */
3474     case OPC_SH:
3475         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEUW |
3476                            ctx->default_tcg_memop_mask);
3477         break;
3478     case OPC_SBE:
3479         mem_idx = MIPS_HFLAG_UM;
3480         /* fall through */
3481     case OPC_SB:
3482         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_8);
3483         break;
3484     case OPC_SWLE:
3485         mem_idx = MIPS_HFLAG_UM;
3486         /* fall through */
3487     case OPC_SWL:
3488         gen_helper_0e2i(swl, t1, t0, mem_idx);
3489         break;
3490     case OPC_SWRE:
3491         mem_idx = MIPS_HFLAG_UM;
3492         /* fall through */
3493     case OPC_SWR:
3494         gen_helper_0e2i(swr, t1, t0, mem_idx);
3495         break;
3496     }
3497     tcg_temp_free(t0);
3498     tcg_temp_free(t1);
3499 }
3500
3501
3502 /* Store conditional */
3503 static void gen_st_cond (DisasContext *ctx, uint32_t opc, int rt,
3504                          int base, int16_t offset)
3505 {
3506     TCGv t0, t1;
3507     int mem_idx = ctx->mem_idx;
3508
3509 #ifdef CONFIG_USER_ONLY
3510     t0 = tcg_temp_local_new();
3511     t1 = tcg_temp_local_new();
3512 #else
3513     t0 = tcg_temp_new();
3514     t1 = tcg_temp_new();
3515 #endif
3516     gen_base_offset_addr(ctx, t0, base, offset);
3517     gen_load_gpr(t1, rt);
3518     switch (opc) {
3519 #if defined(TARGET_MIPS64)
3520     case OPC_SCD:
3521     case R6_OPC_SCD:
3522         op_st_scd(t1, t0, rt, mem_idx, ctx);
3523         break;
3524 #endif
3525     case OPC_SCE:
3526         mem_idx = MIPS_HFLAG_UM;
3527         /* fall through */
3528     case OPC_SC:
3529     case R6_OPC_SC:
3530         op_st_sc(t1, t0, rt, mem_idx, ctx);
3531         break;
3532     }
3533     tcg_temp_free(t1);
3534     tcg_temp_free(t0);
3535 }
3536
3537 static void gen_scwp(DisasContext *ctx, uint32_t base, int16_t offset,
3538                     uint32_t reg1, uint32_t reg2)
3539 {
3540     TCGv taddr = tcg_temp_local_new();
3541     TCGv lladdr = tcg_temp_local_new();
3542     TCGv_i64 tval = tcg_temp_new_i64();
3543     TCGv_i64 llval = tcg_temp_new_i64();
3544     TCGv_i64 val = tcg_temp_new_i64();
3545     TCGv tmp1 = tcg_temp_new();
3546     TCGv tmp2 = tcg_temp_new();
3547     TCGLabel *lab_fail = gen_new_label();
3548     TCGLabel *lab_done = gen_new_label();
3549
3550     gen_base_offset_addr(ctx, taddr, base, offset);
3551
3552     tcg_gen_ld_tl(lladdr, cpu_env, offsetof(CPUMIPSState, lladdr));
3553     tcg_gen_brcond_tl(TCG_COND_NE, taddr, lladdr, lab_fail);
3554
3555     gen_load_gpr(tmp1, reg1);
3556     gen_load_gpr(tmp2, reg2);
3557
3558 #ifdef TARGET_WORDS_BIGENDIAN
3559     tcg_gen_concat_tl_i64(tval, tmp2, tmp1);
3560 #else
3561     tcg_gen_concat_tl_i64(tval, tmp1, tmp2);
3562 #endif
3563
3564     tcg_gen_ld_i64(llval, cpu_env, offsetof(CPUMIPSState, llval_wp));
3565     tcg_gen_atomic_cmpxchg_i64(val, taddr, llval, tval,
3566                                ctx->mem_idx, MO_64);
3567     if (reg1 != 0) {
3568         tcg_gen_movi_tl(cpu_gpr[reg1], 1);
3569     }
3570     tcg_gen_brcond_i64(TCG_COND_EQ, val, llval, lab_done);
3571
3572     gen_set_label(lab_fail);
3573
3574     if (reg1 != 0) {
3575         tcg_gen_movi_tl(cpu_gpr[reg1], 0);
3576     }
3577     gen_set_label(lab_done);
3578     tcg_gen_movi_tl(lladdr, -1);
3579     tcg_gen_st_tl(lladdr, cpu_env, offsetof(CPUMIPSState, lladdr));
3580 }
3581
3582 /* Load and store */
3583 static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
3584                           TCGv t0)
3585 {
3586     /* Don't do NOP if destination is zero: we must perform the actual
3587        memory access. */
3588     switch (opc) {
3589     case OPC_LWC1:
3590         {
3591             TCGv_i32 fp0 = tcg_temp_new_i32();
3592             tcg_gen_qemu_ld_i32(fp0, t0, ctx->mem_idx, MO_TESL |
3593                                 ctx->default_tcg_memop_mask);
3594             gen_store_fpr32(ctx, fp0, ft);
3595             tcg_temp_free_i32(fp0);
3596         }
3597         break;
3598     case OPC_SWC1:
3599         {
3600             TCGv_i32 fp0 = tcg_temp_new_i32();
3601             gen_load_fpr32(ctx, fp0, ft);
3602             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL |
3603                                 ctx->default_tcg_memop_mask);
3604             tcg_temp_free_i32(fp0);
3605         }
3606         break;
3607     case OPC_LDC1:
3608         {
3609             TCGv_i64 fp0 = tcg_temp_new_i64();
3610             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
3611                                 ctx->default_tcg_memop_mask);
3612             gen_store_fpr64(ctx, fp0, ft);
3613             tcg_temp_free_i64(fp0);
3614         }
3615         break;
3616     case OPC_SDC1:
3617         {
3618             TCGv_i64 fp0 = tcg_temp_new_i64();
3619             gen_load_fpr64(ctx, fp0, ft);
3620             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
3621                                 ctx->default_tcg_memop_mask);
3622             tcg_temp_free_i64(fp0);
3623         }
3624         break;
3625     default:
3626         MIPS_INVAL("flt_ldst");
3627         generate_exception_end(ctx, EXCP_RI);
3628         break;
3629     }
3630 }
3631
3632 static void gen_cop1_ldst(DisasContext *ctx, uint32_t op, int rt,
3633                           int rs, int16_t imm)
3634 {
3635     TCGv t0 = tcg_temp_new();
3636
3637     if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
3638         check_cp1_enabled(ctx);
3639         switch (op) {
3640         case OPC_LDC1:
3641         case OPC_SDC1:
3642             check_insn(ctx, ISA_MIPS2);
3643             /* Fallthrough */
3644         default:
3645             gen_base_offset_addr(ctx, t0, rs, imm);
3646             gen_flt_ldst(ctx, op, rt, t0);
3647         }
3648     } else {
3649         generate_exception_err(ctx, EXCP_CpU, 1);
3650     }
3651     tcg_temp_free(t0);
3652 }
3653
3654 /* Arithmetic with immediate operand */
3655 static void gen_arith_imm(DisasContext *ctx, uint32_t opc,
3656                           int rt, int rs, int imm)
3657 {
3658     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
3659
3660     if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) {
3661         /* If no destination, treat it as a NOP.
3662            For addi, we must generate the overflow exception when needed. */
3663         return;
3664     }
3665     switch (opc) {
3666     case OPC_ADDI:
3667         {
3668             TCGv t0 = tcg_temp_local_new();
3669             TCGv t1 = tcg_temp_new();
3670             TCGv t2 = tcg_temp_new();
3671             TCGLabel *l1 = gen_new_label();
3672
3673             gen_load_gpr(t1, rs);
3674             tcg_gen_addi_tl(t0, t1, uimm);
3675             tcg_gen_ext32s_tl(t0, t0);
3676
3677             tcg_gen_xori_tl(t1, t1, ~uimm);
3678             tcg_gen_xori_tl(t2, t0, uimm);
3679             tcg_gen_and_tl(t1, t1, t2);
3680             tcg_temp_free(t2);
3681             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
3682             tcg_temp_free(t1);
3683             /* operands of same sign, result different sign */
3684             generate_exception(ctx, EXCP_OVERFLOW);
3685             gen_set_label(l1);
3686             tcg_gen_ext32s_tl(t0, t0);
3687             gen_store_gpr(t0, rt);
3688             tcg_temp_free(t0);
3689         }
3690         break;
3691     case OPC_ADDIU:
3692         if (rs != 0) {
3693             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
3694             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
3695         } else {
3696             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
3697         }
3698         break;
3699 #if defined(TARGET_MIPS64)
3700     case OPC_DADDI:
3701         {
3702             TCGv t0 = tcg_temp_local_new();
3703             TCGv t1 = tcg_temp_new();
3704             TCGv t2 = tcg_temp_new();
3705             TCGLabel *l1 = gen_new_label();
3706
3707             gen_load_gpr(t1, rs);
3708             tcg_gen_addi_tl(t0, t1, uimm);
3709
3710             tcg_gen_xori_tl(t1, t1, ~uimm);
3711             tcg_gen_xori_tl(t2, t0, uimm);
3712             tcg_gen_and_tl(t1, t1, t2);
3713             tcg_temp_free(t2);
3714             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
3715             tcg_temp_free(t1);
3716             /* operands of same sign, result different sign */
3717             generate_exception(ctx, EXCP_OVERFLOW);
3718             gen_set_label(l1);
3719             gen_store_gpr(t0, rt);
3720             tcg_temp_free(t0);
3721         }
3722         break;
3723     case OPC_DADDIU:
3724         if (rs != 0) {
3725             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
3726         } else {
3727             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
3728         }
3729         break;
3730 #endif
3731     }
3732 }
3733
3734 /* Logic with immediate operand */
3735 static void gen_logic_imm(DisasContext *ctx, uint32_t opc,
3736                           int rt, int rs, int16_t imm)
3737 {
3738     target_ulong uimm;
3739
3740     if (rt == 0) {
3741         /* If no destination, treat it as a NOP. */
3742         return;
3743     }
3744     uimm = (uint16_t)imm;
3745     switch (opc) {
3746     case OPC_ANDI:
3747         if (likely(rs != 0))
3748             tcg_gen_andi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
3749         else
3750             tcg_gen_movi_tl(cpu_gpr[rt], 0);
3751         break;
3752     case OPC_ORI:
3753         if (rs != 0)
3754             tcg_gen_ori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
3755         else
3756             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
3757         break;
3758     case OPC_XORI:
3759         if (likely(rs != 0))
3760             tcg_gen_xori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
3761         else
3762             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
3763         break;
3764     case OPC_LUI:
3765         if (rs != 0 && (ctx->insn_flags & ISA_MIPS32R6)) {
3766             /* OPC_AUI */
3767             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], imm << 16);
3768             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
3769         } else {
3770             tcg_gen_movi_tl(cpu_gpr[rt], imm << 16);
3771         }
3772         break;
3773
3774     default:
3775         break;
3776     }
3777 }
3778
3779 /* Set on less than with immediate operand */
3780 static void gen_slt_imm(DisasContext *ctx, uint32_t opc,
3781                         int rt, int rs, int16_t imm)
3782 {
3783     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
3784     TCGv t0;
3785
3786     if (rt == 0) {
3787         /* If no destination, treat it as a NOP. */
3788         return;
3789     }
3790     t0 = tcg_temp_new();
3791     gen_load_gpr(t0, rs);
3792     switch (opc) {
3793     case OPC_SLTI:
3794         tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr[rt], t0, uimm);
3795         break;
3796     case OPC_SLTIU:
3797         tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr[rt], t0, uimm);
3798         break;
3799     }
3800     tcg_temp_free(t0);
3801 }
3802
3803 /* Shifts with immediate operand */
3804 static void gen_shift_imm(DisasContext *ctx, uint32_t opc,
3805                           int rt, int rs, int16_t imm)
3806 {
3807     target_ulong uimm = ((uint16_t)imm) & 0x1f;
3808     TCGv t0;
3809
3810     if (rt == 0) {
3811         /* If no destination, treat it as a NOP. */
3812         return;
3813     }
3814
3815     t0 = tcg_temp_new();
3816     gen_load_gpr(t0, rs);
3817     switch (opc) {
3818     case OPC_SLL:
3819         tcg_gen_shli_tl(t0, t0, uimm);
3820         tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
3821         break;
3822     case OPC_SRA:
3823         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
3824         break;
3825     case OPC_SRL:
3826         if (uimm != 0) {
3827             tcg_gen_ext32u_tl(t0, t0);
3828             tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
3829         } else {
3830             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
3831         }
3832         break;
3833     case OPC_ROTR:
3834         if (uimm != 0) {
3835             TCGv_i32 t1 = tcg_temp_new_i32();
3836
3837             tcg_gen_trunc_tl_i32(t1, t0);
3838             tcg_gen_rotri_i32(t1, t1, uimm);
3839             tcg_gen_ext_i32_tl(cpu_gpr[rt], t1);
3840             tcg_temp_free_i32(t1);
3841         } else {
3842             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
3843         }
3844         break;
3845 #if defined(TARGET_MIPS64)
3846     case OPC_DSLL:
3847         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm);
3848         break;
3849     case OPC_DSRA:
3850         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
3851         break;
3852     case OPC_DSRL:
3853         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
3854         break;
3855     case OPC_DROTR:
3856         if (uimm != 0) {
3857             tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm);
3858         } else {
3859             tcg_gen_mov_tl(cpu_gpr[rt], t0);
3860         }
3861         break;
3862     case OPC_DSLL32:
3863         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm + 32);
3864         break;
3865     case OPC_DSRA32:
3866         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm + 32);
3867         break;
3868     case OPC_DSRL32:
3869         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm + 32);
3870         break;
3871     case OPC_DROTR32:
3872         tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm + 32);
3873         break;
3874 #endif
3875     }
3876     tcg_temp_free(t0);
3877 }
3878
3879 /* Arithmetic */
3880 static void gen_arith(DisasContext *ctx, uint32_t opc,
3881                       int rd, int rs, int rt)
3882 {
3883     if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB
3884        && opc != OPC_DADD && opc != OPC_DSUB) {
3885         /* If no destination, treat it as a NOP.
3886            For add & sub, we must generate the overflow exception when needed. */
3887         return;
3888     }
3889
3890     switch (opc) {
3891     case OPC_ADD:
3892         {
3893             TCGv t0 = tcg_temp_local_new();
3894             TCGv t1 = tcg_temp_new();
3895             TCGv t2 = tcg_temp_new();
3896             TCGLabel *l1 = gen_new_label();
3897
3898             gen_load_gpr(t1, rs);
3899             gen_load_gpr(t2, rt);
3900             tcg_gen_add_tl(t0, t1, t2);
3901             tcg_gen_ext32s_tl(t0, t0);
3902             tcg_gen_xor_tl(t1, t1, t2);
3903             tcg_gen_xor_tl(t2, t0, t2);
3904             tcg_gen_andc_tl(t1, t2, t1);
3905             tcg_temp_free(t2);
3906             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
3907             tcg_temp_free(t1);
3908             /* operands of same sign, result different sign */
3909             generate_exception(ctx, EXCP_OVERFLOW);
3910             gen_set_label(l1);
3911             gen_store_gpr(t0, rd);
3912             tcg_temp_free(t0);
3913         }
3914         break;
3915     case OPC_ADDU:
3916         if (rs != 0 && rt != 0) {
3917             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
3918             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3919         } else if (rs == 0 && rt != 0) {
3920             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
3921         } else if (rs != 0 && rt == 0) {
3922             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
3923         } else {
3924             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3925         }
3926         break;
3927     case OPC_SUB:
3928         {
3929             TCGv t0 = tcg_temp_local_new();
3930             TCGv t1 = tcg_temp_new();
3931             TCGv t2 = tcg_temp_new();
3932             TCGLabel *l1 = gen_new_label();
3933
3934             gen_load_gpr(t1, rs);
3935             gen_load_gpr(t2, rt);
3936             tcg_gen_sub_tl(t0, t1, t2);
3937             tcg_gen_ext32s_tl(t0, t0);
3938             tcg_gen_xor_tl(t2, t1, t2);
3939             tcg_gen_xor_tl(t1, t0, t1);
3940             tcg_gen_and_tl(t1, t1, t2);
3941             tcg_temp_free(t2);
3942             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
3943             tcg_temp_free(t1);
3944             /* operands of different sign, first operand and result different sign */
3945             generate_exception(ctx, EXCP_OVERFLOW);
3946             gen_set_label(l1);
3947             gen_store_gpr(t0, rd);
3948             tcg_temp_free(t0);
3949         }
3950         break;
3951     case OPC_SUBU:
3952         if (rs != 0 && rt != 0) {
3953             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
3954             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3955         } else if (rs == 0 && rt != 0) {
3956             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
3957             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3958         } else if (rs != 0 && rt == 0) {
3959             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
3960         } else {
3961             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3962         }
3963         break;
3964 #if defined(TARGET_MIPS64)
3965     case OPC_DADD:
3966         {
3967             TCGv t0 = tcg_temp_local_new();
3968             TCGv t1 = tcg_temp_new();
3969             TCGv t2 = tcg_temp_new();
3970             TCGLabel *l1 = gen_new_label();
3971
3972             gen_load_gpr(t1, rs);
3973             gen_load_gpr(t2, rt);
3974             tcg_gen_add_tl(t0, t1, t2);
3975             tcg_gen_xor_tl(t1, t1, t2);
3976             tcg_gen_xor_tl(t2, t0, t2);
3977             tcg_gen_andc_tl(t1, t2, t1);
3978             tcg_temp_free(t2);
3979             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
3980             tcg_temp_free(t1);
3981             /* operands of same sign, result different sign */
3982             generate_exception(ctx, EXCP_OVERFLOW);
3983             gen_set_label(l1);
3984             gen_store_gpr(t0, rd);
3985             tcg_temp_free(t0);
3986         }
3987         break;
3988     case OPC_DADDU:
3989         if (rs != 0 && rt != 0) {
3990             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
3991         } else if (rs == 0 && rt != 0) {
3992             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
3993         } else if (rs != 0 && rt == 0) {
3994             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
3995         } else {
3996             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3997         }
3998         break;
3999     case OPC_DSUB:
4000         {
4001             TCGv t0 = tcg_temp_local_new();
4002             TCGv t1 = tcg_temp_new();
4003             TCGv t2 = tcg_temp_new();
4004             TCGLabel *l1 = gen_new_label();
4005
4006             gen_load_gpr(t1, rs);
4007             gen_load_gpr(t2, rt);
4008             tcg_gen_sub_tl(t0, t1, t2);
4009             tcg_gen_xor_tl(t2, t1, t2);
4010             tcg_gen_xor_tl(t1, t0, t1);
4011             tcg_gen_and_tl(t1, t1, t2);
4012             tcg_temp_free(t2);
4013             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
4014             tcg_temp_free(t1);
4015             /* operands of different sign, first operand and result different sign */
4016             generate_exception(ctx, EXCP_OVERFLOW);
4017             gen_set_label(l1);
4018             gen_store_gpr(t0, rd);
4019             tcg_temp_free(t0);
4020         }
4021         break;
4022     case OPC_DSUBU:
4023         if (rs != 0 && rt != 0) {
4024             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4025         } else if (rs == 0 && rt != 0) {
4026             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
4027         } else if (rs != 0 && rt == 0) {
4028             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
4029         } else {
4030             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4031         }
4032         break;
4033 #endif
4034     case OPC_MUL:
4035         if (likely(rs != 0 && rt != 0)) {
4036             tcg_gen_mul_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4037             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4038         } else {
4039             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4040         }
4041         break;
4042     }
4043 }
4044
4045 /* Conditional move */
4046 static void gen_cond_move(DisasContext *ctx, uint32_t opc,
4047                           int rd, int rs, int rt)
4048 {
4049     TCGv t0, t1, t2;
4050
4051     if (rd == 0) {
4052         /* If no destination, treat it as a NOP. */
4053         return;
4054     }
4055
4056     t0 = tcg_temp_new();
4057     gen_load_gpr(t0, rt);
4058     t1 = tcg_const_tl(0);
4059     t2 = tcg_temp_new();
4060     gen_load_gpr(t2, rs);
4061     switch (opc) {
4062     case OPC_MOVN:
4063         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
4064         break;
4065     case OPC_MOVZ:
4066         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
4067         break;
4068     case OPC_SELNEZ:
4069         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, t1);
4070         break;
4071     case OPC_SELEQZ:
4072         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, t1);
4073         break;
4074     }
4075     tcg_temp_free(t2);
4076     tcg_temp_free(t1);
4077     tcg_temp_free(t0);
4078 }
4079
4080 /* Logic */
4081 static void gen_logic(DisasContext *ctx, uint32_t opc,
4082                       int rd, int rs, int rt)
4083 {
4084     if (rd == 0) {
4085         /* If no destination, treat it as a NOP. */
4086         return;
4087     }
4088
4089     switch (opc) {
4090     case OPC_AND:
4091         if (likely(rs != 0 && rt != 0)) {
4092             tcg_gen_and_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4093         } else {
4094             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4095         }
4096         break;
4097     case OPC_NOR:
4098         if (rs != 0 && rt != 0) {
4099             tcg_gen_nor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4100         } else if (rs == 0 && rt != 0) {
4101             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rt]);
4102         } else if (rs != 0 && rt == 0) {
4103             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rs]);
4104         } else {
4105             tcg_gen_movi_tl(cpu_gpr[rd], ~((target_ulong)0));
4106         }
4107         break;
4108     case OPC_OR:
4109         if (likely(rs != 0 && rt != 0)) {
4110             tcg_gen_or_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4111         } else if (rs == 0 && rt != 0) {
4112             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
4113         } else if (rs != 0 && rt == 0) {
4114             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
4115         } else {
4116             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4117         }
4118         break;
4119     case OPC_XOR:
4120         if (likely(rs != 0 && rt != 0)) {
4121             tcg_gen_xor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
4122         } else if (rs == 0 && rt != 0) {
4123             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
4124         } else if (rs != 0 && rt == 0) {
4125             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
4126         } else {
4127             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4128         }
4129         break;
4130     }
4131 }
4132
4133 /* Set on lower than */
4134 static void gen_slt(DisasContext *ctx, uint32_t opc,
4135                     int rd, int rs, int rt)
4136 {
4137     TCGv t0, t1;
4138
4139     if (rd == 0) {
4140         /* If no destination, treat it as a NOP. */
4141         return;
4142     }
4143
4144     t0 = tcg_temp_new();
4145     t1 = tcg_temp_new();
4146     gen_load_gpr(t0, rs);
4147     gen_load_gpr(t1, rt);
4148     switch (opc) {
4149     case OPC_SLT:
4150         tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr[rd], t0, t1);
4151         break;
4152     case OPC_SLTU:
4153         tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr[rd], t0, t1);
4154         break;
4155     }
4156     tcg_temp_free(t0);
4157     tcg_temp_free(t1);
4158 }
4159
4160 /* Shifts */
4161 static void gen_shift(DisasContext *ctx, uint32_t opc,
4162                       int rd, int rs, int rt)
4163 {
4164     TCGv t0, t1;
4165
4166     if (rd == 0) {
4167         /* If no destination, treat it as a NOP.
4168            For add & sub, we must generate the overflow exception when needed. */
4169         return;
4170     }
4171
4172     t0 = tcg_temp_new();
4173     t1 = tcg_temp_new();
4174     gen_load_gpr(t0, rs);
4175     gen_load_gpr(t1, rt);
4176     switch (opc) {
4177     case OPC_SLLV:
4178         tcg_gen_andi_tl(t0, t0, 0x1f);
4179         tcg_gen_shl_tl(t0, t1, t0);
4180         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
4181         break;
4182     case OPC_SRAV:
4183         tcg_gen_andi_tl(t0, t0, 0x1f);
4184         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
4185         break;
4186     case OPC_SRLV:
4187         tcg_gen_ext32u_tl(t1, t1);
4188         tcg_gen_andi_tl(t0, t0, 0x1f);
4189         tcg_gen_shr_tl(t0, t1, t0);
4190         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
4191         break;
4192     case OPC_ROTRV:
4193         {
4194             TCGv_i32 t2 = tcg_temp_new_i32();
4195             TCGv_i32 t3 = tcg_temp_new_i32();
4196
4197             tcg_gen_trunc_tl_i32(t2, t0);
4198             tcg_gen_trunc_tl_i32(t3, t1);
4199             tcg_gen_andi_i32(t2, t2, 0x1f);
4200             tcg_gen_rotr_i32(t2, t3, t2);
4201             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
4202             tcg_temp_free_i32(t2);
4203             tcg_temp_free_i32(t3);
4204         }
4205         break;
4206 #if defined(TARGET_MIPS64)
4207     case OPC_DSLLV:
4208         tcg_gen_andi_tl(t0, t0, 0x3f);
4209         tcg_gen_shl_tl(cpu_gpr[rd], t1, t0);
4210         break;
4211     case OPC_DSRAV:
4212         tcg_gen_andi_tl(t0, t0, 0x3f);
4213         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
4214         break;
4215     case OPC_DSRLV:
4216         tcg_gen_andi_tl(t0, t0, 0x3f);
4217         tcg_gen_shr_tl(cpu_gpr[rd], t1, t0);
4218         break;
4219     case OPC_DROTRV:
4220         tcg_gen_andi_tl(t0, t0, 0x3f);
4221         tcg_gen_rotr_tl(cpu_gpr[rd], t1, t0);
4222         break;
4223 #endif
4224     }
4225     tcg_temp_free(t0);
4226     tcg_temp_free(t1);
4227 }
4228
4229 /* Arithmetic on HI/LO registers */
4230 static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
4231 {
4232     if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
4233         /* Treat as NOP. */
4234         return;
4235     }
4236
4237     if (acc != 0) {
4238         check_dsp(ctx);
4239     }
4240
4241     switch (opc) {
4242     case OPC_MFHI:
4243 #if defined(TARGET_MIPS64)
4244         if (acc != 0) {
4245             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_HI[acc]);
4246         } else
4247 #endif
4248         {
4249             tcg_gen_mov_tl(cpu_gpr[reg], cpu_HI[acc]);
4250         }
4251         break;
4252     case OPC_MFLO:
4253 #if defined(TARGET_MIPS64)
4254         if (acc != 0) {
4255             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_LO[acc]);
4256         } else
4257 #endif
4258         {
4259             tcg_gen_mov_tl(cpu_gpr[reg], cpu_LO[acc]);
4260         }
4261         break;
4262     case OPC_MTHI:
4263         if (reg != 0) {
4264 #if defined(TARGET_MIPS64)
4265             if (acc != 0) {
4266                 tcg_gen_ext32s_tl(cpu_HI[acc], cpu_gpr[reg]);
4267             } else
4268 #endif
4269             {
4270                 tcg_gen_mov_tl(cpu_HI[acc], cpu_gpr[reg]);
4271             }
4272         } else {
4273             tcg_gen_movi_tl(cpu_HI[acc], 0);
4274         }
4275         break;
4276     case OPC_MTLO:
4277         if (reg != 0) {
4278 #if defined(TARGET_MIPS64)
4279             if (acc != 0) {
4280                 tcg_gen_ext32s_tl(cpu_LO[acc], cpu_gpr[reg]);
4281             } else
4282 #endif
4283             {
4284                 tcg_gen_mov_tl(cpu_LO[acc], cpu_gpr[reg]);
4285             }
4286         } else {
4287             tcg_gen_movi_tl(cpu_LO[acc], 0);
4288         }
4289         break;
4290     }
4291 }
4292
4293 static inline void gen_r6_ld(target_long addr, int reg, int memidx,
4294                              TCGMemOp memop)
4295 {
4296     TCGv t0 = tcg_const_tl(addr);
4297     tcg_gen_qemu_ld_tl(t0, t0, memidx, memop);
4298     gen_store_gpr(t0, reg);
4299     tcg_temp_free(t0);
4300 }
4301
4302 static inline void gen_pcrel(DisasContext *ctx, int opc, target_ulong pc,
4303                              int rs)
4304 {
4305     target_long offset;
4306     target_long addr;
4307
4308     switch (MASK_OPC_PCREL_TOP2BITS(opc)) {
4309     case OPC_ADDIUPC:
4310         if (rs != 0) {
4311             offset = sextract32(ctx->opcode << 2, 0, 21);
4312             addr = addr_add(ctx, pc, offset);
4313             tcg_gen_movi_tl(cpu_gpr[rs], addr);
4314         }
4315         break;
4316     case R6_OPC_LWPC:
4317         offset = sextract32(ctx->opcode << 2, 0, 21);
4318         addr = addr_add(ctx, pc, offset);
4319         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TESL);
4320         break;
4321 #if defined(TARGET_MIPS64)
4322     case OPC_LWUPC:
4323         check_mips_64(ctx);
4324         offset = sextract32(ctx->opcode << 2, 0, 21);
4325         addr = addr_add(ctx, pc, offset);
4326         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEUL);
4327         break;
4328 #endif
4329     default:
4330         switch (MASK_OPC_PCREL_TOP5BITS(opc)) {
4331         case OPC_AUIPC:
4332             if (rs != 0) {
4333                 offset = sextract32(ctx->opcode, 0, 16) << 16;
4334                 addr = addr_add(ctx, pc, offset);
4335                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
4336             }
4337             break;
4338         case OPC_ALUIPC:
4339             if (rs != 0) {
4340                 offset = sextract32(ctx->opcode, 0, 16) << 16;
4341                 addr = ~0xFFFF & addr_add(ctx, pc, offset);
4342                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
4343             }
4344             break;
4345 #if defined(TARGET_MIPS64)
4346         case R6_OPC_LDPC: /* bits 16 and 17 are part of immediate */
4347         case R6_OPC_LDPC + (1 << 16):
4348         case R6_OPC_LDPC + (2 << 16):
4349         case R6_OPC_LDPC + (3 << 16):
4350             check_mips_64(ctx);
4351             offset = sextract32(ctx->opcode << 3, 0, 21);
4352             addr = addr_add(ctx, (pc & ~0x7), offset);
4353             gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEQ);
4354             break;
4355 #endif
4356         default:
4357             MIPS_INVAL("OPC_PCREL");
4358             generate_exception_end(ctx, EXCP_RI);
4359             break;
4360         }
4361         break;
4362     }
4363 }
4364
4365 static void gen_r6_muldiv(DisasContext *ctx, int opc, int rd, int rs, int rt)
4366 {
4367     TCGv t0, t1;
4368
4369     if (rd == 0) {
4370         /* Treat as NOP. */
4371         return;
4372     }
4373
4374     t0 = tcg_temp_new();
4375     t1 = tcg_temp_new();
4376
4377     gen_load_gpr(t0, rs);
4378     gen_load_gpr(t1, rt);
4379
4380     switch (opc) {
4381     case R6_OPC_DIV:
4382         {
4383             TCGv t2 = tcg_temp_new();
4384             TCGv t3 = tcg_temp_new();
4385             tcg_gen_ext32s_tl(t0, t0);
4386             tcg_gen_ext32s_tl(t1, t1);
4387             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
4388             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
4389             tcg_gen_and_tl(t2, t2, t3);
4390             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
4391             tcg_gen_or_tl(t2, t2, t3);
4392             tcg_gen_movi_tl(t3, 0);
4393             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
4394             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
4395             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4396             tcg_temp_free(t3);
4397             tcg_temp_free(t2);
4398         }
4399         break;
4400     case R6_OPC_MOD:
4401         {
4402             TCGv t2 = tcg_temp_new();
4403             TCGv t3 = tcg_temp_new();
4404             tcg_gen_ext32s_tl(t0, t0);
4405             tcg_gen_ext32s_tl(t1, t1);
4406             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
4407             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
4408             tcg_gen_and_tl(t2, t2, t3);
4409             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
4410             tcg_gen_or_tl(t2, t2, t3);
4411             tcg_gen_movi_tl(t3, 0);
4412             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
4413             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
4414             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4415             tcg_temp_free(t3);
4416             tcg_temp_free(t2);
4417         }
4418         break;
4419     case R6_OPC_DIVU:
4420         {
4421             TCGv t2 = tcg_const_tl(0);
4422             TCGv t3 = tcg_const_tl(1);
4423             tcg_gen_ext32u_tl(t0, t0);
4424             tcg_gen_ext32u_tl(t1, t1);
4425             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
4426             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
4427             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4428             tcg_temp_free(t3);
4429             tcg_temp_free(t2);
4430         }
4431         break;
4432     case R6_OPC_MODU:
4433         {
4434             TCGv t2 = tcg_const_tl(0);
4435             TCGv t3 = tcg_const_tl(1);
4436             tcg_gen_ext32u_tl(t0, t0);
4437             tcg_gen_ext32u_tl(t1, t1);
4438             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
4439             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
4440             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4441             tcg_temp_free(t3);
4442             tcg_temp_free(t2);
4443         }
4444         break;
4445     case R6_OPC_MUL:
4446         {
4447             TCGv_i32 t2 = tcg_temp_new_i32();
4448             TCGv_i32 t3 = tcg_temp_new_i32();
4449             tcg_gen_trunc_tl_i32(t2, t0);
4450             tcg_gen_trunc_tl_i32(t3, t1);
4451             tcg_gen_mul_i32(t2, t2, t3);
4452             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
4453             tcg_temp_free_i32(t2);
4454             tcg_temp_free_i32(t3);
4455         }
4456         break;
4457     case R6_OPC_MUH:
4458         {
4459             TCGv_i32 t2 = tcg_temp_new_i32();
4460             TCGv_i32 t3 = tcg_temp_new_i32();
4461             tcg_gen_trunc_tl_i32(t2, t0);
4462             tcg_gen_trunc_tl_i32(t3, t1);
4463             tcg_gen_muls2_i32(t2, t3, t2, t3);
4464             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
4465             tcg_temp_free_i32(t2);
4466             tcg_temp_free_i32(t3);
4467         }
4468         break;
4469     case R6_OPC_MULU:
4470         {
4471             TCGv_i32 t2 = tcg_temp_new_i32();
4472             TCGv_i32 t3 = tcg_temp_new_i32();
4473             tcg_gen_trunc_tl_i32(t2, t0);
4474             tcg_gen_trunc_tl_i32(t3, t1);
4475             tcg_gen_mul_i32(t2, t2, t3);
4476             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
4477             tcg_temp_free_i32(t2);
4478             tcg_temp_free_i32(t3);
4479         }
4480         break;
4481     case R6_OPC_MUHU:
4482         {
4483             TCGv_i32 t2 = tcg_temp_new_i32();
4484             TCGv_i32 t3 = tcg_temp_new_i32();
4485             tcg_gen_trunc_tl_i32(t2, t0);
4486             tcg_gen_trunc_tl_i32(t3, t1);
4487             tcg_gen_mulu2_i32(t2, t3, t2, t3);
4488             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
4489             tcg_temp_free_i32(t2);
4490             tcg_temp_free_i32(t3);
4491         }
4492         break;
4493 #if defined(TARGET_MIPS64)
4494     case R6_OPC_DDIV:
4495         {
4496             TCGv t2 = tcg_temp_new();
4497             TCGv t3 = tcg_temp_new();
4498             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
4499             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
4500             tcg_gen_and_tl(t2, t2, t3);
4501             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
4502             tcg_gen_or_tl(t2, t2, t3);
4503             tcg_gen_movi_tl(t3, 0);
4504             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
4505             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
4506             tcg_temp_free(t3);
4507             tcg_temp_free(t2);
4508         }
4509         break;
4510     case R6_OPC_DMOD:
4511         {
4512             TCGv t2 = tcg_temp_new();
4513             TCGv t3 = tcg_temp_new();
4514             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
4515             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
4516             tcg_gen_and_tl(t2, t2, t3);
4517             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
4518             tcg_gen_or_tl(t2, t2, t3);
4519             tcg_gen_movi_tl(t3, 0);
4520             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
4521             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
4522             tcg_temp_free(t3);
4523             tcg_temp_free(t2);
4524         }
4525         break;
4526     case R6_OPC_DDIVU:
4527         {
4528             TCGv t2 = tcg_const_tl(0);
4529             TCGv t3 = tcg_const_tl(1);
4530             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
4531             tcg_gen_divu_i64(cpu_gpr[rd], t0, t1);
4532             tcg_temp_free(t3);
4533             tcg_temp_free(t2);
4534         }
4535         break;
4536     case R6_OPC_DMODU:
4537         {
4538             TCGv t2 = tcg_const_tl(0);
4539             TCGv t3 = tcg_const_tl(1);
4540             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
4541             tcg_gen_remu_i64(cpu_gpr[rd], t0, t1);
4542             tcg_temp_free(t3);
4543             tcg_temp_free(t2);
4544         }
4545         break;
4546     case R6_OPC_DMUL:
4547         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
4548         break;
4549     case R6_OPC_DMUH:
4550         {
4551             TCGv t2 = tcg_temp_new();
4552             tcg_gen_muls2_i64(t2, cpu_gpr[rd], t0, t1);
4553             tcg_temp_free(t2);
4554         }
4555         break;
4556     case R6_OPC_DMULU:
4557         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
4558         break;
4559     case R6_OPC_DMUHU:
4560         {
4561             TCGv t2 = tcg_temp_new();
4562             tcg_gen_mulu2_i64(t2, cpu_gpr[rd], t0, t1);
4563             tcg_temp_free(t2);
4564         }
4565         break;
4566 #endif
4567     default:
4568         MIPS_INVAL("r6 mul/div");
4569         generate_exception_end(ctx, EXCP_RI);
4570         goto out;
4571     }
4572  out:
4573     tcg_temp_free(t0);
4574     tcg_temp_free(t1);
4575 }
4576
4577 static void gen_muldiv(DisasContext *ctx, uint32_t opc,
4578                        int acc, int rs, int rt)
4579 {
4580     TCGv t0, t1;
4581
4582     t0 = tcg_temp_new();
4583     t1 = tcg_temp_new();
4584
4585     gen_load_gpr(t0, rs);
4586     gen_load_gpr(t1, rt);
4587
4588     if (acc != 0) {
4589         check_dsp(ctx);
4590     }
4591
4592     switch (opc) {
4593     case OPC_DIV:
4594         {
4595             TCGv t2 = tcg_temp_new();
4596             TCGv t3 = tcg_temp_new();
4597             tcg_gen_ext32s_tl(t0, t0);
4598             tcg_gen_ext32s_tl(t1, t1);
4599             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
4600             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
4601             tcg_gen_and_tl(t2, t2, t3);
4602             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
4603             tcg_gen_or_tl(t2, t2, t3);
4604             tcg_gen_movi_tl(t3, 0);
4605             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
4606             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
4607             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
4608             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
4609             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
4610             tcg_temp_free(t3);
4611             tcg_temp_free(t2);
4612         }
4613         break;
4614     case OPC_DIVU:
4615         {
4616             TCGv t2 = tcg_const_tl(0);
4617             TCGv t3 = tcg_const_tl(1);
4618             tcg_gen_ext32u_tl(t0, t0);
4619             tcg_gen_ext32u_tl(t1, t1);
4620             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
4621             tcg_gen_divu_tl(cpu_LO[acc], t0, t1);
4622             tcg_gen_remu_tl(cpu_HI[acc], t0, t1);
4623             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
4624             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
4625             tcg_temp_free(t3);
4626             tcg_temp_free(t2);
4627         }
4628         break;
4629     case OPC_MULT:
4630         {
4631             TCGv_i32 t2 = tcg_temp_new_i32();
4632             TCGv_i32 t3 = tcg_temp_new_i32();
4633             tcg_gen_trunc_tl_i32(t2, t0);
4634             tcg_gen_trunc_tl_i32(t3, t1);
4635             tcg_gen_muls2_i32(t2, t3, t2, t3);
4636             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
4637             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
4638             tcg_temp_free_i32(t2);
4639             tcg_temp_free_i32(t3);
4640         }
4641         break;
4642     case OPC_MULTU:
4643         {
4644             TCGv_i32 t2 = tcg_temp_new_i32();
4645             TCGv_i32 t3 = tcg_temp_new_i32();
4646             tcg_gen_trunc_tl_i32(t2, t0);
4647             tcg_gen_trunc_tl_i32(t3, t1);
4648             tcg_gen_mulu2_i32(t2, t3, t2, t3);
4649             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
4650             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
4651             tcg_temp_free_i32(t2);
4652             tcg_temp_free_i32(t3);
4653         }
4654         break;
4655 #if defined(TARGET_MIPS64)
4656     case OPC_DDIV:
4657         {
4658             TCGv t2 = tcg_temp_new();
4659             TCGv t3 = tcg_temp_new();
4660             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
4661             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
4662             tcg_gen_and_tl(t2, t2, t3);
4663             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
4664             tcg_gen_or_tl(t2, t2, t3);
4665             tcg_gen_movi_tl(t3, 0);
4666             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
4667             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
4668             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
4669             tcg_temp_free(t3);
4670             tcg_temp_free(t2);
4671         }
4672         break;
4673     case OPC_DDIVU:
4674         {
4675             TCGv t2 = tcg_const_tl(0);
4676             TCGv t3 = tcg_const_tl(1);
4677             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
4678             tcg_gen_divu_i64(cpu_LO[acc], t0, t1);
4679             tcg_gen_remu_i64(cpu_HI[acc], t0, t1);
4680             tcg_temp_free(t3);
4681             tcg_temp_free(t2);
4682         }
4683         break;
4684     case OPC_DMULT:
4685         tcg_gen_muls2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
4686         break;
4687     case OPC_DMULTU:
4688         tcg_gen_mulu2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
4689         break;
4690 #endif
4691     case OPC_MADD:
4692         {
4693             TCGv_i64 t2 = tcg_temp_new_i64();
4694             TCGv_i64 t3 = tcg_temp_new_i64();
4695
4696             tcg_gen_ext_tl_i64(t2, t0);
4697             tcg_gen_ext_tl_i64(t3, t1);
4698             tcg_gen_mul_i64(t2, t2, t3);
4699             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
4700             tcg_gen_add_i64(t2, t2, t3);
4701             tcg_temp_free_i64(t3);
4702             gen_move_low32(cpu_LO[acc], t2);
4703             gen_move_high32(cpu_HI[acc], t2);
4704             tcg_temp_free_i64(t2);
4705         }
4706         break;
4707     case OPC_MADDU:
4708         {
4709             TCGv_i64 t2 = tcg_temp_new_i64();
4710             TCGv_i64 t3 = tcg_temp_new_i64();
4711
4712             tcg_gen_ext32u_tl(t0, t0);
4713             tcg_gen_ext32u_tl(t1, t1);
4714             tcg_gen_extu_tl_i64(t2, t0);
4715             tcg_gen_extu_tl_i64(t3, t1);
4716             tcg_gen_mul_i64(t2, t2, t3);
4717             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
4718             tcg_gen_add_i64(t2, t2, t3);
4719             tcg_temp_free_i64(t3);
4720             gen_move_low32(cpu_LO[acc], t2);
4721             gen_move_high32(cpu_HI[acc], t2);
4722             tcg_temp_free_i64(t2);
4723         }
4724         break;
4725     case OPC_MSUB:
4726         {
4727             TCGv_i64 t2 = tcg_temp_new_i64();
4728             TCGv_i64 t3 = tcg_temp_new_i64();
4729
4730             tcg_gen_ext_tl_i64(t2, t0);
4731             tcg_gen_ext_tl_i64(t3, t1);
4732             tcg_gen_mul_i64(t2, t2, t3);
4733             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
4734             tcg_gen_sub_i64(t2, t3, t2);
4735             tcg_temp_free_i64(t3);
4736             gen_move_low32(cpu_LO[acc], t2);
4737             gen_move_high32(cpu_HI[acc], t2);
4738             tcg_temp_free_i64(t2);
4739         }
4740         break;
4741     case OPC_MSUBU:
4742         {
4743             TCGv_i64 t2 = tcg_temp_new_i64();
4744             TCGv_i64 t3 = tcg_temp_new_i64();
4745
4746             tcg_gen_ext32u_tl(t0, t0);
4747             tcg_gen_ext32u_tl(t1, t1);
4748             tcg_gen_extu_tl_i64(t2, t0);
4749             tcg_gen_extu_tl_i64(t3, t1);
4750             tcg_gen_mul_i64(t2, t2, t3);
4751             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
4752             tcg_gen_sub_i64(t2, t3, t2);
4753             tcg_temp_free_i64(t3);
4754             gen_move_low32(cpu_LO[acc], t2);
4755             gen_move_high32(cpu_HI[acc], t2);
4756             tcg_temp_free_i64(t2);
4757         }
4758         break;
4759     default:
4760         MIPS_INVAL("mul/div");
4761         generate_exception_end(ctx, EXCP_RI);
4762         goto out;
4763     }
4764  out:
4765     tcg_temp_free(t0);
4766     tcg_temp_free(t1);
4767 }
4768
4769 static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc,
4770                             int rd, int rs, int rt)
4771 {
4772     TCGv t0 = tcg_temp_new();
4773     TCGv t1 = tcg_temp_new();
4774
4775     gen_load_gpr(t0, rs);
4776     gen_load_gpr(t1, rt);
4777
4778     switch (opc) {
4779     case OPC_VR54XX_MULS:
4780         gen_helper_muls(t0, cpu_env, t0, t1);
4781         break;
4782     case OPC_VR54XX_MULSU:
4783         gen_helper_mulsu(t0, cpu_env, t0, t1);
4784         break;
4785     case OPC_VR54XX_MACC:
4786         gen_helper_macc(t0, cpu_env, t0, t1);
4787         break;
4788     case OPC_VR54XX_MACCU:
4789         gen_helper_maccu(t0, cpu_env, t0, t1);
4790         break;
4791     case OPC_VR54XX_MSAC:
4792         gen_helper_msac(t0, cpu_env, t0, t1);
4793         break;
4794     case OPC_VR54XX_MSACU:
4795         gen_helper_msacu(t0, cpu_env, t0, t1);
4796         break;
4797     case OPC_VR54XX_MULHI:
4798         gen_helper_mulhi(t0, cpu_env, t0, t1);
4799         break;
4800     case OPC_VR54XX_MULHIU:
4801         gen_helper_mulhiu(t0, cpu_env, t0, t1);
4802         break;
4803     case OPC_VR54XX_MULSHI:
4804         gen_helper_mulshi(t0, cpu_env, t0, t1);
4805         break;
4806     case OPC_VR54XX_MULSHIU:
4807         gen_helper_mulshiu(t0, cpu_env, t0, t1);
4808         break;
4809     case OPC_VR54XX_MACCHI:
4810         gen_helper_macchi(t0, cpu_env, t0, t1);
4811         break;
4812     case OPC_VR54XX_MACCHIU:
4813         gen_helper_macchiu(t0, cpu_env, t0, t1);
4814         break;
4815     case OPC_VR54XX_MSACHI:
4816         gen_helper_msachi(t0, cpu_env, t0, t1);
4817         break;
4818     case OPC_VR54XX_MSACHIU:
4819         gen_helper_msachiu(t0, cpu_env, t0, t1);
4820         break;
4821     default:
4822         MIPS_INVAL("mul vr54xx");
4823         generate_exception_end(ctx, EXCP_RI);
4824         goto out;
4825     }
4826     gen_store_gpr(t0, rd);
4827
4828  out:
4829     tcg_temp_free(t0);
4830     tcg_temp_free(t1);
4831 }
4832
4833 static void gen_cl (DisasContext *ctx, uint32_t opc,
4834                     int rd, int rs)
4835 {
4836     TCGv t0;
4837
4838     if (rd == 0) {
4839         /* Treat as NOP. */
4840         return;
4841     }
4842     t0 = cpu_gpr[rd];
4843     gen_load_gpr(t0, rs);
4844
4845     switch (opc) {
4846     case OPC_CLO:
4847     case R6_OPC_CLO:
4848 #if defined(TARGET_MIPS64)
4849     case OPC_DCLO:
4850     case R6_OPC_DCLO:
4851 #endif
4852         tcg_gen_not_tl(t0, t0);
4853         break;
4854     }
4855
4856     switch (opc) {
4857     case OPC_CLO:
4858     case R6_OPC_CLO:
4859     case OPC_CLZ:
4860     case R6_OPC_CLZ:
4861         tcg_gen_ext32u_tl(t0, t0);
4862         tcg_gen_clzi_tl(t0, t0, TARGET_LONG_BITS);
4863         tcg_gen_subi_tl(t0, t0, TARGET_LONG_BITS - 32);
4864         break;
4865 #if defined(TARGET_MIPS64)
4866     case OPC_DCLO:
4867     case R6_OPC_DCLO:
4868     case OPC_DCLZ:
4869     case R6_OPC_DCLZ:
4870         tcg_gen_clzi_i64(t0, t0, 64);
4871         break;
4872 #endif
4873     }
4874 }
4875
4876 /* Godson integer instructions */
4877 static void gen_loongson_integer(DisasContext *ctx, uint32_t opc,
4878                                  int rd, int rs, int rt)
4879 {
4880     TCGv t0, t1;
4881
4882     if (rd == 0) {
4883         /* Treat as NOP. */
4884         return;
4885     }
4886
4887     switch (opc) {
4888     case OPC_MULT_G_2E:
4889     case OPC_MULT_G_2F:
4890     case OPC_MULTU_G_2E:
4891     case OPC_MULTU_G_2F:
4892 #if defined(TARGET_MIPS64)
4893     case OPC_DMULT_G_2E:
4894     case OPC_DMULT_G_2F:
4895     case OPC_DMULTU_G_2E:
4896     case OPC_DMULTU_G_2F:
4897 #endif
4898         t0 = tcg_temp_new();
4899         t1 = tcg_temp_new();
4900         break;
4901     default:
4902         t0 = tcg_temp_local_new();
4903         t1 = tcg_temp_local_new();
4904         break;
4905     }
4906
4907     gen_load_gpr(t0, rs);
4908     gen_load_gpr(t1, rt);
4909
4910     switch (opc) {
4911     case OPC_MULT_G_2E:
4912     case OPC_MULT_G_2F:
4913         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
4914         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4915         break;
4916     case OPC_MULTU_G_2E:
4917     case OPC_MULTU_G_2F:
4918         tcg_gen_ext32u_tl(t0, t0);
4919         tcg_gen_ext32u_tl(t1, t1);
4920         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
4921         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4922         break;
4923     case OPC_DIV_G_2E:
4924     case OPC_DIV_G_2F:
4925         {
4926             TCGLabel *l1 = gen_new_label();
4927             TCGLabel *l2 = gen_new_label();
4928             TCGLabel *l3 = gen_new_label();
4929             tcg_gen_ext32s_tl(t0, t0);
4930             tcg_gen_ext32s_tl(t1, t1);
4931             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4932             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4933             tcg_gen_br(l3);
4934             gen_set_label(l1);
4935             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
4936             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
4937             tcg_gen_mov_tl(cpu_gpr[rd], t0);
4938             tcg_gen_br(l3);
4939             gen_set_label(l2);
4940             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
4941             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4942             gen_set_label(l3);
4943         }
4944         break;
4945     case OPC_DIVU_G_2E:
4946     case OPC_DIVU_G_2F:
4947         {
4948             TCGLabel *l1 = gen_new_label();
4949             TCGLabel *l2 = gen_new_label();
4950             tcg_gen_ext32u_tl(t0, t0);
4951             tcg_gen_ext32u_tl(t1, t1);
4952             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4953             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4954             tcg_gen_br(l2);
4955             gen_set_label(l1);
4956             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
4957             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4958             gen_set_label(l2);
4959         }
4960         break;
4961     case OPC_MOD_G_2E:
4962     case OPC_MOD_G_2F:
4963         {
4964             TCGLabel *l1 = gen_new_label();
4965             TCGLabel *l2 = gen_new_label();
4966             TCGLabel *l3 = gen_new_label();
4967             tcg_gen_ext32u_tl(t0, t0);
4968             tcg_gen_ext32u_tl(t1, t1);
4969             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
4970             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
4971             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
4972             gen_set_label(l1);
4973             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4974             tcg_gen_br(l3);
4975             gen_set_label(l2);
4976             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
4977             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4978             gen_set_label(l3);
4979         }
4980         break;
4981     case OPC_MODU_G_2E:
4982     case OPC_MODU_G_2F:
4983         {
4984             TCGLabel *l1 = gen_new_label();
4985             TCGLabel *l2 = gen_new_label();
4986             tcg_gen_ext32u_tl(t0, t0);
4987             tcg_gen_ext32u_tl(t1, t1);
4988             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4989             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4990             tcg_gen_br(l2);
4991             gen_set_label(l1);
4992             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
4993             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4994             gen_set_label(l2);
4995         }
4996         break;
4997 #if defined(TARGET_MIPS64)
4998     case OPC_DMULT_G_2E:
4999     case OPC_DMULT_G_2F:
5000         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
5001         break;
5002     case OPC_DMULTU_G_2E:
5003     case OPC_DMULTU_G_2F:
5004         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
5005         break;
5006     case OPC_DDIV_G_2E:
5007     case OPC_DDIV_G_2F:
5008         {
5009             TCGLabel *l1 = gen_new_label();
5010             TCGLabel *l2 = gen_new_label();
5011             TCGLabel *l3 = gen_new_label();
5012             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
5013             tcg_gen_movi_tl(cpu_gpr[rd], 0);
5014             tcg_gen_br(l3);
5015             gen_set_label(l1);
5016             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
5017             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
5018             tcg_gen_mov_tl(cpu_gpr[rd], t0);
5019             tcg_gen_br(l3);
5020             gen_set_label(l2);
5021             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
5022             gen_set_label(l3);
5023         }
5024         break;
5025     case OPC_DDIVU_G_2E:
5026     case OPC_DDIVU_G_2F:
5027         {
5028             TCGLabel *l1 = gen_new_label();
5029             TCGLabel *l2 = gen_new_label();
5030             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
5031             tcg_gen_movi_tl(cpu_gpr[rd], 0);
5032             tcg_gen_br(l2);
5033             gen_set_label(l1);
5034             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
5035             gen_set_label(l2);
5036         }
5037         break;
5038     case OPC_DMOD_G_2E:
5039     case OPC_DMOD_G_2F:
5040         {
5041             TCGLabel *l1 = gen_new_label();
5042             TCGLabel *l2 = gen_new_label();
5043             TCGLabel *l3 = gen_new_label();
5044             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
5045             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
5046             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
5047             gen_set_label(l1);
5048             tcg_gen_movi_tl(cpu_gpr[rd], 0);
5049             tcg_gen_br(l3);
5050             gen_set_label(l2);
5051             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
5052             gen_set_label(l3);
5053         }
5054         break;
5055     case OPC_DMODU_G_2E:
5056     case OPC_DMODU_G_2F:
5057         {
5058             TCGLabel *l1 = gen_new_label();
5059             TCGLabel *l2 = gen_new_label();
5060             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
5061             tcg_gen_movi_tl(cpu_gpr[rd], 0);
5062             tcg_gen_br(l2);
5063             gen_set_label(l1);
5064             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
5065             gen_set_label(l2);
5066         }
5067         break;
5068 #endif
5069     }
5070
5071     tcg_temp_free(t0);
5072     tcg_temp_free(t1);
5073 }
5074
5075 /* Loongson multimedia instructions */
5076 static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt)
5077 {
5078     uint32_t opc, shift_max;
5079     TCGv_i64 t0, t1;
5080
5081     opc = MASK_LMI(ctx->opcode);
5082     switch (opc) {
5083     case OPC_ADD_CP2:
5084     case OPC_SUB_CP2:
5085     case OPC_DADD_CP2:
5086     case OPC_DSUB_CP2:
5087         t0 = tcg_temp_local_new_i64();
5088         t1 = tcg_temp_local_new_i64();
5089         break;
5090     default:
5091         t0 = tcg_temp_new_i64();
5092         t1 = tcg_temp_new_i64();
5093         break;
5094     }
5095
5096     check_cp1_enabled(ctx);
5097     gen_load_fpr64(ctx, t0, rs);
5098     gen_load_fpr64(ctx, t1, rt);
5099
5100 #define LMI_HELPER(UP, LO) \
5101     case OPC_##UP: gen_helper_##LO(t0, t0, t1); break
5102 #define LMI_HELPER_1(UP, LO) \
5103     case OPC_##UP: gen_helper_##LO(t0, t0); break
5104 #define LMI_DIRECT(UP, LO, OP) \
5105     case OPC_##UP: tcg_gen_##OP##_i64(t0, t0, t1); break
5106
5107     switch (opc) {
5108     LMI_HELPER(PADDSH, paddsh);
5109     LMI_HELPER(PADDUSH, paddush);
5110     LMI_HELPER(PADDH, paddh);
5111     LMI_HELPER(PADDW, paddw);
5112     LMI_HELPER(PADDSB, paddsb);
5113     LMI_HELPER(PADDUSB, paddusb);
5114     LMI_HELPER(PADDB, paddb);
5115
5116     LMI_HELPER(PSUBSH, psubsh);
5117     LMI_HELPER(PSUBUSH, psubush);
5118     LMI_HELPER(PSUBH, psubh);
5119     LMI_HELPER(PSUBW, psubw);
5120     LMI_HELPER(PSUBSB, psubsb);
5121     LMI_HELPER(PSUBUSB, psubusb);
5122     LMI_HELPER(PSUBB, psubb);
5123
5124     LMI_HELPER(PSHUFH, pshufh);
5125     LMI_HELPER(PACKSSWH, packsswh);
5126     LMI_HELPER(PACKSSHB, packsshb);
5127     LMI_HELPER(PACKUSHB, packushb);
5128
5129     LMI_HELPER(PUNPCKLHW, punpcklhw);
5130     LMI_HELPER(PUNPCKHHW, punpckhhw);
5131     LMI_HELPER(PUNPCKLBH, punpcklbh);
5132     LMI_HELPER(PUNPCKHBH, punpckhbh);
5133     LMI_HELPER(PUNPCKLWD, punpcklwd);
5134     LMI_HELPER(PUNPCKHWD, punpckhwd);
5135
5136     LMI_HELPER(PAVGH, pavgh);
5137     LMI_HELPER(PAVGB, pavgb);
5138     LMI_HELPER(PMAXSH, pmaxsh);
5139     LMI_HELPER(PMINSH, pminsh);
5140     LMI_HELPER(PMAXUB, pmaxub);
5141     LMI_HELPER(PMINUB, pminub);
5142
5143     LMI_HELPER(PCMPEQW, pcmpeqw);
5144     LMI_HELPER(PCMPGTW, pcmpgtw);
5145     LMI_HELPER(PCMPEQH, pcmpeqh);
5146     LMI_HELPER(PCMPGTH, pcmpgth);
5147     LMI_HELPER(PCMPEQB, pcmpeqb);
5148     LMI_HELPER(PCMPGTB, pcmpgtb);
5149
5150     LMI_HELPER(PSLLW, psllw);
5151     LMI_HELPER(PSLLH, psllh);
5152     LMI_HELPER(PSRLW, psrlw);
5153     LMI_HELPER(PSRLH, psrlh);
5154     LMI_HELPER(PSRAW, psraw);
5155     LMI_HELPER(PSRAH, psrah);
5156
5157     LMI_HELPER(PMULLH, pmullh);
5158     LMI_HELPER(PMULHH, pmulhh);
5159     LMI_HELPER(PMULHUH, pmulhuh);
5160     LMI_HELPER(PMADDHW, pmaddhw);
5161
5162     LMI_HELPER(PASUBUB, pasubub);
5163     LMI_HELPER_1(BIADD, biadd);
5164     LMI_HELPER_1(PMOVMSKB, pmovmskb);
5165
5166     LMI_DIRECT(PADDD, paddd, add);
5167     LMI_DIRECT(PSUBD, psubd, sub);
5168     LMI_DIRECT(XOR_CP2, xor, xor);
5169     LMI_DIRECT(NOR_CP2, nor, nor);
5170     LMI_DIRECT(AND_CP2, and, and);
5171     LMI_DIRECT(OR_CP2, or, or);
5172
5173     case OPC_PANDN:
5174         tcg_gen_andc_i64(t0, t1, t0);
5175         break;
5176
5177     case OPC_PINSRH_0:
5178         tcg_gen_deposit_i64(t0, t0, t1, 0, 16);
5179         break;
5180     case OPC_PINSRH_1:
5181         tcg_gen_deposit_i64(t0, t0, t1, 16, 16);
5182         break;
5183     case OPC_PINSRH_2:
5184         tcg_gen_deposit_i64(t0, t0, t1, 32, 16);
5185         break;
5186     case OPC_PINSRH_3:
5187         tcg_gen_deposit_i64(t0, t0, t1, 48, 16);
5188         break;
5189
5190     case OPC_PEXTRH:
5191         tcg_gen_andi_i64(t1, t1, 3);
5192         tcg_gen_shli_i64(t1, t1, 4);
5193         tcg_gen_shr_i64(t0, t0, t1);
5194         tcg_gen_ext16u_i64(t0, t0);
5195         break;
5196
5197     case OPC_ADDU_CP2:
5198         tcg_gen_add_i64(t0, t0, t1);
5199         tcg_gen_ext32s_i64(t0, t0);
5200         break;
5201     case OPC_SUBU_CP2:
5202         tcg_gen_sub_i64(t0, t0, t1);
5203         tcg_gen_ext32s_i64(t0, t0);
5204         break;
5205
5206     case OPC_SLL_CP2:
5207         shift_max = 32;
5208         goto do_shift;
5209     case OPC_SRL_CP2:
5210         shift_max = 32;
5211         goto do_shift;
5212     case OPC_SRA_CP2:
5213         shift_max = 32;
5214         goto do_shift;
5215     case OPC_DSLL_CP2:
5216         shift_max = 64;
5217         goto do_shift;
5218     case OPC_DSRL_CP2:
5219         shift_max = 64;
5220         goto do_shift;
5221     case OPC_DSRA_CP2:
5222         shift_max = 64;
5223         goto do_shift;
5224     do_shift:
5225         /* Make sure shift count isn't TCG undefined behaviour.  */
5226         tcg_gen_andi_i64(t1, t1, shift_max - 1);
5227
5228         switch (opc) {
5229         case OPC_SLL_CP2:
5230         case OPC_DSLL_CP2:
5231             tcg_gen_shl_i64(t0, t0, t1);
5232             break;
5233         case OPC_SRA_CP2:
5234         case OPC_DSRA_CP2:
5235             /* Since SRA is UndefinedResult without sign-extended inputs,
5236                we can treat SRA and DSRA the same.  */
5237             tcg_gen_sar_i64(t0, t0, t1);
5238             break;
5239         case OPC_SRL_CP2:
5240             /* We want to shift in zeros for SRL; zero-extend first.  */
5241             tcg_gen_ext32u_i64(t0, t0);
5242             /* FALLTHRU */
5243         case OPC_DSRL_CP2:
5244             tcg_gen_shr_i64(t0, t0, t1);
5245             break;
5246         }
5247
5248         if (shift_max == 32) {
5249             tcg_gen_ext32s_i64(t0, t0);
5250         }
5251
5252         /* Shifts larger than MAX produce zero.  */
5253         tcg_gen_setcondi_i64(TCG_COND_LTU, t1, t1, shift_max);
5254         tcg_gen_neg_i64(t1, t1);
5255         tcg_gen_and_i64(t0, t0, t1);
5256         break;
5257
5258     case OPC_ADD_CP2:
5259     case OPC_DADD_CP2:
5260         {
5261             TCGv_i64 t2 = tcg_temp_new_i64();
5262             TCGLabel *lab = gen_new_label();
5263
5264             tcg_gen_mov_i64(t2, t0);
5265             tcg_gen_add_i64(t0, t1, t2);
5266             if (opc == OPC_ADD_CP2) {
5267                 tcg_gen_ext32s_i64(t0, t0);
5268             }
5269             tcg_gen_xor_i64(t1, t1, t2);
5270             tcg_gen_xor_i64(t2, t2, t0);
5271             tcg_gen_andc_i64(t1, t2, t1);
5272             tcg_temp_free_i64(t2);
5273             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
5274             generate_exception(ctx, EXCP_OVERFLOW);
5275             gen_set_label(lab);
5276             break;
5277         }
5278
5279     case OPC_SUB_CP2:
5280     case OPC_DSUB_CP2:
5281         {
5282             TCGv_i64 t2 = tcg_temp_new_i64();
5283             TCGLabel *lab = gen_new_label();
5284
5285             tcg_gen_mov_i64(t2, t0);
5286             tcg_gen_sub_i64(t0, t1, t2);
5287             if (opc == OPC_SUB_CP2) {
5288                 tcg_gen_ext32s_i64(t0, t0);
5289             }
5290             tcg_gen_xor_i64(t1, t1, t2);
5291             tcg_gen_xor_i64(t2, t2, t0);
5292             tcg_gen_and_i64(t1, t1, t2);
5293             tcg_temp_free_i64(t2);
5294             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
5295             generate_exception(ctx, EXCP_OVERFLOW);
5296             gen_set_label(lab);
5297             break;
5298         }
5299
5300     case OPC_PMULUW:
5301         tcg_gen_ext32u_i64(t0, t0);
5302         tcg_gen_ext32u_i64(t1, t1);
5303         tcg_gen_mul_i64(t0, t0, t1);
5304         break;
5305
5306     case OPC_SEQU_CP2:
5307     case OPC_SEQ_CP2:
5308     case OPC_SLTU_CP2:
5309     case OPC_SLT_CP2:
5310     case OPC_SLEU_CP2:
5311     case OPC_SLE_CP2:
5312         /* ??? Document is unclear: Set FCC[CC].  Does that mean the
5313            FD field is the CC field?  */
5314     default:
5315         MIPS_INVAL("loongson_cp2");
5316         generate_exception_end(ctx, EXCP_RI);
5317         return;
5318     }
5319
5320 #undef LMI_HELPER
5321 #undef LMI_DIRECT
5322
5323     gen_store_fpr64(ctx, t0, rd);
5324
5325     tcg_temp_free_i64(t0);
5326     tcg_temp_free_i64(t1);
5327 }
5328
5329 /* Traps */
5330 static void gen_trap (DisasContext *ctx, uint32_t opc,
5331                       int rs, int rt, int16_t imm)
5332 {
5333     int cond;
5334     TCGv t0 = tcg_temp_new();
5335     TCGv t1 = tcg_temp_new();
5336
5337     cond = 0;
5338     /* Load needed operands */
5339     switch (opc) {
5340     case OPC_TEQ:
5341     case OPC_TGE:
5342     case OPC_TGEU:
5343     case OPC_TLT:
5344     case OPC_TLTU:
5345     case OPC_TNE:
5346         /* Compare two registers */
5347         if (rs != rt) {
5348             gen_load_gpr(t0, rs);
5349             gen_load_gpr(t1, rt);
5350             cond = 1;
5351         }
5352         break;
5353     case OPC_TEQI:
5354     case OPC_TGEI:
5355     case OPC_TGEIU:
5356     case OPC_TLTI:
5357     case OPC_TLTIU:
5358     case OPC_TNEI:
5359         /* Compare register to immediate */
5360         if (rs != 0 || imm != 0) {
5361             gen_load_gpr(t0, rs);
5362             tcg_gen_movi_tl(t1, (int32_t)imm);
5363             cond = 1;
5364         }
5365         break;
5366     }
5367     if (cond == 0) {
5368         switch (opc) {
5369         case OPC_TEQ:   /* rs == rs */
5370         case OPC_TEQI:  /* r0 == 0  */
5371         case OPC_TGE:   /* rs >= rs */
5372         case OPC_TGEI:  /* r0 >= 0  */
5373         case OPC_TGEU:  /* rs >= rs unsigned */
5374         case OPC_TGEIU: /* r0 >= 0  unsigned */
5375             /* Always trap */
5376             generate_exception_end(ctx, EXCP_TRAP);
5377             break;
5378         case OPC_TLT:   /* rs < rs           */
5379         case OPC_TLTI:  /* r0 < 0            */
5380         case OPC_TLTU:  /* rs < rs unsigned  */
5381         case OPC_TLTIU: /* r0 < 0  unsigned  */
5382         case OPC_TNE:   /* rs != rs          */
5383         case OPC_TNEI:  /* r0 != 0           */
5384             /* Never trap: treat as NOP. */
5385             break;
5386         }
5387     } else {
5388         TCGLabel *l1 = gen_new_label();
5389
5390         switch (opc) {
5391         case OPC_TEQ:
5392         case OPC_TEQI:
5393             tcg_gen_brcond_tl(TCG_COND_NE, t0, t1, l1);
5394             break;
5395         case OPC_TGE:
5396         case OPC_TGEI:
5397             tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1);
5398             break;
5399         case OPC_TGEU:
5400         case OPC_TGEIU:
5401             tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1);
5402             break;
5403         case OPC_TLT:
5404         case OPC_TLTI:
5405             tcg_gen_brcond_tl(TCG_COND_GE, t0, t1, l1);
5406             break;
5407         case OPC_TLTU:
5408         case OPC_TLTIU:
5409             tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1);
5410             break;
5411         case OPC_TNE:
5412         case OPC_TNEI:
5413             tcg_gen_brcond_tl(TCG_COND_EQ, t0, t1, l1);
5414             break;
5415         }
5416         generate_exception(ctx, EXCP_TRAP);
5417         gen_set_label(l1);
5418     }
5419     tcg_temp_free(t0);
5420     tcg_temp_free(t1);
5421 }
5422
5423 static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest)
5424 {
5425     if (unlikely(ctx->base.singlestep_enabled)) {
5426         return false;
5427     }
5428
5429 #ifndef CONFIG_USER_ONLY
5430     return (ctx->base.tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK);
5431 #else
5432     return true;
5433 #endif
5434 }
5435
5436 static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
5437 {
5438     if (use_goto_tb(ctx, dest)) {
5439         tcg_gen_goto_tb(n);
5440         gen_save_pc(dest);
5441         tcg_gen_exit_tb(ctx->base.tb, n);
5442     } else {
5443         gen_save_pc(dest);
5444         if (ctx->base.singlestep_enabled) {
5445             save_cpu_state(ctx, 0);
5446             gen_helper_raise_exception_debug(cpu_env);
5447         }
5448         tcg_gen_lookup_and_goto_ptr();
5449     }
5450 }
5451
5452 /* Branches (before delay slot) */
5453 static void gen_compute_branch (DisasContext *ctx, uint32_t opc,
5454                                 int insn_bytes,
5455                                 int rs, int rt, int32_t offset,
5456                                 int delayslot_size)
5457 {
5458     target_ulong btgt = -1;
5459     int blink = 0;
5460     int bcond_compute = 0;
5461     TCGv t0 = tcg_temp_new();
5462     TCGv t1 = tcg_temp_new();
5463
5464     if (ctx->hflags & MIPS_HFLAG_BMASK) {
5465 #ifdef MIPS_DEBUG_DISAS
5466         LOG_DISAS("Branch in delay / forbidden slot at PC 0x"
5467                   TARGET_FMT_lx "\n", ctx->base.pc_next);
5468 #endif
5469         generate_exception_end(ctx, EXCP_RI);
5470         goto out;
5471     }
5472
5473     /* Load needed operands */
5474     switch (opc) {
5475     case OPC_BEQ:
5476     case OPC_BEQL:
5477     case OPC_BNE:
5478     case OPC_BNEL:
5479         /* Compare two registers */
5480         if (rs != rt) {
5481             gen_load_gpr(t0, rs);
5482             gen_load_gpr(t1, rt);
5483             bcond_compute = 1;
5484         }
5485         btgt = ctx->base.pc_next + insn_bytes + offset;
5486         break;
5487     case OPC_BGEZ:
5488     case OPC_BGEZAL:
5489     case OPC_BGEZALL:
5490     case OPC_BGEZL:
5491     case OPC_BGTZ:
5492     case OPC_BGTZL:
5493     case OPC_BLEZ:
5494     case OPC_BLEZL:
5495     case OPC_BLTZ:
5496     case OPC_BLTZAL:
5497     case OPC_BLTZALL:
5498     case OPC_BLTZL:
5499         /* Compare to zero */
5500         if (rs != 0) {
5501             gen_load_gpr(t0, rs);
5502             bcond_compute = 1;
5503         }
5504         btgt = ctx->base.pc_next + insn_bytes + offset;
5505         break;
5506     case OPC_BPOSGE32:
5507 #if defined(TARGET_MIPS64)
5508     case OPC_BPOSGE64:
5509         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x7F);
5510 #else
5511         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
5512 #endif
5513         bcond_compute = 1;
5514         btgt = ctx->base.pc_next + insn_bytes + offset;
5515         break;
5516     case OPC_J:
5517     case OPC_JAL:
5518     case OPC_JALX:
5519         /* Jump to immediate */
5520         btgt = ((ctx->base.pc_next + insn_bytes) & (int32_t)0xF0000000) |
5521             (uint32_t)offset;
5522         break;
5523     case OPC_JR:
5524     case OPC_JALR:
5525         /* Jump to register */
5526         if (offset != 0 && offset != 16) {
5527             /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
5528                others are reserved. */
5529             MIPS_INVAL("jump hint");
5530             generate_exception_end(ctx, EXCP_RI);
5531             goto out;
5532         }
5533         gen_load_gpr(btarget, rs);
5534         break;
5535     default:
5536         MIPS_INVAL("branch/jump");
5537         generate_exception_end(ctx, EXCP_RI);
5538         goto out;
5539     }
5540     if (bcond_compute == 0) {
5541         /* No condition to be computed */
5542         switch (opc) {
5543         case OPC_BEQ:     /* rx == rx        */
5544         case OPC_BEQL:    /* rx == rx likely */
5545         case OPC_BGEZ:    /* 0 >= 0          */
5546         case OPC_BGEZL:   /* 0 >= 0 likely   */
5547         case OPC_BLEZ:    /* 0 <= 0          */
5548         case OPC_BLEZL:   /* 0 <= 0 likely   */
5549             /* Always take */
5550             ctx->hflags |= MIPS_HFLAG_B;
5551             break;
5552         case OPC_BGEZAL:  /* 0 >= 0          */
5553         case OPC_BGEZALL: /* 0 >= 0 likely   */
5554             /* Always take and link */
5555             blink = 31;
5556             ctx->hflags |= MIPS_HFLAG_B;
5557             break;
5558         case OPC_BNE:     /* rx != rx        */
5559         case OPC_BGTZ:    /* 0 > 0           */
5560         case OPC_BLTZ:    /* 0 < 0           */
5561             /* Treat as NOP. */
5562             goto out;
5563         case OPC_BLTZAL:  /* 0 < 0           */
5564             /* Handle as an unconditional branch to get correct delay
5565                slot checking.  */
5566             blink = 31;
5567             btgt = ctx->base.pc_next + insn_bytes + delayslot_size;
5568             ctx->hflags |= MIPS_HFLAG_B;
5569             break;
5570         case OPC_BLTZALL: /* 0 < 0 likely */
5571             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 8);
5572             /* Skip the instruction in the delay slot */
5573             ctx->base.pc_next += 4;
5574             goto out;
5575         case OPC_BNEL:    /* rx != rx likely */
5576         case OPC_BGTZL:   /* 0 > 0 likely */
5577         case OPC_BLTZL:   /* 0 < 0 likely */
5578             /* Skip the instruction in the delay slot */
5579             ctx->base.pc_next += 4;
5580             goto out;
5581         case OPC_J:
5582             ctx->hflags |= MIPS_HFLAG_B;
5583             break;
5584         case OPC_JALX:
5585             ctx->hflags |= MIPS_HFLAG_BX;
5586             /* Fallthrough */
5587         case OPC_JAL:
5588             blink = 31;
5589             ctx->hflags |= MIPS_HFLAG_B;
5590             break;
5591         case OPC_JR:
5592             ctx->hflags |= MIPS_HFLAG_BR;
5593             break;
5594         case OPC_JALR:
5595             blink = rt;
5596             ctx->hflags |= MIPS_HFLAG_BR;
5597             break;
5598         default:
5599             MIPS_INVAL("branch/jump");
5600             generate_exception_end(ctx, EXCP_RI);
5601             goto out;
5602         }
5603     } else {
5604         switch (opc) {
5605         case OPC_BEQ:
5606             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
5607             goto not_likely;
5608         case OPC_BEQL:
5609             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
5610             goto likely;
5611         case OPC_BNE:
5612             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
5613             goto not_likely;
5614         case OPC_BNEL:
5615             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
5616             goto likely;
5617         case OPC_BGEZ:
5618             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5619             goto not_likely;
5620         case OPC_BGEZL:
5621             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5622             goto likely;
5623         case OPC_BGEZAL:
5624             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5625             blink = 31;
5626             goto not_likely;
5627         case OPC_BGEZALL:
5628             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5629             blink = 31;
5630             goto likely;
5631         case OPC_BGTZ:
5632             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
5633             goto not_likely;
5634         case OPC_BGTZL:
5635             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
5636             goto likely;
5637         case OPC_BLEZ:
5638             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
5639             goto not_likely;
5640         case OPC_BLEZL:
5641             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
5642             goto likely;
5643         case OPC_BLTZ:
5644             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5645             goto not_likely;
5646         case OPC_BLTZL:
5647             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5648             goto likely;
5649         case OPC_BPOSGE32:
5650             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
5651             goto not_likely;
5652 #if defined(TARGET_MIPS64)
5653         case OPC_BPOSGE64:
5654             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 64);
5655             goto not_likely;
5656 #endif
5657         case OPC_BLTZAL:
5658             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5659             blink = 31;
5660         not_likely:
5661             ctx->hflags |= MIPS_HFLAG_BC;
5662             break;
5663         case OPC_BLTZALL:
5664             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5665             blink = 31;
5666         likely:
5667             ctx->hflags |= MIPS_HFLAG_BL;
5668             break;
5669         default:
5670             MIPS_INVAL("conditional branch/jump");
5671             generate_exception_end(ctx, EXCP_RI);
5672             goto out;
5673         }
5674     }
5675
5676     ctx->btarget = btgt;
5677
5678     switch (delayslot_size) {
5679     case 2:
5680         ctx->hflags |= MIPS_HFLAG_BDS16;
5681         break;
5682     case 4:
5683         ctx->hflags |= MIPS_HFLAG_BDS32;
5684         break;
5685     }
5686
5687     if (blink > 0) {
5688         int post_delay = insn_bytes + delayslot_size;
5689         int lowbit = !!(ctx->hflags & MIPS_HFLAG_M16);
5690
5691         tcg_gen_movi_tl(cpu_gpr[blink],
5692                         ctx->base.pc_next + post_delay + lowbit);
5693     }
5694
5695  out:
5696     if (insn_bytes == 2)
5697         ctx->hflags |= MIPS_HFLAG_B16;
5698     tcg_temp_free(t0);
5699     tcg_temp_free(t1);
5700 }
5701
5702
5703 /* nanoMIPS Branches */
5704 static void gen_compute_branch_nm(DisasContext *ctx, uint32_t opc,
5705                                 int insn_bytes,
5706                                 int rs, int rt, int32_t offset)
5707 {
5708     target_ulong btgt = -1;
5709     int bcond_compute = 0;
5710     TCGv t0 = tcg_temp_new();
5711     TCGv t1 = tcg_temp_new();
5712
5713     /* Load needed operands */
5714     switch (opc) {
5715     case OPC_BEQ:
5716     case OPC_BNE:
5717         /* Compare two registers */
5718         if (rs != rt) {
5719             gen_load_gpr(t0, rs);
5720             gen_load_gpr(t1, rt);
5721             bcond_compute = 1;
5722         }
5723         btgt = ctx->base.pc_next + insn_bytes + offset;
5724         break;
5725     case OPC_BGEZAL:
5726         /* Compare to zero */
5727         if (rs != 0) {
5728             gen_load_gpr(t0, rs);
5729             bcond_compute = 1;
5730         }
5731         btgt = ctx->base.pc_next + insn_bytes + offset;
5732         break;
5733     case OPC_BPOSGE32:
5734         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
5735         bcond_compute = 1;
5736         btgt = ctx->base.pc_next + insn_bytes + offset;
5737         break;
5738     case OPC_JR:
5739     case OPC_JALR:
5740         /* Jump to register */
5741         if (offset != 0 && offset != 16) {
5742             /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
5743                others are reserved. */
5744             MIPS_INVAL("jump hint");
5745             generate_exception_end(ctx, EXCP_RI);
5746             goto out;
5747         }
5748         gen_load_gpr(btarget, rs);
5749         break;
5750     default:
5751         MIPS_INVAL("branch/jump");
5752         generate_exception_end(ctx, EXCP_RI);
5753         goto out;
5754     }
5755     if (bcond_compute == 0) {
5756         /* No condition to be computed */
5757         switch (opc) {
5758         case OPC_BEQ:     /* rx == rx        */
5759             /* Always take */
5760             ctx->hflags |= MIPS_HFLAG_B;
5761             break;
5762         case OPC_BGEZAL:  /* 0 >= 0          */
5763             /* Always take and link */
5764             tcg_gen_movi_tl(cpu_gpr[31],
5765                             ctx->base.pc_next + insn_bytes);
5766             ctx->hflags |= MIPS_HFLAG_B;
5767             break;
5768         case OPC_BNE:     /* rx != rx        */
5769             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 8);
5770             /* Skip the instruction in the delay slot */
5771             ctx->base.pc_next += 4;
5772             goto out;
5773         case OPC_JR:
5774             ctx->hflags |= MIPS_HFLAG_BR;
5775             break;
5776         case OPC_JALR:
5777             if (rt > 0) {
5778                 tcg_gen_movi_tl(cpu_gpr[rt],
5779                                 ctx->base.pc_next + insn_bytes);
5780             }
5781             ctx->hflags |= MIPS_HFLAG_BR;
5782             break;
5783         default:
5784             MIPS_INVAL("branch/jump");
5785             generate_exception_end(ctx, EXCP_RI);
5786             goto out;
5787         }
5788     } else {
5789         switch (opc) {
5790         case OPC_BEQ:
5791             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
5792             goto not_likely;
5793         case OPC_BNE:
5794             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
5795             goto not_likely;
5796         case OPC_BGEZAL:
5797             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5798             tcg_gen_movi_tl(cpu_gpr[31],
5799                             ctx->base.pc_next + insn_bytes);
5800             goto not_likely;
5801         case OPC_BPOSGE32:
5802             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
5803         not_likely:
5804             ctx->hflags |= MIPS_HFLAG_BC;
5805             break;
5806         default:
5807             MIPS_INVAL("conditional branch/jump");
5808             generate_exception_end(ctx, EXCP_RI);
5809             goto out;
5810         }
5811     }
5812
5813     ctx->btarget = btgt;
5814
5815  out:
5816     if (insn_bytes == 2) {
5817         ctx->hflags |= MIPS_HFLAG_B16;
5818     }
5819     tcg_temp_free(t0);
5820     tcg_temp_free(t1);
5821 }
5822
5823
5824 /* special3 bitfield operations */
5825 static void gen_bitops (DisasContext *ctx, uint32_t opc, int rt,
5826                         int rs, int lsb, int msb)
5827 {
5828     TCGv t0 = tcg_temp_new();
5829     TCGv t1 = tcg_temp_new();
5830
5831     gen_load_gpr(t1, rs);
5832     switch (opc) {
5833     case OPC_EXT:
5834         if (lsb + msb > 31) {
5835             goto fail;
5836         }
5837         if (msb != 31) {
5838             tcg_gen_extract_tl(t0, t1, lsb, msb + 1);
5839         } else {
5840             /* The two checks together imply that lsb == 0,
5841                so this is a simple sign-extension.  */
5842             tcg_gen_ext32s_tl(t0, t1);
5843         }
5844         break;
5845 #if defined(TARGET_MIPS64)
5846     case OPC_DEXTU:
5847         lsb += 32;
5848         goto do_dext;
5849     case OPC_DEXTM:
5850         msb += 32;
5851         goto do_dext;
5852     case OPC_DEXT:
5853     do_dext:
5854         if (lsb + msb > 63) {
5855             goto fail;
5856         }
5857         tcg_gen_extract_tl(t0, t1, lsb, msb + 1);
5858         break;
5859 #endif
5860     case OPC_INS:
5861         if (lsb > msb) {
5862             goto fail;
5863         }
5864         gen_load_gpr(t0, rt);
5865         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
5866         tcg_gen_ext32s_tl(t0, t0);
5867         break;
5868 #if defined(TARGET_MIPS64)
5869     case OPC_DINSU:
5870         lsb += 32;
5871         /* FALLTHRU */
5872     case OPC_DINSM:
5873         msb += 32;
5874         /* FALLTHRU */
5875     case OPC_DINS:
5876         if (lsb > msb) {
5877             goto fail;
5878         }
5879         gen_load_gpr(t0, rt);
5880         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
5881         break;
5882 #endif
5883     default:
5884 fail:
5885         MIPS_INVAL("bitops");
5886         generate_exception_end(ctx, EXCP_RI);
5887         tcg_temp_free(t0);
5888         tcg_temp_free(t1);
5889         return;
5890     }
5891     gen_store_gpr(t0, rt);
5892     tcg_temp_free(t0);
5893     tcg_temp_free(t1);
5894 }
5895
5896 static void gen_bshfl (DisasContext *ctx, uint32_t op2, int rt, int rd)
5897 {
5898     TCGv t0;
5899
5900     if (rd == 0) {
5901         /* If no destination, treat it as a NOP. */
5902         return;
5903     }
5904
5905     t0 = tcg_temp_new();
5906     gen_load_gpr(t0, rt);
5907     switch (op2) {
5908     case OPC_WSBH:
5909         {
5910             TCGv t1 = tcg_temp_new();
5911             TCGv t2 = tcg_const_tl(0x00FF00FF);
5912
5913             tcg_gen_shri_tl(t1, t0, 8);
5914             tcg_gen_and_tl(t1, t1, t2);
5915             tcg_gen_and_tl(t0, t0, t2);
5916             tcg_gen_shli_tl(t0, t0, 8);
5917             tcg_gen_or_tl(t0, t0, t1);
5918             tcg_temp_free(t2);
5919             tcg_temp_free(t1);
5920             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
5921         }
5922         break;
5923     case OPC_SEB:
5924         tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
5925         break;
5926     case OPC_SEH:
5927         tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
5928         break;
5929 #if defined(TARGET_MIPS64)
5930     case OPC_DSBH:
5931         {
5932             TCGv t1 = tcg_temp_new();
5933             TCGv t2 = tcg_const_tl(0x00FF00FF00FF00FFULL);
5934
5935             tcg_gen_shri_tl(t1, t0, 8);
5936             tcg_gen_and_tl(t1, t1, t2);
5937             tcg_gen_and_tl(t0, t0, t2);
5938             tcg_gen_shli_tl(t0, t0, 8);
5939             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
5940             tcg_temp_free(t2);
5941             tcg_temp_free(t1);
5942         }
5943         break;
5944     case OPC_DSHD:
5945         {
5946             TCGv t1 = tcg_temp_new();
5947             TCGv t2 = tcg_const_tl(0x0000FFFF0000FFFFULL);
5948
5949             tcg_gen_shri_tl(t1, t0, 16);
5950             tcg_gen_and_tl(t1, t1, t2);
5951             tcg_gen_and_tl(t0, t0, t2);
5952             tcg_gen_shli_tl(t0, t0, 16);
5953             tcg_gen_or_tl(t0, t0, t1);
5954             tcg_gen_shri_tl(t1, t0, 32);
5955             tcg_gen_shli_tl(t0, t0, 32);
5956             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
5957             tcg_temp_free(t2);
5958             tcg_temp_free(t1);
5959         }
5960         break;
5961 #endif
5962     default:
5963         MIPS_INVAL("bsfhl");
5964         generate_exception_end(ctx, EXCP_RI);
5965         tcg_temp_free(t0);
5966         return;
5967     }
5968     tcg_temp_free(t0);
5969 }
5970
5971 static void gen_lsa(DisasContext *ctx, int opc, int rd, int rs, int rt,
5972                     int imm2)
5973 {
5974     TCGv t0;
5975     TCGv t1;
5976     if (rd == 0) {
5977         /* Treat as NOP. */
5978         return;
5979     }
5980     t0 = tcg_temp_new();
5981     t1 = tcg_temp_new();
5982     gen_load_gpr(t0, rs);
5983     gen_load_gpr(t1, rt);
5984     tcg_gen_shli_tl(t0, t0, imm2 + 1);
5985     tcg_gen_add_tl(cpu_gpr[rd], t0, t1);
5986     if (opc == OPC_LSA) {
5987         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
5988     }
5989
5990     tcg_temp_free(t1);
5991     tcg_temp_free(t0);
5992
5993     return;
5994 }
5995
5996 static void gen_align_bits(DisasContext *ctx, int wordsz, int rd, int rs,
5997                            int rt, int bits)
5998 {
5999     TCGv t0;
6000     if (rd == 0) {
6001         /* Treat as NOP. */
6002         return;
6003     }
6004     t0 = tcg_temp_new();
6005     if (bits == 0 || bits == wordsz) {
6006         if (bits == 0) {
6007             gen_load_gpr(t0, rt);
6008         } else {
6009             gen_load_gpr(t0, rs);
6010         }
6011         switch (wordsz) {
6012         case 32:
6013             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
6014             break;
6015 #if defined(TARGET_MIPS64)
6016         case 64:
6017             tcg_gen_mov_tl(cpu_gpr[rd], t0);
6018             break;
6019 #endif
6020         }
6021     } else {
6022         TCGv t1 = tcg_temp_new();
6023         gen_load_gpr(t0, rt);
6024         gen_load_gpr(t1, rs);
6025         switch (wordsz) {
6026         case 32:
6027             {
6028                 TCGv_i64 t2 = tcg_temp_new_i64();
6029                 tcg_gen_concat_tl_i64(t2, t1, t0);
6030                 tcg_gen_shri_i64(t2, t2, 32 - bits);
6031                 gen_move_low32(cpu_gpr[rd], t2);
6032                 tcg_temp_free_i64(t2);
6033             }
6034             break;
6035 #if defined(TARGET_MIPS64)
6036         case 64:
6037             tcg_gen_shli_tl(t0, t0, bits);
6038             tcg_gen_shri_tl(t1, t1, 64 - bits);
6039             tcg_gen_or_tl(cpu_gpr[rd], t1, t0);
6040             break;
6041 #endif
6042         }
6043         tcg_temp_free(t1);
6044     }
6045
6046     tcg_temp_free(t0);
6047 }
6048
6049 static void gen_align(DisasContext *ctx, int wordsz, int rd, int rs, int rt,
6050                       int bp)
6051 {
6052     gen_align_bits(ctx, wordsz, rd, rs, rt, bp * 8);
6053 }
6054
6055 static void gen_ext(DisasContext *ctx, int wordsz, int rd, int rs, int rt,
6056                     int shift)
6057 {
6058     gen_align_bits(ctx, wordsz, rd, rs, rt, wordsz - shift);
6059 }
6060
6061 static void gen_bitswap(DisasContext *ctx, int opc, int rd, int rt)
6062 {
6063     TCGv t0;
6064     if (rd == 0) {
6065         /* Treat as NOP. */
6066         return;
6067     }
6068     t0 = tcg_temp_new();
6069     gen_load_gpr(t0, rt);
6070     switch (opc) {
6071     case OPC_BITSWAP:
6072         gen_helper_bitswap(cpu_gpr[rd], t0);
6073         break;
6074 #if defined(TARGET_MIPS64)
6075     case OPC_DBITSWAP:
6076         gen_helper_dbitswap(cpu_gpr[rd], t0);
6077         break;
6078 #endif
6079     }
6080     tcg_temp_free(t0);
6081 }
6082
6083 #ifndef CONFIG_USER_ONLY
6084 /* CP0 (MMU and control) */
6085 static inline void gen_mthc0_entrylo(TCGv arg, target_ulong off)
6086 {
6087     TCGv_i64 t0 = tcg_temp_new_i64();
6088     TCGv_i64 t1 = tcg_temp_new_i64();
6089
6090     tcg_gen_ext_tl_i64(t0, arg);
6091     tcg_gen_ld_i64(t1, cpu_env, off);
6092 #if defined(TARGET_MIPS64)
6093     tcg_gen_deposit_i64(t1, t1, t0, 30, 32);
6094 #else
6095     tcg_gen_concat32_i64(t1, t1, t0);
6096 #endif
6097     tcg_gen_st_i64(t1, cpu_env, off);
6098     tcg_temp_free_i64(t1);
6099     tcg_temp_free_i64(t0);
6100 }
6101
6102 static inline void gen_mthc0_store64(TCGv arg, target_ulong off)
6103 {
6104     TCGv_i64 t0 = tcg_temp_new_i64();
6105     TCGv_i64 t1 = tcg_temp_new_i64();
6106
6107     tcg_gen_ext_tl_i64(t0, arg);
6108     tcg_gen_ld_i64(t1, cpu_env, off);
6109     tcg_gen_concat32_i64(t1, t1, t0);
6110     tcg_gen_st_i64(t1, cpu_env, off);
6111     tcg_temp_free_i64(t1);
6112     tcg_temp_free_i64(t0);
6113 }
6114
6115 static inline void gen_mfhc0_entrylo(TCGv arg, target_ulong off)
6116 {
6117     TCGv_i64 t0 = tcg_temp_new_i64();
6118
6119     tcg_gen_ld_i64(t0, cpu_env, off);
6120 #if defined(TARGET_MIPS64)
6121     tcg_gen_shri_i64(t0, t0, 30);
6122 #else
6123     tcg_gen_shri_i64(t0, t0, 32);
6124 #endif
6125     gen_move_low32(arg, t0);
6126     tcg_temp_free_i64(t0);
6127 }
6128
6129 static inline void gen_mfhc0_load64(TCGv arg, target_ulong off, int shift)
6130 {
6131     TCGv_i64 t0 = tcg_temp_new_i64();
6132
6133     tcg_gen_ld_i64(t0, cpu_env, off);
6134     tcg_gen_shri_i64(t0, t0, 32 + shift);
6135     gen_move_low32(arg, t0);
6136     tcg_temp_free_i64(t0);
6137 }
6138
6139 static inline void gen_mfc0_load32 (TCGv arg, target_ulong off)
6140 {
6141     TCGv_i32 t0 = tcg_temp_new_i32();
6142
6143     tcg_gen_ld_i32(t0, cpu_env, off);
6144     tcg_gen_ext_i32_tl(arg, t0);
6145     tcg_temp_free_i32(t0);
6146 }
6147
6148 static inline void gen_mfc0_load64 (TCGv arg, target_ulong off)
6149 {
6150     tcg_gen_ld_tl(arg, cpu_env, off);
6151     tcg_gen_ext32s_tl(arg, arg);
6152 }
6153
6154 static inline void gen_mtc0_store32 (TCGv arg, target_ulong off)
6155 {
6156     TCGv_i32 t0 = tcg_temp_new_i32();
6157
6158     tcg_gen_trunc_tl_i32(t0, arg);
6159     tcg_gen_st_i32(t0, cpu_env, off);
6160     tcg_temp_free_i32(t0);
6161 }
6162
6163 #define CP0_CHECK(c)                            \
6164     do {                                        \
6165         if (!(c)) {                             \
6166             goto cp0_unimplemented;             \
6167         }                                       \
6168     } while (0)
6169
6170 static void gen_mfhc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6171 {
6172     const char *rn = "invalid";
6173
6174     switch (reg) {
6175     case 2:
6176         switch (sel) {
6177         case 0:
6178             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
6179             gen_mfhc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo0));
6180             rn = "EntryLo0";
6181             break;
6182         default:
6183             goto cp0_unimplemented;
6184         }
6185         break;
6186     case 3:
6187         switch (sel) {
6188         case 0:
6189             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
6190             gen_mfhc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo1));
6191             rn = "EntryLo1";
6192             break;
6193         default:
6194             goto cp0_unimplemented;
6195         }
6196         break;
6197     case 17:
6198         switch (sel) {
6199         case 0:
6200             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, lladdr),
6201                              ctx->CP0_LLAddr_shift);
6202             rn = "LLAddr";
6203             break;
6204         case 1:
6205             CP0_CHECK(ctx->mrp);
6206             gen_helper_mfhc0_maar(arg, cpu_env);
6207             rn = "MAAR";
6208             break;
6209         default:
6210             goto cp0_unimplemented;
6211         }
6212         break;
6213     case 28:
6214         switch (sel) {
6215         case 0:
6216         case 2:
6217         case 4:
6218         case 6:
6219             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, CP0_TagLo), 0);
6220             rn = "TagLo";
6221             break;
6222         default:
6223             goto cp0_unimplemented;
6224         }
6225         break;
6226     default:
6227         goto cp0_unimplemented;
6228     }
6229     trace_mips_translate_c0("mfhc0", rn, reg, sel);
6230     return;
6231
6232 cp0_unimplemented:
6233     qemu_log_mask(LOG_UNIMP, "mfhc0 %s (reg %d sel %d)\n", rn, reg, sel);
6234     tcg_gen_movi_tl(arg, 0);
6235 }
6236
6237 static void gen_mthc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6238 {
6239     const char *rn = "invalid";
6240     uint64_t mask = ctx->PAMask >> 36;
6241
6242     switch (reg) {
6243     case 2:
6244         switch (sel) {
6245         case 0:
6246             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
6247             tcg_gen_andi_tl(arg, arg, mask);
6248             gen_mthc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo0));
6249             rn = "EntryLo0";
6250             break;
6251         default:
6252             goto cp0_unimplemented;
6253         }
6254         break;
6255     case 3:
6256         switch (sel) {
6257         case 0:
6258             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
6259             tcg_gen_andi_tl(arg, arg, mask);
6260             gen_mthc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo1));
6261             rn = "EntryLo1";
6262             break;
6263         default:
6264             goto cp0_unimplemented;
6265         }
6266         break;
6267     case 17:
6268         switch (sel) {
6269         case 0:
6270             /* LLAddr is read-only (the only exception is bit 0 if LLB is
6271                supported); the CP0_LLAddr_rw_bitmask does not seem to be
6272                relevant for modern MIPS cores supporting MTHC0, therefore
6273                treating MTHC0 to LLAddr as NOP. */
6274             rn = "LLAddr";
6275             break;
6276         case 1:
6277             CP0_CHECK(ctx->mrp);
6278             gen_helper_mthc0_maar(cpu_env, arg);
6279             rn = "MAAR";
6280             break;
6281         default:
6282             goto cp0_unimplemented;
6283         }
6284         break;
6285     case 28:
6286         switch (sel) {
6287         case 0:
6288         case 2:
6289         case 4:
6290         case 6:
6291             tcg_gen_andi_tl(arg, arg, mask);
6292             gen_mthc0_store64(arg, offsetof(CPUMIPSState, CP0_TagLo));
6293             rn = "TagLo";
6294             break;
6295         default:
6296             goto cp0_unimplemented;
6297         }
6298         break;
6299     default:
6300         goto cp0_unimplemented;
6301     }
6302     trace_mips_translate_c0("mthc0", rn, reg, sel);
6303
6304 cp0_unimplemented:
6305     qemu_log_mask(LOG_UNIMP, "mthc0 %s (reg %d sel %d)\n", rn, reg, sel);
6306 }
6307
6308 static inline void gen_mfc0_unimplemented(DisasContext *ctx, TCGv arg)
6309 {
6310     if (ctx->insn_flags & ISA_MIPS32R6) {
6311         tcg_gen_movi_tl(arg, 0);
6312     } else {
6313         tcg_gen_movi_tl(arg, ~0);
6314     }
6315 }
6316
6317 static void gen_mfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6318 {
6319     const char *rn = "invalid";
6320
6321     if (sel != 0)
6322         check_insn(ctx, ISA_MIPS32);
6323
6324     switch (reg) {
6325     case 0:
6326         switch (sel) {
6327         case 0:
6328             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
6329             rn = "Index";
6330             break;
6331         case 1:
6332             CP0_CHECK(ctx->insn_flags & ASE_MT);
6333             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
6334             rn = "MVPControl";
6335             break;
6336         case 2:
6337             CP0_CHECK(ctx->insn_flags & ASE_MT);
6338             gen_helper_mfc0_mvpconf0(arg, cpu_env);
6339             rn = "MVPConf0";
6340             break;
6341         case 3:
6342             CP0_CHECK(ctx->insn_flags & ASE_MT);
6343             gen_helper_mfc0_mvpconf1(arg, cpu_env);
6344             rn = "MVPConf1";
6345             break;
6346         case 4:
6347             CP0_CHECK(ctx->vp);
6348             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPControl));
6349             rn = "VPControl";
6350             break;
6351         default:
6352             goto cp0_unimplemented;
6353         }
6354         break;
6355     case 1:
6356         switch (sel) {
6357         case 0:
6358             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
6359             gen_helper_mfc0_random(arg, cpu_env);
6360             rn = "Random";
6361             break;
6362         case 1:
6363             CP0_CHECK(ctx->insn_flags & ASE_MT);
6364             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
6365             rn = "VPEControl";
6366             break;
6367         case 2:
6368             CP0_CHECK(ctx->insn_flags & ASE_MT);
6369             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
6370             rn = "VPEConf0";
6371             break;
6372         case 3:
6373             CP0_CHECK(ctx->insn_flags & ASE_MT);
6374             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
6375             rn = "VPEConf1";
6376             break;
6377         case 4:
6378             CP0_CHECK(ctx->insn_flags & ASE_MT);
6379             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_YQMask));
6380             rn = "YQMask";
6381             break;
6382         case 5:
6383             CP0_CHECK(ctx->insn_flags & ASE_MT);
6384             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
6385             rn = "VPESchedule";
6386             break;
6387         case 6:
6388             CP0_CHECK(ctx->insn_flags & ASE_MT);
6389             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
6390             rn = "VPEScheFBack";
6391             break;
6392         case 7:
6393             CP0_CHECK(ctx->insn_flags & ASE_MT);
6394             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
6395             rn = "VPEOpt";
6396             break;
6397         default:
6398             goto cp0_unimplemented;
6399         }
6400         break;
6401     case 2:
6402         switch (sel) {
6403         case 0:
6404             {
6405                 TCGv_i64 tmp = tcg_temp_new_i64();
6406                 tcg_gen_ld_i64(tmp, cpu_env,
6407                                offsetof(CPUMIPSState, CP0_EntryLo0));
6408 #if defined(TARGET_MIPS64)
6409                 if (ctx->rxi) {
6410                     /* Move RI/XI fields to bits 31:30 */
6411                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
6412                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
6413                 }
6414 #endif
6415                 gen_move_low32(arg, tmp);
6416                 tcg_temp_free_i64(tmp);
6417             }
6418             rn = "EntryLo0";
6419             break;
6420         case 1:
6421             CP0_CHECK(ctx->insn_flags & ASE_MT);
6422             gen_helper_mfc0_tcstatus(arg, cpu_env);
6423             rn = "TCStatus";
6424             break;
6425         case 2:
6426             CP0_CHECK(ctx->insn_flags & ASE_MT);
6427             gen_helper_mfc0_tcbind(arg, cpu_env);
6428             rn = "TCBind";
6429             break;
6430         case 3:
6431             CP0_CHECK(ctx->insn_flags & ASE_MT);
6432             gen_helper_mfc0_tcrestart(arg, cpu_env);
6433             rn = "TCRestart";
6434             break;
6435         case 4:
6436             CP0_CHECK(ctx->insn_flags & ASE_MT);
6437             gen_helper_mfc0_tchalt(arg, cpu_env);
6438             rn = "TCHalt";
6439             break;
6440         case 5:
6441             CP0_CHECK(ctx->insn_flags & ASE_MT);
6442             gen_helper_mfc0_tccontext(arg, cpu_env);
6443             rn = "TCContext";
6444             break;
6445         case 6:
6446             CP0_CHECK(ctx->insn_flags & ASE_MT);
6447             gen_helper_mfc0_tcschedule(arg, cpu_env);
6448             rn = "TCSchedule";
6449             break;
6450         case 7:
6451             CP0_CHECK(ctx->insn_flags & ASE_MT);
6452             gen_helper_mfc0_tcschefback(arg, cpu_env);
6453             rn = "TCScheFBack";
6454             break;
6455         default:
6456             goto cp0_unimplemented;
6457         }
6458         break;
6459     case 3:
6460         switch (sel) {
6461         case 0:
6462             {
6463                 TCGv_i64 tmp = tcg_temp_new_i64();
6464                 tcg_gen_ld_i64(tmp, cpu_env,
6465                                offsetof(CPUMIPSState, CP0_EntryLo1));
6466 #if defined(TARGET_MIPS64)
6467                 if (ctx->rxi) {
6468                     /* Move RI/XI fields to bits 31:30 */
6469                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
6470                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
6471                 }
6472 #endif
6473                 gen_move_low32(arg, tmp);
6474                 tcg_temp_free_i64(tmp);
6475             }
6476             rn = "EntryLo1";
6477             break;
6478         case 1:
6479             CP0_CHECK(ctx->vp);
6480             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_GlobalNumber));
6481             rn = "GlobalNumber";
6482             break;
6483         default:
6484             goto cp0_unimplemented;
6485         }
6486         break;
6487     case 4:
6488         switch (sel) {
6489         case 0:
6490             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
6491             tcg_gen_ext32s_tl(arg, arg);
6492             rn = "Context";
6493             break;
6494         case 1:
6495 //            gen_helper_mfc0_contextconfig(arg); /* SmartMIPS ASE */
6496             rn = "ContextConfig";
6497             goto cp0_unimplemented;
6498         case 2:
6499             CP0_CHECK(ctx->ulri);
6500             tcg_gen_ld_tl(arg, cpu_env,
6501                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
6502             tcg_gen_ext32s_tl(arg, arg);
6503             rn = "UserLocal";
6504             break;
6505         default:
6506             goto cp0_unimplemented;
6507         }
6508         break;
6509     case 5:
6510         switch (sel) {
6511         case 0:
6512             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
6513             rn = "PageMask";
6514             break;
6515         case 1:
6516             check_insn(ctx, ISA_MIPS32R2);
6517             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
6518             rn = "PageGrain";
6519             break;
6520         case 2:
6521             CP0_CHECK(ctx->sc);
6522             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl0));
6523             tcg_gen_ext32s_tl(arg, arg);
6524             rn = "SegCtl0";
6525             break;
6526         case 3:
6527             CP0_CHECK(ctx->sc);
6528             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl1));
6529             tcg_gen_ext32s_tl(arg, arg);
6530             rn = "SegCtl1";
6531             break;
6532         case 4:
6533             CP0_CHECK(ctx->sc);
6534             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl2));
6535             tcg_gen_ext32s_tl(arg, arg);
6536             rn = "SegCtl2";
6537             break;
6538         case 5:
6539             check_pw(ctx);
6540             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWBase));
6541             rn = "PWBase";
6542             break;
6543         case 6:
6544             check_pw(ctx);
6545             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWField));
6546             rn = "PWField";
6547             break;
6548         case 7:
6549             check_pw(ctx);
6550             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWSize));
6551             rn = "PWSize";
6552             break;
6553         default:
6554             goto cp0_unimplemented;
6555         }
6556         break;
6557     case 6:
6558         switch (sel) {
6559         case 0:
6560             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
6561             rn = "Wired";
6562             break;
6563         case 1:
6564             check_insn(ctx, ISA_MIPS32R2);
6565             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
6566             rn = "SRSConf0";
6567             break;
6568         case 2:
6569             check_insn(ctx, ISA_MIPS32R2);
6570             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
6571             rn = "SRSConf1";
6572             break;
6573         case 3:
6574             check_insn(ctx, ISA_MIPS32R2);
6575             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
6576             rn = "SRSConf2";
6577             break;
6578         case 4:
6579             check_insn(ctx, ISA_MIPS32R2);
6580             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
6581             rn = "SRSConf3";
6582             break;
6583         case 5:
6584             check_insn(ctx, ISA_MIPS32R2);
6585             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
6586             rn = "SRSConf4";
6587             break;
6588         case 6:
6589             check_pw(ctx);
6590             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWCtl));
6591             rn = "PWCtl";
6592             break;
6593         default:
6594             goto cp0_unimplemented;
6595         }
6596         break;
6597     case 7:
6598         switch (sel) {
6599         case 0:
6600             check_insn(ctx, ISA_MIPS32R2);
6601             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
6602             rn = "HWREna";
6603             break;
6604         default:
6605             goto cp0_unimplemented;
6606         }
6607         break;
6608     case 8:
6609         switch (sel) {
6610         case 0:
6611             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
6612             tcg_gen_ext32s_tl(arg, arg);
6613             rn = "BadVAddr";
6614             break;
6615         case 1:
6616             CP0_CHECK(ctx->bi);
6617             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
6618             rn = "BadInstr";
6619             break;
6620         case 2:
6621             CP0_CHECK(ctx->bp);
6622             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
6623             rn = "BadInstrP";
6624             break;
6625         case 3:
6626             CP0_CHECK(ctx->bi);
6627             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrX));
6628             tcg_gen_andi_tl(arg, arg, ~0xffff);
6629             rn = "BadInstrX";
6630             break;
6631        default:
6632             goto cp0_unimplemented;
6633         }
6634         break;
6635     case 9:
6636         switch (sel) {
6637         case 0:
6638             /* Mark as an IO operation because we read the time.  */
6639             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
6640                 gen_io_start();
6641             }
6642             gen_helper_mfc0_count(arg, cpu_env);
6643             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
6644                 gen_io_end();
6645             }
6646             /* Break the TB to be able to take timer interrupts immediately
6647                after reading count. DISAS_STOP isn't sufficient, we need to
6648                ensure we break completely out of translated code.  */
6649             gen_save_pc(ctx->base.pc_next + 4);
6650             ctx->base.is_jmp = DISAS_EXIT;
6651             rn = "Count";
6652             break;
6653         /* 6,7 are implementation dependent */
6654         default:
6655             goto cp0_unimplemented;
6656         }
6657         break;
6658     case 10:
6659         switch (sel) {
6660         case 0:
6661             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
6662             tcg_gen_ext32s_tl(arg, arg);
6663             rn = "EntryHi";
6664             break;
6665         default:
6666             goto cp0_unimplemented;
6667         }
6668         break;
6669     case 11:
6670         switch (sel) {
6671         case 0:
6672             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
6673             rn = "Compare";
6674             break;
6675         /* 6,7 are implementation dependent */
6676         default:
6677             goto cp0_unimplemented;
6678         }
6679         break;
6680     case 12:
6681         switch (sel) {
6682         case 0:
6683             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
6684             rn = "Status";
6685             break;
6686         case 1:
6687             check_insn(ctx, ISA_MIPS32R2);
6688             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
6689             rn = "IntCtl";
6690             break;
6691         case 2:
6692             check_insn(ctx, ISA_MIPS32R2);
6693             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
6694             rn = "SRSCtl";
6695             break;
6696         case 3:
6697             check_insn(ctx, ISA_MIPS32R2);
6698             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
6699             rn = "SRSMap";
6700             break;
6701         default:
6702             goto cp0_unimplemented;
6703        }
6704         break;
6705     case 13:
6706         switch (sel) {
6707         case 0:
6708             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
6709             rn = "Cause";
6710             break;
6711         default:
6712             goto cp0_unimplemented;
6713        }
6714         break;
6715     case 14:
6716         switch (sel) {
6717         case 0:
6718             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
6719             tcg_gen_ext32s_tl(arg, arg);
6720             rn = "EPC";
6721             break;
6722         default:
6723             goto cp0_unimplemented;
6724         }
6725         break;
6726     case 15:
6727         switch (sel) {
6728         case 0:
6729             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
6730             rn = "PRid";
6731             break;
6732         case 1:
6733             check_insn(ctx, ISA_MIPS32R2);
6734             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EBase));
6735             tcg_gen_ext32s_tl(arg, arg);
6736             rn = "EBase";
6737             break;
6738         case 3:
6739             check_insn(ctx, ISA_MIPS32R2);
6740             CP0_CHECK(ctx->cmgcr);
6741             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_CMGCRBase));
6742             tcg_gen_ext32s_tl(arg, arg);
6743             rn = "CMGCRBase";
6744             break;
6745         default:
6746             goto cp0_unimplemented;
6747        }
6748         break;
6749     case 16:
6750         switch (sel) {
6751         case 0:
6752             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
6753             rn = "Config";
6754             break;
6755         case 1:
6756             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
6757             rn = "Config1";
6758             break;
6759         case 2:
6760             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
6761             rn = "Config2";
6762             break;
6763         case 3:
6764             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
6765             rn = "Config3";
6766             break;
6767         case 4:
6768             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
6769             rn = "Config4";
6770             break;
6771         case 5:
6772             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
6773             rn = "Config5";
6774             break;
6775         /* 6,7 are implementation dependent */
6776         case 6:
6777             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
6778             rn = "Config6";
6779             break;
6780         case 7:
6781             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
6782             rn = "Config7";
6783             break;
6784         default:
6785             goto cp0_unimplemented;
6786         }
6787         break;
6788     case 17:
6789         switch (sel) {
6790         case 0:
6791             gen_helper_mfc0_lladdr(arg, cpu_env);
6792             rn = "LLAddr";
6793             break;
6794         case 1:
6795             CP0_CHECK(ctx->mrp);
6796             gen_helper_mfc0_maar(arg, cpu_env);
6797             rn = "MAAR";
6798             break;
6799         case 2:
6800             CP0_CHECK(ctx->mrp);
6801             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MAARI));
6802             rn = "MAARI";
6803             break;
6804         default:
6805             goto cp0_unimplemented;
6806         }
6807         break;
6808     case 18:
6809         switch (sel) {
6810         case 0:
6811         case 1:
6812         case 2:
6813         case 3:
6814         case 4:
6815         case 5:
6816         case 6:
6817         case 7:
6818             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
6819             gen_helper_1e0i(mfc0_watchlo, arg, sel);
6820             rn = "WatchLo";
6821             break;
6822         default:
6823             goto cp0_unimplemented;
6824         }
6825         break;
6826     case 19:
6827         switch (sel) {
6828         case 0:
6829         case 1:
6830         case 2:
6831         case 3:
6832         case 4:
6833         case 5:
6834         case 6:
6835         case 7:
6836             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
6837             gen_helper_1e0i(mfc0_watchhi, arg, sel);
6838             rn = "WatchHi";
6839             break;
6840         default:
6841             goto cp0_unimplemented;
6842         }
6843         break;
6844     case 20:
6845         switch (sel) {
6846         case 0:
6847 #if defined(TARGET_MIPS64)
6848             check_insn(ctx, ISA_MIPS3);
6849             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
6850             tcg_gen_ext32s_tl(arg, arg);
6851             rn = "XContext";
6852             break;
6853 #endif
6854         default:
6855             goto cp0_unimplemented;
6856         }
6857         break;
6858     case 21:
6859        /* Officially reserved, but sel 0 is used for R1x000 framemask */
6860         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
6861         switch (sel) {
6862         case 0:
6863             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
6864             rn = "Framemask";
6865             break;
6866         default:
6867             goto cp0_unimplemented;
6868         }
6869         break;
6870     case 22:
6871         tcg_gen_movi_tl(arg, 0); /* unimplemented */
6872         rn = "'Diagnostic"; /* implementation dependent */
6873         break;
6874     case 23:
6875         switch (sel) {
6876         case 0:
6877             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
6878             rn = "Debug";
6879             break;
6880         case 1:
6881 //            gen_helper_mfc0_tracecontrol(arg); /* PDtrace support */
6882             rn = "TraceControl";
6883             goto cp0_unimplemented;
6884         case 2:
6885 //            gen_helper_mfc0_tracecontrol2(arg); /* PDtrace support */
6886             rn = "TraceControl2";
6887             goto cp0_unimplemented;
6888         case 3:
6889 //            gen_helper_mfc0_usertracedata(arg); /* PDtrace support */
6890             rn = "UserTraceData";
6891             goto cp0_unimplemented;
6892         case 4:
6893 //            gen_helper_mfc0_tracebpc(arg); /* PDtrace support */
6894             rn = "TraceBPC";
6895             goto cp0_unimplemented;
6896         default:
6897             goto cp0_unimplemented;
6898         }
6899         break;
6900     case 24:
6901         switch (sel) {
6902         case 0:
6903             /* EJTAG support */
6904             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
6905             tcg_gen_ext32s_tl(arg, arg);
6906             rn = "DEPC";
6907             break;
6908         default:
6909             goto cp0_unimplemented;
6910         }
6911         break;
6912     case 25:
6913         switch (sel) {
6914         case 0:
6915             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
6916             rn = "Performance0";
6917             break;
6918         case 1:
6919 //            gen_helper_mfc0_performance1(arg);
6920             rn = "Performance1";
6921             goto cp0_unimplemented;
6922         case 2:
6923 //            gen_helper_mfc0_performance2(arg);
6924             rn = "Performance2";
6925             goto cp0_unimplemented;
6926         case 3:
6927 //            gen_helper_mfc0_performance3(arg);
6928             rn = "Performance3";
6929             goto cp0_unimplemented;
6930         case 4:
6931 //            gen_helper_mfc0_performance4(arg);
6932             rn = "Performance4";
6933             goto cp0_unimplemented;
6934         case 5:
6935 //            gen_helper_mfc0_performance5(arg);
6936             rn = "Performance5";
6937             goto cp0_unimplemented;
6938         case 6:
6939 //            gen_helper_mfc0_performance6(arg);
6940             rn = "Performance6";
6941             goto cp0_unimplemented;
6942         case 7:
6943 //            gen_helper_mfc0_performance7(arg);
6944             rn = "Performance7";
6945             goto cp0_unimplemented;
6946         default:
6947             goto cp0_unimplemented;
6948         }
6949         break;
6950     case 26:
6951         switch (sel) {
6952         case 0:
6953             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_ErrCtl));
6954             rn = "ErrCtl";
6955             break;
6956         default:
6957             goto cp0_unimplemented;
6958         }
6959         break;
6960     case 27:
6961         switch (sel) {
6962         case 0:
6963         case 1:
6964         case 2:
6965         case 3:
6966             tcg_gen_movi_tl(arg, 0); /* unimplemented */
6967             rn = "CacheErr";
6968             break;
6969         default:
6970             goto cp0_unimplemented;
6971         }
6972         break;
6973     case 28:
6974         switch (sel) {
6975         case 0:
6976         case 2:
6977         case 4:
6978         case 6:
6979             {
6980                 TCGv_i64 tmp = tcg_temp_new_i64();
6981                 tcg_gen_ld_i64(tmp, cpu_env, offsetof(CPUMIPSState, CP0_TagLo));
6982                 gen_move_low32(arg, tmp);
6983                 tcg_temp_free_i64(tmp);
6984             }
6985             rn = "TagLo";
6986             break;
6987         case 1:
6988         case 3:
6989         case 5:
6990         case 7:
6991             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
6992             rn = "DataLo";
6993             break;
6994         default:
6995             goto cp0_unimplemented;
6996         }
6997         break;
6998     case 29:
6999         switch (sel) {
7000         case 0:
7001         case 2:
7002         case 4:
7003         case 6:
7004             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
7005             rn = "TagHi";
7006             break;
7007         case 1:
7008         case 3:
7009         case 5:
7010         case 7:
7011             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
7012             rn = "DataHi";
7013             break;
7014         default:
7015             goto cp0_unimplemented;
7016         }
7017         break;
7018     case 30:
7019         switch (sel) {
7020         case 0:
7021             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
7022             tcg_gen_ext32s_tl(arg, arg);
7023             rn = "ErrorEPC";
7024             break;
7025         default:
7026             goto cp0_unimplemented;
7027         }
7028         break;
7029     case 31:
7030         switch (sel) {
7031         case 0:
7032             /* EJTAG support */
7033             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
7034             rn = "DESAVE";
7035             break;
7036         case 2:
7037         case 3:
7038         case 4:
7039         case 5:
7040         case 6:
7041         case 7:
7042             CP0_CHECK(ctx->kscrexist & (1 << sel));
7043             tcg_gen_ld_tl(arg, cpu_env,
7044                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
7045             tcg_gen_ext32s_tl(arg, arg);
7046             rn = "KScratch";
7047             break;
7048         default:
7049             goto cp0_unimplemented;
7050         }
7051         break;
7052     default:
7053        goto cp0_unimplemented;
7054     }
7055     trace_mips_translate_c0("mfc0", rn, reg, sel);
7056     return;
7057
7058 cp0_unimplemented:
7059     qemu_log_mask(LOG_UNIMP, "mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
7060     gen_mfc0_unimplemented(ctx, arg);
7061 }
7062
7063 static void gen_mtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
7064 {
7065     const char *rn = "invalid";
7066
7067     if (sel != 0)
7068         check_insn(ctx, ISA_MIPS32);
7069
7070     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
7071         gen_io_start();
7072     }
7073
7074     switch (reg) {
7075     case 0:
7076         switch (sel) {
7077         case 0:
7078             gen_helper_mtc0_index(cpu_env, arg);
7079             rn = "Index";
7080             break;
7081         case 1:
7082             CP0_CHECK(ctx->insn_flags & ASE_MT);
7083             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
7084             rn = "MVPControl";
7085             break;
7086         case 2:
7087             CP0_CHECK(ctx->insn_flags & ASE_MT);
7088             /* ignored */
7089             rn = "MVPConf0";
7090             break;
7091         case 3:
7092             CP0_CHECK(ctx->insn_flags & ASE_MT);
7093             /* ignored */
7094             rn = "MVPConf1";
7095             break;
7096         case 4:
7097             CP0_CHECK(ctx->vp);
7098             /* ignored */
7099             rn = "VPControl";
7100             break;
7101         default:
7102             goto cp0_unimplemented;
7103         }
7104         break;
7105     case 1:
7106         switch (sel) {
7107         case 0:
7108             /* ignored */
7109             rn = "Random";
7110             break;
7111         case 1:
7112             CP0_CHECK(ctx->insn_flags & ASE_MT);
7113             gen_helper_mtc0_vpecontrol(cpu_env, arg);
7114             rn = "VPEControl";
7115             break;
7116         case 2:
7117             CP0_CHECK(ctx->insn_flags & ASE_MT);
7118             gen_helper_mtc0_vpeconf0(cpu_env, arg);
7119             rn = "VPEConf0";
7120             break;
7121         case 3:
7122             CP0_CHECK(ctx->insn_flags & ASE_MT);
7123             gen_helper_mtc0_vpeconf1(cpu_env, arg);
7124             rn = "VPEConf1";
7125             break;
7126         case 4:
7127             CP0_CHECK(ctx->insn_flags & ASE_MT);
7128             gen_helper_mtc0_yqmask(cpu_env, arg);
7129             rn = "YQMask";
7130             break;
7131         case 5:
7132             CP0_CHECK(ctx->insn_flags & ASE_MT);
7133             tcg_gen_st_tl(arg, cpu_env,
7134                           offsetof(CPUMIPSState, CP0_VPESchedule));
7135             rn = "VPESchedule";
7136             break;
7137         case 6:
7138             CP0_CHECK(ctx->insn_flags & ASE_MT);
7139             tcg_gen_st_tl(arg, cpu_env,
7140                           offsetof(CPUMIPSState, CP0_VPEScheFBack));
7141             rn = "VPEScheFBack";
7142             break;
7143         case 7:
7144             CP0_CHECK(ctx->insn_flags & ASE_MT);
7145             gen_helper_mtc0_vpeopt(cpu_env, arg);
7146             rn = "VPEOpt";
7147             break;
7148         default:
7149             goto cp0_unimplemented;
7150         }
7151         break;
7152     case 2:
7153         switch (sel) {
7154         case 0:
7155             gen_helper_mtc0_entrylo0(cpu_env, arg);
7156             rn = "EntryLo0";
7157             break;
7158         case 1:
7159             CP0_CHECK(ctx->insn_flags & ASE_MT);
7160             gen_helper_mtc0_tcstatus(cpu_env, arg);
7161             rn = "TCStatus";
7162             break;
7163         case 2:
7164             CP0_CHECK(ctx->insn_flags & ASE_MT);
7165             gen_helper_mtc0_tcbind(cpu_env, arg);
7166             rn = "TCBind";
7167             break;
7168         case 3:
7169             CP0_CHECK(ctx->insn_flags & ASE_MT);
7170             gen_helper_mtc0_tcrestart(cpu_env, arg);
7171             rn = "TCRestart";
7172             break;
7173         case 4:
7174             CP0_CHECK(ctx->insn_flags & ASE_MT);
7175             gen_helper_mtc0_tchalt(cpu_env, arg);
7176             rn = "TCHalt";
7177             break;
7178         case 5:
7179             CP0_CHECK(ctx->insn_flags & ASE_MT);
7180             gen_helper_mtc0_tccontext(cpu_env, arg);
7181             rn = "TCContext";
7182             break;
7183         case 6:
7184             CP0_CHECK(ctx->insn_flags & ASE_MT);
7185             gen_helper_mtc0_tcschedule(cpu_env, arg);
7186             rn = "TCSchedule";
7187             break;
7188         case 7:
7189             CP0_CHECK(ctx->insn_flags & ASE_MT);
7190             gen_helper_mtc0_tcschefback(cpu_env, arg);
7191             rn = "TCScheFBack";
7192             break;
7193         default:
7194             goto cp0_unimplemented;
7195         }
7196         break;
7197     case 3:
7198         switch (sel) {
7199         case 0:
7200             gen_helper_mtc0_entrylo1(cpu_env, arg);
7201             rn = "EntryLo1";
7202             break;
7203         case 1:
7204             CP0_CHECK(ctx->vp);
7205             /* ignored */
7206             rn = "GlobalNumber";
7207             break;
7208         default:
7209             goto cp0_unimplemented;
7210         }
7211         break;
7212     case 4:
7213         switch (sel) {
7214         case 0:
7215             gen_helper_mtc0_context(cpu_env, arg);
7216             rn = "Context";
7217             break;
7218         case 1:
7219 //            gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
7220             rn = "ContextConfig";
7221             goto cp0_unimplemented;
7222         case 2:
7223             CP0_CHECK(ctx->ulri);
7224             tcg_gen_st_tl(arg, cpu_env,
7225                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
7226             rn = "UserLocal";
7227             break;
7228         default:
7229             goto cp0_unimplemented;
7230         }
7231         break;
7232     case 5:
7233         switch (sel) {
7234         case 0:
7235             gen_helper_mtc0_pagemask(cpu_env, arg);
7236             rn = "PageMask";
7237             break;
7238         case 1:
7239             check_insn(ctx, ISA_MIPS32R2);
7240             gen_helper_mtc0_pagegrain(cpu_env, arg);
7241             rn = "PageGrain";
7242             ctx->base.is_jmp = DISAS_STOP;
7243             break;
7244         case 2:
7245             CP0_CHECK(ctx->sc);
7246             gen_helper_mtc0_segctl0(cpu_env, arg);
7247             rn = "SegCtl0";
7248             break;
7249         case 3:
7250             CP0_CHECK(ctx->sc);
7251             gen_helper_mtc0_segctl1(cpu_env, arg);
7252             rn = "SegCtl1";
7253             break;
7254         case 4:
7255             CP0_CHECK(ctx->sc);
7256             gen_helper_mtc0_segctl2(cpu_env, arg);
7257             rn = "SegCtl2";
7258             break;
7259         case 5:
7260             check_pw(ctx);
7261             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_PWBase));
7262             rn = "PWBase";
7263             break;
7264         case 6:
7265             check_pw(ctx);
7266             gen_helper_mtc0_pwfield(cpu_env, arg);
7267             rn = "PWField";
7268             break;
7269         case 7:
7270             check_pw(ctx);
7271             gen_helper_mtc0_pwsize(cpu_env, arg);
7272             rn = "PWSize";
7273             break;
7274         default:
7275             goto cp0_unimplemented;
7276         }
7277         break;
7278     case 6:
7279         switch (sel) {
7280         case 0:
7281             gen_helper_mtc0_wired(cpu_env, arg);
7282             rn = "Wired";
7283             break;
7284         case 1:
7285             check_insn(ctx, ISA_MIPS32R2);
7286             gen_helper_mtc0_srsconf0(cpu_env, arg);
7287             rn = "SRSConf0";
7288             break;
7289         case 2:
7290             check_insn(ctx, ISA_MIPS32R2);
7291             gen_helper_mtc0_srsconf1(cpu_env, arg);
7292             rn = "SRSConf1";
7293             break;
7294         case 3:
7295             check_insn(ctx, ISA_MIPS32R2);
7296             gen_helper_mtc0_srsconf2(cpu_env, arg);
7297             rn = "SRSConf2";
7298             break;
7299         case 4:
7300             check_insn(ctx, ISA_MIPS32R2);
7301             gen_helper_mtc0_srsconf3(cpu_env, arg);
7302             rn = "SRSConf3";
7303             break;
7304         case 5:
7305             check_insn(ctx, ISA_MIPS32R2);
7306             gen_helper_mtc0_srsconf4(cpu_env, arg);
7307             rn = "SRSConf4";
7308             break;
7309         case 6:
7310             check_pw(ctx);
7311             gen_helper_mtc0_pwctl(cpu_env, arg);
7312             rn = "PWCtl";
7313             break;
7314         default:
7315             goto cp0_unimplemented;
7316         }
7317         break;
7318     case 7:
7319         switch (sel) {
7320         case 0:
7321             check_insn(ctx, ISA_MIPS32R2);
7322             gen_helper_mtc0_hwrena(cpu_env, arg);
7323             ctx->base.is_jmp = DISAS_STOP;
7324             rn = "HWREna";
7325             break;
7326         default:
7327             goto cp0_unimplemented;
7328         }
7329         break;
7330     case 8:
7331         switch (sel) {
7332         case 0:
7333             /* ignored */
7334             rn = "BadVAddr";
7335             break;
7336         case 1:
7337             /* ignored */
7338             rn = "BadInstr";
7339             break;
7340         case 2:
7341             /* ignored */
7342             rn = "BadInstrP";
7343             break;
7344         case 3:
7345             /* ignored */
7346             rn = "BadInstrX";
7347             break;
7348         default:
7349             goto cp0_unimplemented;
7350         }
7351         break;
7352     case 9:
7353         switch (sel) {
7354         case 0:
7355             gen_helper_mtc0_count(cpu_env, arg);
7356             rn = "Count";
7357             break;
7358         /* 6,7 are implementation dependent */
7359         default:
7360             goto cp0_unimplemented;
7361         }
7362         break;
7363     case 10:
7364         switch (sel) {
7365         case 0:
7366             gen_helper_mtc0_entryhi(cpu_env, arg);
7367             rn = "EntryHi";
7368             break;
7369         default:
7370             goto cp0_unimplemented;
7371         }
7372         break;
7373     case 11:
7374         switch (sel) {
7375         case 0:
7376             gen_helper_mtc0_compare(cpu_env, arg);
7377             rn = "Compare";
7378             break;
7379         /* 6,7 are implementation dependent */
7380         default:
7381             goto cp0_unimplemented;
7382         }
7383         break;
7384     case 12:
7385         switch (sel) {
7386         case 0:
7387             save_cpu_state(ctx, 1);
7388             gen_helper_mtc0_status(cpu_env, arg);
7389             /* DISAS_STOP isn't good enough here, hflags may have changed. */
7390             gen_save_pc(ctx->base.pc_next + 4);
7391             ctx->base.is_jmp = DISAS_EXIT;
7392             rn = "Status";
7393             break;
7394         case 1:
7395             check_insn(ctx, ISA_MIPS32R2);
7396             gen_helper_mtc0_intctl(cpu_env, arg);
7397             /* Stop translation as we may have switched the execution mode */
7398             ctx->base.is_jmp = DISAS_STOP;
7399             rn = "IntCtl";
7400             break;
7401         case 2:
7402             check_insn(ctx, ISA_MIPS32R2);
7403             gen_helper_mtc0_srsctl(cpu_env, arg);
7404             /* Stop translation as we may have switched the execution mode */
7405             ctx->base.is_jmp = DISAS_STOP;
7406             rn = "SRSCtl";
7407             break;
7408         case 3:
7409             check_insn(ctx, ISA_MIPS32R2);
7410             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
7411             /* Stop translation as we may have switched the execution mode */
7412             ctx->base.is_jmp = DISAS_STOP;
7413             rn = "SRSMap";
7414             break;
7415         default:
7416             goto cp0_unimplemented;
7417         }
7418         break;
7419     case 13:
7420         switch (sel) {
7421         case 0:
7422             save_cpu_state(ctx, 1);
7423             gen_helper_mtc0_cause(cpu_env, arg);
7424             /* Stop translation as we may have triggered an interrupt.
7425              * DISAS_STOP isn't sufficient, we need to ensure we break out of
7426              * translated code to check for pending interrupts.  */
7427             gen_save_pc(ctx->base.pc_next + 4);
7428             ctx->base.is_jmp = DISAS_EXIT;
7429             rn = "Cause";
7430             break;
7431         default:
7432             goto cp0_unimplemented;
7433         }
7434         break;
7435     case 14:
7436         switch (sel) {
7437         case 0:
7438             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
7439             rn = "EPC";
7440             break;
7441         default:
7442             goto cp0_unimplemented;
7443         }
7444         break;
7445     case 15:
7446         switch (sel) {
7447         case 0:
7448             /* ignored */
7449             rn = "PRid";
7450             break;
7451         case 1:
7452             check_insn(ctx, ISA_MIPS32R2);
7453             gen_helper_mtc0_ebase(cpu_env, arg);
7454             rn = "EBase";
7455             break;
7456         default:
7457             goto cp0_unimplemented;
7458         }
7459         break;
7460     case 16:
7461         switch (sel) {
7462         case 0:
7463             gen_helper_mtc0_config0(cpu_env, arg);
7464             rn = "Config";
7465             /* Stop translation as we may have switched the execution mode */
7466             ctx->base.is_jmp = DISAS_STOP;
7467             break;
7468         case 1:
7469             /* ignored, read only */
7470             rn = "Config1";
7471             break;
7472         case 2:
7473             gen_helper_mtc0_config2(cpu_env, arg);
7474             rn = "Config2";
7475             /* Stop translation as we may have switched the execution mode */
7476             ctx->base.is_jmp = DISAS_STOP;
7477             break;
7478         case 3:
7479             gen_helper_mtc0_config3(cpu_env, arg);
7480             rn = "Config3";
7481             /* Stop translation as we may have switched the execution mode */
7482             ctx->base.is_jmp = DISAS_STOP;
7483             break;
7484         case 4:
7485             gen_helper_mtc0_config4(cpu_env, arg);
7486             rn = "Config4";
7487             ctx->base.is_jmp = DISAS_STOP;
7488             break;
7489         case 5:
7490             gen_helper_mtc0_config5(cpu_env, arg);
7491             rn = "Config5";
7492             /* Stop translation as we may have switched the execution mode */
7493             ctx->base.is_jmp = DISAS_STOP;
7494             break;
7495         /* 6,7 are implementation dependent */
7496         case 6:
7497             /* ignored */
7498             rn = "Config6";
7499             break;
7500         case 7:
7501             /* ignored */
7502             rn = "Config7";
7503             break;
7504         default:
7505             rn = "Invalid config selector";
7506             goto cp0_unimplemented;
7507         }
7508         break;
7509     case 17:
7510         switch (sel) {
7511         case 0:
7512             gen_helper_mtc0_lladdr(cpu_env, arg);
7513             rn = "LLAddr";
7514             break;
7515         case 1:
7516             CP0_CHECK(ctx->mrp);
7517             gen_helper_mtc0_maar(cpu_env, arg);
7518             rn = "MAAR";
7519             break;
7520         case 2:
7521             CP0_CHECK(ctx->mrp);
7522             gen_helper_mtc0_maari(cpu_env, arg);
7523             rn = "MAARI";
7524             break;
7525         default:
7526             goto cp0_unimplemented;
7527         }
7528         break;
7529     case 18:
7530         switch (sel) {
7531         case 0:
7532         case 1:
7533         case 2:
7534         case 3:
7535         case 4:
7536         case 5:
7537         case 6:
7538         case 7:
7539             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7540             gen_helper_0e1i(mtc0_watchlo, arg, sel);
7541             rn = "WatchLo";
7542             break;
7543         default:
7544             goto cp0_unimplemented;
7545         }
7546         break;
7547     case 19:
7548         switch (sel) {
7549         case 0:
7550         case 1:
7551         case 2:
7552         case 3:
7553         case 4:
7554         case 5:
7555         case 6:
7556         case 7:
7557             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7558             gen_helper_0e1i(mtc0_watchhi, arg, sel);
7559             rn = "WatchHi";
7560             break;
7561         default:
7562             goto cp0_unimplemented;
7563         }
7564         break;
7565     case 20:
7566         switch (sel) {
7567         case 0:
7568 #if defined(TARGET_MIPS64)
7569             check_insn(ctx, ISA_MIPS3);
7570             gen_helper_mtc0_xcontext(cpu_env, arg);
7571             rn = "XContext";
7572             break;
7573 #endif
7574         default:
7575             goto cp0_unimplemented;
7576         }
7577         break;
7578     case 21:
7579        /* Officially reserved, but sel 0 is used for R1x000 framemask */
7580         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
7581         switch (sel) {
7582         case 0:
7583             gen_helper_mtc0_framemask(cpu_env, arg);
7584             rn = "Framemask";
7585             break;
7586         default:
7587             goto cp0_unimplemented;
7588         }
7589         break;
7590     case 22:
7591         /* ignored */
7592         rn = "Diagnostic"; /* implementation dependent */
7593         break;
7594     case 23:
7595         switch (sel) {
7596         case 0:
7597             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
7598             /* DISAS_STOP isn't good enough here, hflags may have changed. */
7599             gen_save_pc(ctx->base.pc_next + 4);
7600             ctx->base.is_jmp = DISAS_EXIT;
7601             rn = "Debug";
7602             break;
7603         case 1:
7604 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
7605             rn = "TraceControl";
7606             /* Stop translation as we may have switched the execution mode */
7607             ctx->base.is_jmp = DISAS_STOP;
7608             goto cp0_unimplemented;
7609         case 2:
7610 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
7611             rn = "TraceControl2";
7612             /* Stop translation as we may have switched the execution mode */
7613             ctx->base.is_jmp = DISAS_STOP;
7614             goto cp0_unimplemented;
7615         case 3:
7616             /* Stop translation as we may have switched the execution mode */
7617             ctx->base.is_jmp = DISAS_STOP;
7618 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
7619             rn = "UserTraceData";
7620             /* Stop translation as we may have switched the execution mode */
7621             ctx->base.is_jmp = DISAS_STOP;
7622             goto cp0_unimplemented;
7623         case 4:
7624 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
7625             /* Stop translation as we may have switched the execution mode */
7626             ctx->base.is_jmp = DISAS_STOP;
7627             rn = "TraceBPC";
7628             goto cp0_unimplemented;
7629         default:
7630             goto cp0_unimplemented;
7631         }
7632         break;
7633     case 24:
7634         switch (sel) {
7635         case 0:
7636             /* EJTAG support */
7637             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
7638             rn = "DEPC";
7639             break;
7640         default:
7641             goto cp0_unimplemented;
7642         }
7643         break;
7644     case 25:
7645         switch (sel) {
7646         case 0:
7647             gen_helper_mtc0_performance0(cpu_env, arg);
7648             rn = "Performance0";
7649             break;
7650         case 1:
7651 //            gen_helper_mtc0_performance1(arg);
7652             rn = "Performance1";
7653             goto cp0_unimplemented;
7654         case 2:
7655 //            gen_helper_mtc0_performance2(arg);
7656             rn = "Performance2";
7657             goto cp0_unimplemented;
7658         case 3:
7659 //            gen_helper_mtc0_performance3(arg);
7660             rn = "Performance3";
7661             goto cp0_unimplemented;
7662         case 4:
7663 //            gen_helper_mtc0_performance4(arg);
7664             rn = "Performance4";
7665             goto cp0_unimplemented;
7666         case 5:
7667 //            gen_helper_mtc0_performance5(arg);
7668             rn = "Performance5";
7669             goto cp0_unimplemented;
7670         case 6:
7671 //            gen_helper_mtc0_performance6(arg);
7672             rn = "Performance6";
7673             goto cp0_unimplemented;
7674         case 7:
7675 //            gen_helper_mtc0_performance7(arg);
7676             rn = "Performance7";
7677             goto cp0_unimplemented;
7678         default:
7679             goto cp0_unimplemented;
7680         }
7681        break;
7682     case 26:
7683         switch (sel) {
7684         case 0:
7685             gen_helper_mtc0_errctl(cpu_env, arg);
7686             ctx->base.is_jmp = DISAS_STOP;
7687             rn = "ErrCtl";
7688             break;
7689         default:
7690             goto cp0_unimplemented;
7691         }
7692         break;
7693     case 27:
7694         switch (sel) {
7695         case 0:
7696         case 1:
7697         case 2:
7698         case 3:
7699             /* ignored */
7700             rn = "CacheErr";
7701             break;
7702         default:
7703             goto cp0_unimplemented;
7704         }
7705        break;
7706     case 28:
7707         switch (sel) {
7708         case 0:
7709         case 2:
7710         case 4:
7711         case 6:
7712             gen_helper_mtc0_taglo(cpu_env, arg);
7713             rn = "TagLo";
7714             break;
7715         case 1:
7716         case 3:
7717         case 5:
7718         case 7:
7719             gen_helper_mtc0_datalo(cpu_env, arg);
7720             rn = "DataLo";
7721             break;
7722         default:
7723             goto cp0_unimplemented;
7724         }
7725         break;
7726     case 29:
7727         switch (sel) {
7728         case 0:
7729         case 2:
7730         case 4:
7731         case 6:
7732             gen_helper_mtc0_taghi(cpu_env, arg);
7733             rn = "TagHi";
7734             break;
7735         case 1:
7736         case 3:
7737         case 5:
7738         case 7:
7739             gen_helper_mtc0_datahi(cpu_env, arg);
7740             rn = "DataHi";
7741             break;
7742         default:
7743             rn = "invalid sel";
7744             goto cp0_unimplemented;
7745         }
7746        break;
7747     case 30:
7748         switch (sel) {
7749         case 0:
7750             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
7751             rn = "ErrorEPC";
7752             break;
7753         default:
7754             goto cp0_unimplemented;
7755         }
7756         break;
7757     case 31:
7758         switch (sel) {
7759         case 0:
7760             /* EJTAG support */
7761             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
7762             rn = "DESAVE";
7763             break;
7764         case 2:
7765         case 3:
7766         case 4:
7767         case 5:
7768         case 6:
7769         case 7:
7770             CP0_CHECK(ctx->kscrexist & (1 << sel));
7771             tcg_gen_st_tl(arg, cpu_env,
7772                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
7773             rn = "KScratch";
7774             break;
7775         default:
7776             goto cp0_unimplemented;
7777         }
7778         break;
7779     default:
7780        goto cp0_unimplemented;
7781     }
7782     trace_mips_translate_c0("mtc0", rn, reg, sel);
7783
7784     /* For simplicity assume that all writes can cause interrupts.  */
7785     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
7786         gen_io_end();
7787         /* DISAS_STOP isn't sufficient, we need to ensure we break out of
7788          * translated code to check for pending interrupts.  */
7789         gen_save_pc(ctx->base.pc_next + 4);
7790         ctx->base.is_jmp = DISAS_EXIT;
7791     }
7792     return;
7793
7794 cp0_unimplemented:
7795     qemu_log_mask(LOG_UNIMP, "mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
7796 }
7797
7798 #if defined(TARGET_MIPS64)
7799 static void gen_dmfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
7800 {
7801     const char *rn = "invalid";
7802
7803     if (sel != 0)
7804         check_insn(ctx, ISA_MIPS64);
7805
7806     switch (reg) {
7807     case 0:
7808         switch (sel) {
7809         case 0:
7810             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
7811             rn = "Index";
7812             break;
7813         case 1:
7814             CP0_CHECK(ctx->insn_flags & ASE_MT);
7815             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
7816             rn = "MVPControl";
7817             break;
7818         case 2:
7819             CP0_CHECK(ctx->insn_flags & ASE_MT);
7820             gen_helper_mfc0_mvpconf0(arg, cpu_env);
7821             rn = "MVPConf0";
7822             break;
7823         case 3:
7824             CP0_CHECK(ctx->insn_flags & ASE_MT);
7825             gen_helper_mfc0_mvpconf1(arg, cpu_env);
7826             rn = "MVPConf1";
7827             break;
7828         case 4:
7829             CP0_CHECK(ctx->vp);
7830             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPControl));
7831             rn = "VPControl";
7832             break;
7833         default:
7834             goto cp0_unimplemented;
7835         }
7836         break;
7837     case 1:
7838         switch (sel) {
7839         case 0:
7840             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
7841             gen_helper_mfc0_random(arg, cpu_env);
7842             rn = "Random";
7843             break;
7844         case 1:
7845             CP0_CHECK(ctx->insn_flags & ASE_MT);
7846             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
7847             rn = "VPEControl";
7848             break;
7849         case 2:
7850             CP0_CHECK(ctx->insn_flags & ASE_MT);
7851             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
7852             rn = "VPEConf0";
7853             break;
7854         case 3:
7855             CP0_CHECK(ctx->insn_flags & ASE_MT);
7856             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
7857             rn = "VPEConf1";
7858             break;
7859         case 4:
7860             CP0_CHECK(ctx->insn_flags & ASE_MT);
7861             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_YQMask));
7862             rn = "YQMask";
7863             break;
7864         case 5:
7865             CP0_CHECK(ctx->insn_flags & ASE_MT);
7866             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
7867             rn = "VPESchedule";
7868             break;
7869         case 6:
7870             CP0_CHECK(ctx->insn_flags & ASE_MT);
7871             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
7872             rn = "VPEScheFBack";
7873             break;
7874         case 7:
7875             CP0_CHECK(ctx->insn_flags & ASE_MT);
7876             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
7877             rn = "VPEOpt";
7878             break;
7879         default:
7880             goto cp0_unimplemented;
7881         }
7882         break;
7883     case 2:
7884         switch (sel) {
7885         case 0:
7886             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0));
7887             rn = "EntryLo0";
7888             break;
7889         case 1:
7890             CP0_CHECK(ctx->insn_flags & ASE_MT);
7891             gen_helper_mfc0_tcstatus(arg, cpu_env);
7892             rn = "TCStatus";
7893             break;
7894         case 2:
7895             CP0_CHECK(ctx->insn_flags & ASE_MT);
7896             gen_helper_mfc0_tcbind(arg, cpu_env);
7897             rn = "TCBind";
7898             break;
7899         case 3:
7900             CP0_CHECK(ctx->insn_flags & ASE_MT);
7901             gen_helper_dmfc0_tcrestart(arg, cpu_env);
7902             rn = "TCRestart";
7903             break;
7904         case 4:
7905             CP0_CHECK(ctx->insn_flags & ASE_MT);
7906             gen_helper_dmfc0_tchalt(arg, cpu_env);
7907             rn = "TCHalt";
7908             break;
7909         case 5:
7910             CP0_CHECK(ctx->insn_flags & ASE_MT);
7911             gen_helper_dmfc0_tccontext(arg, cpu_env);
7912             rn = "TCContext";
7913             break;
7914         case 6:
7915             CP0_CHECK(ctx->insn_flags & ASE_MT);
7916             gen_helper_dmfc0_tcschedule(arg, cpu_env);
7917             rn = "TCSchedule";
7918             break;
7919         case 7:
7920             CP0_CHECK(ctx->insn_flags & ASE_MT);
7921             gen_helper_dmfc0_tcschefback(arg, cpu_env);
7922             rn = "TCScheFBack";
7923             break;
7924         default:
7925             goto cp0_unimplemented;
7926         }
7927         break;
7928     case 3:
7929         switch (sel) {
7930         case 0:
7931             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
7932             rn = "EntryLo1";
7933             break;
7934         case 1:
7935             CP0_CHECK(ctx->vp);
7936             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_GlobalNumber));
7937             rn = "GlobalNumber";
7938             break;
7939         default:
7940             goto cp0_unimplemented;
7941         }
7942         break;
7943     case 4:
7944         switch (sel) {
7945         case 0:
7946             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
7947             rn = "Context";
7948             break;
7949         case 1:
7950 //            gen_helper_dmfc0_contextconfig(arg); /* SmartMIPS ASE */
7951             rn = "ContextConfig";
7952             goto cp0_unimplemented;
7953         case 2:
7954             CP0_CHECK(ctx->ulri);
7955             tcg_gen_ld_tl(arg, cpu_env,
7956                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
7957             rn = "UserLocal";
7958             break;
7959         default:
7960             goto cp0_unimplemented;
7961         }
7962         break;
7963     case 5:
7964         switch (sel) {
7965         case 0:
7966             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
7967             rn = "PageMask";
7968             break;
7969         case 1:
7970             check_insn(ctx, ISA_MIPS32R2);
7971             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
7972             rn = "PageGrain";
7973             break;
7974         case 2:
7975             CP0_CHECK(ctx->sc);
7976             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl0));
7977             rn = "SegCtl0";
7978             break;
7979         case 3:
7980             CP0_CHECK(ctx->sc);
7981             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl1));
7982             rn = "SegCtl1";
7983             break;
7984         case 4:
7985             CP0_CHECK(ctx->sc);
7986             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl2));
7987             rn = "SegCtl2";
7988             break;
7989         case 5:
7990             check_pw(ctx);
7991             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWBase));
7992             rn = "PWBase";
7993             break;
7994         case 6:
7995             check_pw(ctx);
7996             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWField));
7997             rn = "PWField";
7998             break;
7999         case 7:
8000             check_pw(ctx);
8001             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWSize));
8002             rn = "PWSize";
8003             break;
8004         default:
8005             goto cp0_unimplemented;
8006         }
8007         break;
8008     case 6:
8009         switch (sel) {
8010         case 0:
8011             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
8012             rn = "Wired";
8013             break;
8014         case 1:
8015             check_insn(ctx, ISA_MIPS32R2);
8016             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
8017             rn = "SRSConf0";
8018             break;
8019         case 2:
8020             check_insn(ctx, ISA_MIPS32R2);
8021             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
8022             rn = "SRSConf1";
8023             break;
8024         case 3:
8025             check_insn(ctx, ISA_MIPS32R2);
8026             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
8027             rn = "SRSConf2";
8028             break;
8029         case 4:
8030             check_insn(ctx, ISA_MIPS32R2);
8031             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
8032             rn = "SRSConf3";
8033             break;
8034         case 5:
8035             check_insn(ctx, ISA_MIPS32R2);
8036             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
8037             rn = "SRSConf4";
8038             break;
8039         case 6:
8040             check_pw(ctx);
8041             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWCtl));
8042             rn = "PWCtl";
8043             break;
8044         default:
8045             goto cp0_unimplemented;
8046         }
8047         break;
8048     case 7:
8049         switch (sel) {
8050         case 0:
8051             check_insn(ctx, ISA_MIPS32R2);
8052             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
8053             rn = "HWREna";
8054             break;
8055         default:
8056             goto cp0_unimplemented;
8057         }
8058         break;
8059     case 8:
8060         switch (sel) {
8061         case 0:
8062             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
8063             rn = "BadVAddr";
8064             break;
8065         case 1:
8066             CP0_CHECK(ctx->bi);
8067             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
8068             rn = "BadInstr";
8069             break;
8070         case 2:
8071             CP0_CHECK(ctx->bp);
8072             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
8073             rn = "BadInstrP";
8074             break;
8075         case 3:
8076             CP0_CHECK(ctx->bi);
8077             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrX));
8078             tcg_gen_andi_tl(arg, arg, ~0xffff);
8079             rn = "BadInstrX";
8080             break;
8081         default:
8082             goto cp0_unimplemented;
8083         }
8084         break;
8085     case 9:
8086         switch (sel) {
8087         case 0:
8088             /* Mark as an IO operation because we read the time.  */
8089             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
8090                 gen_io_start();
8091             }
8092             gen_helper_mfc0_count(arg, cpu_env);
8093             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
8094                 gen_io_end();
8095             }
8096             /* Break the TB to be able to take timer interrupts immediately
8097                after reading count. DISAS_STOP isn't sufficient, we need to
8098                ensure we break completely out of translated code.  */
8099             gen_save_pc(ctx->base.pc_next + 4);
8100             ctx->base.is_jmp = DISAS_EXIT;
8101             rn = "Count";
8102             break;
8103         /* 6,7 are implementation dependent */
8104         default:
8105             goto cp0_unimplemented;
8106         }
8107         break;
8108     case 10:
8109         switch (sel) {
8110         case 0:
8111             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
8112             rn = "EntryHi";
8113             break;
8114         default:
8115             goto cp0_unimplemented;
8116         }
8117         break;
8118     case 11:
8119         switch (sel) {
8120         case 0:
8121             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
8122             rn = "Compare";
8123             break;
8124         /* 6,7 are implementation dependent */
8125         default:
8126             goto cp0_unimplemented;
8127         }
8128         break;
8129     case 12:
8130         switch (sel) {
8131         case 0:
8132             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
8133             rn = "Status";
8134             break;
8135         case 1:
8136             check_insn(ctx, ISA_MIPS32R2);
8137             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
8138             rn = "IntCtl";
8139             break;
8140         case 2:
8141             check_insn(ctx, ISA_MIPS32R2);
8142             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
8143             rn = "SRSCtl";
8144             break;
8145         case 3:
8146             check_insn(ctx, ISA_MIPS32R2);
8147             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
8148             rn = "SRSMap";
8149             break;
8150         default:
8151             goto cp0_unimplemented;
8152         }
8153         break;
8154     case 13:
8155         switch (sel) {
8156         case 0:
8157             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
8158             rn = "Cause";
8159             break;
8160         default:
8161             goto cp0_unimplemented;
8162         }
8163         break;
8164     case 14:
8165         switch (sel) {
8166         case 0:
8167             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
8168             rn = "EPC";
8169             break;
8170         default:
8171             goto cp0_unimplemented;
8172         }
8173         break;
8174     case 15:
8175         switch (sel) {
8176         case 0:
8177             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
8178             rn = "PRid";
8179             break;
8180         case 1:
8181             check_insn(ctx, ISA_MIPS32R2);
8182             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EBase));
8183             rn = "EBase";
8184             break;
8185         case 3:
8186             check_insn(ctx, ISA_MIPS32R2);
8187             CP0_CHECK(ctx->cmgcr);
8188             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_CMGCRBase));
8189             rn = "CMGCRBase";
8190             break;
8191         default:
8192             goto cp0_unimplemented;
8193         }
8194         break;
8195     case 16:
8196         switch (sel) {
8197         case 0:
8198             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
8199             rn = "Config";
8200             break;
8201         case 1:
8202             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
8203             rn = "Config1";
8204             break;
8205         case 2:
8206             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
8207             rn = "Config2";
8208             break;
8209         case 3:
8210             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
8211             rn = "Config3";
8212             break;
8213         case 4:
8214             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
8215             rn = "Config4";
8216             break;
8217         case 5:
8218             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
8219             rn = "Config5";
8220             break;
8221        /* 6,7 are implementation dependent */
8222         case 6:
8223             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
8224             rn = "Config6";
8225             break;
8226         case 7:
8227             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
8228             rn = "Config7";
8229             break;
8230         default:
8231             goto cp0_unimplemented;
8232         }
8233         break;
8234     case 17:
8235         switch (sel) {
8236         case 0:
8237             gen_helper_dmfc0_lladdr(arg, cpu_env);
8238             rn = "LLAddr";
8239             break;
8240         case 1:
8241             CP0_CHECK(ctx->mrp);
8242             gen_helper_dmfc0_maar(arg, cpu_env);
8243             rn = "MAAR";
8244             break;
8245         case 2:
8246             CP0_CHECK(ctx->mrp);
8247             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MAARI));
8248             rn = "MAARI";
8249             break;
8250         default:
8251             goto cp0_unimplemented;
8252         }
8253         break;
8254     case 18:
8255         switch (sel) {
8256         case 0:
8257         case 1:
8258         case 2:
8259         case 3:
8260         case 4:
8261         case 5:
8262         case 6:
8263         case 7:
8264             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
8265             gen_helper_1e0i(dmfc0_watchlo, arg, sel);
8266             rn = "WatchLo";
8267             break;
8268         default:
8269             goto cp0_unimplemented;
8270         }
8271         break;
8272     case 19:
8273         switch (sel) {
8274         case 0:
8275         case 1:
8276         case 2:
8277         case 3:
8278         case 4:
8279         case 5:
8280         case 6:
8281         case 7:
8282             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
8283             gen_helper_1e0i(mfc0_watchhi, arg, sel);
8284             rn = "WatchHi";
8285             break;
8286         default:
8287             goto cp0_unimplemented;
8288         }
8289         break;
8290     case 20:
8291         switch (sel) {
8292         case 0:
8293             check_insn(ctx, ISA_MIPS3);
8294             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
8295             rn = "XContext";
8296             break;
8297         default:
8298             goto cp0_unimplemented;
8299         }
8300         break;
8301     case 21:
8302        /* Officially reserved, but sel 0 is used for R1x000 framemask */
8303         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
8304         switch (sel) {
8305         case 0:
8306             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
8307             rn = "Framemask";
8308             break;
8309         default:
8310             goto cp0_unimplemented;
8311         }
8312         break;
8313     case 22:
8314         tcg_gen_movi_tl(arg, 0); /* unimplemented */
8315         rn = "'Diagnostic"; /* implementation dependent */
8316         break;
8317     case 23:
8318         switch (sel) {
8319         case 0:
8320             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
8321             rn = "Debug";
8322             break;
8323         case 1:
8324 //            gen_helper_dmfc0_tracecontrol(arg, cpu_env); /* PDtrace support */
8325             rn = "TraceControl";
8326             goto cp0_unimplemented;
8327         case 2:
8328 //            gen_helper_dmfc0_tracecontrol2(arg, cpu_env); /* PDtrace support */
8329             rn = "TraceControl2";
8330             goto cp0_unimplemented;
8331         case 3:
8332 //            gen_helper_dmfc0_usertracedata(arg, cpu_env); /* PDtrace support */
8333             rn = "UserTraceData";
8334             goto cp0_unimplemented;
8335         case 4:
8336 //            gen_helper_dmfc0_tracebpc(arg, cpu_env); /* PDtrace support */
8337             rn = "TraceBPC";
8338             goto cp0_unimplemented;
8339         default:
8340             goto cp0_unimplemented;
8341         }
8342         break;
8343     case 24:
8344         switch (sel) {
8345         case 0:
8346             /* EJTAG support */
8347             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
8348             rn = "DEPC";
8349             break;
8350         default:
8351             goto cp0_unimplemented;
8352         }
8353         break;
8354     case 25:
8355         switch (sel) {
8356         case 0:
8357             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
8358             rn = "Performance0";
8359             break;
8360         case 1:
8361 //            gen_helper_dmfc0_performance1(arg);
8362             rn = "Performance1";
8363             goto cp0_unimplemented;
8364         case 2:
8365 //            gen_helper_dmfc0_performance2(arg);
8366             rn = "Performance2";
8367             goto cp0_unimplemented;
8368         case 3:
8369 //            gen_helper_dmfc0_performance3(arg);
8370             rn = "Performance3";
8371             goto cp0_unimplemented;
8372         case 4:
8373 //            gen_helper_dmfc0_performance4(arg);
8374             rn = "Performance4";
8375             goto cp0_unimplemented;
8376         case 5:
8377 //            gen_helper_dmfc0_performance5(arg);
8378             rn = "Performance5";
8379             goto cp0_unimplemented;
8380         case 6:
8381 //            gen_helper_dmfc0_performance6(arg);
8382             rn = "Performance6";
8383             goto cp0_unimplemented;
8384         case 7:
8385 //            gen_helper_dmfc0_performance7(arg);
8386             rn = "Performance7";
8387             goto cp0_unimplemented;
8388         default:
8389             goto cp0_unimplemented;
8390         }
8391         break;
8392     case 26:
8393         switch (sel) {
8394         case 0:
8395             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_ErrCtl));
8396             rn = "ErrCtl";
8397             break;
8398         default:
8399             goto cp0_unimplemented;
8400         }
8401         break;
8402     case 27:
8403         switch (sel) {
8404         /* ignored */
8405         case 0:
8406         case 1:
8407         case 2:
8408         case 3:
8409             tcg_gen_movi_tl(arg, 0); /* unimplemented */
8410             rn = "CacheErr";
8411             break;
8412         default:
8413             goto cp0_unimplemented;
8414         }
8415         break;
8416     case 28:
8417         switch (sel) {
8418         case 0:
8419         case 2:
8420         case 4:
8421         case 6:
8422             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
8423             rn = "TagLo";
8424             break;
8425         case 1:
8426         case 3:
8427         case 5:
8428         case 7:
8429             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
8430             rn = "DataLo";
8431             break;
8432         default:
8433             goto cp0_unimplemented;
8434         }
8435         break;
8436     case 29:
8437         switch (sel) {
8438         case 0:
8439         case 2:
8440         case 4:
8441         case 6:
8442             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
8443             rn = "TagHi";
8444             break;
8445         case 1:
8446         case 3:
8447         case 5:
8448         case 7:
8449             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
8450             rn = "DataHi";
8451             break;
8452         default:
8453             goto cp0_unimplemented;
8454         }
8455         break;
8456     case 30:
8457         switch (sel) {
8458         case 0:
8459             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
8460             rn = "ErrorEPC";
8461             break;
8462         default:
8463             goto cp0_unimplemented;
8464         }
8465         break;
8466     case 31:
8467         switch (sel) {
8468         case 0:
8469             /* EJTAG support */
8470             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
8471             rn = "DESAVE";
8472             break;
8473         case 2:
8474         case 3:
8475         case 4:
8476         case 5:
8477         case 6:
8478         case 7:
8479             CP0_CHECK(ctx->kscrexist & (1 << sel));
8480             tcg_gen_ld_tl(arg, cpu_env,
8481                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
8482             rn = "KScratch";
8483             break;
8484         default:
8485             goto cp0_unimplemented;
8486         }
8487         break;
8488     default:
8489         goto cp0_unimplemented;
8490     }
8491     trace_mips_translate_c0("dmfc0", rn, reg, sel);
8492     return;
8493
8494 cp0_unimplemented:
8495     qemu_log_mask(LOG_UNIMP, "dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
8496     gen_mfc0_unimplemented(ctx, arg);
8497 }
8498
8499 static void gen_dmtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
8500 {
8501     const char *rn = "invalid";
8502
8503     if (sel != 0)
8504         check_insn(ctx, ISA_MIPS64);
8505
8506     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
8507         gen_io_start();
8508     }
8509
8510     switch (reg) {
8511     case 0:
8512         switch (sel) {
8513         case 0:
8514             gen_helper_mtc0_index(cpu_env, arg);
8515             rn = "Index";
8516             break;
8517         case 1:
8518             CP0_CHECK(ctx->insn_flags & ASE_MT);
8519             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
8520             rn = "MVPControl";
8521             break;
8522         case 2:
8523             CP0_CHECK(ctx->insn_flags & ASE_MT);
8524             /* ignored */
8525             rn = "MVPConf0";
8526             break;
8527         case 3:
8528             CP0_CHECK(ctx->insn_flags & ASE_MT);
8529             /* ignored */
8530             rn = "MVPConf1";
8531             break;
8532         case 4:
8533             CP0_CHECK(ctx->vp);
8534             /* ignored */
8535             rn = "VPControl";
8536             break;
8537         default:
8538             goto cp0_unimplemented;
8539         }
8540         break;
8541     case 1:
8542         switch (sel) {
8543         case 0:
8544             /* ignored */
8545             rn = "Random";
8546             break;
8547         case 1:
8548             CP0_CHECK(ctx->insn_flags & ASE_MT);
8549             gen_helper_mtc0_vpecontrol(cpu_env, arg);
8550             rn = "VPEControl";
8551             break;
8552         case 2:
8553             CP0_CHECK(ctx->insn_flags & ASE_MT);
8554             gen_helper_mtc0_vpeconf0(cpu_env, arg);
8555             rn = "VPEConf0";
8556             break;
8557         case 3:
8558             CP0_CHECK(ctx->insn_flags & ASE_MT);
8559             gen_helper_mtc0_vpeconf1(cpu_env, arg);
8560             rn = "VPEConf1";
8561             break;
8562         case 4:
8563             CP0_CHECK(ctx->insn_flags & ASE_MT);
8564             gen_helper_mtc0_yqmask(cpu_env, arg);
8565             rn = "YQMask";
8566             break;
8567         case 5:
8568             CP0_CHECK(ctx->insn_flags & ASE_MT);
8569             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
8570             rn = "VPESchedule";
8571             break;
8572         case 6:
8573             CP0_CHECK(ctx->insn_flags & ASE_MT);
8574             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
8575             rn = "VPEScheFBack";
8576             break;
8577         case 7:
8578             CP0_CHECK(ctx->insn_flags & ASE_MT);
8579             gen_helper_mtc0_vpeopt(cpu_env, arg);
8580             rn = "VPEOpt";
8581             break;
8582         default:
8583             goto cp0_unimplemented;
8584         }
8585         break;
8586     case 2:
8587         switch (sel) {
8588         case 0:
8589             gen_helper_dmtc0_entrylo0(cpu_env, arg);
8590             rn = "EntryLo0";
8591             break;
8592         case 1:
8593             CP0_CHECK(ctx->insn_flags & ASE_MT);
8594             gen_helper_mtc0_tcstatus(cpu_env, arg);
8595             rn = "TCStatus";
8596             break;
8597         case 2:
8598             CP0_CHECK(ctx->insn_flags & ASE_MT);
8599             gen_helper_mtc0_tcbind(cpu_env, arg);
8600             rn = "TCBind";
8601             break;
8602         case 3:
8603             CP0_CHECK(ctx->insn_flags & ASE_MT);
8604             gen_helper_mtc0_tcrestart(cpu_env, arg);
8605             rn = "TCRestart";
8606             break;
8607         case 4:
8608             CP0_CHECK(ctx->insn_flags & ASE_MT);
8609             gen_helper_mtc0_tchalt(cpu_env, arg);
8610             rn = "TCHalt";
8611             break;
8612         case 5:
8613             CP0_CHECK(ctx->insn_flags & ASE_MT);
8614             gen_helper_mtc0_tccontext(cpu_env, arg);
8615             rn = "TCContext";
8616             break;
8617         case 6:
8618             CP0_CHECK(ctx->insn_flags & ASE_MT);
8619             gen_helper_mtc0_tcschedule(cpu_env, arg);
8620             rn = "TCSchedule";
8621             break;
8622         case 7:
8623             CP0_CHECK(ctx->insn_flags & ASE_MT);
8624             gen_helper_mtc0_tcschefback(cpu_env, arg);
8625             rn = "TCScheFBack";
8626             break;
8627         default:
8628             goto cp0_unimplemented;
8629         }
8630         break;
8631     case 3:
8632         switch (sel) {
8633         case 0:
8634             gen_helper_dmtc0_entrylo1(cpu_env, arg);
8635             rn = "EntryLo1";
8636             break;
8637         case 1:
8638             CP0_CHECK(ctx->vp);
8639             /* ignored */
8640             rn = "GlobalNumber";
8641             break;
8642         default:
8643             goto cp0_unimplemented;
8644         }
8645         break;
8646     case 4:
8647         switch (sel) {
8648         case 0:
8649             gen_helper_mtc0_context(cpu_env, arg);
8650             rn = "Context";
8651             break;
8652         case 1:
8653 //           gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
8654             rn = "ContextConfig";
8655             goto cp0_unimplemented;
8656         case 2:
8657             CP0_CHECK(ctx->ulri);
8658             tcg_gen_st_tl(arg, cpu_env,
8659                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
8660             rn = "UserLocal";
8661             break;
8662         default:
8663             goto cp0_unimplemented;
8664         }
8665         break;
8666     case 5:
8667         switch (sel) {
8668         case 0:
8669             gen_helper_mtc0_pagemask(cpu_env, arg);
8670             rn = "PageMask";
8671             break;
8672         case 1:
8673             check_insn(ctx, ISA_MIPS32R2);
8674             gen_helper_mtc0_pagegrain(cpu_env, arg);
8675             rn = "PageGrain";
8676             break;
8677         case 2:
8678             CP0_CHECK(ctx->sc);
8679             gen_helper_mtc0_segctl0(cpu_env, arg);
8680             rn = "SegCtl0";
8681             break;
8682         case 3:
8683             CP0_CHECK(ctx->sc);
8684             gen_helper_mtc0_segctl1(cpu_env, arg);
8685             rn = "SegCtl1";
8686             break;
8687         case 4:
8688             CP0_CHECK(ctx->sc);
8689             gen_helper_mtc0_segctl2(cpu_env, arg);
8690             rn = "SegCtl2";
8691             break;
8692         case 5:
8693             check_pw(ctx);
8694             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWBase));
8695             rn = "PWBase";
8696             break;
8697         case 6:
8698             check_pw(ctx);
8699             gen_helper_mtc0_pwfield(cpu_env, arg);
8700             rn = "PWField";
8701             break;
8702         case 7:
8703             check_pw(ctx);
8704             gen_helper_mtc0_pwsize(cpu_env, arg);
8705             rn = "PWSize";
8706             break;
8707         default:
8708             goto cp0_unimplemented;
8709         }
8710         break;
8711     case 6:
8712         switch (sel) {
8713         case 0:
8714             gen_helper_mtc0_wired(cpu_env, arg);
8715             rn = "Wired";
8716             break;
8717         case 1:
8718             check_insn(ctx, ISA_MIPS32R2);
8719             gen_helper_mtc0_srsconf0(cpu_env, arg);
8720             rn = "SRSConf0";
8721             break;
8722         case 2:
8723             check_insn(ctx, ISA_MIPS32R2);
8724             gen_helper_mtc0_srsconf1(cpu_env, arg);
8725             rn = "SRSConf1";
8726             break;
8727         case 3:
8728             check_insn(ctx, ISA_MIPS32R2);
8729             gen_helper_mtc0_srsconf2(cpu_env, arg);
8730             rn = "SRSConf2";
8731             break;
8732         case 4:
8733             check_insn(ctx, ISA_MIPS32R2);
8734             gen_helper_mtc0_srsconf3(cpu_env, arg);
8735             rn = "SRSConf3";
8736             break;
8737         case 5:
8738             check_insn(ctx, ISA_MIPS32R2);
8739             gen_helper_mtc0_srsconf4(cpu_env, arg);
8740             rn = "SRSConf4";
8741             break;
8742         case 6:
8743             check_pw(ctx);
8744             gen_helper_mtc0_pwctl(cpu_env, arg);
8745             rn = "PWCtl";
8746             break;
8747         default:
8748             goto cp0_unimplemented;
8749         }
8750         break;
8751     case 7:
8752         switch (sel) {
8753         case 0:
8754             check_insn(ctx, ISA_MIPS32R2);
8755             gen_helper_mtc0_hwrena(cpu_env, arg);
8756             ctx->base.is_jmp = DISAS_STOP;
8757             rn = "HWREna";
8758             break;
8759         default:
8760             goto cp0_unimplemented;
8761         }
8762         break;
8763     case 8:
8764         switch (sel) {
8765         case 0:
8766             /* ignored */
8767             rn = "BadVAddr";
8768             break;
8769         case 1:
8770             /* ignored */
8771             rn = "BadInstr";
8772             break;
8773         case 2:
8774             /* ignored */
8775             rn = "BadInstrP";
8776             break;
8777         case 3:
8778             /* ignored */
8779             rn = "BadInstrX";
8780             break;
8781         default:
8782             goto cp0_unimplemented;
8783         }
8784         break;
8785     case 9:
8786         switch (sel) {
8787         case 0:
8788             gen_helper_mtc0_count(cpu_env, arg);
8789             rn = "Count";
8790             break;
8791         /* 6,7 are implementation dependent */
8792         default:
8793             goto cp0_unimplemented;
8794         }
8795         /* Stop translation as we may have switched the execution mode */
8796         ctx->base.is_jmp = DISAS_STOP;
8797         break;
8798     case 10:
8799         switch (sel) {
8800         case 0:
8801             gen_helper_mtc0_entryhi(cpu_env, arg);
8802             rn = "EntryHi";
8803             break;
8804         default:
8805             goto cp0_unimplemented;
8806         }
8807         break;
8808     case 11:
8809         switch (sel) {
8810         case 0:
8811             gen_helper_mtc0_compare(cpu_env, arg);
8812             rn = "Compare";
8813             break;
8814         /* 6,7 are implementation dependent */
8815         default:
8816             goto cp0_unimplemented;
8817         }
8818         /* Stop translation as we may have switched the execution mode */
8819         ctx->base.is_jmp = DISAS_STOP;
8820         break;
8821     case 12:
8822         switch (sel) {
8823         case 0:
8824             save_cpu_state(ctx, 1);
8825             gen_helper_mtc0_status(cpu_env, arg);
8826             /* DISAS_STOP isn't good enough here, hflags may have changed. */
8827             gen_save_pc(ctx->base.pc_next + 4);
8828             ctx->base.is_jmp = DISAS_EXIT;
8829             rn = "Status";
8830             break;
8831         case 1:
8832             check_insn(ctx, ISA_MIPS32R2);
8833             gen_helper_mtc0_intctl(cpu_env, arg);
8834             /* Stop translation as we may have switched the execution mode */
8835             ctx->base.is_jmp = DISAS_STOP;
8836             rn = "IntCtl";
8837             break;
8838         case 2:
8839             check_insn(ctx, ISA_MIPS32R2);
8840             gen_helper_mtc0_srsctl(cpu_env, arg);
8841             /* Stop translation as we may have switched the execution mode */
8842             ctx->base.is_jmp = DISAS_STOP;
8843             rn = "SRSCtl";
8844             break;
8845         case 3:
8846             check_insn(ctx, ISA_MIPS32R2);
8847             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
8848             /* Stop translation as we may have switched the execution mode */
8849             ctx->base.is_jmp = DISAS_STOP;
8850             rn = "SRSMap";
8851             break;
8852         default:
8853             goto cp0_unimplemented;
8854         }
8855         break;
8856     case 13:
8857         switch (sel) {
8858         case 0:
8859             save_cpu_state(ctx, 1);
8860             gen_helper_mtc0_cause(cpu_env, arg);
8861             /* Stop translation as we may have triggered an interrupt.
8862              * DISAS_STOP isn't sufficient, we need to ensure we break out of
8863              * translated code to check for pending interrupts.  */
8864             gen_save_pc(ctx->base.pc_next + 4);
8865             ctx->base.is_jmp = DISAS_EXIT;
8866             rn = "Cause";
8867             break;
8868         default:
8869             goto cp0_unimplemented;
8870         }
8871         break;
8872     case 14:
8873         switch (sel) {
8874         case 0:
8875             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
8876             rn = "EPC";
8877             break;
8878         default:
8879             goto cp0_unimplemented;
8880         }
8881         break;
8882     case 15:
8883         switch (sel) {
8884         case 0:
8885             /* ignored */
8886             rn = "PRid";
8887             break;
8888         case 1:
8889             check_insn(ctx, ISA_MIPS32R2);
8890             gen_helper_mtc0_ebase(cpu_env, arg);
8891             rn = "EBase";
8892             break;
8893         default:
8894             goto cp0_unimplemented;
8895         }
8896         break;
8897     case 16:
8898         switch (sel) {
8899         case 0:
8900             gen_helper_mtc0_config0(cpu_env, arg);
8901             rn = "Config";
8902             /* Stop translation as we may have switched the execution mode */
8903             ctx->base.is_jmp = DISAS_STOP;
8904             break;
8905         case 1:
8906             /* ignored, read only */
8907             rn = "Config1";
8908             break;
8909         case 2:
8910             gen_helper_mtc0_config2(cpu_env, arg);
8911             rn = "Config2";
8912             /* Stop translation as we may have switched the execution mode */
8913             ctx->base.is_jmp = DISAS_STOP;
8914             break;
8915         case 3:
8916             gen_helper_mtc0_config3(cpu_env, arg);
8917             rn = "Config3";
8918             /* Stop translation as we may have switched the execution mode */
8919             ctx->base.is_jmp = DISAS_STOP;
8920             break;
8921         case 4:
8922             /* currently ignored */
8923             rn = "Config4";
8924             break;
8925         case 5:
8926             gen_helper_mtc0_config5(cpu_env, arg);
8927             rn = "Config5";
8928             /* Stop translation as we may have switched the execution mode */
8929             ctx->base.is_jmp = DISAS_STOP;
8930             break;
8931         /* 6,7 are implementation dependent */
8932         default:
8933             rn = "Invalid config selector";
8934             goto cp0_unimplemented;
8935         }
8936         break;
8937     case 17:
8938         switch (sel) {
8939         case 0:
8940             gen_helper_mtc0_lladdr(cpu_env, arg);
8941             rn = "LLAddr";
8942             break;
8943         case 1:
8944             CP0_CHECK(ctx->mrp);
8945             gen_helper_mtc0_maar(cpu_env, arg);
8946             rn = "MAAR";
8947             break;
8948         case 2:
8949             CP0_CHECK(ctx->mrp);
8950             gen_helper_mtc0_maari(cpu_env, arg);
8951             rn = "MAARI";
8952             break;
8953         default:
8954             goto cp0_unimplemented;
8955         }
8956         break;
8957     case 18:
8958         switch (sel) {
8959         case 0:
8960         case 1:
8961         case 2:
8962         case 3:
8963         case 4:
8964         case 5:
8965         case 6:
8966         case 7:
8967             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
8968             gen_helper_0e1i(mtc0_watchlo, arg, sel);
8969             rn = "WatchLo";
8970             break;
8971         default:
8972             goto cp0_unimplemented;
8973         }
8974         break;
8975     case 19:
8976         switch (sel) {
8977         case 0:
8978         case 1:
8979         case 2:
8980         case 3:
8981         case 4:
8982         case 5:
8983         case 6:
8984         case 7:
8985             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
8986             gen_helper_0e1i(mtc0_watchhi, arg, sel);
8987             rn = "WatchHi";
8988             break;
8989         default:
8990             goto cp0_unimplemented;
8991         }
8992         break;
8993     case 20:
8994         switch (sel) {
8995         case 0:
8996             check_insn(ctx, ISA_MIPS3);
8997             gen_helper_mtc0_xcontext(cpu_env, arg);
8998             rn = "XContext";
8999             break;
9000         default:
9001             goto cp0_unimplemented;
9002         }
9003         break;
9004     case 21:
9005        /* Officially reserved, but sel 0 is used for R1x000 framemask */
9006         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
9007         switch (sel) {
9008         case 0:
9009             gen_helper_mtc0_framemask(cpu_env, arg);
9010             rn = "Framemask";
9011             break;
9012         default:
9013             goto cp0_unimplemented;
9014         }
9015         break;
9016     case 22:
9017         /* ignored */
9018         rn = "Diagnostic"; /* implementation dependent */
9019         break;
9020     case 23:
9021         switch (sel) {
9022         case 0:
9023             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
9024             /* DISAS_STOP isn't good enough here, hflags may have changed. */
9025             gen_save_pc(ctx->base.pc_next + 4);
9026             ctx->base.is_jmp = DISAS_EXIT;
9027             rn = "Debug";
9028             break;
9029         case 1:
9030 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
9031             /* Stop translation as we may have switched the execution mode */
9032             ctx->base.is_jmp = DISAS_STOP;
9033             rn = "TraceControl";
9034             goto cp0_unimplemented;
9035         case 2:
9036 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
9037             /* Stop translation as we may have switched the execution mode */
9038             ctx->base.is_jmp = DISAS_STOP;
9039             rn = "TraceControl2";
9040             goto cp0_unimplemented;
9041         case 3:
9042 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
9043             /* Stop translation as we may have switched the execution mode */
9044             ctx->base.is_jmp = DISAS_STOP;
9045             rn = "UserTraceData";
9046             goto cp0_unimplemented;
9047         case 4:
9048 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
9049             /* Stop translation as we may have switched the execution mode */
9050             ctx->base.is_jmp = DISAS_STOP;
9051             rn = "TraceBPC";
9052             goto cp0_unimplemented;
9053         default:
9054             goto cp0_unimplemented;
9055         }
9056         break;
9057     case 24:
9058         switch (sel) {
9059         case 0:
9060             /* EJTAG support */
9061             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
9062             rn = "DEPC";
9063             break;
9064         default:
9065             goto cp0_unimplemented;
9066         }
9067         break;
9068     case 25:
9069         switch (sel) {
9070         case 0:
9071             gen_helper_mtc0_performance0(cpu_env, arg);
9072             rn = "Performance0";
9073             break;
9074         case 1:
9075 //            gen_helper_mtc0_performance1(cpu_env, arg);
9076             rn = "Performance1";
9077             goto cp0_unimplemented;
9078         case 2:
9079 //            gen_helper_mtc0_performance2(cpu_env, arg);
9080             rn = "Performance2";
9081             goto cp0_unimplemented;
9082         case 3:
9083 //            gen_helper_mtc0_performance3(cpu_env, arg);
9084             rn = "Performance3";
9085             goto cp0_unimplemented;
9086         case 4:
9087 //            gen_helper_mtc0_performance4(cpu_env, arg);
9088             rn = "Performance4";
9089             goto cp0_unimplemented;
9090         case 5:
9091 //            gen_helper_mtc0_performance5(cpu_env, arg);
9092             rn = "Performance5";
9093             goto cp0_unimplemented;
9094         case 6:
9095 //            gen_helper_mtc0_performance6(cpu_env, arg);
9096             rn = "Performance6";
9097             goto cp0_unimplemented;
9098         case 7:
9099 //            gen_helper_mtc0_performance7(cpu_env, arg);
9100             rn = "Performance7";
9101             goto cp0_unimplemented;
9102         default:
9103             goto cp0_unimplemented;
9104         }
9105         break;
9106     case 26:
9107         switch (sel) {
9108         case 0:
9109             gen_helper_mtc0_errctl(cpu_env, arg);
9110             ctx->base.is_jmp = DISAS_STOP;
9111             rn = "ErrCtl";
9112             break;
9113         default:
9114             goto cp0_unimplemented;
9115         }
9116         break;
9117     case 27:
9118         switch (sel) {
9119         case 0:
9120         case 1:
9121         case 2:
9122         case 3:
9123             /* ignored */
9124             rn = "CacheErr";
9125             break;
9126         default:
9127             goto cp0_unimplemented;
9128         }
9129         break;
9130     case 28:
9131         switch (sel) {
9132         case 0:
9133         case 2:
9134         case 4:
9135         case 6:
9136             gen_helper_mtc0_taglo(cpu_env, arg);
9137             rn = "TagLo";
9138             break;
9139         case 1:
9140         case 3:
9141         case 5:
9142         case 7:
9143             gen_helper_mtc0_datalo(cpu_env, arg);
9144             rn = "DataLo";
9145             break;
9146         default:
9147             goto cp0_unimplemented;
9148         }
9149         break;
9150     case 29:
9151         switch (sel) {
9152         case 0:
9153         case 2:
9154         case 4:
9155         case 6:
9156             gen_helper_mtc0_taghi(cpu_env, arg);
9157             rn = "TagHi";
9158             break;
9159         case 1:
9160         case 3:
9161         case 5:
9162         case 7:
9163             gen_helper_mtc0_datahi(cpu_env, arg);
9164             rn = "DataHi";
9165             break;
9166         default:
9167             rn = "invalid sel";
9168             goto cp0_unimplemented;
9169         }
9170         break;
9171     case 30:
9172         switch (sel) {
9173         case 0:
9174             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
9175             rn = "ErrorEPC";
9176             break;
9177         default:
9178             goto cp0_unimplemented;
9179         }
9180         break;
9181     case 31:
9182         switch (sel) {
9183         case 0:
9184             /* EJTAG support */
9185             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
9186             rn = "DESAVE";
9187             break;
9188         case 2:
9189         case 3:
9190         case 4:
9191         case 5:
9192         case 6:
9193         case 7:
9194             CP0_CHECK(ctx->kscrexist & (1 << sel));
9195             tcg_gen_st_tl(arg, cpu_env,
9196                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
9197             rn = "KScratch";
9198             break;
9199         default:
9200             goto cp0_unimplemented;
9201         }
9202         break;
9203     default:
9204         goto cp0_unimplemented;
9205     }
9206     trace_mips_translate_c0("dmtc0", rn, reg, sel);
9207
9208     /* For simplicity assume that all writes can cause interrupts.  */
9209     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
9210         gen_io_end();
9211         /* DISAS_STOP isn't sufficient, we need to ensure we break out of
9212          * translated code to check for pending interrupts.  */
9213         gen_save_pc(ctx->base.pc_next + 4);
9214         ctx->base.is_jmp = DISAS_EXIT;
9215     }
9216     return;
9217
9218 cp0_unimplemented:
9219     qemu_log_mask(LOG_UNIMP, "dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
9220 }
9221 #endif /* TARGET_MIPS64 */
9222
9223 static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd,
9224                      int u, int sel, int h)
9225 {
9226     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
9227     TCGv t0 = tcg_temp_local_new();
9228
9229     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
9230         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
9231          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
9232         tcg_gen_movi_tl(t0, -1);
9233     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
9234              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
9235         tcg_gen_movi_tl(t0, -1);
9236     else if (u == 0) {
9237         switch (rt) {
9238         case 1:
9239             switch (sel) {
9240             case 1:
9241                 gen_helper_mftc0_vpecontrol(t0, cpu_env);
9242                 break;
9243             case 2:
9244                 gen_helper_mftc0_vpeconf0(t0, cpu_env);
9245                 break;
9246             default:
9247                 goto die;
9248                 break;
9249             }
9250             break;
9251         case 2:
9252             switch (sel) {
9253             case 1:
9254                 gen_helper_mftc0_tcstatus(t0, cpu_env);
9255                 break;
9256             case 2:
9257                 gen_helper_mftc0_tcbind(t0, cpu_env);
9258                 break;
9259             case 3:
9260                 gen_helper_mftc0_tcrestart(t0, cpu_env);
9261                 break;
9262             case 4:
9263                 gen_helper_mftc0_tchalt(t0, cpu_env);
9264                 break;
9265             case 5:
9266                 gen_helper_mftc0_tccontext(t0, cpu_env);
9267                 break;
9268             case 6:
9269                 gen_helper_mftc0_tcschedule(t0, cpu_env);
9270                 break;
9271             case 7:
9272                 gen_helper_mftc0_tcschefback(t0, cpu_env);
9273                 break;
9274             default:
9275                 gen_mfc0(ctx, t0, rt, sel);
9276                 break;
9277             }
9278             break;
9279         case 10:
9280             switch (sel) {
9281             case 0:
9282                 gen_helper_mftc0_entryhi(t0, cpu_env);
9283                 break;
9284             default:
9285                 gen_mfc0(ctx, t0, rt, sel);
9286                 break;
9287             }
9288         case 12:
9289             switch (sel) {
9290             case 0:
9291                 gen_helper_mftc0_status(t0, cpu_env);
9292                 break;
9293             default:
9294                 gen_mfc0(ctx, t0, rt, sel);
9295                 break;
9296             }
9297         case 13:
9298             switch (sel) {
9299             case 0:
9300                 gen_helper_mftc0_cause(t0, cpu_env);
9301                 break;
9302             default:
9303                 goto die;
9304                 break;
9305             }
9306             break;
9307         case 14:
9308             switch (sel) {
9309             case 0:
9310                 gen_helper_mftc0_epc(t0, cpu_env);
9311                 break;
9312             default:
9313                 goto die;
9314                 break;
9315             }
9316             break;
9317         case 15:
9318             switch (sel) {
9319             case 1:
9320                 gen_helper_mftc0_ebase(t0, cpu_env);
9321                 break;
9322             default:
9323                 goto die;
9324                 break;
9325             }
9326             break;
9327         case 16:
9328             switch (sel) {
9329             case 0:
9330             case 1:
9331             case 2:
9332             case 3:
9333             case 4:
9334             case 5:
9335             case 6:
9336             case 7:
9337                 gen_helper_mftc0_configx(t0, cpu_env, tcg_const_tl(sel));
9338                 break;
9339             default:
9340                 goto die;
9341                 break;
9342             }
9343             break;
9344         case 23:
9345             switch (sel) {
9346             case 0:
9347                 gen_helper_mftc0_debug(t0, cpu_env);
9348                 break;
9349             default:
9350                 gen_mfc0(ctx, t0, rt, sel);
9351                 break;
9352             }
9353             break;
9354         default:
9355             gen_mfc0(ctx, t0, rt, sel);
9356         }
9357     } else switch (sel) {
9358     /* GPR registers. */
9359     case 0:
9360         gen_helper_1e0i(mftgpr, t0, rt);
9361         break;
9362     /* Auxiliary CPU registers */
9363     case 1:
9364         switch (rt) {
9365         case 0:
9366             gen_helper_1e0i(mftlo, t0, 0);
9367             break;
9368         case 1:
9369             gen_helper_1e0i(mfthi, t0, 0);
9370             break;
9371         case 2:
9372             gen_helper_1e0i(mftacx, t0, 0);
9373             break;
9374         case 4:
9375             gen_helper_1e0i(mftlo, t0, 1);
9376             break;
9377         case 5:
9378             gen_helper_1e0i(mfthi, t0, 1);
9379             break;
9380         case 6:
9381             gen_helper_1e0i(mftacx, t0, 1);
9382             break;
9383         case 8:
9384             gen_helper_1e0i(mftlo, t0, 2);
9385             break;
9386         case 9:
9387             gen_helper_1e0i(mfthi, t0, 2);
9388             break;
9389         case 10:
9390             gen_helper_1e0i(mftacx, t0, 2);
9391             break;
9392         case 12:
9393             gen_helper_1e0i(mftlo, t0, 3);
9394             break;
9395         case 13:
9396             gen_helper_1e0i(mfthi, t0, 3);
9397             break;
9398         case 14:
9399             gen_helper_1e0i(mftacx, t0, 3);
9400             break;
9401         case 16:
9402             gen_helper_mftdsp(t0, cpu_env);
9403             break;
9404         default:
9405             goto die;
9406         }
9407         break;
9408     /* Floating point (COP1). */
9409     case 2:
9410         /* XXX: For now we support only a single FPU context. */
9411         if (h == 0) {
9412             TCGv_i32 fp0 = tcg_temp_new_i32();
9413
9414             gen_load_fpr32(ctx, fp0, rt);
9415             tcg_gen_ext_i32_tl(t0, fp0);
9416             tcg_temp_free_i32(fp0);
9417         } else {
9418             TCGv_i32 fp0 = tcg_temp_new_i32();
9419
9420             gen_load_fpr32h(ctx, fp0, rt);
9421             tcg_gen_ext_i32_tl(t0, fp0);
9422             tcg_temp_free_i32(fp0);
9423         }
9424         break;
9425     case 3:
9426         /* XXX: For now we support only a single FPU context. */
9427         gen_helper_1e0i(cfc1, t0, rt);
9428         break;
9429     /* COP2: Not implemented. */
9430     case 4:
9431     case 5:
9432         /* fall through */
9433     default:
9434         goto die;
9435     }
9436     trace_mips_translate_tr("mftr", rt, u, sel, h);
9437     gen_store_gpr(t0, rd);
9438     tcg_temp_free(t0);
9439     return;
9440
9441 die:
9442     tcg_temp_free(t0);
9443     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
9444     generate_exception_end(ctx, EXCP_RI);
9445 }
9446
9447 static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt,
9448                      int u, int sel, int h)
9449 {
9450     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
9451     TCGv t0 = tcg_temp_local_new();
9452
9453     gen_load_gpr(t0, rt);
9454     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
9455         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
9456          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
9457         /* NOP */ ;
9458     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
9459              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
9460         /* NOP */ ;
9461     else if (u == 0) {
9462         switch (rd) {
9463         case 1:
9464             switch (sel) {
9465             case 1:
9466                 gen_helper_mttc0_vpecontrol(cpu_env, t0);
9467                 break;
9468             case 2:
9469                 gen_helper_mttc0_vpeconf0(cpu_env, t0);
9470                 break;
9471             default:
9472                 goto die;
9473                 break;
9474             }
9475             break;
9476         case 2:
9477             switch (sel) {
9478             case 1:
9479                 gen_helper_mttc0_tcstatus(cpu_env, t0);
9480                 break;
9481             case 2:
9482                 gen_helper_mttc0_tcbind(cpu_env, t0);
9483                 break;
9484             case 3:
9485                 gen_helper_mttc0_tcrestart(cpu_env, t0);
9486                 break;
9487             case 4:
9488                 gen_helper_mttc0_tchalt(cpu_env, t0);
9489                 break;
9490             case 5:
9491                 gen_helper_mttc0_tccontext(cpu_env, t0);
9492                 break;
9493             case 6:
9494                 gen_helper_mttc0_tcschedule(cpu_env, t0);
9495                 break;
9496             case 7:
9497                 gen_helper_mttc0_tcschefback(cpu_env, t0);
9498                 break;
9499             default:
9500                 gen_mtc0(ctx, t0, rd, sel);
9501                 break;
9502             }
9503             break;
9504         case 10:
9505             switch (sel) {
9506             case 0:
9507                 gen_helper_mttc0_entryhi(cpu_env, t0);
9508                 break;
9509             default:
9510                 gen_mtc0(ctx, t0, rd, sel);
9511                 break;
9512             }
9513         case 12:
9514             switch (sel) {
9515             case 0:
9516                 gen_helper_mttc0_status(cpu_env, t0);
9517                 break;
9518             default:
9519                 gen_mtc0(ctx, t0, rd, sel);
9520                 break;
9521             }
9522         case 13:
9523             switch (sel) {
9524             case 0:
9525                 gen_helper_mttc0_cause(cpu_env, t0);
9526                 break;
9527             default:
9528                 goto die;
9529                 break;
9530             }
9531             break;
9532         case 15:
9533             switch (sel) {
9534             case 1:
9535                 gen_helper_mttc0_ebase(cpu_env, t0);
9536                 break;
9537             default:
9538                 goto die;
9539                 break;
9540             }
9541             break;
9542         case 23:
9543             switch (sel) {
9544             case 0:
9545                 gen_helper_mttc0_debug(cpu_env, t0);
9546                 break;
9547             default:
9548                 gen_mtc0(ctx, t0, rd, sel);
9549                 break;
9550             }
9551             break;
9552         default:
9553             gen_mtc0(ctx, t0, rd, sel);
9554         }
9555     } else switch (sel) {
9556     /* GPR registers. */
9557     case 0:
9558         gen_helper_0e1i(mttgpr, t0, rd);
9559         break;
9560     /* Auxiliary CPU registers */
9561     case 1:
9562         switch (rd) {
9563         case 0:
9564             gen_helper_0e1i(mttlo, t0, 0);
9565             break;
9566         case 1:
9567             gen_helper_0e1i(mtthi, t0, 0);
9568             break;
9569         case 2:
9570             gen_helper_0e1i(mttacx, t0, 0);
9571             break;
9572         case 4:
9573             gen_helper_0e1i(mttlo, t0, 1);
9574             break;
9575         case 5:
9576             gen_helper_0e1i(mtthi, t0, 1);
9577             break;
9578         case 6:
9579             gen_helper_0e1i(mttacx, t0, 1);
9580             break;
9581         case 8:
9582             gen_helper_0e1i(mttlo, t0, 2);
9583             break;
9584         case 9:
9585             gen_helper_0e1i(mtthi, t0, 2);
9586             break;
9587         case 10:
9588             gen_helper_0e1i(mttacx, t0, 2);
9589             break;
9590         case 12:
9591             gen_helper_0e1i(mttlo, t0, 3);
9592             break;
9593         case 13:
9594             gen_helper_0e1i(mtthi, t0, 3);
9595             break;
9596         case 14:
9597             gen_helper_0e1i(mttacx, t0, 3);
9598             break;
9599         case 16:
9600             gen_helper_mttdsp(cpu_env, t0);
9601             break;
9602         default:
9603             goto die;
9604         }
9605         break;
9606     /* Floating point (COP1). */
9607     case 2:
9608         /* XXX: For now we support only a single FPU context. */
9609         if (h == 0) {
9610             TCGv_i32 fp0 = tcg_temp_new_i32();
9611
9612             tcg_gen_trunc_tl_i32(fp0, t0);
9613             gen_store_fpr32(ctx, fp0, rd);
9614             tcg_temp_free_i32(fp0);
9615         } else {
9616             TCGv_i32 fp0 = tcg_temp_new_i32();
9617
9618             tcg_gen_trunc_tl_i32(fp0, t0);
9619             gen_store_fpr32h(ctx, fp0, rd);
9620             tcg_temp_free_i32(fp0);
9621         }
9622         break;
9623     case 3:
9624         /* XXX: For now we support only a single FPU context. */
9625         {
9626             TCGv_i32 fs_tmp = tcg_const_i32(rd);
9627
9628             gen_helper_0e2i(ctc1, t0, fs_tmp, rt);
9629             tcg_temp_free_i32(fs_tmp);
9630         }
9631         /* Stop translation as we may have changed hflags */
9632         ctx->base.is_jmp = DISAS_STOP;
9633         break;
9634     /* COP2: Not implemented. */
9635     case 4:
9636     case 5:
9637         /* fall through */
9638     default:
9639         goto die;
9640     }
9641     trace_mips_translate_tr("mttr", rd, u, sel, h);
9642     tcg_temp_free(t0);
9643     return;
9644
9645 die:
9646     tcg_temp_free(t0);
9647     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
9648     generate_exception_end(ctx, EXCP_RI);
9649 }
9650
9651 static void gen_cp0 (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, int rt, int rd)
9652 {
9653     const char *opn = "ldst";
9654
9655     check_cp0_enabled(ctx);
9656     switch (opc) {
9657     case OPC_MFC0:
9658         if (rt == 0) {
9659             /* Treat as NOP. */
9660             return;
9661         }
9662         gen_mfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
9663         opn = "mfc0";
9664         break;
9665     case OPC_MTC0:
9666         {
9667             TCGv t0 = tcg_temp_new();
9668
9669             gen_load_gpr(t0, rt);
9670             gen_mtc0(ctx, t0, rd, ctx->opcode & 0x7);
9671             tcg_temp_free(t0);
9672         }
9673         opn = "mtc0";
9674         break;
9675 #if defined(TARGET_MIPS64)
9676     case OPC_DMFC0:
9677         check_insn(ctx, ISA_MIPS3);
9678         if (rt == 0) {
9679             /* Treat as NOP. */
9680             return;
9681         }
9682         gen_dmfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
9683         opn = "dmfc0";
9684         break;
9685     case OPC_DMTC0:
9686         check_insn(ctx, ISA_MIPS3);
9687         {
9688             TCGv t0 = tcg_temp_new();
9689
9690             gen_load_gpr(t0, rt);
9691             gen_dmtc0(ctx, t0, rd, ctx->opcode & 0x7);
9692             tcg_temp_free(t0);
9693         }
9694         opn = "dmtc0";
9695         break;
9696 #endif
9697     case OPC_MFHC0:
9698         check_mvh(ctx);
9699         if (rt == 0) {
9700             /* Treat as NOP. */
9701             return;
9702         }
9703         gen_mfhc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
9704         opn = "mfhc0";
9705         break;
9706     case OPC_MTHC0:
9707         check_mvh(ctx);
9708         {
9709             TCGv t0 = tcg_temp_new();
9710             gen_load_gpr(t0, rt);
9711             gen_mthc0(ctx, t0, rd, ctx->opcode & 0x7);
9712             tcg_temp_free(t0);
9713         }
9714         opn = "mthc0";
9715         break;
9716     case OPC_MFTR:
9717         check_cp0_enabled(ctx);
9718         if (rd == 0) {
9719             /* Treat as NOP. */
9720             return;
9721         }
9722         gen_mftr(env, ctx, rt, rd, (ctx->opcode >> 5) & 1,
9723                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
9724         opn = "mftr";
9725         break;
9726     case OPC_MTTR:
9727         check_cp0_enabled(ctx);
9728         gen_mttr(env, ctx, rd, rt, (ctx->opcode >> 5) & 1,
9729                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
9730         opn = "mttr";
9731         break;
9732     case OPC_TLBWI:
9733         opn = "tlbwi";
9734         if (!env->tlb->helper_tlbwi)
9735             goto die;
9736         gen_helper_tlbwi(cpu_env);
9737         break;
9738     case OPC_TLBINV:
9739         opn = "tlbinv";
9740         if (ctx->ie >= 2) {
9741             if (!env->tlb->helper_tlbinv) {
9742                 goto die;
9743             }
9744             gen_helper_tlbinv(cpu_env);
9745         } /* treat as nop if TLBINV not supported */
9746         break;
9747     case OPC_TLBINVF:
9748         opn = "tlbinvf";
9749         if (ctx->ie >= 2) {
9750             if (!env->tlb->helper_tlbinvf) {
9751                 goto die;
9752             }
9753             gen_helper_tlbinvf(cpu_env);
9754         } /* treat as nop if TLBINV not supported */
9755         break;
9756     case OPC_TLBWR:
9757         opn = "tlbwr";
9758         if (!env->tlb->helper_tlbwr)
9759             goto die;
9760         gen_helper_tlbwr(cpu_env);
9761         break;
9762     case OPC_TLBP:
9763         opn = "tlbp";
9764         if (!env->tlb->helper_tlbp)
9765             goto die;
9766         gen_helper_tlbp(cpu_env);
9767         break;
9768     case OPC_TLBR:
9769         opn = "tlbr";
9770         if (!env->tlb->helper_tlbr)
9771             goto die;
9772         gen_helper_tlbr(cpu_env);
9773         break;
9774     case OPC_ERET: /* OPC_ERETNC */
9775         if ((ctx->insn_flags & ISA_MIPS32R6) &&
9776             (ctx->hflags & MIPS_HFLAG_BMASK)) {
9777             goto die;
9778         } else {
9779             int bit_shift = (ctx->hflags & MIPS_HFLAG_M16) ? 16 : 6;
9780             if (ctx->opcode & (1 << bit_shift)) {
9781                 /* OPC_ERETNC */
9782                 opn = "eretnc";
9783                 check_insn(ctx, ISA_MIPS32R5);
9784                 gen_helper_eretnc(cpu_env);
9785             } else {
9786                 /* OPC_ERET */
9787                 opn = "eret";
9788                 check_insn(ctx, ISA_MIPS2);
9789                 gen_helper_eret(cpu_env);
9790             }
9791             ctx->base.is_jmp = DISAS_EXIT;
9792         }
9793         break;
9794     case OPC_DERET:
9795         opn = "deret";
9796         check_insn(ctx, ISA_MIPS32);
9797         if ((ctx->insn_flags & ISA_MIPS32R6) &&
9798             (ctx->hflags & MIPS_HFLAG_BMASK)) {
9799             goto die;
9800         }
9801         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
9802             MIPS_INVAL(opn);
9803             generate_exception_end(ctx, EXCP_RI);
9804         } else {
9805             gen_helper_deret(cpu_env);
9806             ctx->base.is_jmp = DISAS_EXIT;
9807         }
9808         break;
9809     case OPC_WAIT:
9810         opn = "wait";
9811         check_insn(ctx, ISA_MIPS3 | ISA_MIPS32);
9812         if ((ctx->insn_flags & ISA_MIPS32R6) &&
9813             (ctx->hflags & MIPS_HFLAG_BMASK)) {
9814             goto die;
9815         }
9816         /* If we get an exception, we want to restart at next instruction */
9817         ctx->base.pc_next += 4;
9818         save_cpu_state(ctx, 1);
9819         ctx->base.pc_next -= 4;
9820         gen_helper_wait(cpu_env);
9821         ctx->base.is_jmp = DISAS_NORETURN;
9822         break;
9823     default:
9824  die:
9825         MIPS_INVAL(opn);
9826         generate_exception_end(ctx, EXCP_RI);
9827         return;
9828     }
9829     (void)opn; /* avoid a compiler warning */
9830 }
9831 #endif /* !CONFIG_USER_ONLY */
9832
9833 /* CP1 Branches (before delay slot) */
9834 static void gen_compute_branch1(DisasContext *ctx, uint32_t op,
9835                                 int32_t cc, int32_t offset)
9836 {
9837     target_ulong btarget;
9838     TCGv_i32 t0 = tcg_temp_new_i32();
9839
9840     if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->hflags & MIPS_HFLAG_BMASK)) {
9841         generate_exception_end(ctx, EXCP_RI);
9842         goto out;
9843     }
9844
9845     if (cc != 0)
9846         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
9847
9848     btarget = ctx->base.pc_next + 4 + offset;
9849
9850     switch (op) {
9851     case OPC_BC1F:
9852         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9853         tcg_gen_not_i32(t0, t0);
9854         tcg_gen_andi_i32(t0, t0, 1);
9855         tcg_gen_extu_i32_tl(bcond, t0);
9856         goto not_likely;
9857     case OPC_BC1FL:
9858         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9859         tcg_gen_not_i32(t0, t0);
9860         tcg_gen_andi_i32(t0, t0, 1);
9861         tcg_gen_extu_i32_tl(bcond, t0);
9862         goto likely;
9863     case OPC_BC1T:
9864         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9865         tcg_gen_andi_i32(t0, t0, 1);
9866         tcg_gen_extu_i32_tl(bcond, t0);
9867         goto not_likely;
9868     case OPC_BC1TL:
9869         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9870         tcg_gen_andi_i32(t0, t0, 1);
9871         tcg_gen_extu_i32_tl(bcond, t0);
9872     likely:
9873         ctx->hflags |= MIPS_HFLAG_BL;
9874         break;
9875     case OPC_BC1FANY2:
9876         {
9877             TCGv_i32 t1 = tcg_temp_new_i32();
9878             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9879             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
9880             tcg_gen_nand_i32(t0, t0, t1);
9881             tcg_temp_free_i32(t1);
9882             tcg_gen_andi_i32(t0, t0, 1);
9883             tcg_gen_extu_i32_tl(bcond, t0);
9884         }
9885         goto not_likely;
9886     case OPC_BC1TANY2:
9887         {
9888             TCGv_i32 t1 = tcg_temp_new_i32();
9889             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9890             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
9891             tcg_gen_or_i32(t0, t0, t1);
9892             tcg_temp_free_i32(t1);
9893             tcg_gen_andi_i32(t0, t0, 1);
9894             tcg_gen_extu_i32_tl(bcond, t0);
9895         }
9896         goto not_likely;
9897     case OPC_BC1FANY4:
9898         {
9899             TCGv_i32 t1 = tcg_temp_new_i32();
9900             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9901             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
9902             tcg_gen_and_i32(t0, t0, t1);
9903             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
9904             tcg_gen_and_i32(t0, t0, t1);
9905             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
9906             tcg_gen_nand_i32(t0, t0, t1);
9907             tcg_temp_free_i32(t1);
9908             tcg_gen_andi_i32(t0, t0, 1);
9909             tcg_gen_extu_i32_tl(bcond, t0);
9910         }
9911         goto not_likely;
9912     case OPC_BC1TANY4:
9913         {
9914             TCGv_i32 t1 = tcg_temp_new_i32();
9915             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9916             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
9917             tcg_gen_or_i32(t0, t0, t1);
9918             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
9919             tcg_gen_or_i32(t0, t0, t1);
9920             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
9921             tcg_gen_or_i32(t0, t0, t1);
9922             tcg_temp_free_i32(t1);
9923             tcg_gen_andi_i32(t0, t0, 1);
9924             tcg_gen_extu_i32_tl(bcond, t0);
9925         }
9926     not_likely:
9927         ctx->hflags |= MIPS_HFLAG_BC;
9928         break;
9929     default:
9930         MIPS_INVAL("cp1 cond branch");
9931         generate_exception_end(ctx, EXCP_RI);
9932         goto out;
9933     }
9934     ctx->btarget = btarget;
9935     ctx->hflags |= MIPS_HFLAG_BDS32;
9936  out:
9937     tcg_temp_free_i32(t0);
9938 }
9939
9940 /* R6 CP1 Branches */
9941 static void gen_compute_branch1_r6(DisasContext *ctx, uint32_t op,
9942                                    int32_t ft, int32_t offset,
9943                                    int delayslot_size)
9944 {
9945     target_ulong btarget;
9946     TCGv_i64 t0 = tcg_temp_new_i64();
9947
9948     if (ctx->hflags & MIPS_HFLAG_BMASK) {
9949 #ifdef MIPS_DEBUG_DISAS
9950         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
9951                   "\n", ctx->base.pc_next);
9952 #endif
9953         generate_exception_end(ctx, EXCP_RI);
9954         goto out;
9955     }
9956
9957     gen_load_fpr64(ctx, t0, ft);
9958     tcg_gen_andi_i64(t0, t0, 1);
9959
9960     btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
9961
9962     switch (op) {
9963     case OPC_BC1EQZ:
9964         tcg_gen_xori_i64(t0, t0, 1);
9965         ctx->hflags |= MIPS_HFLAG_BC;
9966         break;
9967     case OPC_BC1NEZ:
9968         /* t0 already set */
9969         ctx->hflags |= MIPS_HFLAG_BC;
9970         break;
9971     default:
9972         MIPS_INVAL("cp1 cond branch");
9973         generate_exception_end(ctx, EXCP_RI);
9974         goto out;
9975     }
9976
9977     tcg_gen_trunc_i64_tl(bcond, t0);
9978
9979     ctx->btarget = btarget;
9980
9981     switch (delayslot_size) {
9982     case 2:
9983         ctx->hflags |= MIPS_HFLAG_BDS16;
9984         break;
9985     case 4:
9986         ctx->hflags |= MIPS_HFLAG_BDS32;
9987         break;
9988     }
9989
9990 out:
9991     tcg_temp_free_i64(t0);
9992 }
9993
9994 /* Coprocessor 1 (FPU) */
9995
9996 #define FOP(func, fmt) (((fmt) << 21) | (func))
9997
9998 enum fopcode {
9999     OPC_ADD_S = FOP(0, FMT_S),
10000     OPC_SUB_S = FOP(1, FMT_S),
10001     OPC_MUL_S = FOP(2, FMT_S),
10002     OPC_DIV_S = FOP(3, FMT_S),
10003     OPC_SQRT_S = FOP(4, FMT_S),
10004     OPC_ABS_S = FOP(5, FMT_S),
10005     OPC_MOV_S = FOP(6, FMT_S),
10006     OPC_NEG_S = FOP(7, FMT_S),
10007     OPC_ROUND_L_S = FOP(8, FMT_S),
10008     OPC_TRUNC_L_S = FOP(9, FMT_S),
10009     OPC_CEIL_L_S = FOP(10, FMT_S),
10010     OPC_FLOOR_L_S = FOP(11, FMT_S),
10011     OPC_ROUND_W_S = FOP(12, FMT_S),
10012     OPC_TRUNC_W_S = FOP(13, FMT_S),
10013     OPC_CEIL_W_S = FOP(14, FMT_S),
10014     OPC_FLOOR_W_S = FOP(15, FMT_S),
10015     OPC_SEL_S = FOP(16, FMT_S),
10016     OPC_MOVCF_S = FOP(17, FMT_S),
10017     OPC_MOVZ_S = FOP(18, FMT_S),
10018     OPC_MOVN_S = FOP(19, FMT_S),
10019     OPC_SELEQZ_S = FOP(20, FMT_S),
10020     OPC_RECIP_S = FOP(21, FMT_S),
10021     OPC_RSQRT_S = FOP(22, FMT_S),
10022     OPC_SELNEZ_S = FOP(23, FMT_S),
10023     OPC_MADDF_S = FOP(24, FMT_S),
10024     OPC_MSUBF_S = FOP(25, FMT_S),
10025     OPC_RINT_S = FOP(26, FMT_S),
10026     OPC_CLASS_S = FOP(27, FMT_S),
10027     OPC_MIN_S = FOP(28, FMT_S),
10028     OPC_RECIP2_S = FOP(28, FMT_S),
10029     OPC_MINA_S = FOP(29, FMT_S),
10030     OPC_RECIP1_S = FOP(29, FMT_S),
10031     OPC_MAX_S = FOP(30, FMT_S),
10032     OPC_RSQRT1_S = FOP(30, FMT_S),
10033     OPC_MAXA_S = FOP(31, FMT_S),
10034     OPC_RSQRT2_S = FOP(31, FMT_S),
10035     OPC_CVT_D_S = FOP(33, FMT_S),
10036     OPC_CVT_W_S = FOP(36, FMT_S),
10037     OPC_CVT_L_S = FOP(37, FMT_S),
10038     OPC_CVT_PS_S = FOP(38, FMT_S),
10039     OPC_CMP_F_S = FOP (48, FMT_S),
10040     OPC_CMP_UN_S = FOP (49, FMT_S),
10041     OPC_CMP_EQ_S = FOP (50, FMT_S),
10042     OPC_CMP_UEQ_S = FOP (51, FMT_S),
10043     OPC_CMP_OLT_S = FOP (52, FMT_S),
10044     OPC_CMP_ULT_S = FOP (53, FMT_S),
10045     OPC_CMP_OLE_S = FOP (54, FMT_S),
10046     OPC_CMP_ULE_S = FOP (55, FMT_S),
10047     OPC_CMP_SF_S = FOP (56, FMT_S),
10048     OPC_CMP_NGLE_S = FOP (57, FMT_S),
10049     OPC_CMP_SEQ_S = FOP (58, FMT_S),
10050     OPC_CMP_NGL_S = FOP (59, FMT_S),
10051     OPC_CMP_LT_S = FOP (60, FMT_S),
10052     OPC_CMP_NGE_S = FOP (61, FMT_S),
10053     OPC_CMP_LE_S = FOP (62, FMT_S),
10054     OPC_CMP_NGT_S = FOP (63, FMT_S),
10055
10056     OPC_ADD_D = FOP(0, FMT_D),
10057     OPC_SUB_D = FOP(1, FMT_D),
10058     OPC_MUL_D = FOP(2, FMT_D),
10059     OPC_DIV_D = FOP(3, FMT_D),
10060     OPC_SQRT_D = FOP(4, FMT_D),
10061     OPC_ABS_D = FOP(5, FMT_D),
10062     OPC_MOV_D = FOP(6, FMT_D),
10063     OPC_NEG_D = FOP(7, FMT_D),
10064     OPC_ROUND_L_D = FOP(8, FMT_D),
10065     OPC_TRUNC_L_D = FOP(9, FMT_D),
10066     OPC_CEIL_L_D = FOP(10, FMT_D),
10067     OPC_FLOOR_L_D = FOP(11, FMT_D),
10068     OPC_ROUND_W_D = FOP(12, FMT_D),
10069     OPC_TRUNC_W_D = FOP(13, FMT_D),
10070     OPC_CEIL_W_D = FOP(14, FMT_D),
10071     OPC_FLOOR_W_D = FOP(15, FMT_D),
10072     OPC_SEL_D = FOP(16, FMT_D),
10073     OPC_MOVCF_D = FOP(17, FMT_D),
10074     OPC_MOVZ_D = FOP(18, FMT_D),
10075     OPC_MOVN_D = FOP(19, FMT_D),
10076     OPC_SELEQZ_D = FOP(20, FMT_D),
10077     OPC_RECIP_D = FOP(21, FMT_D),
10078     OPC_RSQRT_D = FOP(22, FMT_D),
10079     OPC_SELNEZ_D = FOP(23, FMT_D),
10080     OPC_MADDF_D = FOP(24, FMT_D),
10081     OPC_MSUBF_D = FOP(25, FMT_D),
10082     OPC_RINT_D = FOP(26, FMT_D),
10083     OPC_CLASS_D = FOP(27, FMT_D),
10084     OPC_MIN_D = FOP(28, FMT_D),
10085     OPC_RECIP2_D = FOP(28, FMT_D),
10086     OPC_MINA_D = FOP(29, FMT_D),
10087     OPC_RECIP1_D = FOP(29, FMT_D),
10088     OPC_MAX_D = FOP(30, FMT_D),
10089     OPC_RSQRT1_D = FOP(30, FMT_D),
10090     OPC_MAXA_D = FOP(31, FMT_D),
10091     OPC_RSQRT2_D = FOP(31, FMT_D),
10092     OPC_CVT_S_D = FOP(32, FMT_D),
10093     OPC_CVT_W_D = FOP(36, FMT_D),
10094     OPC_CVT_L_D = FOP(37, FMT_D),
10095     OPC_CMP_F_D = FOP (48, FMT_D),
10096     OPC_CMP_UN_D = FOP (49, FMT_D),
10097     OPC_CMP_EQ_D = FOP (50, FMT_D),
10098     OPC_CMP_UEQ_D = FOP (51, FMT_D),
10099     OPC_CMP_OLT_D = FOP (52, FMT_D),
10100     OPC_CMP_ULT_D = FOP (53, FMT_D),
10101     OPC_CMP_OLE_D = FOP (54, FMT_D),
10102     OPC_CMP_ULE_D = FOP (55, FMT_D),
10103     OPC_CMP_SF_D = FOP (56, FMT_D),
10104     OPC_CMP_NGLE_D = FOP (57, FMT_D),
10105     OPC_CMP_SEQ_D = FOP (58, FMT_D),
10106     OPC_CMP_NGL_D = FOP (59, FMT_D),
10107     OPC_CMP_LT_D = FOP (60, FMT_D),
10108     OPC_CMP_NGE_D = FOP (61, FMT_D),
10109     OPC_CMP_LE_D = FOP (62, FMT_D),
10110     OPC_CMP_NGT_D = FOP (63, FMT_D),
10111
10112     OPC_CVT_S_W = FOP(32, FMT_W),
10113     OPC_CVT_D_W = FOP(33, FMT_W),
10114     OPC_CVT_S_L = FOP(32, FMT_L),
10115     OPC_CVT_D_L = FOP(33, FMT_L),
10116     OPC_CVT_PS_PW = FOP(38, FMT_W),
10117
10118     OPC_ADD_PS = FOP(0, FMT_PS),
10119     OPC_SUB_PS = FOP(1, FMT_PS),
10120     OPC_MUL_PS = FOP(2, FMT_PS),
10121     OPC_DIV_PS = FOP(3, FMT_PS),
10122     OPC_ABS_PS = FOP(5, FMT_PS),
10123     OPC_MOV_PS = FOP(6, FMT_PS),
10124     OPC_NEG_PS = FOP(7, FMT_PS),
10125     OPC_MOVCF_PS = FOP(17, FMT_PS),
10126     OPC_MOVZ_PS = FOP(18, FMT_PS),
10127     OPC_MOVN_PS = FOP(19, FMT_PS),
10128     OPC_ADDR_PS = FOP(24, FMT_PS),
10129     OPC_MULR_PS = FOP(26, FMT_PS),
10130     OPC_RECIP2_PS = FOP(28, FMT_PS),
10131     OPC_RECIP1_PS = FOP(29, FMT_PS),
10132     OPC_RSQRT1_PS = FOP(30, FMT_PS),
10133     OPC_RSQRT2_PS = FOP(31, FMT_PS),
10134
10135     OPC_CVT_S_PU = FOP(32, FMT_PS),
10136     OPC_CVT_PW_PS = FOP(36, FMT_PS),
10137     OPC_CVT_S_PL = FOP(40, FMT_PS),
10138     OPC_PLL_PS = FOP(44, FMT_PS),
10139     OPC_PLU_PS = FOP(45, FMT_PS),
10140     OPC_PUL_PS = FOP(46, FMT_PS),
10141     OPC_PUU_PS = FOP(47, FMT_PS),
10142     OPC_CMP_F_PS = FOP (48, FMT_PS),
10143     OPC_CMP_UN_PS = FOP (49, FMT_PS),
10144     OPC_CMP_EQ_PS = FOP (50, FMT_PS),
10145     OPC_CMP_UEQ_PS = FOP (51, FMT_PS),
10146     OPC_CMP_OLT_PS = FOP (52, FMT_PS),
10147     OPC_CMP_ULT_PS = FOP (53, FMT_PS),
10148     OPC_CMP_OLE_PS = FOP (54, FMT_PS),
10149     OPC_CMP_ULE_PS = FOP (55, FMT_PS),
10150     OPC_CMP_SF_PS = FOP (56, FMT_PS),
10151     OPC_CMP_NGLE_PS = FOP (57, FMT_PS),
10152     OPC_CMP_SEQ_PS = FOP (58, FMT_PS),
10153     OPC_CMP_NGL_PS = FOP (59, FMT_PS),
10154     OPC_CMP_LT_PS = FOP (60, FMT_PS),
10155     OPC_CMP_NGE_PS = FOP (61, FMT_PS),
10156     OPC_CMP_LE_PS = FOP (62, FMT_PS),
10157     OPC_CMP_NGT_PS = FOP (63, FMT_PS),
10158 };
10159
10160 enum r6_f_cmp_op {
10161     R6_OPC_CMP_AF_S   = FOP(0, FMT_W),
10162     R6_OPC_CMP_UN_S   = FOP(1, FMT_W),
10163     R6_OPC_CMP_EQ_S   = FOP(2, FMT_W),
10164     R6_OPC_CMP_UEQ_S  = FOP(3, FMT_W),
10165     R6_OPC_CMP_LT_S   = FOP(4, FMT_W),
10166     R6_OPC_CMP_ULT_S  = FOP(5, FMT_W),
10167     R6_OPC_CMP_LE_S   = FOP(6, FMT_W),
10168     R6_OPC_CMP_ULE_S  = FOP(7, FMT_W),
10169     R6_OPC_CMP_SAF_S  = FOP(8, FMT_W),
10170     R6_OPC_CMP_SUN_S  = FOP(9, FMT_W),
10171     R6_OPC_CMP_SEQ_S  = FOP(10, FMT_W),
10172     R6_OPC_CMP_SEUQ_S = FOP(11, FMT_W),
10173     R6_OPC_CMP_SLT_S  = FOP(12, FMT_W),
10174     R6_OPC_CMP_SULT_S = FOP(13, FMT_W),
10175     R6_OPC_CMP_SLE_S  = FOP(14, FMT_W),
10176     R6_OPC_CMP_SULE_S = FOP(15, FMT_W),
10177     R6_OPC_CMP_OR_S   = FOP(17, FMT_W),
10178     R6_OPC_CMP_UNE_S  = FOP(18, FMT_W),
10179     R6_OPC_CMP_NE_S   = FOP(19, FMT_W),
10180     R6_OPC_CMP_SOR_S  = FOP(25, FMT_W),
10181     R6_OPC_CMP_SUNE_S = FOP(26, FMT_W),
10182     R6_OPC_CMP_SNE_S  = FOP(27, FMT_W),
10183
10184     R6_OPC_CMP_AF_D   = FOP(0, FMT_L),
10185     R6_OPC_CMP_UN_D   = FOP(1, FMT_L),
10186     R6_OPC_CMP_EQ_D   = FOP(2, FMT_L),
10187     R6_OPC_CMP_UEQ_D  = FOP(3, FMT_L),
10188     R6_OPC_CMP_LT_D   = FOP(4, FMT_L),
10189     R6_OPC_CMP_ULT_D  = FOP(5, FMT_L),
10190     R6_OPC_CMP_LE_D   = FOP(6, FMT_L),
10191     R6_OPC_CMP_ULE_D  = FOP(7, FMT_L),
10192     R6_OPC_CMP_SAF_D  = FOP(8, FMT_L),
10193     R6_OPC_CMP_SUN_D  = FOP(9, FMT_L),
10194     R6_OPC_CMP_SEQ_D  = FOP(10, FMT_L),
10195     R6_OPC_CMP_SEUQ_D = FOP(11, FMT_L),
10196     R6_OPC_CMP_SLT_D  = FOP(12, FMT_L),
10197     R6_OPC_CMP_SULT_D = FOP(13, FMT_L),
10198     R6_OPC_CMP_SLE_D  = FOP(14, FMT_L),
10199     R6_OPC_CMP_SULE_D = FOP(15, FMT_L),
10200     R6_OPC_CMP_OR_D   = FOP(17, FMT_L),
10201     R6_OPC_CMP_UNE_D  = FOP(18, FMT_L),
10202     R6_OPC_CMP_NE_D   = FOP(19, FMT_L),
10203     R6_OPC_CMP_SOR_D  = FOP(25, FMT_L),
10204     R6_OPC_CMP_SUNE_D = FOP(26, FMT_L),
10205     R6_OPC_CMP_SNE_D  = FOP(27, FMT_L),
10206 };
10207 static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
10208 {
10209     TCGv t0 = tcg_temp_new();
10210
10211     switch (opc) {
10212     case OPC_MFC1:
10213         {
10214             TCGv_i32 fp0 = tcg_temp_new_i32();
10215
10216             gen_load_fpr32(ctx, fp0, fs);
10217             tcg_gen_ext_i32_tl(t0, fp0);
10218             tcg_temp_free_i32(fp0);
10219         }
10220         gen_store_gpr(t0, rt);
10221         break;
10222     case OPC_MTC1:
10223         gen_load_gpr(t0, rt);
10224         {
10225             TCGv_i32 fp0 = tcg_temp_new_i32();
10226
10227             tcg_gen_trunc_tl_i32(fp0, t0);
10228             gen_store_fpr32(ctx, fp0, fs);
10229             tcg_temp_free_i32(fp0);
10230         }
10231         break;
10232     case OPC_CFC1:
10233         gen_helper_1e0i(cfc1, t0, fs);
10234         gen_store_gpr(t0, rt);
10235         break;
10236     case OPC_CTC1:
10237         gen_load_gpr(t0, rt);
10238         save_cpu_state(ctx, 0);
10239         {
10240             TCGv_i32 fs_tmp = tcg_const_i32(fs);
10241
10242             gen_helper_0e2i(ctc1, t0, fs_tmp, rt);
10243             tcg_temp_free_i32(fs_tmp);
10244         }
10245         /* Stop translation as we may have changed hflags */
10246         ctx->base.is_jmp = DISAS_STOP;
10247         break;
10248 #if defined(TARGET_MIPS64)
10249     case OPC_DMFC1:
10250         gen_load_fpr64(ctx, t0, fs);
10251         gen_store_gpr(t0, rt);
10252         break;
10253     case OPC_DMTC1:
10254         gen_load_gpr(t0, rt);
10255         gen_store_fpr64(ctx, t0, fs);
10256         break;
10257 #endif
10258     case OPC_MFHC1:
10259         {
10260             TCGv_i32 fp0 = tcg_temp_new_i32();
10261
10262             gen_load_fpr32h(ctx, fp0, fs);
10263             tcg_gen_ext_i32_tl(t0, fp0);
10264             tcg_temp_free_i32(fp0);
10265         }
10266         gen_store_gpr(t0, rt);
10267         break;
10268     case OPC_MTHC1:
10269         gen_load_gpr(t0, rt);
10270         {
10271             TCGv_i32 fp0 = tcg_temp_new_i32();
10272
10273             tcg_gen_trunc_tl_i32(fp0, t0);
10274             gen_store_fpr32h(ctx, fp0, fs);
10275             tcg_temp_free_i32(fp0);
10276         }
10277         break;
10278     default:
10279         MIPS_INVAL("cp1 move");
10280         generate_exception_end(ctx, EXCP_RI);
10281         goto out;
10282     }
10283
10284  out:
10285     tcg_temp_free(t0);
10286 }
10287
10288 static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
10289 {
10290     TCGLabel *l1;
10291     TCGCond cond;
10292     TCGv_i32 t0;
10293
10294     if (rd == 0) {
10295         /* Treat as NOP. */
10296         return;
10297     }
10298
10299     if (tf)
10300         cond = TCG_COND_EQ;
10301     else
10302         cond = TCG_COND_NE;
10303
10304     l1 = gen_new_label();
10305     t0 = tcg_temp_new_i32();
10306     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
10307     tcg_gen_brcondi_i32(cond, t0, 0, l1);
10308     tcg_temp_free_i32(t0);
10309     if (rs == 0) {
10310         tcg_gen_movi_tl(cpu_gpr[rd], 0);
10311     } else {
10312         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
10313     }
10314     gen_set_label(l1);
10315 }
10316
10317 static inline void gen_movcf_s(DisasContext *ctx, int fs, int fd, int cc,
10318                                int tf)
10319 {
10320     int cond;
10321     TCGv_i32 t0 = tcg_temp_new_i32();
10322     TCGLabel *l1 = gen_new_label();
10323
10324     if (tf)
10325         cond = TCG_COND_EQ;
10326     else
10327         cond = TCG_COND_NE;
10328
10329     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
10330     tcg_gen_brcondi_i32(cond, t0, 0, l1);
10331     gen_load_fpr32(ctx, t0, fs);
10332     gen_store_fpr32(ctx, t0, fd);
10333     gen_set_label(l1);
10334     tcg_temp_free_i32(t0);
10335 }
10336
10337 static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf)
10338 {
10339     int cond;
10340     TCGv_i32 t0 = tcg_temp_new_i32();
10341     TCGv_i64 fp0;
10342     TCGLabel *l1 = gen_new_label();
10343
10344     if (tf)
10345         cond = TCG_COND_EQ;
10346     else
10347         cond = TCG_COND_NE;
10348
10349     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
10350     tcg_gen_brcondi_i32(cond, t0, 0, l1);
10351     tcg_temp_free_i32(t0);
10352     fp0 = tcg_temp_new_i64();
10353     gen_load_fpr64(ctx, fp0, fs);
10354     gen_store_fpr64(ctx, fp0, fd);
10355     tcg_temp_free_i64(fp0);
10356     gen_set_label(l1);
10357 }
10358
10359 static inline void gen_movcf_ps(DisasContext *ctx, int fs, int fd,
10360                                 int cc, int tf)
10361 {
10362     int cond;
10363     TCGv_i32 t0 = tcg_temp_new_i32();
10364     TCGLabel *l1 = gen_new_label();
10365     TCGLabel *l2 = gen_new_label();
10366
10367     if (tf)
10368         cond = TCG_COND_EQ;
10369     else
10370         cond = TCG_COND_NE;
10371
10372     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
10373     tcg_gen_brcondi_i32(cond, t0, 0, l1);
10374     gen_load_fpr32(ctx, t0, fs);
10375     gen_store_fpr32(ctx, t0, fd);
10376     gen_set_label(l1);
10377
10378     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc+1));
10379     tcg_gen_brcondi_i32(cond, t0, 0, l2);
10380     gen_load_fpr32h(ctx, t0, fs);
10381     gen_store_fpr32h(ctx, t0, fd);
10382     tcg_temp_free_i32(t0);
10383     gen_set_label(l2);
10384 }
10385
10386 static void gen_sel_s(DisasContext *ctx, enum fopcode op1, int fd, int ft,
10387                       int fs)
10388 {
10389     TCGv_i32 t1 = tcg_const_i32(0);
10390     TCGv_i32 fp0 = tcg_temp_new_i32();
10391     TCGv_i32 fp1 = tcg_temp_new_i32();
10392     TCGv_i32 fp2 = tcg_temp_new_i32();
10393     gen_load_fpr32(ctx, fp0, fd);
10394     gen_load_fpr32(ctx, fp1, ft);
10395     gen_load_fpr32(ctx, fp2, fs);
10396
10397     switch (op1) {
10398     case OPC_SEL_S:
10399         tcg_gen_andi_i32(fp0, fp0, 1);
10400         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
10401         break;
10402     case OPC_SELEQZ_S:
10403         tcg_gen_andi_i32(fp1, fp1, 1);
10404         tcg_gen_movcond_i32(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
10405         break;
10406     case OPC_SELNEZ_S:
10407         tcg_gen_andi_i32(fp1, fp1, 1);
10408         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
10409         break;
10410     default:
10411         MIPS_INVAL("gen_sel_s");
10412         generate_exception_end(ctx, EXCP_RI);
10413         break;
10414     }
10415
10416     gen_store_fpr32(ctx, fp0, fd);
10417     tcg_temp_free_i32(fp2);
10418     tcg_temp_free_i32(fp1);
10419     tcg_temp_free_i32(fp0);
10420     tcg_temp_free_i32(t1);
10421 }
10422
10423 static void gen_sel_d(DisasContext *ctx, enum fopcode op1, int fd, int ft,
10424                       int fs)
10425 {
10426     TCGv_i64 t1 = tcg_const_i64(0);
10427     TCGv_i64 fp0 = tcg_temp_new_i64();
10428     TCGv_i64 fp1 = tcg_temp_new_i64();
10429     TCGv_i64 fp2 = tcg_temp_new_i64();
10430     gen_load_fpr64(ctx, fp0, fd);
10431     gen_load_fpr64(ctx, fp1, ft);
10432     gen_load_fpr64(ctx, fp2, fs);
10433
10434     switch (op1) {
10435     case OPC_SEL_D:
10436         tcg_gen_andi_i64(fp0, fp0, 1);
10437         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
10438         break;
10439     case OPC_SELEQZ_D:
10440         tcg_gen_andi_i64(fp1, fp1, 1);
10441         tcg_gen_movcond_i64(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
10442         break;
10443     case OPC_SELNEZ_D:
10444         tcg_gen_andi_i64(fp1, fp1, 1);
10445         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
10446         break;
10447     default:
10448         MIPS_INVAL("gen_sel_d");
10449         generate_exception_end(ctx, EXCP_RI);
10450         break;
10451     }
10452
10453     gen_store_fpr64(ctx, fp0, fd);
10454     tcg_temp_free_i64(fp2);
10455     tcg_temp_free_i64(fp1);
10456     tcg_temp_free_i64(fp0);
10457     tcg_temp_free_i64(t1);
10458 }
10459
10460 static void gen_farith (DisasContext *ctx, enum fopcode op1,
10461                         int ft, int fs, int fd, int cc)
10462 {
10463     uint32_t func = ctx->opcode & 0x3f;
10464     switch (op1) {
10465     case OPC_ADD_S:
10466         {
10467             TCGv_i32 fp0 = tcg_temp_new_i32();
10468             TCGv_i32 fp1 = tcg_temp_new_i32();
10469
10470             gen_load_fpr32(ctx, fp0, fs);
10471             gen_load_fpr32(ctx, fp1, ft);
10472             gen_helper_float_add_s(fp0, cpu_env, fp0, fp1);
10473             tcg_temp_free_i32(fp1);
10474             gen_store_fpr32(ctx, fp0, fd);
10475             tcg_temp_free_i32(fp0);
10476         }
10477         break;
10478     case OPC_SUB_S:
10479         {
10480             TCGv_i32 fp0 = tcg_temp_new_i32();
10481             TCGv_i32 fp1 = tcg_temp_new_i32();
10482
10483             gen_load_fpr32(ctx, fp0, fs);
10484             gen_load_fpr32(ctx, fp1, ft);
10485             gen_helper_float_sub_s(fp0, cpu_env, fp0, fp1);
10486             tcg_temp_free_i32(fp1);
10487             gen_store_fpr32(ctx, fp0, fd);
10488             tcg_temp_free_i32(fp0);
10489         }
10490         break;
10491     case OPC_MUL_S:
10492         {
10493             TCGv_i32 fp0 = tcg_temp_new_i32();
10494             TCGv_i32 fp1 = tcg_temp_new_i32();
10495
10496             gen_load_fpr32(ctx, fp0, fs);
10497             gen_load_fpr32(ctx, fp1, ft);
10498             gen_helper_float_mul_s(fp0, cpu_env, fp0, fp1);
10499             tcg_temp_free_i32(fp1);
10500             gen_store_fpr32(ctx, fp0, fd);
10501             tcg_temp_free_i32(fp0);
10502         }
10503         break;
10504     case OPC_DIV_S:
10505         {
10506             TCGv_i32 fp0 = tcg_temp_new_i32();
10507             TCGv_i32 fp1 = tcg_temp_new_i32();
10508
10509             gen_load_fpr32(ctx, fp0, fs);
10510             gen_load_fpr32(ctx, fp1, ft);
10511             gen_helper_float_div_s(fp0, cpu_env, fp0, fp1);
10512             tcg_temp_free_i32(fp1);
10513             gen_store_fpr32(ctx, fp0, fd);
10514             tcg_temp_free_i32(fp0);
10515         }
10516         break;
10517     case OPC_SQRT_S:
10518         {
10519             TCGv_i32 fp0 = tcg_temp_new_i32();
10520
10521             gen_load_fpr32(ctx, fp0, fs);
10522             gen_helper_float_sqrt_s(fp0, cpu_env, fp0);
10523             gen_store_fpr32(ctx, fp0, fd);
10524             tcg_temp_free_i32(fp0);
10525         }
10526         break;
10527     case OPC_ABS_S:
10528         {
10529             TCGv_i32 fp0 = tcg_temp_new_i32();
10530
10531             gen_load_fpr32(ctx, fp0, fs);
10532             if (ctx->abs2008) {
10533                 tcg_gen_andi_i32(fp0, fp0, 0x7fffffffUL);
10534             } else {
10535                 gen_helper_float_abs_s(fp0, fp0);
10536             }
10537             gen_store_fpr32(ctx, fp0, fd);
10538             tcg_temp_free_i32(fp0);
10539         }
10540         break;
10541     case OPC_MOV_S:
10542         {
10543             TCGv_i32 fp0 = tcg_temp_new_i32();
10544
10545             gen_load_fpr32(ctx, fp0, fs);
10546             gen_store_fpr32(ctx, fp0, fd);
10547             tcg_temp_free_i32(fp0);
10548         }
10549         break;
10550     case OPC_NEG_S:
10551         {
10552             TCGv_i32 fp0 = tcg_temp_new_i32();
10553
10554             gen_load_fpr32(ctx, fp0, fs);
10555             if (ctx->abs2008) {
10556                 tcg_gen_xori_i32(fp0, fp0, 1UL << 31);
10557             } else {
10558                 gen_helper_float_chs_s(fp0, fp0);
10559             }
10560             gen_store_fpr32(ctx, fp0, fd);
10561             tcg_temp_free_i32(fp0);
10562         }
10563         break;
10564     case OPC_ROUND_L_S:
10565         check_cp1_64bitmode(ctx);
10566         {
10567             TCGv_i32 fp32 = tcg_temp_new_i32();
10568             TCGv_i64 fp64 = tcg_temp_new_i64();
10569
10570             gen_load_fpr32(ctx, fp32, fs);
10571             if (ctx->nan2008) {
10572                 gen_helper_float_round_2008_l_s(fp64, cpu_env, fp32);
10573             } else {
10574                 gen_helper_float_round_l_s(fp64, cpu_env, fp32);
10575             }
10576             tcg_temp_free_i32(fp32);
10577             gen_store_fpr64(ctx, fp64, fd);
10578             tcg_temp_free_i64(fp64);
10579         }
10580         break;
10581     case OPC_TRUNC_L_S:
10582         check_cp1_64bitmode(ctx);
10583         {
10584             TCGv_i32 fp32 = tcg_temp_new_i32();
10585             TCGv_i64 fp64 = tcg_temp_new_i64();
10586
10587             gen_load_fpr32(ctx, fp32, fs);
10588             if (ctx->nan2008) {
10589                 gen_helper_float_trunc_2008_l_s(fp64, cpu_env, fp32);
10590             } else {
10591                 gen_helper_float_trunc_l_s(fp64, cpu_env, fp32);
10592             }
10593             tcg_temp_free_i32(fp32);
10594             gen_store_fpr64(ctx, fp64, fd);
10595             tcg_temp_free_i64(fp64);
10596         }
10597         break;
10598     case OPC_CEIL_L_S:
10599         check_cp1_64bitmode(ctx);
10600         {
10601             TCGv_i32 fp32 = tcg_temp_new_i32();
10602             TCGv_i64 fp64 = tcg_temp_new_i64();
10603
10604             gen_load_fpr32(ctx, fp32, fs);
10605             if (ctx->nan2008) {
10606                 gen_helper_float_ceil_2008_l_s(fp64, cpu_env, fp32);
10607             } else {
10608                 gen_helper_float_ceil_l_s(fp64, cpu_env, fp32);
10609             }
10610             tcg_temp_free_i32(fp32);
10611             gen_store_fpr64(ctx, fp64, fd);
10612             tcg_temp_free_i64(fp64);
10613         }
10614         break;
10615     case OPC_FLOOR_L_S:
10616         check_cp1_64bitmode(ctx);
10617         {
10618             TCGv_i32 fp32 = tcg_temp_new_i32();
10619             TCGv_i64 fp64 = tcg_temp_new_i64();
10620
10621             gen_load_fpr32(ctx, fp32, fs);
10622             if (ctx->nan2008) {
10623                 gen_helper_float_floor_2008_l_s(fp64, cpu_env, fp32);
10624             } else {
10625                 gen_helper_float_floor_l_s(fp64, cpu_env, fp32);
10626             }
10627             tcg_temp_free_i32(fp32);
10628             gen_store_fpr64(ctx, fp64, fd);
10629             tcg_temp_free_i64(fp64);
10630         }
10631         break;
10632     case OPC_ROUND_W_S:
10633         {
10634             TCGv_i32 fp0 = tcg_temp_new_i32();
10635
10636             gen_load_fpr32(ctx, fp0, fs);
10637             if (ctx->nan2008) {
10638                 gen_helper_float_round_2008_w_s(fp0, cpu_env, fp0);
10639             } else {
10640                 gen_helper_float_round_w_s(fp0, cpu_env, fp0);
10641             }
10642             gen_store_fpr32(ctx, fp0, fd);
10643             tcg_temp_free_i32(fp0);
10644         }
10645         break;
10646     case OPC_TRUNC_W_S:
10647         {
10648             TCGv_i32 fp0 = tcg_temp_new_i32();
10649
10650             gen_load_fpr32(ctx, fp0, fs);
10651             if (ctx->nan2008) {
10652                 gen_helper_float_trunc_2008_w_s(fp0, cpu_env, fp0);
10653             } else {
10654                 gen_helper_float_trunc_w_s(fp0, cpu_env, fp0);
10655             }
10656             gen_store_fpr32(ctx, fp0, fd);
10657             tcg_temp_free_i32(fp0);
10658         }
10659         break;
10660     case OPC_CEIL_W_S:
10661         {
10662             TCGv_i32 fp0 = tcg_temp_new_i32();
10663
10664             gen_load_fpr32(ctx, fp0, fs);
10665             if (ctx->nan2008) {
10666                 gen_helper_float_ceil_2008_w_s(fp0, cpu_env, fp0);
10667             } else {
10668                 gen_helper_float_ceil_w_s(fp0, cpu_env, fp0);
10669             }
10670             gen_store_fpr32(ctx, fp0, fd);
10671             tcg_temp_free_i32(fp0);
10672         }
10673         break;
10674     case OPC_FLOOR_W_S:
10675         {
10676             TCGv_i32 fp0 = tcg_temp_new_i32();
10677
10678             gen_load_fpr32(ctx, fp0, fs);
10679             if (ctx->nan2008) {
10680                 gen_helper_float_floor_2008_w_s(fp0, cpu_env, fp0);
10681             } else {
10682                 gen_helper_float_floor_w_s(fp0, cpu_env, fp0);
10683             }
10684             gen_store_fpr32(ctx, fp0, fd);
10685             tcg_temp_free_i32(fp0);
10686         }
10687         break;
10688     case OPC_SEL_S:
10689         check_insn(ctx, ISA_MIPS32R6);
10690         gen_sel_s(ctx, op1, fd, ft, fs);
10691         break;
10692     case OPC_SELEQZ_S:
10693         check_insn(ctx, ISA_MIPS32R6);
10694         gen_sel_s(ctx, op1, fd, ft, fs);
10695         break;
10696     case OPC_SELNEZ_S:
10697         check_insn(ctx, ISA_MIPS32R6);
10698         gen_sel_s(ctx, op1, fd, ft, fs);
10699         break;
10700     case OPC_MOVCF_S:
10701         check_insn_opc_removed(ctx, ISA_MIPS32R6);
10702         gen_movcf_s(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
10703         break;
10704     case OPC_MOVZ_S:
10705         check_insn_opc_removed(ctx, ISA_MIPS32R6);
10706         {
10707             TCGLabel *l1 = gen_new_label();
10708             TCGv_i32 fp0;
10709
10710             if (ft != 0) {
10711                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
10712             }
10713             fp0 = tcg_temp_new_i32();
10714             gen_load_fpr32(ctx, fp0, fs);
10715             gen_store_fpr32(ctx, fp0, fd);
10716             tcg_temp_free_i32(fp0);
10717             gen_set_label(l1);
10718         }
10719         break;
10720     case OPC_MOVN_S:
10721         check_insn_opc_removed(ctx, ISA_MIPS32R6);
10722         {
10723             TCGLabel *l1 = gen_new_label();
10724             TCGv_i32 fp0;
10725
10726             if (ft != 0) {
10727                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
10728                 fp0 = tcg_temp_new_i32();
10729                 gen_load_fpr32(ctx, fp0, fs);
10730                 gen_store_fpr32(ctx, fp0, fd);
10731                 tcg_temp_free_i32(fp0);
10732                 gen_set_label(l1);
10733             }
10734         }
10735         break;
10736     case OPC_RECIP_S:
10737         {
10738             TCGv_i32 fp0 = tcg_temp_new_i32();
10739
10740             gen_load_fpr32(ctx, fp0, fs);
10741             gen_helper_float_recip_s(fp0, cpu_env, fp0);
10742             gen_store_fpr32(ctx, fp0, fd);
10743             tcg_temp_free_i32(fp0);
10744         }
10745         break;
10746     case OPC_RSQRT_S:
10747         {
10748             TCGv_i32 fp0 = tcg_temp_new_i32();
10749
10750             gen_load_fpr32(ctx, fp0, fs);
10751             gen_helper_float_rsqrt_s(fp0, cpu_env, fp0);
10752             gen_store_fpr32(ctx, fp0, fd);
10753             tcg_temp_free_i32(fp0);
10754         }
10755         break;
10756     case OPC_MADDF_S:
10757         check_insn(ctx, ISA_MIPS32R6);
10758         {
10759             TCGv_i32 fp0 = tcg_temp_new_i32();
10760             TCGv_i32 fp1 = tcg_temp_new_i32();
10761             TCGv_i32 fp2 = tcg_temp_new_i32();
10762             gen_load_fpr32(ctx, fp0, fs);
10763             gen_load_fpr32(ctx, fp1, ft);
10764             gen_load_fpr32(ctx, fp2, fd);
10765             gen_helper_float_maddf_s(fp2, cpu_env, fp0, fp1, fp2);
10766             gen_store_fpr32(ctx, fp2, fd);
10767             tcg_temp_free_i32(fp2);
10768             tcg_temp_free_i32(fp1);
10769             tcg_temp_free_i32(fp0);
10770         }
10771         break;
10772     case OPC_MSUBF_S:
10773         check_insn(ctx, ISA_MIPS32R6);
10774         {
10775             TCGv_i32 fp0 = tcg_temp_new_i32();
10776             TCGv_i32 fp1 = tcg_temp_new_i32();
10777             TCGv_i32 fp2 = tcg_temp_new_i32();
10778             gen_load_fpr32(ctx, fp0, fs);
10779             gen_load_fpr32(ctx, fp1, ft);
10780             gen_load_fpr32(ctx, fp2, fd);
10781             gen_helper_float_msubf_s(fp2, cpu_env, fp0, fp1, fp2);
10782             gen_store_fpr32(ctx, fp2, fd);
10783             tcg_temp_free_i32(fp2);
10784             tcg_temp_free_i32(fp1);
10785             tcg_temp_free_i32(fp0);
10786         }
10787         break;
10788     case OPC_RINT_S:
10789         check_insn(ctx, ISA_MIPS32R6);
10790         {
10791             TCGv_i32 fp0 = tcg_temp_new_i32();
10792             gen_load_fpr32(ctx, fp0, fs);
10793             gen_helper_float_rint_s(fp0, cpu_env, fp0);
10794             gen_store_fpr32(ctx, fp0, fd);
10795             tcg_temp_free_i32(fp0);
10796         }
10797         break;
10798     case OPC_CLASS_S:
10799         check_insn(ctx, ISA_MIPS32R6);
10800         {
10801             TCGv_i32 fp0 = tcg_temp_new_i32();
10802             gen_load_fpr32(ctx, fp0, fs);
10803             gen_helper_float_class_s(fp0, cpu_env, fp0);
10804             gen_store_fpr32(ctx, fp0, fd);
10805             tcg_temp_free_i32(fp0);
10806         }
10807         break;
10808     case OPC_MIN_S: /* OPC_RECIP2_S */
10809         if (ctx->insn_flags & ISA_MIPS32R6) {
10810             /* OPC_MIN_S */
10811             TCGv_i32 fp0 = tcg_temp_new_i32();
10812             TCGv_i32 fp1 = tcg_temp_new_i32();
10813             TCGv_i32 fp2 = tcg_temp_new_i32();
10814             gen_load_fpr32(ctx, fp0, fs);
10815             gen_load_fpr32(ctx, fp1, ft);
10816             gen_helper_float_min_s(fp2, cpu_env, fp0, fp1);
10817             gen_store_fpr32(ctx, fp2, fd);
10818             tcg_temp_free_i32(fp2);
10819             tcg_temp_free_i32(fp1);
10820             tcg_temp_free_i32(fp0);
10821         } else {
10822             /* OPC_RECIP2_S */
10823             check_cp1_64bitmode(ctx);
10824             {
10825                 TCGv_i32 fp0 = tcg_temp_new_i32();
10826                 TCGv_i32 fp1 = tcg_temp_new_i32();
10827
10828                 gen_load_fpr32(ctx, fp0, fs);
10829                 gen_load_fpr32(ctx, fp1, ft);
10830                 gen_helper_float_recip2_s(fp0, cpu_env, fp0, fp1);
10831                 tcg_temp_free_i32(fp1);
10832                 gen_store_fpr32(ctx, fp0, fd);
10833                 tcg_temp_free_i32(fp0);
10834             }
10835         }
10836         break;
10837     case OPC_MINA_S: /* OPC_RECIP1_S */
10838         if (ctx->insn_flags & ISA_MIPS32R6) {
10839             /* OPC_MINA_S */
10840             TCGv_i32 fp0 = tcg_temp_new_i32();
10841             TCGv_i32 fp1 = tcg_temp_new_i32();
10842             TCGv_i32 fp2 = tcg_temp_new_i32();
10843             gen_load_fpr32(ctx, fp0, fs);
10844             gen_load_fpr32(ctx, fp1, ft);
10845             gen_helper_float_mina_s(fp2, cpu_env, fp0, fp1);
10846             gen_store_fpr32(ctx, fp2, fd);
10847             tcg_temp_free_i32(fp2);
10848             tcg_temp_free_i32(fp1);
10849             tcg_temp_free_i32(fp0);
10850         } else {
10851             /* OPC_RECIP1_S */
10852             check_cp1_64bitmode(ctx);
10853             {
10854                 TCGv_i32 fp0 = tcg_temp_new_i32();
10855
10856                 gen_load_fpr32(ctx, fp0, fs);
10857                 gen_helper_float_recip1_s(fp0, cpu_env, fp0);
10858                 gen_store_fpr32(ctx, fp0, fd);
10859                 tcg_temp_free_i32(fp0);
10860             }
10861         }
10862         break;
10863     case OPC_MAX_S: /* OPC_RSQRT1_S */
10864         if (ctx->insn_flags & ISA_MIPS32R6) {
10865             /* OPC_MAX_S */
10866             TCGv_i32 fp0 = tcg_temp_new_i32();
10867             TCGv_i32 fp1 = tcg_temp_new_i32();
10868             gen_load_fpr32(ctx, fp0, fs);
10869             gen_load_fpr32(ctx, fp1, ft);
10870             gen_helper_float_max_s(fp1, cpu_env, fp0, fp1);
10871             gen_store_fpr32(ctx, fp1, fd);
10872             tcg_temp_free_i32(fp1);
10873             tcg_temp_free_i32(fp0);
10874         } else {
10875             /* OPC_RSQRT1_S */
10876             check_cp1_64bitmode(ctx);
10877             {
10878                 TCGv_i32 fp0 = tcg_temp_new_i32();
10879
10880                 gen_load_fpr32(ctx, fp0, fs);
10881                 gen_helper_float_rsqrt1_s(fp0, cpu_env, fp0);
10882                 gen_store_fpr32(ctx, fp0, fd);
10883                 tcg_temp_free_i32(fp0);
10884             }
10885         }
10886         break;
10887     case OPC_MAXA_S: /* OPC_RSQRT2_S */
10888         if (ctx->insn_flags & ISA_MIPS32R6) {
10889             /* OPC_MAXA_S */
10890             TCGv_i32 fp0 = tcg_temp_new_i32();
10891             TCGv_i32 fp1 = tcg_temp_new_i32();
10892             gen_load_fpr32(ctx, fp0, fs);
10893             gen_load_fpr32(ctx, fp1, ft);
10894             gen_helper_float_maxa_s(fp1, cpu_env, fp0, fp1);
10895             gen_store_fpr32(ctx, fp1, fd);
10896             tcg_temp_free_i32(fp1);
10897             tcg_temp_free_i32(fp0);
10898         } else {
10899             /* OPC_RSQRT2_S */
10900             check_cp1_64bitmode(ctx);
10901             {
10902                 TCGv_i32 fp0 = tcg_temp_new_i32();
10903                 TCGv_i32 fp1 = tcg_temp_new_i32();
10904
10905                 gen_load_fpr32(ctx, fp0, fs);
10906                 gen_load_fpr32(ctx, fp1, ft);
10907                 gen_helper_float_rsqrt2_s(fp0, cpu_env, fp0, fp1);
10908                 tcg_temp_free_i32(fp1);
10909                 gen_store_fpr32(ctx, fp0, fd);
10910                 tcg_temp_free_i32(fp0);
10911             }
10912         }
10913         break;
10914     case OPC_CVT_D_S:
10915         check_cp1_registers(ctx, fd);
10916         {
10917             TCGv_i32 fp32 = tcg_temp_new_i32();
10918             TCGv_i64 fp64 = tcg_temp_new_i64();
10919
10920             gen_load_fpr32(ctx, fp32, fs);
10921             gen_helper_float_cvtd_s(fp64, cpu_env, fp32);
10922             tcg_temp_free_i32(fp32);
10923             gen_store_fpr64(ctx, fp64, fd);
10924             tcg_temp_free_i64(fp64);
10925         }
10926         break;
10927     case OPC_CVT_W_S:
10928         {
10929             TCGv_i32 fp0 = tcg_temp_new_i32();
10930
10931             gen_load_fpr32(ctx, fp0, fs);
10932             if (ctx->nan2008) {
10933                 gen_helper_float_cvt_2008_w_s(fp0, cpu_env, fp0);
10934             } else {
10935                 gen_helper_float_cvt_w_s(fp0, cpu_env, fp0);
10936             }
10937             gen_store_fpr32(ctx, fp0, fd);
10938             tcg_temp_free_i32(fp0);
10939         }
10940         break;
10941     case OPC_CVT_L_S:
10942         check_cp1_64bitmode(ctx);
10943         {
10944             TCGv_i32 fp32 = tcg_temp_new_i32();
10945             TCGv_i64 fp64 = tcg_temp_new_i64();
10946
10947             gen_load_fpr32(ctx, fp32, fs);
10948             if (ctx->nan2008) {
10949                 gen_helper_float_cvt_2008_l_s(fp64, cpu_env, fp32);
10950             } else {
10951                 gen_helper_float_cvt_l_s(fp64, cpu_env, fp32);
10952             }
10953             tcg_temp_free_i32(fp32);
10954             gen_store_fpr64(ctx, fp64, fd);
10955             tcg_temp_free_i64(fp64);
10956         }
10957         break;
10958     case OPC_CVT_PS_S:
10959         check_ps(ctx);
10960         {
10961             TCGv_i64 fp64 = tcg_temp_new_i64();
10962             TCGv_i32 fp32_0 = tcg_temp_new_i32();
10963             TCGv_i32 fp32_1 = tcg_temp_new_i32();
10964
10965             gen_load_fpr32(ctx, fp32_0, fs);
10966             gen_load_fpr32(ctx, fp32_1, ft);
10967             tcg_gen_concat_i32_i64(fp64, fp32_1, fp32_0);
10968             tcg_temp_free_i32(fp32_1);
10969             tcg_temp_free_i32(fp32_0);
10970             gen_store_fpr64(ctx, fp64, fd);
10971             tcg_temp_free_i64(fp64);
10972         }
10973         break;
10974     case OPC_CMP_F_S:
10975     case OPC_CMP_UN_S:
10976     case OPC_CMP_EQ_S:
10977     case OPC_CMP_UEQ_S:
10978     case OPC_CMP_OLT_S:
10979     case OPC_CMP_ULT_S:
10980     case OPC_CMP_OLE_S:
10981     case OPC_CMP_ULE_S:
10982     case OPC_CMP_SF_S:
10983     case OPC_CMP_NGLE_S:
10984     case OPC_CMP_SEQ_S:
10985     case OPC_CMP_NGL_S:
10986     case OPC_CMP_LT_S:
10987     case OPC_CMP_NGE_S:
10988     case OPC_CMP_LE_S:
10989     case OPC_CMP_NGT_S:
10990         check_insn_opc_removed(ctx, ISA_MIPS32R6);
10991         if (ctx->opcode & (1 << 6)) {
10992             gen_cmpabs_s(ctx, func-48, ft, fs, cc);
10993         } else {
10994             gen_cmp_s(ctx, func-48, ft, fs, cc);
10995         }
10996         break;
10997     case OPC_ADD_D:
10998         check_cp1_registers(ctx, fs | ft | fd);
10999         {
11000             TCGv_i64 fp0 = tcg_temp_new_i64();
11001             TCGv_i64 fp1 = tcg_temp_new_i64();
11002
11003             gen_load_fpr64(ctx, fp0, fs);
11004             gen_load_fpr64(ctx, fp1, ft);
11005             gen_helper_float_add_d(fp0, cpu_env, fp0, fp1);
11006             tcg_temp_free_i64(fp1);
11007             gen_store_fpr64(ctx, fp0, fd);
11008             tcg_temp_free_i64(fp0);
11009         }
11010         break;
11011     case OPC_SUB_D:
11012         check_cp1_registers(ctx, fs | ft | fd);
11013         {
11014             TCGv_i64 fp0 = tcg_temp_new_i64();
11015             TCGv_i64 fp1 = tcg_temp_new_i64();
11016
11017             gen_load_fpr64(ctx, fp0, fs);
11018             gen_load_fpr64(ctx, fp1, ft);
11019             gen_helper_float_sub_d(fp0, cpu_env, fp0, fp1);
11020             tcg_temp_free_i64(fp1);
11021             gen_store_fpr64(ctx, fp0, fd);
11022             tcg_temp_free_i64(fp0);
11023         }
11024         break;
11025     case OPC_MUL_D:
11026         check_cp1_registers(ctx, fs | ft | fd);
11027         {
11028             TCGv_i64 fp0 = tcg_temp_new_i64();
11029             TCGv_i64 fp1 = tcg_temp_new_i64();
11030
11031             gen_load_fpr64(ctx, fp0, fs);
11032             gen_load_fpr64(ctx, fp1, ft);
11033             gen_helper_float_mul_d(fp0, cpu_env, fp0, fp1);
11034             tcg_temp_free_i64(fp1);
11035             gen_store_fpr64(ctx, fp0, fd);
11036             tcg_temp_free_i64(fp0);
11037         }
11038         break;
11039     case OPC_DIV_D:
11040         check_cp1_registers(ctx, fs | ft | fd);
11041         {
11042             TCGv_i64 fp0 = tcg_temp_new_i64();
11043             TCGv_i64 fp1 = tcg_temp_new_i64();
11044
11045             gen_load_fpr64(ctx, fp0, fs);
11046             gen_load_fpr64(ctx, fp1, ft);
11047             gen_helper_float_div_d(fp0, cpu_env, fp0, fp1);
11048             tcg_temp_free_i64(fp1);
11049             gen_store_fpr64(ctx, fp0, fd);
11050             tcg_temp_free_i64(fp0);
11051         }
11052         break;
11053     case OPC_SQRT_D:
11054         check_cp1_registers(ctx, fs | fd);
11055         {
11056             TCGv_i64 fp0 = tcg_temp_new_i64();
11057
11058             gen_load_fpr64(ctx, fp0, fs);
11059             gen_helper_float_sqrt_d(fp0, cpu_env, fp0);
11060             gen_store_fpr64(ctx, fp0, fd);
11061             tcg_temp_free_i64(fp0);
11062         }
11063         break;
11064     case OPC_ABS_D:
11065         check_cp1_registers(ctx, fs | fd);
11066         {
11067             TCGv_i64 fp0 = tcg_temp_new_i64();
11068
11069             gen_load_fpr64(ctx, fp0, fs);
11070             if (ctx->abs2008) {
11071                 tcg_gen_andi_i64(fp0, fp0, 0x7fffffffffffffffULL);
11072             } else {
11073                 gen_helper_float_abs_d(fp0, fp0);
11074             }
11075             gen_store_fpr64(ctx, fp0, fd);
11076             tcg_temp_free_i64(fp0);
11077         }
11078         break;
11079     case OPC_MOV_D:
11080         check_cp1_registers(ctx, fs | fd);
11081         {
11082             TCGv_i64 fp0 = tcg_temp_new_i64();
11083
11084             gen_load_fpr64(ctx, fp0, fs);
11085             gen_store_fpr64(ctx, fp0, fd);
11086             tcg_temp_free_i64(fp0);
11087         }
11088         break;
11089     case OPC_NEG_D:
11090         check_cp1_registers(ctx, fs | fd);
11091         {
11092             TCGv_i64 fp0 = tcg_temp_new_i64();
11093
11094             gen_load_fpr64(ctx, fp0, fs);
11095             if (ctx->abs2008) {
11096                 tcg_gen_xori_i64(fp0, fp0, 1ULL << 63);
11097             } else {
11098                 gen_helper_float_chs_d(fp0, fp0);
11099             }
11100             gen_store_fpr64(ctx, fp0, fd);
11101             tcg_temp_free_i64(fp0);
11102         }
11103         break;
11104     case OPC_ROUND_L_D:
11105         check_cp1_64bitmode(ctx);
11106         {
11107             TCGv_i64 fp0 = tcg_temp_new_i64();
11108
11109             gen_load_fpr64(ctx, fp0, fs);
11110             if (ctx->nan2008) {
11111                 gen_helper_float_round_2008_l_d(fp0, cpu_env, fp0);
11112             } else {
11113                 gen_helper_float_round_l_d(fp0, cpu_env, fp0);
11114             }
11115             gen_store_fpr64(ctx, fp0, fd);
11116             tcg_temp_free_i64(fp0);
11117         }
11118         break;
11119     case OPC_TRUNC_L_D:
11120         check_cp1_64bitmode(ctx);
11121         {
11122             TCGv_i64 fp0 = tcg_temp_new_i64();
11123
11124             gen_load_fpr64(ctx, fp0, fs);
11125             if (ctx->nan2008) {
11126                 gen_helper_float_trunc_2008_l_d(fp0, cpu_env, fp0);
11127             } else {
11128                 gen_helper_float_trunc_l_d(fp0, cpu_env, fp0);
11129             }
11130             gen_store_fpr64(ctx, fp0, fd);
11131             tcg_temp_free_i64(fp0);
11132         }
11133         break;
11134     case OPC_CEIL_L_D:
11135         check_cp1_64bitmode(ctx);
11136         {
11137             TCGv_i64 fp0 = tcg_temp_new_i64();
11138
11139             gen_load_fpr64(ctx, fp0, fs);
11140             if (ctx->nan2008) {
11141                 gen_helper_float_ceil_2008_l_d(fp0, cpu_env, fp0);
11142             } else {
11143                 gen_helper_float_ceil_l_d(fp0, cpu_env, fp0);
11144             }
11145             gen_store_fpr64(ctx, fp0, fd);
11146             tcg_temp_free_i64(fp0);
11147         }
11148         break;
11149     case OPC_FLOOR_L_D:
11150         check_cp1_64bitmode(ctx);
11151         {
11152             TCGv_i64 fp0 = tcg_temp_new_i64();
11153
11154             gen_load_fpr64(ctx, fp0, fs);
11155             if (ctx->nan2008) {
11156                 gen_helper_float_floor_2008_l_d(fp0, cpu_env, fp0);
11157             } else {
11158                 gen_helper_float_floor_l_d(fp0, cpu_env, fp0);
11159             }
11160             gen_store_fpr64(ctx, fp0, fd);
11161             tcg_temp_free_i64(fp0);
11162         }
11163         break;
11164     case OPC_ROUND_W_D:
11165         check_cp1_registers(ctx, fs);
11166         {
11167             TCGv_i32 fp32 = tcg_temp_new_i32();
11168             TCGv_i64 fp64 = tcg_temp_new_i64();
11169
11170             gen_load_fpr64(ctx, fp64, fs);
11171             if (ctx->nan2008) {
11172                 gen_helper_float_round_2008_w_d(fp32, cpu_env, fp64);
11173             } else {
11174                 gen_helper_float_round_w_d(fp32, cpu_env, fp64);
11175             }
11176             tcg_temp_free_i64(fp64);
11177             gen_store_fpr32(ctx, fp32, fd);
11178             tcg_temp_free_i32(fp32);
11179         }
11180         break;
11181     case OPC_TRUNC_W_D:
11182         check_cp1_registers(ctx, fs);
11183         {
11184             TCGv_i32 fp32 = tcg_temp_new_i32();
11185             TCGv_i64 fp64 = tcg_temp_new_i64();
11186
11187             gen_load_fpr64(ctx, fp64, fs);
11188             if (ctx->nan2008) {
11189                 gen_helper_float_trunc_2008_w_d(fp32, cpu_env, fp64);
11190             } else {
11191                 gen_helper_float_trunc_w_d(fp32, cpu_env, fp64);
11192             }
11193             tcg_temp_free_i64(fp64);
11194             gen_store_fpr32(ctx, fp32, fd);
11195             tcg_temp_free_i32(fp32);
11196         }
11197         break;
11198     case OPC_CEIL_W_D:
11199         check_cp1_registers(ctx, fs);
11200         {
11201             TCGv_i32 fp32 = tcg_temp_new_i32();
11202             TCGv_i64 fp64 = tcg_temp_new_i64();
11203
11204             gen_load_fpr64(ctx, fp64, fs);
11205             if (ctx->nan2008) {
11206                 gen_helper_float_ceil_2008_w_d(fp32, cpu_env, fp64);
11207             } else {
11208                 gen_helper_float_ceil_w_d(fp32, cpu_env, fp64);
11209             }
11210             tcg_temp_free_i64(fp64);
11211             gen_store_fpr32(ctx, fp32, fd);
11212             tcg_temp_free_i32(fp32);
11213         }
11214         break;
11215     case OPC_FLOOR_W_D:
11216         check_cp1_registers(ctx, fs);
11217         {
11218             TCGv_i32 fp32 = tcg_temp_new_i32();
11219             TCGv_i64 fp64 = tcg_temp_new_i64();
11220
11221             gen_load_fpr64(ctx, fp64, fs);
11222             if (ctx->nan2008) {
11223                 gen_helper_float_floor_2008_w_d(fp32, cpu_env, fp64);
11224             } else {
11225                 gen_helper_float_floor_w_d(fp32, cpu_env, fp64);
11226             }
11227             tcg_temp_free_i64(fp64);
11228             gen_store_fpr32(ctx, fp32, fd);
11229             tcg_temp_free_i32(fp32);
11230         }
11231         break;
11232     case OPC_SEL_D:
11233         check_insn(ctx, ISA_MIPS32R6);
11234         gen_sel_d(ctx, op1, fd, ft, fs);
11235         break;
11236     case OPC_SELEQZ_D:
11237         check_insn(ctx, ISA_MIPS32R6);
11238         gen_sel_d(ctx, op1, fd, ft, fs);
11239         break;
11240     case OPC_SELNEZ_D:
11241         check_insn(ctx, ISA_MIPS32R6);
11242         gen_sel_d(ctx, op1, fd, ft, fs);
11243         break;
11244     case OPC_MOVCF_D:
11245         check_insn_opc_removed(ctx, ISA_MIPS32R6);
11246         gen_movcf_d(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
11247         break;
11248     case OPC_MOVZ_D:
11249         check_insn_opc_removed(ctx, ISA_MIPS32R6);
11250         {
11251             TCGLabel *l1 = gen_new_label();
11252             TCGv_i64 fp0;
11253
11254             if (ft != 0) {
11255                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
11256             }
11257             fp0 = tcg_temp_new_i64();
11258             gen_load_fpr64(ctx, fp0, fs);
11259             gen_store_fpr64(ctx, fp0, fd);
11260             tcg_temp_free_i64(fp0);
11261             gen_set_label(l1);
11262         }
11263         break;
11264     case OPC_MOVN_D:
11265         check_insn_opc_removed(ctx, ISA_MIPS32R6);
11266         {
11267             TCGLabel *l1 = gen_new_label();
11268             TCGv_i64 fp0;
11269
11270             if (ft != 0) {
11271                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
11272                 fp0 = tcg_temp_new_i64();
11273                 gen_load_fpr64(ctx, fp0, fs);
11274                 gen_store_fpr64(ctx, fp0, fd);
11275                 tcg_temp_free_i64(fp0);
11276                 gen_set_label(l1);
11277             }
11278         }
11279         break;
11280     case OPC_RECIP_D:
11281         check_cp1_registers(ctx, fs | fd);
11282         {
11283             TCGv_i64 fp0 = tcg_temp_new_i64();
11284
11285             gen_load_fpr64(ctx, fp0, fs);
11286             gen_helper_float_recip_d(fp0, cpu_env, fp0);
11287             gen_store_fpr64(ctx, fp0, fd);
11288             tcg_temp_free_i64(fp0);
11289         }
11290         break;
11291     case OPC_RSQRT_D:
11292         check_cp1_registers(ctx, fs | fd);
11293         {
11294             TCGv_i64 fp0 = tcg_temp_new_i64();
11295
11296             gen_load_fpr64(ctx, fp0, fs);
11297             gen_helper_float_rsqrt_d(fp0, cpu_env, fp0);
11298             gen_store_fpr64(ctx, fp0, fd);
11299             tcg_temp_free_i64(fp0);
11300         }
11301         break;
11302     case OPC_MADDF_D:
11303         check_insn(ctx, ISA_MIPS32R6);
11304         {
11305             TCGv_i64 fp0 = tcg_temp_new_i64();
11306             TCGv_i64 fp1 = tcg_temp_new_i64();
11307             TCGv_i64 fp2 = tcg_temp_new_i64();
11308             gen_load_fpr64(ctx, fp0, fs);
11309             gen_load_fpr64(ctx, fp1, ft);
11310             gen_load_fpr64(ctx, fp2, fd);
11311             gen_helper_float_maddf_d(fp2, cpu_env, fp0, fp1, fp2);
11312             gen_store_fpr64(ctx, fp2, fd);
11313             tcg_temp_free_i64(fp2);
11314             tcg_temp_free_i64(fp1);
11315             tcg_temp_free_i64(fp0);
11316         }
11317         break;
11318     case OPC_MSUBF_D:
11319         check_insn(ctx, ISA_MIPS32R6);
11320         {
11321             TCGv_i64 fp0 = tcg_temp_new_i64();
11322             TCGv_i64 fp1 = tcg_temp_new_i64();
11323             TCGv_i64 fp2 = tcg_temp_new_i64();
11324             gen_load_fpr64(ctx, fp0, fs);
11325             gen_load_fpr64(ctx, fp1, ft);
11326             gen_load_fpr64(ctx, fp2, fd);
11327             gen_helper_float_msubf_d(fp2, cpu_env, fp0, fp1, fp2);
11328             gen_store_fpr64(ctx, fp2, fd);
11329             tcg_temp_free_i64(fp2);
11330             tcg_temp_free_i64(fp1);
11331             tcg_temp_free_i64(fp0);
11332         }
11333         break;
11334     case OPC_RINT_D:
11335         check_insn(ctx, ISA_MIPS32R6);
11336         {
11337             TCGv_i64 fp0 = tcg_temp_new_i64();
11338             gen_load_fpr64(ctx, fp0, fs);
11339             gen_helper_float_rint_d(fp0, cpu_env, fp0);
11340             gen_store_fpr64(ctx, fp0, fd);
11341             tcg_temp_free_i64(fp0);
11342         }
11343         break;
11344     case OPC_CLASS_D:
11345         check_insn(ctx, ISA_MIPS32R6);
11346         {
11347             TCGv_i64 fp0 = tcg_temp_new_i64();
11348             gen_load_fpr64(ctx, fp0, fs);
11349             gen_helper_float_class_d(fp0, cpu_env, fp0);
11350             gen_store_fpr64(ctx, fp0, fd);
11351             tcg_temp_free_i64(fp0);
11352         }
11353         break;
11354     case OPC_MIN_D: /* OPC_RECIP2_D */
11355         if (ctx->insn_flags & ISA_MIPS32R6) {
11356             /* OPC_MIN_D */
11357             TCGv_i64 fp0 = tcg_temp_new_i64();
11358             TCGv_i64 fp1 = tcg_temp_new_i64();
11359             gen_load_fpr64(ctx, fp0, fs);
11360             gen_load_fpr64(ctx, fp1, ft);
11361             gen_helper_float_min_d(fp1, cpu_env, fp0, fp1);
11362             gen_store_fpr64(ctx, fp1, fd);
11363             tcg_temp_free_i64(fp1);
11364             tcg_temp_free_i64(fp0);
11365         } else {
11366             /* OPC_RECIP2_D */
11367             check_cp1_64bitmode(ctx);
11368             {
11369                 TCGv_i64 fp0 = tcg_temp_new_i64();
11370                 TCGv_i64 fp1 = tcg_temp_new_i64();
11371
11372                 gen_load_fpr64(ctx, fp0, fs);
11373                 gen_load_fpr64(ctx, fp1, ft);
11374                 gen_helper_float_recip2_d(fp0, cpu_env, fp0, fp1);
11375                 tcg_temp_free_i64(fp1);
11376                 gen_store_fpr64(ctx, fp0, fd);
11377                 tcg_temp_free_i64(fp0);
11378             }
11379         }
11380         break;
11381     case OPC_MINA_D: /* OPC_RECIP1_D */
11382         if (ctx->insn_flags & ISA_MIPS32R6) {
11383             /* OPC_MINA_D */
11384             TCGv_i64 fp0 = tcg_temp_new_i64();
11385             TCGv_i64 fp1 = tcg_temp_new_i64();
11386             gen_load_fpr64(ctx, fp0, fs);
11387             gen_load_fpr64(ctx, fp1, ft);
11388             gen_helper_float_mina_d(fp1, cpu_env, fp0, fp1);
11389             gen_store_fpr64(ctx, fp1, fd);
11390             tcg_temp_free_i64(fp1);
11391             tcg_temp_free_i64(fp0);
11392         } else {
11393             /* OPC_RECIP1_D */
11394             check_cp1_64bitmode(ctx);
11395             {
11396                 TCGv_i64 fp0 = tcg_temp_new_i64();
11397
11398                 gen_load_fpr64(ctx, fp0, fs);
11399                 gen_helper_float_recip1_d(fp0, cpu_env, fp0);
11400                 gen_store_fpr64(ctx, fp0, fd);
11401                 tcg_temp_free_i64(fp0);
11402             }
11403         }
11404         break;
11405     case OPC_MAX_D: /*  OPC_RSQRT1_D */
11406         if (ctx->insn_flags & ISA_MIPS32R6) {
11407             /* OPC_MAX_D */
11408             TCGv_i64 fp0 = tcg_temp_new_i64();
11409             TCGv_i64 fp1 = tcg_temp_new_i64();
11410             gen_load_fpr64(ctx, fp0, fs);
11411             gen_load_fpr64(ctx, fp1, ft);
11412             gen_helper_float_max_d(fp1, cpu_env, fp0, fp1);
11413             gen_store_fpr64(ctx, fp1, fd);
11414             tcg_temp_free_i64(fp1);
11415             tcg_temp_free_i64(fp0);
11416         } else {
11417             /* OPC_RSQRT1_D */
11418             check_cp1_64bitmode(ctx);
11419             {
11420                 TCGv_i64 fp0 = tcg_temp_new_i64();
11421
11422                 gen_load_fpr64(ctx, fp0, fs);
11423                 gen_helper_float_rsqrt1_d(fp0, cpu_env, fp0);
11424                 gen_store_fpr64(ctx, fp0, fd);
11425                 tcg_temp_free_i64(fp0);
11426             }
11427         }
11428         break;
11429     case OPC_MAXA_D: /* OPC_RSQRT2_D */
11430         if (ctx->insn_flags & ISA_MIPS32R6) {
11431             /* OPC_MAXA_D */
11432             TCGv_i64 fp0 = tcg_temp_new_i64();
11433             TCGv_i64 fp1 = tcg_temp_new_i64();
11434             gen_load_fpr64(ctx, fp0, fs);
11435             gen_load_fpr64(ctx, fp1, ft);
11436             gen_helper_float_maxa_d(fp1, cpu_env, fp0, fp1);
11437             gen_store_fpr64(ctx, fp1, fd);
11438             tcg_temp_free_i64(fp1);
11439             tcg_temp_free_i64(fp0);
11440         } else {
11441             /* OPC_RSQRT2_D */
11442             check_cp1_64bitmode(ctx);
11443             {
11444                 TCGv_i64 fp0 = tcg_temp_new_i64();
11445                 TCGv_i64 fp1 = tcg_temp_new_i64();
11446
11447                 gen_load_fpr64(ctx, fp0, fs);
11448                 gen_load_fpr64(ctx, fp1, ft);
11449                 gen_helper_float_rsqrt2_d(fp0, cpu_env, fp0, fp1);
11450                 tcg_temp_free_i64(fp1);
11451                 gen_store_fpr64(ctx, fp0, fd);
11452                 tcg_temp_free_i64(fp0);
11453             }
11454         }
11455         break;
11456     case OPC_CMP_F_D:
11457     case OPC_CMP_UN_D:
11458     case OPC_CMP_EQ_D:
11459     case OPC_CMP_UEQ_D:
11460     case OPC_CMP_OLT_D:
11461     case OPC_CMP_ULT_D:
11462     case OPC_CMP_OLE_D:
11463     case OPC_CMP_ULE_D:
11464     case OPC_CMP_SF_D:
11465     case OPC_CMP_NGLE_D:
11466     case OPC_CMP_SEQ_D:
11467     case OPC_CMP_NGL_D:
11468     case OPC_CMP_LT_D:
11469     case OPC_CMP_NGE_D:
11470     case OPC_CMP_LE_D:
11471     case OPC_CMP_NGT_D:
11472         check_insn_opc_removed(ctx, ISA_MIPS32R6);
11473         if (ctx->opcode & (1 << 6)) {
11474             gen_cmpabs_d(ctx, func-48, ft, fs, cc);
11475         } else {
11476             gen_cmp_d(ctx, func-48, ft, fs, cc);
11477         }
11478         break;
11479     case OPC_CVT_S_D:
11480         check_cp1_registers(ctx, fs);
11481         {
11482             TCGv_i32 fp32 = tcg_temp_new_i32();
11483             TCGv_i64 fp64 = tcg_temp_new_i64();
11484
11485             gen_load_fpr64(ctx, fp64, fs);
11486             gen_helper_float_cvts_d(fp32, cpu_env, fp64);
11487             tcg_temp_free_i64(fp64);
11488             gen_store_fpr32(ctx, fp32, fd);
11489             tcg_temp_free_i32(fp32);
11490         }
11491         break;
11492     case OPC_CVT_W_D:
11493         check_cp1_registers(ctx, fs);
11494         {
11495             TCGv_i32 fp32 = tcg_temp_new_i32();
11496             TCGv_i64 fp64 = tcg_temp_new_i64();
11497
11498             gen_load_fpr64(ctx, fp64, fs);
11499             if (ctx->nan2008) {
11500                 gen_helper_float_cvt_2008_w_d(fp32, cpu_env, fp64);
11501             } else {
11502                 gen_helper_float_cvt_w_d(fp32, cpu_env, fp64);
11503             }
11504             tcg_temp_free_i64(fp64);
11505             gen_store_fpr32(ctx, fp32, fd);
11506             tcg_temp_free_i32(fp32);
11507         }
11508         break;
11509     case OPC_CVT_L_D:
11510         check_cp1_64bitmode(ctx);
11511         {
11512             TCGv_i64 fp0 = tcg_temp_new_i64();
11513
11514             gen_load_fpr64(ctx, fp0, fs);
11515             if (ctx->nan2008) {
11516                 gen_helper_float_cvt_2008_l_d(fp0, cpu_env, fp0);
11517             } else {
11518                 gen_helper_float_cvt_l_d(fp0, cpu_env, fp0);
11519             }
11520             gen_store_fpr64(ctx, fp0, fd);
11521             tcg_temp_free_i64(fp0);
11522         }
11523         break;
11524     case OPC_CVT_S_W:
11525         {
11526             TCGv_i32 fp0 = tcg_temp_new_i32();
11527
11528             gen_load_fpr32(ctx, fp0, fs);
11529             gen_helper_float_cvts_w(fp0, cpu_env, fp0);
11530             gen_store_fpr32(ctx, fp0, fd);
11531             tcg_temp_free_i32(fp0);
11532         }
11533         break;
11534     case OPC_CVT_D_W:
11535         check_cp1_registers(ctx, fd);
11536         {
11537             TCGv_i32 fp32 = tcg_temp_new_i32();
11538             TCGv_i64 fp64 = tcg_temp_new_i64();
11539
11540             gen_load_fpr32(ctx, fp32, fs);
11541             gen_helper_float_cvtd_w(fp64, cpu_env, fp32);
11542             tcg_temp_free_i32(fp32);
11543             gen_store_fpr64(ctx, fp64, fd);
11544             tcg_temp_free_i64(fp64);
11545         }
11546         break;
11547     case OPC_CVT_S_L:
11548         check_cp1_64bitmode(ctx);
11549         {
11550             TCGv_i32 fp32 = tcg_temp_new_i32();
11551             TCGv_i64 fp64 = tcg_temp_new_i64();
11552
11553             gen_load_fpr64(ctx, fp64, fs);
11554             gen_helper_float_cvts_l(fp32, cpu_env, fp64);
11555             tcg_temp_free_i64(fp64);
11556             gen_store_fpr32(ctx, fp32, fd);
11557             tcg_temp_free_i32(fp32);
11558         }
11559         break;
11560     case OPC_CVT_D_L:
11561         check_cp1_64bitmode(ctx);
11562         {
11563             TCGv_i64 fp0 = tcg_temp_new_i64();
11564
11565             gen_load_fpr64(ctx, fp0, fs);
11566             gen_helper_float_cvtd_l(fp0, cpu_env, fp0);
11567             gen_store_fpr64(ctx, fp0, fd);
11568             tcg_temp_free_i64(fp0);
11569         }
11570         break;
11571     case OPC_CVT_PS_PW:
11572         check_ps(ctx);
11573         {
11574             TCGv_i64 fp0 = tcg_temp_new_i64();
11575
11576             gen_load_fpr64(ctx, fp0, fs);
11577             gen_helper_float_cvtps_pw(fp0, cpu_env, fp0);
11578             gen_store_fpr64(ctx, fp0, fd);
11579             tcg_temp_free_i64(fp0);
11580         }
11581         break;
11582     case OPC_ADD_PS:
11583         check_ps(ctx);
11584         {
11585             TCGv_i64 fp0 = tcg_temp_new_i64();
11586             TCGv_i64 fp1 = tcg_temp_new_i64();
11587
11588             gen_load_fpr64(ctx, fp0, fs);
11589             gen_load_fpr64(ctx, fp1, ft);
11590             gen_helper_float_add_ps(fp0, cpu_env, fp0, fp1);
11591             tcg_temp_free_i64(fp1);
11592             gen_store_fpr64(ctx, fp0, fd);
11593             tcg_temp_free_i64(fp0);
11594         }
11595         break;
11596     case OPC_SUB_PS:
11597         check_ps(ctx);
11598         {
11599             TCGv_i64 fp0 = tcg_temp_new_i64();
11600             TCGv_i64 fp1 = tcg_temp_new_i64();
11601
11602             gen_load_fpr64(ctx, fp0, fs);
11603             gen_load_fpr64(ctx, fp1, ft);
11604             gen_helper_float_sub_ps(fp0, cpu_env, fp0, fp1);
11605             tcg_temp_free_i64(fp1);
11606             gen_store_fpr64(ctx, fp0, fd);
11607             tcg_temp_free_i64(fp0);
11608         }
11609         break;
11610     case OPC_MUL_PS:
11611         check_ps(ctx);
11612         {
11613             TCGv_i64 fp0 = tcg_temp_new_i64();
11614             TCGv_i64 fp1 = tcg_temp_new_i64();
11615
11616             gen_load_fpr64(ctx, fp0, fs);
11617             gen_load_fpr64(ctx, fp1, ft);
11618             gen_helper_float_mul_ps(fp0, cpu_env, fp0, fp1);
11619             tcg_temp_free_i64(fp1);
11620             gen_store_fpr64(ctx, fp0, fd);
11621             tcg_temp_free_i64(fp0);
11622         }
11623         break;
11624     case OPC_ABS_PS:
11625         check_ps(ctx);
11626         {
11627             TCGv_i64 fp0 = tcg_temp_new_i64();
11628
11629             gen_load_fpr64(ctx, fp0, fs);
11630             gen_helper_float_abs_ps(fp0, fp0);
11631             gen_store_fpr64(ctx, fp0, fd);
11632             tcg_temp_free_i64(fp0);
11633         }
11634         break;
11635     case OPC_MOV_PS:
11636         check_ps(ctx);
11637         {
11638             TCGv_i64 fp0 = tcg_temp_new_i64();
11639
11640             gen_load_fpr64(ctx, fp0, fs);
11641             gen_store_fpr64(ctx, fp0, fd);
11642             tcg_temp_free_i64(fp0);
11643         }
11644         break;
11645     case OPC_NEG_PS:
11646         check_ps(ctx);
11647         {
11648             TCGv_i64 fp0 = tcg_temp_new_i64();
11649
11650             gen_load_fpr64(ctx, fp0, fs);
11651             gen_helper_float_chs_ps(fp0, fp0);
11652             gen_store_fpr64(ctx, fp0, fd);
11653             tcg_temp_free_i64(fp0);
11654         }
11655         break;
11656     case OPC_MOVCF_PS:
11657         check_ps(ctx);
11658         gen_movcf_ps(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
11659         break;
11660     case OPC_MOVZ_PS:
11661         check_ps(ctx);
11662         {
11663             TCGLabel *l1 = gen_new_label();
11664             TCGv_i64 fp0;
11665
11666             if (ft != 0)
11667                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
11668             fp0 = tcg_temp_new_i64();
11669             gen_load_fpr64(ctx, fp0, fs);
11670             gen_store_fpr64(ctx, fp0, fd);
11671             tcg_temp_free_i64(fp0);
11672             gen_set_label(l1);
11673         }
11674         break;
11675     case OPC_MOVN_PS:
11676         check_ps(ctx);
11677         {
11678             TCGLabel *l1 = gen_new_label();
11679             TCGv_i64 fp0;
11680
11681             if (ft != 0) {
11682                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
11683                 fp0 = tcg_temp_new_i64();
11684                 gen_load_fpr64(ctx, fp0, fs);
11685                 gen_store_fpr64(ctx, fp0, fd);
11686                 tcg_temp_free_i64(fp0);
11687                 gen_set_label(l1);
11688             }
11689         }
11690         break;
11691     case OPC_ADDR_PS:
11692         check_ps(ctx);
11693         {
11694             TCGv_i64 fp0 = tcg_temp_new_i64();
11695             TCGv_i64 fp1 = tcg_temp_new_i64();
11696
11697             gen_load_fpr64(ctx, fp0, ft);
11698             gen_load_fpr64(ctx, fp1, fs);
11699             gen_helper_float_addr_ps(fp0, cpu_env, fp0, fp1);
11700             tcg_temp_free_i64(fp1);
11701             gen_store_fpr64(ctx, fp0, fd);
11702             tcg_temp_free_i64(fp0);
11703         }
11704         break;
11705     case OPC_MULR_PS:
11706         check_ps(ctx);
11707         {
11708             TCGv_i64 fp0 = tcg_temp_new_i64();
11709             TCGv_i64 fp1 = tcg_temp_new_i64();
11710
11711             gen_load_fpr64(ctx, fp0, ft);
11712             gen_load_fpr64(ctx, fp1, fs);
11713             gen_helper_float_mulr_ps(fp0, cpu_env, fp0, fp1);
11714             tcg_temp_free_i64(fp1);
11715             gen_store_fpr64(ctx, fp0, fd);
11716             tcg_temp_free_i64(fp0);
11717         }
11718         break;
11719     case OPC_RECIP2_PS:
11720         check_ps(ctx);
11721         {
11722             TCGv_i64 fp0 = tcg_temp_new_i64();
11723             TCGv_i64 fp1 = tcg_temp_new_i64();
11724
11725             gen_load_fpr64(ctx, fp0, fs);
11726             gen_load_fpr64(ctx, fp1, ft);
11727             gen_helper_float_recip2_ps(fp0, cpu_env, fp0, fp1);
11728             tcg_temp_free_i64(fp1);
11729             gen_store_fpr64(ctx, fp0, fd);
11730             tcg_temp_free_i64(fp0);
11731         }
11732         break;
11733     case OPC_RECIP1_PS:
11734         check_ps(ctx);
11735         {
11736             TCGv_i64 fp0 = tcg_temp_new_i64();
11737
11738             gen_load_fpr64(ctx, fp0, fs);
11739             gen_helper_float_recip1_ps(fp0, cpu_env, fp0);
11740             gen_store_fpr64(ctx, fp0, fd);
11741             tcg_temp_free_i64(fp0);
11742         }
11743         break;
11744     case OPC_RSQRT1_PS:
11745         check_ps(ctx);
11746         {
11747             TCGv_i64 fp0 = tcg_temp_new_i64();
11748
11749             gen_load_fpr64(ctx, fp0, fs);
11750             gen_helper_float_rsqrt1_ps(fp0, cpu_env, fp0);
11751             gen_store_fpr64(ctx, fp0, fd);
11752             tcg_temp_free_i64(fp0);
11753         }
11754         break;
11755     case OPC_RSQRT2_PS:
11756         check_ps(ctx);
11757         {
11758             TCGv_i64 fp0 = tcg_temp_new_i64();
11759             TCGv_i64 fp1 = tcg_temp_new_i64();
11760
11761             gen_load_fpr64(ctx, fp0, fs);
11762             gen_load_fpr64(ctx, fp1, ft);
11763             gen_helper_float_rsqrt2_ps(fp0, cpu_env, fp0, fp1);
11764             tcg_temp_free_i64(fp1);
11765             gen_store_fpr64(ctx, fp0, fd);
11766             tcg_temp_free_i64(fp0);
11767         }
11768         break;
11769     case OPC_CVT_S_PU:
11770         check_cp1_64bitmode(ctx);
11771         {
11772             TCGv_i32 fp0 = tcg_temp_new_i32();
11773
11774             gen_load_fpr32h(ctx, fp0, fs);
11775             gen_helper_float_cvts_pu(fp0, cpu_env, fp0);
11776             gen_store_fpr32(ctx, fp0, fd);
11777             tcg_temp_free_i32(fp0);
11778         }
11779         break;
11780     case OPC_CVT_PW_PS:
11781         check_ps(ctx);
11782         {
11783             TCGv_i64 fp0 = tcg_temp_new_i64();
11784
11785             gen_load_fpr64(ctx, fp0, fs);
11786             gen_helper_float_cvtpw_ps(fp0, cpu_env, fp0);
11787             gen_store_fpr64(ctx, fp0, fd);
11788             tcg_temp_free_i64(fp0);
11789         }
11790         break;
11791     case OPC_CVT_S_PL:
11792         check_cp1_64bitmode(ctx);
11793         {
11794             TCGv_i32 fp0 = tcg_temp_new_i32();
11795
11796             gen_load_fpr32(ctx, fp0, fs);
11797             gen_helper_float_cvts_pl(fp0, cpu_env, fp0);
11798             gen_store_fpr32(ctx, fp0, fd);
11799             tcg_temp_free_i32(fp0);
11800         }
11801         break;
11802     case OPC_PLL_PS:
11803         check_ps(ctx);
11804         {
11805             TCGv_i32 fp0 = tcg_temp_new_i32();
11806             TCGv_i32 fp1 = tcg_temp_new_i32();
11807
11808             gen_load_fpr32(ctx, fp0, fs);
11809             gen_load_fpr32(ctx, fp1, ft);
11810             gen_store_fpr32h(ctx, fp0, fd);
11811             gen_store_fpr32(ctx, fp1, fd);
11812             tcg_temp_free_i32(fp0);
11813             tcg_temp_free_i32(fp1);
11814         }
11815         break;
11816     case OPC_PLU_PS:
11817         check_ps(ctx);
11818         {
11819             TCGv_i32 fp0 = tcg_temp_new_i32();
11820             TCGv_i32 fp1 = tcg_temp_new_i32();
11821
11822             gen_load_fpr32(ctx, fp0, fs);
11823             gen_load_fpr32h(ctx, fp1, ft);
11824             gen_store_fpr32(ctx, fp1, fd);
11825             gen_store_fpr32h(ctx, fp0, fd);
11826             tcg_temp_free_i32(fp0);
11827             tcg_temp_free_i32(fp1);
11828         }
11829         break;
11830     case OPC_PUL_PS:
11831         check_ps(ctx);
11832         {
11833             TCGv_i32 fp0 = tcg_temp_new_i32();
11834             TCGv_i32 fp1 = tcg_temp_new_i32();
11835
11836             gen_load_fpr32h(ctx, fp0, fs);
11837             gen_load_fpr32(ctx, fp1, ft);
11838             gen_store_fpr32(ctx, fp1, fd);
11839             gen_store_fpr32h(ctx, fp0, fd);
11840             tcg_temp_free_i32(fp0);
11841             tcg_temp_free_i32(fp1);
11842         }
11843         break;
11844     case OPC_PUU_PS:
11845         check_ps(ctx);
11846         {
11847             TCGv_i32 fp0 = tcg_temp_new_i32();
11848             TCGv_i32 fp1 = tcg_temp_new_i32();
11849
11850             gen_load_fpr32h(ctx, fp0, fs);
11851             gen_load_fpr32h(ctx, fp1, ft);
11852             gen_store_fpr32(ctx, fp1, fd);
11853             gen_store_fpr32h(ctx, fp0, fd);
11854             tcg_temp_free_i32(fp0);
11855             tcg_temp_free_i32(fp1);
11856         }
11857         break;
11858     case OPC_CMP_F_PS:
11859     case OPC_CMP_UN_PS:
11860     case OPC_CMP_EQ_PS:
11861     case OPC_CMP_UEQ_PS:
11862     case OPC_CMP_OLT_PS:
11863     case OPC_CMP_ULT_PS:
11864     case OPC_CMP_OLE_PS:
11865     case OPC_CMP_ULE_PS:
11866     case OPC_CMP_SF_PS:
11867     case OPC_CMP_NGLE_PS:
11868     case OPC_CMP_SEQ_PS:
11869     case OPC_CMP_NGL_PS:
11870     case OPC_CMP_LT_PS:
11871     case OPC_CMP_NGE_PS:
11872     case OPC_CMP_LE_PS:
11873     case OPC_CMP_NGT_PS:
11874         if (ctx->opcode & (1 << 6)) {
11875             gen_cmpabs_ps(ctx, func-48, ft, fs, cc);
11876         } else {
11877             gen_cmp_ps(ctx, func-48, ft, fs, cc);
11878         }
11879         break;
11880     default:
11881         MIPS_INVAL("farith");
11882         generate_exception_end(ctx, EXCP_RI);
11883         return;
11884     }
11885 }
11886
11887 /* Coprocessor 3 (FPU) */
11888 static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
11889                            int fd, int fs, int base, int index)
11890 {
11891     TCGv t0 = tcg_temp_new();
11892
11893     if (base == 0) {
11894         gen_load_gpr(t0, index);
11895     } else if (index == 0) {
11896         gen_load_gpr(t0, base);
11897     } else {
11898         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[index]);
11899     }
11900     /* Don't do NOP if destination is zero: we must perform the actual
11901        memory access. */
11902     switch (opc) {
11903     case OPC_LWXC1:
11904         check_cop1x(ctx);
11905         {
11906             TCGv_i32 fp0 = tcg_temp_new_i32();
11907
11908             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
11909             tcg_gen_trunc_tl_i32(fp0, t0);
11910             gen_store_fpr32(ctx, fp0, fd);
11911             tcg_temp_free_i32(fp0);
11912         }
11913         break;
11914     case OPC_LDXC1:
11915         check_cop1x(ctx);
11916         check_cp1_registers(ctx, fd);
11917         {
11918             TCGv_i64 fp0 = tcg_temp_new_i64();
11919             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
11920             gen_store_fpr64(ctx, fp0, fd);
11921             tcg_temp_free_i64(fp0);
11922         }
11923         break;
11924     case OPC_LUXC1:
11925         check_cp1_64bitmode(ctx);
11926         tcg_gen_andi_tl(t0, t0, ~0x7);
11927         {
11928             TCGv_i64 fp0 = tcg_temp_new_i64();
11929
11930             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
11931             gen_store_fpr64(ctx, fp0, fd);
11932             tcg_temp_free_i64(fp0);
11933         }
11934         break;
11935     case OPC_SWXC1:
11936         check_cop1x(ctx);
11937         {
11938             TCGv_i32 fp0 = tcg_temp_new_i32();
11939             gen_load_fpr32(ctx, fp0, fs);
11940             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL);
11941             tcg_temp_free_i32(fp0);
11942         }
11943         break;
11944     case OPC_SDXC1:
11945         check_cop1x(ctx);
11946         check_cp1_registers(ctx, fs);
11947         {
11948             TCGv_i64 fp0 = tcg_temp_new_i64();
11949             gen_load_fpr64(ctx, fp0, fs);
11950             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
11951             tcg_temp_free_i64(fp0);
11952         }
11953         break;
11954     case OPC_SUXC1:
11955         check_cp1_64bitmode(ctx);
11956         tcg_gen_andi_tl(t0, t0, ~0x7);
11957         {
11958             TCGv_i64 fp0 = tcg_temp_new_i64();
11959             gen_load_fpr64(ctx, fp0, fs);
11960             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
11961             tcg_temp_free_i64(fp0);
11962         }
11963         break;
11964     }
11965     tcg_temp_free(t0);
11966 }
11967
11968 static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
11969                             int fd, int fr, int fs, int ft)
11970 {
11971     switch (opc) {
11972     case OPC_ALNV_PS:
11973         check_ps(ctx);
11974         {
11975             TCGv t0 = tcg_temp_local_new();
11976             TCGv_i32 fp = tcg_temp_new_i32();
11977             TCGv_i32 fph = tcg_temp_new_i32();
11978             TCGLabel *l1 = gen_new_label();
11979             TCGLabel *l2 = gen_new_label();
11980
11981             gen_load_gpr(t0, fr);
11982             tcg_gen_andi_tl(t0, t0, 0x7);
11983
11984             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);
11985             gen_load_fpr32(ctx, fp, fs);
11986             gen_load_fpr32h(ctx, fph, fs);
11987             gen_store_fpr32(ctx, fp, fd);
11988             gen_store_fpr32h(ctx, fph, fd);
11989             tcg_gen_br(l2);
11990             gen_set_label(l1);
11991             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 4, l2);
11992             tcg_temp_free(t0);
11993 #ifdef TARGET_WORDS_BIGENDIAN
11994             gen_load_fpr32(ctx, fp, fs);
11995             gen_load_fpr32h(ctx, fph, ft);
11996             gen_store_fpr32h(ctx, fp, fd);
11997             gen_store_fpr32(ctx, fph, fd);
11998 #else
11999             gen_load_fpr32h(ctx, fph, fs);
12000             gen_load_fpr32(ctx, fp, ft);
12001             gen_store_fpr32(ctx, fph, fd);
12002             gen_store_fpr32h(ctx, fp, fd);
12003 #endif
12004             gen_set_label(l2);
12005             tcg_temp_free_i32(fp);
12006             tcg_temp_free_i32(fph);
12007         }
12008         break;
12009     case OPC_MADD_S:
12010         check_cop1x(ctx);
12011         {
12012             TCGv_i32 fp0 = tcg_temp_new_i32();
12013             TCGv_i32 fp1 = tcg_temp_new_i32();
12014             TCGv_i32 fp2 = tcg_temp_new_i32();
12015
12016             gen_load_fpr32(ctx, fp0, fs);
12017             gen_load_fpr32(ctx, fp1, ft);
12018             gen_load_fpr32(ctx, fp2, fr);
12019             gen_helper_float_madd_s(fp2, cpu_env, fp0, fp1, fp2);
12020             tcg_temp_free_i32(fp0);
12021             tcg_temp_free_i32(fp1);
12022             gen_store_fpr32(ctx, fp2, fd);
12023             tcg_temp_free_i32(fp2);
12024         }
12025         break;
12026     case OPC_MADD_D:
12027         check_cop1x(ctx);
12028         check_cp1_registers(ctx, fd | fs | ft | fr);
12029         {
12030             TCGv_i64 fp0 = tcg_temp_new_i64();
12031             TCGv_i64 fp1 = tcg_temp_new_i64();
12032             TCGv_i64 fp2 = tcg_temp_new_i64();
12033
12034             gen_load_fpr64(ctx, fp0, fs);
12035             gen_load_fpr64(ctx, fp1, ft);
12036             gen_load_fpr64(ctx, fp2, fr);
12037             gen_helper_float_madd_d(fp2, cpu_env, fp0, fp1, fp2);
12038             tcg_temp_free_i64(fp0);
12039             tcg_temp_free_i64(fp1);
12040             gen_store_fpr64(ctx, fp2, fd);
12041             tcg_temp_free_i64(fp2);
12042         }
12043         break;
12044     case OPC_MADD_PS:
12045         check_ps(ctx);
12046         {
12047             TCGv_i64 fp0 = tcg_temp_new_i64();
12048             TCGv_i64 fp1 = tcg_temp_new_i64();
12049             TCGv_i64 fp2 = tcg_temp_new_i64();
12050
12051             gen_load_fpr64(ctx, fp0, fs);
12052             gen_load_fpr64(ctx, fp1, ft);
12053             gen_load_fpr64(ctx, fp2, fr);
12054             gen_helper_float_madd_ps(fp2, cpu_env, fp0, fp1, fp2);
12055             tcg_temp_free_i64(fp0);
12056             tcg_temp_free_i64(fp1);
12057             gen_store_fpr64(ctx, fp2, fd);
12058             tcg_temp_free_i64(fp2);
12059         }
12060         break;
12061     case OPC_MSUB_S:
12062         check_cop1x(ctx);
12063         {
12064             TCGv_i32 fp0 = tcg_temp_new_i32();
12065             TCGv_i32 fp1 = tcg_temp_new_i32();
12066             TCGv_i32 fp2 = tcg_temp_new_i32();
12067
12068             gen_load_fpr32(ctx, fp0, fs);
12069             gen_load_fpr32(ctx, fp1, ft);
12070             gen_load_fpr32(ctx, fp2, fr);
12071             gen_helper_float_msub_s(fp2, cpu_env, fp0, fp1, fp2);
12072             tcg_temp_free_i32(fp0);
12073             tcg_temp_free_i32(fp1);
12074             gen_store_fpr32(ctx, fp2, fd);
12075             tcg_temp_free_i32(fp2);
12076         }
12077         break;
12078     case OPC_MSUB_D:
12079         check_cop1x(ctx);
12080         check_cp1_registers(ctx, fd | fs | ft | fr);
12081         {
12082             TCGv_i64 fp0 = tcg_temp_new_i64();
12083             TCGv_i64 fp1 = tcg_temp_new_i64();
12084             TCGv_i64 fp2 = tcg_temp_new_i64();
12085
12086             gen_load_fpr64(ctx, fp0, fs);
12087             gen_load_fpr64(ctx, fp1, ft);
12088             gen_load_fpr64(ctx, fp2, fr);
12089             gen_helper_float_msub_d(fp2, cpu_env, fp0, fp1, fp2);
12090             tcg_temp_free_i64(fp0);
12091             tcg_temp_free_i64(fp1);
12092             gen_store_fpr64(ctx, fp2, fd);
12093             tcg_temp_free_i64(fp2);
12094         }
12095         break;
12096     case OPC_MSUB_PS:
12097         check_ps(ctx);
12098         {
12099             TCGv_i64 fp0 = tcg_temp_new_i64();
12100             TCGv_i64 fp1 = tcg_temp_new_i64();
12101             TCGv_i64 fp2 = tcg_temp_new_i64();
12102
12103             gen_load_fpr64(ctx, fp0, fs);
12104             gen_load_fpr64(ctx, fp1, ft);
12105             gen_load_fpr64(ctx, fp2, fr);
12106             gen_helper_float_msub_ps(fp2, cpu_env, fp0, fp1, fp2);
12107             tcg_temp_free_i64(fp0);
12108             tcg_temp_free_i64(fp1);
12109             gen_store_fpr64(ctx, fp2, fd);
12110             tcg_temp_free_i64(fp2);
12111         }
12112         break;
12113     case OPC_NMADD_S:
12114         check_cop1x(ctx);
12115         {
12116             TCGv_i32 fp0 = tcg_temp_new_i32();
12117             TCGv_i32 fp1 = tcg_temp_new_i32();
12118             TCGv_i32 fp2 = tcg_temp_new_i32();
12119
12120             gen_load_fpr32(ctx, fp0, fs);
12121             gen_load_fpr32(ctx, fp1, ft);
12122             gen_load_fpr32(ctx, fp2, fr);
12123             gen_helper_float_nmadd_s(fp2, cpu_env, fp0, fp1, fp2);
12124             tcg_temp_free_i32(fp0);
12125             tcg_temp_free_i32(fp1);
12126             gen_store_fpr32(ctx, fp2, fd);
12127             tcg_temp_free_i32(fp2);
12128         }
12129         break;
12130     case OPC_NMADD_D:
12131         check_cop1x(ctx);
12132         check_cp1_registers(ctx, fd | fs | ft | fr);
12133         {
12134             TCGv_i64 fp0 = tcg_temp_new_i64();
12135             TCGv_i64 fp1 = tcg_temp_new_i64();
12136             TCGv_i64 fp2 = tcg_temp_new_i64();
12137
12138             gen_load_fpr64(ctx, fp0, fs);
12139             gen_load_fpr64(ctx, fp1, ft);
12140             gen_load_fpr64(ctx, fp2, fr);
12141             gen_helper_float_nmadd_d(fp2, cpu_env, fp0, fp1, fp2);
12142             tcg_temp_free_i64(fp0);
12143             tcg_temp_free_i64(fp1);
12144             gen_store_fpr64(ctx, fp2, fd);
12145             tcg_temp_free_i64(fp2);
12146         }
12147         break;
12148     case OPC_NMADD_PS:
12149         check_ps(ctx);
12150         {
12151             TCGv_i64 fp0 = tcg_temp_new_i64();
12152             TCGv_i64 fp1 = tcg_temp_new_i64();
12153             TCGv_i64 fp2 = tcg_temp_new_i64();
12154
12155             gen_load_fpr64(ctx, fp0, fs);
12156             gen_load_fpr64(ctx, fp1, ft);
12157             gen_load_fpr64(ctx, fp2, fr);
12158             gen_helper_float_nmadd_ps(fp2, cpu_env, fp0, fp1, fp2);
12159             tcg_temp_free_i64(fp0);
12160             tcg_temp_free_i64(fp1);
12161             gen_store_fpr64(ctx, fp2, fd);
12162             tcg_temp_free_i64(fp2);
12163         }
12164         break;
12165     case OPC_NMSUB_S:
12166         check_cop1x(ctx);
12167         {
12168             TCGv_i32 fp0 = tcg_temp_new_i32();
12169             TCGv_i32 fp1 = tcg_temp_new_i32();
12170             TCGv_i32 fp2 = tcg_temp_new_i32();
12171
12172             gen_load_fpr32(ctx, fp0, fs);
12173             gen_load_fpr32(ctx, fp1, ft);
12174             gen_load_fpr32(ctx, fp2, fr);
12175             gen_helper_float_nmsub_s(fp2, cpu_env, fp0, fp1, fp2);
12176             tcg_temp_free_i32(fp0);
12177             tcg_temp_free_i32(fp1);
12178             gen_store_fpr32(ctx, fp2, fd);
12179             tcg_temp_free_i32(fp2);
12180         }
12181         break;
12182     case OPC_NMSUB_D:
12183         check_cop1x(ctx);
12184         check_cp1_registers(ctx, fd | fs | ft | fr);
12185         {
12186             TCGv_i64 fp0 = tcg_temp_new_i64();
12187             TCGv_i64 fp1 = tcg_temp_new_i64();
12188             TCGv_i64 fp2 = tcg_temp_new_i64();
12189
12190             gen_load_fpr64(ctx, fp0, fs);
12191             gen_load_fpr64(ctx, fp1, ft);
12192             gen_load_fpr64(ctx, fp2, fr);
12193             gen_helper_float_nmsub_d(fp2, cpu_env, fp0, fp1, fp2);
12194             tcg_temp_free_i64(fp0);
12195             tcg_temp_free_i64(fp1);
12196             gen_store_fpr64(ctx, fp2, fd);
12197             tcg_temp_free_i64(fp2);
12198         }
12199         break;
12200     case OPC_NMSUB_PS:
12201         check_ps(ctx);
12202         {
12203             TCGv_i64 fp0 = tcg_temp_new_i64();
12204             TCGv_i64 fp1 = tcg_temp_new_i64();
12205             TCGv_i64 fp2 = tcg_temp_new_i64();
12206
12207             gen_load_fpr64(ctx, fp0, fs);
12208             gen_load_fpr64(ctx, fp1, ft);
12209             gen_load_fpr64(ctx, fp2, fr);
12210             gen_helper_float_nmsub_ps(fp2, cpu_env, fp0, fp1, fp2);
12211             tcg_temp_free_i64(fp0);
12212             tcg_temp_free_i64(fp1);
12213             gen_store_fpr64(ctx, fp2, fd);
12214             tcg_temp_free_i64(fp2);
12215         }
12216         break;
12217     default:
12218         MIPS_INVAL("flt3_arith");
12219         generate_exception_end(ctx, EXCP_RI);
12220         return;
12221     }
12222 }
12223
12224 static void gen_rdhwr(DisasContext *ctx, int rt, int rd, int sel)
12225 {
12226     TCGv t0;
12227
12228 #if !defined(CONFIG_USER_ONLY)
12229     /* The Linux kernel will emulate rdhwr if it's not supported natively.
12230        Therefore only check the ISA in system mode.  */
12231     check_insn(ctx, ISA_MIPS32R2);
12232 #endif
12233     t0 = tcg_temp_new();
12234
12235     switch (rd) {
12236     case 0:
12237         gen_helper_rdhwr_cpunum(t0, cpu_env);
12238         gen_store_gpr(t0, rt);
12239         break;
12240     case 1:
12241         gen_helper_rdhwr_synci_step(t0, cpu_env);
12242         gen_store_gpr(t0, rt);
12243         break;
12244     case 2:
12245         if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
12246             gen_io_start();
12247         }
12248         gen_helper_rdhwr_cc(t0, cpu_env);
12249         if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
12250             gen_io_end();
12251         }
12252         gen_store_gpr(t0, rt);
12253         /* Break the TB to be able to take timer interrupts immediately
12254            after reading count. DISAS_STOP isn't sufficient, we need to ensure
12255            we break completely out of translated code.  */
12256         gen_save_pc(ctx->base.pc_next + 4);
12257         ctx->base.is_jmp = DISAS_EXIT;
12258         break;
12259     case 3:
12260         gen_helper_rdhwr_ccres(t0, cpu_env);
12261         gen_store_gpr(t0, rt);
12262         break;
12263     case 4:
12264         check_insn(ctx, ISA_MIPS32R6);
12265         if (sel != 0) {
12266             /* Performance counter registers are not implemented other than
12267              * control register 0.
12268              */
12269             generate_exception(ctx, EXCP_RI);
12270         }
12271         gen_helper_rdhwr_performance(t0, cpu_env);
12272         gen_store_gpr(t0, rt);
12273         break;
12274     case 5:
12275         check_insn(ctx, ISA_MIPS32R6);
12276         gen_helper_rdhwr_xnp(t0, cpu_env);
12277         gen_store_gpr(t0, rt);
12278         break;
12279     case 29:
12280 #if defined(CONFIG_USER_ONLY)
12281         tcg_gen_ld_tl(t0, cpu_env,
12282                       offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
12283         gen_store_gpr(t0, rt);
12284         break;
12285 #else
12286         if ((ctx->hflags & MIPS_HFLAG_CP0) ||
12287             (ctx->hflags & MIPS_HFLAG_HWRENA_ULR)) {
12288             tcg_gen_ld_tl(t0, cpu_env,
12289                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
12290             gen_store_gpr(t0, rt);
12291         } else {
12292             generate_exception_end(ctx, EXCP_RI);
12293         }
12294         break;
12295 #endif
12296     default:            /* Invalid */
12297         MIPS_INVAL("rdhwr");
12298         generate_exception_end(ctx, EXCP_RI);
12299         break;
12300     }
12301     tcg_temp_free(t0);
12302 }
12303
12304 static inline void clear_branch_hflags(DisasContext *ctx)
12305 {
12306     ctx->hflags &= ~MIPS_HFLAG_BMASK;
12307     if (ctx->base.is_jmp == DISAS_NEXT) {
12308         save_cpu_state(ctx, 0);
12309     } else {
12310         /* it is not safe to save ctx->hflags as hflags may be changed
12311            in execution time by the instruction in delay / forbidden slot. */
12312         tcg_gen_andi_i32(hflags, hflags, ~MIPS_HFLAG_BMASK);
12313     }
12314 }
12315
12316 static void gen_branch(DisasContext *ctx, int insn_bytes)
12317 {
12318     if (ctx->hflags & MIPS_HFLAG_BMASK) {
12319         int proc_hflags = ctx->hflags & MIPS_HFLAG_BMASK;
12320         /* Branches completion */
12321         clear_branch_hflags(ctx);
12322         ctx->base.is_jmp = DISAS_NORETURN;
12323         /* FIXME: Need to clear can_do_io.  */
12324         switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) {
12325         case MIPS_HFLAG_FBNSLOT:
12326             gen_goto_tb(ctx, 0, ctx->base.pc_next + insn_bytes);
12327             break;
12328         case MIPS_HFLAG_B:
12329             /* unconditional branch */
12330             if (proc_hflags & MIPS_HFLAG_BX) {
12331                 tcg_gen_xori_i32(hflags, hflags, MIPS_HFLAG_M16);
12332             }
12333             gen_goto_tb(ctx, 0, ctx->btarget);
12334             break;
12335         case MIPS_HFLAG_BL:
12336             /* blikely taken case */
12337             gen_goto_tb(ctx, 0, ctx->btarget);
12338             break;
12339         case MIPS_HFLAG_BC:
12340             /* Conditional branch */
12341             {
12342                 TCGLabel *l1 = gen_new_label();
12343
12344                 tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
12345                 gen_goto_tb(ctx, 1, ctx->base.pc_next + insn_bytes);
12346                 gen_set_label(l1);
12347                 gen_goto_tb(ctx, 0, ctx->btarget);
12348             }
12349             break;
12350         case MIPS_HFLAG_BR:
12351             /* unconditional branch to register */
12352             if (ctx->insn_flags & (ASE_MIPS16 | ASE_MICROMIPS)) {
12353                 TCGv t0 = tcg_temp_new();
12354                 TCGv_i32 t1 = tcg_temp_new_i32();
12355
12356                 tcg_gen_andi_tl(t0, btarget, 0x1);
12357                 tcg_gen_trunc_tl_i32(t1, t0);
12358                 tcg_temp_free(t0);
12359                 tcg_gen_andi_i32(hflags, hflags, ~(uint32_t)MIPS_HFLAG_M16);
12360                 tcg_gen_shli_i32(t1, t1, MIPS_HFLAG_M16_SHIFT);
12361                 tcg_gen_or_i32(hflags, hflags, t1);
12362                 tcg_temp_free_i32(t1);
12363
12364                 tcg_gen_andi_tl(cpu_PC, btarget, ~(target_ulong)0x1);
12365             } else {
12366                 tcg_gen_mov_tl(cpu_PC, btarget);
12367             }
12368             if (ctx->base.singlestep_enabled) {
12369                 save_cpu_state(ctx, 0);
12370                 gen_helper_raise_exception_debug(cpu_env);
12371             }
12372             tcg_gen_lookup_and_goto_ptr();
12373             break;
12374         default:
12375             fprintf(stderr, "unknown branch 0x%x\n", proc_hflags);
12376             abort();
12377         }
12378     }
12379 }
12380
12381 /* Compact Branches */
12382 static void gen_compute_compact_branch(DisasContext *ctx, uint32_t opc,
12383                                        int rs, int rt, int32_t offset)
12384 {
12385     int bcond_compute = 0;
12386     TCGv t0 = tcg_temp_new();
12387     TCGv t1 = tcg_temp_new();
12388     int m16_lowbit = (ctx->hflags & MIPS_HFLAG_M16) != 0;
12389
12390     if (ctx->hflags & MIPS_HFLAG_BMASK) {
12391 #ifdef MIPS_DEBUG_DISAS
12392         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
12393                   "\n", ctx->base.pc_next);
12394 #endif
12395         generate_exception_end(ctx, EXCP_RI);
12396         goto out;
12397     }
12398
12399     /* Load needed operands and calculate btarget */
12400     switch (opc) {
12401     /* compact branch */
12402     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
12403     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
12404         gen_load_gpr(t0, rs);
12405         gen_load_gpr(t1, rt);
12406         bcond_compute = 1;
12407         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12408         if (rs <= rt && rs == 0) {
12409             /* OPC_BEQZALC, OPC_BNEZALC */
12410             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
12411         }
12412         break;
12413     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
12414     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
12415         gen_load_gpr(t0, rs);
12416         gen_load_gpr(t1, rt);
12417         bcond_compute = 1;
12418         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12419         break;
12420     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
12421     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
12422         if (rs == 0 || rs == rt) {
12423             /* OPC_BLEZALC, OPC_BGEZALC */
12424             /* OPC_BGTZALC, OPC_BLTZALC */
12425             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
12426         }
12427         gen_load_gpr(t0, rs);
12428         gen_load_gpr(t1, rt);
12429         bcond_compute = 1;
12430         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12431         break;
12432     case OPC_BC:
12433     case OPC_BALC:
12434         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12435         break;
12436     case OPC_BEQZC:
12437     case OPC_BNEZC:
12438         if (rs != 0) {
12439             /* OPC_BEQZC, OPC_BNEZC */
12440             gen_load_gpr(t0, rs);
12441             bcond_compute = 1;
12442             ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12443         } else {
12444             /* OPC_JIC, OPC_JIALC */
12445             TCGv tbase = tcg_temp_new();
12446             TCGv toffset = tcg_temp_new();
12447
12448             gen_load_gpr(tbase, rt);
12449             tcg_gen_movi_tl(toffset, offset);
12450             gen_op_addr_add(ctx, btarget, tbase, toffset);
12451             tcg_temp_free(tbase);
12452             tcg_temp_free(toffset);
12453         }
12454         break;
12455     default:
12456         MIPS_INVAL("Compact branch/jump");
12457         generate_exception_end(ctx, EXCP_RI);
12458         goto out;
12459     }
12460
12461     if (bcond_compute == 0) {
12462         /* Uncoditional compact branch */
12463         switch (opc) {
12464         case OPC_JIALC:
12465             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
12466             /* Fallthrough */
12467         case OPC_JIC:
12468             ctx->hflags |= MIPS_HFLAG_BR;
12469             break;
12470         case OPC_BALC:
12471             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
12472             /* Fallthrough */
12473         case OPC_BC:
12474             ctx->hflags |= MIPS_HFLAG_B;
12475             break;
12476         default:
12477             MIPS_INVAL("Compact branch/jump");
12478             generate_exception_end(ctx, EXCP_RI);
12479             goto out;
12480         }
12481
12482         /* Generating branch here as compact branches don't have delay slot */
12483         gen_branch(ctx, 4);
12484     } else {
12485         /* Conditional compact branch */
12486         TCGLabel *fs = gen_new_label();
12487         save_cpu_state(ctx, 0);
12488
12489         switch (opc) {
12490         case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
12491             if (rs == 0 && rt != 0) {
12492                 /* OPC_BLEZALC */
12493                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
12494             } else if (rs != 0 && rt != 0 && rs == rt) {
12495                 /* OPC_BGEZALC */
12496                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
12497             } else {
12498                 /* OPC_BGEUC */
12499                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GEU), t0, t1, fs);
12500             }
12501             break;
12502         case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
12503             if (rs == 0 && rt != 0) {
12504                 /* OPC_BGTZALC */
12505                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
12506             } else if (rs != 0 && rt != 0 && rs == rt) {
12507                 /* OPC_BLTZALC */
12508                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
12509             } else {
12510                 /* OPC_BLTUC */
12511                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LTU), t0, t1, fs);
12512             }
12513             break;
12514         case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
12515             if (rs == 0 && rt != 0) {
12516                 /* OPC_BLEZC */
12517                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
12518             } else if (rs != 0 && rt != 0 && rs == rt) {
12519                 /* OPC_BGEZC */
12520                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
12521             } else {
12522                 /* OPC_BGEC */
12523                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GE), t0, t1, fs);
12524             }
12525             break;
12526         case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
12527             if (rs == 0 && rt != 0) {
12528                 /* OPC_BGTZC */
12529                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
12530             } else if (rs != 0 && rt != 0 && rs == rt) {
12531                 /* OPC_BLTZC */
12532                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
12533             } else {
12534                 /* OPC_BLTC */
12535                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LT), t0, t1, fs);
12536             }
12537             break;
12538         case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
12539         case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
12540             if (rs >= rt) {
12541                 /* OPC_BOVC, OPC_BNVC */
12542                 TCGv t2 = tcg_temp_new();
12543                 TCGv t3 = tcg_temp_new();
12544                 TCGv t4 = tcg_temp_new();
12545                 TCGv input_overflow = tcg_temp_new();
12546
12547                 gen_load_gpr(t0, rs);
12548                 gen_load_gpr(t1, rt);
12549                 tcg_gen_ext32s_tl(t2, t0);
12550                 tcg_gen_setcond_tl(TCG_COND_NE, input_overflow, t2, t0);
12551                 tcg_gen_ext32s_tl(t3, t1);
12552                 tcg_gen_setcond_tl(TCG_COND_NE, t4, t3, t1);
12553                 tcg_gen_or_tl(input_overflow, input_overflow, t4);
12554
12555                 tcg_gen_add_tl(t4, t2, t3);
12556                 tcg_gen_ext32s_tl(t4, t4);
12557                 tcg_gen_xor_tl(t2, t2, t3);
12558                 tcg_gen_xor_tl(t3, t4, t3);
12559                 tcg_gen_andc_tl(t2, t3, t2);
12560                 tcg_gen_setcondi_tl(TCG_COND_LT, t4, t2, 0);
12561                 tcg_gen_or_tl(t4, t4, input_overflow);
12562                 if (opc == OPC_BOVC) {
12563                     /* OPC_BOVC */
12564                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t4, 0, fs);
12565                 } else {
12566                     /* OPC_BNVC */
12567                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t4, 0, fs);
12568                 }
12569                 tcg_temp_free(input_overflow);
12570                 tcg_temp_free(t4);
12571                 tcg_temp_free(t3);
12572                 tcg_temp_free(t2);
12573             } else if (rs < rt && rs == 0) {
12574                 /* OPC_BEQZALC, OPC_BNEZALC */
12575                 if (opc == OPC_BEQZALC) {
12576                     /* OPC_BEQZALC */
12577                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t1, 0, fs);
12578                 } else {
12579                     /* OPC_BNEZALC */
12580                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t1, 0, fs);
12581                 }
12582             } else {
12583                 /* OPC_BEQC, OPC_BNEC */
12584                 if (opc == OPC_BEQC) {
12585                     /* OPC_BEQC */
12586                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_EQ), t0, t1, fs);
12587                 } else {
12588                     /* OPC_BNEC */
12589                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_NE), t0, t1, fs);
12590                 }
12591             }
12592             break;
12593         case OPC_BEQZC:
12594             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t0, 0, fs);
12595             break;
12596         case OPC_BNEZC:
12597             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t0, 0, fs);
12598             break;
12599         default:
12600             MIPS_INVAL("Compact conditional branch/jump");
12601             generate_exception_end(ctx, EXCP_RI);
12602             goto out;
12603         }
12604
12605         /* Generating branch here as compact branches don't have delay slot */
12606         gen_goto_tb(ctx, 1, ctx->btarget);
12607         gen_set_label(fs);
12608
12609         ctx->hflags |= MIPS_HFLAG_FBNSLOT;
12610     }
12611
12612 out:
12613     tcg_temp_free(t0);
12614     tcg_temp_free(t1);
12615 }
12616
12617 /* ISA extensions (ASEs) */
12618 /* MIPS16 extension to MIPS32 */
12619
12620 /* MIPS16 major opcodes */
12621 enum {
12622   M16_OPC_ADDIUSP = 0x00,
12623   M16_OPC_ADDIUPC = 0x01,
12624   M16_OPC_B = 0x02,
12625   M16_OPC_JAL = 0x03,
12626   M16_OPC_BEQZ = 0x04,
12627   M16_OPC_BNEQZ = 0x05,
12628   M16_OPC_SHIFT = 0x06,
12629   M16_OPC_LD = 0x07,
12630   M16_OPC_RRIA = 0x08,
12631   M16_OPC_ADDIU8 = 0x09,
12632   M16_OPC_SLTI = 0x0a,
12633   M16_OPC_SLTIU = 0x0b,
12634   M16_OPC_I8 = 0x0c,
12635   M16_OPC_LI = 0x0d,
12636   M16_OPC_CMPI = 0x0e,
12637   M16_OPC_SD = 0x0f,
12638   M16_OPC_LB = 0x10,
12639   M16_OPC_LH = 0x11,
12640   M16_OPC_LWSP = 0x12,
12641   M16_OPC_LW = 0x13,
12642   M16_OPC_LBU = 0x14,
12643   M16_OPC_LHU = 0x15,
12644   M16_OPC_LWPC = 0x16,
12645   M16_OPC_LWU = 0x17,
12646   M16_OPC_SB = 0x18,
12647   M16_OPC_SH = 0x19,
12648   M16_OPC_SWSP = 0x1a,
12649   M16_OPC_SW = 0x1b,
12650   M16_OPC_RRR = 0x1c,
12651   M16_OPC_RR = 0x1d,
12652   M16_OPC_EXTEND = 0x1e,
12653   M16_OPC_I64 = 0x1f
12654 };
12655
12656 /* I8 funct field */
12657 enum {
12658   I8_BTEQZ = 0x0,
12659   I8_BTNEZ = 0x1,
12660   I8_SWRASP = 0x2,
12661   I8_ADJSP = 0x3,
12662   I8_SVRS = 0x4,
12663   I8_MOV32R = 0x5,
12664   I8_MOVR32 = 0x7
12665 };
12666
12667 /* RRR f field */
12668 enum {
12669   RRR_DADDU = 0x0,
12670   RRR_ADDU = 0x1,
12671   RRR_DSUBU = 0x2,
12672   RRR_SUBU = 0x3
12673 };
12674
12675 /* RR funct field */
12676 enum {
12677   RR_JR = 0x00,
12678   RR_SDBBP = 0x01,
12679   RR_SLT = 0x02,
12680   RR_SLTU = 0x03,
12681   RR_SLLV = 0x04,
12682   RR_BREAK = 0x05,
12683   RR_SRLV = 0x06,
12684   RR_SRAV = 0x07,
12685   RR_DSRL = 0x08,
12686   RR_CMP = 0x0a,
12687   RR_NEG = 0x0b,
12688   RR_AND = 0x0c,
12689   RR_OR = 0x0d,
12690   RR_XOR = 0x0e,
12691   RR_NOT = 0x0f,
12692   RR_MFHI = 0x10,
12693   RR_CNVT = 0x11,
12694   RR_MFLO = 0x12,
12695   RR_DSRA = 0x13,
12696   RR_DSLLV = 0x14,
12697   RR_DSRLV = 0x16,
12698   RR_DSRAV = 0x17,
12699   RR_MULT = 0x18,
12700   RR_MULTU = 0x19,
12701   RR_DIV = 0x1a,
12702   RR_DIVU = 0x1b,
12703   RR_DMULT = 0x1c,
12704   RR_DMULTU = 0x1d,
12705   RR_DDIV = 0x1e,
12706   RR_DDIVU = 0x1f
12707 };
12708
12709 /* I64 funct field */
12710 enum {
12711   I64_LDSP = 0x0,
12712   I64_SDSP = 0x1,
12713   I64_SDRASP = 0x2,
12714   I64_DADJSP = 0x3,
12715   I64_LDPC = 0x4,
12716   I64_DADDIU5 = 0x5,
12717   I64_DADDIUPC = 0x6,
12718   I64_DADDIUSP = 0x7
12719 };
12720
12721 /* RR ry field for CNVT */
12722 enum {
12723   RR_RY_CNVT_ZEB = 0x0,
12724   RR_RY_CNVT_ZEH = 0x1,
12725   RR_RY_CNVT_ZEW = 0x2,
12726   RR_RY_CNVT_SEB = 0x4,
12727   RR_RY_CNVT_SEH = 0x5,
12728   RR_RY_CNVT_SEW = 0x6,
12729 };
12730
12731 static int xlat (int r)
12732 {
12733   static int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
12734
12735   return map[r];
12736 }
12737
12738 static void gen_mips16_save (DisasContext *ctx,
12739                              int xsregs, int aregs,
12740                              int do_ra, int do_s0, int do_s1,
12741                              int framesize)
12742 {
12743     TCGv t0 = tcg_temp_new();
12744     TCGv t1 = tcg_temp_new();
12745     TCGv t2 = tcg_temp_new();
12746     int args, astatic;
12747
12748     switch (aregs) {
12749     case 0:
12750     case 1:
12751     case 2:
12752     case 3:
12753     case 11:
12754         args = 0;
12755         break;
12756     case 4:
12757     case 5:
12758     case 6:
12759     case 7:
12760         args = 1;
12761         break;
12762     case 8:
12763     case 9:
12764     case 10:
12765         args = 2;
12766         break;
12767     case 12:
12768     case 13:
12769         args = 3;
12770         break;
12771     case 14:
12772         args = 4;
12773         break;
12774     default:
12775         generate_exception_end(ctx, EXCP_RI);
12776         return;
12777     }
12778
12779     switch (args) {
12780     case 4:
12781         gen_base_offset_addr(ctx, t0, 29, 12);
12782         gen_load_gpr(t1, 7);
12783         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12784         /* Fall through */
12785     case 3:
12786         gen_base_offset_addr(ctx, t0, 29, 8);
12787         gen_load_gpr(t1, 6);
12788         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12789         /* Fall through */
12790     case 2:
12791         gen_base_offset_addr(ctx, t0, 29, 4);
12792         gen_load_gpr(t1, 5);
12793         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12794         /* Fall through */
12795     case 1:
12796         gen_base_offset_addr(ctx, t0, 29, 0);
12797         gen_load_gpr(t1, 4);
12798         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12799     }
12800
12801     gen_load_gpr(t0, 29);
12802
12803 #define DECR_AND_STORE(reg) do {                                 \
12804         tcg_gen_movi_tl(t2, -4);                                 \
12805         gen_op_addr_add(ctx, t0, t0, t2);                        \
12806         gen_load_gpr(t1, reg);                                   \
12807         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL); \
12808     } while (0)
12809
12810     if (do_ra) {
12811         DECR_AND_STORE(31);
12812     }
12813
12814     switch (xsregs) {
12815     case 7:
12816         DECR_AND_STORE(30);
12817         /* Fall through */
12818     case 6:
12819         DECR_AND_STORE(23);
12820         /* Fall through */
12821     case 5:
12822         DECR_AND_STORE(22);
12823         /* Fall through */
12824     case 4:
12825         DECR_AND_STORE(21);
12826         /* Fall through */
12827     case 3:
12828         DECR_AND_STORE(20);
12829         /* Fall through */
12830     case 2:
12831         DECR_AND_STORE(19);
12832         /* Fall through */
12833     case 1:
12834         DECR_AND_STORE(18);
12835     }
12836
12837     if (do_s1) {
12838         DECR_AND_STORE(17);
12839     }
12840     if (do_s0) {
12841         DECR_AND_STORE(16);
12842     }
12843
12844     switch (aregs) {
12845     case 0:
12846     case 4:
12847     case 8:
12848     case 12:
12849     case 14:
12850         astatic = 0;
12851         break;
12852     case 1:
12853     case 5:
12854     case 9:
12855     case 13:
12856         astatic = 1;
12857         break;
12858     case 2:
12859     case 6:
12860     case 10:
12861         astatic = 2;
12862         break;
12863     case 3:
12864     case 7:
12865         astatic = 3;
12866         break;
12867     case 11:
12868         astatic = 4;
12869         break;
12870     default:
12871         generate_exception_end(ctx, EXCP_RI);
12872         return;
12873     }
12874
12875     if (astatic > 0) {
12876         DECR_AND_STORE(7);
12877         if (astatic > 1) {
12878             DECR_AND_STORE(6);
12879             if (astatic > 2) {
12880                 DECR_AND_STORE(5);
12881                 if (astatic > 3) {
12882                     DECR_AND_STORE(4);
12883                 }
12884             }
12885         }
12886     }
12887 #undef DECR_AND_STORE
12888
12889     tcg_gen_movi_tl(t2, -framesize);
12890     gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
12891     tcg_temp_free(t0);
12892     tcg_temp_free(t1);
12893     tcg_temp_free(t2);
12894 }
12895
12896 static void gen_mips16_restore (DisasContext *ctx,
12897                                 int xsregs, int aregs,
12898                                 int do_ra, int do_s0, int do_s1,
12899                                 int framesize)
12900 {
12901     int astatic;
12902     TCGv t0 = tcg_temp_new();
12903     TCGv t1 = tcg_temp_new();
12904     TCGv t2 = tcg_temp_new();
12905
12906     tcg_gen_movi_tl(t2, framesize);
12907     gen_op_addr_add(ctx, t0, cpu_gpr[29], t2);
12908
12909 #define DECR_AND_LOAD(reg) do {                            \
12910         tcg_gen_movi_tl(t2, -4);                           \
12911         gen_op_addr_add(ctx, t0, t0, t2);                  \
12912         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL); \
12913         gen_store_gpr(t1, reg);                            \
12914     } while (0)
12915
12916     if (do_ra) {
12917         DECR_AND_LOAD(31);
12918     }
12919
12920     switch (xsregs) {
12921     case 7:
12922         DECR_AND_LOAD(30);
12923         /* Fall through */
12924     case 6:
12925         DECR_AND_LOAD(23);
12926         /* Fall through */
12927     case 5:
12928         DECR_AND_LOAD(22);
12929         /* Fall through */
12930     case 4:
12931         DECR_AND_LOAD(21);
12932         /* Fall through */
12933     case 3:
12934         DECR_AND_LOAD(20);
12935         /* Fall through */
12936     case 2:
12937         DECR_AND_LOAD(19);
12938         /* Fall through */
12939     case 1:
12940         DECR_AND_LOAD(18);
12941     }
12942
12943     if (do_s1) {
12944         DECR_AND_LOAD(17);
12945     }
12946     if (do_s0) {
12947         DECR_AND_LOAD(16);
12948     }
12949
12950     switch (aregs) {
12951     case 0:
12952     case 4:
12953     case 8:
12954     case 12:
12955     case 14:
12956         astatic = 0;
12957         break;
12958     case 1:
12959     case 5:
12960     case 9:
12961     case 13:
12962         astatic = 1;
12963         break;
12964     case 2:
12965     case 6:
12966     case 10:
12967         astatic = 2;
12968         break;
12969     case 3:
12970     case 7:
12971         astatic = 3;
12972         break;
12973     case 11:
12974         astatic = 4;
12975         break;
12976     default:
12977         generate_exception_end(ctx, EXCP_RI);
12978         return;
12979     }
12980
12981     if (astatic > 0) {
12982         DECR_AND_LOAD(7);
12983         if (astatic > 1) {
12984             DECR_AND_LOAD(6);
12985             if (astatic > 2) {
12986                 DECR_AND_LOAD(5);
12987                 if (astatic > 3) {
12988                     DECR_AND_LOAD(4);
12989                 }
12990             }
12991         }
12992     }
12993 #undef DECR_AND_LOAD
12994
12995     tcg_gen_movi_tl(t2, framesize);
12996     gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
12997     tcg_temp_free(t0);
12998     tcg_temp_free(t1);
12999     tcg_temp_free(t2);
13000 }
13001
13002 static void gen_addiupc (DisasContext *ctx, int rx, int imm,
13003                          int is_64_bit, int extended)
13004 {
13005     TCGv t0;
13006
13007     if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
13008         generate_exception_end(ctx, EXCP_RI);
13009         return;
13010     }
13011
13012     t0 = tcg_temp_new();
13013
13014     tcg_gen_movi_tl(t0, pc_relative_pc(ctx));
13015     tcg_gen_addi_tl(cpu_gpr[rx], t0, imm);
13016     if (!is_64_bit) {
13017         tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
13018     }
13019
13020     tcg_temp_free(t0);
13021 }
13022
13023 static void gen_cache_operation(DisasContext *ctx, uint32_t op, int base,
13024                                 int16_t offset)
13025 {
13026     TCGv_i32 t0 = tcg_const_i32(op);
13027     TCGv t1 = tcg_temp_new();
13028     gen_base_offset_addr(ctx, t1, base, offset);
13029     gen_helper_cache(cpu_env, t1, t0);
13030 }
13031
13032 #if defined(TARGET_MIPS64)
13033 static void decode_i64_mips16 (DisasContext *ctx,
13034                                int ry, int funct, int16_t offset,
13035                                int extended)
13036 {
13037     switch (funct) {
13038     case I64_LDSP:
13039         check_insn(ctx, ISA_MIPS3);
13040         check_mips_64(ctx);
13041         offset = extended ? offset : offset << 3;
13042         gen_ld(ctx, OPC_LD, ry, 29, offset);
13043         break;
13044     case I64_SDSP:
13045         check_insn(ctx, ISA_MIPS3);
13046         check_mips_64(ctx);
13047         offset = extended ? offset : offset << 3;
13048         gen_st(ctx, OPC_SD, ry, 29, offset);
13049         break;
13050     case I64_SDRASP:
13051         check_insn(ctx, ISA_MIPS3);
13052         check_mips_64(ctx);
13053         offset = extended ? offset : (ctx->opcode & 0xff) << 3;
13054         gen_st(ctx, OPC_SD, 31, 29, offset);
13055         break;
13056     case I64_DADJSP:
13057         check_insn(ctx, ISA_MIPS3);
13058         check_mips_64(ctx);
13059         offset = extended ? offset : ((int8_t)ctx->opcode) << 3;
13060         gen_arith_imm(ctx, OPC_DADDIU, 29, 29, offset);
13061         break;
13062     case I64_LDPC:
13063         check_insn(ctx, ISA_MIPS3);
13064         check_mips_64(ctx);
13065         if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
13066             generate_exception_end(ctx, EXCP_RI);
13067         } else {
13068             offset = extended ? offset : offset << 3;
13069             gen_ld(ctx, OPC_LDPC, ry, 0, offset);
13070         }
13071         break;
13072     case I64_DADDIU5:
13073         check_insn(ctx, ISA_MIPS3);
13074         check_mips_64(ctx);
13075         offset = extended ? offset : ((int8_t)(offset << 3)) >> 3;
13076         gen_arith_imm(ctx, OPC_DADDIU, ry, ry, offset);
13077         break;
13078     case I64_DADDIUPC:
13079         check_insn(ctx, ISA_MIPS3);
13080         check_mips_64(ctx);
13081         offset = extended ? offset : offset << 2;
13082         gen_addiupc(ctx, ry, offset, 1, extended);
13083         break;
13084     case I64_DADDIUSP:
13085         check_insn(ctx, ISA_MIPS3);
13086         check_mips_64(ctx);
13087         offset = extended ? offset : offset << 2;
13088         gen_arith_imm(ctx, OPC_DADDIU, ry, 29, offset);
13089         break;
13090     }
13091 }
13092 #endif
13093
13094 static int decode_extended_mips16_opc (CPUMIPSState *env, DisasContext *ctx)
13095 {
13096     int extend = cpu_lduw_code(env, ctx->base.pc_next + 2);
13097     int op, rx, ry, funct, sa;
13098     int16_t imm, offset;
13099
13100     ctx->opcode = (ctx->opcode << 16) | extend;
13101     op = (ctx->opcode >> 11) & 0x1f;
13102     sa = (ctx->opcode >> 22) & 0x1f;
13103     funct = (ctx->opcode >> 8) & 0x7;
13104     rx = xlat((ctx->opcode >> 8) & 0x7);
13105     ry = xlat((ctx->opcode >> 5) & 0x7);
13106     offset = imm = (int16_t) (((ctx->opcode >> 16) & 0x1f) << 11
13107                               | ((ctx->opcode >> 21) & 0x3f) << 5
13108                               | (ctx->opcode & 0x1f));
13109
13110     /* The extended opcodes cleverly reuse the opcodes from their 16-bit
13111        counterparts.  */
13112     switch (op) {
13113     case M16_OPC_ADDIUSP:
13114         gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
13115         break;
13116     case M16_OPC_ADDIUPC:
13117         gen_addiupc(ctx, rx, imm, 0, 1);
13118         break;
13119     case M16_OPC_B:
13120         gen_compute_branch(ctx, OPC_BEQ, 4, 0, 0, offset << 1, 0);
13121         /* No delay slot, so just process as a normal instruction */
13122         break;
13123     case M16_OPC_BEQZ:
13124         gen_compute_branch(ctx, OPC_BEQ, 4, rx, 0, offset << 1, 0);
13125         /* No delay slot, so just process as a normal instruction */
13126         break;
13127     case M16_OPC_BNEQZ:
13128         gen_compute_branch(ctx, OPC_BNE, 4, rx, 0, offset << 1, 0);
13129         /* No delay slot, so just process as a normal instruction */
13130         break;
13131     case M16_OPC_SHIFT:
13132         switch (ctx->opcode & 0x3) {
13133         case 0x0:
13134             gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
13135             break;
13136         case 0x1:
13137 #if defined(TARGET_MIPS64)
13138             check_mips_64(ctx);
13139             gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
13140 #else
13141             generate_exception_end(ctx, EXCP_RI);
13142 #endif
13143             break;
13144         case 0x2:
13145             gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
13146             break;
13147         case 0x3:
13148             gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
13149             break;
13150         }
13151         break;
13152 #if defined(TARGET_MIPS64)
13153     case M16_OPC_LD:
13154         check_insn(ctx, ISA_MIPS3);
13155         check_mips_64(ctx);
13156         gen_ld(ctx, OPC_LD, ry, rx, offset);
13157         break;
13158 #endif
13159     case M16_OPC_RRIA:
13160         imm = ctx->opcode & 0xf;
13161         imm = imm | ((ctx->opcode >> 20) & 0x7f) << 4;
13162         imm = imm | ((ctx->opcode >> 16) & 0xf) << 11;
13163         imm = (int16_t) (imm << 1) >> 1;
13164         if ((ctx->opcode >> 4) & 0x1) {
13165 #if defined(TARGET_MIPS64)
13166             check_mips_64(ctx);
13167             gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
13168 #else
13169             generate_exception_end(ctx, EXCP_RI);
13170 #endif
13171         } else {
13172             gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
13173         }
13174         break;
13175     case M16_OPC_ADDIU8:
13176         gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
13177         break;
13178     case M16_OPC_SLTI:
13179         gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
13180         break;
13181     case M16_OPC_SLTIU:
13182         gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
13183         break;
13184     case M16_OPC_I8:
13185         switch (funct) {
13186         case I8_BTEQZ:
13187             gen_compute_branch(ctx, OPC_BEQ, 4, 24, 0, offset << 1, 0);
13188             break;
13189         case I8_BTNEZ:
13190             gen_compute_branch(ctx, OPC_BNE, 4, 24, 0, offset << 1, 0);
13191             break;
13192         case I8_SWRASP:
13193             gen_st(ctx, OPC_SW, 31, 29, imm);
13194             break;
13195         case I8_ADJSP:
13196             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm);
13197             break;
13198         case I8_SVRS:
13199             check_insn(ctx, ISA_MIPS32);
13200             {
13201                 int xsregs = (ctx->opcode >> 24) & 0x7;
13202                 int aregs = (ctx->opcode >> 16) & 0xf;
13203                 int do_ra = (ctx->opcode >> 6) & 0x1;
13204                 int do_s0 = (ctx->opcode >> 5) & 0x1;
13205                 int do_s1 = (ctx->opcode >> 4) & 0x1;
13206                 int framesize = (((ctx->opcode >> 20) & 0xf) << 4
13207                                  | (ctx->opcode & 0xf)) << 3;
13208
13209                 if (ctx->opcode & (1 << 7)) {
13210                     gen_mips16_save(ctx, xsregs, aregs,
13211                                     do_ra, do_s0, do_s1,
13212                                     framesize);
13213                 } else {
13214                     gen_mips16_restore(ctx, xsregs, aregs,
13215                                        do_ra, do_s0, do_s1,
13216                                        framesize);
13217                 }
13218             }
13219             break;
13220         default:
13221             generate_exception_end(ctx, EXCP_RI);
13222             break;
13223         }
13224         break;
13225     case M16_OPC_LI:
13226         tcg_gen_movi_tl(cpu_gpr[rx], (uint16_t) imm);
13227         break;
13228     case M16_OPC_CMPI:
13229         tcg_gen_xori_tl(cpu_gpr[24], cpu_gpr[rx], (uint16_t) imm);
13230         break;
13231 #if defined(TARGET_MIPS64)
13232     case M16_OPC_SD:
13233         check_insn(ctx, ISA_MIPS3);
13234         check_mips_64(ctx);
13235         gen_st(ctx, OPC_SD, ry, rx, offset);
13236         break;
13237 #endif
13238     case M16_OPC_LB:
13239         gen_ld(ctx, OPC_LB, ry, rx, offset);
13240         break;
13241     case M16_OPC_LH:
13242         gen_ld(ctx, OPC_LH, ry, rx, offset);
13243         break;
13244     case M16_OPC_LWSP:
13245         gen_ld(ctx, OPC_LW, rx, 29, offset);
13246         break;
13247     case M16_OPC_LW:
13248         gen_ld(ctx, OPC_LW, ry, rx, offset);
13249         break;
13250     case M16_OPC_LBU:
13251         gen_ld(ctx, OPC_LBU, ry, rx, offset);
13252         break;
13253     case M16_OPC_LHU:
13254         gen_ld(ctx, OPC_LHU, ry, rx, offset);
13255         break;
13256     case M16_OPC_LWPC:
13257         gen_ld(ctx, OPC_LWPC, rx, 0, offset);
13258         break;
13259 #if defined(TARGET_MIPS64)
13260     case M16_OPC_LWU:
13261         check_insn(ctx, ISA_MIPS3);
13262         check_mips_64(ctx);
13263         gen_ld(ctx, OPC_LWU, ry, rx, offset);
13264         break;
13265 #endif
13266     case M16_OPC_SB:
13267         gen_st(ctx, OPC_SB, ry, rx, offset);
13268         break;
13269     case M16_OPC_SH:
13270         gen_st(ctx, OPC_SH, ry, rx, offset);
13271         break;
13272     case M16_OPC_SWSP:
13273         gen_st(ctx, OPC_SW, rx, 29, offset);
13274         break;
13275     case M16_OPC_SW:
13276         gen_st(ctx, OPC_SW, ry, rx, offset);
13277         break;
13278 #if defined(TARGET_MIPS64)
13279     case M16_OPC_I64:
13280         decode_i64_mips16(ctx, ry, funct, offset, 1);
13281         break;
13282 #endif
13283     default:
13284         generate_exception_end(ctx, EXCP_RI);
13285         break;
13286     }
13287
13288     return 4;
13289 }
13290
13291 static inline bool is_uhi(int sdbbp_code)
13292 {
13293 #ifdef CONFIG_USER_ONLY
13294     return false;
13295 #else
13296     return semihosting_enabled() && sdbbp_code == 1;
13297 #endif
13298 }
13299
13300 static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx)
13301 {
13302     int rx, ry;
13303     int sa;
13304     int op, cnvt_op, op1, offset;
13305     int funct;
13306     int n_bytes;
13307
13308     op = (ctx->opcode >> 11) & 0x1f;
13309     sa = (ctx->opcode >> 2) & 0x7;
13310     sa = sa == 0 ? 8 : sa;
13311     rx = xlat((ctx->opcode >> 8) & 0x7);
13312     cnvt_op = (ctx->opcode >> 5) & 0x7;
13313     ry = xlat((ctx->opcode >> 5) & 0x7);
13314     op1 = offset = ctx->opcode & 0x1f;
13315
13316     n_bytes = 2;
13317
13318     switch (op) {
13319     case M16_OPC_ADDIUSP:
13320         {
13321             int16_t imm = ((uint8_t) ctx->opcode) << 2;
13322
13323             gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
13324         }
13325         break;
13326     case M16_OPC_ADDIUPC:
13327         gen_addiupc(ctx, rx, ((uint8_t) ctx->opcode) << 2, 0, 0);
13328         break;
13329     case M16_OPC_B:
13330         offset = (ctx->opcode & 0x7ff) << 1;
13331         offset = (int16_t)(offset << 4) >> 4;
13332         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0, offset, 0);
13333         /* No delay slot, so just process as a normal instruction */
13334         break;
13335     case M16_OPC_JAL:
13336         offset = cpu_lduw_code(env, ctx->base.pc_next + 2);
13337         offset = (((ctx->opcode & 0x1f) << 21)
13338                   | ((ctx->opcode >> 5) & 0x1f) << 16
13339                   | offset) << 2;
13340         op = ((ctx->opcode >> 10) & 0x1) ? OPC_JALX : OPC_JAL;
13341         gen_compute_branch(ctx, op, 4, rx, ry, offset, 2);
13342         n_bytes = 4;
13343         break;
13344     case M16_OPC_BEQZ:
13345         gen_compute_branch(ctx, OPC_BEQ, 2, rx, 0,
13346                            ((int8_t)ctx->opcode) << 1, 0);
13347         /* No delay slot, so just process as a normal instruction */
13348         break;
13349     case M16_OPC_BNEQZ:
13350         gen_compute_branch(ctx, OPC_BNE, 2, rx, 0,
13351                            ((int8_t)ctx->opcode) << 1, 0);
13352         /* No delay slot, so just process as a normal instruction */
13353         break;
13354     case M16_OPC_SHIFT:
13355         switch (ctx->opcode & 0x3) {
13356         case 0x0:
13357             gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
13358             break;
13359         case 0x1:
13360 #if defined(TARGET_MIPS64)
13361             check_insn(ctx, ISA_MIPS3);
13362             check_mips_64(ctx);
13363             gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
13364 #else
13365             generate_exception_end(ctx, EXCP_RI);
13366 #endif
13367             break;
13368         case 0x2:
13369             gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
13370             break;
13371         case 0x3:
13372             gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
13373             break;
13374         }
13375         break;
13376 #if defined(TARGET_MIPS64)
13377     case M16_OPC_LD:
13378         check_insn(ctx, ISA_MIPS3);
13379         check_mips_64(ctx);
13380         gen_ld(ctx, OPC_LD, ry, rx, offset << 3);
13381         break;
13382 #endif
13383     case M16_OPC_RRIA:
13384         {
13385             int16_t imm = (int8_t)((ctx->opcode & 0xf) << 4) >> 4;
13386
13387             if ((ctx->opcode >> 4) & 1) {
13388 #if defined(TARGET_MIPS64)
13389                 check_insn(ctx, ISA_MIPS3);
13390                 check_mips_64(ctx);
13391                 gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
13392 #else
13393                 generate_exception_end(ctx, EXCP_RI);
13394 #endif
13395             } else {
13396                 gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
13397             }
13398         }
13399         break;
13400     case M16_OPC_ADDIU8:
13401         {
13402             int16_t imm = (int8_t) ctx->opcode;
13403
13404             gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
13405         }
13406         break;
13407     case M16_OPC_SLTI:
13408         {
13409             int16_t imm = (uint8_t) ctx->opcode;
13410             gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
13411         }
13412         break;
13413     case M16_OPC_SLTIU:
13414         {
13415             int16_t imm = (uint8_t) ctx->opcode;
13416             gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
13417         }
13418         break;
13419     case M16_OPC_I8:
13420         {
13421             int reg32;
13422
13423             funct = (ctx->opcode >> 8) & 0x7;
13424             switch (funct) {
13425             case I8_BTEQZ:
13426                 gen_compute_branch(ctx, OPC_BEQ, 2, 24, 0,
13427                                    ((int8_t)ctx->opcode) << 1, 0);
13428                 break;
13429             case I8_BTNEZ:
13430                 gen_compute_branch(ctx, OPC_BNE, 2, 24, 0,
13431                                    ((int8_t)ctx->opcode) << 1, 0);
13432                 break;
13433             case I8_SWRASP:
13434                 gen_st(ctx, OPC_SW, 31, 29, (ctx->opcode & 0xff) << 2);
13435                 break;
13436             case I8_ADJSP:
13437                 gen_arith_imm(ctx, OPC_ADDIU, 29, 29,
13438                               ((int8_t)ctx->opcode) << 3);
13439                 break;
13440             case I8_SVRS:
13441                 check_insn(ctx, ISA_MIPS32);
13442                 {
13443                     int do_ra = ctx->opcode & (1 << 6);
13444                     int do_s0 = ctx->opcode & (1 << 5);
13445                     int do_s1 = ctx->opcode & (1 << 4);
13446                     int framesize = ctx->opcode & 0xf;
13447
13448                     if (framesize == 0) {
13449                         framesize = 128;
13450                     } else {
13451                         framesize = framesize << 3;
13452                     }
13453
13454                     if (ctx->opcode & (1 << 7)) {
13455                         gen_mips16_save(ctx, 0, 0,
13456                                         do_ra, do_s0, do_s1, framesize);
13457                     } else {
13458                         gen_mips16_restore(ctx, 0, 0,
13459                                            do_ra, do_s0, do_s1, framesize);
13460                     }
13461                 }
13462                 break;
13463             case I8_MOV32R:
13464                 {
13465                     int rz = xlat(ctx->opcode & 0x7);
13466
13467                     reg32 = (((ctx->opcode >> 3) & 0x3) << 3) |
13468                         ((ctx->opcode >> 5) & 0x7);
13469                     gen_arith(ctx, OPC_ADDU, reg32, rz, 0);
13470                 }
13471                 break;
13472             case I8_MOVR32:
13473                 reg32 = ctx->opcode & 0x1f;
13474                 gen_arith(ctx, OPC_ADDU, ry, reg32, 0);
13475                 break;
13476             default:
13477                 generate_exception_end(ctx, EXCP_RI);
13478                 break;
13479             }
13480         }
13481         break;
13482     case M16_OPC_LI:
13483         {
13484             int16_t imm = (uint8_t) ctx->opcode;
13485
13486             gen_arith_imm(ctx, OPC_ADDIU, rx, 0, imm);
13487         }
13488         break;
13489     case M16_OPC_CMPI:
13490         {
13491             int16_t imm = (uint8_t) ctx->opcode;
13492             gen_logic_imm(ctx, OPC_XORI, 24, rx, imm);
13493         }
13494         break;
13495 #if defined(TARGET_MIPS64)
13496     case M16_OPC_SD:
13497         check_insn(ctx, ISA_MIPS3);
13498         check_mips_64(ctx);
13499         gen_st(ctx, OPC_SD, ry, rx, offset << 3);
13500         break;
13501 #endif
13502     case M16_OPC_LB:
13503         gen_ld(ctx, OPC_LB, ry, rx, offset);
13504         break;
13505     case M16_OPC_LH:
13506         gen_ld(ctx, OPC_LH, ry, rx, offset << 1);
13507         break;
13508     case M16_OPC_LWSP:
13509         gen_ld(ctx, OPC_LW, rx, 29, ((uint8_t)ctx->opcode) << 2);
13510         break;
13511     case M16_OPC_LW:
13512         gen_ld(ctx, OPC_LW, ry, rx, offset << 2);
13513         break;
13514     case M16_OPC_LBU:
13515         gen_ld(ctx, OPC_LBU, ry, rx, offset);
13516         break;
13517     case M16_OPC_LHU:
13518         gen_ld(ctx, OPC_LHU, ry, rx, offset << 1);
13519         break;
13520     case M16_OPC_LWPC:
13521         gen_ld(ctx, OPC_LWPC, rx, 0, ((uint8_t)ctx->opcode) << 2);
13522         break;
13523 #if defined (TARGET_MIPS64)
13524     case M16_OPC_LWU:
13525         check_insn(ctx, ISA_MIPS3);
13526         check_mips_64(ctx);
13527         gen_ld(ctx, OPC_LWU, ry, rx, offset << 2);
13528         break;
13529 #endif
13530     case M16_OPC_SB:
13531         gen_st(ctx, OPC_SB, ry, rx, offset);
13532         break;
13533     case M16_OPC_SH:
13534         gen_st(ctx, OPC_SH, ry, rx, offset << 1);
13535         break;
13536     case M16_OPC_SWSP:
13537         gen_st(ctx, OPC_SW, rx, 29, ((uint8_t)ctx->opcode) << 2);
13538         break;
13539     case M16_OPC_SW:
13540         gen_st(ctx, OPC_SW, ry, rx, offset << 2);
13541         break;
13542     case M16_OPC_RRR:
13543         {
13544             int rz = xlat((ctx->opcode >> 2) & 0x7);
13545             int mips32_op;
13546
13547             switch (ctx->opcode & 0x3) {
13548             case RRR_ADDU:
13549                 mips32_op = OPC_ADDU;
13550                 break;
13551             case RRR_SUBU:
13552                 mips32_op = OPC_SUBU;
13553                 break;
13554 #if defined(TARGET_MIPS64)
13555             case RRR_DADDU:
13556                 mips32_op = OPC_DADDU;
13557                 check_insn(ctx, ISA_MIPS3);
13558                 check_mips_64(ctx);
13559                 break;
13560             case RRR_DSUBU:
13561                 mips32_op = OPC_DSUBU;
13562                 check_insn(ctx, ISA_MIPS3);
13563                 check_mips_64(ctx);
13564                 break;
13565 #endif
13566             default:
13567                 generate_exception_end(ctx, EXCP_RI);
13568                 goto done;
13569             }
13570
13571             gen_arith(ctx, mips32_op, rz, rx, ry);
13572         done:
13573             ;
13574         }
13575         break;
13576     case M16_OPC_RR:
13577         switch (op1) {
13578         case RR_JR:
13579             {
13580                 int nd = (ctx->opcode >> 7) & 0x1;
13581                 int link = (ctx->opcode >> 6) & 0x1;
13582                 int ra = (ctx->opcode >> 5) & 0x1;
13583
13584                 if (nd) {
13585                     check_insn(ctx, ISA_MIPS32);
13586                 }
13587
13588                 if (link) {
13589                     op = OPC_JALR;
13590                 } else {
13591                     op = OPC_JR;
13592                 }
13593
13594                 gen_compute_branch(ctx, op, 2, ra ? 31 : rx, 31, 0,
13595                                    (nd ? 0 : 2));
13596             }
13597             break;
13598         case RR_SDBBP:
13599             if (is_uhi(extract32(ctx->opcode, 5, 6))) {
13600                 gen_helper_do_semihosting(cpu_env);
13601             } else {
13602                 /* XXX: not clear which exception should be raised
13603                  *      when in debug mode...
13604                  */
13605                 check_insn(ctx, ISA_MIPS32);
13606                 generate_exception_end(ctx, EXCP_DBp);
13607             }
13608             break;
13609         case RR_SLT:
13610             gen_slt(ctx, OPC_SLT, 24, rx, ry);
13611             break;
13612         case RR_SLTU:
13613             gen_slt(ctx, OPC_SLTU, 24, rx, ry);
13614             break;
13615         case RR_BREAK:
13616             generate_exception_end(ctx, EXCP_BREAK);
13617             break;
13618         case RR_SLLV:
13619             gen_shift(ctx, OPC_SLLV, ry, rx, ry);
13620             break;
13621         case RR_SRLV:
13622             gen_shift(ctx, OPC_SRLV, ry, rx, ry);
13623             break;
13624         case RR_SRAV:
13625             gen_shift(ctx, OPC_SRAV, ry, rx, ry);
13626             break;
13627 #if defined (TARGET_MIPS64)
13628         case RR_DSRL:
13629             check_insn(ctx, ISA_MIPS3);
13630             check_mips_64(ctx);
13631             gen_shift_imm(ctx, OPC_DSRL, ry, ry, sa);
13632             break;
13633 #endif
13634         case RR_CMP:
13635             gen_logic(ctx, OPC_XOR, 24, rx, ry);
13636             break;
13637         case RR_NEG:
13638             gen_arith(ctx, OPC_SUBU, rx, 0, ry);
13639             break;
13640         case RR_AND:
13641             gen_logic(ctx, OPC_AND, rx, rx, ry);
13642             break;
13643         case RR_OR:
13644             gen_logic(ctx, OPC_OR, rx, rx, ry);
13645             break;
13646         case RR_XOR:
13647             gen_logic(ctx, OPC_XOR, rx, rx, ry);
13648             break;
13649         case RR_NOT:
13650             gen_logic(ctx, OPC_NOR, rx, ry, 0);
13651             break;
13652         case RR_MFHI:
13653             gen_HILO(ctx, OPC_MFHI, 0, rx);
13654             break;
13655         case RR_CNVT:
13656             check_insn(ctx, ISA_MIPS32);
13657             switch (cnvt_op) {
13658             case RR_RY_CNVT_ZEB:
13659                 tcg_gen_ext8u_tl(cpu_gpr[rx], cpu_gpr[rx]);
13660                 break;
13661             case RR_RY_CNVT_ZEH:
13662                 tcg_gen_ext16u_tl(cpu_gpr[rx], cpu_gpr[rx]);
13663                 break;
13664             case RR_RY_CNVT_SEB:
13665                 tcg_gen_ext8s_tl(cpu_gpr[rx], cpu_gpr[rx]);
13666                 break;
13667             case RR_RY_CNVT_SEH:
13668                 tcg_gen_ext16s_tl(cpu_gpr[rx], cpu_gpr[rx]);
13669                 break;
13670 #if defined (TARGET_MIPS64)
13671             case RR_RY_CNVT_ZEW:
13672                 check_insn(ctx, ISA_MIPS64);
13673                 check_mips_64(ctx);
13674                 tcg_gen_ext32u_tl(cpu_gpr[rx], cpu_gpr[rx]);
13675                 break;
13676             case RR_RY_CNVT_SEW:
13677                 check_insn(ctx, ISA_MIPS64);
13678                 check_mips_64(ctx);
13679                 tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
13680                 break;
13681 #endif
13682             default:
13683                 generate_exception_end(ctx, EXCP_RI);
13684                 break;
13685             }
13686             break;
13687         case RR_MFLO:
13688             gen_HILO(ctx, OPC_MFLO, 0, rx);
13689             break;
13690 #if defined (TARGET_MIPS64)
13691         case RR_DSRA:
13692             check_insn(ctx, ISA_MIPS3);
13693             check_mips_64(ctx);
13694             gen_shift_imm(ctx, OPC_DSRA, ry, ry, sa);
13695             break;
13696         case RR_DSLLV:
13697             check_insn(ctx, ISA_MIPS3);
13698             check_mips_64(ctx);
13699             gen_shift(ctx, OPC_DSLLV, ry, rx, ry);
13700             break;
13701         case RR_DSRLV:
13702             check_insn(ctx, ISA_MIPS3);
13703             check_mips_64(ctx);
13704             gen_shift(ctx, OPC_DSRLV, ry, rx, ry);
13705             break;
13706         case RR_DSRAV:
13707             check_insn(ctx, ISA_MIPS3);
13708             check_mips_64(ctx);
13709             gen_shift(ctx, OPC_DSRAV, ry, rx, ry);
13710             break;
13711 #endif
13712         case RR_MULT:
13713             gen_muldiv(ctx, OPC_MULT, 0, rx, ry);
13714             break;
13715         case RR_MULTU:
13716             gen_muldiv(ctx, OPC_MULTU, 0, rx, ry);
13717             break;
13718         case RR_DIV:
13719             gen_muldiv(ctx, OPC_DIV, 0, rx, ry);
13720             break;
13721         case RR_DIVU:
13722             gen_muldiv(ctx, OPC_DIVU, 0, rx, ry);
13723             break;
13724 #if defined (TARGET_MIPS64)
13725         case RR_DMULT:
13726             check_insn(ctx, ISA_MIPS3);
13727             check_mips_64(ctx);
13728             gen_muldiv(ctx, OPC_DMULT, 0, rx, ry);
13729             break;
13730         case RR_DMULTU:
13731             check_insn(ctx, ISA_MIPS3);
13732             check_mips_64(ctx);
13733             gen_muldiv(ctx, OPC_DMULTU, 0, rx, ry);
13734             break;
13735         case RR_DDIV:
13736             check_insn(ctx, ISA_MIPS3);
13737             check_mips_64(ctx);
13738             gen_muldiv(ctx, OPC_DDIV, 0, rx, ry);
13739             break;
13740         case RR_DDIVU:
13741             check_insn(ctx, ISA_MIPS3);
13742             check_mips_64(ctx);
13743             gen_muldiv(ctx, OPC_DDIVU, 0, rx, ry);
13744             break;
13745 #endif
13746         default:
13747             generate_exception_end(ctx, EXCP_RI);
13748             break;
13749         }
13750         break;
13751     case M16_OPC_EXTEND:
13752         decode_extended_mips16_opc(env, ctx);
13753         n_bytes = 4;
13754         break;
13755 #if defined(TARGET_MIPS64)
13756     case M16_OPC_I64:
13757         funct = (ctx->opcode >> 8) & 0x7;
13758         decode_i64_mips16(ctx, ry, funct, offset, 0);
13759         break;
13760 #endif
13761     default:
13762         generate_exception_end(ctx, EXCP_RI);
13763         break;
13764     }
13765
13766     return n_bytes;
13767 }
13768
13769 /* microMIPS extension to MIPS32/MIPS64 */
13770
13771 /*
13772  * microMIPS32/microMIPS64 major opcodes
13773  *
13774  * 1. MIPS Architecture for Programmers Volume II-B:
13775  *      The microMIPS32 Instruction Set (Revision 3.05)
13776  *
13777  *    Table 6.2 microMIPS32 Encoding of Major Opcode Field
13778  *
13779  * 2. MIPS Architecture For Programmers Volume II-A:
13780  *      The MIPS64 Instruction Set (Revision 3.51)
13781  */
13782
13783 enum {
13784     POOL32A = 0x00,
13785     POOL16A = 0x01,
13786     LBU16 = 0x02,
13787     MOVE16 = 0x03,
13788     ADDI32 = 0x04,
13789     R6_LUI = 0x04,
13790     AUI = 0x04,
13791     LBU32 = 0x05,
13792     SB32 = 0x06,
13793     LB32 = 0x07,
13794
13795     POOL32B = 0x08,
13796     POOL16B = 0x09,
13797     LHU16 = 0x0a,
13798     ANDI16 = 0x0b,
13799     ADDIU32 = 0x0c,
13800     LHU32 = 0x0d,
13801     SH32 = 0x0e,
13802     LH32 = 0x0f,
13803
13804     POOL32I = 0x10,
13805     POOL16C = 0x11,
13806     LWSP16 = 0x12,
13807     POOL16D = 0x13,
13808     ORI32 = 0x14,
13809     POOL32F = 0x15,
13810     POOL32S = 0x16,  /* MIPS64 */
13811     DADDIU32 = 0x17, /* MIPS64 */
13812
13813     POOL32C = 0x18,
13814     LWGP16 = 0x19,
13815     LW16 = 0x1a,
13816     POOL16E = 0x1b,
13817     XORI32 = 0x1c,
13818     JALS32 = 0x1d,
13819     BOVC = 0x1d,
13820     BEQC = 0x1d,
13821     BEQZALC = 0x1d,
13822     ADDIUPC = 0x1e,
13823     PCREL = 0x1e,
13824     BNVC = 0x1f,
13825     BNEC = 0x1f,
13826     BNEZALC = 0x1f,
13827
13828     R6_BEQZC = 0x20,
13829     JIC = 0x20,
13830     POOL16F = 0x21,
13831     SB16 = 0x22,
13832     BEQZ16 = 0x23,
13833     BEQZC16 = 0x23,
13834     SLTI32 = 0x24,
13835     BEQ32 = 0x25,
13836     BC = 0x25,
13837     SWC132 = 0x26,
13838     LWC132 = 0x27,
13839
13840     /* 0x29 is reserved */
13841     RES_29 = 0x29,
13842     R6_BNEZC = 0x28,
13843     JIALC = 0x28,
13844     SH16 = 0x2a,
13845     BNEZ16 = 0x2b,
13846     BNEZC16 = 0x2b,
13847     SLTIU32 = 0x2c,
13848     BNE32 = 0x2d,
13849     BALC = 0x2d,
13850     SDC132 = 0x2e,
13851     LDC132 = 0x2f,
13852
13853     /* 0x31 is reserved */
13854     RES_31 = 0x31,
13855     BLEZALC = 0x30,
13856     BGEZALC = 0x30,
13857     BGEUC = 0x30,
13858     SWSP16 = 0x32,
13859     B16 = 0x33,
13860     BC16 = 0x33,
13861     ANDI32 = 0x34,
13862     J32 = 0x35,
13863     BGTZC = 0x35,
13864     BLTZC = 0x35,
13865     BLTC = 0x35,
13866     SD32 = 0x36, /* MIPS64 */
13867     LD32 = 0x37, /* MIPS64 */
13868
13869     /* 0x39 is reserved */
13870     RES_39 = 0x39,
13871     BGTZALC = 0x38,
13872     BLTZALC = 0x38,
13873     BLTUC = 0x38,
13874     SW16 = 0x3a,
13875     LI16 = 0x3b,
13876     JALX32 = 0x3c,
13877     JAL32 = 0x3d,
13878     BLEZC = 0x3d,
13879     BGEZC = 0x3d,
13880     BGEC = 0x3d,
13881     SW32 = 0x3e,
13882     LW32 = 0x3f
13883 };
13884
13885 /* PCREL Instructions perform PC-Relative address calculation. bits 20..16 */
13886 enum {
13887     ADDIUPC_00 = 0x00,
13888     ADDIUPC_01 = 0x01,
13889     ADDIUPC_02 = 0x02,
13890     ADDIUPC_03 = 0x03,
13891     ADDIUPC_04 = 0x04,
13892     ADDIUPC_05 = 0x05,
13893     ADDIUPC_06 = 0x06,
13894     ADDIUPC_07 = 0x07,
13895     AUIPC = 0x1e,
13896     ALUIPC = 0x1f,
13897     LWPC_08 = 0x08,
13898     LWPC_09 = 0x09,
13899     LWPC_0A = 0x0A,
13900     LWPC_0B = 0x0B,
13901     LWPC_0C = 0x0C,
13902     LWPC_0D = 0x0D,
13903     LWPC_0E = 0x0E,
13904     LWPC_0F = 0x0F,
13905 };
13906
13907 /* POOL32A encoding of minor opcode field */
13908
13909 enum {
13910     /* These opcodes are distinguished only by bits 9..6; those bits are
13911      * what are recorded below. */
13912     SLL32 = 0x0,
13913     SRL32 = 0x1,
13914     SRA = 0x2,
13915     ROTR = 0x3,
13916     SELEQZ = 0x5,
13917     SELNEZ = 0x6,
13918     R6_RDHWR = 0x7,
13919
13920     SLLV = 0x0,
13921     SRLV = 0x1,
13922     SRAV = 0x2,
13923     ROTRV = 0x3,
13924     ADD = 0x4,
13925     ADDU32 = 0x5,
13926     SUB = 0x6,
13927     SUBU32 = 0x7,
13928     MUL = 0x8,
13929     AND = 0x9,
13930     OR32 = 0xa,
13931     NOR = 0xb,
13932     XOR32 = 0xc,
13933     SLT = 0xd,
13934     SLTU = 0xe,
13935
13936     MOVN = 0x0,
13937     R6_MUL  = 0x0,
13938     MOVZ = 0x1,
13939     MUH  = 0x1,
13940     MULU = 0x2,
13941     MUHU = 0x3,
13942     LWXS = 0x4,
13943     R6_DIV  = 0x4,
13944     MOD  = 0x5,
13945     R6_DIVU = 0x6,
13946     MODU = 0x7,
13947
13948     /* The following can be distinguished by their lower 6 bits. */
13949     BREAK32 = 0x07,
13950     INS = 0x0c,
13951     LSA = 0x0f,
13952     ALIGN = 0x1f,
13953     EXT = 0x2c,
13954     POOL32AXF = 0x3c,
13955     SIGRIE = 0x3f
13956 };
13957
13958 /* POOL32AXF encoding of minor opcode field extension */
13959
13960 /*
13961  * 1. MIPS Architecture for Programmers Volume II-B:
13962  *      The microMIPS32 Instruction Set (Revision 3.05)
13963  *
13964  *    Table 6.5 POOL32Axf Encoding of Minor Opcode Extension Field
13965  *
13966  * 2. MIPS Architecture for Programmers VolumeIV-e:
13967  *      The MIPS DSP Application-Specific Extension
13968  *        to the microMIPS32 Architecture (Revision 2.34)
13969  *
13970  *    Table 5.5 POOL32Axf Encoding of Minor Opcode Extension Field
13971  */
13972
13973 enum {
13974     /* bits 11..6 */
13975     TEQ = 0x00,
13976     TGE = 0x08,
13977     TGEU = 0x10,
13978     TLT = 0x20,
13979     TLTU = 0x28,
13980     TNE = 0x30,
13981
13982     MFC0 = 0x03,
13983     MTC0 = 0x0b,
13984
13985     /* begin of microMIPS32 DSP */
13986
13987     /* bits 13..12 for 0x01 */
13988     MFHI_ACC = 0x0,
13989     MFLO_ACC = 0x1,
13990     MTHI_ACC = 0x2,
13991     MTLO_ACC = 0x3,
13992
13993     /* bits 13..12 for 0x2a */
13994     MADD_ACC = 0x0,
13995     MADDU_ACC = 0x1,
13996     MSUB_ACC = 0x2,
13997     MSUBU_ACC = 0x3,
13998
13999     /* bits 13..12 for 0x32 */
14000     MULT_ACC = 0x0,
14001     MULTU_ACC = 0x1,
14002
14003     /* end of microMIPS32 DSP */
14004
14005     /* bits 15..12 for 0x2c */
14006     BITSWAP = 0x0,
14007     SEB = 0x2,
14008     SEH = 0x3,
14009     CLO = 0x4,
14010     CLZ = 0x5,
14011     RDHWR = 0x6,
14012     WSBH = 0x7,
14013     MULT = 0x8,
14014     MULTU = 0x9,
14015     DIV = 0xa,
14016     DIVU = 0xb,
14017     MADD = 0xc,
14018     MADDU = 0xd,
14019     MSUB = 0xe,
14020     MSUBU = 0xf,
14021
14022     /* bits 15..12 for 0x34 */
14023     MFC2 = 0x4,
14024     MTC2 = 0x5,
14025     MFHC2 = 0x8,
14026     MTHC2 = 0x9,
14027     CFC2 = 0xc,
14028     CTC2 = 0xd,
14029
14030     /* bits 15..12 for 0x3c */
14031     JALR = 0x0,
14032     JR = 0x0,                   /* alias */
14033     JALRC = 0x0,
14034     JRC = 0x0,
14035     JALR_HB = 0x1,
14036     JALRC_HB = 0x1,
14037     JALRS = 0x4,
14038     JALRS_HB = 0x5,
14039
14040     /* bits 15..12 for 0x05 */
14041     RDPGPR = 0xe,
14042     WRPGPR = 0xf,
14043
14044     /* bits 15..12 for 0x0d */
14045     TLBP = 0x0,
14046     TLBR = 0x1,
14047     TLBWI = 0x2,
14048     TLBWR = 0x3,
14049     TLBINV = 0x4,
14050     TLBINVF = 0x5,
14051     WAIT = 0x9,
14052     IRET = 0xd,
14053     DERET = 0xe,
14054     ERET = 0xf,
14055
14056     /* bits 15..12 for 0x15 */
14057     DMT = 0x0,
14058     DVPE = 0x1,
14059     EMT = 0x2,
14060     EVPE = 0x3,
14061
14062     /* bits 15..12 for 0x1d */
14063     DI = 0x4,
14064     EI = 0x5,
14065
14066     /* bits 15..12 for 0x2d */
14067     SYNC = 0x6,
14068     SYSCALL = 0x8,
14069     SDBBP = 0xd,
14070
14071     /* bits 15..12 for 0x35 */
14072     MFHI32 = 0x0,
14073     MFLO32 = 0x1,
14074     MTHI32 = 0x2,
14075     MTLO32 = 0x3,
14076 };
14077
14078 /* POOL32B encoding of minor opcode field (bits 15..12) */
14079
14080 enum {
14081     LWC2 = 0x0,
14082     LWP = 0x1,
14083     LDP = 0x4,
14084     LWM32 = 0x5,
14085     CACHE = 0x6,
14086     LDM = 0x7,
14087     SWC2 = 0x8,
14088     SWP = 0x9,
14089     SDP = 0xc,
14090     SWM32 = 0xd,
14091     SDM = 0xf
14092 };
14093
14094 /* POOL32C encoding of minor opcode field (bits 15..12) */
14095
14096 enum {
14097     LWL = 0x0,
14098     SWL = 0x8,
14099     LWR = 0x1,
14100     SWR = 0x9,
14101     PREF = 0x2,
14102     ST_EVA = 0xa,
14103     LL = 0x3,
14104     SC = 0xb,
14105     LDL = 0x4,
14106     SDL = 0xc,
14107     LDR = 0x5,
14108     SDR = 0xd,
14109     LD_EVA = 0x6,
14110     LWU = 0xe,
14111     LLD = 0x7,
14112     SCD = 0xf
14113 };
14114
14115 /* POOL32C LD-EVA encoding of minor opcode field (bits 11..9) */
14116
14117 enum {
14118     LBUE = 0x0,
14119     LHUE = 0x1,
14120     LWLE = 0x2,
14121     LWRE = 0x3,
14122     LBE = 0x4,
14123     LHE = 0x5,
14124     LLE = 0x6,
14125     LWE = 0x7,
14126 };
14127
14128 /* POOL32C ST-EVA encoding of minor opcode field (bits 11..9) */
14129
14130 enum {
14131     SWLE = 0x0,
14132     SWRE = 0x1,
14133     PREFE = 0x2,
14134     CACHEE = 0x3,
14135     SBE = 0x4,
14136     SHE = 0x5,
14137     SCE = 0x6,
14138     SWE = 0x7,
14139 };
14140
14141 /* POOL32F encoding of minor opcode field (bits 5..0) */
14142
14143 enum {
14144     /* These are the bit 7..6 values */
14145     ADD_FMT = 0x0,
14146
14147     SUB_FMT = 0x1,
14148
14149     MUL_FMT = 0x2,
14150
14151     DIV_FMT = 0x3,
14152
14153     /* These are the bit 8..6 values */
14154     MOVN_FMT = 0x0,
14155     RSQRT2_FMT = 0x0,
14156     MOVF_FMT = 0x0,
14157     RINT_FMT = 0x0,
14158     SELNEZ_FMT = 0x0,
14159
14160     MOVZ_FMT = 0x1,
14161     LWXC1 = 0x1,
14162     MOVT_FMT = 0x1,
14163     CLASS_FMT = 0x1,
14164     SELEQZ_FMT = 0x1,
14165
14166     PLL_PS = 0x2,
14167     SWXC1 = 0x2,
14168     SEL_FMT = 0x2,
14169
14170     PLU_PS = 0x3,
14171     LDXC1 = 0x3,
14172
14173     MOVN_FMT_04 = 0x4,
14174     PUL_PS = 0x4,
14175     SDXC1 = 0x4,
14176     RECIP2_FMT = 0x4,
14177
14178     MOVZ_FMT_05 = 0x05,
14179     PUU_PS = 0x5,
14180     LUXC1 = 0x5,
14181
14182     CVT_PS_S = 0x6,
14183     SUXC1 = 0x6,
14184     ADDR_PS = 0x6,
14185     PREFX = 0x6,
14186     MADDF_FMT = 0x6,
14187
14188     MULR_PS = 0x7,
14189     MSUBF_FMT = 0x7,
14190
14191     MADD_S = 0x01,
14192     MADD_D = 0x09,
14193     MADD_PS = 0x11,
14194     ALNV_PS = 0x19,
14195     MSUB_S = 0x21,
14196     MSUB_D = 0x29,
14197     MSUB_PS = 0x31,
14198
14199     NMADD_S = 0x02,
14200     NMADD_D = 0x0a,
14201     NMADD_PS = 0x12,
14202     NMSUB_S = 0x22,
14203     NMSUB_D = 0x2a,
14204     NMSUB_PS = 0x32,
14205
14206     MIN_FMT = 0x3,
14207     MAX_FMT = 0xb,
14208     MINA_FMT = 0x23,
14209     MAXA_FMT = 0x2b,
14210     POOL32FXF = 0x3b,
14211
14212     CABS_COND_FMT = 0x1c,              /* MIPS3D */
14213     C_COND_FMT = 0x3c,
14214
14215     CMP_CONDN_S = 0x5,
14216     CMP_CONDN_D = 0x15
14217 };
14218
14219 /* POOL32Fxf encoding of minor opcode extension field */
14220
14221 enum {
14222     CVT_L = 0x04,
14223     RSQRT_FMT = 0x08,
14224     FLOOR_L = 0x0c,
14225     CVT_PW_PS = 0x1c,
14226     CVT_W = 0x24,
14227     SQRT_FMT = 0x28,
14228     FLOOR_W = 0x2c,
14229     CVT_PS_PW = 0x3c,
14230     CFC1 = 0x40,
14231     RECIP_FMT = 0x48,
14232     CEIL_L = 0x4c,
14233     CTC1 = 0x60,
14234     CEIL_W = 0x6c,
14235     MFC1 = 0x80,
14236     CVT_S_PL = 0x84,
14237     TRUNC_L = 0x8c,
14238     MTC1 = 0xa0,
14239     CVT_S_PU = 0xa4,
14240     TRUNC_W = 0xac,
14241     MFHC1 = 0xc0,
14242     ROUND_L = 0xcc,
14243     MTHC1 = 0xe0,
14244     ROUND_W = 0xec,
14245
14246     MOV_FMT = 0x01,
14247     MOVF = 0x05,
14248     ABS_FMT = 0x0d,
14249     RSQRT1_FMT = 0x1d,
14250     MOVT = 0x25,
14251     NEG_FMT = 0x2d,
14252     CVT_D = 0x4d,
14253     RECIP1_FMT = 0x5d,
14254     CVT_S = 0x6d
14255 };
14256
14257 /* POOL32I encoding of minor opcode field (bits 25..21) */
14258
14259 enum {
14260     BLTZ = 0x00,
14261     BLTZAL = 0x01,
14262     BGEZ = 0x02,
14263     BGEZAL = 0x03,
14264     BLEZ = 0x04,
14265     BNEZC = 0x05,
14266     BGTZ = 0x06,
14267     BEQZC = 0x07,
14268     TLTI = 0x08,
14269     BC1EQZC = 0x08,
14270     TGEI = 0x09,
14271     BC1NEZC = 0x09,
14272     TLTIU = 0x0a,
14273     BC2EQZC = 0x0a,
14274     TGEIU = 0x0b,
14275     BC2NEZC = 0x0a,
14276     TNEI = 0x0c,
14277     R6_SYNCI = 0x0c,
14278     LUI = 0x0d,
14279     TEQI = 0x0e,
14280     SYNCI = 0x10,
14281     BLTZALS = 0x11,
14282     BGEZALS = 0x13,
14283     BC2F = 0x14,
14284     BC2T = 0x15,
14285     BPOSGE64 = 0x1a,
14286     BPOSGE32 = 0x1b,
14287     /* These overlap and are distinguished by bit16 of the instruction */
14288     BC1F = 0x1c,
14289     BC1T = 0x1d,
14290     BC1ANY2F = 0x1c,
14291     BC1ANY2T = 0x1d,
14292     BC1ANY4F = 0x1e,
14293     BC1ANY4T = 0x1f
14294 };
14295
14296 /* POOL16A encoding of minor opcode field */
14297
14298 enum {
14299     ADDU16 = 0x0,
14300     SUBU16 = 0x1
14301 };
14302
14303 /* POOL16B encoding of minor opcode field */
14304
14305 enum {
14306     SLL16 = 0x0,
14307     SRL16 = 0x1
14308 };
14309
14310 /* POOL16C encoding of minor opcode field */
14311
14312 enum {
14313     NOT16 = 0x00,
14314     XOR16 = 0x04,
14315     AND16 = 0x08,
14316     OR16 = 0x0c,
14317     LWM16 = 0x10,
14318     SWM16 = 0x14,
14319     JR16 = 0x18,
14320     JRC16 = 0x1a,
14321     JALR16 = 0x1c,
14322     JALR16S = 0x1e,
14323     MFHI16 = 0x20,
14324     MFLO16 = 0x24,
14325     BREAK16 = 0x28,
14326     SDBBP16 = 0x2c,
14327     JRADDIUSP = 0x30
14328 };
14329
14330 /* R6 POOL16C encoding of minor opcode field (bits 0..5) */
14331
14332 enum {
14333     R6_NOT16    = 0x00,
14334     R6_AND16    = 0x01,
14335     R6_LWM16    = 0x02,
14336     R6_JRC16    = 0x03,
14337     MOVEP       = 0x04,
14338     MOVEP_05    = 0x05,
14339     MOVEP_06    = 0x06,
14340     MOVEP_07    = 0x07,
14341     R6_XOR16    = 0x08,
14342     R6_OR16     = 0x09,
14343     R6_SWM16    = 0x0a,
14344     JALRC16     = 0x0b,
14345     MOVEP_0C    = 0x0c,
14346     MOVEP_0D    = 0x0d,
14347     MOVEP_0E    = 0x0e,
14348     MOVEP_0F    = 0x0f,
14349     JRCADDIUSP  = 0x13,
14350     R6_BREAK16  = 0x1b,
14351     R6_SDBBP16  = 0x3b
14352 };
14353
14354 /* POOL16D encoding of minor opcode field */
14355
14356 enum {
14357     ADDIUS5 = 0x0,
14358     ADDIUSP = 0x1
14359 };
14360
14361 /* POOL16E encoding of minor opcode field */
14362
14363 enum {
14364     ADDIUR2 = 0x0,
14365     ADDIUR1SP = 0x1
14366 };
14367
14368 static int mmreg (int r)
14369 {
14370     static const int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
14371
14372     return map[r];
14373 }
14374
14375 /* Used for 16-bit store instructions.  */
14376 static int mmreg2 (int r)
14377 {
14378     static const int map[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
14379
14380     return map[r];
14381 }
14382
14383 #define uMIPS_RD(op) ((op >> 7) & 0x7)
14384 #define uMIPS_RS(op) ((op >> 4) & 0x7)
14385 #define uMIPS_RS2(op) uMIPS_RS(op)
14386 #define uMIPS_RS1(op) ((op >> 1) & 0x7)
14387 #define uMIPS_RD5(op) ((op >> 5) & 0x1f)
14388 #define uMIPS_RS5(op) (op & 0x1f)
14389
14390 /* Signed immediate */
14391 #define SIMM(op, start, width)                                          \
14392     ((int32_t)(((op >> start) & ((~0U) >> (32-width)))                 \
14393                << (32-width))                                           \
14394      >> (32-width))
14395 /* Zero-extended immediate */
14396 #define ZIMM(op, start, width) ((op >> start) & ((~0U) >> (32-width)))
14397
14398 static void gen_addiur1sp(DisasContext *ctx)
14399 {
14400     int rd = mmreg(uMIPS_RD(ctx->opcode));
14401
14402     gen_arith_imm(ctx, OPC_ADDIU, rd, 29, ((ctx->opcode >> 1) & 0x3f) << 2);
14403 }
14404
14405 static void gen_addiur2(DisasContext *ctx)
14406 {
14407     static const int decoded_imm[] = { 1, 4, 8, 12, 16, 20, 24, -1 };
14408     int rd = mmreg(uMIPS_RD(ctx->opcode));
14409     int rs = mmreg(uMIPS_RS(ctx->opcode));
14410
14411     gen_arith_imm(ctx, OPC_ADDIU, rd, rs, decoded_imm[ZIMM(ctx->opcode, 1, 3)]);
14412 }
14413
14414 static void gen_addiusp(DisasContext *ctx)
14415 {
14416     int encoded = ZIMM(ctx->opcode, 1, 9);
14417     int decoded;
14418
14419     if (encoded <= 1) {
14420         decoded = 256 + encoded;
14421     } else if (encoded <= 255) {
14422         decoded = encoded;
14423     } else if (encoded <= 509) {
14424         decoded = encoded - 512;
14425     } else {
14426         decoded = encoded - 768;
14427     }
14428
14429     gen_arith_imm(ctx, OPC_ADDIU, 29, 29, decoded << 2);
14430 }
14431
14432 static void gen_addius5(DisasContext *ctx)
14433 {
14434     int imm = SIMM(ctx->opcode, 1, 4);
14435     int rd = (ctx->opcode >> 5) & 0x1f;
14436
14437     gen_arith_imm(ctx, OPC_ADDIU, rd, rd, imm);
14438 }
14439
14440 static void gen_andi16(DisasContext *ctx)
14441 {
14442     static const int decoded_imm[] = { 128, 1, 2, 3, 4, 7, 8, 15, 16,
14443                                  31, 32, 63, 64, 255, 32768, 65535 };
14444     int rd = mmreg(uMIPS_RD(ctx->opcode));
14445     int rs = mmreg(uMIPS_RS(ctx->opcode));
14446     int encoded = ZIMM(ctx->opcode, 0, 4);
14447
14448     gen_logic_imm(ctx, OPC_ANDI, rd, rs, decoded_imm[encoded]);
14449 }
14450
14451 static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist,
14452                                int base, int16_t offset)
14453 {
14454     TCGv t0, t1;
14455     TCGv_i32 t2;
14456
14457     if (ctx->hflags & MIPS_HFLAG_BMASK) {
14458         generate_exception_end(ctx, EXCP_RI);
14459         return;
14460     }
14461
14462     t0 = tcg_temp_new();
14463
14464     gen_base_offset_addr(ctx, t0, base, offset);
14465
14466     t1 = tcg_const_tl(reglist);
14467     t2 = tcg_const_i32(ctx->mem_idx);
14468
14469     save_cpu_state(ctx, 1);
14470     switch (opc) {
14471     case LWM32:
14472         gen_helper_lwm(cpu_env, t0, t1, t2);
14473         break;
14474     case SWM32:
14475         gen_helper_swm(cpu_env, t0, t1, t2);
14476         break;
14477 #ifdef TARGET_MIPS64
14478     case LDM:
14479         gen_helper_ldm(cpu_env, t0, t1, t2);
14480         break;
14481     case SDM:
14482         gen_helper_sdm(cpu_env, t0, t1, t2);
14483         break;
14484 #endif
14485     }
14486     tcg_temp_free(t0);
14487     tcg_temp_free(t1);
14488     tcg_temp_free_i32(t2);
14489 }
14490
14491
14492 static void gen_pool16c_insn(DisasContext *ctx)
14493 {
14494     int rd = mmreg((ctx->opcode >> 3) & 0x7);
14495     int rs = mmreg(ctx->opcode & 0x7);
14496
14497     switch (((ctx->opcode) >> 4) & 0x3f) {
14498     case NOT16 + 0:
14499     case NOT16 + 1:
14500     case NOT16 + 2:
14501     case NOT16 + 3:
14502         gen_logic(ctx, OPC_NOR, rd, rs, 0);
14503         break;
14504     case XOR16 + 0:
14505     case XOR16 + 1:
14506     case XOR16 + 2:
14507     case XOR16 + 3:
14508         gen_logic(ctx, OPC_XOR, rd, rd, rs);
14509         break;
14510     case AND16 + 0:
14511     case AND16 + 1:
14512     case AND16 + 2:
14513     case AND16 + 3:
14514         gen_logic(ctx, OPC_AND, rd, rd, rs);
14515         break;
14516     case OR16 + 0:
14517     case OR16 + 1:
14518     case OR16 + 2:
14519     case OR16 + 3:
14520         gen_logic(ctx, OPC_OR, rd, rd, rs);
14521         break;
14522     case LWM16 + 0:
14523     case LWM16 + 1:
14524     case LWM16 + 2:
14525     case LWM16 + 3:
14526         {
14527             static const int lwm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
14528             int offset = ZIMM(ctx->opcode, 0, 4);
14529
14530             gen_ldst_multiple(ctx, LWM32, lwm_convert[(ctx->opcode >> 4) & 0x3],
14531                               29, offset << 2);
14532         }
14533         break;
14534     case SWM16 + 0:
14535     case SWM16 + 1:
14536     case SWM16 + 2:
14537     case SWM16 + 3:
14538         {
14539             static const int swm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
14540             int offset = ZIMM(ctx->opcode, 0, 4);
14541
14542             gen_ldst_multiple(ctx, SWM32, swm_convert[(ctx->opcode >> 4) & 0x3],
14543                               29, offset << 2);
14544         }
14545         break;
14546     case JR16 + 0:
14547     case JR16 + 1:
14548         {
14549             int reg = ctx->opcode & 0x1f;
14550
14551             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 4);
14552         }
14553         break;
14554     case JRC16 + 0:
14555     case JRC16 + 1:
14556         {
14557             int reg = ctx->opcode & 0x1f;
14558             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 0);
14559             /* Let normal delay slot handling in our caller take us
14560                to the branch target.  */
14561         }
14562         break;
14563     case JALR16 + 0:
14564     case JALR16 + 1:
14565         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 4);
14566         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14567         break;
14568     case JALR16S + 0:
14569     case JALR16S + 1:
14570         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 2);
14571         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14572         break;
14573     case MFHI16 + 0:
14574     case MFHI16 + 1:
14575         gen_HILO(ctx, OPC_MFHI, 0, uMIPS_RS5(ctx->opcode));
14576         break;
14577     case MFLO16 + 0:
14578     case MFLO16 + 1:
14579         gen_HILO(ctx, OPC_MFLO, 0, uMIPS_RS5(ctx->opcode));
14580         break;
14581     case BREAK16:
14582         generate_exception_end(ctx, EXCP_BREAK);
14583         break;
14584     case SDBBP16:
14585         if (is_uhi(extract32(ctx->opcode, 0, 4))) {
14586             gen_helper_do_semihosting(cpu_env);
14587         } else {
14588             /* XXX: not clear which exception should be raised
14589              *      when in debug mode...
14590              */
14591             check_insn(ctx, ISA_MIPS32);
14592             generate_exception_end(ctx, EXCP_DBp);
14593         }
14594         break;
14595     case JRADDIUSP + 0:
14596     case JRADDIUSP + 1:
14597         {
14598             int imm = ZIMM(ctx->opcode, 0, 5);
14599             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
14600             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
14601             /* Let normal delay slot handling in our caller take us
14602                to the branch target.  */
14603         }
14604         break;
14605     default:
14606         generate_exception_end(ctx, EXCP_RI);
14607         break;
14608     }
14609 }
14610
14611 static inline void gen_movep(DisasContext *ctx, int enc_dest, int enc_rt,
14612                              int enc_rs)
14613 {
14614     int rd, rs, re, rt;
14615     static const int rd_enc[] = { 5, 5, 6, 4, 4, 4, 4, 4 };
14616     static const int re_enc[] = { 6, 7, 7, 21, 22, 5, 6, 7 };
14617     static const int rs_rt_enc[] = { 0, 17, 2, 3, 16, 18, 19, 20 };
14618     rd = rd_enc[enc_dest];
14619     re = re_enc[enc_dest];
14620     rs = rs_rt_enc[enc_rs];
14621     rt = rs_rt_enc[enc_rt];
14622     if (rs) {
14623         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
14624     } else {
14625         tcg_gen_movi_tl(cpu_gpr[rd], 0);
14626     }
14627     if (rt) {
14628         tcg_gen_mov_tl(cpu_gpr[re], cpu_gpr[rt]);
14629     } else {
14630         tcg_gen_movi_tl(cpu_gpr[re], 0);
14631     }
14632 }
14633
14634 static void gen_pool16c_r6_insn(DisasContext *ctx)
14635 {
14636     int rt = mmreg((ctx->opcode >> 7) & 0x7);
14637     int rs = mmreg((ctx->opcode >> 4) & 0x7);
14638
14639     switch (ctx->opcode & 0xf) {
14640     case R6_NOT16:
14641         gen_logic(ctx, OPC_NOR, rt, rs, 0);
14642         break;
14643     case R6_AND16:
14644         gen_logic(ctx, OPC_AND, rt, rt, rs);
14645         break;
14646     case R6_LWM16:
14647         {
14648             int lwm_converted = 0x11 + extract32(ctx->opcode, 8, 2);
14649             int offset = extract32(ctx->opcode, 4, 4);
14650             gen_ldst_multiple(ctx, LWM32, lwm_converted, 29, offset << 2);
14651         }
14652         break;
14653     case R6_JRC16: /* JRCADDIUSP */
14654         if ((ctx->opcode >> 4) & 1) {
14655             /* JRCADDIUSP */
14656             int imm = extract32(ctx->opcode, 5, 5);
14657             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
14658             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
14659         } else {
14660             /* JRC16 */
14661             rs = extract32(ctx->opcode, 5, 5);
14662             gen_compute_branch(ctx, OPC_JR, 2, rs, 0, 0, 0);
14663         }
14664         break;
14665     case MOVEP:
14666     case MOVEP_05:
14667     case MOVEP_06:
14668     case MOVEP_07:
14669     case MOVEP_0C:
14670     case MOVEP_0D:
14671     case MOVEP_0E:
14672     case MOVEP_0F:
14673         {
14674             int enc_dest = uMIPS_RD(ctx->opcode);
14675             int enc_rt = uMIPS_RS2(ctx->opcode);
14676             int enc_rs = (ctx->opcode & 3) | ((ctx->opcode >> 1) & 4);
14677             gen_movep(ctx, enc_dest, enc_rt, enc_rs);
14678         }
14679         break;
14680     case R6_XOR16:
14681         gen_logic(ctx, OPC_XOR, rt, rt, rs);
14682         break;
14683     case R6_OR16:
14684         gen_logic(ctx, OPC_OR, rt, rt, rs);
14685         break;
14686     case R6_SWM16:
14687         {
14688             int swm_converted = 0x11 + extract32(ctx->opcode, 8, 2);
14689             int offset = extract32(ctx->opcode, 4, 4);
14690             gen_ldst_multiple(ctx, SWM32, swm_converted, 29, offset << 2);
14691         }
14692         break;
14693     case JALRC16: /* BREAK16, SDBBP16 */
14694         switch (ctx->opcode & 0x3f) {
14695         case JALRC16:
14696         case JALRC16 + 0x20:
14697             /* JALRC16 */
14698             gen_compute_branch(ctx, OPC_JALR, 2, (ctx->opcode >> 5) & 0x1f,
14699                                31, 0, 0);
14700             break;
14701         case R6_BREAK16:
14702             /* BREAK16 */
14703             generate_exception(ctx, EXCP_BREAK);
14704             break;
14705         case R6_SDBBP16:
14706             /* SDBBP16 */
14707             if (is_uhi(extract32(ctx->opcode, 6, 4))) {
14708                 gen_helper_do_semihosting(cpu_env);
14709             } else {
14710                 if (ctx->hflags & MIPS_HFLAG_SBRI) {
14711                     generate_exception(ctx, EXCP_RI);
14712                 } else {
14713                     generate_exception(ctx, EXCP_DBp);
14714                 }
14715             }
14716             break;
14717         }
14718         break;
14719     default:
14720         generate_exception(ctx, EXCP_RI);
14721         break;
14722     }
14723 }
14724
14725 static void gen_ldxs (DisasContext *ctx, int base, int index, int rd)
14726 {
14727     TCGv t0 = tcg_temp_new();
14728     TCGv t1 = tcg_temp_new();
14729
14730     gen_load_gpr(t0, base);
14731
14732     if (index != 0) {
14733         gen_load_gpr(t1, index);
14734         tcg_gen_shli_tl(t1, t1, 2);
14735         gen_op_addr_add(ctx, t0, t1, t0);
14736     }
14737
14738     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
14739     gen_store_gpr(t1, rd);
14740
14741     tcg_temp_free(t0);
14742     tcg_temp_free(t1);
14743 }
14744
14745 static void gen_ldst_pair (DisasContext *ctx, uint32_t opc, int rd,
14746                            int base, int16_t offset)
14747 {
14748     TCGv t0, t1;
14749
14750     if (ctx->hflags & MIPS_HFLAG_BMASK || rd == 31) {
14751         generate_exception_end(ctx, EXCP_RI);
14752         return;
14753     }
14754
14755     t0 = tcg_temp_new();
14756     t1 = tcg_temp_new();
14757
14758     gen_base_offset_addr(ctx, t0, base, offset);
14759
14760     switch (opc) {
14761     case LWP:
14762         if (rd == base) {
14763             generate_exception_end(ctx, EXCP_RI);
14764             return;
14765         }
14766         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
14767         gen_store_gpr(t1, rd);
14768         tcg_gen_movi_tl(t1, 4);
14769         gen_op_addr_add(ctx, t0, t0, t1);
14770         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
14771         gen_store_gpr(t1, rd+1);
14772         break;
14773     case SWP:
14774         gen_load_gpr(t1, rd);
14775         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
14776         tcg_gen_movi_tl(t1, 4);
14777         gen_op_addr_add(ctx, t0, t0, t1);
14778         gen_load_gpr(t1, rd+1);
14779         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
14780         break;
14781 #ifdef TARGET_MIPS64
14782     case LDP:
14783         if (rd == base) {
14784             generate_exception_end(ctx, EXCP_RI);
14785             return;
14786         }
14787         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
14788         gen_store_gpr(t1, rd);
14789         tcg_gen_movi_tl(t1, 8);
14790         gen_op_addr_add(ctx, t0, t0, t1);
14791         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
14792         gen_store_gpr(t1, rd+1);
14793         break;
14794     case SDP:
14795         gen_load_gpr(t1, rd);
14796         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
14797         tcg_gen_movi_tl(t1, 8);
14798         gen_op_addr_add(ctx, t0, t0, t1);
14799         gen_load_gpr(t1, rd+1);
14800         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
14801         break;
14802 #endif
14803     }
14804     tcg_temp_free(t0);
14805     tcg_temp_free(t1);
14806 }
14807
14808 static void gen_sync(int stype)
14809 {
14810     TCGBar tcg_mo = TCG_BAR_SC;
14811
14812     switch (stype) {
14813     case 0x4: /* SYNC_WMB */
14814         tcg_mo |= TCG_MO_ST_ST;
14815         break;
14816     case 0x10: /* SYNC_MB */
14817         tcg_mo |= TCG_MO_ALL;
14818         break;
14819     case 0x11: /* SYNC_ACQUIRE */
14820         tcg_mo |= TCG_MO_LD_LD | TCG_MO_LD_ST;
14821         break;
14822     case 0x12: /* SYNC_RELEASE */
14823         tcg_mo |= TCG_MO_ST_ST | TCG_MO_LD_ST;
14824         break;
14825     case 0x13: /* SYNC_RMB */
14826         tcg_mo |= TCG_MO_LD_LD;
14827         break;
14828     default:
14829         tcg_mo |= TCG_MO_ALL;
14830         break;
14831     }
14832
14833     tcg_gen_mb(tcg_mo);
14834 }
14835
14836 static void gen_pool32axf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs)
14837 {
14838     int extension = (ctx->opcode >> 6) & 0x3f;
14839     int minor = (ctx->opcode >> 12) & 0xf;
14840     uint32_t mips32_op;
14841
14842     switch (extension) {
14843     case TEQ:
14844         mips32_op = OPC_TEQ;
14845         goto do_trap;
14846     case TGE:
14847         mips32_op = OPC_TGE;
14848         goto do_trap;
14849     case TGEU:
14850         mips32_op = OPC_TGEU;
14851         goto do_trap;
14852     case TLT:
14853         mips32_op = OPC_TLT;
14854         goto do_trap;
14855     case TLTU:
14856         mips32_op = OPC_TLTU;
14857         goto do_trap;
14858     case TNE:
14859         mips32_op = OPC_TNE;
14860     do_trap:
14861         gen_trap(ctx, mips32_op, rs, rt, -1);
14862         break;
14863 #ifndef CONFIG_USER_ONLY
14864     case MFC0:
14865     case MFC0 + 32:
14866         check_cp0_enabled(ctx);
14867         if (rt == 0) {
14868             /* Treat as NOP. */
14869             break;
14870         }
14871         gen_mfc0(ctx, cpu_gpr[rt], rs, (ctx->opcode >> 11) & 0x7);
14872         break;
14873     case MTC0:
14874     case MTC0 + 32:
14875         check_cp0_enabled(ctx);
14876         {
14877             TCGv t0 = tcg_temp_new();
14878
14879             gen_load_gpr(t0, rt);
14880             gen_mtc0(ctx, t0, rs, (ctx->opcode >> 11) & 0x7);
14881             tcg_temp_free(t0);
14882         }
14883         break;
14884 #endif
14885     case 0x2a:
14886         switch (minor & 3) {
14887         case MADD_ACC:
14888             gen_muldiv(ctx, OPC_MADD, (ctx->opcode >> 14) & 3, rs, rt);
14889             break;
14890         case MADDU_ACC:
14891             gen_muldiv(ctx, OPC_MADDU, (ctx->opcode >> 14) & 3, rs, rt);
14892             break;
14893         case MSUB_ACC:
14894             gen_muldiv(ctx, OPC_MSUB, (ctx->opcode >> 14) & 3, rs, rt);
14895             break;
14896         case MSUBU_ACC:
14897             gen_muldiv(ctx, OPC_MSUBU, (ctx->opcode >> 14) & 3, rs, rt);
14898             break;
14899         default:
14900             goto pool32axf_invalid;
14901         }
14902         break;
14903     case 0x32:
14904         switch (minor & 3) {
14905         case MULT_ACC:
14906             gen_muldiv(ctx, OPC_MULT, (ctx->opcode >> 14) & 3, rs, rt);
14907             break;
14908         case MULTU_ACC:
14909             gen_muldiv(ctx, OPC_MULTU, (ctx->opcode >> 14) & 3, rs, rt);
14910             break;
14911         default:
14912             goto pool32axf_invalid;
14913         }
14914         break;
14915     case 0x2c:
14916         switch (minor) {
14917         case BITSWAP:
14918             check_insn(ctx, ISA_MIPS32R6);
14919             gen_bitswap(ctx, OPC_BITSWAP, rs, rt);
14920             break;
14921         case SEB:
14922             gen_bshfl(ctx, OPC_SEB, rs, rt);
14923             break;
14924         case SEH:
14925             gen_bshfl(ctx, OPC_SEH, rs, rt);
14926             break;
14927         case CLO:
14928             mips32_op = OPC_CLO;
14929             goto do_cl;
14930         case CLZ:
14931             mips32_op = OPC_CLZ;
14932         do_cl:
14933             check_insn(ctx, ISA_MIPS32);
14934             gen_cl(ctx, mips32_op, rt, rs);
14935             break;
14936         case RDHWR:
14937             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14938             gen_rdhwr(ctx, rt, rs, 0);
14939             break;
14940         case WSBH:
14941             gen_bshfl(ctx, OPC_WSBH, rs, rt);
14942             break;
14943         case MULT:
14944             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14945             mips32_op = OPC_MULT;
14946             goto do_mul;
14947         case MULTU:
14948             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14949             mips32_op = OPC_MULTU;
14950             goto do_mul;
14951         case DIV:
14952             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14953             mips32_op = OPC_DIV;
14954             goto do_div;
14955         case DIVU:
14956             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14957             mips32_op = OPC_DIVU;
14958             goto do_div;
14959         do_div:
14960             check_insn(ctx, ISA_MIPS32);
14961             gen_muldiv(ctx, mips32_op, 0, rs, rt);
14962             break;
14963         case MADD:
14964             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14965             mips32_op = OPC_MADD;
14966             goto do_mul;
14967         case MADDU:
14968             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14969             mips32_op = OPC_MADDU;
14970             goto do_mul;
14971         case MSUB:
14972             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14973             mips32_op = OPC_MSUB;
14974             goto do_mul;
14975         case MSUBU:
14976             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14977             mips32_op = OPC_MSUBU;
14978         do_mul:
14979             check_insn(ctx, ISA_MIPS32);
14980             gen_muldiv(ctx, mips32_op, 0, rs, rt);
14981             break;
14982         default:
14983             goto pool32axf_invalid;
14984         }
14985         break;
14986     case 0x34:
14987         switch (minor) {
14988         case MFC2:
14989         case MTC2:
14990         case MFHC2:
14991         case MTHC2:
14992         case CFC2:
14993         case CTC2:
14994             generate_exception_err(ctx, EXCP_CpU, 2);
14995             break;
14996         default:
14997             goto pool32axf_invalid;
14998         }
14999         break;
15000     case 0x3c:
15001         switch (minor) {
15002         case JALR:    /* JALRC */
15003         case JALR_HB: /* JALRC_HB */
15004             if (ctx->insn_flags & ISA_MIPS32R6) {
15005                 /* JALRC, JALRC_HB */
15006                 gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 0);
15007             } else {
15008                 /* JALR, JALR_HB */
15009                 gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 4);
15010                 ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15011             }
15012             break;
15013         case JALRS:
15014         case JALRS_HB:
15015             check_insn_opc_removed(ctx, ISA_MIPS32R6);
15016             gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 2);
15017             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15018             break;
15019         default:
15020             goto pool32axf_invalid;
15021         }
15022         break;
15023     case 0x05:
15024         switch (minor) {
15025         case RDPGPR:
15026             check_cp0_enabled(ctx);
15027             check_insn(ctx, ISA_MIPS32R2);
15028             gen_load_srsgpr(rs, rt);
15029             break;
15030         case WRPGPR:
15031             check_cp0_enabled(ctx);
15032             check_insn(ctx, ISA_MIPS32R2);
15033             gen_store_srsgpr(rs, rt);
15034             break;
15035         default:
15036             goto pool32axf_invalid;
15037         }
15038         break;
15039 #ifndef CONFIG_USER_ONLY
15040     case 0x0d:
15041         switch (minor) {
15042         case TLBP:
15043             mips32_op = OPC_TLBP;
15044             goto do_cp0;
15045         case TLBR:
15046             mips32_op = OPC_TLBR;
15047             goto do_cp0;
15048         case TLBWI:
15049             mips32_op = OPC_TLBWI;
15050             goto do_cp0;
15051         case TLBWR:
15052             mips32_op = OPC_TLBWR;
15053             goto do_cp0;
15054         case TLBINV:
15055             mips32_op = OPC_TLBINV;
15056             goto do_cp0;
15057         case TLBINVF:
15058             mips32_op = OPC_TLBINVF;
15059             goto do_cp0;
15060         case WAIT:
15061             mips32_op = OPC_WAIT;
15062             goto do_cp0;
15063         case DERET:
15064             mips32_op = OPC_DERET;
15065             goto do_cp0;
15066         case ERET:
15067             mips32_op = OPC_ERET;
15068         do_cp0:
15069             gen_cp0(env, ctx, mips32_op, rt, rs);
15070             break;
15071         default:
15072             goto pool32axf_invalid;
15073         }
15074         break;
15075     case 0x1d:
15076         switch (minor) {
15077         case DI:
15078             check_cp0_enabled(ctx);
15079             {
15080                 TCGv t0 = tcg_temp_new();
15081
15082                 save_cpu_state(ctx, 1);
15083                 gen_helper_di(t0, cpu_env);
15084                 gen_store_gpr(t0, rs);
15085                 /* Stop translation as we may have switched the execution mode */
15086                 ctx->base.is_jmp = DISAS_STOP;
15087                 tcg_temp_free(t0);
15088             }
15089             break;
15090         case EI:
15091             check_cp0_enabled(ctx);
15092             {
15093                 TCGv t0 = tcg_temp_new();
15094
15095                 save_cpu_state(ctx, 1);
15096                 gen_helper_ei(t0, cpu_env);
15097                 gen_store_gpr(t0, rs);
15098                 /* DISAS_STOP isn't sufficient, we need to ensure we break out
15099                    of translated code to check for pending interrupts.  */
15100                 gen_save_pc(ctx->base.pc_next + 4);
15101                 ctx->base.is_jmp = DISAS_EXIT;
15102                 tcg_temp_free(t0);
15103             }
15104             break;
15105         default:
15106             goto pool32axf_invalid;
15107         }
15108         break;
15109 #endif
15110     case 0x2d:
15111         switch (minor) {
15112         case SYNC:
15113             gen_sync(extract32(ctx->opcode, 16, 5));
15114             break;
15115         case SYSCALL:
15116             generate_exception_end(ctx, EXCP_SYSCALL);
15117             break;
15118         case SDBBP:
15119             if (is_uhi(extract32(ctx->opcode, 16, 10))) {
15120                 gen_helper_do_semihosting(cpu_env);
15121             } else {
15122                 check_insn(ctx, ISA_MIPS32);
15123                 if (ctx->hflags & MIPS_HFLAG_SBRI) {
15124                     generate_exception_end(ctx, EXCP_RI);
15125                 } else {
15126                     generate_exception_end(ctx, EXCP_DBp);
15127                 }
15128             }
15129             break;
15130         default:
15131             goto pool32axf_invalid;
15132         }
15133         break;
15134     case 0x01:
15135         switch (minor & 3) {
15136         case MFHI_ACC:
15137             gen_HILO(ctx, OPC_MFHI, minor >> 2, rs);
15138             break;
15139         case MFLO_ACC:
15140             gen_HILO(ctx, OPC_MFLO, minor >> 2, rs);
15141             break;
15142         case MTHI_ACC:
15143             gen_HILO(ctx, OPC_MTHI, minor >> 2, rs);
15144             break;
15145         case MTLO_ACC:
15146             gen_HILO(ctx, OPC_MTLO, minor >> 2, rs);
15147             break;
15148         default:
15149             goto pool32axf_invalid;
15150         }
15151         break;
15152     case 0x35:
15153         check_insn_opc_removed(ctx, ISA_MIPS32R6);
15154         switch (minor) {
15155         case MFHI32:
15156             gen_HILO(ctx, OPC_MFHI, 0, rs);
15157             break;
15158         case MFLO32:
15159             gen_HILO(ctx, OPC_MFLO, 0, rs);
15160             break;
15161         case MTHI32:
15162             gen_HILO(ctx, OPC_MTHI, 0, rs);
15163             break;
15164         case MTLO32:
15165             gen_HILO(ctx, OPC_MTLO, 0, rs);
15166             break;
15167         default:
15168             goto pool32axf_invalid;
15169         }
15170         break;
15171     default:
15172     pool32axf_invalid:
15173         MIPS_INVAL("pool32axf");
15174         generate_exception_end(ctx, EXCP_RI);
15175         break;
15176     }
15177 }
15178
15179 /* Values for microMIPS fmt field.  Variable-width, depending on which
15180    formats the instruction supports.  */
15181
15182 enum {
15183     FMT_SD_S = 0,
15184     FMT_SD_D = 1,
15185
15186     FMT_SDPS_S = 0,
15187     FMT_SDPS_D = 1,
15188     FMT_SDPS_PS = 2,
15189
15190     FMT_SWL_S = 0,
15191     FMT_SWL_W = 1,
15192     FMT_SWL_L = 2,
15193
15194     FMT_DWL_D = 0,
15195     FMT_DWL_W = 1,
15196     FMT_DWL_L = 2
15197 };
15198
15199 static void gen_pool32fxf(DisasContext *ctx, int rt, int rs)
15200 {
15201     int extension = (ctx->opcode >> 6) & 0x3ff;
15202     uint32_t mips32_op;
15203
15204 #define FLOAT_1BIT_FMT(opc, fmt) (fmt << 8) | opc
15205 #define FLOAT_2BIT_FMT(opc, fmt) (fmt << 7) | opc
15206 #define COND_FLOAT_MOV(opc, cond) (cond << 7) | opc
15207
15208     switch (extension) {
15209     case FLOAT_1BIT_FMT(CFC1, 0):
15210         mips32_op = OPC_CFC1;
15211         goto do_cp1;
15212     case FLOAT_1BIT_FMT(CTC1, 0):
15213         mips32_op = OPC_CTC1;
15214         goto do_cp1;
15215     case FLOAT_1BIT_FMT(MFC1, 0):
15216         mips32_op = OPC_MFC1;
15217         goto do_cp1;
15218     case FLOAT_1BIT_FMT(MTC1, 0):
15219         mips32_op = OPC_MTC1;
15220         goto do_cp1;
15221     case FLOAT_1BIT_FMT(MFHC1, 0):
15222         mips32_op = OPC_MFHC1;
15223         goto do_cp1;
15224     case FLOAT_1BIT_FMT(MTHC1, 0):
15225         mips32_op = OPC_MTHC1;
15226     do_cp1:
15227         gen_cp1(ctx, mips32_op, rt, rs);
15228         break;
15229
15230         /* Reciprocal square root */
15231     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_S):
15232         mips32_op = OPC_RSQRT_S;
15233         goto do_unaryfp;
15234     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_D):
15235         mips32_op = OPC_RSQRT_D;
15236         goto do_unaryfp;
15237
15238         /* Square root */
15239     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_S):
15240         mips32_op = OPC_SQRT_S;
15241         goto do_unaryfp;
15242     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_D):
15243         mips32_op = OPC_SQRT_D;
15244         goto do_unaryfp;
15245
15246         /* Reciprocal */
15247     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_S):
15248         mips32_op = OPC_RECIP_S;
15249         goto do_unaryfp;
15250     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_D):
15251         mips32_op = OPC_RECIP_D;
15252         goto do_unaryfp;
15253
15254         /* Floor */
15255     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_S):
15256         mips32_op = OPC_FLOOR_L_S;
15257         goto do_unaryfp;
15258     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_D):
15259         mips32_op = OPC_FLOOR_L_D;
15260         goto do_unaryfp;
15261     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_S):
15262         mips32_op = OPC_FLOOR_W_S;
15263         goto do_unaryfp;
15264     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_D):
15265         mips32_op = OPC_FLOOR_W_D;
15266         goto do_unaryfp;
15267
15268         /* Ceiling */
15269     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_S):
15270         mips32_op = OPC_CEIL_L_S;
15271         goto do_unaryfp;
15272     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_D):
15273         mips32_op = OPC_CEIL_L_D;
15274         goto do_unaryfp;
15275     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_S):
15276         mips32_op = OPC_CEIL_W_S;
15277         goto do_unaryfp;
15278     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_D):
15279         mips32_op = OPC_CEIL_W_D;
15280         goto do_unaryfp;
15281
15282         /* Truncation */
15283     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_S):
15284         mips32_op = OPC_TRUNC_L_S;
15285         goto do_unaryfp;
15286     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_D):
15287         mips32_op = OPC_TRUNC_L_D;
15288         goto do_unaryfp;
15289     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_S):
15290         mips32_op = OPC_TRUNC_W_S;
15291         goto do_unaryfp;
15292     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_D):
15293         mips32_op = OPC_TRUNC_W_D;
15294         goto do_unaryfp;
15295
15296         /* Round */
15297     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_S):
15298         mips32_op = OPC_ROUND_L_S;
15299         goto do_unaryfp;
15300     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_D):
15301         mips32_op = OPC_ROUND_L_D;
15302         goto do_unaryfp;
15303     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_S):
15304         mips32_op = OPC_ROUND_W_S;
15305         goto do_unaryfp;
15306     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_D):
15307         mips32_op = OPC_ROUND_W_D;
15308         goto do_unaryfp;
15309
15310         /* Integer to floating-point conversion */
15311     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_S):
15312         mips32_op = OPC_CVT_L_S;
15313         goto do_unaryfp;
15314     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_D):
15315         mips32_op = OPC_CVT_L_D;
15316         goto do_unaryfp;
15317     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_S):
15318         mips32_op = OPC_CVT_W_S;
15319         goto do_unaryfp;
15320     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_D):
15321         mips32_op = OPC_CVT_W_D;
15322         goto do_unaryfp;
15323
15324         /* Paired-foo conversions */
15325     case FLOAT_1BIT_FMT(CVT_S_PL, 0):
15326         mips32_op = OPC_CVT_S_PL;
15327         goto do_unaryfp;
15328     case FLOAT_1BIT_FMT(CVT_S_PU, 0):
15329         mips32_op = OPC_CVT_S_PU;
15330         goto do_unaryfp;
15331     case FLOAT_1BIT_FMT(CVT_PW_PS, 0):
15332         mips32_op = OPC_CVT_PW_PS;
15333         goto do_unaryfp;
15334     case FLOAT_1BIT_FMT(CVT_PS_PW, 0):
15335         mips32_op = OPC_CVT_PS_PW;
15336         goto do_unaryfp;
15337
15338         /* Floating-point moves */
15339     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_S):
15340         mips32_op = OPC_MOV_S;
15341         goto do_unaryfp;
15342     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_D):
15343         mips32_op = OPC_MOV_D;
15344         goto do_unaryfp;
15345     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_PS):
15346         mips32_op = OPC_MOV_PS;
15347         goto do_unaryfp;
15348
15349         /* Absolute value */
15350     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_S):
15351         mips32_op = OPC_ABS_S;
15352         goto do_unaryfp;
15353     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_D):
15354         mips32_op = OPC_ABS_D;
15355         goto do_unaryfp;
15356     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_PS):
15357         mips32_op = OPC_ABS_PS;
15358         goto do_unaryfp;
15359
15360         /* Negation */
15361     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_S):
15362         mips32_op = OPC_NEG_S;
15363         goto do_unaryfp;
15364     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_D):
15365         mips32_op = OPC_NEG_D;
15366         goto do_unaryfp;
15367     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_PS):
15368         mips32_op = OPC_NEG_PS;
15369         goto do_unaryfp;
15370
15371         /* Reciprocal square root step */
15372     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_S):
15373         mips32_op = OPC_RSQRT1_S;
15374         goto do_unaryfp;
15375     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_D):
15376         mips32_op = OPC_RSQRT1_D;
15377         goto do_unaryfp;
15378     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_PS):
15379         mips32_op = OPC_RSQRT1_PS;
15380         goto do_unaryfp;
15381
15382         /* Reciprocal step */
15383     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_S):
15384         mips32_op = OPC_RECIP1_S;
15385         goto do_unaryfp;
15386     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_D):
15387         mips32_op = OPC_RECIP1_S;
15388         goto do_unaryfp;
15389     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_PS):
15390         mips32_op = OPC_RECIP1_PS;
15391         goto do_unaryfp;
15392
15393         /* Conversions from double */
15394     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_S):
15395         mips32_op = OPC_CVT_D_S;
15396         goto do_unaryfp;
15397     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_W):
15398         mips32_op = OPC_CVT_D_W;
15399         goto do_unaryfp;
15400     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_L):
15401         mips32_op = OPC_CVT_D_L;
15402         goto do_unaryfp;
15403
15404         /* Conversions from single */
15405     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_D):
15406         mips32_op = OPC_CVT_S_D;
15407         goto do_unaryfp;
15408     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_W):
15409         mips32_op = OPC_CVT_S_W;
15410         goto do_unaryfp;
15411     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_L):
15412         mips32_op = OPC_CVT_S_L;
15413     do_unaryfp:
15414         gen_farith(ctx, mips32_op, -1, rs, rt, 0);
15415         break;
15416
15417         /* Conditional moves on floating-point codes */
15418     case COND_FLOAT_MOV(MOVT, 0):
15419     case COND_FLOAT_MOV(MOVT, 1):
15420     case COND_FLOAT_MOV(MOVT, 2):
15421     case COND_FLOAT_MOV(MOVT, 3):
15422     case COND_FLOAT_MOV(MOVT, 4):
15423     case COND_FLOAT_MOV(MOVT, 5):
15424     case COND_FLOAT_MOV(MOVT, 6):
15425     case COND_FLOAT_MOV(MOVT, 7):
15426         check_insn_opc_removed(ctx, ISA_MIPS32R6);
15427         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 1);
15428         break;
15429     case COND_FLOAT_MOV(MOVF, 0):
15430     case COND_FLOAT_MOV(MOVF, 1):
15431     case COND_FLOAT_MOV(MOVF, 2):
15432     case COND_FLOAT_MOV(MOVF, 3):
15433     case COND_FLOAT_MOV(MOVF, 4):
15434     case COND_FLOAT_MOV(MOVF, 5):
15435     case COND_FLOAT_MOV(MOVF, 6):
15436     case COND_FLOAT_MOV(MOVF, 7):
15437         check_insn_opc_removed(ctx, ISA_MIPS32R6);
15438         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 0);
15439         break;
15440     default:
15441         MIPS_INVAL("pool32fxf");
15442         generate_exception_end(ctx, EXCP_RI);
15443         break;
15444     }
15445 }
15446
15447 static void decode_micromips32_opc(CPUMIPSState *env, DisasContext *ctx)
15448 {
15449     int32_t offset;
15450     uint16_t insn;
15451     int rt, rs, rd, rr;
15452     int16_t imm;
15453     uint32_t op, minor, minor2, mips32_op;
15454     uint32_t cond, fmt, cc;
15455
15456     insn = cpu_lduw_code(env, ctx->base.pc_next + 2);
15457     ctx->opcode = (ctx->opcode << 16) | insn;
15458
15459     rt = (ctx->opcode >> 21) & 0x1f;
15460     rs = (ctx->opcode >> 16) & 0x1f;
15461     rd = (ctx->opcode >> 11) & 0x1f;
15462     rr = (ctx->opcode >> 6) & 0x1f;
15463     imm = (int16_t) ctx->opcode;
15464
15465     op = (ctx->opcode >> 26) & 0x3f;
15466     switch (op) {
15467     case POOL32A:
15468         minor = ctx->opcode & 0x3f;
15469         switch (minor) {
15470         case 0x00:
15471             minor = (ctx->opcode >> 6) & 0xf;
15472             switch (minor) {
15473             case SLL32:
15474                 mips32_op = OPC_SLL;
15475                 goto do_shifti;
15476             case SRA:
15477                 mips32_op = OPC_SRA;
15478                 goto do_shifti;
15479             case SRL32:
15480                 mips32_op = OPC_SRL;
15481                 goto do_shifti;
15482             case ROTR:
15483                 mips32_op = OPC_ROTR;
15484             do_shifti:
15485                 gen_shift_imm(ctx, mips32_op, rt, rs, rd);
15486                 break;
15487             case SELEQZ:
15488                 check_insn(ctx, ISA_MIPS32R6);
15489                 gen_cond_move(ctx, OPC_SELEQZ, rd, rs, rt);
15490                 break;
15491             case SELNEZ:
15492                 check_insn(ctx, ISA_MIPS32R6);
15493                 gen_cond_move(ctx, OPC_SELNEZ, rd, rs, rt);
15494                 break;
15495             case R6_RDHWR:
15496                 check_insn(ctx, ISA_MIPS32R6);
15497                 gen_rdhwr(ctx, rt, rs, extract32(ctx->opcode, 11, 3));
15498                 break;
15499             default:
15500                 goto pool32a_invalid;
15501             }
15502             break;
15503         case 0x10:
15504             minor = (ctx->opcode >> 6) & 0xf;
15505             switch (minor) {
15506                 /* Arithmetic */
15507             case ADD:
15508                 mips32_op = OPC_ADD;
15509                 goto do_arith;
15510             case ADDU32:
15511                 mips32_op = OPC_ADDU;
15512                 goto do_arith;
15513             case SUB:
15514                 mips32_op = OPC_SUB;
15515                 goto do_arith;
15516             case SUBU32:
15517                 mips32_op = OPC_SUBU;
15518                 goto do_arith;
15519             case MUL:
15520                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15521                 mips32_op = OPC_MUL;
15522             do_arith:
15523                 gen_arith(ctx, mips32_op, rd, rs, rt);
15524                 break;
15525                 /* Shifts */
15526             case SLLV:
15527                 mips32_op = OPC_SLLV;
15528                 goto do_shift;
15529             case SRLV:
15530                 mips32_op = OPC_SRLV;
15531                 goto do_shift;
15532             case SRAV:
15533                 mips32_op = OPC_SRAV;
15534                 goto do_shift;
15535             case ROTRV:
15536                 mips32_op = OPC_ROTRV;
15537             do_shift:
15538                 gen_shift(ctx, mips32_op, rd, rs, rt);
15539                 break;
15540                 /* Logical operations */
15541             case AND:
15542                 mips32_op = OPC_AND;
15543                 goto do_logic;
15544             case OR32:
15545                 mips32_op = OPC_OR;
15546                 goto do_logic;
15547             case NOR:
15548                 mips32_op = OPC_NOR;
15549                 goto do_logic;
15550             case XOR32:
15551                 mips32_op = OPC_XOR;
15552             do_logic:
15553                 gen_logic(ctx, mips32_op, rd, rs, rt);
15554                 break;
15555                 /* Set less than */
15556             case SLT:
15557                 mips32_op = OPC_SLT;
15558                 goto do_slt;
15559             case SLTU:
15560                 mips32_op = OPC_SLTU;
15561             do_slt:
15562                 gen_slt(ctx, mips32_op, rd, rs, rt);
15563                 break;
15564             default:
15565                 goto pool32a_invalid;
15566             }
15567             break;
15568         case 0x18:
15569             minor = (ctx->opcode >> 6) & 0xf;
15570             switch (minor) {
15571                 /* Conditional moves */
15572             case MOVN: /* MUL */
15573                 if (ctx->insn_flags & ISA_MIPS32R6) {
15574                     /* MUL */
15575                     gen_r6_muldiv(ctx, R6_OPC_MUL, rd, rs, rt);
15576                 } else {
15577                     /* MOVN */
15578                     gen_cond_move(ctx, OPC_MOVN, rd, rs, rt);
15579                 }
15580                 break;
15581             case MOVZ: /* MUH */
15582                 if (ctx->insn_flags & ISA_MIPS32R6) {
15583                     /* MUH */
15584                     gen_r6_muldiv(ctx, R6_OPC_MUH, rd, rs, rt);
15585                 } else {
15586                     /* MOVZ */
15587                     gen_cond_move(ctx, OPC_MOVZ, rd, rs, rt);
15588                 }
15589                 break;
15590             case MULU:
15591                 check_insn(ctx, ISA_MIPS32R6);
15592                 gen_r6_muldiv(ctx, R6_OPC_MULU, rd, rs, rt);
15593                 break;
15594             case MUHU:
15595                 check_insn(ctx, ISA_MIPS32R6);
15596                 gen_r6_muldiv(ctx, R6_OPC_MUHU, rd, rs, rt);
15597                 break;
15598             case LWXS: /* DIV */
15599                 if (ctx->insn_flags & ISA_MIPS32R6) {
15600                     /* DIV */
15601                     gen_r6_muldiv(ctx, R6_OPC_DIV, rd, rs, rt);
15602                 } else {
15603                     /* LWXS */
15604                     gen_ldxs(ctx, rs, rt, rd);
15605                 }
15606                 break;
15607             case MOD:
15608                 check_insn(ctx, ISA_MIPS32R6);
15609                 gen_r6_muldiv(ctx, R6_OPC_MOD, rd, rs, rt);
15610                 break;
15611             case R6_DIVU:
15612                 check_insn(ctx, ISA_MIPS32R6);
15613                 gen_r6_muldiv(ctx, R6_OPC_DIVU, rd, rs, rt);
15614                 break;
15615             case MODU:
15616                 check_insn(ctx, ISA_MIPS32R6);
15617                 gen_r6_muldiv(ctx, R6_OPC_MODU, rd, rs, rt);
15618                 break;
15619             default:
15620                 goto pool32a_invalid;
15621             }
15622             break;
15623         case INS:
15624             gen_bitops(ctx, OPC_INS, rt, rs, rr, rd);
15625             return;
15626         case LSA:
15627             check_insn(ctx, ISA_MIPS32R6);
15628             gen_lsa(ctx, OPC_LSA, rd, rs, rt,
15629                     extract32(ctx->opcode, 9, 2));
15630             break;
15631         case ALIGN:
15632             check_insn(ctx, ISA_MIPS32R6);
15633             gen_align(ctx, 32, rd, rs, rt, extract32(ctx->opcode, 9, 2));
15634             break;
15635         case EXT:
15636             gen_bitops(ctx, OPC_EXT, rt, rs, rr, rd);
15637             return;
15638         case POOL32AXF:
15639             gen_pool32axf(env, ctx, rt, rs);
15640             break;
15641         case BREAK32:
15642             generate_exception_end(ctx, EXCP_BREAK);
15643             break;
15644         case SIGRIE:
15645             check_insn(ctx, ISA_MIPS32R6);
15646             generate_exception_end(ctx, EXCP_RI);
15647             break;
15648         default:
15649         pool32a_invalid:
15650                 MIPS_INVAL("pool32a");
15651                 generate_exception_end(ctx, EXCP_RI);
15652                 break;
15653         }
15654         break;
15655     case POOL32B:
15656         minor = (ctx->opcode >> 12) & 0xf;
15657         switch (minor) {
15658         case CACHE:
15659             check_cp0_enabled(ctx);
15660             if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
15661                 gen_cache_operation(ctx, rt, rs, imm);
15662             }
15663             break;
15664         case LWC2:
15665         case SWC2:
15666             /* COP2: Not implemented. */
15667             generate_exception_err(ctx, EXCP_CpU, 2);
15668             break;
15669 #ifdef TARGET_MIPS64
15670         case LDP:
15671         case SDP:
15672             check_insn(ctx, ISA_MIPS3);
15673             check_mips_64(ctx);
15674 #endif
15675             /* fall through */
15676         case LWP:
15677         case SWP:
15678             gen_ldst_pair(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
15679             break;
15680 #ifdef TARGET_MIPS64
15681         case LDM:
15682         case SDM:
15683             check_insn(ctx, ISA_MIPS3);
15684             check_mips_64(ctx);
15685 #endif
15686             /* fall through */
15687         case LWM32:
15688         case SWM32:
15689             gen_ldst_multiple(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
15690             break;
15691         default:
15692             MIPS_INVAL("pool32b");
15693             generate_exception_end(ctx, EXCP_RI);
15694             break;
15695         }
15696         break;
15697     case POOL32F:
15698         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
15699             minor = ctx->opcode & 0x3f;
15700             check_cp1_enabled(ctx);
15701             switch (minor) {
15702             case ALNV_PS:
15703                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15704                 mips32_op = OPC_ALNV_PS;
15705                 goto do_madd;
15706             case MADD_S:
15707                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15708                 mips32_op = OPC_MADD_S;
15709                 goto do_madd;
15710             case MADD_D:
15711                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15712                 mips32_op = OPC_MADD_D;
15713                 goto do_madd;
15714             case MADD_PS:
15715                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15716                 mips32_op = OPC_MADD_PS;
15717                 goto do_madd;
15718             case MSUB_S:
15719                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15720                 mips32_op = OPC_MSUB_S;
15721                 goto do_madd;
15722             case MSUB_D:
15723                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15724                 mips32_op = OPC_MSUB_D;
15725                 goto do_madd;
15726             case MSUB_PS:
15727                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15728                 mips32_op = OPC_MSUB_PS;
15729                 goto do_madd;
15730             case NMADD_S:
15731                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15732                 mips32_op = OPC_NMADD_S;
15733                 goto do_madd;
15734             case NMADD_D:
15735                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15736                 mips32_op = OPC_NMADD_D;
15737                 goto do_madd;
15738             case NMADD_PS:
15739                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15740                 mips32_op = OPC_NMADD_PS;
15741                 goto do_madd;
15742             case NMSUB_S:
15743                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15744                 mips32_op = OPC_NMSUB_S;
15745                 goto do_madd;
15746             case NMSUB_D:
15747                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15748                 mips32_op = OPC_NMSUB_D;
15749                 goto do_madd;
15750             case NMSUB_PS:
15751                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15752                 mips32_op = OPC_NMSUB_PS;
15753             do_madd:
15754                 gen_flt3_arith(ctx, mips32_op, rd, rr, rs, rt);
15755                 break;
15756             case CABS_COND_FMT:
15757                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15758                 cond = (ctx->opcode >> 6) & 0xf;
15759                 cc = (ctx->opcode >> 13) & 0x7;
15760                 fmt = (ctx->opcode >> 10) & 0x3;
15761                 switch (fmt) {
15762                 case 0x0:
15763                     gen_cmpabs_s(ctx, cond, rt, rs, cc);
15764                     break;
15765                 case 0x1:
15766                     gen_cmpabs_d(ctx, cond, rt, rs, cc);
15767                     break;
15768                 case 0x2:
15769                     gen_cmpabs_ps(ctx, cond, rt, rs, cc);
15770                     break;
15771                 default:
15772                     goto pool32f_invalid;
15773                 }
15774                 break;
15775             case C_COND_FMT:
15776                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15777                 cond = (ctx->opcode >> 6) & 0xf;
15778                 cc = (ctx->opcode >> 13) & 0x7;
15779                 fmt = (ctx->opcode >> 10) & 0x3;
15780                 switch (fmt) {
15781                 case 0x0:
15782                     gen_cmp_s(ctx, cond, rt, rs, cc);
15783                     break;
15784                 case 0x1:
15785                     gen_cmp_d(ctx, cond, rt, rs, cc);
15786                     break;
15787                 case 0x2:
15788                     gen_cmp_ps(ctx, cond, rt, rs, cc);
15789                     break;
15790                 default:
15791                     goto pool32f_invalid;
15792                 }
15793                 break;
15794             case CMP_CONDN_S:
15795                 check_insn(ctx, ISA_MIPS32R6);
15796                 gen_r6_cmp_s(ctx, (ctx->opcode >> 6) & 0x1f, rt, rs, rd);
15797                 break;
15798             case CMP_CONDN_D:
15799                 check_insn(ctx, ISA_MIPS32R6);
15800                 gen_r6_cmp_d(ctx, (ctx->opcode >> 6) & 0x1f, rt, rs, rd);
15801                 break;
15802             case POOL32FXF:
15803                 gen_pool32fxf(ctx, rt, rs);
15804                 break;
15805             case 0x00:
15806                 /* PLL foo */
15807                 switch ((ctx->opcode >> 6) & 0x7) {
15808                 case PLL_PS:
15809                     mips32_op = OPC_PLL_PS;
15810                     goto do_ps;
15811                 case PLU_PS:
15812                     mips32_op = OPC_PLU_PS;
15813                     goto do_ps;
15814                 case PUL_PS:
15815                     mips32_op = OPC_PUL_PS;
15816                     goto do_ps;
15817                 case PUU_PS:
15818                     mips32_op = OPC_PUU_PS;
15819                     goto do_ps;
15820                 case CVT_PS_S:
15821                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15822                     mips32_op = OPC_CVT_PS_S;
15823                 do_ps:
15824                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
15825                     break;
15826                 default:
15827                     goto pool32f_invalid;
15828                 }
15829                 break;
15830             case MIN_FMT:
15831                 check_insn(ctx, ISA_MIPS32R6);
15832                 switch ((ctx->opcode >> 9) & 0x3) {
15833                 case FMT_SDPS_S:
15834                     gen_farith(ctx, OPC_MIN_S, rt, rs, rd, 0);
15835                     break;
15836                 case FMT_SDPS_D:
15837                     gen_farith(ctx, OPC_MIN_D, rt, rs, rd, 0);
15838                     break;
15839                 default:
15840                     goto pool32f_invalid;
15841                 }
15842                 break;
15843             case 0x08:
15844                 /* [LS][WDU]XC1 */
15845                 switch ((ctx->opcode >> 6) & 0x7) {
15846                 case LWXC1:
15847                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15848                     mips32_op = OPC_LWXC1;
15849                     goto do_ldst_cp1;
15850                 case SWXC1:
15851                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15852                     mips32_op = OPC_SWXC1;
15853                     goto do_ldst_cp1;
15854                 case LDXC1:
15855                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15856                     mips32_op = OPC_LDXC1;
15857                     goto do_ldst_cp1;
15858                 case SDXC1:
15859                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15860                     mips32_op = OPC_SDXC1;
15861                     goto do_ldst_cp1;
15862                 case LUXC1:
15863                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15864                     mips32_op = OPC_LUXC1;
15865                     goto do_ldst_cp1;
15866                 case SUXC1:
15867                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
15868                     mips32_op = OPC_SUXC1;
15869                 do_ldst_cp1:
15870                     gen_flt3_ldst(ctx, mips32_op, rd, rd, rt, rs);
15871                     break;
15872                 default:
15873                     goto pool32f_invalid;
15874                 }
15875                 break;
15876             case MAX_FMT:
15877                 check_insn(ctx, ISA_MIPS32R6);
15878                 switch ((ctx->opcode >> 9) & 0x3) {
15879                 case FMT_SDPS_S:
15880                     gen_farith(ctx, OPC_MAX_S, rt, rs, rd, 0);
15881                     break;
15882                 case FMT_SDPS_D:
15883                     gen_farith(ctx, OPC_MAX_D, rt, rs, rd, 0);
15884                     break;
15885                 default:
15886                     goto pool32f_invalid;
15887                 }
15888                 break;
15889             case 0x18:
15890                 /* 3D insns */
15891                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
15892                 fmt = (ctx->opcode >> 9) & 0x3;
15893                 switch ((ctx->opcode >> 6) & 0x7) {
15894                 case RSQRT2_FMT:
15895                     switch (fmt) {
15896                     case FMT_SDPS_S:
15897                         mips32_op = OPC_RSQRT2_S;
15898                         goto do_3d;
15899                     case FMT_SDPS_D:
15900                         mips32_op = OPC_RSQRT2_D;
15901                         goto do_3d;
15902                     case FMT_SDPS_PS:
15903                         mips32_op = OPC_RSQRT2_PS;
15904                         goto do_3d;
15905                     default:
15906                         goto pool32f_invalid;
15907                     }
15908                     break;
15909                 case RECIP2_FMT:
15910                     switch (fmt) {
15911                     case FMT_SDPS_S:
15912                         mips32_op = OPC_RECIP2_S;
15913                         goto do_3d;
15914                     case FMT_SDPS_D:
15915                         mips32_op = OPC_RECIP2_D;
15916                         goto do_3d;
15917                     case FMT_SDPS_PS:
15918                         mips32_op = OPC_RECIP2_PS;
15919                         goto do_3d;
15920                     default:
15921                         goto pool32f_invalid;
15922                     }
15923                     break;
15924                 case ADDR_PS:
15925                     mips32_op = OPC_ADDR_PS;
15926                     goto do_3d;
15927                 case MULR_PS:
15928                     mips32_op = OPC_MULR_PS;
15929                 do_3d:
15930                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
15931                     break;
15932                 default:
15933                     goto pool32f_invalid;
15934                 }
15935                 break;
15936             case 0x20:
15937                 /* MOV[FT].fmt, PREFX, RINT.fmt, CLASS.fmt*/
15938                 cc = (ctx->opcode >> 13) & 0x7;
15939                 fmt = (ctx->opcode >> 9) & 0x3;
15940                 switch ((ctx->opcode >> 6) & 0x7) {
15941                 case MOVF_FMT: /* RINT_FMT */
15942                     if (ctx->insn_flags & ISA_MIPS32R6) {
15943                         /* RINT_FMT */
15944                         switch (fmt) {
15945                         case FMT_SDPS_S:
15946                             gen_farith(ctx, OPC_RINT_S, 0, rt, rs, 0);
15947                             break;
15948                         case FMT_SDPS_D:
15949                             gen_farith(ctx, OPC_RINT_D, 0, rt, rs, 0);
15950                             break;
15951                         default:
15952                             goto pool32f_invalid;
15953                         }
15954                     } else {
15955                         /* MOVF_FMT */
15956                         switch (fmt) {
15957                         case FMT_SDPS_S:
15958                             gen_movcf_s(ctx, rs, rt, cc, 0);
15959                             break;
15960                         case FMT_SDPS_D:
15961                             gen_movcf_d(ctx, rs, rt, cc, 0);
15962                             break;
15963                         case FMT_SDPS_PS:
15964                             check_ps(ctx);
15965                             gen_movcf_ps(ctx, rs, rt, cc, 0);
15966                             break;
15967                         default:
15968                             goto pool32f_invalid;
15969                         }
15970                     }
15971                     break;
15972                 case MOVT_FMT: /* CLASS_FMT */
15973                     if (ctx->insn_flags & ISA_MIPS32R6) {
15974                         /* CLASS_FMT */
15975                         switch (fmt) {
15976                         case FMT_SDPS_S:
15977                             gen_farith(ctx, OPC_CLASS_S, 0, rt, rs, 0);
15978                             break;
15979                         case FMT_SDPS_D:
15980                             gen_farith(ctx, OPC_CLASS_D, 0, rt, rs, 0);
15981                             break;
15982                         default:
15983                             goto pool32f_invalid;
15984                         }
15985                     } else {
15986                         /* MOVT_FMT */
15987                         switch (fmt) {
15988                         case FMT_SDPS_S:
15989                             gen_movcf_s(ctx, rs, rt, cc, 1);
15990                             break;
15991                         case FMT_SDPS_D:
15992                             gen_movcf_d(ctx, rs, rt, cc, 1);
15993                             break;
15994                         case FMT_SDPS_PS:
15995                             check_ps(ctx);
15996                             gen_movcf_ps(ctx, rs, rt, cc, 1);
15997                             break;
15998                         default:
15999                             goto pool32f_invalid;
16000                         }
16001                     }
16002                     break;
16003                 case PREFX:
16004                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
16005                     break;
16006                 default:
16007                     goto pool32f_invalid;
16008                 }
16009                 break;
16010 #define FINSN_3ARG_SDPS(prfx)                           \
16011                 switch ((ctx->opcode >> 8) & 0x3) {     \
16012                 case FMT_SDPS_S:                        \
16013                     mips32_op = OPC_##prfx##_S;         \
16014                     goto do_fpop;                       \
16015                 case FMT_SDPS_D:                        \
16016                     mips32_op = OPC_##prfx##_D;         \
16017                     goto do_fpop;                       \
16018                 case FMT_SDPS_PS:                       \
16019                     check_ps(ctx);                      \
16020                     mips32_op = OPC_##prfx##_PS;        \
16021                     goto do_fpop;                       \
16022                 default:                                \
16023                     goto pool32f_invalid;               \
16024                 }
16025             case MINA_FMT:
16026                 check_insn(ctx, ISA_MIPS32R6);
16027                 switch ((ctx->opcode >> 9) & 0x3) {
16028                 case FMT_SDPS_S:
16029                     gen_farith(ctx, OPC_MINA_S, rt, rs, rd, 0);
16030                     break;
16031                 case FMT_SDPS_D:
16032                     gen_farith(ctx, OPC_MINA_D, rt, rs, rd, 0);
16033                     break;
16034                 default:
16035                     goto pool32f_invalid;
16036                 }
16037                 break;
16038             case MAXA_FMT:
16039                 check_insn(ctx, ISA_MIPS32R6);
16040                 switch ((ctx->opcode >> 9) & 0x3) {
16041                 case FMT_SDPS_S:
16042                     gen_farith(ctx, OPC_MAXA_S, rt, rs, rd, 0);
16043                     break;
16044                 case FMT_SDPS_D:
16045                     gen_farith(ctx, OPC_MAXA_D, rt, rs, rd, 0);
16046                     break;
16047                 default:
16048                     goto pool32f_invalid;
16049                 }
16050                 break;
16051             case 0x30:
16052                 /* regular FP ops */
16053                 switch ((ctx->opcode >> 6) & 0x3) {
16054                 case ADD_FMT:
16055                     FINSN_3ARG_SDPS(ADD);
16056                     break;
16057                 case SUB_FMT:
16058                     FINSN_3ARG_SDPS(SUB);
16059                     break;
16060                 case MUL_FMT:
16061                     FINSN_3ARG_SDPS(MUL);
16062                     break;
16063                 case DIV_FMT:
16064                     fmt = (ctx->opcode >> 8) & 0x3;
16065                     if (fmt == 1) {
16066                         mips32_op = OPC_DIV_D;
16067                     } else if (fmt == 0) {
16068                         mips32_op = OPC_DIV_S;
16069                     } else {
16070                         goto pool32f_invalid;
16071                     }
16072                     goto do_fpop;
16073                 default:
16074                     goto pool32f_invalid;
16075                 }
16076                 break;
16077             case 0x38:
16078                 /* cmovs */
16079                 switch ((ctx->opcode >> 6) & 0x7) {
16080                 case MOVN_FMT: /* SELEQZ_FMT */
16081                     if (ctx->insn_flags & ISA_MIPS32R6) {
16082                         /* SELEQZ_FMT */
16083                         switch ((ctx->opcode >> 9) & 0x3) {
16084                         case FMT_SDPS_S:
16085                             gen_sel_s(ctx, OPC_SELEQZ_S, rd, rt, rs);
16086                             break;
16087                         case FMT_SDPS_D:
16088                             gen_sel_d(ctx, OPC_SELEQZ_D, rd, rt, rs);
16089                             break;
16090                         default:
16091                             goto pool32f_invalid;
16092                         }
16093                     } else {
16094                         /* MOVN_FMT */
16095                         FINSN_3ARG_SDPS(MOVN);
16096                     }
16097                     break;
16098                 case MOVN_FMT_04:
16099                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
16100                     FINSN_3ARG_SDPS(MOVN);
16101                     break;
16102                 case MOVZ_FMT: /* SELNEZ_FMT */
16103                     if (ctx->insn_flags & ISA_MIPS32R6) {
16104                         /* SELNEZ_FMT */
16105                         switch ((ctx->opcode >> 9) & 0x3) {
16106                         case FMT_SDPS_S:
16107                             gen_sel_s(ctx, OPC_SELNEZ_S, rd, rt, rs);
16108                             break;
16109                         case FMT_SDPS_D:
16110                             gen_sel_d(ctx, OPC_SELNEZ_D, rd, rt, rs);
16111                             break;
16112                         default:
16113                             goto pool32f_invalid;
16114                         }
16115                     } else {
16116                         /* MOVZ_FMT */
16117                         FINSN_3ARG_SDPS(MOVZ);
16118                     }
16119                     break;
16120                 case MOVZ_FMT_05:
16121                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
16122                     FINSN_3ARG_SDPS(MOVZ);
16123                     break;
16124                 case SEL_FMT:
16125                     check_insn(ctx, ISA_MIPS32R6);
16126                     switch ((ctx->opcode >> 9) & 0x3) {
16127                     case FMT_SDPS_S:
16128                         gen_sel_s(ctx, OPC_SEL_S, rd, rt, rs);
16129                         break;
16130                     case FMT_SDPS_D:
16131                         gen_sel_d(ctx, OPC_SEL_D, rd, rt, rs);
16132                         break;
16133                     default:
16134                         goto pool32f_invalid;
16135                     }
16136                     break;
16137                 case MADDF_FMT:
16138                     check_insn(ctx, ISA_MIPS32R6);
16139                     switch ((ctx->opcode >> 9) & 0x3) {
16140                     case FMT_SDPS_S:
16141                         mips32_op = OPC_MADDF_S;
16142                         goto do_fpop;
16143                     case FMT_SDPS_D:
16144                         mips32_op = OPC_MADDF_D;
16145                         goto do_fpop;
16146                     default:
16147                         goto pool32f_invalid;
16148                     }
16149                     break;
16150                 case MSUBF_FMT:
16151                     check_insn(ctx, ISA_MIPS32R6);
16152                     switch ((ctx->opcode >> 9) & 0x3) {
16153                     case FMT_SDPS_S:
16154                         mips32_op = OPC_MSUBF_S;
16155                         goto do_fpop;
16156                     case FMT_SDPS_D:
16157                         mips32_op = OPC_MSUBF_D;
16158                         goto do_fpop;
16159                     default:
16160                         goto pool32f_invalid;
16161                     }
16162                     break;
16163                 default:
16164                     goto pool32f_invalid;
16165                 }
16166                 break;
16167             do_fpop:
16168                 gen_farith(ctx, mips32_op, rt, rs, rd, 0);
16169                 break;
16170             default:
16171             pool32f_invalid:
16172                 MIPS_INVAL("pool32f");
16173                 generate_exception_end(ctx, EXCP_RI);
16174                 break;
16175             }
16176         } else {
16177             generate_exception_err(ctx, EXCP_CpU, 1);
16178         }
16179         break;
16180     case POOL32I:
16181         minor = (ctx->opcode >> 21) & 0x1f;
16182         switch (minor) {
16183         case BLTZ:
16184             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16185             gen_compute_branch(ctx, OPC_BLTZ, 4, rs, -1, imm << 1, 4);
16186             break;
16187         case BLTZAL:
16188             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16189             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 4);
16190             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16191             break;
16192         case BLTZALS:
16193             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16194             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 2);
16195             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16196             break;
16197         case BGEZ:
16198             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16199             gen_compute_branch(ctx, OPC_BGEZ, 4, rs, -1, imm << 1, 4);
16200             break;
16201         case BGEZAL:
16202             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16203             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 4);
16204             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16205             break;
16206         case BGEZALS:
16207             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16208             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 2);
16209             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16210             break;
16211         case BLEZ:
16212             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16213             gen_compute_branch(ctx, OPC_BLEZ, 4, rs, -1, imm << 1, 4);
16214             break;
16215         case BGTZ:
16216             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16217             gen_compute_branch(ctx, OPC_BGTZ, 4, rs, -1, imm << 1, 4);
16218             break;
16219
16220             /* Traps */
16221         case TLTI: /* BC1EQZC */
16222             if (ctx->insn_flags & ISA_MIPS32R6) {
16223                 /* BC1EQZC */
16224                 check_cp1_enabled(ctx);
16225                 gen_compute_branch1_r6(ctx, OPC_BC1EQZ, rs, imm << 1, 0);
16226             } else {
16227                 /* TLTI */
16228                 mips32_op = OPC_TLTI;
16229                 goto do_trapi;
16230             }
16231             break;
16232         case TGEI: /* BC1NEZC */
16233             if (ctx->insn_flags & ISA_MIPS32R6) {
16234                 /* BC1NEZC */
16235                 check_cp1_enabled(ctx);
16236                 gen_compute_branch1_r6(ctx, OPC_BC1NEZ, rs, imm << 1, 0);
16237             } else {
16238                 /* TGEI */
16239                 mips32_op = OPC_TGEI;
16240                 goto do_trapi;
16241             }
16242             break;
16243         case TLTIU:
16244             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16245             mips32_op = OPC_TLTIU;
16246             goto do_trapi;
16247         case TGEIU:
16248             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16249             mips32_op = OPC_TGEIU;
16250             goto do_trapi;
16251         case TNEI: /* SYNCI */
16252             if (ctx->insn_flags & ISA_MIPS32R6) {
16253                 /* SYNCI */
16254                 /* Break the TB to be able to sync copied instructions
16255                    immediately */
16256                 ctx->base.is_jmp = DISAS_STOP;
16257             } else {
16258                 /* TNEI */
16259                 mips32_op = OPC_TNEI;
16260                 goto do_trapi;
16261             }
16262             break;
16263         case TEQI:
16264             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16265             mips32_op = OPC_TEQI;
16266         do_trapi:
16267             gen_trap(ctx, mips32_op, rs, -1, imm);
16268             break;
16269
16270         case BNEZC:
16271         case BEQZC:
16272             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16273             gen_compute_branch(ctx, minor == BNEZC ? OPC_BNE : OPC_BEQ,
16274                                4, rs, 0, imm << 1, 0);
16275             /* Compact branches don't have a delay slot, so just let
16276                the normal delay slot handling take us to the branch
16277                target. */
16278             break;
16279         case LUI:
16280             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16281             gen_logic_imm(ctx, OPC_LUI, rs, 0, imm);
16282             break;
16283         case SYNCI:
16284             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16285             /* Break the TB to be able to sync copied instructions
16286                immediately */
16287             ctx->base.is_jmp = DISAS_STOP;
16288             break;
16289         case BC2F:
16290         case BC2T:
16291             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16292             /* COP2: Not implemented. */
16293             generate_exception_err(ctx, EXCP_CpU, 2);
16294             break;
16295         case BC1F:
16296             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16297             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1FANY2 : OPC_BC1F;
16298             goto do_cp1branch;
16299         case BC1T:
16300             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16301             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1TANY2 : OPC_BC1T;
16302             goto do_cp1branch;
16303         case BC1ANY4F:
16304             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16305             mips32_op = OPC_BC1FANY4;
16306             goto do_cp1mips3d;
16307         case BC1ANY4T:
16308             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16309             mips32_op = OPC_BC1TANY4;
16310         do_cp1mips3d:
16311             check_cop1x(ctx);
16312             check_insn(ctx, ASE_MIPS3D);
16313             /* Fall through */
16314         do_cp1branch:
16315             if (env->CP0_Config1 & (1 << CP0C1_FP)) {
16316                 check_cp1_enabled(ctx);
16317                 gen_compute_branch1(ctx, mips32_op,
16318                                     (ctx->opcode >> 18) & 0x7, imm << 1);
16319             } else {
16320                 generate_exception_err(ctx, EXCP_CpU, 1);
16321             }
16322             break;
16323         case BPOSGE64:
16324         case BPOSGE32:
16325             /* MIPS DSP: not implemented */
16326             /* Fall through */
16327         default:
16328             MIPS_INVAL("pool32i");
16329             generate_exception_end(ctx, EXCP_RI);
16330             break;
16331         }
16332         break;
16333     case POOL32C:
16334         minor = (ctx->opcode >> 12) & 0xf;
16335         offset = sextract32(ctx->opcode, 0,
16336                             (ctx->insn_flags & ISA_MIPS32R6) ? 9 : 12);
16337         switch (minor) {
16338         case LWL:
16339             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16340             mips32_op = OPC_LWL;
16341             goto do_ld_lr;
16342         case SWL:
16343             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16344             mips32_op = OPC_SWL;
16345             goto do_st_lr;
16346         case LWR:
16347             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16348             mips32_op = OPC_LWR;
16349             goto do_ld_lr;
16350         case SWR:
16351             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16352             mips32_op = OPC_SWR;
16353             goto do_st_lr;
16354 #if defined(TARGET_MIPS64)
16355         case LDL:
16356             check_insn(ctx, ISA_MIPS3);
16357             check_mips_64(ctx);
16358             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16359             mips32_op = OPC_LDL;
16360             goto do_ld_lr;
16361         case SDL:
16362             check_insn(ctx, ISA_MIPS3);
16363             check_mips_64(ctx);
16364             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16365             mips32_op = OPC_SDL;
16366             goto do_st_lr;
16367         case LDR:
16368             check_insn(ctx, ISA_MIPS3);
16369             check_mips_64(ctx);
16370             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16371             mips32_op = OPC_LDR;
16372             goto do_ld_lr;
16373         case SDR:
16374             check_insn(ctx, ISA_MIPS3);
16375             check_mips_64(ctx);
16376             check_insn_opc_removed(ctx, ISA_MIPS32R6);
16377             mips32_op = OPC_SDR;
16378             goto do_st_lr;
16379         case LWU:
16380             check_insn(ctx, ISA_MIPS3);
16381             check_mips_64(ctx);
16382             mips32_op = OPC_LWU;
16383             goto do_ld_lr;
16384         case LLD:
16385             check_insn(ctx, ISA_MIPS3);
16386             check_mips_64(ctx);
16387             mips32_op = OPC_LLD;
16388             goto do_ld_lr;
16389 #endif
16390         case LL:
16391             mips32_op = OPC_LL;
16392             goto do_ld_lr;
16393         do_ld_lr:
16394             gen_ld(ctx, mips32_op, rt, rs, offset);
16395             break;
16396         do_st_lr:
16397             gen_st(ctx, mips32_op, rt, rs, offset);
16398             break;
16399         case SC:
16400             gen_st_cond(ctx, OPC_SC, rt, rs, offset);
16401             break;
16402 #if defined(TARGET_MIPS64)
16403         case SCD:
16404             check_insn(ctx, ISA_MIPS3);
16405             check_mips_64(ctx);
16406             gen_st_cond(ctx, OPC_SCD, rt, rs, offset);
16407             break;
16408 #endif
16409         case LD_EVA:
16410             if (!ctx->eva) {
16411                 MIPS_INVAL("pool32c ld-eva");
16412                 generate_exception_end(ctx, EXCP_RI);
16413                 break;
16414             }
16415             check_cp0_enabled(ctx);
16416
16417             minor2 = (ctx->opcode >> 9) & 0x7;
16418             offset = sextract32(ctx->opcode, 0, 9);
16419             switch (minor2) {
16420             case LBUE:
16421                 mips32_op = OPC_LBUE;
16422                 goto do_ld_lr;
16423             case LHUE:
16424                 mips32_op = OPC_LHUE;
16425                 goto do_ld_lr;
16426             case LWLE:
16427                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
16428                 mips32_op = OPC_LWLE;
16429                 goto do_ld_lr;
16430             case LWRE:
16431                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
16432                 mips32_op = OPC_LWRE;
16433                 goto do_ld_lr;
16434             case LBE:
16435                 mips32_op = OPC_LBE;
16436                 goto do_ld_lr;
16437             case LHE:
16438                 mips32_op = OPC_LHE;
16439                 goto do_ld_lr;
16440             case LLE:
16441                 mips32_op = OPC_LLE;
16442                 goto do_ld_lr;
16443             case LWE:
16444                 mips32_op = OPC_LWE;
16445                 goto do_ld_lr;
16446             };
16447             break;
16448         case ST_EVA:
16449             if (!ctx->eva) {
16450                 MIPS_INVAL("pool32c st-eva");
16451                 generate_exception_end(ctx, EXCP_RI);
16452                 break;
16453             }
16454             check_cp0_enabled(ctx);
16455
16456             minor2 = (ctx->opcode >> 9) & 0x7;
16457             offset = sextract32(ctx->opcode, 0, 9);
16458             switch (minor2) {
16459             case SWLE:
16460                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
16461                 mips32_op = OPC_SWLE;
16462                 goto do_st_lr;
16463             case SWRE:
16464                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
16465                 mips32_op = OPC_SWRE;
16466                 goto do_st_lr;
16467             case PREFE:
16468                 /* Treat as no-op */
16469                 if ((ctx->insn_flags & ISA_MIPS32R6) && (rt >= 24)) {
16470                     /* hint codes 24-31 are reserved and signal RI */
16471                     generate_exception(ctx, EXCP_RI);
16472                 }
16473                 break;
16474             case CACHEE:
16475                 /* Treat as no-op */
16476                 if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
16477                     gen_cache_operation(ctx, rt, rs, offset);
16478                 }
16479                 break;
16480             case SBE:
16481                 mips32_op = OPC_SBE;
16482                 goto do_st_lr;
16483             case SHE:
16484                 mips32_op = OPC_SHE;
16485                 goto do_st_lr;
16486             case SCE:
16487                 gen_st_cond(ctx, OPC_SCE, rt, rs, offset);
16488                 break;
16489             case SWE:
16490                 mips32_op = OPC_SWE;
16491                 goto do_st_lr;
16492             };
16493             break;
16494         case PREF:
16495             /* Treat as no-op */
16496             if ((ctx->insn_flags & ISA_MIPS32R6) && (rt >= 24)) {
16497                 /* hint codes 24-31 are reserved and signal RI */
16498                 generate_exception(ctx, EXCP_RI);
16499             }
16500             break;
16501         default:
16502             MIPS_INVAL("pool32c");
16503             generate_exception_end(ctx, EXCP_RI);
16504             break;
16505         }
16506         break;
16507     case ADDI32: /* AUI, LUI */
16508         if (ctx->insn_flags & ISA_MIPS32R6) {
16509             /* AUI, LUI */
16510             gen_logic_imm(ctx, OPC_LUI, rt, rs, imm);
16511         } else {
16512             /* ADDI32 */
16513             mips32_op = OPC_ADDI;
16514             goto do_addi;
16515         }
16516         break;
16517     case ADDIU32:
16518         mips32_op = OPC_ADDIU;
16519     do_addi:
16520         gen_arith_imm(ctx, mips32_op, rt, rs, imm);
16521         break;
16522
16523         /* Logical operations */
16524     case ORI32:
16525         mips32_op = OPC_ORI;
16526         goto do_logici;
16527     case XORI32:
16528         mips32_op = OPC_XORI;
16529         goto do_logici;
16530     case ANDI32:
16531         mips32_op = OPC_ANDI;
16532     do_logici:
16533         gen_logic_imm(ctx, mips32_op, rt, rs, imm);
16534         break;
16535
16536         /* Set less than immediate */
16537     case SLTI32:
16538         mips32_op = OPC_SLTI;
16539         goto do_slti;
16540     case SLTIU32:
16541         mips32_op = OPC_SLTIU;
16542     do_slti:
16543         gen_slt_imm(ctx, mips32_op, rt, rs, imm);
16544         break;
16545     case JALX32:
16546         check_insn_opc_removed(ctx, ISA_MIPS32R6);
16547         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
16548         gen_compute_branch(ctx, OPC_JALX, 4, rt, rs, offset, 4);
16549         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16550         break;
16551     case JALS32: /* BOVC, BEQC, BEQZALC */
16552         if (ctx->insn_flags & ISA_MIPS32R6) {
16553             if (rs >= rt) {
16554                 /* BOVC */
16555                 mips32_op = OPC_BOVC;
16556             } else if (rs < rt && rs == 0) {
16557                 /* BEQZALC */
16558                 mips32_op = OPC_BEQZALC;
16559             } else {
16560                 /* BEQC */
16561                 mips32_op = OPC_BEQC;
16562             }
16563             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16564         } else {
16565             /* JALS32 */
16566             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 1;
16567             gen_compute_branch(ctx, OPC_JAL, 4, rt, rs, offset, 2);
16568             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16569         }
16570         break;
16571     case BEQ32: /* BC */
16572         if (ctx->insn_flags & ISA_MIPS32R6) {
16573             /* BC */
16574             gen_compute_compact_branch(ctx, OPC_BC, 0, 0,
16575                                        sextract32(ctx->opcode << 1, 0, 27));
16576         } else {
16577             /* BEQ32 */
16578             gen_compute_branch(ctx, OPC_BEQ, 4, rt, rs, imm << 1, 4);
16579         }
16580         break;
16581     case BNE32: /* BALC */
16582         if (ctx->insn_flags & ISA_MIPS32R6) {
16583             /* BALC */
16584             gen_compute_compact_branch(ctx, OPC_BALC, 0, 0,
16585                                        sextract32(ctx->opcode << 1, 0, 27));
16586         } else {
16587             /* BNE32 */
16588             gen_compute_branch(ctx, OPC_BNE, 4, rt, rs, imm << 1, 4);
16589         }
16590         break;
16591     case J32: /* BGTZC, BLTZC, BLTC */
16592         if (ctx->insn_flags & ISA_MIPS32R6) {
16593             if (rs == 0 && rt != 0) {
16594                 /* BGTZC */
16595                 mips32_op = OPC_BGTZC;
16596             } else if (rs != 0 && rt != 0 && rs == rt) {
16597                 /* BLTZC */
16598                 mips32_op = OPC_BLTZC;
16599             } else {
16600                 /* BLTC */
16601                 mips32_op = OPC_BLTC;
16602             }
16603             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16604         } else {
16605             /* J32 */
16606             gen_compute_branch(ctx, OPC_J, 4, rt, rs,
16607                                (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
16608         }
16609         break;
16610     case JAL32: /* BLEZC, BGEZC, BGEC */
16611         if (ctx->insn_flags & ISA_MIPS32R6) {
16612             if (rs == 0 && rt != 0) {
16613                 /* BLEZC */
16614                 mips32_op = OPC_BLEZC;
16615             } else if (rs != 0 && rt != 0 && rs == rt) {
16616                 /* BGEZC */
16617                 mips32_op = OPC_BGEZC;
16618             } else {
16619                 /* BGEC */
16620                 mips32_op = OPC_BGEC;
16621             }
16622             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16623         } else {
16624             /* JAL32 */
16625             gen_compute_branch(ctx, OPC_JAL, 4, rt, rs,
16626                                (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
16627             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16628         }
16629         break;
16630         /* Floating point (COP1) */
16631     case LWC132:
16632         mips32_op = OPC_LWC1;
16633         goto do_cop1;
16634     case LDC132:
16635         mips32_op = OPC_LDC1;
16636         goto do_cop1;
16637     case SWC132:
16638         mips32_op = OPC_SWC1;
16639         goto do_cop1;
16640     case SDC132:
16641         mips32_op = OPC_SDC1;
16642     do_cop1:
16643         gen_cop1_ldst(ctx, mips32_op, rt, rs, imm);
16644         break;
16645     case ADDIUPC: /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */
16646         if (ctx->insn_flags & ISA_MIPS32R6) {
16647             /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */
16648             switch ((ctx->opcode >> 16) & 0x1f) {
16649             case ADDIUPC_00:
16650             case ADDIUPC_01:
16651             case ADDIUPC_02:
16652             case ADDIUPC_03:
16653             case ADDIUPC_04:
16654             case ADDIUPC_05:
16655             case ADDIUPC_06:
16656             case ADDIUPC_07:
16657                 gen_pcrel(ctx, OPC_ADDIUPC, ctx->base.pc_next & ~0x3, rt);
16658                 break;
16659             case AUIPC:
16660                 gen_pcrel(ctx, OPC_AUIPC, ctx->base.pc_next, rt);
16661                 break;
16662             case ALUIPC:
16663                 gen_pcrel(ctx, OPC_ALUIPC, ctx->base.pc_next, rt);
16664                 break;
16665             case LWPC_08:
16666             case LWPC_09:
16667             case LWPC_0A:
16668             case LWPC_0B:
16669             case LWPC_0C:
16670             case LWPC_0D:
16671             case LWPC_0E:
16672             case LWPC_0F:
16673                 gen_pcrel(ctx, R6_OPC_LWPC, ctx->base.pc_next & ~0x3, rt);
16674                 break;
16675             default:
16676                 generate_exception(ctx, EXCP_RI);
16677                 break;
16678             }
16679         } else {
16680             /* ADDIUPC */
16681             int reg = mmreg(ZIMM(ctx->opcode, 23, 3));
16682             offset = SIMM(ctx->opcode, 0, 23) << 2;
16683
16684             gen_addiupc(ctx, reg, offset, 0, 0);
16685         }
16686         break;
16687     case BNVC: /* BNEC, BNEZALC */
16688         check_insn(ctx, ISA_MIPS32R6);
16689         if (rs >= rt) {
16690             /* BNVC */
16691             mips32_op = OPC_BNVC;
16692         } else if (rs < rt && rs == 0) {
16693             /* BNEZALC */
16694             mips32_op = OPC_BNEZALC;
16695         } else {
16696             /* BNEC */
16697             mips32_op = OPC_BNEC;
16698         }
16699         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16700         break;
16701     case R6_BNEZC: /* JIALC */
16702         check_insn(ctx, ISA_MIPS32R6);
16703         if (rt != 0) {
16704             /* BNEZC */
16705             gen_compute_compact_branch(ctx, OPC_BNEZC, rt, 0,
16706                                        sextract32(ctx->opcode << 1, 0, 22));
16707         } else {
16708             /* JIALC */
16709             gen_compute_compact_branch(ctx, OPC_JIALC, 0, rs, imm);
16710         }
16711         break;
16712     case R6_BEQZC: /* JIC */
16713         check_insn(ctx, ISA_MIPS32R6);
16714         if (rt != 0) {
16715             /* BEQZC */
16716             gen_compute_compact_branch(ctx, OPC_BEQZC, rt, 0,
16717                                        sextract32(ctx->opcode << 1, 0, 22));
16718         } else {
16719             /* JIC */
16720             gen_compute_compact_branch(ctx, OPC_JIC, 0, rs, imm);
16721         }
16722         break;
16723     case BLEZALC: /* BGEZALC, BGEUC */
16724         check_insn(ctx, ISA_MIPS32R6);
16725         if (rs == 0 && rt != 0) {
16726             /* BLEZALC */
16727             mips32_op = OPC_BLEZALC;
16728         } else if (rs != 0 && rt != 0 && rs == rt) {
16729             /* BGEZALC */
16730             mips32_op = OPC_BGEZALC;
16731         } else {
16732             /* BGEUC */
16733             mips32_op = OPC_BGEUC;
16734         }
16735         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16736         break;
16737     case BGTZALC: /* BLTZALC, BLTUC */
16738         check_insn(ctx, ISA_MIPS32R6);
16739         if (rs == 0 && rt != 0) {
16740             /* BGTZALC */
16741             mips32_op = OPC_BGTZALC;
16742         } else if (rs != 0 && rt != 0 && rs == rt) {
16743             /* BLTZALC */
16744             mips32_op = OPC_BLTZALC;
16745         } else {
16746             /* BLTUC */
16747             mips32_op = OPC_BLTUC;
16748         }
16749         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16750         break;
16751         /* Loads and stores */
16752     case LB32:
16753         mips32_op = OPC_LB;
16754         goto do_ld;
16755     case LBU32:
16756         mips32_op = OPC_LBU;
16757         goto do_ld;
16758     case LH32:
16759         mips32_op = OPC_LH;
16760         goto do_ld;
16761     case LHU32:
16762         mips32_op = OPC_LHU;
16763         goto do_ld;
16764     case LW32:
16765         mips32_op = OPC_LW;
16766         goto do_ld;
16767 #ifdef TARGET_MIPS64
16768     case LD32:
16769         check_insn(ctx, ISA_MIPS3);
16770         check_mips_64(ctx);
16771         mips32_op = OPC_LD;
16772         goto do_ld;
16773     case SD32:
16774         check_insn(ctx, ISA_MIPS3);
16775         check_mips_64(ctx);
16776         mips32_op = OPC_SD;
16777         goto do_st;
16778 #endif
16779     case SB32:
16780         mips32_op = OPC_SB;
16781         goto do_st;
16782     case SH32:
16783         mips32_op = OPC_SH;
16784         goto do_st;
16785     case SW32:
16786         mips32_op = OPC_SW;
16787         goto do_st;
16788     do_ld:
16789         gen_ld(ctx, mips32_op, rt, rs, imm);
16790         break;
16791     do_st:
16792         gen_st(ctx, mips32_op, rt, rs, imm);
16793         break;
16794     default:
16795         generate_exception_end(ctx, EXCP_RI);
16796         break;
16797     }
16798 }
16799
16800 static int decode_micromips_opc (CPUMIPSState *env, DisasContext *ctx)
16801 {
16802     uint32_t op;
16803
16804     /* make sure instructions are on a halfword boundary */
16805     if (ctx->base.pc_next & 0x1) {
16806         env->CP0_BadVAddr = ctx->base.pc_next;
16807         generate_exception_end(ctx, EXCP_AdEL);
16808         return 2;
16809     }
16810
16811     op = (ctx->opcode >> 10) & 0x3f;
16812     /* Enforce properly-sized instructions in a delay slot */
16813     if (ctx->hflags & MIPS_HFLAG_BDS_STRICT) {
16814         switch (op & 0x7) { /* MSB-3..MSB-5 */
16815         case 0:
16816         /* POOL32A, POOL32B, POOL32I, POOL32C */
16817         case 4:
16818         /* ADDI32, ADDIU32, ORI32, XORI32, SLTI32, SLTIU32, ANDI32, JALX32 */
16819         case 5:
16820         /* LBU32, LHU32, POOL32F, JALS32, BEQ32, BNE32, J32, JAL32 */
16821         case 6:
16822         /* SB32, SH32, ADDIUPC, SWC132, SDC132, SW32 */
16823         case 7:
16824         /* LB32, LH32, LWC132, LDC132, LW32 */
16825             if (ctx->hflags & MIPS_HFLAG_BDS16) {
16826                 generate_exception_end(ctx, EXCP_RI);
16827                 return 2;
16828             }
16829             break;
16830         case 1:
16831         /* POOL16A, POOL16B, POOL16C, LWGP16, POOL16F */
16832         case 2:
16833         /* LBU16, LHU16, LWSP16, LW16, SB16, SH16, SWSP16, SW16 */
16834         case 3:
16835         /* MOVE16, ANDI16, POOL16D, POOL16E, BEQZ16, BNEZ16, B16, LI16 */
16836             if (ctx->hflags & MIPS_HFLAG_BDS32) {
16837                 generate_exception_end(ctx, EXCP_RI);
16838                 return 2;
16839             }
16840             break;
16841         }
16842     }
16843
16844     switch (op) {
16845     case POOL16A:
16846         {
16847             int rd = mmreg(uMIPS_RD(ctx->opcode));
16848             int rs1 = mmreg(uMIPS_RS1(ctx->opcode));
16849             int rs2 = mmreg(uMIPS_RS2(ctx->opcode));
16850             uint32_t opc = 0;
16851
16852             switch (ctx->opcode & 0x1) {
16853             case ADDU16:
16854                 opc = OPC_ADDU;
16855                 break;
16856             case SUBU16:
16857                 opc = OPC_SUBU;
16858                 break;
16859             }
16860             if (ctx->insn_flags & ISA_MIPS32R6) {
16861                 /* In the Release 6 the register number location in
16862                  * the instruction encoding has changed.
16863                  */
16864                 gen_arith(ctx, opc, rs1, rd, rs2);
16865             } else {
16866                 gen_arith(ctx, opc, rd, rs1, rs2);
16867             }
16868         }
16869         break;
16870     case POOL16B:
16871         {
16872             int rd = mmreg(uMIPS_RD(ctx->opcode));
16873             int rs = mmreg(uMIPS_RS(ctx->opcode));
16874             int amount = (ctx->opcode >> 1) & 0x7;
16875             uint32_t opc = 0;
16876             amount = amount == 0 ? 8 : amount;
16877
16878             switch (ctx->opcode & 0x1) {
16879             case SLL16:
16880                 opc = OPC_SLL;
16881                 break;
16882             case SRL16:
16883                 opc = OPC_SRL;
16884                 break;
16885             }
16886
16887             gen_shift_imm(ctx, opc, rd, rs, amount);
16888         }
16889         break;
16890     case POOL16C:
16891         if (ctx->insn_flags & ISA_MIPS32R6) {
16892             gen_pool16c_r6_insn(ctx);
16893         } else {
16894             gen_pool16c_insn(ctx);
16895         }
16896         break;
16897     case LWGP16:
16898         {
16899             int rd = mmreg(uMIPS_RD(ctx->opcode));
16900             int rb = 28;            /* GP */
16901             int16_t offset = SIMM(ctx->opcode, 0, 7) << 2;
16902
16903             gen_ld(ctx, OPC_LW, rd, rb, offset);
16904         }
16905         break;
16906     case POOL16F:
16907         check_insn_opc_removed(ctx, ISA_MIPS32R6);
16908         if (ctx->opcode & 1) {
16909             generate_exception_end(ctx, EXCP_RI);
16910         } else {
16911             /* MOVEP */
16912             int enc_dest = uMIPS_RD(ctx->opcode);
16913             int enc_rt = uMIPS_RS2(ctx->opcode);
16914             int enc_rs = uMIPS_RS1(ctx->opcode);
16915             gen_movep(ctx, enc_dest, enc_rt, enc_rs);
16916         }
16917         break;
16918     case LBU16:
16919         {
16920             int rd = mmreg(uMIPS_RD(ctx->opcode));
16921             int rb = mmreg(uMIPS_RS(ctx->opcode));
16922             int16_t offset = ZIMM(ctx->opcode, 0, 4);
16923             offset = (offset == 0xf ? -1 : offset);
16924
16925             gen_ld(ctx, OPC_LBU, rd, rb, offset);
16926         }
16927         break;
16928     case LHU16:
16929         {
16930             int rd = mmreg(uMIPS_RD(ctx->opcode));
16931             int rb = mmreg(uMIPS_RS(ctx->opcode));
16932             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
16933
16934             gen_ld(ctx, OPC_LHU, rd, rb, offset);
16935         }
16936         break;
16937     case LWSP16:
16938         {
16939             int rd = (ctx->opcode >> 5) & 0x1f;
16940             int rb = 29;            /* SP */
16941             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
16942
16943             gen_ld(ctx, OPC_LW, rd, rb, offset);
16944         }
16945         break;
16946     case LW16:
16947         {
16948             int rd = mmreg(uMIPS_RD(ctx->opcode));
16949             int rb = mmreg(uMIPS_RS(ctx->opcode));
16950             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
16951
16952             gen_ld(ctx, OPC_LW, rd, rb, offset);
16953         }
16954         break;
16955     case SB16:
16956         {
16957             int rd = mmreg2(uMIPS_RD(ctx->opcode));
16958             int rb = mmreg(uMIPS_RS(ctx->opcode));
16959             int16_t offset = ZIMM(ctx->opcode, 0, 4);
16960
16961             gen_st(ctx, OPC_SB, rd, rb, offset);
16962         }
16963         break;
16964     case SH16:
16965         {
16966             int rd = mmreg2(uMIPS_RD(ctx->opcode));
16967             int rb = mmreg(uMIPS_RS(ctx->opcode));
16968             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
16969
16970             gen_st(ctx, OPC_SH, rd, rb, offset);
16971         }
16972         break;
16973     case SWSP16:
16974         {
16975             int rd = (ctx->opcode >> 5) & 0x1f;
16976             int rb = 29;            /* SP */
16977             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
16978
16979             gen_st(ctx, OPC_SW, rd, rb, offset);
16980         }
16981         break;
16982     case SW16:
16983         {
16984             int rd = mmreg2(uMIPS_RD(ctx->opcode));
16985             int rb = mmreg(uMIPS_RS(ctx->opcode));
16986             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
16987
16988             gen_st(ctx, OPC_SW, rd, rb, offset);
16989         }
16990         break;
16991     case MOVE16:
16992         {
16993             int rd = uMIPS_RD5(ctx->opcode);
16994             int rs = uMIPS_RS5(ctx->opcode);
16995
16996             gen_arith(ctx, OPC_ADDU, rd, rs, 0);
16997         }
16998         break;
16999     case ANDI16:
17000         gen_andi16(ctx);
17001         break;
17002     case POOL16D:
17003         switch (ctx->opcode & 0x1) {
17004         case ADDIUS5:
17005             gen_addius5(ctx);
17006             break;
17007         case ADDIUSP:
17008             gen_addiusp(ctx);
17009             break;
17010         }
17011         break;
17012     case POOL16E:
17013         switch (ctx->opcode & 0x1) {
17014         case ADDIUR2:
17015             gen_addiur2(ctx);
17016             break;
17017         case ADDIUR1SP:
17018             gen_addiur1sp(ctx);
17019             break;
17020         }
17021         break;
17022     case B16: /* BC16 */
17023         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0,
17024                            sextract32(ctx->opcode, 0, 10) << 1,
17025                            (ctx->insn_flags & ISA_MIPS32R6) ? 0 : 4);
17026         break;
17027     case BNEZ16: /* BNEZC16 */
17028     case BEQZ16: /* BEQZC16 */
17029         gen_compute_branch(ctx, op == BNEZ16 ? OPC_BNE : OPC_BEQ, 2,
17030                            mmreg(uMIPS_RD(ctx->opcode)),
17031                            0, sextract32(ctx->opcode, 0, 7) << 1,
17032                            (ctx->insn_flags & ISA_MIPS32R6) ? 0 : 4);
17033
17034         break;
17035     case LI16:
17036         {
17037             int reg = mmreg(uMIPS_RD(ctx->opcode));
17038             int imm = ZIMM(ctx->opcode, 0, 7);
17039
17040             imm = (imm == 0x7f ? -1 : imm);
17041             tcg_gen_movi_tl(cpu_gpr[reg], imm);
17042         }
17043         break;
17044     case RES_29:
17045     case RES_31:
17046     case RES_39:
17047         generate_exception_end(ctx, EXCP_RI);
17048         break;
17049     default:
17050         decode_micromips32_opc(env, ctx);
17051         return 4;
17052     }
17053
17054     return 2;
17055 }
17056
17057 /*
17058  *
17059  * nanoMIPS opcodes
17060  *
17061  */
17062
17063 /* MAJOR, P16, and P32 pools opcodes */
17064 enum {
17065     NM_P_ADDIU      = 0x00,
17066     NM_ADDIUPC      = 0x01,
17067     NM_MOVE_BALC    = 0x02,
17068     NM_P16_MV       = 0x04,
17069     NM_LW16         = 0x05,
17070     NM_BC16         = 0x06,
17071     NM_P16_SR       = 0x07,
17072
17073     NM_POOL32A      = 0x08,
17074     NM_P_BAL        = 0x0a,
17075     NM_P16_SHIFT    = 0x0c,
17076     NM_LWSP16       = 0x0d,
17077     NM_BALC16       = 0x0e,
17078     NM_P16_4X4      = 0x0f,
17079
17080     NM_P_GP_W       = 0x10,
17081     NM_P_GP_BH      = 0x11,
17082     NM_P_J          = 0x12,
17083     NM_P16C         = 0x14,
17084     NM_LWGP16       = 0x15,
17085     NM_P16_LB       = 0x17,
17086
17087     NM_P48I         = 0x18,
17088     NM_P16_A1       = 0x1c,
17089     NM_LW4X4        = 0x1d,
17090     NM_P16_LH       = 0x1f,
17091
17092     NM_P_U12        = 0x20,
17093     NM_P_LS_U12     = 0x21,
17094     NM_P_BR1        = 0x22,
17095     NM_P16_A2       = 0x24,
17096     NM_SW16         = 0x25,
17097     NM_BEQZC16      = 0x26,
17098
17099     NM_POOL32F      = 0x28,
17100     NM_P_LS_S9      = 0x29,
17101     NM_P_BR2        = 0x2a,
17102
17103     NM_P16_ADDU     = 0x2c,
17104     NM_SWSP16       = 0x2d,
17105     NM_BNEZC16      = 0x2e,
17106     NM_MOVEP        = 0x2f,
17107
17108     NM_POOL32S      = 0x30,
17109     NM_P_BRI        = 0x32,
17110     NM_LI16         = 0x34,
17111     NM_SWGP16       = 0x35,
17112     NM_P16_BR       = 0x36,
17113
17114     NM_P_LUI        = 0x38,
17115     NM_ANDI16       = 0x3c,
17116     NM_SW4X4        = 0x3d,
17117     NM_MOVEPREV     = 0x3f,
17118 };
17119
17120 /* POOL32A instruction pool */
17121 enum {
17122     NM_POOL32A0    = 0x00,
17123     NM_SPECIAL2    = 0x01,
17124     NM_COP2_1      = 0x02,
17125     NM_UDI         = 0x03,
17126     NM_POOL32A5    = 0x05,
17127     NM_POOL32A7    = 0x07,
17128 };
17129
17130 /* P.GP.W instruction pool */
17131 enum {
17132     NM_ADDIUGP_W = 0x00,
17133     NM_LWGP      = 0x02,
17134     NM_SWGP      = 0x03,
17135 };
17136
17137 /* P48I instruction pool */
17138 enum {
17139     NM_LI48        = 0x00,
17140     NM_ADDIU48     = 0x01,
17141     NM_ADDIUGP48   = 0x02,
17142     NM_ADDIUPC48   = 0x03,
17143     NM_LWPC48      = 0x0b,
17144     NM_SWPC48      = 0x0f,
17145 };
17146
17147 /* P.U12 instruction pool */
17148 enum {
17149     NM_ORI      = 0x00,
17150     NM_XORI     = 0x01,
17151     NM_ANDI     = 0x02,
17152     NM_P_SR     = 0x03,
17153     NM_SLTI     = 0x04,
17154     NM_SLTIU    = 0x05,
17155     NM_SEQI     = 0x06,
17156     NM_ADDIUNEG = 0x08,
17157     NM_P_SHIFT  = 0x0c,
17158     NM_P_ROTX   = 0x0d,
17159     NM_P_INS    = 0x0e,
17160     NM_P_EXT    = 0x0f,
17161 };
17162
17163 /* POOL32F instruction pool */
17164 enum {
17165     NM_POOL32F_0   = 0x00,
17166     NM_POOL32F_3   = 0x03,
17167     NM_POOL32F_5   = 0x05,
17168 };
17169
17170 /* POOL32S instruction pool */
17171 enum {
17172     NM_POOL32S_0   = 0x00,
17173     NM_POOL32S_4   = 0x04,
17174 };
17175
17176 /* P.LUI instruction pool */
17177 enum {
17178     NM_LUI      = 0x00,
17179     NM_ALUIPC   = 0x01,
17180 };
17181
17182 /* P.GP.BH instruction pool */
17183 enum {
17184     NM_LBGP      = 0x00,
17185     NM_SBGP      = 0x01,
17186     NM_LBUGP     = 0x02,
17187     NM_ADDIUGP_B = 0x03,
17188     NM_P_GP_LH   = 0x04,
17189     NM_P_GP_SH   = 0x05,
17190     NM_P_GP_CP1  = 0x06,
17191 };
17192
17193 /* P.LS.U12 instruction pool */
17194 enum {
17195     NM_LB        = 0x00,
17196     NM_SB        = 0x01,
17197     NM_LBU       = 0x02,
17198     NM_P_PREFU12 = 0x03,
17199     NM_LH        = 0x04,
17200     NM_SH        = 0x05,
17201     NM_LHU       = 0x06,
17202     NM_LWU       = 0x07,
17203     NM_LW        = 0x08,
17204     NM_SW        = 0x09,
17205     NM_LWC1      = 0x0a,
17206     NM_SWC1      = 0x0b,
17207     NM_LDC1      = 0x0e,
17208     NM_SDC1      = 0x0f,
17209 };
17210
17211 /* P.LS.S9 instruction pool */
17212 enum {
17213     NM_P_LS_S0         = 0x00,
17214     NM_P_LS_S1         = 0x01,
17215     NM_P_LS_E0         = 0x02,
17216     NM_P_LS_WM         = 0x04,
17217     NM_P_LS_UAWM       = 0x05,
17218 };
17219
17220 /* P.BAL instruction pool */
17221 enum {
17222     NM_BC       = 0x00,
17223     NM_BALC     = 0x01,
17224 };
17225
17226 /* P.J instruction pool */
17227 enum {
17228     NM_JALRC    = 0x00,
17229     NM_JALRC_HB = 0x01,
17230     NM_P_BALRSC = 0x08,
17231 };
17232
17233 /* P.BR1 instruction pool */
17234 enum {
17235     NM_BEQC     = 0x00,
17236     NM_P_BR3A   = 0x01,
17237     NM_BGEC     = 0x02,
17238     NM_BGEUC    = 0x03,
17239 };
17240
17241 /* P.BR2 instruction pool */
17242 enum {
17243     NM_BNEC     = 0x00,
17244     NM_BLTC     = 0x02,
17245     NM_BLTUC    = 0x03,
17246 };
17247
17248 /* P.BRI instruction pool */
17249 enum {
17250     NM_BEQIC    = 0x00,
17251     NM_BBEQZC   = 0x01,
17252     NM_BGEIC    = 0x02,
17253     NM_BGEIUC   = 0x03,
17254     NM_BNEIC    = 0x04,
17255     NM_BBNEZC   = 0x05,
17256     NM_BLTIC    = 0x06,
17257     NM_BLTIUC   = 0x07,
17258 };
17259
17260 /* P16.SHIFT instruction pool */
17261 enum {
17262     NM_SLL16    = 0x00,
17263     NM_SRL16    = 0x01,
17264 };
17265
17266 /* POOL16C instruction pool */
17267 enum {
17268     NM_POOL16C_0  = 0x00,
17269     NM_LWXS16     = 0x01,
17270 };
17271
17272 /* P16.A1 instruction pool */
17273 enum {
17274     NM_ADDIUR1SP = 0x01,
17275 };
17276
17277 /* P16.A2 instruction pool */
17278 enum {
17279     NM_ADDIUR2  = 0x00,
17280     NM_P_ADDIURS5  = 0x01,
17281 };
17282
17283 /* P16.ADDU instruction pool */
17284 enum {
17285     NM_ADDU16     = 0x00,
17286     NM_SUBU16     = 0x01,
17287 };
17288
17289 /* P16.SR instruction pool */
17290 enum {
17291     NM_SAVE16        = 0x00,
17292     NM_RESTORE_JRC16 = 0x01,
17293 };
17294
17295 /* P16.4X4 instruction pool */
17296 enum {
17297     NM_ADDU4X4      = 0x00,
17298     NM_MUL4X4       = 0x01,
17299 };
17300
17301 /* P16.LB instruction pool */
17302 enum {
17303     NM_LB16       = 0x00,
17304     NM_SB16       = 0x01,
17305     NM_LBU16      = 0x02,
17306 };
17307
17308 /* P16.LH  instruction pool */
17309 enum {
17310     NM_LH16     = 0x00,
17311     NM_SH16     = 0x01,
17312     NM_LHU16    = 0x02,
17313 };
17314
17315 /* P.RI instruction pool */
17316 enum {
17317     NM_SIGRIE       = 0x00,
17318     NM_P_SYSCALL    = 0x01,
17319     NM_BREAK        = 0x02,
17320     NM_SDBBP        = 0x03,
17321 };
17322
17323 /* POOL32A0 instruction pool */
17324 enum {
17325     NM_P_TRAP   = 0x00,
17326     NM_SEB      = 0x01,
17327     NM_SLLV     = 0x02,
17328     NM_MUL      = 0x03,
17329     NM_MFC0     = 0x06,
17330     NM_MFHC0    = 0x07,
17331     NM_SEH      = 0x09,
17332     NM_SRLV     = 0x0a,
17333     NM_MUH      = 0x0b,
17334     NM_MTC0     = 0x0e,
17335     NM_MTHC0    = 0x0f,
17336     NM_SRAV     = 0x12,
17337     NM_MULU     = 0x13,
17338     NM_ROTRV    = 0x1a,
17339     NM_MUHU     = 0x1b,
17340     NM_ADD      = 0x22,
17341     NM_DIV      = 0x23,
17342     NM_ADDU     = 0x2a,
17343     NM_MOD      = 0x2b,
17344     NM_SUB      = 0x32,
17345     NM_DIVU     = 0x33,
17346     NM_RDHWR    = 0x38,
17347     NM_SUBU     = 0x3a,
17348     NM_MODU     = 0x3b,
17349     NM_P_CMOVE  = 0x42,
17350     NM_FORK     = 0x45,
17351     NM_MFTR     = 0x46,
17352     NM_MFHTR    = 0x47,
17353     NM_AND      = 0x4a,
17354     NM_YIELD    = 0x4d,
17355     NM_MTTR     = 0x4e,
17356     NM_MTHTR    = 0x4f,
17357     NM_OR       = 0x52,
17358     NM_D_E_MT_VPE = 0x56,
17359     NM_NOR      = 0x5a,
17360     NM_XOR      = 0x62,
17361     NM_SLT      = 0x6a,
17362     NM_P_SLTU   = 0x72,
17363     NM_SOV      = 0x7a,
17364 };
17365
17366 /* POOL32A5 instruction pool */
17367 enum {
17368     NM_CMP_EQ_PH        = 0x00,
17369     NM_CMP_LT_PH        = 0x08,
17370     NM_CMP_LE_PH        = 0x10,
17371     NM_CMPGU_EQ_QB      = 0x18,
17372     NM_CMPGU_LT_QB      = 0x20,
17373     NM_CMPGU_LE_QB      = 0x28,
17374     NM_CMPGDU_EQ_QB     = 0x30,
17375     NM_CMPGDU_LT_QB     = 0x38,
17376     NM_CMPGDU_LE_QB     = 0x40,
17377     NM_CMPU_EQ_QB       = 0x48,
17378     NM_CMPU_LT_QB       = 0x50,
17379     NM_CMPU_LE_QB       = 0x58,
17380     NM_ADDQ_S_W         = 0x60,
17381     NM_SUBQ_S_W         = 0x68,
17382     NM_ADDSC            = 0x70,
17383     NM_ADDWC            = 0x78,
17384
17385     NM_ADDQ_S_PH   = 0x01,
17386     NM_ADDQH_R_PH  = 0x09,
17387     NM_ADDQH_R_W   = 0x11,
17388     NM_ADDU_S_QB   = 0x19,
17389     NM_ADDU_S_PH   = 0x21,
17390     NM_ADDUH_R_QB  = 0x29,
17391     NM_SHRAV_R_PH  = 0x31,
17392     NM_SHRAV_R_QB  = 0x39,
17393     NM_SUBQ_S_PH   = 0x41,
17394     NM_SUBQH_R_PH  = 0x49,
17395     NM_SUBQH_R_W   = 0x51,
17396     NM_SUBU_S_QB   = 0x59,
17397     NM_SUBU_S_PH   = 0x61,
17398     NM_SUBUH_R_QB  = 0x69,
17399     NM_SHLLV_S_PH  = 0x71,
17400     NM_PRECR_SRA_R_PH_W = 0x79,
17401
17402     NM_MULEU_S_PH_QBL   = 0x12,
17403     NM_MULEU_S_PH_QBR   = 0x1a,
17404     NM_MULQ_RS_PH       = 0x22,
17405     NM_MULQ_S_PH        = 0x2a,
17406     NM_MULQ_RS_W        = 0x32,
17407     NM_MULQ_S_W         = 0x3a,
17408     NM_APPEND           = 0x42,
17409     NM_MODSUB           = 0x52,
17410     NM_SHRAV_R_W        = 0x5a,
17411     NM_SHRLV_PH         = 0x62,
17412     NM_SHRLV_QB         = 0x6a,
17413     NM_SHLLV_QB         = 0x72,
17414     NM_SHLLV_S_W        = 0x7a,
17415
17416     NM_SHILO            = 0x03,
17417
17418     NM_MULEQ_S_W_PHL    = 0x04,
17419     NM_MULEQ_S_W_PHR    = 0x0c,
17420
17421     NM_MUL_S_PH         = 0x05,
17422     NM_PRECR_QB_PH      = 0x0d,
17423     NM_PRECRQ_QB_PH     = 0x15,
17424     NM_PRECRQ_PH_W      = 0x1d,
17425     NM_PRECRQ_RS_PH_W   = 0x25,
17426     NM_PRECRQU_S_QB_PH  = 0x2d,
17427     NM_PACKRL_PH        = 0x35,
17428     NM_PICK_QB          = 0x3d,
17429     NM_PICK_PH          = 0x45,
17430
17431     NM_SHRA_R_W         = 0x5e,
17432     NM_SHRA_R_PH        = 0x66,
17433     NM_SHLL_S_PH        = 0x76,
17434     NM_SHLL_S_W         = 0x7e,
17435
17436     NM_REPL_PH          = 0x07
17437 };
17438
17439 /* POOL32A7 instruction pool */
17440 enum {
17441     NM_P_LSX        = 0x00,
17442     NM_LSA          = 0x01,
17443     NM_EXTW         = 0x03,
17444     NM_POOL32AXF    = 0x07,
17445 };
17446
17447 /* P.SR instruction pool */
17448 enum {
17449     NM_PP_SR           = 0x00,
17450     NM_P_SR_F          = 0x01,
17451 };
17452
17453 /* P.SHIFT instruction pool */
17454 enum {
17455     NM_P_SLL        = 0x00,
17456     NM_SRL          = 0x02,
17457     NM_SRA          = 0x04,
17458     NM_ROTR         = 0x06,
17459 };
17460
17461 /* P.ROTX instruction pool */
17462 enum {
17463     NM_ROTX         = 0x00,
17464 };
17465
17466 /* P.INS instruction pool */
17467 enum {
17468     NM_INS          = 0x00,
17469 };
17470
17471 /* P.EXT instruction pool */
17472 enum {
17473     NM_EXT          = 0x00,
17474 };
17475
17476 /* POOL32F_0 (fmt) instruction pool */
17477 enum {
17478     NM_RINT_S              = 0x04,
17479     NM_RINT_D              = 0x44,
17480     NM_ADD_S               = 0x06,
17481     NM_SELEQZ_S            = 0x07,
17482     NM_SELEQZ_D            = 0x47,
17483     NM_CLASS_S             = 0x0c,
17484     NM_CLASS_D             = 0x4c,
17485     NM_SUB_S               = 0x0e,
17486     NM_SELNEZ_S            = 0x0f,
17487     NM_SELNEZ_D            = 0x4f,
17488     NM_MUL_S               = 0x16,
17489     NM_SEL_S               = 0x17,
17490     NM_SEL_D               = 0x57,
17491     NM_DIV_S               = 0x1e,
17492     NM_ADD_D               = 0x26,
17493     NM_SUB_D               = 0x2e,
17494     NM_MUL_D               = 0x36,
17495     NM_MADDF_S             = 0x37,
17496     NM_MADDF_D             = 0x77,
17497     NM_DIV_D               = 0x3e,
17498     NM_MSUBF_S             = 0x3f,
17499     NM_MSUBF_D             = 0x7f,
17500 };
17501
17502 /* POOL32F_3  instruction pool */
17503 enum {
17504     NM_MIN_FMT         = 0x00,
17505     NM_MAX_FMT         = 0x01,
17506     NM_MINA_FMT        = 0x04,
17507     NM_MAXA_FMT        = 0x05,
17508     NM_POOL32FXF       = 0x07,
17509 };
17510
17511 /* POOL32F_5  instruction pool */
17512 enum {
17513     NM_CMP_CONDN_S     = 0x00,
17514     NM_CMP_CONDN_D     = 0x02,
17515 };
17516
17517 /* P.GP.LH instruction pool */
17518 enum {
17519     NM_LHGP    = 0x00,
17520     NM_LHUGP   = 0x01,
17521 };
17522
17523 /* P.GP.SH instruction pool */
17524 enum {
17525     NM_SHGP    = 0x00,
17526 };
17527
17528 /* P.GP.CP1 instruction pool */
17529 enum {
17530     NM_LWC1GP       = 0x00,
17531     NM_SWC1GP       = 0x01,
17532     NM_LDC1GP       = 0x02,
17533     NM_SDC1GP       = 0x03,
17534 };
17535
17536 /* P.LS.S0 instruction pool */
17537 enum {
17538     NM_LBS9     = 0x00,
17539     NM_LHS9     = 0x04,
17540     NM_LWS9     = 0x08,
17541     NM_LDS9     = 0x0c,
17542
17543     NM_SBS9     = 0x01,
17544     NM_SHS9     = 0x05,
17545     NM_SWS9     = 0x09,
17546     NM_SDS9     = 0x0d,
17547
17548     NM_LBUS9    = 0x02,
17549     NM_LHUS9    = 0x06,
17550     NM_LWC1S9   = 0x0a,
17551     NM_LDC1S9   = 0x0e,
17552
17553     NM_P_PREFS9 = 0x03,
17554     NM_LWUS9    = 0x07,
17555     NM_SWC1S9   = 0x0b,
17556     NM_SDC1S9   = 0x0f,
17557 };
17558
17559 /* P.LS.S1 instruction pool */
17560 enum {
17561     NM_ASET_ACLR = 0x02,
17562     NM_UALH      = 0x04,
17563     NM_UASH      = 0x05,
17564     NM_CACHE     = 0x07,
17565     NM_P_LL      = 0x0a,
17566     NM_P_SC      = 0x0b,
17567 };
17568
17569 /* P.LS.E0 instruction pool */
17570 enum {
17571     NM_LBE      = 0x00,
17572     NM_SBE      = 0x01,
17573     NM_LBUE     = 0x02,
17574     NM_P_PREFE  = 0x03,
17575     NM_LHE      = 0x04,
17576     NM_SHE      = 0x05,
17577     NM_LHUE     = 0x06,
17578     NM_CACHEE   = 0x07,
17579     NM_LWE      = 0x08,
17580     NM_SWE      = 0x09,
17581     NM_P_LLE    = 0x0a,
17582     NM_P_SCE    = 0x0b,
17583 };
17584
17585 /* P.PREFE instruction pool */
17586 enum {
17587     NM_SYNCIE   = 0x00,
17588     NM_PREFE    = 0x01,
17589 };
17590
17591 /* P.LLE instruction pool */
17592 enum {
17593     NM_LLE      = 0x00,
17594     NM_LLWPE    = 0x01,
17595 };
17596
17597 /* P.SCE instruction pool */
17598 enum {
17599     NM_SCE      = 0x00,
17600     NM_SCWPE    = 0x01,
17601 };
17602
17603 /* P.LS.WM instruction pool */
17604 enum {
17605     NM_LWM       = 0x00,
17606     NM_SWM       = 0x01,
17607 };
17608
17609 /* P.LS.UAWM instruction pool */
17610 enum {
17611     NM_UALWM       = 0x00,
17612     NM_UASWM       = 0x01,
17613 };
17614
17615 /* P.BR3A instruction pool */
17616 enum {
17617     NM_BC1EQZC          = 0x00,
17618     NM_BC1NEZC          = 0x01,
17619     NM_BC2EQZC          = 0x02,
17620     NM_BC2NEZC          = 0x03,
17621     NM_BPOSGE32C        = 0x04,
17622 };
17623
17624 /* P16.RI instruction pool */
17625 enum {
17626     NM_P16_SYSCALL  = 0x01,
17627     NM_BREAK16      = 0x02,
17628     NM_SDBBP16      = 0x03,
17629 };
17630
17631 /* POOL16C_0 instruction pool */
17632 enum {
17633     NM_POOL16C_00      = 0x00,
17634 };
17635
17636 /* P16.JRC instruction pool */
17637 enum {
17638     NM_JRC          = 0x00,
17639     NM_JALRC16      = 0x01,
17640 };
17641
17642 /* P.SYSCALL instruction pool */
17643 enum {
17644     NM_SYSCALL      = 0x00,
17645     NM_HYPCALL      = 0x01,
17646 };
17647
17648 /* P.TRAP instruction pool */
17649 enum {
17650     NM_TEQ          = 0x00,
17651     NM_TNE          = 0x01,
17652 };
17653
17654 /* P.CMOVE instruction pool */
17655 enum {
17656     NM_MOVZ            = 0x00,
17657     NM_MOVN            = 0x01,
17658 };
17659
17660 /* POOL32Axf instruction pool */
17661 enum {
17662     NM_POOL32AXF_1 = 0x01,
17663     NM_POOL32AXF_2 = 0x02,
17664     NM_POOL32AXF_4 = 0x04,
17665     NM_POOL32AXF_5 = 0x05,
17666     NM_POOL32AXF_7 = 0x07,
17667 };
17668
17669 /* POOL32Axf_1 instruction pool */
17670 enum {
17671     NM_POOL32AXF_1_0 = 0x00,
17672     NM_POOL32AXF_1_1 = 0x01,
17673     NM_POOL32AXF_1_3 = 0x03,
17674     NM_POOL32AXF_1_4 = 0x04,
17675     NM_POOL32AXF_1_5 = 0x05,
17676     NM_POOL32AXF_1_7 = 0x07,
17677 };
17678
17679 /* POOL32Axf_2 instruction pool */
17680 enum {
17681     NM_POOL32AXF_2_0_7     = 0x00,
17682     NM_POOL32AXF_2_8_15    = 0x01,
17683     NM_POOL32AXF_2_16_23   = 0x02,
17684     NM_POOL32AXF_2_24_31   = 0x03,
17685 };
17686
17687 /* POOL32Axf_7 instruction pool */
17688 enum {
17689     NM_SHRA_R_QB    = 0x0,
17690     NM_SHRL_PH      = 0x1,
17691     NM_REPL_QB      = 0x2,
17692 };
17693
17694 /* POOL32Axf_1_0 instruction pool */
17695 enum {
17696     NM_MFHI = 0x0,
17697     NM_MFLO = 0x1,
17698     NM_MTHI = 0x2,
17699     NM_MTLO = 0x3,
17700 };
17701
17702 /* POOL32Axf_1_1 instruction pool */
17703 enum {
17704     NM_MTHLIP = 0x0,
17705     NM_SHILOV = 0x1,
17706 };
17707
17708 /* POOL32Axf_1_3 instruction pool */
17709 enum {
17710     NM_RDDSP    = 0x0,
17711     NM_WRDSP    = 0x1,
17712     NM_EXTP     = 0x2,
17713     NM_EXTPDP   = 0x3,
17714 };
17715
17716 /* POOL32Axf_1_4 instruction pool */
17717 enum {
17718     NM_SHLL_QB  = 0x0,
17719     NM_SHRL_QB  = 0x1,
17720 };
17721
17722 /* POOL32Axf_1_5 instruction pool */
17723 enum {
17724     NM_MAQ_S_W_PHR   = 0x0,
17725     NM_MAQ_S_W_PHL   = 0x1,
17726     NM_MAQ_SA_W_PHR  = 0x2,
17727     NM_MAQ_SA_W_PHL  = 0x3,
17728 };
17729
17730 /* POOL32Axf_1_7 instruction pool */
17731 enum {
17732     NM_EXTR_W       = 0x0,
17733     NM_EXTR_R_W     = 0x1,
17734     NM_EXTR_RS_W    = 0x2,
17735     NM_EXTR_S_H     = 0x3,
17736 };
17737
17738 /* POOL32Axf_2_0_7 instruction pool */
17739 enum {
17740     NM_DPA_W_PH     = 0x0,
17741     NM_DPAQ_S_W_PH  = 0x1,
17742     NM_DPS_W_PH     = 0x2,
17743     NM_DPSQ_S_W_PH  = 0x3,
17744     NM_BALIGN       = 0x4,
17745     NM_MADD         = 0x5,
17746     NM_MULT         = 0x6,
17747     NM_EXTRV_W      = 0x7,
17748 };
17749
17750 /* POOL32Axf_2_8_15 instruction pool */
17751 enum {
17752     NM_DPAX_W_PH    = 0x0,
17753     NM_DPAQ_SA_L_W  = 0x1,
17754     NM_DPSX_W_PH    = 0x2,
17755     NM_DPSQ_SA_L_W  = 0x3,
17756     NM_MADDU        = 0x5,
17757     NM_MULTU        = 0x6,
17758     NM_EXTRV_R_W    = 0x7,
17759 };
17760
17761 /* POOL32Axf_2_16_23 instruction pool */
17762 enum {
17763     NM_DPAU_H_QBL       = 0x0,
17764     NM_DPAQX_S_W_PH     = 0x1,
17765     NM_DPSU_H_QBL       = 0x2,
17766     NM_DPSQX_S_W_PH     = 0x3,
17767     NM_EXTPV            = 0x4,
17768     NM_MSUB             = 0x5,
17769     NM_MULSA_W_PH       = 0x6,
17770     NM_EXTRV_RS_W       = 0x7,
17771 };
17772
17773 /* POOL32Axf_2_24_31 instruction pool */
17774 enum {
17775     NM_DPAU_H_QBR       = 0x0,
17776     NM_DPAQX_SA_W_PH    = 0x1,
17777     NM_DPSU_H_QBR       = 0x2,
17778     NM_DPSQX_SA_W_PH    = 0x3,
17779     NM_EXTPDPV          = 0x4,
17780     NM_MSUBU            = 0x5,
17781     NM_MULSAQ_S_W_PH    = 0x6,
17782     NM_EXTRV_S_H        = 0x7,
17783 };
17784
17785 /* POOL32Axf_{4, 5} instruction pool */
17786 enum {
17787     NM_CLO      = 0x25,
17788     NM_CLZ      = 0x2d,
17789
17790     NM_TLBP     = 0x01,
17791     NM_TLBR     = 0x09,
17792     NM_TLBWI    = 0x11,
17793     NM_TLBWR    = 0x19,
17794     NM_TLBINV   = 0x03,
17795     NM_TLBINVF  = 0x0b,
17796     NM_DI       = 0x23,
17797     NM_EI       = 0x2b,
17798     NM_RDPGPR   = 0x70,
17799     NM_WRPGPR   = 0x78,
17800     NM_WAIT     = 0x61,
17801     NM_DERET    = 0x71,
17802     NM_ERETX    = 0x79,
17803
17804     /* nanoMIPS DSP instructions */
17805     NM_ABSQ_S_QB        = 0x00,
17806     NM_ABSQ_S_PH        = 0x08,
17807     NM_ABSQ_S_W         = 0x10,
17808     NM_PRECEQ_W_PHL     = 0x28,
17809     NM_PRECEQ_W_PHR     = 0x30,
17810     NM_PRECEQU_PH_QBL   = 0x38,
17811     NM_PRECEQU_PH_QBR   = 0x48,
17812     NM_PRECEU_PH_QBL    = 0x58,
17813     NM_PRECEU_PH_QBR    = 0x68,
17814     NM_PRECEQU_PH_QBLA  = 0x39,
17815     NM_PRECEQU_PH_QBRA  = 0x49,
17816     NM_PRECEU_PH_QBLA   = 0x59,
17817     NM_PRECEU_PH_QBRA   = 0x69,
17818     NM_REPLV_PH         = 0x01,
17819     NM_REPLV_QB         = 0x09,
17820     NM_BITREV           = 0x18,
17821     NM_INSV             = 0x20,
17822     NM_RADDU_W_QB       = 0x78,
17823
17824     NM_BITSWAP          = 0x05,
17825     NM_WSBH             = 0x3d,
17826 };
17827
17828 /* PP.SR instruction pool */
17829 enum {
17830     NM_SAVE         = 0x00,
17831     NM_RESTORE      = 0x02,
17832     NM_RESTORE_JRC  = 0x03,
17833 };
17834
17835 /* P.SR.F instruction pool */
17836 enum {
17837     NM_SAVEF        = 0x00,
17838     NM_RESTOREF     = 0x01,
17839 };
17840
17841 /* P16.SYSCALL  instruction pool */
17842 enum {
17843     NM_SYSCALL16     = 0x00,
17844     NM_HYPCALL16     = 0x01,
17845 };
17846
17847 /* POOL16C_00 instruction pool */
17848 enum {
17849     NM_NOT16           = 0x00,
17850     NM_XOR16           = 0x01,
17851     NM_AND16           = 0x02,
17852     NM_OR16            = 0x03,
17853 };
17854
17855 /* PP.LSX and PP.LSXS instruction pool */
17856 enum {
17857     NM_LBX      = 0x00,
17858     NM_LHX      = 0x04,
17859     NM_LWX      = 0x08,
17860     NM_LDX      = 0x0c,
17861
17862     NM_SBX      = 0x01,
17863     NM_SHX      = 0x05,
17864     NM_SWX      = 0x09,
17865     NM_SDX      = 0x0d,
17866
17867     NM_LBUX     = 0x02,
17868     NM_LHUX     = 0x06,
17869     NM_LWC1X    = 0x0a,
17870     NM_LDC1X    = 0x0e,
17871
17872     NM_LWUX     = 0x07,
17873     NM_SWC1X    = 0x0b,
17874     NM_SDC1X    = 0x0f,
17875
17876     NM_LHXS     = 0x04,
17877     NM_LWXS     = 0x08,
17878     NM_LDXS     = 0x0c,
17879
17880     NM_SHXS     = 0x05,
17881     NM_SWXS     = 0x09,
17882     NM_SDXS     = 0x0d,
17883
17884     NM_LHUXS    = 0x06,
17885     NM_LWC1XS   = 0x0a,
17886     NM_LDC1XS   = 0x0e,
17887
17888     NM_LWUXS    = 0x07,
17889     NM_SWC1XS   = 0x0b,
17890     NM_SDC1XS   = 0x0f,
17891 };
17892
17893 /* ERETx instruction pool */
17894 enum {
17895     NM_ERET     = 0x00,
17896     NM_ERETNC   = 0x01,
17897 };
17898
17899 /* POOL32FxF_{0, 1} insturction pool */
17900 enum {
17901     NM_CFC1     = 0x40,
17902     NM_CTC1     = 0x60,
17903     NM_MFC1     = 0x80,
17904     NM_MTC1     = 0xa0,
17905     NM_MFHC1    = 0xc0,
17906     NM_MTHC1    = 0xe0,
17907
17908     NM_CVT_S_PL = 0x84,
17909     NM_CVT_S_PU = 0xa4,
17910
17911     NM_CVT_L_S     = 0x004,
17912     NM_CVT_L_D     = 0x104,
17913     NM_CVT_W_S     = 0x024,
17914     NM_CVT_W_D     = 0x124,
17915
17916     NM_RSQRT_S     = 0x008,
17917     NM_RSQRT_D     = 0x108,
17918
17919     NM_SQRT_S      = 0x028,
17920     NM_SQRT_D      = 0x128,
17921
17922     NM_RECIP_S     = 0x048,
17923     NM_RECIP_D     = 0x148,
17924
17925     NM_FLOOR_L_S   = 0x00c,
17926     NM_FLOOR_L_D   = 0x10c,
17927
17928     NM_FLOOR_W_S   = 0x02c,
17929     NM_FLOOR_W_D   = 0x12c,
17930
17931     NM_CEIL_L_S    = 0x04c,
17932     NM_CEIL_L_D    = 0x14c,
17933     NM_CEIL_W_S    = 0x06c,
17934     NM_CEIL_W_D    = 0x16c,
17935     NM_TRUNC_L_S   = 0x08c,
17936     NM_TRUNC_L_D   = 0x18c,
17937     NM_TRUNC_W_S   = 0x0ac,
17938     NM_TRUNC_W_D   = 0x1ac,
17939     NM_ROUND_L_S   = 0x0cc,
17940     NM_ROUND_L_D   = 0x1cc,
17941     NM_ROUND_W_S   = 0x0ec,
17942     NM_ROUND_W_D   = 0x1ec,
17943
17944     NM_MOV_S       = 0x01,
17945     NM_MOV_D       = 0x81,
17946     NM_ABS_S       = 0x0d,
17947     NM_ABS_D       = 0x8d,
17948     NM_NEG_S       = 0x2d,
17949     NM_NEG_D       = 0xad,
17950     NM_CVT_D_S     = 0x04d,
17951     NM_CVT_D_W     = 0x0cd,
17952     NM_CVT_D_L     = 0x14d,
17953     NM_CVT_S_D     = 0x06d,
17954     NM_CVT_S_W     = 0x0ed,
17955     NM_CVT_S_L     = 0x16d,
17956 };
17957
17958 /* P.LL instruction pool */
17959 enum {
17960     NM_LL       = 0x00,
17961     NM_LLWP     = 0x01,
17962 };
17963
17964 /* P.SC instruction pool */
17965 enum {
17966     NM_SC       = 0x00,
17967     NM_SCWP     = 0x01,
17968 };
17969
17970 /* P.DVP instruction pool */
17971 enum {
17972     NM_DVP      = 0x00,
17973     NM_EVP      = 0x01,
17974 };
17975
17976
17977 /*
17978  *
17979  * nanoMIPS decoding engine
17980  *
17981  */
17982
17983
17984 /* extraction utilities */
17985
17986 #define NANOMIPS_EXTRACT_RD(op) ((op >> 7) & 0x7)
17987 #define NANOMIPS_EXTRACT_RS(op) ((op >> 4) & 0x7)
17988 #define NANOMIPS_EXTRACT_RS2(op) uMIPS_RS(op)
17989 #define NANOMIPS_EXTRACT_RS1(op) ((op >> 1) & 0x7)
17990 #define NANOMIPS_EXTRACT_RD5(op) ((op >> 5) & 0x1f)
17991 #define NANOMIPS_EXTRACT_RS5(op) (op & 0x1f)
17992
17993 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr3'). */
17994 static inline int decode_gpr_gpr3(int r)
17995 {
17996     static const int map[] = { 16, 17, 18, 19,  4,  5,  6,  7 };
17997
17998     return map[r & 0x7];
17999 }
18000
18001 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr3.src.store'). */
18002 static inline int decode_gpr_gpr3_src_store(int r)
18003 {
18004     static const int map[] = {  0, 17, 18, 19,  4,  5,  6,  7 };
18005
18006     return map[r & 0x7];
18007 }
18008
18009 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr4'). */
18010 static inline int decode_gpr_gpr4(int r)
18011 {
18012     static const int map[] = {  8,  9, 10, 11,  4,  5,  6,  7,
18013                                16, 17, 18, 19, 20, 21, 22, 23 };
18014
18015     return map[r & 0xf];
18016 }
18017
18018 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr4.zero'). */
18019 static inline int decode_gpr_gpr4_zero(int r)
18020 {
18021     static const int map[] = {  8,  9, 10,  0,  4,  5,  6,  7,
18022                                16, 17, 18, 19, 20, 21, 22, 23 };
18023
18024     return map[r & 0xf];
18025 }
18026
18027
18028 /* extraction utilities */
18029
18030 #define NANOMIPS_EXTRACT_RD(op) ((op >> 7) & 0x7)
18031 #define NANOMIPS_EXTRACT_RS(op) ((op >> 4) & 0x7)
18032 #define NANOMIPS_EXTRACT_RS2(op) uMIPS_RS(op)
18033 #define NANOMIPS_EXTRACT_RS1(op) ((op >> 1) & 0x7)
18034 #define NANOMIPS_EXTRACT_RD5(op) ((op >> 5) & 0x1f)
18035 #define NANOMIPS_EXTRACT_RS5(op) (op & 0x1f)
18036
18037
18038 static void gen_adjust_sp(DisasContext *ctx, int u)
18039 {
18040     gen_op_addr_addi(ctx, cpu_gpr[29], cpu_gpr[29], u);
18041 }
18042
18043 static void gen_save(DisasContext *ctx, uint8_t rt, uint8_t count,
18044                      uint8_t gp, uint16_t u)
18045 {
18046     int counter = 0;
18047     TCGv va = tcg_temp_new();
18048     TCGv t0 = tcg_temp_new();
18049
18050     while (counter != count) {
18051         bool use_gp = gp && (counter == count - 1);
18052         int this_rt = use_gp ? 28 : (rt & 0x10) | ((rt + counter) & 0x1f);
18053         int this_offset = -((counter + 1) << 2);
18054         gen_base_offset_addr(ctx, va, 29, this_offset);
18055         gen_load_gpr(t0, this_rt);
18056         tcg_gen_qemu_st_tl(t0, va, ctx->mem_idx,
18057                            (MO_TEUL | ctx->default_tcg_memop_mask));
18058         counter++;
18059     }
18060
18061     /* adjust stack pointer */
18062     gen_adjust_sp(ctx, -u);
18063
18064     tcg_temp_free(t0);
18065     tcg_temp_free(va);
18066 }
18067
18068 static void gen_restore(DisasContext *ctx, uint8_t rt, uint8_t count,
18069                         uint8_t gp, uint16_t u)
18070 {
18071     int counter = 0;
18072     TCGv va = tcg_temp_new();
18073     TCGv t0 = tcg_temp_new();
18074
18075     while (counter != count) {
18076         bool use_gp = gp && (counter == count - 1);
18077         int this_rt = use_gp ? 28 : (rt & 0x10) | ((rt + counter) & 0x1f);
18078         int this_offset = u - ((counter + 1) << 2);
18079         gen_base_offset_addr(ctx, va, 29, this_offset);
18080         tcg_gen_qemu_ld_tl(t0, va, ctx->mem_idx, MO_TESL |
18081                         ctx->default_tcg_memop_mask);
18082         tcg_gen_ext32s_tl(t0, t0);
18083         gen_store_gpr(t0, this_rt);
18084         counter++;
18085     }
18086
18087     /* adjust stack pointer */
18088     gen_adjust_sp(ctx, u);
18089
18090     tcg_temp_free(t0);
18091     tcg_temp_free(va);
18092 }
18093
18094 static void gen_pool16c_nanomips_insn(DisasContext *ctx)
18095 {
18096     int rt = decode_gpr_gpr3(NANOMIPS_EXTRACT_RD(ctx->opcode));
18097     int rs = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS(ctx->opcode));
18098
18099     switch (extract32(ctx->opcode, 2, 2)) {
18100     case NM_NOT16:
18101         gen_logic(ctx, OPC_NOR, rt, rs, 0);
18102         break;
18103     case NM_AND16:
18104         gen_logic(ctx, OPC_AND, rt, rt, rs);
18105         break;
18106     case NM_XOR16:
18107         gen_logic(ctx, OPC_XOR, rt, rt, rs);
18108         break;
18109     case NM_OR16:
18110         gen_logic(ctx, OPC_OR, rt, rt, rs);
18111         break;
18112     }
18113 }
18114
18115 static void gen_pool32a0_nanomips_insn(CPUMIPSState *env, DisasContext *ctx)
18116 {
18117     int rt = extract32(ctx->opcode, 21, 5);
18118     int rs = extract32(ctx->opcode, 16, 5);
18119     int rd = extract32(ctx->opcode, 11, 5);
18120
18121     switch (extract32(ctx->opcode, 3, 7)) {
18122     case NM_P_TRAP:
18123         switch (extract32(ctx->opcode, 10, 1)) {
18124         case NM_TEQ:
18125             check_nms(ctx);
18126             gen_trap(ctx, OPC_TEQ, rs, rt, -1);
18127             break;
18128         case NM_TNE:
18129             check_nms(ctx);
18130             gen_trap(ctx, OPC_TNE, rs, rt, -1);
18131             break;
18132         }
18133         break;
18134     case NM_RDHWR:
18135         check_nms(ctx);
18136         gen_rdhwr(ctx, rt, rs, extract32(ctx->opcode, 11, 3));
18137         break;
18138     case NM_SEB:
18139         check_nms(ctx);
18140         gen_bshfl(ctx, OPC_SEB, rs, rt);
18141         break;
18142     case NM_SEH:
18143         gen_bshfl(ctx, OPC_SEH, rs, rt);
18144         break;
18145     case NM_SLLV:
18146         gen_shift(ctx, OPC_SLLV, rd, rt, rs);
18147         break;
18148     case NM_SRLV:
18149         gen_shift(ctx, OPC_SRLV, rd, rt, rs);
18150         break;
18151     case NM_SRAV:
18152         gen_shift(ctx, OPC_SRAV, rd, rt, rs);
18153         break;
18154     case NM_ROTRV:
18155         gen_shift(ctx, OPC_ROTRV, rd, rt, rs);
18156         break;
18157     case NM_ADD:
18158         gen_arith(ctx, OPC_ADD, rd, rs, rt);
18159         break;
18160     case NM_ADDU:
18161         gen_arith(ctx, OPC_ADDU, rd, rs, rt);
18162         break;
18163     case NM_SUB:
18164         check_nms(ctx);
18165         gen_arith(ctx, OPC_SUB, rd, rs, rt);
18166         break;
18167     case NM_SUBU:
18168         gen_arith(ctx, OPC_SUBU, rd, rs, rt);
18169         break;
18170     case NM_P_CMOVE:
18171         switch (extract32(ctx->opcode, 10, 1)) {
18172         case NM_MOVZ:
18173             gen_cond_move(ctx, OPC_MOVZ, rd, rs, rt);
18174             break;
18175         case NM_MOVN:
18176             gen_cond_move(ctx, OPC_MOVN, rd, rs, rt);
18177             break;
18178         }
18179         break;
18180     case NM_AND:
18181         gen_logic(ctx, OPC_AND, rd, rs, rt);
18182         break;
18183     case NM_OR:
18184         gen_logic(ctx, OPC_OR, rd, rs, rt);
18185         break;
18186     case NM_NOR:
18187         gen_logic(ctx, OPC_NOR, rd, rs, rt);
18188         break;
18189     case NM_XOR:
18190         gen_logic(ctx, OPC_XOR, rd, rs, rt);
18191         break;
18192     case NM_SLT:
18193         gen_slt(ctx, OPC_SLT, rd, rs, rt);
18194         break;
18195     case NM_P_SLTU:
18196         if (rd == 0) {
18197             /* P_DVP */
18198 #ifndef CONFIG_USER_ONLY
18199             TCGv t0 = tcg_temp_new();
18200             switch (extract32(ctx->opcode, 10, 1)) {
18201             case NM_DVP:
18202                 if (ctx->vp) {
18203                     check_cp0_enabled(ctx);
18204                     gen_helper_dvp(t0, cpu_env);
18205                     gen_store_gpr(t0, rt);
18206                 }
18207                 break;
18208             case NM_EVP:
18209                 if (ctx->vp) {
18210                     check_cp0_enabled(ctx);
18211                     gen_helper_evp(t0, cpu_env);
18212                     gen_store_gpr(t0, rt);
18213                 }
18214                 break;
18215             }
18216             tcg_temp_free(t0);
18217 #endif
18218         } else {
18219             gen_slt(ctx, OPC_SLTU, rd, rs, rt);
18220         }
18221         break;
18222     case NM_SOV:
18223         {
18224             TCGv t0 = tcg_temp_new();
18225             TCGv t1 = tcg_temp_new();
18226             TCGv t2 = tcg_temp_new();
18227
18228             gen_load_gpr(t1, rs);
18229             gen_load_gpr(t2, rt);
18230             tcg_gen_add_tl(t0, t1, t2);
18231             tcg_gen_ext32s_tl(t0, t0);
18232             tcg_gen_xor_tl(t1, t1, t2);
18233             tcg_gen_xor_tl(t2, t0, t2);
18234             tcg_gen_andc_tl(t1, t2, t1);
18235
18236             /* operands of same sign, result different sign */
18237             tcg_gen_setcondi_tl(TCG_COND_LT, t0, t1, 0);
18238             gen_store_gpr(t0, rd);
18239
18240             tcg_temp_free(t0);
18241             tcg_temp_free(t1);
18242             tcg_temp_free(t2);
18243         }
18244         break;
18245     case NM_MUL:
18246         gen_r6_muldiv(ctx, R6_OPC_MUL, rd, rs, rt);
18247         break;
18248     case NM_MUH:
18249         gen_r6_muldiv(ctx, R6_OPC_MUH, rd, rs, rt);
18250         break;
18251     case NM_MULU:
18252         gen_r6_muldiv(ctx, R6_OPC_MULU, rd, rs, rt);
18253         break;
18254     case NM_MUHU:
18255         gen_r6_muldiv(ctx, R6_OPC_MUHU, rd, rs, rt);
18256         break;
18257     case NM_DIV:
18258         gen_r6_muldiv(ctx, R6_OPC_DIV, rd, rs, rt);
18259         break;
18260     case NM_MOD:
18261         gen_r6_muldiv(ctx, R6_OPC_MOD, rd, rs, rt);
18262         break;
18263     case NM_DIVU:
18264         gen_r6_muldiv(ctx, R6_OPC_DIVU, rd, rs, rt);
18265         break;
18266     case NM_MODU:
18267         gen_r6_muldiv(ctx, R6_OPC_MODU, rd, rs, rt);
18268         break;
18269 #ifndef CONFIG_USER_ONLY
18270     case NM_MFC0:
18271         check_cp0_enabled(ctx);
18272         if (rt == 0) {
18273             /* Treat as NOP. */
18274             break;
18275         }
18276         gen_mfc0(ctx, cpu_gpr[rt], rs, extract32(ctx->opcode, 11, 3));
18277         break;
18278     case NM_MTC0:
18279         check_cp0_enabled(ctx);
18280         {
18281             TCGv t0 = tcg_temp_new();
18282
18283             gen_load_gpr(t0, rt);
18284             gen_mtc0(ctx, t0, rs, extract32(ctx->opcode, 11, 3));
18285             tcg_temp_free(t0);
18286         }
18287         break;
18288     case NM_D_E_MT_VPE:
18289         {
18290             uint8_t sc = extract32(ctx->opcode, 10, 1);
18291             TCGv t0 = tcg_temp_new();
18292
18293             switch (sc) {
18294             case 0:
18295                 if (rs == 1) {
18296                     /* DMT */
18297                     check_cp0_mt(ctx);
18298                     gen_helper_dmt(t0);
18299                     gen_store_gpr(t0, rt);
18300                 } else if (rs == 0) {
18301                     /* DVPE */
18302                     check_cp0_mt(ctx);
18303                     gen_helper_dvpe(t0, cpu_env);
18304                     gen_store_gpr(t0, rt);
18305                 } else {
18306                     generate_exception_end(ctx, EXCP_RI);
18307                 }
18308                 break;
18309             case 1:
18310                 if (rs == 1) {
18311                     /* EMT */
18312                     check_cp0_mt(ctx);
18313                     gen_helper_emt(t0);
18314                     gen_store_gpr(t0, rt);
18315                 } else if (rs == 0) {
18316                     /* EVPE */
18317                     check_cp0_mt(ctx);
18318                     gen_helper_evpe(t0, cpu_env);
18319                     gen_store_gpr(t0, rt);
18320                 } else {
18321                     generate_exception_end(ctx, EXCP_RI);
18322                 }
18323                 break;
18324             }
18325
18326             tcg_temp_free(t0);
18327         }
18328         break;
18329     case NM_FORK:
18330         check_mt(ctx);
18331         {
18332             TCGv t0 = tcg_temp_new();
18333             TCGv t1 = tcg_temp_new();
18334
18335             gen_load_gpr(t0, rt);
18336             gen_load_gpr(t1, rs);
18337             gen_helper_fork(t0, t1);
18338             tcg_temp_free(t0);
18339             tcg_temp_free(t1);
18340         }
18341         break;
18342     case NM_MFTR:
18343     case NM_MFHTR:
18344         check_cp0_enabled(ctx);
18345         if (rd == 0) {
18346             /* Treat as NOP. */
18347             return;
18348         }
18349         gen_mftr(env, ctx, rs, rt, extract32(ctx->opcode, 10, 1),
18350                  extract32(ctx->opcode, 11, 5), extract32(ctx->opcode, 3, 1));
18351         break;
18352     case NM_MTTR:
18353     case NM_MTHTR:
18354         check_cp0_enabled(ctx);
18355         gen_mttr(env, ctx, rs, rt, extract32(ctx->opcode, 10, 1),
18356                  extract32(ctx->opcode, 11, 5), extract32(ctx->opcode, 3, 1));
18357         break;
18358     case NM_YIELD:
18359         check_mt(ctx);
18360         {
18361             TCGv t0 = tcg_temp_new();
18362
18363             gen_load_gpr(t0, rs);
18364             gen_helper_yield(t0, cpu_env, t0);
18365             gen_store_gpr(t0, rt);
18366             tcg_temp_free(t0);
18367         }
18368         break;
18369 #endif
18370     default:
18371         generate_exception_end(ctx, EXCP_RI);
18372         break;
18373     }
18374 }
18375
18376 /* dsp */
18377 static void gen_pool32axf_1_5_nanomips_insn(DisasContext *ctx, uint32_t opc,
18378                                             int ret, int v1, int v2)
18379 {
18380     TCGv_i32 t0;
18381     TCGv v0_t;
18382     TCGv v1_t;
18383
18384     t0 = tcg_temp_new_i32();
18385
18386     v0_t = tcg_temp_new();
18387     v1_t = tcg_temp_new();
18388
18389     tcg_gen_movi_i32(t0, v2 >> 3);
18390
18391     gen_load_gpr(v0_t, ret);
18392     gen_load_gpr(v1_t, v1);
18393
18394     switch (opc) {
18395     case NM_MAQ_S_W_PHR:
18396         check_dsp(ctx);
18397         gen_helper_maq_s_w_phr(t0, v1_t, v0_t, cpu_env);
18398         break;
18399     case NM_MAQ_S_W_PHL:
18400         check_dsp(ctx);
18401         gen_helper_maq_s_w_phl(t0, v1_t, v0_t, cpu_env);
18402         break;
18403     case NM_MAQ_SA_W_PHR:
18404         check_dsp(ctx);
18405         gen_helper_maq_sa_w_phr(t0, v1_t, v0_t, cpu_env);
18406         break;
18407     case NM_MAQ_SA_W_PHL:
18408         check_dsp(ctx);
18409         gen_helper_maq_sa_w_phl(t0, v1_t, v0_t, cpu_env);
18410         break;
18411     default:
18412         generate_exception_end(ctx, EXCP_RI);
18413         break;
18414     }
18415
18416     tcg_temp_free_i32(t0);
18417
18418     tcg_temp_free(v0_t);
18419     tcg_temp_free(v1_t);
18420 }
18421
18422
18423 static void gen_pool32axf_1_nanomips_insn(DisasContext *ctx, uint32_t opc,
18424                                     int ret, int v1, int v2)
18425 {
18426     int16_t imm;
18427     TCGv t0 = tcg_temp_new();
18428     TCGv t1 = tcg_temp_new();
18429     TCGv v0_t = tcg_temp_new();
18430
18431     gen_load_gpr(v0_t, v1);
18432
18433     switch (opc) {
18434     case NM_POOL32AXF_1_0:
18435         check_dsp(ctx);
18436         switch (extract32(ctx->opcode, 12, 2)) {
18437         case NM_MFHI:
18438             gen_HILO(ctx, OPC_MFHI, v2 >> 3, ret);
18439             break;
18440         case NM_MFLO:
18441             gen_HILO(ctx, OPC_MFLO, v2 >> 3, ret);
18442             break;
18443         case NM_MTHI:
18444             gen_HILO(ctx, OPC_MTHI, v2 >> 3, v1);
18445             break;
18446         case NM_MTLO:
18447             gen_HILO(ctx, OPC_MTLO, v2 >> 3, v1);
18448             break;
18449         }
18450         break;
18451     case NM_POOL32AXF_1_1:
18452         check_dsp(ctx);
18453         switch (extract32(ctx->opcode, 12, 2)) {
18454         case NM_MTHLIP:
18455             tcg_gen_movi_tl(t0, v2);
18456             gen_helper_mthlip(t0, v0_t, cpu_env);
18457             break;
18458         case NM_SHILOV:
18459             tcg_gen_movi_tl(t0, v2 >> 3);
18460             gen_helper_shilo(t0, v0_t, cpu_env);
18461             break;
18462         default:
18463             generate_exception_end(ctx, EXCP_RI);
18464             break;
18465         }
18466         break;
18467     case NM_POOL32AXF_1_3:
18468         check_dsp(ctx);
18469         imm = extract32(ctx->opcode, 14, 7);
18470         switch (extract32(ctx->opcode, 12, 2)) {
18471         case NM_RDDSP:
18472             tcg_gen_movi_tl(t0, imm);
18473             gen_helper_rddsp(t0, t0, cpu_env);
18474             gen_store_gpr(t0, ret);
18475             break;
18476         case NM_WRDSP:
18477             gen_load_gpr(t0, ret);
18478             tcg_gen_movi_tl(t1, imm);
18479             gen_helper_wrdsp(t0, t1, cpu_env);
18480             break;
18481         case NM_EXTP:
18482             tcg_gen_movi_tl(t0, v2 >> 3);
18483             tcg_gen_movi_tl(t1, v1);
18484             gen_helper_extp(t0, t0, t1, cpu_env);
18485             gen_store_gpr(t0, ret);
18486             break;
18487         case NM_EXTPDP:
18488             tcg_gen_movi_tl(t0, v2 >> 3);
18489             tcg_gen_movi_tl(t1, v1);
18490             gen_helper_extpdp(t0, t0, t1, cpu_env);
18491             gen_store_gpr(t0, ret);
18492             break;
18493         }
18494         break;
18495     case NM_POOL32AXF_1_4:
18496         check_dsp(ctx);
18497         tcg_gen_movi_tl(t0, v2 >> 2);
18498         switch (extract32(ctx->opcode, 12, 1)) {
18499         case NM_SHLL_QB:
18500             gen_helper_shll_qb(t0, t0, v0_t, cpu_env);
18501             gen_store_gpr(t0, ret);
18502             break;
18503         case NM_SHRL_QB:
18504             gen_helper_shrl_qb(t0, t0, v0_t);
18505             gen_store_gpr(t0, ret);
18506             break;
18507         }
18508         break;
18509     case NM_POOL32AXF_1_5:
18510         opc = extract32(ctx->opcode, 12, 2);
18511         gen_pool32axf_1_5_nanomips_insn(ctx, opc, ret, v1, v2);
18512         break;
18513     case NM_POOL32AXF_1_7:
18514         check_dsp(ctx);
18515         tcg_gen_movi_tl(t0, v2 >> 3);
18516         tcg_gen_movi_tl(t1, v1);
18517         switch (extract32(ctx->opcode, 12, 2)) {
18518         case NM_EXTR_W:
18519             gen_helper_extr_w(t0, t0, t1, cpu_env);
18520             gen_store_gpr(t0, ret);
18521             break;
18522         case NM_EXTR_R_W:
18523             gen_helper_extr_r_w(t0, t0, t1, cpu_env);
18524             gen_store_gpr(t0, ret);
18525             break;
18526         case NM_EXTR_RS_W:
18527             gen_helper_extr_rs_w(t0, t0, t1, cpu_env);
18528             gen_store_gpr(t0, ret);
18529             break;
18530         case NM_EXTR_S_H:
18531             gen_helper_extr_s_h(t0, t0, t1, cpu_env);
18532             gen_store_gpr(t0, ret);
18533             break;
18534         }
18535         break;
18536     default:
18537         generate_exception_end(ctx, EXCP_RI);
18538         break;
18539     }
18540
18541     tcg_temp_free(t0);
18542     tcg_temp_free(t1);
18543     tcg_temp_free(v0_t);
18544 }
18545
18546 static void gen_pool32axf_2_multiply(DisasContext *ctx, uint32_t opc,
18547                                     TCGv v0, TCGv v1, int rd)
18548 {
18549     TCGv_i32 t0;
18550
18551     t0 = tcg_temp_new_i32();
18552
18553     tcg_gen_movi_i32(t0, rd >> 3);
18554
18555     switch (opc) {
18556     case NM_POOL32AXF_2_0_7:
18557         switch (extract32(ctx->opcode, 9, 3)) {
18558         case NM_DPA_W_PH:
18559             check_dsp_r2(ctx);
18560             gen_helper_dpa_w_ph(t0, v1, v0, cpu_env);
18561             break;
18562         case NM_DPAQ_S_W_PH:
18563             check_dsp(ctx);
18564             gen_helper_dpaq_s_w_ph(t0, v1, v0, cpu_env);
18565             break;
18566         case NM_DPS_W_PH:
18567             check_dsp_r2(ctx);
18568             gen_helper_dps_w_ph(t0, v1, v0, cpu_env);
18569             break;
18570         case NM_DPSQ_S_W_PH:
18571             check_dsp(ctx);
18572             gen_helper_dpsq_s_w_ph(t0, v1, v0, cpu_env);
18573             break;
18574         default:
18575             generate_exception_end(ctx, EXCP_RI);
18576             break;
18577         }
18578         break;
18579     case NM_POOL32AXF_2_8_15:
18580         switch (extract32(ctx->opcode, 9, 3)) {
18581         case NM_DPAX_W_PH:
18582             check_dsp_r2(ctx);
18583             gen_helper_dpax_w_ph(t0, v0, v1, cpu_env);
18584             break;
18585         case NM_DPAQ_SA_L_W:
18586             check_dsp(ctx);
18587             gen_helper_dpaq_sa_l_w(t0, v0, v1, cpu_env);
18588             break;
18589         case NM_DPSX_W_PH:
18590             check_dsp_r2(ctx);
18591             gen_helper_dpsx_w_ph(t0, v0, v1, cpu_env);
18592             break;
18593         case NM_DPSQ_SA_L_W:
18594             check_dsp(ctx);
18595             gen_helper_dpsq_sa_l_w(t0, v0, v1, cpu_env);
18596             break;
18597         default:
18598             generate_exception_end(ctx, EXCP_RI);
18599             break;
18600         }
18601         break;
18602     case NM_POOL32AXF_2_16_23:
18603         switch (extract32(ctx->opcode, 9, 3)) {
18604         case NM_DPAU_H_QBL:
18605             check_dsp(ctx);
18606             gen_helper_dpau_h_qbl(t0, v0, v1, cpu_env);
18607             break;
18608         case NM_DPAQX_S_W_PH:
18609             check_dsp_r2(ctx);
18610             gen_helper_dpaqx_s_w_ph(t0, v0, v1, cpu_env);
18611             break;
18612         case NM_DPSU_H_QBL:
18613             check_dsp(ctx);
18614             gen_helper_dpsu_h_qbl(t0, v0, v1, cpu_env);
18615             break;
18616         case NM_DPSQX_S_W_PH:
18617             check_dsp_r2(ctx);
18618             gen_helper_dpsqx_s_w_ph(t0, v0, v1, cpu_env);
18619             break;
18620         case NM_MULSA_W_PH:
18621             check_dsp_r2(ctx);
18622             gen_helper_mulsa_w_ph(t0, v0, v1, cpu_env);
18623             break;
18624         default:
18625             generate_exception_end(ctx, EXCP_RI);
18626             break;
18627         }
18628         break;
18629     case NM_POOL32AXF_2_24_31:
18630         switch (extract32(ctx->opcode, 9, 3)) {
18631         case NM_DPAU_H_QBR:
18632             check_dsp(ctx);
18633             gen_helper_dpau_h_qbr(t0, v1, v0, cpu_env);
18634             break;
18635         case NM_DPAQX_SA_W_PH:
18636             check_dsp_r2(ctx);
18637             gen_helper_dpaqx_sa_w_ph(t0, v1, v0, cpu_env);
18638             break;
18639         case NM_DPSU_H_QBR:
18640             check_dsp(ctx);
18641             gen_helper_dpsu_h_qbr(t0, v1, v0, cpu_env);
18642             break;
18643         case NM_DPSQX_SA_W_PH:
18644             check_dsp_r2(ctx);
18645             gen_helper_dpsqx_sa_w_ph(t0, v1, v0, cpu_env);
18646             break;
18647         case NM_MULSAQ_S_W_PH:
18648             check_dsp(ctx);
18649             gen_helper_mulsaq_s_w_ph(t0, v1, v0, cpu_env);
18650             break;
18651         default:
18652             generate_exception_end(ctx, EXCP_RI);
18653             break;
18654         }
18655         break;
18656     default:
18657         generate_exception_end(ctx, EXCP_RI);
18658         break;
18659     }
18660
18661     tcg_temp_free_i32(t0);
18662 }
18663
18664 static void gen_pool32axf_2_nanomips_insn(DisasContext *ctx, uint32_t opc,
18665                                           int rt, int rs, int rd)
18666 {
18667     int ret = rt;
18668     TCGv t0 = tcg_temp_new();
18669     TCGv t1 = tcg_temp_new();
18670     TCGv v0_t = tcg_temp_new();
18671     TCGv v1_t = tcg_temp_new();
18672
18673     gen_load_gpr(v0_t, rt);
18674     gen_load_gpr(v1_t, rs);
18675
18676     switch (opc) {
18677     case NM_POOL32AXF_2_0_7:
18678         switch (extract32(ctx->opcode, 9, 3)) {
18679         case NM_DPA_W_PH:
18680         case NM_DPAQ_S_W_PH:
18681         case NM_DPS_W_PH:
18682         case NM_DPSQ_S_W_PH:
18683             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
18684             break;
18685         case NM_BALIGN:
18686             check_dsp_r2(ctx);
18687             if (rt != 0) {
18688                 gen_load_gpr(t0, rs);
18689                 rd &= 3;
18690                 if (rd != 0 && rd != 2) {
18691                     tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 8 * rd);
18692                     tcg_gen_ext32u_tl(t0, t0);
18693                     tcg_gen_shri_tl(t0, t0, 8 * (4 - rd));
18694                     tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
18695                 }
18696                 tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
18697             }
18698             break;
18699         case NM_MADD:
18700             check_dsp(ctx);
18701             {
18702                 int acc = extract32(ctx->opcode, 14, 2);
18703                 TCGv_i64 t2 = tcg_temp_new_i64();
18704                 TCGv_i64 t3 = tcg_temp_new_i64();
18705
18706                 gen_load_gpr(t0, rt);
18707                 gen_load_gpr(t1, rs);
18708                 tcg_gen_ext_tl_i64(t2, t0);
18709                 tcg_gen_ext_tl_i64(t3, t1);
18710                 tcg_gen_mul_i64(t2, t2, t3);
18711                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
18712                 tcg_gen_add_i64(t2, t2, t3);
18713                 tcg_temp_free_i64(t3);
18714                 gen_move_low32(cpu_LO[acc], t2);
18715                 gen_move_high32(cpu_HI[acc], t2);
18716                 tcg_temp_free_i64(t2);
18717             }
18718             break;
18719         case NM_MULT:
18720             check_dsp(ctx);
18721             {
18722                 int acc = extract32(ctx->opcode, 14, 2);
18723                 TCGv_i32 t2 = tcg_temp_new_i32();
18724                 TCGv_i32 t3 = tcg_temp_new_i32();
18725
18726                 gen_load_gpr(t0, rs);
18727                 gen_load_gpr(t1, rt);
18728                 tcg_gen_trunc_tl_i32(t2, t0);
18729                 tcg_gen_trunc_tl_i32(t3, t1);
18730                 tcg_gen_muls2_i32(t2, t3, t2, t3);
18731                 tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
18732                 tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
18733                 tcg_temp_free_i32(t2);
18734                 tcg_temp_free_i32(t3);
18735             }
18736             break;
18737         case NM_EXTRV_W:
18738             check_dsp(ctx);
18739             gen_load_gpr(v1_t, rs);
18740             tcg_gen_movi_tl(t0, rd >> 3);
18741             gen_helper_extr_w(t0, t0, v1_t, cpu_env);
18742             gen_store_gpr(t0, ret);
18743             break;
18744         }
18745         break;
18746     case NM_POOL32AXF_2_8_15:
18747         switch (extract32(ctx->opcode, 9, 3)) {
18748         case NM_DPAX_W_PH:
18749         case NM_DPAQ_SA_L_W:
18750         case NM_DPSX_W_PH:
18751         case NM_DPSQ_SA_L_W:
18752             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
18753             break;
18754         case NM_MADDU:
18755             check_dsp(ctx);
18756             {
18757                 int acc = extract32(ctx->opcode, 14, 2);
18758                 TCGv_i64 t2 = tcg_temp_new_i64();
18759                 TCGv_i64 t3 = tcg_temp_new_i64();
18760
18761                 gen_load_gpr(t0, rs);
18762                 gen_load_gpr(t1, rt);
18763                 tcg_gen_ext32u_tl(t0, t0);
18764                 tcg_gen_ext32u_tl(t1, t1);
18765                 tcg_gen_extu_tl_i64(t2, t0);
18766                 tcg_gen_extu_tl_i64(t3, t1);
18767                 tcg_gen_mul_i64(t2, t2, t3);
18768                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
18769                 tcg_gen_add_i64(t2, t2, t3);
18770                 tcg_temp_free_i64(t3);
18771                 gen_move_low32(cpu_LO[acc], t2);
18772                 gen_move_high32(cpu_HI[acc], t2);
18773                 tcg_temp_free_i64(t2);
18774             }
18775             break;
18776         case NM_MULTU:
18777             check_dsp(ctx);
18778             {
18779                 int acc = extract32(ctx->opcode, 14, 2);
18780                 TCGv_i32 t2 = tcg_temp_new_i32();
18781                 TCGv_i32 t3 = tcg_temp_new_i32();
18782
18783                 gen_load_gpr(t0, rs);
18784                 gen_load_gpr(t1, rt);
18785                 tcg_gen_trunc_tl_i32(t2, t0);
18786                 tcg_gen_trunc_tl_i32(t3, t1);
18787                 tcg_gen_mulu2_i32(t2, t3, t2, t3);
18788                 tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
18789                 tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
18790                 tcg_temp_free_i32(t2);
18791                 tcg_temp_free_i32(t3);
18792             }
18793             break;
18794         case NM_EXTRV_R_W:
18795             check_dsp(ctx);
18796             tcg_gen_movi_tl(t0, rd >> 3);
18797             gen_helper_extr_r_w(t0, t0, v1_t, cpu_env);
18798             gen_store_gpr(t0, ret);
18799             break;
18800         default:
18801             generate_exception_end(ctx, EXCP_RI);
18802             break;
18803         }
18804         break;
18805     case NM_POOL32AXF_2_16_23:
18806         switch (extract32(ctx->opcode, 9, 3)) {
18807         case NM_DPAU_H_QBL:
18808         case NM_DPAQX_S_W_PH:
18809         case NM_DPSU_H_QBL:
18810         case NM_DPSQX_S_W_PH:
18811         case NM_MULSA_W_PH:
18812             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
18813             break;
18814         case NM_EXTPV:
18815             check_dsp(ctx);
18816             tcg_gen_movi_tl(t0, rd >> 3);
18817             gen_helper_extp(t0, t0, v1_t, cpu_env);
18818             gen_store_gpr(t0, ret);
18819             break;
18820         case NM_MSUB:
18821             check_dsp(ctx);
18822             {
18823                 int acc = extract32(ctx->opcode, 14, 2);
18824                 TCGv_i64 t2 = tcg_temp_new_i64();
18825                 TCGv_i64 t3 = tcg_temp_new_i64();
18826
18827                 gen_load_gpr(t0, rs);
18828                 gen_load_gpr(t1, rt);
18829                 tcg_gen_ext_tl_i64(t2, t0);
18830                 tcg_gen_ext_tl_i64(t3, t1);
18831                 tcg_gen_mul_i64(t2, t2, t3);
18832                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
18833                 tcg_gen_sub_i64(t2, t3, t2);
18834                 tcg_temp_free_i64(t3);
18835                 gen_move_low32(cpu_LO[acc], t2);
18836                 gen_move_high32(cpu_HI[acc], t2);
18837                 tcg_temp_free_i64(t2);
18838             }
18839             break;
18840         case NM_EXTRV_RS_W:
18841             check_dsp(ctx);
18842             tcg_gen_movi_tl(t0, rd >> 3);
18843             gen_helper_extr_rs_w(t0, t0, v1_t, cpu_env);
18844             gen_store_gpr(t0, ret);
18845             break;
18846         }
18847         break;
18848     case NM_POOL32AXF_2_24_31:
18849         switch (extract32(ctx->opcode, 9, 3)) {
18850         case NM_DPAU_H_QBR:
18851         case NM_DPAQX_SA_W_PH:
18852         case NM_DPSU_H_QBR:
18853         case NM_DPSQX_SA_W_PH:
18854         case NM_MULSAQ_S_W_PH:
18855             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
18856             break;
18857         case NM_EXTPDPV:
18858             check_dsp(ctx);
18859             tcg_gen_movi_tl(t0, rd >> 3);
18860             gen_helper_extpdp(t0, t0, v1_t, cpu_env);
18861             gen_store_gpr(t0, ret);
18862             break;
18863         case NM_MSUBU:
18864             check_dsp(ctx);
18865             {
18866                 int acc = extract32(ctx->opcode, 14, 2);
18867                 TCGv_i64 t2 = tcg_temp_new_i64();
18868                 TCGv_i64 t3 = tcg_temp_new_i64();
18869
18870                 gen_load_gpr(t0, rs);
18871                 gen_load_gpr(t1, rt);
18872                 tcg_gen_ext32u_tl(t0, t0);
18873                 tcg_gen_ext32u_tl(t1, t1);
18874                 tcg_gen_extu_tl_i64(t2, t0);
18875                 tcg_gen_extu_tl_i64(t3, t1);
18876                 tcg_gen_mul_i64(t2, t2, t3);
18877                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
18878                 tcg_gen_sub_i64(t2, t3, t2);
18879                 tcg_temp_free_i64(t3);
18880                 gen_move_low32(cpu_LO[acc], t2);
18881                 gen_move_high32(cpu_HI[acc], t2);
18882                 tcg_temp_free_i64(t2);
18883             }
18884             break;
18885         case NM_EXTRV_S_H:
18886             check_dsp(ctx);
18887             tcg_gen_movi_tl(t0, rd >> 3);
18888             gen_helper_extr_s_h(t0, t0, v0_t, cpu_env);
18889             gen_store_gpr(t0, ret);
18890             break;
18891         }
18892         break;
18893     default:
18894         generate_exception_end(ctx, EXCP_RI);
18895         break;
18896     }
18897
18898     tcg_temp_free(t0);
18899     tcg_temp_free(t1);
18900
18901     tcg_temp_free(v0_t);
18902     tcg_temp_free(v1_t);
18903 }
18904
18905 static void gen_pool32axf_4_nanomips_insn(DisasContext *ctx, uint32_t opc,
18906                                           int rt, int rs)
18907 {
18908     int ret = rt;
18909     TCGv t0 = tcg_temp_new();
18910     TCGv v0_t = tcg_temp_new();
18911
18912     gen_load_gpr(v0_t, rs);
18913
18914     switch (opc) {
18915     case NM_ABSQ_S_QB:
18916         check_dsp_r2(ctx);
18917         gen_helper_absq_s_qb(v0_t, v0_t, cpu_env);
18918         gen_store_gpr(v0_t, ret);
18919         break;
18920     case NM_ABSQ_S_PH:
18921         check_dsp(ctx);
18922         gen_helper_absq_s_ph(v0_t, v0_t, cpu_env);
18923         gen_store_gpr(v0_t, ret);
18924         break;
18925     case NM_ABSQ_S_W:
18926         check_dsp(ctx);
18927         gen_helper_absq_s_w(v0_t, v0_t, cpu_env);
18928         gen_store_gpr(v0_t, ret);
18929         break;
18930     case NM_PRECEQ_W_PHL:
18931         check_dsp(ctx);
18932         tcg_gen_andi_tl(v0_t, v0_t, 0xFFFF0000);
18933         tcg_gen_ext32s_tl(v0_t, v0_t);
18934         gen_store_gpr(v0_t, ret);
18935         break;
18936     case NM_PRECEQ_W_PHR:
18937         check_dsp(ctx);
18938         tcg_gen_andi_tl(v0_t, v0_t, 0x0000FFFF);
18939         tcg_gen_shli_tl(v0_t, v0_t, 16);
18940         tcg_gen_ext32s_tl(v0_t, v0_t);
18941         gen_store_gpr(v0_t, ret);
18942         break;
18943     case NM_PRECEQU_PH_QBL:
18944         check_dsp(ctx);
18945         gen_helper_precequ_ph_qbl(v0_t, v0_t);
18946         gen_store_gpr(v0_t, ret);
18947         break;
18948     case NM_PRECEQU_PH_QBR:
18949         check_dsp(ctx);
18950         gen_helper_precequ_ph_qbr(v0_t, v0_t);
18951         gen_store_gpr(v0_t, ret);
18952         break;
18953     case NM_PRECEQU_PH_QBLA:
18954         check_dsp(ctx);
18955         gen_helper_precequ_ph_qbla(v0_t, v0_t);
18956         gen_store_gpr(v0_t, ret);
18957         break;
18958     case NM_PRECEQU_PH_QBRA:
18959         check_dsp(ctx);
18960         gen_helper_precequ_ph_qbra(v0_t, v0_t);
18961         gen_store_gpr(v0_t, ret);
18962         break;
18963     case NM_PRECEU_PH_QBL:
18964         check_dsp(ctx);
18965         gen_helper_preceu_ph_qbl(v0_t, v0_t);
18966         gen_store_gpr(v0_t, ret);
18967         break;
18968     case NM_PRECEU_PH_QBR:
18969         check_dsp(ctx);
18970         gen_helper_preceu_ph_qbr(v0_t, v0_t);
18971         gen_store_gpr(v0_t, ret);
18972         break;
18973     case NM_PRECEU_PH_QBLA:
18974         check_dsp(ctx);
18975         gen_helper_preceu_ph_qbla(v0_t, v0_t);
18976         gen_store_gpr(v0_t, ret);
18977         break;
18978     case NM_PRECEU_PH_QBRA:
18979         check_dsp(ctx);
18980         gen_helper_preceu_ph_qbra(v0_t, v0_t);
18981         gen_store_gpr(v0_t, ret);
18982         break;
18983     case NM_REPLV_PH:
18984         check_dsp(ctx);
18985         tcg_gen_ext16u_tl(v0_t, v0_t);
18986         tcg_gen_shli_tl(t0, v0_t, 16);
18987         tcg_gen_or_tl(v0_t, v0_t, t0);
18988         tcg_gen_ext32s_tl(v0_t, v0_t);
18989         gen_store_gpr(v0_t, ret);
18990         break;
18991     case NM_REPLV_QB:
18992         check_dsp(ctx);
18993         tcg_gen_ext8u_tl(v0_t, v0_t);
18994         tcg_gen_shli_tl(t0, v0_t, 8);
18995         tcg_gen_or_tl(v0_t, v0_t, t0);
18996         tcg_gen_shli_tl(t0, v0_t, 16);
18997         tcg_gen_or_tl(v0_t, v0_t, t0);
18998         tcg_gen_ext32s_tl(v0_t, v0_t);
18999         gen_store_gpr(v0_t, ret);
19000         break;
19001     case NM_BITREV:
19002         check_dsp(ctx);
19003         gen_helper_bitrev(v0_t, v0_t);
19004         gen_store_gpr(v0_t, ret);
19005         break;
19006     case NM_INSV:
19007         check_dsp(ctx);
19008         {
19009             TCGv tv0 = tcg_temp_new();
19010
19011             gen_load_gpr(tv0, rt);
19012             gen_helper_insv(v0_t, cpu_env, v0_t, tv0);
19013             gen_store_gpr(v0_t, ret);
19014             tcg_temp_free(tv0);
19015         }
19016         break;
19017     case NM_RADDU_W_QB:
19018         check_dsp(ctx);
19019         gen_helper_raddu_w_qb(v0_t, v0_t);
19020         gen_store_gpr(v0_t, ret);
19021         break;
19022     case NM_BITSWAP:
19023         gen_bitswap(ctx, OPC_BITSWAP, ret, rs);
19024         break;
19025     case NM_CLO:
19026         check_nms(ctx);
19027         gen_cl(ctx, OPC_CLO, ret, rs);
19028         break;
19029     case NM_CLZ:
19030         check_nms(ctx);
19031         gen_cl(ctx, OPC_CLZ, ret, rs);
19032         break;
19033     case NM_WSBH:
19034         gen_bshfl(ctx, OPC_WSBH, ret, rs);
19035         break;
19036     default:
19037         generate_exception_end(ctx, EXCP_RI);
19038         break;
19039     }
19040
19041     tcg_temp_free(v0_t);
19042     tcg_temp_free(t0);
19043 }
19044
19045 static void gen_pool32axf_7_nanomips_insn(DisasContext *ctx, uint32_t opc,
19046                                           int rt, int rs, int rd)
19047 {
19048     TCGv t0 = tcg_temp_new();
19049     TCGv rs_t = tcg_temp_new();
19050
19051     gen_load_gpr(rs_t, rs);
19052
19053     switch (opc) {
19054     case NM_SHRA_R_QB:
19055         check_dsp_r2(ctx);
19056         tcg_gen_movi_tl(t0, rd >> 2);
19057         switch (extract32(ctx->opcode, 12, 1)) {
19058         case 0:
19059             /* NM_SHRA_QB */
19060             gen_helper_shra_qb(t0, t0, rs_t);
19061             gen_store_gpr(t0, rt);
19062             break;
19063         case 1:
19064             /* NM_SHRA_R_QB */
19065             gen_helper_shra_r_qb(t0, t0, rs_t);
19066             gen_store_gpr(t0, rt);
19067             break;
19068         }
19069         break;
19070     case NM_SHRL_PH:
19071         check_dsp_r2(ctx);
19072         tcg_gen_movi_tl(t0, rd >> 1);
19073         gen_helper_shrl_ph(t0, t0, rs_t);
19074         gen_store_gpr(t0, rt);
19075         break;
19076     case NM_REPL_QB:
19077         check_dsp(ctx);
19078         {
19079             int16_t imm;
19080             target_long result;
19081             imm = extract32(ctx->opcode, 13, 8);
19082             result = (uint32_t)imm << 24 |
19083                      (uint32_t)imm << 16 |
19084                      (uint32_t)imm << 8  |
19085                      (uint32_t)imm;
19086             result = (int32_t)result;
19087             tcg_gen_movi_tl(t0, result);
19088             gen_store_gpr(t0, rt);
19089         }
19090         break;
19091     default:
19092         generate_exception_end(ctx, EXCP_RI);
19093         break;
19094     }
19095     tcg_temp_free(t0);
19096     tcg_temp_free(rs_t);
19097 }
19098
19099
19100 static void gen_pool32axf_nanomips_insn(CPUMIPSState *env, DisasContext *ctx)
19101 {
19102     int rt = extract32(ctx->opcode, 21, 5);
19103     int rs = extract32(ctx->opcode, 16, 5);
19104     int rd = extract32(ctx->opcode, 11, 5);
19105
19106     switch (extract32(ctx->opcode, 6, 3)) {
19107     case NM_POOL32AXF_1:
19108         {
19109             int32_t op1 = extract32(ctx->opcode, 9, 3);
19110             gen_pool32axf_1_nanomips_insn(ctx, op1, rt, rs, rd);
19111         }
19112         break;
19113     case NM_POOL32AXF_2:
19114         {
19115             int32_t op1 = extract32(ctx->opcode, 12, 2);
19116             gen_pool32axf_2_nanomips_insn(ctx, op1, rt, rs, rd);
19117         }
19118         break;
19119     case NM_POOL32AXF_4:
19120         {
19121             int32_t op1 = extract32(ctx->opcode, 9, 7);
19122             gen_pool32axf_4_nanomips_insn(ctx, op1, rt, rs);
19123         }
19124         break;
19125     case NM_POOL32AXF_5:
19126         switch (extract32(ctx->opcode, 9, 7)) {
19127 #ifndef CONFIG_USER_ONLY
19128         case NM_TLBP:
19129             gen_cp0(env, ctx, OPC_TLBP, 0, 0);
19130             break;
19131         case NM_TLBR:
19132             gen_cp0(env, ctx, OPC_TLBR, 0, 0);
19133             break;
19134         case NM_TLBWI:
19135             gen_cp0(env, ctx, OPC_TLBWI, 0, 0);
19136             break;
19137         case NM_TLBWR:
19138             gen_cp0(env, ctx, OPC_TLBWR, 0, 0);
19139             break;
19140         case NM_TLBINV:
19141             gen_cp0(env, ctx, OPC_TLBINV, 0, 0);
19142             break;
19143         case NM_TLBINVF:
19144             gen_cp0(env, ctx, OPC_TLBINVF, 0, 0);
19145             break;
19146         case NM_DI:
19147             check_cp0_enabled(ctx);
19148             {
19149                 TCGv t0 = tcg_temp_new();
19150
19151                 save_cpu_state(ctx, 1);
19152                 gen_helper_di(t0, cpu_env);
19153                 gen_store_gpr(t0, rt);
19154             /* Stop translation as we may have switched the execution mode */
19155                 ctx->base.is_jmp = DISAS_STOP;
19156                 tcg_temp_free(t0);
19157             }
19158             break;
19159         case NM_EI:
19160             check_cp0_enabled(ctx);
19161             {
19162                 TCGv t0 = tcg_temp_new();
19163
19164                 save_cpu_state(ctx, 1);
19165                 gen_helper_ei(t0, cpu_env);
19166                 gen_store_gpr(t0, rt);
19167             /* Stop translation as we may have switched the execution mode */
19168                 ctx->base.is_jmp = DISAS_STOP;
19169                 tcg_temp_free(t0);
19170             }
19171             break;
19172         case NM_RDPGPR:
19173             gen_load_srsgpr(rs, rt);
19174             break;
19175         case NM_WRPGPR:
19176             gen_store_srsgpr(rs, rt);
19177             break;
19178         case NM_WAIT:
19179             gen_cp0(env, ctx, OPC_WAIT, 0, 0);
19180             break;
19181         case NM_DERET:
19182             gen_cp0(env, ctx, OPC_DERET, 0, 0);
19183             break;
19184         case NM_ERETX:
19185             gen_cp0(env, ctx, OPC_ERET, 0, 0);
19186             break;
19187 #endif
19188         default:
19189             generate_exception_end(ctx, EXCP_RI);
19190             break;
19191         }
19192         break;
19193     case NM_POOL32AXF_7:
19194         {
19195             int32_t op1 = extract32(ctx->opcode, 9, 3);
19196             gen_pool32axf_7_nanomips_insn(ctx, op1, rt, rs, rd);
19197         }
19198         break;
19199     default:
19200         generate_exception_end(ctx, EXCP_RI);
19201         break;
19202     }
19203 }
19204
19205 /* Immediate Value Compact Branches */
19206 static void gen_compute_imm_branch(DisasContext *ctx, uint32_t opc,
19207                                    int rt, int32_t imm, int32_t offset)
19208 {
19209     TCGCond cond;
19210     int bcond_compute = 0;
19211     TCGv t0 = tcg_temp_new();
19212     TCGv t1 = tcg_temp_new();
19213
19214     gen_load_gpr(t0, rt);
19215     tcg_gen_movi_tl(t1, imm);
19216     ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19217
19218     /* Load needed operands and calculate btarget */
19219     switch (opc) {
19220     case NM_BEQIC:
19221         if (rt == 0 && imm == 0) {
19222             /* Unconditional branch */
19223         } else if (rt == 0 && imm != 0) {
19224             /* Treat as NOP */
19225             goto out;
19226         } else {
19227             bcond_compute = 1;
19228             cond = TCG_COND_EQ;
19229         }
19230         break;
19231     case NM_BBEQZC:
19232     case NM_BBNEZC:
19233         check_nms(ctx);
19234         if (imm >= 32 && !(ctx->hflags & MIPS_HFLAG_64)) {
19235             generate_exception_end(ctx, EXCP_RI);
19236             goto out;
19237         } else if (rt == 0 && opc == NM_BBEQZC) {
19238             /* Unconditional branch */
19239         } else if (rt == 0 && opc == NM_BBNEZC) {
19240             /* Treat as NOP */
19241             goto out;
19242         } else {
19243             tcg_gen_shri_tl(t0, t0, imm);
19244             tcg_gen_andi_tl(t0, t0, 1);
19245             tcg_gen_movi_tl(t1, 0);
19246             bcond_compute = 1;
19247             if (opc == NM_BBEQZC) {
19248                 cond = TCG_COND_EQ;
19249             } else {
19250                 cond = TCG_COND_NE;
19251             }
19252         }
19253         break;
19254     case NM_BNEIC:
19255         if (rt == 0 && imm == 0) {
19256             /* Treat as NOP */
19257             goto out;
19258         } else if (rt == 0 && imm != 0) {
19259             /* Unconditional branch */
19260         } else {
19261             bcond_compute = 1;
19262             cond = TCG_COND_NE;
19263         }
19264         break;
19265     case NM_BGEIC:
19266         if (rt == 0 && imm == 0) {
19267             /* Unconditional branch */
19268         } else  {
19269             bcond_compute = 1;
19270             cond = TCG_COND_GE;
19271         }
19272         break;
19273     case NM_BLTIC:
19274         bcond_compute = 1;
19275         cond = TCG_COND_LT;
19276         break;
19277     case NM_BGEIUC:
19278         if (rt == 0 && imm == 0) {
19279             /* Unconditional branch */
19280         } else  {
19281             bcond_compute = 1;
19282             cond = TCG_COND_GEU;
19283         }
19284         break;
19285     case NM_BLTIUC:
19286         bcond_compute = 1;
19287         cond = TCG_COND_LTU;
19288         break;
19289     default:
19290         MIPS_INVAL("Immediate Value Compact branch");
19291         generate_exception_end(ctx, EXCP_RI);
19292         goto out;
19293     }
19294
19295     if (bcond_compute == 0) {
19296         /* Uncoditional compact branch */
19297         gen_goto_tb(ctx, 0, ctx->btarget);
19298     } else {
19299         /* Conditional compact branch */
19300         TCGLabel *fs = gen_new_label();
19301
19302         tcg_gen_brcond_tl(tcg_invert_cond(cond), t0, t1, fs);
19303
19304         gen_goto_tb(ctx, 1, ctx->btarget);
19305         gen_set_label(fs);
19306
19307         gen_goto_tb(ctx, 0, ctx->base.pc_next + 4);
19308     }
19309
19310 out:
19311     tcg_temp_free(t0);
19312     tcg_temp_free(t1);
19313 }
19314
19315 /* P.BALRSC type nanoMIPS R6 branches: BALRSC and BRSC */
19316 static void gen_compute_nanomips_pbalrsc_branch(DisasContext *ctx, int rs,
19317                                                 int rt)
19318 {
19319     TCGv t0 = tcg_temp_new();
19320     TCGv t1 = tcg_temp_new();
19321
19322     /* load rs */
19323     gen_load_gpr(t0, rs);
19324
19325     /* link */
19326     if (rt != 0) {
19327         tcg_gen_movi_tl(cpu_gpr[rt], ctx->base.pc_next + 4);
19328     }
19329
19330     /* calculate btarget */
19331     tcg_gen_shli_tl(t0, t0, 1);
19332     tcg_gen_movi_tl(t1, ctx->base.pc_next + 4);
19333     gen_op_addr_add(ctx, btarget, t1, t0);
19334
19335     /* unconditional branch to register */
19336     tcg_gen_mov_tl(cpu_PC, btarget);
19337     tcg_gen_lookup_and_goto_ptr();
19338
19339     tcg_temp_free(t0);
19340     tcg_temp_free(t1);
19341 }
19342
19343 /* nanoMIPS Branches */
19344 static void gen_compute_compact_branch_nm(DisasContext *ctx, uint32_t opc,
19345                                        int rs, int rt, int32_t offset)
19346 {
19347     int bcond_compute = 0;
19348     TCGv t0 = tcg_temp_new();
19349     TCGv t1 = tcg_temp_new();
19350
19351     /* Load needed operands and calculate btarget */
19352     switch (opc) {
19353     /* compact branch */
19354     case OPC_BGEC:
19355     case OPC_BLTC:
19356         gen_load_gpr(t0, rs);
19357         gen_load_gpr(t1, rt);
19358         bcond_compute = 1;
19359         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19360         break;
19361     case OPC_BGEUC:
19362     case OPC_BLTUC:
19363         if (rs == 0 || rs == rt) {
19364             /* OPC_BLEZALC, OPC_BGEZALC */
19365             /* OPC_BGTZALC, OPC_BLTZALC */
19366             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4);
19367         }
19368         gen_load_gpr(t0, rs);
19369         gen_load_gpr(t1, rt);
19370         bcond_compute = 1;
19371         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19372         break;
19373     case OPC_BC:
19374         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19375         break;
19376     case OPC_BEQZC:
19377         if (rs != 0) {
19378             /* OPC_BEQZC, OPC_BNEZC */
19379             gen_load_gpr(t0, rs);
19380             bcond_compute = 1;
19381             ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19382         } else {
19383             /* OPC_JIC, OPC_JIALC */
19384             TCGv tbase = tcg_temp_new();
19385             TCGv toffset = tcg_temp_new();
19386
19387             gen_load_gpr(tbase, rt);
19388             tcg_gen_movi_tl(toffset, offset);
19389             gen_op_addr_add(ctx, btarget, tbase, toffset);
19390             tcg_temp_free(tbase);
19391             tcg_temp_free(toffset);
19392         }
19393         break;
19394     default:
19395         MIPS_INVAL("Compact branch/jump");
19396         generate_exception_end(ctx, EXCP_RI);
19397         goto out;
19398     }
19399
19400     if (bcond_compute == 0) {
19401         /* Uncoditional compact branch */
19402         switch (opc) {
19403         case OPC_BC:
19404             gen_goto_tb(ctx, 0, ctx->btarget);
19405             break;
19406         default:
19407             MIPS_INVAL("Compact branch/jump");
19408             generate_exception_end(ctx, EXCP_RI);
19409             goto out;
19410         }
19411     } else {
19412         /* Conditional compact branch */
19413         TCGLabel *fs = gen_new_label();
19414
19415         switch (opc) {
19416         case OPC_BGEUC:
19417             if (rs == 0 && rt != 0) {
19418                 /* OPC_BLEZALC */
19419                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
19420             } else if (rs != 0 && rt != 0 && rs == rt) {
19421                 /* OPC_BGEZALC */
19422                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
19423             } else {
19424                 /* OPC_BGEUC */
19425                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GEU), t0, t1, fs);
19426             }
19427             break;
19428         case OPC_BLTUC:
19429             if (rs == 0 && rt != 0) {
19430                 /* OPC_BGTZALC */
19431                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
19432             } else if (rs != 0 && rt != 0 && rs == rt) {
19433                 /* OPC_BLTZALC */
19434                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
19435             } else {
19436                 /* OPC_BLTUC */
19437                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LTU), t0, t1, fs);
19438             }
19439             break;
19440         case OPC_BGEC:
19441             if (rs == 0 && rt != 0) {
19442                 /* OPC_BLEZC */
19443                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
19444             } else if (rs != 0 && rt != 0 && rs == rt) {
19445                 /* OPC_BGEZC */
19446                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
19447             } else {
19448                 /* OPC_BGEC */
19449                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GE), t0, t1, fs);
19450             }
19451             break;
19452         case OPC_BLTC:
19453             if (rs == 0 && rt != 0) {
19454                 /* OPC_BGTZC */
19455                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
19456             } else if (rs != 0 && rt != 0 && rs == rt) {
19457                 /* OPC_BLTZC */
19458                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
19459             } else {
19460                 /* OPC_BLTC */
19461                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LT), t0, t1, fs);
19462             }
19463             break;
19464         case OPC_BEQZC:
19465             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t0, 0, fs);
19466             break;
19467         default:
19468             MIPS_INVAL("Compact conditional branch/jump");
19469             generate_exception_end(ctx, EXCP_RI);
19470             goto out;
19471         }
19472
19473         /* Generating branch here as compact branches don't have delay slot */
19474         gen_goto_tb(ctx, 1, ctx->btarget);
19475         gen_set_label(fs);
19476
19477         gen_goto_tb(ctx, 0, ctx->base.pc_next + 4);
19478     }
19479
19480 out:
19481     tcg_temp_free(t0);
19482     tcg_temp_free(t1);
19483 }
19484
19485
19486 /* nanoMIPS CP1 Branches */
19487 static void gen_compute_branch_cp1_nm(DisasContext *ctx, uint32_t op,
19488                                    int32_t ft, int32_t offset)
19489 {
19490     target_ulong btarget;
19491     TCGv_i64 t0 = tcg_temp_new_i64();
19492
19493     gen_load_fpr64(ctx, t0, ft);
19494     tcg_gen_andi_i64(t0, t0, 1);
19495
19496     btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19497
19498     switch (op) {
19499     case NM_BC1EQZC:
19500         tcg_gen_xori_i64(t0, t0, 1);
19501         ctx->hflags |= MIPS_HFLAG_BC;
19502         break;
19503     case NM_BC1NEZC:
19504         /* t0 already set */
19505         ctx->hflags |= MIPS_HFLAG_BC;
19506         break;
19507     default:
19508         MIPS_INVAL("cp1 cond branch");
19509         generate_exception_end(ctx, EXCP_RI);
19510         goto out;
19511     }
19512
19513     tcg_gen_trunc_i64_tl(bcond, t0);
19514
19515     ctx->btarget = btarget;
19516
19517 out:
19518     tcg_temp_free_i64(t0);
19519 }
19520
19521
19522 static void gen_p_lsx(DisasContext *ctx, int rd, int rs, int rt)
19523 {
19524     TCGv t0, t1;
19525     t0 = tcg_temp_new();
19526     t1 = tcg_temp_new();
19527
19528     gen_load_gpr(t0, rs);
19529     gen_load_gpr(t1, rt);
19530
19531     if ((extract32(ctx->opcode, 6, 1)) == 1) {
19532         /* PP.LSXS instructions require shifting */
19533         switch (extract32(ctx->opcode, 7, 4)) {
19534         case NM_SHXS:
19535             check_nms(ctx);
19536         case NM_LHXS:
19537         case NM_LHUXS:
19538             tcg_gen_shli_tl(t0, t0, 1);
19539             break;
19540         case NM_SWXS:
19541             check_nms(ctx);
19542         case NM_LWXS:
19543         case NM_LWC1XS:
19544         case NM_SWC1XS:
19545             tcg_gen_shli_tl(t0, t0, 2);
19546             break;
19547         case NM_LDC1XS:
19548         case NM_SDC1XS:
19549             tcg_gen_shli_tl(t0, t0, 3);
19550             break;
19551         }
19552     }
19553     gen_op_addr_add(ctx, t0, t0, t1);
19554
19555     switch (extract32(ctx->opcode, 7, 4)) {
19556     case NM_LBX:
19557         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19558                            MO_SB);
19559         gen_store_gpr(t0, rd);
19560         break;
19561     case NM_LHX:
19562     /*case NM_LHXS:*/
19563         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19564                            MO_TESW);
19565         gen_store_gpr(t0, rd);
19566         break;
19567     case NM_LWX:
19568     /*case NM_LWXS:*/
19569         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19570                            MO_TESL);
19571         gen_store_gpr(t0, rd);
19572         break;
19573     case NM_LBUX:
19574         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19575                            MO_UB);
19576         gen_store_gpr(t0, rd);
19577         break;
19578     case NM_LHUX:
19579     /*case NM_LHUXS:*/
19580         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19581                            MO_TEUW);
19582         gen_store_gpr(t0, rd);
19583         break;
19584     case NM_SBX:
19585         check_nms(ctx);
19586         gen_load_gpr(t1, rd);
19587         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx,
19588                            MO_8);
19589         break;
19590     case NM_SHX:
19591     /*case NM_SHXS:*/
19592         check_nms(ctx);
19593         gen_load_gpr(t1, rd);
19594         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx,
19595                            MO_TEUW);
19596         break;
19597     case NM_SWX:
19598     /*case NM_SWXS:*/
19599         check_nms(ctx);
19600         gen_load_gpr(t1, rd);
19601         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx,
19602                            MO_TEUL);
19603         break;
19604     case NM_LWC1X:
19605     /*case NM_LWC1XS:*/
19606     case NM_LDC1X:
19607     /*case NM_LDC1XS:*/
19608     case NM_SWC1X:
19609     /*case NM_SWC1XS:*/
19610     case NM_SDC1X:
19611     /*case NM_SDC1XS:*/
19612         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
19613             check_cp1_enabled(ctx);
19614             switch (extract32(ctx->opcode, 7, 4)) {
19615             case NM_LWC1X:
19616             /*case NM_LWC1XS:*/
19617                 gen_flt_ldst(ctx, OPC_LWC1, rd, t0);
19618                 break;
19619             case NM_LDC1X:
19620             /*case NM_LDC1XS:*/
19621                 gen_flt_ldst(ctx, OPC_LDC1, rd, t0);
19622                 break;
19623             case NM_SWC1X:
19624             /*case NM_SWC1XS:*/
19625                 gen_flt_ldst(ctx, OPC_SWC1, rd, t0);
19626                 break;
19627             case NM_SDC1X:
19628             /*case NM_SDC1XS:*/
19629                 gen_flt_ldst(ctx, OPC_SDC1, rd, t0);
19630                 break;
19631             }
19632         } else {
19633             generate_exception_err(ctx, EXCP_CpU, 1);
19634         }
19635         break;
19636     default:
19637         generate_exception_end(ctx, EXCP_RI);
19638         break;
19639     }
19640
19641     tcg_temp_free(t0);
19642     tcg_temp_free(t1);
19643 }
19644
19645 static void gen_pool32f_nanomips_insn(DisasContext *ctx)
19646 {
19647     int rt, rs, rd;
19648
19649     rt = extract32(ctx->opcode, 21, 5);
19650     rs = extract32(ctx->opcode, 16, 5);
19651     rd = extract32(ctx->opcode, 11, 5);
19652
19653     if (!(ctx->CP0_Config1 & (1 << CP0C1_FP))) {
19654         generate_exception_end(ctx, EXCP_RI);
19655         return;
19656     }
19657     check_cp1_enabled(ctx);
19658     switch (extract32(ctx->opcode, 0, 3)) {
19659     case NM_POOL32F_0:
19660         switch (extract32(ctx->opcode, 3, 7)) {
19661         case NM_RINT_S:
19662             gen_farith(ctx, OPC_RINT_S, 0, rt, rs, 0);
19663             break;
19664         case NM_RINT_D:
19665             gen_farith(ctx, OPC_RINT_D, 0, rt, rs, 0);
19666             break;
19667         case NM_CLASS_S:
19668             gen_farith(ctx, OPC_CLASS_S, 0, rt, rs, 0);
19669             break;
19670         case NM_CLASS_D:
19671             gen_farith(ctx, OPC_CLASS_D, 0, rt, rs, 0);
19672             break;
19673         case NM_ADD_S:
19674             gen_farith(ctx, OPC_ADD_S, rt, rs, rd, 0);
19675             break;
19676         case NM_ADD_D:
19677             gen_farith(ctx, OPC_ADD_D, rt, rs, rd, 0);
19678             break;
19679         case NM_SUB_S:
19680             gen_farith(ctx, OPC_SUB_S, rt, rs, rd, 0);
19681             break;
19682         case NM_SUB_D:
19683             gen_farith(ctx, OPC_SUB_D, rt, rs, rd, 0);
19684             break;
19685         case NM_MUL_S:
19686             gen_farith(ctx, OPC_MUL_S, rt, rs, rd, 0);
19687             break;
19688         case NM_MUL_D:
19689             gen_farith(ctx, OPC_MUL_D, rt, rs, rd, 0);
19690             break;
19691         case NM_DIV_S:
19692             gen_farith(ctx, OPC_DIV_S, rt, rs, rd, 0);
19693             break;
19694         case NM_DIV_D:
19695             gen_farith(ctx, OPC_DIV_D, rt, rs, rd, 0);
19696             break;
19697         case NM_SELEQZ_S:
19698             gen_sel_s(ctx, OPC_SELEQZ_S, rd, rt, rs);
19699             break;
19700         case NM_SELEQZ_D:
19701             gen_sel_d(ctx, OPC_SELEQZ_D, rd, rt, rs);
19702             break;
19703         case NM_SELNEZ_S:
19704             gen_sel_s(ctx, OPC_SELNEZ_S, rd, rt, rs);
19705             break;
19706         case NM_SELNEZ_D:
19707             gen_sel_d(ctx, OPC_SELNEZ_D, rd, rt, rs);
19708             break;
19709         case NM_SEL_S:
19710             gen_sel_s(ctx, OPC_SEL_S, rd, rt, rs);
19711             break;
19712         case NM_SEL_D:
19713             gen_sel_d(ctx, OPC_SEL_D, rd, rt, rs);
19714             break;
19715         case NM_MADDF_S:
19716             gen_farith(ctx, OPC_MADDF_S, rt, rs, rd, 0);
19717             break;
19718         case NM_MADDF_D:
19719             gen_farith(ctx, OPC_MADDF_D, rt, rs, rd, 0);
19720             break;
19721         case NM_MSUBF_S:
19722             gen_farith(ctx, OPC_MSUBF_S, rt, rs, rd, 0);
19723             break;
19724         case NM_MSUBF_D:
19725             gen_farith(ctx, OPC_MSUBF_D, rt, rs, rd, 0);
19726             break;
19727         default:
19728             generate_exception_end(ctx, EXCP_RI);
19729             break;
19730         }
19731         break;
19732     case NM_POOL32F_3:
19733         switch (extract32(ctx->opcode, 3, 3)) {
19734         case NM_MIN_FMT:
19735             switch (extract32(ctx->opcode, 9, 1)) {
19736             case FMT_SDPS_S:
19737                 gen_farith(ctx, OPC_MIN_S, rt, rs, rd, 0);
19738                 break;
19739             case FMT_SDPS_D:
19740                 gen_farith(ctx, OPC_MIN_D, rt, rs, rd, 0);
19741                 break;
19742             }
19743             break;
19744         case NM_MAX_FMT:
19745             switch (extract32(ctx->opcode, 9, 1)) {
19746             case FMT_SDPS_S:
19747                 gen_farith(ctx, OPC_MAX_S, rt, rs, rd, 0);
19748                 break;
19749             case FMT_SDPS_D:
19750                 gen_farith(ctx, OPC_MAX_D, rt, rs, rd, 0);
19751                 break;
19752             }
19753             break;
19754         case NM_MINA_FMT:
19755             switch (extract32(ctx->opcode, 9, 1)) {
19756             case FMT_SDPS_S:
19757                 gen_farith(ctx, OPC_MINA_S, rt, rs, rd, 0);
19758                 break;
19759             case FMT_SDPS_D:
19760                 gen_farith(ctx, OPC_MINA_D, rt, rs, rd, 0);
19761                 break;
19762             }
19763             break;
19764         case NM_MAXA_FMT:
19765             switch (extract32(ctx->opcode, 9, 1)) {
19766             case FMT_SDPS_S:
19767                 gen_farith(ctx, OPC_MAXA_S, rt, rs, rd, 0);
19768                 break;
19769             case FMT_SDPS_D:
19770                 gen_farith(ctx, OPC_MAXA_D, rt, rs, rd, 0);
19771                 break;
19772             }
19773             break;
19774         case NM_POOL32FXF:
19775             switch (extract32(ctx->opcode, 6, 8)) {
19776             case NM_CFC1:
19777                 gen_cp1(ctx, OPC_CFC1, rt, rs);
19778                 break;
19779             case NM_CTC1:
19780                 gen_cp1(ctx, OPC_CTC1, rt, rs);
19781                 break;
19782             case NM_MFC1:
19783                 gen_cp1(ctx, OPC_MFC1, rt, rs);
19784                 break;
19785             case NM_MTC1:
19786                 gen_cp1(ctx, OPC_MTC1, rt, rs);
19787                 break;
19788             case NM_MFHC1:
19789                 gen_cp1(ctx, OPC_MFHC1, rt, rs);
19790                 break;
19791             case NM_MTHC1:
19792                 gen_cp1(ctx, OPC_MTHC1, rt, rs);
19793                 break;
19794             case NM_CVT_S_PL:
19795                 gen_farith(ctx, OPC_CVT_S_PL, -1, rs, rt, 0);
19796                 break;
19797             case NM_CVT_S_PU:
19798                 gen_farith(ctx, OPC_CVT_S_PU, -1, rs, rt, 0);
19799                 break;
19800             default:
19801                 switch (extract32(ctx->opcode, 6, 9)) {
19802                 case NM_CVT_L_S:
19803                     gen_farith(ctx, OPC_CVT_L_S, -1, rs, rt, 0);
19804                     break;
19805                 case NM_CVT_L_D:
19806                     gen_farith(ctx, OPC_CVT_L_D, -1, rs, rt, 0);
19807                     break;
19808                 case NM_CVT_W_S:
19809                     gen_farith(ctx, OPC_CVT_W_S, -1, rs, rt, 0);
19810                     break;
19811                 case NM_CVT_W_D:
19812                     gen_farith(ctx, OPC_CVT_W_D, -1, rs, rt, 0);
19813                     break;
19814                 case NM_RSQRT_S:
19815                     gen_farith(ctx, OPC_RSQRT_S, -1, rs, rt, 0);
19816                     break;
19817                 case NM_RSQRT_D:
19818                     gen_farith(ctx, OPC_RSQRT_D, -1, rs, rt, 0);
19819                     break;
19820                 case NM_SQRT_S:
19821                     gen_farith(ctx, OPC_SQRT_S, -1, rs, rt, 0);
19822                     break;
19823                 case NM_SQRT_D:
19824                     gen_farith(ctx, OPC_SQRT_D, -1, rs, rt, 0);
19825                     break;
19826                 case NM_RECIP_S:
19827                     gen_farith(ctx, OPC_RECIP_S, -1, rs, rt, 0);
19828                     break;
19829                 case NM_RECIP_D:
19830                     gen_farith(ctx, OPC_RECIP_D, -1, rs, rt, 0);
19831                     break;
19832                 case NM_FLOOR_L_S:
19833                     gen_farith(ctx, OPC_FLOOR_L_S, -1, rs, rt, 0);
19834                     break;
19835                 case NM_FLOOR_L_D:
19836                     gen_farith(ctx, OPC_FLOOR_L_D, -1, rs, rt, 0);
19837                     break;
19838                 case NM_FLOOR_W_S:
19839                     gen_farith(ctx, OPC_FLOOR_W_S, -1, rs, rt, 0);
19840                     break;
19841                 case NM_FLOOR_W_D:
19842                     gen_farith(ctx, OPC_FLOOR_W_D, -1, rs, rt, 0);
19843                     break;
19844                 case NM_CEIL_L_S:
19845                     gen_farith(ctx, OPC_CEIL_L_S, -1, rs, rt, 0);
19846                     break;
19847                 case NM_CEIL_L_D:
19848                     gen_farith(ctx, OPC_CEIL_L_D, -1, rs, rt, 0);
19849                     break;
19850                 case NM_CEIL_W_S:
19851                     gen_farith(ctx, OPC_CEIL_W_S, -1, rs, rt, 0);
19852                     break;
19853                 case NM_CEIL_W_D:
19854                     gen_farith(ctx, OPC_CEIL_W_D, -1, rs, rt, 0);
19855                     break;
19856                 case NM_TRUNC_L_S:
19857                     gen_farith(ctx, OPC_TRUNC_L_S, -1, rs, rt, 0);
19858                     break;
19859                 case NM_TRUNC_L_D:
19860                     gen_farith(ctx, OPC_TRUNC_L_D, -1, rs, rt, 0);
19861                     break;
19862                 case NM_TRUNC_W_S:
19863                     gen_farith(ctx, OPC_TRUNC_W_S, -1, rs, rt, 0);
19864                     break;
19865                 case NM_TRUNC_W_D:
19866                     gen_farith(ctx, OPC_TRUNC_W_D, -1, rs, rt, 0);
19867                     break;
19868                 case NM_ROUND_L_S:
19869                     gen_farith(ctx, OPC_ROUND_L_S, -1, rs, rt, 0);
19870                     break;
19871                 case NM_ROUND_L_D:
19872                     gen_farith(ctx, OPC_ROUND_L_D, -1, rs, rt, 0);
19873                     break;
19874                 case NM_ROUND_W_S:
19875                     gen_farith(ctx, OPC_ROUND_W_S, -1, rs, rt, 0);
19876                     break;
19877                 case NM_ROUND_W_D:
19878                     gen_farith(ctx, OPC_ROUND_W_D, -1, rs, rt, 0);
19879                     break;
19880                 case NM_MOV_S:
19881                     gen_farith(ctx, OPC_MOV_S, -1, rs, rt, 0);
19882                     break;
19883                 case NM_MOV_D:
19884                     gen_farith(ctx, OPC_MOV_D, -1, rs, rt, 0);
19885                     break;
19886                 case NM_ABS_S:
19887                     gen_farith(ctx, OPC_ABS_S, -1, rs, rt, 0);
19888                     break;
19889                 case NM_ABS_D:
19890                     gen_farith(ctx, OPC_ABS_D, -1, rs, rt, 0);
19891                     break;
19892                 case NM_NEG_S:
19893                     gen_farith(ctx, OPC_NEG_S, -1, rs, rt, 0);
19894                     break;
19895                 case NM_NEG_D:
19896                     gen_farith(ctx, OPC_NEG_D, -1, rs, rt, 0);
19897                     break;
19898                 case NM_CVT_D_S:
19899                     gen_farith(ctx, OPC_CVT_D_S, -1, rs, rt, 0);
19900                     break;
19901                 case NM_CVT_D_W:
19902                     gen_farith(ctx, OPC_CVT_D_W, -1, rs, rt, 0);
19903                     break;
19904                 case NM_CVT_D_L:
19905                     gen_farith(ctx, OPC_CVT_D_L, -1, rs, rt, 0);
19906                     break;
19907                 case NM_CVT_S_D:
19908                     gen_farith(ctx, OPC_CVT_S_D, -1, rs, rt, 0);
19909                     break;
19910                 case NM_CVT_S_W:
19911                     gen_farith(ctx, OPC_CVT_S_W, -1, rs, rt, 0);
19912                     break;
19913                 case NM_CVT_S_L:
19914                     gen_farith(ctx, OPC_CVT_S_L, -1, rs, rt, 0);
19915                     break;
19916                 default:
19917                     generate_exception_end(ctx, EXCP_RI);
19918                     break;
19919                 }
19920                 break;
19921             }
19922             break;
19923         }
19924         break;
19925     case NM_POOL32F_5:
19926         switch (extract32(ctx->opcode, 3, 3)) {
19927         case NM_CMP_CONDN_S:
19928             gen_r6_cmp_s(ctx, extract32(ctx->opcode, 6, 5), rt, rs, rd);
19929             break;
19930         case NM_CMP_CONDN_D:
19931             gen_r6_cmp_d(ctx, extract32(ctx->opcode, 6, 5), rt, rs, rd);
19932             break;
19933         default:
19934             generate_exception_end(ctx, EXCP_RI);
19935             break;
19936         }
19937         break;
19938     default:
19939         generate_exception_end(ctx, EXCP_RI);
19940         break;
19941     }
19942 }
19943
19944 static void gen_pool32a5_nanomips_insn(DisasContext *ctx, int opc,
19945                                        int rd, int rs, int rt)
19946 {
19947     int ret = rd;
19948     TCGv t0 = tcg_temp_new();
19949     TCGv v1_t = tcg_temp_new();
19950     TCGv v2_t = tcg_temp_new();
19951
19952     gen_load_gpr(v1_t, rs);
19953     gen_load_gpr(v2_t, rt);
19954
19955     switch (opc) {
19956     case NM_CMP_EQ_PH:
19957         check_dsp(ctx);
19958         gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
19959         break;
19960     case NM_CMP_LT_PH:
19961         check_dsp(ctx);
19962         gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
19963         break;
19964     case NM_CMP_LE_PH:
19965         check_dsp(ctx);
19966         gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
19967         break;
19968     case NM_CMPU_EQ_QB:
19969         check_dsp(ctx);
19970         gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
19971         break;
19972     case NM_CMPU_LT_QB:
19973         check_dsp(ctx);
19974         gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
19975         break;
19976     case NM_CMPU_LE_QB:
19977         check_dsp(ctx);
19978         gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
19979         break;
19980     case NM_CMPGU_EQ_QB:
19981         check_dsp(ctx);
19982         gen_helper_cmpgu_eq_qb(v1_t, v1_t, v2_t);
19983         gen_store_gpr(v1_t, ret);
19984         break;
19985     case NM_CMPGU_LT_QB:
19986         check_dsp(ctx);
19987         gen_helper_cmpgu_lt_qb(v1_t, v1_t, v2_t);
19988         gen_store_gpr(v1_t, ret);
19989         break;
19990     case NM_CMPGU_LE_QB:
19991         check_dsp(ctx);
19992         gen_helper_cmpgu_le_qb(v1_t, v1_t, v2_t);
19993         gen_store_gpr(v1_t, ret);
19994         break;
19995     case NM_CMPGDU_EQ_QB:
19996         check_dsp_r2(ctx);
19997         gen_helper_cmpgu_eq_qb(v1_t, v1_t, v2_t);
19998         tcg_gen_deposit_tl(cpu_dspctrl, cpu_dspctrl, v1_t, 24, 4);
19999         gen_store_gpr(v1_t, ret);
20000         break;
20001     case NM_CMPGDU_LT_QB:
20002         check_dsp_r2(ctx);
20003         gen_helper_cmpgu_lt_qb(v1_t, v1_t, v2_t);
20004         tcg_gen_deposit_tl(cpu_dspctrl, cpu_dspctrl, v1_t, 24, 4);
20005         gen_store_gpr(v1_t, ret);
20006         break;
20007     case NM_CMPGDU_LE_QB:
20008         check_dsp_r2(ctx);
20009         gen_helper_cmpgu_le_qb(v1_t, v1_t, v2_t);
20010         tcg_gen_deposit_tl(cpu_dspctrl, cpu_dspctrl, v1_t, 24, 4);
20011         gen_store_gpr(v1_t, ret);
20012         break;
20013     case NM_PACKRL_PH:
20014         check_dsp(ctx);
20015         gen_helper_packrl_ph(v1_t, v1_t, v2_t);
20016         gen_store_gpr(v1_t, ret);
20017         break;
20018     case NM_PICK_QB:
20019         check_dsp(ctx);
20020         gen_helper_pick_qb(v1_t, v1_t, v2_t, cpu_env);
20021         gen_store_gpr(v1_t, ret);
20022         break;
20023     case NM_PICK_PH:
20024         check_dsp(ctx);
20025         gen_helper_pick_ph(v1_t, v1_t, v2_t, cpu_env);
20026         gen_store_gpr(v1_t, ret);
20027         break;
20028     case NM_ADDQ_S_W:
20029         check_dsp(ctx);
20030         gen_helper_addq_s_w(v1_t, v1_t, v2_t, cpu_env);
20031         gen_store_gpr(v1_t, ret);
20032         break;
20033     case NM_SUBQ_S_W:
20034         check_dsp(ctx);
20035         gen_helper_subq_s_w(v1_t, v1_t, v2_t, cpu_env);
20036         gen_store_gpr(v1_t, ret);
20037         break;
20038     case NM_ADDSC:
20039         check_dsp(ctx);
20040         gen_helper_addsc(v1_t, v1_t, v2_t, cpu_env);
20041         gen_store_gpr(v1_t, ret);
20042         break;
20043     case NM_ADDWC:
20044         check_dsp(ctx);
20045         gen_helper_addwc(v1_t, v1_t, v2_t, cpu_env);
20046         gen_store_gpr(v1_t, ret);
20047         break;
20048     case NM_ADDQ_S_PH:
20049         check_dsp(ctx);
20050         switch (extract32(ctx->opcode, 10, 1)) {
20051         case 0:
20052             /* ADDQ_PH */
20053             gen_helper_addq_ph(v1_t, v1_t, v2_t, cpu_env);
20054             gen_store_gpr(v1_t, ret);
20055             break;
20056         case 1:
20057             /* ADDQ_S_PH */
20058             gen_helper_addq_s_ph(v1_t, v1_t, v2_t, cpu_env);
20059             gen_store_gpr(v1_t, ret);
20060             break;
20061         }
20062         break;
20063     case NM_ADDQH_R_PH:
20064         check_dsp_r2(ctx);
20065         switch (extract32(ctx->opcode, 10, 1)) {
20066         case 0:
20067             /* ADDQH_PH */
20068             gen_helper_addqh_ph(v1_t, v1_t, v2_t);
20069             gen_store_gpr(v1_t, ret);
20070             break;
20071         case 1:
20072             /* ADDQH_R_PH */
20073             gen_helper_addqh_r_ph(v1_t, v1_t, v2_t);
20074             gen_store_gpr(v1_t, ret);
20075             break;
20076         }
20077         break;
20078     case NM_ADDQH_R_W:
20079         check_dsp_r2(ctx);
20080         switch (extract32(ctx->opcode, 10, 1)) {
20081         case 0:
20082             /* ADDQH_W */
20083             gen_helper_addqh_w(v1_t, v1_t, v2_t);
20084             gen_store_gpr(v1_t, ret);
20085             break;
20086         case 1:
20087             /* ADDQH_R_W */
20088             gen_helper_addqh_r_w(v1_t, v1_t, v2_t);
20089             gen_store_gpr(v1_t, ret);
20090             break;
20091         }
20092         break;
20093     case NM_ADDU_S_QB:
20094         check_dsp(ctx);
20095         switch (extract32(ctx->opcode, 10, 1)) {
20096         case 0:
20097             /* ADDU_QB */
20098             gen_helper_addu_qb(v1_t, v1_t, v2_t, cpu_env);
20099             gen_store_gpr(v1_t, ret);
20100             break;
20101         case 1:
20102             /* ADDU_S_QB */
20103             gen_helper_addu_s_qb(v1_t, v1_t, v2_t, cpu_env);
20104             gen_store_gpr(v1_t, ret);
20105             break;
20106         }
20107         break;
20108     case NM_ADDU_S_PH:
20109         check_dsp_r2(ctx);
20110         switch (extract32(ctx->opcode, 10, 1)) {
20111         case 0:
20112             /* ADDU_PH */
20113             gen_helper_addu_ph(v1_t, v1_t, v2_t, cpu_env);
20114             gen_store_gpr(v1_t, ret);
20115             break;
20116         case 1:
20117             /* ADDU_S_PH */
20118             gen_helper_addu_s_ph(v1_t, v1_t, v2_t, cpu_env);
20119             gen_store_gpr(v1_t, ret);
20120             break;
20121         }
20122         break;
20123     case NM_ADDUH_R_QB:
20124         check_dsp_r2(ctx);
20125         switch (extract32(ctx->opcode, 10, 1)) {
20126         case 0:
20127             /* ADDUH_QB */
20128             gen_helper_adduh_qb(v1_t, v1_t, v2_t);
20129             gen_store_gpr(v1_t, ret);
20130             break;
20131         case 1:
20132             /* ADDUH_R_QB */
20133             gen_helper_adduh_r_qb(v1_t, v1_t, v2_t);
20134             gen_store_gpr(v1_t, ret);
20135             break;
20136         }
20137         break;
20138     case NM_SHRAV_R_PH:
20139         check_dsp(ctx);
20140         switch (extract32(ctx->opcode, 10, 1)) {
20141         case 0:
20142             /* SHRAV_PH */
20143             gen_helper_shra_ph(v1_t, v1_t, v2_t);
20144             gen_store_gpr(v1_t, ret);
20145             break;
20146         case 1:
20147             /* SHRAV_R_PH */
20148             gen_helper_shra_r_ph(v1_t, v1_t, v2_t);
20149             gen_store_gpr(v1_t, ret);
20150             break;
20151         }
20152         break;
20153     case NM_SHRAV_R_QB:
20154         check_dsp_r2(ctx);
20155         switch (extract32(ctx->opcode, 10, 1)) {
20156         case 0:
20157             /* SHRAV_QB */
20158             gen_helper_shra_qb(v1_t, v1_t, v2_t);
20159             gen_store_gpr(v1_t, ret);
20160             break;
20161         case 1:
20162             /* SHRAV_R_QB */
20163             gen_helper_shra_r_qb(v1_t, v1_t, v2_t);
20164             gen_store_gpr(v1_t, ret);
20165             break;
20166         }
20167         break;
20168     case NM_SUBQ_S_PH:
20169         check_dsp(ctx);
20170         switch (extract32(ctx->opcode, 10, 1)) {
20171         case 0:
20172             /* SUBQ_PH */
20173             gen_helper_subq_ph(v1_t, v1_t, v2_t, cpu_env);
20174             gen_store_gpr(v1_t, ret);
20175             break;
20176         case 1:
20177             /* SUBQ_S_PH */
20178             gen_helper_subq_s_ph(v1_t, v1_t, v2_t, cpu_env);
20179             gen_store_gpr(v1_t, ret);
20180             break;
20181         }
20182         break;
20183     case NM_SUBQH_R_PH:
20184         check_dsp_r2(ctx);
20185         switch (extract32(ctx->opcode, 10, 1)) {
20186         case 0:
20187             /* SUBQH_PH */
20188             gen_helper_subqh_ph(v1_t, v1_t, v2_t);
20189             gen_store_gpr(v1_t, ret);
20190             break;
20191         case 1:
20192             /* SUBQH_R_PH */
20193             gen_helper_subqh_r_ph(v1_t, v1_t, v2_t);
20194             gen_store_gpr(v1_t, ret);
20195             break;
20196         }
20197         break;
20198     case NM_SUBQH_R_W:
20199         check_dsp_r2(ctx);
20200         switch (extract32(ctx->opcode, 10, 1)) {
20201         case 0:
20202             /* SUBQH_W */
20203             gen_helper_subqh_w(v1_t, v1_t, v2_t);
20204             gen_store_gpr(v1_t, ret);
20205             break;
20206         case 1:
20207             /* SUBQH_R_W */
20208             gen_helper_subqh_r_w(v1_t, v1_t, v2_t);
20209             gen_store_gpr(v1_t, ret);
20210             break;
20211         }
20212         break;
20213     case NM_SUBU_S_QB:
20214         check_dsp(ctx);
20215         switch (extract32(ctx->opcode, 10, 1)) {
20216         case 0:
20217             /* SUBU_QB */
20218             gen_helper_subu_qb(v1_t, v1_t, v2_t, cpu_env);
20219             gen_store_gpr(v1_t, ret);
20220             break;
20221         case 1:
20222             /* SUBU_S_QB */
20223             gen_helper_subu_s_qb(v1_t, v1_t, v2_t, cpu_env);
20224             gen_store_gpr(v1_t, ret);
20225             break;
20226         }
20227         break;
20228     case NM_SUBU_S_PH:
20229         check_dsp_r2(ctx);
20230         switch (extract32(ctx->opcode, 10, 1)) {
20231         case 0:
20232             /* SUBU_PH */
20233             gen_helper_subu_ph(v1_t, v1_t, v2_t, cpu_env);
20234             gen_store_gpr(v1_t, ret);
20235             break;
20236         case 1:
20237             /* SUBU_S_PH */
20238             gen_helper_subu_s_ph(v1_t, v1_t, v2_t, cpu_env);
20239             gen_store_gpr(v1_t, ret);
20240             break;
20241         }
20242         break;
20243     case NM_SUBUH_R_QB:
20244         check_dsp_r2(ctx);
20245         switch (extract32(ctx->opcode, 10, 1)) {
20246         case 0:
20247             /* SUBUH_QB */
20248             gen_helper_subuh_qb(v1_t, v1_t, v2_t);
20249             gen_store_gpr(v1_t, ret);
20250             break;
20251         case 1:
20252             /* SUBUH_R_QB */
20253             gen_helper_subuh_r_qb(v1_t, v1_t, v2_t);
20254             gen_store_gpr(v1_t, ret);
20255             break;
20256         }
20257         break;
20258     case NM_SHLLV_S_PH:
20259         check_dsp(ctx);
20260         switch (extract32(ctx->opcode, 10, 1)) {
20261         case 0:
20262             /* SHLLV_PH */
20263             gen_helper_shll_ph(v1_t, v1_t, v2_t, cpu_env);
20264             gen_store_gpr(v1_t, ret);
20265             break;
20266         case 1:
20267             /* SHLLV_S_PH */
20268             gen_helper_shll_s_ph(v1_t, v1_t, v2_t, cpu_env);
20269             gen_store_gpr(v1_t, ret);
20270             break;
20271         }
20272         break;
20273     case NM_PRECR_SRA_R_PH_W:
20274         check_dsp_r2(ctx);
20275         switch (extract32(ctx->opcode, 10, 1)) {
20276         case 0:
20277             /* PRECR_SRA_PH_W */
20278             {
20279                 TCGv_i32 sa_t = tcg_const_i32(rd);
20280                 gen_helper_precr_sra_ph_w(v1_t, sa_t, v1_t,
20281                                           cpu_gpr[rt]);
20282                 gen_store_gpr(v1_t, rt);
20283                 tcg_temp_free_i32(sa_t);
20284             }
20285             break;
20286         case 1:
20287             /* PRECR_SRA_R_PH_W */
20288             {
20289                 TCGv_i32 sa_t = tcg_const_i32(rd);
20290                 gen_helper_precr_sra_r_ph_w(v1_t, sa_t, v1_t,
20291                                             cpu_gpr[rt]);
20292                 gen_store_gpr(v1_t, rt);
20293                 tcg_temp_free_i32(sa_t);
20294             }
20295             break;
20296        }
20297         break;
20298     case NM_MULEU_S_PH_QBL:
20299         check_dsp(ctx);
20300         gen_helper_muleu_s_ph_qbl(v1_t, v1_t, v2_t, cpu_env);
20301         gen_store_gpr(v1_t, ret);
20302         break;
20303     case NM_MULEU_S_PH_QBR:
20304         check_dsp(ctx);
20305         gen_helper_muleu_s_ph_qbr(v1_t, v1_t, v2_t, cpu_env);
20306         gen_store_gpr(v1_t, ret);
20307         break;
20308     case NM_MULQ_RS_PH:
20309         check_dsp(ctx);
20310         gen_helper_mulq_rs_ph(v1_t, v1_t, v2_t, cpu_env);
20311         gen_store_gpr(v1_t, ret);
20312         break;
20313     case NM_MULQ_S_PH:
20314         check_dsp_r2(ctx);
20315         gen_helper_mulq_s_ph(v1_t, v1_t, v2_t, cpu_env);
20316         gen_store_gpr(v1_t, ret);
20317         break;
20318     case NM_MULQ_RS_W:
20319         check_dsp_r2(ctx);
20320         gen_helper_mulq_rs_w(v1_t, v1_t, v2_t, cpu_env);
20321         gen_store_gpr(v1_t, ret);
20322         break;
20323     case NM_MULQ_S_W:
20324         check_dsp_r2(ctx);
20325         gen_helper_mulq_s_w(v1_t, v1_t, v2_t, cpu_env);
20326         gen_store_gpr(v1_t, ret);
20327         break;
20328     case NM_APPEND:
20329         check_dsp_r2(ctx);
20330         gen_load_gpr(t0, rs);
20331         if (rd != 0) {
20332             tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], rd, 32 - rd);
20333         }
20334         tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
20335         break;
20336     case NM_MODSUB:
20337         check_dsp(ctx);
20338         gen_helper_modsub(v1_t, v1_t, v2_t);
20339         gen_store_gpr(v1_t, ret);
20340         break;
20341     case NM_SHRAV_R_W:
20342         check_dsp(ctx);
20343         gen_helper_shra_r_w(v1_t, v1_t, v2_t);
20344         gen_store_gpr(v1_t, ret);
20345         break;
20346     case NM_SHRLV_PH:
20347         check_dsp_r2(ctx);
20348         gen_helper_shrl_ph(v1_t, v1_t, v2_t);
20349         gen_store_gpr(v1_t, ret);
20350         break;
20351     case NM_SHRLV_QB:
20352         check_dsp(ctx);
20353         gen_helper_shrl_qb(v1_t, v1_t, v2_t);
20354         gen_store_gpr(v1_t, ret);
20355         break;
20356     case NM_SHLLV_QB:
20357         check_dsp(ctx);
20358         gen_helper_shll_qb(v1_t, v1_t, v2_t, cpu_env);
20359         gen_store_gpr(v1_t, ret);
20360         break;
20361     case NM_SHLLV_S_W:
20362         check_dsp(ctx);
20363         gen_helper_shll_s_w(v1_t, v1_t, v2_t, cpu_env);
20364         gen_store_gpr(v1_t, ret);
20365         break;
20366     case NM_SHILO:
20367         check_dsp(ctx);
20368         {
20369             TCGv tv0 = tcg_temp_new();
20370             TCGv tv1 = tcg_temp_new();
20371             int16_t imm = extract32(ctx->opcode, 16, 7);
20372
20373             tcg_gen_movi_tl(tv0, rd >> 3);
20374             tcg_gen_movi_tl(tv1, imm);
20375             gen_helper_shilo(tv0, tv1, cpu_env);
20376         }
20377         break;
20378     case NM_MULEQ_S_W_PHL:
20379         check_dsp(ctx);
20380         gen_helper_muleq_s_w_phl(v1_t, v1_t, v2_t, cpu_env);
20381         gen_store_gpr(v1_t, ret);
20382         break;
20383     case NM_MULEQ_S_W_PHR:
20384         check_dsp(ctx);
20385         gen_helper_muleq_s_w_phr(v1_t, v1_t, v2_t, cpu_env);
20386         gen_store_gpr(v1_t, ret);
20387         break;
20388     case NM_MUL_S_PH:
20389         check_dsp_r2(ctx);
20390         switch (extract32(ctx->opcode, 10, 1)) {
20391         case 0:
20392             /* MUL_PH */
20393             gen_helper_mul_ph(v1_t, v1_t, v2_t, cpu_env);
20394             gen_store_gpr(v1_t, ret);
20395             break;
20396         case 1:
20397             /* MUL_S_PH */
20398             gen_helper_mul_s_ph(v1_t, v1_t, v2_t, cpu_env);
20399             gen_store_gpr(v1_t, ret);
20400             break;
20401         }
20402         break;
20403     case NM_PRECR_QB_PH:
20404         check_dsp_r2(ctx);
20405         gen_helper_precr_qb_ph(v1_t, v1_t, v2_t);
20406         gen_store_gpr(v1_t, ret);
20407         break;
20408     case NM_PRECRQ_QB_PH:
20409         check_dsp(ctx);
20410         gen_helper_precrq_qb_ph(v1_t, v1_t, v2_t);
20411         gen_store_gpr(v1_t, ret);
20412         break;
20413     case NM_PRECRQ_PH_W:
20414         check_dsp(ctx);
20415         gen_helper_precrq_ph_w(v1_t, v1_t, v2_t);
20416         gen_store_gpr(v1_t, ret);
20417         break;
20418     case NM_PRECRQ_RS_PH_W:
20419         check_dsp(ctx);
20420         gen_helper_precrq_rs_ph_w(v1_t, v1_t, v2_t, cpu_env);
20421         gen_store_gpr(v1_t, ret);
20422         break;
20423     case NM_PRECRQU_S_QB_PH:
20424         check_dsp(ctx);
20425         gen_helper_precrqu_s_qb_ph(v1_t, v1_t, v2_t, cpu_env);
20426         gen_store_gpr(v1_t, ret);
20427         break;
20428     case NM_SHRA_R_W:
20429         check_dsp(ctx);
20430         tcg_gen_movi_tl(t0, rd);
20431         gen_helper_shra_r_w(v1_t, t0, v1_t);
20432         gen_store_gpr(v1_t, rt);
20433         break;
20434     case NM_SHRA_R_PH:
20435         check_dsp(ctx);
20436         tcg_gen_movi_tl(t0, rd >> 1);
20437         switch (extract32(ctx->opcode, 10, 1)) {
20438         case 0:
20439             /* SHRA_PH */
20440             gen_helper_shra_ph(v1_t, t0, v1_t);
20441             gen_store_gpr(v1_t, rt);
20442             break;
20443         case 1:
20444             /* SHRA_R_PH */
20445             gen_helper_shra_r_ph(v1_t, t0, v1_t);
20446             gen_store_gpr(v1_t, rt);
20447             break;
20448         }
20449         break;
20450     case NM_SHLL_S_PH:
20451         check_dsp(ctx);
20452         tcg_gen_movi_tl(t0, rd >> 1);
20453         switch (extract32(ctx->opcode, 10, 2)) {
20454         case 0:
20455             /* SHLL_PH */
20456             gen_helper_shll_ph(v1_t, t0, v1_t, cpu_env);
20457             gen_store_gpr(v1_t, rt);
20458             break;
20459         case 2:
20460             /* SHLL_S_PH */
20461             gen_helper_shll_s_ph(v1_t, t0, v1_t, cpu_env);
20462             gen_store_gpr(v1_t, rt);
20463             break;
20464         default:
20465             generate_exception_end(ctx, EXCP_RI);
20466             break;
20467         }
20468         break;
20469     case NM_SHLL_S_W:
20470         check_dsp(ctx);
20471         tcg_gen_movi_tl(t0, rd);
20472         gen_helper_shll_s_w(v1_t, t0, v1_t, cpu_env);
20473         gen_store_gpr(v1_t, rt);
20474         break;
20475     case NM_REPL_PH:
20476         check_dsp(ctx);
20477         {
20478             int16_t imm;
20479             imm = sextract32(ctx->opcode, 11, 11);
20480             imm = (int16_t)(imm << 6) >> 6;
20481             if (rt != 0) {
20482                 tcg_gen_movi_tl(cpu_gpr[rt], dup_const(MO_16, imm));
20483             }
20484         }
20485         break;
20486     default:
20487         generate_exception_end(ctx, EXCP_RI);
20488         break;
20489     }
20490 }
20491
20492 static int decode_nanomips_32_48_opc(CPUMIPSState *env, DisasContext *ctx)
20493 {
20494     uint16_t insn;
20495     uint32_t op;
20496     int rt, rs, rd;
20497     int offset;
20498     int imm;
20499
20500     insn = cpu_lduw_code(env, ctx->base.pc_next + 2);
20501     ctx->opcode = (ctx->opcode << 16) | insn;
20502
20503     rt = extract32(ctx->opcode, 21, 5);
20504     rs = extract32(ctx->opcode, 16, 5);
20505     rd = extract32(ctx->opcode, 11, 5);
20506
20507     op = extract32(ctx->opcode, 26, 6);
20508     switch (op) {
20509     case NM_P_ADDIU:
20510         if (rt == 0) {
20511             /* P.RI */
20512             switch (extract32(ctx->opcode, 19, 2)) {
20513             case NM_SIGRIE:
20514             default:
20515                 generate_exception_end(ctx, EXCP_RI);
20516                 break;
20517             case NM_P_SYSCALL:
20518                 if ((extract32(ctx->opcode, 18, 1)) == NM_SYSCALL) {
20519                     generate_exception_end(ctx, EXCP_SYSCALL);
20520                 } else {
20521                     generate_exception_end(ctx, EXCP_RI);
20522                 }
20523                 break;
20524             case NM_BREAK:
20525                 generate_exception_end(ctx, EXCP_BREAK);
20526                 break;
20527             case NM_SDBBP:
20528                 if (is_uhi(extract32(ctx->opcode, 0, 19))) {
20529                     gen_helper_do_semihosting(cpu_env);
20530                 } else {
20531                     if (ctx->hflags & MIPS_HFLAG_SBRI) {
20532                         generate_exception_end(ctx, EXCP_RI);
20533                     } else {
20534                         generate_exception_end(ctx, EXCP_DBp);
20535                     }
20536                 }
20537                 break;
20538             }
20539         } else {
20540             /* NM_ADDIU */
20541             imm = extract32(ctx->opcode, 0, 16);
20542             if (rs != 0) {
20543                 tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], imm);
20544             } else {
20545                 tcg_gen_movi_tl(cpu_gpr[rt], imm);
20546             }
20547             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
20548         }
20549         break;
20550     case NM_ADDIUPC:
20551         if (rt != 0) {
20552             offset = sextract32(ctx->opcode, 0, 1) << 21 |
20553                      extract32(ctx->opcode, 1, 20) << 1;
20554             target_long addr = addr_add(ctx, ctx->base.pc_next + 4, offset);
20555             tcg_gen_movi_tl(cpu_gpr[rt], addr);
20556         }
20557         break;
20558     case NM_POOL32A:
20559         switch (ctx->opcode & 0x07) {
20560         case NM_POOL32A0:
20561             gen_pool32a0_nanomips_insn(env, ctx);
20562             break;
20563         case NM_POOL32A5:
20564             {
20565                 int32_t op1 = extract32(ctx->opcode, 3, 7);
20566                 gen_pool32a5_nanomips_insn(ctx, op1, rd, rs, rt);
20567             }
20568             break;
20569         case NM_POOL32A7:
20570             switch (extract32(ctx->opcode, 3, 3)) {
20571             case NM_P_LSX:
20572                 gen_p_lsx(ctx, rd, rs, rt);
20573                 break;
20574             case NM_LSA:
20575                 /* In nanoMIPS, the shift field directly encodes the shift
20576                  * amount, meaning that the supported shift values are in
20577                  * the range 0 to 3 (instead of 1 to 4 in MIPSR6). */
20578                 gen_lsa(ctx, OPC_LSA, rd, rs, rt,
20579                         extract32(ctx->opcode, 9, 2) - 1);
20580                 break;
20581             case NM_EXTW:
20582                 gen_ext(ctx, 32, rd, rs, rt, extract32(ctx->opcode, 6, 5));
20583                 break;
20584             case NM_POOL32AXF:
20585                 gen_pool32axf_nanomips_insn(env, ctx);
20586                 break;
20587             default:
20588                 generate_exception_end(ctx, EXCP_RI);
20589                 break;
20590             }
20591             break;
20592         default:
20593             generate_exception_end(ctx, EXCP_RI);
20594             break;
20595         }
20596         break;
20597     case NM_P_GP_W:
20598         switch (ctx->opcode & 0x03) {
20599         case NM_ADDIUGP_W:
20600             if (rt != 0) {
20601                 offset = extract32(ctx->opcode, 0, 21);
20602                 gen_op_addr_addi(ctx, cpu_gpr[rt], cpu_gpr[28], offset);
20603             }
20604             break;
20605         case NM_LWGP:
20606             gen_ld(ctx, OPC_LW, rt, 28, extract32(ctx->opcode, 2, 19) << 2);
20607             break;
20608         case NM_SWGP:
20609             gen_st(ctx, OPC_SW, rt, 28, extract32(ctx->opcode, 2, 19) << 2);
20610             break;
20611         default:
20612             generate_exception_end(ctx, EXCP_RI);
20613             break;
20614         }
20615         break;
20616     case NM_P48I:
20617         {
20618             insn = cpu_lduw_code(env, ctx->base.pc_next + 4);
20619             target_long addr_off = extract32(ctx->opcode, 0, 16) | insn << 16;
20620             switch (extract32(ctx->opcode, 16, 5)) {
20621             case NM_LI48:
20622                 check_nms(ctx);
20623                 if (rt != 0) {
20624                     tcg_gen_movi_tl(cpu_gpr[rt], addr_off);
20625                 }
20626                 break;
20627             case NM_ADDIU48:
20628                 check_nms(ctx);
20629                 if (rt != 0) {
20630                     tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rt], addr_off);
20631                     tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
20632                 }
20633                 break;
20634             case NM_ADDIUGP48:
20635                 check_nms(ctx);
20636                 if (rt != 0) {
20637                     gen_op_addr_addi(ctx, cpu_gpr[rt], cpu_gpr[28], addr_off);
20638                 }
20639                 break;
20640             case NM_ADDIUPC48:
20641                 check_nms(ctx);
20642                 if (rt != 0) {
20643                     target_long addr = addr_add(ctx, ctx->base.pc_next + 6,
20644                                                 addr_off);
20645
20646                     tcg_gen_movi_tl(cpu_gpr[rt], addr);
20647                 }
20648                 break;
20649             case NM_LWPC48:
20650                 check_nms(ctx);
20651                 if (rt != 0) {
20652                     TCGv t0;
20653                     t0 = tcg_temp_new();
20654
20655                     target_long addr = addr_add(ctx, ctx->base.pc_next + 6,
20656                                                 addr_off);
20657
20658                     tcg_gen_movi_tl(t0, addr);
20659                     tcg_gen_qemu_ld_tl(cpu_gpr[rt], t0, ctx->mem_idx, MO_TESL);
20660                     tcg_temp_free(t0);
20661                 }
20662                 break;
20663             case NM_SWPC48:
20664                 check_nms(ctx);
20665                 {
20666                     TCGv t0, t1;
20667                     t0 = tcg_temp_new();
20668                     t1 = tcg_temp_new();
20669
20670                     target_long addr = addr_add(ctx, ctx->base.pc_next + 6,
20671                                                 addr_off);
20672
20673                     tcg_gen_movi_tl(t0, addr);
20674                     gen_load_gpr(t1, rt);
20675
20676                     tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
20677
20678                     tcg_temp_free(t0);
20679                     tcg_temp_free(t1);
20680                 }
20681                 break;
20682             default:
20683                 generate_exception_end(ctx, EXCP_RI);
20684                 break;
20685             }
20686             return 6;
20687         }
20688     case NM_P_U12:
20689         switch (extract32(ctx->opcode, 12, 4)) {
20690         case NM_ORI:
20691             gen_logic_imm(ctx, OPC_ORI, rt, rs, extract32(ctx->opcode, 0, 12));
20692             break;
20693         case NM_XORI:
20694             gen_logic_imm(ctx, OPC_XORI, rt, rs, extract32(ctx->opcode, 0, 12));
20695             break;
20696         case NM_ANDI:
20697             gen_logic_imm(ctx, OPC_ANDI, rt, rs, extract32(ctx->opcode, 0, 12));
20698             break;
20699         case NM_P_SR:
20700             switch (extract32(ctx->opcode, 20, 1)) {
20701             case NM_PP_SR:
20702                 switch (ctx->opcode & 3) {
20703                 case NM_SAVE:
20704                     gen_save(ctx, rt, extract32(ctx->opcode, 16, 4),
20705                              extract32(ctx->opcode, 2, 1),
20706                              extract32(ctx->opcode, 3, 9) << 3);
20707                     break;
20708                 case NM_RESTORE:
20709                 case NM_RESTORE_JRC:
20710                     gen_restore(ctx, rt, extract32(ctx->opcode, 16, 4),
20711                                 extract32(ctx->opcode, 2, 1),
20712                                 extract32(ctx->opcode, 3, 9) << 3);
20713                     if ((ctx->opcode & 3) == NM_RESTORE_JRC) {
20714                         gen_compute_branch_nm(ctx, OPC_JR, 2, 31, 0, 0);
20715                     }
20716                     break;
20717                 default:
20718                     generate_exception_end(ctx, EXCP_RI);
20719                     break;
20720                 }
20721                 break;
20722             case NM_P_SR_F:
20723                 generate_exception_end(ctx, EXCP_RI);
20724                 break;
20725             }
20726             break;
20727         case NM_SLTI:
20728             gen_slt_imm(ctx, OPC_SLTI, rt, rs, extract32(ctx->opcode, 0, 12));
20729             break;
20730         case NM_SLTIU:
20731             gen_slt_imm(ctx, OPC_SLTIU, rt, rs, extract32(ctx->opcode, 0, 12));
20732             break;
20733         case NM_SEQI:
20734             {
20735                 TCGv t0 = tcg_temp_new();
20736
20737                 imm = extract32(ctx->opcode, 0, 12);
20738                 gen_load_gpr(t0, rs);
20739                 tcg_gen_setcondi_tl(TCG_COND_EQ, t0, t0, imm);
20740                 gen_store_gpr(t0, rt);
20741
20742                 tcg_temp_free(t0);
20743             }
20744             break;
20745         case NM_ADDIUNEG:
20746             imm = (int16_t) extract32(ctx->opcode, 0, 12);
20747             gen_arith_imm(ctx, OPC_ADDIU, rt, rs, -imm);
20748             break;
20749         case NM_P_SHIFT:
20750             {
20751                 int shift = extract32(ctx->opcode, 0, 5);
20752                 switch (extract32(ctx->opcode, 5, 4)) {
20753                 case NM_P_SLL:
20754                     if (rt == 0 && shift == 0) {
20755                         /* NOP */
20756                     } else if (rt == 0 && shift == 3) {
20757                         /* EHB - treat as NOP */
20758                     } else if (rt == 0 && shift == 5) {
20759                         /* PAUSE - treat as NOP */
20760                     } else if (rt == 0 && shift == 6) {
20761                         /* SYNC */
20762                         gen_sync(extract32(ctx->opcode, 16, 5));
20763                     } else {
20764                         /* SLL */
20765                         gen_shift_imm(ctx, OPC_SLL, rt, rs,
20766                                       extract32(ctx->opcode, 0, 5));
20767                     }
20768                     break;
20769                 case NM_SRL:
20770                     gen_shift_imm(ctx, OPC_SRL, rt, rs,
20771                                   extract32(ctx->opcode, 0, 5));
20772                     break;
20773                 case NM_SRA:
20774                     gen_shift_imm(ctx, OPC_SRA, rt, rs,
20775                                   extract32(ctx->opcode, 0, 5));
20776                     break;
20777                 case NM_ROTR:
20778                     gen_shift_imm(ctx, OPC_ROTR, rt, rs,
20779                                   extract32(ctx->opcode, 0, 5));
20780                     break;
20781                 }
20782             }
20783             break;
20784         case NM_P_ROTX:
20785             check_nms(ctx);
20786             if (rt != 0) {
20787                 TCGv t0 = tcg_temp_new();
20788                 TCGv_i32 shift = tcg_const_i32(extract32(ctx->opcode, 0, 5));
20789                 TCGv_i32 shiftx = tcg_const_i32(extract32(ctx->opcode, 7, 4)
20790                                                 << 1);
20791                 TCGv_i32 stripe = tcg_const_i32(extract32(ctx->opcode, 6, 1));
20792
20793                 gen_load_gpr(t0, rs);
20794                 gen_helper_rotx(cpu_gpr[rt], t0, shift, shiftx, stripe);
20795                 tcg_temp_free(t0);
20796
20797                 tcg_temp_free_i32(shift);
20798                 tcg_temp_free_i32(shiftx);
20799                 tcg_temp_free_i32(stripe);
20800             }
20801             break;
20802         case NM_P_INS:
20803             switch (((ctx->opcode >> 10) & 2) |
20804                     (extract32(ctx->opcode, 5, 1))) {
20805             case NM_INS:
20806                 check_nms(ctx);
20807                 gen_bitops(ctx, OPC_INS, rt, rs, extract32(ctx->opcode, 0, 5),
20808                            extract32(ctx->opcode, 6, 5));
20809                 break;
20810             default:
20811                 generate_exception_end(ctx, EXCP_RI);
20812                 break;
20813             }
20814             break;
20815         case NM_P_EXT:
20816             switch (((ctx->opcode >> 10) & 2) |
20817                     (extract32(ctx->opcode, 5, 1))) {
20818             case NM_EXT:
20819                 check_nms(ctx);
20820                 gen_bitops(ctx, OPC_EXT, rt, rs, extract32(ctx->opcode, 0, 5),
20821                            extract32(ctx->opcode, 6, 5));
20822                 break;
20823             default:
20824                 generate_exception_end(ctx, EXCP_RI);
20825                 break;
20826             }
20827             break;
20828         default:
20829             generate_exception_end(ctx, EXCP_RI);
20830             break;
20831         }
20832         break;
20833     case NM_POOL32F:
20834         gen_pool32f_nanomips_insn(ctx);
20835         break;
20836     case NM_POOL32S:
20837         break;
20838     case NM_P_LUI:
20839         switch (extract32(ctx->opcode, 1, 1)) {
20840         case NM_LUI:
20841             if (rt != 0) {
20842                 tcg_gen_movi_tl(cpu_gpr[rt],
20843                                 sextract32(ctx->opcode, 0, 1) << 31 |
20844                                 extract32(ctx->opcode, 2, 10) << 21 |
20845                                 extract32(ctx->opcode, 12, 9) << 12);
20846             }
20847             break;
20848         case NM_ALUIPC:
20849             if (rt != 0) {
20850                 offset = sextract32(ctx->opcode, 0, 1) << 31 |
20851                          extract32(ctx->opcode, 2, 10) << 21 |
20852                          extract32(ctx->opcode, 12, 9) << 12;
20853                 target_long addr;
20854                 addr = ~0xFFF & addr_add(ctx, ctx->base.pc_next + 4, offset);
20855                 tcg_gen_movi_tl(cpu_gpr[rt], addr);
20856             }
20857             break;
20858         }
20859         break;
20860     case NM_P_GP_BH:
20861         {
20862             uint32_t u = extract32(ctx->opcode, 0, 18);
20863
20864             switch (extract32(ctx->opcode, 18, 3)) {
20865             case NM_LBGP:
20866                 gen_ld(ctx, OPC_LB, rt, 28, u);
20867                 break;
20868             case NM_SBGP:
20869                 gen_st(ctx, OPC_SB, rt, 28, u);
20870                 break;
20871             case NM_LBUGP:
20872                 gen_ld(ctx, OPC_LBU, rt, 28, u);
20873                 break;
20874             case NM_ADDIUGP_B:
20875                 if (rt != 0) {
20876                     gen_op_addr_addi(ctx, cpu_gpr[rt], cpu_gpr[28], u);
20877                 }
20878                 break;
20879             case NM_P_GP_LH:
20880                 u &= ~1;
20881                 switch (ctx->opcode & 1) {
20882                 case NM_LHGP:
20883                     gen_ld(ctx, OPC_LH, rt, 28, u);
20884                     break;
20885                 case NM_LHUGP:
20886                     gen_ld(ctx, OPC_LHU, rt, 28, u);
20887                     break;
20888                 }
20889                 break;
20890             case NM_P_GP_SH:
20891                 u &= ~1;
20892                 switch (ctx->opcode & 1) {
20893                 case NM_SHGP:
20894                     gen_st(ctx, OPC_SH, rt, 28, u);
20895                     break;
20896                 default:
20897                     generate_exception_end(ctx, EXCP_RI);
20898                     break;
20899                 }
20900                 break;
20901             case NM_P_GP_CP1:
20902                 u &= ~0x3;
20903                 switch (ctx->opcode & 0x3) {
20904                 case NM_LWC1GP:
20905                     gen_cop1_ldst(ctx, OPC_LWC1, rt, 28, u);
20906                     break;
20907                 case NM_LDC1GP:
20908                     gen_cop1_ldst(ctx, OPC_LDC1, rt, 28, u);
20909                     break;
20910                 case NM_SWC1GP:
20911                     gen_cop1_ldst(ctx, OPC_SWC1, rt, 28, u);
20912                     break;
20913                 case NM_SDC1GP:
20914                     gen_cop1_ldst(ctx, OPC_SDC1, rt, 28, u);
20915                     break;
20916                 }
20917                 break;
20918             default:
20919                 generate_exception_end(ctx, EXCP_RI);
20920                 break;
20921             }
20922         }
20923         break;
20924     case NM_P_LS_U12:
20925         {
20926             uint32_t u = extract32(ctx->opcode, 0, 12);
20927
20928             switch (extract32(ctx->opcode, 12, 4)) {
20929             case NM_P_PREFU12:
20930                 if (rt == 31) {
20931                     /* SYNCI */
20932                     /* Break the TB to be able to sync copied instructions
20933                        immediately */
20934                     ctx->base.is_jmp = DISAS_STOP;
20935                 } else {
20936                     /* PREF */
20937                     /* Treat as NOP. */
20938                 }
20939                 break;
20940             case NM_LB:
20941                 gen_ld(ctx, OPC_LB, rt, rs, u);
20942                 break;
20943             case NM_LH:
20944                 gen_ld(ctx, OPC_LH, rt, rs, u);
20945                 break;
20946             case NM_LW:
20947                 gen_ld(ctx, OPC_LW, rt, rs, u);
20948                 break;
20949             case NM_LBU:
20950                 gen_ld(ctx, OPC_LBU, rt, rs, u);
20951                 break;
20952             case NM_LHU:
20953                 gen_ld(ctx, OPC_LHU, rt, rs, u);
20954                 break;
20955             case NM_SB:
20956                 gen_st(ctx, OPC_SB, rt, rs, u);
20957                 break;
20958             case NM_SH:
20959                 gen_st(ctx, OPC_SH, rt, rs, u);
20960                 break;
20961             case NM_SW:
20962                 gen_st(ctx, OPC_SW, rt, rs, u);
20963                 break;
20964             case NM_LWC1:
20965                 gen_cop1_ldst(ctx, OPC_LWC1, rt, rs, u);
20966                 break;
20967             case NM_LDC1:
20968                 gen_cop1_ldst(ctx, OPC_LDC1, rt, rs, u);
20969                 break;
20970             case NM_SWC1:
20971                 gen_cop1_ldst(ctx, OPC_SWC1, rt, rs, u);
20972                 break;
20973             case NM_SDC1:
20974                 gen_cop1_ldst(ctx, OPC_SDC1, rt, rs, u);
20975                 break;
20976             default:
20977                 generate_exception_end(ctx, EXCP_RI);
20978                 break;
20979             }
20980         }
20981         break;
20982     case NM_P_LS_S9:
20983         {
20984             int32_t s = (sextract32(ctx->opcode, 15, 1) << 8) |
20985                         extract32(ctx->opcode, 0, 8);
20986
20987             switch (extract32(ctx->opcode, 8, 3)) {
20988             case NM_P_LS_S0:
20989                 switch (extract32(ctx->opcode, 11, 4)) {
20990                 case NM_LBS9:
20991                     gen_ld(ctx, OPC_LB, rt, rs, s);
20992                     break;
20993                 case NM_LHS9:
20994                     gen_ld(ctx, OPC_LH, rt, rs, s);
20995                     break;
20996                 case NM_LWS9:
20997                     gen_ld(ctx, OPC_LW, rt, rs, s);
20998                     break;
20999                 case NM_LBUS9:
21000                     gen_ld(ctx, OPC_LBU, rt, rs, s);
21001                     break;
21002                 case NM_LHUS9:
21003                     gen_ld(ctx, OPC_LHU, rt, rs, s);
21004                     break;
21005                 case NM_SBS9:
21006                     gen_st(ctx, OPC_SB, rt, rs, s);
21007                     break;
21008                 case NM_SHS9:
21009                     gen_st(ctx, OPC_SH, rt, rs, s);
21010                     break;
21011                 case NM_SWS9:
21012                     gen_st(ctx, OPC_SW, rt, rs, s);
21013                     break;
21014                 case NM_LWC1S9:
21015                     gen_cop1_ldst(ctx, OPC_LWC1, rt, rs, s);
21016                     break;
21017                 case NM_LDC1S9:
21018                     gen_cop1_ldst(ctx, OPC_LDC1, rt, rs, s);
21019                     break;
21020                 case NM_SWC1S9:
21021                     gen_cop1_ldst(ctx, OPC_SWC1, rt, rs, s);
21022                     break;
21023                 case NM_SDC1S9:
21024                     gen_cop1_ldst(ctx, OPC_SDC1, rt, rs, s);
21025                     break;
21026                 case NM_P_PREFS9:
21027                     if (rt == 31) {
21028                         /* SYNCI */
21029                         /* Break the TB to be able to sync copied instructions
21030                            immediately */
21031                         ctx->base.is_jmp = DISAS_STOP;
21032                     } else {
21033                         /* PREF */
21034                         /* Treat as NOP. */
21035                     }
21036                     break;
21037                 default:
21038                     generate_exception_end(ctx, EXCP_RI);
21039                     break;
21040                 }
21041                 break;
21042             case NM_P_LS_S1:
21043                 switch (extract32(ctx->opcode, 11, 4)) {
21044                 case NM_UALH:
21045                 case NM_UASH:
21046                     check_nms(ctx);
21047                     {
21048                         TCGv t0 = tcg_temp_new();
21049                         TCGv t1 = tcg_temp_new();
21050
21051                         gen_base_offset_addr(ctx, t0, rs, s);
21052
21053                         switch (extract32(ctx->opcode, 11, 4)) {
21054                         case NM_UALH:
21055                             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW |
21056                                                MO_UNALN);
21057                             gen_store_gpr(t0, rt);
21058                             break;
21059                         case NM_UASH:
21060                             gen_load_gpr(t1, rt);
21061                             tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUW |
21062                                                MO_UNALN);
21063                             break;
21064                         }
21065                         tcg_temp_free(t0);
21066                         tcg_temp_free(t1);
21067                     }
21068                     break;
21069                 case NM_P_LL:
21070                     switch (ctx->opcode & 0x03) {
21071                     case NM_LL:
21072                         gen_ld(ctx, OPC_LL, rt, rs, s);
21073                         break;
21074                     case NM_LLWP:
21075                         check_xnp(ctx);
21076                         gen_llwp(ctx, rs, 0, rt, extract32(ctx->opcode, 3, 5));
21077                         break;
21078                     }
21079                     break;
21080                 case NM_P_SC:
21081                     switch (ctx->opcode & 0x03) {
21082                     case NM_SC:
21083                         gen_st_cond(ctx, OPC_SC, rt, rs, s);
21084                         break;
21085                     case NM_SCWP:
21086                         check_xnp(ctx);
21087                         gen_scwp(ctx, rs, 0, rt, extract32(ctx->opcode, 3, 5));
21088                         break;
21089                     }
21090                     break;
21091                 case NM_CACHE:
21092                     check_cp0_enabled(ctx);
21093                     if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
21094                         gen_cache_operation(ctx, rt, rs, s);
21095                     }
21096                     break;
21097                 }
21098                 break;
21099             case NM_P_LS_WM:
21100             case NM_P_LS_UAWM:
21101                 check_nms(ctx);
21102                 {
21103                     int count = extract32(ctx->opcode, 12, 3);
21104                     int counter = 0;
21105
21106                     offset = sextract32(ctx->opcode, 15, 1) << 8 |
21107                              extract32(ctx->opcode, 0, 8);
21108                     TCGv va = tcg_temp_new();
21109                     TCGv t1 = tcg_temp_new();
21110                     TCGMemOp memop = (extract32(ctx->opcode, 8, 3)) ==
21111                                       NM_P_LS_UAWM ? MO_UNALN : 0;
21112
21113                     count = (count == 0) ? 8 : count;
21114                     while (counter != count) {
21115                         int this_rt = ((rt + counter) & 0x1f) | (rt & 0x10);
21116                         int this_offset = offset + (counter << 2);
21117
21118                         gen_base_offset_addr(ctx, va, rs, this_offset);
21119
21120                         switch (extract32(ctx->opcode, 11, 1)) {
21121                         case NM_LWM:
21122                             tcg_gen_qemu_ld_tl(t1, va, ctx->mem_idx,
21123                                                memop | MO_TESL);
21124                             gen_store_gpr(t1, this_rt);
21125                             if ((this_rt == rs) &&
21126                                 (counter != (count - 1))) {
21127                                 /* UNPREDICTABLE */
21128                             }
21129                             break;
21130                         case NM_SWM:
21131                             this_rt = (rt == 0) ? 0 : this_rt;
21132                             gen_load_gpr(t1, this_rt);
21133                             tcg_gen_qemu_st_tl(t1, va, ctx->mem_idx,
21134                                                memop | MO_TEUL);
21135                             break;
21136                         }
21137                         counter++;
21138                     }
21139                     tcg_temp_free(va);
21140                     tcg_temp_free(t1);
21141                 }
21142                 break;
21143             default:
21144                 generate_exception_end(ctx, EXCP_RI);
21145                 break;
21146             }
21147         }
21148         break;
21149     case NM_MOVE_BALC:
21150         check_nms(ctx);
21151         {
21152             TCGv t0 = tcg_temp_new();
21153             int32_t s = sextract32(ctx->opcode, 0, 1) << 21 |
21154                         extract32(ctx->opcode, 1, 20) << 1;
21155             rd = (extract32(ctx->opcode, 24, 1)) == 0 ? 4 : 5;
21156             rt = decode_gpr_gpr4_zero(extract32(ctx->opcode, 25, 1) << 3 |
21157                             extract32(ctx->opcode, 21, 3));
21158             gen_load_gpr(t0, rt);
21159             tcg_gen_mov_tl(cpu_gpr[rd], t0);
21160             gen_compute_branch_nm(ctx, OPC_BGEZAL, 4, 0, 0, s);
21161             tcg_temp_free(t0);
21162         }
21163         break;
21164     case NM_P_BAL:
21165         {
21166             int32_t s = sextract32(ctx->opcode, 0, 1) << 25 |
21167                         extract32(ctx->opcode, 1, 24) << 1;
21168
21169             if ((extract32(ctx->opcode, 25, 1)) == 0) {
21170                 /* BC */
21171                 gen_compute_branch_nm(ctx, OPC_BEQ, 4, 0, 0, s);
21172             } else {
21173                 /* BALC */
21174                 gen_compute_branch_nm(ctx, OPC_BGEZAL, 4, 0, 0, s);
21175             }
21176         }
21177         break;
21178     case NM_P_J:
21179         switch (extract32(ctx->opcode, 12, 4)) {
21180         case NM_JALRC:
21181         case NM_JALRC_HB:
21182             gen_compute_branch_nm(ctx, OPC_JALR, 4, rs, rt, 0);
21183             break;
21184         case NM_P_BALRSC:
21185             gen_compute_nanomips_pbalrsc_branch(ctx, rs, rt);
21186             break;
21187         default:
21188             generate_exception_end(ctx, EXCP_RI);
21189             break;
21190         }
21191         break;
21192     case NM_P_BR1:
21193         {
21194             int32_t s = sextract32(ctx->opcode, 0, 1) << 14 |
21195                         extract32(ctx->opcode, 1, 13) << 1;
21196             switch (extract32(ctx->opcode, 14, 2)) {
21197             case NM_BEQC:
21198                 check_nms(ctx);
21199                 gen_compute_branch_nm(ctx, OPC_BEQ, 4, rs, rt, s);
21200                 break;
21201             case NM_P_BR3A:
21202                 s = sextract32(ctx->opcode, 0, 1) << 14 |
21203                     extract32(ctx->opcode, 1, 13) << 1;
21204                 check_cp1_enabled(ctx);
21205                 switch (extract32(ctx->opcode, 16, 5)) {
21206                 case NM_BC1EQZC:
21207                     gen_compute_branch_cp1_nm(ctx, OPC_BC1EQZ, rt, s);
21208                     break;
21209                 case NM_BC1NEZC:
21210                     gen_compute_branch_cp1_nm(ctx, OPC_BC1NEZ, rt, s);
21211                     break;
21212                 case NM_BPOSGE32C:
21213                     check_dsp_r3(ctx);
21214                     {
21215                         int32_t imm = extract32(ctx->opcode, 1, 13) |
21216                                       extract32(ctx->opcode, 0, 1) << 13;
21217
21218                         gen_compute_branch_nm(ctx, OPC_BPOSGE32, 4, -1, -2,
21219                                               imm);
21220                     }
21221                     break;
21222                 default:
21223                     generate_exception_end(ctx, EXCP_RI);
21224                     break;
21225                 }
21226                 break;
21227             case NM_BGEC:
21228                 if (rs == rt) {
21229                     gen_compute_compact_branch_nm(ctx, OPC_BC, rs, rt, s);
21230                 } else {
21231                     gen_compute_compact_branch_nm(ctx, OPC_BGEC, rs, rt, s);
21232                 }
21233                 break;
21234             case NM_BGEUC:
21235                 if (rs == rt || rt == 0) {
21236                     gen_compute_compact_branch_nm(ctx, OPC_BC, 0, 0, s);
21237                 } else if (rs == 0) {
21238                     gen_compute_compact_branch_nm(ctx, OPC_BEQZC, rt, 0, s);
21239                 } else {
21240                     gen_compute_compact_branch_nm(ctx, OPC_BGEUC, rs, rt, s);
21241                 }
21242                 break;
21243             }
21244         }
21245         break;
21246     case NM_P_BR2:
21247         {
21248             int32_t s = sextract32(ctx->opcode, 0, 1) << 14 |
21249                         extract32(ctx->opcode, 1, 13) << 1;
21250             switch (extract32(ctx->opcode, 14, 2)) {
21251             case NM_BNEC:
21252                 check_nms(ctx);
21253                 gen_compute_branch_nm(ctx, OPC_BNE, 4, rs, rt, s);
21254                 break;
21255             case NM_BLTC:
21256                 if (rs != 0 && rt != 0 && rs == rt) {
21257                     /* NOP */
21258                     ctx->hflags |= MIPS_HFLAG_FBNSLOT;
21259                 } else {
21260                     gen_compute_compact_branch_nm(ctx, OPC_BLTC, rs, rt, s);
21261                 }
21262                 break;
21263             case NM_BLTUC:
21264                 if (rs == 0 || rs == rt) {
21265                     /* NOP */
21266                     ctx->hflags |= MIPS_HFLAG_FBNSLOT;
21267                 } else {
21268                     gen_compute_compact_branch_nm(ctx, OPC_BLTUC, rs, rt, s);
21269                 }
21270                 break;
21271             default:
21272                 generate_exception_end(ctx, EXCP_RI);
21273                 break;
21274             }
21275         }
21276         break;
21277     case NM_P_BRI:
21278         {
21279             int32_t s = sextract32(ctx->opcode, 0, 1) << 11 |
21280                         extract32(ctx->opcode, 1, 10) << 1;
21281             uint32_t u = extract32(ctx->opcode, 11, 7);
21282
21283             gen_compute_imm_branch(ctx, extract32(ctx->opcode, 18, 3),
21284                                    rt, u, s);
21285         }
21286         break;
21287     default:
21288         generate_exception_end(ctx, EXCP_RI);
21289         break;
21290     }
21291     return 4;
21292 }
21293
21294 static int decode_nanomips_opc(CPUMIPSState *env, DisasContext *ctx)
21295 {
21296     uint32_t op;
21297     int rt = decode_gpr_gpr3(NANOMIPS_EXTRACT_RD(ctx->opcode));
21298     int rs = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS(ctx->opcode));
21299     int rd = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS1(ctx->opcode));
21300     int offset;
21301     int imm;
21302
21303     /* make sure instructions are on a halfword boundary */
21304     if (ctx->base.pc_next & 0x1) {
21305         TCGv tmp = tcg_const_tl(ctx->base.pc_next);
21306         tcg_gen_st_tl(tmp, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
21307         tcg_temp_free(tmp);
21308         generate_exception_end(ctx, EXCP_AdEL);
21309         return 2;
21310     }
21311
21312     op = extract32(ctx->opcode, 10, 6);
21313     switch (op) {
21314     case NM_P16_MV:
21315         rt = NANOMIPS_EXTRACT_RD5(ctx->opcode);
21316         if (rt != 0) {
21317             /* MOVE */
21318             rs = NANOMIPS_EXTRACT_RS5(ctx->opcode);
21319             gen_arith(ctx, OPC_ADDU, rt, rs, 0);
21320         } else {
21321             /* P16.RI */
21322             switch (extract32(ctx->opcode, 3, 2)) {
21323             case NM_P16_SYSCALL:
21324                 if (extract32(ctx->opcode, 2, 1) == 0) {
21325                     generate_exception_end(ctx, EXCP_SYSCALL);
21326                 } else {
21327                     generate_exception_end(ctx, EXCP_RI);
21328                 }
21329                 break;
21330             case NM_BREAK16:
21331                 generate_exception_end(ctx, EXCP_BREAK);
21332                 break;
21333             case NM_SDBBP16:
21334                 if (is_uhi(extract32(ctx->opcode, 0, 3))) {
21335                     gen_helper_do_semihosting(cpu_env);
21336                 } else {
21337                     if (ctx->hflags & MIPS_HFLAG_SBRI) {
21338                         generate_exception_end(ctx, EXCP_RI);
21339                     } else {
21340                         generate_exception_end(ctx, EXCP_DBp);
21341                     }
21342                 }
21343                 break;
21344             default:
21345                 generate_exception_end(ctx, EXCP_RI);
21346                 break;
21347             }
21348         }
21349         break;
21350     case NM_P16_SHIFT:
21351         {
21352             int shift = extract32(ctx->opcode, 0, 3);
21353             uint32_t opc = 0;
21354             shift = (shift == 0) ? 8 : shift;
21355
21356             switch (extract32(ctx->opcode, 3, 1)) {
21357             case NM_SLL16:
21358                 opc = OPC_SLL;
21359                 break;
21360             case NM_SRL16:
21361                 opc = OPC_SRL;
21362                 break;
21363             }
21364             gen_shift_imm(ctx, opc, rt, rs, shift);
21365         }
21366         break;
21367     case NM_P16C:
21368         switch (ctx->opcode & 1) {
21369         case NM_POOL16C_0:
21370             gen_pool16c_nanomips_insn(ctx);
21371             break;
21372         case NM_LWXS16:
21373             gen_ldxs(ctx, rt, rs, rd);
21374             break;
21375         }
21376         break;
21377     case NM_P16_A1:
21378         switch (extract32(ctx->opcode, 6, 1)) {
21379         case NM_ADDIUR1SP:
21380             imm = extract32(ctx->opcode, 0, 6) << 2;
21381             gen_arith_imm(ctx, OPC_ADDIU, rt, 29, imm);
21382             break;
21383         default:
21384             generate_exception_end(ctx, EXCP_RI);
21385             break;
21386         }
21387         break;
21388     case NM_P16_A2:
21389         switch (extract32(ctx->opcode, 3, 1)) {
21390         case NM_ADDIUR2:
21391             imm = extract32(ctx->opcode, 0, 3) << 2;
21392             gen_arith_imm(ctx, OPC_ADDIU, rt, rs, imm);
21393             break;
21394         case NM_P_ADDIURS5:
21395             rt = extract32(ctx->opcode, 5, 5);
21396             if (rt != 0) {
21397                 /* imm = sign_extend(s[3] . s[2:0] , from_nbits = 4) */
21398                 imm = (sextract32(ctx->opcode, 4, 1) << 3) |
21399                       (extract32(ctx->opcode, 0, 3));
21400                 gen_arith_imm(ctx, OPC_ADDIU, rt, rt, imm);
21401             }
21402             break;
21403         }
21404         break;
21405     case NM_P16_ADDU:
21406         switch (ctx->opcode & 0x1) {
21407         case NM_ADDU16:
21408             gen_arith(ctx, OPC_ADDU, rd, rs, rt);
21409             break;
21410         case NM_SUBU16:
21411             gen_arith(ctx, OPC_SUBU, rd, rs, rt);
21412             break;
21413         }
21414         break;
21415     case NM_P16_4X4:
21416         rt = (extract32(ctx->opcode, 9, 1) << 3) |
21417               extract32(ctx->opcode, 5, 3);
21418         rs = (extract32(ctx->opcode, 4, 1) << 3) |
21419               extract32(ctx->opcode, 0, 3);
21420         rt = decode_gpr_gpr4(rt);
21421         rs = decode_gpr_gpr4(rs);
21422         switch ((extract32(ctx->opcode, 7, 2) & 0x2) |
21423                 (extract32(ctx->opcode, 3, 1))) {
21424         case NM_ADDU4X4:
21425             check_nms(ctx);
21426             gen_arith(ctx, OPC_ADDU, rt, rs, rt);
21427             break;
21428         case NM_MUL4X4:
21429             check_nms(ctx);
21430             gen_r6_muldiv(ctx, R6_OPC_MUL, rt, rs, rt);
21431             break;
21432         default:
21433             generate_exception_end(ctx, EXCP_RI);
21434             break;
21435         }
21436         break;
21437     case NM_LI16:
21438         {
21439             int imm = extract32(ctx->opcode, 0, 7);
21440             imm = (imm == 0x7f ? -1 : imm);
21441             if (rt != 0) {
21442                 tcg_gen_movi_tl(cpu_gpr[rt], imm);
21443             }
21444         }
21445         break;
21446     case NM_ANDI16:
21447         {
21448             uint32_t u = extract32(ctx->opcode, 0, 4);
21449             u = (u == 12) ? 0xff :
21450                 (u == 13) ? 0xffff : u;
21451             gen_logic_imm(ctx, OPC_ANDI, rt, rs, u);
21452         }
21453         break;
21454     case NM_P16_LB:
21455         offset = extract32(ctx->opcode, 0, 2);
21456         switch (extract32(ctx->opcode, 2, 2)) {
21457         case NM_LB16:
21458             gen_ld(ctx, OPC_LB, rt, rs, offset);
21459             break;
21460         case NM_SB16:
21461             rt = decode_gpr_gpr3_src_store(
21462                      NANOMIPS_EXTRACT_RD(ctx->opcode));
21463             gen_st(ctx, OPC_SB, rt, rs, offset);
21464             break;
21465         case NM_LBU16:
21466             gen_ld(ctx, OPC_LBU, rt, rs, offset);
21467             break;
21468         default:
21469             generate_exception_end(ctx, EXCP_RI);
21470             break;
21471         }
21472         break;
21473     case NM_P16_LH:
21474         offset = extract32(ctx->opcode, 1, 2) << 1;
21475         switch ((extract32(ctx->opcode, 3, 1) << 1) | (ctx->opcode & 1)) {
21476         case NM_LH16:
21477             gen_ld(ctx, OPC_LH, rt, rs, offset);
21478             break;
21479         case NM_SH16:
21480             rt = decode_gpr_gpr3_src_store(
21481                      NANOMIPS_EXTRACT_RD(ctx->opcode));
21482             gen_st(ctx, OPC_SH, rt, rs, offset);
21483             break;
21484         case NM_LHU16:
21485             gen_ld(ctx, OPC_LHU, rt, rs, offset);
21486             break;
21487         default:
21488             generate_exception_end(ctx, EXCP_RI);
21489             break;
21490         }
21491         break;
21492     case NM_LW16:
21493         offset = extract32(ctx->opcode, 0, 4) << 2;
21494         gen_ld(ctx, OPC_LW, rt, rs, offset);
21495         break;
21496     case NM_LWSP16:
21497         rt = NANOMIPS_EXTRACT_RD5(ctx->opcode);
21498         offset = extract32(ctx->opcode, 0, 5) << 2;
21499         gen_ld(ctx, OPC_LW, rt, 29, offset);
21500         break;
21501     case NM_LW4X4:
21502         check_nms(ctx);
21503         rt = (extract32(ctx->opcode, 9, 1) << 3) |
21504              extract32(ctx->opcode, 5, 3);
21505         rs = (extract32(ctx->opcode, 4, 1) << 3) |
21506              extract32(ctx->opcode, 0, 3);
21507         offset = (extract32(ctx->opcode, 3, 1) << 3) |
21508                  (extract32(ctx->opcode, 8, 1) << 2);
21509         rt = decode_gpr_gpr4(rt);
21510         rs = decode_gpr_gpr4(rs);
21511         gen_ld(ctx, OPC_LW, rt, rs, offset);
21512         break;
21513     case NM_SW4X4:
21514         check_nms(ctx);
21515         rt = (extract32(ctx->opcode, 9, 1) << 3) |
21516              extract32(ctx->opcode, 5, 3);
21517         rs = (extract32(ctx->opcode, 4, 1) << 3) |
21518              extract32(ctx->opcode, 0, 3);
21519         offset = (extract32(ctx->opcode, 3, 1) << 3) |
21520                  (extract32(ctx->opcode, 8, 1) << 2);
21521         rt = decode_gpr_gpr4_zero(rt);
21522         rs = decode_gpr_gpr4(rs);
21523         gen_st(ctx, OPC_SW, rt, rs, offset);
21524         break;
21525     case NM_LWGP16:
21526         offset = extract32(ctx->opcode, 0, 7) << 2;
21527         gen_ld(ctx, OPC_LW, rt, 28, offset);
21528         break;
21529     case NM_SWSP16:
21530         rt = NANOMIPS_EXTRACT_RD5(ctx->opcode);
21531         offset = extract32(ctx->opcode, 0, 5) << 2;
21532         gen_st(ctx, OPC_SW, rt, 29, offset);
21533         break;
21534     case NM_SW16:
21535         rt = decode_gpr_gpr3_src_store(
21536                  NANOMIPS_EXTRACT_RD(ctx->opcode));
21537         rs = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS(ctx->opcode));
21538         offset = extract32(ctx->opcode, 0, 4) << 2;
21539         gen_st(ctx, OPC_SW, rt, rs, offset);
21540         break;
21541     case NM_SWGP16:
21542         rt = decode_gpr_gpr3_src_store(
21543                  NANOMIPS_EXTRACT_RD(ctx->opcode));
21544         offset = extract32(ctx->opcode, 0, 7) << 2;
21545         gen_st(ctx, OPC_SW, rt, 28, offset);
21546         break;
21547     case NM_BC16:
21548         gen_compute_branch_nm(ctx, OPC_BEQ, 2, 0, 0,
21549                            (sextract32(ctx->opcode, 0, 1) << 10) |
21550                            (extract32(ctx->opcode, 1, 9) << 1));
21551         break;
21552     case NM_BALC16:
21553         gen_compute_branch_nm(ctx, OPC_BGEZAL, 2, 0, 0,
21554                            (sextract32(ctx->opcode, 0, 1) << 10) |
21555                            (extract32(ctx->opcode, 1, 9) << 1));
21556         break;
21557     case NM_BEQZC16:
21558         gen_compute_branch_nm(ctx, OPC_BEQ, 2, rt, 0,
21559                            (sextract32(ctx->opcode, 0, 1) << 7) |
21560                            (extract32(ctx->opcode, 1, 6) << 1));
21561         break;
21562     case NM_BNEZC16:
21563         gen_compute_branch_nm(ctx, OPC_BNE, 2, rt, 0,
21564                            (sextract32(ctx->opcode, 0, 1) << 7) |
21565                            (extract32(ctx->opcode, 1, 6) << 1));
21566         break;
21567     case NM_P16_BR:
21568         switch (ctx->opcode & 0xf) {
21569         case 0:
21570             /* P16.JRC */
21571             switch (extract32(ctx->opcode, 4, 1)) {
21572             case NM_JRC:
21573                 gen_compute_branch_nm(ctx, OPC_JR, 2,
21574                                    extract32(ctx->opcode, 5, 5), 0, 0);
21575                 break;
21576             case NM_JALRC16:
21577                 gen_compute_branch_nm(ctx, OPC_JALR, 2,
21578                                    extract32(ctx->opcode, 5, 5), 31, 0);
21579                 break;
21580             }
21581             break;
21582         default:
21583             {
21584                 /* P16.BRI */
21585                 uint32_t opc = extract32(ctx->opcode, 4, 3) <
21586                                extract32(ctx->opcode, 7, 3) ? OPC_BEQ : OPC_BNE;
21587                 gen_compute_branch_nm(ctx, opc, 2, rs, rt,
21588                                    extract32(ctx->opcode, 0, 4) << 1);
21589             }
21590             break;
21591         }
21592         break;
21593     case NM_P16_SR:
21594         {
21595             int count = extract32(ctx->opcode, 0, 4);
21596             int u = extract32(ctx->opcode, 4, 4) << 4;
21597
21598             rt = 30 + extract32(ctx->opcode, 9, 1);
21599             switch (extract32(ctx->opcode, 8, 1)) {
21600             case NM_SAVE16:
21601                 gen_save(ctx, rt, count, 0, u);
21602                 break;
21603             case NM_RESTORE_JRC16:
21604                 gen_restore(ctx, rt, count, 0, u);
21605                 gen_compute_branch_nm(ctx, OPC_JR, 2, 31, 0, 0);
21606                 break;
21607             }
21608         }
21609         break;
21610     case NM_MOVEP:
21611     case NM_MOVEPREV:
21612         check_nms(ctx);
21613         {
21614             static const int gpr2reg1[] = {4, 5, 6, 7};
21615             static const int gpr2reg2[] = {5, 6, 7, 8};
21616             int re;
21617             int rd2 = extract32(ctx->opcode, 3, 1) << 1 |
21618                       extract32(ctx->opcode, 8, 1);
21619             int r1 = gpr2reg1[rd2];
21620             int r2 = gpr2reg2[rd2];
21621             int r3 = extract32(ctx->opcode, 4, 1) << 3 |
21622                      extract32(ctx->opcode, 0, 3);
21623             int r4 = extract32(ctx->opcode, 9, 1) << 3 |
21624                      extract32(ctx->opcode, 5, 3);
21625             TCGv t0 = tcg_temp_new();
21626             TCGv t1 = tcg_temp_new();
21627             if (op == NM_MOVEP) {
21628                 rd = r1;
21629                 re = r2;
21630                 rs = decode_gpr_gpr4_zero(r3);
21631                 rt = decode_gpr_gpr4_zero(r4);
21632             } else {
21633                 rd = decode_gpr_gpr4(r3);
21634                 re = decode_gpr_gpr4(r4);
21635                 rs = r1;
21636                 rt = r2;
21637             }
21638             gen_load_gpr(t0, rs);
21639             gen_load_gpr(t1, rt);
21640             tcg_gen_mov_tl(cpu_gpr[rd], t0);
21641             tcg_gen_mov_tl(cpu_gpr[re], t1);
21642             tcg_temp_free(t0);
21643             tcg_temp_free(t1);
21644         }
21645         break;
21646     default:
21647         return decode_nanomips_32_48_opc(env, ctx);
21648     }
21649
21650     return 2;
21651 }
21652
21653
21654 /* SmartMIPS extension to MIPS32 */
21655
21656 #if defined(TARGET_MIPS64)
21657
21658 /* MDMX extension to MIPS64 */
21659
21660 #endif
21661
21662 /* MIPSDSP functions. */
21663 static void gen_mipsdsp_ld(DisasContext *ctx, uint32_t opc,
21664                            int rd, int base, int offset)
21665 {
21666     TCGv t0;
21667
21668     check_dsp(ctx);
21669     t0 = tcg_temp_new();
21670
21671     if (base == 0) {
21672         gen_load_gpr(t0, offset);
21673     } else if (offset == 0) {
21674         gen_load_gpr(t0, base);
21675     } else {
21676         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[offset]);
21677     }
21678
21679     switch (opc) {
21680     case OPC_LBUX:
21681         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
21682         gen_store_gpr(t0, rd);
21683         break;
21684     case OPC_LHX:
21685         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW);
21686         gen_store_gpr(t0, rd);
21687         break;
21688     case OPC_LWX:
21689         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
21690         gen_store_gpr(t0, rd);
21691         break;
21692 #if defined(TARGET_MIPS64)
21693     case OPC_LDX:
21694         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
21695         gen_store_gpr(t0, rd);
21696         break;
21697 #endif
21698     }
21699     tcg_temp_free(t0);
21700 }
21701
21702 static void gen_mipsdsp_arith(DisasContext *ctx, uint32_t op1, uint32_t op2,
21703                               int ret, int v1, int v2)
21704 {
21705     TCGv v1_t;
21706     TCGv v2_t;
21707
21708     if (ret == 0) {
21709         /* Treat as NOP. */
21710         return;
21711     }
21712
21713     v1_t = tcg_temp_new();
21714     v2_t = tcg_temp_new();
21715
21716     gen_load_gpr(v1_t, v1);
21717     gen_load_gpr(v2_t, v2);
21718
21719     switch (op1) {
21720     /* OPC_MULT_G_2E is equal OPC_ADDUH_QB_DSP */
21721     case OPC_MULT_G_2E:
21722         check_dsp_r2(ctx);
21723         switch (op2) {
21724         case OPC_ADDUH_QB:
21725             gen_helper_adduh_qb(cpu_gpr[ret], v1_t, v2_t);
21726             break;
21727         case OPC_ADDUH_R_QB:
21728             gen_helper_adduh_r_qb(cpu_gpr[ret], v1_t, v2_t);
21729             break;
21730         case OPC_ADDQH_PH:
21731             gen_helper_addqh_ph(cpu_gpr[ret], v1_t, v2_t);
21732             break;
21733         case OPC_ADDQH_R_PH:
21734             gen_helper_addqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
21735             break;
21736         case OPC_ADDQH_W:
21737             gen_helper_addqh_w(cpu_gpr[ret], v1_t, v2_t);
21738             break;
21739         case OPC_ADDQH_R_W:
21740             gen_helper_addqh_r_w(cpu_gpr[ret], v1_t, v2_t);
21741             break;
21742         case OPC_SUBUH_QB:
21743             gen_helper_subuh_qb(cpu_gpr[ret], v1_t, v2_t);
21744             break;
21745         case OPC_SUBUH_R_QB:
21746             gen_helper_subuh_r_qb(cpu_gpr[ret], v1_t, v2_t);
21747             break;
21748         case OPC_SUBQH_PH:
21749             gen_helper_subqh_ph(cpu_gpr[ret], v1_t, v2_t);
21750             break;
21751         case OPC_SUBQH_R_PH:
21752             gen_helper_subqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
21753             break;
21754         case OPC_SUBQH_W:
21755             gen_helper_subqh_w(cpu_gpr[ret], v1_t, v2_t);
21756             break;
21757         case OPC_SUBQH_R_W:
21758             gen_helper_subqh_r_w(cpu_gpr[ret], v1_t, v2_t);
21759             break;
21760         }
21761         break;
21762     case OPC_ABSQ_S_PH_DSP:
21763         switch (op2) {
21764         case OPC_ABSQ_S_QB:
21765             check_dsp_r2(ctx);
21766             gen_helper_absq_s_qb(cpu_gpr[ret], v2_t, cpu_env);
21767             break;
21768         case OPC_ABSQ_S_PH:
21769             check_dsp(ctx);
21770             gen_helper_absq_s_ph(cpu_gpr[ret], v2_t, cpu_env);
21771             break;
21772         case OPC_ABSQ_S_W:
21773             check_dsp(ctx);
21774             gen_helper_absq_s_w(cpu_gpr[ret], v2_t, cpu_env);
21775             break;
21776         case OPC_PRECEQ_W_PHL:
21777             check_dsp(ctx);
21778             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFF0000);
21779             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
21780             break;
21781         case OPC_PRECEQ_W_PHR:
21782             check_dsp(ctx);
21783             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0x0000FFFF);
21784             tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 16);
21785             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
21786             break;
21787         case OPC_PRECEQU_PH_QBL:
21788             check_dsp(ctx);
21789             gen_helper_precequ_ph_qbl(cpu_gpr[ret], v2_t);
21790             break;
21791         case OPC_PRECEQU_PH_QBR:
21792             check_dsp(ctx);
21793             gen_helper_precequ_ph_qbr(cpu_gpr[ret], v2_t);
21794             break;
21795         case OPC_PRECEQU_PH_QBLA:
21796             check_dsp(ctx);
21797             gen_helper_precequ_ph_qbla(cpu_gpr[ret], v2_t);
21798             break;
21799         case OPC_PRECEQU_PH_QBRA:
21800             check_dsp(ctx);
21801             gen_helper_precequ_ph_qbra(cpu_gpr[ret], v2_t);
21802             break;
21803         case OPC_PRECEU_PH_QBL:
21804             check_dsp(ctx);
21805             gen_helper_preceu_ph_qbl(cpu_gpr[ret], v2_t);
21806             break;
21807         case OPC_PRECEU_PH_QBR:
21808             check_dsp(ctx);
21809             gen_helper_preceu_ph_qbr(cpu_gpr[ret], v2_t);
21810             break;
21811         case OPC_PRECEU_PH_QBLA:
21812             check_dsp(ctx);
21813             gen_helper_preceu_ph_qbla(cpu_gpr[ret], v2_t);
21814             break;
21815         case OPC_PRECEU_PH_QBRA:
21816             check_dsp(ctx);
21817             gen_helper_preceu_ph_qbra(cpu_gpr[ret], v2_t);
21818             break;
21819         }
21820         break;
21821     case OPC_ADDU_QB_DSP:
21822         switch (op2) {
21823         case OPC_ADDQ_PH:
21824             check_dsp(ctx);
21825             gen_helper_addq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21826             break;
21827         case OPC_ADDQ_S_PH:
21828             check_dsp(ctx);
21829             gen_helper_addq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21830             break;
21831         case OPC_ADDQ_S_W:
21832             check_dsp(ctx);
21833             gen_helper_addq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21834             break;
21835         case OPC_ADDU_QB:
21836             check_dsp(ctx);
21837             gen_helper_addu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21838             break;
21839         case OPC_ADDU_S_QB:
21840             check_dsp(ctx);
21841             gen_helper_addu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21842             break;
21843         case OPC_ADDU_PH:
21844             check_dsp_r2(ctx);
21845             gen_helper_addu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21846             break;
21847         case OPC_ADDU_S_PH:
21848             check_dsp_r2(ctx);
21849             gen_helper_addu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21850             break;
21851         case OPC_SUBQ_PH:
21852             check_dsp(ctx);
21853             gen_helper_subq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21854             break;
21855         case OPC_SUBQ_S_PH:
21856             check_dsp(ctx);
21857             gen_helper_subq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21858             break;
21859         case OPC_SUBQ_S_W:
21860             check_dsp(ctx);
21861             gen_helper_subq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21862             break;
21863         case OPC_SUBU_QB:
21864             check_dsp(ctx);
21865             gen_helper_subu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21866             break;
21867         case OPC_SUBU_S_QB:
21868             check_dsp(ctx);
21869             gen_helper_subu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21870             break;
21871         case OPC_SUBU_PH:
21872             check_dsp_r2(ctx);
21873             gen_helper_subu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21874             break;
21875         case OPC_SUBU_S_PH:
21876             check_dsp_r2(ctx);
21877             gen_helper_subu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21878             break;
21879         case OPC_ADDSC:
21880             check_dsp(ctx);
21881             gen_helper_addsc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21882             break;
21883         case OPC_ADDWC:
21884             check_dsp(ctx);
21885             gen_helper_addwc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21886             break;
21887         case OPC_MODSUB:
21888             check_dsp(ctx);
21889             gen_helper_modsub(cpu_gpr[ret], v1_t, v2_t);
21890             break;
21891         case OPC_RADDU_W_QB:
21892             check_dsp(ctx);
21893             gen_helper_raddu_w_qb(cpu_gpr[ret], v1_t);
21894             break;
21895         }
21896         break;
21897     case OPC_CMPU_EQ_QB_DSP:
21898         switch (op2) {
21899         case OPC_PRECR_QB_PH:
21900             check_dsp_r2(ctx);
21901             gen_helper_precr_qb_ph(cpu_gpr[ret], v1_t, v2_t);
21902             break;
21903         case OPC_PRECRQ_QB_PH:
21904             check_dsp(ctx);
21905             gen_helper_precrq_qb_ph(cpu_gpr[ret], v1_t, v2_t);
21906             break;
21907         case OPC_PRECR_SRA_PH_W:
21908             check_dsp_r2(ctx);
21909             {
21910                 TCGv_i32 sa_t = tcg_const_i32(v2);
21911                 gen_helper_precr_sra_ph_w(cpu_gpr[ret], sa_t, v1_t,
21912                                           cpu_gpr[ret]);
21913                 tcg_temp_free_i32(sa_t);
21914                 break;
21915             }
21916         case OPC_PRECR_SRA_R_PH_W:
21917             check_dsp_r2(ctx);
21918             {
21919                 TCGv_i32 sa_t = tcg_const_i32(v2);
21920                 gen_helper_precr_sra_r_ph_w(cpu_gpr[ret], sa_t, v1_t,
21921                                             cpu_gpr[ret]);
21922                 tcg_temp_free_i32(sa_t);
21923                 break;
21924             }
21925         case OPC_PRECRQ_PH_W:
21926             check_dsp(ctx);
21927             gen_helper_precrq_ph_w(cpu_gpr[ret], v1_t, v2_t);
21928             break;
21929         case OPC_PRECRQ_RS_PH_W:
21930             check_dsp(ctx);
21931             gen_helper_precrq_rs_ph_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21932             break;
21933         case OPC_PRECRQU_S_QB_PH:
21934             check_dsp(ctx);
21935             gen_helper_precrqu_s_qb_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21936             break;
21937         }
21938         break;
21939 #ifdef TARGET_MIPS64
21940     case OPC_ABSQ_S_QH_DSP:
21941         switch (op2) {
21942         case OPC_PRECEQ_L_PWL:
21943             check_dsp(ctx);
21944             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFFFFFF00000000ull);
21945             break;
21946         case OPC_PRECEQ_L_PWR:
21947             check_dsp(ctx);
21948             tcg_gen_shli_tl(cpu_gpr[ret], v2_t, 32);
21949             break;
21950         case OPC_PRECEQ_PW_QHL:
21951             check_dsp(ctx);
21952             gen_helper_preceq_pw_qhl(cpu_gpr[ret], v2_t);
21953             break;
21954         case OPC_PRECEQ_PW_QHR:
21955             check_dsp(ctx);
21956             gen_helper_preceq_pw_qhr(cpu_gpr[ret], v2_t);
21957             break;
21958         case OPC_PRECEQ_PW_QHLA:
21959             check_dsp(ctx);
21960             gen_helper_preceq_pw_qhla(cpu_gpr[ret], v2_t);
21961             break;
21962         case OPC_PRECEQ_PW_QHRA:
21963             check_dsp(ctx);
21964             gen_helper_preceq_pw_qhra(cpu_gpr[ret], v2_t);
21965             break;
21966         case OPC_PRECEQU_QH_OBL:
21967             check_dsp(ctx);
21968             gen_helper_precequ_qh_obl(cpu_gpr[ret], v2_t);
21969             break;
21970         case OPC_PRECEQU_QH_OBR:
21971             check_dsp(ctx);
21972             gen_helper_precequ_qh_obr(cpu_gpr[ret], v2_t);
21973             break;
21974         case OPC_PRECEQU_QH_OBLA:
21975             check_dsp(ctx);
21976             gen_helper_precequ_qh_obla(cpu_gpr[ret], v2_t);
21977             break;
21978         case OPC_PRECEQU_QH_OBRA:
21979             check_dsp(ctx);
21980             gen_helper_precequ_qh_obra(cpu_gpr[ret], v2_t);
21981             break;
21982         case OPC_PRECEU_QH_OBL:
21983             check_dsp(ctx);
21984             gen_helper_preceu_qh_obl(cpu_gpr[ret], v2_t);
21985             break;
21986         case OPC_PRECEU_QH_OBR:
21987             check_dsp(ctx);
21988             gen_helper_preceu_qh_obr(cpu_gpr[ret], v2_t);
21989             break;
21990         case OPC_PRECEU_QH_OBLA:
21991             check_dsp(ctx);
21992             gen_helper_preceu_qh_obla(cpu_gpr[ret], v2_t);
21993             break;
21994         case OPC_PRECEU_QH_OBRA:
21995             check_dsp(ctx);
21996             gen_helper_preceu_qh_obra(cpu_gpr[ret], v2_t);
21997             break;
21998         case OPC_ABSQ_S_OB:
21999             check_dsp_r2(ctx);
22000             gen_helper_absq_s_ob(cpu_gpr[ret], v2_t, cpu_env);
22001             break;
22002         case OPC_ABSQ_S_PW:
22003             check_dsp(ctx);
22004             gen_helper_absq_s_pw(cpu_gpr[ret], v2_t, cpu_env);
22005             break;
22006         case OPC_ABSQ_S_QH:
22007             check_dsp(ctx);
22008             gen_helper_absq_s_qh(cpu_gpr[ret], v2_t, cpu_env);
22009             break;
22010         }
22011         break;
22012     case OPC_ADDU_OB_DSP:
22013         switch (op2) {
22014         case OPC_RADDU_L_OB:
22015             check_dsp(ctx);
22016             gen_helper_raddu_l_ob(cpu_gpr[ret], v1_t);
22017             break;
22018         case OPC_SUBQ_PW:
22019             check_dsp(ctx);
22020             gen_helper_subq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22021             break;
22022         case OPC_SUBQ_S_PW:
22023             check_dsp(ctx);
22024             gen_helper_subq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22025             break;
22026         case OPC_SUBQ_QH:
22027             check_dsp(ctx);
22028             gen_helper_subq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22029             break;
22030         case OPC_SUBQ_S_QH:
22031             check_dsp(ctx);
22032             gen_helper_subq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22033             break;
22034         case OPC_SUBU_OB:
22035             check_dsp(ctx);
22036             gen_helper_subu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22037             break;
22038         case OPC_SUBU_S_OB:
22039             check_dsp(ctx);
22040             gen_helper_subu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22041             break;
22042         case OPC_SUBU_QH:
22043             check_dsp_r2(ctx);
22044             gen_helper_subu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22045             break;
22046         case OPC_SUBU_S_QH:
22047             check_dsp_r2(ctx);
22048             gen_helper_subu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22049             break;
22050         case OPC_SUBUH_OB:
22051             check_dsp_r2(ctx);
22052             gen_helper_subuh_ob(cpu_gpr[ret], v1_t, v2_t);
22053             break;
22054         case OPC_SUBUH_R_OB:
22055             check_dsp_r2(ctx);
22056             gen_helper_subuh_r_ob(cpu_gpr[ret], v1_t, v2_t);
22057             break;
22058         case OPC_ADDQ_PW:
22059             check_dsp(ctx);
22060             gen_helper_addq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22061             break;
22062         case OPC_ADDQ_S_PW:
22063             check_dsp(ctx);
22064             gen_helper_addq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22065             break;
22066         case OPC_ADDQ_QH:
22067             check_dsp(ctx);
22068             gen_helper_addq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22069             break;
22070         case OPC_ADDQ_S_QH:
22071             check_dsp(ctx);
22072             gen_helper_addq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22073             break;
22074         case OPC_ADDU_OB:
22075             check_dsp(ctx);
22076             gen_helper_addu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22077             break;
22078         case OPC_ADDU_S_OB:
22079             check_dsp(ctx);
22080             gen_helper_addu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22081             break;
22082         case OPC_ADDU_QH:
22083             check_dsp_r2(ctx);
22084             gen_helper_addu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22085             break;
22086         case OPC_ADDU_S_QH:
22087             check_dsp_r2(ctx);
22088             gen_helper_addu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22089             break;
22090         case OPC_ADDUH_OB:
22091             check_dsp_r2(ctx);
22092             gen_helper_adduh_ob(cpu_gpr[ret], v1_t, v2_t);
22093             break;
22094         case OPC_ADDUH_R_OB:
22095             check_dsp_r2(ctx);
22096             gen_helper_adduh_r_ob(cpu_gpr[ret], v1_t, v2_t);
22097             break;
22098         }
22099         break;
22100     case OPC_CMPU_EQ_OB_DSP:
22101         switch (op2) {
22102         case OPC_PRECR_OB_QH:
22103             check_dsp_r2(ctx);
22104             gen_helper_precr_ob_qh(cpu_gpr[ret], v1_t, v2_t);
22105             break;
22106         case OPC_PRECR_SRA_QH_PW:
22107             check_dsp_r2(ctx);
22108             {
22109                 TCGv_i32 ret_t = tcg_const_i32(ret);
22110                 gen_helper_precr_sra_qh_pw(v2_t, v1_t, v2_t, ret_t);
22111                 tcg_temp_free_i32(ret_t);
22112                 break;
22113             }
22114         case OPC_PRECR_SRA_R_QH_PW:
22115             check_dsp_r2(ctx);
22116             {
22117                 TCGv_i32 sa_v = tcg_const_i32(ret);
22118                 gen_helper_precr_sra_r_qh_pw(v2_t, v1_t, v2_t, sa_v);
22119                 tcg_temp_free_i32(sa_v);
22120                 break;
22121             }
22122         case OPC_PRECRQ_OB_QH:
22123             check_dsp(ctx);
22124             gen_helper_precrq_ob_qh(cpu_gpr[ret], v1_t, v2_t);
22125             break;
22126         case OPC_PRECRQ_PW_L:
22127             check_dsp(ctx);
22128             gen_helper_precrq_pw_l(cpu_gpr[ret], v1_t, v2_t);
22129             break;
22130         case OPC_PRECRQ_QH_PW:
22131             check_dsp(ctx);
22132             gen_helper_precrq_qh_pw(cpu_gpr[ret], v1_t, v2_t);
22133             break;
22134         case OPC_PRECRQ_RS_QH_PW:
22135             check_dsp(ctx);
22136             gen_helper_precrq_rs_qh_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22137             break;
22138         case OPC_PRECRQU_S_OB_QH:
22139             check_dsp(ctx);
22140             gen_helper_precrqu_s_ob_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22141             break;
22142         }
22143         break;
22144 #endif
22145     }
22146
22147     tcg_temp_free(v1_t);
22148     tcg_temp_free(v2_t);
22149 }
22150
22151 static void gen_mipsdsp_shift(DisasContext *ctx, uint32_t opc,
22152                               int ret, int v1, int v2)
22153 {
22154     uint32_t op2;
22155     TCGv t0;
22156     TCGv v1_t;
22157     TCGv v2_t;
22158
22159     if (ret == 0) {
22160         /* Treat as NOP. */
22161         return;
22162     }
22163
22164     t0 = tcg_temp_new();
22165     v1_t = tcg_temp_new();
22166     v2_t = tcg_temp_new();
22167
22168     tcg_gen_movi_tl(t0, v1);
22169     gen_load_gpr(v1_t, v1);
22170     gen_load_gpr(v2_t, v2);
22171
22172     switch (opc) {
22173     case OPC_SHLL_QB_DSP:
22174         {
22175             op2 = MASK_SHLL_QB(ctx->opcode);
22176             switch (op2) {
22177             case OPC_SHLL_QB:
22178                 check_dsp(ctx);
22179                 gen_helper_shll_qb(cpu_gpr[ret], t0, v2_t, cpu_env);
22180                 break;
22181             case OPC_SHLLV_QB:
22182                 check_dsp(ctx);
22183                 gen_helper_shll_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22184                 break;
22185             case OPC_SHLL_PH:
22186                 check_dsp(ctx);
22187                 gen_helper_shll_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
22188                 break;
22189             case OPC_SHLLV_PH:
22190                 check_dsp(ctx);
22191                 gen_helper_shll_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22192                 break;
22193             case OPC_SHLL_S_PH:
22194                 check_dsp(ctx);
22195                 gen_helper_shll_s_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
22196                 break;
22197             case OPC_SHLLV_S_PH:
22198                 check_dsp(ctx);
22199                 gen_helper_shll_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22200                 break;
22201             case OPC_SHLL_S_W:
22202                 check_dsp(ctx);
22203                 gen_helper_shll_s_w(cpu_gpr[ret], t0, v2_t, cpu_env);
22204                 break;
22205             case OPC_SHLLV_S_W:
22206                 check_dsp(ctx);
22207                 gen_helper_shll_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22208                 break;
22209             case OPC_SHRL_QB:
22210                 check_dsp(ctx);
22211                 gen_helper_shrl_qb(cpu_gpr[ret], t0, v2_t);
22212                 break;
22213             case OPC_SHRLV_QB:
22214                 check_dsp(ctx);
22215                 gen_helper_shrl_qb(cpu_gpr[ret], v1_t, v2_t);
22216                 break;
22217             case OPC_SHRL_PH:
22218                 check_dsp_r2(ctx);
22219                 gen_helper_shrl_ph(cpu_gpr[ret], t0, v2_t);
22220                 break;
22221             case OPC_SHRLV_PH:
22222                 check_dsp_r2(ctx);
22223                 gen_helper_shrl_ph(cpu_gpr[ret], v1_t, v2_t);
22224                 break;
22225             case OPC_SHRA_QB:
22226                 check_dsp_r2(ctx);
22227                 gen_helper_shra_qb(cpu_gpr[ret], t0, v2_t);
22228                 break;
22229             case OPC_SHRA_R_QB:
22230                 check_dsp_r2(ctx);
22231                 gen_helper_shra_r_qb(cpu_gpr[ret], t0, v2_t);
22232                 break;
22233             case OPC_SHRAV_QB:
22234                 check_dsp_r2(ctx);
22235                 gen_helper_shra_qb(cpu_gpr[ret], v1_t, v2_t);
22236                 break;
22237             case OPC_SHRAV_R_QB:
22238                 check_dsp_r2(ctx);
22239                 gen_helper_shra_r_qb(cpu_gpr[ret], v1_t, v2_t);
22240                 break;
22241             case OPC_SHRA_PH:
22242                 check_dsp(ctx);
22243                 gen_helper_shra_ph(cpu_gpr[ret], t0, v2_t);
22244                 break;
22245             case OPC_SHRA_R_PH:
22246                 check_dsp(ctx);
22247                 gen_helper_shra_r_ph(cpu_gpr[ret], t0, v2_t);
22248                 break;
22249             case OPC_SHRAV_PH:
22250                 check_dsp(ctx);
22251                 gen_helper_shra_ph(cpu_gpr[ret], v1_t, v2_t);
22252                 break;
22253             case OPC_SHRAV_R_PH:
22254                 check_dsp(ctx);
22255                 gen_helper_shra_r_ph(cpu_gpr[ret], v1_t, v2_t);
22256                 break;
22257             case OPC_SHRA_R_W:
22258                 check_dsp(ctx);
22259                 gen_helper_shra_r_w(cpu_gpr[ret], t0, v2_t);
22260                 break;
22261             case OPC_SHRAV_R_W:
22262                 check_dsp(ctx);
22263                 gen_helper_shra_r_w(cpu_gpr[ret], v1_t, v2_t);
22264                 break;
22265             default:            /* Invalid */
22266                 MIPS_INVAL("MASK SHLL.QB");
22267                 generate_exception_end(ctx, EXCP_RI);
22268                 break;
22269             }
22270             break;
22271         }
22272 #ifdef TARGET_MIPS64
22273     case OPC_SHLL_OB_DSP:
22274         op2 = MASK_SHLL_OB(ctx->opcode);
22275         switch (op2) {
22276         case OPC_SHLL_PW:
22277             check_dsp(ctx);
22278             gen_helper_shll_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
22279             break;
22280         case OPC_SHLLV_PW:
22281             check_dsp(ctx);
22282             gen_helper_shll_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22283             break;
22284         case OPC_SHLL_S_PW:
22285             check_dsp(ctx);
22286             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
22287             break;
22288         case OPC_SHLLV_S_PW:
22289             check_dsp(ctx);
22290             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22291             break;
22292         case OPC_SHLL_OB:
22293             check_dsp(ctx);
22294             gen_helper_shll_ob(cpu_gpr[ret], v2_t, t0, cpu_env);
22295             break;
22296         case OPC_SHLLV_OB:
22297             check_dsp(ctx);
22298             gen_helper_shll_ob(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22299             break;
22300         case OPC_SHLL_QH:
22301             check_dsp(ctx);
22302             gen_helper_shll_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
22303             break;
22304         case OPC_SHLLV_QH:
22305             check_dsp(ctx);
22306             gen_helper_shll_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22307             break;
22308         case OPC_SHLL_S_QH:
22309             check_dsp(ctx);
22310             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
22311             break;
22312         case OPC_SHLLV_S_QH:
22313             check_dsp(ctx);
22314             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22315             break;
22316         case OPC_SHRA_OB:
22317             check_dsp_r2(ctx);
22318             gen_helper_shra_ob(cpu_gpr[ret], v2_t, t0);
22319             break;
22320         case OPC_SHRAV_OB:
22321             check_dsp_r2(ctx);
22322             gen_helper_shra_ob(cpu_gpr[ret], v2_t, v1_t);
22323             break;
22324         case OPC_SHRA_R_OB:
22325             check_dsp_r2(ctx);
22326             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, t0);
22327             break;
22328         case OPC_SHRAV_R_OB:
22329             check_dsp_r2(ctx);
22330             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, v1_t);
22331             break;
22332         case OPC_SHRA_PW:
22333             check_dsp(ctx);
22334             gen_helper_shra_pw(cpu_gpr[ret], v2_t, t0);
22335             break;
22336         case OPC_SHRAV_PW:
22337             check_dsp(ctx);
22338             gen_helper_shra_pw(cpu_gpr[ret], v2_t, v1_t);
22339             break;
22340         case OPC_SHRA_R_PW:
22341             check_dsp(ctx);
22342             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, t0);
22343             break;
22344         case OPC_SHRAV_R_PW:
22345             check_dsp(ctx);
22346             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, v1_t);
22347             break;
22348         case OPC_SHRA_QH:
22349             check_dsp(ctx);
22350             gen_helper_shra_qh(cpu_gpr[ret], v2_t, t0);
22351             break;
22352         case OPC_SHRAV_QH:
22353             check_dsp(ctx);
22354             gen_helper_shra_qh(cpu_gpr[ret], v2_t, v1_t);
22355             break;
22356         case OPC_SHRA_R_QH:
22357             check_dsp(ctx);
22358             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, t0);
22359             break;
22360         case OPC_SHRAV_R_QH:
22361             check_dsp(ctx);
22362             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, v1_t);
22363             break;
22364         case OPC_SHRL_OB:
22365             check_dsp(ctx);
22366             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, t0);
22367             break;
22368         case OPC_SHRLV_OB:
22369             check_dsp(ctx);
22370             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, v1_t);
22371             break;
22372         case OPC_SHRL_QH:
22373             check_dsp_r2(ctx);
22374             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, t0);
22375             break;
22376         case OPC_SHRLV_QH:
22377             check_dsp_r2(ctx);
22378             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, v1_t);
22379             break;
22380         default:            /* Invalid */
22381             MIPS_INVAL("MASK SHLL.OB");
22382             generate_exception_end(ctx, EXCP_RI);
22383             break;
22384         }
22385         break;
22386 #endif
22387     }
22388
22389     tcg_temp_free(t0);
22390     tcg_temp_free(v1_t);
22391     tcg_temp_free(v2_t);
22392 }
22393
22394 static void gen_mipsdsp_multiply(DisasContext *ctx, uint32_t op1, uint32_t op2,
22395                                  int ret, int v1, int v2, int check_ret)
22396 {
22397     TCGv_i32 t0;
22398     TCGv v1_t;
22399     TCGv v2_t;
22400
22401     if ((ret == 0) && (check_ret == 1)) {
22402         /* Treat as NOP. */
22403         return;
22404     }
22405
22406     t0 = tcg_temp_new_i32();
22407     v1_t = tcg_temp_new();
22408     v2_t = tcg_temp_new();
22409
22410     tcg_gen_movi_i32(t0, ret);
22411     gen_load_gpr(v1_t, v1);
22412     gen_load_gpr(v2_t, v2);
22413
22414     switch (op1) {
22415     /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
22416      * the same mask and op1. */
22417     case OPC_MULT_G_2E:
22418         check_dsp_r2(ctx);
22419         switch (op2) {
22420         case  OPC_MUL_PH:
22421             gen_helper_mul_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22422             break;
22423         case  OPC_MUL_S_PH:
22424             gen_helper_mul_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22425             break;
22426         case OPC_MULQ_S_W:
22427             gen_helper_mulq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22428             break;
22429         case OPC_MULQ_RS_W:
22430             gen_helper_mulq_rs_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22431             break;
22432         }
22433         break;
22434     case OPC_DPA_W_PH_DSP:
22435         switch (op2) {
22436         case OPC_DPAU_H_QBL:
22437             check_dsp(ctx);
22438             gen_helper_dpau_h_qbl(t0, v1_t, v2_t, cpu_env);
22439             break;
22440         case OPC_DPAU_H_QBR:
22441             check_dsp(ctx);
22442             gen_helper_dpau_h_qbr(t0, v1_t, v2_t, cpu_env);
22443             break;
22444         case OPC_DPSU_H_QBL:
22445             check_dsp(ctx);
22446             gen_helper_dpsu_h_qbl(t0, v1_t, v2_t, cpu_env);
22447             break;
22448         case OPC_DPSU_H_QBR:
22449             check_dsp(ctx);
22450             gen_helper_dpsu_h_qbr(t0, v1_t, v2_t, cpu_env);
22451             break;
22452         case OPC_DPA_W_PH:
22453             check_dsp_r2(ctx);
22454             gen_helper_dpa_w_ph(t0, v1_t, v2_t, cpu_env);
22455             break;
22456         case OPC_DPAX_W_PH:
22457             check_dsp_r2(ctx);
22458             gen_helper_dpax_w_ph(t0, v1_t, v2_t, cpu_env);
22459             break;
22460         case OPC_DPAQ_S_W_PH:
22461             check_dsp(ctx);
22462             gen_helper_dpaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
22463             break;
22464         case OPC_DPAQX_S_W_PH:
22465             check_dsp_r2(ctx);
22466             gen_helper_dpaqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
22467             break;
22468         case OPC_DPAQX_SA_W_PH:
22469             check_dsp_r2(ctx);
22470             gen_helper_dpaqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
22471             break;
22472         case OPC_DPS_W_PH:
22473             check_dsp_r2(ctx);
22474             gen_helper_dps_w_ph(t0, v1_t, v2_t, cpu_env);
22475             break;
22476         case OPC_DPSX_W_PH:
22477             check_dsp_r2(ctx);
22478             gen_helper_dpsx_w_ph(t0, v1_t, v2_t, cpu_env);
22479             break;
22480         case OPC_DPSQ_S_W_PH:
22481             check_dsp(ctx);
22482             gen_helper_dpsq_s_w_ph(t0, v1_t, v2_t, cpu_env);
22483             break;
22484         case OPC_DPSQX_S_W_PH:
22485             check_dsp_r2(ctx);
22486             gen_helper_dpsqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
22487             break;
22488         case OPC_DPSQX_SA_W_PH:
22489             check_dsp_r2(ctx);
22490             gen_helper_dpsqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
22491             break;
22492         case OPC_MULSAQ_S_W_PH:
22493             check_dsp(ctx);
22494             gen_helper_mulsaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
22495             break;
22496         case OPC_DPAQ_SA_L_W:
22497             check_dsp(ctx);
22498             gen_helper_dpaq_sa_l_w(t0, v1_t, v2_t, cpu_env);
22499             break;
22500         case OPC_DPSQ_SA_L_W:
22501             check_dsp(ctx);
22502             gen_helper_dpsq_sa_l_w(t0, v1_t, v2_t, cpu_env);
22503             break;
22504         case OPC_MAQ_S_W_PHL:
22505             check_dsp(ctx);
22506             gen_helper_maq_s_w_phl(t0, v1_t, v2_t, cpu_env);
22507             break;
22508         case OPC_MAQ_S_W_PHR:
22509             check_dsp(ctx);
22510             gen_helper_maq_s_w_phr(t0, v1_t, v2_t, cpu_env);
22511             break;
22512         case OPC_MAQ_SA_W_PHL:
22513             check_dsp(ctx);
22514             gen_helper_maq_sa_w_phl(t0, v1_t, v2_t, cpu_env);
22515             break;
22516         case OPC_MAQ_SA_W_PHR:
22517             check_dsp(ctx);
22518             gen_helper_maq_sa_w_phr(t0, v1_t, v2_t, cpu_env);
22519             break;
22520         case OPC_MULSA_W_PH:
22521             check_dsp_r2(ctx);
22522             gen_helper_mulsa_w_ph(t0, v1_t, v2_t, cpu_env);
22523             break;
22524         }
22525         break;
22526 #ifdef TARGET_MIPS64
22527     case OPC_DPAQ_W_QH_DSP:
22528         {
22529             int ac = ret & 0x03;
22530             tcg_gen_movi_i32(t0, ac);
22531
22532             switch (op2) {
22533             case OPC_DMADD:
22534                 check_dsp(ctx);
22535                 gen_helper_dmadd(v1_t, v2_t, t0, cpu_env);
22536                 break;
22537             case OPC_DMADDU:
22538                 check_dsp(ctx);
22539                 gen_helper_dmaddu(v1_t, v2_t, t0, cpu_env);
22540                 break;
22541             case OPC_DMSUB:
22542                 check_dsp(ctx);
22543                 gen_helper_dmsub(v1_t, v2_t, t0, cpu_env);
22544                 break;
22545             case OPC_DMSUBU:
22546                 check_dsp(ctx);
22547                 gen_helper_dmsubu(v1_t, v2_t, t0, cpu_env);
22548                 break;
22549             case OPC_DPA_W_QH:
22550                 check_dsp_r2(ctx);
22551                 gen_helper_dpa_w_qh(v1_t, v2_t, t0, cpu_env);
22552                 break;
22553             case OPC_DPAQ_S_W_QH:
22554                 check_dsp(ctx);
22555                 gen_helper_dpaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
22556                 break;
22557             case OPC_DPAQ_SA_L_PW:
22558                 check_dsp(ctx);
22559                 gen_helper_dpaq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
22560                 break;
22561             case OPC_DPAU_H_OBL:
22562                 check_dsp(ctx);
22563                 gen_helper_dpau_h_obl(v1_t, v2_t, t0, cpu_env);
22564                 break;
22565             case OPC_DPAU_H_OBR:
22566                 check_dsp(ctx);
22567                 gen_helper_dpau_h_obr(v1_t, v2_t, t0, cpu_env);
22568                 break;
22569             case OPC_DPS_W_QH:
22570                 check_dsp_r2(ctx);
22571                 gen_helper_dps_w_qh(v1_t, v2_t, t0, cpu_env);
22572                 break;
22573             case OPC_DPSQ_S_W_QH:
22574                 check_dsp(ctx);
22575                 gen_helper_dpsq_s_w_qh(v1_t, v2_t, t0, cpu_env);
22576                 break;
22577             case OPC_DPSQ_SA_L_PW:
22578                 check_dsp(ctx);
22579                 gen_helper_dpsq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
22580                 break;
22581             case OPC_DPSU_H_OBL:
22582                 check_dsp(ctx);
22583                 gen_helper_dpsu_h_obl(v1_t, v2_t, t0, cpu_env);
22584                 break;
22585             case OPC_DPSU_H_OBR:
22586                 check_dsp(ctx);
22587                 gen_helper_dpsu_h_obr(v1_t, v2_t, t0, cpu_env);
22588                 break;
22589             case OPC_MAQ_S_L_PWL:
22590                 check_dsp(ctx);
22591                 gen_helper_maq_s_l_pwl(v1_t, v2_t, t0, cpu_env);
22592                 break;
22593             case OPC_MAQ_S_L_PWR:
22594                 check_dsp(ctx);
22595                 gen_helper_maq_s_l_pwr(v1_t, v2_t, t0, cpu_env);
22596                 break;
22597             case OPC_MAQ_S_W_QHLL:
22598                 check_dsp(ctx);
22599                 gen_helper_maq_s_w_qhll(v1_t, v2_t, t0, cpu_env);
22600                 break;
22601             case OPC_MAQ_SA_W_QHLL:
22602                 check_dsp(ctx);
22603                 gen_helper_maq_sa_w_qhll(v1_t, v2_t, t0, cpu_env);
22604                 break;
22605             case OPC_MAQ_S_W_QHLR:
22606                 check_dsp(ctx);
22607                 gen_helper_maq_s_w_qhlr(v1_t, v2_t, t0, cpu_env);
22608                 break;
22609             case OPC_MAQ_SA_W_QHLR:
22610                 check_dsp(ctx);
22611                 gen_helper_maq_sa_w_qhlr(v1_t, v2_t, t0, cpu_env);
22612                 break;
22613             case OPC_MAQ_S_W_QHRL:
22614                 check_dsp(ctx);
22615                 gen_helper_maq_s_w_qhrl(v1_t, v2_t, t0, cpu_env);
22616                 break;
22617             case OPC_MAQ_SA_W_QHRL:
22618                 check_dsp(ctx);
22619                 gen_helper_maq_sa_w_qhrl(v1_t, v2_t, t0, cpu_env);
22620                 break;
22621             case OPC_MAQ_S_W_QHRR:
22622                 check_dsp(ctx);
22623                 gen_helper_maq_s_w_qhrr(v1_t, v2_t, t0, cpu_env);
22624                 break;
22625             case OPC_MAQ_SA_W_QHRR:
22626                 check_dsp(ctx);
22627                 gen_helper_maq_sa_w_qhrr(v1_t, v2_t, t0, cpu_env);
22628                 break;
22629             case OPC_MULSAQ_S_L_PW:
22630                 check_dsp(ctx);
22631                 gen_helper_mulsaq_s_l_pw(v1_t, v2_t, t0, cpu_env);
22632                 break;
22633             case OPC_MULSAQ_S_W_QH:
22634                 check_dsp(ctx);
22635                 gen_helper_mulsaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
22636                 break;
22637             }
22638         }
22639         break;
22640 #endif
22641     case OPC_ADDU_QB_DSP:
22642         switch (op2) {
22643         case OPC_MULEU_S_PH_QBL:
22644             check_dsp(ctx);
22645             gen_helper_muleu_s_ph_qbl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22646             break;
22647         case OPC_MULEU_S_PH_QBR:
22648             check_dsp(ctx);
22649             gen_helper_muleu_s_ph_qbr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22650             break;
22651         case OPC_MULQ_RS_PH:
22652             check_dsp(ctx);
22653             gen_helper_mulq_rs_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22654             break;
22655         case OPC_MULEQ_S_W_PHL:
22656             check_dsp(ctx);
22657             gen_helper_muleq_s_w_phl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22658             break;
22659         case OPC_MULEQ_S_W_PHR:
22660             check_dsp(ctx);
22661             gen_helper_muleq_s_w_phr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22662             break;
22663         case OPC_MULQ_S_PH:
22664             check_dsp_r2(ctx);
22665             gen_helper_mulq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22666             break;
22667         }
22668         break;
22669 #ifdef TARGET_MIPS64
22670     case OPC_ADDU_OB_DSP:
22671         switch (op2) {
22672         case OPC_MULEQ_S_PW_QHL:
22673             check_dsp(ctx);
22674             gen_helper_muleq_s_pw_qhl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22675             break;
22676         case OPC_MULEQ_S_PW_QHR:
22677             check_dsp(ctx);
22678             gen_helper_muleq_s_pw_qhr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22679             break;
22680         case OPC_MULEU_S_QH_OBL:
22681             check_dsp(ctx);
22682             gen_helper_muleu_s_qh_obl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22683             break;
22684         case OPC_MULEU_S_QH_OBR:
22685             check_dsp(ctx);
22686             gen_helper_muleu_s_qh_obr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22687             break;
22688         case OPC_MULQ_RS_QH:
22689             check_dsp(ctx);
22690             gen_helper_mulq_rs_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22691             break;
22692         }
22693         break;
22694 #endif
22695     }
22696
22697     tcg_temp_free_i32(t0);
22698     tcg_temp_free(v1_t);
22699     tcg_temp_free(v2_t);
22700 }
22701
22702 static void gen_mipsdsp_bitinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
22703                                 int ret, int val)
22704 {
22705     int16_t imm;
22706     TCGv t0;
22707     TCGv val_t;
22708
22709     if (ret == 0) {
22710         /* Treat as NOP. */
22711         return;
22712     }
22713
22714     t0 = tcg_temp_new();
22715     val_t = tcg_temp_new();
22716     gen_load_gpr(val_t, val);
22717
22718     switch (op1) {
22719     case OPC_ABSQ_S_PH_DSP:
22720         switch (op2) {
22721         case OPC_BITREV:
22722             check_dsp(ctx);
22723             gen_helper_bitrev(cpu_gpr[ret], val_t);
22724             break;
22725         case OPC_REPL_QB:
22726             check_dsp(ctx);
22727             {
22728                 target_long result;
22729                 imm = (ctx->opcode >> 16) & 0xFF;
22730                 result = (uint32_t)imm << 24 |
22731                          (uint32_t)imm << 16 |
22732                          (uint32_t)imm << 8  |
22733                          (uint32_t)imm;
22734                 result = (int32_t)result;
22735                 tcg_gen_movi_tl(cpu_gpr[ret], result);
22736             }
22737             break;
22738         case OPC_REPLV_QB:
22739             check_dsp(ctx);
22740             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
22741             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
22742             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22743             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
22744             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22745             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
22746             break;
22747         case OPC_REPL_PH:
22748             check_dsp(ctx);
22749             {
22750                 imm = (ctx->opcode >> 16) & 0x03FF;
22751                 imm = (int16_t)(imm << 6) >> 6;
22752                 tcg_gen_movi_tl(cpu_gpr[ret], \
22753                                 (target_long)((int32_t)imm << 16 | \
22754                                 (uint16_t)imm));
22755             }
22756             break;
22757         case OPC_REPLV_PH:
22758             check_dsp(ctx);
22759             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
22760             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
22761             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22762             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
22763             break;
22764         }
22765         break;
22766 #ifdef TARGET_MIPS64
22767     case OPC_ABSQ_S_QH_DSP:
22768         switch (op2) {
22769         case OPC_REPL_OB:
22770             check_dsp(ctx);
22771             {
22772                 target_long temp;
22773
22774                 imm = (ctx->opcode >> 16) & 0xFF;
22775                 temp = ((uint64_t)imm << 8) | (uint64_t)imm;
22776                 temp = (temp << 16) | temp;
22777                 temp = (temp << 32) | temp;
22778                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
22779                 break;
22780             }
22781         case OPC_REPL_PW:
22782             check_dsp(ctx);
22783             {
22784                 target_long temp;
22785
22786                 imm = (ctx->opcode >> 16) & 0x03FF;
22787                 imm = (int16_t)(imm << 6) >> 6;
22788                 temp = ((target_long)imm << 32) \
22789                        | ((target_long)imm & 0xFFFFFFFF);
22790                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
22791                 break;
22792             }
22793         case OPC_REPL_QH:
22794             check_dsp(ctx);
22795             {
22796                 target_long temp;
22797
22798                 imm = (ctx->opcode >> 16) & 0x03FF;
22799                 imm = (int16_t)(imm << 6) >> 6;
22800
22801                 temp = ((uint64_t)(uint16_t)imm << 48) |
22802                        ((uint64_t)(uint16_t)imm << 32) |
22803                        ((uint64_t)(uint16_t)imm << 16) |
22804                        (uint64_t)(uint16_t)imm;
22805                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
22806                 break;
22807             }
22808         case OPC_REPLV_OB:
22809             check_dsp(ctx);
22810             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
22811             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
22812             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22813             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
22814             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22815             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
22816             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22817             break;
22818         case OPC_REPLV_PW:
22819             check_dsp(ctx);
22820             tcg_gen_ext32u_i64(cpu_gpr[ret], val_t);
22821             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
22822             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22823             break;
22824         case OPC_REPLV_QH:
22825             check_dsp(ctx);
22826             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
22827             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
22828             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22829             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
22830             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22831             break;
22832         }
22833         break;
22834 #endif
22835     }
22836     tcg_temp_free(t0);
22837     tcg_temp_free(val_t);
22838 }
22839
22840 static void gen_mipsdsp_add_cmp_pick(DisasContext *ctx,
22841                                      uint32_t op1, uint32_t op2,
22842                                      int ret, int v1, int v2, int check_ret)
22843 {
22844     TCGv t1;
22845     TCGv v1_t;
22846     TCGv v2_t;
22847
22848     if ((ret == 0) && (check_ret == 1)) {
22849         /* Treat as NOP. */
22850         return;
22851     }
22852
22853     t1 = tcg_temp_new();
22854     v1_t = tcg_temp_new();
22855     v2_t = tcg_temp_new();
22856
22857     gen_load_gpr(v1_t, v1);
22858     gen_load_gpr(v2_t, v2);
22859
22860     switch (op1) {
22861     case OPC_CMPU_EQ_QB_DSP:
22862         switch (op2) {
22863         case OPC_CMPU_EQ_QB:
22864             check_dsp(ctx);
22865             gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
22866             break;
22867         case OPC_CMPU_LT_QB:
22868             check_dsp(ctx);
22869             gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
22870             break;
22871         case OPC_CMPU_LE_QB:
22872             check_dsp(ctx);
22873             gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
22874             break;
22875         case OPC_CMPGU_EQ_QB:
22876             check_dsp(ctx);
22877             gen_helper_cmpgu_eq_qb(cpu_gpr[ret], v1_t, v2_t);
22878             break;
22879         case OPC_CMPGU_LT_QB:
22880             check_dsp(ctx);
22881             gen_helper_cmpgu_lt_qb(cpu_gpr[ret], v1_t, v2_t);
22882             break;
22883         case OPC_CMPGU_LE_QB:
22884             check_dsp(ctx);
22885             gen_helper_cmpgu_le_qb(cpu_gpr[ret], v1_t, v2_t);
22886             break;
22887         case OPC_CMPGDU_EQ_QB:
22888             check_dsp_r2(ctx);
22889             gen_helper_cmpgu_eq_qb(t1, v1_t, v2_t);
22890             tcg_gen_mov_tl(cpu_gpr[ret], t1);
22891             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
22892             tcg_gen_shli_tl(t1, t1, 24);
22893             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
22894             break;
22895         case OPC_CMPGDU_LT_QB:
22896             check_dsp_r2(ctx);
22897             gen_helper_cmpgu_lt_qb(t1, v1_t, v2_t);
22898             tcg_gen_mov_tl(cpu_gpr[ret], t1);
22899             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
22900             tcg_gen_shli_tl(t1, t1, 24);
22901             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
22902             break;
22903         case OPC_CMPGDU_LE_QB:
22904             check_dsp_r2(ctx);
22905             gen_helper_cmpgu_le_qb(t1, v1_t, v2_t);
22906             tcg_gen_mov_tl(cpu_gpr[ret], t1);
22907             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
22908             tcg_gen_shli_tl(t1, t1, 24);
22909             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
22910             break;
22911         case OPC_CMP_EQ_PH:
22912             check_dsp(ctx);
22913             gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
22914             break;
22915         case OPC_CMP_LT_PH:
22916             check_dsp(ctx);
22917             gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
22918             break;
22919         case OPC_CMP_LE_PH:
22920             check_dsp(ctx);
22921             gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
22922             break;
22923         case OPC_PICK_QB:
22924             check_dsp(ctx);
22925             gen_helper_pick_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22926             break;
22927         case OPC_PICK_PH:
22928             check_dsp(ctx);
22929             gen_helper_pick_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22930             break;
22931         case OPC_PACKRL_PH:
22932             check_dsp(ctx);
22933             gen_helper_packrl_ph(cpu_gpr[ret], v1_t, v2_t);
22934             break;
22935         }
22936         break;
22937 #ifdef TARGET_MIPS64
22938     case OPC_CMPU_EQ_OB_DSP:
22939         switch (op2) {
22940         case OPC_CMP_EQ_PW:
22941             check_dsp(ctx);
22942             gen_helper_cmp_eq_pw(v1_t, v2_t, cpu_env);
22943             break;
22944         case OPC_CMP_LT_PW:
22945             check_dsp(ctx);
22946             gen_helper_cmp_lt_pw(v1_t, v2_t, cpu_env);
22947             break;
22948         case OPC_CMP_LE_PW:
22949             check_dsp(ctx);
22950             gen_helper_cmp_le_pw(v1_t, v2_t, cpu_env);
22951             break;
22952         case OPC_CMP_EQ_QH:
22953             check_dsp(ctx);
22954             gen_helper_cmp_eq_qh(v1_t, v2_t, cpu_env);
22955             break;
22956         case OPC_CMP_LT_QH:
22957             check_dsp(ctx);
22958             gen_helper_cmp_lt_qh(v1_t, v2_t, cpu_env);
22959             break;
22960         case OPC_CMP_LE_QH:
22961             check_dsp(ctx);
22962             gen_helper_cmp_le_qh(v1_t, v2_t, cpu_env);
22963             break;
22964         case OPC_CMPGDU_EQ_OB:
22965             check_dsp_r2(ctx);
22966             gen_helper_cmpgdu_eq_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22967             break;
22968         case OPC_CMPGDU_LT_OB:
22969             check_dsp_r2(ctx);
22970             gen_helper_cmpgdu_lt_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22971             break;
22972         case OPC_CMPGDU_LE_OB:
22973             check_dsp_r2(ctx);
22974             gen_helper_cmpgdu_le_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22975             break;
22976         case OPC_CMPGU_EQ_OB:
22977             check_dsp(ctx);
22978             gen_helper_cmpgu_eq_ob(cpu_gpr[ret], v1_t, v2_t);
22979             break;
22980         case OPC_CMPGU_LT_OB:
22981             check_dsp(ctx);
22982             gen_helper_cmpgu_lt_ob(cpu_gpr[ret], v1_t, v2_t);
22983             break;
22984         case OPC_CMPGU_LE_OB:
22985             check_dsp(ctx);
22986             gen_helper_cmpgu_le_ob(cpu_gpr[ret], v1_t, v2_t);
22987             break;
22988         case OPC_CMPU_EQ_OB:
22989             check_dsp(ctx);
22990             gen_helper_cmpu_eq_ob(v1_t, v2_t, cpu_env);
22991             break;
22992         case OPC_CMPU_LT_OB:
22993             check_dsp(ctx);
22994             gen_helper_cmpu_lt_ob(v1_t, v2_t, cpu_env);
22995             break;
22996         case OPC_CMPU_LE_OB:
22997             check_dsp(ctx);
22998             gen_helper_cmpu_le_ob(v1_t, v2_t, cpu_env);
22999             break;
23000         case OPC_PACKRL_PW:
23001             check_dsp(ctx);
23002             gen_helper_packrl_pw(cpu_gpr[ret], v1_t, v2_t);
23003             break;
23004         case OPC_PICK_OB:
23005             check_dsp(ctx);
23006             gen_helper_pick_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
23007             break;
23008         case OPC_PICK_PW:
23009             check_dsp(ctx);
23010             gen_helper_pick_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
23011             break;
23012         case OPC_PICK_QH:
23013             check_dsp(ctx);
23014             gen_helper_pick_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
23015             break;
23016         }
23017         break;
23018 #endif
23019     }
23020
23021     tcg_temp_free(t1);
23022     tcg_temp_free(v1_t);
23023     tcg_temp_free(v2_t);
23024 }
23025
23026 static void gen_mipsdsp_append(CPUMIPSState *env, DisasContext *ctx,
23027                                uint32_t op1, int rt, int rs, int sa)
23028 {
23029     TCGv t0;
23030
23031     check_dsp_r2(ctx);
23032
23033     if (rt == 0) {
23034         /* Treat as NOP. */
23035         return;
23036     }
23037
23038     t0 = tcg_temp_new();
23039     gen_load_gpr(t0, rs);
23040
23041     switch (op1) {
23042     case OPC_APPEND_DSP:
23043         switch (MASK_APPEND(ctx->opcode)) {
23044         case OPC_APPEND:
23045             if (sa != 0) {
23046                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 32 - sa);
23047             }
23048             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
23049             break;
23050         case OPC_PREPEND:
23051             if (sa != 0) {
23052                 tcg_gen_ext32u_tl(cpu_gpr[rt], cpu_gpr[rt]);
23053                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
23054                 tcg_gen_shli_tl(t0, t0, 32 - sa);
23055                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
23056             }
23057             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
23058             break;
23059         case OPC_BALIGN:
23060             sa &= 3;
23061             if (sa != 0 && sa != 2) {
23062                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
23063                 tcg_gen_ext32u_tl(t0, t0);
23064                 tcg_gen_shri_tl(t0, t0, 8 * (4 - sa));
23065                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
23066             }
23067             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
23068             break;
23069         default:            /* Invalid */
23070             MIPS_INVAL("MASK APPEND");
23071             generate_exception_end(ctx, EXCP_RI);
23072             break;
23073         }
23074         break;
23075 #ifdef TARGET_MIPS64
23076     case OPC_DAPPEND_DSP:
23077         switch (MASK_DAPPEND(ctx->opcode)) {
23078         case OPC_DAPPEND:
23079             if (sa != 0) {
23080                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 64 - sa);
23081             }
23082             break;
23083         case OPC_PREPENDD:
23084             tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], 0x20 | sa);
23085             tcg_gen_shli_tl(t0, t0, 64 - (0x20 | sa));
23086             tcg_gen_or_tl(cpu_gpr[rt], t0, t0);
23087             break;
23088         case OPC_PREPENDW:
23089             if (sa != 0) {
23090                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
23091                 tcg_gen_shli_tl(t0, t0, 64 - sa);
23092                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
23093             }
23094             break;
23095         case OPC_DBALIGN:
23096             sa &= 7;
23097             if (sa != 0 && sa != 2 && sa != 4) {
23098                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
23099                 tcg_gen_shri_tl(t0, t0, 8 * (8 - sa));
23100                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
23101             }
23102             break;
23103         default:            /* Invalid */
23104             MIPS_INVAL("MASK DAPPEND");
23105             generate_exception_end(ctx, EXCP_RI);
23106             break;
23107         }
23108         break;
23109 #endif
23110     }
23111     tcg_temp_free(t0);
23112 }
23113
23114 static void gen_mipsdsp_accinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
23115                                 int ret, int v1, int v2, int check_ret)
23116
23117 {
23118     TCGv t0;
23119     TCGv t1;
23120     TCGv v1_t;
23121     TCGv v2_t;
23122     int16_t imm;
23123
23124     if ((ret == 0) && (check_ret == 1)) {
23125         /* Treat as NOP. */
23126         return;
23127     }
23128
23129     t0 = tcg_temp_new();
23130     t1 = tcg_temp_new();
23131     v1_t = tcg_temp_new();
23132     v2_t = tcg_temp_new();
23133
23134     gen_load_gpr(v1_t, v1);
23135     gen_load_gpr(v2_t, v2);
23136
23137     switch (op1) {
23138     case OPC_EXTR_W_DSP:
23139         check_dsp(ctx);
23140         switch (op2) {
23141         case OPC_EXTR_W:
23142             tcg_gen_movi_tl(t0, v2);
23143             tcg_gen_movi_tl(t1, v1);
23144             gen_helper_extr_w(cpu_gpr[ret], t0, t1, cpu_env);
23145             break;
23146         case OPC_EXTR_R_W:
23147             tcg_gen_movi_tl(t0, v2);
23148             tcg_gen_movi_tl(t1, v1);
23149             gen_helper_extr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
23150             break;
23151         case OPC_EXTR_RS_W:
23152             tcg_gen_movi_tl(t0, v2);
23153             tcg_gen_movi_tl(t1, v1);
23154             gen_helper_extr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
23155             break;
23156         case OPC_EXTR_S_H:
23157             tcg_gen_movi_tl(t0, v2);
23158             tcg_gen_movi_tl(t1, v1);
23159             gen_helper_extr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
23160             break;
23161         case OPC_EXTRV_S_H:
23162             tcg_gen_movi_tl(t0, v2);
23163             gen_helper_extr_s_h(cpu_gpr[ret], t0, v1_t, cpu_env);
23164             break;
23165         case OPC_EXTRV_W:
23166             tcg_gen_movi_tl(t0, v2);
23167             gen_helper_extr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23168             break;
23169         case OPC_EXTRV_R_W:
23170             tcg_gen_movi_tl(t0, v2);
23171             gen_helper_extr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23172             break;
23173         case OPC_EXTRV_RS_W:
23174             tcg_gen_movi_tl(t0, v2);
23175             gen_helper_extr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23176             break;
23177         case OPC_EXTP:
23178             tcg_gen_movi_tl(t0, v2);
23179             tcg_gen_movi_tl(t1, v1);
23180             gen_helper_extp(cpu_gpr[ret], t0, t1, cpu_env);
23181             break;
23182         case OPC_EXTPV:
23183             tcg_gen_movi_tl(t0, v2);
23184             gen_helper_extp(cpu_gpr[ret], t0, v1_t, cpu_env);
23185             break;
23186         case OPC_EXTPDP:
23187             tcg_gen_movi_tl(t0, v2);
23188             tcg_gen_movi_tl(t1, v1);
23189             gen_helper_extpdp(cpu_gpr[ret], t0, t1, cpu_env);
23190             break;
23191         case OPC_EXTPDPV:
23192             tcg_gen_movi_tl(t0, v2);
23193             gen_helper_extpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
23194             break;
23195         case OPC_SHILO:
23196             imm = (ctx->opcode >> 20) & 0x3F;
23197             tcg_gen_movi_tl(t0, ret);
23198             tcg_gen_movi_tl(t1, imm);
23199             gen_helper_shilo(t0, t1, cpu_env);
23200             break;
23201         case OPC_SHILOV:
23202             tcg_gen_movi_tl(t0, ret);
23203             gen_helper_shilo(t0, v1_t, cpu_env);
23204             break;
23205         case OPC_MTHLIP:
23206             tcg_gen_movi_tl(t0, ret);
23207             gen_helper_mthlip(t0, v1_t, cpu_env);
23208             break;
23209         case OPC_WRDSP:
23210             imm = (ctx->opcode >> 11) & 0x3FF;
23211             tcg_gen_movi_tl(t0, imm);
23212             gen_helper_wrdsp(v1_t, t0, cpu_env);
23213             break;
23214         case OPC_RDDSP:
23215             imm = (ctx->opcode >> 16) & 0x03FF;
23216             tcg_gen_movi_tl(t0, imm);
23217             gen_helper_rddsp(cpu_gpr[ret], t0, cpu_env);
23218             break;
23219         }
23220         break;
23221 #ifdef TARGET_MIPS64
23222     case OPC_DEXTR_W_DSP:
23223         check_dsp(ctx);
23224         switch (op2) {
23225         case OPC_DMTHLIP:
23226             tcg_gen_movi_tl(t0, ret);
23227             gen_helper_dmthlip(v1_t, t0, cpu_env);
23228             break;
23229         case OPC_DSHILO:
23230             {
23231                 int shift = (ctx->opcode >> 19) & 0x7F;
23232                 int ac = (ctx->opcode >> 11) & 0x03;
23233                 tcg_gen_movi_tl(t0, shift);
23234                 tcg_gen_movi_tl(t1, ac);
23235                 gen_helper_dshilo(t0, t1, cpu_env);
23236                 break;
23237             }
23238         case OPC_DSHILOV:
23239             {
23240                 int ac = (ctx->opcode >> 11) & 0x03;
23241                 tcg_gen_movi_tl(t0, ac);
23242                 gen_helper_dshilo(v1_t, t0, cpu_env);
23243                 break;
23244             }
23245         case OPC_DEXTP:
23246             tcg_gen_movi_tl(t0, v2);
23247             tcg_gen_movi_tl(t1, v1);
23248
23249             gen_helper_dextp(cpu_gpr[ret], t0, t1, cpu_env);
23250             break;
23251         case OPC_DEXTPV:
23252             tcg_gen_movi_tl(t0, v2);
23253             gen_helper_dextp(cpu_gpr[ret], t0, v1_t, cpu_env);
23254             break;
23255         case OPC_DEXTPDP:
23256             tcg_gen_movi_tl(t0, v2);
23257             tcg_gen_movi_tl(t1, v1);
23258             gen_helper_dextpdp(cpu_gpr[ret], t0, t1, cpu_env);
23259             break;
23260         case OPC_DEXTPDPV:
23261             tcg_gen_movi_tl(t0, v2);
23262             gen_helper_dextpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
23263             break;
23264         case OPC_DEXTR_L:
23265             tcg_gen_movi_tl(t0, v2);
23266             tcg_gen_movi_tl(t1, v1);
23267             gen_helper_dextr_l(cpu_gpr[ret], t0, t1, cpu_env);
23268             break;
23269         case OPC_DEXTR_R_L:
23270             tcg_gen_movi_tl(t0, v2);
23271             tcg_gen_movi_tl(t1, v1);
23272             gen_helper_dextr_r_l(cpu_gpr[ret], t0, t1, cpu_env);
23273             break;
23274         case OPC_DEXTR_RS_L:
23275             tcg_gen_movi_tl(t0, v2);
23276             tcg_gen_movi_tl(t1, v1);
23277             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, t1, cpu_env);
23278             break;
23279         case OPC_DEXTR_W:
23280             tcg_gen_movi_tl(t0, v2);
23281             tcg_gen_movi_tl(t1, v1);
23282             gen_helper_dextr_w(cpu_gpr[ret], t0, t1, cpu_env);
23283             break;
23284         case OPC_DEXTR_R_W:
23285             tcg_gen_movi_tl(t0, v2);
23286             tcg_gen_movi_tl(t1, v1);
23287             gen_helper_dextr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
23288             break;
23289         case OPC_DEXTR_RS_W:
23290             tcg_gen_movi_tl(t0, v2);
23291             tcg_gen_movi_tl(t1, v1);
23292             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
23293             break;
23294         case OPC_DEXTR_S_H:
23295             tcg_gen_movi_tl(t0, v2);
23296             tcg_gen_movi_tl(t1, v1);
23297             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
23298             break;
23299         case OPC_DEXTRV_S_H:
23300             tcg_gen_movi_tl(t0, v2);
23301             tcg_gen_movi_tl(t1, v1);
23302             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
23303             break;
23304         case OPC_DEXTRV_L:
23305             tcg_gen_movi_tl(t0, v2);
23306             gen_helper_dextr_l(cpu_gpr[ret], t0, v1_t, cpu_env);
23307             break;
23308         case OPC_DEXTRV_R_L:
23309             tcg_gen_movi_tl(t0, v2);
23310             gen_helper_dextr_r_l(cpu_gpr[ret], t0, v1_t, cpu_env);
23311             break;
23312         case OPC_DEXTRV_RS_L:
23313             tcg_gen_movi_tl(t0, v2);
23314             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, v1_t, cpu_env);
23315             break;
23316         case OPC_DEXTRV_W:
23317             tcg_gen_movi_tl(t0, v2);
23318             gen_helper_dextr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23319             break;
23320         case OPC_DEXTRV_R_W:
23321             tcg_gen_movi_tl(t0, v2);
23322             gen_helper_dextr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23323             break;
23324         case OPC_DEXTRV_RS_W:
23325             tcg_gen_movi_tl(t0, v2);
23326             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23327             break;
23328         }
23329         break;
23330 #endif
23331     }
23332
23333     tcg_temp_free(t0);
23334     tcg_temp_free(t1);
23335     tcg_temp_free(v1_t);
23336     tcg_temp_free(v2_t);
23337 }
23338
23339 /* End MIPSDSP functions. */
23340
23341 static void decode_opc_special_r6(CPUMIPSState *env, DisasContext *ctx)
23342 {
23343     int rs, rt, rd, sa;
23344     uint32_t op1, op2;
23345
23346     rs = (ctx->opcode >> 21) & 0x1f;
23347     rt = (ctx->opcode >> 16) & 0x1f;
23348     rd = (ctx->opcode >> 11) & 0x1f;
23349     sa = (ctx->opcode >> 6) & 0x1f;
23350
23351     op1 = MASK_SPECIAL(ctx->opcode);
23352     switch (op1) {
23353     case OPC_LSA:
23354         gen_lsa(ctx, op1, rd, rs, rt, extract32(ctx->opcode, 6, 2));
23355         break;
23356     case OPC_MULT:
23357     case OPC_MULTU:
23358     case OPC_DIV:
23359     case OPC_DIVU:
23360         op2 = MASK_R6_MULDIV(ctx->opcode);
23361         switch (op2) {
23362         case R6_OPC_MUL:
23363         case R6_OPC_MUH:
23364         case R6_OPC_MULU:
23365         case R6_OPC_MUHU:
23366         case R6_OPC_DIV:
23367         case R6_OPC_MOD:
23368         case R6_OPC_DIVU:
23369         case R6_OPC_MODU:
23370             gen_r6_muldiv(ctx, op2, rd, rs, rt);
23371             break;
23372         default:
23373             MIPS_INVAL("special_r6 muldiv");
23374             generate_exception_end(ctx, EXCP_RI);
23375             break;
23376         }
23377         break;
23378     case OPC_SELEQZ:
23379     case OPC_SELNEZ:
23380         gen_cond_move(ctx, op1, rd, rs, rt);
23381         break;
23382     case R6_OPC_CLO:
23383     case R6_OPC_CLZ:
23384         if (rt == 0 && sa == 1) {
23385             /* Major opcode and function field is shared with preR6 MFHI/MTHI.
23386                We need additionally to check other fields */
23387             gen_cl(ctx, op1, rd, rs);
23388         } else {
23389             generate_exception_end(ctx, EXCP_RI);
23390         }
23391         break;
23392     case R6_OPC_SDBBP:
23393         if (is_uhi(extract32(ctx->opcode, 6, 20))) {
23394             gen_helper_do_semihosting(cpu_env);
23395         } else {
23396             if (ctx->hflags & MIPS_HFLAG_SBRI) {
23397                 generate_exception_end(ctx, EXCP_RI);
23398             } else {
23399                 generate_exception_end(ctx, EXCP_DBp);
23400             }
23401         }
23402         break;
23403 #if defined(TARGET_MIPS64)
23404     case OPC_DLSA:
23405         check_mips_64(ctx);
23406         gen_lsa(ctx, op1, rd, rs, rt, extract32(ctx->opcode, 6, 2));
23407         break;
23408     case R6_OPC_DCLO:
23409     case R6_OPC_DCLZ:
23410         if (rt == 0 && sa == 1) {
23411             /* Major opcode and function field is shared with preR6 MFHI/MTHI.
23412                We need additionally to check other fields */
23413             check_mips_64(ctx);
23414             gen_cl(ctx, op1, rd, rs);
23415         } else {
23416             generate_exception_end(ctx, EXCP_RI);
23417         }
23418         break;
23419     case OPC_DMULT:
23420     case OPC_DMULTU:
23421     case OPC_DDIV:
23422     case OPC_DDIVU:
23423
23424         op2 = MASK_R6_MULDIV(ctx->opcode);
23425         switch (op2) {
23426         case R6_OPC_DMUL:
23427         case R6_OPC_DMUH:
23428         case R6_OPC_DMULU:
23429         case R6_OPC_DMUHU:
23430         case R6_OPC_DDIV:
23431         case R6_OPC_DMOD:
23432         case R6_OPC_DDIVU:
23433         case R6_OPC_DMODU:
23434             check_mips_64(ctx);
23435             gen_r6_muldiv(ctx, op2, rd, rs, rt);
23436             break;
23437         default:
23438             MIPS_INVAL("special_r6 muldiv");
23439             generate_exception_end(ctx, EXCP_RI);
23440             break;
23441         }
23442         break;
23443 #endif
23444     default:            /* Invalid */
23445         MIPS_INVAL("special_r6");
23446         generate_exception_end(ctx, EXCP_RI);
23447         break;
23448     }
23449 }
23450
23451 static void decode_opc_special_legacy(CPUMIPSState *env, DisasContext *ctx)
23452 {
23453     int rs, rt, rd, sa;
23454     uint32_t op1;
23455
23456     rs = (ctx->opcode >> 21) & 0x1f;
23457     rt = (ctx->opcode >> 16) & 0x1f;
23458     rd = (ctx->opcode >> 11) & 0x1f;
23459     sa = (ctx->opcode >> 6) & 0x1f;
23460
23461     op1 = MASK_SPECIAL(ctx->opcode);
23462     switch (op1) {
23463     case OPC_MOVN:         /* Conditional move */
23464     case OPC_MOVZ:
23465         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32 |
23466                    INSN_LOONGSON2E | INSN_LOONGSON2F);
23467         gen_cond_move(ctx, op1, rd, rs, rt);
23468         break;
23469     case OPC_MFHI:          /* Move from HI/LO */
23470     case OPC_MFLO:
23471         gen_HILO(ctx, op1, rs & 3, rd);
23472         break;
23473     case OPC_MTHI:
23474     case OPC_MTLO:          /* Move to HI/LO */
23475         gen_HILO(ctx, op1, rd & 3, rs);
23476         break;
23477     case OPC_MOVCI:
23478         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
23479         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
23480             check_cp1_enabled(ctx);
23481             gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7,
23482                       (ctx->opcode >> 16) & 1);
23483         } else {
23484             generate_exception_err(ctx, EXCP_CpU, 1);
23485         }
23486         break;
23487     case OPC_MULT:
23488     case OPC_MULTU:
23489         if (sa) {
23490             check_insn(ctx, INSN_VR54XX);
23491             op1 = MASK_MUL_VR54XX(ctx->opcode);
23492             gen_mul_vr54xx(ctx, op1, rd, rs, rt);
23493         } else {
23494             gen_muldiv(ctx, op1, rd & 3, rs, rt);
23495         }
23496         break;
23497     case OPC_DIV:
23498     case OPC_DIVU:
23499         gen_muldiv(ctx, op1, 0, rs, rt);
23500         break;
23501 #if defined(TARGET_MIPS64)
23502     case OPC_DMULT:
23503     case OPC_DMULTU:
23504     case OPC_DDIV:
23505     case OPC_DDIVU:
23506         check_insn(ctx, ISA_MIPS3);
23507         check_mips_64(ctx);
23508         gen_muldiv(ctx, op1, 0, rs, rt);
23509         break;
23510 #endif
23511     case OPC_JR:
23512         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
23513         break;
23514     case OPC_SPIM:
23515 #ifdef MIPS_STRICT_STANDARD
23516         MIPS_INVAL("SPIM");
23517         generate_exception_end(ctx, EXCP_RI);
23518 #else
23519         /* Implemented as RI exception for now. */
23520         MIPS_INVAL("spim (unofficial)");
23521         generate_exception_end(ctx, EXCP_RI);
23522 #endif
23523         break;
23524     default:            /* Invalid */
23525         MIPS_INVAL("special_legacy");
23526         generate_exception_end(ctx, EXCP_RI);
23527         break;
23528     }
23529 }
23530
23531 static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx)
23532 {
23533     int rs, rt, rd, sa;
23534     uint32_t op1;
23535
23536     rs = (ctx->opcode >> 21) & 0x1f;
23537     rt = (ctx->opcode >> 16) & 0x1f;
23538     rd = (ctx->opcode >> 11) & 0x1f;
23539     sa = (ctx->opcode >> 6) & 0x1f;
23540
23541     op1 = MASK_SPECIAL(ctx->opcode);
23542     switch (op1) {
23543     case OPC_SLL:          /* Shift with immediate */
23544         if (sa == 5 && rd == 0 &&
23545             rs == 0 && rt == 0) { /* PAUSE */
23546             if ((ctx->insn_flags & ISA_MIPS32R6) &&
23547                 (ctx->hflags & MIPS_HFLAG_BMASK)) {
23548                 generate_exception_end(ctx, EXCP_RI);
23549                 break;
23550             }
23551         }
23552         /* Fallthrough */
23553     case OPC_SRA:
23554         gen_shift_imm(ctx, op1, rd, rt, sa);
23555         break;
23556     case OPC_SRL:
23557         switch ((ctx->opcode >> 21) & 0x1f) {
23558         case 1:
23559             /* rotr is decoded as srl on non-R2 CPUs */
23560             if (ctx->insn_flags & ISA_MIPS32R2) {
23561                 op1 = OPC_ROTR;
23562             }
23563             /* Fallthrough */
23564         case 0:
23565             gen_shift_imm(ctx, op1, rd, rt, sa);
23566             break;
23567         default:
23568             generate_exception_end(ctx, EXCP_RI);
23569             break;
23570         }
23571         break;
23572     case OPC_ADD:
23573     case OPC_ADDU:
23574     case OPC_SUB:
23575     case OPC_SUBU:
23576         gen_arith(ctx, op1, rd, rs, rt);
23577         break;
23578     case OPC_SLLV:         /* Shifts */
23579     case OPC_SRAV:
23580         gen_shift(ctx, op1, rd, rs, rt);
23581         break;
23582     case OPC_SRLV:
23583         switch ((ctx->opcode >> 6) & 0x1f) {
23584         case 1:
23585             /* rotrv is decoded as srlv on non-R2 CPUs */
23586             if (ctx->insn_flags & ISA_MIPS32R2) {
23587                 op1 = OPC_ROTRV;
23588             }
23589             /* Fallthrough */
23590         case 0:
23591             gen_shift(ctx, op1, rd, rs, rt);
23592             break;
23593         default:
23594             generate_exception_end(ctx, EXCP_RI);
23595             break;
23596         }
23597         break;
23598     case OPC_SLT:          /* Set on less than */
23599     case OPC_SLTU:
23600         gen_slt(ctx, op1, rd, rs, rt);
23601         break;
23602     case OPC_AND:          /* Logic*/
23603     case OPC_OR:
23604     case OPC_NOR:
23605     case OPC_XOR:
23606         gen_logic(ctx, op1, rd, rs, rt);
23607         break;
23608     case OPC_JALR:
23609         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
23610         break;
23611     case OPC_TGE: /* Traps */
23612     case OPC_TGEU:
23613     case OPC_TLT:
23614     case OPC_TLTU:
23615     case OPC_TEQ:
23616     case OPC_TNE:
23617         check_insn(ctx, ISA_MIPS2);
23618         gen_trap(ctx, op1, rs, rt, -1);
23619         break;
23620     case OPC_LSA: /* OPC_PMON */
23621         if ((ctx->insn_flags & ISA_MIPS32R6) ||
23622             (env->CP0_Config3 & (1 << CP0C3_MSAP))) {
23623             decode_opc_special_r6(env, ctx);
23624         } else {
23625             /* Pmon entry point, also R4010 selsl */
23626 #ifdef MIPS_STRICT_STANDARD
23627             MIPS_INVAL("PMON / selsl");
23628             generate_exception_end(ctx, EXCP_RI);
23629 #else
23630             gen_helper_0e0i(pmon, sa);
23631 #endif
23632         }
23633         break;
23634     case OPC_SYSCALL:
23635         generate_exception_end(ctx, EXCP_SYSCALL);
23636         break;
23637     case OPC_BREAK:
23638         generate_exception_end(ctx, EXCP_BREAK);
23639         break;
23640     case OPC_SYNC:
23641         check_insn(ctx, ISA_MIPS2);
23642         gen_sync(extract32(ctx->opcode, 6, 5));
23643         break;
23644
23645 #if defined(TARGET_MIPS64)
23646         /* MIPS64 specific opcodes */
23647     case OPC_DSLL:
23648     case OPC_DSRA:
23649     case OPC_DSLL32:
23650     case OPC_DSRA32:
23651         check_insn(ctx, ISA_MIPS3);
23652         check_mips_64(ctx);
23653         gen_shift_imm(ctx, op1, rd, rt, sa);
23654         break;
23655     case OPC_DSRL:
23656         switch ((ctx->opcode >> 21) & 0x1f) {
23657         case 1:
23658             /* drotr is decoded as dsrl on non-R2 CPUs */
23659             if (ctx->insn_flags & ISA_MIPS32R2) {
23660                 op1 = OPC_DROTR;
23661             }
23662             /* Fallthrough */
23663         case 0:
23664             check_insn(ctx, ISA_MIPS3);
23665             check_mips_64(ctx);
23666             gen_shift_imm(ctx, op1, rd, rt, sa);
23667             break;
23668         default:
23669             generate_exception_end(ctx, EXCP_RI);
23670             break;
23671         }
23672         break;
23673     case OPC_DSRL32:
23674         switch ((ctx->opcode >> 21) & 0x1f) {
23675         case 1:
23676             /* drotr32 is decoded as dsrl32 on non-R2 CPUs */
23677             if (ctx->insn_flags & ISA_MIPS32R2) {
23678                 op1 = OPC_DROTR32;
23679             }
23680             /* Fallthrough */
23681         case 0:
23682             check_insn(ctx, ISA_MIPS3);
23683             check_mips_64(ctx);
23684             gen_shift_imm(ctx, op1, rd, rt, sa);
23685             break;
23686         default:
23687             generate_exception_end(ctx, EXCP_RI);
23688             break;
23689         }
23690         break;
23691     case OPC_DADD:
23692     case OPC_DADDU:
23693     case OPC_DSUB:
23694     case OPC_DSUBU:
23695         check_insn(ctx, ISA_MIPS3);
23696         check_mips_64(ctx);
23697         gen_arith(ctx, op1, rd, rs, rt);
23698         break;
23699     case OPC_DSLLV:
23700     case OPC_DSRAV:
23701         check_insn(ctx, ISA_MIPS3);
23702         check_mips_64(ctx);
23703         gen_shift(ctx, op1, rd, rs, rt);
23704         break;
23705     case OPC_DSRLV:
23706         switch ((ctx->opcode >> 6) & 0x1f) {
23707         case 1:
23708             /* drotrv is decoded as dsrlv on non-R2 CPUs */
23709             if (ctx->insn_flags & ISA_MIPS32R2) {
23710                 op1 = OPC_DROTRV;
23711             }
23712             /* Fallthrough */
23713         case 0:
23714             check_insn(ctx, ISA_MIPS3);
23715             check_mips_64(ctx);
23716             gen_shift(ctx, op1, rd, rs, rt);
23717             break;
23718         default:
23719             generate_exception_end(ctx, EXCP_RI);
23720             break;
23721         }
23722         break;
23723     case OPC_DLSA:
23724         if ((ctx->insn_flags & ISA_MIPS32R6) ||
23725             (env->CP0_Config3 & (1 << CP0C3_MSAP))) {
23726             decode_opc_special_r6(env, ctx);
23727         }
23728         break;
23729 #endif
23730     default:
23731         if (ctx->insn_flags & ISA_MIPS32R6) {
23732             decode_opc_special_r6(env, ctx);
23733         } else {
23734             decode_opc_special_legacy(env, ctx);
23735         }
23736     }
23737 }
23738
23739 static void decode_opc_special2_legacy(CPUMIPSState *env, DisasContext *ctx)
23740 {
23741     int rs, rt, rd;
23742     uint32_t op1;
23743
23744     check_insn_opc_removed(ctx, ISA_MIPS32R6);
23745
23746     rs = (ctx->opcode >> 21) & 0x1f;
23747     rt = (ctx->opcode >> 16) & 0x1f;
23748     rd = (ctx->opcode >> 11) & 0x1f;
23749
23750     op1 = MASK_SPECIAL2(ctx->opcode);
23751     switch (op1) {
23752     case OPC_MADD: /* Multiply and add/sub */
23753     case OPC_MADDU:
23754     case OPC_MSUB:
23755     case OPC_MSUBU:
23756         check_insn(ctx, ISA_MIPS32);
23757         gen_muldiv(ctx, op1, rd & 3, rs, rt);
23758         break;
23759     case OPC_MUL:
23760         gen_arith(ctx, op1, rd, rs, rt);
23761         break;
23762     case OPC_DIV_G_2F:
23763     case OPC_DIVU_G_2F:
23764     case OPC_MULT_G_2F:
23765     case OPC_MULTU_G_2F:
23766     case OPC_MOD_G_2F:
23767     case OPC_MODU_G_2F:
23768         check_insn(ctx, INSN_LOONGSON2F);
23769         gen_loongson_integer(ctx, op1, rd, rs, rt);
23770         break;
23771     case OPC_CLO:
23772     case OPC_CLZ:
23773         check_insn(ctx, ISA_MIPS32);
23774         gen_cl(ctx, op1, rd, rs);
23775         break;
23776     case OPC_SDBBP:
23777         if (is_uhi(extract32(ctx->opcode, 6, 20))) {
23778             gen_helper_do_semihosting(cpu_env);
23779         } else {
23780             /* XXX: not clear which exception should be raised
23781              *      when in debug mode...
23782              */
23783             check_insn(ctx, ISA_MIPS32);
23784             generate_exception_end(ctx, EXCP_DBp);
23785         }
23786         break;
23787 #if defined(TARGET_MIPS64)
23788     case OPC_DCLO:
23789     case OPC_DCLZ:
23790         check_insn(ctx, ISA_MIPS64);
23791         check_mips_64(ctx);
23792         gen_cl(ctx, op1, rd, rs);
23793         break;
23794     case OPC_DMULT_G_2F:
23795     case OPC_DMULTU_G_2F:
23796     case OPC_DDIV_G_2F:
23797     case OPC_DDIVU_G_2F:
23798     case OPC_DMOD_G_2F:
23799     case OPC_DMODU_G_2F:
23800         check_insn(ctx, INSN_LOONGSON2F);
23801         gen_loongson_integer(ctx, op1, rd, rs, rt);
23802         break;
23803 #endif
23804     default:            /* Invalid */
23805         MIPS_INVAL("special2_legacy");
23806         generate_exception_end(ctx, EXCP_RI);
23807         break;
23808     }
23809 }
23810
23811 static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx)
23812 {
23813     int rs, rt, rd, sa;
23814     uint32_t op1, op2;
23815     int16_t imm;
23816
23817     rs = (ctx->opcode >> 21) & 0x1f;
23818     rt = (ctx->opcode >> 16) & 0x1f;
23819     rd = (ctx->opcode >> 11) & 0x1f;
23820     sa = (ctx->opcode >> 6) & 0x1f;
23821     imm = (int16_t)ctx->opcode >> 7;
23822
23823     op1 = MASK_SPECIAL3(ctx->opcode);
23824     switch (op1) {
23825     case R6_OPC_PREF:
23826         if (rt >= 24) {
23827             /* hint codes 24-31 are reserved and signal RI */
23828             generate_exception_end(ctx, EXCP_RI);
23829         }
23830         /* Treat as NOP. */
23831         break;
23832     case R6_OPC_CACHE:
23833         check_cp0_enabled(ctx);
23834         if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
23835             gen_cache_operation(ctx, rt, rs, imm);
23836         }
23837         break;
23838     case R6_OPC_SC:
23839         gen_st_cond(ctx, op1, rt, rs, imm);
23840         break;
23841     case R6_OPC_LL:
23842         gen_ld(ctx, op1, rt, rs, imm);
23843         break;
23844     case OPC_BSHFL:
23845         {
23846             if (rd == 0) {
23847                 /* Treat as NOP. */
23848                 break;
23849             }
23850             op2 = MASK_BSHFL(ctx->opcode);
23851             switch (op2) {
23852             case OPC_ALIGN:
23853             case OPC_ALIGN_END:
23854                 gen_align(ctx, 32, rd, rs, rt, sa & 3);
23855                 break;
23856             case OPC_BITSWAP:
23857                 gen_bitswap(ctx, op2, rd, rt);
23858                 break;
23859             }
23860         }
23861         break;
23862 #if defined(TARGET_MIPS64)
23863     case R6_OPC_SCD:
23864         gen_st_cond(ctx, op1, rt, rs, imm);
23865         break;
23866     case R6_OPC_LLD:
23867         gen_ld(ctx, op1, rt, rs, imm);
23868         break;
23869     case OPC_DBSHFL:
23870         check_mips_64(ctx);
23871         {
23872             if (rd == 0) {
23873                 /* Treat as NOP. */
23874                 break;
23875             }
23876             op2 = MASK_DBSHFL(ctx->opcode);
23877             switch (op2) {
23878             case OPC_DALIGN:
23879             case OPC_DALIGN_END:
23880                 gen_align(ctx, 64, rd, rs, rt, sa & 7);
23881                 break;
23882             case OPC_DBITSWAP:
23883                 gen_bitswap(ctx, op2, rd, rt);
23884                 break;
23885             }
23886
23887         }
23888         break;
23889 #endif
23890     default:            /* Invalid */
23891         MIPS_INVAL("special3_r6");
23892         generate_exception_end(ctx, EXCP_RI);
23893         break;
23894     }
23895 }
23896
23897 static void decode_opc_special3_legacy(CPUMIPSState *env, DisasContext *ctx)
23898 {
23899     int rs, rt, rd;
23900     uint32_t op1, op2;
23901
23902     rs = (ctx->opcode >> 21) & 0x1f;
23903     rt = (ctx->opcode >> 16) & 0x1f;
23904     rd = (ctx->opcode >> 11) & 0x1f;
23905
23906     op1 = MASK_SPECIAL3(ctx->opcode);
23907     switch (op1) {
23908     case OPC_DIV_G_2E:
23909     case OPC_DIVU_G_2E:
23910     case OPC_MOD_G_2E:
23911     case OPC_MODU_G_2E:
23912     case OPC_MULT_G_2E:
23913     case OPC_MULTU_G_2E:
23914         /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
23915          * the same mask and op1. */
23916         if ((ctx->insn_flags & ASE_DSP_R2) && (op1 == OPC_MULT_G_2E)) {
23917             op2 = MASK_ADDUH_QB(ctx->opcode);
23918             switch (op2) {
23919             case OPC_ADDUH_QB:
23920             case OPC_ADDUH_R_QB:
23921             case OPC_ADDQH_PH:
23922             case OPC_ADDQH_R_PH:
23923             case OPC_ADDQH_W:
23924             case OPC_ADDQH_R_W:
23925             case OPC_SUBUH_QB:
23926             case OPC_SUBUH_R_QB:
23927             case OPC_SUBQH_PH:
23928             case OPC_SUBQH_R_PH:
23929             case OPC_SUBQH_W:
23930             case OPC_SUBQH_R_W:
23931                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
23932                 break;
23933             case OPC_MUL_PH:
23934             case OPC_MUL_S_PH:
23935             case OPC_MULQ_S_W:
23936             case OPC_MULQ_RS_W:
23937                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
23938                 break;
23939             default:
23940                 MIPS_INVAL("MASK ADDUH.QB");
23941                 generate_exception_end(ctx, EXCP_RI);
23942                 break;
23943             }
23944         } else if (ctx->insn_flags & INSN_LOONGSON2E) {
23945             gen_loongson_integer(ctx, op1, rd, rs, rt);
23946         } else {
23947             generate_exception_end(ctx, EXCP_RI);
23948         }
23949         break;
23950     case OPC_LX_DSP:
23951         op2 = MASK_LX(ctx->opcode);
23952         switch (op2) {
23953 #if defined(TARGET_MIPS64)
23954         case OPC_LDX:
23955 #endif
23956         case OPC_LBUX:
23957         case OPC_LHX:
23958         case OPC_LWX:
23959             gen_mipsdsp_ld(ctx, op2, rd, rs, rt);
23960             break;
23961         default:            /* Invalid */
23962             MIPS_INVAL("MASK LX");
23963             generate_exception_end(ctx, EXCP_RI);
23964             break;
23965         }
23966         break;
23967     case OPC_ABSQ_S_PH_DSP:
23968         op2 = MASK_ABSQ_S_PH(ctx->opcode);
23969         switch (op2) {
23970         case OPC_ABSQ_S_QB:
23971         case OPC_ABSQ_S_PH:
23972         case OPC_ABSQ_S_W:
23973         case OPC_PRECEQ_W_PHL:
23974         case OPC_PRECEQ_W_PHR:
23975         case OPC_PRECEQU_PH_QBL:
23976         case OPC_PRECEQU_PH_QBR:
23977         case OPC_PRECEQU_PH_QBLA:
23978         case OPC_PRECEQU_PH_QBRA:
23979         case OPC_PRECEU_PH_QBL:
23980         case OPC_PRECEU_PH_QBR:
23981         case OPC_PRECEU_PH_QBLA:
23982         case OPC_PRECEU_PH_QBRA:
23983             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
23984             break;
23985         case OPC_BITREV:
23986         case OPC_REPL_QB:
23987         case OPC_REPLV_QB:
23988         case OPC_REPL_PH:
23989         case OPC_REPLV_PH:
23990             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
23991             break;
23992         default:
23993             MIPS_INVAL("MASK ABSQ_S.PH");
23994             generate_exception_end(ctx, EXCP_RI);
23995             break;
23996         }
23997         break;
23998     case OPC_ADDU_QB_DSP:
23999         op2 = MASK_ADDU_QB(ctx->opcode);
24000         switch (op2) {
24001         case OPC_ADDQ_PH:
24002         case OPC_ADDQ_S_PH:
24003         case OPC_ADDQ_S_W:
24004         case OPC_ADDU_QB:
24005         case OPC_ADDU_S_QB:
24006         case OPC_ADDU_PH:
24007         case OPC_ADDU_S_PH:
24008         case OPC_SUBQ_PH:
24009         case OPC_SUBQ_S_PH:
24010         case OPC_SUBQ_S_W:
24011         case OPC_SUBU_QB:
24012         case OPC_SUBU_S_QB:
24013         case OPC_SUBU_PH:
24014         case OPC_SUBU_S_PH:
24015         case OPC_ADDSC:
24016         case OPC_ADDWC:
24017         case OPC_MODSUB:
24018         case OPC_RADDU_W_QB:
24019             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24020             break;
24021         case OPC_MULEU_S_PH_QBL:
24022         case OPC_MULEU_S_PH_QBR:
24023         case OPC_MULQ_RS_PH:
24024         case OPC_MULEQ_S_W_PHL:
24025         case OPC_MULEQ_S_W_PHR:
24026         case OPC_MULQ_S_PH:
24027             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
24028             break;
24029         default:            /* Invalid */
24030             MIPS_INVAL("MASK ADDU.QB");
24031             generate_exception_end(ctx, EXCP_RI);
24032             break;
24033
24034         }
24035         break;
24036     case OPC_CMPU_EQ_QB_DSP:
24037         op2 = MASK_CMPU_EQ_QB(ctx->opcode);
24038         switch (op2) {
24039         case OPC_PRECR_SRA_PH_W:
24040         case OPC_PRECR_SRA_R_PH_W:
24041             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
24042             break;
24043         case OPC_PRECR_QB_PH:
24044         case OPC_PRECRQ_QB_PH:
24045         case OPC_PRECRQ_PH_W:
24046         case OPC_PRECRQ_RS_PH_W:
24047         case OPC_PRECRQU_S_QB_PH:
24048             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24049             break;
24050         case OPC_CMPU_EQ_QB:
24051         case OPC_CMPU_LT_QB:
24052         case OPC_CMPU_LE_QB:
24053         case OPC_CMP_EQ_PH:
24054         case OPC_CMP_LT_PH:
24055         case OPC_CMP_LE_PH:
24056             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
24057             break;
24058         case OPC_CMPGU_EQ_QB:
24059         case OPC_CMPGU_LT_QB:
24060         case OPC_CMPGU_LE_QB:
24061         case OPC_CMPGDU_EQ_QB:
24062         case OPC_CMPGDU_LT_QB:
24063         case OPC_CMPGDU_LE_QB:
24064         case OPC_PICK_QB:
24065         case OPC_PICK_PH:
24066         case OPC_PACKRL_PH:
24067             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
24068             break;
24069         default:            /* Invalid */
24070             MIPS_INVAL("MASK CMPU.EQ.QB");
24071             generate_exception_end(ctx, EXCP_RI);
24072             break;
24073         }
24074         break;
24075     case OPC_SHLL_QB_DSP:
24076         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
24077         break;
24078     case OPC_DPA_W_PH_DSP:
24079         op2 = MASK_DPA_W_PH(ctx->opcode);
24080         switch (op2) {
24081         case OPC_DPAU_H_QBL:
24082         case OPC_DPAU_H_QBR:
24083         case OPC_DPSU_H_QBL:
24084         case OPC_DPSU_H_QBR:
24085         case OPC_DPA_W_PH:
24086         case OPC_DPAX_W_PH:
24087         case OPC_DPAQ_S_W_PH:
24088         case OPC_DPAQX_S_W_PH:
24089         case OPC_DPAQX_SA_W_PH:
24090         case OPC_DPS_W_PH:
24091         case OPC_DPSX_W_PH:
24092         case OPC_DPSQ_S_W_PH:
24093         case OPC_DPSQX_S_W_PH:
24094         case OPC_DPSQX_SA_W_PH:
24095         case OPC_MULSAQ_S_W_PH:
24096         case OPC_DPAQ_SA_L_W:
24097         case OPC_DPSQ_SA_L_W:
24098         case OPC_MAQ_S_W_PHL:
24099         case OPC_MAQ_S_W_PHR:
24100         case OPC_MAQ_SA_W_PHL:
24101         case OPC_MAQ_SA_W_PHR:
24102         case OPC_MULSA_W_PH:
24103             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
24104             break;
24105         default:            /* Invalid */
24106             MIPS_INVAL("MASK DPAW.PH");
24107             generate_exception_end(ctx, EXCP_RI);
24108             break;
24109         }
24110         break;
24111     case OPC_INSV_DSP:
24112         op2 = MASK_INSV(ctx->opcode);
24113         switch (op2) {
24114         case OPC_INSV:
24115             check_dsp(ctx);
24116             {
24117                 TCGv t0, t1;
24118
24119                 if (rt == 0) {
24120                     break;
24121                 }
24122
24123                 t0 = tcg_temp_new();
24124                 t1 = tcg_temp_new();
24125
24126                 gen_load_gpr(t0, rt);
24127                 gen_load_gpr(t1, rs);
24128
24129                 gen_helper_insv(cpu_gpr[rt], cpu_env, t1, t0);
24130
24131                 tcg_temp_free(t0);
24132                 tcg_temp_free(t1);
24133                 break;
24134             }
24135         default:            /* Invalid */
24136             MIPS_INVAL("MASK INSV");
24137             generate_exception_end(ctx, EXCP_RI);
24138             break;
24139         }
24140         break;
24141     case OPC_APPEND_DSP:
24142         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
24143         break;
24144     case OPC_EXTR_W_DSP:
24145         op2 = MASK_EXTR_W(ctx->opcode);
24146         switch (op2) {
24147         case OPC_EXTR_W:
24148         case OPC_EXTR_R_W:
24149         case OPC_EXTR_RS_W:
24150         case OPC_EXTR_S_H:
24151         case OPC_EXTRV_S_H:
24152         case OPC_EXTRV_W:
24153         case OPC_EXTRV_R_W:
24154         case OPC_EXTRV_RS_W:
24155         case OPC_EXTP:
24156         case OPC_EXTPV:
24157         case OPC_EXTPDP:
24158         case OPC_EXTPDPV:
24159             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
24160             break;
24161         case OPC_RDDSP:
24162             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 1);
24163             break;
24164         case OPC_SHILO:
24165         case OPC_SHILOV:
24166         case OPC_MTHLIP:
24167         case OPC_WRDSP:
24168             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
24169             break;
24170         default:            /* Invalid */
24171             MIPS_INVAL("MASK EXTR.W");
24172             generate_exception_end(ctx, EXCP_RI);
24173             break;
24174         }
24175         break;
24176 #if defined(TARGET_MIPS64)
24177     case OPC_DDIV_G_2E:
24178     case OPC_DDIVU_G_2E:
24179     case OPC_DMULT_G_2E:
24180     case OPC_DMULTU_G_2E:
24181     case OPC_DMOD_G_2E:
24182     case OPC_DMODU_G_2E:
24183         check_insn(ctx, INSN_LOONGSON2E);
24184         gen_loongson_integer(ctx, op1, rd, rs, rt);
24185         break;
24186     case OPC_ABSQ_S_QH_DSP:
24187         op2 = MASK_ABSQ_S_QH(ctx->opcode);
24188         switch (op2) {
24189         case OPC_PRECEQ_L_PWL:
24190         case OPC_PRECEQ_L_PWR:
24191         case OPC_PRECEQ_PW_QHL:
24192         case OPC_PRECEQ_PW_QHR:
24193         case OPC_PRECEQ_PW_QHLA:
24194         case OPC_PRECEQ_PW_QHRA:
24195         case OPC_PRECEQU_QH_OBL:
24196         case OPC_PRECEQU_QH_OBR:
24197         case OPC_PRECEQU_QH_OBLA:
24198         case OPC_PRECEQU_QH_OBRA:
24199         case OPC_PRECEU_QH_OBL:
24200         case OPC_PRECEU_QH_OBR:
24201         case OPC_PRECEU_QH_OBLA:
24202         case OPC_PRECEU_QH_OBRA:
24203         case OPC_ABSQ_S_OB:
24204         case OPC_ABSQ_S_PW:
24205         case OPC_ABSQ_S_QH:
24206             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24207             break;
24208         case OPC_REPL_OB:
24209         case OPC_REPL_PW:
24210         case OPC_REPL_QH:
24211         case OPC_REPLV_OB:
24212         case OPC_REPLV_PW:
24213         case OPC_REPLV_QH:
24214             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
24215             break;
24216         default:            /* Invalid */
24217             MIPS_INVAL("MASK ABSQ_S.QH");
24218             generate_exception_end(ctx, EXCP_RI);
24219             break;
24220         }
24221         break;
24222     case OPC_ADDU_OB_DSP:
24223         op2 = MASK_ADDU_OB(ctx->opcode);
24224         switch (op2) {
24225         case OPC_RADDU_L_OB:
24226         case OPC_SUBQ_PW:
24227         case OPC_SUBQ_S_PW:
24228         case OPC_SUBQ_QH:
24229         case OPC_SUBQ_S_QH:
24230         case OPC_SUBU_OB:
24231         case OPC_SUBU_S_OB:
24232         case OPC_SUBU_QH:
24233         case OPC_SUBU_S_QH:
24234         case OPC_SUBUH_OB:
24235         case OPC_SUBUH_R_OB:
24236         case OPC_ADDQ_PW:
24237         case OPC_ADDQ_S_PW:
24238         case OPC_ADDQ_QH:
24239         case OPC_ADDQ_S_QH:
24240         case OPC_ADDU_OB:
24241         case OPC_ADDU_S_OB:
24242         case OPC_ADDU_QH:
24243         case OPC_ADDU_S_QH:
24244         case OPC_ADDUH_OB:
24245         case OPC_ADDUH_R_OB:
24246             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24247             break;
24248         case OPC_MULEQ_S_PW_QHL:
24249         case OPC_MULEQ_S_PW_QHR:
24250         case OPC_MULEU_S_QH_OBL:
24251         case OPC_MULEU_S_QH_OBR:
24252         case OPC_MULQ_RS_QH:
24253             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
24254             break;
24255         default:            /* Invalid */
24256             MIPS_INVAL("MASK ADDU.OB");
24257             generate_exception_end(ctx, EXCP_RI);
24258             break;
24259         }
24260         break;
24261     case OPC_CMPU_EQ_OB_DSP:
24262         op2 = MASK_CMPU_EQ_OB(ctx->opcode);
24263         switch (op2) {
24264         case OPC_PRECR_SRA_QH_PW:
24265         case OPC_PRECR_SRA_R_QH_PW:
24266             /* Return value is rt. */
24267             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
24268             break;
24269         case OPC_PRECR_OB_QH:
24270         case OPC_PRECRQ_OB_QH:
24271         case OPC_PRECRQ_PW_L:
24272         case OPC_PRECRQ_QH_PW:
24273         case OPC_PRECRQ_RS_QH_PW:
24274         case OPC_PRECRQU_S_OB_QH:
24275             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24276             break;
24277         case OPC_CMPU_EQ_OB:
24278         case OPC_CMPU_LT_OB:
24279         case OPC_CMPU_LE_OB:
24280         case OPC_CMP_EQ_QH:
24281         case OPC_CMP_LT_QH:
24282         case OPC_CMP_LE_QH:
24283         case OPC_CMP_EQ_PW:
24284         case OPC_CMP_LT_PW:
24285         case OPC_CMP_LE_PW:
24286             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
24287             break;
24288         case OPC_CMPGDU_EQ_OB:
24289         case OPC_CMPGDU_LT_OB:
24290         case OPC_CMPGDU_LE_OB:
24291         case OPC_CMPGU_EQ_OB:
24292         case OPC_CMPGU_LT_OB:
24293         case OPC_CMPGU_LE_OB:
24294         case OPC_PACKRL_PW:
24295         case OPC_PICK_OB:
24296         case OPC_PICK_PW:
24297         case OPC_PICK_QH:
24298             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
24299             break;
24300         default:            /* Invalid */
24301             MIPS_INVAL("MASK CMPU_EQ.OB");
24302             generate_exception_end(ctx, EXCP_RI);
24303             break;
24304         }
24305         break;
24306     case OPC_DAPPEND_DSP:
24307         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
24308         break;
24309     case OPC_DEXTR_W_DSP:
24310         op2 = MASK_DEXTR_W(ctx->opcode);
24311         switch (op2) {
24312         case OPC_DEXTP:
24313         case OPC_DEXTPDP:
24314         case OPC_DEXTPDPV:
24315         case OPC_DEXTPV:
24316         case OPC_DEXTR_L:
24317         case OPC_DEXTR_R_L:
24318         case OPC_DEXTR_RS_L:
24319         case OPC_DEXTR_W:
24320         case OPC_DEXTR_R_W:
24321         case OPC_DEXTR_RS_W:
24322         case OPC_DEXTR_S_H:
24323         case OPC_DEXTRV_L:
24324         case OPC_DEXTRV_R_L:
24325         case OPC_DEXTRV_RS_L:
24326         case OPC_DEXTRV_S_H:
24327         case OPC_DEXTRV_W:
24328         case OPC_DEXTRV_R_W:
24329         case OPC_DEXTRV_RS_W:
24330             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
24331             break;
24332         case OPC_DMTHLIP:
24333         case OPC_DSHILO:
24334         case OPC_DSHILOV:
24335             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
24336             break;
24337         default:            /* Invalid */
24338             MIPS_INVAL("MASK EXTR.W");
24339             generate_exception_end(ctx, EXCP_RI);
24340             break;
24341         }
24342         break;
24343     case OPC_DPAQ_W_QH_DSP:
24344         op2 = MASK_DPAQ_W_QH(ctx->opcode);
24345         switch (op2) {
24346         case OPC_DPAU_H_OBL:
24347         case OPC_DPAU_H_OBR:
24348         case OPC_DPSU_H_OBL:
24349         case OPC_DPSU_H_OBR:
24350         case OPC_DPA_W_QH:
24351         case OPC_DPAQ_S_W_QH:
24352         case OPC_DPS_W_QH:
24353         case OPC_DPSQ_S_W_QH:
24354         case OPC_MULSAQ_S_W_QH:
24355         case OPC_DPAQ_SA_L_PW:
24356         case OPC_DPSQ_SA_L_PW:
24357         case OPC_MULSAQ_S_L_PW:
24358             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
24359             break;
24360         case OPC_MAQ_S_W_QHLL:
24361         case OPC_MAQ_S_W_QHLR:
24362         case OPC_MAQ_S_W_QHRL:
24363         case OPC_MAQ_S_W_QHRR:
24364         case OPC_MAQ_SA_W_QHLL:
24365         case OPC_MAQ_SA_W_QHLR:
24366         case OPC_MAQ_SA_W_QHRL:
24367         case OPC_MAQ_SA_W_QHRR:
24368         case OPC_MAQ_S_L_PWL:
24369         case OPC_MAQ_S_L_PWR:
24370         case OPC_DMADD:
24371         case OPC_DMADDU:
24372         case OPC_DMSUB:
24373         case OPC_DMSUBU:
24374             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
24375             break;
24376         default:            /* Invalid */
24377             MIPS_INVAL("MASK DPAQ.W.QH");
24378             generate_exception_end(ctx, EXCP_RI);
24379             break;
24380         }
24381         break;
24382     case OPC_DINSV_DSP:
24383         op2 = MASK_INSV(ctx->opcode);
24384         switch (op2) {
24385         case OPC_DINSV:
24386         {
24387             TCGv t0, t1;
24388
24389             if (rt == 0) {
24390                 break;
24391             }
24392             check_dsp(ctx);
24393
24394             t0 = tcg_temp_new();
24395             t1 = tcg_temp_new();
24396
24397             gen_load_gpr(t0, rt);
24398             gen_load_gpr(t1, rs);
24399
24400             gen_helper_dinsv(cpu_gpr[rt], cpu_env, t1, t0);
24401
24402             tcg_temp_free(t0);
24403             tcg_temp_free(t1);
24404             break;
24405         }
24406         default:            /* Invalid */
24407             MIPS_INVAL("MASK DINSV");
24408             generate_exception_end(ctx, EXCP_RI);
24409             break;
24410         }
24411         break;
24412     case OPC_SHLL_OB_DSP:
24413         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
24414         break;
24415 #endif
24416     default:            /* Invalid */
24417         MIPS_INVAL("special3_legacy");
24418         generate_exception_end(ctx, EXCP_RI);
24419         break;
24420     }
24421 }
24422
24423 static void decode_tx79_mmi0(CPUMIPSState *env, DisasContext *ctx)
24424 {
24425     uint32_t opc = MASK_TX79_MMI0(ctx->opcode);
24426
24427     switch (opc) {
24428     case TX79_MMI0_PADDW:     /* TODO: TX79_MMI0_PADDW */
24429     case TX79_MMI0_PSUBW:     /* TODO: TX79_MMI0_PSUBW */
24430     case TX79_MMI0_PCGTW:     /* TODO: TX79_MMI0_PCGTW */
24431     case TX79_MMI0_PMAXW:     /* TODO: TX79_MMI0_PMAXW */
24432     case TX79_MMI0_PADDH:     /* TODO: TX79_MMI0_PADDH */
24433     case TX79_MMI0_PSUBH:     /* TODO: TX79_MMI0_PSUBH */
24434     case TX79_MMI0_PCGTH:     /* TODO: TX79_MMI0_PCGTH */
24435     case TX79_MMI0_PMAXH:     /* TODO: TX79_MMI0_PMAXH */
24436     case TX79_MMI0_PADDB:     /* TODO: TX79_MMI0_PADDB */
24437     case TX79_MMI0_PSUBB:     /* TODO: TX79_MMI0_PSUBB */
24438     case TX79_MMI0_PCGTB:     /* TODO: TX79_MMI0_PCGTB */
24439     case TX79_MMI0_PADDSW:    /* TODO: TX79_MMI0_PADDSW */
24440     case TX79_MMI0_PSUBSW:    /* TODO: TX79_MMI0_PSUBSW */
24441     case TX79_MMI0_PEXTLW:    /* TODO: TX79_MMI0_PEXTLW */
24442     case TX79_MMI0_PPACW:     /* TODO: TX79_MMI0_PPACW */
24443     case TX79_MMI0_PADDSH:    /* TODO: TX79_MMI0_PADDSH */
24444     case TX79_MMI0_PSUBSH:    /* TODO: TX79_MMI0_PSUBSH */
24445     case TX79_MMI0_PEXTLH:    /* TODO: TX79_MMI0_PEXTLH */
24446     case TX79_MMI0_PPACH:     /* TODO: TX79_MMI0_PPACH */
24447     case TX79_MMI0_PADDSB:    /* TODO: TX79_MMI0_PADDSB */
24448     case TX79_MMI0_PSUBSB:    /* TODO: TX79_MMI0_PSUBSB */
24449     case TX79_MMI0_PEXTLB:    /* TODO: TX79_MMI0_PEXTLB */
24450     case TX79_MMI0_PPACB:     /* TODO: TX79_MMI0_PPACB */
24451     case TX79_MMI0_PEXT5:     /* TODO: TX79_MMI0_PEXT5 */
24452     case TX79_MMI0_PPAC5:     /* TODO: TX79_MMI0_PPAC5 */
24453         generate_exception_end(ctx, EXCP_RI); /* TODO: TX79_MMI_CLASS_MMI0 */
24454         break;
24455     default:
24456         MIPS_INVAL("TX79 MMI class MMI0");
24457         generate_exception_end(ctx, EXCP_RI);
24458         break;
24459     }
24460 }
24461
24462 static void decode_tx79_mmi1(CPUMIPSState *env, DisasContext *ctx)
24463 {
24464     uint32_t opc = MASK_TX79_MMI1(ctx->opcode);
24465
24466     switch (opc) {
24467     case TX79_MMI1_PABSW:     /* TODO: TX79_MMI1_PABSW */
24468     case TX79_MMI1_PCEQW:     /* TODO: TX79_MMI1_PCEQW */
24469     case TX79_MMI1_PMINW:     /* TODO: TX79_MMI1_PMINW */
24470     case TX79_MMI1_PADSBH:    /* TODO: TX79_MMI1_PADSBH */
24471     case TX79_MMI1_PABSH:     /* TODO: TX79_MMI1_PABSH */
24472     case TX79_MMI1_PCEQH:     /* TODO: TX79_MMI1_PCEQH */
24473     case TX79_MMI1_PMINH:     /* TODO: TX79_MMI1_PMINH */
24474     case TX79_MMI1_PCEQB:     /* TODO: TX79_MMI1_PCEQB */
24475     case TX79_MMI1_PADDUW:    /* TODO: TX79_MMI1_PADDUW */
24476     case TX79_MMI1_PSUBUW:    /* TODO: TX79_MMI1_PSUBUW */
24477     case TX79_MMI1_PEXTUW:    /* TODO: TX79_MMI1_PEXTUW */
24478     case TX79_MMI1_PADDUH:    /* TODO: TX79_MMI1_PADDUH */
24479     case TX79_MMI1_PSUBUH:    /* TODO: TX79_MMI1_PSUBUH */
24480     case TX79_MMI1_PEXTUH:    /* TODO: TX79_MMI1_PEXTUH */
24481     case TX79_MMI1_PADDUB:    /* TODO: TX79_MMI1_PADDUB */
24482     case TX79_MMI1_PSUBUB:    /* TODO: TX79_MMI1_PSUBUB */
24483     case TX79_MMI1_PEXTUB:    /* TODO: TX79_MMI1_PEXTUB */
24484     case TX79_MMI1_QFSRV:     /* TODO: TX79_MMI1_QFSRV */
24485         generate_exception_end(ctx, EXCP_RI); /* TODO: TX79_MMI_CLASS_MMI1 */
24486         break;
24487     default:
24488         MIPS_INVAL("TX79 MMI class MMI1");
24489         generate_exception_end(ctx, EXCP_RI);
24490         break;
24491     }
24492 }
24493
24494 static void decode_tx79_mmi(CPUMIPSState *env, DisasContext *ctx)
24495 {
24496     uint32_t opc = MASK_TX79_MMI(ctx->opcode);
24497
24498     switch (opc) {
24499     case TX79_MMI_CLASS_MMI0:
24500         decode_tx79_mmi0(env, ctx);
24501         break;
24502     case TX79_MMI_CLASS_MMI1:
24503         decode_tx79_mmi1(env, ctx);
24504         break;
24505     case TX79_MMI_MADD:          /* TODO: TX79_MMI_MADD */
24506     case TX79_MMI_MADDU:         /* TODO: TX79_MMI_MADDU */
24507     case TX79_MMI_PLZCW:         /* TODO: TX79_MMI_PLZCW */
24508     case TX79_MMI_CLASS_MMI2:    /* TODO: TX79_MMI_CLASS_MMI2 */
24509     case TX79_MMI_MFHI1:         /* TODO: TX79_MMI_MFHI1 */
24510     case TX79_MMI_MTHI1:         /* TODO: TX79_MMI_MTHI1 */
24511     case TX79_MMI_MFLO1:         /* TODO: TX79_MMI_MFLO1 */
24512     case TX79_MMI_MTLO1:         /* TODO: TX79_MMI_MTLO1 */
24513     case TX79_MMI_MULT1:         /* TODO: TX79_MMI_MULT1 */
24514     case TX79_MMI_MULTU1:        /* TODO: TX79_MMI_MULTU1 */
24515     case TX79_MMI_DIV1:          /* TODO: TX79_MMI_DIV1 */
24516     case TX79_MMI_DIVU1:         /* TODO: TX79_MMI_DIVU1 */
24517     case TX79_MMI_MADD1:         /* TODO: TX79_MMI_MADD1 */
24518     case TX79_MMI_MADDU1:        /* TODO: TX79_MMI_MADDU1 */
24519     case TX79_MMI_CLASS_MMI3:    /* TODO: TX79_MMI_CLASS_MMI3 */
24520     case TX79_MMI_PMFHL:         /* TODO: TX79_MMI_PMFHL */
24521     case TX79_MMI_PMTHL:         /* TODO: TX79_MMI_PMTHL */
24522     case TX79_MMI_PSLLH:         /* TODO: TX79_MMI_PSLLH */
24523     case TX79_MMI_PSRLH:         /* TODO: TX79_MMI_PSRLH */
24524     case TX79_MMI_PSRAH:         /* TODO: TX79_MMI_PSRAH */
24525     case TX79_MMI_PSLLW:         /* TODO: TX79_MMI_PSLLW */
24526     case TX79_MMI_PSRLW:         /* TODO: TX79_MMI_PSRLW */
24527     case TX79_MMI_PSRAW:         /* TODO: TX79_MMI_PSRAW */
24528         generate_exception_end(ctx, EXCP_RI);    /* TODO: TX79_CLASS_MMI */
24529         break;
24530     default:
24531         MIPS_INVAL("TX79 MMI class");
24532         generate_exception_end(ctx, EXCP_RI);
24533         break;
24534     }
24535 }
24536
24537 static void decode_tx79_lq(CPUMIPSState *env, DisasContext *ctx)
24538 {
24539     generate_exception_end(ctx, EXCP_RI);    /* TODO: TX79_LQ */
24540 }
24541
24542 static void gen_tx79_sq(DisasContext *ctx, int base, int rt, int offset)
24543 {
24544     generate_exception_end(ctx, EXCP_RI);    /* TODO: TX79_SQ */
24545 }
24546
24547 /*
24548  * The TX79-specific instruction Store Quadword
24549  *
24550  * +--------+-------+-------+------------------------+
24551  * | 011111 |  base |   rt  |           offset       | SQ
24552  * +--------+-------+-------+------------------------+
24553  *      6       5       5                 16
24554  *
24555  * has the same opcode as the Read Hardware Register instruction
24556  *
24557  * +--------+-------+-------+-------+-------+--------+
24558  * | 011111 | 00000 |   rt  |   rd  | 00000 | 111011 | RDHWR
24559  * +--------+-------+-------+-------+-------+--------+
24560  *      6       5       5       5       5        6
24561  *
24562  * that is required, trapped and emulated by the Linux kernel. However, all
24563  * RDHWR encodings yield address error exceptions on the TX79 since the SQ
24564  * offset is odd. Therefore all valid SQ instructions can execute normally.
24565  * In user mode, QEMU must verify the upper and lower 11 bits to distinguish
24566  * between SQ and RDHWR, as the Linux kernel does.
24567  */
24568 static void decode_tx79_sq(CPUMIPSState *env, DisasContext *ctx)
24569 {
24570     int base = extract32(ctx->opcode, 21, 5);
24571     int rt = extract32(ctx->opcode, 16, 5);
24572     int offset = extract32(ctx->opcode, 0, 16);
24573
24574 #ifdef CONFIG_USER_ONLY
24575     uint32_t op1 = MASK_SPECIAL3(ctx->opcode);
24576     uint32_t op2 = extract32(ctx->opcode, 6, 5);
24577
24578     if (base == 0 && op2 == 0 && op1 == OPC_RDHWR) {
24579         int rd = extract32(ctx->opcode, 11, 5);
24580
24581         gen_rdhwr(ctx, rt, rd, 0);
24582         return;
24583     }
24584 #endif
24585
24586     gen_tx79_sq(ctx, base, rt, offset);
24587 }
24588
24589 static void decode_opc_special3(CPUMIPSState *env, DisasContext *ctx)
24590 {
24591     int rs, rt, rd, sa;
24592     uint32_t op1, op2;
24593     int16_t imm;
24594
24595     rs = (ctx->opcode >> 21) & 0x1f;
24596     rt = (ctx->opcode >> 16) & 0x1f;
24597     rd = (ctx->opcode >> 11) & 0x1f;
24598     sa = (ctx->opcode >> 6) & 0x1f;
24599     imm = sextract32(ctx->opcode, 7, 9);
24600
24601     op1 = MASK_SPECIAL3(ctx->opcode);
24602
24603     /*
24604      * EVA loads and stores overlap Loongson 2E instructions decoded by
24605      * decode_opc_special3_legacy(), so be careful to allow their decoding when
24606      * EVA is absent.
24607      */
24608     if (ctx->eva) {
24609         switch (op1) {
24610         case OPC_LWLE:
24611         case OPC_LWRE:
24612             check_insn_opc_removed(ctx, ISA_MIPS32R6);
24613             /* fall through */
24614         case OPC_LBUE:
24615         case OPC_LHUE:
24616         case OPC_LBE:
24617         case OPC_LHE:
24618         case OPC_LLE:
24619         case OPC_LWE:
24620             check_cp0_enabled(ctx);
24621             gen_ld(ctx, op1, rt, rs, imm);
24622             return;
24623         case OPC_SWLE:
24624         case OPC_SWRE:
24625             check_insn_opc_removed(ctx, ISA_MIPS32R6);
24626             /* fall through */
24627         case OPC_SBE:
24628         case OPC_SHE:
24629         case OPC_SWE:
24630             check_cp0_enabled(ctx);
24631             gen_st(ctx, op1, rt, rs, imm);
24632             return;
24633         case OPC_SCE:
24634             check_cp0_enabled(ctx);
24635             gen_st_cond(ctx, op1, rt, rs, imm);
24636             return;
24637         case OPC_CACHEE:
24638             check_cp0_enabled(ctx);
24639             if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
24640                 gen_cache_operation(ctx, rt, rs, imm);
24641             }
24642             /* Treat as NOP. */
24643             return;
24644         case OPC_PREFE:
24645             check_cp0_enabled(ctx);
24646             /* Treat as NOP. */
24647             return;
24648         }
24649     }
24650
24651     switch (op1) {
24652     case OPC_EXT:
24653     case OPC_INS:
24654         check_insn(ctx, ISA_MIPS32R2);
24655         gen_bitops(ctx, op1, rt, rs, sa, rd);
24656         break;
24657     case OPC_BSHFL:
24658         op2 = MASK_BSHFL(ctx->opcode);
24659         switch (op2) {
24660         case OPC_ALIGN:
24661         case OPC_ALIGN_END:
24662         case OPC_BITSWAP:
24663             check_insn(ctx, ISA_MIPS32R6);
24664             decode_opc_special3_r6(env, ctx);
24665             break;
24666         default:
24667             check_insn(ctx, ISA_MIPS32R2);
24668             gen_bshfl(ctx, op2, rt, rd);
24669             break;
24670         }
24671         break;
24672 #if defined(TARGET_MIPS64)
24673     case OPC_DEXTM:
24674     case OPC_DEXTU:
24675     case OPC_DEXT:
24676     case OPC_DINSM:
24677     case OPC_DINSU:
24678     case OPC_DINS:
24679         check_insn(ctx, ISA_MIPS64R2);
24680         check_mips_64(ctx);
24681         gen_bitops(ctx, op1, rt, rs, sa, rd);
24682         break;
24683     case OPC_DBSHFL:
24684         op2 = MASK_DBSHFL(ctx->opcode);
24685         switch (op2) {
24686         case OPC_DALIGN:
24687         case OPC_DALIGN_END:
24688         case OPC_DBITSWAP:
24689             check_insn(ctx, ISA_MIPS32R6);
24690             decode_opc_special3_r6(env, ctx);
24691             break;
24692         default:
24693             check_insn(ctx, ISA_MIPS64R2);
24694             check_mips_64(ctx);
24695             op2 = MASK_DBSHFL(ctx->opcode);
24696             gen_bshfl(ctx, op2, rt, rd);
24697             break;
24698         }
24699         break;
24700 #endif
24701     case OPC_RDHWR:
24702         gen_rdhwr(ctx, rt, rd, extract32(ctx->opcode, 6, 3));
24703         break;
24704     case OPC_FORK:
24705         check_mt(ctx);
24706         {
24707             TCGv t0 = tcg_temp_new();
24708             TCGv t1 = tcg_temp_new();
24709
24710             gen_load_gpr(t0, rt);
24711             gen_load_gpr(t1, rs);
24712             gen_helper_fork(t0, t1);
24713             tcg_temp_free(t0);
24714             tcg_temp_free(t1);
24715         }
24716         break;
24717     case OPC_YIELD:
24718         check_mt(ctx);
24719         {
24720             TCGv t0 = tcg_temp_new();
24721
24722             gen_load_gpr(t0, rs);
24723             gen_helper_yield(t0, cpu_env, t0);
24724             gen_store_gpr(t0, rd);
24725             tcg_temp_free(t0);
24726         }
24727         break;
24728     default:
24729         if (ctx->insn_flags & ISA_MIPS32R6) {
24730             decode_opc_special3_r6(env, ctx);
24731         } else {
24732             decode_opc_special3_legacy(env, ctx);
24733         }
24734     }
24735 }
24736
24737 /* MIPS SIMD Architecture (MSA)  */
24738 static inline int check_msa_access(DisasContext *ctx)
24739 {
24740     if (unlikely((ctx->hflags & MIPS_HFLAG_FPU) &&
24741                  !(ctx->hflags & MIPS_HFLAG_F64))) {
24742         generate_exception_end(ctx, EXCP_RI);
24743         return 0;
24744     }
24745
24746     if (unlikely(!(ctx->hflags & MIPS_HFLAG_MSA))) {
24747         if (ctx->insn_flags & ASE_MSA) {
24748             generate_exception_end(ctx, EXCP_MSADIS);
24749             return 0;
24750         } else {
24751             generate_exception_end(ctx, EXCP_RI);
24752             return 0;
24753         }
24754     }
24755     return 1;
24756 }
24757
24758 static void gen_check_zero_element(TCGv tresult, uint8_t df, uint8_t wt)
24759 {
24760     /* generates tcg ops to check if any element is 0 */
24761     /* Note this function only works with MSA_WRLEN = 128 */
24762     uint64_t eval_zero_or_big = 0;
24763     uint64_t eval_big = 0;
24764     TCGv_i64 t0 = tcg_temp_new_i64();
24765     TCGv_i64 t1 = tcg_temp_new_i64();
24766     switch (df) {
24767     case DF_BYTE:
24768         eval_zero_or_big = 0x0101010101010101ULL;
24769         eval_big = 0x8080808080808080ULL;
24770         break;
24771     case DF_HALF:
24772         eval_zero_or_big = 0x0001000100010001ULL;
24773         eval_big = 0x8000800080008000ULL;
24774         break;
24775     case DF_WORD:
24776         eval_zero_or_big = 0x0000000100000001ULL;
24777         eval_big = 0x8000000080000000ULL;
24778         break;
24779     case DF_DOUBLE:
24780         eval_zero_or_big = 0x0000000000000001ULL;
24781         eval_big = 0x8000000000000000ULL;
24782         break;
24783     }
24784     tcg_gen_subi_i64(t0, msa_wr_d[wt<<1], eval_zero_or_big);
24785     tcg_gen_andc_i64(t0, t0, msa_wr_d[wt<<1]);
24786     tcg_gen_andi_i64(t0, t0, eval_big);
24787     tcg_gen_subi_i64(t1, msa_wr_d[(wt<<1)+1], eval_zero_or_big);
24788     tcg_gen_andc_i64(t1, t1, msa_wr_d[(wt<<1)+1]);
24789     tcg_gen_andi_i64(t1, t1, eval_big);
24790     tcg_gen_or_i64(t0, t0, t1);
24791     /* if all bits are zero then all elements are not zero */
24792     /* if some bit is non-zero then some element is zero */
24793     tcg_gen_setcondi_i64(TCG_COND_NE, t0, t0, 0);
24794     tcg_gen_trunc_i64_tl(tresult, t0);
24795     tcg_temp_free_i64(t0);
24796     tcg_temp_free_i64(t1);
24797 }
24798
24799 static void gen_msa_branch(CPUMIPSState *env, DisasContext *ctx, uint32_t op1)
24800 {
24801     uint8_t df = (ctx->opcode >> 21) & 0x3;
24802     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
24803     int64_t s16 = (int16_t)ctx->opcode;
24804
24805     check_msa_access(ctx);
24806
24807     if (ctx->hflags & MIPS_HFLAG_BMASK) {
24808         generate_exception_end(ctx, EXCP_RI);
24809         return;
24810     }
24811     switch (op1) {
24812     case OPC_BZ_V:
24813     case OPC_BNZ_V:
24814         {
24815             TCGv_i64 t0 = tcg_temp_new_i64();
24816             tcg_gen_or_i64(t0, msa_wr_d[wt<<1], msa_wr_d[(wt<<1)+1]);
24817             tcg_gen_setcondi_i64((op1 == OPC_BZ_V) ?
24818                     TCG_COND_EQ : TCG_COND_NE, t0, t0, 0);
24819             tcg_gen_trunc_i64_tl(bcond, t0);
24820             tcg_temp_free_i64(t0);
24821         }
24822         break;
24823     case OPC_BZ_B:
24824     case OPC_BZ_H:
24825     case OPC_BZ_W:
24826     case OPC_BZ_D:
24827         gen_check_zero_element(bcond, df, wt);
24828         break;
24829     case OPC_BNZ_B:
24830     case OPC_BNZ_H:
24831     case OPC_BNZ_W:
24832     case OPC_BNZ_D:
24833         gen_check_zero_element(bcond, df, wt);
24834         tcg_gen_setcondi_tl(TCG_COND_EQ, bcond, bcond, 0);
24835         break;
24836     }
24837
24838     ctx->btarget = ctx->base.pc_next + (s16 << 2) + 4;
24839
24840     ctx->hflags |= MIPS_HFLAG_BC;
24841     ctx->hflags |= MIPS_HFLAG_BDS32;
24842 }
24843
24844 static void gen_msa_i8(CPUMIPSState *env, DisasContext *ctx)
24845 {
24846 #define MASK_MSA_I8(op)    (MASK_MSA_MINOR(op) | (op & (0x03 << 24)))
24847     uint8_t i8 = (ctx->opcode >> 16) & 0xff;
24848     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
24849     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
24850
24851     TCGv_i32 twd = tcg_const_i32(wd);
24852     TCGv_i32 tws = tcg_const_i32(ws);
24853     TCGv_i32 ti8 = tcg_const_i32(i8);
24854
24855     switch (MASK_MSA_I8(ctx->opcode)) {
24856     case OPC_ANDI_B:
24857         gen_helper_msa_andi_b(cpu_env, twd, tws, ti8);
24858         break;
24859     case OPC_ORI_B:
24860         gen_helper_msa_ori_b(cpu_env, twd, tws, ti8);
24861         break;
24862     case OPC_NORI_B:
24863         gen_helper_msa_nori_b(cpu_env, twd, tws, ti8);
24864         break;
24865     case OPC_XORI_B:
24866         gen_helper_msa_xori_b(cpu_env, twd, tws, ti8);
24867         break;
24868     case OPC_BMNZI_B:
24869         gen_helper_msa_bmnzi_b(cpu_env, twd, tws, ti8);
24870         break;
24871     case OPC_BMZI_B:
24872         gen_helper_msa_bmzi_b(cpu_env, twd, tws, ti8);
24873         break;
24874     case OPC_BSELI_B:
24875         gen_helper_msa_bseli_b(cpu_env, twd, tws, ti8);
24876         break;
24877     case OPC_SHF_B:
24878     case OPC_SHF_H:
24879     case OPC_SHF_W:
24880         {
24881             uint8_t df = (ctx->opcode >> 24) & 0x3;
24882             if (df == DF_DOUBLE) {
24883                 generate_exception_end(ctx, EXCP_RI);
24884             } else {
24885                 TCGv_i32 tdf = tcg_const_i32(df);
24886                 gen_helper_msa_shf_df(cpu_env, tdf, twd, tws, ti8);
24887                 tcg_temp_free_i32(tdf);
24888             }
24889         }
24890         break;
24891     default:
24892         MIPS_INVAL("MSA instruction");
24893         generate_exception_end(ctx, EXCP_RI);
24894         break;
24895     }
24896
24897     tcg_temp_free_i32(twd);
24898     tcg_temp_free_i32(tws);
24899     tcg_temp_free_i32(ti8);
24900 }
24901
24902 static void gen_msa_i5(CPUMIPSState *env, DisasContext *ctx)
24903 {
24904 #define MASK_MSA_I5(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
24905     uint8_t df = (ctx->opcode >> 21) & 0x3;
24906     int8_t s5 = (int8_t) sextract32(ctx->opcode, 16, 5);
24907     uint8_t u5 = (ctx->opcode >> 16) & 0x1f;
24908     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
24909     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
24910
24911     TCGv_i32 tdf = tcg_const_i32(df);
24912     TCGv_i32 twd = tcg_const_i32(wd);
24913     TCGv_i32 tws = tcg_const_i32(ws);
24914     TCGv_i32 timm = tcg_temp_new_i32();
24915     tcg_gen_movi_i32(timm, u5);
24916
24917     switch (MASK_MSA_I5(ctx->opcode)) {
24918     case OPC_ADDVI_df:
24919         gen_helper_msa_addvi_df(cpu_env, tdf, twd, tws, timm);
24920         break;
24921     case OPC_SUBVI_df:
24922         gen_helper_msa_subvi_df(cpu_env, tdf, twd, tws, timm);
24923         break;
24924     case OPC_MAXI_S_df:
24925         tcg_gen_movi_i32(timm, s5);
24926         gen_helper_msa_maxi_s_df(cpu_env, tdf, twd, tws, timm);
24927         break;
24928     case OPC_MAXI_U_df:
24929         gen_helper_msa_maxi_u_df(cpu_env, tdf, twd, tws, timm);
24930         break;
24931     case OPC_MINI_S_df:
24932         tcg_gen_movi_i32(timm, s5);
24933         gen_helper_msa_mini_s_df(cpu_env, tdf, twd, tws, timm);
24934         break;
24935     case OPC_MINI_U_df:
24936         gen_helper_msa_mini_u_df(cpu_env, tdf, twd, tws, timm);
24937         break;
24938     case OPC_CEQI_df:
24939         tcg_gen_movi_i32(timm, s5);
24940         gen_helper_msa_ceqi_df(cpu_env, tdf, twd, tws, timm);
24941         break;
24942     case OPC_CLTI_S_df:
24943         tcg_gen_movi_i32(timm, s5);
24944         gen_helper_msa_clti_s_df(cpu_env, tdf, twd, tws, timm);
24945         break;
24946     case OPC_CLTI_U_df:
24947         gen_helper_msa_clti_u_df(cpu_env, tdf, twd, tws, timm);
24948         break;
24949     case OPC_CLEI_S_df:
24950         tcg_gen_movi_i32(timm, s5);
24951         gen_helper_msa_clei_s_df(cpu_env, tdf, twd, tws, timm);
24952         break;
24953     case OPC_CLEI_U_df:
24954         gen_helper_msa_clei_u_df(cpu_env, tdf, twd, tws, timm);
24955         break;
24956     case OPC_LDI_df:
24957         {
24958             int32_t s10 = sextract32(ctx->opcode, 11, 10);
24959             tcg_gen_movi_i32(timm, s10);
24960             gen_helper_msa_ldi_df(cpu_env, tdf, twd, timm);
24961         }
24962         break;
24963     default:
24964         MIPS_INVAL("MSA instruction");
24965         generate_exception_end(ctx, EXCP_RI);
24966         break;
24967     }
24968
24969     tcg_temp_free_i32(tdf);
24970     tcg_temp_free_i32(twd);
24971     tcg_temp_free_i32(tws);
24972     tcg_temp_free_i32(timm);
24973 }
24974
24975 static void gen_msa_bit(CPUMIPSState *env, DisasContext *ctx)
24976 {
24977 #define MASK_MSA_BIT(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
24978     uint8_t dfm = (ctx->opcode >> 16) & 0x7f;
24979     uint32_t df = 0, m = 0;
24980     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
24981     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
24982
24983     TCGv_i32 tdf;
24984     TCGv_i32 tm;
24985     TCGv_i32 twd;
24986     TCGv_i32 tws;
24987
24988     if ((dfm & 0x40) == 0x00) {
24989         m = dfm & 0x3f;
24990         df = DF_DOUBLE;
24991     } else if ((dfm & 0x60) == 0x40) {
24992         m = dfm & 0x1f;
24993         df = DF_WORD;
24994     } else if ((dfm & 0x70) == 0x60) {
24995         m = dfm & 0x0f;
24996         df = DF_HALF;
24997     } else if ((dfm & 0x78) == 0x70) {
24998         m = dfm & 0x7;
24999         df = DF_BYTE;
25000     } else {
25001         generate_exception_end(ctx, EXCP_RI);
25002         return;
25003     }
25004
25005     tdf = tcg_const_i32(df);
25006     tm  = tcg_const_i32(m);
25007     twd = tcg_const_i32(wd);
25008     tws = tcg_const_i32(ws);
25009
25010     switch (MASK_MSA_BIT(ctx->opcode)) {
25011     case OPC_SLLI_df:
25012         gen_helper_msa_slli_df(cpu_env, tdf, twd, tws, tm);
25013         break;
25014     case OPC_SRAI_df:
25015         gen_helper_msa_srai_df(cpu_env, tdf, twd, tws, tm);
25016         break;
25017     case OPC_SRLI_df:
25018         gen_helper_msa_srli_df(cpu_env, tdf, twd, tws, tm);
25019         break;
25020     case OPC_BCLRI_df:
25021         gen_helper_msa_bclri_df(cpu_env, tdf, twd, tws, tm);
25022         break;
25023     case OPC_BSETI_df:
25024         gen_helper_msa_bseti_df(cpu_env, tdf, twd, tws, tm);
25025         break;
25026     case OPC_BNEGI_df:
25027         gen_helper_msa_bnegi_df(cpu_env, tdf, twd, tws, tm);
25028         break;
25029     case OPC_BINSLI_df:
25030         gen_helper_msa_binsli_df(cpu_env, tdf, twd, tws, tm);
25031         break;
25032     case OPC_BINSRI_df:
25033         gen_helper_msa_binsri_df(cpu_env, tdf, twd, tws, tm);
25034         break;
25035     case OPC_SAT_S_df:
25036         gen_helper_msa_sat_s_df(cpu_env, tdf, twd, tws, tm);
25037         break;
25038     case OPC_SAT_U_df:
25039         gen_helper_msa_sat_u_df(cpu_env, tdf, twd, tws, tm);
25040         break;
25041     case OPC_SRARI_df:
25042         gen_helper_msa_srari_df(cpu_env, tdf, twd, tws, tm);
25043         break;
25044     case OPC_SRLRI_df:
25045         gen_helper_msa_srlri_df(cpu_env, tdf, twd, tws, tm);
25046         break;
25047     default:
25048         MIPS_INVAL("MSA instruction");
25049         generate_exception_end(ctx, EXCP_RI);
25050         break;
25051     }
25052
25053     tcg_temp_free_i32(tdf);
25054     tcg_temp_free_i32(tm);
25055     tcg_temp_free_i32(twd);
25056     tcg_temp_free_i32(tws);
25057 }
25058
25059 static void gen_msa_3r(CPUMIPSState *env, DisasContext *ctx)
25060 {
25061 #define MASK_MSA_3R(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
25062     uint8_t df = (ctx->opcode >> 21) & 0x3;
25063     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
25064     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25065     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25066
25067     TCGv_i32 tdf = tcg_const_i32(df);
25068     TCGv_i32 twd = tcg_const_i32(wd);
25069     TCGv_i32 tws = tcg_const_i32(ws);
25070     TCGv_i32 twt = tcg_const_i32(wt);
25071
25072     switch (MASK_MSA_3R(ctx->opcode)) {
25073     case OPC_SLL_df:
25074         gen_helper_msa_sll_df(cpu_env, tdf, twd, tws, twt);
25075         break;
25076     case OPC_ADDV_df:
25077         gen_helper_msa_addv_df(cpu_env, tdf, twd, tws, twt);
25078         break;
25079     case OPC_CEQ_df:
25080         gen_helper_msa_ceq_df(cpu_env, tdf, twd, tws, twt);
25081         break;
25082     case OPC_ADD_A_df:
25083         gen_helper_msa_add_a_df(cpu_env, tdf, twd, tws, twt);
25084         break;
25085     case OPC_SUBS_S_df:
25086         gen_helper_msa_subs_s_df(cpu_env, tdf, twd, tws, twt);
25087         break;
25088     case OPC_MULV_df:
25089         gen_helper_msa_mulv_df(cpu_env, tdf, twd, tws, twt);
25090         break;
25091     case OPC_SLD_df:
25092         gen_helper_msa_sld_df(cpu_env, tdf, twd, tws, twt);
25093         break;
25094     case OPC_VSHF_df:
25095         gen_helper_msa_vshf_df(cpu_env, tdf, twd, tws, twt);
25096         break;
25097     case OPC_SRA_df:
25098         gen_helper_msa_sra_df(cpu_env, tdf, twd, tws, twt);
25099         break;
25100     case OPC_SUBV_df:
25101         gen_helper_msa_subv_df(cpu_env, tdf, twd, tws, twt);
25102         break;
25103     case OPC_ADDS_A_df:
25104         gen_helper_msa_adds_a_df(cpu_env, tdf, twd, tws, twt);
25105         break;
25106     case OPC_SUBS_U_df:
25107         gen_helper_msa_subs_u_df(cpu_env, tdf, twd, tws, twt);
25108         break;
25109     case OPC_MADDV_df:
25110         gen_helper_msa_maddv_df(cpu_env, tdf, twd, tws, twt);
25111         break;
25112     case OPC_SPLAT_df:
25113         gen_helper_msa_splat_df(cpu_env, tdf, twd, tws, twt);
25114         break;
25115     case OPC_SRAR_df:
25116         gen_helper_msa_srar_df(cpu_env, tdf, twd, tws, twt);
25117         break;
25118     case OPC_SRL_df:
25119         gen_helper_msa_srl_df(cpu_env, tdf, twd, tws, twt);
25120         break;
25121     case OPC_MAX_S_df:
25122         gen_helper_msa_max_s_df(cpu_env, tdf, twd, tws, twt);
25123         break;
25124     case OPC_CLT_S_df:
25125         gen_helper_msa_clt_s_df(cpu_env, tdf, twd, tws, twt);
25126         break;
25127     case OPC_ADDS_S_df:
25128         gen_helper_msa_adds_s_df(cpu_env, tdf, twd, tws, twt);
25129         break;
25130     case OPC_SUBSUS_U_df:
25131         gen_helper_msa_subsus_u_df(cpu_env, tdf, twd, tws, twt);
25132         break;
25133     case OPC_MSUBV_df:
25134         gen_helper_msa_msubv_df(cpu_env, tdf, twd, tws, twt);
25135         break;
25136     case OPC_PCKEV_df:
25137         gen_helper_msa_pckev_df(cpu_env, tdf, twd, tws, twt);
25138         break;
25139     case OPC_SRLR_df:
25140         gen_helper_msa_srlr_df(cpu_env, tdf, twd, tws, twt);
25141         break;
25142     case OPC_BCLR_df:
25143         gen_helper_msa_bclr_df(cpu_env, tdf, twd, tws, twt);
25144         break;
25145     case OPC_MAX_U_df:
25146         gen_helper_msa_max_u_df(cpu_env, tdf, twd, tws, twt);
25147         break;
25148     case OPC_CLT_U_df:
25149         gen_helper_msa_clt_u_df(cpu_env, tdf, twd, tws, twt);
25150         break;
25151     case OPC_ADDS_U_df:
25152         gen_helper_msa_adds_u_df(cpu_env, tdf, twd, tws, twt);
25153         break;
25154     case OPC_SUBSUU_S_df:
25155         gen_helper_msa_subsuu_s_df(cpu_env, tdf, twd, tws, twt);
25156         break;
25157     case OPC_PCKOD_df:
25158         gen_helper_msa_pckod_df(cpu_env, tdf, twd, tws, twt);
25159         break;
25160     case OPC_BSET_df:
25161         gen_helper_msa_bset_df(cpu_env, tdf, twd, tws, twt);
25162         break;
25163     case OPC_MIN_S_df:
25164         gen_helper_msa_min_s_df(cpu_env, tdf, twd, tws, twt);
25165         break;
25166     case OPC_CLE_S_df:
25167         gen_helper_msa_cle_s_df(cpu_env, tdf, twd, tws, twt);
25168         break;
25169     case OPC_AVE_S_df:
25170         gen_helper_msa_ave_s_df(cpu_env, tdf, twd, tws, twt);
25171         break;
25172     case OPC_ASUB_S_df:
25173         gen_helper_msa_asub_s_df(cpu_env, tdf, twd, tws, twt);
25174         break;
25175     case OPC_DIV_S_df:
25176         gen_helper_msa_div_s_df(cpu_env, tdf, twd, tws, twt);
25177         break;
25178     case OPC_ILVL_df:
25179         gen_helper_msa_ilvl_df(cpu_env, tdf, twd, tws, twt);
25180         break;
25181     case OPC_BNEG_df:
25182         gen_helper_msa_bneg_df(cpu_env, tdf, twd, tws, twt);
25183         break;
25184     case OPC_MIN_U_df:
25185         gen_helper_msa_min_u_df(cpu_env, tdf, twd, tws, twt);
25186         break;
25187     case OPC_CLE_U_df:
25188         gen_helper_msa_cle_u_df(cpu_env, tdf, twd, tws, twt);
25189         break;
25190     case OPC_AVE_U_df:
25191         gen_helper_msa_ave_u_df(cpu_env, tdf, twd, tws, twt);
25192         break;
25193     case OPC_ASUB_U_df:
25194         gen_helper_msa_asub_u_df(cpu_env, tdf, twd, tws, twt);
25195         break;
25196     case OPC_DIV_U_df:
25197         gen_helper_msa_div_u_df(cpu_env, tdf, twd, tws, twt);
25198         break;
25199     case OPC_ILVR_df:
25200         gen_helper_msa_ilvr_df(cpu_env, tdf, twd, tws, twt);
25201         break;
25202     case OPC_BINSL_df:
25203         gen_helper_msa_binsl_df(cpu_env, tdf, twd, tws, twt);
25204         break;
25205     case OPC_MAX_A_df:
25206         gen_helper_msa_max_a_df(cpu_env, tdf, twd, tws, twt);
25207         break;
25208     case OPC_AVER_S_df:
25209         gen_helper_msa_aver_s_df(cpu_env, tdf, twd, tws, twt);
25210         break;
25211     case OPC_MOD_S_df:
25212         gen_helper_msa_mod_s_df(cpu_env, tdf, twd, tws, twt);
25213         break;
25214     case OPC_ILVEV_df:
25215         gen_helper_msa_ilvev_df(cpu_env, tdf, twd, tws, twt);
25216         break;
25217     case OPC_BINSR_df:
25218         gen_helper_msa_binsr_df(cpu_env, tdf, twd, tws, twt);
25219         break;
25220     case OPC_MIN_A_df:
25221         gen_helper_msa_min_a_df(cpu_env, tdf, twd, tws, twt);
25222         break;
25223     case OPC_AVER_U_df:
25224         gen_helper_msa_aver_u_df(cpu_env, tdf, twd, tws, twt);
25225         break;
25226     case OPC_MOD_U_df:
25227         gen_helper_msa_mod_u_df(cpu_env, tdf, twd, tws, twt);
25228         break;
25229     case OPC_ILVOD_df:
25230         gen_helper_msa_ilvod_df(cpu_env, tdf, twd, tws, twt);
25231         break;
25232
25233     case OPC_DOTP_S_df:
25234     case OPC_DOTP_U_df:
25235     case OPC_DPADD_S_df:
25236     case OPC_DPADD_U_df:
25237     case OPC_DPSUB_S_df:
25238     case OPC_HADD_S_df:
25239     case OPC_DPSUB_U_df:
25240     case OPC_HADD_U_df:
25241     case OPC_HSUB_S_df:
25242     case OPC_HSUB_U_df:
25243         if (df == DF_BYTE) {
25244             generate_exception_end(ctx, EXCP_RI);
25245             break;
25246         }
25247         switch (MASK_MSA_3R(ctx->opcode)) {
25248         case OPC_DOTP_S_df:
25249             gen_helper_msa_dotp_s_df(cpu_env, tdf, twd, tws, twt);
25250             break;
25251         case OPC_DOTP_U_df:
25252             gen_helper_msa_dotp_u_df(cpu_env, tdf, twd, tws, twt);
25253             break;
25254         case OPC_DPADD_S_df:
25255             gen_helper_msa_dpadd_s_df(cpu_env, tdf, twd, tws, twt);
25256             break;
25257         case OPC_DPADD_U_df:
25258             gen_helper_msa_dpadd_u_df(cpu_env, tdf, twd, tws, twt);
25259             break;
25260         case OPC_DPSUB_S_df:
25261             gen_helper_msa_dpsub_s_df(cpu_env, tdf, twd, tws, twt);
25262             break;
25263         case OPC_HADD_S_df:
25264             gen_helper_msa_hadd_s_df(cpu_env, tdf, twd, tws, twt);
25265             break;
25266         case OPC_DPSUB_U_df:
25267             gen_helper_msa_dpsub_u_df(cpu_env, tdf, twd, tws, twt);
25268             break;
25269         case OPC_HADD_U_df:
25270             gen_helper_msa_hadd_u_df(cpu_env, tdf, twd, tws, twt);
25271             break;
25272         case OPC_HSUB_S_df:
25273             gen_helper_msa_hsub_s_df(cpu_env, tdf, twd, tws, twt);
25274             break;
25275         case OPC_HSUB_U_df:
25276             gen_helper_msa_hsub_u_df(cpu_env, tdf, twd, tws, twt);
25277             break;
25278         }
25279         break;
25280     default:
25281         MIPS_INVAL("MSA instruction");
25282         generate_exception_end(ctx, EXCP_RI);
25283         break;
25284     }
25285     tcg_temp_free_i32(twd);
25286     tcg_temp_free_i32(tws);
25287     tcg_temp_free_i32(twt);
25288     tcg_temp_free_i32(tdf);
25289 }
25290
25291 static void gen_msa_elm_3e(CPUMIPSState *env, DisasContext *ctx)
25292 {
25293 #define MASK_MSA_ELM_DF3E(op)   (MASK_MSA_MINOR(op) | (op & (0x3FF << 16)))
25294     uint8_t source = (ctx->opcode >> 11) & 0x1f;
25295     uint8_t dest = (ctx->opcode >> 6) & 0x1f;
25296     TCGv telm = tcg_temp_new();
25297     TCGv_i32 tsr = tcg_const_i32(source);
25298     TCGv_i32 tdt = tcg_const_i32(dest);
25299
25300     switch (MASK_MSA_ELM_DF3E(ctx->opcode)) {
25301     case OPC_CTCMSA:
25302         gen_load_gpr(telm, source);
25303         gen_helper_msa_ctcmsa(cpu_env, telm, tdt);
25304         break;
25305     case OPC_CFCMSA:
25306         gen_helper_msa_cfcmsa(telm, cpu_env, tsr);
25307         gen_store_gpr(telm, dest);
25308         break;
25309     case OPC_MOVE_V:
25310         gen_helper_msa_move_v(cpu_env, tdt, tsr);
25311         break;
25312     default:
25313         MIPS_INVAL("MSA instruction");
25314         generate_exception_end(ctx, EXCP_RI);
25315         break;
25316     }
25317
25318     tcg_temp_free(telm);
25319     tcg_temp_free_i32(tdt);
25320     tcg_temp_free_i32(tsr);
25321 }
25322
25323 static void gen_msa_elm_df(CPUMIPSState *env, DisasContext *ctx, uint32_t df,
25324         uint32_t n)
25325 {
25326 #define MASK_MSA_ELM(op)    (MASK_MSA_MINOR(op) | (op & (0xf << 22)))
25327     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25328     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25329
25330     TCGv_i32 tws = tcg_const_i32(ws);
25331     TCGv_i32 twd = tcg_const_i32(wd);
25332     TCGv_i32 tn  = tcg_const_i32(n);
25333     TCGv_i32 tdf = tcg_const_i32(df);
25334
25335     switch (MASK_MSA_ELM(ctx->opcode)) {
25336     case OPC_SLDI_df:
25337         gen_helper_msa_sldi_df(cpu_env, tdf, twd, tws, tn);
25338         break;
25339     case OPC_SPLATI_df:
25340         gen_helper_msa_splati_df(cpu_env, tdf, twd, tws, tn);
25341         break;
25342     case OPC_INSVE_df:
25343         gen_helper_msa_insve_df(cpu_env, tdf, twd, tws, tn);
25344         break;
25345     case OPC_COPY_S_df:
25346     case OPC_COPY_U_df:
25347     case OPC_INSERT_df:
25348 #if !defined(TARGET_MIPS64)
25349         /* Double format valid only for MIPS64 */
25350         if (df == DF_DOUBLE) {
25351             generate_exception_end(ctx, EXCP_RI);
25352             break;
25353         }
25354 #endif
25355         switch (MASK_MSA_ELM(ctx->opcode)) {
25356         case OPC_COPY_S_df:
25357             if (likely(wd != 0)) {
25358                 gen_helper_msa_copy_s_df(cpu_env, tdf, twd, tws, tn);
25359             }
25360             break;
25361         case OPC_COPY_U_df:
25362             if (likely(wd != 0)) {
25363                 gen_helper_msa_copy_u_df(cpu_env, tdf, twd, tws, tn);
25364             }
25365             break;
25366         case OPC_INSERT_df:
25367             gen_helper_msa_insert_df(cpu_env, tdf, twd, tws, tn);
25368             break;
25369         }
25370         break;
25371     default:
25372         MIPS_INVAL("MSA instruction");
25373         generate_exception_end(ctx, EXCP_RI);
25374     }
25375     tcg_temp_free_i32(twd);
25376     tcg_temp_free_i32(tws);
25377     tcg_temp_free_i32(tn);
25378     tcg_temp_free_i32(tdf);
25379 }
25380
25381 static void gen_msa_elm(CPUMIPSState *env, DisasContext *ctx)
25382 {
25383     uint8_t dfn = (ctx->opcode >> 16) & 0x3f;
25384     uint32_t df = 0, n = 0;
25385
25386     if ((dfn & 0x30) == 0x00) {
25387         n = dfn & 0x0f;
25388         df = DF_BYTE;
25389     } else if ((dfn & 0x38) == 0x20) {
25390         n = dfn & 0x07;
25391         df = DF_HALF;
25392     } else if ((dfn & 0x3c) == 0x30) {
25393         n = dfn & 0x03;
25394         df = DF_WORD;
25395     } else if ((dfn & 0x3e) == 0x38) {
25396         n = dfn & 0x01;
25397         df = DF_DOUBLE;
25398     } else if (dfn == 0x3E) {
25399         /* CTCMSA, CFCMSA, MOVE.V */
25400         gen_msa_elm_3e(env, ctx);
25401         return;
25402     } else {
25403         generate_exception_end(ctx, EXCP_RI);
25404         return;
25405     }
25406
25407     gen_msa_elm_df(env, ctx, df, n);
25408 }
25409
25410 static void gen_msa_3rf(CPUMIPSState *env, DisasContext *ctx)
25411 {
25412 #define MASK_MSA_3RF(op)    (MASK_MSA_MINOR(op) | (op & (0xf << 22)))
25413     uint8_t df = (ctx->opcode >> 21) & 0x1;
25414     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
25415     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25416     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25417
25418     TCGv_i32 twd = tcg_const_i32(wd);
25419     TCGv_i32 tws = tcg_const_i32(ws);
25420     TCGv_i32 twt = tcg_const_i32(wt);
25421     TCGv_i32 tdf = tcg_temp_new_i32();
25422
25423     /* adjust df value for floating-point instruction */
25424     tcg_gen_movi_i32(tdf, df + 2);
25425
25426     switch (MASK_MSA_3RF(ctx->opcode)) {
25427     case OPC_FCAF_df:
25428         gen_helper_msa_fcaf_df(cpu_env, tdf, twd, tws, twt);
25429         break;
25430     case OPC_FADD_df:
25431         gen_helper_msa_fadd_df(cpu_env, tdf, twd, tws, twt);
25432         break;
25433     case OPC_FCUN_df:
25434         gen_helper_msa_fcun_df(cpu_env, tdf, twd, tws, twt);
25435         break;
25436     case OPC_FSUB_df:
25437         gen_helper_msa_fsub_df(cpu_env, tdf, twd, tws, twt);
25438         break;
25439     case OPC_FCOR_df:
25440         gen_helper_msa_fcor_df(cpu_env, tdf, twd, tws, twt);
25441         break;
25442     case OPC_FCEQ_df:
25443         gen_helper_msa_fceq_df(cpu_env, tdf, twd, tws, twt);
25444         break;
25445     case OPC_FMUL_df:
25446         gen_helper_msa_fmul_df(cpu_env, tdf, twd, tws, twt);
25447         break;
25448     case OPC_FCUNE_df:
25449         gen_helper_msa_fcune_df(cpu_env, tdf, twd, tws, twt);
25450         break;
25451     case OPC_FCUEQ_df:
25452         gen_helper_msa_fcueq_df(cpu_env, tdf, twd, tws, twt);
25453         break;
25454     case OPC_FDIV_df:
25455         gen_helper_msa_fdiv_df(cpu_env, tdf, twd, tws, twt);
25456         break;
25457     case OPC_FCNE_df:
25458         gen_helper_msa_fcne_df(cpu_env, tdf, twd, tws, twt);
25459         break;
25460     case OPC_FCLT_df:
25461         gen_helper_msa_fclt_df(cpu_env, tdf, twd, tws, twt);
25462         break;
25463     case OPC_FMADD_df:
25464         gen_helper_msa_fmadd_df(cpu_env, tdf, twd, tws, twt);
25465         break;
25466     case OPC_MUL_Q_df:
25467         tcg_gen_movi_i32(tdf, df + 1);
25468         gen_helper_msa_mul_q_df(cpu_env, tdf, twd, tws, twt);
25469         break;
25470     case OPC_FCULT_df:
25471         gen_helper_msa_fcult_df(cpu_env, tdf, twd, tws, twt);
25472         break;
25473     case OPC_FMSUB_df:
25474         gen_helper_msa_fmsub_df(cpu_env, tdf, twd, tws, twt);
25475         break;
25476     case OPC_MADD_Q_df:
25477         tcg_gen_movi_i32(tdf, df + 1);
25478         gen_helper_msa_madd_q_df(cpu_env, tdf, twd, tws, twt);
25479         break;
25480     case OPC_FCLE_df:
25481         gen_helper_msa_fcle_df(cpu_env, tdf, twd, tws, twt);
25482         break;
25483     case OPC_MSUB_Q_df:
25484         tcg_gen_movi_i32(tdf, df + 1);
25485         gen_helper_msa_msub_q_df(cpu_env, tdf, twd, tws, twt);
25486         break;
25487     case OPC_FCULE_df:
25488         gen_helper_msa_fcule_df(cpu_env, tdf, twd, tws, twt);
25489         break;
25490     case OPC_FEXP2_df:
25491         gen_helper_msa_fexp2_df(cpu_env, tdf, twd, tws, twt);
25492         break;
25493     case OPC_FSAF_df:
25494         gen_helper_msa_fsaf_df(cpu_env, tdf, twd, tws, twt);
25495         break;
25496     case OPC_FEXDO_df:
25497         gen_helper_msa_fexdo_df(cpu_env, tdf, twd, tws, twt);
25498         break;
25499     case OPC_FSUN_df:
25500         gen_helper_msa_fsun_df(cpu_env, tdf, twd, tws, twt);
25501         break;
25502     case OPC_FSOR_df:
25503         gen_helper_msa_fsor_df(cpu_env, tdf, twd, tws, twt);
25504         break;
25505     case OPC_FSEQ_df:
25506         gen_helper_msa_fseq_df(cpu_env, tdf, twd, tws, twt);
25507         break;
25508     case OPC_FTQ_df:
25509         gen_helper_msa_ftq_df(cpu_env, tdf, twd, tws, twt);
25510         break;
25511     case OPC_FSUNE_df:
25512         gen_helper_msa_fsune_df(cpu_env, tdf, twd, tws, twt);
25513         break;
25514     case OPC_FSUEQ_df:
25515         gen_helper_msa_fsueq_df(cpu_env, tdf, twd, tws, twt);
25516         break;
25517     case OPC_FSNE_df:
25518         gen_helper_msa_fsne_df(cpu_env, tdf, twd, tws, twt);
25519         break;
25520     case OPC_FSLT_df:
25521         gen_helper_msa_fslt_df(cpu_env, tdf, twd, tws, twt);
25522         break;
25523     case OPC_FMIN_df:
25524         gen_helper_msa_fmin_df(cpu_env, tdf, twd, tws, twt);
25525         break;
25526     case OPC_MULR_Q_df:
25527         tcg_gen_movi_i32(tdf, df + 1);
25528         gen_helper_msa_mulr_q_df(cpu_env, tdf, twd, tws, twt);
25529         break;
25530     case OPC_FSULT_df:
25531         gen_helper_msa_fsult_df(cpu_env, tdf, twd, tws, twt);
25532         break;
25533     case OPC_FMIN_A_df:
25534         gen_helper_msa_fmin_a_df(cpu_env, tdf, twd, tws, twt);
25535         break;
25536     case OPC_MADDR_Q_df:
25537         tcg_gen_movi_i32(tdf, df + 1);
25538         gen_helper_msa_maddr_q_df(cpu_env, tdf, twd, tws, twt);
25539         break;
25540     case OPC_FSLE_df:
25541         gen_helper_msa_fsle_df(cpu_env, tdf, twd, tws, twt);
25542         break;
25543     case OPC_FMAX_df:
25544         gen_helper_msa_fmax_df(cpu_env, tdf, twd, tws, twt);
25545         break;
25546     case OPC_MSUBR_Q_df:
25547         tcg_gen_movi_i32(tdf, df + 1);
25548         gen_helper_msa_msubr_q_df(cpu_env, tdf, twd, tws, twt);
25549         break;
25550     case OPC_FSULE_df:
25551         gen_helper_msa_fsule_df(cpu_env, tdf, twd, tws, twt);
25552         break;
25553     case OPC_FMAX_A_df:
25554         gen_helper_msa_fmax_a_df(cpu_env, tdf, twd, tws, twt);
25555         break;
25556     default:
25557         MIPS_INVAL("MSA instruction");
25558         generate_exception_end(ctx, EXCP_RI);
25559         break;
25560     }
25561
25562     tcg_temp_free_i32(twd);
25563     tcg_temp_free_i32(tws);
25564     tcg_temp_free_i32(twt);
25565     tcg_temp_free_i32(tdf);
25566 }
25567
25568 static void gen_msa_2r(CPUMIPSState *env, DisasContext *ctx)
25569 {
25570 #define MASK_MSA_2R(op)     (MASK_MSA_MINOR(op) | (op & (0x1f << 21)) | \
25571                             (op & (0x7 << 18)))
25572     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
25573     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25574     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25575     uint8_t df = (ctx->opcode >> 16) & 0x3;
25576     TCGv_i32 twd = tcg_const_i32(wd);
25577     TCGv_i32 tws = tcg_const_i32(ws);
25578     TCGv_i32 twt = tcg_const_i32(wt);
25579     TCGv_i32 tdf = tcg_const_i32(df);
25580
25581     switch (MASK_MSA_2R(ctx->opcode)) {
25582     case OPC_FILL_df:
25583 #if !defined(TARGET_MIPS64)
25584         /* Double format valid only for MIPS64 */
25585         if (df == DF_DOUBLE) {
25586             generate_exception_end(ctx, EXCP_RI);
25587             break;
25588         }
25589 #endif
25590         gen_helper_msa_fill_df(cpu_env, tdf, twd, tws); /* trs */
25591         break;
25592     case OPC_PCNT_df:
25593         gen_helper_msa_pcnt_df(cpu_env, tdf, twd, tws);
25594         break;
25595     case OPC_NLOC_df:
25596         gen_helper_msa_nloc_df(cpu_env, tdf, twd, tws);
25597         break;
25598     case OPC_NLZC_df:
25599         gen_helper_msa_nlzc_df(cpu_env, tdf, twd, tws);
25600         break;
25601     default:
25602         MIPS_INVAL("MSA instruction");
25603         generate_exception_end(ctx, EXCP_RI);
25604         break;
25605     }
25606
25607     tcg_temp_free_i32(twd);
25608     tcg_temp_free_i32(tws);
25609     tcg_temp_free_i32(twt);
25610     tcg_temp_free_i32(tdf);
25611 }
25612
25613 static void gen_msa_2rf(CPUMIPSState *env, DisasContext *ctx)
25614 {
25615 #define MASK_MSA_2RF(op)    (MASK_MSA_MINOR(op) | (op & (0x1f << 21)) | \
25616                             (op & (0xf << 17)))
25617     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
25618     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25619     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25620     uint8_t df = (ctx->opcode >> 16) & 0x1;
25621     TCGv_i32 twd = tcg_const_i32(wd);
25622     TCGv_i32 tws = tcg_const_i32(ws);
25623     TCGv_i32 twt = tcg_const_i32(wt);
25624     /* adjust df value for floating-point instruction */
25625     TCGv_i32 tdf = tcg_const_i32(df + 2);
25626
25627     switch (MASK_MSA_2RF(ctx->opcode)) {
25628     case OPC_FCLASS_df:
25629         gen_helper_msa_fclass_df(cpu_env, tdf, twd, tws);
25630         break;
25631     case OPC_FTRUNC_S_df:
25632         gen_helper_msa_ftrunc_s_df(cpu_env, tdf, twd, tws);
25633         break;
25634     case OPC_FTRUNC_U_df:
25635         gen_helper_msa_ftrunc_u_df(cpu_env, tdf, twd, tws);
25636         break;
25637     case OPC_FSQRT_df:
25638         gen_helper_msa_fsqrt_df(cpu_env, tdf, twd, tws);
25639         break;
25640     case OPC_FRSQRT_df:
25641         gen_helper_msa_frsqrt_df(cpu_env, tdf, twd, tws);
25642         break;
25643     case OPC_FRCP_df:
25644         gen_helper_msa_frcp_df(cpu_env, tdf, twd, tws);
25645         break;
25646     case OPC_FRINT_df:
25647         gen_helper_msa_frint_df(cpu_env, tdf, twd, tws);
25648         break;
25649     case OPC_FLOG2_df:
25650         gen_helper_msa_flog2_df(cpu_env, tdf, twd, tws);
25651         break;
25652     case OPC_FEXUPL_df:
25653         gen_helper_msa_fexupl_df(cpu_env, tdf, twd, tws);
25654         break;
25655     case OPC_FEXUPR_df:
25656         gen_helper_msa_fexupr_df(cpu_env, tdf, twd, tws);
25657         break;
25658     case OPC_FFQL_df:
25659         gen_helper_msa_ffql_df(cpu_env, tdf, twd, tws);
25660         break;
25661     case OPC_FFQR_df:
25662         gen_helper_msa_ffqr_df(cpu_env, tdf, twd, tws);
25663         break;
25664     case OPC_FTINT_S_df:
25665         gen_helper_msa_ftint_s_df(cpu_env, tdf, twd, tws);
25666         break;
25667     case OPC_FTINT_U_df:
25668         gen_helper_msa_ftint_u_df(cpu_env, tdf, twd, tws);
25669         break;
25670     case OPC_FFINT_S_df:
25671         gen_helper_msa_ffint_s_df(cpu_env, tdf, twd, tws);
25672         break;
25673     case OPC_FFINT_U_df:
25674         gen_helper_msa_ffint_u_df(cpu_env, tdf, twd, tws);
25675         break;
25676     }
25677
25678     tcg_temp_free_i32(twd);
25679     tcg_temp_free_i32(tws);
25680     tcg_temp_free_i32(twt);
25681     tcg_temp_free_i32(tdf);
25682 }
25683
25684 static void gen_msa_vec_v(CPUMIPSState *env, DisasContext *ctx)
25685 {
25686 #define MASK_MSA_VEC(op)    (MASK_MSA_MINOR(op) | (op & (0x1f << 21)))
25687     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
25688     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
25689     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25690     TCGv_i32 twd = tcg_const_i32(wd);
25691     TCGv_i32 tws = tcg_const_i32(ws);
25692     TCGv_i32 twt = tcg_const_i32(wt);
25693
25694     switch (MASK_MSA_VEC(ctx->opcode)) {
25695     case OPC_AND_V:
25696         gen_helper_msa_and_v(cpu_env, twd, tws, twt);
25697         break;
25698     case OPC_OR_V:
25699         gen_helper_msa_or_v(cpu_env, twd, tws, twt);
25700         break;
25701     case OPC_NOR_V:
25702         gen_helper_msa_nor_v(cpu_env, twd, tws, twt);
25703         break;
25704     case OPC_XOR_V:
25705         gen_helper_msa_xor_v(cpu_env, twd, tws, twt);
25706         break;
25707     case OPC_BMNZ_V:
25708         gen_helper_msa_bmnz_v(cpu_env, twd, tws, twt);
25709         break;
25710     case OPC_BMZ_V:
25711         gen_helper_msa_bmz_v(cpu_env, twd, tws, twt);
25712         break;
25713     case OPC_BSEL_V:
25714         gen_helper_msa_bsel_v(cpu_env, twd, tws, twt);
25715         break;
25716     default:
25717         MIPS_INVAL("MSA instruction");
25718         generate_exception_end(ctx, EXCP_RI);
25719         break;
25720     }
25721
25722     tcg_temp_free_i32(twd);
25723     tcg_temp_free_i32(tws);
25724     tcg_temp_free_i32(twt);
25725 }
25726
25727 static void gen_msa_vec(CPUMIPSState *env, DisasContext *ctx)
25728 {
25729     switch (MASK_MSA_VEC(ctx->opcode)) {
25730     case OPC_AND_V:
25731     case OPC_OR_V:
25732     case OPC_NOR_V:
25733     case OPC_XOR_V:
25734     case OPC_BMNZ_V:
25735     case OPC_BMZ_V:
25736     case OPC_BSEL_V:
25737         gen_msa_vec_v(env, ctx);
25738         break;
25739     case OPC_MSA_2R:
25740         gen_msa_2r(env, ctx);
25741         break;
25742     case OPC_MSA_2RF:
25743         gen_msa_2rf(env, ctx);
25744         break;
25745     default:
25746         MIPS_INVAL("MSA instruction");
25747         generate_exception_end(ctx, EXCP_RI);
25748         break;
25749     }
25750 }
25751
25752 static void gen_msa(CPUMIPSState *env, DisasContext *ctx)
25753 {
25754     uint32_t opcode = ctx->opcode;
25755     check_insn(ctx, ASE_MSA);
25756     check_msa_access(ctx);
25757
25758     switch (MASK_MSA_MINOR(opcode)) {
25759     case OPC_MSA_I8_00:
25760     case OPC_MSA_I8_01:
25761     case OPC_MSA_I8_02:
25762         gen_msa_i8(env, ctx);
25763         break;
25764     case OPC_MSA_I5_06:
25765     case OPC_MSA_I5_07:
25766         gen_msa_i5(env, ctx);
25767         break;
25768     case OPC_MSA_BIT_09:
25769     case OPC_MSA_BIT_0A:
25770         gen_msa_bit(env, ctx);
25771         break;
25772     case OPC_MSA_3R_0D:
25773     case OPC_MSA_3R_0E:
25774     case OPC_MSA_3R_0F:
25775     case OPC_MSA_3R_10:
25776     case OPC_MSA_3R_11:
25777     case OPC_MSA_3R_12:
25778     case OPC_MSA_3R_13:
25779     case OPC_MSA_3R_14:
25780     case OPC_MSA_3R_15:
25781         gen_msa_3r(env, ctx);
25782         break;
25783     case OPC_MSA_ELM:
25784         gen_msa_elm(env, ctx);
25785         break;
25786     case OPC_MSA_3RF_1A:
25787     case OPC_MSA_3RF_1B:
25788     case OPC_MSA_3RF_1C:
25789         gen_msa_3rf(env, ctx);
25790         break;
25791     case OPC_MSA_VEC:
25792         gen_msa_vec(env, ctx);
25793         break;
25794     case OPC_LD_B:
25795     case OPC_LD_H:
25796     case OPC_LD_W:
25797     case OPC_LD_D:
25798     case OPC_ST_B:
25799     case OPC_ST_H:
25800     case OPC_ST_W:
25801     case OPC_ST_D:
25802         {
25803             int32_t s10 = sextract32(ctx->opcode, 16, 10);
25804             uint8_t rs = (ctx->opcode >> 11) & 0x1f;
25805             uint8_t wd = (ctx->opcode >> 6) & 0x1f;
25806             uint8_t df = (ctx->opcode >> 0) & 0x3;
25807
25808             TCGv_i32 twd = tcg_const_i32(wd);
25809             TCGv taddr = tcg_temp_new();
25810             gen_base_offset_addr(ctx, taddr, rs, s10 << df);
25811
25812             switch (MASK_MSA_MINOR(opcode)) {
25813             case OPC_LD_B:
25814                 gen_helper_msa_ld_b(cpu_env, twd, taddr);
25815                 break;
25816             case OPC_LD_H:
25817                 gen_helper_msa_ld_h(cpu_env, twd, taddr);
25818                 break;
25819             case OPC_LD_W:
25820                 gen_helper_msa_ld_w(cpu_env, twd, taddr);
25821                 break;
25822             case OPC_LD_D:
25823                 gen_helper_msa_ld_d(cpu_env, twd, taddr);
25824                 break;
25825             case OPC_ST_B:
25826                 gen_helper_msa_st_b(cpu_env, twd, taddr);
25827                 break;
25828             case OPC_ST_H:
25829                 gen_helper_msa_st_h(cpu_env, twd, taddr);
25830                 break;
25831             case OPC_ST_W:
25832                 gen_helper_msa_st_w(cpu_env, twd, taddr);
25833                 break;
25834             case OPC_ST_D:
25835                 gen_helper_msa_st_d(cpu_env, twd, taddr);
25836                 break;
25837             }
25838
25839             tcg_temp_free_i32(twd);
25840             tcg_temp_free(taddr);
25841         }
25842         break;
25843     default:
25844         MIPS_INVAL("MSA instruction");
25845         generate_exception_end(ctx, EXCP_RI);
25846         break;
25847     }
25848
25849 }
25850
25851 static void decode_opc(CPUMIPSState *env, DisasContext *ctx)
25852 {
25853     int32_t offset;
25854     int rs, rt, rd, sa;
25855     uint32_t op, op1;
25856     int16_t imm;
25857
25858     /* make sure instructions are on a word boundary */
25859     if (ctx->base.pc_next & 0x3) {
25860         env->CP0_BadVAddr = ctx->base.pc_next;
25861         generate_exception_err(ctx, EXCP_AdEL, EXCP_INST_NOTAVAIL);
25862         return;
25863     }
25864
25865     /* Handle blikely not taken case */
25866     if ((ctx->hflags & MIPS_HFLAG_BMASK_BASE) == MIPS_HFLAG_BL) {
25867         TCGLabel *l1 = gen_new_label();
25868
25869         tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
25870         tcg_gen_movi_i32(hflags, ctx->hflags & ~MIPS_HFLAG_BMASK);
25871         gen_goto_tb(ctx, 1, ctx->base.pc_next + 4);
25872         gen_set_label(l1);
25873     }
25874
25875     op = MASK_OP_MAJOR(ctx->opcode);
25876     rs = (ctx->opcode >> 21) & 0x1f;
25877     rt = (ctx->opcode >> 16) & 0x1f;
25878     rd = (ctx->opcode >> 11) & 0x1f;
25879     sa = (ctx->opcode >> 6) & 0x1f;
25880     imm = (int16_t)ctx->opcode;
25881     switch (op) {
25882     case OPC_SPECIAL:
25883         decode_opc_special(env, ctx);
25884         break;
25885     case OPC_SPECIAL2:
25886         if ((ctx->insn_flags & INSN_R5900) && (ctx->insn_flags & ASE_MMI)) {
25887             decode_tx79_mmi(env, ctx);
25888         } else {
25889             decode_opc_special2_legacy(env, ctx);
25890         }
25891         break;
25892     case OPC_SPECIAL3:
25893         if (ctx->insn_flags & INSN_R5900) {
25894             decode_tx79_sq(env, ctx);    /* TX79_SQ */
25895         } else {
25896             decode_opc_special3(env, ctx);
25897         }
25898         break;
25899     case OPC_REGIMM:
25900         op1 = MASK_REGIMM(ctx->opcode);
25901         switch (op1) {
25902         case OPC_BLTZL: /* REGIMM branches */
25903         case OPC_BGEZL:
25904         case OPC_BLTZALL:
25905         case OPC_BGEZALL:
25906             check_insn(ctx, ISA_MIPS2);
25907             check_insn_opc_removed(ctx, ISA_MIPS32R6);
25908             /* Fallthrough */
25909         case OPC_BLTZ:
25910         case OPC_BGEZ:
25911             gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
25912             break;
25913         case OPC_BLTZAL:
25914         case OPC_BGEZAL:
25915             if (ctx->insn_flags & ISA_MIPS32R6) {
25916                 if (rs == 0) {
25917                     /* OPC_NAL, OPC_BAL */
25918                     gen_compute_branch(ctx, op1, 4, 0, -1, imm << 2, 4);
25919                 } else {
25920                     generate_exception_end(ctx, EXCP_RI);
25921                 }
25922             } else {
25923                 gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
25924             }
25925             break;
25926         case OPC_TGEI: /* REGIMM traps */
25927         case OPC_TGEIU:
25928         case OPC_TLTI:
25929         case OPC_TLTIU:
25930         case OPC_TEQI:
25931
25932         case OPC_TNEI:
25933             check_insn(ctx, ISA_MIPS2);
25934             check_insn_opc_removed(ctx, ISA_MIPS32R6);
25935             gen_trap(ctx, op1, rs, -1, imm);
25936             break;
25937         case OPC_SIGRIE:
25938             check_insn(ctx, ISA_MIPS32R6);
25939             generate_exception_end(ctx, EXCP_RI);
25940             break;
25941         case OPC_SYNCI:
25942             check_insn(ctx, ISA_MIPS32R2);
25943             /* Break the TB to be able to sync copied instructions
25944                immediately */
25945             ctx->base.is_jmp = DISAS_STOP;
25946             break;
25947         case OPC_BPOSGE32:    /* MIPS DSP branch */
25948 #if defined(TARGET_MIPS64)
25949         case OPC_BPOSGE64:
25950 #endif
25951             check_dsp(ctx);
25952             gen_compute_branch(ctx, op1, 4, -1, -2, (int32_t)imm << 2, 4);
25953             break;
25954 #if defined(TARGET_MIPS64)
25955         case OPC_DAHI:
25956             check_insn(ctx, ISA_MIPS32R6);
25957             check_mips_64(ctx);
25958             if (rs != 0) {
25959                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 32);
25960             }
25961             break;
25962         case OPC_DATI:
25963             check_insn(ctx, ISA_MIPS32R6);
25964             check_mips_64(ctx);
25965             if (rs != 0) {
25966                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 48);
25967             }
25968             break;
25969 #endif
25970         default:            /* Invalid */
25971             MIPS_INVAL("regimm");
25972             generate_exception_end(ctx, EXCP_RI);
25973             break;
25974         }
25975         break;
25976     case OPC_CP0:
25977         check_cp0_enabled(ctx);
25978         op1 = MASK_CP0(ctx->opcode);
25979         switch (op1) {
25980         case OPC_MFC0:
25981         case OPC_MTC0:
25982         case OPC_MFTR:
25983         case OPC_MTTR:
25984         case OPC_MFHC0:
25985         case OPC_MTHC0:
25986 #if defined(TARGET_MIPS64)
25987         case OPC_DMFC0:
25988         case OPC_DMTC0:
25989 #endif
25990 #ifndef CONFIG_USER_ONLY
25991             gen_cp0(env, ctx, op1, rt, rd);
25992 #endif /* !CONFIG_USER_ONLY */
25993             break;
25994         case OPC_C0:
25995         case OPC_C0_1:
25996         case OPC_C0_2:
25997         case OPC_C0_3:
25998         case OPC_C0_4:
25999         case OPC_C0_5:
26000         case OPC_C0_6:
26001         case OPC_C0_7:
26002         case OPC_C0_8:
26003         case OPC_C0_9:
26004         case OPC_C0_A:
26005         case OPC_C0_B:
26006         case OPC_C0_C:
26007         case OPC_C0_D:
26008         case OPC_C0_E:
26009         case OPC_C0_F:
26010 #ifndef CONFIG_USER_ONLY
26011             gen_cp0(env, ctx, MASK_C0(ctx->opcode), rt, rd);
26012 #endif /* !CONFIG_USER_ONLY */
26013             break;
26014         case OPC_MFMC0:
26015 #ifndef CONFIG_USER_ONLY
26016             {
26017                 uint32_t op2;
26018                 TCGv t0 = tcg_temp_new();
26019
26020                 op2 = MASK_MFMC0(ctx->opcode);
26021                 switch (op2) {
26022                 case OPC_DMT:
26023                     check_cp0_mt(ctx);
26024                     gen_helper_dmt(t0);
26025                     gen_store_gpr(t0, rt);
26026                     break;
26027                 case OPC_EMT:
26028                     check_cp0_mt(ctx);
26029                     gen_helper_emt(t0);
26030                     gen_store_gpr(t0, rt);
26031                     break;
26032                 case OPC_DVPE:
26033                     check_cp0_mt(ctx);
26034                     gen_helper_dvpe(t0, cpu_env);
26035                     gen_store_gpr(t0, rt);
26036                     break;
26037                 case OPC_EVPE:
26038                     check_cp0_mt(ctx);
26039                     gen_helper_evpe(t0, cpu_env);
26040                     gen_store_gpr(t0, rt);
26041                     break;
26042                 case OPC_DVP:
26043                     check_insn(ctx, ISA_MIPS32R6);
26044                     if (ctx->vp) {
26045                         gen_helper_dvp(t0, cpu_env);
26046                         gen_store_gpr(t0, rt);
26047                     }
26048                     break;
26049                 case OPC_EVP:
26050                     check_insn(ctx, ISA_MIPS32R6);
26051                     if (ctx->vp) {
26052                         gen_helper_evp(t0, cpu_env);
26053                         gen_store_gpr(t0, rt);
26054                     }
26055                     break;
26056                 case OPC_DI:
26057                     check_insn(ctx, ISA_MIPS32R2);
26058                     save_cpu_state(ctx, 1);
26059                     gen_helper_di(t0, cpu_env);
26060                     gen_store_gpr(t0, rt);
26061                     /* Stop translation as we may have switched
26062                        the execution mode.  */
26063                     ctx->base.is_jmp = DISAS_STOP;
26064                     break;
26065                 case OPC_EI:
26066                     check_insn(ctx, ISA_MIPS32R2);
26067                     save_cpu_state(ctx, 1);
26068                     gen_helper_ei(t0, cpu_env);
26069                     gen_store_gpr(t0, rt);
26070                     /* DISAS_STOP isn't sufficient, we need to ensure we break
26071                        out of translated code to check for pending interrupts */
26072                     gen_save_pc(ctx->base.pc_next + 4);
26073                     ctx->base.is_jmp = DISAS_EXIT;
26074                     break;
26075                 default:            /* Invalid */
26076                     MIPS_INVAL("mfmc0");
26077                     generate_exception_end(ctx, EXCP_RI);
26078                     break;
26079                 }
26080                 tcg_temp_free(t0);
26081             }
26082 #endif /* !CONFIG_USER_ONLY */
26083             break;
26084         case OPC_RDPGPR:
26085             check_insn(ctx, ISA_MIPS32R2);
26086             gen_load_srsgpr(rt, rd);
26087             break;
26088         case OPC_WRPGPR:
26089             check_insn(ctx, ISA_MIPS32R2);
26090             gen_store_srsgpr(rt, rd);
26091             break;
26092         default:
26093             MIPS_INVAL("cp0");
26094             generate_exception_end(ctx, EXCP_RI);
26095             break;
26096         }
26097         break;
26098     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC, OPC_ADDI */
26099         if (ctx->insn_flags & ISA_MIPS32R6) {
26100             /* OPC_BOVC, OPC_BEQZALC, OPC_BEQC */
26101             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26102         } else {
26103             /* OPC_ADDI */
26104             /* Arithmetic with immediate opcode */
26105             gen_arith_imm(ctx, op, rt, rs, imm);
26106         }
26107         break;
26108     case OPC_ADDIU:
26109          gen_arith_imm(ctx, op, rt, rs, imm);
26110          break;
26111     case OPC_SLTI: /* Set on less than with immediate opcode */
26112     case OPC_SLTIU:
26113          gen_slt_imm(ctx, op, rt, rs, imm);
26114          break;
26115     case OPC_ANDI: /* Arithmetic with immediate opcode */
26116     case OPC_LUI: /* OPC_AUI */
26117     case OPC_ORI:
26118     case OPC_XORI:
26119          gen_logic_imm(ctx, op, rt, rs, imm);
26120          break;
26121     case OPC_J: /* Jump */
26122     case OPC_JAL:
26123          offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
26124          gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
26125          break;
26126     /* Branch */
26127     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC, OPC_BLEZL */
26128         if (ctx->insn_flags & ISA_MIPS32R6) {
26129             if (rt == 0) {
26130                 generate_exception_end(ctx, EXCP_RI);
26131                 break;
26132             }
26133             /* OPC_BLEZC, OPC_BGEZC, OPC_BGEC */
26134             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26135         } else {
26136             /* OPC_BLEZL */
26137             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
26138         }
26139         break;
26140     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC, OPC_BGTZL */
26141         if (ctx->insn_flags & ISA_MIPS32R6) {
26142             if (rt == 0) {
26143                 generate_exception_end(ctx, EXCP_RI);
26144                 break;
26145             }
26146             /* OPC_BGTZC, OPC_BLTZC, OPC_BLTC */
26147             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26148         } else {
26149             /* OPC_BGTZL */
26150             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
26151         }
26152         break;
26153     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC, OPC_BLEZ */
26154         if (rt == 0) {
26155             /* OPC_BLEZ */
26156             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
26157         } else {
26158             check_insn(ctx, ISA_MIPS32R6);
26159             /* OPC_BLEZALC, OPC_BGEZALC, OPC_BGEUC */
26160             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26161         }
26162         break;
26163     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC, OPC_BGTZ */
26164         if (rt == 0) {
26165             /* OPC_BGTZ */
26166             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
26167         } else {
26168             check_insn(ctx, ISA_MIPS32R6);
26169             /* OPC_BGTZALC, OPC_BLTZALC, OPC_BLTUC */
26170             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26171         }
26172         break;
26173     case OPC_BEQL:
26174     case OPC_BNEL:
26175         check_insn(ctx, ISA_MIPS2);
26176          check_insn_opc_removed(ctx, ISA_MIPS32R6);
26177         /* Fallthrough */
26178     case OPC_BEQ:
26179     case OPC_BNE:
26180          gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
26181          break;
26182     case OPC_LL: /* Load and stores */
26183         check_insn(ctx, ISA_MIPS2);
26184         /* Fallthrough */
26185     case OPC_LWL:
26186     case OPC_LWR:
26187         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26188          /* Fallthrough */
26189     case OPC_LB:
26190     case OPC_LH:
26191     case OPC_LW:
26192     case OPC_LWPC:
26193     case OPC_LBU:
26194     case OPC_LHU:
26195          gen_ld(ctx, op, rt, rs, imm);
26196          break;
26197     case OPC_SWL:
26198     case OPC_SWR:
26199         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26200         /* fall through */
26201     case OPC_SB:
26202     case OPC_SH:
26203     case OPC_SW:
26204          gen_st(ctx, op, rt, rs, imm);
26205          break;
26206     case OPC_SC:
26207         check_insn(ctx, ISA_MIPS2);
26208          check_insn_opc_removed(ctx, ISA_MIPS32R6);
26209          gen_st_cond(ctx, op, rt, rs, imm);
26210          break;
26211     case OPC_CACHE:
26212         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26213         check_cp0_enabled(ctx);
26214         check_insn(ctx, ISA_MIPS3 | ISA_MIPS32);
26215         if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
26216             gen_cache_operation(ctx, rt, rs, imm);
26217         }
26218         /* Treat as NOP. */
26219         break;
26220     case OPC_PREF:
26221         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26222         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
26223         /* Treat as NOP. */
26224         break;
26225
26226     /* Floating point (COP1). */
26227     case OPC_LWC1:
26228     case OPC_LDC1:
26229     case OPC_SWC1:
26230     case OPC_SDC1:
26231         gen_cop1_ldst(ctx, op, rt, rs, imm);
26232         break;
26233
26234     case OPC_CP1:
26235         op1 = MASK_CP1(ctx->opcode);
26236
26237         switch (op1) {
26238         case OPC_MFHC1:
26239         case OPC_MTHC1:
26240             check_cp1_enabled(ctx);
26241             check_insn(ctx, ISA_MIPS32R2);
26242             /* fall through */
26243         case OPC_MFC1:
26244         case OPC_CFC1:
26245         case OPC_MTC1:
26246         case OPC_CTC1:
26247             check_cp1_enabled(ctx);
26248             gen_cp1(ctx, op1, rt, rd);
26249             break;
26250 #if defined(TARGET_MIPS64)
26251         case OPC_DMFC1:
26252         case OPC_DMTC1:
26253             check_cp1_enabled(ctx);
26254             check_insn(ctx, ISA_MIPS3);
26255             check_mips_64(ctx);
26256             gen_cp1(ctx, op1, rt, rd);
26257             break;
26258 #endif
26259         case OPC_BC1EQZ: /* OPC_BC1ANY2 */
26260             check_cp1_enabled(ctx);
26261             if (ctx->insn_flags & ISA_MIPS32R6) {
26262                 /* OPC_BC1EQZ */
26263                 gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
26264                                        rt, imm << 2, 4);
26265             } else {
26266                 /* OPC_BC1ANY2 */
26267                 check_cop1x(ctx);
26268                 check_insn(ctx, ASE_MIPS3D);
26269                 gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
26270                                     (rt >> 2) & 0x7, imm << 2);
26271             }
26272             break;
26273         case OPC_BC1NEZ:
26274             check_cp1_enabled(ctx);
26275             check_insn(ctx, ISA_MIPS32R6);
26276             gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
26277                                    rt, imm << 2, 4);
26278             break;
26279         case OPC_BC1ANY4:
26280             check_cp1_enabled(ctx);
26281             check_insn_opc_removed(ctx, ISA_MIPS32R6);
26282             check_cop1x(ctx);
26283             check_insn(ctx, ASE_MIPS3D);
26284             /* fall through */
26285         case OPC_BC1:
26286             check_cp1_enabled(ctx);
26287             check_insn_opc_removed(ctx, ISA_MIPS32R6);
26288             gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
26289                                 (rt >> 2) & 0x7, imm << 2);
26290             break;
26291         case OPC_PS_FMT:
26292             check_ps(ctx);
26293             /* fall through */
26294         case OPC_S_FMT:
26295         case OPC_D_FMT:
26296             check_cp1_enabled(ctx);
26297             gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
26298                        (imm >> 8) & 0x7);
26299             break;
26300         case OPC_W_FMT:
26301         case OPC_L_FMT:
26302         {
26303             int r6_op = ctx->opcode & FOP(0x3f, 0x1f);
26304             check_cp1_enabled(ctx);
26305             if (ctx->insn_flags & ISA_MIPS32R6) {
26306                 switch (r6_op) {
26307                 case R6_OPC_CMP_AF_S:
26308                 case R6_OPC_CMP_UN_S:
26309                 case R6_OPC_CMP_EQ_S:
26310                 case R6_OPC_CMP_UEQ_S:
26311                 case R6_OPC_CMP_LT_S:
26312                 case R6_OPC_CMP_ULT_S:
26313                 case R6_OPC_CMP_LE_S:
26314                 case R6_OPC_CMP_ULE_S:
26315                 case R6_OPC_CMP_SAF_S:
26316                 case R6_OPC_CMP_SUN_S:
26317                 case R6_OPC_CMP_SEQ_S:
26318                 case R6_OPC_CMP_SEUQ_S:
26319                 case R6_OPC_CMP_SLT_S:
26320                 case R6_OPC_CMP_SULT_S:
26321                 case R6_OPC_CMP_SLE_S:
26322                 case R6_OPC_CMP_SULE_S:
26323                 case R6_OPC_CMP_OR_S:
26324                 case R6_OPC_CMP_UNE_S:
26325                 case R6_OPC_CMP_NE_S:
26326                 case R6_OPC_CMP_SOR_S:
26327                 case R6_OPC_CMP_SUNE_S:
26328                 case R6_OPC_CMP_SNE_S:
26329                     gen_r6_cmp_s(ctx, ctx->opcode & 0x1f, rt, rd, sa);
26330                     break;
26331                 case R6_OPC_CMP_AF_D:
26332                 case R6_OPC_CMP_UN_D:
26333                 case R6_OPC_CMP_EQ_D:
26334                 case R6_OPC_CMP_UEQ_D:
26335                 case R6_OPC_CMP_LT_D:
26336                 case R6_OPC_CMP_ULT_D:
26337                 case R6_OPC_CMP_LE_D:
26338                 case R6_OPC_CMP_ULE_D:
26339                 case R6_OPC_CMP_SAF_D:
26340                 case R6_OPC_CMP_SUN_D:
26341                 case R6_OPC_CMP_SEQ_D:
26342                 case R6_OPC_CMP_SEUQ_D:
26343                 case R6_OPC_CMP_SLT_D:
26344                 case R6_OPC_CMP_SULT_D:
26345                 case R6_OPC_CMP_SLE_D:
26346                 case R6_OPC_CMP_SULE_D:
26347                 case R6_OPC_CMP_OR_D:
26348                 case R6_OPC_CMP_UNE_D:
26349                 case R6_OPC_CMP_NE_D:
26350                 case R6_OPC_CMP_SOR_D:
26351                 case R6_OPC_CMP_SUNE_D:
26352                 case R6_OPC_CMP_SNE_D:
26353                     gen_r6_cmp_d(ctx, ctx->opcode & 0x1f, rt, rd, sa);
26354                     break;
26355                 default:
26356                     gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f),
26357                                rt, rd, sa, (imm >> 8) & 0x7);
26358
26359                     break;
26360                 }
26361             } else {
26362                 gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
26363                            (imm >> 8) & 0x7);
26364             }
26365             break;
26366         }
26367         case OPC_BZ_V:
26368         case OPC_BNZ_V:
26369         case OPC_BZ_B:
26370         case OPC_BZ_H:
26371         case OPC_BZ_W:
26372         case OPC_BZ_D:
26373         case OPC_BNZ_B:
26374         case OPC_BNZ_H:
26375         case OPC_BNZ_W:
26376         case OPC_BNZ_D:
26377             check_insn(ctx, ASE_MSA);
26378             gen_msa_branch(env, ctx, op1);
26379             break;
26380         default:
26381             MIPS_INVAL("cp1");
26382             generate_exception_end(ctx, EXCP_RI);
26383             break;
26384         }
26385         break;
26386
26387     /* Compact branches [R6] and COP2 [non-R6] */
26388     case OPC_BC: /* OPC_LWC2 */
26389     case OPC_BALC: /* OPC_SWC2 */
26390         if (ctx->insn_flags & ISA_MIPS32R6) {
26391             /* OPC_BC, OPC_BALC */
26392             gen_compute_compact_branch(ctx, op, 0, 0,
26393                                        sextract32(ctx->opcode << 2, 0, 28));
26394         } else {
26395             /* OPC_LWC2, OPC_SWC2 */
26396             /* COP2: Not implemented. */
26397             generate_exception_err(ctx, EXCP_CpU, 2);
26398         }
26399         break;
26400     case OPC_BEQZC: /* OPC_JIC, OPC_LDC2 */
26401     case OPC_BNEZC: /* OPC_JIALC, OPC_SDC2 */
26402         if (ctx->insn_flags & ISA_MIPS32R6) {
26403             if (rs != 0) {
26404                 /* OPC_BEQZC, OPC_BNEZC */
26405                 gen_compute_compact_branch(ctx, op, rs, 0,
26406                                            sextract32(ctx->opcode << 2, 0, 23));
26407             } else {
26408                 /* OPC_JIC, OPC_JIALC */
26409                 gen_compute_compact_branch(ctx, op, 0, rt, imm);
26410             }
26411         } else {
26412             /* OPC_LWC2, OPC_SWC2 */
26413             /* COP2: Not implemented. */
26414             generate_exception_err(ctx, EXCP_CpU, 2);
26415         }
26416         break;
26417     case OPC_CP2:
26418         check_insn(ctx, INSN_LOONGSON2F);
26419         /* Note that these instructions use different fields.  */
26420         gen_loongson_multimedia(ctx, sa, rd, rt);
26421         break;
26422
26423     case OPC_CP3:
26424         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26425         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
26426             check_cp1_enabled(ctx);
26427             op1 = MASK_CP3(ctx->opcode);
26428             switch (op1) {
26429             case OPC_LUXC1:
26430             case OPC_SUXC1:
26431                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS32R2);
26432                 /* Fallthrough */
26433             case OPC_LWXC1:
26434             case OPC_LDXC1:
26435             case OPC_SWXC1:
26436             case OPC_SDXC1:
26437                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
26438                 gen_flt3_ldst(ctx, op1, sa, rd, rs, rt);
26439                 break;
26440             case OPC_PREFX:
26441                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
26442                 /* Treat as NOP. */
26443                 break;
26444             case OPC_ALNV_PS:
26445                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS32R2);
26446                 /* Fallthrough */
26447             case OPC_MADD_S:
26448             case OPC_MADD_D:
26449             case OPC_MADD_PS:
26450             case OPC_MSUB_S:
26451             case OPC_MSUB_D:
26452             case OPC_MSUB_PS:
26453             case OPC_NMADD_S:
26454             case OPC_NMADD_D:
26455             case OPC_NMADD_PS:
26456             case OPC_NMSUB_S:
26457             case OPC_NMSUB_D:
26458             case OPC_NMSUB_PS:
26459                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
26460                 gen_flt3_arith(ctx, op1, sa, rs, rd, rt);
26461                 break;
26462             default:
26463                 MIPS_INVAL("cp3");
26464                 generate_exception_end(ctx, EXCP_RI);
26465                 break;
26466             }
26467         } else {
26468             generate_exception_err(ctx, EXCP_CpU, 1);
26469         }
26470         break;
26471
26472 #if defined(TARGET_MIPS64)
26473     /* MIPS64 opcodes */
26474     case OPC_LDL:
26475     case OPC_LDR:
26476     case OPC_LLD:
26477         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26478         /* fall through */
26479     case OPC_LWU:
26480     case OPC_LD:
26481         check_insn(ctx, ISA_MIPS3);
26482         check_mips_64(ctx);
26483         gen_ld(ctx, op, rt, rs, imm);
26484         break;
26485     case OPC_SDL:
26486     case OPC_SDR:
26487         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26488         /* fall through */
26489     case OPC_SD:
26490         check_insn(ctx, ISA_MIPS3);
26491         check_mips_64(ctx);
26492         gen_st(ctx, op, rt, rs, imm);
26493         break;
26494     case OPC_SCD:
26495         check_insn_opc_removed(ctx, ISA_MIPS32R6);
26496         check_insn(ctx, ISA_MIPS3);
26497         check_mips_64(ctx);
26498         gen_st_cond(ctx, op, rt, rs, imm);
26499         break;
26500     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC, OPC_DADDI */
26501         if (ctx->insn_flags & ISA_MIPS32R6) {
26502             /* OPC_BNVC, OPC_BNEZALC, OPC_BNEC */
26503             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26504         } else {
26505             /* OPC_DADDI */
26506             check_insn(ctx, ISA_MIPS3);
26507             check_mips_64(ctx);
26508             gen_arith_imm(ctx, op, rt, rs, imm);
26509         }
26510         break;
26511     case OPC_DADDIU:
26512         check_insn(ctx, ISA_MIPS3);
26513         check_mips_64(ctx);
26514         gen_arith_imm(ctx, op, rt, rs, imm);
26515         break;
26516 #else
26517     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
26518         if (ctx->insn_flags & ISA_MIPS32R6) {
26519             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
26520         } else {
26521             MIPS_INVAL("major opcode");
26522             generate_exception_end(ctx, EXCP_RI);
26523         }
26524         break;
26525 #endif
26526     case OPC_DAUI: /* OPC_JALX */
26527         if (ctx->insn_flags & ISA_MIPS32R6) {
26528 #if defined(TARGET_MIPS64)
26529             /* OPC_DAUI */
26530             check_mips_64(ctx);
26531             if (rs == 0) {
26532                 generate_exception(ctx, EXCP_RI);
26533             } else if (rt != 0) {
26534                 TCGv t0 = tcg_temp_new();
26535                 gen_load_gpr(t0, rs);
26536                 tcg_gen_addi_tl(cpu_gpr[rt], t0, imm << 16);
26537                 tcg_temp_free(t0);
26538             }
26539 #else
26540             generate_exception_end(ctx, EXCP_RI);
26541             MIPS_INVAL("major opcode");
26542 #endif
26543         } else {
26544             /* OPC_JALX */
26545             check_insn(ctx, ASE_MIPS16 | ASE_MICROMIPS);
26546             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
26547             gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
26548         }
26549         break;
26550     case OPC_MSA: /* OPC_MDMX */
26551         if (ctx->insn_flags & INSN_R5900) {
26552             decode_tx79_lq(env, ctx);    /* TX79_LQ */
26553         } else {
26554             /* MDMX: Not implemented. */
26555             gen_msa(env, ctx);
26556         }
26557         break;
26558     case OPC_PCREL:
26559         check_insn(ctx, ISA_MIPS32R6);
26560         gen_pcrel(ctx, ctx->opcode, ctx->base.pc_next, rs);
26561         break;
26562     default:            /* Invalid */
26563         MIPS_INVAL("major opcode");
26564         generate_exception_end(ctx, EXCP_RI);
26565         break;
26566     }
26567 }
26568
26569 static void mips_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
26570 {
26571     DisasContext *ctx = container_of(dcbase, DisasContext, base);
26572     CPUMIPSState *env = cs->env_ptr;
26573
26574     ctx->page_start = ctx->base.pc_first & TARGET_PAGE_MASK;
26575     ctx->saved_pc = -1;
26576     ctx->insn_flags = env->insn_flags;
26577     ctx->CP0_Config1 = env->CP0_Config1;
26578     ctx->CP0_Config2 = env->CP0_Config2;
26579     ctx->CP0_Config3 = env->CP0_Config3;
26580     ctx->CP0_Config5 = env->CP0_Config5;
26581     ctx->btarget = 0;
26582     ctx->kscrexist = (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff;
26583     ctx->rxi = (env->CP0_Config3 >> CP0C3_RXI) & 1;
26584     ctx->ie = (env->CP0_Config4 >> CP0C4_IE) & 3;
26585     ctx->bi = (env->CP0_Config3 >> CP0C3_BI) & 1;
26586     ctx->bp = (env->CP0_Config3 >> CP0C3_BP) & 1;
26587     ctx->PAMask = env->PAMask;
26588     ctx->mvh = (env->CP0_Config5 >> CP0C5_MVH) & 1;
26589     ctx->eva = (env->CP0_Config5 >> CP0C5_EVA) & 1;
26590     ctx->sc = (env->CP0_Config3 >> CP0C3_SC) & 1;
26591     ctx->CP0_LLAddr_shift = env->CP0_LLAddr_shift;
26592     ctx->cmgcr = (env->CP0_Config3 >> CP0C3_CMGCR) & 1;
26593     /* Restore delay slot state from the tb context.  */
26594     ctx->hflags = (uint32_t)ctx->base.tb->flags; /* FIXME: maybe use 64 bits? */
26595     ctx->ulri = (env->CP0_Config3 >> CP0C3_ULRI) & 1;
26596     ctx->ps = ((env->active_fpu.fcr0 >> FCR0_PS) & 1) ||
26597              (env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F));
26598     ctx->vp = (env->CP0_Config5 >> CP0C5_VP) & 1;
26599     ctx->mrp = (env->CP0_Config5 >> CP0C5_MRP) & 1;
26600     ctx->nan2008 = (env->active_fpu.fcr31 >> FCR31_NAN2008) & 1;
26601     ctx->abs2008 = (env->active_fpu.fcr31 >> FCR31_ABS2008) & 1;
26602     restore_cpu_state(env, ctx);
26603 #ifdef CONFIG_USER_ONLY
26604         ctx->mem_idx = MIPS_HFLAG_UM;
26605 #else
26606         ctx->mem_idx = hflags_mmu_index(ctx->hflags);
26607 #endif
26608     ctx->default_tcg_memop_mask = (ctx->insn_flags & ISA_MIPS32R6) ?
26609                                   MO_UNALN : MO_ALIGN;
26610
26611     LOG_DISAS("\ntb %p idx %d hflags %04x\n", ctx->base.tb, ctx->mem_idx,
26612               ctx->hflags);
26613 }
26614
26615 static void mips_tr_tb_start(DisasContextBase *dcbase, CPUState *cs)
26616 {
26617 }
26618
26619 static void mips_tr_insn_start(DisasContextBase *dcbase, CPUState *cs)
26620 {
26621     DisasContext *ctx = container_of(dcbase, DisasContext, base);
26622
26623     tcg_gen_insn_start(ctx->base.pc_next, ctx->hflags & MIPS_HFLAG_BMASK,
26624                        ctx->btarget);
26625 }
26626
26627 static bool mips_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *cs,
26628                                      const CPUBreakpoint *bp)
26629 {
26630     DisasContext *ctx = container_of(dcbase, DisasContext, base);
26631
26632     save_cpu_state(ctx, 1);
26633     ctx->base.is_jmp = DISAS_NORETURN;
26634     gen_helper_raise_exception_debug(cpu_env);
26635     /* The address covered by the breakpoint must be included in
26636        [tb->pc, tb->pc + tb->size) in order to for it to be
26637        properly cleared -- thus we increment the PC here so that
26638        the logic setting tb->size below does the right thing.  */
26639     ctx->base.pc_next += 4;
26640     return true;
26641 }
26642
26643 static void mips_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
26644 {
26645     CPUMIPSState *env = cs->env_ptr;
26646     DisasContext *ctx = container_of(dcbase, DisasContext, base);
26647     int insn_bytes;
26648     int is_slot;
26649
26650     is_slot = ctx->hflags & MIPS_HFLAG_BMASK;
26651     if (ctx->insn_flags & ISA_NANOMIPS32) {
26652         ctx->opcode = cpu_lduw_code(env, ctx->base.pc_next);
26653         insn_bytes = decode_nanomips_opc(env, ctx);
26654     } else if (!(ctx->hflags & MIPS_HFLAG_M16)) {
26655         ctx->opcode = cpu_ldl_code(env, ctx->base.pc_next);
26656         insn_bytes = 4;
26657         decode_opc(env, ctx);
26658     } else if (ctx->insn_flags & ASE_MICROMIPS) {
26659         ctx->opcode = cpu_lduw_code(env, ctx->base.pc_next);
26660         insn_bytes = decode_micromips_opc(env, ctx);
26661     } else if (ctx->insn_flags & ASE_MIPS16) {
26662         ctx->opcode = cpu_lduw_code(env, ctx->base.pc_next);
26663         insn_bytes = decode_mips16_opc(env, ctx);
26664     } else {
26665         generate_exception_end(ctx, EXCP_RI);
26666         g_assert(ctx->base.is_jmp == DISAS_NORETURN);
26667         return;
26668     }
26669
26670     if (ctx->hflags & MIPS_HFLAG_BMASK) {
26671         if (!(ctx->hflags & (MIPS_HFLAG_BDS16 | MIPS_HFLAG_BDS32 |
26672                              MIPS_HFLAG_FBNSLOT))) {
26673             /* force to generate branch as there is neither delay nor
26674                forbidden slot */
26675             is_slot = 1;
26676         }
26677         if ((ctx->hflags & MIPS_HFLAG_M16) &&
26678             (ctx->hflags & MIPS_HFLAG_FBNSLOT)) {
26679             /* Force to generate branch as microMIPS R6 doesn't restrict
26680                branches in the forbidden slot. */
26681             is_slot = 1;
26682         }
26683     }
26684     if (is_slot) {
26685         gen_branch(ctx, insn_bytes);
26686     }
26687     ctx->base.pc_next += insn_bytes;
26688
26689     if (ctx->base.is_jmp != DISAS_NEXT) {
26690         return;
26691     }
26692     /* Execute a branch and its delay slot as a single instruction.
26693        This is what GDB expects and is consistent with what the
26694        hardware does (e.g. if a delay slot instruction faults, the
26695        reported PC is the PC of the branch).  */
26696     if (ctx->base.singlestep_enabled &&
26697         (ctx->hflags & MIPS_HFLAG_BMASK) == 0) {
26698         ctx->base.is_jmp = DISAS_TOO_MANY;
26699     }
26700     if (ctx->base.pc_next - ctx->page_start >= TARGET_PAGE_SIZE) {
26701         ctx->base.is_jmp = DISAS_TOO_MANY;
26702     }
26703 }
26704
26705 static void mips_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
26706 {
26707     DisasContext *ctx = container_of(dcbase, DisasContext, base);
26708
26709     if (ctx->base.singlestep_enabled && ctx->base.is_jmp != DISAS_NORETURN) {
26710         save_cpu_state(ctx, ctx->base.is_jmp != DISAS_EXIT);
26711         gen_helper_raise_exception_debug(cpu_env);
26712     } else {
26713         switch (ctx->base.is_jmp) {
26714         case DISAS_STOP:
26715             gen_save_pc(ctx->base.pc_next);
26716             tcg_gen_lookup_and_goto_ptr();
26717             break;
26718         case DISAS_NEXT:
26719         case DISAS_TOO_MANY:
26720             save_cpu_state(ctx, 0);
26721             gen_goto_tb(ctx, 0, ctx->base.pc_next);
26722             break;
26723         case DISAS_EXIT:
26724             tcg_gen_exit_tb(NULL, 0);
26725             break;
26726         case DISAS_NORETURN:
26727             break;
26728         default:
26729             g_assert_not_reached();
26730         }
26731     }
26732 }
26733
26734 static void mips_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
26735 {
26736     qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
26737     log_target_disas(cs, dcbase->pc_first, dcbase->tb->size);
26738 }
26739
26740 static const TranslatorOps mips_tr_ops = {
26741     .init_disas_context = mips_tr_init_disas_context,
26742     .tb_start           = mips_tr_tb_start,
26743     .insn_start         = mips_tr_insn_start,
26744     .breakpoint_check   = mips_tr_breakpoint_check,
26745     .translate_insn     = mips_tr_translate_insn,
26746     .tb_stop            = mips_tr_tb_stop,
26747     .disas_log          = mips_tr_disas_log,
26748 };
26749
26750 void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
26751 {
26752     DisasContext ctx;
26753
26754     translator_loop(&mips_tr_ops, &ctx.base, cs, tb);
26755 }
26756
26757 static void fpu_dump_state(CPUMIPSState *env, FILE *f, fprintf_function fpu_fprintf,
26758                            int flags)
26759 {
26760     int i;
26761     int is_fpu64 = !!(env->hflags & MIPS_HFLAG_F64);
26762
26763 #define printfpr(fp)                                                    \
26764     do {                                                                \
26765         if (is_fpu64)                                                   \
26766             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
26767                         " fd:%13g fs:%13g psu: %13g\n",                 \
26768                         (fp)->w[FP_ENDIAN_IDX], (fp)->d,                \
26769                         (double)(fp)->fd,                               \
26770                         (double)(fp)->fs[FP_ENDIAN_IDX],                \
26771                         (double)(fp)->fs[!FP_ENDIAN_IDX]);              \
26772         else {                                                          \
26773             fpr_t tmp;                                                  \
26774             tmp.w[FP_ENDIAN_IDX] = (fp)->w[FP_ENDIAN_IDX];              \
26775             tmp.w[!FP_ENDIAN_IDX] = ((fp) + 1)->w[FP_ENDIAN_IDX];       \
26776             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
26777                         " fd:%13g fs:%13g psu:%13g\n",                  \
26778                         tmp.w[FP_ENDIAN_IDX], tmp.d,                    \
26779                         (double)tmp.fd,                                 \
26780                         (double)tmp.fs[FP_ENDIAN_IDX],                  \
26781                         (double)tmp.fs[!FP_ENDIAN_IDX]);                \
26782         }                                                               \
26783     } while(0)
26784
26785
26786     fpu_fprintf(f, "CP1 FCR0 0x%08x  FCR31 0x%08x  SR.FR %d  fp_status 0x%02x\n",
26787                 env->active_fpu.fcr0, env->active_fpu.fcr31, is_fpu64,
26788                 get_float_exception_flags(&env->active_fpu.fp_status));
26789     for (i = 0; i < 32; (is_fpu64) ? i++ : (i += 2)) {
26790         fpu_fprintf(f, "%3s: ", fregnames[i]);
26791         printfpr(&env->active_fpu.fpr[i]);
26792     }
26793
26794 #undef printfpr
26795 }
26796
26797 void mips_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
26798                          int flags)
26799 {
26800     MIPSCPU *cpu = MIPS_CPU(cs);
26801     CPUMIPSState *env = &cpu->env;
26802     int i;
26803
26804     cpu_fprintf(f, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx
26805                 " LO=0x" TARGET_FMT_lx " ds %04x "
26806                 TARGET_FMT_lx " " TARGET_FMT_ld "\n",
26807                 env->active_tc.PC, env->active_tc.HI[0], env->active_tc.LO[0],
26808                 env->hflags, env->btarget, env->bcond);
26809     for (i = 0; i < 32; i++) {
26810         if ((i & 3) == 0)
26811             cpu_fprintf(f, "GPR%02d:", i);
26812         cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], env->active_tc.gpr[i]);
26813         if ((i & 3) == 3)
26814             cpu_fprintf(f, "\n");
26815     }
26816
26817     cpu_fprintf(f, "CP0 Status  0x%08x Cause   0x%08x EPC    0x" TARGET_FMT_lx "\n",
26818                 env->CP0_Status, env->CP0_Cause, env->CP0_EPC);
26819     cpu_fprintf(f, "    Config0 0x%08x Config1 0x%08x LLAddr 0x%016"
26820                 PRIx64 "\n",
26821                 env->CP0_Config0, env->CP0_Config1, env->lladdr);
26822     cpu_fprintf(f, "    Config2 0x%08x Config3 0x%08x\n",
26823                 env->CP0_Config2, env->CP0_Config3);
26824     cpu_fprintf(f, "    Config4 0x%08x Config5 0x%08x\n",
26825                 env->CP0_Config4, env->CP0_Config5);
26826     if ((flags & CPU_DUMP_FPU) && (env->hflags & MIPS_HFLAG_FPU)) {
26827         fpu_dump_state(env, f, cpu_fprintf, flags);
26828     }
26829 }
26830
26831 void mips_tcg_init(void)
26832 {
26833     int i;
26834
26835     cpu_gpr[0] = NULL;
26836     for (i = 1; i < 32; i++)
26837         cpu_gpr[i] = tcg_global_mem_new(cpu_env,
26838                                         offsetof(CPUMIPSState, active_tc.gpr[i]),
26839                                         regnames[i]);
26840
26841     for (i = 0; i < 32; i++) {
26842         int off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[0]);
26843         msa_wr_d[i * 2] =
26844                 tcg_global_mem_new_i64(cpu_env, off, msaregnames[i * 2]);
26845         /* The scalar floating-point unit (FPU) registers are mapped on
26846          * the MSA vector registers. */
26847         fpu_f64[i] = msa_wr_d[i * 2];
26848         off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[1]);
26849         msa_wr_d[i * 2 + 1] =
26850                 tcg_global_mem_new_i64(cpu_env, off, msaregnames[i * 2 + 1]);
26851     }
26852
26853     cpu_PC = tcg_global_mem_new(cpu_env,
26854                                 offsetof(CPUMIPSState, active_tc.PC), "PC");
26855     for (i = 0; i < MIPS_DSP_ACC; i++) {
26856         cpu_HI[i] = tcg_global_mem_new(cpu_env,
26857                                        offsetof(CPUMIPSState, active_tc.HI[i]),
26858                                        regnames_HI[i]);
26859         cpu_LO[i] = tcg_global_mem_new(cpu_env,
26860                                        offsetof(CPUMIPSState, active_tc.LO[i]),
26861                                        regnames_LO[i]);
26862     }
26863     cpu_dspctrl = tcg_global_mem_new(cpu_env,
26864                                      offsetof(CPUMIPSState, active_tc.DSPControl),
26865                                      "DSPControl");
26866     bcond = tcg_global_mem_new(cpu_env,
26867                                offsetof(CPUMIPSState, bcond), "bcond");
26868     btarget = tcg_global_mem_new(cpu_env,
26869                                  offsetof(CPUMIPSState, btarget), "btarget");
26870     hflags = tcg_global_mem_new_i32(cpu_env,
26871                                     offsetof(CPUMIPSState, hflags), "hflags");
26872
26873     fpu_fcr0 = tcg_global_mem_new_i32(cpu_env,
26874                                       offsetof(CPUMIPSState, active_fpu.fcr0),
26875                                       "fcr0");
26876     fpu_fcr31 = tcg_global_mem_new_i32(cpu_env,
26877                                        offsetof(CPUMIPSState, active_fpu.fcr31),
26878                                        "fcr31");
26879 }
26880
26881 #include "translate_init.inc.c"
26882
26883 void cpu_mips_realize_env(CPUMIPSState *env)
26884 {
26885     env->exception_base = (int32_t)0xBFC00000;
26886
26887 #ifndef CONFIG_USER_ONLY
26888     mmu_init(env, env->cpu_model);
26889 #endif
26890     fpu_init(env, env->cpu_model);
26891     mvp_init(env, env->cpu_model);
26892 }
26893
26894 bool cpu_supports_cps_smp(const char *cpu_type)
26895 {
26896     const MIPSCPUClass *mcc = MIPS_CPU_CLASS(object_class_by_name(cpu_type));
26897     return (mcc->cpu_def->CP0_Config3 & (1 << CP0C3_CMGCR)) != 0;
26898 }
26899
26900 bool cpu_supports_isa(const char *cpu_type, unsigned int isa)
26901 {
26902     const MIPSCPUClass *mcc = MIPS_CPU_CLASS(object_class_by_name(cpu_type));
26903     return (mcc->cpu_def->insn_flags & isa) != 0;
26904 }
26905
26906 void cpu_set_exception_base(int vp_index, target_ulong address)
26907 {
26908     MIPSCPU *vp = MIPS_CPU(qemu_get_cpu(vp_index));
26909     vp->env.exception_base = address;
26910 }
26911
26912 void cpu_state_reset(CPUMIPSState *env)
26913 {
26914     MIPSCPU *cpu = mips_env_get_cpu(env);
26915     CPUState *cs = CPU(cpu);
26916
26917     /* Reset registers to their default values */
26918     env->CP0_PRid = env->cpu_model->CP0_PRid;
26919     env->CP0_Config0 = env->cpu_model->CP0_Config0;
26920 #ifdef TARGET_WORDS_BIGENDIAN
26921     env->CP0_Config0 |= (1 << CP0C0_BE);
26922 #endif
26923     env->CP0_Config1 = env->cpu_model->CP0_Config1;
26924     env->CP0_Config2 = env->cpu_model->CP0_Config2;
26925     env->CP0_Config3 = env->cpu_model->CP0_Config3;
26926     env->CP0_Config4 = env->cpu_model->CP0_Config4;
26927     env->CP0_Config4_rw_bitmask = env->cpu_model->CP0_Config4_rw_bitmask;
26928     env->CP0_Config5 = env->cpu_model->CP0_Config5;
26929     env->CP0_Config5_rw_bitmask = env->cpu_model->CP0_Config5_rw_bitmask;
26930     env->CP0_Config6 = env->cpu_model->CP0_Config6;
26931     env->CP0_Config7 = env->cpu_model->CP0_Config7;
26932     env->CP0_LLAddr_rw_bitmask = env->cpu_model->CP0_LLAddr_rw_bitmask
26933                                  << env->cpu_model->CP0_LLAddr_shift;
26934     env->CP0_LLAddr_shift = env->cpu_model->CP0_LLAddr_shift;
26935     env->SYNCI_Step = env->cpu_model->SYNCI_Step;
26936     env->CCRes = env->cpu_model->CCRes;
26937     env->CP0_Status_rw_bitmask = env->cpu_model->CP0_Status_rw_bitmask;
26938     env->CP0_TCStatus_rw_bitmask = env->cpu_model->CP0_TCStatus_rw_bitmask;
26939     env->CP0_SRSCtl = env->cpu_model->CP0_SRSCtl;
26940     env->current_tc = 0;
26941     env->SEGBITS = env->cpu_model->SEGBITS;
26942     env->SEGMask = (target_ulong)((1ULL << env->cpu_model->SEGBITS) - 1);
26943 #if defined(TARGET_MIPS64)
26944     if (env->cpu_model->insn_flags & ISA_MIPS3) {
26945         env->SEGMask |= 3ULL << 62;
26946     }
26947 #endif
26948     env->PABITS = env->cpu_model->PABITS;
26949     env->CP0_SRSConf0_rw_bitmask = env->cpu_model->CP0_SRSConf0_rw_bitmask;
26950     env->CP0_SRSConf0 = env->cpu_model->CP0_SRSConf0;
26951     env->CP0_SRSConf1_rw_bitmask = env->cpu_model->CP0_SRSConf1_rw_bitmask;
26952     env->CP0_SRSConf1 = env->cpu_model->CP0_SRSConf1;
26953     env->CP0_SRSConf2_rw_bitmask = env->cpu_model->CP0_SRSConf2_rw_bitmask;
26954     env->CP0_SRSConf2 = env->cpu_model->CP0_SRSConf2;
26955     env->CP0_SRSConf3_rw_bitmask = env->cpu_model->CP0_SRSConf3_rw_bitmask;
26956     env->CP0_SRSConf3 = env->cpu_model->CP0_SRSConf3;
26957     env->CP0_SRSConf4_rw_bitmask = env->cpu_model->CP0_SRSConf4_rw_bitmask;
26958     env->CP0_SRSConf4 = env->cpu_model->CP0_SRSConf4;
26959     env->CP0_PageGrain_rw_bitmask = env->cpu_model->CP0_PageGrain_rw_bitmask;
26960     env->CP0_PageGrain = env->cpu_model->CP0_PageGrain;
26961     env->CP0_EBaseWG_rw_bitmask = env->cpu_model->CP0_EBaseWG_rw_bitmask;
26962     env->active_fpu.fcr0 = env->cpu_model->CP1_fcr0;
26963     env->active_fpu.fcr31_rw_bitmask = env->cpu_model->CP1_fcr31_rw_bitmask;
26964     env->active_fpu.fcr31 = env->cpu_model->CP1_fcr31;
26965     env->msair = env->cpu_model->MSAIR;
26966     env->insn_flags = env->cpu_model->insn_flags;
26967
26968 #if defined(CONFIG_USER_ONLY)
26969     env->CP0_Status = (MIPS_HFLAG_UM << CP0St_KSU);
26970 # ifdef TARGET_MIPS64
26971     /* Enable 64-bit register mode.  */
26972     env->CP0_Status |= (1 << CP0St_PX);
26973 # endif
26974 # ifdef TARGET_ABI_MIPSN64
26975     /* Enable 64-bit address mode.  */
26976     env->CP0_Status |= (1 << CP0St_UX);
26977 # endif
26978     /* Enable access to the CPUNum, SYNCI_Step, CC, and CCRes RDHWR
26979        hardware registers.  */
26980     env->CP0_HWREna |= 0x0000000F;
26981     if (env->CP0_Config1 & (1 << CP0C1_FP)) {
26982         env->CP0_Status |= (1 << CP0St_CU1);
26983     }
26984     if (env->CP0_Config3 & (1 << CP0C3_DSPP)) {
26985         env->CP0_Status |= (1 << CP0St_MX);
26986     }
26987 # if defined(TARGET_MIPS64)
26988     /* For MIPS64, init FR bit to 1 if FPU unit is there and bit is writable. */
26989     if ((env->CP0_Config1 & (1 << CP0C1_FP)) &&
26990         (env->CP0_Status_rw_bitmask & (1 << CP0St_FR))) {
26991         env->CP0_Status |= (1 << CP0St_FR);
26992     }
26993 # endif
26994 #else
26995     if (env->hflags & MIPS_HFLAG_BMASK) {
26996         /* If the exception was raised from a delay slot,
26997            come back to the jump.  */
26998         env->CP0_ErrorEPC = (env->active_tc.PC
26999                              - (env->hflags & MIPS_HFLAG_B16 ? 2 : 4));
27000     } else {
27001         env->CP0_ErrorEPC = env->active_tc.PC;
27002     }
27003     env->active_tc.PC = env->exception_base;
27004     env->CP0_Random = env->tlb->nb_tlb - 1;
27005     env->tlb->tlb_in_use = env->tlb->nb_tlb;
27006     env->CP0_Wired = 0;
27007     env->CP0_GlobalNumber = (cs->cpu_index & 0xFF) << CP0GN_VPId;
27008     env->CP0_EBase = (cs->cpu_index & 0x3FF);
27009     if (mips_um_ksegs_enabled()) {
27010         env->CP0_EBase |= 0x40000000;
27011     } else {
27012         env->CP0_EBase |= (int32_t)0x80000000;
27013     }
27014     if (env->CP0_Config3 & (1 << CP0C3_CMGCR)) {
27015         env->CP0_CMGCRBase = 0x1fbf8000 >> 4;
27016     }
27017     env->CP0_EntryHi_ASID_mask = (env->CP0_Config4 & (1 << CP0C4_AE)) ?
27018                                  0x3ff : 0xff;
27019     env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
27020     /* vectored interrupts not implemented, timer on int 7,
27021        no performance counters. */
27022     env->CP0_IntCtl = 0xe0000000;
27023     {
27024         int i;
27025
27026         for (i = 0; i < 7; i++) {
27027             env->CP0_WatchLo[i] = 0;
27028             env->CP0_WatchHi[i] = 0x80000000;
27029         }
27030         env->CP0_WatchLo[7] = 0;
27031         env->CP0_WatchHi[7] = 0;
27032     }
27033     /* Count register increments in debug mode, EJTAG version 1 */
27034     env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
27035
27036     cpu_mips_store_count(env, 1);
27037
27038     if (env->CP0_Config3 & (1 << CP0C3_MT)) {
27039         int i;
27040
27041         /* Only TC0 on VPE 0 starts as active.  */
27042         for (i = 0; i < ARRAY_SIZE(env->tcs); i++) {
27043             env->tcs[i].CP0_TCBind = cs->cpu_index << CP0TCBd_CurVPE;
27044             env->tcs[i].CP0_TCHalt = 1;
27045         }
27046         env->active_tc.CP0_TCHalt = 1;
27047         cs->halted = 1;
27048
27049         if (cs->cpu_index == 0) {
27050             /* VPE0 starts up enabled.  */
27051             env->mvp->CP0_MVPControl |= (1 << CP0MVPCo_EVP);
27052             env->CP0_VPEConf0 |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA);
27053
27054             /* TC0 starts up unhalted.  */
27055             cs->halted = 0;
27056             env->active_tc.CP0_TCHalt = 0;
27057             env->tcs[0].CP0_TCHalt = 0;
27058             /* With thread 0 active.  */
27059             env->active_tc.CP0_TCStatus = (1 << CP0TCSt_A);
27060             env->tcs[0].CP0_TCStatus = (1 << CP0TCSt_A);
27061         }
27062     }
27063
27064     /*
27065      * Configure default legacy segmentation control. We use this regardless of
27066      * whether segmentation control is presented to the guest.
27067      */
27068     /* KSeg3 (seg0 0xE0000000..0xFFFFFFFF) */
27069     env->CP0_SegCtl0 =   (CP0SC_AM_MK << CP0SC_AM);
27070     /* KSeg2 (seg1 0xC0000000..0xDFFFFFFF) */
27071     env->CP0_SegCtl0 |= ((CP0SC_AM_MSK << CP0SC_AM)) << 16;
27072     /* KSeg1 (seg2 0xA0000000..0x9FFFFFFF) */
27073     env->CP0_SegCtl1 =   (0 << CP0SC_PA) | (CP0SC_AM_UK << CP0SC_AM) |
27074                          (2 << CP0SC_C);
27075     /* KSeg0 (seg3 0x80000000..0x9FFFFFFF) */
27076     env->CP0_SegCtl1 |= ((0 << CP0SC_PA) | (CP0SC_AM_UK << CP0SC_AM) |
27077                          (3 << CP0SC_C)) << 16;
27078     /* USeg (seg4 0x40000000..0x7FFFFFFF) */
27079     env->CP0_SegCtl2 =   (2 << CP0SC_PA) | (CP0SC_AM_MUSK << CP0SC_AM) |
27080                          (1 << CP0SC_EU) | (2 << CP0SC_C);
27081     /* USeg (seg5 0x00000000..0x3FFFFFFF) */
27082     env->CP0_SegCtl2 |= ((0 << CP0SC_PA) | (CP0SC_AM_MUSK << CP0SC_AM) |
27083                          (1 << CP0SC_EU) | (2 << CP0SC_C)) << 16;
27084     /* XKPhys (note, SegCtl2.XR = 0, so XAM won't be used) */
27085     env->CP0_SegCtl1 |= (CP0SC_AM_UK << CP0SC1_XAM);
27086 #endif
27087     if ((env->insn_flags & ISA_MIPS32R6) &&
27088         (env->active_fpu.fcr0 & (1 << FCR0_F64))) {
27089         /* Status.FR = 0 mode in 64-bit FPU not allowed in R6 */
27090         env->CP0_Status |= (1 << CP0St_FR);
27091     }
27092
27093     if (env->insn_flags & ISA_MIPS32R6) {
27094         /* PTW  =  1 */
27095         env->CP0_PWSize = 0x40;
27096         /* GDI  = 12 */
27097         /* UDI  = 12 */
27098         /* MDI  = 12 */
27099         /* PRI  = 12 */
27100         /* PTEI =  2 */
27101         env->CP0_PWField = 0x0C30C302;
27102     } else {
27103         /* GDI  =  0 */
27104         /* UDI  =  0 */
27105         /* MDI  =  0 */
27106         /* PRI  =  0 */
27107         /* PTEI =  2 */
27108         env->CP0_PWField = 0x02;
27109     }
27110
27111     if (env->CP0_Config3 & (1 << CP0C3_ISA) & (1 << (CP0C3_ISA + 1))) {
27112         /*  microMIPS on reset when Config3.ISA is 3 */
27113         env->hflags |= MIPS_HFLAG_M16;
27114     }
27115
27116     /* MSA */
27117     if (env->CP0_Config3 & (1 << CP0C3_MSAP)) {
27118         msa_reset(env);
27119     }
27120
27121     compute_hflags(env);
27122     restore_fp_status(env);
27123     restore_pamask(env);
27124     cs->exception_index = EXCP_NONE;
27125
27126     if (semihosting_get_argc()) {
27127         /* UHI interface can be used to obtain argc and argv */
27128         env->active_tc.gpr[4] = -1;
27129     }
27130 }
27131
27132 void restore_state_to_opc(CPUMIPSState *env, TranslationBlock *tb,
27133                           target_ulong *data)
27134 {
27135     env->active_tc.PC = data[0];
27136     env->hflags &= ~MIPS_HFLAG_BMASK;
27137     env->hflags |= data[1];
27138     switch (env->hflags & MIPS_HFLAG_BMASK_BASE) {
27139     case MIPS_HFLAG_BR:
27140         break;
27141     case MIPS_HFLAG_BC:
27142     case MIPS_HFLAG_BL:
27143     case MIPS_HFLAG_B:
27144         env->btarget = data[2];
27145         break;
27146     }
27147 }
This page took 1.509405 seconds and 4 git commands to generate.