]> Git Repo - qemu.git/blob - target-mips/translate.c
target-mips: extend selected CP0 registers to 64-bits in MIPS32
[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 "cpu.h"
25 #include "disas/disas.h"
26 #include "tcg-op.h"
27 #include "exec/cpu_ldst.h"
28
29 #include "exec/helper-proto.h"
30 #include "exec/helper-gen.h"
31 #include "sysemu/kvm.h"
32
33 #include "trace-tcg.h"
34
35
36 #define MIPS_DEBUG_DISAS 0
37 //#define MIPS_DEBUG_SIGN_EXTENSIONS
38
39 /* MIPS major opcodes */
40 #define MASK_OP_MAJOR(op)  (op & (0x3F << 26))
41
42 enum {
43     /* indirect opcode tables */
44     OPC_SPECIAL  = (0x00 << 26),
45     OPC_REGIMM   = (0x01 << 26),
46     OPC_CP0      = (0x10 << 26),
47     OPC_CP1      = (0x11 << 26),
48     OPC_CP2      = (0x12 << 26),
49     OPC_CP3      = (0x13 << 26),
50     OPC_SPECIAL2 = (0x1C << 26),
51     OPC_SPECIAL3 = (0x1F << 26),
52     /* arithmetic with immediate */
53     OPC_ADDI     = (0x08 << 26),
54     OPC_ADDIU    = (0x09 << 26),
55     OPC_SLTI     = (0x0A << 26),
56     OPC_SLTIU    = (0x0B << 26),
57     /* logic with immediate */
58     OPC_ANDI     = (0x0C << 26),
59     OPC_ORI      = (0x0D << 26),
60     OPC_XORI     = (0x0E << 26),
61     OPC_LUI      = (0x0F << 26),
62     /* arithmetic with immediate */
63     OPC_DADDI    = (0x18 << 26),
64     OPC_DADDIU   = (0x19 << 26),
65     /* Jump and branches */
66     OPC_J        = (0x02 << 26),
67     OPC_JAL      = (0x03 << 26),
68     OPC_BEQ      = (0x04 << 26),  /* Unconditional if rs = rt = 0 (B) */
69     OPC_BEQL     = (0x14 << 26),
70     OPC_BNE      = (0x05 << 26),
71     OPC_BNEL     = (0x15 << 26),
72     OPC_BLEZ     = (0x06 << 26),
73     OPC_BLEZL    = (0x16 << 26),
74     OPC_BGTZ     = (0x07 << 26),
75     OPC_BGTZL    = (0x17 << 26),
76     OPC_JALX     = (0x1D << 26),
77     OPC_DAUI     = (0x1D << 26),
78     /* Load and stores */
79     OPC_LDL      = (0x1A << 26),
80     OPC_LDR      = (0x1B << 26),
81     OPC_LB       = (0x20 << 26),
82     OPC_LH       = (0x21 << 26),
83     OPC_LWL      = (0x22 << 26),
84     OPC_LW       = (0x23 << 26),
85     OPC_LWPC     = OPC_LW | 0x5,
86     OPC_LBU      = (0x24 << 26),
87     OPC_LHU      = (0x25 << 26),
88     OPC_LWR      = (0x26 << 26),
89     OPC_LWU      = (0x27 << 26),
90     OPC_SB       = (0x28 << 26),
91     OPC_SH       = (0x29 << 26),
92     OPC_SWL      = (0x2A << 26),
93     OPC_SW       = (0x2B << 26),
94     OPC_SDL      = (0x2C << 26),
95     OPC_SDR      = (0x2D << 26),
96     OPC_SWR      = (0x2E << 26),
97     OPC_LL       = (0x30 << 26),
98     OPC_LLD      = (0x34 << 26),
99     OPC_LD       = (0x37 << 26),
100     OPC_LDPC     = OPC_LD | 0x5,
101     OPC_SC       = (0x38 << 26),
102     OPC_SCD      = (0x3C << 26),
103     OPC_SD       = (0x3F << 26),
104     /* Floating point load/store */
105     OPC_LWC1     = (0x31 << 26),
106     OPC_LWC2     = (0x32 << 26),
107     OPC_LDC1     = (0x35 << 26),
108     OPC_LDC2     = (0x36 << 26),
109     OPC_SWC1     = (0x39 << 26),
110     OPC_SWC2     = (0x3A << 26),
111     OPC_SDC1     = (0x3D << 26),
112     OPC_SDC2     = (0x3E << 26),
113     /* Compact Branches */
114     OPC_BLEZALC  = (0x06 << 26),
115     OPC_BGEZALC  = (0x06 << 26),
116     OPC_BGEUC    = (0x06 << 26),
117     OPC_BGTZALC  = (0x07 << 26),
118     OPC_BLTZALC  = (0x07 << 26),
119     OPC_BLTUC    = (0x07 << 26),
120     OPC_BOVC     = (0x08 << 26),
121     OPC_BEQZALC  = (0x08 << 26),
122     OPC_BEQC     = (0x08 << 26),
123     OPC_BLEZC    = (0x16 << 26),
124     OPC_BGEZC    = (0x16 << 26),
125     OPC_BGEC     = (0x16 << 26),
126     OPC_BGTZC    = (0x17 << 26),
127     OPC_BLTZC    = (0x17 << 26),
128     OPC_BLTC     = (0x17 << 26),
129     OPC_BNVC     = (0x18 << 26),
130     OPC_BNEZALC  = (0x18 << 26),
131     OPC_BNEC     = (0x18 << 26),
132     OPC_BC       = (0x32 << 26),
133     OPC_BEQZC    = (0x36 << 26),
134     OPC_JIC      = (0x36 << 26),
135     OPC_BALC     = (0x3A << 26),
136     OPC_BNEZC    = (0x3E << 26),
137     OPC_JIALC    = (0x3E << 26),
138     /* MDMX ASE specific */
139     OPC_MDMX     = (0x1E << 26),
140     /* MSA ASE, same as MDMX */
141     OPC_MSA      = OPC_MDMX,
142     /* Cache and prefetch */
143     OPC_CACHE    = (0x2F << 26),
144     OPC_PREF     = (0x33 << 26),
145     /* PC-relative address computation / loads */
146     OPC_PCREL    = (0x3B << 26),
147 };
148
149 /* PC-relative address computation / loads  */
150 #define MASK_OPC_PCREL_TOP2BITS(op)  (MASK_OP_MAJOR(op) | (op & (3 << 19)))
151 #define MASK_OPC_PCREL_TOP5BITS(op)  (MASK_OP_MAJOR(op) | (op & (0x1f << 16)))
152 enum {
153     /* Instructions determined by bits 19 and 20 */
154     OPC_ADDIUPC = OPC_PCREL | (0 << 19),
155     R6_OPC_LWPC = OPC_PCREL | (1 << 19),
156     OPC_LWUPC   = OPC_PCREL | (2 << 19),
157
158     /* Instructions determined by bits 16 ... 20 */
159     OPC_AUIPC   = OPC_PCREL | (0x1e << 16),
160     OPC_ALUIPC  = OPC_PCREL | (0x1f << 16),
161
162     /* Other */
163     R6_OPC_LDPC = OPC_PCREL | (6 << 18),
164 };
165
166 /* MIPS special opcodes */
167 #define MASK_SPECIAL(op)   MASK_OP_MAJOR(op) | (op & 0x3F)
168
169 enum {
170     /* Shifts */
171     OPC_SLL      = 0x00 | OPC_SPECIAL,
172     /* NOP is SLL r0, r0, 0   */
173     /* SSNOP is SLL r0, r0, 1 */
174     /* EHB is SLL r0, r0, 3 */
175     OPC_SRL      = 0x02 | OPC_SPECIAL, /* also ROTR */
176     OPC_ROTR     = OPC_SRL | (1 << 21),
177     OPC_SRA      = 0x03 | OPC_SPECIAL,
178     OPC_SLLV     = 0x04 | OPC_SPECIAL,
179     OPC_SRLV     = 0x06 | OPC_SPECIAL, /* also ROTRV */
180     OPC_ROTRV    = OPC_SRLV | (1 << 6),
181     OPC_SRAV     = 0x07 | OPC_SPECIAL,
182     OPC_DSLLV    = 0x14 | OPC_SPECIAL,
183     OPC_DSRLV    = 0x16 | OPC_SPECIAL, /* also DROTRV */
184     OPC_DROTRV   = OPC_DSRLV | (1 << 6),
185     OPC_DSRAV    = 0x17 | OPC_SPECIAL,
186     OPC_DSLL     = 0x38 | OPC_SPECIAL,
187     OPC_DSRL     = 0x3A | OPC_SPECIAL, /* also DROTR */
188     OPC_DROTR    = OPC_DSRL | (1 << 21),
189     OPC_DSRA     = 0x3B | OPC_SPECIAL,
190     OPC_DSLL32   = 0x3C | OPC_SPECIAL,
191     OPC_DSRL32   = 0x3E | OPC_SPECIAL, /* also DROTR32 */
192     OPC_DROTR32  = OPC_DSRL32 | (1 << 21),
193     OPC_DSRA32   = 0x3F | OPC_SPECIAL,
194     /* Multiplication / division */
195     OPC_MULT     = 0x18 | OPC_SPECIAL,
196     OPC_MULTU    = 0x19 | OPC_SPECIAL,
197     OPC_DIV      = 0x1A | OPC_SPECIAL,
198     OPC_DIVU     = 0x1B | OPC_SPECIAL,
199     OPC_DMULT    = 0x1C | OPC_SPECIAL,
200     OPC_DMULTU   = 0x1D | OPC_SPECIAL,
201     OPC_DDIV     = 0x1E | OPC_SPECIAL,
202     OPC_DDIVU    = 0x1F | OPC_SPECIAL,
203
204     /* 2 registers arithmetic / logic */
205     OPC_ADD      = 0x20 | OPC_SPECIAL,
206     OPC_ADDU     = 0x21 | OPC_SPECIAL,
207     OPC_SUB      = 0x22 | OPC_SPECIAL,
208     OPC_SUBU     = 0x23 | OPC_SPECIAL,
209     OPC_AND      = 0x24 | OPC_SPECIAL,
210     OPC_OR       = 0x25 | OPC_SPECIAL,
211     OPC_XOR      = 0x26 | OPC_SPECIAL,
212     OPC_NOR      = 0x27 | OPC_SPECIAL,
213     OPC_SLT      = 0x2A | OPC_SPECIAL,
214     OPC_SLTU     = 0x2B | OPC_SPECIAL,
215     OPC_DADD     = 0x2C | OPC_SPECIAL,
216     OPC_DADDU    = 0x2D | OPC_SPECIAL,
217     OPC_DSUB     = 0x2E | OPC_SPECIAL,
218     OPC_DSUBU    = 0x2F | OPC_SPECIAL,
219     /* Jumps */
220     OPC_JR       = 0x08 | OPC_SPECIAL, /* Also JR.HB */
221     OPC_JALR     = 0x09 | OPC_SPECIAL, /* Also JALR.HB */
222     /* Traps */
223     OPC_TGE      = 0x30 | OPC_SPECIAL,
224     OPC_TGEU     = 0x31 | OPC_SPECIAL,
225     OPC_TLT      = 0x32 | OPC_SPECIAL,
226     OPC_TLTU     = 0x33 | OPC_SPECIAL,
227     OPC_TEQ      = 0x34 | OPC_SPECIAL,
228     OPC_TNE      = 0x36 | OPC_SPECIAL,
229     /* HI / LO registers load & stores */
230     OPC_MFHI     = 0x10 | OPC_SPECIAL,
231     OPC_MTHI     = 0x11 | OPC_SPECIAL,
232     OPC_MFLO     = 0x12 | OPC_SPECIAL,
233     OPC_MTLO     = 0x13 | OPC_SPECIAL,
234     /* Conditional moves */
235     OPC_MOVZ     = 0x0A | OPC_SPECIAL,
236     OPC_MOVN     = 0x0B | OPC_SPECIAL,
237
238     OPC_SELEQZ   = 0x35 | OPC_SPECIAL,
239     OPC_SELNEZ   = 0x37 | OPC_SPECIAL,
240
241     OPC_MOVCI    = 0x01 | OPC_SPECIAL,
242
243     /* Special */
244     OPC_PMON     = 0x05 | OPC_SPECIAL, /* unofficial */
245     OPC_SYSCALL  = 0x0C | OPC_SPECIAL,
246     OPC_BREAK    = 0x0D | OPC_SPECIAL,
247     OPC_SPIM     = 0x0E | OPC_SPECIAL, /* unofficial */
248     OPC_SYNC     = 0x0F | OPC_SPECIAL,
249
250     OPC_SPECIAL28_RESERVED = 0x28 | OPC_SPECIAL,
251     OPC_SPECIAL29_RESERVED = 0x29 | OPC_SPECIAL,
252     OPC_SPECIAL39_RESERVED = 0x39 | OPC_SPECIAL,
253     OPC_SPECIAL3D_RESERVED = 0x3D | OPC_SPECIAL,
254 };
255
256 /* R6 Multiply and Divide instructions have the same Opcode
257    and function field as legacy OPC_MULT[U]/OPC_DIV[U] */
258 #define MASK_R6_MULDIV(op)   (MASK_SPECIAL(op) | (op & (0x7ff)))
259
260 enum {
261     R6_OPC_MUL   = OPC_MULT  | (2 << 6),
262     R6_OPC_MUH   = OPC_MULT  | (3 << 6),
263     R6_OPC_MULU  = OPC_MULTU | (2 << 6),
264     R6_OPC_MUHU  = OPC_MULTU | (3 << 6),
265     R6_OPC_DIV   = OPC_DIV   | (2 << 6),
266     R6_OPC_MOD   = OPC_DIV   | (3 << 6),
267     R6_OPC_DIVU  = OPC_DIVU  | (2 << 6),
268     R6_OPC_MODU  = OPC_DIVU  | (3 << 6),
269
270     R6_OPC_DMUL   = OPC_DMULT  | (2 << 6),
271     R6_OPC_DMUH   = OPC_DMULT  | (3 << 6),
272     R6_OPC_DMULU  = OPC_DMULTU | (2 << 6),
273     R6_OPC_DMUHU  = OPC_DMULTU | (3 << 6),
274     R6_OPC_DDIV   = OPC_DDIV   | (2 << 6),
275     R6_OPC_DMOD   = OPC_DDIV   | (3 << 6),
276     R6_OPC_DDIVU  = OPC_DDIVU  | (2 << 6),
277     R6_OPC_DMODU  = OPC_DDIVU  | (3 << 6),
278
279     R6_OPC_CLZ      = 0x10 | OPC_SPECIAL,
280     R6_OPC_CLO      = 0x11 | OPC_SPECIAL,
281     R6_OPC_DCLZ     = 0x12 | OPC_SPECIAL,
282     R6_OPC_DCLO     = 0x13 | OPC_SPECIAL,
283     R6_OPC_SDBBP    = 0x0e | OPC_SPECIAL,
284
285     OPC_LSA  = 0x05 | OPC_SPECIAL,
286     OPC_DLSA = 0x15 | OPC_SPECIAL,
287 };
288
289 /* Multiplication variants of the vr54xx. */
290 #define MASK_MUL_VR54XX(op)   MASK_SPECIAL(op) | (op & (0x1F << 6))
291
292 enum {
293     OPC_VR54XX_MULS    = (0x03 << 6) | OPC_MULT,
294     OPC_VR54XX_MULSU   = (0x03 << 6) | OPC_MULTU,
295     OPC_VR54XX_MACC    = (0x05 << 6) | OPC_MULT,
296     OPC_VR54XX_MACCU   = (0x05 << 6) | OPC_MULTU,
297     OPC_VR54XX_MSAC    = (0x07 << 6) | OPC_MULT,
298     OPC_VR54XX_MSACU   = (0x07 << 6) | OPC_MULTU,
299     OPC_VR54XX_MULHI   = (0x09 << 6) | OPC_MULT,
300     OPC_VR54XX_MULHIU  = (0x09 << 6) | OPC_MULTU,
301     OPC_VR54XX_MULSHI  = (0x0B << 6) | OPC_MULT,
302     OPC_VR54XX_MULSHIU = (0x0B << 6) | OPC_MULTU,
303     OPC_VR54XX_MACCHI  = (0x0D << 6) | OPC_MULT,
304     OPC_VR54XX_MACCHIU = (0x0D << 6) | OPC_MULTU,
305     OPC_VR54XX_MSACHI  = (0x0F << 6) | OPC_MULT,
306     OPC_VR54XX_MSACHIU = (0x0F << 6) | OPC_MULTU,
307 };
308
309 /* REGIMM (rt field) opcodes */
310 #define MASK_REGIMM(op)    MASK_OP_MAJOR(op) | (op & (0x1F << 16))
311
312 enum {
313     OPC_BLTZ     = (0x00 << 16) | OPC_REGIMM,
314     OPC_BLTZL    = (0x02 << 16) | OPC_REGIMM,
315     OPC_BGEZ     = (0x01 << 16) | OPC_REGIMM,
316     OPC_BGEZL    = (0x03 << 16) | OPC_REGIMM,
317     OPC_BLTZAL   = (0x10 << 16) | OPC_REGIMM,
318     OPC_BLTZALL  = (0x12 << 16) | OPC_REGIMM,
319     OPC_BGEZAL   = (0x11 << 16) | OPC_REGIMM,
320     OPC_BGEZALL  = (0x13 << 16) | OPC_REGIMM,
321     OPC_TGEI     = (0x08 << 16) | OPC_REGIMM,
322     OPC_TGEIU    = (0x09 << 16) | OPC_REGIMM,
323     OPC_TLTI     = (0x0A << 16) | OPC_REGIMM,
324     OPC_TLTIU    = (0x0B << 16) | OPC_REGIMM,
325     OPC_TEQI     = (0x0C << 16) | OPC_REGIMM,
326     OPC_TNEI     = (0x0E << 16) | OPC_REGIMM,
327     OPC_SYNCI    = (0x1F << 16) | OPC_REGIMM,
328
329     OPC_DAHI     = (0x06 << 16) | OPC_REGIMM,
330     OPC_DATI     = (0x1e << 16) | OPC_REGIMM,
331 };
332
333 /* Special2 opcodes */
334 #define MASK_SPECIAL2(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
335
336 enum {
337     /* Multiply & xxx operations */
338     OPC_MADD     = 0x00 | OPC_SPECIAL2,
339     OPC_MADDU    = 0x01 | OPC_SPECIAL2,
340     OPC_MUL      = 0x02 | OPC_SPECIAL2,
341     OPC_MSUB     = 0x04 | OPC_SPECIAL2,
342     OPC_MSUBU    = 0x05 | OPC_SPECIAL2,
343     /* Loongson 2F */
344     OPC_MULT_G_2F   = 0x10 | OPC_SPECIAL2,
345     OPC_DMULT_G_2F  = 0x11 | OPC_SPECIAL2,
346     OPC_MULTU_G_2F  = 0x12 | OPC_SPECIAL2,
347     OPC_DMULTU_G_2F = 0x13 | OPC_SPECIAL2,
348     OPC_DIV_G_2F    = 0x14 | OPC_SPECIAL2,
349     OPC_DDIV_G_2F   = 0x15 | OPC_SPECIAL2,
350     OPC_DIVU_G_2F   = 0x16 | OPC_SPECIAL2,
351     OPC_DDIVU_G_2F  = 0x17 | OPC_SPECIAL2,
352     OPC_MOD_G_2F    = 0x1c | OPC_SPECIAL2,
353     OPC_DMOD_G_2F   = 0x1d | OPC_SPECIAL2,
354     OPC_MODU_G_2F   = 0x1e | OPC_SPECIAL2,
355     OPC_DMODU_G_2F  = 0x1f | OPC_SPECIAL2,
356     /* Misc */
357     OPC_CLZ      = 0x20 | OPC_SPECIAL2,
358     OPC_CLO      = 0x21 | OPC_SPECIAL2,
359     OPC_DCLZ     = 0x24 | OPC_SPECIAL2,
360     OPC_DCLO     = 0x25 | OPC_SPECIAL2,
361     /* Special */
362     OPC_SDBBP    = 0x3F | OPC_SPECIAL2,
363 };
364
365 /* Special3 opcodes */
366 #define MASK_SPECIAL3(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
367
368 enum {
369     OPC_EXT      = 0x00 | OPC_SPECIAL3,
370     OPC_DEXTM    = 0x01 | OPC_SPECIAL3,
371     OPC_DEXTU    = 0x02 | OPC_SPECIAL3,
372     OPC_DEXT     = 0x03 | OPC_SPECIAL3,
373     OPC_INS      = 0x04 | OPC_SPECIAL3,
374     OPC_DINSM    = 0x05 | OPC_SPECIAL3,
375     OPC_DINSU    = 0x06 | OPC_SPECIAL3,
376     OPC_DINS     = 0x07 | OPC_SPECIAL3,
377     OPC_FORK     = 0x08 | OPC_SPECIAL3,
378     OPC_YIELD    = 0x09 | OPC_SPECIAL3,
379     OPC_BSHFL    = 0x20 | OPC_SPECIAL3,
380     OPC_DBSHFL   = 0x24 | OPC_SPECIAL3,
381     OPC_RDHWR    = 0x3B | OPC_SPECIAL3,
382
383     /* Loongson 2E */
384     OPC_MULT_G_2E   = 0x18 | OPC_SPECIAL3,
385     OPC_MULTU_G_2E  = 0x19 | OPC_SPECIAL3,
386     OPC_DIV_G_2E    = 0x1A | OPC_SPECIAL3,
387     OPC_DIVU_G_2E   = 0x1B | OPC_SPECIAL3,
388     OPC_DMULT_G_2E  = 0x1C | OPC_SPECIAL3,
389     OPC_DMULTU_G_2E = 0x1D | OPC_SPECIAL3,
390     OPC_DDIV_G_2E   = 0x1E | OPC_SPECIAL3,
391     OPC_DDIVU_G_2E  = 0x1F | OPC_SPECIAL3,
392     OPC_MOD_G_2E    = 0x22 | OPC_SPECIAL3,
393     OPC_MODU_G_2E   = 0x23 | OPC_SPECIAL3,
394     OPC_DMOD_G_2E   = 0x26 | OPC_SPECIAL3,
395     OPC_DMODU_G_2E  = 0x27 | OPC_SPECIAL3,
396
397     /* MIPS DSP Load */
398     OPC_LX_DSP         = 0x0A | OPC_SPECIAL3,
399     /* MIPS DSP Arithmetic */
400     OPC_ADDU_QB_DSP    = 0x10 | OPC_SPECIAL3,
401     OPC_ADDU_OB_DSP    = 0x14 | OPC_SPECIAL3,
402     OPC_ABSQ_S_PH_DSP  = 0x12 | OPC_SPECIAL3,
403     OPC_ABSQ_S_QH_DSP  = 0x16 | OPC_SPECIAL3,
404     /* OPC_ADDUH_QB_DSP is same as OPC_MULT_G_2E.  */
405     /* OPC_ADDUH_QB_DSP   = 0x18 | OPC_SPECIAL3,  */
406     OPC_CMPU_EQ_QB_DSP = 0x11 | OPC_SPECIAL3,
407     OPC_CMPU_EQ_OB_DSP = 0x15 | OPC_SPECIAL3,
408     /* MIPS DSP GPR-Based Shift Sub-class */
409     OPC_SHLL_QB_DSP    = 0x13 | OPC_SPECIAL3,
410     OPC_SHLL_OB_DSP    = 0x17 | OPC_SPECIAL3,
411     /* MIPS DSP Multiply Sub-class insns */
412     /* OPC_MUL_PH_DSP is same as OPC_ADDUH_QB_DSP.  */
413     /* OPC_MUL_PH_DSP     = 0x18 | OPC_SPECIAL3,  */
414     OPC_DPA_W_PH_DSP   = 0x30 | OPC_SPECIAL3,
415     OPC_DPAQ_W_QH_DSP  = 0x34 | OPC_SPECIAL3,
416     /* DSP Bit/Manipulation Sub-class */
417     OPC_INSV_DSP       = 0x0C | OPC_SPECIAL3,
418     OPC_DINSV_DSP      = 0x0D | OPC_SPECIAL3,
419     /* MIPS DSP Append Sub-class */
420     OPC_APPEND_DSP     = 0x31 | OPC_SPECIAL3,
421     OPC_DAPPEND_DSP    = 0x35 | OPC_SPECIAL3,
422     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
423     OPC_EXTR_W_DSP     = 0x38 | OPC_SPECIAL3,
424     OPC_DEXTR_W_DSP    = 0x3C | OPC_SPECIAL3,
425
426     /* R6 */
427     R6_OPC_PREF        = 0x35 | OPC_SPECIAL3,
428     R6_OPC_CACHE       = 0x25 | OPC_SPECIAL3,
429     R6_OPC_LL          = 0x36 | OPC_SPECIAL3,
430     R6_OPC_SC          = 0x26 | OPC_SPECIAL3,
431     R6_OPC_LLD         = 0x37 | OPC_SPECIAL3,
432     R6_OPC_SCD         = 0x27 | OPC_SPECIAL3,
433 };
434
435 /* BSHFL opcodes */
436 #define MASK_BSHFL(op)     MASK_SPECIAL3(op) | (op & (0x1F << 6))
437
438 enum {
439     OPC_WSBH      = (0x02 << 6) | OPC_BSHFL,
440     OPC_SEB       = (0x10 << 6) | OPC_BSHFL,
441     OPC_SEH       = (0x18 << 6) | OPC_BSHFL,
442     OPC_ALIGN     = (0x08 << 6) | OPC_BSHFL, /* 010.bp */
443     OPC_ALIGN_END = (0x0B << 6) | OPC_BSHFL, /* 010.00 to 010.11 */
444     OPC_BITSWAP   = (0x00 << 6) | OPC_BSHFL  /* 00000 */
445 };
446
447 /* DBSHFL opcodes */
448 #define MASK_DBSHFL(op)    MASK_SPECIAL3(op) | (op & (0x1F << 6))
449
450 enum {
451     OPC_DSBH       = (0x02 << 6) | OPC_DBSHFL,
452     OPC_DSHD       = (0x05 << 6) | OPC_DBSHFL,
453     OPC_DALIGN     = (0x08 << 6) | OPC_DBSHFL, /* 01.bp */
454     OPC_DALIGN_END = (0x0F << 6) | OPC_DBSHFL, /* 01.000 to 01.111 */
455     OPC_DBITSWAP   = (0x00 << 6) | OPC_DBSHFL, /* 00000 */
456 };
457
458 /* MIPS DSP REGIMM opcodes */
459 enum {
460     OPC_BPOSGE32 = (0x1C << 16) | OPC_REGIMM,
461     OPC_BPOSGE64 = (0x1D << 16) | OPC_REGIMM,
462 };
463
464 #define MASK_LX(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
465 /* MIPS DSP Load */
466 enum {
467     OPC_LBUX = (0x06 << 6) | OPC_LX_DSP,
468     OPC_LHX  = (0x04 << 6) | OPC_LX_DSP,
469     OPC_LWX  = (0x00 << 6) | OPC_LX_DSP,
470     OPC_LDX = (0x08 << 6) | OPC_LX_DSP,
471 };
472
473 #define MASK_ADDU_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
474 enum {
475     /* MIPS DSP Arithmetic Sub-class */
476     OPC_ADDQ_PH        = (0x0A << 6) | OPC_ADDU_QB_DSP,
477     OPC_ADDQ_S_PH      = (0x0E << 6) | OPC_ADDU_QB_DSP,
478     OPC_ADDQ_S_W       = (0x16 << 6) | OPC_ADDU_QB_DSP,
479     OPC_ADDU_QB        = (0x00 << 6) | OPC_ADDU_QB_DSP,
480     OPC_ADDU_S_QB      = (0x04 << 6) | OPC_ADDU_QB_DSP,
481     OPC_ADDU_PH        = (0x08 << 6) | OPC_ADDU_QB_DSP,
482     OPC_ADDU_S_PH      = (0x0C << 6) | OPC_ADDU_QB_DSP,
483     OPC_SUBQ_PH        = (0x0B << 6) | OPC_ADDU_QB_DSP,
484     OPC_SUBQ_S_PH      = (0x0F << 6) | OPC_ADDU_QB_DSP,
485     OPC_SUBQ_S_W       = (0x17 << 6) | OPC_ADDU_QB_DSP,
486     OPC_SUBU_QB        = (0x01 << 6) | OPC_ADDU_QB_DSP,
487     OPC_SUBU_S_QB      = (0x05 << 6) | OPC_ADDU_QB_DSP,
488     OPC_SUBU_PH        = (0x09 << 6) | OPC_ADDU_QB_DSP,
489     OPC_SUBU_S_PH      = (0x0D << 6) | OPC_ADDU_QB_DSP,
490     OPC_ADDSC          = (0x10 << 6) | OPC_ADDU_QB_DSP,
491     OPC_ADDWC          = (0x11 << 6) | OPC_ADDU_QB_DSP,
492     OPC_MODSUB         = (0x12 << 6) | OPC_ADDU_QB_DSP,
493     OPC_RADDU_W_QB     = (0x14 << 6) | OPC_ADDU_QB_DSP,
494     /* MIPS DSP Multiply Sub-class insns */
495     OPC_MULEU_S_PH_QBL = (0x06 << 6) | OPC_ADDU_QB_DSP,
496     OPC_MULEU_S_PH_QBR = (0x07 << 6) | OPC_ADDU_QB_DSP,
497     OPC_MULQ_RS_PH     = (0x1F << 6) | OPC_ADDU_QB_DSP,
498     OPC_MULEQ_S_W_PHL  = (0x1C << 6) | OPC_ADDU_QB_DSP,
499     OPC_MULEQ_S_W_PHR  = (0x1D << 6) | OPC_ADDU_QB_DSP,
500     OPC_MULQ_S_PH      = (0x1E << 6) | OPC_ADDU_QB_DSP,
501 };
502
503 #define OPC_ADDUH_QB_DSP OPC_MULT_G_2E
504 #define MASK_ADDUH_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
505 enum {
506     /* MIPS DSP Arithmetic Sub-class */
507     OPC_ADDUH_QB   = (0x00 << 6) | OPC_ADDUH_QB_DSP,
508     OPC_ADDUH_R_QB = (0x02 << 6) | OPC_ADDUH_QB_DSP,
509     OPC_ADDQH_PH   = (0x08 << 6) | OPC_ADDUH_QB_DSP,
510     OPC_ADDQH_R_PH = (0x0A << 6) | OPC_ADDUH_QB_DSP,
511     OPC_ADDQH_W    = (0x10 << 6) | OPC_ADDUH_QB_DSP,
512     OPC_ADDQH_R_W  = (0x12 << 6) | OPC_ADDUH_QB_DSP,
513     OPC_SUBUH_QB   = (0x01 << 6) | OPC_ADDUH_QB_DSP,
514     OPC_SUBUH_R_QB = (0x03 << 6) | OPC_ADDUH_QB_DSP,
515     OPC_SUBQH_PH   = (0x09 << 6) | OPC_ADDUH_QB_DSP,
516     OPC_SUBQH_R_PH = (0x0B << 6) | OPC_ADDUH_QB_DSP,
517     OPC_SUBQH_W    = (0x11 << 6) | OPC_ADDUH_QB_DSP,
518     OPC_SUBQH_R_W  = (0x13 << 6) | OPC_ADDUH_QB_DSP,
519     /* MIPS DSP Multiply Sub-class insns */
520     OPC_MUL_PH     = (0x0C << 6) | OPC_ADDUH_QB_DSP,
521     OPC_MUL_S_PH   = (0x0E << 6) | OPC_ADDUH_QB_DSP,
522     OPC_MULQ_S_W   = (0x16 << 6) | OPC_ADDUH_QB_DSP,
523     OPC_MULQ_RS_W  = (0x17 << 6) | OPC_ADDUH_QB_DSP,
524 };
525
526 #define MASK_ABSQ_S_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
527 enum {
528     /* MIPS DSP Arithmetic Sub-class */
529     OPC_ABSQ_S_QB       = (0x01 << 6) | OPC_ABSQ_S_PH_DSP,
530     OPC_ABSQ_S_PH       = (0x09 << 6) | OPC_ABSQ_S_PH_DSP,
531     OPC_ABSQ_S_W        = (0x11 << 6) | OPC_ABSQ_S_PH_DSP,
532     OPC_PRECEQ_W_PHL    = (0x0C << 6) | OPC_ABSQ_S_PH_DSP,
533     OPC_PRECEQ_W_PHR    = (0x0D << 6) | OPC_ABSQ_S_PH_DSP,
534     OPC_PRECEQU_PH_QBL  = (0x04 << 6) | OPC_ABSQ_S_PH_DSP,
535     OPC_PRECEQU_PH_QBR  = (0x05 << 6) | OPC_ABSQ_S_PH_DSP,
536     OPC_PRECEQU_PH_QBLA = (0x06 << 6) | OPC_ABSQ_S_PH_DSP,
537     OPC_PRECEQU_PH_QBRA = (0x07 << 6) | OPC_ABSQ_S_PH_DSP,
538     OPC_PRECEU_PH_QBL   = (0x1C << 6) | OPC_ABSQ_S_PH_DSP,
539     OPC_PRECEU_PH_QBR   = (0x1D << 6) | OPC_ABSQ_S_PH_DSP,
540     OPC_PRECEU_PH_QBLA  = (0x1E << 6) | OPC_ABSQ_S_PH_DSP,
541     OPC_PRECEU_PH_QBRA  = (0x1F << 6) | OPC_ABSQ_S_PH_DSP,
542     /* DSP Bit/Manipulation Sub-class */
543     OPC_BITREV          = (0x1B << 6) | OPC_ABSQ_S_PH_DSP,
544     OPC_REPL_QB         = (0x02 << 6) | OPC_ABSQ_S_PH_DSP,
545     OPC_REPLV_QB        = (0x03 << 6) | OPC_ABSQ_S_PH_DSP,
546     OPC_REPL_PH         = (0x0A << 6) | OPC_ABSQ_S_PH_DSP,
547     OPC_REPLV_PH        = (0x0B << 6) | OPC_ABSQ_S_PH_DSP,
548 };
549
550 #define MASK_CMPU_EQ_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
551 enum {
552     /* MIPS DSP Arithmetic Sub-class */
553     OPC_PRECR_QB_PH      = (0x0D << 6) | OPC_CMPU_EQ_QB_DSP,
554     OPC_PRECRQ_QB_PH     = (0x0C << 6) | OPC_CMPU_EQ_QB_DSP,
555     OPC_PRECR_SRA_PH_W   = (0x1E << 6) | OPC_CMPU_EQ_QB_DSP,
556     OPC_PRECR_SRA_R_PH_W = (0x1F << 6) | OPC_CMPU_EQ_QB_DSP,
557     OPC_PRECRQ_PH_W      = (0x14 << 6) | OPC_CMPU_EQ_QB_DSP,
558     OPC_PRECRQ_RS_PH_W   = (0x15 << 6) | OPC_CMPU_EQ_QB_DSP,
559     OPC_PRECRQU_S_QB_PH  = (0x0F << 6) | OPC_CMPU_EQ_QB_DSP,
560     /* DSP Compare-Pick Sub-class */
561     OPC_CMPU_EQ_QB       = (0x00 << 6) | OPC_CMPU_EQ_QB_DSP,
562     OPC_CMPU_LT_QB       = (0x01 << 6) | OPC_CMPU_EQ_QB_DSP,
563     OPC_CMPU_LE_QB       = (0x02 << 6) | OPC_CMPU_EQ_QB_DSP,
564     OPC_CMPGU_EQ_QB      = (0x04 << 6) | OPC_CMPU_EQ_QB_DSP,
565     OPC_CMPGU_LT_QB      = (0x05 << 6) | OPC_CMPU_EQ_QB_DSP,
566     OPC_CMPGU_LE_QB      = (0x06 << 6) | OPC_CMPU_EQ_QB_DSP,
567     OPC_CMPGDU_EQ_QB     = (0x18 << 6) | OPC_CMPU_EQ_QB_DSP,
568     OPC_CMPGDU_LT_QB     = (0x19 << 6) | OPC_CMPU_EQ_QB_DSP,
569     OPC_CMPGDU_LE_QB     = (0x1A << 6) | OPC_CMPU_EQ_QB_DSP,
570     OPC_CMP_EQ_PH        = (0x08 << 6) | OPC_CMPU_EQ_QB_DSP,
571     OPC_CMP_LT_PH        = (0x09 << 6) | OPC_CMPU_EQ_QB_DSP,
572     OPC_CMP_LE_PH        = (0x0A << 6) | OPC_CMPU_EQ_QB_DSP,
573     OPC_PICK_QB          = (0x03 << 6) | OPC_CMPU_EQ_QB_DSP,
574     OPC_PICK_PH          = (0x0B << 6) | OPC_CMPU_EQ_QB_DSP,
575     OPC_PACKRL_PH        = (0x0E << 6) | OPC_CMPU_EQ_QB_DSP,
576 };
577
578 #define MASK_SHLL_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
579 enum {
580     /* MIPS DSP GPR-Based Shift Sub-class */
581     OPC_SHLL_QB    = (0x00 << 6) | OPC_SHLL_QB_DSP,
582     OPC_SHLLV_QB   = (0x02 << 6) | OPC_SHLL_QB_DSP,
583     OPC_SHLL_PH    = (0x08 << 6) | OPC_SHLL_QB_DSP,
584     OPC_SHLLV_PH   = (0x0A << 6) | OPC_SHLL_QB_DSP,
585     OPC_SHLL_S_PH  = (0x0C << 6) | OPC_SHLL_QB_DSP,
586     OPC_SHLLV_S_PH = (0x0E << 6) | OPC_SHLL_QB_DSP,
587     OPC_SHLL_S_W   = (0x14 << 6) | OPC_SHLL_QB_DSP,
588     OPC_SHLLV_S_W  = (0x16 << 6) | OPC_SHLL_QB_DSP,
589     OPC_SHRL_QB    = (0x01 << 6) | OPC_SHLL_QB_DSP,
590     OPC_SHRLV_QB   = (0x03 << 6) | OPC_SHLL_QB_DSP,
591     OPC_SHRL_PH    = (0x19 << 6) | OPC_SHLL_QB_DSP,
592     OPC_SHRLV_PH   = (0x1B << 6) | OPC_SHLL_QB_DSP,
593     OPC_SHRA_QB    = (0x04 << 6) | OPC_SHLL_QB_DSP,
594     OPC_SHRA_R_QB  = (0x05 << 6) | OPC_SHLL_QB_DSP,
595     OPC_SHRAV_QB   = (0x06 << 6) | OPC_SHLL_QB_DSP,
596     OPC_SHRAV_R_QB = (0x07 << 6) | OPC_SHLL_QB_DSP,
597     OPC_SHRA_PH    = (0x09 << 6) | OPC_SHLL_QB_DSP,
598     OPC_SHRAV_PH   = (0x0B << 6) | OPC_SHLL_QB_DSP,
599     OPC_SHRA_R_PH  = (0x0D << 6) | OPC_SHLL_QB_DSP,
600     OPC_SHRAV_R_PH = (0x0F << 6) | OPC_SHLL_QB_DSP,
601     OPC_SHRA_R_W   = (0x15 << 6) | OPC_SHLL_QB_DSP,
602     OPC_SHRAV_R_W  = (0x17 << 6) | OPC_SHLL_QB_DSP,
603 };
604
605 #define MASK_DPA_W_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
606 enum {
607     /* MIPS DSP Multiply Sub-class insns */
608     OPC_DPAU_H_QBL    = (0x03 << 6) | OPC_DPA_W_PH_DSP,
609     OPC_DPAU_H_QBR    = (0x07 << 6) | OPC_DPA_W_PH_DSP,
610     OPC_DPSU_H_QBL    = (0x0B << 6) | OPC_DPA_W_PH_DSP,
611     OPC_DPSU_H_QBR    = (0x0F << 6) | OPC_DPA_W_PH_DSP,
612     OPC_DPA_W_PH      = (0x00 << 6) | OPC_DPA_W_PH_DSP,
613     OPC_DPAX_W_PH     = (0x08 << 6) | OPC_DPA_W_PH_DSP,
614     OPC_DPAQ_S_W_PH   = (0x04 << 6) | OPC_DPA_W_PH_DSP,
615     OPC_DPAQX_S_W_PH  = (0x18 << 6) | OPC_DPA_W_PH_DSP,
616     OPC_DPAQX_SA_W_PH = (0x1A << 6) | OPC_DPA_W_PH_DSP,
617     OPC_DPS_W_PH      = (0x01 << 6) | OPC_DPA_W_PH_DSP,
618     OPC_DPSX_W_PH     = (0x09 << 6) | OPC_DPA_W_PH_DSP,
619     OPC_DPSQ_S_W_PH   = (0x05 << 6) | OPC_DPA_W_PH_DSP,
620     OPC_DPSQX_S_W_PH  = (0x19 << 6) | OPC_DPA_W_PH_DSP,
621     OPC_DPSQX_SA_W_PH = (0x1B << 6) | OPC_DPA_W_PH_DSP,
622     OPC_MULSAQ_S_W_PH = (0x06 << 6) | OPC_DPA_W_PH_DSP,
623     OPC_DPAQ_SA_L_W   = (0x0C << 6) | OPC_DPA_W_PH_DSP,
624     OPC_DPSQ_SA_L_W   = (0x0D << 6) | OPC_DPA_W_PH_DSP,
625     OPC_MAQ_S_W_PHL   = (0x14 << 6) | OPC_DPA_W_PH_DSP,
626     OPC_MAQ_S_W_PHR   = (0x16 << 6) | OPC_DPA_W_PH_DSP,
627     OPC_MAQ_SA_W_PHL  = (0x10 << 6) | OPC_DPA_W_PH_DSP,
628     OPC_MAQ_SA_W_PHR  = (0x12 << 6) | OPC_DPA_W_PH_DSP,
629     OPC_MULSA_W_PH    = (0x02 << 6) | OPC_DPA_W_PH_DSP,
630 };
631
632 #define MASK_INSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
633 enum {
634     /* DSP Bit/Manipulation Sub-class */
635     OPC_INSV = (0x00 << 6) | OPC_INSV_DSP,
636 };
637
638 #define MASK_APPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
639 enum {
640     /* MIPS DSP Append Sub-class */
641     OPC_APPEND  = (0x00 << 6) | OPC_APPEND_DSP,
642     OPC_PREPEND = (0x01 << 6) | OPC_APPEND_DSP,
643     OPC_BALIGN  = (0x10 << 6) | OPC_APPEND_DSP,
644 };
645
646 #define MASK_EXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
647 enum {
648     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
649     OPC_EXTR_W     = (0x00 << 6) | OPC_EXTR_W_DSP,
650     OPC_EXTR_R_W   = (0x04 << 6) | OPC_EXTR_W_DSP,
651     OPC_EXTR_RS_W  = (0x06 << 6) | OPC_EXTR_W_DSP,
652     OPC_EXTR_S_H   = (0x0E << 6) | OPC_EXTR_W_DSP,
653     OPC_EXTRV_S_H  = (0x0F << 6) | OPC_EXTR_W_DSP,
654     OPC_EXTRV_W    = (0x01 << 6) | OPC_EXTR_W_DSP,
655     OPC_EXTRV_R_W  = (0x05 << 6) | OPC_EXTR_W_DSP,
656     OPC_EXTRV_RS_W = (0x07 << 6) | OPC_EXTR_W_DSP,
657     OPC_EXTP       = (0x02 << 6) | OPC_EXTR_W_DSP,
658     OPC_EXTPV      = (0x03 << 6) | OPC_EXTR_W_DSP,
659     OPC_EXTPDP     = (0x0A << 6) | OPC_EXTR_W_DSP,
660     OPC_EXTPDPV    = (0x0B << 6) | OPC_EXTR_W_DSP,
661     OPC_SHILO      = (0x1A << 6) | OPC_EXTR_W_DSP,
662     OPC_SHILOV     = (0x1B << 6) | OPC_EXTR_W_DSP,
663     OPC_MTHLIP     = (0x1F << 6) | OPC_EXTR_W_DSP,
664     OPC_WRDSP      = (0x13 << 6) | OPC_EXTR_W_DSP,
665     OPC_RDDSP      = (0x12 << 6) | OPC_EXTR_W_DSP,
666 };
667
668 #define MASK_ABSQ_S_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
669 enum {
670     /* MIPS DSP Arithmetic Sub-class */
671     OPC_PRECEQ_L_PWL    = (0x14 << 6) | OPC_ABSQ_S_QH_DSP,
672     OPC_PRECEQ_L_PWR    = (0x15 << 6) | OPC_ABSQ_S_QH_DSP,
673     OPC_PRECEQ_PW_QHL   = (0x0C << 6) | OPC_ABSQ_S_QH_DSP,
674     OPC_PRECEQ_PW_QHR   = (0x0D << 6) | OPC_ABSQ_S_QH_DSP,
675     OPC_PRECEQ_PW_QHLA  = (0x0E << 6) | OPC_ABSQ_S_QH_DSP,
676     OPC_PRECEQ_PW_QHRA  = (0x0F << 6) | OPC_ABSQ_S_QH_DSP,
677     OPC_PRECEQU_QH_OBL  = (0x04 << 6) | OPC_ABSQ_S_QH_DSP,
678     OPC_PRECEQU_QH_OBR  = (0x05 << 6) | OPC_ABSQ_S_QH_DSP,
679     OPC_PRECEQU_QH_OBLA = (0x06 << 6) | OPC_ABSQ_S_QH_DSP,
680     OPC_PRECEQU_QH_OBRA = (0x07 << 6) | OPC_ABSQ_S_QH_DSP,
681     OPC_PRECEU_QH_OBL   = (0x1C << 6) | OPC_ABSQ_S_QH_DSP,
682     OPC_PRECEU_QH_OBR   = (0x1D << 6) | OPC_ABSQ_S_QH_DSP,
683     OPC_PRECEU_QH_OBLA  = (0x1E << 6) | OPC_ABSQ_S_QH_DSP,
684     OPC_PRECEU_QH_OBRA  = (0x1F << 6) | OPC_ABSQ_S_QH_DSP,
685     OPC_ABSQ_S_OB       = (0x01 << 6) | OPC_ABSQ_S_QH_DSP,
686     OPC_ABSQ_S_PW       = (0x11 << 6) | OPC_ABSQ_S_QH_DSP,
687     OPC_ABSQ_S_QH       = (0x09 << 6) | OPC_ABSQ_S_QH_DSP,
688     /* DSP Bit/Manipulation Sub-class */
689     OPC_REPL_OB         = (0x02 << 6) | OPC_ABSQ_S_QH_DSP,
690     OPC_REPL_PW         = (0x12 << 6) | OPC_ABSQ_S_QH_DSP,
691     OPC_REPL_QH         = (0x0A << 6) | OPC_ABSQ_S_QH_DSP,
692     OPC_REPLV_OB        = (0x03 << 6) | OPC_ABSQ_S_QH_DSP,
693     OPC_REPLV_PW        = (0x13 << 6) | OPC_ABSQ_S_QH_DSP,
694     OPC_REPLV_QH        = (0x0B << 6) | OPC_ABSQ_S_QH_DSP,
695 };
696
697 #define MASK_ADDU_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
698 enum {
699     /* MIPS DSP Multiply Sub-class insns */
700     OPC_MULEQ_S_PW_QHL = (0x1C << 6) | OPC_ADDU_OB_DSP,
701     OPC_MULEQ_S_PW_QHR = (0x1D << 6) | OPC_ADDU_OB_DSP,
702     OPC_MULEU_S_QH_OBL = (0x06 << 6) | OPC_ADDU_OB_DSP,
703     OPC_MULEU_S_QH_OBR = (0x07 << 6) | OPC_ADDU_OB_DSP,
704     OPC_MULQ_RS_QH     = (0x1F << 6) | OPC_ADDU_OB_DSP,
705     /* MIPS DSP Arithmetic Sub-class */
706     OPC_RADDU_L_OB     = (0x14 << 6) | OPC_ADDU_OB_DSP,
707     OPC_SUBQ_PW        = (0x13 << 6) | OPC_ADDU_OB_DSP,
708     OPC_SUBQ_S_PW      = (0x17 << 6) | OPC_ADDU_OB_DSP,
709     OPC_SUBQ_QH        = (0x0B << 6) | OPC_ADDU_OB_DSP,
710     OPC_SUBQ_S_QH      = (0x0F << 6) | OPC_ADDU_OB_DSP,
711     OPC_SUBU_OB        = (0x01 << 6) | OPC_ADDU_OB_DSP,
712     OPC_SUBU_S_OB      = (0x05 << 6) | OPC_ADDU_OB_DSP,
713     OPC_SUBU_QH        = (0x09 << 6) | OPC_ADDU_OB_DSP,
714     OPC_SUBU_S_QH      = (0x0D << 6) | OPC_ADDU_OB_DSP,
715     OPC_SUBUH_OB       = (0x19 << 6) | OPC_ADDU_OB_DSP,
716     OPC_SUBUH_R_OB     = (0x1B << 6) | OPC_ADDU_OB_DSP,
717     OPC_ADDQ_PW        = (0x12 << 6) | OPC_ADDU_OB_DSP,
718     OPC_ADDQ_S_PW      = (0x16 << 6) | OPC_ADDU_OB_DSP,
719     OPC_ADDQ_QH        = (0x0A << 6) | OPC_ADDU_OB_DSP,
720     OPC_ADDQ_S_QH      = (0x0E << 6) | OPC_ADDU_OB_DSP,
721     OPC_ADDU_OB        = (0x00 << 6) | OPC_ADDU_OB_DSP,
722     OPC_ADDU_S_OB      = (0x04 << 6) | OPC_ADDU_OB_DSP,
723     OPC_ADDU_QH        = (0x08 << 6) | OPC_ADDU_OB_DSP,
724     OPC_ADDU_S_QH      = (0x0C << 6) | OPC_ADDU_OB_DSP,
725     OPC_ADDUH_OB       = (0x18 << 6) | OPC_ADDU_OB_DSP,
726     OPC_ADDUH_R_OB     = (0x1A << 6) | OPC_ADDU_OB_DSP,
727 };
728
729 #define MASK_CMPU_EQ_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
730 enum {
731     /* DSP Compare-Pick Sub-class */
732     OPC_CMP_EQ_PW         = (0x10 << 6) | OPC_CMPU_EQ_OB_DSP,
733     OPC_CMP_LT_PW         = (0x11 << 6) | OPC_CMPU_EQ_OB_DSP,
734     OPC_CMP_LE_PW         = (0x12 << 6) | OPC_CMPU_EQ_OB_DSP,
735     OPC_CMP_EQ_QH         = (0x08 << 6) | OPC_CMPU_EQ_OB_DSP,
736     OPC_CMP_LT_QH         = (0x09 << 6) | OPC_CMPU_EQ_OB_DSP,
737     OPC_CMP_LE_QH         = (0x0A << 6) | OPC_CMPU_EQ_OB_DSP,
738     OPC_CMPGDU_EQ_OB      = (0x18 << 6) | OPC_CMPU_EQ_OB_DSP,
739     OPC_CMPGDU_LT_OB      = (0x19 << 6) | OPC_CMPU_EQ_OB_DSP,
740     OPC_CMPGDU_LE_OB      = (0x1A << 6) | OPC_CMPU_EQ_OB_DSP,
741     OPC_CMPGU_EQ_OB       = (0x04 << 6) | OPC_CMPU_EQ_OB_DSP,
742     OPC_CMPGU_LT_OB       = (0x05 << 6) | OPC_CMPU_EQ_OB_DSP,
743     OPC_CMPGU_LE_OB       = (0x06 << 6) | OPC_CMPU_EQ_OB_DSP,
744     OPC_CMPU_EQ_OB        = (0x00 << 6) | OPC_CMPU_EQ_OB_DSP,
745     OPC_CMPU_LT_OB        = (0x01 << 6) | OPC_CMPU_EQ_OB_DSP,
746     OPC_CMPU_LE_OB        = (0x02 << 6) | OPC_CMPU_EQ_OB_DSP,
747     OPC_PACKRL_PW         = (0x0E << 6) | OPC_CMPU_EQ_OB_DSP,
748     OPC_PICK_OB           = (0x03 << 6) | OPC_CMPU_EQ_OB_DSP,
749     OPC_PICK_PW           = (0x13 << 6) | OPC_CMPU_EQ_OB_DSP,
750     OPC_PICK_QH           = (0x0B << 6) | OPC_CMPU_EQ_OB_DSP,
751     /* MIPS DSP Arithmetic Sub-class */
752     OPC_PRECR_OB_QH       = (0x0D << 6) | OPC_CMPU_EQ_OB_DSP,
753     OPC_PRECR_SRA_QH_PW   = (0x1E << 6) | OPC_CMPU_EQ_OB_DSP,
754     OPC_PRECR_SRA_R_QH_PW = (0x1F << 6) | OPC_CMPU_EQ_OB_DSP,
755     OPC_PRECRQ_OB_QH      = (0x0C << 6) | OPC_CMPU_EQ_OB_DSP,
756     OPC_PRECRQ_PW_L       = (0x1C << 6) | OPC_CMPU_EQ_OB_DSP,
757     OPC_PRECRQ_QH_PW      = (0x14 << 6) | OPC_CMPU_EQ_OB_DSP,
758     OPC_PRECRQ_RS_QH_PW   = (0x15 << 6) | OPC_CMPU_EQ_OB_DSP,
759     OPC_PRECRQU_S_OB_QH   = (0x0F << 6) | OPC_CMPU_EQ_OB_DSP,
760 };
761
762 #define MASK_DAPPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
763 enum {
764     /* DSP Append Sub-class */
765     OPC_DAPPEND  = (0x00 << 6) | OPC_DAPPEND_DSP,
766     OPC_PREPENDD = (0x03 << 6) | OPC_DAPPEND_DSP,
767     OPC_PREPENDW = (0x01 << 6) | OPC_DAPPEND_DSP,
768     OPC_DBALIGN  = (0x10 << 6) | OPC_DAPPEND_DSP,
769 };
770
771 #define MASK_DEXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
772 enum {
773     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
774     OPC_DMTHLIP     = (0x1F << 6) | OPC_DEXTR_W_DSP,
775     OPC_DSHILO      = (0x1A << 6) | OPC_DEXTR_W_DSP,
776     OPC_DEXTP       = (0x02 << 6) | OPC_DEXTR_W_DSP,
777     OPC_DEXTPDP     = (0x0A << 6) | OPC_DEXTR_W_DSP,
778     OPC_DEXTPDPV    = (0x0B << 6) | OPC_DEXTR_W_DSP,
779     OPC_DEXTPV      = (0x03 << 6) | OPC_DEXTR_W_DSP,
780     OPC_DEXTR_L     = (0x10 << 6) | OPC_DEXTR_W_DSP,
781     OPC_DEXTR_R_L   = (0x14 << 6) | OPC_DEXTR_W_DSP,
782     OPC_DEXTR_RS_L  = (0x16 << 6) | OPC_DEXTR_W_DSP,
783     OPC_DEXTR_W     = (0x00 << 6) | OPC_DEXTR_W_DSP,
784     OPC_DEXTR_R_W   = (0x04 << 6) | OPC_DEXTR_W_DSP,
785     OPC_DEXTR_RS_W  = (0x06 << 6) | OPC_DEXTR_W_DSP,
786     OPC_DEXTR_S_H   = (0x0E << 6) | OPC_DEXTR_W_DSP,
787     OPC_DEXTRV_L    = (0x11 << 6) | OPC_DEXTR_W_DSP,
788     OPC_DEXTRV_R_L  = (0x15 << 6) | OPC_DEXTR_W_DSP,
789     OPC_DEXTRV_RS_L = (0x17 << 6) | OPC_DEXTR_W_DSP,
790     OPC_DEXTRV_S_H  = (0x0F << 6) | OPC_DEXTR_W_DSP,
791     OPC_DEXTRV_W    = (0x01 << 6) | OPC_DEXTR_W_DSP,
792     OPC_DEXTRV_R_W  = (0x05 << 6) | OPC_DEXTR_W_DSP,
793     OPC_DEXTRV_RS_W = (0x07 << 6) | OPC_DEXTR_W_DSP,
794     OPC_DSHILOV     = (0x1B << 6) | OPC_DEXTR_W_DSP,
795 };
796
797 #define MASK_DINSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
798 enum {
799     /* DSP Bit/Manipulation Sub-class */
800     OPC_DINSV = (0x00 << 6) | OPC_DINSV_DSP,
801 };
802
803 #define MASK_DPAQ_W_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
804 enum {
805     /* MIPS DSP Multiply Sub-class insns */
806     OPC_DMADD         = (0x19 << 6) | OPC_DPAQ_W_QH_DSP,
807     OPC_DMADDU        = (0x1D << 6) | OPC_DPAQ_W_QH_DSP,
808     OPC_DMSUB         = (0x1B << 6) | OPC_DPAQ_W_QH_DSP,
809     OPC_DMSUBU        = (0x1F << 6) | OPC_DPAQ_W_QH_DSP,
810     OPC_DPA_W_QH      = (0x00 << 6) | OPC_DPAQ_W_QH_DSP,
811     OPC_DPAQ_S_W_QH   = (0x04 << 6) | OPC_DPAQ_W_QH_DSP,
812     OPC_DPAQ_SA_L_PW  = (0x0C << 6) | OPC_DPAQ_W_QH_DSP,
813     OPC_DPAU_H_OBL    = (0x03 << 6) | OPC_DPAQ_W_QH_DSP,
814     OPC_DPAU_H_OBR    = (0x07 << 6) | OPC_DPAQ_W_QH_DSP,
815     OPC_DPS_W_QH      = (0x01 << 6) | OPC_DPAQ_W_QH_DSP,
816     OPC_DPSQ_S_W_QH   = (0x05 << 6) | OPC_DPAQ_W_QH_DSP,
817     OPC_DPSQ_SA_L_PW  = (0x0D << 6) | OPC_DPAQ_W_QH_DSP,
818     OPC_DPSU_H_OBL    = (0x0B << 6) | OPC_DPAQ_W_QH_DSP,
819     OPC_DPSU_H_OBR    = (0x0F << 6) | OPC_DPAQ_W_QH_DSP,
820     OPC_MAQ_S_L_PWL   = (0x1C << 6) | OPC_DPAQ_W_QH_DSP,
821     OPC_MAQ_S_L_PWR   = (0x1E << 6) | OPC_DPAQ_W_QH_DSP,
822     OPC_MAQ_S_W_QHLL  = (0x14 << 6) | OPC_DPAQ_W_QH_DSP,
823     OPC_MAQ_SA_W_QHLL = (0x10 << 6) | OPC_DPAQ_W_QH_DSP,
824     OPC_MAQ_S_W_QHLR  = (0x15 << 6) | OPC_DPAQ_W_QH_DSP,
825     OPC_MAQ_SA_W_QHLR = (0x11 << 6) | OPC_DPAQ_W_QH_DSP,
826     OPC_MAQ_S_W_QHRL  = (0x16 << 6) | OPC_DPAQ_W_QH_DSP,
827     OPC_MAQ_SA_W_QHRL = (0x12 << 6) | OPC_DPAQ_W_QH_DSP,
828     OPC_MAQ_S_W_QHRR  = (0x17 << 6) | OPC_DPAQ_W_QH_DSP,
829     OPC_MAQ_SA_W_QHRR = (0x13 << 6) | OPC_DPAQ_W_QH_DSP,
830     OPC_MULSAQ_S_L_PW = (0x0E << 6) | OPC_DPAQ_W_QH_DSP,
831     OPC_MULSAQ_S_W_QH = (0x06 << 6) | OPC_DPAQ_W_QH_DSP,
832 };
833
834 #define MASK_SHLL_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
835 enum {
836     /* MIPS DSP GPR-Based Shift Sub-class */
837     OPC_SHLL_PW    = (0x10 << 6) | OPC_SHLL_OB_DSP,
838     OPC_SHLL_S_PW  = (0x14 << 6) | OPC_SHLL_OB_DSP,
839     OPC_SHLLV_OB   = (0x02 << 6) | OPC_SHLL_OB_DSP,
840     OPC_SHLLV_PW   = (0x12 << 6) | OPC_SHLL_OB_DSP,
841     OPC_SHLLV_S_PW = (0x16 << 6) | OPC_SHLL_OB_DSP,
842     OPC_SHLLV_QH   = (0x0A << 6) | OPC_SHLL_OB_DSP,
843     OPC_SHLLV_S_QH = (0x0E << 6) | OPC_SHLL_OB_DSP,
844     OPC_SHRA_PW    = (0x11 << 6) | OPC_SHLL_OB_DSP,
845     OPC_SHRA_R_PW  = (0x15 << 6) | OPC_SHLL_OB_DSP,
846     OPC_SHRAV_OB   = (0x06 << 6) | OPC_SHLL_OB_DSP,
847     OPC_SHRAV_R_OB = (0x07 << 6) | OPC_SHLL_OB_DSP,
848     OPC_SHRAV_PW   = (0x13 << 6) | OPC_SHLL_OB_DSP,
849     OPC_SHRAV_R_PW = (0x17 << 6) | OPC_SHLL_OB_DSP,
850     OPC_SHRAV_QH   = (0x0B << 6) | OPC_SHLL_OB_DSP,
851     OPC_SHRAV_R_QH = (0x0F << 6) | OPC_SHLL_OB_DSP,
852     OPC_SHRLV_OB   = (0x03 << 6) | OPC_SHLL_OB_DSP,
853     OPC_SHRLV_QH   = (0x1B << 6) | OPC_SHLL_OB_DSP,
854     OPC_SHLL_OB    = (0x00 << 6) | OPC_SHLL_OB_DSP,
855     OPC_SHLL_QH    = (0x08 << 6) | OPC_SHLL_OB_DSP,
856     OPC_SHLL_S_QH  = (0x0C << 6) | OPC_SHLL_OB_DSP,
857     OPC_SHRA_OB    = (0x04 << 6) | OPC_SHLL_OB_DSP,
858     OPC_SHRA_R_OB  = (0x05 << 6) | OPC_SHLL_OB_DSP,
859     OPC_SHRA_QH    = (0x09 << 6) | OPC_SHLL_OB_DSP,
860     OPC_SHRA_R_QH  = (0x0D << 6) | OPC_SHLL_OB_DSP,
861     OPC_SHRL_OB    = (0x01 << 6) | OPC_SHLL_OB_DSP,
862     OPC_SHRL_QH    = (0x19 << 6) | OPC_SHLL_OB_DSP,
863 };
864
865 /* Coprocessor 0 (rs field) */
866 #define MASK_CP0(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
867
868 enum {
869     OPC_MFC0     = (0x00 << 21) | OPC_CP0,
870     OPC_DMFC0    = (0x01 << 21) | OPC_CP0,
871     OPC_MTC0     = (0x04 << 21) | OPC_CP0,
872     OPC_DMTC0    = (0x05 << 21) | OPC_CP0,
873     OPC_MFTR     = (0x08 << 21) | OPC_CP0,
874     OPC_RDPGPR   = (0x0A << 21) | OPC_CP0,
875     OPC_MFMC0    = (0x0B << 21) | OPC_CP0,
876     OPC_MTTR     = (0x0C << 21) | OPC_CP0,
877     OPC_WRPGPR   = (0x0E << 21) | OPC_CP0,
878     OPC_C0       = (0x10 << 21) | OPC_CP0,
879     OPC_C0_FIRST = (0x10 << 21) | OPC_CP0,
880     OPC_C0_LAST  = (0x1F << 21) | OPC_CP0,
881 };
882
883 /* MFMC0 opcodes */
884 #define MASK_MFMC0(op)     MASK_CP0(op) | (op & 0xFFFF)
885
886 enum {
887     OPC_DMT      = 0x01 | (0 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
888     OPC_EMT      = 0x01 | (1 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
889     OPC_DVPE     = 0x01 | (0 << 5) | OPC_MFMC0,
890     OPC_EVPE     = 0x01 | (1 << 5) | OPC_MFMC0,
891     OPC_DI       = (0 << 5) | (0x0C << 11) | OPC_MFMC0,
892     OPC_EI       = (1 << 5) | (0x0C << 11) | OPC_MFMC0,
893 };
894
895 /* Coprocessor 0 (with rs == C0) */
896 #define MASK_C0(op)        MASK_CP0(op) | (op & 0x3F)
897
898 enum {
899     OPC_TLBR     = 0x01 | OPC_C0,
900     OPC_TLBWI    = 0x02 | OPC_C0,
901     OPC_TLBINV   = 0x03 | OPC_C0,
902     OPC_TLBINVF  = 0x04 | OPC_C0,
903     OPC_TLBWR    = 0x06 | OPC_C0,
904     OPC_TLBP     = 0x08 | OPC_C0,
905     OPC_RFE      = 0x10 | OPC_C0,
906     OPC_ERET     = 0x18 | OPC_C0,
907     OPC_DERET    = 0x1F | OPC_C0,
908     OPC_WAIT     = 0x20 | OPC_C0,
909 };
910
911 /* Coprocessor 1 (rs field) */
912 #define MASK_CP1(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
913
914 /* Values for the fmt field in FP instructions */
915 enum {
916     /* 0 - 15 are reserved */
917     FMT_S = 16,          /* single fp */
918     FMT_D = 17,          /* double fp */
919     FMT_E = 18,          /* extended fp */
920     FMT_Q = 19,          /* quad fp */
921     FMT_W = 20,          /* 32-bit fixed */
922     FMT_L = 21,          /* 64-bit fixed */
923     FMT_PS = 22,         /* paired single fp */
924     /* 23 - 31 are reserved */
925 };
926
927 enum {
928     OPC_MFC1     = (0x00 << 21) | OPC_CP1,
929     OPC_DMFC1    = (0x01 << 21) | OPC_CP1,
930     OPC_CFC1     = (0x02 << 21) | OPC_CP1,
931     OPC_MFHC1    = (0x03 << 21) | OPC_CP1,
932     OPC_MTC1     = (0x04 << 21) | OPC_CP1,
933     OPC_DMTC1    = (0x05 << 21) | OPC_CP1,
934     OPC_CTC1     = (0x06 << 21) | OPC_CP1,
935     OPC_MTHC1    = (0x07 << 21) | OPC_CP1,
936     OPC_BC1      = (0x08 << 21) | OPC_CP1, /* bc */
937     OPC_BC1ANY2  = (0x09 << 21) | OPC_CP1,
938     OPC_BC1ANY4  = (0x0A << 21) | OPC_CP1,
939     OPC_BZ_V     = (0x0B << 21) | OPC_CP1,
940     OPC_BNZ_V    = (0x0F << 21) | OPC_CP1,
941     OPC_S_FMT    = (FMT_S << 21) | OPC_CP1,
942     OPC_D_FMT    = (FMT_D << 21) | OPC_CP1,
943     OPC_E_FMT    = (FMT_E << 21) | OPC_CP1,
944     OPC_Q_FMT    = (FMT_Q << 21) | OPC_CP1,
945     OPC_W_FMT    = (FMT_W << 21) | OPC_CP1,
946     OPC_L_FMT    = (FMT_L << 21) | OPC_CP1,
947     OPC_PS_FMT   = (FMT_PS << 21) | OPC_CP1,
948     OPC_BC1EQZ   = (0x09 << 21) | OPC_CP1,
949     OPC_BC1NEZ   = (0x0D << 21) | OPC_CP1,
950     OPC_BZ_B     = (0x18 << 21) | OPC_CP1,
951     OPC_BZ_H     = (0x19 << 21) | OPC_CP1,
952     OPC_BZ_W     = (0x1A << 21) | OPC_CP1,
953     OPC_BZ_D     = (0x1B << 21) | OPC_CP1,
954     OPC_BNZ_B    = (0x1C << 21) | OPC_CP1,
955     OPC_BNZ_H    = (0x1D << 21) | OPC_CP1,
956     OPC_BNZ_W    = (0x1E << 21) | OPC_CP1,
957     OPC_BNZ_D    = (0x1F << 21) | OPC_CP1,
958 };
959
960 #define MASK_CP1_FUNC(op)       MASK_CP1(op) | (op & 0x3F)
961 #define MASK_BC1(op)            MASK_CP1(op) | (op & (0x3 << 16))
962
963 enum {
964     OPC_BC1F     = (0x00 << 16) | OPC_BC1,
965     OPC_BC1T     = (0x01 << 16) | OPC_BC1,
966     OPC_BC1FL    = (0x02 << 16) | OPC_BC1,
967     OPC_BC1TL    = (0x03 << 16) | OPC_BC1,
968 };
969
970 enum {
971     OPC_BC1FANY2     = (0x00 << 16) | OPC_BC1ANY2,
972     OPC_BC1TANY2     = (0x01 << 16) | OPC_BC1ANY2,
973 };
974
975 enum {
976     OPC_BC1FANY4     = (0x00 << 16) | OPC_BC1ANY4,
977     OPC_BC1TANY4     = (0x01 << 16) | OPC_BC1ANY4,
978 };
979
980 #define MASK_CP2(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
981
982 enum {
983     OPC_MFC2    = (0x00 << 21) | OPC_CP2,
984     OPC_DMFC2   = (0x01 << 21) | OPC_CP2,
985     OPC_CFC2    = (0x02 << 21) | OPC_CP2,
986     OPC_MFHC2   = (0x03 << 21) | OPC_CP2,
987     OPC_MTC2    = (0x04 << 21) | OPC_CP2,
988     OPC_DMTC2   = (0x05 << 21) | OPC_CP2,
989     OPC_CTC2    = (0x06 << 21) | OPC_CP2,
990     OPC_MTHC2   = (0x07 << 21) | OPC_CP2,
991     OPC_BC2     = (0x08 << 21) | OPC_CP2,
992     OPC_BC2EQZ  = (0x09 << 21) | OPC_CP2,
993     OPC_BC2NEZ  = (0x0D << 21) | OPC_CP2,
994 };
995
996 #define MASK_LMI(op)  (MASK_OP_MAJOR(op) | (op & (0x1F << 21)) | (op & 0x1F))
997
998 enum {
999     OPC_PADDSH  = (24 << 21) | (0x00) | OPC_CP2,
1000     OPC_PADDUSH = (25 << 21) | (0x00) | OPC_CP2,
1001     OPC_PADDH   = (26 << 21) | (0x00) | OPC_CP2,
1002     OPC_PADDW   = (27 << 21) | (0x00) | OPC_CP2,
1003     OPC_PADDSB  = (28 << 21) | (0x00) | OPC_CP2,
1004     OPC_PADDUSB = (29 << 21) | (0x00) | OPC_CP2,
1005     OPC_PADDB   = (30 << 21) | (0x00) | OPC_CP2,
1006     OPC_PADDD   = (31 << 21) | (0x00) | OPC_CP2,
1007
1008     OPC_PSUBSH  = (24 << 21) | (0x01) | OPC_CP2,
1009     OPC_PSUBUSH = (25 << 21) | (0x01) | OPC_CP2,
1010     OPC_PSUBH   = (26 << 21) | (0x01) | OPC_CP2,
1011     OPC_PSUBW   = (27 << 21) | (0x01) | OPC_CP2,
1012     OPC_PSUBSB  = (28 << 21) | (0x01) | OPC_CP2,
1013     OPC_PSUBUSB = (29 << 21) | (0x01) | OPC_CP2,
1014     OPC_PSUBB   = (30 << 21) | (0x01) | OPC_CP2,
1015     OPC_PSUBD   = (31 << 21) | (0x01) | OPC_CP2,
1016
1017     OPC_PSHUFH   = (24 << 21) | (0x02) | OPC_CP2,
1018     OPC_PACKSSWH = (25 << 21) | (0x02) | OPC_CP2,
1019     OPC_PACKSSHB = (26 << 21) | (0x02) | OPC_CP2,
1020     OPC_PACKUSHB = (27 << 21) | (0x02) | OPC_CP2,
1021     OPC_XOR_CP2  = (28 << 21) | (0x02) | OPC_CP2,
1022     OPC_NOR_CP2  = (29 << 21) | (0x02) | OPC_CP2,
1023     OPC_AND_CP2  = (30 << 21) | (0x02) | OPC_CP2,
1024     OPC_PANDN    = (31 << 21) | (0x02) | OPC_CP2,
1025
1026     OPC_PUNPCKLHW = (24 << 21) | (0x03) | OPC_CP2,
1027     OPC_PUNPCKHHW = (25 << 21) | (0x03) | OPC_CP2,
1028     OPC_PUNPCKLBH = (26 << 21) | (0x03) | OPC_CP2,
1029     OPC_PUNPCKHBH = (27 << 21) | (0x03) | OPC_CP2,
1030     OPC_PINSRH_0  = (28 << 21) | (0x03) | OPC_CP2,
1031     OPC_PINSRH_1  = (29 << 21) | (0x03) | OPC_CP2,
1032     OPC_PINSRH_2  = (30 << 21) | (0x03) | OPC_CP2,
1033     OPC_PINSRH_3  = (31 << 21) | (0x03) | OPC_CP2,
1034
1035     OPC_PAVGH   = (24 << 21) | (0x08) | OPC_CP2,
1036     OPC_PAVGB   = (25 << 21) | (0x08) | OPC_CP2,
1037     OPC_PMAXSH  = (26 << 21) | (0x08) | OPC_CP2,
1038     OPC_PMINSH  = (27 << 21) | (0x08) | OPC_CP2,
1039     OPC_PMAXUB  = (28 << 21) | (0x08) | OPC_CP2,
1040     OPC_PMINUB  = (29 << 21) | (0x08) | OPC_CP2,
1041
1042     OPC_PCMPEQW = (24 << 21) | (0x09) | OPC_CP2,
1043     OPC_PCMPGTW = (25 << 21) | (0x09) | OPC_CP2,
1044     OPC_PCMPEQH = (26 << 21) | (0x09) | OPC_CP2,
1045     OPC_PCMPGTH = (27 << 21) | (0x09) | OPC_CP2,
1046     OPC_PCMPEQB = (28 << 21) | (0x09) | OPC_CP2,
1047     OPC_PCMPGTB = (29 << 21) | (0x09) | OPC_CP2,
1048
1049     OPC_PSLLW   = (24 << 21) | (0x0A) | OPC_CP2,
1050     OPC_PSLLH   = (25 << 21) | (0x0A) | OPC_CP2,
1051     OPC_PMULLH  = (26 << 21) | (0x0A) | OPC_CP2,
1052     OPC_PMULHH  = (27 << 21) | (0x0A) | OPC_CP2,
1053     OPC_PMULUW  = (28 << 21) | (0x0A) | OPC_CP2,
1054     OPC_PMULHUH = (29 << 21) | (0x0A) | OPC_CP2,
1055
1056     OPC_PSRLW     = (24 << 21) | (0x0B) | OPC_CP2,
1057     OPC_PSRLH     = (25 << 21) | (0x0B) | OPC_CP2,
1058     OPC_PSRAW     = (26 << 21) | (0x0B) | OPC_CP2,
1059     OPC_PSRAH     = (27 << 21) | (0x0B) | OPC_CP2,
1060     OPC_PUNPCKLWD = (28 << 21) | (0x0B) | OPC_CP2,
1061     OPC_PUNPCKHWD = (29 << 21) | (0x0B) | OPC_CP2,
1062
1063     OPC_ADDU_CP2 = (24 << 21) | (0x0C) | OPC_CP2,
1064     OPC_OR_CP2   = (25 << 21) | (0x0C) | OPC_CP2,
1065     OPC_ADD_CP2  = (26 << 21) | (0x0C) | OPC_CP2,
1066     OPC_DADD_CP2 = (27 << 21) | (0x0C) | OPC_CP2,
1067     OPC_SEQU_CP2 = (28 << 21) | (0x0C) | OPC_CP2,
1068     OPC_SEQ_CP2  = (29 << 21) | (0x0C) | OPC_CP2,
1069
1070     OPC_SUBU_CP2 = (24 << 21) | (0x0D) | OPC_CP2,
1071     OPC_PASUBUB  = (25 << 21) | (0x0D) | OPC_CP2,
1072     OPC_SUB_CP2  = (26 << 21) | (0x0D) | OPC_CP2,
1073     OPC_DSUB_CP2 = (27 << 21) | (0x0D) | OPC_CP2,
1074     OPC_SLTU_CP2 = (28 << 21) | (0x0D) | OPC_CP2,
1075     OPC_SLT_CP2  = (29 << 21) | (0x0D) | OPC_CP2,
1076
1077     OPC_SLL_CP2  = (24 << 21) | (0x0E) | OPC_CP2,
1078     OPC_DSLL_CP2 = (25 << 21) | (0x0E) | OPC_CP2,
1079     OPC_PEXTRH   = (26 << 21) | (0x0E) | OPC_CP2,
1080     OPC_PMADDHW  = (27 << 21) | (0x0E) | OPC_CP2,
1081     OPC_SLEU_CP2 = (28 << 21) | (0x0E) | OPC_CP2,
1082     OPC_SLE_CP2  = (29 << 21) | (0x0E) | OPC_CP2,
1083
1084     OPC_SRL_CP2  = (24 << 21) | (0x0F) | OPC_CP2,
1085     OPC_DSRL_CP2 = (25 << 21) | (0x0F) | OPC_CP2,
1086     OPC_SRA_CP2  = (26 << 21) | (0x0F) | OPC_CP2,
1087     OPC_DSRA_CP2 = (27 << 21) | (0x0F) | OPC_CP2,
1088     OPC_BIADD    = (28 << 21) | (0x0F) | OPC_CP2,
1089     OPC_PMOVMSKB = (29 << 21) | (0x0F) | OPC_CP2,
1090 };
1091
1092
1093 #define MASK_CP3(op)       MASK_OP_MAJOR(op) | (op & 0x3F)
1094
1095 enum {
1096     OPC_LWXC1   = 0x00 | OPC_CP3,
1097     OPC_LDXC1   = 0x01 | OPC_CP3,
1098     OPC_LUXC1   = 0x05 | OPC_CP3,
1099     OPC_SWXC1   = 0x08 | OPC_CP3,
1100     OPC_SDXC1   = 0x09 | OPC_CP3,
1101     OPC_SUXC1   = 0x0D | OPC_CP3,
1102     OPC_PREFX   = 0x0F | OPC_CP3,
1103     OPC_ALNV_PS = 0x1E | OPC_CP3,
1104     OPC_MADD_S  = 0x20 | OPC_CP3,
1105     OPC_MADD_D  = 0x21 | OPC_CP3,
1106     OPC_MADD_PS = 0x26 | OPC_CP3,
1107     OPC_MSUB_S  = 0x28 | OPC_CP3,
1108     OPC_MSUB_D  = 0x29 | OPC_CP3,
1109     OPC_MSUB_PS = 0x2E | OPC_CP3,
1110     OPC_NMADD_S = 0x30 | OPC_CP3,
1111     OPC_NMADD_D = 0x31 | OPC_CP3,
1112     OPC_NMADD_PS= 0x36 | OPC_CP3,
1113     OPC_NMSUB_S = 0x38 | OPC_CP3,
1114     OPC_NMSUB_D = 0x39 | OPC_CP3,
1115     OPC_NMSUB_PS= 0x3E | OPC_CP3,
1116 };
1117
1118 /* MSA Opcodes */
1119 #define MASK_MSA_MINOR(op)    (MASK_OP_MAJOR(op) | (op & 0x3F))
1120 enum {
1121     OPC_MSA_I8_00   = 0x00 | OPC_MSA,
1122     OPC_MSA_I8_01   = 0x01 | OPC_MSA,
1123     OPC_MSA_I8_02   = 0x02 | OPC_MSA,
1124     OPC_MSA_I5_06   = 0x06 | OPC_MSA,
1125     OPC_MSA_I5_07   = 0x07 | OPC_MSA,
1126     OPC_MSA_BIT_09  = 0x09 | OPC_MSA,
1127     OPC_MSA_BIT_0A  = 0x0A | OPC_MSA,
1128     OPC_MSA_3R_0D   = 0x0D | OPC_MSA,
1129     OPC_MSA_3R_0E   = 0x0E | OPC_MSA,
1130     OPC_MSA_3R_0F   = 0x0F | OPC_MSA,
1131     OPC_MSA_3R_10   = 0x10 | OPC_MSA,
1132     OPC_MSA_3R_11   = 0x11 | OPC_MSA,
1133     OPC_MSA_3R_12   = 0x12 | OPC_MSA,
1134     OPC_MSA_3R_13   = 0x13 | OPC_MSA,
1135     OPC_MSA_3R_14   = 0x14 | OPC_MSA,
1136     OPC_MSA_3R_15   = 0x15 | OPC_MSA,
1137     OPC_MSA_ELM     = 0x19 | OPC_MSA,
1138     OPC_MSA_3RF_1A  = 0x1A | OPC_MSA,
1139     OPC_MSA_3RF_1B  = 0x1B | OPC_MSA,
1140     OPC_MSA_3RF_1C  = 0x1C | OPC_MSA,
1141     OPC_MSA_VEC     = 0x1E | OPC_MSA,
1142
1143     /* MI10 instruction */
1144     OPC_LD_B    = (0x20) | OPC_MSA,
1145     OPC_LD_H    = (0x21) | OPC_MSA,
1146     OPC_LD_W    = (0x22) | OPC_MSA,
1147     OPC_LD_D    = (0x23) | OPC_MSA,
1148     OPC_ST_B    = (0x24) | OPC_MSA,
1149     OPC_ST_H    = (0x25) | OPC_MSA,
1150     OPC_ST_W    = (0x26) | OPC_MSA,
1151     OPC_ST_D    = (0x27) | OPC_MSA,
1152 };
1153
1154 enum {
1155     /* I5 instruction df(bits 22..21) = _b, _h, _w, _d */
1156     OPC_ADDVI_df    = (0x0 << 23) | OPC_MSA_I5_06,
1157     OPC_CEQI_df     = (0x0 << 23) | OPC_MSA_I5_07,
1158     OPC_SUBVI_df    = (0x1 << 23) | OPC_MSA_I5_06,
1159     OPC_MAXI_S_df   = (0x2 << 23) | OPC_MSA_I5_06,
1160     OPC_CLTI_S_df   = (0x2 << 23) | OPC_MSA_I5_07,
1161     OPC_MAXI_U_df   = (0x3 << 23) | OPC_MSA_I5_06,
1162     OPC_CLTI_U_df   = (0x3 << 23) | OPC_MSA_I5_07,
1163     OPC_MINI_S_df   = (0x4 << 23) | OPC_MSA_I5_06,
1164     OPC_CLEI_S_df   = (0x4 << 23) | OPC_MSA_I5_07,
1165     OPC_MINI_U_df   = (0x5 << 23) | OPC_MSA_I5_06,
1166     OPC_CLEI_U_df   = (0x5 << 23) | OPC_MSA_I5_07,
1167     OPC_LDI_df      = (0x6 << 23) | OPC_MSA_I5_07,
1168
1169     /* I8 instruction */
1170     OPC_ANDI_B  = (0x0 << 24) | OPC_MSA_I8_00,
1171     OPC_BMNZI_B = (0x0 << 24) | OPC_MSA_I8_01,
1172     OPC_SHF_B   = (0x0 << 24) | OPC_MSA_I8_02,
1173     OPC_ORI_B   = (0x1 << 24) | OPC_MSA_I8_00,
1174     OPC_BMZI_B  = (0x1 << 24) | OPC_MSA_I8_01,
1175     OPC_SHF_H   = (0x1 << 24) | OPC_MSA_I8_02,
1176     OPC_NORI_B  = (0x2 << 24) | OPC_MSA_I8_00,
1177     OPC_BSELI_B = (0x2 << 24) | OPC_MSA_I8_01,
1178     OPC_SHF_W   = (0x2 << 24) | OPC_MSA_I8_02,
1179     OPC_XORI_B  = (0x3 << 24) | OPC_MSA_I8_00,
1180
1181     /* VEC/2R/2RF instruction */
1182     OPC_AND_V   = (0x00 << 21) | OPC_MSA_VEC,
1183     OPC_OR_V    = (0x01 << 21) | OPC_MSA_VEC,
1184     OPC_NOR_V   = (0x02 << 21) | OPC_MSA_VEC,
1185     OPC_XOR_V   = (0x03 << 21) | OPC_MSA_VEC,
1186     OPC_BMNZ_V  = (0x04 << 21) | OPC_MSA_VEC,
1187     OPC_BMZ_V   = (0x05 << 21) | OPC_MSA_VEC,
1188     OPC_BSEL_V  = (0x06 << 21) | OPC_MSA_VEC,
1189
1190     OPC_MSA_2R      = (0x18 << 21) | OPC_MSA_VEC,
1191     OPC_MSA_2RF     = (0x19 << 21) | OPC_MSA_VEC,
1192
1193     /* 2R instruction df(bits 17..16) = _b, _h, _w, _d */
1194     OPC_FILL_df = (0x00 << 18) | OPC_MSA_2R,
1195     OPC_PCNT_df = (0x01 << 18) | OPC_MSA_2R,
1196     OPC_NLOC_df = (0x02 << 18) | OPC_MSA_2R,
1197     OPC_NLZC_df = (0x03 << 18) | OPC_MSA_2R,
1198
1199     /* 2RF instruction df(bit 16) = _w, _d */
1200     OPC_FCLASS_df   = (0x00 << 17) | OPC_MSA_2RF,
1201     OPC_FTRUNC_S_df = (0x01 << 17) | OPC_MSA_2RF,
1202     OPC_FTRUNC_U_df = (0x02 << 17) | OPC_MSA_2RF,
1203     OPC_FSQRT_df    = (0x03 << 17) | OPC_MSA_2RF,
1204     OPC_FRSQRT_df   = (0x04 << 17) | OPC_MSA_2RF,
1205     OPC_FRCP_df     = (0x05 << 17) | OPC_MSA_2RF,
1206     OPC_FRINT_df    = (0x06 << 17) | OPC_MSA_2RF,
1207     OPC_FLOG2_df    = (0x07 << 17) | OPC_MSA_2RF,
1208     OPC_FEXUPL_df   = (0x08 << 17) | OPC_MSA_2RF,
1209     OPC_FEXUPR_df   = (0x09 << 17) | OPC_MSA_2RF,
1210     OPC_FFQL_df     = (0x0A << 17) | OPC_MSA_2RF,
1211     OPC_FFQR_df     = (0x0B << 17) | OPC_MSA_2RF,
1212     OPC_FTINT_S_df  = (0x0C << 17) | OPC_MSA_2RF,
1213     OPC_FTINT_U_df  = (0x0D << 17) | OPC_MSA_2RF,
1214     OPC_FFINT_S_df  = (0x0E << 17) | OPC_MSA_2RF,
1215     OPC_FFINT_U_df  = (0x0F << 17) | OPC_MSA_2RF,
1216
1217     /* 3R instruction df(bits 22..21) = _b, _h, _w, d */
1218     OPC_SLL_df      = (0x0 << 23) | OPC_MSA_3R_0D,
1219     OPC_ADDV_df     = (0x0 << 23) | OPC_MSA_3R_0E,
1220     OPC_CEQ_df      = (0x0 << 23) | OPC_MSA_3R_0F,
1221     OPC_ADD_A_df    = (0x0 << 23) | OPC_MSA_3R_10,
1222     OPC_SUBS_S_df   = (0x0 << 23) | OPC_MSA_3R_11,
1223     OPC_MULV_df     = (0x0 << 23) | OPC_MSA_3R_12,
1224     OPC_DOTP_S_df   = (0x0 << 23) | OPC_MSA_3R_13,
1225     OPC_SLD_df      = (0x0 << 23) | OPC_MSA_3R_14,
1226     OPC_VSHF_df     = (0x0 << 23) | OPC_MSA_3R_15,
1227     OPC_SRA_df      = (0x1 << 23) | OPC_MSA_3R_0D,
1228     OPC_SUBV_df     = (0x1 << 23) | OPC_MSA_3R_0E,
1229     OPC_ADDS_A_df   = (0x1 << 23) | OPC_MSA_3R_10,
1230     OPC_SUBS_U_df   = (0x1 << 23) | OPC_MSA_3R_11,
1231     OPC_MADDV_df    = (0x1 << 23) | OPC_MSA_3R_12,
1232     OPC_DOTP_U_df   = (0x1 << 23) | OPC_MSA_3R_13,
1233     OPC_SPLAT_df    = (0x1 << 23) | OPC_MSA_3R_14,
1234     OPC_SRAR_df     = (0x1 << 23) | OPC_MSA_3R_15,
1235     OPC_SRL_df      = (0x2 << 23) | OPC_MSA_3R_0D,
1236     OPC_MAX_S_df    = (0x2 << 23) | OPC_MSA_3R_0E,
1237     OPC_CLT_S_df    = (0x2 << 23) | OPC_MSA_3R_0F,
1238     OPC_ADDS_S_df   = (0x2 << 23) | OPC_MSA_3R_10,
1239     OPC_SUBSUS_U_df = (0x2 << 23) | OPC_MSA_3R_11,
1240     OPC_MSUBV_df    = (0x2 << 23) | OPC_MSA_3R_12,
1241     OPC_DPADD_S_df  = (0x2 << 23) | OPC_MSA_3R_13,
1242     OPC_PCKEV_df    = (0x2 << 23) | OPC_MSA_3R_14,
1243     OPC_SRLR_df     = (0x2 << 23) | OPC_MSA_3R_15,
1244     OPC_BCLR_df     = (0x3 << 23) | OPC_MSA_3R_0D,
1245     OPC_MAX_U_df    = (0x3 << 23) | OPC_MSA_3R_0E,
1246     OPC_CLT_U_df    = (0x3 << 23) | OPC_MSA_3R_0F,
1247     OPC_ADDS_U_df   = (0x3 << 23) | OPC_MSA_3R_10,
1248     OPC_SUBSUU_S_df = (0x3 << 23) | OPC_MSA_3R_11,
1249     OPC_DPADD_U_df  = (0x3 << 23) | OPC_MSA_3R_13,
1250     OPC_PCKOD_df    = (0x3 << 23) | OPC_MSA_3R_14,
1251     OPC_BSET_df     = (0x4 << 23) | OPC_MSA_3R_0D,
1252     OPC_MIN_S_df    = (0x4 << 23) | OPC_MSA_3R_0E,
1253     OPC_CLE_S_df    = (0x4 << 23) | OPC_MSA_3R_0F,
1254     OPC_AVE_S_df    = (0x4 << 23) | OPC_MSA_3R_10,
1255     OPC_ASUB_S_df   = (0x4 << 23) | OPC_MSA_3R_11,
1256     OPC_DIV_S_df    = (0x4 << 23) | OPC_MSA_3R_12,
1257     OPC_DPSUB_S_df  = (0x4 << 23) | OPC_MSA_3R_13,
1258     OPC_ILVL_df     = (0x4 << 23) | OPC_MSA_3R_14,
1259     OPC_HADD_S_df   = (0x4 << 23) | OPC_MSA_3R_15,
1260     OPC_BNEG_df     = (0x5 << 23) | OPC_MSA_3R_0D,
1261     OPC_MIN_U_df    = (0x5 << 23) | OPC_MSA_3R_0E,
1262     OPC_CLE_U_df    = (0x5 << 23) | OPC_MSA_3R_0F,
1263     OPC_AVE_U_df    = (0x5 << 23) | OPC_MSA_3R_10,
1264     OPC_ASUB_U_df   = (0x5 << 23) | OPC_MSA_3R_11,
1265     OPC_DIV_U_df    = (0x5 << 23) | OPC_MSA_3R_12,
1266     OPC_DPSUB_U_df  = (0x5 << 23) | OPC_MSA_3R_13,
1267     OPC_ILVR_df     = (0x5 << 23) | OPC_MSA_3R_14,
1268     OPC_HADD_U_df   = (0x5 << 23) | OPC_MSA_3R_15,
1269     OPC_BINSL_df    = (0x6 << 23) | OPC_MSA_3R_0D,
1270     OPC_MAX_A_df    = (0x6 << 23) | OPC_MSA_3R_0E,
1271     OPC_AVER_S_df   = (0x6 << 23) | OPC_MSA_3R_10,
1272     OPC_MOD_S_df    = (0x6 << 23) | OPC_MSA_3R_12,
1273     OPC_ILVEV_df    = (0x6 << 23) | OPC_MSA_3R_14,
1274     OPC_HSUB_S_df   = (0x6 << 23) | OPC_MSA_3R_15,
1275     OPC_BINSR_df    = (0x7 << 23) | OPC_MSA_3R_0D,
1276     OPC_MIN_A_df    = (0x7 << 23) | OPC_MSA_3R_0E,
1277     OPC_AVER_U_df   = (0x7 << 23) | OPC_MSA_3R_10,
1278     OPC_MOD_U_df    = (0x7 << 23) | OPC_MSA_3R_12,
1279     OPC_ILVOD_df    = (0x7 << 23) | OPC_MSA_3R_14,
1280     OPC_HSUB_U_df   = (0x7 << 23) | OPC_MSA_3R_15,
1281
1282     /* ELM instructions df(bits 21..16) = _b, _h, _w, _d */
1283     OPC_SLDI_df     = (0x0 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1284     OPC_CTCMSA      = (0x0 << 22) | (0x3E << 16) | OPC_MSA_ELM,
1285     OPC_SPLATI_df   = (0x1 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1286     OPC_CFCMSA      = (0x1 << 22) | (0x3E << 16) | OPC_MSA_ELM,
1287     OPC_COPY_S_df   = (0x2 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1288     OPC_MOVE_V      = (0x2 << 22) | (0x3E << 16) | OPC_MSA_ELM,
1289     OPC_COPY_U_df   = (0x3 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1290     OPC_INSERT_df   = (0x4 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1291     OPC_INSVE_df    = (0x5 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1292
1293     /* 3RF instruction _df(bit 21) = _w, _d */
1294     OPC_FCAF_df     = (0x0 << 22) | OPC_MSA_3RF_1A,
1295     OPC_FADD_df     = (0x0 << 22) | OPC_MSA_3RF_1B,
1296     OPC_FCUN_df     = (0x1 << 22) | OPC_MSA_3RF_1A,
1297     OPC_FSUB_df     = (0x1 << 22) | OPC_MSA_3RF_1B,
1298     OPC_FCOR_df     = (0x1 << 22) | OPC_MSA_3RF_1C,
1299     OPC_FCEQ_df     = (0x2 << 22) | OPC_MSA_3RF_1A,
1300     OPC_FMUL_df     = (0x2 << 22) | OPC_MSA_3RF_1B,
1301     OPC_FCUNE_df    = (0x2 << 22) | OPC_MSA_3RF_1C,
1302     OPC_FCUEQ_df    = (0x3 << 22) | OPC_MSA_3RF_1A,
1303     OPC_FDIV_df     = (0x3 << 22) | OPC_MSA_3RF_1B,
1304     OPC_FCNE_df     = (0x3 << 22) | OPC_MSA_3RF_1C,
1305     OPC_FCLT_df     = (0x4 << 22) | OPC_MSA_3RF_1A,
1306     OPC_FMADD_df    = (0x4 << 22) | OPC_MSA_3RF_1B,
1307     OPC_MUL_Q_df    = (0x4 << 22) | OPC_MSA_3RF_1C,
1308     OPC_FCULT_df    = (0x5 << 22) | OPC_MSA_3RF_1A,
1309     OPC_FMSUB_df    = (0x5 << 22) | OPC_MSA_3RF_1B,
1310     OPC_MADD_Q_df   = (0x5 << 22) | OPC_MSA_3RF_1C,
1311     OPC_FCLE_df     = (0x6 << 22) | OPC_MSA_3RF_1A,
1312     OPC_MSUB_Q_df   = (0x6 << 22) | OPC_MSA_3RF_1C,
1313     OPC_FCULE_df    = (0x7 << 22) | OPC_MSA_3RF_1A,
1314     OPC_FEXP2_df    = (0x7 << 22) | OPC_MSA_3RF_1B,
1315     OPC_FSAF_df     = (0x8 << 22) | OPC_MSA_3RF_1A,
1316     OPC_FEXDO_df    = (0x8 << 22) | OPC_MSA_3RF_1B,
1317     OPC_FSUN_df     = (0x9 << 22) | OPC_MSA_3RF_1A,
1318     OPC_FSOR_df     = (0x9 << 22) | OPC_MSA_3RF_1C,
1319     OPC_FSEQ_df     = (0xA << 22) | OPC_MSA_3RF_1A,
1320     OPC_FTQ_df      = (0xA << 22) | OPC_MSA_3RF_1B,
1321     OPC_FSUNE_df    = (0xA << 22) | OPC_MSA_3RF_1C,
1322     OPC_FSUEQ_df    = (0xB << 22) | OPC_MSA_3RF_1A,
1323     OPC_FSNE_df     = (0xB << 22) | OPC_MSA_3RF_1C,
1324     OPC_FSLT_df     = (0xC << 22) | OPC_MSA_3RF_1A,
1325     OPC_FMIN_df     = (0xC << 22) | OPC_MSA_3RF_1B,
1326     OPC_MULR_Q_df   = (0xC << 22) | OPC_MSA_3RF_1C,
1327     OPC_FSULT_df    = (0xD << 22) | OPC_MSA_3RF_1A,
1328     OPC_FMIN_A_df   = (0xD << 22) | OPC_MSA_3RF_1B,
1329     OPC_MADDR_Q_df  = (0xD << 22) | OPC_MSA_3RF_1C,
1330     OPC_FSLE_df     = (0xE << 22) | OPC_MSA_3RF_1A,
1331     OPC_FMAX_df     = (0xE << 22) | OPC_MSA_3RF_1B,
1332     OPC_MSUBR_Q_df  = (0xE << 22) | OPC_MSA_3RF_1C,
1333     OPC_FSULE_df    = (0xF << 22) | OPC_MSA_3RF_1A,
1334     OPC_FMAX_A_df   = (0xF << 22) | OPC_MSA_3RF_1B,
1335
1336     /* BIT instruction df(bits 22..16) = _B _H _W _D */
1337     OPC_SLLI_df     = (0x0 << 23) | OPC_MSA_BIT_09,
1338     OPC_SAT_S_df    = (0x0 << 23) | OPC_MSA_BIT_0A,
1339     OPC_SRAI_df     = (0x1 << 23) | OPC_MSA_BIT_09,
1340     OPC_SAT_U_df    = (0x1 << 23) | OPC_MSA_BIT_0A,
1341     OPC_SRLI_df     = (0x2 << 23) | OPC_MSA_BIT_09,
1342     OPC_SRARI_df    = (0x2 << 23) | OPC_MSA_BIT_0A,
1343     OPC_BCLRI_df    = (0x3 << 23) | OPC_MSA_BIT_09,
1344     OPC_SRLRI_df    = (0x3 << 23) | OPC_MSA_BIT_0A,
1345     OPC_BSETI_df    = (0x4 << 23) | OPC_MSA_BIT_09,
1346     OPC_BNEGI_df    = (0x5 << 23) | OPC_MSA_BIT_09,
1347     OPC_BINSLI_df   = (0x6 << 23) | OPC_MSA_BIT_09,
1348     OPC_BINSRI_df   = (0x7 << 23) | OPC_MSA_BIT_09,
1349 };
1350
1351 /* global register indices */
1352 static TCGv_ptr cpu_env;
1353 static TCGv cpu_gpr[32], cpu_PC;
1354 static TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC];
1355 static TCGv cpu_dspctrl, btarget, bcond;
1356 static TCGv_i32 hflags;
1357 static TCGv_i32 fpu_fcr0, fpu_fcr31;
1358 static TCGv_i64 fpu_f64[32];
1359 static TCGv_i64 msa_wr_d[64];
1360
1361 static uint32_t gen_opc_hflags[OPC_BUF_SIZE];
1362 static target_ulong gen_opc_btarget[OPC_BUF_SIZE];
1363
1364 #include "exec/gen-icount.h"
1365
1366 #define gen_helper_0e0i(name, arg) do {                           \
1367     TCGv_i32 helper_tmp = tcg_const_i32(arg);                     \
1368     gen_helper_##name(cpu_env, helper_tmp);                       \
1369     tcg_temp_free_i32(helper_tmp);                                \
1370     } while(0)
1371
1372 #define gen_helper_0e1i(name, arg1, arg2) do {                    \
1373     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1374     gen_helper_##name(cpu_env, arg1, helper_tmp);                 \
1375     tcg_temp_free_i32(helper_tmp);                                \
1376     } while(0)
1377
1378 #define gen_helper_1e0i(name, ret, arg1) do {                     \
1379     TCGv_i32 helper_tmp = tcg_const_i32(arg1);                    \
1380     gen_helper_##name(ret, cpu_env, helper_tmp);                  \
1381     tcg_temp_free_i32(helper_tmp);                                \
1382     } while(0)
1383
1384 #define gen_helper_1e1i(name, ret, arg1, arg2) do {               \
1385     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1386     gen_helper_##name(ret, cpu_env, arg1, helper_tmp);            \
1387     tcg_temp_free_i32(helper_tmp);                                \
1388     } while(0)
1389
1390 #define gen_helper_0e2i(name, arg1, arg2, arg3) do {              \
1391     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1392     gen_helper_##name(cpu_env, arg1, arg2, helper_tmp);           \
1393     tcg_temp_free_i32(helper_tmp);                                \
1394     } while(0)
1395
1396 #define gen_helper_1e2i(name, ret, arg1, arg2, arg3) do {         \
1397     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1398     gen_helper_##name(ret, cpu_env, arg1, arg2, helper_tmp);      \
1399     tcg_temp_free_i32(helper_tmp);                                \
1400     } while(0)
1401
1402 #define gen_helper_0e3i(name, arg1, arg2, arg3, arg4) do {        \
1403     TCGv_i32 helper_tmp = tcg_const_i32(arg4);                    \
1404     gen_helper_##name(cpu_env, arg1, arg2, arg3, helper_tmp);     \
1405     tcg_temp_free_i32(helper_tmp);                                \
1406     } while(0)
1407
1408 typedef struct DisasContext {
1409     struct TranslationBlock *tb;
1410     target_ulong pc, saved_pc;
1411     uint32_t opcode;
1412     int singlestep_enabled;
1413     int insn_flags;
1414     int32_t CP0_Config1;
1415     /* Routine used to access memory */
1416     int mem_idx;
1417     TCGMemOp default_tcg_memop_mask;
1418     uint32_t hflags, saved_hflags;
1419     int bstate;
1420     target_ulong btarget;
1421     bool ulri;
1422     int kscrexist;
1423     bool rxi;
1424     int ie;
1425     bool bi;
1426     bool bp;
1427 } DisasContext;
1428
1429 enum {
1430     BS_NONE     = 0, /* We go out of the TB without reaching a branch or an
1431                       * exception condition */
1432     BS_STOP     = 1, /* We want to stop translation for any reason */
1433     BS_BRANCH   = 2, /* We reached a branch condition     */
1434     BS_EXCP     = 3, /* We reached an exception condition */
1435 };
1436
1437 static const char * const regnames[] = {
1438     "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
1439     "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
1440     "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1441     "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
1442 };
1443
1444 static const char * const regnames_HI[] = {
1445     "HI0", "HI1", "HI2", "HI3",
1446 };
1447
1448 static const char * const regnames_LO[] = {
1449     "LO0", "LO1", "LO2", "LO3",
1450 };
1451
1452 static const char * const fregnames[] = {
1453     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
1454     "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
1455     "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1456     "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
1457 };
1458
1459 static const char * const msaregnames[] = {
1460     "w0.d0",  "w0.d1",  "w1.d0",  "w1.d1",
1461     "w2.d0",  "w2.d1",  "w3.d0",  "w3.d1",
1462     "w4.d0",  "w4.d1",  "w5.d0",  "w5.d1",
1463     "w6.d0",  "w6.d1",  "w7.d0",  "w7.d1",
1464     "w8.d0",  "w8.d1",  "w9.d0",  "w9.d1",
1465     "w10.d0", "w10.d1", "w11.d0", "w11.d1",
1466     "w12.d0", "w12.d1", "w13.d0", "w13.d1",
1467     "w14.d0", "w14.d1", "w15.d0", "w15.d1",
1468     "w16.d0", "w16.d1", "w17.d0", "w17.d1",
1469     "w18.d0", "w18.d1", "w19.d0", "w19.d1",
1470     "w20.d0", "w20.d1", "w21.d0", "w21.d1",
1471     "w22.d0", "w22.d1", "w23.d0", "w23.d1",
1472     "w24.d0", "w24.d1", "w25.d0", "w25.d1",
1473     "w26.d0", "w26.d1", "w27.d0", "w27.d1",
1474     "w28.d0", "w28.d1", "w29.d0", "w29.d1",
1475     "w30.d0", "w30.d1", "w31.d0", "w31.d1",
1476 };
1477
1478 #define MIPS_DEBUG(fmt, ...)                                                  \
1479     do {                                                                      \
1480         if (MIPS_DEBUG_DISAS) {                                               \
1481             qemu_log_mask(CPU_LOG_TB_IN_ASM,                                  \
1482                           TARGET_FMT_lx ": %08x " fmt "\n",                   \
1483                           ctx->pc, ctx->opcode , ## __VA_ARGS__);             \
1484         }                                                                     \
1485     } while (0)
1486
1487 #define LOG_DISAS(...)                                                        \
1488     do {                                                                      \
1489         if (MIPS_DEBUG_DISAS) {                                               \
1490             qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__);                 \
1491         }                                                                     \
1492     } while (0)
1493
1494 #define MIPS_INVAL(op)                                                        \
1495     MIPS_DEBUG("Invalid %s %03x %03x %03x", op, ctx->opcode >> 26,            \
1496                ctx->opcode & 0x3F, ((ctx->opcode >> 16) & 0x1F))
1497
1498 /* General purpose registers moves. */
1499 static inline void gen_load_gpr (TCGv t, int reg)
1500 {
1501     if (reg == 0)
1502         tcg_gen_movi_tl(t, 0);
1503     else
1504         tcg_gen_mov_tl(t, cpu_gpr[reg]);
1505 }
1506
1507 static inline void gen_store_gpr (TCGv t, int reg)
1508 {
1509     if (reg != 0)
1510         tcg_gen_mov_tl(cpu_gpr[reg], t);
1511 }
1512
1513 /* Moves to/from shadow registers. */
1514 static inline void gen_load_srsgpr (int from, int to)
1515 {
1516     TCGv t0 = tcg_temp_new();
1517
1518     if (from == 0)
1519         tcg_gen_movi_tl(t0, 0);
1520     else {
1521         TCGv_i32 t2 = tcg_temp_new_i32();
1522         TCGv_ptr addr = tcg_temp_new_ptr();
1523
1524         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1525         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1526         tcg_gen_andi_i32(t2, t2, 0xf);
1527         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1528         tcg_gen_ext_i32_ptr(addr, t2);
1529         tcg_gen_add_ptr(addr, cpu_env, addr);
1530
1531         tcg_gen_ld_tl(t0, addr, sizeof(target_ulong) * from);
1532         tcg_temp_free_ptr(addr);
1533         tcg_temp_free_i32(t2);
1534     }
1535     gen_store_gpr(t0, to);
1536     tcg_temp_free(t0);
1537 }
1538
1539 static inline void gen_store_srsgpr (int from, int to)
1540 {
1541     if (to != 0) {
1542         TCGv t0 = tcg_temp_new();
1543         TCGv_i32 t2 = tcg_temp_new_i32();
1544         TCGv_ptr addr = tcg_temp_new_ptr();
1545
1546         gen_load_gpr(t0, from);
1547         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1548         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1549         tcg_gen_andi_i32(t2, t2, 0xf);
1550         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1551         tcg_gen_ext_i32_ptr(addr, t2);
1552         tcg_gen_add_ptr(addr, cpu_env, addr);
1553
1554         tcg_gen_st_tl(t0, addr, sizeof(target_ulong) * to);
1555         tcg_temp_free_ptr(addr);
1556         tcg_temp_free_i32(t2);
1557         tcg_temp_free(t0);
1558     }
1559 }
1560
1561 /* Tests */
1562 static inline void gen_save_pc(target_ulong pc)
1563 {
1564     tcg_gen_movi_tl(cpu_PC, pc);
1565 }
1566
1567 static inline void save_cpu_state(DisasContext *ctx, int do_save_pc)
1568 {
1569     LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags);
1570     if (do_save_pc && ctx->pc != ctx->saved_pc) {
1571         gen_save_pc(ctx->pc);
1572         ctx->saved_pc = ctx->pc;
1573     }
1574     if (ctx->hflags != ctx->saved_hflags) {
1575         tcg_gen_movi_i32(hflags, ctx->hflags);
1576         ctx->saved_hflags = ctx->hflags;
1577         switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1578         case MIPS_HFLAG_BR:
1579             break;
1580         case MIPS_HFLAG_BC:
1581         case MIPS_HFLAG_BL:
1582         case MIPS_HFLAG_B:
1583             tcg_gen_movi_tl(btarget, ctx->btarget);
1584             break;
1585         }
1586     }
1587 }
1588
1589 static inline void restore_cpu_state(CPUMIPSState *env, DisasContext *ctx)
1590 {
1591     ctx->saved_hflags = ctx->hflags;
1592     switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1593     case MIPS_HFLAG_BR:
1594         break;
1595     case MIPS_HFLAG_BC:
1596     case MIPS_HFLAG_BL:
1597     case MIPS_HFLAG_B:
1598         ctx->btarget = env->btarget;
1599         break;
1600     }
1601 }
1602
1603 static inline void generate_exception_err(DisasContext *ctx, int excp, int err)
1604 {
1605     TCGv_i32 texcp = tcg_const_i32(excp);
1606     TCGv_i32 terr = tcg_const_i32(err);
1607     save_cpu_state(ctx, 1);
1608     gen_helper_raise_exception_err(cpu_env, texcp, terr);
1609     tcg_temp_free_i32(terr);
1610     tcg_temp_free_i32(texcp);
1611 }
1612
1613 static inline void generate_exception(DisasContext *ctx, int excp)
1614 {
1615     save_cpu_state(ctx, 1);
1616     gen_helper_0e0i(raise_exception, excp);
1617 }
1618
1619 /* Floating point register moves. */
1620 static void gen_load_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
1621 {
1622     if (ctx->hflags & MIPS_HFLAG_FRE) {
1623         generate_exception(ctx, EXCP_RI);
1624     }
1625     tcg_gen_trunc_i64_i32(t, fpu_f64[reg]);
1626 }
1627
1628 static void gen_store_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
1629 {
1630     TCGv_i64 t64;
1631     if (ctx->hflags & MIPS_HFLAG_FRE) {
1632         generate_exception(ctx, EXCP_RI);
1633     }
1634     t64 = tcg_temp_new_i64();
1635     tcg_gen_extu_i32_i64(t64, t);
1636     tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 0, 32);
1637     tcg_temp_free_i64(t64);
1638 }
1639
1640 static void gen_load_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
1641 {
1642     if (ctx->hflags & MIPS_HFLAG_F64) {
1643         TCGv_i64 t64 = tcg_temp_new_i64();
1644         tcg_gen_shri_i64(t64, fpu_f64[reg], 32);
1645         tcg_gen_trunc_i64_i32(t, t64);
1646         tcg_temp_free_i64(t64);
1647     } else {
1648         gen_load_fpr32(ctx, t, reg | 1);
1649     }
1650 }
1651
1652 static void gen_store_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
1653 {
1654     if (ctx->hflags & MIPS_HFLAG_F64) {
1655         TCGv_i64 t64 = tcg_temp_new_i64();
1656         tcg_gen_extu_i32_i64(t64, t);
1657         tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 32, 32);
1658         tcg_temp_free_i64(t64);
1659     } else {
1660         gen_store_fpr32(ctx, t, reg | 1);
1661     }
1662 }
1663
1664 static void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1665 {
1666     if (ctx->hflags & MIPS_HFLAG_F64) {
1667         tcg_gen_mov_i64(t, fpu_f64[reg]);
1668     } else {
1669         tcg_gen_concat32_i64(t, fpu_f64[reg & ~1], fpu_f64[reg | 1]);
1670     }
1671 }
1672
1673 static void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1674 {
1675     if (ctx->hflags & MIPS_HFLAG_F64) {
1676         tcg_gen_mov_i64(fpu_f64[reg], t);
1677     } else {
1678         TCGv_i64 t0;
1679         tcg_gen_deposit_i64(fpu_f64[reg & ~1], fpu_f64[reg & ~1], t, 0, 32);
1680         t0 = tcg_temp_new_i64();
1681         tcg_gen_shri_i64(t0, t, 32);
1682         tcg_gen_deposit_i64(fpu_f64[reg | 1], fpu_f64[reg | 1], t0, 0, 32);
1683         tcg_temp_free_i64(t0);
1684     }
1685 }
1686
1687 static inline int get_fp_bit (int cc)
1688 {
1689     if (cc)
1690         return 24 + cc;
1691     else
1692         return 23;
1693 }
1694
1695 /* Addresses computation */
1696 static inline void gen_op_addr_add (DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1)
1697 {
1698     tcg_gen_add_tl(ret, arg0, arg1);
1699
1700 #if defined(TARGET_MIPS64)
1701     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1702         tcg_gen_ext32s_i64(ret, ret);
1703     }
1704 #endif
1705 }
1706
1707 /* Addresses computation (translation time) */
1708 static target_long addr_add(DisasContext *ctx, target_long base,
1709                             target_long offset)
1710 {
1711     target_long sum = base + offset;
1712
1713 #if defined(TARGET_MIPS64)
1714     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1715         sum = (int32_t)sum;
1716     }
1717 #endif
1718     return sum;
1719 }
1720
1721 static inline void check_cp0_enabled(DisasContext *ctx)
1722 {
1723     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0)))
1724         generate_exception_err(ctx, EXCP_CpU, 0);
1725 }
1726
1727 static inline void check_cp1_enabled(DisasContext *ctx)
1728 {
1729     if (unlikely(!(ctx->hflags & MIPS_HFLAG_FPU)))
1730         generate_exception_err(ctx, EXCP_CpU, 1);
1731 }
1732
1733 /* Verify that the processor is running with COP1X instructions enabled.
1734    This is associated with the nabla symbol in the MIPS32 and MIPS64
1735    opcode tables.  */
1736
1737 static inline void check_cop1x(DisasContext *ctx)
1738 {
1739     if (unlikely(!(ctx->hflags & MIPS_HFLAG_COP1X)))
1740         generate_exception(ctx, EXCP_RI);
1741 }
1742
1743 /* Verify that the processor is running with 64-bit floating-point
1744    operations enabled.  */
1745
1746 static inline void check_cp1_64bitmode(DisasContext *ctx)
1747 {
1748     if (unlikely(~ctx->hflags & (MIPS_HFLAG_F64 | MIPS_HFLAG_COP1X)))
1749         generate_exception(ctx, EXCP_RI);
1750 }
1751
1752 /*
1753  * Verify if floating point register is valid; an operation is not defined
1754  * if bit 0 of any register specification is set and the FR bit in the
1755  * Status register equals zero, since the register numbers specify an
1756  * even-odd pair of adjacent coprocessor general registers. When the FR bit
1757  * in the Status register equals one, both even and odd register numbers
1758  * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers.
1759  *
1760  * Multiple 64 bit wide registers can be checked by calling
1761  * gen_op_cp1_registers(freg1 | freg2 | ... | fregN);
1762  */
1763 static inline void check_cp1_registers(DisasContext *ctx, int regs)
1764 {
1765     if (unlikely(!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1)))
1766         generate_exception(ctx, EXCP_RI);
1767 }
1768
1769 /* Verify that the processor is running with DSP instructions enabled.
1770    This is enabled by CP0 Status register MX(24) bit.
1771  */
1772
1773 static inline void check_dsp(DisasContext *ctx)
1774 {
1775     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP))) {
1776         if (ctx->insn_flags & ASE_DSP) {
1777             generate_exception(ctx, EXCP_DSPDIS);
1778         } else {
1779             generate_exception(ctx, EXCP_RI);
1780         }
1781     }
1782 }
1783
1784 static inline void check_dspr2(DisasContext *ctx)
1785 {
1786     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSPR2))) {
1787         if (ctx->insn_flags & ASE_DSP) {
1788             generate_exception(ctx, EXCP_DSPDIS);
1789         } else {
1790             generate_exception(ctx, EXCP_RI);
1791         }
1792     }
1793 }
1794
1795 /* This code generates a "reserved instruction" exception if the
1796    CPU does not support the instruction set corresponding to flags. */
1797 static inline void check_insn(DisasContext *ctx, int flags)
1798 {
1799     if (unlikely(!(ctx->insn_flags & flags))) {
1800         generate_exception(ctx, EXCP_RI);
1801     }
1802 }
1803
1804 /* This code generates a "reserved instruction" exception if the
1805    CPU has corresponding flag set which indicates that the instruction
1806    has been removed. */
1807 static inline void check_insn_opc_removed(DisasContext *ctx, int flags)
1808 {
1809     if (unlikely(ctx->insn_flags & flags)) {
1810         generate_exception(ctx, EXCP_RI);
1811     }
1812 }
1813
1814 #ifdef TARGET_MIPS64
1815 /* This code generates a "reserved instruction" exception if 64-bit
1816    instructions are not enabled. */
1817 static inline void check_mips_64(DisasContext *ctx)
1818 {
1819     if (unlikely(!(ctx->hflags & MIPS_HFLAG_64)))
1820         generate_exception(ctx, EXCP_RI);
1821 }
1822 #endif
1823
1824 /* Define small wrappers for gen_load_fpr* so that we have a uniform
1825    calling interface for 32 and 64-bit FPRs.  No sense in changing
1826    all callers for gen_load_fpr32 when we need the CTX parameter for
1827    this one use.  */
1828 #define gen_ldcmp_fpr32(ctx, x, y) gen_load_fpr32(ctx, x, y)
1829 #define gen_ldcmp_fpr64(ctx, x, y) gen_load_fpr64(ctx, x, y)
1830 #define FOP_CONDS(type, abs, fmt, ifmt, bits)                                 \
1831 static inline void gen_cmp ## type ## _ ## fmt(DisasContext *ctx, int n,      \
1832                                                int ft, int fs, int cc)        \
1833 {                                                                             \
1834     TCGv_i##bits fp0 = tcg_temp_new_i##bits ();                               \
1835     TCGv_i##bits fp1 = tcg_temp_new_i##bits ();                               \
1836     switch (ifmt) {                                                           \
1837     case FMT_PS:                                                              \
1838         check_cp1_64bitmode(ctx);                                             \
1839         break;                                                                \
1840     case FMT_D:                                                               \
1841         if (abs) {                                                            \
1842             check_cop1x(ctx);                                                 \
1843         }                                                                     \
1844         check_cp1_registers(ctx, fs | ft);                                    \
1845         break;                                                                \
1846     case FMT_S:                                                               \
1847         if (abs) {                                                            \
1848             check_cop1x(ctx);                                                 \
1849         }                                                                     \
1850         break;                                                                \
1851     }                                                                         \
1852     gen_ldcmp_fpr##bits (ctx, fp0, fs);                                       \
1853     gen_ldcmp_fpr##bits (ctx, fp1, ft);                                       \
1854     switch (n) {                                                              \
1855     case  0: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc);    break;\
1856     case  1: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc);   break;\
1857     case  2: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc);   break;\
1858     case  3: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc);  break;\
1859     case  4: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc);  break;\
1860     case  5: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc);  break;\
1861     case  6: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc);  break;\
1862     case  7: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc);  break;\
1863     case  8: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc);   break;\
1864     case  9: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc); break;\
1865     case 10: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc);  break;\
1866     case 11: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc);  break;\
1867     case 12: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc);   break;\
1868     case 13: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc);  break;\
1869     case 14: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc);   break;\
1870     case 15: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc);  break;\
1871     default: abort();                                                         \
1872     }                                                                         \
1873     tcg_temp_free_i##bits (fp0);                                              \
1874     tcg_temp_free_i##bits (fp1);                                              \
1875 }
1876
1877 FOP_CONDS(, 0, d, FMT_D, 64)
1878 FOP_CONDS(abs, 1, d, FMT_D, 64)
1879 FOP_CONDS(, 0, s, FMT_S, 32)
1880 FOP_CONDS(abs, 1, s, FMT_S, 32)
1881 FOP_CONDS(, 0, ps, FMT_PS, 64)
1882 FOP_CONDS(abs, 1, ps, FMT_PS, 64)
1883 #undef FOP_CONDS
1884
1885 #define FOP_CONDNS(fmt, ifmt, bits, STORE)                              \
1886 static inline void gen_r6_cmp_ ## fmt(DisasContext * ctx, int n,        \
1887                                       int ft, int fs, int fd)           \
1888 {                                                                       \
1889     TCGv_i ## bits fp0 = tcg_temp_new_i ## bits();                      \
1890     TCGv_i ## bits fp1 = tcg_temp_new_i ## bits();                      \
1891     if (ifmt == FMT_D) {                                                \
1892         check_cp1_registers(ctx, fs | ft | fd);                         \
1893     }                                                                   \
1894     gen_ldcmp_fpr ## bits(ctx, fp0, fs);                                \
1895     gen_ldcmp_fpr ## bits(ctx, fp1, ft);                                \
1896     switch (n) {                                                        \
1897     case  0:                                                            \
1898         gen_helper_r6_cmp_ ## fmt ## _af(fp0, cpu_env, fp0, fp1);       \
1899         break;                                                          \
1900     case  1:                                                            \
1901         gen_helper_r6_cmp_ ## fmt ## _un(fp0, cpu_env, fp0, fp1);       \
1902         break;                                                          \
1903     case  2:                                                            \
1904         gen_helper_r6_cmp_ ## fmt ## _eq(fp0, cpu_env, fp0, fp1);       \
1905         break;                                                          \
1906     case  3:                                                            \
1907         gen_helper_r6_cmp_ ## fmt ## _ueq(fp0, cpu_env, fp0, fp1);      \
1908         break;                                                          \
1909     case  4:                                                            \
1910         gen_helper_r6_cmp_ ## fmt ## _lt(fp0, cpu_env, fp0, fp1);       \
1911         break;                                                          \
1912     case  5:                                                            \
1913         gen_helper_r6_cmp_ ## fmt ## _ult(fp0, cpu_env, fp0, fp1);      \
1914         break;                                                          \
1915     case  6:                                                            \
1916         gen_helper_r6_cmp_ ## fmt ## _le(fp0, cpu_env, fp0, fp1);       \
1917         break;                                                          \
1918     case  7:                                                            \
1919         gen_helper_r6_cmp_ ## fmt ## _ule(fp0, cpu_env, fp0, fp1);      \
1920         break;                                                          \
1921     case  8:                                                            \
1922         gen_helper_r6_cmp_ ## fmt ## _saf(fp0, cpu_env, fp0, fp1);      \
1923         break;                                                          \
1924     case  9:                                                            \
1925         gen_helper_r6_cmp_ ## fmt ## _sun(fp0, cpu_env, fp0, fp1);      \
1926         break;                                                          \
1927     case 10:                                                            \
1928         gen_helper_r6_cmp_ ## fmt ## _seq(fp0, cpu_env, fp0, fp1);      \
1929         break;                                                          \
1930     case 11:                                                            \
1931         gen_helper_r6_cmp_ ## fmt ## _sueq(fp0, cpu_env, fp0, fp1);     \
1932         break;                                                          \
1933     case 12:                                                            \
1934         gen_helper_r6_cmp_ ## fmt ## _slt(fp0, cpu_env, fp0, fp1);      \
1935         break;                                                          \
1936     case 13:                                                            \
1937         gen_helper_r6_cmp_ ## fmt ## _sult(fp0, cpu_env, fp0, fp1);     \
1938         break;                                                          \
1939     case 14:                                                            \
1940         gen_helper_r6_cmp_ ## fmt ## _sle(fp0, cpu_env, fp0, fp1);      \
1941         break;                                                          \
1942     case 15:                                                            \
1943         gen_helper_r6_cmp_ ## fmt ## _sule(fp0, cpu_env, fp0, fp1);     \
1944         break;                                                          \
1945     case 17:                                                            \
1946         gen_helper_r6_cmp_ ## fmt ## _or(fp0, cpu_env, fp0, fp1);       \
1947         break;                                                          \
1948     case 18:                                                            \
1949         gen_helper_r6_cmp_ ## fmt ## _une(fp0, cpu_env, fp0, fp1);      \
1950         break;                                                          \
1951     case 19:                                                            \
1952         gen_helper_r6_cmp_ ## fmt ## _ne(fp0, cpu_env, fp0, fp1);       \
1953         break;                                                          \
1954     case 25:                                                            \
1955         gen_helper_r6_cmp_ ## fmt ## _sor(fp0, cpu_env, fp0, fp1);      \
1956         break;                                                          \
1957     case 26:                                                            \
1958         gen_helper_r6_cmp_ ## fmt ## _sune(fp0, cpu_env, fp0, fp1);     \
1959         break;                                                          \
1960     case 27:                                                            \
1961         gen_helper_r6_cmp_ ## fmt ## _sne(fp0, cpu_env, fp0, fp1);      \
1962         break;                                                          \
1963     default:                                                            \
1964         abort();                                                        \
1965     }                                                                   \
1966     STORE;                                                              \
1967     tcg_temp_free_i ## bits (fp0);                                      \
1968     tcg_temp_free_i ## bits (fp1);                                      \
1969 }
1970
1971 FOP_CONDNS(d, FMT_D, 64, gen_store_fpr64(ctx, fp0, fd))
1972 FOP_CONDNS(s, FMT_S, 32, gen_store_fpr32(ctx, fp0, fd))
1973 #undef FOP_CONDNS
1974 #undef gen_ldcmp_fpr32
1975 #undef gen_ldcmp_fpr64
1976
1977 /* load/store instructions. */
1978 #ifdef CONFIG_USER_ONLY
1979 #define OP_LD_ATOMIC(insn,fname)                                           \
1980 static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)    \
1981 {                                                                          \
1982     TCGv t0 = tcg_temp_new();                                              \
1983     tcg_gen_mov_tl(t0, arg1);                                              \
1984     tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                         \
1985     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                \
1986     tcg_gen_st_tl(ret, cpu_env, offsetof(CPUMIPSState, llval));                \
1987     tcg_temp_free(t0);                                                     \
1988 }
1989 #else
1990 #define OP_LD_ATOMIC(insn,fname)                                           \
1991 static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)    \
1992 {                                                                          \
1993     gen_helper_1e1i(insn, ret, arg1, ctx->mem_idx);                        \
1994 }
1995 #endif
1996 OP_LD_ATOMIC(ll,ld32s);
1997 #if defined(TARGET_MIPS64)
1998 OP_LD_ATOMIC(lld,ld64);
1999 #endif
2000 #undef OP_LD_ATOMIC
2001
2002 #ifdef CONFIG_USER_ONLY
2003 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
2004 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \
2005 {                                                                            \
2006     TCGv t0 = tcg_temp_new();                                                \
2007     TCGLabel *l1 = gen_new_label();                                          \
2008     TCGLabel *l2 = gen_new_label();                                          \
2009                                                                              \
2010     tcg_gen_andi_tl(t0, arg2, almask);                                       \
2011     tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1);                              \
2012     tcg_gen_st_tl(arg2, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));          \
2013     generate_exception(ctx, EXCP_AdES);                                      \
2014     gen_set_label(l1);                                                       \
2015     tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                  \
2016     tcg_gen_brcond_tl(TCG_COND_NE, arg2, t0, l2);                            \
2017     tcg_gen_movi_tl(t0, rt | ((almask << 3) & 0x20));                        \
2018     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, llreg));                   \
2019     tcg_gen_st_tl(arg1, cpu_env, offsetof(CPUMIPSState, llnewval));              \
2020     gen_helper_0e0i(raise_exception, EXCP_SC);                               \
2021     gen_set_label(l2);                                                       \
2022     tcg_gen_movi_tl(t0, 0);                                                  \
2023     gen_store_gpr(t0, rt);                                                   \
2024     tcg_temp_free(t0);                                                       \
2025 }
2026 #else
2027 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
2028 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \
2029 {                                                                            \
2030     TCGv t0 = tcg_temp_new();                                                \
2031     gen_helper_1e2i(insn, t0, arg1, arg2, ctx->mem_idx);                     \
2032     gen_store_gpr(t0, rt);                                                   \
2033     tcg_temp_free(t0);                                                       \
2034 }
2035 #endif
2036 OP_ST_ATOMIC(sc,st32,ld32s,0x3);
2037 #if defined(TARGET_MIPS64)
2038 OP_ST_ATOMIC(scd,st64,ld64,0x7);
2039 #endif
2040 #undef OP_ST_ATOMIC
2041
2042 static void gen_base_offset_addr (DisasContext *ctx, TCGv addr,
2043                                   int base, int16_t offset)
2044 {
2045     if (base == 0) {
2046         tcg_gen_movi_tl(addr, offset);
2047     } else if (offset == 0) {
2048         gen_load_gpr(addr, base);
2049     } else {
2050         tcg_gen_movi_tl(addr, offset);
2051         gen_op_addr_add(ctx, addr, cpu_gpr[base], addr);
2052     }
2053 }
2054
2055 static target_ulong pc_relative_pc (DisasContext *ctx)
2056 {
2057     target_ulong pc = ctx->pc;
2058
2059     if (ctx->hflags & MIPS_HFLAG_BMASK) {
2060         int branch_bytes = ctx->hflags & MIPS_HFLAG_BDS16 ? 2 : 4;
2061
2062         pc -= branch_bytes;
2063     }
2064
2065     pc &= ~(target_ulong)3;
2066     return pc;
2067 }
2068
2069 /* Load */
2070 static void gen_ld(DisasContext *ctx, uint32_t opc,
2071                    int rt, int base, int16_t offset)
2072 {
2073     const char *opn = "ld";
2074     TCGv t0, t1, t2;
2075
2076     if (rt == 0 && ctx->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)) {
2077         /* Loongson CPU uses a load to zero register for prefetch.
2078            We emulate it as a NOP. On other CPU we must perform the
2079            actual memory access. */
2080         MIPS_DEBUG("NOP");
2081         return;
2082     }
2083
2084     t0 = tcg_temp_new();
2085     gen_base_offset_addr(ctx, t0, base, offset);
2086
2087     switch (opc) {
2088 #if defined(TARGET_MIPS64)
2089     case OPC_LWU:
2090         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL |
2091                            ctx->default_tcg_memop_mask);
2092         gen_store_gpr(t0, rt);
2093         opn = "lwu";
2094         break;
2095     case OPC_LD:
2096         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ |
2097                            ctx->default_tcg_memop_mask);
2098         gen_store_gpr(t0, rt);
2099         opn = "ld";
2100         break;
2101     case OPC_LLD:
2102     case R6_OPC_LLD:
2103         save_cpu_state(ctx, 1);
2104         op_ld_lld(t0, t0, ctx);
2105         gen_store_gpr(t0, rt);
2106         opn = "lld";
2107         break;
2108     case OPC_LDL:
2109         t1 = tcg_temp_new();
2110         tcg_gen_andi_tl(t1, t0, 7);
2111 #ifndef TARGET_WORDS_BIGENDIAN
2112         tcg_gen_xori_tl(t1, t1, 7);
2113 #endif
2114         tcg_gen_shli_tl(t1, t1, 3);
2115         tcg_gen_andi_tl(t0, t0, ~7);
2116         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
2117         tcg_gen_shl_tl(t0, t0, t1);
2118         tcg_gen_xori_tl(t1, t1, 63);
2119         t2 = tcg_const_tl(0x7fffffffffffffffull);
2120         tcg_gen_shr_tl(t2, t2, t1);
2121         gen_load_gpr(t1, rt);
2122         tcg_gen_and_tl(t1, t1, t2);
2123         tcg_temp_free(t2);
2124         tcg_gen_or_tl(t0, t0, t1);
2125         tcg_temp_free(t1);
2126         gen_store_gpr(t0, rt);
2127         opn = "ldl";
2128         break;
2129     case OPC_LDR:
2130         t1 = tcg_temp_new();
2131         tcg_gen_andi_tl(t1, t0, 7);
2132 #ifdef TARGET_WORDS_BIGENDIAN
2133         tcg_gen_xori_tl(t1, t1, 7);
2134 #endif
2135         tcg_gen_shli_tl(t1, t1, 3);
2136         tcg_gen_andi_tl(t0, t0, ~7);
2137         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
2138         tcg_gen_shr_tl(t0, t0, t1);
2139         tcg_gen_xori_tl(t1, t1, 63);
2140         t2 = tcg_const_tl(0xfffffffffffffffeull);
2141         tcg_gen_shl_tl(t2, t2, t1);
2142         gen_load_gpr(t1, rt);
2143         tcg_gen_and_tl(t1, t1, t2);
2144         tcg_temp_free(t2);
2145         tcg_gen_or_tl(t0, t0, t1);
2146         tcg_temp_free(t1);
2147         gen_store_gpr(t0, rt);
2148         opn = "ldr";
2149         break;
2150     case OPC_LDPC:
2151         t1 = tcg_const_tl(pc_relative_pc(ctx));
2152         gen_op_addr_add(ctx, t0, t0, t1);
2153         tcg_temp_free(t1);
2154         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
2155         gen_store_gpr(t0, rt);
2156         opn = "ldpc";
2157         break;
2158 #endif
2159     case OPC_LWPC:
2160         t1 = tcg_const_tl(pc_relative_pc(ctx));
2161         gen_op_addr_add(ctx, t0, t0, t1);
2162         tcg_temp_free(t1);
2163         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
2164         gen_store_gpr(t0, rt);
2165         opn = "lwpc";
2166         break;
2167     case OPC_LW:
2168         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL |
2169                            ctx->default_tcg_memop_mask);
2170         gen_store_gpr(t0, rt);
2171         opn = "lw";
2172         break;
2173     case OPC_LH:
2174         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW |
2175                            ctx->default_tcg_memop_mask);
2176         gen_store_gpr(t0, rt);
2177         opn = "lh";
2178         break;
2179     case OPC_LHU:
2180         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUW |
2181                            ctx->default_tcg_memop_mask);
2182         gen_store_gpr(t0, rt);
2183         opn = "lhu";
2184         break;
2185     case OPC_LB:
2186         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_SB);
2187         gen_store_gpr(t0, rt);
2188         opn = "lb";
2189         break;
2190     case OPC_LBU:
2191         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
2192         gen_store_gpr(t0, rt);
2193         opn = "lbu";
2194         break;
2195     case OPC_LWL:
2196         t1 = tcg_temp_new();
2197         tcg_gen_andi_tl(t1, t0, 3);
2198 #ifndef TARGET_WORDS_BIGENDIAN
2199         tcg_gen_xori_tl(t1, t1, 3);
2200 #endif
2201         tcg_gen_shli_tl(t1, t1, 3);
2202         tcg_gen_andi_tl(t0, t0, ~3);
2203         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
2204         tcg_gen_shl_tl(t0, t0, t1);
2205         tcg_gen_xori_tl(t1, t1, 31);
2206         t2 = tcg_const_tl(0x7fffffffull);
2207         tcg_gen_shr_tl(t2, t2, t1);
2208         gen_load_gpr(t1, rt);
2209         tcg_gen_and_tl(t1, t1, t2);
2210         tcg_temp_free(t2);
2211         tcg_gen_or_tl(t0, t0, t1);
2212         tcg_temp_free(t1);
2213         tcg_gen_ext32s_tl(t0, t0);
2214         gen_store_gpr(t0, rt);
2215         opn = "lwl";
2216         break;
2217     case OPC_LWR:
2218         t1 = tcg_temp_new();
2219         tcg_gen_andi_tl(t1, t0, 3);
2220 #ifdef TARGET_WORDS_BIGENDIAN
2221         tcg_gen_xori_tl(t1, t1, 3);
2222 #endif
2223         tcg_gen_shli_tl(t1, t1, 3);
2224         tcg_gen_andi_tl(t0, t0, ~3);
2225         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
2226         tcg_gen_shr_tl(t0, t0, t1);
2227         tcg_gen_xori_tl(t1, t1, 31);
2228         t2 = tcg_const_tl(0xfffffffeull);
2229         tcg_gen_shl_tl(t2, t2, t1);
2230         gen_load_gpr(t1, rt);
2231         tcg_gen_and_tl(t1, t1, t2);
2232         tcg_temp_free(t2);
2233         tcg_gen_or_tl(t0, t0, t1);
2234         tcg_temp_free(t1);
2235         tcg_gen_ext32s_tl(t0, t0);
2236         gen_store_gpr(t0, rt);
2237         opn = "lwr";
2238         break;
2239     case OPC_LL:
2240     case R6_OPC_LL:
2241         save_cpu_state(ctx, 1);
2242         op_ld_ll(t0, t0, ctx);
2243         gen_store_gpr(t0, rt);
2244         opn = "ll";
2245         break;
2246     }
2247     (void)opn; /* avoid a compiler warning */
2248     MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
2249     tcg_temp_free(t0);
2250 }
2251
2252 /* Store */
2253 static void gen_st (DisasContext *ctx, uint32_t opc, int rt,
2254                     int base, int16_t offset)
2255 {
2256     const char *opn = "st";
2257     TCGv t0 = tcg_temp_new();
2258     TCGv t1 = tcg_temp_new();
2259
2260     gen_base_offset_addr(ctx, t0, base, offset);
2261     gen_load_gpr(t1, rt);
2262     switch (opc) {
2263 #if defined(TARGET_MIPS64)
2264     case OPC_SD:
2265         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ |
2266                            ctx->default_tcg_memop_mask);
2267         opn = "sd";
2268         break;
2269     case OPC_SDL:
2270         save_cpu_state(ctx, 1);
2271         gen_helper_0e2i(sdl, t1, t0, ctx->mem_idx);
2272         opn = "sdl";
2273         break;
2274     case OPC_SDR:
2275         save_cpu_state(ctx, 1);
2276         gen_helper_0e2i(sdr, t1, t0, ctx->mem_idx);
2277         opn = "sdr";
2278         break;
2279 #endif
2280     case OPC_SW:
2281         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL |
2282                            ctx->default_tcg_memop_mask);
2283         opn = "sw";
2284         break;
2285     case OPC_SH:
2286         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUW |
2287                            ctx->default_tcg_memop_mask);
2288         opn = "sh";
2289         break;
2290     case OPC_SB:
2291         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_8);
2292         opn = "sb";
2293         break;
2294     case OPC_SWL:
2295         save_cpu_state(ctx, 1);
2296         gen_helper_0e2i(swl, t1, t0, ctx->mem_idx);
2297         opn = "swl";
2298         break;
2299     case OPC_SWR:
2300         save_cpu_state(ctx, 1);
2301         gen_helper_0e2i(swr, t1, t0, ctx->mem_idx);
2302         opn = "swr";
2303         break;
2304     }
2305     (void)opn; /* avoid a compiler warning */
2306     MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
2307     tcg_temp_free(t0);
2308     tcg_temp_free(t1);
2309 }
2310
2311
2312 /* Store conditional */
2313 static void gen_st_cond (DisasContext *ctx, uint32_t opc, int rt,
2314                          int base, int16_t offset)
2315 {
2316     const char *opn = "st_cond";
2317     TCGv t0, t1;
2318
2319 #ifdef CONFIG_USER_ONLY
2320     t0 = tcg_temp_local_new();
2321     t1 = tcg_temp_local_new();
2322 #else
2323     t0 = tcg_temp_new();
2324     t1 = tcg_temp_new();
2325 #endif
2326     gen_base_offset_addr(ctx, t0, base, offset);
2327     gen_load_gpr(t1, rt);
2328     switch (opc) {
2329 #if defined(TARGET_MIPS64)
2330     case OPC_SCD:
2331     case R6_OPC_SCD:
2332         save_cpu_state(ctx, 1);
2333         op_st_scd(t1, t0, rt, ctx);
2334         opn = "scd";
2335         break;
2336 #endif
2337     case OPC_SC:
2338     case R6_OPC_SC:
2339         save_cpu_state(ctx, 1);
2340         op_st_sc(t1, t0, rt, ctx);
2341         opn = "sc";
2342         break;
2343     }
2344     (void)opn; /* avoid a compiler warning */
2345     MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
2346     tcg_temp_free(t1);
2347     tcg_temp_free(t0);
2348 }
2349
2350 /* Load and store */
2351 static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
2352                           int base, int16_t offset)
2353 {
2354     const char *opn = "flt_ldst";
2355     TCGv t0 = tcg_temp_new();
2356
2357     gen_base_offset_addr(ctx, t0, base, offset);
2358     /* Don't do NOP if destination is zero: we must perform the actual
2359        memory access. */
2360     switch (opc) {
2361     case OPC_LWC1:
2362         {
2363             TCGv_i32 fp0 = tcg_temp_new_i32();
2364             tcg_gen_qemu_ld_i32(fp0, t0, ctx->mem_idx, MO_TESL |
2365                                 ctx->default_tcg_memop_mask);
2366             gen_store_fpr32(ctx, fp0, ft);
2367             tcg_temp_free_i32(fp0);
2368         }
2369         opn = "lwc1";
2370         break;
2371     case OPC_SWC1:
2372         {
2373             TCGv_i32 fp0 = tcg_temp_new_i32();
2374             gen_load_fpr32(ctx, fp0, ft);
2375             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL |
2376                                 ctx->default_tcg_memop_mask);
2377             tcg_temp_free_i32(fp0);
2378         }
2379         opn = "swc1";
2380         break;
2381     case OPC_LDC1:
2382         {
2383             TCGv_i64 fp0 = tcg_temp_new_i64();
2384             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
2385                                 ctx->default_tcg_memop_mask);
2386             gen_store_fpr64(ctx, fp0, ft);
2387             tcg_temp_free_i64(fp0);
2388         }
2389         opn = "ldc1";
2390         break;
2391     case OPC_SDC1:
2392         {
2393             TCGv_i64 fp0 = tcg_temp_new_i64();
2394             gen_load_fpr64(ctx, fp0, ft);
2395             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
2396                                 ctx->default_tcg_memop_mask);
2397             tcg_temp_free_i64(fp0);
2398         }
2399         opn = "sdc1";
2400         break;
2401     default:
2402         MIPS_INVAL(opn);
2403         generate_exception(ctx, EXCP_RI);
2404         goto out;
2405     }
2406     (void)opn; /* avoid a compiler warning */
2407     MIPS_DEBUG("%s %s, %d(%s)", opn, fregnames[ft], offset, regnames[base]);
2408  out:
2409     tcg_temp_free(t0);
2410 }
2411
2412 static void gen_cop1_ldst(DisasContext *ctx, uint32_t op, int rt,
2413                           int rs, int16_t imm)
2414 {
2415     if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
2416         check_cp1_enabled(ctx);
2417         switch (op) {
2418         case OPC_LDC1:
2419         case OPC_SDC1:
2420             check_insn(ctx, ISA_MIPS2);
2421             /* Fallthrough */
2422         default:
2423             gen_flt_ldst(ctx, op, rt, rs, imm);
2424         }
2425     } else {
2426         generate_exception_err(ctx, EXCP_CpU, 1);
2427     }
2428 }
2429
2430 /* Arithmetic with immediate operand */
2431 static void gen_arith_imm(DisasContext *ctx, uint32_t opc,
2432                           int rt, int rs, int16_t imm)
2433 {
2434     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2435     const char *opn = "imm arith";
2436
2437     if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) {
2438         /* If no destination, treat it as a NOP.
2439            For addi, we must generate the overflow exception when needed. */
2440         MIPS_DEBUG("NOP");
2441         return;
2442     }
2443     switch (opc) {
2444     case OPC_ADDI:
2445         {
2446             TCGv t0 = tcg_temp_local_new();
2447             TCGv t1 = tcg_temp_new();
2448             TCGv t2 = tcg_temp_new();
2449             TCGLabel *l1 = gen_new_label();
2450
2451             gen_load_gpr(t1, rs);
2452             tcg_gen_addi_tl(t0, t1, uimm);
2453             tcg_gen_ext32s_tl(t0, t0);
2454
2455             tcg_gen_xori_tl(t1, t1, ~uimm);
2456             tcg_gen_xori_tl(t2, t0, uimm);
2457             tcg_gen_and_tl(t1, t1, t2);
2458             tcg_temp_free(t2);
2459             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2460             tcg_temp_free(t1);
2461             /* operands of same sign, result different sign */
2462             generate_exception(ctx, EXCP_OVERFLOW);
2463             gen_set_label(l1);
2464             tcg_gen_ext32s_tl(t0, t0);
2465             gen_store_gpr(t0, rt);
2466             tcg_temp_free(t0);
2467         }
2468         opn = "addi";
2469         break;
2470     case OPC_ADDIU:
2471         if (rs != 0) {
2472             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2473             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
2474         } else {
2475             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2476         }
2477         opn = "addiu";
2478         break;
2479 #if defined(TARGET_MIPS64)
2480     case OPC_DADDI:
2481         {
2482             TCGv t0 = tcg_temp_local_new();
2483             TCGv t1 = tcg_temp_new();
2484             TCGv t2 = tcg_temp_new();
2485             TCGLabel *l1 = gen_new_label();
2486
2487             gen_load_gpr(t1, rs);
2488             tcg_gen_addi_tl(t0, t1, uimm);
2489
2490             tcg_gen_xori_tl(t1, t1, ~uimm);
2491             tcg_gen_xori_tl(t2, t0, uimm);
2492             tcg_gen_and_tl(t1, t1, t2);
2493             tcg_temp_free(t2);
2494             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2495             tcg_temp_free(t1);
2496             /* operands of same sign, result different sign */
2497             generate_exception(ctx, EXCP_OVERFLOW);
2498             gen_set_label(l1);
2499             gen_store_gpr(t0, rt);
2500             tcg_temp_free(t0);
2501         }
2502         opn = "daddi";
2503         break;
2504     case OPC_DADDIU:
2505         if (rs != 0) {
2506             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2507         } else {
2508             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2509         }
2510         opn = "daddiu";
2511         break;
2512 #endif
2513     }
2514     (void)opn; /* avoid a compiler warning */
2515     MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
2516 }
2517
2518 /* Logic with immediate operand */
2519 static void gen_logic_imm(DisasContext *ctx, uint32_t opc,
2520                           int rt, int rs, int16_t imm)
2521 {
2522     target_ulong uimm;
2523
2524     if (rt == 0) {
2525         /* If no destination, treat it as a NOP. */
2526         MIPS_DEBUG("NOP");
2527         return;
2528     }
2529     uimm = (uint16_t)imm;
2530     switch (opc) {
2531     case OPC_ANDI:
2532         if (likely(rs != 0))
2533             tcg_gen_andi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2534         else
2535             tcg_gen_movi_tl(cpu_gpr[rt], 0);
2536         MIPS_DEBUG("andi %s, %s, " TARGET_FMT_lx, regnames[rt],
2537                    regnames[rs], uimm);
2538         break;
2539     case OPC_ORI:
2540         if (rs != 0)
2541             tcg_gen_ori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2542         else
2543             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2544         MIPS_DEBUG("ori %s, %s, " TARGET_FMT_lx, regnames[rt],
2545                    regnames[rs], uimm);
2546         break;
2547     case OPC_XORI:
2548         if (likely(rs != 0))
2549             tcg_gen_xori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2550         else
2551             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2552         MIPS_DEBUG("xori %s, %s, " TARGET_FMT_lx, regnames[rt],
2553                    regnames[rs], uimm);
2554         break;
2555     case OPC_LUI:
2556         if (rs != 0 && (ctx->insn_flags & ISA_MIPS32R6)) {
2557             /* OPC_AUI */
2558             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], imm << 16);
2559             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
2560             MIPS_DEBUG("aui %s, %s, %04x", regnames[rt], regnames[rs], imm);
2561         } else {
2562             tcg_gen_movi_tl(cpu_gpr[rt], imm << 16);
2563             MIPS_DEBUG("lui %s, " TARGET_FMT_lx, regnames[rt], uimm);
2564         }
2565         break;
2566
2567     default:
2568         MIPS_DEBUG("Unknown logical immediate opcode %08x", opc);
2569         break;
2570     }
2571 }
2572
2573 /* Set on less than with immediate operand */
2574 static void gen_slt_imm(DisasContext *ctx, uint32_t opc,
2575                         int rt, int rs, int16_t imm)
2576 {
2577     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2578     const char *opn = "imm arith";
2579     TCGv t0;
2580
2581     if (rt == 0) {
2582         /* If no destination, treat it as a NOP. */
2583         MIPS_DEBUG("NOP");
2584         return;
2585     }
2586     t0 = tcg_temp_new();
2587     gen_load_gpr(t0, rs);
2588     switch (opc) {
2589     case OPC_SLTI:
2590         tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr[rt], t0, uimm);
2591         opn = "slti";
2592         break;
2593     case OPC_SLTIU:
2594         tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr[rt], t0, uimm);
2595         opn = "sltiu";
2596         break;
2597     }
2598     (void)opn; /* avoid a compiler warning */
2599     MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
2600     tcg_temp_free(t0);
2601 }
2602
2603 /* Shifts with immediate operand */
2604 static void gen_shift_imm(DisasContext *ctx, uint32_t opc,
2605                           int rt, int rs, int16_t imm)
2606 {
2607     target_ulong uimm = ((uint16_t)imm) & 0x1f;
2608     const char *opn = "imm shift";
2609     TCGv t0;
2610
2611     if (rt == 0) {
2612         /* If no destination, treat it as a NOP. */
2613         MIPS_DEBUG("NOP");
2614         return;
2615     }
2616
2617     t0 = tcg_temp_new();
2618     gen_load_gpr(t0, rs);
2619     switch (opc) {
2620     case OPC_SLL:
2621         tcg_gen_shli_tl(t0, t0, uimm);
2622         tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2623         opn = "sll";
2624         break;
2625     case OPC_SRA:
2626         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2627         opn = "sra";
2628         break;
2629     case OPC_SRL:
2630         if (uimm != 0) {
2631             tcg_gen_ext32u_tl(t0, t0);
2632             tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2633         } else {
2634             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2635         }
2636         opn = "srl";
2637         break;
2638     case OPC_ROTR:
2639         if (uimm != 0) {
2640             TCGv_i32 t1 = tcg_temp_new_i32();
2641
2642             tcg_gen_trunc_tl_i32(t1, t0);
2643             tcg_gen_rotri_i32(t1, t1, uimm);
2644             tcg_gen_ext_i32_tl(cpu_gpr[rt], t1);
2645             tcg_temp_free_i32(t1);
2646         } else {
2647             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2648         }
2649         opn = "rotr";
2650         break;
2651 #if defined(TARGET_MIPS64)
2652     case OPC_DSLL:
2653         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm);
2654         opn = "dsll";
2655         break;
2656     case OPC_DSRA:
2657         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2658         opn = "dsra";
2659         break;
2660     case OPC_DSRL:
2661         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2662         opn = "dsrl";
2663         break;
2664     case OPC_DROTR:
2665         if (uimm != 0) {
2666             tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm);
2667         } else {
2668             tcg_gen_mov_tl(cpu_gpr[rt], t0);
2669         }
2670         opn = "drotr";
2671         break;
2672     case OPC_DSLL32:
2673         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm + 32);
2674         opn = "dsll32";
2675         break;
2676     case OPC_DSRA32:
2677         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm + 32);
2678         opn = "dsra32";
2679         break;
2680     case OPC_DSRL32:
2681         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm + 32);
2682         opn = "dsrl32";
2683         break;
2684     case OPC_DROTR32:
2685         tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm + 32);
2686         opn = "drotr32";
2687         break;
2688 #endif
2689     }
2690     (void)opn; /* avoid a compiler warning */
2691     MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
2692     tcg_temp_free(t0);
2693 }
2694
2695 /* Arithmetic */
2696 static void gen_arith(DisasContext *ctx, uint32_t opc,
2697                       int rd, int rs, int rt)
2698 {
2699     const char *opn = "arith";
2700
2701     if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB
2702        && opc != OPC_DADD && opc != OPC_DSUB) {
2703         /* If no destination, treat it as a NOP.
2704            For add & sub, we must generate the overflow exception when needed. */
2705         MIPS_DEBUG("NOP");
2706         return;
2707     }
2708
2709     switch (opc) {
2710     case OPC_ADD:
2711         {
2712             TCGv t0 = tcg_temp_local_new();
2713             TCGv t1 = tcg_temp_new();
2714             TCGv t2 = tcg_temp_new();
2715             TCGLabel *l1 = gen_new_label();
2716
2717             gen_load_gpr(t1, rs);
2718             gen_load_gpr(t2, rt);
2719             tcg_gen_add_tl(t0, t1, t2);
2720             tcg_gen_ext32s_tl(t0, t0);
2721             tcg_gen_xor_tl(t1, t1, t2);
2722             tcg_gen_xor_tl(t2, t0, t2);
2723             tcg_gen_andc_tl(t1, t2, t1);
2724             tcg_temp_free(t2);
2725             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2726             tcg_temp_free(t1);
2727             /* operands of same sign, result different sign */
2728             generate_exception(ctx, EXCP_OVERFLOW);
2729             gen_set_label(l1);
2730             gen_store_gpr(t0, rd);
2731             tcg_temp_free(t0);
2732         }
2733         opn = "add";
2734         break;
2735     case OPC_ADDU:
2736         if (rs != 0 && rt != 0) {
2737             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2738             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2739         } else if (rs == 0 && rt != 0) {
2740             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2741         } else if (rs != 0 && rt == 0) {
2742             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2743         } else {
2744             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2745         }
2746         opn = "addu";
2747         break;
2748     case OPC_SUB:
2749         {
2750             TCGv t0 = tcg_temp_local_new();
2751             TCGv t1 = tcg_temp_new();
2752             TCGv t2 = tcg_temp_new();
2753             TCGLabel *l1 = gen_new_label();
2754
2755             gen_load_gpr(t1, rs);
2756             gen_load_gpr(t2, rt);
2757             tcg_gen_sub_tl(t0, t1, t2);
2758             tcg_gen_ext32s_tl(t0, t0);
2759             tcg_gen_xor_tl(t2, t1, t2);
2760             tcg_gen_xor_tl(t1, t0, t1);
2761             tcg_gen_and_tl(t1, t1, t2);
2762             tcg_temp_free(t2);
2763             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2764             tcg_temp_free(t1);
2765             /* operands of different sign, first operand and result different sign */
2766             generate_exception(ctx, EXCP_OVERFLOW);
2767             gen_set_label(l1);
2768             gen_store_gpr(t0, rd);
2769             tcg_temp_free(t0);
2770         }
2771         opn = "sub";
2772         break;
2773     case OPC_SUBU:
2774         if (rs != 0 && rt != 0) {
2775             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2776             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2777         } else if (rs == 0 && rt != 0) {
2778             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2779             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2780         } else if (rs != 0 && rt == 0) {
2781             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2782         } else {
2783             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2784         }
2785         opn = "subu";
2786         break;
2787 #if defined(TARGET_MIPS64)
2788     case OPC_DADD:
2789         {
2790             TCGv t0 = tcg_temp_local_new();
2791             TCGv t1 = tcg_temp_new();
2792             TCGv t2 = tcg_temp_new();
2793             TCGLabel *l1 = gen_new_label();
2794
2795             gen_load_gpr(t1, rs);
2796             gen_load_gpr(t2, rt);
2797             tcg_gen_add_tl(t0, t1, t2);
2798             tcg_gen_xor_tl(t1, t1, t2);
2799             tcg_gen_xor_tl(t2, t0, t2);
2800             tcg_gen_andc_tl(t1, t2, t1);
2801             tcg_temp_free(t2);
2802             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2803             tcg_temp_free(t1);
2804             /* operands of same sign, result different sign */
2805             generate_exception(ctx, EXCP_OVERFLOW);
2806             gen_set_label(l1);
2807             gen_store_gpr(t0, rd);
2808             tcg_temp_free(t0);
2809         }
2810         opn = "dadd";
2811         break;
2812     case OPC_DADDU:
2813         if (rs != 0 && rt != 0) {
2814             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2815         } else if (rs == 0 && rt != 0) {
2816             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2817         } else if (rs != 0 && rt == 0) {
2818             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2819         } else {
2820             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2821         }
2822         opn = "daddu";
2823         break;
2824     case OPC_DSUB:
2825         {
2826             TCGv t0 = tcg_temp_local_new();
2827             TCGv t1 = tcg_temp_new();
2828             TCGv t2 = tcg_temp_new();
2829             TCGLabel *l1 = gen_new_label();
2830
2831             gen_load_gpr(t1, rs);
2832             gen_load_gpr(t2, rt);
2833             tcg_gen_sub_tl(t0, t1, t2);
2834             tcg_gen_xor_tl(t2, t1, t2);
2835             tcg_gen_xor_tl(t1, t0, t1);
2836             tcg_gen_and_tl(t1, t1, t2);
2837             tcg_temp_free(t2);
2838             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2839             tcg_temp_free(t1);
2840             /* operands of different sign, first operand and result different sign */
2841             generate_exception(ctx, EXCP_OVERFLOW);
2842             gen_set_label(l1);
2843             gen_store_gpr(t0, rd);
2844             tcg_temp_free(t0);
2845         }
2846         opn = "dsub";
2847         break;
2848     case OPC_DSUBU:
2849         if (rs != 0 && rt != 0) {
2850             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2851         } else if (rs == 0 && rt != 0) {
2852             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2853         } else if (rs != 0 && rt == 0) {
2854             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2855         } else {
2856             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2857         }
2858         opn = "dsubu";
2859         break;
2860 #endif
2861     case OPC_MUL:
2862         if (likely(rs != 0 && rt != 0)) {
2863             tcg_gen_mul_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2864             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2865         } else {
2866             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2867         }
2868         opn = "mul";
2869         break;
2870     }
2871     (void)opn; /* avoid a compiler warning */
2872     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2873 }
2874
2875 /* Conditional move */
2876 static void gen_cond_move(DisasContext *ctx, uint32_t opc,
2877                           int rd, int rs, int rt)
2878 {
2879     const char *opn = "cond move";
2880     TCGv t0, t1, t2;
2881
2882     if (rd == 0) {
2883         /* If no destination, treat it as a NOP. */
2884         MIPS_DEBUG("NOP");
2885         return;
2886     }
2887
2888     t0 = tcg_temp_new();
2889     gen_load_gpr(t0, rt);
2890     t1 = tcg_const_tl(0);
2891     t2 = tcg_temp_new();
2892     gen_load_gpr(t2, rs);
2893     switch (opc) {
2894     case OPC_MOVN:
2895         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
2896         opn = "movn";
2897         break;
2898     case OPC_MOVZ:
2899         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
2900         opn = "movz";
2901         break;
2902     case OPC_SELNEZ:
2903         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, t1);
2904         opn = "selnez";
2905         break;
2906     case OPC_SELEQZ:
2907         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, t1);
2908         opn = "seleqz";
2909         break;
2910     }
2911     tcg_temp_free(t2);
2912     tcg_temp_free(t1);
2913     tcg_temp_free(t0);
2914
2915     (void)opn; /* avoid a compiler warning */
2916     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2917 }
2918
2919 /* Logic */
2920 static void gen_logic(DisasContext *ctx, uint32_t opc,
2921                       int rd, int rs, int rt)
2922 {
2923     const char *opn = "logic";
2924
2925     if (rd == 0) {
2926         /* If no destination, treat it as a NOP. */
2927         MIPS_DEBUG("NOP");
2928         return;
2929     }
2930
2931     switch (opc) {
2932     case OPC_AND:
2933         if (likely(rs != 0 && rt != 0)) {
2934             tcg_gen_and_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2935         } else {
2936             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2937         }
2938         opn = "and";
2939         break;
2940     case OPC_NOR:
2941         if (rs != 0 && rt != 0) {
2942             tcg_gen_nor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2943         } else if (rs == 0 && rt != 0) {
2944             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rt]);
2945         } else if (rs != 0 && rt == 0) {
2946             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rs]);
2947         } else {
2948             tcg_gen_movi_tl(cpu_gpr[rd], ~((target_ulong)0));
2949         }
2950         opn = "nor";
2951         break;
2952     case OPC_OR:
2953         if (likely(rs != 0 && rt != 0)) {
2954             tcg_gen_or_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2955         } else if (rs == 0 && rt != 0) {
2956             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2957         } else if (rs != 0 && rt == 0) {
2958             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2959         } else {
2960             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2961         }
2962         opn = "or";
2963         break;
2964     case OPC_XOR:
2965         if (likely(rs != 0 && rt != 0)) {
2966             tcg_gen_xor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2967         } else if (rs == 0 && rt != 0) {
2968             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2969         } else if (rs != 0 && rt == 0) {
2970             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2971         } else {
2972             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2973         }
2974         opn = "xor";
2975         break;
2976     }
2977     (void)opn; /* avoid a compiler warning */
2978     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2979 }
2980
2981 /* Set on lower than */
2982 static void gen_slt(DisasContext *ctx, uint32_t opc,
2983                     int rd, int rs, int rt)
2984 {
2985     const char *opn = "slt";
2986     TCGv t0, t1;
2987
2988     if (rd == 0) {
2989         /* If no destination, treat it as a NOP. */
2990         MIPS_DEBUG("NOP");
2991         return;
2992     }
2993
2994     t0 = tcg_temp_new();
2995     t1 = tcg_temp_new();
2996     gen_load_gpr(t0, rs);
2997     gen_load_gpr(t1, rt);
2998     switch (opc) {
2999     case OPC_SLT:
3000         tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr[rd], t0, t1);
3001         opn = "slt";
3002         break;
3003     case OPC_SLTU:
3004         tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr[rd], t0, t1);
3005         opn = "sltu";
3006         break;
3007     }
3008     (void)opn; /* avoid a compiler warning */
3009     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
3010     tcg_temp_free(t0);
3011     tcg_temp_free(t1);
3012 }
3013
3014 /* Shifts */
3015 static void gen_shift(DisasContext *ctx, uint32_t opc,
3016                       int rd, int rs, int rt)
3017 {
3018     const char *opn = "shifts";
3019     TCGv t0, t1;
3020
3021     if (rd == 0) {
3022         /* If no destination, treat it as a NOP.
3023            For add & sub, we must generate the overflow exception when needed. */
3024         MIPS_DEBUG("NOP");
3025         return;
3026     }
3027
3028     t0 = tcg_temp_new();
3029     t1 = tcg_temp_new();
3030     gen_load_gpr(t0, rs);
3031     gen_load_gpr(t1, rt);
3032     switch (opc) {
3033     case OPC_SLLV:
3034         tcg_gen_andi_tl(t0, t0, 0x1f);
3035         tcg_gen_shl_tl(t0, t1, t0);
3036         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
3037         opn = "sllv";
3038         break;
3039     case OPC_SRAV:
3040         tcg_gen_andi_tl(t0, t0, 0x1f);
3041         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
3042         opn = "srav";
3043         break;
3044     case OPC_SRLV:
3045         tcg_gen_ext32u_tl(t1, t1);
3046         tcg_gen_andi_tl(t0, t0, 0x1f);
3047         tcg_gen_shr_tl(t0, t1, t0);
3048         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
3049         opn = "srlv";
3050         break;
3051     case OPC_ROTRV:
3052         {
3053             TCGv_i32 t2 = tcg_temp_new_i32();
3054             TCGv_i32 t3 = tcg_temp_new_i32();
3055
3056             tcg_gen_trunc_tl_i32(t2, t0);
3057             tcg_gen_trunc_tl_i32(t3, t1);
3058             tcg_gen_andi_i32(t2, t2, 0x1f);
3059             tcg_gen_rotr_i32(t2, t3, t2);
3060             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3061             tcg_temp_free_i32(t2);
3062             tcg_temp_free_i32(t3);
3063             opn = "rotrv";
3064         }
3065         break;
3066 #if defined(TARGET_MIPS64)
3067     case OPC_DSLLV:
3068         tcg_gen_andi_tl(t0, t0, 0x3f);
3069         tcg_gen_shl_tl(cpu_gpr[rd], t1, t0);
3070         opn = "dsllv";
3071         break;
3072     case OPC_DSRAV:
3073         tcg_gen_andi_tl(t0, t0, 0x3f);
3074         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
3075         opn = "dsrav";
3076         break;
3077     case OPC_DSRLV:
3078         tcg_gen_andi_tl(t0, t0, 0x3f);
3079         tcg_gen_shr_tl(cpu_gpr[rd], t1, t0);
3080         opn = "dsrlv";
3081         break;
3082     case OPC_DROTRV:
3083         tcg_gen_andi_tl(t0, t0, 0x3f);
3084         tcg_gen_rotr_tl(cpu_gpr[rd], t1, t0);
3085         opn = "drotrv";
3086         break;
3087 #endif
3088     }
3089     (void)opn; /* avoid a compiler warning */
3090     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
3091     tcg_temp_free(t0);
3092     tcg_temp_free(t1);
3093 }
3094
3095 /* Arithmetic on HI/LO registers */
3096 static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
3097 {
3098     const char *opn = "hilo";
3099
3100     if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
3101         /* Treat as NOP. */
3102         MIPS_DEBUG("NOP");
3103         return;
3104     }
3105
3106     if (acc != 0) {
3107         check_dsp(ctx);
3108     }
3109
3110     switch (opc) {
3111     case OPC_MFHI:
3112 #if defined(TARGET_MIPS64)
3113         if (acc != 0) {
3114             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_HI[acc]);
3115         } else
3116 #endif
3117         {
3118             tcg_gen_mov_tl(cpu_gpr[reg], cpu_HI[acc]);
3119         }
3120         opn = "mfhi";
3121         break;
3122     case OPC_MFLO:
3123 #if defined(TARGET_MIPS64)
3124         if (acc != 0) {
3125             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_LO[acc]);
3126         } else
3127 #endif
3128         {
3129             tcg_gen_mov_tl(cpu_gpr[reg], cpu_LO[acc]);
3130         }
3131         opn = "mflo";
3132         break;
3133     case OPC_MTHI:
3134         if (reg != 0) {
3135 #if defined(TARGET_MIPS64)
3136             if (acc != 0) {
3137                 tcg_gen_ext32s_tl(cpu_HI[acc], cpu_gpr[reg]);
3138             } else
3139 #endif
3140             {
3141                 tcg_gen_mov_tl(cpu_HI[acc], cpu_gpr[reg]);
3142             }
3143         } else {
3144             tcg_gen_movi_tl(cpu_HI[acc], 0);
3145         }
3146         opn = "mthi";
3147         break;
3148     case OPC_MTLO:
3149         if (reg != 0) {
3150 #if defined(TARGET_MIPS64)
3151             if (acc != 0) {
3152                 tcg_gen_ext32s_tl(cpu_LO[acc], cpu_gpr[reg]);
3153             } else
3154 #endif
3155             {
3156                 tcg_gen_mov_tl(cpu_LO[acc], cpu_gpr[reg]);
3157             }
3158         } else {
3159             tcg_gen_movi_tl(cpu_LO[acc], 0);
3160         }
3161         opn = "mtlo";
3162         break;
3163     }
3164     (void)opn; /* avoid a compiler warning */
3165     MIPS_DEBUG("%s %s", opn, regnames[reg]);
3166 }
3167
3168 static inline void gen_r6_ld(target_long addr, int reg, int memidx,
3169                              TCGMemOp memop)
3170 {
3171     TCGv t0 = tcg_const_tl(addr);
3172     tcg_gen_qemu_ld_tl(t0, t0, memidx, memop);
3173     gen_store_gpr(t0, reg);
3174     tcg_temp_free(t0);
3175 }
3176
3177 static inline void gen_pcrel(DisasContext *ctx, int rs, int16_t imm)
3178 {
3179     target_long offset;
3180     target_long addr;
3181
3182     switch (MASK_OPC_PCREL_TOP2BITS(ctx->opcode)) {
3183     case OPC_ADDIUPC:
3184         if (rs != 0) {
3185             offset = sextract32(ctx->opcode << 2, 0, 21);
3186             addr = addr_add(ctx, ctx->pc, offset);
3187             tcg_gen_movi_tl(cpu_gpr[rs], addr);
3188         }
3189         break;
3190     case R6_OPC_LWPC:
3191         offset = sextract32(ctx->opcode << 2, 0, 21);
3192         addr = addr_add(ctx, ctx->pc, offset);
3193         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TESL);
3194         break;
3195 #if defined(TARGET_MIPS64)
3196     case OPC_LWUPC:
3197         check_mips_64(ctx);
3198         offset = sextract32(ctx->opcode << 2, 0, 21);
3199         addr = addr_add(ctx, ctx->pc, offset);
3200         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEUL);
3201         break;
3202 #endif
3203     default:
3204         switch (MASK_OPC_PCREL_TOP5BITS(ctx->opcode)) {
3205         case OPC_AUIPC:
3206             if (rs != 0) {
3207                 offset = imm << 16;
3208                 addr = addr_add(ctx, ctx->pc, offset);
3209                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
3210             }
3211             break;
3212         case OPC_ALUIPC:
3213             if (rs != 0) {
3214                 offset = imm << 16;
3215                 addr = ~0xFFFF & addr_add(ctx, ctx->pc, offset);
3216                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
3217             }
3218             break;
3219 #if defined(TARGET_MIPS64)
3220         case R6_OPC_LDPC: /* bits 16 and 17 are part of immediate */
3221         case R6_OPC_LDPC + (1 << 16):
3222         case R6_OPC_LDPC + (2 << 16):
3223         case R6_OPC_LDPC + (3 << 16):
3224             check_mips_64(ctx);
3225             offset = sextract32(ctx->opcode << 3, 0, 21);
3226             addr = addr_add(ctx, (ctx->pc & ~0x7), offset);
3227             gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEQ);
3228             break;
3229 #endif
3230         default:
3231             MIPS_INVAL("OPC_PCREL");
3232             generate_exception(ctx, EXCP_RI);
3233             break;
3234         }
3235         break;
3236     }
3237 }
3238
3239 static void gen_r6_muldiv(DisasContext *ctx, int opc, int rd, int rs, int rt)
3240 {
3241     const char *opn = "r6 mul/div";
3242     TCGv t0, t1;
3243
3244     if (rd == 0) {
3245         /* Treat as NOP. */
3246         MIPS_DEBUG("NOP");
3247         return;
3248     }
3249
3250     t0 = tcg_temp_new();
3251     t1 = tcg_temp_new();
3252
3253     gen_load_gpr(t0, rs);
3254     gen_load_gpr(t1, rt);
3255
3256     switch (opc) {
3257     case R6_OPC_DIV:
3258         {
3259             TCGv t2 = tcg_temp_new();
3260             TCGv t3 = tcg_temp_new();
3261             tcg_gen_ext32s_tl(t0, t0);
3262             tcg_gen_ext32s_tl(t1, t1);
3263             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3264             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3265             tcg_gen_and_tl(t2, t2, t3);
3266             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3267             tcg_gen_or_tl(t2, t2, t3);
3268             tcg_gen_movi_tl(t3, 0);
3269             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3270             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3271             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3272             tcg_temp_free(t3);
3273             tcg_temp_free(t2);
3274         }
3275         opn = "div";
3276         break;
3277     case R6_OPC_MOD:
3278         {
3279             TCGv t2 = tcg_temp_new();
3280             TCGv t3 = tcg_temp_new();
3281             tcg_gen_ext32s_tl(t0, t0);
3282             tcg_gen_ext32s_tl(t1, t1);
3283             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3284             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3285             tcg_gen_and_tl(t2, t2, t3);
3286             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3287             tcg_gen_or_tl(t2, t2, t3);
3288             tcg_gen_movi_tl(t3, 0);
3289             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3290             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3291             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3292             tcg_temp_free(t3);
3293             tcg_temp_free(t2);
3294         }
3295         opn = "mod";
3296         break;
3297     case R6_OPC_DIVU:
3298         {
3299             TCGv t2 = tcg_const_tl(0);
3300             TCGv t3 = tcg_const_tl(1);
3301             tcg_gen_ext32u_tl(t0, t0);
3302             tcg_gen_ext32u_tl(t1, t1);
3303             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3304             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3305             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3306             tcg_temp_free(t3);
3307             tcg_temp_free(t2);
3308         }
3309         opn = "divu";
3310         break;
3311     case R6_OPC_MODU:
3312         {
3313             TCGv t2 = tcg_const_tl(0);
3314             TCGv t3 = tcg_const_tl(1);
3315             tcg_gen_ext32u_tl(t0, t0);
3316             tcg_gen_ext32u_tl(t1, t1);
3317             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3318             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3319             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3320             tcg_temp_free(t3);
3321             tcg_temp_free(t2);
3322         }
3323         opn = "modu";
3324         break;
3325     case R6_OPC_MUL:
3326         {
3327             TCGv_i32 t2 = tcg_temp_new_i32();
3328             TCGv_i32 t3 = tcg_temp_new_i32();
3329             tcg_gen_trunc_tl_i32(t2, t0);
3330             tcg_gen_trunc_tl_i32(t3, t1);
3331             tcg_gen_mul_i32(t2, t2, t3);
3332             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3333             tcg_temp_free_i32(t2);
3334             tcg_temp_free_i32(t3);
3335         }
3336         opn = "mul";
3337         break;
3338     case R6_OPC_MUH:
3339         {
3340             TCGv_i32 t2 = tcg_temp_new_i32();
3341             TCGv_i32 t3 = tcg_temp_new_i32();
3342             tcg_gen_trunc_tl_i32(t2, t0);
3343             tcg_gen_trunc_tl_i32(t3, t1);
3344             tcg_gen_muls2_i32(t2, t3, t2, t3);
3345             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
3346             tcg_temp_free_i32(t2);
3347             tcg_temp_free_i32(t3);
3348         }
3349         opn = "muh";
3350         break;
3351     case R6_OPC_MULU:
3352         {
3353             TCGv_i32 t2 = tcg_temp_new_i32();
3354             TCGv_i32 t3 = tcg_temp_new_i32();
3355             tcg_gen_trunc_tl_i32(t2, t0);
3356             tcg_gen_trunc_tl_i32(t3, t1);
3357             tcg_gen_mul_i32(t2, t2, t3);
3358             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3359             tcg_temp_free_i32(t2);
3360             tcg_temp_free_i32(t3);
3361         }
3362         opn = "mulu";
3363         break;
3364     case R6_OPC_MUHU:
3365         {
3366             TCGv_i32 t2 = tcg_temp_new_i32();
3367             TCGv_i32 t3 = tcg_temp_new_i32();
3368             tcg_gen_trunc_tl_i32(t2, t0);
3369             tcg_gen_trunc_tl_i32(t3, t1);
3370             tcg_gen_mulu2_i32(t2, t3, t2, t3);
3371             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
3372             tcg_temp_free_i32(t2);
3373             tcg_temp_free_i32(t3);
3374         }
3375         opn = "muhu";
3376         break;
3377 #if defined(TARGET_MIPS64)
3378     case R6_OPC_DDIV:
3379         {
3380             TCGv t2 = tcg_temp_new();
3381             TCGv t3 = tcg_temp_new();
3382             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3383             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3384             tcg_gen_and_tl(t2, t2, t3);
3385             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3386             tcg_gen_or_tl(t2, t2, t3);
3387             tcg_gen_movi_tl(t3, 0);
3388             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3389             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3390             tcg_temp_free(t3);
3391             tcg_temp_free(t2);
3392         }
3393         opn = "ddiv";
3394         break;
3395     case R6_OPC_DMOD:
3396         {
3397             TCGv t2 = tcg_temp_new();
3398             TCGv t3 = tcg_temp_new();
3399             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3400             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3401             tcg_gen_and_tl(t2, t2, t3);
3402             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3403             tcg_gen_or_tl(t2, t2, t3);
3404             tcg_gen_movi_tl(t3, 0);
3405             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3406             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3407             tcg_temp_free(t3);
3408             tcg_temp_free(t2);
3409         }
3410         opn = "dmod";
3411         break;
3412     case R6_OPC_DDIVU:
3413         {
3414             TCGv t2 = tcg_const_tl(0);
3415             TCGv t3 = tcg_const_tl(1);
3416             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3417             tcg_gen_divu_i64(cpu_gpr[rd], t0, t1);
3418             tcg_temp_free(t3);
3419             tcg_temp_free(t2);
3420         }
3421         opn = "ddivu";
3422         break;
3423     case R6_OPC_DMODU:
3424         {
3425             TCGv t2 = tcg_const_tl(0);
3426             TCGv t3 = tcg_const_tl(1);
3427             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3428             tcg_gen_remu_i64(cpu_gpr[rd], t0, t1);
3429             tcg_temp_free(t3);
3430             tcg_temp_free(t2);
3431         }
3432         opn = "dmodu";
3433         break;
3434     case R6_OPC_DMUL:
3435         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
3436         opn = "dmul";
3437         break;
3438     case R6_OPC_DMUH:
3439         {
3440             TCGv t2 = tcg_temp_new();
3441             tcg_gen_muls2_i64(t2, cpu_gpr[rd], t0, t1);
3442             tcg_temp_free(t2);
3443         }
3444         opn = "dmuh";
3445         break;
3446     case R6_OPC_DMULU:
3447         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
3448         opn = "dmulu";
3449         break;
3450     case R6_OPC_DMUHU:
3451         {
3452             TCGv t2 = tcg_temp_new();
3453             tcg_gen_mulu2_i64(t2, cpu_gpr[rd], t0, t1);
3454             tcg_temp_free(t2);
3455         }
3456         opn = "dmuhu";
3457         break;
3458 #endif
3459     default:
3460         MIPS_INVAL(opn);
3461         generate_exception(ctx, EXCP_RI);
3462         goto out;
3463     }
3464     (void)opn; /* avoid a compiler warning */
3465     MIPS_DEBUG("%s %s %s", opn, regnames[rs], regnames[rt]);
3466  out:
3467     tcg_temp_free(t0);
3468     tcg_temp_free(t1);
3469 }
3470
3471 static void gen_muldiv(DisasContext *ctx, uint32_t opc,
3472                        int acc, int rs, int rt)
3473 {
3474     const char *opn = "mul/div";
3475     TCGv t0, t1;
3476
3477     t0 = tcg_temp_new();
3478     t1 = tcg_temp_new();
3479
3480     gen_load_gpr(t0, rs);
3481     gen_load_gpr(t1, rt);
3482
3483     if (acc != 0) {
3484         check_dsp(ctx);
3485     }
3486
3487     switch (opc) {
3488     case OPC_DIV:
3489         {
3490             TCGv t2 = tcg_temp_new();
3491             TCGv t3 = tcg_temp_new();
3492             tcg_gen_ext32s_tl(t0, t0);
3493             tcg_gen_ext32s_tl(t1, t1);
3494             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3495             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3496             tcg_gen_and_tl(t2, t2, t3);
3497             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3498             tcg_gen_or_tl(t2, t2, t3);
3499             tcg_gen_movi_tl(t3, 0);
3500             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3501             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
3502             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
3503             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
3504             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
3505             tcg_temp_free(t3);
3506             tcg_temp_free(t2);
3507         }
3508         opn = "div";
3509         break;
3510     case OPC_DIVU:
3511         {
3512             TCGv t2 = tcg_const_tl(0);
3513             TCGv t3 = tcg_const_tl(1);
3514             tcg_gen_ext32u_tl(t0, t0);
3515             tcg_gen_ext32u_tl(t1, t1);
3516             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3517             tcg_gen_divu_tl(cpu_LO[acc], t0, t1);
3518             tcg_gen_remu_tl(cpu_HI[acc], t0, t1);
3519             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
3520             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
3521             tcg_temp_free(t3);
3522             tcg_temp_free(t2);
3523         }
3524         opn = "divu";
3525         break;
3526     case OPC_MULT:
3527         {
3528             TCGv_i32 t2 = tcg_temp_new_i32();
3529             TCGv_i32 t3 = tcg_temp_new_i32();
3530             tcg_gen_trunc_tl_i32(t2, t0);
3531             tcg_gen_trunc_tl_i32(t3, t1);
3532             tcg_gen_muls2_i32(t2, t3, t2, t3);
3533             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3534             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3535             tcg_temp_free_i32(t2);
3536             tcg_temp_free_i32(t3);
3537         }
3538         opn = "mult";
3539         break;
3540     case OPC_MULTU:
3541         {
3542             TCGv_i32 t2 = tcg_temp_new_i32();
3543             TCGv_i32 t3 = tcg_temp_new_i32();
3544             tcg_gen_trunc_tl_i32(t2, t0);
3545             tcg_gen_trunc_tl_i32(t3, t1);
3546             tcg_gen_mulu2_i32(t2, t3, t2, t3);
3547             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3548             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3549             tcg_temp_free_i32(t2);
3550             tcg_temp_free_i32(t3);
3551         }
3552         opn = "multu";
3553         break;
3554 #if defined(TARGET_MIPS64)
3555     case OPC_DDIV:
3556         {
3557             TCGv t2 = tcg_temp_new();
3558             TCGv t3 = tcg_temp_new();
3559             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3560             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3561             tcg_gen_and_tl(t2, t2, t3);
3562             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3563             tcg_gen_or_tl(t2, t2, t3);
3564             tcg_gen_movi_tl(t3, 0);
3565             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3566             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
3567             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
3568             tcg_temp_free(t3);
3569             tcg_temp_free(t2);
3570         }
3571         opn = "ddiv";
3572         break;
3573     case OPC_DDIVU:
3574         {
3575             TCGv t2 = tcg_const_tl(0);
3576             TCGv t3 = tcg_const_tl(1);
3577             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3578             tcg_gen_divu_i64(cpu_LO[acc], t0, t1);
3579             tcg_gen_remu_i64(cpu_HI[acc], t0, t1);
3580             tcg_temp_free(t3);
3581             tcg_temp_free(t2);
3582         }
3583         opn = "ddivu";
3584         break;
3585     case OPC_DMULT:
3586         tcg_gen_muls2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
3587         opn = "dmult";
3588         break;
3589     case OPC_DMULTU:
3590         tcg_gen_mulu2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
3591         opn = "dmultu";
3592         break;
3593 #endif
3594     case OPC_MADD:
3595         {
3596             TCGv_i64 t2 = tcg_temp_new_i64();
3597             TCGv_i64 t3 = tcg_temp_new_i64();
3598
3599             tcg_gen_ext_tl_i64(t2, t0);
3600             tcg_gen_ext_tl_i64(t3, t1);
3601             tcg_gen_mul_i64(t2, t2, t3);
3602             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3603             tcg_gen_add_i64(t2, t2, t3);
3604             tcg_temp_free_i64(t3);
3605             tcg_gen_trunc_i64_tl(t0, t2);
3606             tcg_gen_shri_i64(t2, t2, 32);
3607             tcg_gen_trunc_i64_tl(t1, t2);
3608             tcg_temp_free_i64(t2);
3609             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
3610             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
3611         }
3612         opn = "madd";
3613         break;
3614     case OPC_MADDU:
3615         {
3616             TCGv_i64 t2 = tcg_temp_new_i64();
3617             TCGv_i64 t3 = tcg_temp_new_i64();
3618
3619             tcg_gen_ext32u_tl(t0, t0);
3620             tcg_gen_ext32u_tl(t1, t1);
3621             tcg_gen_extu_tl_i64(t2, t0);
3622             tcg_gen_extu_tl_i64(t3, t1);
3623             tcg_gen_mul_i64(t2, t2, t3);
3624             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3625             tcg_gen_add_i64(t2, t2, t3);
3626             tcg_temp_free_i64(t3);
3627             tcg_gen_trunc_i64_tl(t0, t2);
3628             tcg_gen_shri_i64(t2, t2, 32);
3629             tcg_gen_trunc_i64_tl(t1, t2);
3630             tcg_temp_free_i64(t2);
3631             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
3632             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
3633         }
3634         opn = "maddu";
3635         break;
3636     case OPC_MSUB:
3637         {
3638             TCGv_i64 t2 = tcg_temp_new_i64();
3639             TCGv_i64 t3 = tcg_temp_new_i64();
3640
3641             tcg_gen_ext_tl_i64(t2, t0);
3642             tcg_gen_ext_tl_i64(t3, t1);
3643             tcg_gen_mul_i64(t2, t2, t3);
3644             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3645             tcg_gen_sub_i64(t2, t3, t2);
3646             tcg_temp_free_i64(t3);
3647             tcg_gen_trunc_i64_tl(t0, t2);
3648             tcg_gen_shri_i64(t2, t2, 32);
3649             tcg_gen_trunc_i64_tl(t1, t2);
3650             tcg_temp_free_i64(t2);
3651             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
3652             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
3653         }
3654         opn = "msub";
3655         break;
3656     case OPC_MSUBU:
3657         {
3658             TCGv_i64 t2 = tcg_temp_new_i64();
3659             TCGv_i64 t3 = tcg_temp_new_i64();
3660
3661             tcg_gen_ext32u_tl(t0, t0);
3662             tcg_gen_ext32u_tl(t1, t1);
3663             tcg_gen_extu_tl_i64(t2, t0);
3664             tcg_gen_extu_tl_i64(t3, t1);
3665             tcg_gen_mul_i64(t2, t2, t3);
3666             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3667             tcg_gen_sub_i64(t2, t3, t2);
3668             tcg_temp_free_i64(t3);
3669             tcg_gen_trunc_i64_tl(t0, t2);
3670             tcg_gen_shri_i64(t2, t2, 32);
3671             tcg_gen_trunc_i64_tl(t1, t2);
3672             tcg_temp_free_i64(t2);
3673             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
3674             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
3675         }
3676         opn = "msubu";
3677         break;
3678     default:
3679         MIPS_INVAL(opn);
3680         generate_exception(ctx, EXCP_RI);
3681         goto out;
3682     }
3683     (void)opn; /* avoid a compiler warning */
3684     MIPS_DEBUG("%s %s %s", opn, regnames[rs], regnames[rt]);
3685  out:
3686     tcg_temp_free(t0);
3687     tcg_temp_free(t1);
3688 }
3689
3690 static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc,
3691                             int rd, int rs, int rt)
3692 {
3693     const char *opn = "mul vr54xx";
3694     TCGv t0 = tcg_temp_new();
3695     TCGv t1 = tcg_temp_new();
3696
3697     gen_load_gpr(t0, rs);
3698     gen_load_gpr(t1, rt);
3699
3700     switch (opc) {
3701     case OPC_VR54XX_MULS:
3702         gen_helper_muls(t0, cpu_env, t0, t1);
3703         opn = "muls";
3704         break;
3705     case OPC_VR54XX_MULSU:
3706         gen_helper_mulsu(t0, cpu_env, t0, t1);
3707         opn = "mulsu";
3708         break;
3709     case OPC_VR54XX_MACC:
3710         gen_helper_macc(t0, cpu_env, t0, t1);
3711         opn = "macc";
3712         break;
3713     case OPC_VR54XX_MACCU:
3714         gen_helper_maccu(t0, cpu_env, t0, t1);
3715         opn = "maccu";
3716         break;
3717     case OPC_VR54XX_MSAC:
3718         gen_helper_msac(t0, cpu_env, t0, t1);
3719         opn = "msac";
3720         break;
3721     case OPC_VR54XX_MSACU:
3722         gen_helper_msacu(t0, cpu_env, t0, t1);
3723         opn = "msacu";
3724         break;
3725     case OPC_VR54XX_MULHI:
3726         gen_helper_mulhi(t0, cpu_env, t0, t1);
3727         opn = "mulhi";
3728         break;
3729     case OPC_VR54XX_MULHIU:
3730         gen_helper_mulhiu(t0, cpu_env, t0, t1);
3731         opn = "mulhiu";
3732         break;
3733     case OPC_VR54XX_MULSHI:
3734         gen_helper_mulshi(t0, cpu_env, t0, t1);
3735         opn = "mulshi";
3736         break;
3737     case OPC_VR54XX_MULSHIU:
3738         gen_helper_mulshiu(t0, cpu_env, t0, t1);
3739         opn = "mulshiu";
3740         break;
3741     case OPC_VR54XX_MACCHI:
3742         gen_helper_macchi(t0, cpu_env, t0, t1);
3743         opn = "macchi";
3744         break;
3745     case OPC_VR54XX_MACCHIU:
3746         gen_helper_macchiu(t0, cpu_env, t0, t1);
3747         opn = "macchiu";
3748         break;
3749     case OPC_VR54XX_MSACHI:
3750         gen_helper_msachi(t0, cpu_env, t0, t1);
3751         opn = "msachi";
3752         break;
3753     case OPC_VR54XX_MSACHIU:
3754         gen_helper_msachiu(t0, cpu_env, t0, t1);
3755         opn = "msachiu";
3756         break;
3757     default:
3758         MIPS_INVAL("mul vr54xx");
3759         generate_exception(ctx, EXCP_RI);
3760         goto out;
3761     }
3762     gen_store_gpr(t0, rd);
3763     (void)opn; /* avoid a compiler warning */
3764     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
3765
3766  out:
3767     tcg_temp_free(t0);
3768     tcg_temp_free(t1);
3769 }
3770
3771 static void gen_cl (DisasContext *ctx, uint32_t opc,
3772                     int rd, int rs)
3773 {
3774     const char *opn = "CLx";
3775     TCGv t0;
3776
3777     if (rd == 0) {
3778         /* Treat as NOP. */
3779         MIPS_DEBUG("NOP");
3780         return;
3781     }
3782     t0 = tcg_temp_new();
3783     gen_load_gpr(t0, rs);
3784     switch (opc) {
3785     case OPC_CLO:
3786     case R6_OPC_CLO:
3787         gen_helper_clo(cpu_gpr[rd], t0);
3788         opn = "clo";
3789         break;
3790     case OPC_CLZ:
3791     case R6_OPC_CLZ:
3792         gen_helper_clz(cpu_gpr[rd], t0);
3793         opn = "clz";
3794         break;
3795 #if defined(TARGET_MIPS64)
3796     case OPC_DCLO:
3797     case R6_OPC_DCLO:
3798         gen_helper_dclo(cpu_gpr[rd], t0);
3799         opn = "dclo";
3800         break;
3801     case OPC_DCLZ:
3802     case R6_OPC_DCLZ:
3803         gen_helper_dclz(cpu_gpr[rd], t0);
3804         opn = "dclz";
3805         break;
3806 #endif
3807     }
3808     (void)opn; /* avoid a compiler warning */
3809     MIPS_DEBUG("%s %s, %s", opn, regnames[rd], regnames[rs]);
3810     tcg_temp_free(t0);
3811 }
3812
3813 /* Godson integer instructions */
3814 static void gen_loongson_integer(DisasContext *ctx, uint32_t opc,
3815                                  int rd, int rs, int rt)
3816 {
3817     const char *opn = "loongson";
3818     TCGv t0, t1;
3819
3820     if (rd == 0) {
3821         /* Treat as NOP. */
3822         MIPS_DEBUG("NOP");
3823         return;
3824     }
3825
3826     switch (opc) {
3827     case OPC_MULT_G_2E:
3828     case OPC_MULT_G_2F:
3829     case OPC_MULTU_G_2E:
3830     case OPC_MULTU_G_2F:
3831 #if defined(TARGET_MIPS64)
3832     case OPC_DMULT_G_2E:
3833     case OPC_DMULT_G_2F:
3834     case OPC_DMULTU_G_2E:
3835     case OPC_DMULTU_G_2F:
3836 #endif
3837         t0 = tcg_temp_new();
3838         t1 = tcg_temp_new();
3839         break;
3840     default:
3841         t0 = tcg_temp_local_new();
3842         t1 = tcg_temp_local_new();
3843         break;
3844     }
3845
3846     gen_load_gpr(t0, rs);
3847     gen_load_gpr(t1, rt);
3848
3849     switch (opc) {
3850     case OPC_MULT_G_2E:
3851     case OPC_MULT_G_2F:
3852         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3853         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3854         opn = "mult.g";
3855         break;
3856     case OPC_MULTU_G_2E:
3857     case OPC_MULTU_G_2F:
3858         tcg_gen_ext32u_tl(t0, t0);
3859         tcg_gen_ext32u_tl(t1, t1);
3860         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3861         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3862         opn = "multu.g";
3863         break;
3864     case OPC_DIV_G_2E:
3865     case OPC_DIV_G_2F:
3866         {
3867             TCGLabel *l1 = gen_new_label();
3868             TCGLabel *l2 = gen_new_label();
3869             TCGLabel *l3 = gen_new_label();
3870             tcg_gen_ext32s_tl(t0, t0);
3871             tcg_gen_ext32s_tl(t1, t1);
3872             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3873             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3874             tcg_gen_br(l3);
3875             gen_set_label(l1);
3876             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3877             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3878             tcg_gen_mov_tl(cpu_gpr[rd], t0);
3879             tcg_gen_br(l3);
3880             gen_set_label(l2);
3881             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3882             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3883             gen_set_label(l3);
3884         }
3885         opn = "div.g";
3886         break;
3887     case OPC_DIVU_G_2E:
3888     case OPC_DIVU_G_2F:
3889         {
3890             TCGLabel *l1 = gen_new_label();
3891             TCGLabel *l2 = gen_new_label();
3892             tcg_gen_ext32u_tl(t0, t0);
3893             tcg_gen_ext32u_tl(t1, t1);
3894             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3895             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3896             tcg_gen_br(l2);
3897             gen_set_label(l1);
3898             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3899             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3900             gen_set_label(l2);
3901         }
3902         opn = "divu.g";
3903         break;
3904     case OPC_MOD_G_2E:
3905     case OPC_MOD_G_2F:
3906         {
3907             TCGLabel *l1 = gen_new_label();
3908             TCGLabel *l2 = gen_new_label();
3909             TCGLabel *l3 = gen_new_label();
3910             tcg_gen_ext32u_tl(t0, t0);
3911             tcg_gen_ext32u_tl(t1, t1);
3912             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3913             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3914             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3915             gen_set_label(l1);
3916             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3917             tcg_gen_br(l3);
3918             gen_set_label(l2);
3919             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3920             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3921             gen_set_label(l3);
3922         }
3923         opn = "mod.g";
3924         break;
3925     case OPC_MODU_G_2E:
3926     case OPC_MODU_G_2F:
3927         {
3928             TCGLabel *l1 = gen_new_label();
3929             TCGLabel *l2 = gen_new_label();
3930             tcg_gen_ext32u_tl(t0, t0);
3931             tcg_gen_ext32u_tl(t1, t1);
3932             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3933             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3934             tcg_gen_br(l2);
3935             gen_set_label(l1);
3936             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3937             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3938             gen_set_label(l2);
3939         }
3940         opn = "modu.g";
3941         break;
3942 #if defined(TARGET_MIPS64)
3943     case OPC_DMULT_G_2E:
3944     case OPC_DMULT_G_2F:
3945         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3946         opn = "dmult.g";
3947         break;
3948     case OPC_DMULTU_G_2E:
3949     case OPC_DMULTU_G_2F:
3950         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3951         opn = "dmultu.g";
3952         break;
3953     case OPC_DDIV_G_2E:
3954     case OPC_DDIV_G_2F:
3955         {
3956             TCGLabel *l1 = gen_new_label();
3957             TCGLabel *l2 = gen_new_label();
3958             TCGLabel *l3 = gen_new_label();
3959             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3960             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3961             tcg_gen_br(l3);
3962             gen_set_label(l1);
3963             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
3964             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
3965             tcg_gen_mov_tl(cpu_gpr[rd], t0);
3966             tcg_gen_br(l3);
3967             gen_set_label(l2);
3968             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3969             gen_set_label(l3);
3970         }
3971         opn = "ddiv.g";
3972         break;
3973     case OPC_DDIVU_G_2E:
3974     case OPC_DDIVU_G_2F:
3975         {
3976             TCGLabel *l1 = gen_new_label();
3977             TCGLabel *l2 = gen_new_label();
3978             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3979             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3980             tcg_gen_br(l2);
3981             gen_set_label(l1);
3982             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3983             gen_set_label(l2);
3984         }
3985         opn = "ddivu.g";
3986         break;
3987     case OPC_DMOD_G_2E:
3988     case OPC_DMOD_G_2F:
3989         {
3990             TCGLabel *l1 = gen_new_label();
3991             TCGLabel *l2 = gen_new_label();
3992             TCGLabel *l3 = gen_new_label();
3993             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3994             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
3995             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
3996             gen_set_label(l1);
3997             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3998             tcg_gen_br(l3);
3999             gen_set_label(l2);
4000             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
4001             gen_set_label(l3);
4002         }
4003         opn = "dmod.g";
4004         break;
4005     case OPC_DMODU_G_2E:
4006     case OPC_DMODU_G_2F:
4007         {
4008             TCGLabel *l1 = gen_new_label();
4009             TCGLabel *l2 = gen_new_label();
4010             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4011             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4012             tcg_gen_br(l2);
4013             gen_set_label(l1);
4014             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
4015             gen_set_label(l2);
4016         }
4017         opn = "dmodu.g";
4018         break;
4019 #endif
4020     }
4021
4022     (void)opn; /* avoid a compiler warning */
4023     MIPS_DEBUG("%s %s, %s", opn, regnames[rd], regnames[rs]);
4024     tcg_temp_free(t0);
4025     tcg_temp_free(t1);
4026 }
4027
4028 /* Loongson multimedia instructions */
4029 static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt)
4030 {
4031     const char *opn = "loongson_cp2";
4032     uint32_t opc, shift_max;
4033     TCGv_i64 t0, t1;
4034
4035     opc = MASK_LMI(ctx->opcode);
4036     switch (opc) {
4037     case OPC_ADD_CP2:
4038     case OPC_SUB_CP2:
4039     case OPC_DADD_CP2:
4040     case OPC_DSUB_CP2:
4041         t0 = tcg_temp_local_new_i64();
4042         t1 = tcg_temp_local_new_i64();
4043         break;
4044     default:
4045         t0 = tcg_temp_new_i64();
4046         t1 = tcg_temp_new_i64();
4047         break;
4048     }
4049
4050     gen_load_fpr64(ctx, t0, rs);
4051     gen_load_fpr64(ctx, t1, rt);
4052
4053 #define LMI_HELPER(UP, LO) \
4054     case OPC_##UP: gen_helper_##LO(t0, t0, t1); opn = #LO; break
4055 #define LMI_HELPER_1(UP, LO) \
4056     case OPC_##UP: gen_helper_##LO(t0, t0); opn = #LO; break
4057 #define LMI_DIRECT(UP, LO, OP) \
4058     case OPC_##UP: tcg_gen_##OP##_i64(t0, t0, t1); opn = #LO; break
4059
4060     switch (opc) {
4061     LMI_HELPER(PADDSH, paddsh);
4062     LMI_HELPER(PADDUSH, paddush);
4063     LMI_HELPER(PADDH, paddh);
4064     LMI_HELPER(PADDW, paddw);
4065     LMI_HELPER(PADDSB, paddsb);
4066     LMI_HELPER(PADDUSB, paddusb);
4067     LMI_HELPER(PADDB, paddb);
4068
4069     LMI_HELPER(PSUBSH, psubsh);
4070     LMI_HELPER(PSUBUSH, psubush);
4071     LMI_HELPER(PSUBH, psubh);
4072     LMI_HELPER(PSUBW, psubw);
4073     LMI_HELPER(PSUBSB, psubsb);
4074     LMI_HELPER(PSUBUSB, psubusb);
4075     LMI_HELPER(PSUBB, psubb);
4076
4077     LMI_HELPER(PSHUFH, pshufh);
4078     LMI_HELPER(PACKSSWH, packsswh);
4079     LMI_HELPER(PACKSSHB, packsshb);
4080     LMI_HELPER(PACKUSHB, packushb);
4081
4082     LMI_HELPER(PUNPCKLHW, punpcklhw);
4083     LMI_HELPER(PUNPCKHHW, punpckhhw);
4084     LMI_HELPER(PUNPCKLBH, punpcklbh);
4085     LMI_HELPER(PUNPCKHBH, punpckhbh);
4086     LMI_HELPER(PUNPCKLWD, punpcklwd);
4087     LMI_HELPER(PUNPCKHWD, punpckhwd);
4088
4089     LMI_HELPER(PAVGH, pavgh);
4090     LMI_HELPER(PAVGB, pavgb);
4091     LMI_HELPER(PMAXSH, pmaxsh);
4092     LMI_HELPER(PMINSH, pminsh);
4093     LMI_HELPER(PMAXUB, pmaxub);
4094     LMI_HELPER(PMINUB, pminub);
4095
4096     LMI_HELPER(PCMPEQW, pcmpeqw);
4097     LMI_HELPER(PCMPGTW, pcmpgtw);
4098     LMI_HELPER(PCMPEQH, pcmpeqh);
4099     LMI_HELPER(PCMPGTH, pcmpgth);
4100     LMI_HELPER(PCMPEQB, pcmpeqb);
4101     LMI_HELPER(PCMPGTB, pcmpgtb);
4102
4103     LMI_HELPER(PSLLW, psllw);
4104     LMI_HELPER(PSLLH, psllh);
4105     LMI_HELPER(PSRLW, psrlw);
4106     LMI_HELPER(PSRLH, psrlh);
4107     LMI_HELPER(PSRAW, psraw);
4108     LMI_HELPER(PSRAH, psrah);
4109
4110     LMI_HELPER(PMULLH, pmullh);
4111     LMI_HELPER(PMULHH, pmulhh);
4112     LMI_HELPER(PMULHUH, pmulhuh);
4113     LMI_HELPER(PMADDHW, pmaddhw);
4114
4115     LMI_HELPER(PASUBUB, pasubub);
4116     LMI_HELPER_1(BIADD, biadd);
4117     LMI_HELPER_1(PMOVMSKB, pmovmskb);
4118
4119     LMI_DIRECT(PADDD, paddd, add);
4120     LMI_DIRECT(PSUBD, psubd, sub);
4121     LMI_DIRECT(XOR_CP2, xor, xor);
4122     LMI_DIRECT(NOR_CP2, nor, nor);
4123     LMI_DIRECT(AND_CP2, and, and);
4124     LMI_DIRECT(PANDN, pandn, andc);
4125     LMI_DIRECT(OR, or, or);
4126
4127     case OPC_PINSRH_0:
4128         tcg_gen_deposit_i64(t0, t0, t1, 0, 16);
4129         opn = "pinsrh_0";
4130         break;
4131     case OPC_PINSRH_1:
4132         tcg_gen_deposit_i64(t0, t0, t1, 16, 16);
4133         opn = "pinsrh_1";
4134         break;
4135     case OPC_PINSRH_2:
4136         tcg_gen_deposit_i64(t0, t0, t1, 32, 16);
4137         opn = "pinsrh_2";
4138         break;
4139     case OPC_PINSRH_3:
4140         tcg_gen_deposit_i64(t0, t0, t1, 48, 16);
4141         opn = "pinsrh_3";
4142         break;
4143
4144     case OPC_PEXTRH:
4145         tcg_gen_andi_i64(t1, t1, 3);
4146         tcg_gen_shli_i64(t1, t1, 4);
4147         tcg_gen_shr_i64(t0, t0, t1);
4148         tcg_gen_ext16u_i64(t0, t0);
4149         opn = "pextrh";
4150         break;
4151
4152     case OPC_ADDU_CP2:
4153         tcg_gen_add_i64(t0, t0, t1);
4154         tcg_gen_ext32s_i64(t0, t0);
4155         opn = "addu";
4156         break;
4157     case OPC_SUBU_CP2:
4158         tcg_gen_sub_i64(t0, t0, t1);
4159         tcg_gen_ext32s_i64(t0, t0);
4160         opn = "addu";
4161         break;
4162
4163     case OPC_SLL_CP2:
4164         opn = "sll";
4165         shift_max = 32;
4166         goto do_shift;
4167     case OPC_SRL_CP2:
4168         opn = "srl";
4169         shift_max = 32;
4170         goto do_shift;
4171     case OPC_SRA_CP2:
4172         opn = "sra";
4173         shift_max = 32;
4174         goto do_shift;
4175     case OPC_DSLL_CP2:
4176         opn = "dsll";
4177         shift_max = 64;
4178         goto do_shift;
4179     case OPC_DSRL_CP2:
4180         opn = "dsrl";
4181         shift_max = 64;
4182         goto do_shift;
4183     case OPC_DSRA_CP2:
4184         opn = "dsra";
4185         shift_max = 64;
4186         goto do_shift;
4187     do_shift:
4188         /* Make sure shift count isn't TCG undefined behaviour.  */
4189         tcg_gen_andi_i64(t1, t1, shift_max - 1);
4190
4191         switch (opc) {
4192         case OPC_SLL_CP2:
4193         case OPC_DSLL_CP2:
4194             tcg_gen_shl_i64(t0, t0, t1);
4195             break;
4196         case OPC_SRA_CP2:
4197         case OPC_DSRA_CP2:
4198             /* Since SRA is UndefinedResult without sign-extended inputs,
4199                we can treat SRA and DSRA the same.  */
4200             tcg_gen_sar_i64(t0, t0, t1);
4201             break;
4202         case OPC_SRL_CP2:
4203             /* We want to shift in zeros for SRL; zero-extend first.  */
4204             tcg_gen_ext32u_i64(t0, t0);
4205             /* FALLTHRU */
4206         case OPC_DSRL_CP2:
4207             tcg_gen_shr_i64(t0, t0, t1);
4208             break;
4209         }
4210
4211         if (shift_max == 32) {
4212             tcg_gen_ext32s_i64(t0, t0);
4213         }
4214
4215         /* Shifts larger than MAX produce zero.  */
4216         tcg_gen_setcondi_i64(TCG_COND_LTU, t1, t1, shift_max);
4217         tcg_gen_neg_i64(t1, t1);
4218         tcg_gen_and_i64(t0, t0, t1);
4219         break;
4220
4221     case OPC_ADD_CP2:
4222     case OPC_DADD_CP2:
4223         {
4224             TCGv_i64 t2 = tcg_temp_new_i64();
4225             TCGLabel *lab = gen_new_label();
4226
4227             tcg_gen_mov_i64(t2, t0);
4228             tcg_gen_add_i64(t0, t1, t2);
4229             if (opc == OPC_ADD_CP2) {
4230                 tcg_gen_ext32s_i64(t0, t0);
4231             }
4232             tcg_gen_xor_i64(t1, t1, t2);
4233             tcg_gen_xor_i64(t2, t2, t0);
4234             tcg_gen_andc_i64(t1, t2, t1);
4235             tcg_temp_free_i64(t2);
4236             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
4237             generate_exception(ctx, EXCP_OVERFLOW);
4238             gen_set_label(lab);
4239
4240             opn = (opc == OPC_ADD_CP2 ? "add" : "dadd");
4241             break;
4242         }
4243
4244     case OPC_SUB_CP2:
4245     case OPC_DSUB_CP2:
4246         {
4247             TCGv_i64 t2 = tcg_temp_new_i64();
4248             TCGLabel *lab = gen_new_label();
4249
4250             tcg_gen_mov_i64(t2, t0);
4251             tcg_gen_sub_i64(t0, t1, t2);
4252             if (opc == OPC_SUB_CP2) {
4253                 tcg_gen_ext32s_i64(t0, t0);
4254             }
4255             tcg_gen_xor_i64(t1, t1, t2);
4256             tcg_gen_xor_i64(t2, t2, t0);
4257             tcg_gen_and_i64(t1, t1, t2);
4258             tcg_temp_free_i64(t2);
4259             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
4260             generate_exception(ctx, EXCP_OVERFLOW);
4261             gen_set_label(lab);
4262
4263             opn = (opc == OPC_SUB_CP2 ? "sub" : "dsub");
4264             break;
4265         }
4266
4267     case OPC_PMULUW:
4268         tcg_gen_ext32u_i64(t0, t0);
4269         tcg_gen_ext32u_i64(t1, t1);
4270         tcg_gen_mul_i64(t0, t0, t1);
4271         opn = "pmuluw";
4272         break;
4273
4274     case OPC_SEQU_CP2:
4275     case OPC_SEQ_CP2:
4276     case OPC_SLTU_CP2:
4277     case OPC_SLT_CP2:
4278     case OPC_SLEU_CP2:
4279     case OPC_SLE_CP2:
4280         /* ??? Document is unclear: Set FCC[CC].  Does that mean the
4281            FD field is the CC field?  */
4282     default:
4283         MIPS_INVAL(opn);
4284         generate_exception(ctx, EXCP_RI);
4285         return;
4286     }
4287
4288 #undef LMI_HELPER
4289 #undef LMI_DIRECT
4290
4291     gen_store_fpr64(ctx, t0, rd);
4292
4293     (void)opn; /* avoid a compiler warning */
4294     MIPS_DEBUG("%s %s, %s, %s", opn,
4295                fregnames[rd], fregnames[rs], fregnames[rt]);
4296     tcg_temp_free_i64(t0);
4297     tcg_temp_free_i64(t1);
4298 }
4299
4300 /* Traps */
4301 static void gen_trap (DisasContext *ctx, uint32_t opc,
4302                       int rs, int rt, int16_t imm)
4303 {
4304     int cond;
4305     TCGv t0 = tcg_temp_new();
4306     TCGv t1 = tcg_temp_new();
4307
4308     cond = 0;
4309     /* Load needed operands */
4310     switch (opc) {
4311     case OPC_TEQ:
4312     case OPC_TGE:
4313     case OPC_TGEU:
4314     case OPC_TLT:
4315     case OPC_TLTU:
4316     case OPC_TNE:
4317         /* Compare two registers */
4318         if (rs != rt) {
4319             gen_load_gpr(t0, rs);
4320             gen_load_gpr(t1, rt);
4321             cond = 1;
4322         }
4323         break;
4324     case OPC_TEQI:
4325     case OPC_TGEI:
4326     case OPC_TGEIU:
4327     case OPC_TLTI:
4328     case OPC_TLTIU:
4329     case OPC_TNEI:
4330         /* Compare register to immediate */
4331         if (rs != 0 || imm != 0) {
4332             gen_load_gpr(t0, rs);
4333             tcg_gen_movi_tl(t1, (int32_t)imm);
4334             cond = 1;
4335         }
4336         break;
4337     }
4338     if (cond == 0) {
4339         switch (opc) {
4340         case OPC_TEQ:   /* rs == rs */
4341         case OPC_TEQI:  /* r0 == 0  */
4342         case OPC_TGE:   /* rs >= rs */
4343         case OPC_TGEI:  /* r0 >= 0  */
4344         case OPC_TGEU:  /* rs >= rs unsigned */
4345         case OPC_TGEIU: /* r0 >= 0  unsigned */
4346             /* Always trap */
4347             generate_exception(ctx, EXCP_TRAP);
4348             break;
4349         case OPC_TLT:   /* rs < rs           */
4350         case OPC_TLTI:  /* r0 < 0            */
4351         case OPC_TLTU:  /* rs < rs unsigned  */
4352         case OPC_TLTIU: /* r0 < 0  unsigned  */
4353         case OPC_TNE:   /* rs != rs          */
4354         case OPC_TNEI:  /* r0 != 0           */
4355             /* Never trap: treat as NOP. */
4356             break;
4357         }
4358     } else {
4359         TCGLabel *l1 = gen_new_label();
4360
4361         switch (opc) {
4362         case OPC_TEQ:
4363         case OPC_TEQI:
4364             tcg_gen_brcond_tl(TCG_COND_NE, t0, t1, l1);
4365             break;
4366         case OPC_TGE:
4367         case OPC_TGEI:
4368             tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1);
4369             break;
4370         case OPC_TGEU:
4371         case OPC_TGEIU:
4372             tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1);
4373             break;
4374         case OPC_TLT:
4375         case OPC_TLTI:
4376             tcg_gen_brcond_tl(TCG_COND_GE, t0, t1, l1);
4377             break;
4378         case OPC_TLTU:
4379         case OPC_TLTIU:
4380             tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1);
4381             break;
4382         case OPC_TNE:
4383         case OPC_TNEI:
4384             tcg_gen_brcond_tl(TCG_COND_EQ, t0, t1, l1);
4385             break;
4386         }
4387         generate_exception(ctx, EXCP_TRAP);
4388         gen_set_label(l1);
4389     }
4390     tcg_temp_free(t0);
4391     tcg_temp_free(t1);
4392 }
4393
4394 static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
4395 {
4396     TranslationBlock *tb;
4397     tb = ctx->tb;
4398     if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK) &&
4399         likely(!ctx->singlestep_enabled)) {
4400         tcg_gen_goto_tb(n);
4401         gen_save_pc(dest);
4402         tcg_gen_exit_tb((uintptr_t)tb + n);
4403     } else {
4404         gen_save_pc(dest);
4405         if (ctx->singlestep_enabled) {
4406             save_cpu_state(ctx, 0);
4407             gen_helper_0e0i(raise_exception, EXCP_DEBUG);
4408         }
4409         tcg_gen_exit_tb(0);
4410     }
4411 }
4412
4413 /* Branches (before delay slot) */
4414 static void gen_compute_branch (DisasContext *ctx, uint32_t opc,
4415                                 int insn_bytes,
4416                                 int rs, int rt, int32_t offset,
4417                                 int delayslot_size)
4418 {
4419     target_ulong btgt = -1;
4420     int blink = 0;
4421     int bcond_compute = 0;
4422     TCGv t0 = tcg_temp_new();
4423     TCGv t1 = tcg_temp_new();
4424
4425     if (ctx->hflags & MIPS_HFLAG_BMASK) {
4426 #ifdef MIPS_DEBUG_DISAS
4427         LOG_DISAS("Branch in delay / forbidden slot at PC 0x"
4428                   TARGET_FMT_lx "\n", ctx->pc);
4429 #endif
4430         generate_exception(ctx, EXCP_RI);
4431         goto out;
4432     }
4433
4434     /* Load needed operands */
4435     switch (opc) {
4436     case OPC_BEQ:
4437     case OPC_BEQL:
4438     case OPC_BNE:
4439     case OPC_BNEL:
4440         /* Compare two registers */
4441         if (rs != rt) {
4442             gen_load_gpr(t0, rs);
4443             gen_load_gpr(t1, rt);
4444             bcond_compute = 1;
4445         }
4446         btgt = ctx->pc + insn_bytes + offset;
4447         break;
4448     case OPC_BGEZ:
4449     case OPC_BGEZAL:
4450     case OPC_BGEZALL:
4451     case OPC_BGEZL:
4452     case OPC_BGTZ:
4453     case OPC_BGTZL:
4454     case OPC_BLEZ:
4455     case OPC_BLEZL:
4456     case OPC_BLTZ:
4457     case OPC_BLTZAL:
4458     case OPC_BLTZALL:
4459     case OPC_BLTZL:
4460         /* Compare to zero */
4461         if (rs != 0) {
4462             gen_load_gpr(t0, rs);
4463             bcond_compute = 1;
4464         }
4465         btgt = ctx->pc + insn_bytes + offset;
4466         break;
4467     case OPC_BPOSGE32:
4468 #if defined(TARGET_MIPS64)
4469     case OPC_BPOSGE64:
4470         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x7F);
4471 #else
4472         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
4473 #endif
4474         bcond_compute = 1;
4475         btgt = ctx->pc + insn_bytes + offset;
4476         break;
4477     case OPC_J:
4478     case OPC_JAL:
4479     case OPC_JALX:
4480         /* Jump to immediate */
4481         btgt = ((ctx->pc + insn_bytes) & (int32_t)0xF0000000) | (uint32_t)offset;
4482         break;
4483     case OPC_JR:
4484     case OPC_JALR:
4485         /* Jump to register */
4486         if (offset != 0 && offset != 16) {
4487             /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
4488                others are reserved. */
4489             MIPS_INVAL("jump hint");
4490             generate_exception(ctx, EXCP_RI);
4491             goto out;
4492         }
4493         gen_load_gpr(btarget, rs);
4494         break;
4495     default:
4496         MIPS_INVAL("branch/jump");
4497         generate_exception(ctx, EXCP_RI);
4498         goto out;
4499     }
4500     if (bcond_compute == 0) {
4501         /* No condition to be computed */
4502         switch (opc) {
4503         case OPC_BEQ:     /* rx == rx        */
4504         case OPC_BEQL:    /* rx == rx likely */
4505         case OPC_BGEZ:    /* 0 >= 0          */
4506         case OPC_BGEZL:   /* 0 >= 0 likely   */
4507         case OPC_BLEZ:    /* 0 <= 0          */
4508         case OPC_BLEZL:   /* 0 <= 0 likely   */
4509             /* Always take */
4510             ctx->hflags |= MIPS_HFLAG_B;
4511             MIPS_DEBUG("balways");
4512             break;
4513         case OPC_BGEZAL:  /* 0 >= 0          */
4514         case OPC_BGEZALL: /* 0 >= 0 likely   */
4515             /* Always take and link */
4516             blink = 31;
4517             ctx->hflags |= MIPS_HFLAG_B;
4518             MIPS_DEBUG("balways and link");
4519             break;
4520         case OPC_BNE:     /* rx != rx        */
4521         case OPC_BGTZ:    /* 0 > 0           */
4522         case OPC_BLTZ:    /* 0 < 0           */
4523             /* Treat as NOP. */
4524             MIPS_DEBUG("bnever (NOP)");
4525             goto out;
4526         case OPC_BLTZAL:  /* 0 < 0           */
4527             /* Handle as an unconditional branch to get correct delay
4528                slot checking.  */
4529             blink = 31;
4530             btgt = ctx->pc + insn_bytes + delayslot_size;
4531             ctx->hflags |= MIPS_HFLAG_B;
4532             MIPS_DEBUG("bnever and link");
4533             break;
4534         case OPC_BLTZALL: /* 0 < 0 likely */
4535             tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 8);
4536             /* Skip the instruction in the delay slot */
4537             MIPS_DEBUG("bnever, link and skip");
4538             ctx->pc += 4;
4539             goto out;
4540         case OPC_BNEL:    /* rx != rx likely */
4541         case OPC_BGTZL:   /* 0 > 0 likely */
4542         case OPC_BLTZL:   /* 0 < 0 likely */
4543             /* Skip the instruction in the delay slot */
4544             MIPS_DEBUG("bnever and skip");
4545             ctx->pc += 4;
4546             goto out;
4547         case OPC_J:
4548             ctx->hflags |= MIPS_HFLAG_B;
4549             MIPS_DEBUG("j " TARGET_FMT_lx, btgt);
4550             break;
4551         case OPC_JALX:
4552             ctx->hflags |= MIPS_HFLAG_BX;
4553             /* Fallthrough */
4554         case OPC_JAL:
4555             blink = 31;
4556             ctx->hflags |= MIPS_HFLAG_B;
4557             MIPS_DEBUG("jal " TARGET_FMT_lx, btgt);
4558             break;
4559         case OPC_JR:
4560             ctx->hflags |= MIPS_HFLAG_BR;
4561             MIPS_DEBUG("jr %s", regnames[rs]);
4562             break;
4563         case OPC_JALR:
4564             blink = rt;
4565             ctx->hflags |= MIPS_HFLAG_BR;
4566             MIPS_DEBUG("jalr %s, %s", regnames[rt], regnames[rs]);
4567             break;
4568         default:
4569             MIPS_INVAL("branch/jump");
4570             generate_exception(ctx, EXCP_RI);
4571             goto out;
4572         }
4573     } else {
4574         switch (opc) {
4575         case OPC_BEQ:
4576             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
4577             MIPS_DEBUG("beq %s, %s, " TARGET_FMT_lx,
4578                        regnames[rs], regnames[rt], btgt);
4579             goto not_likely;
4580         case OPC_BEQL:
4581             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
4582             MIPS_DEBUG("beql %s, %s, " TARGET_FMT_lx,
4583                        regnames[rs], regnames[rt], btgt);
4584             goto likely;
4585         case OPC_BNE:
4586             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
4587             MIPS_DEBUG("bne %s, %s, " TARGET_FMT_lx,
4588                        regnames[rs], regnames[rt], btgt);
4589             goto not_likely;
4590         case OPC_BNEL:
4591             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
4592             MIPS_DEBUG("bnel %s, %s, " TARGET_FMT_lx,
4593                        regnames[rs], regnames[rt], btgt);
4594             goto likely;
4595         case OPC_BGEZ:
4596             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4597             MIPS_DEBUG("bgez %s, " TARGET_FMT_lx, regnames[rs], btgt);
4598             goto not_likely;
4599         case OPC_BGEZL:
4600             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4601             MIPS_DEBUG("bgezl %s, " TARGET_FMT_lx, regnames[rs], btgt);
4602             goto likely;
4603         case OPC_BGEZAL:
4604             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4605             MIPS_DEBUG("bgezal %s, " TARGET_FMT_lx, regnames[rs], btgt);
4606             blink = 31;
4607             goto not_likely;
4608         case OPC_BGEZALL:
4609             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4610             blink = 31;
4611             MIPS_DEBUG("bgezall %s, " TARGET_FMT_lx, regnames[rs], btgt);
4612             goto likely;
4613         case OPC_BGTZ:
4614             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
4615             MIPS_DEBUG("bgtz %s, " TARGET_FMT_lx, regnames[rs], btgt);
4616             goto not_likely;
4617         case OPC_BGTZL:
4618             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
4619             MIPS_DEBUG("bgtzl %s, " TARGET_FMT_lx, regnames[rs], btgt);
4620             goto likely;
4621         case OPC_BLEZ:
4622             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
4623             MIPS_DEBUG("blez %s, " TARGET_FMT_lx, regnames[rs], btgt);
4624             goto not_likely;
4625         case OPC_BLEZL:
4626             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
4627             MIPS_DEBUG("blezl %s, " TARGET_FMT_lx, regnames[rs], btgt);
4628             goto likely;
4629         case OPC_BLTZ:
4630             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
4631             MIPS_DEBUG("bltz %s, " TARGET_FMT_lx, regnames[rs], btgt);
4632             goto not_likely;
4633         case OPC_BLTZL:
4634             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
4635             MIPS_DEBUG("bltzl %s, " TARGET_FMT_lx, regnames[rs], btgt);
4636             goto likely;
4637         case OPC_BPOSGE32:
4638             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
4639             MIPS_DEBUG("bposge32 " TARGET_FMT_lx, btgt);
4640             goto not_likely;
4641 #if defined(TARGET_MIPS64)
4642         case OPC_BPOSGE64:
4643             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 64);
4644             MIPS_DEBUG("bposge64 " TARGET_FMT_lx, btgt);
4645             goto not_likely;
4646 #endif
4647         case OPC_BLTZAL:
4648             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
4649             blink = 31;
4650             MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btgt);
4651         not_likely:
4652             ctx->hflags |= MIPS_HFLAG_BC;
4653             break;
4654         case OPC_BLTZALL:
4655             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
4656             blink = 31;
4657             MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btgt);
4658         likely:
4659             ctx->hflags |= MIPS_HFLAG_BL;
4660             break;
4661         default:
4662             MIPS_INVAL("conditional branch/jump");
4663             generate_exception(ctx, EXCP_RI);
4664             goto out;
4665         }
4666     }
4667     MIPS_DEBUG("enter ds: link %d cond %02x target " TARGET_FMT_lx,
4668                blink, ctx->hflags, btgt);
4669
4670     ctx->btarget = btgt;
4671
4672     switch (delayslot_size) {
4673     case 2:
4674         ctx->hflags |= MIPS_HFLAG_BDS16;
4675         break;
4676     case 4:
4677         ctx->hflags |= MIPS_HFLAG_BDS32;
4678         break;
4679     }
4680
4681     if (blink > 0) {
4682         int post_delay = insn_bytes + delayslot_size;
4683         int lowbit = !!(ctx->hflags & MIPS_HFLAG_M16);
4684
4685         tcg_gen_movi_tl(cpu_gpr[blink], ctx->pc + post_delay + lowbit);
4686     }
4687
4688  out:
4689     if (insn_bytes == 2)
4690         ctx->hflags |= MIPS_HFLAG_B16;
4691     tcg_temp_free(t0);
4692     tcg_temp_free(t1);
4693 }
4694
4695 /* special3 bitfield operations */
4696 static void gen_bitops (DisasContext *ctx, uint32_t opc, int rt,
4697                         int rs, int lsb, int msb)
4698 {
4699     TCGv t0 = tcg_temp_new();
4700     TCGv t1 = tcg_temp_new();
4701
4702     gen_load_gpr(t1, rs);
4703     switch (opc) {
4704     case OPC_EXT:
4705         if (lsb + msb > 31)
4706             goto fail;
4707         tcg_gen_shri_tl(t0, t1, lsb);
4708         if (msb != 31) {
4709             tcg_gen_andi_tl(t0, t0, (1 << (msb + 1)) - 1);
4710         } else {
4711             tcg_gen_ext32s_tl(t0, t0);
4712         }
4713         break;
4714 #if defined(TARGET_MIPS64)
4715     case OPC_DEXTM:
4716         tcg_gen_shri_tl(t0, t1, lsb);
4717         if (msb != 31) {
4718             tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1 + 32)) - 1);
4719         }
4720         break;
4721     case OPC_DEXTU:
4722         tcg_gen_shri_tl(t0, t1, lsb + 32);
4723         tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1)) - 1);
4724         break;
4725     case OPC_DEXT:
4726         tcg_gen_shri_tl(t0, t1, lsb);
4727         tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1)) - 1);
4728         break;
4729 #endif
4730     case OPC_INS:
4731         if (lsb > msb)
4732             goto fail;
4733         gen_load_gpr(t0, rt);
4734         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
4735         tcg_gen_ext32s_tl(t0, t0);
4736         break;
4737 #if defined(TARGET_MIPS64)
4738     case OPC_DINSM:
4739         gen_load_gpr(t0, rt);
4740         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb + 32 - lsb + 1);
4741         break;
4742     case OPC_DINSU:
4743         gen_load_gpr(t0, rt);
4744         tcg_gen_deposit_tl(t0, t0, t1, lsb + 32, msb - lsb + 1);
4745         break;
4746     case OPC_DINS:
4747         gen_load_gpr(t0, rt);
4748         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
4749         break;
4750 #endif
4751     default:
4752 fail:
4753         MIPS_INVAL("bitops");
4754         generate_exception(ctx, EXCP_RI);
4755         tcg_temp_free(t0);
4756         tcg_temp_free(t1);
4757         return;
4758     }
4759     gen_store_gpr(t0, rt);
4760     tcg_temp_free(t0);
4761     tcg_temp_free(t1);
4762 }
4763
4764 static void gen_bshfl (DisasContext *ctx, uint32_t op2, int rt, int rd)
4765 {
4766     TCGv t0;
4767
4768     if (rd == 0) {
4769         /* If no destination, treat it as a NOP. */
4770         MIPS_DEBUG("NOP");
4771         return;
4772     }
4773
4774     t0 = tcg_temp_new();
4775     gen_load_gpr(t0, rt);
4776     switch (op2) {
4777     case OPC_WSBH:
4778         {
4779             TCGv t1 = tcg_temp_new();
4780
4781             tcg_gen_shri_tl(t1, t0, 8);
4782             tcg_gen_andi_tl(t1, t1, 0x00FF00FF);
4783             tcg_gen_shli_tl(t0, t0, 8);
4784             tcg_gen_andi_tl(t0, t0, ~0x00FF00FF);
4785             tcg_gen_or_tl(t0, t0, t1);
4786             tcg_temp_free(t1);
4787             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
4788         }
4789         break;
4790     case OPC_SEB:
4791         tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
4792         break;
4793     case OPC_SEH:
4794         tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
4795         break;
4796 #if defined(TARGET_MIPS64)
4797     case OPC_DSBH:
4798         {
4799             TCGv t1 = tcg_temp_new();
4800
4801             tcg_gen_shri_tl(t1, t0, 8);
4802             tcg_gen_andi_tl(t1, t1, 0x00FF00FF00FF00FFULL);
4803             tcg_gen_shli_tl(t0, t0, 8);
4804             tcg_gen_andi_tl(t0, t0, ~0x00FF00FF00FF00FFULL);
4805             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
4806             tcg_temp_free(t1);
4807         }
4808         break;
4809     case OPC_DSHD:
4810         {
4811             TCGv t1 = tcg_temp_new();
4812
4813             tcg_gen_shri_tl(t1, t0, 16);
4814             tcg_gen_andi_tl(t1, t1, 0x0000FFFF0000FFFFULL);
4815             tcg_gen_shli_tl(t0, t0, 16);
4816             tcg_gen_andi_tl(t0, t0, ~0x0000FFFF0000FFFFULL);
4817             tcg_gen_or_tl(t0, t0, t1);
4818             tcg_gen_shri_tl(t1, t0, 32);
4819             tcg_gen_shli_tl(t0, t0, 32);
4820             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
4821             tcg_temp_free(t1);
4822         }
4823         break;
4824 #endif
4825     default:
4826         MIPS_INVAL("bsfhl");
4827         generate_exception(ctx, EXCP_RI);
4828         tcg_temp_free(t0);
4829         return;
4830     }
4831     tcg_temp_free(t0);
4832 }
4833
4834 #ifndef CONFIG_USER_ONLY
4835 /* CP0 (MMU and control) */
4836 static inline void gen_move_low32(TCGv ret, TCGv_i64 arg)
4837 {
4838 #if defined(TARGET_MIPS64)
4839     tcg_gen_ext32s_tl(ret, arg);
4840 #else
4841     tcg_gen_trunc_i64_tl(ret, arg);
4842 #endif
4843 }
4844
4845 static inline void gen_mfc0_load32 (TCGv arg, target_ulong off)
4846 {
4847     TCGv_i32 t0 = tcg_temp_new_i32();
4848
4849     tcg_gen_ld_i32(t0, cpu_env, off);
4850     tcg_gen_ext_i32_tl(arg, t0);
4851     tcg_temp_free_i32(t0);
4852 }
4853
4854 static inline void gen_mfc0_load64 (TCGv arg, target_ulong off)
4855 {
4856     tcg_gen_ld_tl(arg, cpu_env, off);
4857     tcg_gen_ext32s_tl(arg, arg);
4858 }
4859
4860 static inline void gen_mtc0_store32 (TCGv arg, target_ulong off)
4861 {
4862     TCGv_i32 t0 = tcg_temp_new_i32();
4863
4864     tcg_gen_trunc_tl_i32(t0, arg);
4865     tcg_gen_st_i32(t0, cpu_env, off);
4866     tcg_temp_free_i32(t0);
4867 }
4868
4869 static inline void gen_mtc0_store64 (TCGv arg, target_ulong off)
4870 {
4871     tcg_gen_ext32s_tl(arg, arg);
4872     tcg_gen_st_tl(arg, cpu_env, off);
4873 }
4874
4875 static inline void gen_mfc0_unimplemented(DisasContext *ctx, TCGv arg)
4876 {
4877     if (ctx->insn_flags & ISA_MIPS32R6) {
4878         tcg_gen_movi_tl(arg, 0);
4879     } else {
4880         tcg_gen_movi_tl(arg, ~0);
4881     }
4882 }
4883
4884 #define CP0_CHECK(c)                            \
4885     do {                                        \
4886         if (!(c)) {                             \
4887             goto cp0_unimplemented;             \
4888         }                                       \
4889     } while (0)
4890
4891 static void gen_mfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
4892 {
4893     const char *rn = "invalid";
4894
4895     if (sel != 0)
4896         check_insn(ctx, ISA_MIPS32);
4897
4898     switch (reg) {
4899     case 0:
4900         switch (sel) {
4901         case 0:
4902             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
4903             rn = "Index";
4904             break;
4905         case 1:
4906             CP0_CHECK(ctx->insn_flags & ASE_MT);
4907             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
4908             rn = "MVPControl";
4909             break;
4910         case 2:
4911             CP0_CHECK(ctx->insn_flags & ASE_MT);
4912             gen_helper_mfc0_mvpconf0(arg, cpu_env);
4913             rn = "MVPConf0";
4914             break;
4915         case 3:
4916             CP0_CHECK(ctx->insn_flags & ASE_MT);
4917             gen_helper_mfc0_mvpconf1(arg, cpu_env);
4918             rn = "MVPConf1";
4919             break;
4920         default:
4921             goto cp0_unimplemented;
4922         }
4923         break;
4924     case 1:
4925         switch (sel) {
4926         case 0:
4927             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
4928             gen_helper_mfc0_random(arg, cpu_env);
4929             rn = "Random";
4930             break;
4931         case 1:
4932             CP0_CHECK(ctx->insn_flags & ASE_MT);
4933             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
4934             rn = "VPEControl";
4935             break;
4936         case 2:
4937             CP0_CHECK(ctx->insn_flags & ASE_MT);
4938             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
4939             rn = "VPEConf0";
4940             break;
4941         case 3:
4942             CP0_CHECK(ctx->insn_flags & ASE_MT);
4943             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
4944             rn = "VPEConf1";
4945             break;
4946         case 4:
4947             CP0_CHECK(ctx->insn_flags & ASE_MT);
4948             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_YQMask));
4949             rn = "YQMask";
4950             break;
4951         case 5:
4952             CP0_CHECK(ctx->insn_flags & ASE_MT);
4953             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
4954             rn = "VPESchedule";
4955             break;
4956         case 6:
4957             CP0_CHECK(ctx->insn_flags & ASE_MT);
4958             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
4959             rn = "VPEScheFBack";
4960             break;
4961         case 7:
4962             CP0_CHECK(ctx->insn_flags & ASE_MT);
4963             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
4964             rn = "VPEOpt";
4965             break;
4966         default:
4967             goto cp0_unimplemented;
4968         }
4969         break;
4970     case 2:
4971         switch (sel) {
4972         case 0:
4973             {
4974                 TCGv_i64 tmp = tcg_temp_new_i64();
4975                 tcg_gen_ld_i64(tmp, cpu_env,
4976                                offsetof(CPUMIPSState, CP0_EntryLo0));
4977 #if defined(TARGET_MIPS64)
4978                 if (ctx->rxi) {
4979                     /* Move RI/XI fields to bits 31:30 */
4980                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
4981                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
4982                 }
4983 #endif
4984                 gen_move_low32(arg, tmp);
4985                 tcg_temp_free_i64(tmp);
4986             }
4987             rn = "EntryLo0";
4988             break;
4989         case 1:
4990             CP0_CHECK(ctx->insn_flags & ASE_MT);
4991             gen_helper_mfc0_tcstatus(arg, cpu_env);
4992             rn = "TCStatus";
4993             break;
4994         case 2:
4995             CP0_CHECK(ctx->insn_flags & ASE_MT);
4996             gen_helper_mfc0_tcbind(arg, cpu_env);
4997             rn = "TCBind";
4998             break;
4999         case 3:
5000             CP0_CHECK(ctx->insn_flags & ASE_MT);
5001             gen_helper_mfc0_tcrestart(arg, cpu_env);
5002             rn = "TCRestart";
5003             break;
5004         case 4:
5005             CP0_CHECK(ctx->insn_flags & ASE_MT);
5006             gen_helper_mfc0_tchalt(arg, cpu_env);
5007             rn = "TCHalt";
5008             break;
5009         case 5:
5010             CP0_CHECK(ctx->insn_flags & ASE_MT);
5011             gen_helper_mfc0_tccontext(arg, cpu_env);
5012             rn = "TCContext";
5013             break;
5014         case 6:
5015             CP0_CHECK(ctx->insn_flags & ASE_MT);
5016             gen_helper_mfc0_tcschedule(arg, cpu_env);
5017             rn = "TCSchedule";
5018             break;
5019         case 7:
5020             CP0_CHECK(ctx->insn_flags & ASE_MT);
5021             gen_helper_mfc0_tcschefback(arg, cpu_env);
5022             rn = "TCScheFBack";
5023             break;
5024         default:
5025             goto cp0_unimplemented;
5026         }
5027         break;
5028     case 3:
5029         switch (sel) {
5030         case 0:
5031             {
5032                 TCGv_i64 tmp = tcg_temp_new_i64();
5033                 tcg_gen_ld_i64(tmp, cpu_env,
5034                                offsetof(CPUMIPSState, CP0_EntryLo1));
5035 #if defined(TARGET_MIPS64)
5036                 if (ctx->rxi) {
5037                     /* Move RI/XI fields to bits 31:30 */
5038                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
5039                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
5040                 }
5041 #endif
5042                 gen_move_low32(arg, tmp);
5043                 tcg_temp_free_i64(tmp);
5044             }
5045             rn = "EntryLo1";
5046             break;
5047         default:
5048             goto cp0_unimplemented;
5049         }
5050         break;
5051     case 4:
5052         switch (sel) {
5053         case 0:
5054             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
5055             tcg_gen_ext32s_tl(arg, arg);
5056             rn = "Context";
5057             break;
5058         case 1:
5059 //            gen_helper_mfc0_contextconfig(arg); /* SmartMIPS ASE */
5060             rn = "ContextConfig";
5061             goto cp0_unimplemented;
5062 //            break;
5063         case 2:
5064             CP0_CHECK(ctx->ulri);
5065             tcg_gen_ld32s_tl(arg, cpu_env,
5066                              offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
5067             rn = "UserLocal";
5068             break;
5069         default:
5070             goto cp0_unimplemented;
5071         }
5072         break;
5073     case 5:
5074         switch (sel) {
5075         case 0:
5076             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
5077             rn = "PageMask";
5078             break;
5079         case 1:
5080             check_insn(ctx, ISA_MIPS32R2);
5081             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
5082             rn = "PageGrain";
5083             break;
5084         default:
5085             goto cp0_unimplemented;
5086         }
5087         break;
5088     case 6:
5089         switch (sel) {
5090         case 0:
5091             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
5092             rn = "Wired";
5093             break;
5094         case 1:
5095             check_insn(ctx, ISA_MIPS32R2);
5096             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
5097             rn = "SRSConf0";
5098             break;
5099         case 2:
5100             check_insn(ctx, ISA_MIPS32R2);
5101             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
5102             rn = "SRSConf1";
5103             break;
5104         case 3:
5105             check_insn(ctx, ISA_MIPS32R2);
5106             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
5107             rn = "SRSConf2";
5108             break;
5109         case 4:
5110             check_insn(ctx, ISA_MIPS32R2);
5111             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
5112             rn = "SRSConf3";
5113             break;
5114         case 5:
5115             check_insn(ctx, ISA_MIPS32R2);
5116             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
5117             rn = "SRSConf4";
5118             break;
5119         default:
5120             goto cp0_unimplemented;
5121         }
5122         break;
5123     case 7:
5124         switch (sel) {
5125         case 0:
5126             check_insn(ctx, ISA_MIPS32R2);
5127             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
5128             rn = "HWREna";
5129             break;
5130         default:
5131             goto cp0_unimplemented;
5132         }
5133         break;
5134     case 8:
5135         switch (sel) {
5136         case 0:
5137             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
5138             tcg_gen_ext32s_tl(arg, arg);
5139             rn = "BadVAddr";
5140             break;
5141         case 1:
5142             CP0_CHECK(ctx->bi);
5143             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
5144             rn = "BadInstr";
5145             break;
5146         case 2:
5147             CP0_CHECK(ctx->bp);
5148             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
5149             rn = "BadInstrP";
5150             break;
5151         default:
5152             goto cp0_unimplemented;
5153         }
5154         break;
5155     case 9:
5156         switch (sel) {
5157         case 0:
5158             /* Mark as an IO operation because we read the time.  */
5159             if (ctx->tb->cflags & CF_USE_ICOUNT) {
5160                 gen_io_start();
5161             }
5162             gen_helper_mfc0_count(arg, cpu_env);
5163             if (ctx->tb->cflags & CF_USE_ICOUNT) {
5164                 gen_io_end();
5165             }
5166             /* Break the TB to be able to take timer interrupts immediately
5167                after reading count.  */
5168             ctx->bstate = BS_STOP;
5169             rn = "Count";
5170             break;
5171         /* 6,7 are implementation dependent */
5172         default:
5173             goto cp0_unimplemented;
5174         }
5175         break;
5176     case 10:
5177         switch (sel) {
5178         case 0:
5179             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
5180             tcg_gen_ext32s_tl(arg, arg);
5181             rn = "EntryHi";
5182             break;
5183         default:
5184             goto cp0_unimplemented;
5185         }
5186         break;
5187     case 11:
5188         switch (sel) {
5189         case 0:
5190             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
5191             rn = "Compare";
5192             break;
5193         /* 6,7 are implementation dependent */
5194         default:
5195             goto cp0_unimplemented;
5196         }
5197         break;
5198     case 12:
5199         switch (sel) {
5200         case 0:
5201             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
5202             rn = "Status";
5203             break;
5204         case 1:
5205             check_insn(ctx, ISA_MIPS32R2);
5206             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
5207             rn = "IntCtl";
5208             break;
5209         case 2:
5210             check_insn(ctx, ISA_MIPS32R2);
5211             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
5212             rn = "SRSCtl";
5213             break;
5214         case 3:
5215             check_insn(ctx, ISA_MIPS32R2);
5216             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
5217             rn = "SRSMap";
5218             break;
5219         default:
5220             goto cp0_unimplemented;
5221        }
5222         break;
5223     case 13:
5224         switch (sel) {
5225         case 0:
5226             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
5227             rn = "Cause";
5228             break;
5229         default:
5230             goto cp0_unimplemented;
5231        }
5232         break;
5233     case 14:
5234         switch (sel) {
5235         case 0:
5236             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
5237             tcg_gen_ext32s_tl(arg, arg);
5238             rn = "EPC";
5239             break;
5240         default:
5241             goto cp0_unimplemented;
5242         }
5243         break;
5244     case 15:
5245         switch (sel) {
5246         case 0:
5247             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
5248             rn = "PRid";
5249             break;
5250         case 1:
5251             check_insn(ctx, ISA_MIPS32R2);
5252             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_EBase));
5253             rn = "EBase";
5254             break;
5255         default:
5256             goto cp0_unimplemented;
5257        }
5258         break;
5259     case 16:
5260         switch (sel) {
5261         case 0:
5262             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
5263             rn = "Config";
5264             break;
5265         case 1:
5266             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
5267             rn = "Config1";
5268             break;
5269         case 2:
5270             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
5271             rn = "Config2";
5272             break;
5273         case 3:
5274             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
5275             rn = "Config3";
5276             break;
5277         case 4:
5278             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
5279             rn = "Config4";
5280             break;
5281         case 5:
5282             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
5283             rn = "Config5";
5284             break;
5285         /* 6,7 are implementation dependent */
5286         case 6:
5287             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
5288             rn = "Config6";
5289             break;
5290         case 7:
5291             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
5292             rn = "Config7";
5293             break;
5294         default:
5295             goto cp0_unimplemented;
5296         }
5297         break;
5298     case 17:
5299         switch (sel) {
5300         case 0:
5301             gen_helper_mfc0_lladdr(arg, cpu_env);
5302             rn = "LLAddr";
5303             break;
5304         default:
5305             goto cp0_unimplemented;
5306         }
5307         break;
5308     case 18:
5309         switch (sel) {
5310         case 0 ... 7:
5311             gen_helper_1e0i(mfc0_watchlo, arg, sel);
5312             rn = "WatchLo";
5313             break;
5314         default:
5315             goto cp0_unimplemented;
5316         }
5317         break;
5318     case 19:
5319         switch (sel) {
5320         case 0 ...7:
5321             gen_helper_1e0i(mfc0_watchhi, arg, sel);
5322             rn = "WatchHi";
5323             break;
5324         default:
5325             goto cp0_unimplemented;
5326         }
5327         break;
5328     case 20:
5329         switch (sel) {
5330         case 0:
5331 #if defined(TARGET_MIPS64)
5332             check_insn(ctx, ISA_MIPS3);
5333             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
5334             tcg_gen_ext32s_tl(arg, arg);
5335             rn = "XContext";
5336             break;
5337 #endif
5338         default:
5339             goto cp0_unimplemented;
5340         }
5341         break;
5342     case 21:
5343        /* Officially reserved, but sel 0 is used for R1x000 framemask */
5344         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
5345         switch (sel) {
5346         case 0:
5347             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
5348             rn = "Framemask";
5349             break;
5350         default:
5351             goto cp0_unimplemented;
5352         }
5353         break;
5354     case 22:
5355         tcg_gen_movi_tl(arg, 0); /* unimplemented */
5356         rn = "'Diagnostic"; /* implementation dependent */
5357         break;
5358     case 23:
5359         switch (sel) {
5360         case 0:
5361             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
5362             rn = "Debug";
5363             break;
5364         case 1:
5365 //            gen_helper_mfc0_tracecontrol(arg); /* PDtrace support */
5366             rn = "TraceControl";
5367 //            break;
5368         case 2:
5369 //            gen_helper_mfc0_tracecontrol2(arg); /* PDtrace support */
5370             rn = "TraceControl2";
5371 //            break;
5372         case 3:
5373 //            gen_helper_mfc0_usertracedata(arg); /* PDtrace support */
5374             rn = "UserTraceData";
5375 //            break;
5376         case 4:
5377 //            gen_helper_mfc0_tracebpc(arg); /* PDtrace support */
5378             rn = "TraceBPC";
5379 //            break;
5380         default:
5381             goto cp0_unimplemented;
5382         }
5383         break;
5384     case 24:
5385         switch (sel) {
5386         case 0:
5387             /* EJTAG support */
5388             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
5389             tcg_gen_ext32s_tl(arg, arg);
5390             rn = "DEPC";
5391             break;
5392         default:
5393             goto cp0_unimplemented;
5394         }
5395         break;
5396     case 25:
5397         switch (sel) {
5398         case 0:
5399             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
5400             rn = "Performance0";
5401             break;
5402         case 1:
5403 //            gen_helper_mfc0_performance1(arg);
5404             rn = "Performance1";
5405 //            break;
5406         case 2:
5407 //            gen_helper_mfc0_performance2(arg);
5408             rn = "Performance2";
5409 //            break;
5410         case 3:
5411 //            gen_helper_mfc0_performance3(arg);
5412             rn = "Performance3";
5413 //            break;
5414         case 4:
5415 //            gen_helper_mfc0_performance4(arg);
5416             rn = "Performance4";
5417 //            break;
5418         case 5:
5419 //            gen_helper_mfc0_performance5(arg);
5420             rn = "Performance5";
5421 //            break;
5422         case 6:
5423 //            gen_helper_mfc0_performance6(arg);
5424             rn = "Performance6";
5425 //            break;
5426         case 7:
5427 //            gen_helper_mfc0_performance7(arg);
5428             rn = "Performance7";
5429 //            break;
5430         default:
5431             goto cp0_unimplemented;
5432         }
5433         break;
5434     case 26:
5435         tcg_gen_movi_tl(arg, 0); /* unimplemented */
5436         rn = "ECC";
5437         break;
5438     case 27:
5439         switch (sel) {
5440         case 0 ... 3:
5441             tcg_gen_movi_tl(arg, 0); /* unimplemented */
5442             rn = "CacheErr";
5443             break;
5444         default:
5445             goto cp0_unimplemented;
5446         }
5447         break;
5448     case 28:
5449         switch (sel) {
5450         case 0:
5451         case 2:
5452         case 4:
5453         case 6:
5454             {
5455                 TCGv_i64 tmp = tcg_temp_new_i64();
5456                 tcg_gen_ld_i64(tmp, cpu_env, offsetof(CPUMIPSState, CP0_TagLo));
5457                 gen_move_low32(arg, tmp);
5458                 tcg_temp_free_i64(tmp);
5459             }
5460             rn = "TagLo";
5461             break;
5462         case 1:
5463         case 3:
5464         case 5:
5465         case 7:
5466             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
5467             rn = "DataLo";
5468             break;
5469         default:
5470             goto cp0_unimplemented;
5471         }
5472         break;
5473     case 29:
5474         switch (sel) {
5475         case 0:
5476         case 2:
5477         case 4:
5478         case 6:
5479             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
5480             rn = "TagHi";
5481             break;
5482         case 1:
5483         case 3:
5484         case 5:
5485         case 7:
5486             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
5487             rn = "DataHi";
5488             break;
5489         default:
5490             goto cp0_unimplemented;
5491         }
5492         break;
5493     case 30:
5494         switch (sel) {
5495         case 0:
5496             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
5497             tcg_gen_ext32s_tl(arg, arg);
5498             rn = "ErrorEPC";
5499             break;
5500         default:
5501             goto cp0_unimplemented;
5502         }
5503         break;
5504     case 31:
5505         switch (sel) {
5506         case 0:
5507             /* EJTAG support */
5508             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
5509             rn = "DESAVE";
5510             break;
5511         case 2 ... 7:
5512             CP0_CHECK(ctx->kscrexist & (1 << sel));
5513             tcg_gen_ld_tl(arg, cpu_env,
5514                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
5515             tcg_gen_ext32s_tl(arg, arg);
5516             rn = "KScratch";
5517             break;
5518         default:
5519             goto cp0_unimplemented;
5520         }
5521         break;
5522     default:
5523        goto cp0_unimplemented;
5524     }
5525     (void)rn; /* avoid a compiler warning */
5526     LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
5527     return;
5528
5529 cp0_unimplemented:
5530     LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
5531     gen_mfc0_unimplemented(ctx, arg);
5532 }
5533
5534 static void gen_mtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5535 {
5536     const char *rn = "invalid";
5537
5538     if (sel != 0)
5539         check_insn(ctx, ISA_MIPS32);
5540
5541     if (ctx->tb->cflags & CF_USE_ICOUNT) {
5542         gen_io_start();
5543     }
5544
5545     switch (reg) {
5546     case 0:
5547         switch (sel) {
5548         case 0:
5549             gen_helper_mtc0_index(cpu_env, arg);
5550             rn = "Index";
5551             break;
5552         case 1:
5553             CP0_CHECK(ctx->insn_flags & ASE_MT);
5554             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
5555             rn = "MVPControl";
5556             break;
5557         case 2:
5558             CP0_CHECK(ctx->insn_flags & ASE_MT);
5559             /* ignored */
5560             rn = "MVPConf0";
5561             break;
5562         case 3:
5563             CP0_CHECK(ctx->insn_flags & ASE_MT);
5564             /* ignored */
5565             rn = "MVPConf1";
5566             break;
5567         default:
5568             goto cp0_unimplemented;
5569         }
5570         break;
5571     case 1:
5572         switch (sel) {
5573         case 0:
5574             /* ignored */
5575             rn = "Random";
5576             break;
5577         case 1:
5578             CP0_CHECK(ctx->insn_flags & ASE_MT);
5579             gen_helper_mtc0_vpecontrol(cpu_env, arg);
5580             rn = "VPEControl";
5581             break;
5582         case 2:
5583             CP0_CHECK(ctx->insn_flags & ASE_MT);
5584             gen_helper_mtc0_vpeconf0(cpu_env, arg);
5585             rn = "VPEConf0";
5586             break;
5587         case 3:
5588             CP0_CHECK(ctx->insn_flags & ASE_MT);
5589             gen_helper_mtc0_vpeconf1(cpu_env, arg);
5590             rn = "VPEConf1";
5591             break;
5592         case 4:
5593             CP0_CHECK(ctx->insn_flags & ASE_MT);
5594             gen_helper_mtc0_yqmask(cpu_env, arg);
5595             rn = "YQMask";
5596             break;
5597         case 5:
5598             CP0_CHECK(ctx->insn_flags & ASE_MT);
5599             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
5600             rn = "VPESchedule";
5601             break;
5602         case 6:
5603             CP0_CHECK(ctx->insn_flags & ASE_MT);
5604             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
5605             rn = "VPEScheFBack";
5606             break;
5607         case 7:
5608             CP0_CHECK(ctx->insn_flags & ASE_MT);
5609             gen_helper_mtc0_vpeopt(cpu_env, arg);
5610             rn = "VPEOpt";
5611             break;
5612         default:
5613             goto cp0_unimplemented;
5614         }
5615         break;
5616     case 2:
5617         switch (sel) {
5618         case 0:
5619             gen_helper_mtc0_entrylo0(cpu_env, arg);
5620             rn = "EntryLo0";
5621             break;
5622         case 1:
5623             CP0_CHECK(ctx->insn_flags & ASE_MT);
5624             gen_helper_mtc0_tcstatus(cpu_env, arg);
5625             rn = "TCStatus";
5626             break;
5627         case 2:
5628             CP0_CHECK(ctx->insn_flags & ASE_MT);
5629             gen_helper_mtc0_tcbind(cpu_env, arg);
5630             rn = "TCBind";
5631             break;
5632         case 3:
5633             CP0_CHECK(ctx->insn_flags & ASE_MT);
5634             gen_helper_mtc0_tcrestart(cpu_env, arg);
5635             rn = "TCRestart";
5636             break;
5637         case 4:
5638             CP0_CHECK(ctx->insn_flags & ASE_MT);
5639             gen_helper_mtc0_tchalt(cpu_env, arg);
5640             rn = "TCHalt";
5641             break;
5642         case 5:
5643             CP0_CHECK(ctx->insn_flags & ASE_MT);
5644             gen_helper_mtc0_tccontext(cpu_env, arg);
5645             rn = "TCContext";
5646             break;
5647         case 6:
5648             CP0_CHECK(ctx->insn_flags & ASE_MT);
5649             gen_helper_mtc0_tcschedule(cpu_env, arg);
5650             rn = "TCSchedule";
5651             break;
5652         case 7:
5653             CP0_CHECK(ctx->insn_flags & ASE_MT);
5654             gen_helper_mtc0_tcschefback(cpu_env, arg);
5655             rn = "TCScheFBack";
5656             break;
5657         default:
5658             goto cp0_unimplemented;
5659         }
5660         break;
5661     case 3:
5662         switch (sel) {
5663         case 0:
5664             gen_helper_mtc0_entrylo1(cpu_env, arg);
5665             rn = "EntryLo1";
5666             break;
5667         default:
5668             goto cp0_unimplemented;
5669         }
5670         break;
5671     case 4:
5672         switch (sel) {
5673         case 0:
5674             gen_helper_mtc0_context(cpu_env, arg);
5675             rn = "Context";
5676             break;
5677         case 1:
5678 //            gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
5679             rn = "ContextConfig";
5680             goto cp0_unimplemented;
5681 //            break;
5682         case 2:
5683             CP0_CHECK(ctx->ulri);
5684             tcg_gen_st_tl(arg, cpu_env,
5685                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
5686             rn = "UserLocal";
5687             break;
5688         default:
5689             goto cp0_unimplemented;
5690         }
5691         break;
5692     case 5:
5693         switch (sel) {
5694         case 0:
5695             gen_helper_mtc0_pagemask(cpu_env, arg);
5696             rn = "PageMask";
5697             break;
5698         case 1:
5699             check_insn(ctx, ISA_MIPS32R2);
5700             gen_helper_mtc0_pagegrain(cpu_env, arg);
5701             rn = "PageGrain";
5702             break;
5703         default:
5704             goto cp0_unimplemented;
5705         }
5706         break;
5707     case 6:
5708         switch (sel) {
5709         case 0:
5710             gen_helper_mtc0_wired(cpu_env, arg);
5711             rn = "Wired";
5712             break;
5713         case 1:
5714             check_insn(ctx, ISA_MIPS32R2);
5715             gen_helper_mtc0_srsconf0(cpu_env, arg);
5716             rn = "SRSConf0";
5717             break;
5718         case 2:
5719             check_insn(ctx, ISA_MIPS32R2);
5720             gen_helper_mtc0_srsconf1(cpu_env, arg);
5721             rn = "SRSConf1";
5722             break;
5723         case 3:
5724             check_insn(ctx, ISA_MIPS32R2);
5725             gen_helper_mtc0_srsconf2(cpu_env, arg);
5726             rn = "SRSConf2";
5727             break;
5728         case 4:
5729             check_insn(ctx, ISA_MIPS32R2);
5730             gen_helper_mtc0_srsconf3(cpu_env, arg);
5731             rn = "SRSConf3";
5732             break;
5733         case 5:
5734             check_insn(ctx, ISA_MIPS32R2);
5735             gen_helper_mtc0_srsconf4(cpu_env, arg);
5736             rn = "SRSConf4";
5737             break;
5738         default:
5739             goto cp0_unimplemented;
5740         }
5741         break;
5742     case 7:
5743         switch (sel) {
5744         case 0:
5745             check_insn(ctx, ISA_MIPS32R2);
5746             gen_helper_mtc0_hwrena(cpu_env, arg);
5747             ctx->bstate = BS_STOP;
5748             rn = "HWREna";
5749             break;
5750         default:
5751             goto cp0_unimplemented;
5752         }
5753         break;
5754     case 8:
5755         switch (sel) {
5756         case 0:
5757             /* ignored */
5758             rn = "BadVAddr";
5759             break;
5760         case 1:
5761             /* ignored */
5762             rn = "BadInstr";
5763             break;
5764         case 2:
5765             /* ignored */
5766             rn = "BadInstrP";
5767             break;
5768         default:
5769             goto cp0_unimplemented;
5770         }
5771         break;
5772     case 9:
5773         switch (sel) {
5774         case 0:
5775             gen_helper_mtc0_count(cpu_env, arg);
5776             rn = "Count";
5777             break;
5778         /* 6,7 are implementation dependent */
5779         default:
5780             goto cp0_unimplemented;
5781         }
5782         break;
5783     case 10:
5784         switch (sel) {
5785         case 0:
5786             gen_helper_mtc0_entryhi(cpu_env, arg);
5787             rn = "EntryHi";
5788             break;
5789         default:
5790             goto cp0_unimplemented;
5791         }
5792         break;
5793     case 11:
5794         switch (sel) {
5795         case 0:
5796             gen_helper_mtc0_compare(cpu_env, arg);
5797             rn = "Compare";
5798             break;
5799         /* 6,7 are implementation dependent */
5800         default:
5801             goto cp0_unimplemented;
5802         }
5803         break;
5804     case 12:
5805         switch (sel) {
5806         case 0:
5807             save_cpu_state(ctx, 1);
5808             gen_helper_mtc0_status(cpu_env, arg);
5809             /* BS_STOP isn't good enough here, hflags may have changed. */
5810             gen_save_pc(ctx->pc + 4);
5811             ctx->bstate = BS_EXCP;
5812             rn = "Status";
5813             break;
5814         case 1:
5815             check_insn(ctx, ISA_MIPS32R2);
5816             gen_helper_mtc0_intctl(cpu_env, arg);
5817             /* Stop translation as we may have switched the execution mode */
5818             ctx->bstate = BS_STOP;
5819             rn = "IntCtl";
5820             break;
5821         case 2:
5822             check_insn(ctx, ISA_MIPS32R2);
5823             gen_helper_mtc0_srsctl(cpu_env, arg);
5824             /* Stop translation as we may have switched the execution mode */
5825             ctx->bstate = BS_STOP;
5826             rn = "SRSCtl";
5827             break;
5828         case 3:
5829             check_insn(ctx, ISA_MIPS32R2);
5830             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
5831             /* Stop translation as we may have switched the execution mode */
5832             ctx->bstate = BS_STOP;
5833             rn = "SRSMap";
5834             break;
5835         default:
5836             goto cp0_unimplemented;
5837         }
5838         break;
5839     case 13:
5840         switch (sel) {
5841         case 0:
5842             save_cpu_state(ctx, 1);
5843             gen_helper_mtc0_cause(cpu_env, arg);
5844             rn = "Cause";
5845             break;
5846         default:
5847             goto cp0_unimplemented;
5848         }
5849         break;
5850     case 14:
5851         switch (sel) {
5852         case 0:
5853             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_EPC));
5854             rn = "EPC";
5855             break;
5856         default:
5857             goto cp0_unimplemented;
5858         }
5859         break;
5860     case 15:
5861         switch (sel) {
5862         case 0:
5863             /* ignored */
5864             rn = "PRid";
5865             break;
5866         case 1:
5867             check_insn(ctx, ISA_MIPS32R2);
5868             gen_helper_mtc0_ebase(cpu_env, arg);
5869             rn = "EBase";
5870             break;
5871         default:
5872             goto cp0_unimplemented;
5873         }
5874         break;
5875     case 16:
5876         switch (sel) {
5877         case 0:
5878             gen_helper_mtc0_config0(cpu_env, arg);
5879             rn = "Config";
5880             /* Stop translation as we may have switched the execution mode */
5881             ctx->bstate = BS_STOP;
5882             break;
5883         case 1:
5884             /* ignored, read only */
5885             rn = "Config1";
5886             break;
5887         case 2:
5888             gen_helper_mtc0_config2(cpu_env, arg);
5889             rn = "Config2";
5890             /* Stop translation as we may have switched the execution mode */
5891             ctx->bstate = BS_STOP;
5892             break;
5893         case 3:
5894             gen_helper_mtc0_config3(cpu_env, arg);
5895             rn = "Config3";
5896             /* Stop translation as we may have switched the execution mode */
5897             ctx->bstate = BS_STOP;
5898             break;
5899         case 4:
5900             gen_helper_mtc0_config4(cpu_env, arg);
5901             rn = "Config4";
5902             ctx->bstate = BS_STOP;
5903             break;
5904         case 5:
5905             gen_helper_mtc0_config5(cpu_env, arg);
5906             rn = "Config5";
5907             /* Stop translation as we may have switched the execution mode */
5908             ctx->bstate = BS_STOP;
5909             break;
5910         /* 6,7 are implementation dependent */
5911         case 6:
5912             /* ignored */
5913             rn = "Config6";
5914             break;
5915         case 7:
5916             /* ignored */
5917             rn = "Config7";
5918             break;
5919         default:
5920             rn = "Invalid config selector";
5921             goto cp0_unimplemented;
5922         }
5923         break;
5924     case 17:
5925         switch (sel) {
5926         case 0:
5927             gen_helper_mtc0_lladdr(cpu_env, arg);
5928             rn = "LLAddr";
5929             break;
5930         default:
5931             goto cp0_unimplemented;
5932         }
5933         break;
5934     case 18:
5935         switch (sel) {
5936         case 0 ... 7:
5937             gen_helper_0e1i(mtc0_watchlo, arg, sel);
5938             rn = "WatchLo";
5939             break;
5940         default:
5941             goto cp0_unimplemented;
5942         }
5943         break;
5944     case 19:
5945         switch (sel) {
5946         case 0 ... 7:
5947             gen_helper_0e1i(mtc0_watchhi, arg, sel);
5948             rn = "WatchHi";
5949             break;
5950         default:
5951             goto cp0_unimplemented;
5952         }
5953         break;
5954     case 20:
5955         switch (sel) {
5956         case 0:
5957 #if defined(TARGET_MIPS64)
5958             check_insn(ctx, ISA_MIPS3);
5959             gen_helper_mtc0_xcontext(cpu_env, arg);
5960             rn = "XContext";
5961             break;
5962 #endif
5963         default:
5964             goto cp0_unimplemented;
5965         }
5966         break;
5967     case 21:
5968        /* Officially reserved, but sel 0 is used for R1x000 framemask */
5969         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
5970         switch (sel) {
5971         case 0:
5972             gen_helper_mtc0_framemask(cpu_env, arg);
5973             rn = "Framemask";
5974             break;
5975         default:
5976             goto cp0_unimplemented;
5977         }
5978         break;
5979     case 22:
5980         /* ignored */
5981         rn = "Diagnostic"; /* implementation dependent */
5982         break;
5983     case 23:
5984         switch (sel) {
5985         case 0:
5986             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
5987             /* BS_STOP isn't good enough here, hflags may have changed. */
5988             gen_save_pc(ctx->pc + 4);
5989             ctx->bstate = BS_EXCP;
5990             rn = "Debug";
5991             break;
5992         case 1:
5993 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
5994             rn = "TraceControl";
5995             /* Stop translation as we may have switched the execution mode */
5996             ctx->bstate = BS_STOP;
5997 //            break;
5998         case 2:
5999 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
6000             rn = "TraceControl2";
6001             /* Stop translation as we may have switched the execution mode */
6002             ctx->bstate = BS_STOP;
6003 //            break;
6004         case 3:
6005             /* Stop translation as we may have switched the execution mode */
6006             ctx->bstate = BS_STOP;
6007 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
6008             rn = "UserTraceData";
6009             /* Stop translation as we may have switched the execution mode */
6010             ctx->bstate = BS_STOP;
6011 //            break;
6012         case 4:
6013 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
6014             /* Stop translation as we may have switched the execution mode */
6015             ctx->bstate = BS_STOP;
6016             rn = "TraceBPC";
6017 //            break;
6018         default:
6019             goto cp0_unimplemented;
6020         }
6021         break;
6022     case 24:
6023         switch (sel) {
6024         case 0:
6025             /* EJTAG support */
6026             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_DEPC));
6027             rn = "DEPC";
6028             break;
6029         default:
6030             goto cp0_unimplemented;
6031         }
6032         break;
6033     case 25:
6034         switch (sel) {
6035         case 0:
6036             gen_helper_mtc0_performance0(cpu_env, arg);
6037             rn = "Performance0";
6038             break;
6039         case 1:
6040 //            gen_helper_mtc0_performance1(arg);
6041             rn = "Performance1";
6042 //            break;
6043         case 2:
6044 //            gen_helper_mtc0_performance2(arg);
6045             rn = "Performance2";
6046 //            break;
6047         case 3:
6048 //            gen_helper_mtc0_performance3(arg);
6049             rn = "Performance3";
6050 //            break;
6051         case 4:
6052 //            gen_helper_mtc0_performance4(arg);
6053             rn = "Performance4";
6054 //            break;
6055         case 5:
6056 //            gen_helper_mtc0_performance5(arg);
6057             rn = "Performance5";
6058 //            break;
6059         case 6:
6060 //            gen_helper_mtc0_performance6(arg);
6061             rn = "Performance6";
6062 //            break;
6063         case 7:
6064 //            gen_helper_mtc0_performance7(arg);
6065             rn = "Performance7";
6066 //            break;
6067         default:
6068             goto cp0_unimplemented;
6069         }
6070        break;
6071     case 26:
6072         /* ignored */
6073         rn = "ECC";
6074         break;
6075     case 27:
6076         switch (sel) {
6077         case 0 ... 3:
6078             /* ignored */
6079             rn = "CacheErr";
6080             break;
6081         default:
6082             goto cp0_unimplemented;
6083         }
6084        break;
6085     case 28:
6086         switch (sel) {
6087         case 0:
6088         case 2:
6089         case 4:
6090         case 6:
6091             gen_helper_mtc0_taglo(cpu_env, arg);
6092             rn = "TagLo";
6093             break;
6094         case 1:
6095         case 3:
6096         case 5:
6097         case 7:
6098             gen_helper_mtc0_datalo(cpu_env, arg);
6099             rn = "DataLo";
6100             break;
6101         default:
6102             goto cp0_unimplemented;
6103         }
6104         break;
6105     case 29:
6106         switch (sel) {
6107         case 0:
6108         case 2:
6109         case 4:
6110         case 6:
6111             gen_helper_mtc0_taghi(cpu_env, arg);
6112             rn = "TagHi";
6113             break;
6114         case 1:
6115         case 3:
6116         case 5:
6117         case 7:
6118             gen_helper_mtc0_datahi(cpu_env, arg);
6119             rn = "DataHi";
6120             break;
6121         default:
6122             rn = "invalid sel";
6123             goto cp0_unimplemented;
6124         }
6125        break;
6126     case 30:
6127         switch (sel) {
6128         case 0:
6129             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_ErrorEPC));
6130             rn = "ErrorEPC";
6131             break;
6132         default:
6133             goto cp0_unimplemented;
6134         }
6135         break;
6136     case 31:
6137         switch (sel) {
6138         case 0:
6139             /* EJTAG support */
6140             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
6141             rn = "DESAVE";
6142             break;
6143         case 2 ... 7:
6144             CP0_CHECK(ctx->kscrexist & (1 << sel));
6145             tcg_gen_st_tl(arg, cpu_env,
6146                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
6147             rn = "KScratch";
6148             break;
6149         default:
6150             goto cp0_unimplemented;
6151         }
6152         /* Stop translation as we may have switched the execution mode */
6153         ctx->bstate = BS_STOP;
6154         break;
6155     default:
6156        goto cp0_unimplemented;
6157     }
6158     (void)rn; /* avoid a compiler warning */
6159     LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
6160     /* For simplicity assume that all writes can cause interrupts.  */
6161     if (ctx->tb->cflags & CF_USE_ICOUNT) {
6162         gen_io_end();
6163         ctx->bstate = BS_STOP;
6164     }
6165     return;
6166
6167 cp0_unimplemented:
6168     LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
6169 }
6170
6171 #if defined(TARGET_MIPS64)
6172 static void gen_dmfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6173 {
6174     const char *rn = "invalid";
6175
6176     if (sel != 0)
6177         check_insn(ctx, ISA_MIPS64);
6178
6179     switch (reg) {
6180     case 0:
6181         switch (sel) {
6182         case 0:
6183             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
6184             rn = "Index";
6185             break;
6186         case 1:
6187             CP0_CHECK(ctx->insn_flags & ASE_MT);
6188             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
6189             rn = "MVPControl";
6190             break;
6191         case 2:
6192             CP0_CHECK(ctx->insn_flags & ASE_MT);
6193             gen_helper_mfc0_mvpconf0(arg, cpu_env);
6194             rn = "MVPConf0";
6195             break;
6196         case 3:
6197             CP0_CHECK(ctx->insn_flags & ASE_MT);
6198             gen_helper_mfc0_mvpconf1(arg, cpu_env);
6199             rn = "MVPConf1";
6200             break;
6201         default:
6202             goto cp0_unimplemented;
6203         }
6204         break;
6205     case 1:
6206         switch (sel) {
6207         case 0:
6208             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
6209             gen_helper_mfc0_random(arg, cpu_env);
6210             rn = "Random";
6211             break;
6212         case 1:
6213             CP0_CHECK(ctx->insn_flags & ASE_MT);
6214             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
6215             rn = "VPEControl";
6216             break;
6217         case 2:
6218             CP0_CHECK(ctx->insn_flags & ASE_MT);
6219             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
6220             rn = "VPEConf0";
6221             break;
6222         case 3:
6223             CP0_CHECK(ctx->insn_flags & ASE_MT);
6224             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
6225             rn = "VPEConf1";
6226             break;
6227         case 4:
6228             CP0_CHECK(ctx->insn_flags & ASE_MT);
6229             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_YQMask));
6230             rn = "YQMask";
6231             break;
6232         case 5:
6233             CP0_CHECK(ctx->insn_flags & ASE_MT);
6234             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
6235             rn = "VPESchedule";
6236             break;
6237         case 6:
6238             CP0_CHECK(ctx->insn_flags & ASE_MT);
6239             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
6240             rn = "VPEScheFBack";
6241             break;
6242         case 7:
6243             CP0_CHECK(ctx->insn_flags & ASE_MT);
6244             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
6245             rn = "VPEOpt";
6246             break;
6247         default:
6248             goto cp0_unimplemented;
6249         }
6250         break;
6251     case 2:
6252         switch (sel) {
6253         case 0:
6254             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0));
6255             rn = "EntryLo0";
6256             break;
6257         case 1:
6258             CP0_CHECK(ctx->insn_flags & ASE_MT);
6259             gen_helper_mfc0_tcstatus(arg, cpu_env);
6260             rn = "TCStatus";
6261             break;
6262         case 2:
6263             CP0_CHECK(ctx->insn_flags & ASE_MT);
6264             gen_helper_mfc0_tcbind(arg, cpu_env);
6265             rn = "TCBind";
6266             break;
6267         case 3:
6268             CP0_CHECK(ctx->insn_flags & ASE_MT);
6269             gen_helper_dmfc0_tcrestart(arg, cpu_env);
6270             rn = "TCRestart";
6271             break;
6272         case 4:
6273             CP0_CHECK(ctx->insn_flags & ASE_MT);
6274             gen_helper_dmfc0_tchalt(arg, cpu_env);
6275             rn = "TCHalt";
6276             break;
6277         case 5:
6278             CP0_CHECK(ctx->insn_flags & ASE_MT);
6279             gen_helper_dmfc0_tccontext(arg, cpu_env);
6280             rn = "TCContext";
6281             break;
6282         case 6:
6283             CP0_CHECK(ctx->insn_flags & ASE_MT);
6284             gen_helper_dmfc0_tcschedule(arg, cpu_env);
6285             rn = "TCSchedule";
6286             break;
6287         case 7:
6288             CP0_CHECK(ctx->insn_flags & ASE_MT);
6289             gen_helper_dmfc0_tcschefback(arg, cpu_env);
6290             rn = "TCScheFBack";
6291             break;
6292         default:
6293             goto cp0_unimplemented;
6294         }
6295         break;
6296     case 3:
6297         switch (sel) {
6298         case 0:
6299             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
6300             rn = "EntryLo1";
6301             break;
6302         default:
6303             goto cp0_unimplemented;
6304         }
6305         break;
6306     case 4:
6307         switch (sel) {
6308         case 0:
6309             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
6310             rn = "Context";
6311             break;
6312         case 1:
6313 //            gen_helper_dmfc0_contextconfig(arg); /* SmartMIPS ASE */
6314             rn = "ContextConfig";
6315             goto cp0_unimplemented;
6316 //            break;
6317         case 2:
6318             CP0_CHECK(ctx->ulri);
6319             tcg_gen_ld_tl(arg, cpu_env,
6320                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
6321             rn = "UserLocal";
6322             break;
6323         default:
6324             goto cp0_unimplemented;
6325         }
6326         break;
6327     case 5:
6328         switch (sel) {
6329         case 0:
6330             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
6331             rn = "PageMask";
6332             break;
6333         case 1:
6334             check_insn(ctx, ISA_MIPS32R2);
6335             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
6336             rn = "PageGrain";
6337             break;
6338         default:
6339             goto cp0_unimplemented;
6340         }
6341         break;
6342     case 6:
6343         switch (sel) {
6344         case 0:
6345             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
6346             rn = "Wired";
6347             break;
6348         case 1:
6349             check_insn(ctx, ISA_MIPS32R2);
6350             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
6351             rn = "SRSConf0";
6352             break;
6353         case 2:
6354             check_insn(ctx, ISA_MIPS32R2);
6355             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
6356             rn = "SRSConf1";
6357             break;
6358         case 3:
6359             check_insn(ctx, ISA_MIPS32R2);
6360             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
6361             rn = "SRSConf2";
6362             break;
6363         case 4:
6364             check_insn(ctx, ISA_MIPS32R2);
6365             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
6366             rn = "SRSConf3";
6367             break;
6368         case 5:
6369             check_insn(ctx, ISA_MIPS32R2);
6370             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
6371             rn = "SRSConf4";
6372             break;
6373         default:
6374             goto cp0_unimplemented;
6375         }
6376         break;
6377     case 7:
6378         switch (sel) {
6379         case 0:
6380             check_insn(ctx, ISA_MIPS32R2);
6381             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
6382             rn = "HWREna";
6383             break;
6384         default:
6385             goto cp0_unimplemented;
6386         }
6387         break;
6388     case 8:
6389         switch (sel) {
6390         case 0:
6391             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
6392             rn = "BadVAddr";
6393             break;
6394         case 1:
6395             CP0_CHECK(ctx->bi);
6396             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
6397             rn = "BadInstr";
6398             break;
6399         case 2:
6400             CP0_CHECK(ctx->bp);
6401             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
6402             rn = "BadInstrP";
6403             break;
6404         default:
6405             goto cp0_unimplemented;
6406         }
6407         break;
6408     case 9:
6409         switch (sel) {
6410         case 0:
6411             /* Mark as an IO operation because we read the time.  */
6412             if (ctx->tb->cflags & CF_USE_ICOUNT) {
6413                 gen_io_start();
6414             }
6415             gen_helper_mfc0_count(arg, cpu_env);
6416             if (ctx->tb->cflags & CF_USE_ICOUNT) {
6417                 gen_io_end();
6418             }
6419             /* Break the TB to be able to take timer interrupts immediately
6420                after reading count.  */
6421             ctx->bstate = BS_STOP;
6422             rn = "Count";
6423             break;
6424         /* 6,7 are implementation dependent */
6425         default:
6426             goto cp0_unimplemented;
6427         }
6428         break;
6429     case 10:
6430         switch (sel) {
6431         case 0:
6432             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
6433             rn = "EntryHi";
6434             break;
6435         default:
6436             goto cp0_unimplemented;
6437         }
6438         break;
6439     case 11:
6440         switch (sel) {
6441         case 0:
6442             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
6443             rn = "Compare";
6444             break;
6445         /* 6,7 are implementation dependent */
6446         default:
6447             goto cp0_unimplemented;
6448         }
6449         break;
6450     case 12:
6451         switch (sel) {
6452         case 0:
6453             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
6454             rn = "Status";
6455             break;
6456         case 1:
6457             check_insn(ctx, ISA_MIPS32R2);
6458             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
6459             rn = "IntCtl";
6460             break;
6461         case 2:
6462             check_insn(ctx, ISA_MIPS32R2);
6463             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
6464             rn = "SRSCtl";
6465             break;
6466         case 3:
6467             check_insn(ctx, ISA_MIPS32R2);
6468             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
6469             rn = "SRSMap";
6470             break;
6471         default:
6472             goto cp0_unimplemented;
6473         }
6474         break;
6475     case 13:
6476         switch (sel) {
6477         case 0:
6478             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
6479             rn = "Cause";
6480             break;
6481         default:
6482             goto cp0_unimplemented;
6483         }
6484         break;
6485     case 14:
6486         switch (sel) {
6487         case 0:
6488             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
6489             rn = "EPC";
6490             break;
6491         default:
6492             goto cp0_unimplemented;
6493         }
6494         break;
6495     case 15:
6496         switch (sel) {
6497         case 0:
6498             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
6499             rn = "PRid";
6500             break;
6501         case 1:
6502             check_insn(ctx, ISA_MIPS32R2);
6503             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_EBase));
6504             rn = "EBase";
6505             break;
6506         default:
6507             goto cp0_unimplemented;
6508         }
6509         break;
6510     case 16:
6511         switch (sel) {
6512         case 0:
6513             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
6514             rn = "Config";
6515             break;
6516         case 1:
6517             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
6518             rn = "Config1";
6519             break;
6520         case 2:
6521             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
6522             rn = "Config2";
6523             break;
6524         case 3:
6525             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
6526             rn = "Config3";
6527             break;
6528         case 4:
6529             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
6530             rn = "Config4";
6531             break;
6532         case 5:
6533             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
6534             rn = "Config5";
6535             break;
6536        /* 6,7 are implementation dependent */
6537         case 6:
6538             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
6539             rn = "Config6";
6540             break;
6541         case 7:
6542             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
6543             rn = "Config7";
6544             break;
6545         default:
6546             goto cp0_unimplemented;
6547         }
6548         break;
6549     case 17:
6550         switch (sel) {
6551         case 0:
6552             gen_helper_dmfc0_lladdr(arg, cpu_env);
6553             rn = "LLAddr";
6554             break;
6555         default:
6556             goto cp0_unimplemented;
6557         }
6558         break;
6559     case 18:
6560         switch (sel) {
6561         case 0 ... 7:
6562             gen_helper_1e0i(dmfc0_watchlo, arg, sel);
6563             rn = "WatchLo";
6564             break;
6565         default:
6566             goto cp0_unimplemented;
6567         }
6568         break;
6569     case 19:
6570         switch (sel) {
6571         case 0 ... 7:
6572             gen_helper_1e0i(mfc0_watchhi, arg, sel);
6573             rn = "WatchHi";
6574             break;
6575         default:
6576             goto cp0_unimplemented;
6577         }
6578         break;
6579     case 20:
6580         switch (sel) {
6581         case 0:
6582             check_insn(ctx, ISA_MIPS3);
6583             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
6584             rn = "XContext";
6585             break;
6586         default:
6587             goto cp0_unimplemented;
6588         }
6589         break;
6590     case 21:
6591        /* Officially reserved, but sel 0 is used for R1x000 framemask */
6592         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
6593         switch (sel) {
6594         case 0:
6595             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
6596             rn = "Framemask";
6597             break;
6598         default:
6599             goto cp0_unimplemented;
6600         }
6601         break;
6602     case 22:
6603         tcg_gen_movi_tl(arg, 0); /* unimplemented */
6604         rn = "'Diagnostic"; /* implementation dependent */
6605         break;
6606     case 23:
6607         switch (sel) {
6608         case 0:
6609             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
6610             rn = "Debug";
6611             break;
6612         case 1:
6613 //            gen_helper_dmfc0_tracecontrol(arg, cpu_env); /* PDtrace support */
6614             rn = "TraceControl";
6615 //            break;
6616         case 2:
6617 //            gen_helper_dmfc0_tracecontrol2(arg, cpu_env); /* PDtrace support */
6618             rn = "TraceControl2";
6619 //            break;
6620         case 3:
6621 //            gen_helper_dmfc0_usertracedata(arg, cpu_env); /* PDtrace support */
6622             rn = "UserTraceData";
6623 //            break;
6624         case 4:
6625 //            gen_helper_dmfc0_tracebpc(arg, cpu_env); /* PDtrace support */
6626             rn = "TraceBPC";
6627 //            break;
6628         default:
6629             goto cp0_unimplemented;
6630         }
6631         break;
6632     case 24:
6633         switch (sel) {
6634         case 0:
6635             /* EJTAG support */
6636             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
6637             rn = "DEPC";
6638             break;
6639         default:
6640             goto cp0_unimplemented;
6641         }
6642         break;
6643     case 25:
6644         switch (sel) {
6645         case 0:
6646             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
6647             rn = "Performance0";
6648             break;
6649         case 1:
6650 //            gen_helper_dmfc0_performance1(arg);
6651             rn = "Performance1";
6652 //            break;
6653         case 2:
6654 //            gen_helper_dmfc0_performance2(arg);
6655             rn = "Performance2";
6656 //            break;
6657         case 3:
6658 //            gen_helper_dmfc0_performance3(arg);
6659             rn = "Performance3";
6660 //            break;
6661         case 4:
6662 //            gen_helper_dmfc0_performance4(arg);
6663             rn = "Performance4";
6664 //            break;
6665         case 5:
6666 //            gen_helper_dmfc0_performance5(arg);
6667             rn = "Performance5";
6668 //            break;
6669         case 6:
6670 //            gen_helper_dmfc0_performance6(arg);
6671             rn = "Performance6";
6672 //            break;
6673         case 7:
6674 //            gen_helper_dmfc0_performance7(arg);
6675             rn = "Performance7";
6676 //            break;
6677         default:
6678             goto cp0_unimplemented;
6679         }
6680         break;
6681     case 26:
6682         tcg_gen_movi_tl(arg, 0); /* unimplemented */
6683         rn = "ECC";
6684         break;
6685     case 27:
6686         switch (sel) {
6687         /* ignored */
6688         case 0 ... 3:
6689             tcg_gen_movi_tl(arg, 0); /* unimplemented */
6690             rn = "CacheErr";
6691             break;
6692         default:
6693             goto cp0_unimplemented;
6694         }
6695         break;
6696     case 28:
6697         switch (sel) {
6698         case 0:
6699         case 2:
6700         case 4:
6701         case 6:
6702             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
6703             rn = "TagLo";
6704             break;
6705         case 1:
6706         case 3:
6707         case 5:
6708         case 7:
6709             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
6710             rn = "DataLo";
6711             break;
6712         default:
6713             goto cp0_unimplemented;
6714         }
6715         break;
6716     case 29:
6717         switch (sel) {
6718         case 0:
6719         case 2:
6720         case 4:
6721         case 6:
6722             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
6723             rn = "TagHi";
6724             break;
6725         case 1:
6726         case 3:
6727         case 5:
6728         case 7:
6729             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
6730             rn = "DataHi";
6731             break;
6732         default:
6733             goto cp0_unimplemented;
6734         }
6735         break;
6736     case 30:
6737         switch (sel) {
6738         case 0:
6739             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
6740             rn = "ErrorEPC";
6741             break;
6742         default:
6743             goto cp0_unimplemented;
6744         }
6745         break;
6746     case 31:
6747         switch (sel) {
6748         case 0:
6749             /* EJTAG support */
6750             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
6751             rn = "DESAVE";
6752             break;
6753         case 2 ... 7:
6754             CP0_CHECK(ctx->kscrexist & (1 << sel));
6755             tcg_gen_ld_tl(arg, cpu_env,
6756                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
6757             rn = "KScratch";
6758             break;
6759         default:
6760             goto cp0_unimplemented;
6761         }
6762         break;
6763     default:
6764         goto cp0_unimplemented;
6765     }
6766     (void)rn; /* avoid a compiler warning */
6767     LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
6768     return;
6769
6770 cp0_unimplemented:
6771     LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
6772     gen_mfc0_unimplemented(ctx, arg);
6773 }
6774
6775 static void gen_dmtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6776 {
6777     const char *rn = "invalid";
6778
6779     if (sel != 0)
6780         check_insn(ctx, ISA_MIPS64);
6781
6782     if (ctx->tb->cflags & CF_USE_ICOUNT) {
6783         gen_io_start();
6784     }
6785
6786     switch (reg) {
6787     case 0:
6788         switch (sel) {
6789         case 0:
6790             gen_helper_mtc0_index(cpu_env, arg);
6791             rn = "Index";
6792             break;
6793         case 1:
6794             CP0_CHECK(ctx->insn_flags & ASE_MT);
6795             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
6796             rn = "MVPControl";
6797             break;
6798         case 2:
6799             CP0_CHECK(ctx->insn_flags & ASE_MT);
6800             /* ignored */
6801             rn = "MVPConf0";
6802             break;
6803         case 3:
6804             CP0_CHECK(ctx->insn_flags & ASE_MT);
6805             /* ignored */
6806             rn = "MVPConf1";
6807             break;
6808         default:
6809             goto cp0_unimplemented;
6810         }
6811         break;
6812     case 1:
6813         switch (sel) {
6814         case 0:
6815             /* ignored */
6816             rn = "Random";
6817             break;
6818         case 1:
6819             CP0_CHECK(ctx->insn_flags & ASE_MT);
6820             gen_helper_mtc0_vpecontrol(cpu_env, arg);
6821             rn = "VPEControl";
6822             break;
6823         case 2:
6824             CP0_CHECK(ctx->insn_flags & ASE_MT);
6825             gen_helper_mtc0_vpeconf0(cpu_env, arg);
6826             rn = "VPEConf0";
6827             break;
6828         case 3:
6829             CP0_CHECK(ctx->insn_flags & ASE_MT);
6830             gen_helper_mtc0_vpeconf1(cpu_env, arg);
6831             rn = "VPEConf1";
6832             break;
6833         case 4:
6834             CP0_CHECK(ctx->insn_flags & ASE_MT);
6835             gen_helper_mtc0_yqmask(cpu_env, arg);
6836             rn = "YQMask";
6837             break;
6838         case 5:
6839             CP0_CHECK(ctx->insn_flags & ASE_MT);
6840             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
6841             rn = "VPESchedule";
6842             break;
6843         case 6:
6844             CP0_CHECK(ctx->insn_flags & ASE_MT);
6845             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
6846             rn = "VPEScheFBack";
6847             break;
6848         case 7:
6849             CP0_CHECK(ctx->insn_flags & ASE_MT);
6850             gen_helper_mtc0_vpeopt(cpu_env, arg);
6851             rn = "VPEOpt";
6852             break;
6853         default:
6854             goto cp0_unimplemented;
6855         }
6856         break;
6857     case 2:
6858         switch (sel) {
6859         case 0:
6860             gen_helper_dmtc0_entrylo0(cpu_env, arg);
6861             rn = "EntryLo0";
6862             break;
6863         case 1:
6864             CP0_CHECK(ctx->insn_flags & ASE_MT);
6865             gen_helper_mtc0_tcstatus(cpu_env, arg);
6866             rn = "TCStatus";
6867             break;
6868         case 2:
6869             CP0_CHECK(ctx->insn_flags & ASE_MT);
6870             gen_helper_mtc0_tcbind(cpu_env, arg);
6871             rn = "TCBind";
6872             break;
6873         case 3:
6874             CP0_CHECK(ctx->insn_flags & ASE_MT);
6875             gen_helper_mtc0_tcrestart(cpu_env, arg);
6876             rn = "TCRestart";
6877             break;
6878         case 4:
6879             CP0_CHECK(ctx->insn_flags & ASE_MT);
6880             gen_helper_mtc0_tchalt(cpu_env, arg);
6881             rn = "TCHalt";
6882             break;
6883         case 5:
6884             CP0_CHECK(ctx->insn_flags & ASE_MT);
6885             gen_helper_mtc0_tccontext(cpu_env, arg);
6886             rn = "TCContext";
6887             break;
6888         case 6:
6889             CP0_CHECK(ctx->insn_flags & ASE_MT);
6890             gen_helper_mtc0_tcschedule(cpu_env, arg);
6891             rn = "TCSchedule";
6892             break;
6893         case 7:
6894             CP0_CHECK(ctx->insn_flags & ASE_MT);
6895             gen_helper_mtc0_tcschefback(cpu_env, arg);
6896             rn = "TCScheFBack";
6897             break;
6898         default:
6899             goto cp0_unimplemented;
6900         }
6901         break;
6902     case 3:
6903         switch (sel) {
6904         case 0:
6905             gen_helper_dmtc0_entrylo1(cpu_env, arg);
6906             rn = "EntryLo1";
6907             break;
6908         default:
6909             goto cp0_unimplemented;
6910         }
6911         break;
6912     case 4:
6913         switch (sel) {
6914         case 0:
6915             gen_helper_mtc0_context(cpu_env, arg);
6916             rn = "Context";
6917             break;
6918         case 1:
6919 //           gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
6920             rn = "ContextConfig";
6921             goto cp0_unimplemented;
6922 //           break;
6923         case 2:
6924             CP0_CHECK(ctx->ulri);
6925             tcg_gen_st_tl(arg, cpu_env,
6926                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
6927             rn = "UserLocal";
6928             break;
6929         default:
6930             goto cp0_unimplemented;
6931         }
6932         break;
6933     case 5:
6934         switch (sel) {
6935         case 0:
6936             gen_helper_mtc0_pagemask(cpu_env, arg);
6937             rn = "PageMask";
6938             break;
6939         case 1:
6940             check_insn(ctx, ISA_MIPS32R2);
6941             gen_helper_mtc0_pagegrain(cpu_env, arg);
6942             rn = "PageGrain";
6943             break;
6944         default:
6945             goto cp0_unimplemented;
6946         }
6947         break;
6948     case 6:
6949         switch (sel) {
6950         case 0:
6951             gen_helper_mtc0_wired(cpu_env, arg);
6952             rn = "Wired";
6953             break;
6954         case 1:
6955             check_insn(ctx, ISA_MIPS32R2);
6956             gen_helper_mtc0_srsconf0(cpu_env, arg);
6957             rn = "SRSConf0";
6958             break;
6959         case 2:
6960             check_insn(ctx, ISA_MIPS32R2);
6961             gen_helper_mtc0_srsconf1(cpu_env, arg);
6962             rn = "SRSConf1";
6963             break;
6964         case 3:
6965             check_insn(ctx, ISA_MIPS32R2);
6966             gen_helper_mtc0_srsconf2(cpu_env, arg);
6967             rn = "SRSConf2";
6968             break;
6969         case 4:
6970             check_insn(ctx, ISA_MIPS32R2);
6971             gen_helper_mtc0_srsconf3(cpu_env, arg);
6972             rn = "SRSConf3";
6973             break;
6974         case 5:
6975             check_insn(ctx, ISA_MIPS32R2);
6976             gen_helper_mtc0_srsconf4(cpu_env, arg);
6977             rn = "SRSConf4";
6978             break;
6979         default:
6980             goto cp0_unimplemented;
6981         }
6982         break;
6983     case 7:
6984         switch (sel) {
6985         case 0:
6986             check_insn(ctx, ISA_MIPS32R2);
6987             gen_helper_mtc0_hwrena(cpu_env, arg);
6988             ctx->bstate = BS_STOP;
6989             rn = "HWREna";
6990             break;
6991         default:
6992             goto cp0_unimplemented;
6993         }
6994         break;
6995     case 8:
6996         switch (sel) {
6997         case 0:
6998             /* ignored */
6999             rn = "BadVAddr";
7000             break;
7001         case 1:
7002             /* ignored */
7003             rn = "BadInstr";
7004             break;
7005         case 2:
7006             /* ignored */
7007             rn = "BadInstrP";
7008             break;
7009         default:
7010             goto cp0_unimplemented;
7011         }
7012         break;
7013     case 9:
7014         switch (sel) {
7015         case 0:
7016             gen_helper_mtc0_count(cpu_env, arg);
7017             rn = "Count";
7018             break;
7019         /* 6,7 are implementation dependent */
7020         default:
7021             goto cp0_unimplemented;
7022         }
7023         /* Stop translation as we may have switched the execution mode */
7024         ctx->bstate = BS_STOP;
7025         break;
7026     case 10:
7027         switch (sel) {
7028         case 0:
7029             gen_helper_mtc0_entryhi(cpu_env, arg);
7030             rn = "EntryHi";
7031             break;
7032         default:
7033             goto cp0_unimplemented;
7034         }
7035         break;
7036     case 11:
7037         switch (sel) {
7038         case 0:
7039             gen_helper_mtc0_compare(cpu_env, arg);
7040             rn = "Compare";
7041             break;
7042         /* 6,7 are implementation dependent */
7043         default:
7044             goto cp0_unimplemented;
7045         }
7046         /* Stop translation as we may have switched the execution mode */
7047         ctx->bstate = BS_STOP;
7048         break;
7049     case 12:
7050         switch (sel) {
7051         case 0:
7052             save_cpu_state(ctx, 1);
7053             gen_helper_mtc0_status(cpu_env, arg);
7054             /* BS_STOP isn't good enough here, hflags may have changed. */
7055             gen_save_pc(ctx->pc + 4);
7056             ctx->bstate = BS_EXCP;
7057             rn = "Status";
7058             break;
7059         case 1:
7060             check_insn(ctx, ISA_MIPS32R2);
7061             gen_helper_mtc0_intctl(cpu_env, arg);
7062             /* Stop translation as we may have switched the execution mode */
7063             ctx->bstate = BS_STOP;
7064             rn = "IntCtl";
7065             break;
7066         case 2:
7067             check_insn(ctx, ISA_MIPS32R2);
7068             gen_helper_mtc0_srsctl(cpu_env, arg);
7069             /* Stop translation as we may have switched the execution mode */
7070             ctx->bstate = BS_STOP;
7071             rn = "SRSCtl";
7072             break;
7073         case 3:
7074             check_insn(ctx, ISA_MIPS32R2);
7075             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
7076             /* Stop translation as we may have switched the execution mode */
7077             ctx->bstate = BS_STOP;
7078             rn = "SRSMap";
7079             break;
7080         default:
7081             goto cp0_unimplemented;
7082         }
7083         break;
7084     case 13:
7085         switch (sel) {
7086         case 0:
7087             save_cpu_state(ctx, 1);
7088             /* Mark as an IO operation because we may trigger a software
7089                interrupt.  */
7090             if (ctx->tb->cflags & CF_USE_ICOUNT) {
7091                 gen_io_start();
7092             }
7093             gen_helper_mtc0_cause(cpu_env, arg);
7094             if (ctx->tb->cflags & CF_USE_ICOUNT) {
7095                 gen_io_end();
7096             }
7097             /* Stop translation as we may have triggered an intetrupt */
7098             ctx->bstate = BS_STOP;
7099             rn = "Cause";
7100             break;
7101         default:
7102             goto cp0_unimplemented;
7103         }
7104         break;
7105     case 14:
7106         switch (sel) {
7107         case 0:
7108             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
7109             rn = "EPC";
7110             break;
7111         default:
7112             goto cp0_unimplemented;
7113         }
7114         break;
7115     case 15:
7116         switch (sel) {
7117         case 0:
7118             /* ignored */
7119             rn = "PRid";
7120             break;
7121         case 1:
7122             check_insn(ctx, ISA_MIPS32R2);
7123             gen_helper_mtc0_ebase(cpu_env, arg);
7124             rn = "EBase";
7125             break;
7126         default:
7127             goto cp0_unimplemented;
7128         }
7129         break;
7130     case 16:
7131         switch (sel) {
7132         case 0:
7133             gen_helper_mtc0_config0(cpu_env, arg);
7134             rn = "Config";
7135             /* Stop translation as we may have switched the execution mode */
7136             ctx->bstate = BS_STOP;
7137             break;
7138         case 1:
7139             /* ignored, read only */
7140             rn = "Config1";
7141             break;
7142         case 2:
7143             gen_helper_mtc0_config2(cpu_env, arg);
7144             rn = "Config2";
7145             /* Stop translation as we may have switched the execution mode */
7146             ctx->bstate = BS_STOP;
7147             break;
7148         case 3:
7149             gen_helper_mtc0_config3(cpu_env, arg);
7150             rn = "Config3";
7151             /* Stop translation as we may have switched the execution mode */
7152             ctx->bstate = BS_STOP;
7153             break;
7154         case 4:
7155             /* currently ignored */
7156             rn = "Config4";
7157             break;
7158         case 5:
7159             gen_helper_mtc0_config5(cpu_env, arg);
7160             rn = "Config5";
7161             /* Stop translation as we may have switched the execution mode */
7162             ctx->bstate = BS_STOP;
7163             break;
7164         /* 6,7 are implementation dependent */
7165         default:
7166             rn = "Invalid config selector";
7167             goto cp0_unimplemented;
7168         }
7169         break;
7170     case 17:
7171         switch (sel) {
7172         case 0:
7173             gen_helper_mtc0_lladdr(cpu_env, arg);
7174             rn = "LLAddr";
7175             break;
7176         default:
7177             goto cp0_unimplemented;
7178         }
7179         break;
7180     case 18:
7181         switch (sel) {
7182         case 0 ... 7:
7183             gen_helper_0e1i(mtc0_watchlo, arg, sel);
7184             rn = "WatchLo";
7185             break;
7186         default:
7187             goto cp0_unimplemented;
7188         }
7189         break;
7190     case 19:
7191         switch (sel) {
7192         case 0 ... 7:
7193             gen_helper_0e1i(mtc0_watchhi, arg, sel);
7194             rn = "WatchHi";
7195             break;
7196         default:
7197             goto cp0_unimplemented;
7198         }
7199         break;
7200     case 20:
7201         switch (sel) {
7202         case 0:
7203             check_insn(ctx, ISA_MIPS3);
7204             gen_helper_mtc0_xcontext(cpu_env, arg);
7205             rn = "XContext";
7206             break;
7207         default:
7208             goto cp0_unimplemented;
7209         }
7210         break;
7211     case 21:
7212        /* Officially reserved, but sel 0 is used for R1x000 framemask */
7213         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
7214         switch (sel) {
7215         case 0:
7216             gen_helper_mtc0_framemask(cpu_env, arg);
7217             rn = "Framemask";
7218             break;
7219         default:
7220             goto cp0_unimplemented;
7221         }
7222         break;
7223     case 22:
7224         /* ignored */
7225         rn = "Diagnostic"; /* implementation dependent */
7226         break;
7227     case 23:
7228         switch (sel) {
7229         case 0:
7230             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
7231             /* BS_STOP isn't good enough here, hflags may have changed. */
7232             gen_save_pc(ctx->pc + 4);
7233             ctx->bstate = BS_EXCP;
7234             rn = "Debug";
7235             break;
7236         case 1:
7237 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
7238             /* Stop translation as we may have switched the execution mode */
7239             ctx->bstate = BS_STOP;
7240             rn = "TraceControl";
7241 //            break;
7242         case 2:
7243 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
7244             /* Stop translation as we may have switched the execution mode */
7245             ctx->bstate = BS_STOP;
7246             rn = "TraceControl2";
7247 //            break;
7248         case 3:
7249 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
7250             /* Stop translation as we may have switched the execution mode */
7251             ctx->bstate = BS_STOP;
7252             rn = "UserTraceData";
7253 //            break;
7254         case 4:
7255 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
7256             /* Stop translation as we may have switched the execution mode */
7257             ctx->bstate = BS_STOP;
7258             rn = "TraceBPC";
7259 //            break;
7260         default:
7261             goto cp0_unimplemented;
7262         }
7263         break;
7264     case 24:
7265         switch (sel) {
7266         case 0:
7267             /* EJTAG support */
7268             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
7269             rn = "DEPC";
7270             break;
7271         default:
7272             goto cp0_unimplemented;
7273         }
7274         break;
7275     case 25:
7276         switch (sel) {
7277         case 0:
7278             gen_helper_mtc0_performance0(cpu_env, arg);
7279             rn = "Performance0";
7280             break;
7281         case 1:
7282 //            gen_helper_mtc0_performance1(cpu_env, arg);
7283             rn = "Performance1";
7284 //            break;
7285         case 2:
7286 //            gen_helper_mtc0_performance2(cpu_env, arg);
7287             rn = "Performance2";
7288 //            break;
7289         case 3:
7290 //            gen_helper_mtc0_performance3(cpu_env, arg);
7291             rn = "Performance3";
7292 //            break;
7293         case 4:
7294 //            gen_helper_mtc0_performance4(cpu_env, arg);
7295             rn = "Performance4";
7296 //            break;
7297         case 5:
7298 //            gen_helper_mtc0_performance5(cpu_env, arg);
7299             rn = "Performance5";
7300 //            break;
7301         case 6:
7302 //            gen_helper_mtc0_performance6(cpu_env, arg);
7303             rn = "Performance6";
7304 //            break;
7305         case 7:
7306 //            gen_helper_mtc0_performance7(cpu_env, arg);
7307             rn = "Performance7";
7308 //            break;
7309         default:
7310             goto cp0_unimplemented;
7311         }
7312         break;
7313     case 26:
7314         /* ignored */
7315         rn = "ECC";
7316         break;
7317     case 27:
7318         switch (sel) {
7319         case 0 ... 3:
7320             /* ignored */
7321             rn = "CacheErr";
7322             break;
7323         default:
7324             goto cp0_unimplemented;
7325         }
7326         break;
7327     case 28:
7328         switch (sel) {
7329         case 0:
7330         case 2:
7331         case 4:
7332         case 6:
7333             gen_helper_mtc0_taglo(cpu_env, arg);
7334             rn = "TagLo";
7335             break;
7336         case 1:
7337         case 3:
7338         case 5:
7339         case 7:
7340             gen_helper_mtc0_datalo(cpu_env, arg);
7341             rn = "DataLo";
7342             break;
7343         default:
7344             goto cp0_unimplemented;
7345         }
7346         break;
7347     case 29:
7348         switch (sel) {
7349         case 0:
7350         case 2:
7351         case 4:
7352         case 6:
7353             gen_helper_mtc0_taghi(cpu_env, arg);
7354             rn = "TagHi";
7355             break;
7356         case 1:
7357         case 3:
7358         case 5:
7359         case 7:
7360             gen_helper_mtc0_datahi(cpu_env, arg);
7361             rn = "DataHi";
7362             break;
7363         default:
7364             rn = "invalid sel";
7365             goto cp0_unimplemented;
7366         }
7367         break;
7368     case 30:
7369         switch (sel) {
7370         case 0:
7371             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
7372             rn = "ErrorEPC";
7373             break;
7374         default:
7375             goto cp0_unimplemented;
7376         }
7377         break;
7378     case 31:
7379         switch (sel) {
7380         case 0:
7381             /* EJTAG support */
7382             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
7383             rn = "DESAVE";
7384             break;
7385         case 2 ... 7:
7386             CP0_CHECK(ctx->kscrexist & (1 << sel));
7387             tcg_gen_st_tl(arg, cpu_env,
7388                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
7389             rn = "KScratch";
7390             break;
7391         default:
7392             goto cp0_unimplemented;
7393         }
7394         /* Stop translation as we may have switched the execution mode */
7395         ctx->bstate = BS_STOP;
7396         break;
7397     default:
7398         goto cp0_unimplemented;
7399     }
7400     (void)rn; /* avoid a compiler warning */
7401     LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
7402     /* For simplicity assume that all writes can cause interrupts.  */
7403     if (ctx->tb->cflags & CF_USE_ICOUNT) {
7404         gen_io_end();
7405         ctx->bstate = BS_STOP;
7406     }
7407     return;
7408
7409 cp0_unimplemented:
7410     LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
7411 }
7412 #endif /* TARGET_MIPS64 */
7413
7414 static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd,
7415                      int u, int sel, int h)
7416 {
7417     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
7418     TCGv t0 = tcg_temp_local_new();
7419
7420     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
7421         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
7422          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
7423         tcg_gen_movi_tl(t0, -1);
7424     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
7425              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
7426         tcg_gen_movi_tl(t0, -1);
7427     else if (u == 0) {
7428         switch (rt) {
7429         case 1:
7430             switch (sel) {
7431             case 1:
7432                 gen_helper_mftc0_vpecontrol(t0, cpu_env);
7433                 break;
7434             case 2:
7435                 gen_helper_mftc0_vpeconf0(t0, cpu_env);
7436                 break;
7437             default:
7438                 goto die;
7439                 break;
7440             }
7441             break;
7442         case 2:
7443             switch (sel) {
7444             case 1:
7445                 gen_helper_mftc0_tcstatus(t0, cpu_env);
7446                 break;
7447             case 2:
7448                 gen_helper_mftc0_tcbind(t0, cpu_env);
7449                 break;
7450             case 3:
7451                 gen_helper_mftc0_tcrestart(t0, cpu_env);
7452                 break;
7453             case 4:
7454                 gen_helper_mftc0_tchalt(t0, cpu_env);
7455                 break;
7456             case 5:
7457                 gen_helper_mftc0_tccontext(t0, cpu_env);
7458                 break;
7459             case 6:
7460                 gen_helper_mftc0_tcschedule(t0, cpu_env);
7461                 break;
7462             case 7:
7463                 gen_helper_mftc0_tcschefback(t0, cpu_env);
7464                 break;
7465             default:
7466                 gen_mfc0(ctx, t0, rt, sel);
7467                 break;
7468             }
7469             break;
7470         case 10:
7471             switch (sel) {
7472             case 0:
7473                 gen_helper_mftc0_entryhi(t0, cpu_env);
7474                 break;
7475             default:
7476                 gen_mfc0(ctx, t0, rt, sel);
7477                 break;
7478             }
7479         case 12:
7480             switch (sel) {
7481             case 0:
7482                 gen_helper_mftc0_status(t0, cpu_env);
7483                 break;
7484             default:
7485                 gen_mfc0(ctx, t0, rt, sel);
7486                 break;
7487             }
7488         case 13:
7489             switch (sel) {
7490             case 0:
7491                 gen_helper_mftc0_cause(t0, cpu_env);
7492                 break;
7493             default:
7494                 goto die;
7495                 break;
7496             }
7497             break;
7498         case 14:
7499             switch (sel) {
7500             case 0:
7501                 gen_helper_mftc0_epc(t0, cpu_env);
7502                 break;
7503             default:
7504                 goto die;
7505                 break;
7506             }
7507             break;
7508         case 15:
7509             switch (sel) {
7510             case 1:
7511                 gen_helper_mftc0_ebase(t0, cpu_env);
7512                 break;
7513             default:
7514                 goto die;
7515                 break;
7516             }
7517             break;
7518         case 16:
7519             switch (sel) {
7520             case 0 ... 7:
7521                 gen_helper_mftc0_configx(t0, cpu_env, tcg_const_tl(sel));
7522                 break;
7523             default:
7524                 goto die;
7525                 break;
7526             }
7527             break;
7528         case 23:
7529             switch (sel) {
7530             case 0:
7531                 gen_helper_mftc0_debug(t0, cpu_env);
7532                 break;
7533             default:
7534                 gen_mfc0(ctx, t0, rt, sel);
7535                 break;
7536             }
7537             break;
7538         default:
7539             gen_mfc0(ctx, t0, rt, sel);
7540         }
7541     } else switch (sel) {
7542     /* GPR registers. */
7543     case 0:
7544         gen_helper_1e0i(mftgpr, t0, rt);
7545         break;
7546     /* Auxiliary CPU registers */
7547     case 1:
7548         switch (rt) {
7549         case 0:
7550             gen_helper_1e0i(mftlo, t0, 0);
7551             break;
7552         case 1:
7553             gen_helper_1e0i(mfthi, t0, 0);
7554             break;
7555         case 2:
7556             gen_helper_1e0i(mftacx, t0, 0);
7557             break;
7558         case 4:
7559             gen_helper_1e0i(mftlo, t0, 1);
7560             break;
7561         case 5:
7562             gen_helper_1e0i(mfthi, t0, 1);
7563             break;
7564         case 6:
7565             gen_helper_1e0i(mftacx, t0, 1);
7566             break;
7567         case 8:
7568             gen_helper_1e0i(mftlo, t0, 2);
7569             break;
7570         case 9:
7571             gen_helper_1e0i(mfthi, t0, 2);
7572             break;
7573         case 10:
7574             gen_helper_1e0i(mftacx, t0, 2);
7575             break;
7576         case 12:
7577             gen_helper_1e0i(mftlo, t0, 3);
7578             break;
7579         case 13:
7580             gen_helper_1e0i(mfthi, t0, 3);
7581             break;
7582         case 14:
7583             gen_helper_1e0i(mftacx, t0, 3);
7584             break;
7585         case 16:
7586             gen_helper_mftdsp(t0, cpu_env);
7587             break;
7588         default:
7589             goto die;
7590         }
7591         break;
7592     /* Floating point (COP1). */
7593     case 2:
7594         /* XXX: For now we support only a single FPU context. */
7595         if (h == 0) {
7596             TCGv_i32 fp0 = tcg_temp_new_i32();
7597
7598             gen_load_fpr32(ctx, fp0, rt);
7599             tcg_gen_ext_i32_tl(t0, fp0);
7600             tcg_temp_free_i32(fp0);
7601         } else {
7602             TCGv_i32 fp0 = tcg_temp_new_i32();
7603
7604             gen_load_fpr32h(ctx, fp0, rt);
7605             tcg_gen_ext_i32_tl(t0, fp0);
7606             tcg_temp_free_i32(fp0);
7607         }
7608         break;
7609     case 3:
7610         /* XXX: For now we support only a single FPU context. */
7611         gen_helper_1e0i(cfc1, t0, rt);
7612         break;
7613     /* COP2: Not implemented. */
7614     case 4:
7615     case 5:
7616         /* fall through */
7617     default:
7618         goto die;
7619     }
7620     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
7621     gen_store_gpr(t0, rd);
7622     tcg_temp_free(t0);
7623     return;
7624
7625 die:
7626     tcg_temp_free(t0);
7627     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
7628     generate_exception(ctx, EXCP_RI);
7629 }
7630
7631 static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt,
7632                      int u, int sel, int h)
7633 {
7634     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
7635     TCGv t0 = tcg_temp_local_new();
7636
7637     gen_load_gpr(t0, rt);
7638     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
7639         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
7640          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
7641         /* NOP */ ;
7642     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
7643              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
7644         /* NOP */ ;
7645     else if (u == 0) {
7646         switch (rd) {
7647         case 1:
7648             switch (sel) {
7649             case 1:
7650                 gen_helper_mttc0_vpecontrol(cpu_env, t0);
7651                 break;
7652             case 2:
7653                 gen_helper_mttc0_vpeconf0(cpu_env, t0);
7654                 break;
7655             default:
7656                 goto die;
7657                 break;
7658             }
7659             break;
7660         case 2:
7661             switch (sel) {
7662             case 1:
7663                 gen_helper_mttc0_tcstatus(cpu_env, t0);
7664                 break;
7665             case 2:
7666                 gen_helper_mttc0_tcbind(cpu_env, t0);
7667                 break;
7668             case 3:
7669                 gen_helper_mttc0_tcrestart(cpu_env, t0);
7670                 break;
7671             case 4:
7672                 gen_helper_mttc0_tchalt(cpu_env, t0);
7673                 break;
7674             case 5:
7675                 gen_helper_mttc0_tccontext(cpu_env, t0);
7676                 break;
7677             case 6:
7678                 gen_helper_mttc0_tcschedule(cpu_env, t0);
7679                 break;
7680             case 7:
7681                 gen_helper_mttc0_tcschefback(cpu_env, t0);
7682                 break;
7683             default:
7684                 gen_mtc0(ctx, t0, rd, sel);
7685                 break;
7686             }
7687             break;
7688         case 10:
7689             switch (sel) {
7690             case 0:
7691                 gen_helper_mttc0_entryhi(cpu_env, t0);
7692                 break;
7693             default:
7694                 gen_mtc0(ctx, t0, rd, sel);
7695                 break;
7696             }
7697         case 12:
7698             switch (sel) {
7699             case 0:
7700                 gen_helper_mttc0_status(cpu_env, t0);
7701                 break;
7702             default:
7703                 gen_mtc0(ctx, t0, rd, sel);
7704                 break;
7705             }
7706         case 13:
7707             switch (sel) {
7708             case 0:
7709                 gen_helper_mttc0_cause(cpu_env, t0);
7710                 break;
7711             default:
7712                 goto die;
7713                 break;
7714             }
7715             break;
7716         case 15:
7717             switch (sel) {
7718             case 1:
7719                 gen_helper_mttc0_ebase(cpu_env, t0);
7720                 break;
7721             default:
7722                 goto die;
7723                 break;
7724             }
7725             break;
7726         case 23:
7727             switch (sel) {
7728             case 0:
7729                 gen_helper_mttc0_debug(cpu_env, t0);
7730                 break;
7731             default:
7732                 gen_mtc0(ctx, t0, rd, sel);
7733                 break;
7734             }
7735             break;
7736         default:
7737             gen_mtc0(ctx, t0, rd, sel);
7738         }
7739     } else switch (sel) {
7740     /* GPR registers. */
7741     case 0:
7742         gen_helper_0e1i(mttgpr, t0, rd);
7743         break;
7744     /* Auxiliary CPU registers */
7745     case 1:
7746         switch (rd) {
7747         case 0:
7748             gen_helper_0e1i(mttlo, t0, 0);
7749             break;
7750         case 1:
7751             gen_helper_0e1i(mtthi, t0, 0);
7752             break;
7753         case 2:
7754             gen_helper_0e1i(mttacx, t0, 0);
7755             break;
7756         case 4:
7757             gen_helper_0e1i(mttlo, t0, 1);
7758             break;
7759         case 5:
7760             gen_helper_0e1i(mtthi, t0, 1);
7761             break;
7762         case 6:
7763             gen_helper_0e1i(mttacx, t0, 1);
7764             break;
7765         case 8:
7766             gen_helper_0e1i(mttlo, t0, 2);
7767             break;
7768         case 9:
7769             gen_helper_0e1i(mtthi, t0, 2);
7770             break;
7771         case 10:
7772             gen_helper_0e1i(mttacx, t0, 2);
7773             break;
7774         case 12:
7775             gen_helper_0e1i(mttlo, t0, 3);
7776             break;
7777         case 13:
7778             gen_helper_0e1i(mtthi, t0, 3);
7779             break;
7780         case 14:
7781             gen_helper_0e1i(mttacx, t0, 3);
7782             break;
7783         case 16:
7784             gen_helper_mttdsp(cpu_env, t0);
7785             break;
7786         default:
7787             goto die;
7788         }
7789         break;
7790     /* Floating point (COP1). */
7791     case 2:
7792         /* XXX: For now we support only a single FPU context. */
7793         if (h == 0) {
7794             TCGv_i32 fp0 = tcg_temp_new_i32();
7795
7796             tcg_gen_trunc_tl_i32(fp0, t0);
7797             gen_store_fpr32(ctx, fp0, rd);
7798             tcg_temp_free_i32(fp0);
7799         } else {
7800             TCGv_i32 fp0 = tcg_temp_new_i32();
7801
7802             tcg_gen_trunc_tl_i32(fp0, t0);
7803             gen_store_fpr32h(ctx, fp0, rd);
7804             tcg_temp_free_i32(fp0);
7805         }
7806         break;
7807     case 3:
7808         /* XXX: For now we support only a single FPU context. */
7809         save_cpu_state(ctx, 1);
7810         {
7811             TCGv_i32 fs_tmp = tcg_const_i32(rd);
7812
7813             gen_helper_0e2i(ctc1, t0, fs_tmp, rt);
7814             tcg_temp_free_i32(fs_tmp);
7815         }
7816         /* Stop translation as we may have changed hflags */
7817         ctx->bstate = BS_STOP;
7818         break;
7819     /* COP2: Not implemented. */
7820     case 4:
7821     case 5:
7822         /* fall through */
7823     default:
7824         goto die;
7825     }
7826     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
7827     tcg_temp_free(t0);
7828     return;
7829
7830 die:
7831     tcg_temp_free(t0);
7832     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
7833     generate_exception(ctx, EXCP_RI);
7834 }
7835
7836 static void gen_cp0 (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, int rt, int rd)
7837 {
7838     const char *opn = "ldst";
7839
7840     check_cp0_enabled(ctx);
7841     switch (opc) {
7842     case OPC_MFC0:
7843         if (rt == 0) {
7844             /* Treat as NOP. */
7845             return;
7846         }
7847         gen_mfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
7848         opn = "mfc0";
7849         break;
7850     case OPC_MTC0:
7851         {
7852             TCGv t0 = tcg_temp_new();
7853
7854             gen_load_gpr(t0, rt);
7855             gen_mtc0(ctx, t0, rd, ctx->opcode & 0x7);
7856             tcg_temp_free(t0);
7857         }
7858         opn = "mtc0";
7859         break;
7860 #if defined(TARGET_MIPS64)
7861     case OPC_DMFC0:
7862         check_insn(ctx, ISA_MIPS3);
7863         if (rt == 0) {
7864             /* Treat as NOP. */
7865             return;
7866         }
7867         gen_dmfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
7868         opn = "dmfc0";
7869         break;
7870     case OPC_DMTC0:
7871         check_insn(ctx, ISA_MIPS3);
7872         {
7873             TCGv t0 = tcg_temp_new();
7874
7875             gen_load_gpr(t0, rt);
7876             gen_dmtc0(ctx, t0, rd, ctx->opcode & 0x7);
7877             tcg_temp_free(t0);
7878         }
7879         opn = "dmtc0";
7880         break;
7881 #endif
7882     case OPC_MFTR:
7883         check_insn(ctx, ASE_MT);
7884         if (rd == 0) {
7885             /* Treat as NOP. */
7886             return;
7887         }
7888         gen_mftr(env, ctx, rt, rd, (ctx->opcode >> 5) & 1,
7889                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
7890         opn = "mftr";
7891         break;
7892     case OPC_MTTR:
7893         check_insn(ctx, ASE_MT);
7894         gen_mttr(env, ctx, rd, rt, (ctx->opcode >> 5) & 1,
7895                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
7896         opn = "mttr";
7897         break;
7898     case OPC_TLBWI:
7899         opn = "tlbwi";
7900         if (!env->tlb->helper_tlbwi)
7901             goto die;
7902         gen_helper_tlbwi(cpu_env);
7903         break;
7904     case OPC_TLBINV:
7905         opn = "tlbinv";
7906         if (ctx->ie >= 2) {
7907             if (!env->tlb->helper_tlbinv) {
7908                 goto die;
7909             }
7910             gen_helper_tlbinv(cpu_env);
7911         } /* treat as nop if TLBINV not supported */
7912         break;
7913     case OPC_TLBINVF:
7914         opn = "tlbinvf";
7915         if (ctx->ie >= 2) {
7916             if (!env->tlb->helper_tlbinvf) {
7917                 goto die;
7918             }
7919             gen_helper_tlbinvf(cpu_env);
7920         } /* treat as nop if TLBINV not supported */
7921         break;
7922     case OPC_TLBWR:
7923         opn = "tlbwr";
7924         if (!env->tlb->helper_tlbwr)
7925             goto die;
7926         gen_helper_tlbwr(cpu_env);
7927         break;
7928     case OPC_TLBP:
7929         opn = "tlbp";
7930         if (!env->tlb->helper_tlbp)
7931             goto die;
7932         gen_helper_tlbp(cpu_env);
7933         break;
7934     case OPC_TLBR:
7935         opn = "tlbr";
7936         if (!env->tlb->helper_tlbr)
7937             goto die;
7938         gen_helper_tlbr(cpu_env);
7939         break;
7940     case OPC_ERET: /* OPC_ERETNC */
7941         if ((ctx->insn_flags & ISA_MIPS32R6) &&
7942             (ctx->hflags & MIPS_HFLAG_BMASK)) {
7943             MIPS_DEBUG("CTI in delay / forbidden slot");
7944             goto die;
7945         } else {
7946             int bit_shift = (ctx->hflags & MIPS_HFLAG_M16) ? 16 : 6;
7947             if (ctx->opcode & (1 << bit_shift)) {
7948                 /* OPC_ERETNC */
7949                 opn = "eretnc";
7950                 check_insn(ctx, ISA_MIPS32R5);
7951                 gen_helper_eretnc(cpu_env);
7952             } else {
7953                 /* OPC_ERET */
7954                 opn = "eret";
7955                 check_insn(ctx, ISA_MIPS2);
7956                 gen_helper_eret(cpu_env);
7957             }
7958             ctx->bstate = BS_EXCP;
7959         }
7960         break;
7961     case OPC_DERET:
7962         opn = "deret";
7963         check_insn(ctx, ISA_MIPS32);
7964         if ((ctx->insn_flags & ISA_MIPS32R6) &&
7965             (ctx->hflags & MIPS_HFLAG_BMASK)) {
7966             MIPS_DEBUG("CTI in delay / forbidden slot");
7967             goto die;
7968         }
7969         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
7970             MIPS_INVAL(opn);
7971             generate_exception(ctx, EXCP_RI);
7972         } else {
7973             gen_helper_deret(cpu_env);
7974             ctx->bstate = BS_EXCP;
7975         }
7976         break;
7977     case OPC_WAIT:
7978         opn = "wait";
7979         check_insn(ctx, ISA_MIPS3 | ISA_MIPS32);
7980         if ((ctx->insn_flags & ISA_MIPS32R6) &&
7981             (ctx->hflags & MIPS_HFLAG_BMASK)) {
7982             MIPS_DEBUG("CTI in delay / forbidden slot");
7983             goto die;
7984         }
7985         /* If we get an exception, we want to restart at next instruction */
7986         ctx->pc += 4;
7987         save_cpu_state(ctx, 1);
7988         ctx->pc -= 4;
7989         gen_helper_wait(cpu_env);
7990         ctx->bstate = BS_EXCP;
7991         break;
7992     default:
7993  die:
7994         MIPS_INVAL(opn);
7995         generate_exception(ctx, EXCP_RI);
7996         return;
7997     }
7998     (void)opn; /* avoid a compiler warning */
7999     MIPS_DEBUG("%s %s %d", opn, regnames[rt], rd);
8000 }
8001 #endif /* !CONFIG_USER_ONLY */
8002
8003 /* CP1 Branches (before delay slot) */
8004 static void gen_compute_branch1(DisasContext *ctx, uint32_t op,
8005                                 int32_t cc, int32_t offset)
8006 {
8007     target_ulong btarget;
8008     const char *opn = "cp1 cond branch";
8009     TCGv_i32 t0 = tcg_temp_new_i32();
8010
8011     if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->hflags & MIPS_HFLAG_BMASK)) {
8012         MIPS_DEBUG("CTI in delay / forbidden slot");
8013         generate_exception(ctx, EXCP_RI);
8014         goto out;
8015     }
8016
8017     if (cc != 0)
8018         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
8019
8020     btarget = ctx->pc + 4 + offset;
8021
8022     switch (op) {
8023     case OPC_BC1F:
8024         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8025         tcg_gen_not_i32(t0, t0);
8026         tcg_gen_andi_i32(t0, t0, 1);
8027         tcg_gen_extu_i32_tl(bcond, t0);
8028         opn = "bc1f";
8029         goto not_likely;
8030     case OPC_BC1FL:
8031         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8032         tcg_gen_not_i32(t0, t0);
8033         tcg_gen_andi_i32(t0, t0, 1);
8034         tcg_gen_extu_i32_tl(bcond, t0);
8035         opn = "bc1fl";
8036         goto likely;
8037     case OPC_BC1T:
8038         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8039         tcg_gen_andi_i32(t0, t0, 1);
8040         tcg_gen_extu_i32_tl(bcond, t0);
8041         opn = "bc1t";
8042         goto not_likely;
8043     case OPC_BC1TL:
8044         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8045         tcg_gen_andi_i32(t0, t0, 1);
8046         tcg_gen_extu_i32_tl(bcond, t0);
8047         opn = "bc1tl";
8048     likely:
8049         ctx->hflags |= MIPS_HFLAG_BL;
8050         break;
8051     case OPC_BC1FANY2:
8052         {
8053             TCGv_i32 t1 = tcg_temp_new_i32();
8054             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8055             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
8056             tcg_gen_nand_i32(t0, t0, t1);
8057             tcg_temp_free_i32(t1);
8058             tcg_gen_andi_i32(t0, t0, 1);
8059             tcg_gen_extu_i32_tl(bcond, t0);
8060         }
8061         opn = "bc1any2f";
8062         goto not_likely;
8063     case OPC_BC1TANY2:
8064         {
8065             TCGv_i32 t1 = tcg_temp_new_i32();
8066             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8067             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
8068             tcg_gen_or_i32(t0, t0, t1);
8069             tcg_temp_free_i32(t1);
8070             tcg_gen_andi_i32(t0, t0, 1);
8071             tcg_gen_extu_i32_tl(bcond, t0);
8072         }
8073         opn = "bc1any2t";
8074         goto not_likely;
8075     case OPC_BC1FANY4:
8076         {
8077             TCGv_i32 t1 = tcg_temp_new_i32();
8078             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8079             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
8080             tcg_gen_and_i32(t0, t0, t1);
8081             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
8082             tcg_gen_and_i32(t0, t0, t1);
8083             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
8084             tcg_gen_nand_i32(t0, t0, t1);
8085             tcg_temp_free_i32(t1);
8086             tcg_gen_andi_i32(t0, t0, 1);
8087             tcg_gen_extu_i32_tl(bcond, t0);
8088         }
8089         opn = "bc1any4f";
8090         goto not_likely;
8091     case OPC_BC1TANY4:
8092         {
8093             TCGv_i32 t1 = tcg_temp_new_i32();
8094             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8095             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
8096             tcg_gen_or_i32(t0, t0, t1);
8097             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
8098             tcg_gen_or_i32(t0, t0, t1);
8099             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
8100             tcg_gen_or_i32(t0, t0, t1);
8101             tcg_temp_free_i32(t1);
8102             tcg_gen_andi_i32(t0, t0, 1);
8103             tcg_gen_extu_i32_tl(bcond, t0);
8104         }
8105         opn = "bc1any4t";
8106     not_likely:
8107         ctx->hflags |= MIPS_HFLAG_BC;
8108         break;
8109     default:
8110         MIPS_INVAL(opn);
8111         generate_exception (ctx, EXCP_RI);
8112         goto out;
8113     }
8114     (void)opn; /* avoid a compiler warning */
8115     MIPS_DEBUG("%s: cond %02x target " TARGET_FMT_lx, opn,
8116                ctx->hflags, btarget);
8117     ctx->btarget = btarget;
8118     ctx->hflags |= MIPS_HFLAG_BDS32;
8119  out:
8120     tcg_temp_free_i32(t0);
8121 }
8122
8123 /* R6 CP1 Branches */
8124 static void gen_compute_branch1_r6(DisasContext *ctx, uint32_t op,
8125                                    int32_t ft, int32_t offset)
8126 {
8127     target_ulong btarget;
8128     const char *opn = "cp1 cond branch";
8129     TCGv_i64 t0 = tcg_temp_new_i64();
8130
8131     if (ctx->hflags & MIPS_HFLAG_BMASK) {
8132 #ifdef MIPS_DEBUG_DISAS
8133         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
8134                   "\n", ctx->pc);
8135 #endif
8136         generate_exception(ctx, EXCP_RI);
8137         goto out;
8138     }
8139
8140     gen_load_fpr64(ctx, t0, ft);
8141     tcg_gen_andi_i64(t0, t0, 1);
8142
8143     btarget = addr_add(ctx, ctx->pc + 4, offset);
8144
8145     switch (op) {
8146     case OPC_BC1EQZ:
8147         tcg_gen_xori_i64(t0, t0, 1);
8148         opn = "bc1eqz";
8149         ctx->hflags |= MIPS_HFLAG_BC;
8150         break;
8151     case OPC_BC1NEZ:
8152         /* t0 already set */
8153         opn = "bc1nez";
8154         ctx->hflags |= MIPS_HFLAG_BC;
8155         break;
8156     default:
8157         MIPS_INVAL(opn);
8158         generate_exception(ctx, EXCP_RI);
8159         goto out;
8160     }
8161
8162     tcg_gen_trunc_i64_tl(bcond, t0);
8163
8164     (void)opn; /* avoid a compiler warning */
8165     MIPS_DEBUG("%s: cond %02x target " TARGET_FMT_lx, opn,
8166                ctx->hflags, btarget);
8167     ctx->btarget = btarget;
8168     ctx->hflags |= MIPS_HFLAG_BDS32;
8169
8170 out:
8171     tcg_temp_free_i64(t0);
8172 }
8173
8174 /* Coprocessor 1 (FPU) */
8175
8176 #define FOP(func, fmt) (((fmt) << 21) | (func))
8177
8178 enum fopcode {
8179     OPC_ADD_S = FOP(0, FMT_S),
8180     OPC_SUB_S = FOP(1, FMT_S),
8181     OPC_MUL_S = FOP(2, FMT_S),
8182     OPC_DIV_S = FOP(3, FMT_S),
8183     OPC_SQRT_S = FOP(4, FMT_S),
8184     OPC_ABS_S = FOP(5, FMT_S),
8185     OPC_MOV_S = FOP(6, FMT_S),
8186     OPC_NEG_S = FOP(7, FMT_S),
8187     OPC_ROUND_L_S = FOP(8, FMT_S),
8188     OPC_TRUNC_L_S = FOP(9, FMT_S),
8189     OPC_CEIL_L_S = FOP(10, FMT_S),
8190     OPC_FLOOR_L_S = FOP(11, FMT_S),
8191     OPC_ROUND_W_S = FOP(12, FMT_S),
8192     OPC_TRUNC_W_S = FOP(13, FMT_S),
8193     OPC_CEIL_W_S = FOP(14, FMT_S),
8194     OPC_FLOOR_W_S = FOP(15, FMT_S),
8195     OPC_SEL_S = FOP(16, FMT_S),
8196     OPC_MOVCF_S = FOP(17, FMT_S),
8197     OPC_MOVZ_S = FOP(18, FMT_S),
8198     OPC_MOVN_S = FOP(19, FMT_S),
8199     OPC_SELEQZ_S = FOP(20, FMT_S),
8200     OPC_RECIP_S = FOP(21, FMT_S),
8201     OPC_RSQRT_S = FOP(22, FMT_S),
8202     OPC_SELNEZ_S = FOP(23, FMT_S),
8203     OPC_MADDF_S = FOP(24, FMT_S),
8204     OPC_MSUBF_S = FOP(25, FMT_S),
8205     OPC_RINT_S = FOP(26, FMT_S),
8206     OPC_CLASS_S = FOP(27, FMT_S),
8207     OPC_MIN_S = FOP(28, FMT_S),
8208     OPC_RECIP2_S = FOP(28, FMT_S),
8209     OPC_MINA_S = FOP(29, FMT_S),
8210     OPC_RECIP1_S = FOP(29, FMT_S),
8211     OPC_MAX_S = FOP(30, FMT_S),
8212     OPC_RSQRT1_S = FOP(30, FMT_S),
8213     OPC_MAXA_S = FOP(31, FMT_S),
8214     OPC_RSQRT2_S = FOP(31, FMT_S),
8215     OPC_CVT_D_S = FOP(33, FMT_S),
8216     OPC_CVT_W_S = FOP(36, FMT_S),
8217     OPC_CVT_L_S = FOP(37, FMT_S),
8218     OPC_CVT_PS_S = FOP(38, FMT_S),
8219     OPC_CMP_F_S = FOP (48, FMT_S),
8220     OPC_CMP_UN_S = FOP (49, FMT_S),
8221     OPC_CMP_EQ_S = FOP (50, FMT_S),
8222     OPC_CMP_UEQ_S = FOP (51, FMT_S),
8223     OPC_CMP_OLT_S = FOP (52, FMT_S),
8224     OPC_CMP_ULT_S = FOP (53, FMT_S),
8225     OPC_CMP_OLE_S = FOP (54, FMT_S),
8226     OPC_CMP_ULE_S = FOP (55, FMT_S),
8227     OPC_CMP_SF_S = FOP (56, FMT_S),
8228     OPC_CMP_NGLE_S = FOP (57, FMT_S),
8229     OPC_CMP_SEQ_S = FOP (58, FMT_S),
8230     OPC_CMP_NGL_S = FOP (59, FMT_S),
8231     OPC_CMP_LT_S = FOP (60, FMT_S),
8232     OPC_CMP_NGE_S = FOP (61, FMT_S),
8233     OPC_CMP_LE_S = FOP (62, FMT_S),
8234     OPC_CMP_NGT_S = FOP (63, FMT_S),
8235
8236     OPC_ADD_D = FOP(0, FMT_D),
8237     OPC_SUB_D = FOP(1, FMT_D),
8238     OPC_MUL_D = FOP(2, FMT_D),
8239     OPC_DIV_D = FOP(3, FMT_D),
8240     OPC_SQRT_D = FOP(4, FMT_D),
8241     OPC_ABS_D = FOP(5, FMT_D),
8242     OPC_MOV_D = FOP(6, FMT_D),
8243     OPC_NEG_D = FOP(7, FMT_D),
8244     OPC_ROUND_L_D = FOP(8, FMT_D),
8245     OPC_TRUNC_L_D = FOP(9, FMT_D),
8246     OPC_CEIL_L_D = FOP(10, FMT_D),
8247     OPC_FLOOR_L_D = FOP(11, FMT_D),
8248     OPC_ROUND_W_D = FOP(12, FMT_D),
8249     OPC_TRUNC_W_D = FOP(13, FMT_D),
8250     OPC_CEIL_W_D = FOP(14, FMT_D),
8251     OPC_FLOOR_W_D = FOP(15, FMT_D),
8252     OPC_SEL_D = FOP(16, FMT_D),
8253     OPC_MOVCF_D = FOP(17, FMT_D),
8254     OPC_MOVZ_D = FOP(18, FMT_D),
8255     OPC_MOVN_D = FOP(19, FMT_D),
8256     OPC_SELEQZ_D = FOP(20, FMT_D),
8257     OPC_RECIP_D = FOP(21, FMT_D),
8258     OPC_RSQRT_D = FOP(22, FMT_D),
8259     OPC_SELNEZ_D = FOP(23, FMT_D),
8260     OPC_MADDF_D = FOP(24, FMT_D),
8261     OPC_MSUBF_D = FOP(25, FMT_D),
8262     OPC_RINT_D = FOP(26, FMT_D),
8263     OPC_CLASS_D = FOP(27, FMT_D),
8264     OPC_MIN_D = FOP(28, FMT_D),
8265     OPC_RECIP2_D = FOP(28, FMT_D),
8266     OPC_MINA_D = FOP(29, FMT_D),
8267     OPC_RECIP1_D = FOP(29, FMT_D),
8268     OPC_MAX_D = FOP(30, FMT_D),
8269     OPC_RSQRT1_D = FOP(30, FMT_D),
8270     OPC_MAXA_D = FOP(31, FMT_D),
8271     OPC_RSQRT2_D = FOP(31, FMT_D),
8272     OPC_CVT_S_D = FOP(32, FMT_D),
8273     OPC_CVT_W_D = FOP(36, FMT_D),
8274     OPC_CVT_L_D = FOP(37, FMT_D),
8275     OPC_CMP_F_D = FOP (48, FMT_D),
8276     OPC_CMP_UN_D = FOP (49, FMT_D),
8277     OPC_CMP_EQ_D = FOP (50, FMT_D),
8278     OPC_CMP_UEQ_D = FOP (51, FMT_D),
8279     OPC_CMP_OLT_D = FOP (52, FMT_D),
8280     OPC_CMP_ULT_D = FOP (53, FMT_D),
8281     OPC_CMP_OLE_D = FOP (54, FMT_D),
8282     OPC_CMP_ULE_D = FOP (55, FMT_D),
8283     OPC_CMP_SF_D = FOP (56, FMT_D),
8284     OPC_CMP_NGLE_D = FOP (57, FMT_D),
8285     OPC_CMP_SEQ_D = FOP (58, FMT_D),
8286     OPC_CMP_NGL_D = FOP (59, FMT_D),
8287     OPC_CMP_LT_D = FOP (60, FMT_D),
8288     OPC_CMP_NGE_D = FOP (61, FMT_D),
8289     OPC_CMP_LE_D = FOP (62, FMT_D),
8290     OPC_CMP_NGT_D = FOP (63, FMT_D),
8291
8292     OPC_CVT_S_W = FOP(32, FMT_W),
8293     OPC_CVT_D_W = FOP(33, FMT_W),
8294     OPC_CVT_S_L = FOP(32, FMT_L),
8295     OPC_CVT_D_L = FOP(33, FMT_L),
8296     OPC_CVT_PS_PW = FOP(38, FMT_W),
8297
8298     OPC_ADD_PS = FOP(0, FMT_PS),
8299     OPC_SUB_PS = FOP(1, FMT_PS),
8300     OPC_MUL_PS = FOP(2, FMT_PS),
8301     OPC_DIV_PS = FOP(3, FMT_PS),
8302     OPC_ABS_PS = FOP(5, FMT_PS),
8303     OPC_MOV_PS = FOP(6, FMT_PS),
8304     OPC_NEG_PS = FOP(7, FMT_PS),
8305     OPC_MOVCF_PS = FOP(17, FMT_PS),
8306     OPC_MOVZ_PS = FOP(18, FMT_PS),
8307     OPC_MOVN_PS = FOP(19, FMT_PS),
8308     OPC_ADDR_PS = FOP(24, FMT_PS),
8309     OPC_MULR_PS = FOP(26, FMT_PS),
8310     OPC_RECIP2_PS = FOP(28, FMT_PS),
8311     OPC_RECIP1_PS = FOP(29, FMT_PS),
8312     OPC_RSQRT1_PS = FOP(30, FMT_PS),
8313     OPC_RSQRT2_PS = FOP(31, FMT_PS),
8314
8315     OPC_CVT_S_PU = FOP(32, FMT_PS),
8316     OPC_CVT_PW_PS = FOP(36, FMT_PS),
8317     OPC_CVT_S_PL = FOP(40, FMT_PS),
8318     OPC_PLL_PS = FOP(44, FMT_PS),
8319     OPC_PLU_PS = FOP(45, FMT_PS),
8320     OPC_PUL_PS = FOP(46, FMT_PS),
8321     OPC_PUU_PS = FOP(47, FMT_PS),
8322     OPC_CMP_F_PS = FOP (48, FMT_PS),
8323     OPC_CMP_UN_PS = FOP (49, FMT_PS),
8324     OPC_CMP_EQ_PS = FOP (50, FMT_PS),
8325     OPC_CMP_UEQ_PS = FOP (51, FMT_PS),
8326     OPC_CMP_OLT_PS = FOP (52, FMT_PS),
8327     OPC_CMP_ULT_PS = FOP (53, FMT_PS),
8328     OPC_CMP_OLE_PS = FOP (54, FMT_PS),
8329     OPC_CMP_ULE_PS = FOP (55, FMT_PS),
8330     OPC_CMP_SF_PS = FOP (56, FMT_PS),
8331     OPC_CMP_NGLE_PS = FOP (57, FMT_PS),
8332     OPC_CMP_SEQ_PS = FOP (58, FMT_PS),
8333     OPC_CMP_NGL_PS = FOP (59, FMT_PS),
8334     OPC_CMP_LT_PS = FOP (60, FMT_PS),
8335     OPC_CMP_NGE_PS = FOP (61, FMT_PS),
8336     OPC_CMP_LE_PS = FOP (62, FMT_PS),
8337     OPC_CMP_NGT_PS = FOP (63, FMT_PS),
8338 };
8339
8340 enum r6_f_cmp_op {
8341     R6_OPC_CMP_AF_S   = FOP(0, FMT_W),
8342     R6_OPC_CMP_UN_S   = FOP(1, FMT_W),
8343     R6_OPC_CMP_EQ_S   = FOP(2, FMT_W),
8344     R6_OPC_CMP_UEQ_S  = FOP(3, FMT_W),
8345     R6_OPC_CMP_LT_S   = FOP(4, FMT_W),
8346     R6_OPC_CMP_ULT_S  = FOP(5, FMT_W),
8347     R6_OPC_CMP_LE_S   = FOP(6, FMT_W),
8348     R6_OPC_CMP_ULE_S  = FOP(7, FMT_W),
8349     R6_OPC_CMP_SAF_S  = FOP(8, FMT_W),
8350     R6_OPC_CMP_SUN_S  = FOP(9, FMT_W),
8351     R6_OPC_CMP_SEQ_S  = FOP(10, FMT_W),
8352     R6_OPC_CMP_SEUQ_S = FOP(11, FMT_W),
8353     R6_OPC_CMP_SLT_S  = FOP(12, FMT_W),
8354     R6_OPC_CMP_SULT_S = FOP(13, FMT_W),
8355     R6_OPC_CMP_SLE_S  = FOP(14, FMT_W),
8356     R6_OPC_CMP_SULE_S = FOP(15, FMT_W),
8357     R6_OPC_CMP_OR_S   = FOP(17, FMT_W),
8358     R6_OPC_CMP_UNE_S  = FOP(18, FMT_W),
8359     R6_OPC_CMP_NE_S   = FOP(19, FMT_W),
8360     R6_OPC_CMP_SOR_S  = FOP(25, FMT_W),
8361     R6_OPC_CMP_SUNE_S = FOP(26, FMT_W),
8362     R6_OPC_CMP_SNE_S  = FOP(27, FMT_W),
8363
8364     R6_OPC_CMP_AF_D   = FOP(0, FMT_L),
8365     R6_OPC_CMP_UN_D   = FOP(1, FMT_L),
8366     R6_OPC_CMP_EQ_D   = FOP(2, FMT_L),
8367     R6_OPC_CMP_UEQ_D  = FOP(3, FMT_L),
8368     R6_OPC_CMP_LT_D   = FOP(4, FMT_L),
8369     R6_OPC_CMP_ULT_D  = FOP(5, FMT_L),
8370     R6_OPC_CMP_LE_D   = FOP(6, FMT_L),
8371     R6_OPC_CMP_ULE_D  = FOP(7, FMT_L),
8372     R6_OPC_CMP_SAF_D  = FOP(8, FMT_L),
8373     R6_OPC_CMP_SUN_D  = FOP(9, FMT_L),
8374     R6_OPC_CMP_SEQ_D  = FOP(10, FMT_L),
8375     R6_OPC_CMP_SEUQ_D = FOP(11, FMT_L),
8376     R6_OPC_CMP_SLT_D  = FOP(12, FMT_L),
8377     R6_OPC_CMP_SULT_D = FOP(13, FMT_L),
8378     R6_OPC_CMP_SLE_D  = FOP(14, FMT_L),
8379     R6_OPC_CMP_SULE_D = FOP(15, FMT_L),
8380     R6_OPC_CMP_OR_D   = FOP(17, FMT_L),
8381     R6_OPC_CMP_UNE_D  = FOP(18, FMT_L),
8382     R6_OPC_CMP_NE_D   = FOP(19, FMT_L),
8383     R6_OPC_CMP_SOR_D  = FOP(25, FMT_L),
8384     R6_OPC_CMP_SUNE_D = FOP(26, FMT_L),
8385     R6_OPC_CMP_SNE_D  = FOP(27, FMT_L),
8386 };
8387 static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
8388 {
8389     const char *opn = "cp1 move";
8390     TCGv t0 = tcg_temp_new();
8391
8392     switch (opc) {
8393     case OPC_MFC1:
8394         {
8395             TCGv_i32 fp0 = tcg_temp_new_i32();
8396
8397             gen_load_fpr32(ctx, fp0, fs);
8398             tcg_gen_ext_i32_tl(t0, fp0);
8399             tcg_temp_free_i32(fp0);
8400         }
8401         gen_store_gpr(t0, rt);
8402         opn = "mfc1";
8403         break;
8404     case OPC_MTC1:
8405         gen_load_gpr(t0, rt);
8406         {
8407             TCGv_i32 fp0 = tcg_temp_new_i32();
8408
8409             tcg_gen_trunc_tl_i32(fp0, t0);
8410             gen_store_fpr32(ctx, fp0, fs);
8411             tcg_temp_free_i32(fp0);
8412         }
8413         opn = "mtc1";
8414         break;
8415     case OPC_CFC1:
8416         gen_helper_1e0i(cfc1, t0, fs);
8417         gen_store_gpr(t0, rt);
8418         opn = "cfc1";
8419         break;
8420     case OPC_CTC1:
8421         gen_load_gpr(t0, rt);
8422         save_cpu_state(ctx, 1);
8423         {
8424             TCGv_i32 fs_tmp = tcg_const_i32(fs);
8425
8426             gen_helper_0e2i(ctc1, t0, fs_tmp, rt);
8427             tcg_temp_free_i32(fs_tmp);
8428         }
8429         /* Stop translation as we may have changed hflags */
8430         ctx->bstate = BS_STOP;
8431         opn = "ctc1";
8432         break;
8433 #if defined(TARGET_MIPS64)
8434     case OPC_DMFC1:
8435         gen_load_fpr64(ctx, t0, fs);
8436         gen_store_gpr(t0, rt);
8437         opn = "dmfc1";
8438         break;
8439     case OPC_DMTC1:
8440         gen_load_gpr(t0, rt);
8441         gen_store_fpr64(ctx, t0, fs);
8442         opn = "dmtc1";
8443         break;
8444 #endif
8445     case OPC_MFHC1:
8446         {
8447             TCGv_i32 fp0 = tcg_temp_new_i32();
8448
8449             gen_load_fpr32h(ctx, fp0, fs);
8450             tcg_gen_ext_i32_tl(t0, fp0);
8451             tcg_temp_free_i32(fp0);
8452         }
8453         gen_store_gpr(t0, rt);
8454         opn = "mfhc1";
8455         break;
8456     case OPC_MTHC1:
8457         gen_load_gpr(t0, rt);
8458         {
8459             TCGv_i32 fp0 = tcg_temp_new_i32();
8460
8461             tcg_gen_trunc_tl_i32(fp0, t0);
8462             gen_store_fpr32h(ctx, fp0, fs);
8463             tcg_temp_free_i32(fp0);
8464         }
8465         opn = "mthc1";
8466         break;
8467     default:
8468         MIPS_INVAL(opn);
8469         generate_exception (ctx, EXCP_RI);
8470         goto out;
8471     }
8472     (void)opn; /* avoid a compiler warning */
8473     MIPS_DEBUG("%s %s %s", opn, regnames[rt], fregnames[fs]);
8474
8475  out:
8476     tcg_temp_free(t0);
8477 }
8478
8479 static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
8480 {
8481     TCGLabel *l1;
8482     TCGCond cond;
8483     TCGv_i32 t0;
8484
8485     if (rd == 0) {
8486         /* Treat as NOP. */
8487         return;
8488     }
8489
8490     if (tf)
8491         cond = TCG_COND_EQ;
8492     else
8493         cond = TCG_COND_NE;
8494
8495     l1 = gen_new_label();
8496     t0 = tcg_temp_new_i32();
8497     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
8498     tcg_gen_brcondi_i32(cond, t0, 0, l1);
8499     tcg_temp_free_i32(t0);
8500     if (rs == 0) {
8501         tcg_gen_movi_tl(cpu_gpr[rd], 0);
8502     } else {
8503         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
8504     }
8505     gen_set_label(l1);
8506 }
8507
8508 static inline void gen_movcf_s(DisasContext *ctx, int fs, int fd, int cc,
8509                                int tf)
8510 {
8511     int cond;
8512     TCGv_i32 t0 = tcg_temp_new_i32();
8513     TCGLabel *l1 = gen_new_label();
8514
8515     if (tf)
8516         cond = TCG_COND_EQ;
8517     else
8518         cond = TCG_COND_NE;
8519
8520     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
8521     tcg_gen_brcondi_i32(cond, t0, 0, l1);
8522     gen_load_fpr32(ctx, t0, fs);
8523     gen_store_fpr32(ctx, t0, fd);
8524     gen_set_label(l1);
8525     tcg_temp_free_i32(t0);
8526 }
8527
8528 static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf)
8529 {
8530     int cond;
8531     TCGv_i32 t0 = tcg_temp_new_i32();
8532     TCGv_i64 fp0;
8533     TCGLabel *l1 = gen_new_label();
8534
8535     if (tf)
8536         cond = TCG_COND_EQ;
8537     else
8538         cond = TCG_COND_NE;
8539
8540     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
8541     tcg_gen_brcondi_i32(cond, t0, 0, l1);
8542     tcg_temp_free_i32(t0);
8543     fp0 = tcg_temp_new_i64();
8544     gen_load_fpr64(ctx, fp0, fs);
8545     gen_store_fpr64(ctx, fp0, fd);
8546     tcg_temp_free_i64(fp0);
8547     gen_set_label(l1);
8548 }
8549
8550 static inline void gen_movcf_ps(DisasContext *ctx, int fs, int fd,
8551                                 int cc, int tf)
8552 {
8553     int cond;
8554     TCGv_i32 t0 = tcg_temp_new_i32();
8555     TCGLabel *l1 = gen_new_label();
8556     TCGLabel *l2 = gen_new_label();
8557
8558     if (tf)
8559         cond = TCG_COND_EQ;
8560     else
8561         cond = TCG_COND_NE;
8562
8563     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
8564     tcg_gen_brcondi_i32(cond, t0, 0, l1);
8565     gen_load_fpr32(ctx, t0, fs);
8566     gen_store_fpr32(ctx, t0, fd);
8567     gen_set_label(l1);
8568
8569     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc+1));
8570     tcg_gen_brcondi_i32(cond, t0, 0, l2);
8571     gen_load_fpr32h(ctx, t0, fs);
8572     gen_store_fpr32h(ctx, t0, fd);
8573     tcg_temp_free_i32(t0);
8574     gen_set_label(l2);
8575 }
8576
8577 static void gen_sel_s(DisasContext *ctx, enum fopcode op1, int fd, int ft,
8578                       int fs)
8579 {
8580     TCGv_i32 t1 = tcg_const_i32(0);
8581     TCGv_i32 fp0 = tcg_temp_new_i32();
8582     TCGv_i32 fp1 = tcg_temp_new_i32();
8583     TCGv_i32 fp2 = tcg_temp_new_i32();
8584     gen_load_fpr32(ctx, fp0, fd);
8585     gen_load_fpr32(ctx, fp1, ft);
8586     gen_load_fpr32(ctx, fp2, fs);
8587
8588     switch (op1) {
8589     case OPC_SEL_S:
8590         tcg_gen_andi_i32(fp0, fp0, 1);
8591         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
8592         break;
8593     case OPC_SELEQZ_S:
8594         tcg_gen_andi_i32(fp1, fp1, 1);
8595         tcg_gen_movcond_i32(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
8596         break;
8597     case OPC_SELNEZ_S:
8598         tcg_gen_andi_i32(fp1, fp1, 1);
8599         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
8600         break;
8601     default:
8602         MIPS_INVAL("gen_sel_s");
8603         generate_exception (ctx, EXCP_RI);
8604         break;
8605     }
8606
8607     gen_store_fpr32(ctx, fp0, fd);
8608     tcg_temp_free_i32(fp2);
8609     tcg_temp_free_i32(fp1);
8610     tcg_temp_free_i32(fp0);
8611     tcg_temp_free_i32(t1);
8612 }
8613
8614 static void gen_sel_d(DisasContext *ctx, enum fopcode op1, int fd, int ft,
8615                       int fs)
8616 {
8617     TCGv_i64 t1 = tcg_const_i64(0);
8618     TCGv_i64 fp0 = tcg_temp_new_i64();
8619     TCGv_i64 fp1 = tcg_temp_new_i64();
8620     TCGv_i64 fp2 = tcg_temp_new_i64();
8621     gen_load_fpr64(ctx, fp0, fd);
8622     gen_load_fpr64(ctx, fp1, ft);
8623     gen_load_fpr64(ctx, fp2, fs);
8624
8625     switch (op1) {
8626     case OPC_SEL_D:
8627         tcg_gen_andi_i64(fp0, fp0, 1);
8628         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
8629         break;
8630     case OPC_SELEQZ_D:
8631         tcg_gen_andi_i64(fp1, fp1, 1);
8632         tcg_gen_movcond_i64(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
8633         break;
8634     case OPC_SELNEZ_D:
8635         tcg_gen_andi_i64(fp1, fp1, 1);
8636         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
8637         break;
8638     default:
8639         MIPS_INVAL("gen_sel_d");
8640         generate_exception (ctx, EXCP_RI);
8641         break;
8642     }
8643
8644     gen_store_fpr64(ctx, fp0, fd);
8645     tcg_temp_free_i64(fp2);
8646     tcg_temp_free_i64(fp1);
8647     tcg_temp_free_i64(fp0);
8648     tcg_temp_free_i64(t1);
8649 }
8650
8651 static void gen_farith (DisasContext *ctx, enum fopcode op1,
8652                         int ft, int fs, int fd, int cc)
8653 {
8654     const char *opn = "farith";
8655     const char *condnames[] = {
8656             "c.f",
8657             "c.un",
8658             "c.eq",
8659             "c.ueq",
8660             "c.olt",
8661             "c.ult",
8662             "c.ole",
8663             "c.ule",
8664             "c.sf",
8665             "c.ngle",
8666             "c.seq",
8667             "c.ngl",
8668             "c.lt",
8669             "c.nge",
8670             "c.le",
8671             "c.ngt",
8672     };
8673     const char *condnames_abs[] = {
8674             "cabs.f",
8675             "cabs.un",
8676             "cabs.eq",
8677             "cabs.ueq",
8678             "cabs.olt",
8679             "cabs.ult",
8680             "cabs.ole",
8681             "cabs.ule",
8682             "cabs.sf",
8683             "cabs.ngle",
8684             "cabs.seq",
8685             "cabs.ngl",
8686             "cabs.lt",
8687             "cabs.nge",
8688             "cabs.le",
8689             "cabs.ngt",
8690     };
8691     enum { BINOP, CMPOP, OTHEROP } optype = OTHEROP;
8692     uint32_t func = ctx->opcode & 0x3f;
8693
8694     switch (op1) {
8695     case OPC_ADD_S:
8696         {
8697             TCGv_i32 fp0 = tcg_temp_new_i32();
8698             TCGv_i32 fp1 = tcg_temp_new_i32();
8699
8700             gen_load_fpr32(ctx, fp0, fs);
8701             gen_load_fpr32(ctx, fp1, ft);
8702             gen_helper_float_add_s(fp0, cpu_env, fp0, fp1);
8703             tcg_temp_free_i32(fp1);
8704             gen_store_fpr32(ctx, fp0, fd);
8705             tcg_temp_free_i32(fp0);
8706         }
8707         opn = "add.s";
8708         optype = BINOP;
8709         break;
8710     case OPC_SUB_S:
8711         {
8712             TCGv_i32 fp0 = tcg_temp_new_i32();
8713             TCGv_i32 fp1 = tcg_temp_new_i32();
8714
8715             gen_load_fpr32(ctx, fp0, fs);
8716             gen_load_fpr32(ctx, fp1, ft);
8717             gen_helper_float_sub_s(fp0, cpu_env, fp0, fp1);
8718             tcg_temp_free_i32(fp1);
8719             gen_store_fpr32(ctx, fp0, fd);
8720             tcg_temp_free_i32(fp0);
8721         }
8722         opn = "sub.s";
8723         optype = BINOP;
8724         break;
8725     case OPC_MUL_S:
8726         {
8727             TCGv_i32 fp0 = tcg_temp_new_i32();
8728             TCGv_i32 fp1 = tcg_temp_new_i32();
8729
8730             gen_load_fpr32(ctx, fp0, fs);
8731             gen_load_fpr32(ctx, fp1, ft);
8732             gen_helper_float_mul_s(fp0, cpu_env, fp0, fp1);
8733             tcg_temp_free_i32(fp1);
8734             gen_store_fpr32(ctx, fp0, fd);
8735             tcg_temp_free_i32(fp0);
8736         }
8737         opn = "mul.s";
8738         optype = BINOP;
8739         break;
8740     case OPC_DIV_S:
8741         {
8742             TCGv_i32 fp0 = tcg_temp_new_i32();
8743             TCGv_i32 fp1 = tcg_temp_new_i32();
8744
8745             gen_load_fpr32(ctx, fp0, fs);
8746             gen_load_fpr32(ctx, fp1, ft);
8747             gen_helper_float_div_s(fp0, cpu_env, fp0, fp1);
8748             tcg_temp_free_i32(fp1);
8749             gen_store_fpr32(ctx, fp0, fd);
8750             tcg_temp_free_i32(fp0);
8751         }
8752         opn = "div.s";
8753         optype = BINOP;
8754         break;
8755     case OPC_SQRT_S:
8756         {
8757             TCGv_i32 fp0 = tcg_temp_new_i32();
8758
8759             gen_load_fpr32(ctx, fp0, fs);
8760             gen_helper_float_sqrt_s(fp0, cpu_env, fp0);
8761             gen_store_fpr32(ctx, fp0, fd);
8762             tcg_temp_free_i32(fp0);
8763         }
8764         opn = "sqrt.s";
8765         break;
8766     case OPC_ABS_S:
8767         {
8768             TCGv_i32 fp0 = tcg_temp_new_i32();
8769
8770             gen_load_fpr32(ctx, fp0, fs);
8771             gen_helper_float_abs_s(fp0, fp0);
8772             gen_store_fpr32(ctx, fp0, fd);
8773             tcg_temp_free_i32(fp0);
8774         }
8775         opn = "abs.s";
8776         break;
8777     case OPC_MOV_S:
8778         {
8779             TCGv_i32 fp0 = tcg_temp_new_i32();
8780
8781             gen_load_fpr32(ctx, fp0, fs);
8782             gen_store_fpr32(ctx, fp0, fd);
8783             tcg_temp_free_i32(fp0);
8784         }
8785         opn = "mov.s";
8786         break;
8787     case OPC_NEG_S:
8788         {
8789             TCGv_i32 fp0 = tcg_temp_new_i32();
8790
8791             gen_load_fpr32(ctx, fp0, fs);
8792             gen_helper_float_chs_s(fp0, fp0);
8793             gen_store_fpr32(ctx, fp0, fd);
8794             tcg_temp_free_i32(fp0);
8795         }
8796         opn = "neg.s";
8797         break;
8798     case OPC_ROUND_L_S:
8799         check_cp1_64bitmode(ctx);
8800         {
8801             TCGv_i32 fp32 = tcg_temp_new_i32();
8802             TCGv_i64 fp64 = tcg_temp_new_i64();
8803
8804             gen_load_fpr32(ctx, fp32, fs);
8805             gen_helper_float_roundl_s(fp64, cpu_env, fp32);
8806             tcg_temp_free_i32(fp32);
8807             gen_store_fpr64(ctx, fp64, fd);
8808             tcg_temp_free_i64(fp64);
8809         }
8810         opn = "round.l.s";
8811         break;
8812     case OPC_TRUNC_L_S:
8813         check_cp1_64bitmode(ctx);
8814         {
8815             TCGv_i32 fp32 = tcg_temp_new_i32();
8816             TCGv_i64 fp64 = tcg_temp_new_i64();
8817
8818             gen_load_fpr32(ctx, fp32, fs);
8819             gen_helper_float_truncl_s(fp64, cpu_env, fp32);
8820             tcg_temp_free_i32(fp32);
8821             gen_store_fpr64(ctx, fp64, fd);
8822             tcg_temp_free_i64(fp64);
8823         }
8824         opn = "trunc.l.s";
8825         break;
8826     case OPC_CEIL_L_S:
8827         check_cp1_64bitmode(ctx);
8828         {
8829             TCGv_i32 fp32 = tcg_temp_new_i32();
8830             TCGv_i64 fp64 = tcg_temp_new_i64();
8831
8832             gen_load_fpr32(ctx, fp32, fs);
8833             gen_helper_float_ceill_s(fp64, cpu_env, fp32);
8834             tcg_temp_free_i32(fp32);
8835             gen_store_fpr64(ctx, fp64, fd);
8836             tcg_temp_free_i64(fp64);
8837         }
8838         opn = "ceil.l.s";
8839         break;
8840     case OPC_FLOOR_L_S:
8841         check_cp1_64bitmode(ctx);
8842         {
8843             TCGv_i32 fp32 = tcg_temp_new_i32();
8844             TCGv_i64 fp64 = tcg_temp_new_i64();
8845
8846             gen_load_fpr32(ctx, fp32, fs);
8847             gen_helper_float_floorl_s(fp64, cpu_env, fp32);
8848             tcg_temp_free_i32(fp32);
8849             gen_store_fpr64(ctx, fp64, fd);
8850             tcg_temp_free_i64(fp64);
8851         }
8852         opn = "floor.l.s";
8853         break;
8854     case OPC_ROUND_W_S:
8855         {
8856             TCGv_i32 fp0 = tcg_temp_new_i32();
8857
8858             gen_load_fpr32(ctx, fp0, fs);
8859             gen_helper_float_roundw_s(fp0, cpu_env, fp0);
8860             gen_store_fpr32(ctx, fp0, fd);
8861             tcg_temp_free_i32(fp0);
8862         }
8863         opn = "round.w.s";
8864         break;
8865     case OPC_TRUNC_W_S:
8866         {
8867             TCGv_i32 fp0 = tcg_temp_new_i32();
8868
8869             gen_load_fpr32(ctx, fp0, fs);
8870             gen_helper_float_truncw_s(fp0, cpu_env, fp0);
8871             gen_store_fpr32(ctx, fp0, fd);
8872             tcg_temp_free_i32(fp0);
8873         }
8874         opn = "trunc.w.s";
8875         break;
8876     case OPC_CEIL_W_S:
8877         {
8878             TCGv_i32 fp0 = tcg_temp_new_i32();
8879
8880             gen_load_fpr32(ctx, fp0, fs);
8881             gen_helper_float_ceilw_s(fp0, cpu_env, fp0);
8882             gen_store_fpr32(ctx, fp0, fd);
8883             tcg_temp_free_i32(fp0);
8884         }
8885         opn = "ceil.w.s";
8886         break;
8887     case OPC_FLOOR_W_S:
8888         {
8889             TCGv_i32 fp0 = tcg_temp_new_i32();
8890
8891             gen_load_fpr32(ctx, fp0, fs);
8892             gen_helper_float_floorw_s(fp0, cpu_env, fp0);
8893             gen_store_fpr32(ctx, fp0, fd);
8894             tcg_temp_free_i32(fp0);
8895         }
8896         opn = "floor.w.s";
8897         break;
8898     case OPC_SEL_S:
8899         check_insn(ctx, ISA_MIPS32R6);
8900         gen_sel_s(ctx, op1, fd, ft, fs);
8901         opn = "sel.s";
8902         break;
8903     case OPC_SELEQZ_S:
8904         check_insn(ctx, ISA_MIPS32R6);
8905         gen_sel_s(ctx, op1, fd, ft, fs);
8906         opn = "seleqz.s";
8907         break;
8908     case OPC_SELNEZ_S:
8909         check_insn(ctx, ISA_MIPS32R6);
8910         gen_sel_s(ctx, op1, fd, ft, fs);
8911         opn = "selnez.s";
8912         break;
8913     case OPC_MOVCF_S:
8914         check_insn_opc_removed(ctx, ISA_MIPS32R6);
8915         gen_movcf_s(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
8916         opn = "movcf.s";
8917         break;
8918     case OPC_MOVZ_S:
8919         check_insn_opc_removed(ctx, ISA_MIPS32R6);
8920         {
8921             TCGLabel *l1 = gen_new_label();
8922             TCGv_i32 fp0;
8923
8924             if (ft != 0) {
8925                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
8926             }
8927             fp0 = tcg_temp_new_i32();
8928             gen_load_fpr32(ctx, fp0, fs);
8929             gen_store_fpr32(ctx, fp0, fd);
8930             tcg_temp_free_i32(fp0);
8931             gen_set_label(l1);
8932         }
8933         opn = "movz.s";
8934         break;
8935     case OPC_MOVN_S:
8936         check_insn_opc_removed(ctx, ISA_MIPS32R6);
8937         {
8938             TCGLabel *l1 = gen_new_label();
8939             TCGv_i32 fp0;
8940
8941             if (ft != 0) {
8942                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
8943                 fp0 = tcg_temp_new_i32();
8944                 gen_load_fpr32(ctx, fp0, fs);
8945                 gen_store_fpr32(ctx, fp0, fd);
8946                 tcg_temp_free_i32(fp0);
8947                 gen_set_label(l1);
8948             }
8949         }
8950         opn = "movn.s";
8951         break;
8952     case OPC_RECIP_S:
8953         check_cop1x(ctx);
8954         {
8955             TCGv_i32 fp0 = tcg_temp_new_i32();
8956
8957             gen_load_fpr32(ctx, fp0, fs);
8958             gen_helper_float_recip_s(fp0, cpu_env, fp0);
8959             gen_store_fpr32(ctx, fp0, fd);
8960             tcg_temp_free_i32(fp0);
8961         }
8962         opn = "recip.s";
8963         break;
8964     case OPC_RSQRT_S:
8965         check_cop1x(ctx);
8966         {
8967             TCGv_i32 fp0 = tcg_temp_new_i32();
8968
8969             gen_load_fpr32(ctx, fp0, fs);
8970             gen_helper_float_rsqrt_s(fp0, cpu_env, fp0);
8971             gen_store_fpr32(ctx, fp0, fd);
8972             tcg_temp_free_i32(fp0);
8973         }
8974         opn = "rsqrt.s";
8975         break;
8976     case OPC_MADDF_S:
8977         check_insn(ctx, ISA_MIPS32R6);
8978         {
8979             TCGv_i32 fp0 = tcg_temp_new_i32();
8980             TCGv_i32 fp1 = tcg_temp_new_i32();
8981             TCGv_i32 fp2 = tcg_temp_new_i32();
8982             gen_load_fpr32(ctx, fp0, fs);
8983             gen_load_fpr32(ctx, fp1, ft);
8984             gen_load_fpr32(ctx, fp2, fd);
8985             gen_helper_float_maddf_s(fp2, cpu_env, fp0, fp1, fp2);
8986             gen_store_fpr32(ctx, fp2, fd);
8987             tcg_temp_free_i32(fp2);
8988             tcg_temp_free_i32(fp1);
8989             tcg_temp_free_i32(fp0);
8990             opn = "maddf.s";
8991         }
8992         break;
8993     case OPC_MSUBF_S:
8994         check_insn(ctx, ISA_MIPS32R6);
8995         {
8996             TCGv_i32 fp0 = tcg_temp_new_i32();
8997             TCGv_i32 fp1 = tcg_temp_new_i32();
8998             TCGv_i32 fp2 = tcg_temp_new_i32();
8999             gen_load_fpr32(ctx, fp0, fs);
9000             gen_load_fpr32(ctx, fp1, ft);
9001             gen_load_fpr32(ctx, fp2, fd);
9002             gen_helper_float_msubf_s(fp2, cpu_env, fp0, fp1, fp2);
9003             gen_store_fpr32(ctx, fp2, fd);
9004             tcg_temp_free_i32(fp2);
9005             tcg_temp_free_i32(fp1);
9006             tcg_temp_free_i32(fp0);
9007             opn = "msubf.s";
9008         }
9009         break;
9010     case OPC_RINT_S:
9011         check_insn(ctx, ISA_MIPS32R6);
9012         {
9013             TCGv_i32 fp0 = tcg_temp_new_i32();
9014             gen_load_fpr32(ctx, fp0, fs);
9015             gen_helper_float_rint_s(fp0, cpu_env, fp0);
9016             gen_store_fpr32(ctx, fp0, fd);
9017             tcg_temp_free_i32(fp0);
9018             opn = "rint.s";
9019         }
9020         break;
9021     case OPC_CLASS_S:
9022         check_insn(ctx, ISA_MIPS32R6);
9023         {
9024             TCGv_i32 fp0 = tcg_temp_new_i32();
9025             gen_load_fpr32(ctx, fp0, fs);
9026             gen_helper_float_class_s(fp0, fp0);
9027             gen_store_fpr32(ctx, fp0, fd);
9028             tcg_temp_free_i32(fp0);
9029             opn = "class.s";
9030         }
9031         break;
9032     case OPC_MIN_S: /* OPC_RECIP2_S */
9033         if (ctx->insn_flags & ISA_MIPS32R6) {
9034             /* OPC_MIN_S */
9035             TCGv_i32 fp0 = tcg_temp_new_i32();
9036             TCGv_i32 fp1 = tcg_temp_new_i32();
9037             TCGv_i32 fp2 = tcg_temp_new_i32();
9038             gen_load_fpr32(ctx, fp0, fs);
9039             gen_load_fpr32(ctx, fp1, ft);
9040             gen_helper_float_min_s(fp2, cpu_env, fp0, fp1);
9041             gen_store_fpr32(ctx, fp2, fd);
9042             tcg_temp_free_i32(fp2);
9043             tcg_temp_free_i32(fp1);
9044             tcg_temp_free_i32(fp0);
9045             opn = "min.s";
9046         } else {
9047             /* OPC_RECIP2_S */
9048             check_cp1_64bitmode(ctx);
9049             {
9050                 TCGv_i32 fp0 = tcg_temp_new_i32();
9051                 TCGv_i32 fp1 = tcg_temp_new_i32();
9052
9053                 gen_load_fpr32(ctx, fp0, fs);
9054                 gen_load_fpr32(ctx, fp1, ft);
9055                 gen_helper_float_recip2_s(fp0, cpu_env, fp0, fp1);
9056                 tcg_temp_free_i32(fp1);
9057                 gen_store_fpr32(ctx, fp0, fd);
9058                 tcg_temp_free_i32(fp0);
9059             }
9060             opn = "recip2.s";
9061         }
9062         break;
9063     case OPC_MINA_S: /* OPC_RECIP1_S */
9064         if (ctx->insn_flags & ISA_MIPS32R6) {
9065             /* OPC_MINA_S */
9066             TCGv_i32 fp0 = tcg_temp_new_i32();
9067             TCGv_i32 fp1 = tcg_temp_new_i32();
9068             TCGv_i32 fp2 = tcg_temp_new_i32();
9069             gen_load_fpr32(ctx, fp0, fs);
9070             gen_load_fpr32(ctx, fp1, ft);
9071             gen_helper_float_mina_s(fp2, cpu_env, fp0, fp1);
9072             gen_store_fpr32(ctx, fp2, fd);
9073             tcg_temp_free_i32(fp2);
9074             tcg_temp_free_i32(fp1);
9075             tcg_temp_free_i32(fp0);
9076             opn = "mina.s";
9077         } else {
9078             /* OPC_RECIP1_S */
9079             check_cp1_64bitmode(ctx);
9080             {
9081                 TCGv_i32 fp0 = tcg_temp_new_i32();
9082
9083                 gen_load_fpr32(ctx, fp0, fs);
9084                 gen_helper_float_recip1_s(fp0, cpu_env, fp0);
9085                 gen_store_fpr32(ctx, fp0, fd);
9086                 tcg_temp_free_i32(fp0);
9087             }
9088             opn = "recip1.s";
9089         }
9090         break;
9091     case OPC_MAX_S: /* OPC_RSQRT1_S */
9092         if (ctx->insn_flags & ISA_MIPS32R6) {
9093             /* OPC_MAX_S */
9094             TCGv_i32 fp0 = tcg_temp_new_i32();
9095             TCGv_i32 fp1 = tcg_temp_new_i32();
9096             gen_load_fpr32(ctx, fp0, fs);
9097             gen_load_fpr32(ctx, fp1, ft);
9098             gen_helper_float_max_s(fp1, cpu_env, fp0, fp1);
9099             gen_store_fpr32(ctx, fp1, fd);
9100             tcg_temp_free_i32(fp1);
9101             tcg_temp_free_i32(fp0);
9102             opn = "max.s";
9103         } else {
9104             /* OPC_RSQRT1_S */
9105             check_cp1_64bitmode(ctx);
9106             {
9107                 TCGv_i32 fp0 = tcg_temp_new_i32();
9108
9109                 gen_load_fpr32(ctx, fp0, fs);
9110                 gen_helper_float_rsqrt1_s(fp0, cpu_env, fp0);
9111                 gen_store_fpr32(ctx, fp0, fd);
9112                 tcg_temp_free_i32(fp0);
9113             }
9114             opn = "rsqrt1.s";
9115         }
9116         break;
9117     case OPC_MAXA_S: /* OPC_RSQRT2_S */
9118         if (ctx->insn_flags & ISA_MIPS32R6) {
9119             /* OPC_MAXA_S */
9120             TCGv_i32 fp0 = tcg_temp_new_i32();
9121             TCGv_i32 fp1 = tcg_temp_new_i32();
9122             gen_load_fpr32(ctx, fp0, fs);
9123             gen_load_fpr32(ctx, fp1, ft);
9124             gen_helper_float_maxa_s(fp1, cpu_env, fp0, fp1);
9125             gen_store_fpr32(ctx, fp1, fd);
9126             tcg_temp_free_i32(fp1);
9127             tcg_temp_free_i32(fp0);
9128             opn = "maxa.s";
9129         } else {
9130             /* OPC_RSQRT2_S */
9131             check_cp1_64bitmode(ctx);
9132             {
9133                 TCGv_i32 fp0 = tcg_temp_new_i32();
9134                 TCGv_i32 fp1 = tcg_temp_new_i32();
9135
9136                 gen_load_fpr32(ctx, fp0, fs);
9137                 gen_load_fpr32(ctx, fp1, ft);
9138                 gen_helper_float_rsqrt2_s(fp0, cpu_env, fp0, fp1);
9139                 tcg_temp_free_i32(fp1);
9140                 gen_store_fpr32(ctx, fp0, fd);
9141                 tcg_temp_free_i32(fp0);
9142             }
9143             opn = "rsqrt2.s";
9144         }
9145         break;
9146     case OPC_CVT_D_S:
9147         check_cp1_registers(ctx, fd);
9148         {
9149             TCGv_i32 fp32 = tcg_temp_new_i32();
9150             TCGv_i64 fp64 = tcg_temp_new_i64();
9151
9152             gen_load_fpr32(ctx, fp32, fs);
9153             gen_helper_float_cvtd_s(fp64, cpu_env, fp32);
9154             tcg_temp_free_i32(fp32);
9155             gen_store_fpr64(ctx, fp64, fd);
9156             tcg_temp_free_i64(fp64);
9157         }
9158         opn = "cvt.d.s";
9159         break;
9160     case OPC_CVT_W_S:
9161         {
9162             TCGv_i32 fp0 = tcg_temp_new_i32();
9163
9164             gen_load_fpr32(ctx, fp0, fs);
9165             gen_helper_float_cvtw_s(fp0, cpu_env, fp0);
9166             gen_store_fpr32(ctx, fp0, fd);
9167             tcg_temp_free_i32(fp0);
9168         }
9169         opn = "cvt.w.s";
9170         break;
9171     case OPC_CVT_L_S:
9172         check_cp1_64bitmode(ctx);
9173         {
9174             TCGv_i32 fp32 = tcg_temp_new_i32();
9175             TCGv_i64 fp64 = tcg_temp_new_i64();
9176
9177             gen_load_fpr32(ctx, fp32, fs);
9178             gen_helper_float_cvtl_s(fp64, cpu_env, fp32);
9179             tcg_temp_free_i32(fp32);
9180             gen_store_fpr64(ctx, fp64, fd);
9181             tcg_temp_free_i64(fp64);
9182         }
9183         opn = "cvt.l.s";
9184         break;
9185     case OPC_CVT_PS_S:
9186         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9187         check_cp1_64bitmode(ctx);
9188         {
9189             TCGv_i64 fp64 = tcg_temp_new_i64();
9190             TCGv_i32 fp32_0 = tcg_temp_new_i32();
9191             TCGv_i32 fp32_1 = tcg_temp_new_i32();
9192
9193             gen_load_fpr32(ctx, fp32_0, fs);
9194             gen_load_fpr32(ctx, fp32_1, ft);
9195             tcg_gen_concat_i32_i64(fp64, fp32_1, fp32_0);
9196             tcg_temp_free_i32(fp32_1);
9197             tcg_temp_free_i32(fp32_0);
9198             gen_store_fpr64(ctx, fp64, fd);
9199             tcg_temp_free_i64(fp64);
9200         }
9201         opn = "cvt.ps.s";
9202         break;
9203     case OPC_CMP_F_S:
9204     case OPC_CMP_UN_S:
9205     case OPC_CMP_EQ_S:
9206     case OPC_CMP_UEQ_S:
9207     case OPC_CMP_OLT_S:
9208     case OPC_CMP_ULT_S:
9209     case OPC_CMP_OLE_S:
9210     case OPC_CMP_ULE_S:
9211     case OPC_CMP_SF_S:
9212     case OPC_CMP_NGLE_S:
9213     case OPC_CMP_SEQ_S:
9214     case OPC_CMP_NGL_S:
9215     case OPC_CMP_LT_S:
9216     case OPC_CMP_NGE_S:
9217     case OPC_CMP_LE_S:
9218     case OPC_CMP_NGT_S:
9219         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9220         if (ctx->opcode & (1 << 6)) {
9221             gen_cmpabs_s(ctx, func-48, ft, fs, cc);
9222             opn = condnames_abs[func-48];
9223         } else {
9224             gen_cmp_s(ctx, func-48, ft, fs, cc);
9225             opn = condnames[func-48];
9226         }
9227         break;
9228     case OPC_ADD_D:
9229         check_cp1_registers(ctx, fs | ft | fd);
9230         {
9231             TCGv_i64 fp0 = tcg_temp_new_i64();
9232             TCGv_i64 fp1 = tcg_temp_new_i64();
9233
9234             gen_load_fpr64(ctx, fp0, fs);
9235             gen_load_fpr64(ctx, fp1, ft);
9236             gen_helper_float_add_d(fp0, cpu_env, fp0, fp1);
9237             tcg_temp_free_i64(fp1);
9238             gen_store_fpr64(ctx, fp0, fd);
9239             tcg_temp_free_i64(fp0);
9240         }
9241         opn = "add.d";
9242         optype = BINOP;
9243         break;
9244     case OPC_SUB_D:
9245         check_cp1_registers(ctx, fs | ft | fd);
9246         {
9247             TCGv_i64 fp0 = tcg_temp_new_i64();
9248             TCGv_i64 fp1 = tcg_temp_new_i64();
9249
9250             gen_load_fpr64(ctx, fp0, fs);
9251             gen_load_fpr64(ctx, fp1, ft);
9252             gen_helper_float_sub_d(fp0, cpu_env, fp0, fp1);
9253             tcg_temp_free_i64(fp1);
9254             gen_store_fpr64(ctx, fp0, fd);
9255             tcg_temp_free_i64(fp0);
9256         }
9257         opn = "sub.d";
9258         optype = BINOP;
9259         break;
9260     case OPC_MUL_D:
9261         check_cp1_registers(ctx, fs | ft | fd);
9262         {
9263             TCGv_i64 fp0 = tcg_temp_new_i64();
9264             TCGv_i64 fp1 = tcg_temp_new_i64();
9265
9266             gen_load_fpr64(ctx, fp0, fs);
9267             gen_load_fpr64(ctx, fp1, ft);
9268             gen_helper_float_mul_d(fp0, cpu_env, fp0, fp1);
9269             tcg_temp_free_i64(fp1);
9270             gen_store_fpr64(ctx, fp0, fd);
9271             tcg_temp_free_i64(fp0);
9272         }
9273         opn = "mul.d";
9274         optype = BINOP;
9275         break;
9276     case OPC_DIV_D:
9277         check_cp1_registers(ctx, fs | ft | fd);
9278         {
9279             TCGv_i64 fp0 = tcg_temp_new_i64();
9280             TCGv_i64 fp1 = tcg_temp_new_i64();
9281
9282             gen_load_fpr64(ctx, fp0, fs);
9283             gen_load_fpr64(ctx, fp1, ft);
9284             gen_helper_float_div_d(fp0, cpu_env, fp0, fp1);
9285             tcg_temp_free_i64(fp1);
9286             gen_store_fpr64(ctx, fp0, fd);
9287             tcg_temp_free_i64(fp0);
9288         }
9289         opn = "div.d";
9290         optype = BINOP;
9291         break;
9292     case OPC_SQRT_D:
9293         check_cp1_registers(ctx, fs | fd);
9294         {
9295             TCGv_i64 fp0 = tcg_temp_new_i64();
9296
9297             gen_load_fpr64(ctx, fp0, fs);
9298             gen_helper_float_sqrt_d(fp0, cpu_env, fp0);
9299             gen_store_fpr64(ctx, fp0, fd);
9300             tcg_temp_free_i64(fp0);
9301         }
9302         opn = "sqrt.d";
9303         break;
9304     case OPC_ABS_D:
9305         check_cp1_registers(ctx, fs | fd);
9306         {
9307             TCGv_i64 fp0 = tcg_temp_new_i64();
9308
9309             gen_load_fpr64(ctx, fp0, fs);
9310             gen_helper_float_abs_d(fp0, fp0);
9311             gen_store_fpr64(ctx, fp0, fd);
9312             tcg_temp_free_i64(fp0);
9313         }
9314         opn = "abs.d";
9315         break;
9316     case OPC_MOV_D:
9317         check_cp1_registers(ctx, fs | fd);
9318         {
9319             TCGv_i64 fp0 = tcg_temp_new_i64();
9320
9321             gen_load_fpr64(ctx, fp0, fs);
9322             gen_store_fpr64(ctx, fp0, fd);
9323             tcg_temp_free_i64(fp0);
9324         }
9325         opn = "mov.d";
9326         break;
9327     case OPC_NEG_D:
9328         check_cp1_registers(ctx, fs | fd);
9329         {
9330             TCGv_i64 fp0 = tcg_temp_new_i64();
9331
9332             gen_load_fpr64(ctx, fp0, fs);
9333             gen_helper_float_chs_d(fp0, fp0);
9334             gen_store_fpr64(ctx, fp0, fd);
9335             tcg_temp_free_i64(fp0);
9336         }
9337         opn = "neg.d";
9338         break;
9339     case OPC_ROUND_L_D:
9340         check_cp1_64bitmode(ctx);
9341         {
9342             TCGv_i64 fp0 = tcg_temp_new_i64();
9343
9344             gen_load_fpr64(ctx, fp0, fs);
9345             gen_helper_float_roundl_d(fp0, cpu_env, fp0);
9346             gen_store_fpr64(ctx, fp0, fd);
9347             tcg_temp_free_i64(fp0);
9348         }
9349         opn = "round.l.d";
9350         break;
9351     case OPC_TRUNC_L_D:
9352         check_cp1_64bitmode(ctx);
9353         {
9354             TCGv_i64 fp0 = tcg_temp_new_i64();
9355
9356             gen_load_fpr64(ctx, fp0, fs);
9357             gen_helper_float_truncl_d(fp0, cpu_env, fp0);
9358             gen_store_fpr64(ctx, fp0, fd);
9359             tcg_temp_free_i64(fp0);
9360         }
9361         opn = "trunc.l.d";
9362         break;
9363     case OPC_CEIL_L_D:
9364         check_cp1_64bitmode(ctx);
9365         {
9366             TCGv_i64 fp0 = tcg_temp_new_i64();
9367
9368             gen_load_fpr64(ctx, fp0, fs);
9369             gen_helper_float_ceill_d(fp0, cpu_env, fp0);
9370             gen_store_fpr64(ctx, fp0, fd);
9371             tcg_temp_free_i64(fp0);
9372         }
9373         opn = "ceil.l.d";
9374         break;
9375     case OPC_FLOOR_L_D:
9376         check_cp1_64bitmode(ctx);
9377         {
9378             TCGv_i64 fp0 = tcg_temp_new_i64();
9379
9380             gen_load_fpr64(ctx, fp0, fs);
9381             gen_helper_float_floorl_d(fp0, cpu_env, fp0);
9382             gen_store_fpr64(ctx, fp0, fd);
9383             tcg_temp_free_i64(fp0);
9384         }
9385         opn = "floor.l.d";
9386         break;
9387     case OPC_ROUND_W_D:
9388         check_cp1_registers(ctx, fs);
9389         {
9390             TCGv_i32 fp32 = tcg_temp_new_i32();
9391             TCGv_i64 fp64 = tcg_temp_new_i64();
9392
9393             gen_load_fpr64(ctx, fp64, fs);
9394             gen_helper_float_roundw_d(fp32, cpu_env, fp64);
9395             tcg_temp_free_i64(fp64);
9396             gen_store_fpr32(ctx, fp32, fd);
9397             tcg_temp_free_i32(fp32);
9398         }
9399         opn = "round.w.d";
9400         break;
9401     case OPC_TRUNC_W_D:
9402         check_cp1_registers(ctx, fs);
9403         {
9404             TCGv_i32 fp32 = tcg_temp_new_i32();
9405             TCGv_i64 fp64 = tcg_temp_new_i64();
9406
9407             gen_load_fpr64(ctx, fp64, fs);
9408             gen_helper_float_truncw_d(fp32, cpu_env, fp64);
9409             tcg_temp_free_i64(fp64);
9410             gen_store_fpr32(ctx, fp32, fd);
9411             tcg_temp_free_i32(fp32);
9412         }
9413         opn = "trunc.w.d";
9414         break;
9415     case OPC_CEIL_W_D:
9416         check_cp1_registers(ctx, fs);
9417         {
9418             TCGv_i32 fp32 = tcg_temp_new_i32();
9419             TCGv_i64 fp64 = tcg_temp_new_i64();
9420
9421             gen_load_fpr64(ctx, fp64, fs);
9422             gen_helper_float_ceilw_d(fp32, cpu_env, fp64);
9423             tcg_temp_free_i64(fp64);
9424             gen_store_fpr32(ctx, fp32, fd);
9425             tcg_temp_free_i32(fp32);
9426         }
9427         opn = "ceil.w.d";
9428         break;
9429     case OPC_FLOOR_W_D:
9430         check_cp1_registers(ctx, fs);
9431         {
9432             TCGv_i32 fp32 = tcg_temp_new_i32();
9433             TCGv_i64 fp64 = tcg_temp_new_i64();
9434
9435             gen_load_fpr64(ctx, fp64, fs);
9436             gen_helper_float_floorw_d(fp32, cpu_env, fp64);
9437             tcg_temp_free_i64(fp64);
9438             gen_store_fpr32(ctx, fp32, fd);
9439             tcg_temp_free_i32(fp32);
9440         }
9441         opn = "floor.w.d";
9442         break;
9443     case OPC_SEL_D:
9444         check_insn(ctx, ISA_MIPS32R6);
9445         gen_sel_d(ctx, op1, fd, ft, fs);
9446         opn = "sel.d";
9447         break;
9448     case OPC_SELEQZ_D:
9449         check_insn(ctx, ISA_MIPS32R6);
9450         gen_sel_d(ctx, op1, fd, ft, fs);
9451         opn = "seleqz.d";
9452         break;
9453     case OPC_SELNEZ_D:
9454         check_insn(ctx, ISA_MIPS32R6);
9455         gen_sel_d(ctx, op1, fd, ft, fs);
9456         opn = "selnez.d";
9457         break;
9458     case OPC_MOVCF_D:
9459         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9460         gen_movcf_d(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
9461         opn = "movcf.d";
9462         break;
9463     case OPC_MOVZ_D:
9464         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9465         {
9466             TCGLabel *l1 = gen_new_label();
9467             TCGv_i64 fp0;
9468
9469             if (ft != 0) {
9470                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
9471             }
9472             fp0 = tcg_temp_new_i64();
9473             gen_load_fpr64(ctx, fp0, fs);
9474             gen_store_fpr64(ctx, fp0, fd);
9475             tcg_temp_free_i64(fp0);
9476             gen_set_label(l1);
9477         }
9478         opn = "movz.d";
9479         break;
9480     case OPC_MOVN_D:
9481         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9482         {
9483             TCGLabel *l1 = gen_new_label();
9484             TCGv_i64 fp0;
9485
9486             if (ft != 0) {
9487                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
9488                 fp0 = tcg_temp_new_i64();
9489                 gen_load_fpr64(ctx, fp0, fs);
9490                 gen_store_fpr64(ctx, fp0, fd);
9491                 tcg_temp_free_i64(fp0);
9492                 gen_set_label(l1);
9493             }
9494         }
9495         opn = "movn.d";
9496         break;
9497     case OPC_RECIP_D:
9498         check_cp1_64bitmode(ctx);
9499         {
9500             TCGv_i64 fp0 = tcg_temp_new_i64();
9501
9502             gen_load_fpr64(ctx, fp0, fs);
9503             gen_helper_float_recip_d(fp0, cpu_env, fp0);
9504             gen_store_fpr64(ctx, fp0, fd);
9505             tcg_temp_free_i64(fp0);
9506         }
9507         opn = "recip.d";
9508         break;
9509     case OPC_RSQRT_D:
9510         check_cp1_64bitmode(ctx);
9511         {
9512             TCGv_i64 fp0 = tcg_temp_new_i64();
9513
9514             gen_load_fpr64(ctx, fp0, fs);
9515             gen_helper_float_rsqrt_d(fp0, cpu_env, fp0);
9516             gen_store_fpr64(ctx, fp0, fd);
9517             tcg_temp_free_i64(fp0);
9518         }
9519         opn = "rsqrt.d";
9520         break;
9521     case OPC_MADDF_D:
9522         check_insn(ctx, ISA_MIPS32R6);
9523         {
9524             TCGv_i64 fp0 = tcg_temp_new_i64();
9525             TCGv_i64 fp1 = tcg_temp_new_i64();
9526             TCGv_i64 fp2 = tcg_temp_new_i64();
9527             gen_load_fpr64(ctx, fp0, fs);
9528             gen_load_fpr64(ctx, fp1, ft);
9529             gen_load_fpr64(ctx, fp2, fd);
9530             gen_helper_float_maddf_d(fp2, cpu_env, fp0, fp1, fp2);
9531             gen_store_fpr64(ctx, fp2, fd);
9532             tcg_temp_free_i64(fp2);
9533             tcg_temp_free_i64(fp1);
9534             tcg_temp_free_i64(fp0);
9535             opn = "maddf.d";
9536         }
9537         break;
9538     case OPC_MSUBF_D:
9539         check_insn(ctx, ISA_MIPS32R6);
9540         {
9541             TCGv_i64 fp0 = tcg_temp_new_i64();
9542             TCGv_i64 fp1 = tcg_temp_new_i64();
9543             TCGv_i64 fp2 = tcg_temp_new_i64();
9544             gen_load_fpr64(ctx, fp0, fs);
9545             gen_load_fpr64(ctx, fp1, ft);
9546             gen_load_fpr64(ctx, fp2, fd);
9547             gen_helper_float_msubf_d(fp2, cpu_env, fp0, fp1, fp2);
9548             gen_store_fpr64(ctx, fp2, fd);
9549             tcg_temp_free_i64(fp2);
9550             tcg_temp_free_i64(fp1);
9551             tcg_temp_free_i64(fp0);
9552             opn = "msubf.d";
9553         }
9554         break;
9555     case OPC_RINT_D:
9556         check_insn(ctx, ISA_MIPS32R6);
9557         {
9558             TCGv_i64 fp0 = tcg_temp_new_i64();
9559             gen_load_fpr64(ctx, fp0, fs);
9560             gen_helper_float_rint_d(fp0, cpu_env, fp0);
9561             gen_store_fpr64(ctx, fp0, fd);
9562             tcg_temp_free_i64(fp0);
9563             opn = "rint.d";
9564         }
9565         break;
9566     case OPC_CLASS_D:
9567         check_insn(ctx, ISA_MIPS32R6);
9568         {
9569             TCGv_i64 fp0 = tcg_temp_new_i64();
9570             gen_load_fpr64(ctx, fp0, fs);
9571             gen_helper_float_class_d(fp0, fp0);
9572             gen_store_fpr64(ctx, fp0, fd);
9573             tcg_temp_free_i64(fp0);
9574             opn = "class.d";
9575         }
9576         break;
9577     case OPC_MIN_D: /* OPC_RECIP2_D */
9578         if (ctx->insn_flags & ISA_MIPS32R6) {
9579             /* OPC_MIN_D */
9580             TCGv_i64 fp0 = tcg_temp_new_i64();
9581             TCGv_i64 fp1 = tcg_temp_new_i64();
9582             gen_load_fpr64(ctx, fp0, fs);
9583             gen_load_fpr64(ctx, fp1, ft);
9584             gen_helper_float_min_d(fp1, cpu_env, fp0, fp1);
9585             gen_store_fpr64(ctx, fp1, fd);
9586             tcg_temp_free_i64(fp1);
9587             tcg_temp_free_i64(fp0);
9588             opn = "min.d";
9589         } else {
9590             /* OPC_RECIP2_D */
9591             check_cp1_64bitmode(ctx);
9592             {
9593                 TCGv_i64 fp0 = tcg_temp_new_i64();
9594                 TCGv_i64 fp1 = tcg_temp_new_i64();
9595
9596                 gen_load_fpr64(ctx, fp0, fs);
9597                 gen_load_fpr64(ctx, fp1, ft);
9598                 gen_helper_float_recip2_d(fp0, cpu_env, fp0, fp1);
9599                 tcg_temp_free_i64(fp1);
9600                 gen_store_fpr64(ctx, fp0, fd);
9601                 tcg_temp_free_i64(fp0);
9602             }
9603             opn = "recip2.d";
9604         }
9605         break;
9606     case OPC_MINA_D: /* OPC_RECIP1_D */
9607         if (ctx->insn_flags & ISA_MIPS32R6) {
9608             /* OPC_MINA_D */
9609             TCGv_i64 fp0 = tcg_temp_new_i64();
9610             TCGv_i64 fp1 = tcg_temp_new_i64();
9611             gen_load_fpr64(ctx, fp0, fs);
9612             gen_load_fpr64(ctx, fp1, ft);
9613             gen_helper_float_mina_d(fp1, cpu_env, fp0, fp1);
9614             gen_store_fpr64(ctx, fp1, fd);
9615             tcg_temp_free_i64(fp1);
9616             tcg_temp_free_i64(fp0);
9617             opn = "mina.d";
9618         } else {
9619             /* OPC_RECIP1_D */
9620             check_cp1_64bitmode(ctx);
9621             {
9622                 TCGv_i64 fp0 = tcg_temp_new_i64();
9623
9624                 gen_load_fpr64(ctx, fp0, fs);
9625                 gen_helper_float_recip1_d(fp0, cpu_env, fp0);
9626                 gen_store_fpr64(ctx, fp0, fd);
9627                 tcg_temp_free_i64(fp0);
9628             }
9629             opn = "recip1.d";
9630         }
9631         break;
9632     case OPC_MAX_D: /*  OPC_RSQRT1_D */
9633         if (ctx->insn_flags & ISA_MIPS32R6) {
9634             /* OPC_MAX_D */
9635             TCGv_i64 fp0 = tcg_temp_new_i64();
9636             TCGv_i64 fp1 = tcg_temp_new_i64();
9637             gen_load_fpr64(ctx, fp0, fs);
9638             gen_load_fpr64(ctx, fp1, ft);
9639             gen_helper_float_max_d(fp1, cpu_env, fp0, fp1);
9640             gen_store_fpr64(ctx, fp1, fd);
9641             tcg_temp_free_i64(fp1);
9642             tcg_temp_free_i64(fp0);
9643             opn = "max.d";
9644         } else {
9645             /* OPC_RSQRT1_D */
9646             check_cp1_64bitmode(ctx);
9647             {
9648                 TCGv_i64 fp0 = tcg_temp_new_i64();
9649
9650                 gen_load_fpr64(ctx, fp0, fs);
9651                 gen_helper_float_rsqrt1_d(fp0, cpu_env, fp0);
9652                 gen_store_fpr64(ctx, fp0, fd);
9653                 tcg_temp_free_i64(fp0);
9654             }
9655             opn = "rsqrt1.d";
9656         }
9657         break;
9658     case OPC_MAXA_D: /* OPC_RSQRT2_D */
9659         if (ctx->insn_flags & ISA_MIPS32R6) {
9660             /* OPC_MAXA_D */
9661             TCGv_i64 fp0 = tcg_temp_new_i64();
9662             TCGv_i64 fp1 = tcg_temp_new_i64();
9663             gen_load_fpr64(ctx, fp0, fs);
9664             gen_load_fpr64(ctx, fp1, ft);
9665             gen_helper_float_maxa_d(fp1, cpu_env, fp0, fp1);
9666             gen_store_fpr64(ctx, fp1, fd);
9667             tcg_temp_free_i64(fp1);
9668             tcg_temp_free_i64(fp0);
9669             opn = "maxa.d";
9670         } else {
9671             /* OPC_RSQRT2_D */
9672             check_cp1_64bitmode(ctx);
9673             {
9674                 TCGv_i64 fp0 = tcg_temp_new_i64();
9675                 TCGv_i64 fp1 = tcg_temp_new_i64();
9676
9677                 gen_load_fpr64(ctx, fp0, fs);
9678                 gen_load_fpr64(ctx, fp1, ft);
9679                 gen_helper_float_rsqrt2_d(fp0, cpu_env, fp0, fp1);
9680                 tcg_temp_free_i64(fp1);
9681                 gen_store_fpr64(ctx, fp0, fd);
9682                 tcg_temp_free_i64(fp0);
9683             }
9684             opn = "rsqrt2.d";
9685         }
9686         break;
9687     case OPC_CMP_F_D:
9688     case OPC_CMP_UN_D:
9689     case OPC_CMP_EQ_D:
9690     case OPC_CMP_UEQ_D:
9691     case OPC_CMP_OLT_D:
9692     case OPC_CMP_ULT_D:
9693     case OPC_CMP_OLE_D:
9694     case OPC_CMP_ULE_D:
9695     case OPC_CMP_SF_D:
9696     case OPC_CMP_NGLE_D:
9697     case OPC_CMP_SEQ_D:
9698     case OPC_CMP_NGL_D:
9699     case OPC_CMP_LT_D:
9700     case OPC_CMP_NGE_D:
9701     case OPC_CMP_LE_D:
9702     case OPC_CMP_NGT_D:
9703         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9704         if (ctx->opcode & (1 << 6)) {
9705             gen_cmpabs_d(ctx, func-48, ft, fs, cc);
9706             opn = condnames_abs[func-48];
9707         } else {
9708             gen_cmp_d(ctx, func-48, ft, fs, cc);
9709             opn = condnames[func-48];
9710         }
9711         break;
9712     case OPC_CVT_S_D:
9713         check_cp1_registers(ctx, fs);
9714         {
9715             TCGv_i32 fp32 = tcg_temp_new_i32();
9716             TCGv_i64 fp64 = tcg_temp_new_i64();
9717
9718             gen_load_fpr64(ctx, fp64, fs);
9719             gen_helper_float_cvts_d(fp32, cpu_env, fp64);
9720             tcg_temp_free_i64(fp64);
9721             gen_store_fpr32(ctx, fp32, fd);
9722             tcg_temp_free_i32(fp32);
9723         }
9724         opn = "cvt.s.d";
9725         break;
9726     case OPC_CVT_W_D:
9727         check_cp1_registers(ctx, fs);
9728         {
9729             TCGv_i32 fp32 = tcg_temp_new_i32();
9730             TCGv_i64 fp64 = tcg_temp_new_i64();
9731
9732             gen_load_fpr64(ctx, fp64, fs);
9733             gen_helper_float_cvtw_d(fp32, cpu_env, fp64);
9734             tcg_temp_free_i64(fp64);
9735             gen_store_fpr32(ctx, fp32, fd);
9736             tcg_temp_free_i32(fp32);
9737         }
9738         opn = "cvt.w.d";
9739         break;
9740     case OPC_CVT_L_D:
9741         check_cp1_64bitmode(ctx);
9742         {
9743             TCGv_i64 fp0 = tcg_temp_new_i64();
9744
9745             gen_load_fpr64(ctx, fp0, fs);
9746             gen_helper_float_cvtl_d(fp0, cpu_env, fp0);
9747             gen_store_fpr64(ctx, fp0, fd);
9748             tcg_temp_free_i64(fp0);
9749         }
9750         opn = "cvt.l.d";
9751         break;
9752     case OPC_CVT_S_W:
9753         {
9754             TCGv_i32 fp0 = tcg_temp_new_i32();
9755
9756             gen_load_fpr32(ctx, fp0, fs);
9757             gen_helper_float_cvts_w(fp0, cpu_env, fp0);
9758             gen_store_fpr32(ctx, fp0, fd);
9759             tcg_temp_free_i32(fp0);
9760         }
9761         opn = "cvt.s.w";
9762         break;
9763     case OPC_CVT_D_W:
9764         check_cp1_registers(ctx, fd);
9765         {
9766             TCGv_i32 fp32 = tcg_temp_new_i32();
9767             TCGv_i64 fp64 = tcg_temp_new_i64();
9768
9769             gen_load_fpr32(ctx, fp32, fs);
9770             gen_helper_float_cvtd_w(fp64, cpu_env, fp32);
9771             tcg_temp_free_i32(fp32);
9772             gen_store_fpr64(ctx, fp64, fd);
9773             tcg_temp_free_i64(fp64);
9774         }
9775         opn = "cvt.d.w";
9776         break;
9777     case OPC_CVT_S_L:
9778         check_cp1_64bitmode(ctx);
9779         {
9780             TCGv_i32 fp32 = tcg_temp_new_i32();
9781             TCGv_i64 fp64 = tcg_temp_new_i64();
9782
9783             gen_load_fpr64(ctx, fp64, fs);
9784             gen_helper_float_cvts_l(fp32, cpu_env, fp64);
9785             tcg_temp_free_i64(fp64);
9786             gen_store_fpr32(ctx, fp32, fd);
9787             tcg_temp_free_i32(fp32);
9788         }
9789         opn = "cvt.s.l";
9790         break;
9791     case OPC_CVT_D_L:
9792         check_cp1_64bitmode(ctx);
9793         {
9794             TCGv_i64 fp0 = tcg_temp_new_i64();
9795
9796             gen_load_fpr64(ctx, fp0, fs);
9797             gen_helper_float_cvtd_l(fp0, cpu_env, fp0);
9798             gen_store_fpr64(ctx, fp0, fd);
9799             tcg_temp_free_i64(fp0);
9800         }
9801         opn = "cvt.d.l";
9802         break;
9803     case OPC_CVT_PS_PW:
9804         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9805         check_cp1_64bitmode(ctx);
9806         {
9807             TCGv_i64 fp0 = tcg_temp_new_i64();
9808
9809             gen_load_fpr64(ctx, fp0, fs);
9810             gen_helper_float_cvtps_pw(fp0, cpu_env, fp0);
9811             gen_store_fpr64(ctx, fp0, fd);
9812             tcg_temp_free_i64(fp0);
9813         }
9814         opn = "cvt.ps.pw";
9815         break;
9816     case OPC_ADD_PS:
9817         check_cp1_64bitmode(ctx);
9818         {
9819             TCGv_i64 fp0 = tcg_temp_new_i64();
9820             TCGv_i64 fp1 = tcg_temp_new_i64();
9821
9822             gen_load_fpr64(ctx, fp0, fs);
9823             gen_load_fpr64(ctx, fp1, ft);
9824             gen_helper_float_add_ps(fp0, cpu_env, fp0, fp1);
9825             tcg_temp_free_i64(fp1);
9826             gen_store_fpr64(ctx, fp0, fd);
9827             tcg_temp_free_i64(fp0);
9828         }
9829         opn = "add.ps";
9830         break;
9831     case OPC_SUB_PS:
9832         check_cp1_64bitmode(ctx);
9833         {
9834             TCGv_i64 fp0 = tcg_temp_new_i64();
9835             TCGv_i64 fp1 = tcg_temp_new_i64();
9836
9837             gen_load_fpr64(ctx, fp0, fs);
9838             gen_load_fpr64(ctx, fp1, ft);
9839             gen_helper_float_sub_ps(fp0, cpu_env, fp0, fp1);
9840             tcg_temp_free_i64(fp1);
9841             gen_store_fpr64(ctx, fp0, fd);
9842             tcg_temp_free_i64(fp0);
9843         }
9844         opn = "sub.ps";
9845         break;
9846     case OPC_MUL_PS:
9847         check_cp1_64bitmode(ctx);
9848         {
9849             TCGv_i64 fp0 = tcg_temp_new_i64();
9850             TCGv_i64 fp1 = tcg_temp_new_i64();
9851
9852             gen_load_fpr64(ctx, fp0, fs);
9853             gen_load_fpr64(ctx, fp1, ft);
9854             gen_helper_float_mul_ps(fp0, cpu_env, fp0, fp1);
9855             tcg_temp_free_i64(fp1);
9856             gen_store_fpr64(ctx, fp0, fd);
9857             tcg_temp_free_i64(fp0);
9858         }
9859         opn = "mul.ps";
9860         break;
9861     case OPC_ABS_PS:
9862         check_cp1_64bitmode(ctx);
9863         {
9864             TCGv_i64 fp0 = tcg_temp_new_i64();
9865
9866             gen_load_fpr64(ctx, fp0, fs);
9867             gen_helper_float_abs_ps(fp0, fp0);
9868             gen_store_fpr64(ctx, fp0, fd);
9869             tcg_temp_free_i64(fp0);
9870         }
9871         opn = "abs.ps";
9872         break;
9873     case OPC_MOV_PS:
9874         check_cp1_64bitmode(ctx);
9875         {
9876             TCGv_i64 fp0 = tcg_temp_new_i64();
9877
9878             gen_load_fpr64(ctx, fp0, fs);
9879             gen_store_fpr64(ctx, fp0, fd);
9880             tcg_temp_free_i64(fp0);
9881         }
9882         opn = "mov.ps";
9883         break;
9884     case OPC_NEG_PS:
9885         check_cp1_64bitmode(ctx);
9886         {
9887             TCGv_i64 fp0 = tcg_temp_new_i64();
9888
9889             gen_load_fpr64(ctx, fp0, fs);
9890             gen_helper_float_chs_ps(fp0, fp0);
9891             gen_store_fpr64(ctx, fp0, fd);
9892             tcg_temp_free_i64(fp0);
9893         }
9894         opn = "neg.ps";
9895         break;
9896     case OPC_MOVCF_PS:
9897         check_cp1_64bitmode(ctx);
9898         gen_movcf_ps(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
9899         opn = "movcf.ps";
9900         break;
9901     case OPC_MOVZ_PS:
9902         check_cp1_64bitmode(ctx);
9903         {
9904             TCGLabel *l1 = gen_new_label();
9905             TCGv_i64 fp0;
9906
9907             if (ft != 0)
9908                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
9909             fp0 = tcg_temp_new_i64();
9910             gen_load_fpr64(ctx, fp0, fs);
9911             gen_store_fpr64(ctx, fp0, fd);
9912             tcg_temp_free_i64(fp0);
9913             gen_set_label(l1);
9914         }
9915         opn = "movz.ps";
9916         break;
9917     case OPC_MOVN_PS:
9918         check_cp1_64bitmode(ctx);
9919         {
9920             TCGLabel *l1 = gen_new_label();
9921             TCGv_i64 fp0;
9922
9923             if (ft != 0) {
9924                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
9925                 fp0 = tcg_temp_new_i64();
9926                 gen_load_fpr64(ctx, fp0, fs);
9927                 gen_store_fpr64(ctx, fp0, fd);
9928                 tcg_temp_free_i64(fp0);
9929                 gen_set_label(l1);
9930             }
9931         }
9932         opn = "movn.ps";
9933         break;
9934     case OPC_ADDR_PS:
9935         check_cp1_64bitmode(ctx);
9936         {
9937             TCGv_i64 fp0 = tcg_temp_new_i64();
9938             TCGv_i64 fp1 = tcg_temp_new_i64();
9939
9940             gen_load_fpr64(ctx, fp0, ft);
9941             gen_load_fpr64(ctx, fp1, fs);
9942             gen_helper_float_addr_ps(fp0, cpu_env, fp0, fp1);
9943             tcg_temp_free_i64(fp1);
9944             gen_store_fpr64(ctx, fp0, fd);
9945             tcg_temp_free_i64(fp0);
9946         }
9947         opn = "addr.ps";
9948         break;
9949     case OPC_MULR_PS:
9950         check_cp1_64bitmode(ctx);
9951         {
9952             TCGv_i64 fp0 = tcg_temp_new_i64();
9953             TCGv_i64 fp1 = tcg_temp_new_i64();
9954
9955             gen_load_fpr64(ctx, fp0, ft);
9956             gen_load_fpr64(ctx, fp1, fs);
9957             gen_helper_float_mulr_ps(fp0, cpu_env, fp0, fp1);
9958             tcg_temp_free_i64(fp1);
9959             gen_store_fpr64(ctx, fp0, fd);
9960             tcg_temp_free_i64(fp0);
9961         }
9962         opn = "mulr.ps";
9963         break;
9964     case OPC_RECIP2_PS:
9965         check_cp1_64bitmode(ctx);
9966         {
9967             TCGv_i64 fp0 = tcg_temp_new_i64();
9968             TCGv_i64 fp1 = tcg_temp_new_i64();
9969
9970             gen_load_fpr64(ctx, fp0, fs);
9971             gen_load_fpr64(ctx, fp1, ft);
9972             gen_helper_float_recip2_ps(fp0, cpu_env, fp0, fp1);
9973             tcg_temp_free_i64(fp1);
9974             gen_store_fpr64(ctx, fp0, fd);
9975             tcg_temp_free_i64(fp0);
9976         }
9977         opn = "recip2.ps";
9978         break;
9979     case OPC_RECIP1_PS:
9980         check_cp1_64bitmode(ctx);
9981         {
9982             TCGv_i64 fp0 = tcg_temp_new_i64();
9983
9984             gen_load_fpr64(ctx, fp0, fs);
9985             gen_helper_float_recip1_ps(fp0, cpu_env, fp0);
9986             gen_store_fpr64(ctx, fp0, fd);
9987             tcg_temp_free_i64(fp0);
9988         }
9989         opn = "recip1.ps";
9990         break;
9991     case OPC_RSQRT1_PS:
9992         check_cp1_64bitmode(ctx);
9993         {
9994             TCGv_i64 fp0 = tcg_temp_new_i64();
9995
9996             gen_load_fpr64(ctx, fp0, fs);
9997             gen_helper_float_rsqrt1_ps(fp0, cpu_env, fp0);
9998             gen_store_fpr64(ctx, fp0, fd);
9999             tcg_temp_free_i64(fp0);
10000         }
10001         opn = "rsqrt1.ps";
10002         break;
10003     case OPC_RSQRT2_PS:
10004         check_cp1_64bitmode(ctx);
10005         {
10006             TCGv_i64 fp0 = tcg_temp_new_i64();
10007             TCGv_i64 fp1 = tcg_temp_new_i64();
10008
10009             gen_load_fpr64(ctx, fp0, fs);
10010             gen_load_fpr64(ctx, fp1, ft);
10011             gen_helper_float_rsqrt2_ps(fp0, cpu_env, fp0, fp1);
10012             tcg_temp_free_i64(fp1);
10013             gen_store_fpr64(ctx, fp0, fd);
10014             tcg_temp_free_i64(fp0);
10015         }
10016         opn = "rsqrt2.ps";
10017         break;
10018     case OPC_CVT_S_PU:
10019         check_cp1_64bitmode(ctx);
10020         {
10021             TCGv_i32 fp0 = tcg_temp_new_i32();
10022
10023             gen_load_fpr32h(ctx, fp0, fs);
10024             gen_helper_float_cvts_pu(fp0, cpu_env, fp0);
10025             gen_store_fpr32(ctx, fp0, fd);
10026             tcg_temp_free_i32(fp0);
10027         }
10028         opn = "cvt.s.pu";
10029         break;
10030     case OPC_CVT_PW_PS:
10031         check_cp1_64bitmode(ctx);
10032         {
10033             TCGv_i64 fp0 = tcg_temp_new_i64();
10034
10035             gen_load_fpr64(ctx, fp0, fs);
10036             gen_helper_float_cvtpw_ps(fp0, cpu_env, fp0);
10037             gen_store_fpr64(ctx, fp0, fd);
10038             tcg_temp_free_i64(fp0);
10039         }
10040         opn = "cvt.pw.ps";
10041         break;
10042     case OPC_CVT_S_PL:
10043         check_cp1_64bitmode(ctx);
10044         {
10045             TCGv_i32 fp0 = tcg_temp_new_i32();
10046
10047             gen_load_fpr32(ctx, fp0, fs);
10048             gen_helper_float_cvts_pl(fp0, cpu_env, fp0);
10049             gen_store_fpr32(ctx, fp0, fd);
10050             tcg_temp_free_i32(fp0);
10051         }
10052         opn = "cvt.s.pl";
10053         break;
10054     case OPC_PLL_PS:
10055         check_cp1_64bitmode(ctx);
10056         {
10057             TCGv_i32 fp0 = tcg_temp_new_i32();
10058             TCGv_i32 fp1 = tcg_temp_new_i32();
10059
10060             gen_load_fpr32(ctx, fp0, fs);
10061             gen_load_fpr32(ctx, fp1, ft);
10062             gen_store_fpr32h(ctx, fp0, fd);
10063             gen_store_fpr32(ctx, fp1, fd);
10064             tcg_temp_free_i32(fp0);
10065             tcg_temp_free_i32(fp1);
10066         }
10067         opn = "pll.ps";
10068         break;
10069     case OPC_PLU_PS:
10070         check_cp1_64bitmode(ctx);
10071         {
10072             TCGv_i32 fp0 = tcg_temp_new_i32();
10073             TCGv_i32 fp1 = tcg_temp_new_i32();
10074
10075             gen_load_fpr32(ctx, fp0, fs);
10076             gen_load_fpr32h(ctx, fp1, ft);
10077             gen_store_fpr32(ctx, fp1, fd);
10078             gen_store_fpr32h(ctx, fp0, fd);
10079             tcg_temp_free_i32(fp0);
10080             tcg_temp_free_i32(fp1);
10081         }
10082         opn = "plu.ps";
10083         break;
10084     case OPC_PUL_PS:
10085         check_cp1_64bitmode(ctx);
10086         {
10087             TCGv_i32 fp0 = tcg_temp_new_i32();
10088             TCGv_i32 fp1 = tcg_temp_new_i32();
10089
10090             gen_load_fpr32h(ctx, fp0, fs);
10091             gen_load_fpr32(ctx, fp1, ft);
10092             gen_store_fpr32(ctx, fp1, fd);
10093             gen_store_fpr32h(ctx, fp0, fd);
10094             tcg_temp_free_i32(fp0);
10095             tcg_temp_free_i32(fp1);
10096         }
10097         opn = "pul.ps";
10098         break;
10099     case OPC_PUU_PS:
10100         check_cp1_64bitmode(ctx);
10101         {
10102             TCGv_i32 fp0 = tcg_temp_new_i32();
10103             TCGv_i32 fp1 = tcg_temp_new_i32();
10104
10105             gen_load_fpr32h(ctx, fp0, fs);
10106             gen_load_fpr32h(ctx, fp1, ft);
10107             gen_store_fpr32(ctx, fp1, fd);
10108             gen_store_fpr32h(ctx, fp0, fd);
10109             tcg_temp_free_i32(fp0);
10110             tcg_temp_free_i32(fp1);
10111         }
10112         opn = "puu.ps";
10113         break;
10114     case OPC_CMP_F_PS:
10115     case OPC_CMP_UN_PS:
10116     case OPC_CMP_EQ_PS:
10117     case OPC_CMP_UEQ_PS:
10118     case OPC_CMP_OLT_PS:
10119     case OPC_CMP_ULT_PS:
10120     case OPC_CMP_OLE_PS:
10121     case OPC_CMP_ULE_PS:
10122     case OPC_CMP_SF_PS:
10123     case OPC_CMP_NGLE_PS:
10124     case OPC_CMP_SEQ_PS:
10125     case OPC_CMP_NGL_PS:
10126     case OPC_CMP_LT_PS:
10127     case OPC_CMP_NGE_PS:
10128     case OPC_CMP_LE_PS:
10129     case OPC_CMP_NGT_PS:
10130         if (ctx->opcode & (1 << 6)) {
10131             gen_cmpabs_ps(ctx, func-48, ft, fs, cc);
10132             opn = condnames_abs[func-48];
10133         } else {
10134             gen_cmp_ps(ctx, func-48, ft, fs, cc);
10135             opn = condnames[func-48];
10136         }
10137         break;
10138     default:
10139         MIPS_INVAL(opn);
10140         generate_exception (ctx, EXCP_RI);
10141         return;
10142     }
10143     (void)opn; /* avoid a compiler warning */
10144     switch (optype) {
10145     case BINOP:
10146         MIPS_DEBUG("%s %s, %s, %s", opn, fregnames[fd], fregnames[fs], fregnames[ft]);
10147         break;
10148     case CMPOP:
10149         MIPS_DEBUG("%s %s,%s", opn, fregnames[fs], fregnames[ft]);
10150         break;
10151     default:
10152         MIPS_DEBUG("%s %s,%s", opn, fregnames[fd], fregnames[fs]);
10153         break;
10154     }
10155 }
10156
10157 /* Coprocessor 3 (FPU) */
10158 static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
10159                            int fd, int fs, int base, int index)
10160 {
10161     const char *opn = "extended float load/store";
10162     int store = 0;
10163     TCGv t0 = tcg_temp_new();
10164
10165     if (base == 0) {
10166         gen_load_gpr(t0, index);
10167     } else if (index == 0) {
10168         gen_load_gpr(t0, base);
10169     } else {
10170         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[index]);
10171     }
10172     /* Don't do NOP if destination is zero: we must perform the actual
10173        memory access. */
10174     switch (opc) {
10175     case OPC_LWXC1:
10176         check_cop1x(ctx);
10177         {
10178             TCGv_i32 fp0 = tcg_temp_new_i32();
10179
10180             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
10181             tcg_gen_trunc_tl_i32(fp0, t0);
10182             gen_store_fpr32(ctx, fp0, fd);
10183             tcg_temp_free_i32(fp0);
10184         }
10185         opn = "lwxc1";
10186         break;
10187     case OPC_LDXC1:
10188         check_cop1x(ctx);
10189         check_cp1_registers(ctx, fd);
10190         {
10191             TCGv_i64 fp0 = tcg_temp_new_i64();
10192             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
10193             gen_store_fpr64(ctx, fp0, fd);
10194             tcg_temp_free_i64(fp0);
10195         }
10196         opn = "ldxc1";
10197         break;
10198     case OPC_LUXC1:
10199         check_cp1_64bitmode(ctx);
10200         tcg_gen_andi_tl(t0, t0, ~0x7);
10201         {
10202             TCGv_i64 fp0 = tcg_temp_new_i64();
10203
10204             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
10205             gen_store_fpr64(ctx, fp0, fd);
10206             tcg_temp_free_i64(fp0);
10207         }
10208         opn = "luxc1";
10209         break;
10210     case OPC_SWXC1:
10211         check_cop1x(ctx);
10212         {
10213             TCGv_i32 fp0 = tcg_temp_new_i32();
10214             gen_load_fpr32(ctx, fp0, fs);
10215             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL);
10216             tcg_temp_free_i32(fp0);
10217         }
10218         opn = "swxc1";
10219         store = 1;
10220         break;
10221     case OPC_SDXC1:
10222         check_cop1x(ctx);
10223         check_cp1_registers(ctx, fs);
10224         {
10225             TCGv_i64 fp0 = tcg_temp_new_i64();
10226             gen_load_fpr64(ctx, fp0, fs);
10227             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
10228             tcg_temp_free_i64(fp0);
10229         }
10230         opn = "sdxc1";
10231         store = 1;
10232         break;
10233     case OPC_SUXC1:
10234         check_cp1_64bitmode(ctx);
10235         tcg_gen_andi_tl(t0, t0, ~0x7);
10236         {
10237             TCGv_i64 fp0 = tcg_temp_new_i64();
10238             gen_load_fpr64(ctx, fp0, fs);
10239             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
10240             tcg_temp_free_i64(fp0);
10241         }
10242         opn = "suxc1";
10243         store = 1;
10244         break;
10245     }
10246     tcg_temp_free(t0);
10247     (void)opn; (void)store; /* avoid compiler warnings */
10248     MIPS_DEBUG("%s %s, %s(%s)", opn, fregnames[store ? fs : fd],
10249                regnames[index], regnames[base]);
10250 }
10251
10252 static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
10253                             int fd, int fr, int fs, int ft)
10254 {
10255     const char *opn = "flt3_arith";
10256
10257     switch (opc) {
10258     case OPC_ALNV_PS:
10259         check_cp1_64bitmode(ctx);
10260         {
10261             TCGv t0 = tcg_temp_local_new();
10262             TCGv_i32 fp = tcg_temp_new_i32();
10263             TCGv_i32 fph = tcg_temp_new_i32();
10264             TCGLabel *l1 = gen_new_label();
10265             TCGLabel *l2 = gen_new_label();
10266
10267             gen_load_gpr(t0, fr);
10268             tcg_gen_andi_tl(t0, t0, 0x7);
10269
10270             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);
10271             gen_load_fpr32(ctx, fp, fs);
10272             gen_load_fpr32h(ctx, fph, fs);
10273             gen_store_fpr32(ctx, fp, fd);
10274             gen_store_fpr32h(ctx, fph, fd);
10275             tcg_gen_br(l2);
10276             gen_set_label(l1);
10277             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 4, l2);
10278             tcg_temp_free(t0);
10279 #ifdef TARGET_WORDS_BIGENDIAN
10280             gen_load_fpr32(ctx, fp, fs);
10281             gen_load_fpr32h(ctx, fph, ft);
10282             gen_store_fpr32h(ctx, fp, fd);
10283             gen_store_fpr32(ctx, fph, fd);
10284 #else
10285             gen_load_fpr32h(ctx, fph, fs);
10286             gen_load_fpr32(ctx, fp, ft);
10287             gen_store_fpr32(ctx, fph, fd);
10288             gen_store_fpr32h(ctx, fp, fd);
10289 #endif
10290             gen_set_label(l2);
10291             tcg_temp_free_i32(fp);
10292             tcg_temp_free_i32(fph);
10293         }
10294         opn = "alnv.ps";
10295         break;
10296     case OPC_MADD_S:
10297         check_cop1x(ctx);
10298         {
10299             TCGv_i32 fp0 = tcg_temp_new_i32();
10300             TCGv_i32 fp1 = tcg_temp_new_i32();
10301             TCGv_i32 fp2 = tcg_temp_new_i32();
10302
10303             gen_load_fpr32(ctx, fp0, fs);
10304             gen_load_fpr32(ctx, fp1, ft);
10305             gen_load_fpr32(ctx, fp2, fr);
10306             gen_helper_float_madd_s(fp2, cpu_env, fp0, fp1, fp2);
10307             tcg_temp_free_i32(fp0);
10308             tcg_temp_free_i32(fp1);
10309             gen_store_fpr32(ctx, fp2, fd);
10310             tcg_temp_free_i32(fp2);
10311         }
10312         opn = "madd.s";
10313         break;
10314     case OPC_MADD_D:
10315         check_cop1x(ctx);
10316         check_cp1_registers(ctx, fd | fs | ft | fr);
10317         {
10318             TCGv_i64 fp0 = tcg_temp_new_i64();
10319             TCGv_i64 fp1 = tcg_temp_new_i64();
10320             TCGv_i64 fp2 = tcg_temp_new_i64();
10321
10322             gen_load_fpr64(ctx, fp0, fs);
10323             gen_load_fpr64(ctx, fp1, ft);
10324             gen_load_fpr64(ctx, fp2, fr);
10325             gen_helper_float_madd_d(fp2, cpu_env, fp0, fp1, fp2);
10326             tcg_temp_free_i64(fp0);
10327             tcg_temp_free_i64(fp1);
10328             gen_store_fpr64(ctx, fp2, fd);
10329             tcg_temp_free_i64(fp2);
10330         }
10331         opn = "madd.d";
10332         break;
10333     case OPC_MADD_PS:
10334         check_cp1_64bitmode(ctx);
10335         {
10336             TCGv_i64 fp0 = tcg_temp_new_i64();
10337             TCGv_i64 fp1 = tcg_temp_new_i64();
10338             TCGv_i64 fp2 = tcg_temp_new_i64();
10339
10340             gen_load_fpr64(ctx, fp0, fs);
10341             gen_load_fpr64(ctx, fp1, ft);
10342             gen_load_fpr64(ctx, fp2, fr);
10343             gen_helper_float_madd_ps(fp2, cpu_env, fp0, fp1, fp2);
10344             tcg_temp_free_i64(fp0);
10345             tcg_temp_free_i64(fp1);
10346             gen_store_fpr64(ctx, fp2, fd);
10347             tcg_temp_free_i64(fp2);
10348         }
10349         opn = "madd.ps";
10350         break;
10351     case OPC_MSUB_S:
10352         check_cop1x(ctx);
10353         {
10354             TCGv_i32 fp0 = tcg_temp_new_i32();
10355             TCGv_i32 fp1 = tcg_temp_new_i32();
10356             TCGv_i32 fp2 = tcg_temp_new_i32();
10357
10358             gen_load_fpr32(ctx, fp0, fs);
10359             gen_load_fpr32(ctx, fp1, ft);
10360             gen_load_fpr32(ctx, fp2, fr);
10361             gen_helper_float_msub_s(fp2, cpu_env, fp0, fp1, fp2);
10362             tcg_temp_free_i32(fp0);
10363             tcg_temp_free_i32(fp1);
10364             gen_store_fpr32(ctx, fp2, fd);
10365             tcg_temp_free_i32(fp2);
10366         }
10367         opn = "msub.s";
10368         break;
10369     case OPC_MSUB_D:
10370         check_cop1x(ctx);
10371         check_cp1_registers(ctx, fd | fs | ft | fr);
10372         {
10373             TCGv_i64 fp0 = tcg_temp_new_i64();
10374             TCGv_i64 fp1 = tcg_temp_new_i64();
10375             TCGv_i64 fp2 = tcg_temp_new_i64();
10376
10377             gen_load_fpr64(ctx, fp0, fs);
10378             gen_load_fpr64(ctx, fp1, ft);
10379             gen_load_fpr64(ctx, fp2, fr);
10380             gen_helper_float_msub_d(fp2, cpu_env, fp0, fp1, fp2);
10381             tcg_temp_free_i64(fp0);
10382             tcg_temp_free_i64(fp1);
10383             gen_store_fpr64(ctx, fp2, fd);
10384             tcg_temp_free_i64(fp2);
10385         }
10386         opn = "msub.d";
10387         break;
10388     case OPC_MSUB_PS:
10389         check_cp1_64bitmode(ctx);
10390         {
10391             TCGv_i64 fp0 = tcg_temp_new_i64();
10392             TCGv_i64 fp1 = tcg_temp_new_i64();
10393             TCGv_i64 fp2 = tcg_temp_new_i64();
10394
10395             gen_load_fpr64(ctx, fp0, fs);
10396             gen_load_fpr64(ctx, fp1, ft);
10397             gen_load_fpr64(ctx, fp2, fr);
10398             gen_helper_float_msub_ps(fp2, cpu_env, fp0, fp1, fp2);
10399             tcg_temp_free_i64(fp0);
10400             tcg_temp_free_i64(fp1);
10401             gen_store_fpr64(ctx, fp2, fd);
10402             tcg_temp_free_i64(fp2);
10403         }
10404         opn = "msub.ps";
10405         break;
10406     case OPC_NMADD_S:
10407         check_cop1x(ctx);
10408         {
10409             TCGv_i32 fp0 = tcg_temp_new_i32();
10410             TCGv_i32 fp1 = tcg_temp_new_i32();
10411             TCGv_i32 fp2 = tcg_temp_new_i32();
10412
10413             gen_load_fpr32(ctx, fp0, fs);
10414             gen_load_fpr32(ctx, fp1, ft);
10415             gen_load_fpr32(ctx, fp2, fr);
10416             gen_helper_float_nmadd_s(fp2, cpu_env, fp0, fp1, fp2);
10417             tcg_temp_free_i32(fp0);
10418             tcg_temp_free_i32(fp1);
10419             gen_store_fpr32(ctx, fp2, fd);
10420             tcg_temp_free_i32(fp2);
10421         }
10422         opn = "nmadd.s";
10423         break;
10424     case OPC_NMADD_D:
10425         check_cop1x(ctx);
10426         check_cp1_registers(ctx, fd | fs | ft | fr);
10427         {
10428             TCGv_i64 fp0 = tcg_temp_new_i64();
10429             TCGv_i64 fp1 = tcg_temp_new_i64();
10430             TCGv_i64 fp2 = tcg_temp_new_i64();
10431
10432             gen_load_fpr64(ctx, fp0, fs);
10433             gen_load_fpr64(ctx, fp1, ft);
10434             gen_load_fpr64(ctx, fp2, fr);
10435             gen_helper_float_nmadd_d(fp2, cpu_env, fp0, fp1, fp2);
10436             tcg_temp_free_i64(fp0);
10437             tcg_temp_free_i64(fp1);
10438             gen_store_fpr64(ctx, fp2, fd);
10439             tcg_temp_free_i64(fp2);
10440         }
10441         opn = "nmadd.d";
10442         break;
10443     case OPC_NMADD_PS:
10444         check_cp1_64bitmode(ctx);
10445         {
10446             TCGv_i64 fp0 = tcg_temp_new_i64();
10447             TCGv_i64 fp1 = tcg_temp_new_i64();
10448             TCGv_i64 fp2 = tcg_temp_new_i64();
10449
10450             gen_load_fpr64(ctx, fp0, fs);
10451             gen_load_fpr64(ctx, fp1, ft);
10452             gen_load_fpr64(ctx, fp2, fr);
10453             gen_helper_float_nmadd_ps(fp2, cpu_env, fp0, fp1, fp2);
10454             tcg_temp_free_i64(fp0);
10455             tcg_temp_free_i64(fp1);
10456             gen_store_fpr64(ctx, fp2, fd);
10457             tcg_temp_free_i64(fp2);
10458         }
10459         opn = "nmadd.ps";
10460         break;
10461     case OPC_NMSUB_S:
10462         check_cop1x(ctx);
10463         {
10464             TCGv_i32 fp0 = tcg_temp_new_i32();
10465             TCGv_i32 fp1 = tcg_temp_new_i32();
10466             TCGv_i32 fp2 = tcg_temp_new_i32();
10467
10468             gen_load_fpr32(ctx, fp0, fs);
10469             gen_load_fpr32(ctx, fp1, ft);
10470             gen_load_fpr32(ctx, fp2, fr);
10471             gen_helper_float_nmsub_s(fp2, cpu_env, fp0, fp1, fp2);
10472             tcg_temp_free_i32(fp0);
10473             tcg_temp_free_i32(fp1);
10474             gen_store_fpr32(ctx, fp2, fd);
10475             tcg_temp_free_i32(fp2);
10476         }
10477         opn = "nmsub.s";
10478         break;
10479     case OPC_NMSUB_D:
10480         check_cop1x(ctx);
10481         check_cp1_registers(ctx, fd | fs | ft | fr);
10482         {
10483             TCGv_i64 fp0 = tcg_temp_new_i64();
10484             TCGv_i64 fp1 = tcg_temp_new_i64();
10485             TCGv_i64 fp2 = tcg_temp_new_i64();
10486
10487             gen_load_fpr64(ctx, fp0, fs);
10488             gen_load_fpr64(ctx, fp1, ft);
10489             gen_load_fpr64(ctx, fp2, fr);
10490             gen_helper_float_nmsub_d(fp2, cpu_env, fp0, fp1, fp2);
10491             tcg_temp_free_i64(fp0);
10492             tcg_temp_free_i64(fp1);
10493             gen_store_fpr64(ctx, fp2, fd);
10494             tcg_temp_free_i64(fp2);
10495         }
10496         opn = "nmsub.d";
10497         break;
10498     case OPC_NMSUB_PS:
10499         check_cp1_64bitmode(ctx);
10500         {
10501             TCGv_i64 fp0 = tcg_temp_new_i64();
10502             TCGv_i64 fp1 = tcg_temp_new_i64();
10503             TCGv_i64 fp2 = tcg_temp_new_i64();
10504
10505             gen_load_fpr64(ctx, fp0, fs);
10506             gen_load_fpr64(ctx, fp1, ft);
10507             gen_load_fpr64(ctx, fp2, fr);
10508             gen_helper_float_nmsub_ps(fp2, cpu_env, fp0, fp1, fp2);
10509             tcg_temp_free_i64(fp0);
10510             tcg_temp_free_i64(fp1);
10511             gen_store_fpr64(ctx, fp2, fd);
10512             tcg_temp_free_i64(fp2);
10513         }
10514         opn = "nmsub.ps";
10515         break;
10516     default:
10517         MIPS_INVAL(opn);
10518         generate_exception (ctx, EXCP_RI);
10519         return;
10520     }
10521     (void)opn; /* avoid a compiler warning */
10522     MIPS_DEBUG("%s %s, %s, %s, %s", opn, fregnames[fd], fregnames[fr],
10523                fregnames[fs], fregnames[ft]);
10524 }
10525
10526 static void gen_rdhwr(DisasContext *ctx, int rt, int rd)
10527 {
10528     TCGv t0;
10529
10530 #if !defined(CONFIG_USER_ONLY)
10531     /* The Linux kernel will emulate rdhwr if it's not supported natively.
10532        Therefore only check the ISA in system mode.  */
10533     check_insn(ctx, ISA_MIPS32R2);
10534 #endif
10535     t0 = tcg_temp_new();
10536
10537     switch (rd) {
10538     case 0:
10539         save_cpu_state(ctx, 1);
10540         gen_helper_rdhwr_cpunum(t0, cpu_env);
10541         gen_store_gpr(t0, rt);
10542         break;
10543     case 1:
10544         save_cpu_state(ctx, 1);
10545         gen_helper_rdhwr_synci_step(t0, cpu_env);
10546         gen_store_gpr(t0, rt);
10547         break;
10548     case 2:
10549         save_cpu_state(ctx, 1);
10550         gen_helper_rdhwr_cc(t0, cpu_env);
10551         gen_store_gpr(t0, rt);
10552         break;
10553     case 3:
10554         save_cpu_state(ctx, 1);
10555         gen_helper_rdhwr_ccres(t0, cpu_env);
10556         gen_store_gpr(t0, rt);
10557         break;
10558     case 29:
10559 #if defined(CONFIG_USER_ONLY)
10560         tcg_gen_ld_tl(t0, cpu_env,
10561                       offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
10562         gen_store_gpr(t0, rt);
10563         break;
10564 #else
10565         if ((ctx->hflags & MIPS_HFLAG_CP0) ||
10566             (ctx->hflags & MIPS_HFLAG_HWRENA_ULR)) {
10567             tcg_gen_ld_tl(t0, cpu_env,
10568                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
10569             gen_store_gpr(t0, rt);
10570         } else {
10571             generate_exception(ctx, EXCP_RI);
10572         }
10573         break;
10574 #endif
10575     default:            /* Invalid */
10576         MIPS_INVAL("rdhwr");
10577         generate_exception(ctx, EXCP_RI);
10578         break;
10579     }
10580     tcg_temp_free(t0);
10581 }
10582
10583 static inline void clear_branch_hflags(DisasContext *ctx)
10584 {
10585     ctx->hflags &= ~MIPS_HFLAG_BMASK;
10586     if (ctx->bstate == BS_NONE) {
10587         save_cpu_state(ctx, 0);
10588     } else {
10589         /* it is not safe to save ctx->hflags as hflags may be changed
10590            in execution time by the instruction in delay / forbidden slot. */
10591         tcg_gen_andi_i32(hflags, hflags, ~MIPS_HFLAG_BMASK);
10592     }
10593 }
10594
10595 static void gen_branch(DisasContext *ctx, int insn_bytes)
10596 {
10597     if (ctx->hflags & MIPS_HFLAG_BMASK) {
10598         int proc_hflags = ctx->hflags & MIPS_HFLAG_BMASK;
10599         /* Branches completion */
10600         clear_branch_hflags(ctx);
10601         ctx->bstate = BS_BRANCH;
10602         /* FIXME: Need to clear can_do_io.  */
10603         switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) {
10604         case MIPS_HFLAG_FBNSLOT:
10605             MIPS_DEBUG("forbidden slot");
10606             gen_goto_tb(ctx, 0, ctx->pc + insn_bytes);
10607             break;
10608         case MIPS_HFLAG_B:
10609             /* unconditional branch */
10610             MIPS_DEBUG("unconditional branch");
10611             if (proc_hflags & MIPS_HFLAG_BX) {
10612                 tcg_gen_xori_i32(hflags, hflags, MIPS_HFLAG_M16);
10613             }
10614             gen_goto_tb(ctx, 0, ctx->btarget);
10615             break;
10616         case MIPS_HFLAG_BL:
10617             /* blikely taken case */
10618             MIPS_DEBUG("blikely branch taken");
10619             gen_goto_tb(ctx, 0, ctx->btarget);
10620             break;
10621         case MIPS_HFLAG_BC:
10622             /* Conditional branch */
10623             MIPS_DEBUG("conditional branch");
10624             {
10625                 TCGLabel *l1 = gen_new_label();
10626
10627                 tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
10628                 gen_goto_tb(ctx, 1, ctx->pc + insn_bytes);
10629                 gen_set_label(l1);
10630                 gen_goto_tb(ctx, 0, ctx->btarget);
10631             }
10632             break;
10633         case MIPS_HFLAG_BR:
10634             /* unconditional branch to register */
10635             MIPS_DEBUG("branch to register");
10636             if (ctx->insn_flags & (ASE_MIPS16 | ASE_MICROMIPS)) {
10637                 TCGv t0 = tcg_temp_new();
10638                 TCGv_i32 t1 = tcg_temp_new_i32();
10639
10640                 tcg_gen_andi_tl(t0, btarget, 0x1);
10641                 tcg_gen_trunc_tl_i32(t1, t0);
10642                 tcg_temp_free(t0);
10643                 tcg_gen_andi_i32(hflags, hflags, ~(uint32_t)MIPS_HFLAG_M16);
10644                 tcg_gen_shli_i32(t1, t1, MIPS_HFLAG_M16_SHIFT);
10645                 tcg_gen_or_i32(hflags, hflags, t1);
10646                 tcg_temp_free_i32(t1);
10647
10648                 tcg_gen_andi_tl(cpu_PC, btarget, ~(target_ulong)0x1);
10649             } else {
10650                 tcg_gen_mov_tl(cpu_PC, btarget);
10651             }
10652             if (ctx->singlestep_enabled) {
10653                 save_cpu_state(ctx, 0);
10654                 gen_helper_0e0i(raise_exception, EXCP_DEBUG);
10655             }
10656             tcg_gen_exit_tb(0);
10657             break;
10658         default:
10659             fprintf(stderr, "unknown branch 0x%x\n", proc_hflags);
10660             abort();
10661         }
10662     }
10663 }
10664
10665 /* ISA extensions (ASEs) */
10666 /* MIPS16 extension to MIPS32 */
10667
10668 /* MIPS16 major opcodes */
10669 enum {
10670   M16_OPC_ADDIUSP = 0x00,
10671   M16_OPC_ADDIUPC = 0x01,
10672   M16_OPC_B = 0x02,
10673   M16_OPC_JAL = 0x03,
10674   M16_OPC_BEQZ = 0x04,
10675   M16_OPC_BNEQZ = 0x05,
10676   M16_OPC_SHIFT = 0x06,
10677   M16_OPC_LD = 0x07,
10678   M16_OPC_RRIA = 0x08,
10679   M16_OPC_ADDIU8 = 0x09,
10680   M16_OPC_SLTI = 0x0a,
10681   M16_OPC_SLTIU = 0x0b,
10682   M16_OPC_I8 = 0x0c,
10683   M16_OPC_LI = 0x0d,
10684   M16_OPC_CMPI = 0x0e,
10685   M16_OPC_SD = 0x0f,
10686   M16_OPC_LB = 0x10,
10687   M16_OPC_LH = 0x11,
10688   M16_OPC_LWSP = 0x12,
10689   M16_OPC_LW = 0x13,
10690   M16_OPC_LBU = 0x14,
10691   M16_OPC_LHU = 0x15,
10692   M16_OPC_LWPC = 0x16,
10693   M16_OPC_LWU = 0x17,
10694   M16_OPC_SB = 0x18,
10695   M16_OPC_SH = 0x19,
10696   M16_OPC_SWSP = 0x1a,
10697   M16_OPC_SW = 0x1b,
10698   M16_OPC_RRR = 0x1c,
10699   M16_OPC_RR = 0x1d,
10700   M16_OPC_EXTEND = 0x1e,
10701   M16_OPC_I64 = 0x1f
10702 };
10703
10704 /* I8 funct field */
10705 enum {
10706   I8_BTEQZ = 0x0,
10707   I8_BTNEZ = 0x1,
10708   I8_SWRASP = 0x2,
10709   I8_ADJSP = 0x3,
10710   I8_SVRS = 0x4,
10711   I8_MOV32R = 0x5,
10712   I8_MOVR32 = 0x7
10713 };
10714
10715 /* RRR f field */
10716 enum {
10717   RRR_DADDU = 0x0,
10718   RRR_ADDU = 0x1,
10719   RRR_DSUBU = 0x2,
10720   RRR_SUBU = 0x3
10721 };
10722
10723 /* RR funct field */
10724 enum {
10725   RR_JR = 0x00,
10726   RR_SDBBP = 0x01,
10727   RR_SLT = 0x02,
10728   RR_SLTU = 0x03,
10729   RR_SLLV = 0x04,
10730   RR_BREAK = 0x05,
10731   RR_SRLV = 0x06,
10732   RR_SRAV = 0x07,
10733   RR_DSRL = 0x08,
10734   RR_CMP = 0x0a,
10735   RR_NEG = 0x0b,
10736   RR_AND = 0x0c,
10737   RR_OR = 0x0d,
10738   RR_XOR = 0x0e,
10739   RR_NOT = 0x0f,
10740   RR_MFHI = 0x10,
10741   RR_CNVT = 0x11,
10742   RR_MFLO = 0x12,
10743   RR_DSRA = 0x13,
10744   RR_DSLLV = 0x14,
10745   RR_DSRLV = 0x16,
10746   RR_DSRAV = 0x17,
10747   RR_MULT = 0x18,
10748   RR_MULTU = 0x19,
10749   RR_DIV = 0x1a,
10750   RR_DIVU = 0x1b,
10751   RR_DMULT = 0x1c,
10752   RR_DMULTU = 0x1d,
10753   RR_DDIV = 0x1e,
10754   RR_DDIVU = 0x1f
10755 };
10756
10757 /* I64 funct field */
10758 enum {
10759   I64_LDSP = 0x0,
10760   I64_SDSP = 0x1,
10761   I64_SDRASP = 0x2,
10762   I64_DADJSP = 0x3,
10763   I64_LDPC = 0x4,
10764   I64_DADDIU5 = 0x5,
10765   I64_DADDIUPC = 0x6,
10766   I64_DADDIUSP = 0x7
10767 };
10768
10769 /* RR ry field for CNVT */
10770 enum {
10771   RR_RY_CNVT_ZEB = 0x0,
10772   RR_RY_CNVT_ZEH = 0x1,
10773   RR_RY_CNVT_ZEW = 0x2,
10774   RR_RY_CNVT_SEB = 0x4,
10775   RR_RY_CNVT_SEH = 0x5,
10776   RR_RY_CNVT_SEW = 0x6,
10777 };
10778
10779 static int xlat (int r)
10780 {
10781   static int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
10782
10783   return map[r];
10784 }
10785
10786 static void gen_mips16_save (DisasContext *ctx,
10787                              int xsregs, int aregs,
10788                              int do_ra, int do_s0, int do_s1,
10789                              int framesize)
10790 {
10791     TCGv t0 = tcg_temp_new();
10792     TCGv t1 = tcg_temp_new();
10793     TCGv t2 = tcg_temp_new();
10794     int args, astatic;
10795
10796     switch (aregs) {
10797     case 0:
10798     case 1:
10799     case 2:
10800     case 3:
10801     case 11:
10802         args = 0;
10803         break;
10804     case 4:
10805     case 5:
10806     case 6:
10807     case 7:
10808         args = 1;
10809         break;
10810     case 8:
10811     case 9:
10812     case 10:
10813         args = 2;
10814         break;
10815     case 12:
10816     case 13:
10817         args = 3;
10818         break;
10819     case 14:
10820         args = 4;
10821         break;
10822     default:
10823         generate_exception(ctx, EXCP_RI);
10824         return;
10825     }
10826
10827     switch (args) {
10828     case 4:
10829         gen_base_offset_addr(ctx, t0, 29, 12);
10830         gen_load_gpr(t1, 7);
10831         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
10832         /* Fall through */
10833     case 3:
10834         gen_base_offset_addr(ctx, t0, 29, 8);
10835         gen_load_gpr(t1, 6);
10836         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
10837         /* Fall through */
10838     case 2:
10839         gen_base_offset_addr(ctx, t0, 29, 4);
10840         gen_load_gpr(t1, 5);
10841         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
10842         /* Fall through */
10843     case 1:
10844         gen_base_offset_addr(ctx, t0, 29, 0);
10845         gen_load_gpr(t1, 4);
10846         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
10847     }
10848
10849     gen_load_gpr(t0, 29);
10850
10851 #define DECR_AND_STORE(reg) do {                                 \
10852         tcg_gen_movi_tl(t2, -4);                                 \
10853         gen_op_addr_add(ctx, t0, t0, t2);                        \
10854         gen_load_gpr(t1, reg);                                   \
10855         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL); \
10856     } while (0)
10857
10858     if (do_ra) {
10859         DECR_AND_STORE(31);
10860     }
10861
10862     switch (xsregs) {
10863     case 7:
10864         DECR_AND_STORE(30);
10865         /* Fall through */
10866     case 6:
10867         DECR_AND_STORE(23);
10868         /* Fall through */
10869     case 5:
10870         DECR_AND_STORE(22);
10871         /* Fall through */
10872     case 4:
10873         DECR_AND_STORE(21);
10874         /* Fall through */
10875     case 3:
10876         DECR_AND_STORE(20);
10877         /* Fall through */
10878     case 2:
10879         DECR_AND_STORE(19);
10880         /* Fall through */
10881     case 1:
10882         DECR_AND_STORE(18);
10883     }
10884
10885     if (do_s1) {
10886         DECR_AND_STORE(17);
10887     }
10888     if (do_s0) {
10889         DECR_AND_STORE(16);
10890     }
10891
10892     switch (aregs) {
10893     case 0:
10894     case 4:
10895     case 8:
10896     case 12:
10897     case 14:
10898         astatic = 0;
10899         break;
10900     case 1:
10901     case 5:
10902     case 9:
10903     case 13:
10904         astatic = 1;
10905         break;
10906     case 2:
10907     case 6:
10908     case 10:
10909         astatic = 2;
10910         break;
10911     case 3:
10912     case 7:
10913         astatic = 3;
10914         break;
10915     case 11:
10916         astatic = 4;
10917         break;
10918     default:
10919         generate_exception(ctx, EXCP_RI);
10920         return;
10921     }
10922
10923     if (astatic > 0) {
10924         DECR_AND_STORE(7);
10925         if (astatic > 1) {
10926             DECR_AND_STORE(6);
10927             if (astatic > 2) {
10928                 DECR_AND_STORE(5);
10929                 if (astatic > 3) {
10930                     DECR_AND_STORE(4);
10931                 }
10932             }
10933         }
10934     }
10935 #undef DECR_AND_STORE
10936
10937     tcg_gen_movi_tl(t2, -framesize);
10938     gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
10939     tcg_temp_free(t0);
10940     tcg_temp_free(t1);
10941     tcg_temp_free(t2);
10942 }
10943
10944 static void gen_mips16_restore (DisasContext *ctx,
10945                                 int xsregs, int aregs,
10946                                 int do_ra, int do_s0, int do_s1,
10947                                 int framesize)
10948 {
10949     int astatic;
10950     TCGv t0 = tcg_temp_new();
10951     TCGv t1 = tcg_temp_new();
10952     TCGv t2 = tcg_temp_new();
10953
10954     tcg_gen_movi_tl(t2, framesize);
10955     gen_op_addr_add(ctx, t0, cpu_gpr[29], t2);
10956
10957 #define DECR_AND_LOAD(reg) do {                            \
10958         tcg_gen_movi_tl(t2, -4);                           \
10959         gen_op_addr_add(ctx, t0, t0, t2);                  \
10960         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL); \
10961         gen_store_gpr(t1, reg);                            \
10962     } while (0)
10963
10964     if (do_ra) {
10965         DECR_AND_LOAD(31);
10966     }
10967
10968     switch (xsregs) {
10969     case 7:
10970         DECR_AND_LOAD(30);
10971         /* Fall through */
10972     case 6:
10973         DECR_AND_LOAD(23);
10974         /* Fall through */
10975     case 5:
10976         DECR_AND_LOAD(22);
10977         /* Fall through */
10978     case 4:
10979         DECR_AND_LOAD(21);
10980         /* Fall through */
10981     case 3:
10982         DECR_AND_LOAD(20);
10983         /* Fall through */
10984     case 2:
10985         DECR_AND_LOAD(19);
10986         /* Fall through */
10987     case 1:
10988         DECR_AND_LOAD(18);
10989     }
10990
10991     if (do_s1) {
10992         DECR_AND_LOAD(17);
10993     }
10994     if (do_s0) {
10995         DECR_AND_LOAD(16);
10996     }
10997
10998     switch (aregs) {
10999     case 0:
11000     case 4:
11001     case 8:
11002     case 12:
11003     case 14:
11004         astatic = 0;
11005         break;
11006     case 1:
11007     case 5:
11008     case 9:
11009     case 13:
11010         astatic = 1;
11011         break;
11012     case 2:
11013     case 6:
11014     case 10:
11015         astatic = 2;
11016         break;
11017     case 3:
11018     case 7:
11019         astatic = 3;
11020         break;
11021     case 11:
11022         astatic = 4;
11023         break;
11024     default:
11025         generate_exception(ctx, EXCP_RI);
11026         return;
11027     }
11028
11029     if (astatic > 0) {
11030         DECR_AND_LOAD(7);
11031         if (astatic > 1) {
11032             DECR_AND_LOAD(6);
11033             if (astatic > 2) {
11034                 DECR_AND_LOAD(5);
11035                 if (astatic > 3) {
11036                     DECR_AND_LOAD(4);
11037                 }
11038             }
11039         }
11040     }
11041 #undef DECR_AND_LOAD
11042
11043     tcg_gen_movi_tl(t2, framesize);
11044     gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
11045     tcg_temp_free(t0);
11046     tcg_temp_free(t1);
11047     tcg_temp_free(t2);
11048 }
11049
11050 static void gen_addiupc (DisasContext *ctx, int rx, int imm,
11051                          int is_64_bit, int extended)
11052 {
11053     TCGv t0;
11054
11055     if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
11056         generate_exception(ctx, EXCP_RI);
11057         return;
11058     }
11059
11060     t0 = tcg_temp_new();
11061
11062     tcg_gen_movi_tl(t0, pc_relative_pc(ctx));
11063     tcg_gen_addi_tl(cpu_gpr[rx], t0, imm);
11064     if (!is_64_bit) {
11065         tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
11066     }
11067
11068     tcg_temp_free(t0);
11069 }
11070
11071 #if defined(TARGET_MIPS64)
11072 static void decode_i64_mips16 (DisasContext *ctx,
11073                                int ry, int funct, int16_t offset,
11074                                int extended)
11075 {
11076     switch (funct) {
11077     case I64_LDSP:
11078         check_insn(ctx, ISA_MIPS3);
11079         check_mips_64(ctx);
11080         offset = extended ? offset : offset << 3;
11081         gen_ld(ctx, OPC_LD, ry, 29, offset);
11082         break;
11083     case I64_SDSP:
11084         check_insn(ctx, ISA_MIPS3);
11085         check_mips_64(ctx);
11086         offset = extended ? offset : offset << 3;
11087         gen_st(ctx, OPC_SD, ry, 29, offset);
11088         break;
11089     case I64_SDRASP:
11090         check_insn(ctx, ISA_MIPS3);
11091         check_mips_64(ctx);
11092         offset = extended ? offset : (ctx->opcode & 0xff) << 3;
11093         gen_st(ctx, OPC_SD, 31, 29, offset);
11094         break;
11095     case I64_DADJSP:
11096         check_insn(ctx, ISA_MIPS3);
11097         check_mips_64(ctx);
11098         offset = extended ? offset : ((int8_t)ctx->opcode) << 3;
11099         gen_arith_imm(ctx, OPC_DADDIU, 29, 29, offset);
11100         break;
11101     case I64_LDPC:
11102         check_insn(ctx, ISA_MIPS3);
11103         check_mips_64(ctx);
11104         if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
11105             generate_exception(ctx, EXCP_RI);
11106         } else {
11107             offset = extended ? offset : offset << 3;
11108             gen_ld(ctx, OPC_LDPC, ry, 0, offset);
11109         }
11110         break;
11111     case I64_DADDIU5:
11112         check_insn(ctx, ISA_MIPS3);
11113         check_mips_64(ctx);
11114         offset = extended ? offset : ((int8_t)(offset << 3)) >> 3;
11115         gen_arith_imm(ctx, OPC_DADDIU, ry, ry, offset);
11116         break;
11117     case I64_DADDIUPC:
11118         check_insn(ctx, ISA_MIPS3);
11119         check_mips_64(ctx);
11120         offset = extended ? offset : offset << 2;
11121         gen_addiupc(ctx, ry, offset, 1, extended);
11122         break;
11123     case I64_DADDIUSP:
11124         check_insn(ctx, ISA_MIPS3);
11125         check_mips_64(ctx);
11126         offset = extended ? offset : offset << 2;
11127         gen_arith_imm(ctx, OPC_DADDIU, ry, 29, offset);
11128         break;
11129     }
11130 }
11131 #endif
11132
11133 static int decode_extended_mips16_opc (CPUMIPSState *env, DisasContext *ctx)
11134 {
11135     int extend = cpu_lduw_code(env, ctx->pc + 2);
11136     int op, rx, ry, funct, sa;
11137     int16_t imm, offset;
11138
11139     ctx->opcode = (ctx->opcode << 16) | extend;
11140     op = (ctx->opcode >> 11) & 0x1f;
11141     sa = (ctx->opcode >> 22) & 0x1f;
11142     funct = (ctx->opcode >> 8) & 0x7;
11143     rx = xlat((ctx->opcode >> 8) & 0x7);
11144     ry = xlat((ctx->opcode >> 5) & 0x7);
11145     offset = imm = (int16_t) (((ctx->opcode >> 16) & 0x1f) << 11
11146                               | ((ctx->opcode >> 21) & 0x3f) << 5
11147                               | (ctx->opcode & 0x1f));
11148
11149     /* The extended opcodes cleverly reuse the opcodes from their 16-bit
11150        counterparts.  */
11151     switch (op) {
11152     case M16_OPC_ADDIUSP:
11153         gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
11154         break;
11155     case M16_OPC_ADDIUPC:
11156         gen_addiupc(ctx, rx, imm, 0, 1);
11157         break;
11158     case M16_OPC_B:
11159         gen_compute_branch(ctx, OPC_BEQ, 4, 0, 0, offset << 1, 0);
11160         /* No delay slot, so just process as a normal instruction */
11161         break;
11162     case M16_OPC_BEQZ:
11163         gen_compute_branch(ctx, OPC_BEQ, 4, rx, 0, offset << 1, 0);
11164         /* No delay slot, so just process as a normal instruction */
11165         break;
11166     case M16_OPC_BNEQZ:
11167         gen_compute_branch(ctx, OPC_BNE, 4, rx, 0, offset << 1, 0);
11168         /* No delay slot, so just process as a normal instruction */
11169         break;
11170     case M16_OPC_SHIFT:
11171         switch (ctx->opcode & 0x3) {
11172         case 0x0:
11173             gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
11174             break;
11175         case 0x1:
11176 #if defined(TARGET_MIPS64)
11177             check_mips_64(ctx);
11178             gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
11179 #else
11180             generate_exception(ctx, EXCP_RI);
11181 #endif
11182             break;
11183         case 0x2:
11184             gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
11185             break;
11186         case 0x3:
11187             gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
11188             break;
11189         }
11190         break;
11191 #if defined(TARGET_MIPS64)
11192     case M16_OPC_LD:
11193         check_insn(ctx, ISA_MIPS3);
11194         check_mips_64(ctx);
11195         gen_ld(ctx, OPC_LD, ry, rx, offset);
11196         break;
11197 #endif
11198     case M16_OPC_RRIA:
11199         imm = ctx->opcode & 0xf;
11200         imm = imm | ((ctx->opcode >> 20) & 0x7f) << 4;
11201         imm = imm | ((ctx->opcode >> 16) & 0xf) << 11;
11202         imm = (int16_t) (imm << 1) >> 1;
11203         if ((ctx->opcode >> 4) & 0x1) {
11204 #if defined(TARGET_MIPS64)
11205             check_mips_64(ctx);
11206             gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
11207 #else
11208             generate_exception(ctx, EXCP_RI);
11209 #endif
11210         } else {
11211             gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
11212         }
11213         break;
11214     case M16_OPC_ADDIU8:
11215         gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
11216         break;
11217     case M16_OPC_SLTI:
11218         gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
11219         break;
11220     case M16_OPC_SLTIU:
11221         gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
11222         break;
11223     case M16_OPC_I8:
11224         switch (funct) {
11225         case I8_BTEQZ:
11226             gen_compute_branch(ctx, OPC_BEQ, 4, 24, 0, offset << 1, 0);
11227             break;
11228         case I8_BTNEZ:
11229             gen_compute_branch(ctx, OPC_BNE, 4, 24, 0, offset << 1, 0);
11230             break;
11231         case I8_SWRASP:
11232             gen_st(ctx, OPC_SW, 31, 29, imm);
11233             break;
11234         case I8_ADJSP:
11235             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm);
11236             break;
11237         case I8_SVRS:
11238             check_insn(ctx, ISA_MIPS32);
11239             {
11240                 int xsregs = (ctx->opcode >> 24) & 0x7;
11241                 int aregs = (ctx->opcode >> 16) & 0xf;
11242                 int do_ra = (ctx->opcode >> 6) & 0x1;
11243                 int do_s0 = (ctx->opcode >> 5) & 0x1;
11244                 int do_s1 = (ctx->opcode >> 4) & 0x1;
11245                 int framesize = (((ctx->opcode >> 20) & 0xf) << 4
11246                                  | (ctx->opcode & 0xf)) << 3;
11247
11248                 if (ctx->opcode & (1 << 7)) {
11249                     gen_mips16_save(ctx, xsregs, aregs,
11250                                     do_ra, do_s0, do_s1,
11251                                     framesize);
11252                 } else {
11253                     gen_mips16_restore(ctx, xsregs, aregs,
11254                                        do_ra, do_s0, do_s1,
11255                                        framesize);
11256                 }
11257             }
11258             break;
11259         default:
11260             generate_exception(ctx, EXCP_RI);
11261             break;
11262         }
11263         break;
11264     case M16_OPC_LI:
11265         tcg_gen_movi_tl(cpu_gpr[rx], (uint16_t) imm);
11266         break;
11267     case M16_OPC_CMPI:
11268         tcg_gen_xori_tl(cpu_gpr[24], cpu_gpr[rx], (uint16_t) imm);
11269         break;
11270 #if defined(TARGET_MIPS64)
11271     case M16_OPC_SD:
11272         check_insn(ctx, ISA_MIPS3);
11273         check_mips_64(ctx);
11274         gen_st(ctx, OPC_SD, ry, rx, offset);
11275         break;
11276 #endif
11277     case M16_OPC_LB:
11278         gen_ld(ctx, OPC_LB, ry, rx, offset);
11279         break;
11280     case M16_OPC_LH:
11281         gen_ld(ctx, OPC_LH, ry, rx, offset);
11282         break;
11283     case M16_OPC_LWSP:
11284         gen_ld(ctx, OPC_LW, rx, 29, offset);
11285         break;
11286     case M16_OPC_LW:
11287         gen_ld(ctx, OPC_LW, ry, rx, offset);
11288         break;
11289     case M16_OPC_LBU:
11290         gen_ld(ctx, OPC_LBU, ry, rx, offset);
11291         break;
11292     case M16_OPC_LHU:
11293         gen_ld(ctx, OPC_LHU, ry, rx, offset);
11294         break;
11295     case M16_OPC_LWPC:
11296         gen_ld(ctx, OPC_LWPC, rx, 0, offset);
11297         break;
11298 #if defined(TARGET_MIPS64)
11299     case M16_OPC_LWU:
11300         check_insn(ctx, ISA_MIPS3);
11301         check_mips_64(ctx);
11302         gen_ld(ctx, OPC_LWU, ry, rx, offset);
11303         break;
11304 #endif
11305     case M16_OPC_SB:
11306         gen_st(ctx, OPC_SB, ry, rx, offset);
11307         break;
11308     case M16_OPC_SH:
11309         gen_st(ctx, OPC_SH, ry, rx, offset);
11310         break;
11311     case M16_OPC_SWSP:
11312         gen_st(ctx, OPC_SW, rx, 29, offset);
11313         break;
11314     case M16_OPC_SW:
11315         gen_st(ctx, OPC_SW, ry, rx, offset);
11316         break;
11317 #if defined(TARGET_MIPS64)
11318     case M16_OPC_I64:
11319         decode_i64_mips16(ctx, ry, funct, offset, 1);
11320         break;
11321 #endif
11322     default:
11323         generate_exception(ctx, EXCP_RI);
11324         break;
11325     }
11326
11327     return 4;
11328 }
11329
11330 static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx)
11331 {
11332     int rx, ry;
11333     int sa;
11334     int op, cnvt_op, op1, offset;
11335     int funct;
11336     int n_bytes;
11337
11338     op = (ctx->opcode >> 11) & 0x1f;
11339     sa = (ctx->opcode >> 2) & 0x7;
11340     sa = sa == 0 ? 8 : sa;
11341     rx = xlat((ctx->opcode >> 8) & 0x7);
11342     cnvt_op = (ctx->opcode >> 5) & 0x7;
11343     ry = xlat((ctx->opcode >> 5) & 0x7);
11344     op1 = offset = ctx->opcode & 0x1f;
11345
11346     n_bytes = 2;
11347
11348     switch (op) {
11349     case M16_OPC_ADDIUSP:
11350         {
11351             int16_t imm = ((uint8_t) ctx->opcode) << 2;
11352
11353             gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
11354         }
11355         break;
11356     case M16_OPC_ADDIUPC:
11357         gen_addiupc(ctx, rx, ((uint8_t) ctx->opcode) << 2, 0, 0);
11358         break;
11359     case M16_OPC_B:
11360         offset = (ctx->opcode & 0x7ff) << 1;
11361         offset = (int16_t)(offset << 4) >> 4;
11362         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0, offset, 0);
11363         /* No delay slot, so just process as a normal instruction */
11364         break;
11365     case M16_OPC_JAL:
11366         offset = cpu_lduw_code(env, ctx->pc + 2);
11367         offset = (((ctx->opcode & 0x1f) << 21)
11368                   | ((ctx->opcode >> 5) & 0x1f) << 16
11369                   | offset) << 2;
11370         op = ((ctx->opcode >> 10) & 0x1) ? OPC_JALX : OPC_JAL;
11371         gen_compute_branch(ctx, op, 4, rx, ry, offset, 2);
11372         n_bytes = 4;
11373         break;
11374     case M16_OPC_BEQZ:
11375         gen_compute_branch(ctx, OPC_BEQ, 2, rx, 0,
11376                            ((int8_t)ctx->opcode) << 1, 0);
11377         /* No delay slot, so just process as a normal instruction */
11378         break;
11379     case M16_OPC_BNEQZ:
11380         gen_compute_branch(ctx, OPC_BNE, 2, rx, 0,
11381                            ((int8_t)ctx->opcode) << 1, 0);
11382         /* No delay slot, so just process as a normal instruction */
11383         break;
11384     case M16_OPC_SHIFT:
11385         switch (ctx->opcode & 0x3) {
11386         case 0x0:
11387             gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
11388             break;
11389         case 0x1:
11390 #if defined(TARGET_MIPS64)
11391             check_insn(ctx, ISA_MIPS3);
11392             check_mips_64(ctx);
11393             gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
11394 #else
11395             generate_exception(ctx, EXCP_RI);
11396 #endif
11397             break;
11398         case 0x2:
11399             gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
11400             break;
11401         case 0x3:
11402             gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
11403             break;
11404         }
11405         break;
11406 #if defined(TARGET_MIPS64)
11407     case M16_OPC_LD:
11408         check_insn(ctx, ISA_MIPS3);
11409         check_mips_64(ctx);
11410         gen_ld(ctx, OPC_LD, ry, rx, offset << 3);
11411         break;
11412 #endif
11413     case M16_OPC_RRIA:
11414         {
11415             int16_t imm = (int8_t)((ctx->opcode & 0xf) << 4) >> 4;
11416
11417             if ((ctx->opcode >> 4) & 1) {
11418 #if defined(TARGET_MIPS64)
11419                 check_insn(ctx, ISA_MIPS3);
11420                 check_mips_64(ctx);
11421                 gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
11422 #else
11423                 generate_exception(ctx, EXCP_RI);
11424 #endif
11425             } else {
11426                 gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
11427             }
11428         }
11429         break;
11430     case M16_OPC_ADDIU8:
11431         {
11432             int16_t imm = (int8_t) ctx->opcode;
11433
11434             gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
11435         }
11436         break;
11437     case M16_OPC_SLTI:
11438         {
11439             int16_t imm = (uint8_t) ctx->opcode;
11440             gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
11441         }
11442         break;
11443     case M16_OPC_SLTIU:
11444         {
11445             int16_t imm = (uint8_t) ctx->opcode;
11446             gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
11447         }
11448         break;
11449     case M16_OPC_I8:
11450         {
11451             int reg32;
11452
11453             funct = (ctx->opcode >> 8) & 0x7;
11454             switch (funct) {
11455             case I8_BTEQZ:
11456                 gen_compute_branch(ctx, OPC_BEQ, 2, 24, 0,
11457                                    ((int8_t)ctx->opcode) << 1, 0);
11458                 break;
11459             case I8_BTNEZ:
11460                 gen_compute_branch(ctx, OPC_BNE, 2, 24, 0,
11461                                    ((int8_t)ctx->opcode) << 1, 0);
11462                 break;
11463             case I8_SWRASP:
11464                 gen_st(ctx, OPC_SW, 31, 29, (ctx->opcode & 0xff) << 2);
11465                 break;
11466             case I8_ADJSP:
11467                 gen_arith_imm(ctx, OPC_ADDIU, 29, 29,
11468                               ((int8_t)ctx->opcode) << 3);
11469                 break;
11470             case I8_SVRS:
11471                 check_insn(ctx, ISA_MIPS32);
11472                 {
11473                     int do_ra = ctx->opcode & (1 << 6);
11474                     int do_s0 = ctx->opcode & (1 << 5);
11475                     int do_s1 = ctx->opcode & (1 << 4);
11476                     int framesize = ctx->opcode & 0xf;
11477
11478                     if (framesize == 0) {
11479                         framesize = 128;
11480                     } else {
11481                         framesize = framesize << 3;
11482                     }
11483
11484                     if (ctx->opcode & (1 << 7)) {
11485                         gen_mips16_save(ctx, 0, 0,
11486                                         do_ra, do_s0, do_s1, framesize);
11487                     } else {
11488                         gen_mips16_restore(ctx, 0, 0,
11489                                            do_ra, do_s0, do_s1, framesize);
11490                     }
11491                 }
11492                 break;
11493             case I8_MOV32R:
11494                 {
11495                     int rz = xlat(ctx->opcode & 0x7);
11496
11497                     reg32 = (((ctx->opcode >> 3) & 0x3) << 3) |
11498                         ((ctx->opcode >> 5) & 0x7);
11499                     gen_arith(ctx, OPC_ADDU, reg32, rz, 0);
11500                 }
11501                 break;
11502             case I8_MOVR32:
11503                 reg32 = ctx->opcode & 0x1f;
11504                 gen_arith(ctx, OPC_ADDU, ry, reg32, 0);
11505                 break;
11506             default:
11507                 generate_exception(ctx, EXCP_RI);
11508                 break;
11509             }
11510         }
11511         break;
11512     case M16_OPC_LI:
11513         {
11514             int16_t imm = (uint8_t) ctx->opcode;
11515
11516             gen_arith_imm(ctx, OPC_ADDIU, rx, 0, imm);
11517         }
11518         break;
11519     case M16_OPC_CMPI:
11520         {
11521             int16_t imm = (uint8_t) ctx->opcode;
11522             gen_logic_imm(ctx, OPC_XORI, 24, rx, imm);
11523         }
11524         break;
11525 #if defined(TARGET_MIPS64)
11526     case M16_OPC_SD:
11527         check_insn(ctx, ISA_MIPS3);
11528         check_mips_64(ctx);
11529         gen_st(ctx, OPC_SD, ry, rx, offset << 3);
11530         break;
11531 #endif
11532     case M16_OPC_LB:
11533         gen_ld(ctx, OPC_LB, ry, rx, offset);
11534         break;
11535     case M16_OPC_LH:
11536         gen_ld(ctx, OPC_LH, ry, rx, offset << 1);
11537         break;
11538     case M16_OPC_LWSP:
11539         gen_ld(ctx, OPC_LW, rx, 29, ((uint8_t)ctx->opcode) << 2);
11540         break;
11541     case M16_OPC_LW:
11542         gen_ld(ctx, OPC_LW, ry, rx, offset << 2);
11543         break;
11544     case M16_OPC_LBU:
11545         gen_ld(ctx, OPC_LBU, ry, rx, offset);
11546         break;
11547     case M16_OPC_LHU:
11548         gen_ld(ctx, OPC_LHU, ry, rx, offset << 1);
11549         break;
11550     case M16_OPC_LWPC:
11551         gen_ld(ctx, OPC_LWPC, rx, 0, ((uint8_t)ctx->opcode) << 2);
11552         break;
11553 #if defined (TARGET_MIPS64)
11554     case M16_OPC_LWU:
11555         check_insn(ctx, ISA_MIPS3);
11556         check_mips_64(ctx);
11557         gen_ld(ctx, OPC_LWU, ry, rx, offset << 2);
11558         break;
11559 #endif
11560     case M16_OPC_SB:
11561         gen_st(ctx, OPC_SB, ry, rx, offset);
11562         break;
11563     case M16_OPC_SH:
11564         gen_st(ctx, OPC_SH, ry, rx, offset << 1);
11565         break;
11566     case M16_OPC_SWSP:
11567         gen_st(ctx, OPC_SW, rx, 29, ((uint8_t)ctx->opcode) << 2);
11568         break;
11569     case M16_OPC_SW:
11570         gen_st(ctx, OPC_SW, ry, rx, offset << 2);
11571         break;
11572     case M16_OPC_RRR:
11573         {
11574             int rz = xlat((ctx->opcode >> 2) & 0x7);
11575             int mips32_op;
11576
11577             switch (ctx->opcode & 0x3) {
11578             case RRR_ADDU:
11579                 mips32_op = OPC_ADDU;
11580                 break;
11581             case RRR_SUBU:
11582                 mips32_op = OPC_SUBU;
11583                 break;
11584 #if defined(TARGET_MIPS64)
11585             case RRR_DADDU:
11586                 mips32_op = OPC_DADDU;
11587                 check_insn(ctx, ISA_MIPS3);
11588                 check_mips_64(ctx);
11589                 break;
11590             case RRR_DSUBU:
11591                 mips32_op = OPC_DSUBU;
11592                 check_insn(ctx, ISA_MIPS3);
11593                 check_mips_64(ctx);
11594                 break;
11595 #endif
11596             default:
11597                 generate_exception(ctx, EXCP_RI);
11598                 goto done;
11599             }
11600
11601             gen_arith(ctx, mips32_op, rz, rx, ry);
11602         done:
11603             ;
11604         }
11605         break;
11606     case M16_OPC_RR:
11607         switch (op1) {
11608         case RR_JR:
11609             {
11610                 int nd = (ctx->opcode >> 7) & 0x1;
11611                 int link = (ctx->opcode >> 6) & 0x1;
11612                 int ra = (ctx->opcode >> 5) & 0x1;
11613
11614                 if (nd) {
11615                     check_insn(ctx, ISA_MIPS32);
11616                 }
11617
11618                 if (link) {
11619                     op = OPC_JALR;
11620                 } else {
11621                     op = OPC_JR;
11622                 }
11623
11624                 gen_compute_branch(ctx, op, 2, ra ? 31 : rx, 31, 0,
11625                                    (nd ? 0 : 2));
11626             }
11627             break;
11628         case RR_SDBBP:
11629             /* XXX: not clear which exception should be raised
11630              *      when in debug mode...
11631              */
11632             check_insn(ctx, ISA_MIPS32);
11633             if (!(ctx->hflags & MIPS_HFLAG_DM)) {
11634                 generate_exception(ctx, EXCP_DBp);
11635             } else {
11636                 generate_exception(ctx, EXCP_DBp);
11637             }
11638             break;
11639         case RR_SLT:
11640             gen_slt(ctx, OPC_SLT, 24, rx, ry);
11641             break;
11642         case RR_SLTU:
11643             gen_slt(ctx, OPC_SLTU, 24, rx, ry);
11644             break;
11645         case RR_BREAK:
11646             generate_exception(ctx, EXCP_BREAK);
11647             break;
11648         case RR_SLLV:
11649             gen_shift(ctx, OPC_SLLV, ry, rx, ry);
11650             break;
11651         case RR_SRLV:
11652             gen_shift(ctx, OPC_SRLV, ry, rx, ry);
11653             break;
11654         case RR_SRAV:
11655             gen_shift(ctx, OPC_SRAV, ry, rx, ry);
11656             break;
11657 #if defined (TARGET_MIPS64)
11658         case RR_DSRL:
11659             check_insn(ctx, ISA_MIPS3);
11660             check_mips_64(ctx);
11661             gen_shift_imm(ctx, OPC_DSRL, ry, ry, sa);
11662             break;
11663 #endif
11664         case RR_CMP:
11665             gen_logic(ctx, OPC_XOR, 24, rx, ry);
11666             break;
11667         case RR_NEG:
11668             gen_arith(ctx, OPC_SUBU, rx, 0, ry);
11669             break;
11670         case RR_AND:
11671             gen_logic(ctx, OPC_AND, rx, rx, ry);
11672             break;
11673         case RR_OR:
11674             gen_logic(ctx, OPC_OR, rx, rx, ry);
11675             break;
11676         case RR_XOR:
11677             gen_logic(ctx, OPC_XOR, rx, rx, ry);
11678             break;
11679         case RR_NOT:
11680             gen_logic(ctx, OPC_NOR, rx, ry, 0);
11681             break;
11682         case RR_MFHI:
11683             gen_HILO(ctx, OPC_MFHI, 0, rx);
11684             break;
11685         case RR_CNVT:
11686             check_insn(ctx, ISA_MIPS32);
11687             switch (cnvt_op) {
11688             case RR_RY_CNVT_ZEB:
11689                 tcg_gen_ext8u_tl(cpu_gpr[rx], cpu_gpr[rx]);
11690                 break;
11691             case RR_RY_CNVT_ZEH:
11692                 tcg_gen_ext16u_tl(cpu_gpr[rx], cpu_gpr[rx]);
11693                 break;
11694             case RR_RY_CNVT_SEB:
11695                 tcg_gen_ext8s_tl(cpu_gpr[rx], cpu_gpr[rx]);
11696                 break;
11697             case RR_RY_CNVT_SEH:
11698                 tcg_gen_ext16s_tl(cpu_gpr[rx], cpu_gpr[rx]);
11699                 break;
11700 #if defined (TARGET_MIPS64)
11701             case RR_RY_CNVT_ZEW:
11702                 check_insn(ctx, ISA_MIPS64);
11703                 check_mips_64(ctx);
11704                 tcg_gen_ext32u_tl(cpu_gpr[rx], cpu_gpr[rx]);
11705                 break;
11706             case RR_RY_CNVT_SEW:
11707                 check_insn(ctx, ISA_MIPS64);
11708                 check_mips_64(ctx);
11709                 tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
11710                 break;
11711 #endif
11712             default:
11713                 generate_exception(ctx, EXCP_RI);
11714                 break;
11715             }
11716             break;
11717         case RR_MFLO:
11718             gen_HILO(ctx, OPC_MFLO, 0, rx);
11719             break;
11720 #if defined (TARGET_MIPS64)
11721         case RR_DSRA:
11722             check_insn(ctx, ISA_MIPS3);
11723             check_mips_64(ctx);
11724             gen_shift_imm(ctx, OPC_DSRA, ry, ry, sa);
11725             break;
11726         case RR_DSLLV:
11727             check_insn(ctx, ISA_MIPS3);
11728             check_mips_64(ctx);
11729             gen_shift(ctx, OPC_DSLLV, ry, rx, ry);
11730             break;
11731         case RR_DSRLV:
11732             check_insn(ctx, ISA_MIPS3);
11733             check_mips_64(ctx);
11734             gen_shift(ctx, OPC_DSRLV, ry, rx, ry);
11735             break;
11736         case RR_DSRAV:
11737             check_insn(ctx, ISA_MIPS3);
11738             check_mips_64(ctx);
11739             gen_shift(ctx, OPC_DSRAV, ry, rx, ry);
11740             break;
11741 #endif
11742         case RR_MULT:
11743             gen_muldiv(ctx, OPC_MULT, 0, rx, ry);
11744             break;
11745         case RR_MULTU:
11746             gen_muldiv(ctx, OPC_MULTU, 0, rx, ry);
11747             break;
11748         case RR_DIV:
11749             gen_muldiv(ctx, OPC_DIV, 0, rx, ry);
11750             break;
11751         case RR_DIVU:
11752             gen_muldiv(ctx, OPC_DIVU, 0, rx, ry);
11753             break;
11754 #if defined (TARGET_MIPS64)
11755         case RR_DMULT:
11756             check_insn(ctx, ISA_MIPS3);
11757             check_mips_64(ctx);
11758             gen_muldiv(ctx, OPC_DMULT, 0, rx, ry);
11759             break;
11760         case RR_DMULTU:
11761             check_insn(ctx, ISA_MIPS3);
11762             check_mips_64(ctx);
11763             gen_muldiv(ctx, OPC_DMULTU, 0, rx, ry);
11764             break;
11765         case RR_DDIV:
11766             check_insn(ctx, ISA_MIPS3);
11767             check_mips_64(ctx);
11768             gen_muldiv(ctx, OPC_DDIV, 0, rx, ry);
11769             break;
11770         case RR_DDIVU:
11771             check_insn(ctx, ISA_MIPS3);
11772             check_mips_64(ctx);
11773             gen_muldiv(ctx, OPC_DDIVU, 0, rx, ry);
11774             break;
11775 #endif
11776         default:
11777             generate_exception(ctx, EXCP_RI);
11778             break;
11779         }
11780         break;
11781     case M16_OPC_EXTEND:
11782         decode_extended_mips16_opc(env, ctx);
11783         n_bytes = 4;
11784         break;
11785 #if defined(TARGET_MIPS64)
11786     case M16_OPC_I64:
11787         funct = (ctx->opcode >> 8) & 0x7;
11788         decode_i64_mips16(ctx, ry, funct, offset, 0);
11789         break;
11790 #endif
11791     default:
11792         generate_exception(ctx, EXCP_RI);
11793         break;
11794     }
11795
11796     return n_bytes;
11797 }
11798
11799 /* microMIPS extension to MIPS32/MIPS64 */
11800
11801 /*
11802  * microMIPS32/microMIPS64 major opcodes
11803  *
11804  * 1. MIPS Architecture for Programmers Volume II-B:
11805  *      The microMIPS32 Instruction Set (Revision 3.05)
11806  *
11807  *    Table 6.2 microMIPS32 Encoding of Major Opcode Field
11808  *
11809  * 2. MIPS Architecture For Programmers Volume II-A:
11810  *      The MIPS64 Instruction Set (Revision 3.51)
11811  */
11812
11813 enum {
11814     POOL32A = 0x00,
11815     POOL16A = 0x01,
11816     LBU16 = 0x02,
11817     MOVE16 = 0x03,
11818     ADDI32 = 0x04,
11819     LBU32 = 0x05,
11820     SB32 = 0x06,
11821     LB32 = 0x07,
11822
11823     POOL32B = 0x08,
11824     POOL16B = 0x09,
11825     LHU16 = 0x0a,
11826     ANDI16 = 0x0b,
11827     ADDIU32 = 0x0c,
11828     LHU32 = 0x0d,
11829     SH32 = 0x0e,
11830     LH32 = 0x0f,
11831
11832     POOL32I = 0x10,
11833     POOL16C = 0x11,
11834     LWSP16 = 0x12,
11835     POOL16D = 0x13,
11836     ORI32 = 0x14,
11837     POOL32F = 0x15,
11838     POOL32S = 0x16,  /* MIPS64 */
11839     DADDIU32 = 0x17, /* MIPS64 */
11840
11841     /* 0x1f is reserved */
11842     POOL32C = 0x18,
11843     LWGP16 = 0x19,
11844     LW16 = 0x1a,
11845     POOL16E = 0x1b,
11846     XORI32 = 0x1c,
11847     JALS32 = 0x1d,
11848     ADDIUPC = 0x1e,
11849
11850     /* 0x20 is reserved */
11851     RES_20 = 0x20,
11852     POOL16F = 0x21,
11853     SB16 = 0x22,
11854     BEQZ16 = 0x23,
11855     SLTI32 = 0x24,
11856     BEQ32 = 0x25,
11857     SWC132 = 0x26,
11858     LWC132 = 0x27,
11859
11860     /* 0x28 and 0x29 are reserved */
11861     RES_28 = 0x28,
11862     RES_29 = 0x29,
11863     SH16 = 0x2a,
11864     BNEZ16 = 0x2b,
11865     SLTIU32 = 0x2c,
11866     BNE32 = 0x2d,
11867     SDC132 = 0x2e,
11868     LDC132 = 0x2f,
11869
11870     /* 0x30 and 0x31 are reserved */
11871     RES_30 = 0x30,
11872     RES_31 = 0x31,
11873     SWSP16 = 0x32,
11874     B16 = 0x33,
11875     ANDI32 = 0x34,
11876     J32 = 0x35,
11877     SD32 = 0x36, /* MIPS64 */
11878     LD32 = 0x37, /* MIPS64 */
11879
11880     /* 0x38 and 0x39 are reserved */
11881     RES_38 = 0x38,
11882     RES_39 = 0x39,
11883     SW16 = 0x3a,
11884     LI16 = 0x3b,
11885     JALX32 = 0x3c,
11886     JAL32 = 0x3d,
11887     SW32 = 0x3e,
11888     LW32 = 0x3f
11889 };
11890
11891 /* POOL32A encoding of minor opcode field */
11892
11893 enum {
11894     /* These opcodes are distinguished only by bits 9..6; those bits are
11895      * what are recorded below. */
11896     SLL32 = 0x0,
11897     SRL32 = 0x1,
11898     SRA = 0x2,
11899     ROTR = 0x3,
11900
11901     SLLV = 0x0,
11902     SRLV = 0x1,
11903     SRAV = 0x2,
11904     ROTRV = 0x3,
11905     ADD = 0x4,
11906     ADDU32 = 0x5,
11907     SUB = 0x6,
11908     SUBU32 = 0x7,
11909     MUL = 0x8,
11910     AND = 0x9,
11911     OR32 = 0xa,
11912     NOR = 0xb,
11913     XOR32 = 0xc,
11914     SLT = 0xd,
11915     SLTU = 0xe,
11916
11917     MOVN = 0x0,
11918     MOVZ = 0x1,
11919     LWXS = 0x4,
11920
11921     /* The following can be distinguished by their lower 6 bits. */
11922     INS = 0x0c,
11923     EXT = 0x2c,
11924     POOL32AXF = 0x3c
11925 };
11926
11927 /* POOL32AXF encoding of minor opcode field extension */
11928
11929 /*
11930  * 1. MIPS Architecture for Programmers Volume II-B:
11931  *      The microMIPS32 Instruction Set (Revision 3.05)
11932  *
11933  *    Table 6.5 POOL32Axf Encoding of Minor Opcode Extension Field
11934  *
11935  * 2. MIPS Architecture for Programmers VolumeIV-e:
11936  *      The MIPS DSP Application-Specific Extension
11937  *        to the microMIPS32 Architecture (Revision 2.34)
11938  *
11939  *    Table 5.5 POOL32Axf Encoding of Minor Opcode Extension Field
11940  */
11941
11942 enum {
11943     /* bits 11..6 */
11944     TEQ = 0x00,
11945     TGE = 0x08,
11946     TGEU = 0x10,
11947     TLT = 0x20,
11948     TLTU = 0x28,
11949     TNE = 0x30,
11950
11951     MFC0 = 0x03,
11952     MTC0 = 0x0b,
11953
11954     /* begin of microMIPS32 DSP */
11955
11956     /* bits 13..12 for 0x01 */
11957     MFHI_ACC = 0x0,
11958     MFLO_ACC = 0x1,
11959     MTHI_ACC = 0x2,
11960     MTLO_ACC = 0x3,
11961
11962     /* bits 13..12 for 0x2a */
11963     MADD_ACC = 0x0,
11964     MADDU_ACC = 0x1,
11965     MSUB_ACC = 0x2,
11966     MSUBU_ACC = 0x3,
11967
11968     /* bits 13..12 for 0x32 */
11969     MULT_ACC = 0x0,
11970     MULTU_ACC = 0x1,
11971
11972     /* end of microMIPS32 DSP */
11973
11974     /* bits 15..12 for 0x2c */
11975     SEB = 0x2,
11976     SEH = 0x3,
11977     CLO = 0x4,
11978     CLZ = 0x5,
11979     RDHWR = 0x6,
11980     WSBH = 0x7,
11981     MULT = 0x8,
11982     MULTU = 0x9,
11983     DIV = 0xa,
11984     DIVU = 0xb,
11985     MADD = 0xc,
11986     MADDU = 0xd,
11987     MSUB = 0xe,
11988     MSUBU = 0xf,
11989
11990     /* bits 15..12 for 0x34 */
11991     MFC2 = 0x4,
11992     MTC2 = 0x5,
11993     MFHC2 = 0x8,
11994     MTHC2 = 0x9,
11995     CFC2 = 0xc,
11996     CTC2 = 0xd,
11997
11998     /* bits 15..12 for 0x3c */
11999     JALR = 0x0,
12000     JR = 0x0,                   /* alias */
12001     JALR_HB = 0x1,
12002     JALRS = 0x4,
12003     JALRS_HB = 0x5,
12004
12005     /* bits 15..12 for 0x05 */
12006     RDPGPR = 0xe,
12007     WRPGPR = 0xf,
12008
12009     /* bits 15..12 for 0x0d */
12010     TLBP = 0x0,
12011     TLBR = 0x1,
12012     TLBWI = 0x2,
12013     TLBWR = 0x3,
12014     WAIT = 0x9,
12015     IRET = 0xd,
12016     DERET = 0xe,
12017     ERET = 0xf,
12018
12019     /* bits 15..12 for 0x15 */
12020     DMT = 0x0,
12021     DVPE = 0x1,
12022     EMT = 0x2,
12023     EVPE = 0x3,
12024
12025     /* bits 15..12 for 0x1d */
12026     DI = 0x4,
12027     EI = 0x5,
12028
12029     /* bits 15..12 for 0x2d */
12030     SYNC = 0x6,
12031     SYSCALL = 0x8,
12032     SDBBP = 0xd,
12033
12034     /* bits 15..12 for 0x35 */
12035     MFHI32 = 0x0,
12036     MFLO32 = 0x1,
12037     MTHI32 = 0x2,
12038     MTLO32 = 0x3,
12039 };
12040
12041 /* POOL32B encoding of minor opcode field (bits 15..12) */
12042
12043 enum {
12044     LWC2 = 0x0,
12045     LWP = 0x1,
12046     LDP = 0x4,
12047     LWM32 = 0x5,
12048     CACHE = 0x6,
12049     LDM = 0x7,
12050     SWC2 = 0x8,
12051     SWP = 0x9,
12052     SDP = 0xc,
12053     SWM32 = 0xd,
12054     SDM = 0xf
12055 };
12056
12057 /* POOL32C encoding of minor opcode field (bits 15..12) */
12058
12059 enum {
12060     LWL = 0x0,
12061     SWL = 0x8,
12062     LWR = 0x1,
12063     SWR = 0x9,
12064     PREF = 0x2,
12065     /* 0xa is reserved */
12066     LL = 0x3,
12067     SC = 0xb,
12068     LDL = 0x4,
12069     SDL = 0xc,
12070     LDR = 0x5,
12071     SDR = 0xd,
12072     /* 0x6 is reserved */
12073     LWU = 0xe,
12074     LLD = 0x7,
12075     SCD = 0xf
12076 };
12077
12078 /* POOL32F encoding of minor opcode field (bits 5..0) */
12079
12080 enum {
12081     /* These are the bit 7..6 values */
12082     ADD_FMT = 0x0,
12083     MOVN_FMT = 0x0,
12084
12085     SUB_FMT = 0x1,
12086     MOVZ_FMT = 0x1,
12087
12088     MUL_FMT = 0x2,
12089
12090     DIV_FMT = 0x3,
12091
12092     /* These are the bit 8..6 values */
12093     RSQRT2_FMT = 0x0,
12094     MOVF_FMT = 0x0,
12095
12096     LWXC1 = 0x1,
12097     MOVT_FMT = 0x1,
12098
12099     PLL_PS = 0x2,
12100     SWXC1 = 0x2,
12101
12102     PLU_PS = 0x3,
12103     LDXC1 = 0x3,
12104
12105     PUL_PS = 0x4,
12106     SDXC1 = 0x4,
12107     RECIP2_FMT = 0x4,
12108
12109     PUU_PS = 0x5,
12110     LUXC1 = 0x5,
12111
12112     CVT_PS_S = 0x6,
12113     SUXC1 = 0x6,
12114     ADDR_PS = 0x6,
12115     PREFX = 0x6,
12116
12117     MULR_PS = 0x7,
12118
12119     MADD_S = 0x01,
12120     MADD_D = 0x09,
12121     MADD_PS = 0x11,
12122     ALNV_PS = 0x19,
12123     MSUB_S = 0x21,
12124     MSUB_D = 0x29,
12125     MSUB_PS = 0x31,
12126
12127     NMADD_S = 0x02,
12128     NMADD_D = 0x0a,
12129     NMADD_PS = 0x12,
12130     NMSUB_S = 0x22,
12131     NMSUB_D = 0x2a,
12132     NMSUB_PS = 0x32,
12133
12134     POOL32FXF = 0x3b,
12135
12136     CABS_COND_FMT = 0x1c,              /* MIPS3D */
12137     C_COND_FMT = 0x3c
12138 };
12139
12140 /* POOL32Fxf encoding of minor opcode extension field */
12141
12142 enum {
12143     CVT_L = 0x04,
12144     RSQRT_FMT = 0x08,
12145     FLOOR_L = 0x0c,
12146     CVT_PW_PS = 0x1c,
12147     CVT_W = 0x24,
12148     SQRT_FMT = 0x28,
12149     FLOOR_W = 0x2c,
12150     CVT_PS_PW = 0x3c,
12151     CFC1 = 0x40,
12152     RECIP_FMT = 0x48,
12153     CEIL_L = 0x4c,
12154     CTC1 = 0x60,
12155     CEIL_W = 0x6c,
12156     MFC1 = 0x80,
12157     CVT_S_PL = 0x84,
12158     TRUNC_L = 0x8c,
12159     MTC1 = 0xa0,
12160     CVT_S_PU = 0xa4,
12161     TRUNC_W = 0xac,
12162     MFHC1 = 0xc0,
12163     ROUND_L = 0xcc,
12164     MTHC1 = 0xe0,
12165     ROUND_W = 0xec,
12166
12167     MOV_FMT = 0x01,
12168     MOVF = 0x05,
12169     ABS_FMT = 0x0d,
12170     RSQRT1_FMT = 0x1d,
12171     MOVT = 0x25,
12172     NEG_FMT = 0x2d,
12173     CVT_D = 0x4d,
12174     RECIP1_FMT = 0x5d,
12175     CVT_S = 0x6d
12176 };
12177
12178 /* POOL32I encoding of minor opcode field (bits 25..21) */
12179
12180 enum {
12181     BLTZ = 0x00,
12182     BLTZAL = 0x01,
12183     BGEZ = 0x02,
12184     BGEZAL = 0x03,
12185     BLEZ = 0x04,
12186     BNEZC = 0x05,
12187     BGTZ = 0x06,
12188     BEQZC = 0x07,
12189     TLTI = 0x08,
12190     TGEI = 0x09,
12191     TLTIU = 0x0a,
12192     TGEIU = 0x0b,
12193     TNEI = 0x0c,
12194     LUI = 0x0d,
12195     TEQI = 0x0e,
12196     SYNCI = 0x10,
12197     BLTZALS = 0x11,
12198     BGEZALS = 0x13,
12199     BC2F = 0x14,
12200     BC2T = 0x15,
12201     BPOSGE64 = 0x1a,
12202     BPOSGE32 = 0x1b,
12203     /* These overlap and are distinguished by bit16 of the instruction */
12204     BC1F = 0x1c,
12205     BC1T = 0x1d,
12206     BC1ANY2F = 0x1c,
12207     BC1ANY2T = 0x1d,
12208     BC1ANY4F = 0x1e,
12209     BC1ANY4T = 0x1f
12210 };
12211
12212 /* POOL16A encoding of minor opcode field */
12213
12214 enum {
12215     ADDU16 = 0x0,
12216     SUBU16 = 0x1
12217 };
12218
12219 /* POOL16B encoding of minor opcode field */
12220
12221 enum {
12222     SLL16 = 0x0,
12223     SRL16 = 0x1
12224 };
12225
12226 /* POOL16C encoding of minor opcode field */
12227
12228 enum {
12229     NOT16 = 0x00,
12230     XOR16 = 0x04,
12231     AND16 = 0x08,
12232     OR16 = 0x0c,
12233     LWM16 = 0x10,
12234     SWM16 = 0x14,
12235     JR16 = 0x18,
12236     JRC16 = 0x1a,
12237     JALR16 = 0x1c,
12238     JALR16S = 0x1e,
12239     MFHI16 = 0x20,
12240     MFLO16 = 0x24,
12241     BREAK16 = 0x28,
12242     SDBBP16 = 0x2c,
12243     JRADDIUSP = 0x30
12244 };
12245
12246 /* POOL16D encoding of minor opcode field */
12247
12248 enum {
12249     ADDIUS5 = 0x0,
12250     ADDIUSP = 0x1
12251 };
12252
12253 /* POOL16E encoding of minor opcode field */
12254
12255 enum {
12256     ADDIUR2 = 0x0,
12257     ADDIUR1SP = 0x1
12258 };
12259
12260 static int mmreg (int r)
12261 {
12262     static const int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
12263
12264     return map[r];
12265 }
12266
12267 /* Used for 16-bit store instructions.  */
12268 static int mmreg2 (int r)
12269 {
12270     static const int map[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
12271
12272     return map[r];
12273 }
12274
12275 #define uMIPS_RD(op) ((op >> 7) & 0x7)
12276 #define uMIPS_RS(op) ((op >> 4) & 0x7)
12277 #define uMIPS_RS2(op) uMIPS_RS(op)
12278 #define uMIPS_RS1(op) ((op >> 1) & 0x7)
12279 #define uMIPS_RD5(op) ((op >> 5) & 0x1f)
12280 #define uMIPS_RS5(op) (op & 0x1f)
12281
12282 /* Signed immediate */
12283 #define SIMM(op, start, width)                                          \
12284     ((int32_t)(((op >> start) & ((~0U) >> (32-width)))                 \
12285                << (32-width))                                           \
12286      >> (32-width))
12287 /* Zero-extended immediate */
12288 #define ZIMM(op, start, width) ((op >> start) & ((~0U) >> (32-width)))
12289
12290 static void gen_addiur1sp(DisasContext *ctx)
12291 {
12292     int rd = mmreg(uMIPS_RD(ctx->opcode));
12293
12294     gen_arith_imm(ctx, OPC_ADDIU, rd, 29, ((ctx->opcode >> 1) & 0x3f) << 2);
12295 }
12296
12297 static void gen_addiur2(DisasContext *ctx)
12298 {
12299     static const int decoded_imm[] = { 1, 4, 8, 12, 16, 20, 24, -1 };
12300     int rd = mmreg(uMIPS_RD(ctx->opcode));
12301     int rs = mmreg(uMIPS_RS(ctx->opcode));
12302
12303     gen_arith_imm(ctx, OPC_ADDIU, rd, rs, decoded_imm[ZIMM(ctx->opcode, 1, 3)]);
12304 }
12305
12306 static void gen_addiusp(DisasContext *ctx)
12307 {
12308     int encoded = ZIMM(ctx->opcode, 1, 9);
12309     int decoded;
12310
12311     if (encoded <= 1) {
12312         decoded = 256 + encoded;
12313     } else if (encoded <= 255) {
12314         decoded = encoded;
12315     } else if (encoded <= 509) {
12316         decoded = encoded - 512;
12317     } else {
12318         decoded = encoded - 768;
12319     }
12320
12321     gen_arith_imm(ctx, OPC_ADDIU, 29, 29, decoded << 2);
12322 }
12323
12324 static void gen_addius5(DisasContext *ctx)
12325 {
12326     int imm = SIMM(ctx->opcode, 1, 4);
12327     int rd = (ctx->opcode >> 5) & 0x1f;
12328
12329     gen_arith_imm(ctx, OPC_ADDIU, rd, rd, imm);
12330 }
12331
12332 static void gen_andi16(DisasContext *ctx)
12333 {
12334     static const int decoded_imm[] = { 128, 1, 2, 3, 4, 7, 8, 15, 16,
12335                                  31, 32, 63, 64, 255, 32768, 65535 };
12336     int rd = mmreg(uMIPS_RD(ctx->opcode));
12337     int rs = mmreg(uMIPS_RS(ctx->opcode));
12338     int encoded = ZIMM(ctx->opcode, 0, 4);
12339
12340     gen_logic_imm(ctx, OPC_ANDI, rd, rs, decoded_imm[encoded]);
12341 }
12342
12343 static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist,
12344                                int base, int16_t offset)
12345 {
12346     const char *opn = "ldst_multiple";
12347     TCGv t0, t1;
12348     TCGv_i32 t2;
12349
12350     if (ctx->hflags & MIPS_HFLAG_BMASK) {
12351         generate_exception(ctx, EXCP_RI);
12352         return;
12353     }
12354
12355     t0 = tcg_temp_new();
12356
12357     gen_base_offset_addr(ctx, t0, base, offset);
12358
12359     t1 = tcg_const_tl(reglist);
12360     t2 = tcg_const_i32(ctx->mem_idx);
12361
12362     save_cpu_state(ctx, 1);
12363     switch (opc) {
12364     case LWM32:
12365         gen_helper_lwm(cpu_env, t0, t1, t2);
12366         opn = "lwm";
12367         break;
12368     case SWM32:
12369         gen_helper_swm(cpu_env, t0, t1, t2);
12370         opn = "swm";
12371         break;
12372 #ifdef TARGET_MIPS64
12373     case LDM:
12374         gen_helper_ldm(cpu_env, t0, t1, t2);
12375         opn = "ldm";
12376         break;
12377     case SDM:
12378         gen_helper_sdm(cpu_env, t0, t1, t2);
12379         opn = "sdm";
12380         break;
12381 #endif
12382     }
12383     (void)opn;
12384     MIPS_DEBUG("%s, %x, %d(%s)", opn, reglist, offset, regnames[base]);
12385     tcg_temp_free(t0);
12386     tcg_temp_free(t1);
12387     tcg_temp_free_i32(t2);
12388 }
12389
12390
12391 static void gen_pool16c_insn(DisasContext *ctx)
12392 {
12393     int rd = mmreg((ctx->opcode >> 3) & 0x7);
12394     int rs = mmreg(ctx->opcode & 0x7);
12395
12396     switch (((ctx->opcode) >> 4) & 0x3f) {
12397     case NOT16 + 0:
12398     case NOT16 + 1:
12399     case NOT16 + 2:
12400     case NOT16 + 3:
12401         gen_logic(ctx, OPC_NOR, rd, rs, 0);
12402         break;
12403     case XOR16 + 0:
12404     case XOR16 + 1:
12405     case XOR16 + 2:
12406     case XOR16 + 3:
12407         gen_logic(ctx, OPC_XOR, rd, rd, rs);
12408         break;
12409     case AND16 + 0:
12410     case AND16 + 1:
12411     case AND16 + 2:
12412     case AND16 + 3:
12413         gen_logic(ctx, OPC_AND, rd, rd, rs);
12414         break;
12415     case OR16 + 0:
12416     case OR16 + 1:
12417     case OR16 + 2:
12418     case OR16 + 3:
12419         gen_logic(ctx, OPC_OR, rd, rd, rs);
12420         break;
12421     case LWM16 + 0:
12422     case LWM16 + 1:
12423     case LWM16 + 2:
12424     case LWM16 + 3:
12425         {
12426             static const int lwm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
12427             int offset = ZIMM(ctx->opcode, 0, 4);
12428
12429             gen_ldst_multiple(ctx, LWM32, lwm_convert[(ctx->opcode >> 4) & 0x3],
12430                               29, offset << 2);
12431         }
12432         break;
12433     case SWM16 + 0:
12434     case SWM16 + 1:
12435     case SWM16 + 2:
12436     case SWM16 + 3:
12437         {
12438             static const int swm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
12439             int offset = ZIMM(ctx->opcode, 0, 4);
12440
12441             gen_ldst_multiple(ctx, SWM32, swm_convert[(ctx->opcode >> 4) & 0x3],
12442                               29, offset << 2);
12443         }
12444         break;
12445     case JR16 + 0:
12446     case JR16 + 1:
12447         {
12448             int reg = ctx->opcode & 0x1f;
12449
12450             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 4);
12451         }
12452         break;
12453     case JRC16 + 0:
12454     case JRC16 + 1:
12455         {
12456             int reg = ctx->opcode & 0x1f;
12457             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 0);
12458             /* Let normal delay slot handling in our caller take us
12459                to the branch target.  */
12460         }
12461         break;
12462     case JALR16 + 0:
12463     case JALR16 + 1:
12464         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 4);
12465         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
12466         break;
12467     case JALR16S + 0:
12468     case JALR16S + 1:
12469         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 2);
12470         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
12471         break;
12472     case MFHI16 + 0:
12473     case MFHI16 + 1:
12474         gen_HILO(ctx, OPC_MFHI, 0, uMIPS_RS5(ctx->opcode));
12475         break;
12476     case MFLO16 + 0:
12477     case MFLO16 + 1:
12478         gen_HILO(ctx, OPC_MFLO, 0, uMIPS_RS5(ctx->opcode));
12479         break;
12480     case BREAK16:
12481         generate_exception(ctx, EXCP_BREAK);
12482         break;
12483     case SDBBP16:
12484         /* XXX: not clear which exception should be raised
12485          *      when in debug mode...
12486          */
12487         check_insn(ctx, ISA_MIPS32);
12488         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
12489             generate_exception(ctx, EXCP_DBp);
12490         } else {
12491             generate_exception(ctx, EXCP_DBp);
12492         }
12493         break;
12494     case JRADDIUSP + 0:
12495     case JRADDIUSP + 1:
12496         {
12497             int imm = ZIMM(ctx->opcode, 0, 5);
12498             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
12499             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
12500             /* Let normal delay slot handling in our caller take us
12501                to the branch target.  */
12502         }
12503         break;
12504     default:
12505         generate_exception(ctx, EXCP_RI);
12506         break;
12507     }
12508 }
12509
12510 static void gen_ldxs (DisasContext *ctx, int base, int index, int rd)
12511 {
12512     TCGv t0 = tcg_temp_new();
12513     TCGv t1 = tcg_temp_new();
12514
12515     gen_load_gpr(t0, base);
12516
12517     if (index != 0) {
12518         gen_load_gpr(t1, index);
12519         tcg_gen_shli_tl(t1, t1, 2);
12520         gen_op_addr_add(ctx, t0, t1, t0);
12521     }
12522
12523     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
12524     gen_store_gpr(t1, rd);
12525
12526     tcg_temp_free(t0);
12527     tcg_temp_free(t1);
12528 }
12529
12530 static void gen_ldst_pair (DisasContext *ctx, uint32_t opc, int rd,
12531                            int base, int16_t offset)
12532 {
12533     const char *opn = "ldst_pair";
12534     TCGv t0, t1;
12535
12536     if (ctx->hflags & MIPS_HFLAG_BMASK || rd == 31) {
12537         generate_exception(ctx, EXCP_RI);
12538         return;
12539     }
12540
12541     t0 = tcg_temp_new();
12542     t1 = tcg_temp_new();
12543
12544     gen_base_offset_addr(ctx, t0, base, offset);
12545
12546     switch (opc) {
12547     case LWP:
12548         if (rd == base) {
12549             generate_exception(ctx, EXCP_RI);
12550             return;
12551         }
12552         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
12553         gen_store_gpr(t1, rd);
12554         tcg_gen_movi_tl(t1, 4);
12555         gen_op_addr_add(ctx, t0, t0, t1);
12556         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
12557         gen_store_gpr(t1, rd+1);
12558         opn = "lwp";
12559         break;
12560     case SWP:
12561         gen_load_gpr(t1, rd);
12562         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12563         tcg_gen_movi_tl(t1, 4);
12564         gen_op_addr_add(ctx, t0, t0, t1);
12565         gen_load_gpr(t1, rd+1);
12566         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12567         opn = "swp";
12568         break;
12569 #ifdef TARGET_MIPS64
12570     case LDP:
12571         if (rd == base) {
12572             generate_exception(ctx, EXCP_RI);
12573             return;
12574         }
12575         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
12576         gen_store_gpr(t1, rd);
12577         tcg_gen_movi_tl(t1, 8);
12578         gen_op_addr_add(ctx, t0, t0, t1);
12579         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
12580         gen_store_gpr(t1, rd+1);
12581         opn = "ldp";
12582         break;
12583     case SDP:
12584         gen_load_gpr(t1, rd);
12585         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
12586         tcg_gen_movi_tl(t1, 8);
12587         gen_op_addr_add(ctx, t0, t0, t1);
12588         gen_load_gpr(t1, rd+1);
12589         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
12590         opn = "sdp";
12591         break;
12592 #endif
12593     }
12594     (void)opn; /* avoid a compiler warning */
12595     MIPS_DEBUG("%s, %s, %d(%s)", opn, regnames[rd], offset, regnames[base]);
12596     tcg_temp_free(t0);
12597     tcg_temp_free(t1);
12598 }
12599
12600 static void gen_pool32axf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs)
12601 {
12602     int extension = (ctx->opcode >> 6) & 0x3f;
12603     int minor = (ctx->opcode >> 12) & 0xf;
12604     uint32_t mips32_op;
12605
12606     switch (extension) {
12607     case TEQ:
12608         mips32_op = OPC_TEQ;
12609         goto do_trap;
12610     case TGE:
12611         mips32_op = OPC_TGE;
12612         goto do_trap;
12613     case TGEU:
12614         mips32_op = OPC_TGEU;
12615         goto do_trap;
12616     case TLT:
12617         mips32_op = OPC_TLT;
12618         goto do_trap;
12619     case TLTU:
12620         mips32_op = OPC_TLTU;
12621         goto do_trap;
12622     case TNE:
12623         mips32_op = OPC_TNE;
12624     do_trap:
12625         gen_trap(ctx, mips32_op, rs, rt, -1);
12626         break;
12627 #ifndef CONFIG_USER_ONLY
12628     case MFC0:
12629     case MFC0 + 32:
12630         check_cp0_enabled(ctx);
12631         if (rt == 0) {
12632             /* Treat as NOP. */
12633             break;
12634         }
12635         gen_mfc0(ctx, cpu_gpr[rt], rs, (ctx->opcode >> 11) & 0x7);
12636         break;
12637     case MTC0:
12638     case MTC0 + 32:
12639         check_cp0_enabled(ctx);
12640         {
12641             TCGv t0 = tcg_temp_new();
12642
12643             gen_load_gpr(t0, rt);
12644             gen_mtc0(ctx, t0, rs, (ctx->opcode >> 11) & 0x7);
12645             tcg_temp_free(t0);
12646         }
12647         break;
12648 #endif
12649     case 0x2a:
12650         switch (minor & 3) {
12651         case MADD_ACC:
12652             gen_muldiv(ctx, OPC_MADD, (ctx->opcode >> 14) & 3, rs, rt);
12653             break;
12654         case MADDU_ACC:
12655             gen_muldiv(ctx, OPC_MADDU, (ctx->opcode >> 14) & 3, rs, rt);
12656             break;
12657         case MSUB_ACC:
12658             gen_muldiv(ctx, OPC_MSUB, (ctx->opcode >> 14) & 3, rs, rt);
12659             break;
12660         case MSUBU_ACC:
12661             gen_muldiv(ctx, OPC_MSUBU, (ctx->opcode >> 14) & 3, rs, rt);
12662             break;
12663         default:
12664             goto pool32axf_invalid;
12665         }
12666         break;
12667     case 0x32:
12668         switch (minor & 3) {
12669         case MULT_ACC:
12670             gen_muldiv(ctx, OPC_MULT, (ctx->opcode >> 14) & 3, rs, rt);
12671             break;
12672         case MULTU_ACC:
12673             gen_muldiv(ctx, OPC_MULTU, (ctx->opcode >> 14) & 3, rs, rt);
12674             break;
12675         default:
12676             goto pool32axf_invalid;
12677         }
12678         break;
12679     case 0x2c:
12680         switch (minor) {
12681         case SEB:
12682             gen_bshfl(ctx, OPC_SEB, rs, rt);
12683             break;
12684         case SEH:
12685             gen_bshfl(ctx, OPC_SEH, rs, rt);
12686             break;
12687         case CLO:
12688             mips32_op = OPC_CLO;
12689             goto do_cl;
12690         case CLZ:
12691             mips32_op = OPC_CLZ;
12692         do_cl:
12693             check_insn(ctx, ISA_MIPS32);
12694             gen_cl(ctx, mips32_op, rt, rs);
12695             break;
12696         case RDHWR:
12697             gen_rdhwr(ctx, rt, rs);
12698             break;
12699         case WSBH:
12700             gen_bshfl(ctx, OPC_WSBH, rs, rt);
12701             break;
12702         case MULT:
12703             mips32_op = OPC_MULT;
12704             goto do_mul;
12705         case MULTU:
12706             mips32_op = OPC_MULTU;
12707             goto do_mul;
12708         case DIV:
12709             mips32_op = OPC_DIV;
12710             goto do_div;
12711         case DIVU:
12712             mips32_op = OPC_DIVU;
12713             goto do_div;
12714         do_div:
12715             check_insn(ctx, ISA_MIPS32);
12716             gen_muldiv(ctx, mips32_op, 0, rs, rt);
12717             break;
12718         case MADD:
12719             mips32_op = OPC_MADD;
12720             goto do_mul;
12721         case MADDU:
12722             mips32_op = OPC_MADDU;
12723             goto do_mul;
12724         case MSUB:
12725             mips32_op = OPC_MSUB;
12726             goto do_mul;
12727         case MSUBU:
12728             mips32_op = OPC_MSUBU;
12729         do_mul:
12730             check_insn(ctx, ISA_MIPS32);
12731             gen_muldiv(ctx, mips32_op, 0, rs, rt);
12732             break;
12733         default:
12734             goto pool32axf_invalid;
12735         }
12736         break;
12737     case 0x34:
12738         switch (minor) {
12739         case MFC2:
12740         case MTC2:
12741         case MFHC2:
12742         case MTHC2:
12743         case CFC2:
12744         case CTC2:
12745             generate_exception_err(ctx, EXCP_CpU, 2);
12746             break;
12747         default:
12748             goto pool32axf_invalid;
12749         }
12750         break;
12751     case 0x3c:
12752         switch (minor) {
12753         case JALR:
12754         case JALR_HB:
12755             gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 4);
12756             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
12757             break;
12758         case JALRS:
12759         case JALRS_HB:
12760             gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 2);
12761             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
12762             break;
12763         default:
12764             goto pool32axf_invalid;
12765         }
12766         break;
12767     case 0x05:
12768         switch (minor) {
12769         case RDPGPR:
12770             check_cp0_enabled(ctx);
12771             check_insn(ctx, ISA_MIPS32R2);
12772             gen_load_srsgpr(rt, rs);
12773             break;
12774         case WRPGPR:
12775             check_cp0_enabled(ctx);
12776             check_insn(ctx, ISA_MIPS32R2);
12777             gen_store_srsgpr(rt, rs);
12778             break;
12779         default:
12780             goto pool32axf_invalid;
12781         }
12782         break;
12783 #ifndef CONFIG_USER_ONLY
12784     case 0x0d:
12785         switch (minor) {
12786         case TLBP:
12787             mips32_op = OPC_TLBP;
12788             goto do_cp0;
12789         case TLBR:
12790             mips32_op = OPC_TLBR;
12791             goto do_cp0;
12792         case TLBWI:
12793             mips32_op = OPC_TLBWI;
12794             goto do_cp0;
12795         case TLBWR:
12796             mips32_op = OPC_TLBWR;
12797             goto do_cp0;
12798         case WAIT:
12799             mips32_op = OPC_WAIT;
12800             goto do_cp0;
12801         case DERET:
12802             mips32_op = OPC_DERET;
12803             goto do_cp0;
12804         case ERET:
12805             mips32_op = OPC_ERET;
12806         do_cp0:
12807             gen_cp0(env, ctx, mips32_op, rt, rs);
12808             break;
12809         default:
12810             goto pool32axf_invalid;
12811         }
12812         break;
12813     case 0x1d:
12814         switch (minor) {
12815         case DI:
12816             check_cp0_enabled(ctx);
12817             {
12818                 TCGv t0 = tcg_temp_new();
12819
12820                 save_cpu_state(ctx, 1);
12821                 gen_helper_di(t0, cpu_env);
12822                 gen_store_gpr(t0, rs);
12823                 /* Stop translation as we may have switched the execution mode */
12824                 ctx->bstate = BS_STOP;
12825                 tcg_temp_free(t0);
12826             }
12827             break;
12828         case EI:
12829             check_cp0_enabled(ctx);
12830             {
12831                 TCGv t0 = tcg_temp_new();
12832
12833                 save_cpu_state(ctx, 1);
12834                 gen_helper_ei(t0, cpu_env);
12835                 gen_store_gpr(t0, rs);
12836                 /* Stop translation as we may have switched the execution mode */
12837                 ctx->bstate = BS_STOP;
12838                 tcg_temp_free(t0);
12839             }
12840             break;
12841         default:
12842             goto pool32axf_invalid;
12843         }
12844         break;
12845 #endif
12846     case 0x2d:
12847         switch (minor) {
12848         case SYNC:
12849             /* NOP */
12850             break;
12851         case SYSCALL:
12852             generate_exception(ctx, EXCP_SYSCALL);
12853             ctx->bstate = BS_STOP;
12854             break;
12855         case SDBBP:
12856             check_insn(ctx, ISA_MIPS32);
12857             if (!(ctx->hflags & MIPS_HFLAG_DM)) {
12858                 generate_exception(ctx, EXCP_DBp);
12859             } else {
12860                 generate_exception(ctx, EXCP_DBp);
12861             }
12862             break;
12863         default:
12864             goto pool32axf_invalid;
12865         }
12866         break;
12867     case 0x01:
12868         switch (minor & 3) {
12869         case MFHI_ACC:
12870             gen_HILO(ctx, OPC_MFHI, minor >> 2, rs);
12871             break;
12872         case MFLO_ACC:
12873             gen_HILO(ctx, OPC_MFLO, minor >> 2, rs);
12874             break;
12875         case MTHI_ACC:
12876             gen_HILO(ctx, OPC_MTHI, minor >> 2, rs);
12877             break;
12878         case MTLO_ACC:
12879             gen_HILO(ctx, OPC_MTLO, minor >> 2, rs);
12880             break;
12881         default:
12882             goto pool32axf_invalid;
12883         }
12884         break;
12885     case 0x35:
12886         switch (minor) {
12887         case MFHI32:
12888             gen_HILO(ctx, OPC_MFHI, 0, rs);
12889             break;
12890         case MFLO32:
12891             gen_HILO(ctx, OPC_MFLO, 0, rs);
12892             break;
12893         case MTHI32:
12894             gen_HILO(ctx, OPC_MTHI, 0, rs);
12895             break;
12896         case MTLO32:
12897             gen_HILO(ctx, OPC_MTLO, 0, rs);
12898             break;
12899         default:
12900             goto pool32axf_invalid;
12901         }
12902         break;
12903     default:
12904     pool32axf_invalid:
12905         MIPS_INVAL("pool32axf");
12906         generate_exception(ctx, EXCP_RI);
12907         break;
12908     }
12909 }
12910
12911 /* Values for microMIPS fmt field.  Variable-width, depending on which
12912    formats the instruction supports.  */
12913
12914 enum {
12915     FMT_SD_S = 0,
12916     FMT_SD_D = 1,
12917
12918     FMT_SDPS_S = 0,
12919     FMT_SDPS_D = 1,
12920     FMT_SDPS_PS = 2,
12921
12922     FMT_SWL_S = 0,
12923     FMT_SWL_W = 1,
12924     FMT_SWL_L = 2,
12925
12926     FMT_DWL_D = 0,
12927     FMT_DWL_W = 1,
12928     FMT_DWL_L = 2
12929 };
12930
12931 static void gen_pool32fxf(DisasContext *ctx, int rt, int rs)
12932 {
12933     int extension = (ctx->opcode >> 6) & 0x3ff;
12934     uint32_t mips32_op;
12935
12936 #define FLOAT_1BIT_FMT(opc, fmt) (fmt << 8) | opc
12937 #define FLOAT_2BIT_FMT(opc, fmt) (fmt << 7) | opc
12938 #define COND_FLOAT_MOV(opc, cond) (cond << 7) | opc
12939
12940     switch (extension) {
12941     case FLOAT_1BIT_FMT(CFC1, 0):
12942         mips32_op = OPC_CFC1;
12943         goto do_cp1;
12944     case FLOAT_1BIT_FMT(CTC1, 0):
12945         mips32_op = OPC_CTC1;
12946         goto do_cp1;
12947     case FLOAT_1BIT_FMT(MFC1, 0):
12948         mips32_op = OPC_MFC1;
12949         goto do_cp1;
12950     case FLOAT_1BIT_FMT(MTC1, 0):
12951         mips32_op = OPC_MTC1;
12952         goto do_cp1;
12953     case FLOAT_1BIT_FMT(MFHC1, 0):
12954         mips32_op = OPC_MFHC1;
12955         goto do_cp1;
12956     case FLOAT_1BIT_FMT(MTHC1, 0):
12957         mips32_op = OPC_MTHC1;
12958     do_cp1:
12959         gen_cp1(ctx, mips32_op, rt, rs);
12960         break;
12961
12962         /* Reciprocal square root */
12963     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_S):
12964         mips32_op = OPC_RSQRT_S;
12965         goto do_unaryfp;
12966     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_D):
12967         mips32_op = OPC_RSQRT_D;
12968         goto do_unaryfp;
12969
12970         /* Square root */
12971     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_S):
12972         mips32_op = OPC_SQRT_S;
12973         goto do_unaryfp;
12974     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_D):
12975         mips32_op = OPC_SQRT_D;
12976         goto do_unaryfp;
12977
12978         /* Reciprocal */
12979     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_S):
12980         mips32_op = OPC_RECIP_S;
12981         goto do_unaryfp;
12982     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_D):
12983         mips32_op = OPC_RECIP_D;
12984         goto do_unaryfp;
12985
12986         /* Floor */
12987     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_S):
12988         mips32_op = OPC_FLOOR_L_S;
12989         goto do_unaryfp;
12990     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_D):
12991         mips32_op = OPC_FLOOR_L_D;
12992         goto do_unaryfp;
12993     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_S):
12994         mips32_op = OPC_FLOOR_W_S;
12995         goto do_unaryfp;
12996     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_D):
12997         mips32_op = OPC_FLOOR_W_D;
12998         goto do_unaryfp;
12999
13000         /* Ceiling */
13001     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_S):
13002         mips32_op = OPC_CEIL_L_S;
13003         goto do_unaryfp;
13004     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_D):
13005         mips32_op = OPC_CEIL_L_D;
13006         goto do_unaryfp;
13007     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_S):
13008         mips32_op = OPC_CEIL_W_S;
13009         goto do_unaryfp;
13010     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_D):
13011         mips32_op = OPC_CEIL_W_D;
13012         goto do_unaryfp;
13013
13014         /* Truncation */
13015     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_S):
13016         mips32_op = OPC_TRUNC_L_S;
13017         goto do_unaryfp;
13018     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_D):
13019         mips32_op = OPC_TRUNC_L_D;
13020         goto do_unaryfp;
13021     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_S):
13022         mips32_op = OPC_TRUNC_W_S;
13023         goto do_unaryfp;
13024     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_D):
13025         mips32_op = OPC_TRUNC_W_D;
13026         goto do_unaryfp;
13027
13028         /* Round */
13029     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_S):
13030         mips32_op = OPC_ROUND_L_S;
13031         goto do_unaryfp;
13032     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_D):
13033         mips32_op = OPC_ROUND_L_D;
13034         goto do_unaryfp;
13035     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_S):
13036         mips32_op = OPC_ROUND_W_S;
13037         goto do_unaryfp;
13038     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_D):
13039         mips32_op = OPC_ROUND_W_D;
13040         goto do_unaryfp;
13041
13042         /* Integer to floating-point conversion */
13043     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_S):
13044         mips32_op = OPC_CVT_L_S;
13045         goto do_unaryfp;
13046     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_D):
13047         mips32_op = OPC_CVT_L_D;
13048         goto do_unaryfp;
13049     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_S):
13050         mips32_op = OPC_CVT_W_S;
13051         goto do_unaryfp;
13052     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_D):
13053         mips32_op = OPC_CVT_W_D;
13054         goto do_unaryfp;
13055
13056         /* Paired-foo conversions */
13057     case FLOAT_1BIT_FMT(CVT_S_PL, 0):
13058         mips32_op = OPC_CVT_S_PL;
13059         goto do_unaryfp;
13060     case FLOAT_1BIT_FMT(CVT_S_PU, 0):
13061         mips32_op = OPC_CVT_S_PU;
13062         goto do_unaryfp;
13063     case FLOAT_1BIT_FMT(CVT_PW_PS, 0):
13064         mips32_op = OPC_CVT_PW_PS;
13065         goto do_unaryfp;
13066     case FLOAT_1BIT_FMT(CVT_PS_PW, 0):
13067         mips32_op = OPC_CVT_PS_PW;
13068         goto do_unaryfp;
13069
13070         /* Floating-point moves */
13071     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_S):
13072         mips32_op = OPC_MOV_S;
13073         goto do_unaryfp;
13074     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_D):
13075         mips32_op = OPC_MOV_D;
13076         goto do_unaryfp;
13077     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_PS):
13078         mips32_op = OPC_MOV_PS;
13079         goto do_unaryfp;
13080
13081         /* Absolute value */
13082     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_S):
13083         mips32_op = OPC_ABS_S;
13084         goto do_unaryfp;
13085     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_D):
13086         mips32_op = OPC_ABS_D;
13087         goto do_unaryfp;
13088     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_PS):
13089         mips32_op = OPC_ABS_PS;
13090         goto do_unaryfp;
13091
13092         /* Negation */
13093     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_S):
13094         mips32_op = OPC_NEG_S;
13095         goto do_unaryfp;
13096     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_D):
13097         mips32_op = OPC_NEG_D;
13098         goto do_unaryfp;
13099     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_PS):
13100         mips32_op = OPC_NEG_PS;
13101         goto do_unaryfp;
13102
13103         /* Reciprocal square root step */
13104     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_S):
13105         mips32_op = OPC_RSQRT1_S;
13106         goto do_unaryfp;
13107     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_D):
13108         mips32_op = OPC_RSQRT1_D;
13109         goto do_unaryfp;
13110     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_PS):
13111         mips32_op = OPC_RSQRT1_PS;
13112         goto do_unaryfp;
13113
13114         /* Reciprocal step */
13115     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_S):
13116         mips32_op = OPC_RECIP1_S;
13117         goto do_unaryfp;
13118     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_D):
13119         mips32_op = OPC_RECIP1_S;
13120         goto do_unaryfp;
13121     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_PS):
13122         mips32_op = OPC_RECIP1_PS;
13123         goto do_unaryfp;
13124
13125         /* Conversions from double */
13126     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_S):
13127         mips32_op = OPC_CVT_D_S;
13128         goto do_unaryfp;
13129     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_W):
13130         mips32_op = OPC_CVT_D_W;
13131         goto do_unaryfp;
13132     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_L):
13133         mips32_op = OPC_CVT_D_L;
13134         goto do_unaryfp;
13135
13136         /* Conversions from single */
13137     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_D):
13138         mips32_op = OPC_CVT_S_D;
13139         goto do_unaryfp;
13140     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_W):
13141         mips32_op = OPC_CVT_S_W;
13142         goto do_unaryfp;
13143     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_L):
13144         mips32_op = OPC_CVT_S_L;
13145     do_unaryfp:
13146         gen_farith(ctx, mips32_op, -1, rs, rt, 0);
13147         break;
13148
13149         /* Conditional moves on floating-point codes */
13150     case COND_FLOAT_MOV(MOVT, 0):
13151     case COND_FLOAT_MOV(MOVT, 1):
13152     case COND_FLOAT_MOV(MOVT, 2):
13153     case COND_FLOAT_MOV(MOVT, 3):
13154     case COND_FLOAT_MOV(MOVT, 4):
13155     case COND_FLOAT_MOV(MOVT, 5):
13156     case COND_FLOAT_MOV(MOVT, 6):
13157     case COND_FLOAT_MOV(MOVT, 7):
13158         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 1);
13159         break;
13160     case COND_FLOAT_MOV(MOVF, 0):
13161     case COND_FLOAT_MOV(MOVF, 1):
13162     case COND_FLOAT_MOV(MOVF, 2):
13163     case COND_FLOAT_MOV(MOVF, 3):
13164     case COND_FLOAT_MOV(MOVF, 4):
13165     case COND_FLOAT_MOV(MOVF, 5):
13166     case COND_FLOAT_MOV(MOVF, 6):
13167     case COND_FLOAT_MOV(MOVF, 7):
13168         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 0);
13169         break;
13170     default:
13171         MIPS_INVAL("pool32fxf");
13172         generate_exception(ctx, EXCP_RI);
13173         break;
13174     }
13175 }
13176
13177 static void decode_micromips32_opc (CPUMIPSState *env, DisasContext *ctx,
13178                                     uint16_t insn_hw1)
13179 {
13180     int32_t offset;
13181     uint16_t insn;
13182     int rt, rs, rd, rr;
13183     int16_t imm;
13184     uint32_t op, minor, mips32_op;
13185     uint32_t cond, fmt, cc;
13186
13187     insn = cpu_lduw_code(env, ctx->pc + 2);
13188     ctx->opcode = (ctx->opcode << 16) | insn;
13189
13190     rt = (ctx->opcode >> 21) & 0x1f;
13191     rs = (ctx->opcode >> 16) & 0x1f;
13192     rd = (ctx->opcode >> 11) & 0x1f;
13193     rr = (ctx->opcode >> 6) & 0x1f;
13194     imm = (int16_t) ctx->opcode;
13195
13196     op = (ctx->opcode >> 26) & 0x3f;
13197     switch (op) {
13198     case POOL32A:
13199         minor = ctx->opcode & 0x3f;
13200         switch (minor) {
13201         case 0x00:
13202             minor = (ctx->opcode >> 6) & 0xf;
13203             switch (minor) {
13204             case SLL32:
13205                 mips32_op = OPC_SLL;
13206                 goto do_shifti;
13207             case SRA:
13208                 mips32_op = OPC_SRA;
13209                 goto do_shifti;
13210             case SRL32:
13211                 mips32_op = OPC_SRL;
13212                 goto do_shifti;
13213             case ROTR:
13214                 mips32_op = OPC_ROTR;
13215             do_shifti:
13216                 gen_shift_imm(ctx, mips32_op, rt, rs, rd);
13217                 break;
13218             default:
13219                 goto pool32a_invalid;
13220             }
13221             break;
13222         case 0x10:
13223             minor = (ctx->opcode >> 6) & 0xf;
13224             switch (minor) {
13225                 /* Arithmetic */
13226             case ADD:
13227                 mips32_op = OPC_ADD;
13228                 goto do_arith;
13229             case ADDU32:
13230                 mips32_op = OPC_ADDU;
13231                 goto do_arith;
13232             case SUB:
13233                 mips32_op = OPC_SUB;
13234                 goto do_arith;
13235             case SUBU32:
13236                 mips32_op = OPC_SUBU;
13237                 goto do_arith;
13238             case MUL:
13239                 mips32_op = OPC_MUL;
13240             do_arith:
13241                 gen_arith(ctx, mips32_op, rd, rs, rt);
13242                 break;
13243                 /* Shifts */
13244             case SLLV:
13245                 mips32_op = OPC_SLLV;
13246                 goto do_shift;
13247             case SRLV:
13248                 mips32_op = OPC_SRLV;
13249                 goto do_shift;
13250             case SRAV:
13251                 mips32_op = OPC_SRAV;
13252                 goto do_shift;
13253             case ROTRV:
13254                 mips32_op = OPC_ROTRV;
13255             do_shift:
13256                 gen_shift(ctx, mips32_op, rd, rs, rt);
13257                 break;
13258                 /* Logical operations */
13259             case AND:
13260                 mips32_op = OPC_AND;
13261                 goto do_logic;
13262             case OR32:
13263                 mips32_op = OPC_OR;
13264                 goto do_logic;
13265             case NOR:
13266                 mips32_op = OPC_NOR;
13267                 goto do_logic;
13268             case XOR32:
13269                 mips32_op = OPC_XOR;
13270             do_logic:
13271                 gen_logic(ctx, mips32_op, rd, rs, rt);
13272                 break;
13273                 /* Set less than */
13274             case SLT:
13275                 mips32_op = OPC_SLT;
13276                 goto do_slt;
13277             case SLTU:
13278                 mips32_op = OPC_SLTU;
13279             do_slt:
13280                 gen_slt(ctx, mips32_op, rd, rs, rt);
13281                 break;
13282             default:
13283                 goto pool32a_invalid;
13284             }
13285             break;
13286         case 0x18:
13287             minor = (ctx->opcode >> 6) & 0xf;
13288             switch (minor) {
13289                 /* Conditional moves */
13290             case MOVN:
13291                 mips32_op = OPC_MOVN;
13292                 goto do_cmov;
13293             case MOVZ:
13294                 mips32_op = OPC_MOVZ;
13295             do_cmov:
13296                 gen_cond_move(ctx, mips32_op, rd, rs, rt);
13297                 break;
13298             case LWXS:
13299                 gen_ldxs(ctx, rs, rt, rd);
13300                 break;
13301             default:
13302                 goto pool32a_invalid;
13303             }
13304             break;
13305         case INS:
13306             gen_bitops(ctx, OPC_INS, rt, rs, rr, rd);
13307             return;
13308         case EXT:
13309             gen_bitops(ctx, OPC_EXT, rt, rs, rr, rd);
13310             return;
13311         case POOL32AXF:
13312             gen_pool32axf(env, ctx, rt, rs);
13313             break;
13314         case 0x07:
13315             generate_exception(ctx, EXCP_BREAK);
13316             break;
13317         default:
13318         pool32a_invalid:
13319                 MIPS_INVAL("pool32a");
13320                 generate_exception(ctx, EXCP_RI);
13321                 break;
13322         }
13323         break;
13324     case POOL32B:
13325         minor = (ctx->opcode >> 12) & 0xf;
13326         switch (minor) {
13327         case CACHE:
13328             check_cp0_enabled(ctx);
13329             /* Treat as no-op. */
13330             break;
13331         case LWC2:
13332         case SWC2:
13333             /* COP2: Not implemented. */
13334             generate_exception_err(ctx, EXCP_CpU, 2);
13335             break;
13336 #ifdef TARGET_MIPS64
13337         case LDP:
13338         case SDP:
13339             check_insn(ctx, ISA_MIPS3);
13340             check_mips_64(ctx);
13341             /* Fallthrough */
13342 #endif
13343         case LWP:
13344         case SWP:
13345             gen_ldst_pair(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
13346             break;
13347 #ifdef TARGET_MIPS64
13348         case LDM:
13349         case SDM:
13350             check_insn(ctx, ISA_MIPS3);
13351             check_mips_64(ctx);
13352             /* Fallthrough */
13353 #endif
13354         case LWM32:
13355         case SWM32:
13356             gen_ldst_multiple(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
13357             break;
13358         default:
13359             MIPS_INVAL("pool32b");
13360             generate_exception(ctx, EXCP_RI);
13361             break;
13362         }
13363         break;
13364     case POOL32F:
13365         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
13366             minor = ctx->opcode & 0x3f;
13367             check_cp1_enabled(ctx);
13368             switch (minor) {
13369             case ALNV_PS:
13370                 mips32_op = OPC_ALNV_PS;
13371                 goto do_madd;
13372             case MADD_S:
13373                 mips32_op = OPC_MADD_S;
13374                 goto do_madd;
13375             case MADD_D:
13376                 mips32_op = OPC_MADD_D;
13377                 goto do_madd;
13378             case MADD_PS:
13379                 mips32_op = OPC_MADD_PS;
13380                 goto do_madd;
13381             case MSUB_S:
13382                 mips32_op = OPC_MSUB_S;
13383                 goto do_madd;
13384             case MSUB_D:
13385                 mips32_op = OPC_MSUB_D;
13386                 goto do_madd;
13387             case MSUB_PS:
13388                 mips32_op = OPC_MSUB_PS;
13389                 goto do_madd;
13390             case NMADD_S:
13391                 mips32_op = OPC_NMADD_S;
13392                 goto do_madd;
13393             case NMADD_D:
13394                 mips32_op = OPC_NMADD_D;
13395                 goto do_madd;
13396             case NMADD_PS:
13397                 mips32_op = OPC_NMADD_PS;
13398                 goto do_madd;
13399             case NMSUB_S:
13400                 mips32_op = OPC_NMSUB_S;
13401                 goto do_madd;
13402             case NMSUB_D:
13403                 mips32_op = OPC_NMSUB_D;
13404                 goto do_madd;
13405             case NMSUB_PS:
13406                 mips32_op = OPC_NMSUB_PS;
13407             do_madd:
13408                 gen_flt3_arith(ctx, mips32_op, rd, rr, rs, rt);
13409                 break;
13410             case CABS_COND_FMT:
13411                 cond = (ctx->opcode >> 6) & 0xf;
13412                 cc = (ctx->opcode >> 13) & 0x7;
13413                 fmt = (ctx->opcode >> 10) & 0x3;
13414                 switch (fmt) {
13415                 case 0x0:
13416                     gen_cmpabs_s(ctx, cond, rt, rs, cc);
13417                     break;
13418                 case 0x1:
13419                     gen_cmpabs_d(ctx, cond, rt, rs, cc);
13420                     break;
13421                 case 0x2:
13422                     gen_cmpabs_ps(ctx, cond, rt, rs, cc);
13423                     break;
13424                 default:
13425                     goto pool32f_invalid;
13426                 }
13427                 break;
13428             case C_COND_FMT:
13429                 cond = (ctx->opcode >> 6) & 0xf;
13430                 cc = (ctx->opcode >> 13) & 0x7;
13431                 fmt = (ctx->opcode >> 10) & 0x3;
13432                 switch (fmt) {
13433                 case 0x0:
13434                     gen_cmp_s(ctx, cond, rt, rs, cc);
13435                     break;
13436                 case 0x1:
13437                     gen_cmp_d(ctx, cond, rt, rs, cc);
13438                     break;
13439                 case 0x2:
13440                     gen_cmp_ps(ctx, cond, rt, rs, cc);
13441                     break;
13442                 default:
13443                     goto pool32f_invalid;
13444                 }
13445                 break;
13446             case POOL32FXF:
13447                 gen_pool32fxf(ctx, rt, rs);
13448                 break;
13449             case 0x00:
13450                 /* PLL foo */
13451                 switch ((ctx->opcode >> 6) & 0x7) {
13452                 case PLL_PS:
13453                     mips32_op = OPC_PLL_PS;
13454                     goto do_ps;
13455                 case PLU_PS:
13456                     mips32_op = OPC_PLU_PS;
13457                     goto do_ps;
13458                 case PUL_PS:
13459                     mips32_op = OPC_PUL_PS;
13460                     goto do_ps;
13461                 case PUU_PS:
13462                     mips32_op = OPC_PUU_PS;
13463                     goto do_ps;
13464                 case CVT_PS_S:
13465                     mips32_op = OPC_CVT_PS_S;
13466                 do_ps:
13467                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
13468                     break;
13469                 default:
13470                     goto pool32f_invalid;
13471                 }
13472                 break;
13473             case 0x08:
13474                 /* [LS][WDU]XC1 */
13475                 switch ((ctx->opcode >> 6) & 0x7) {
13476                 case LWXC1:
13477                     mips32_op = OPC_LWXC1;
13478                     goto do_ldst_cp1;
13479                 case SWXC1:
13480                     mips32_op = OPC_SWXC1;
13481                     goto do_ldst_cp1;
13482                 case LDXC1:
13483                     mips32_op = OPC_LDXC1;
13484                     goto do_ldst_cp1;
13485                 case SDXC1:
13486                     mips32_op = OPC_SDXC1;
13487                     goto do_ldst_cp1;
13488                 case LUXC1:
13489                     mips32_op = OPC_LUXC1;
13490                     goto do_ldst_cp1;
13491                 case SUXC1:
13492                     mips32_op = OPC_SUXC1;
13493                 do_ldst_cp1:
13494                     gen_flt3_ldst(ctx, mips32_op, rd, rd, rt, rs);
13495                     break;
13496                 default:
13497                     goto pool32f_invalid;
13498                 }
13499                 break;
13500             case 0x18:
13501                 /* 3D insns */
13502                 fmt = (ctx->opcode >> 9) & 0x3;
13503                 switch ((ctx->opcode >> 6) & 0x7) {
13504                 case RSQRT2_FMT:
13505                     switch (fmt) {
13506                     case FMT_SDPS_S:
13507                         mips32_op = OPC_RSQRT2_S;
13508                         goto do_3d;
13509                     case FMT_SDPS_D:
13510                         mips32_op = OPC_RSQRT2_D;
13511                         goto do_3d;
13512                     case FMT_SDPS_PS:
13513                         mips32_op = OPC_RSQRT2_PS;
13514                         goto do_3d;
13515                     default:
13516                         goto pool32f_invalid;
13517                     }
13518                     break;
13519                 case RECIP2_FMT:
13520                     switch (fmt) {
13521                     case FMT_SDPS_S:
13522                         mips32_op = OPC_RECIP2_S;
13523                         goto do_3d;
13524                     case FMT_SDPS_D:
13525                         mips32_op = OPC_RECIP2_D;
13526                         goto do_3d;
13527                     case FMT_SDPS_PS:
13528                         mips32_op = OPC_RECIP2_PS;
13529                         goto do_3d;
13530                     default:
13531                         goto pool32f_invalid;
13532                     }
13533                     break;
13534                 case ADDR_PS:
13535                     mips32_op = OPC_ADDR_PS;
13536                     goto do_3d;
13537                 case MULR_PS:
13538                     mips32_op = OPC_MULR_PS;
13539                 do_3d:
13540                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
13541                     break;
13542                 default:
13543                     goto pool32f_invalid;
13544                 }
13545                 break;
13546             case 0x20:
13547                 /* MOV[FT].fmt and PREFX */
13548                 cc = (ctx->opcode >> 13) & 0x7;
13549                 fmt = (ctx->opcode >> 9) & 0x3;
13550                 switch ((ctx->opcode >> 6) & 0x7) {
13551                 case MOVF_FMT:
13552                     switch (fmt) {
13553                     case FMT_SDPS_S:
13554                         gen_movcf_s(ctx, rs, rt, cc, 0);
13555                         break;
13556                     case FMT_SDPS_D:
13557                         gen_movcf_d(ctx, rs, rt, cc, 0);
13558                         break;
13559                     case FMT_SDPS_PS:
13560                         gen_movcf_ps(ctx, rs, rt, cc, 0);
13561                         break;
13562                     default:
13563                         goto pool32f_invalid;
13564                     }
13565                     break;
13566                 case MOVT_FMT:
13567                     switch (fmt) {
13568                     case FMT_SDPS_S:
13569                         gen_movcf_s(ctx, rs, rt, cc, 1);
13570                         break;
13571                     case FMT_SDPS_D:
13572                         gen_movcf_d(ctx, rs, rt, cc, 1);
13573                         break;
13574                     case FMT_SDPS_PS:
13575                         gen_movcf_ps(ctx, rs, rt, cc, 1);
13576                         break;
13577                     default:
13578                         goto pool32f_invalid;
13579                     }
13580                     break;
13581                 case PREFX:
13582                     break;
13583                 default:
13584                     goto pool32f_invalid;
13585                 }
13586                 break;
13587 #define FINSN_3ARG_SDPS(prfx)                           \
13588                 switch ((ctx->opcode >> 8) & 0x3) {     \
13589                 case FMT_SDPS_S:                        \
13590                     mips32_op = OPC_##prfx##_S;         \
13591                     goto do_fpop;                       \
13592                 case FMT_SDPS_D:                        \
13593                     mips32_op = OPC_##prfx##_D;         \
13594                     goto do_fpop;                       \
13595                 case FMT_SDPS_PS:                       \
13596                     mips32_op = OPC_##prfx##_PS;        \
13597                     goto do_fpop;                       \
13598                 default:                                \
13599                     goto pool32f_invalid;               \
13600                 }
13601             case 0x30:
13602                 /* regular FP ops */
13603                 switch ((ctx->opcode >> 6) & 0x3) {
13604                 case ADD_FMT:
13605                     FINSN_3ARG_SDPS(ADD);
13606                     break;
13607                 case SUB_FMT:
13608                     FINSN_3ARG_SDPS(SUB);
13609                     break;
13610                 case MUL_FMT:
13611                     FINSN_3ARG_SDPS(MUL);
13612                     break;
13613                 case DIV_FMT:
13614                     fmt = (ctx->opcode >> 8) & 0x3;
13615                     if (fmt == 1) {
13616                         mips32_op = OPC_DIV_D;
13617                     } else if (fmt == 0) {
13618                         mips32_op = OPC_DIV_S;
13619                     } else {
13620                         goto pool32f_invalid;
13621                     }
13622                     goto do_fpop;
13623                 default:
13624                     goto pool32f_invalid;
13625                 }
13626                 break;
13627             case 0x38:
13628                 /* cmovs */
13629                 switch ((ctx->opcode >> 6) & 0x3) {
13630                 case MOVN_FMT:
13631                     FINSN_3ARG_SDPS(MOVN);
13632                     break;
13633                 case MOVZ_FMT:
13634                     FINSN_3ARG_SDPS(MOVZ);
13635                     break;
13636                 default:
13637                     goto pool32f_invalid;
13638                 }
13639                 break;
13640             do_fpop:
13641                 gen_farith(ctx, mips32_op, rt, rs, rd, 0);
13642                 break;
13643             default:
13644             pool32f_invalid:
13645                 MIPS_INVAL("pool32f");
13646                 generate_exception(ctx, EXCP_RI);
13647                 break;
13648             }
13649         } else {
13650             generate_exception_err(ctx, EXCP_CpU, 1);
13651         }
13652         break;
13653     case POOL32I:
13654         minor = (ctx->opcode >> 21) & 0x1f;
13655         switch (minor) {
13656         case BLTZ:
13657             gen_compute_branch(ctx, OPC_BLTZ, 4, rs, -1, imm << 1, 4);
13658             break;
13659         case BLTZAL:
13660             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 4);
13661             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13662             break;
13663         case BLTZALS:
13664             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 2);
13665             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13666             break;
13667         case BGEZ:
13668             gen_compute_branch(ctx, OPC_BGEZ, 4, rs, -1, imm << 1, 4);
13669             break;
13670         case BGEZAL:
13671             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 4);
13672             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13673             break;
13674         case BGEZALS:
13675             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 2);
13676             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13677             break;
13678         case BLEZ:
13679             gen_compute_branch(ctx, OPC_BLEZ, 4, rs, -1, imm << 1, 4);
13680             break;
13681         case BGTZ:
13682             gen_compute_branch(ctx, OPC_BGTZ, 4, rs, -1, imm << 1, 4);
13683             break;
13684
13685             /* Traps */
13686         case TLTI:
13687             mips32_op = OPC_TLTI;
13688             goto do_trapi;
13689         case TGEI:
13690             mips32_op = OPC_TGEI;
13691             goto do_trapi;
13692         case TLTIU:
13693             mips32_op = OPC_TLTIU;
13694             goto do_trapi;
13695         case TGEIU:
13696             mips32_op = OPC_TGEIU;
13697             goto do_trapi;
13698         case TNEI:
13699             mips32_op = OPC_TNEI;
13700             goto do_trapi;
13701         case TEQI:
13702             mips32_op = OPC_TEQI;
13703         do_trapi:
13704             gen_trap(ctx, mips32_op, rs, -1, imm);
13705             break;
13706
13707         case BNEZC:
13708         case BEQZC:
13709             gen_compute_branch(ctx, minor == BNEZC ? OPC_BNE : OPC_BEQ,
13710                                4, rs, 0, imm << 1, 0);
13711             /* Compact branches don't have a delay slot, so just let
13712                the normal delay slot handling take us to the branch
13713                target. */
13714             break;
13715         case LUI:
13716             gen_logic_imm(ctx, OPC_LUI, rs, 0, imm);
13717             break;
13718         case SYNCI:
13719             /* Break the TB to be able to sync copied instructions
13720                immediately */
13721             ctx->bstate = BS_STOP;
13722             break;
13723         case BC2F:
13724         case BC2T:
13725             /* COP2: Not implemented. */
13726             generate_exception_err(ctx, EXCP_CpU, 2);
13727             break;
13728         case BC1F:
13729             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1FANY2 : OPC_BC1F;
13730             goto do_cp1branch;
13731         case BC1T:
13732             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1TANY2 : OPC_BC1T;
13733             goto do_cp1branch;
13734         case BC1ANY4F:
13735             mips32_op = OPC_BC1FANY4;
13736             goto do_cp1mips3d;
13737         case BC1ANY4T:
13738             mips32_op = OPC_BC1TANY4;
13739         do_cp1mips3d:
13740             check_cop1x(ctx);
13741             check_insn(ctx, ASE_MIPS3D);
13742             /* Fall through */
13743         do_cp1branch:
13744             if (env->CP0_Config1 & (1 << CP0C1_FP)) {
13745                 check_cp1_enabled(ctx);
13746                 gen_compute_branch1(ctx, mips32_op,
13747                                     (ctx->opcode >> 18) & 0x7, imm << 1);
13748             } else {
13749                 generate_exception_err(ctx, EXCP_CpU, 1);
13750             }
13751             break;
13752         case BPOSGE64:
13753         case BPOSGE32:
13754             /* MIPS DSP: not implemented */
13755             /* Fall through */
13756         default:
13757             MIPS_INVAL("pool32i");
13758             generate_exception(ctx, EXCP_RI);
13759             break;
13760         }
13761         break;
13762     case POOL32C:
13763         minor = (ctx->opcode >> 12) & 0xf;
13764         switch (minor) {
13765         case LWL:
13766             mips32_op = OPC_LWL;
13767             goto do_ld_lr;
13768         case SWL:
13769             mips32_op = OPC_SWL;
13770             goto do_st_lr;
13771         case LWR:
13772             mips32_op = OPC_LWR;
13773             goto do_ld_lr;
13774         case SWR:
13775             mips32_op = OPC_SWR;
13776             goto do_st_lr;
13777 #if defined(TARGET_MIPS64)
13778         case LDL:
13779             check_insn(ctx, ISA_MIPS3);
13780             check_mips_64(ctx);
13781             mips32_op = OPC_LDL;
13782             goto do_ld_lr;
13783         case SDL:
13784             check_insn(ctx, ISA_MIPS3);
13785             check_mips_64(ctx);
13786             mips32_op = OPC_SDL;
13787             goto do_st_lr;
13788         case LDR:
13789             check_insn(ctx, ISA_MIPS3);
13790             check_mips_64(ctx);
13791             mips32_op = OPC_LDR;
13792             goto do_ld_lr;
13793         case SDR:
13794             check_insn(ctx, ISA_MIPS3);
13795             check_mips_64(ctx);
13796             mips32_op = OPC_SDR;
13797             goto do_st_lr;
13798         case LWU:
13799             check_insn(ctx, ISA_MIPS3);
13800             check_mips_64(ctx);
13801             mips32_op = OPC_LWU;
13802             goto do_ld_lr;
13803         case LLD:
13804             check_insn(ctx, ISA_MIPS3);
13805             check_mips_64(ctx);
13806             mips32_op = OPC_LLD;
13807             goto do_ld_lr;
13808 #endif
13809         case LL:
13810             mips32_op = OPC_LL;
13811             goto do_ld_lr;
13812         do_ld_lr:
13813             gen_ld(ctx, mips32_op, rt, rs, SIMM(ctx->opcode, 0, 12));
13814             break;
13815         do_st_lr:
13816             gen_st(ctx, mips32_op, rt, rs, SIMM(ctx->opcode, 0, 12));
13817             break;
13818         case SC:
13819             gen_st_cond(ctx, OPC_SC, rt, rs, SIMM(ctx->opcode, 0, 12));
13820             break;
13821 #if defined(TARGET_MIPS64)
13822         case SCD:
13823             check_insn(ctx, ISA_MIPS3);
13824             check_mips_64(ctx);
13825             gen_st_cond(ctx, OPC_SCD, rt, rs, SIMM(ctx->opcode, 0, 12));
13826             break;
13827 #endif
13828         case PREF:
13829             /* Treat as no-op */
13830             break;
13831         default:
13832             MIPS_INVAL("pool32c");
13833             generate_exception(ctx, EXCP_RI);
13834             break;
13835         }
13836         break;
13837     case ADDI32:
13838         mips32_op = OPC_ADDI;
13839         goto do_addi;
13840     case ADDIU32:
13841         mips32_op = OPC_ADDIU;
13842     do_addi:
13843         gen_arith_imm(ctx, mips32_op, rt, rs, imm);
13844         break;
13845
13846         /* Logical operations */
13847     case ORI32:
13848         mips32_op = OPC_ORI;
13849         goto do_logici;
13850     case XORI32:
13851         mips32_op = OPC_XORI;
13852         goto do_logici;
13853     case ANDI32:
13854         mips32_op = OPC_ANDI;
13855     do_logici:
13856         gen_logic_imm(ctx, mips32_op, rt, rs, imm);
13857         break;
13858
13859         /* Set less than immediate */
13860     case SLTI32:
13861         mips32_op = OPC_SLTI;
13862         goto do_slti;
13863     case SLTIU32:
13864         mips32_op = OPC_SLTIU;
13865     do_slti:
13866         gen_slt_imm(ctx, mips32_op, rt, rs, imm);
13867         break;
13868     case JALX32:
13869         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
13870         gen_compute_branch(ctx, OPC_JALX, 4, rt, rs, offset, 4);
13871         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13872         break;
13873     case JALS32:
13874         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 1;
13875         gen_compute_branch(ctx, OPC_JAL, 4, rt, rs, offset, 2);
13876         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13877         break;
13878     case BEQ32:
13879         gen_compute_branch(ctx, OPC_BEQ, 4, rt, rs, imm << 1, 4);
13880         break;
13881     case BNE32:
13882         gen_compute_branch(ctx, OPC_BNE, 4, rt, rs, imm << 1, 4);
13883         break;
13884     case J32:
13885         gen_compute_branch(ctx, OPC_J, 4, rt, rs,
13886                            (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
13887         break;
13888     case JAL32:
13889         gen_compute_branch(ctx, OPC_JAL, 4, rt, rs,
13890                            (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
13891         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13892         break;
13893         /* Floating point (COP1) */
13894     case LWC132:
13895         mips32_op = OPC_LWC1;
13896         goto do_cop1;
13897     case LDC132:
13898         mips32_op = OPC_LDC1;
13899         goto do_cop1;
13900     case SWC132:
13901         mips32_op = OPC_SWC1;
13902         goto do_cop1;
13903     case SDC132:
13904         mips32_op = OPC_SDC1;
13905     do_cop1:
13906         gen_cop1_ldst(ctx, mips32_op, rt, rs, imm);
13907         break;
13908     case ADDIUPC:
13909         {
13910             int reg = mmreg(ZIMM(ctx->opcode, 23, 3));
13911             int offset = SIMM(ctx->opcode, 0, 23) << 2;
13912
13913             gen_addiupc(ctx, reg, offset, 0, 0);
13914         }
13915         break;
13916         /* Loads and stores */
13917     case LB32:
13918         mips32_op = OPC_LB;
13919         goto do_ld;
13920     case LBU32:
13921         mips32_op = OPC_LBU;
13922         goto do_ld;
13923     case LH32:
13924         mips32_op = OPC_LH;
13925         goto do_ld;
13926     case LHU32:
13927         mips32_op = OPC_LHU;
13928         goto do_ld;
13929     case LW32:
13930         mips32_op = OPC_LW;
13931         goto do_ld;
13932 #ifdef TARGET_MIPS64
13933     case LD32:
13934         check_insn(ctx, ISA_MIPS3);
13935         check_mips_64(ctx);
13936         mips32_op = OPC_LD;
13937         goto do_ld;
13938     case SD32:
13939         check_insn(ctx, ISA_MIPS3);
13940         check_mips_64(ctx);
13941         mips32_op = OPC_SD;
13942         goto do_st;
13943 #endif
13944     case SB32:
13945         mips32_op = OPC_SB;
13946         goto do_st;
13947     case SH32:
13948         mips32_op = OPC_SH;
13949         goto do_st;
13950     case SW32:
13951         mips32_op = OPC_SW;
13952         goto do_st;
13953     do_ld:
13954         gen_ld(ctx, mips32_op, rt, rs, imm);
13955         break;
13956     do_st:
13957         gen_st(ctx, mips32_op, rt, rs, imm);
13958         break;
13959     default:
13960         generate_exception(ctx, EXCP_RI);
13961         break;
13962     }
13963 }
13964
13965 static int decode_micromips_opc (CPUMIPSState *env, DisasContext *ctx)
13966 {
13967     uint32_t op;
13968
13969     /* make sure instructions are on a halfword boundary */
13970     if (ctx->pc & 0x1) {
13971         env->CP0_BadVAddr = ctx->pc;
13972         generate_exception(ctx, EXCP_AdEL);
13973         ctx->bstate = BS_STOP;
13974         return 2;
13975     }
13976
13977     op = (ctx->opcode >> 10) & 0x3f;
13978     /* Enforce properly-sized instructions in a delay slot */
13979     if (ctx->hflags & MIPS_HFLAG_BDS_STRICT) {
13980         switch (op & 0x7) { /* MSB-3..MSB-5 */
13981         case 0:
13982         /* POOL32A, POOL32B, POOL32I, POOL32C */
13983         case 4:
13984         /* ADDI32, ADDIU32, ORI32, XORI32, SLTI32, SLTIU32, ANDI32, JALX32 */
13985         case 5:
13986         /* LBU32, LHU32, POOL32F, JALS32, BEQ32, BNE32, J32, JAL32 */
13987         case 6:
13988         /* SB32, SH32, ADDIUPC, SWC132, SDC132, SW32 */
13989         case 7:
13990         /* LB32, LH32, LWC132, LDC132, LW32 */
13991             if (ctx->hflags & MIPS_HFLAG_BDS16) {
13992                 generate_exception(ctx, EXCP_RI);
13993                 /* Just stop translation; the user is confused.  */
13994                 ctx->bstate = BS_STOP;
13995                 return 2;
13996             }
13997             break;
13998         case 1:
13999         /* POOL16A, POOL16B, POOL16C, LWGP16, POOL16F */
14000         case 2:
14001         /* LBU16, LHU16, LWSP16, LW16, SB16, SH16, SWSP16, SW16 */
14002         case 3:
14003         /* MOVE16, ANDI16, POOL16D, POOL16E, BEQZ16, BNEZ16, B16, LI16 */
14004             if (ctx->hflags & MIPS_HFLAG_BDS32) {
14005                 generate_exception(ctx, EXCP_RI);
14006                 /* Just stop translation; the user is confused.  */
14007                 ctx->bstate = BS_STOP;
14008                 return 2;
14009             }
14010             break;
14011         }
14012     }
14013
14014     switch (op) {
14015     case POOL16A:
14016         {
14017             int rd = mmreg(uMIPS_RD(ctx->opcode));
14018             int rs1 = mmreg(uMIPS_RS1(ctx->opcode));
14019             int rs2 = mmreg(uMIPS_RS2(ctx->opcode));
14020             uint32_t opc = 0;
14021
14022             switch (ctx->opcode & 0x1) {
14023             case ADDU16:
14024                 opc = OPC_ADDU;
14025                 break;
14026             case SUBU16:
14027                 opc = OPC_SUBU;
14028                 break;
14029             }
14030
14031             gen_arith(ctx, opc, rd, rs1, rs2);
14032         }
14033         break;
14034     case POOL16B:
14035         {
14036             int rd = mmreg(uMIPS_RD(ctx->opcode));
14037             int rs = mmreg(uMIPS_RS(ctx->opcode));
14038             int amount = (ctx->opcode >> 1) & 0x7;
14039             uint32_t opc = 0;
14040             amount = amount == 0 ? 8 : amount;
14041
14042             switch (ctx->opcode & 0x1) {
14043             case SLL16:
14044                 opc = OPC_SLL;
14045                 break;
14046             case SRL16:
14047                 opc = OPC_SRL;
14048                 break;
14049             }
14050
14051             gen_shift_imm(ctx, opc, rd, rs, amount);
14052         }
14053         break;
14054     case POOL16C:
14055         gen_pool16c_insn(ctx);
14056         break;
14057     case LWGP16:
14058         {
14059             int rd = mmreg(uMIPS_RD(ctx->opcode));
14060             int rb = 28;            /* GP */
14061             int16_t offset = SIMM(ctx->opcode, 0, 7) << 2;
14062
14063             gen_ld(ctx, OPC_LW, rd, rb, offset);
14064         }
14065         break;
14066     case POOL16F:
14067         if (ctx->opcode & 1) {
14068             generate_exception(ctx, EXCP_RI);
14069         } else {
14070             /* MOVEP */
14071             int enc_dest = uMIPS_RD(ctx->opcode);
14072             int enc_rt = uMIPS_RS2(ctx->opcode);
14073             int enc_rs = uMIPS_RS1(ctx->opcode);
14074             int rd, rs, re, rt;
14075             static const int rd_enc[] = { 5, 5, 6, 4, 4, 4, 4, 4 };
14076             static const int re_enc[] = { 6, 7, 7, 21, 22, 5, 6, 7 };
14077             static const int rs_rt_enc[] = { 0, 17, 2, 3, 16, 18, 19, 20 };
14078
14079             rd = rd_enc[enc_dest];
14080             re = re_enc[enc_dest];
14081             rs = rs_rt_enc[enc_rs];
14082             rt = rs_rt_enc[enc_rt];
14083
14084             gen_arith(ctx, OPC_ADDU, rd, rs, 0);
14085             gen_arith(ctx, OPC_ADDU, re, rt, 0);
14086         }
14087         break;
14088     case LBU16:
14089         {
14090             int rd = mmreg(uMIPS_RD(ctx->opcode));
14091             int rb = mmreg(uMIPS_RS(ctx->opcode));
14092             int16_t offset = ZIMM(ctx->opcode, 0, 4);
14093             offset = (offset == 0xf ? -1 : offset);
14094
14095             gen_ld(ctx, OPC_LBU, rd, rb, offset);
14096         }
14097         break;
14098     case LHU16:
14099         {
14100             int rd = mmreg(uMIPS_RD(ctx->opcode));
14101             int rb = mmreg(uMIPS_RS(ctx->opcode));
14102             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
14103
14104             gen_ld(ctx, OPC_LHU, rd, rb, offset);
14105         }
14106         break;
14107     case LWSP16:
14108         {
14109             int rd = (ctx->opcode >> 5) & 0x1f;
14110             int rb = 29;            /* SP */
14111             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
14112
14113             gen_ld(ctx, OPC_LW, rd, rb, offset);
14114         }
14115         break;
14116     case LW16:
14117         {
14118             int rd = mmreg(uMIPS_RD(ctx->opcode));
14119             int rb = mmreg(uMIPS_RS(ctx->opcode));
14120             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
14121
14122             gen_ld(ctx, OPC_LW, rd, rb, offset);
14123         }
14124         break;
14125     case SB16:
14126         {
14127             int rd = mmreg2(uMIPS_RD(ctx->opcode));
14128             int rb = mmreg(uMIPS_RS(ctx->opcode));
14129             int16_t offset = ZIMM(ctx->opcode, 0, 4);
14130
14131             gen_st(ctx, OPC_SB, rd, rb, offset);
14132         }
14133         break;
14134     case SH16:
14135         {
14136             int rd = mmreg2(uMIPS_RD(ctx->opcode));
14137             int rb = mmreg(uMIPS_RS(ctx->opcode));
14138             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
14139
14140             gen_st(ctx, OPC_SH, rd, rb, offset);
14141         }
14142         break;
14143     case SWSP16:
14144         {
14145             int rd = (ctx->opcode >> 5) & 0x1f;
14146             int rb = 29;            /* SP */
14147             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
14148
14149             gen_st(ctx, OPC_SW, rd, rb, offset);
14150         }
14151         break;
14152     case SW16:
14153         {
14154             int rd = mmreg2(uMIPS_RD(ctx->opcode));
14155             int rb = mmreg(uMIPS_RS(ctx->opcode));
14156             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
14157
14158             gen_st(ctx, OPC_SW, rd, rb, offset);
14159         }
14160         break;
14161     case MOVE16:
14162         {
14163             int rd = uMIPS_RD5(ctx->opcode);
14164             int rs = uMIPS_RS5(ctx->opcode);
14165
14166             gen_arith(ctx, OPC_ADDU, rd, rs, 0);
14167         }
14168         break;
14169     case ANDI16:
14170         gen_andi16(ctx);
14171         break;
14172     case POOL16D:
14173         switch (ctx->opcode & 0x1) {
14174         case ADDIUS5:
14175             gen_addius5(ctx);
14176             break;
14177         case ADDIUSP:
14178             gen_addiusp(ctx);
14179             break;
14180         }
14181         break;
14182     case POOL16E:
14183         switch (ctx->opcode & 0x1) {
14184         case ADDIUR2:
14185             gen_addiur2(ctx);
14186             break;
14187         case ADDIUR1SP:
14188             gen_addiur1sp(ctx);
14189             break;
14190         }
14191         break;
14192     case B16:
14193         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0,
14194                            SIMM(ctx->opcode, 0, 10) << 1, 4);
14195         break;
14196     case BNEZ16:
14197     case BEQZ16:
14198         gen_compute_branch(ctx, op == BNEZ16 ? OPC_BNE : OPC_BEQ, 2,
14199                            mmreg(uMIPS_RD(ctx->opcode)),
14200                            0, SIMM(ctx->opcode, 0, 7) << 1, 4);
14201         break;
14202     case LI16:
14203         {
14204             int reg = mmreg(uMIPS_RD(ctx->opcode));
14205             int imm = ZIMM(ctx->opcode, 0, 7);
14206
14207             imm = (imm == 0x7f ? -1 : imm);
14208             tcg_gen_movi_tl(cpu_gpr[reg], imm);
14209         }
14210         break;
14211     case RES_20:
14212     case RES_28:
14213     case RES_29:
14214     case RES_30:
14215     case RES_31:
14216     case RES_38:
14217     case RES_39:
14218         generate_exception(ctx, EXCP_RI);
14219         break;
14220     default:
14221         decode_micromips32_opc (env, ctx, op);
14222         return 4;
14223     }
14224
14225     return 2;
14226 }
14227
14228 /* SmartMIPS extension to MIPS32 */
14229
14230 #if defined(TARGET_MIPS64)
14231
14232 /* MDMX extension to MIPS64 */
14233
14234 #endif
14235
14236 /* MIPSDSP functions. */
14237 static void gen_mipsdsp_ld(DisasContext *ctx, uint32_t opc,
14238                            int rd, int base, int offset)
14239 {
14240     const char *opn = "ldx";
14241     TCGv t0;
14242
14243     check_dsp(ctx);
14244     t0 = tcg_temp_new();
14245
14246     if (base == 0) {
14247         gen_load_gpr(t0, offset);
14248     } else if (offset == 0) {
14249         gen_load_gpr(t0, base);
14250     } else {
14251         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[offset]);
14252     }
14253
14254     switch (opc) {
14255     case OPC_LBUX:
14256         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
14257         gen_store_gpr(t0, rd);
14258         opn = "lbux";
14259         break;
14260     case OPC_LHX:
14261         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW);
14262         gen_store_gpr(t0, rd);
14263         opn = "lhx";
14264         break;
14265     case OPC_LWX:
14266         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
14267         gen_store_gpr(t0, rd);
14268         opn = "lwx";
14269         break;
14270 #if defined(TARGET_MIPS64)
14271     case OPC_LDX:
14272         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
14273         gen_store_gpr(t0, rd);
14274         opn = "ldx";
14275         break;
14276 #endif
14277     }
14278     (void)opn; /* avoid a compiler warning */
14279     MIPS_DEBUG("%s %s, %s(%s)", opn,
14280                regnames[rd], regnames[offset], regnames[base]);
14281     tcg_temp_free(t0);
14282 }
14283
14284 static void gen_mipsdsp_arith(DisasContext *ctx, uint32_t op1, uint32_t op2,
14285                               int ret, int v1, int v2)
14286 {
14287     const char *opn = "mipsdsp arith";
14288     TCGv v1_t;
14289     TCGv v2_t;
14290
14291     if (ret == 0) {
14292         /* Treat as NOP. */
14293         MIPS_DEBUG("NOP");
14294         return;
14295     }
14296
14297     v1_t = tcg_temp_new();
14298     v2_t = tcg_temp_new();
14299
14300     gen_load_gpr(v1_t, v1);
14301     gen_load_gpr(v2_t, v2);
14302
14303     switch (op1) {
14304     /* OPC_MULT_G_2E is equal OPC_ADDUH_QB_DSP */
14305     case OPC_MULT_G_2E:
14306         check_dspr2(ctx);
14307         switch (op2) {
14308         case OPC_ADDUH_QB:
14309             gen_helper_adduh_qb(cpu_gpr[ret], v1_t, v2_t);
14310             break;
14311         case OPC_ADDUH_R_QB:
14312             gen_helper_adduh_r_qb(cpu_gpr[ret], v1_t, v2_t);
14313             break;
14314         case OPC_ADDQH_PH:
14315             gen_helper_addqh_ph(cpu_gpr[ret], v1_t, v2_t);
14316             break;
14317         case OPC_ADDQH_R_PH:
14318             gen_helper_addqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
14319             break;
14320         case OPC_ADDQH_W:
14321             gen_helper_addqh_w(cpu_gpr[ret], v1_t, v2_t);
14322             break;
14323         case OPC_ADDQH_R_W:
14324             gen_helper_addqh_r_w(cpu_gpr[ret], v1_t, v2_t);
14325             break;
14326         case OPC_SUBUH_QB:
14327             gen_helper_subuh_qb(cpu_gpr[ret], v1_t, v2_t);
14328             break;
14329         case OPC_SUBUH_R_QB:
14330             gen_helper_subuh_r_qb(cpu_gpr[ret], v1_t, v2_t);
14331             break;
14332         case OPC_SUBQH_PH:
14333             gen_helper_subqh_ph(cpu_gpr[ret], v1_t, v2_t);
14334             break;
14335         case OPC_SUBQH_R_PH:
14336             gen_helper_subqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
14337             break;
14338         case OPC_SUBQH_W:
14339             gen_helper_subqh_w(cpu_gpr[ret], v1_t, v2_t);
14340             break;
14341         case OPC_SUBQH_R_W:
14342             gen_helper_subqh_r_w(cpu_gpr[ret], v1_t, v2_t);
14343             break;
14344         }
14345         break;
14346     case OPC_ABSQ_S_PH_DSP:
14347         switch (op2) {
14348         case OPC_ABSQ_S_QB:
14349             check_dspr2(ctx);
14350             gen_helper_absq_s_qb(cpu_gpr[ret], v2_t, cpu_env);
14351             break;
14352         case OPC_ABSQ_S_PH:
14353             check_dsp(ctx);
14354             gen_helper_absq_s_ph(cpu_gpr[ret], v2_t, cpu_env);
14355             break;
14356         case OPC_ABSQ_S_W:
14357             check_dsp(ctx);
14358             gen_helper_absq_s_w(cpu_gpr[ret], v2_t, cpu_env);
14359             break;
14360         case OPC_PRECEQ_W_PHL:
14361             check_dsp(ctx);
14362             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFF0000);
14363             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
14364             break;
14365         case OPC_PRECEQ_W_PHR:
14366             check_dsp(ctx);
14367             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0x0000FFFF);
14368             tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 16);
14369             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
14370             break;
14371         case OPC_PRECEQU_PH_QBL:
14372             check_dsp(ctx);
14373             gen_helper_precequ_ph_qbl(cpu_gpr[ret], v2_t);
14374             break;
14375         case OPC_PRECEQU_PH_QBR:
14376             check_dsp(ctx);
14377             gen_helper_precequ_ph_qbr(cpu_gpr[ret], v2_t);
14378             break;
14379         case OPC_PRECEQU_PH_QBLA:
14380             check_dsp(ctx);
14381             gen_helper_precequ_ph_qbla(cpu_gpr[ret], v2_t);
14382             break;
14383         case OPC_PRECEQU_PH_QBRA:
14384             check_dsp(ctx);
14385             gen_helper_precequ_ph_qbra(cpu_gpr[ret], v2_t);
14386             break;
14387         case OPC_PRECEU_PH_QBL:
14388             check_dsp(ctx);
14389             gen_helper_preceu_ph_qbl(cpu_gpr[ret], v2_t);
14390             break;
14391         case OPC_PRECEU_PH_QBR:
14392             check_dsp(ctx);
14393             gen_helper_preceu_ph_qbr(cpu_gpr[ret], v2_t);
14394             break;
14395         case OPC_PRECEU_PH_QBLA:
14396             check_dsp(ctx);
14397             gen_helper_preceu_ph_qbla(cpu_gpr[ret], v2_t);
14398             break;
14399         case OPC_PRECEU_PH_QBRA:
14400             check_dsp(ctx);
14401             gen_helper_preceu_ph_qbra(cpu_gpr[ret], v2_t);
14402             break;
14403         }
14404         break;
14405     case OPC_ADDU_QB_DSP:
14406         switch (op2) {
14407         case OPC_ADDQ_PH:
14408             check_dsp(ctx);
14409             gen_helper_addq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14410             break;
14411         case OPC_ADDQ_S_PH:
14412             check_dsp(ctx);
14413             gen_helper_addq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14414             break;
14415         case OPC_ADDQ_S_W:
14416             check_dsp(ctx);
14417             gen_helper_addq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14418             break;
14419         case OPC_ADDU_QB:
14420             check_dsp(ctx);
14421             gen_helper_addu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14422             break;
14423         case OPC_ADDU_S_QB:
14424             check_dsp(ctx);
14425             gen_helper_addu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14426             break;
14427         case OPC_ADDU_PH:
14428             check_dspr2(ctx);
14429             gen_helper_addu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14430             break;
14431         case OPC_ADDU_S_PH:
14432             check_dspr2(ctx);
14433             gen_helper_addu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14434             break;
14435         case OPC_SUBQ_PH:
14436             check_dsp(ctx);
14437             gen_helper_subq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14438             break;
14439         case OPC_SUBQ_S_PH:
14440             check_dsp(ctx);
14441             gen_helper_subq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14442             break;
14443         case OPC_SUBQ_S_W:
14444             check_dsp(ctx);
14445             gen_helper_subq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14446             break;
14447         case OPC_SUBU_QB:
14448             check_dsp(ctx);
14449             gen_helper_subu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14450             break;
14451         case OPC_SUBU_S_QB:
14452             check_dsp(ctx);
14453             gen_helper_subu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14454             break;
14455         case OPC_SUBU_PH:
14456             check_dspr2(ctx);
14457             gen_helper_subu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14458             break;
14459         case OPC_SUBU_S_PH:
14460             check_dspr2(ctx);
14461             gen_helper_subu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14462             break;
14463         case OPC_ADDSC:
14464             check_dsp(ctx);
14465             gen_helper_addsc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14466             break;
14467         case OPC_ADDWC:
14468             check_dsp(ctx);
14469             gen_helper_addwc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14470             break;
14471         case OPC_MODSUB:
14472             check_dsp(ctx);
14473             gen_helper_modsub(cpu_gpr[ret], v1_t, v2_t);
14474             break;
14475         case OPC_RADDU_W_QB:
14476             check_dsp(ctx);
14477             gen_helper_raddu_w_qb(cpu_gpr[ret], v1_t);
14478             break;
14479         }
14480         break;
14481     case OPC_CMPU_EQ_QB_DSP:
14482         switch (op2) {
14483         case OPC_PRECR_QB_PH:
14484             check_dspr2(ctx);
14485             gen_helper_precr_qb_ph(cpu_gpr[ret], v1_t, v2_t);
14486             break;
14487         case OPC_PRECRQ_QB_PH:
14488             check_dsp(ctx);
14489             gen_helper_precrq_qb_ph(cpu_gpr[ret], v1_t, v2_t);
14490             break;
14491         case OPC_PRECR_SRA_PH_W:
14492             check_dspr2(ctx);
14493             {
14494                 TCGv_i32 sa_t = tcg_const_i32(v2);
14495                 gen_helper_precr_sra_ph_w(cpu_gpr[ret], sa_t, v1_t,
14496                                           cpu_gpr[ret]);
14497                 tcg_temp_free_i32(sa_t);
14498                 break;
14499             }
14500         case OPC_PRECR_SRA_R_PH_W:
14501             check_dspr2(ctx);
14502             {
14503                 TCGv_i32 sa_t = tcg_const_i32(v2);
14504                 gen_helper_precr_sra_r_ph_w(cpu_gpr[ret], sa_t, v1_t,
14505                                             cpu_gpr[ret]);
14506                 tcg_temp_free_i32(sa_t);
14507                 break;
14508             }
14509         case OPC_PRECRQ_PH_W:
14510             check_dsp(ctx);
14511             gen_helper_precrq_ph_w(cpu_gpr[ret], v1_t, v2_t);
14512             break;
14513         case OPC_PRECRQ_RS_PH_W:
14514             check_dsp(ctx);
14515             gen_helper_precrq_rs_ph_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14516             break;
14517         case OPC_PRECRQU_S_QB_PH:
14518             check_dsp(ctx);
14519             gen_helper_precrqu_s_qb_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14520             break;
14521         }
14522         break;
14523 #ifdef TARGET_MIPS64
14524     case OPC_ABSQ_S_QH_DSP:
14525         switch (op2) {
14526         case OPC_PRECEQ_L_PWL:
14527             check_dsp(ctx);
14528             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFFFFFF00000000ull);
14529             break;
14530         case OPC_PRECEQ_L_PWR:
14531             check_dsp(ctx);
14532             tcg_gen_shli_tl(cpu_gpr[ret], v2_t, 32);
14533             break;
14534         case OPC_PRECEQ_PW_QHL:
14535             check_dsp(ctx);
14536             gen_helper_preceq_pw_qhl(cpu_gpr[ret], v2_t);
14537             break;
14538         case OPC_PRECEQ_PW_QHR:
14539             check_dsp(ctx);
14540             gen_helper_preceq_pw_qhr(cpu_gpr[ret], v2_t);
14541             break;
14542         case OPC_PRECEQ_PW_QHLA:
14543             check_dsp(ctx);
14544             gen_helper_preceq_pw_qhla(cpu_gpr[ret], v2_t);
14545             break;
14546         case OPC_PRECEQ_PW_QHRA:
14547             check_dsp(ctx);
14548             gen_helper_preceq_pw_qhra(cpu_gpr[ret], v2_t);
14549             break;
14550         case OPC_PRECEQU_QH_OBL:
14551             check_dsp(ctx);
14552             gen_helper_precequ_qh_obl(cpu_gpr[ret], v2_t);
14553             break;
14554         case OPC_PRECEQU_QH_OBR:
14555             check_dsp(ctx);
14556             gen_helper_precequ_qh_obr(cpu_gpr[ret], v2_t);
14557             break;
14558         case OPC_PRECEQU_QH_OBLA:
14559             check_dsp(ctx);
14560             gen_helper_precequ_qh_obla(cpu_gpr[ret], v2_t);
14561             break;
14562         case OPC_PRECEQU_QH_OBRA:
14563             check_dsp(ctx);
14564             gen_helper_precequ_qh_obra(cpu_gpr[ret], v2_t);
14565             break;
14566         case OPC_PRECEU_QH_OBL:
14567             check_dsp(ctx);
14568             gen_helper_preceu_qh_obl(cpu_gpr[ret], v2_t);
14569             break;
14570         case OPC_PRECEU_QH_OBR:
14571             check_dsp(ctx);
14572             gen_helper_preceu_qh_obr(cpu_gpr[ret], v2_t);
14573             break;
14574         case OPC_PRECEU_QH_OBLA:
14575             check_dsp(ctx);
14576             gen_helper_preceu_qh_obla(cpu_gpr[ret], v2_t);
14577             break;
14578         case OPC_PRECEU_QH_OBRA:
14579             check_dsp(ctx);
14580             gen_helper_preceu_qh_obra(cpu_gpr[ret], v2_t);
14581             break;
14582         case OPC_ABSQ_S_OB:
14583             check_dspr2(ctx);
14584             gen_helper_absq_s_ob(cpu_gpr[ret], v2_t, cpu_env);
14585             break;
14586         case OPC_ABSQ_S_PW:
14587             check_dsp(ctx);
14588             gen_helper_absq_s_pw(cpu_gpr[ret], v2_t, cpu_env);
14589             break;
14590         case OPC_ABSQ_S_QH:
14591             check_dsp(ctx);
14592             gen_helper_absq_s_qh(cpu_gpr[ret], v2_t, cpu_env);
14593             break;
14594         }
14595         break;
14596     case OPC_ADDU_OB_DSP:
14597         switch (op2) {
14598         case OPC_RADDU_L_OB:
14599             check_dsp(ctx);
14600             gen_helper_raddu_l_ob(cpu_gpr[ret], v1_t);
14601             break;
14602         case OPC_SUBQ_PW:
14603             check_dsp(ctx);
14604             gen_helper_subq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14605             break;
14606         case OPC_SUBQ_S_PW:
14607             check_dsp(ctx);
14608             gen_helper_subq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14609             break;
14610         case OPC_SUBQ_QH:
14611             check_dsp(ctx);
14612             gen_helper_subq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14613             break;
14614         case OPC_SUBQ_S_QH:
14615             check_dsp(ctx);
14616             gen_helper_subq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14617             break;
14618         case OPC_SUBU_OB:
14619             check_dsp(ctx);
14620             gen_helper_subu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14621             break;
14622         case OPC_SUBU_S_OB:
14623             check_dsp(ctx);
14624             gen_helper_subu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14625             break;
14626         case OPC_SUBU_QH:
14627             check_dspr2(ctx);
14628             gen_helper_subu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14629             break;
14630         case OPC_SUBU_S_QH:
14631             check_dspr2(ctx);
14632             gen_helper_subu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14633             break;
14634         case OPC_SUBUH_OB:
14635             check_dspr2(ctx);
14636             gen_helper_subuh_ob(cpu_gpr[ret], v1_t, v2_t);
14637             break;
14638         case OPC_SUBUH_R_OB:
14639             check_dspr2(ctx);
14640             gen_helper_subuh_r_ob(cpu_gpr[ret], v1_t, v2_t);
14641             break;
14642         case OPC_ADDQ_PW:
14643             check_dsp(ctx);
14644             gen_helper_addq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14645             break;
14646         case OPC_ADDQ_S_PW:
14647             check_dsp(ctx);
14648             gen_helper_addq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14649             break;
14650         case OPC_ADDQ_QH:
14651             check_dsp(ctx);
14652             gen_helper_addq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14653             break;
14654         case OPC_ADDQ_S_QH:
14655             check_dsp(ctx);
14656             gen_helper_addq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14657             break;
14658         case OPC_ADDU_OB:
14659             check_dsp(ctx);
14660             gen_helper_addu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14661             break;
14662         case OPC_ADDU_S_OB:
14663             check_dsp(ctx);
14664             gen_helper_addu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14665             break;
14666         case OPC_ADDU_QH:
14667             check_dspr2(ctx);
14668             gen_helper_addu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14669             break;
14670         case OPC_ADDU_S_QH:
14671             check_dspr2(ctx);
14672             gen_helper_addu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14673             break;
14674         case OPC_ADDUH_OB:
14675             check_dspr2(ctx);
14676             gen_helper_adduh_ob(cpu_gpr[ret], v1_t, v2_t);
14677             break;
14678         case OPC_ADDUH_R_OB:
14679             check_dspr2(ctx);
14680             gen_helper_adduh_r_ob(cpu_gpr[ret], v1_t, v2_t);
14681             break;
14682         }
14683         break;
14684     case OPC_CMPU_EQ_OB_DSP:
14685         switch (op2) {
14686         case OPC_PRECR_OB_QH:
14687             check_dspr2(ctx);
14688             gen_helper_precr_ob_qh(cpu_gpr[ret], v1_t, v2_t);
14689             break;
14690         case OPC_PRECR_SRA_QH_PW:
14691             check_dspr2(ctx);
14692             {
14693                 TCGv_i32 ret_t = tcg_const_i32(ret);
14694                 gen_helper_precr_sra_qh_pw(v2_t, v1_t, v2_t, ret_t);
14695                 tcg_temp_free_i32(ret_t);
14696                 break;
14697             }
14698         case OPC_PRECR_SRA_R_QH_PW:
14699             check_dspr2(ctx);
14700             {
14701                 TCGv_i32 sa_v = tcg_const_i32(ret);
14702                 gen_helper_precr_sra_r_qh_pw(v2_t, v1_t, v2_t, sa_v);
14703                 tcg_temp_free_i32(sa_v);
14704                 break;
14705             }
14706         case OPC_PRECRQ_OB_QH:
14707             check_dsp(ctx);
14708             gen_helper_precrq_ob_qh(cpu_gpr[ret], v1_t, v2_t);
14709             break;
14710         case OPC_PRECRQ_PW_L:
14711             check_dsp(ctx);
14712             gen_helper_precrq_pw_l(cpu_gpr[ret], v1_t, v2_t);
14713             break;
14714         case OPC_PRECRQ_QH_PW:
14715             check_dsp(ctx);
14716             gen_helper_precrq_qh_pw(cpu_gpr[ret], v1_t, v2_t);
14717             break;
14718         case OPC_PRECRQ_RS_QH_PW:
14719             check_dsp(ctx);
14720             gen_helper_precrq_rs_qh_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14721             break;
14722         case OPC_PRECRQU_S_OB_QH:
14723             check_dsp(ctx);
14724             gen_helper_precrqu_s_ob_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14725             break;
14726         }
14727         break;
14728 #endif
14729     }
14730
14731     tcg_temp_free(v1_t);
14732     tcg_temp_free(v2_t);
14733
14734     (void)opn; /* avoid a compiler warning */
14735     MIPS_DEBUG("%s", opn);
14736 }
14737
14738 static void gen_mipsdsp_shift(DisasContext *ctx, uint32_t opc,
14739                               int ret, int v1, int v2)
14740 {
14741     uint32_t op2;
14742     const char *opn = "mipsdsp shift";
14743     TCGv t0;
14744     TCGv v1_t;
14745     TCGv v2_t;
14746
14747     if (ret == 0) {
14748         /* Treat as NOP. */
14749         MIPS_DEBUG("NOP");
14750         return;
14751     }
14752
14753     t0 = tcg_temp_new();
14754     v1_t = tcg_temp_new();
14755     v2_t = tcg_temp_new();
14756
14757     tcg_gen_movi_tl(t0, v1);
14758     gen_load_gpr(v1_t, v1);
14759     gen_load_gpr(v2_t, v2);
14760
14761     switch (opc) {
14762     case OPC_SHLL_QB_DSP:
14763         {
14764             op2 = MASK_SHLL_QB(ctx->opcode);
14765             switch (op2) {
14766             case OPC_SHLL_QB:
14767                 check_dsp(ctx);
14768                 gen_helper_shll_qb(cpu_gpr[ret], t0, v2_t, cpu_env);
14769                 break;
14770             case OPC_SHLLV_QB:
14771                 check_dsp(ctx);
14772                 gen_helper_shll_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14773                 break;
14774             case OPC_SHLL_PH:
14775                 check_dsp(ctx);
14776                 gen_helper_shll_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
14777                 break;
14778             case OPC_SHLLV_PH:
14779                 check_dsp(ctx);
14780                 gen_helper_shll_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14781                 break;
14782             case OPC_SHLL_S_PH:
14783                 check_dsp(ctx);
14784                 gen_helper_shll_s_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
14785                 break;
14786             case OPC_SHLLV_S_PH:
14787                 check_dsp(ctx);
14788                 gen_helper_shll_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14789                 break;
14790             case OPC_SHLL_S_W:
14791                 check_dsp(ctx);
14792                 gen_helper_shll_s_w(cpu_gpr[ret], t0, v2_t, cpu_env);
14793                 break;
14794             case OPC_SHLLV_S_W:
14795                 check_dsp(ctx);
14796                 gen_helper_shll_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14797                 break;
14798             case OPC_SHRL_QB:
14799                 check_dsp(ctx);
14800                 gen_helper_shrl_qb(cpu_gpr[ret], t0, v2_t);
14801                 break;
14802             case OPC_SHRLV_QB:
14803                 check_dsp(ctx);
14804                 gen_helper_shrl_qb(cpu_gpr[ret], v1_t, v2_t);
14805                 break;
14806             case OPC_SHRL_PH:
14807                 check_dspr2(ctx);
14808                 gen_helper_shrl_ph(cpu_gpr[ret], t0, v2_t);
14809                 break;
14810             case OPC_SHRLV_PH:
14811                 check_dspr2(ctx);
14812                 gen_helper_shrl_ph(cpu_gpr[ret], v1_t, v2_t);
14813                 break;
14814             case OPC_SHRA_QB:
14815                 check_dspr2(ctx);
14816                 gen_helper_shra_qb(cpu_gpr[ret], t0, v2_t);
14817                 break;
14818             case OPC_SHRA_R_QB:
14819                 check_dspr2(ctx);
14820                 gen_helper_shra_r_qb(cpu_gpr[ret], t0, v2_t);
14821                 break;
14822             case OPC_SHRAV_QB:
14823                 check_dspr2(ctx);
14824                 gen_helper_shra_qb(cpu_gpr[ret], v1_t, v2_t);
14825                 break;
14826             case OPC_SHRAV_R_QB:
14827                 check_dspr2(ctx);
14828                 gen_helper_shra_r_qb(cpu_gpr[ret], v1_t, v2_t);
14829                 break;
14830             case OPC_SHRA_PH:
14831                 check_dsp(ctx);
14832                 gen_helper_shra_ph(cpu_gpr[ret], t0, v2_t);
14833                 break;
14834             case OPC_SHRA_R_PH:
14835                 check_dsp(ctx);
14836                 gen_helper_shra_r_ph(cpu_gpr[ret], t0, v2_t);
14837                 break;
14838             case OPC_SHRAV_PH:
14839                 check_dsp(ctx);
14840                 gen_helper_shra_ph(cpu_gpr[ret], v1_t, v2_t);
14841                 break;
14842             case OPC_SHRAV_R_PH:
14843                 check_dsp(ctx);
14844                 gen_helper_shra_r_ph(cpu_gpr[ret], v1_t, v2_t);
14845                 break;
14846             case OPC_SHRA_R_W:
14847                 check_dsp(ctx);
14848                 gen_helper_shra_r_w(cpu_gpr[ret], t0, v2_t);
14849                 break;
14850             case OPC_SHRAV_R_W:
14851                 check_dsp(ctx);
14852                 gen_helper_shra_r_w(cpu_gpr[ret], v1_t, v2_t);
14853                 break;
14854             default:            /* Invalid */
14855                 MIPS_INVAL("MASK SHLL.QB");
14856                 generate_exception(ctx, EXCP_RI);
14857                 break;
14858             }
14859             break;
14860         }
14861 #ifdef TARGET_MIPS64
14862     case OPC_SHLL_OB_DSP:
14863         op2 = MASK_SHLL_OB(ctx->opcode);
14864         switch (op2) {
14865         case OPC_SHLL_PW:
14866             check_dsp(ctx);
14867             gen_helper_shll_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
14868             break;
14869         case OPC_SHLLV_PW:
14870             check_dsp(ctx);
14871             gen_helper_shll_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
14872             break;
14873         case OPC_SHLL_S_PW:
14874             check_dsp(ctx);
14875             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
14876             break;
14877         case OPC_SHLLV_S_PW:
14878             check_dsp(ctx);
14879             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
14880             break;
14881         case OPC_SHLL_OB:
14882             check_dsp(ctx);
14883             gen_helper_shll_ob(cpu_gpr[ret], v2_t, t0, cpu_env);
14884             break;
14885         case OPC_SHLLV_OB:
14886             check_dsp(ctx);
14887             gen_helper_shll_ob(cpu_gpr[ret], v2_t, v1_t, cpu_env);
14888             break;
14889         case OPC_SHLL_QH:
14890             check_dsp(ctx);
14891             gen_helper_shll_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
14892             break;
14893         case OPC_SHLLV_QH:
14894             check_dsp(ctx);
14895             gen_helper_shll_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
14896             break;
14897         case OPC_SHLL_S_QH:
14898             check_dsp(ctx);
14899             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
14900             break;
14901         case OPC_SHLLV_S_QH:
14902             check_dsp(ctx);
14903             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
14904             break;
14905         case OPC_SHRA_OB:
14906             check_dspr2(ctx);
14907             gen_helper_shra_ob(cpu_gpr[ret], v2_t, t0);
14908             break;
14909         case OPC_SHRAV_OB:
14910             check_dspr2(ctx);
14911             gen_helper_shra_ob(cpu_gpr[ret], v2_t, v1_t);
14912             break;
14913         case OPC_SHRA_R_OB:
14914             check_dspr2(ctx);
14915             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, t0);
14916             break;
14917         case OPC_SHRAV_R_OB:
14918             check_dspr2(ctx);
14919             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, v1_t);
14920             break;
14921         case OPC_SHRA_PW:
14922             check_dsp(ctx);
14923             gen_helper_shra_pw(cpu_gpr[ret], v2_t, t0);
14924             break;
14925         case OPC_SHRAV_PW:
14926             check_dsp(ctx);
14927             gen_helper_shra_pw(cpu_gpr[ret], v2_t, v1_t);
14928             break;
14929         case OPC_SHRA_R_PW:
14930             check_dsp(ctx);
14931             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, t0);
14932             break;
14933         case OPC_SHRAV_R_PW:
14934             check_dsp(ctx);
14935             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, v1_t);
14936             break;
14937         case OPC_SHRA_QH:
14938             check_dsp(ctx);
14939             gen_helper_shra_qh(cpu_gpr[ret], v2_t, t0);
14940             break;
14941         case OPC_SHRAV_QH:
14942             check_dsp(ctx);
14943             gen_helper_shra_qh(cpu_gpr[ret], v2_t, v1_t);
14944             break;
14945         case OPC_SHRA_R_QH:
14946             check_dsp(ctx);
14947             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, t0);
14948             break;
14949         case OPC_SHRAV_R_QH:
14950             check_dsp(ctx);
14951             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, v1_t);
14952             break;
14953         case OPC_SHRL_OB:
14954             check_dsp(ctx);
14955             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, t0);
14956             break;
14957         case OPC_SHRLV_OB:
14958             check_dsp(ctx);
14959             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, v1_t);
14960             break;
14961         case OPC_SHRL_QH:
14962             check_dspr2(ctx);
14963             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, t0);
14964             break;
14965         case OPC_SHRLV_QH:
14966             check_dspr2(ctx);
14967             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, v1_t);
14968             break;
14969         default:            /* Invalid */
14970             MIPS_INVAL("MASK SHLL.OB");
14971             generate_exception(ctx, EXCP_RI);
14972             break;
14973         }
14974         break;
14975 #endif
14976     }
14977
14978     tcg_temp_free(t0);
14979     tcg_temp_free(v1_t);
14980     tcg_temp_free(v2_t);
14981     (void)opn; /* avoid a compiler warning */
14982     MIPS_DEBUG("%s", opn);
14983 }
14984
14985 static void gen_mipsdsp_multiply(DisasContext *ctx, uint32_t op1, uint32_t op2,
14986                                  int ret, int v1, int v2, int check_ret)
14987 {
14988     const char *opn = "mipsdsp multiply";
14989     TCGv_i32 t0;
14990     TCGv v1_t;
14991     TCGv v2_t;
14992
14993     if ((ret == 0) && (check_ret == 1)) {
14994         /* Treat as NOP. */
14995         MIPS_DEBUG("NOP");
14996         return;
14997     }
14998
14999     t0 = tcg_temp_new_i32();
15000     v1_t = tcg_temp_new();
15001     v2_t = tcg_temp_new();
15002
15003     tcg_gen_movi_i32(t0, ret);
15004     gen_load_gpr(v1_t, v1);
15005     gen_load_gpr(v2_t, v2);
15006
15007     switch (op1) {
15008     /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
15009      * the same mask and op1. */
15010     case OPC_MULT_G_2E:
15011         check_dspr2(ctx);
15012         switch (op2) {
15013         case  OPC_MUL_PH:
15014             gen_helper_mul_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15015             break;
15016         case  OPC_MUL_S_PH:
15017             gen_helper_mul_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15018             break;
15019         case OPC_MULQ_S_W:
15020             gen_helper_mulq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15021             break;
15022         case OPC_MULQ_RS_W:
15023             gen_helper_mulq_rs_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15024             break;
15025         }
15026         break;
15027     case OPC_DPA_W_PH_DSP:
15028         switch (op2) {
15029         case OPC_DPAU_H_QBL:
15030             check_dsp(ctx);
15031             gen_helper_dpau_h_qbl(t0, v1_t, v2_t, cpu_env);
15032             break;
15033         case OPC_DPAU_H_QBR:
15034             check_dsp(ctx);
15035             gen_helper_dpau_h_qbr(t0, v1_t, v2_t, cpu_env);
15036             break;
15037         case OPC_DPSU_H_QBL:
15038             check_dsp(ctx);
15039             gen_helper_dpsu_h_qbl(t0, v1_t, v2_t, cpu_env);
15040             break;
15041         case OPC_DPSU_H_QBR:
15042             check_dsp(ctx);
15043             gen_helper_dpsu_h_qbr(t0, v1_t, v2_t, cpu_env);
15044             break;
15045         case OPC_DPA_W_PH:
15046             check_dspr2(ctx);
15047             gen_helper_dpa_w_ph(t0, v1_t, v2_t, cpu_env);
15048             break;
15049         case OPC_DPAX_W_PH:
15050             check_dspr2(ctx);
15051             gen_helper_dpax_w_ph(t0, v1_t, v2_t, cpu_env);
15052             break;
15053         case OPC_DPAQ_S_W_PH:
15054             check_dsp(ctx);
15055             gen_helper_dpaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
15056             break;
15057         case OPC_DPAQX_S_W_PH:
15058             check_dspr2(ctx);
15059             gen_helper_dpaqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
15060             break;
15061         case OPC_DPAQX_SA_W_PH:
15062             check_dspr2(ctx);
15063             gen_helper_dpaqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
15064             break;
15065         case OPC_DPS_W_PH:
15066             check_dspr2(ctx);
15067             gen_helper_dps_w_ph(t0, v1_t, v2_t, cpu_env);
15068             break;
15069         case OPC_DPSX_W_PH:
15070             check_dspr2(ctx);
15071             gen_helper_dpsx_w_ph(t0, v1_t, v2_t, cpu_env);
15072             break;
15073         case OPC_DPSQ_S_W_PH:
15074             check_dsp(ctx);
15075             gen_helper_dpsq_s_w_ph(t0, v1_t, v2_t, cpu_env);
15076             break;
15077         case OPC_DPSQX_S_W_PH:
15078             check_dspr2(ctx);
15079             gen_helper_dpsqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
15080             break;
15081         case OPC_DPSQX_SA_W_PH:
15082             check_dspr2(ctx);
15083             gen_helper_dpsqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
15084             break;
15085         case OPC_MULSAQ_S_W_PH:
15086             check_dsp(ctx);
15087             gen_helper_mulsaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
15088             break;
15089         case OPC_DPAQ_SA_L_W:
15090             check_dsp(ctx);
15091             gen_helper_dpaq_sa_l_w(t0, v1_t, v2_t, cpu_env);
15092             break;
15093         case OPC_DPSQ_SA_L_W:
15094             check_dsp(ctx);
15095             gen_helper_dpsq_sa_l_w(t0, v1_t, v2_t, cpu_env);
15096             break;
15097         case OPC_MAQ_S_W_PHL:
15098             check_dsp(ctx);
15099             gen_helper_maq_s_w_phl(t0, v1_t, v2_t, cpu_env);
15100             break;
15101         case OPC_MAQ_S_W_PHR:
15102             check_dsp(ctx);
15103             gen_helper_maq_s_w_phr(t0, v1_t, v2_t, cpu_env);
15104             break;
15105         case OPC_MAQ_SA_W_PHL:
15106             check_dsp(ctx);
15107             gen_helper_maq_sa_w_phl(t0, v1_t, v2_t, cpu_env);
15108             break;
15109         case OPC_MAQ_SA_W_PHR:
15110             check_dsp(ctx);
15111             gen_helper_maq_sa_w_phr(t0, v1_t, v2_t, cpu_env);
15112             break;
15113         case OPC_MULSA_W_PH:
15114             check_dspr2(ctx);
15115             gen_helper_mulsa_w_ph(t0, v1_t, v2_t, cpu_env);
15116             break;
15117         }
15118         break;
15119 #ifdef TARGET_MIPS64
15120     case OPC_DPAQ_W_QH_DSP:
15121         {
15122             int ac = ret & 0x03;
15123             tcg_gen_movi_i32(t0, ac);
15124
15125             switch (op2) {
15126             case OPC_DMADD:
15127                 check_dsp(ctx);
15128                 gen_helper_dmadd(v1_t, v2_t, t0, cpu_env);
15129                 break;
15130             case OPC_DMADDU:
15131                 check_dsp(ctx);
15132                 gen_helper_dmaddu(v1_t, v2_t, t0, cpu_env);
15133                 break;
15134             case OPC_DMSUB:
15135                 check_dsp(ctx);
15136                 gen_helper_dmsub(v1_t, v2_t, t0, cpu_env);
15137                 break;
15138             case OPC_DMSUBU:
15139                 check_dsp(ctx);
15140                 gen_helper_dmsubu(v1_t, v2_t, t0, cpu_env);
15141                 break;
15142             case OPC_DPA_W_QH:
15143                 check_dspr2(ctx);
15144                 gen_helper_dpa_w_qh(v1_t, v2_t, t0, cpu_env);
15145                 break;
15146             case OPC_DPAQ_S_W_QH:
15147                 check_dsp(ctx);
15148                 gen_helper_dpaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
15149                 break;
15150             case OPC_DPAQ_SA_L_PW:
15151                 check_dsp(ctx);
15152                 gen_helper_dpaq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
15153                 break;
15154             case OPC_DPAU_H_OBL:
15155                 check_dsp(ctx);
15156                 gen_helper_dpau_h_obl(v1_t, v2_t, t0, cpu_env);
15157                 break;
15158             case OPC_DPAU_H_OBR:
15159                 check_dsp(ctx);
15160                 gen_helper_dpau_h_obr(v1_t, v2_t, t0, cpu_env);
15161                 break;
15162             case OPC_DPS_W_QH:
15163                 check_dspr2(ctx);
15164                 gen_helper_dps_w_qh(v1_t, v2_t, t0, cpu_env);
15165                 break;
15166             case OPC_DPSQ_S_W_QH:
15167                 check_dsp(ctx);
15168                 gen_helper_dpsq_s_w_qh(v1_t, v2_t, t0, cpu_env);
15169                 break;
15170             case OPC_DPSQ_SA_L_PW:
15171                 check_dsp(ctx);
15172                 gen_helper_dpsq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
15173                 break;
15174             case OPC_DPSU_H_OBL:
15175                 check_dsp(ctx);
15176                 gen_helper_dpsu_h_obl(v1_t, v2_t, t0, cpu_env);
15177                 break;
15178             case OPC_DPSU_H_OBR:
15179                 check_dsp(ctx);
15180                 gen_helper_dpsu_h_obr(v1_t, v2_t, t0, cpu_env);
15181                 break;
15182             case OPC_MAQ_S_L_PWL:
15183                 check_dsp(ctx);
15184                 gen_helper_maq_s_l_pwl(v1_t, v2_t, t0, cpu_env);
15185                 break;
15186             case OPC_MAQ_S_L_PWR:
15187                 check_dsp(ctx);
15188                 gen_helper_maq_s_l_pwr(v1_t, v2_t, t0, cpu_env);
15189                 break;
15190             case OPC_MAQ_S_W_QHLL:
15191                 check_dsp(ctx);
15192                 gen_helper_maq_s_w_qhll(v1_t, v2_t, t0, cpu_env);
15193                 break;
15194             case OPC_MAQ_SA_W_QHLL:
15195                 check_dsp(ctx);
15196                 gen_helper_maq_sa_w_qhll(v1_t, v2_t, t0, cpu_env);
15197                 break;
15198             case OPC_MAQ_S_W_QHLR:
15199                 check_dsp(ctx);
15200                 gen_helper_maq_s_w_qhlr(v1_t, v2_t, t0, cpu_env);
15201                 break;
15202             case OPC_MAQ_SA_W_QHLR:
15203                 check_dsp(ctx);
15204                 gen_helper_maq_sa_w_qhlr(v1_t, v2_t, t0, cpu_env);
15205                 break;
15206             case OPC_MAQ_S_W_QHRL:
15207                 check_dsp(ctx);
15208                 gen_helper_maq_s_w_qhrl(v1_t, v2_t, t0, cpu_env);
15209                 break;
15210             case OPC_MAQ_SA_W_QHRL:
15211                 check_dsp(ctx);
15212                 gen_helper_maq_sa_w_qhrl(v1_t, v2_t, t0, cpu_env);
15213                 break;
15214             case OPC_MAQ_S_W_QHRR:
15215                 check_dsp(ctx);
15216                 gen_helper_maq_s_w_qhrr(v1_t, v2_t, t0, cpu_env);
15217                 break;
15218             case OPC_MAQ_SA_W_QHRR:
15219                 check_dsp(ctx);
15220                 gen_helper_maq_sa_w_qhrr(v1_t, v2_t, t0, cpu_env);
15221                 break;
15222             case OPC_MULSAQ_S_L_PW:
15223                 check_dsp(ctx);
15224                 gen_helper_mulsaq_s_l_pw(v1_t, v2_t, t0, cpu_env);
15225                 break;
15226             case OPC_MULSAQ_S_W_QH:
15227                 check_dsp(ctx);
15228                 gen_helper_mulsaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
15229                 break;
15230             }
15231         }
15232         break;
15233 #endif
15234     case OPC_ADDU_QB_DSP:
15235         switch (op2) {
15236         case OPC_MULEU_S_PH_QBL:
15237             check_dsp(ctx);
15238             gen_helper_muleu_s_ph_qbl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15239             break;
15240         case OPC_MULEU_S_PH_QBR:
15241             check_dsp(ctx);
15242             gen_helper_muleu_s_ph_qbr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15243             break;
15244         case OPC_MULQ_RS_PH:
15245             check_dsp(ctx);
15246             gen_helper_mulq_rs_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15247             break;
15248         case OPC_MULEQ_S_W_PHL:
15249             check_dsp(ctx);
15250             gen_helper_muleq_s_w_phl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15251             break;
15252         case OPC_MULEQ_S_W_PHR:
15253             check_dsp(ctx);
15254             gen_helper_muleq_s_w_phr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15255             break;
15256         case OPC_MULQ_S_PH:
15257             check_dspr2(ctx);
15258             gen_helper_mulq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15259             break;
15260         }
15261         break;
15262 #ifdef TARGET_MIPS64
15263     case OPC_ADDU_OB_DSP:
15264         switch (op2) {
15265         case OPC_MULEQ_S_PW_QHL:
15266             check_dsp(ctx);
15267             gen_helper_muleq_s_pw_qhl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15268             break;
15269         case OPC_MULEQ_S_PW_QHR:
15270             check_dsp(ctx);
15271             gen_helper_muleq_s_pw_qhr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15272             break;
15273         case OPC_MULEU_S_QH_OBL:
15274             check_dsp(ctx);
15275             gen_helper_muleu_s_qh_obl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15276             break;
15277         case OPC_MULEU_S_QH_OBR:
15278             check_dsp(ctx);
15279             gen_helper_muleu_s_qh_obr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15280             break;
15281         case OPC_MULQ_RS_QH:
15282             check_dsp(ctx);
15283             gen_helper_mulq_rs_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15284             break;
15285         }
15286         break;
15287 #endif
15288     }
15289
15290     tcg_temp_free_i32(t0);
15291     tcg_temp_free(v1_t);
15292     tcg_temp_free(v2_t);
15293
15294     (void)opn; /* avoid a compiler warning */
15295     MIPS_DEBUG("%s", opn);
15296
15297 }
15298
15299 static void gen_mipsdsp_bitinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
15300                                 int ret, int val)
15301 {
15302     const char *opn = "mipsdsp Bit/ Manipulation";
15303     int16_t imm;
15304     TCGv t0;
15305     TCGv val_t;
15306
15307     if (ret == 0) {
15308         /* Treat as NOP. */
15309         MIPS_DEBUG("NOP");
15310         return;
15311     }
15312
15313     t0 = tcg_temp_new();
15314     val_t = tcg_temp_new();
15315     gen_load_gpr(val_t, val);
15316
15317     switch (op1) {
15318     case OPC_ABSQ_S_PH_DSP:
15319         switch (op2) {
15320         case OPC_BITREV:
15321             check_dsp(ctx);
15322             gen_helper_bitrev(cpu_gpr[ret], val_t);
15323             break;
15324         case OPC_REPL_QB:
15325             check_dsp(ctx);
15326             {
15327                 target_long result;
15328                 imm = (ctx->opcode >> 16) & 0xFF;
15329                 result = (uint32_t)imm << 24 |
15330                          (uint32_t)imm << 16 |
15331                          (uint32_t)imm << 8  |
15332                          (uint32_t)imm;
15333                 result = (int32_t)result;
15334                 tcg_gen_movi_tl(cpu_gpr[ret], result);
15335             }
15336             break;
15337         case OPC_REPLV_QB:
15338             check_dsp(ctx);
15339             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
15340             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
15341             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
15342             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
15343             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
15344             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
15345             break;
15346         case OPC_REPL_PH:
15347             check_dsp(ctx);
15348             {
15349                 imm = (ctx->opcode >> 16) & 0x03FF;
15350                 imm = (int16_t)(imm << 6) >> 6;
15351                 tcg_gen_movi_tl(cpu_gpr[ret], \
15352                                 (target_long)((int32_t)imm << 16 | \
15353                                 (uint16_t)imm));
15354             }
15355             break;
15356         case OPC_REPLV_PH:
15357             check_dsp(ctx);
15358             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
15359             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
15360             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
15361             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
15362             break;
15363         }
15364         break;
15365 #ifdef TARGET_MIPS64
15366     case OPC_ABSQ_S_QH_DSP:
15367         switch (op2) {
15368         case OPC_REPL_OB:
15369             check_dsp(ctx);
15370             {
15371                 target_long temp;
15372
15373                 imm = (ctx->opcode >> 16) & 0xFF;
15374                 temp = ((uint64_t)imm << 8) | (uint64_t)imm;
15375                 temp = (temp << 16) | temp;
15376                 temp = (temp << 32) | temp;
15377                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
15378                 break;
15379             }
15380         case OPC_REPL_PW:
15381             check_dsp(ctx);
15382             {
15383                 target_long temp;
15384
15385                 imm = (ctx->opcode >> 16) & 0x03FF;
15386                 imm = (int16_t)(imm << 6) >> 6;
15387                 temp = ((target_long)imm << 32) \
15388                        | ((target_long)imm & 0xFFFFFFFF);
15389                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
15390                 break;
15391             }
15392         case OPC_REPL_QH:
15393             check_dsp(ctx);
15394             {
15395                 target_long temp;
15396
15397                 imm = (ctx->opcode >> 16) & 0x03FF;
15398                 imm = (int16_t)(imm << 6) >> 6;
15399
15400                 temp = ((uint64_t)(uint16_t)imm << 48) |
15401                        ((uint64_t)(uint16_t)imm << 32) |
15402                        ((uint64_t)(uint16_t)imm << 16) |
15403                        (uint64_t)(uint16_t)imm;
15404                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
15405                 break;
15406             }
15407         case OPC_REPLV_OB:
15408             check_dsp(ctx);
15409             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
15410             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
15411             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
15412             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
15413             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
15414             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
15415             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
15416             break;
15417         case OPC_REPLV_PW:
15418             check_dsp(ctx);
15419             tcg_gen_ext32u_i64(cpu_gpr[ret], val_t);
15420             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
15421             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
15422             break;
15423         case OPC_REPLV_QH:
15424             check_dsp(ctx);
15425             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
15426             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
15427             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
15428             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
15429             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
15430             break;
15431         }
15432         break;
15433 #endif
15434     }
15435     tcg_temp_free(t0);
15436     tcg_temp_free(val_t);
15437
15438     (void)opn; /* avoid a compiler warning */
15439     MIPS_DEBUG("%s", opn);
15440 }
15441
15442 static void gen_mipsdsp_add_cmp_pick(DisasContext *ctx,
15443                                      uint32_t op1, uint32_t op2,
15444                                      int ret, int v1, int v2, int check_ret)
15445 {
15446     const char *opn = "mipsdsp add compare pick";
15447     TCGv t1;
15448     TCGv v1_t;
15449     TCGv v2_t;
15450
15451     if ((ret == 0) && (check_ret == 1)) {
15452         /* Treat as NOP. */
15453         MIPS_DEBUG("NOP");
15454         return;
15455     }
15456
15457     t1 = tcg_temp_new();
15458     v1_t = tcg_temp_new();
15459     v2_t = tcg_temp_new();
15460
15461     gen_load_gpr(v1_t, v1);
15462     gen_load_gpr(v2_t, v2);
15463
15464     switch (op1) {
15465     case OPC_CMPU_EQ_QB_DSP:
15466         switch (op2) {
15467         case OPC_CMPU_EQ_QB:
15468             check_dsp(ctx);
15469             gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
15470             break;
15471         case OPC_CMPU_LT_QB:
15472             check_dsp(ctx);
15473             gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
15474             break;
15475         case OPC_CMPU_LE_QB:
15476             check_dsp(ctx);
15477             gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
15478             break;
15479         case OPC_CMPGU_EQ_QB:
15480             check_dsp(ctx);
15481             gen_helper_cmpgu_eq_qb(cpu_gpr[ret], v1_t, v2_t);
15482             break;
15483         case OPC_CMPGU_LT_QB:
15484             check_dsp(ctx);
15485             gen_helper_cmpgu_lt_qb(cpu_gpr[ret], v1_t, v2_t);
15486             break;
15487         case OPC_CMPGU_LE_QB:
15488             check_dsp(ctx);
15489             gen_helper_cmpgu_le_qb(cpu_gpr[ret], v1_t, v2_t);
15490             break;
15491         case OPC_CMPGDU_EQ_QB:
15492             check_dspr2(ctx);
15493             gen_helper_cmpgu_eq_qb(t1, v1_t, v2_t);
15494             tcg_gen_mov_tl(cpu_gpr[ret], t1);
15495             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
15496             tcg_gen_shli_tl(t1, t1, 24);
15497             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
15498             break;
15499         case OPC_CMPGDU_LT_QB:
15500             check_dspr2(ctx);
15501             gen_helper_cmpgu_lt_qb(t1, v1_t, v2_t);
15502             tcg_gen_mov_tl(cpu_gpr[ret], t1);
15503             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
15504             tcg_gen_shli_tl(t1, t1, 24);
15505             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
15506             break;
15507         case OPC_CMPGDU_LE_QB:
15508             check_dspr2(ctx);
15509             gen_helper_cmpgu_le_qb(t1, v1_t, v2_t);
15510             tcg_gen_mov_tl(cpu_gpr[ret], t1);
15511             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
15512             tcg_gen_shli_tl(t1, t1, 24);
15513             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
15514             break;
15515         case OPC_CMP_EQ_PH:
15516             check_dsp(ctx);
15517             gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
15518             break;
15519         case OPC_CMP_LT_PH:
15520             check_dsp(ctx);
15521             gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
15522             break;
15523         case OPC_CMP_LE_PH:
15524             check_dsp(ctx);
15525             gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
15526             break;
15527         case OPC_PICK_QB:
15528             check_dsp(ctx);
15529             gen_helper_pick_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15530             break;
15531         case OPC_PICK_PH:
15532             check_dsp(ctx);
15533             gen_helper_pick_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15534             break;
15535         case OPC_PACKRL_PH:
15536             check_dsp(ctx);
15537             gen_helper_packrl_ph(cpu_gpr[ret], v1_t, v2_t);
15538             break;
15539         }
15540         break;
15541 #ifdef TARGET_MIPS64
15542     case OPC_CMPU_EQ_OB_DSP:
15543         switch (op2) {
15544         case OPC_CMP_EQ_PW:
15545             check_dsp(ctx);
15546             gen_helper_cmp_eq_pw(v1_t, v2_t, cpu_env);
15547             break;
15548         case OPC_CMP_LT_PW:
15549             check_dsp(ctx);
15550             gen_helper_cmp_lt_pw(v1_t, v2_t, cpu_env);
15551             break;
15552         case OPC_CMP_LE_PW:
15553             check_dsp(ctx);
15554             gen_helper_cmp_le_pw(v1_t, v2_t, cpu_env);
15555             break;
15556         case OPC_CMP_EQ_QH:
15557             check_dsp(ctx);
15558             gen_helper_cmp_eq_qh(v1_t, v2_t, cpu_env);
15559             break;
15560         case OPC_CMP_LT_QH:
15561             check_dsp(ctx);
15562             gen_helper_cmp_lt_qh(v1_t, v2_t, cpu_env);
15563             break;
15564         case OPC_CMP_LE_QH:
15565             check_dsp(ctx);
15566             gen_helper_cmp_le_qh(v1_t, v2_t, cpu_env);
15567             break;
15568         case OPC_CMPGDU_EQ_OB:
15569             check_dspr2(ctx);
15570             gen_helper_cmpgdu_eq_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15571             break;
15572         case OPC_CMPGDU_LT_OB:
15573             check_dspr2(ctx);
15574             gen_helper_cmpgdu_lt_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15575             break;
15576         case OPC_CMPGDU_LE_OB:
15577             check_dspr2(ctx);
15578             gen_helper_cmpgdu_le_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15579             break;
15580         case OPC_CMPGU_EQ_OB:
15581             check_dsp(ctx);
15582             gen_helper_cmpgu_eq_ob(cpu_gpr[ret], v1_t, v2_t);
15583             break;
15584         case OPC_CMPGU_LT_OB:
15585             check_dsp(ctx);
15586             gen_helper_cmpgu_lt_ob(cpu_gpr[ret], v1_t, v2_t);
15587             break;
15588         case OPC_CMPGU_LE_OB:
15589             check_dsp(ctx);
15590             gen_helper_cmpgu_le_ob(cpu_gpr[ret], v1_t, v2_t);
15591             break;
15592         case OPC_CMPU_EQ_OB:
15593             check_dsp(ctx);
15594             gen_helper_cmpu_eq_ob(v1_t, v2_t, cpu_env);
15595             break;
15596         case OPC_CMPU_LT_OB:
15597             check_dsp(ctx);
15598             gen_helper_cmpu_lt_ob(v1_t, v2_t, cpu_env);
15599             break;
15600         case OPC_CMPU_LE_OB:
15601             check_dsp(ctx);
15602             gen_helper_cmpu_le_ob(v1_t, v2_t, cpu_env);
15603             break;
15604         case OPC_PACKRL_PW:
15605             check_dsp(ctx);
15606             gen_helper_packrl_pw(cpu_gpr[ret], v1_t, v2_t);
15607             break;
15608         case OPC_PICK_OB:
15609             check_dsp(ctx);
15610             gen_helper_pick_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15611             break;
15612         case OPC_PICK_PW:
15613             check_dsp(ctx);
15614             gen_helper_pick_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15615             break;
15616         case OPC_PICK_QH:
15617             check_dsp(ctx);
15618             gen_helper_pick_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15619             break;
15620         }
15621         break;
15622 #endif
15623     }
15624
15625     tcg_temp_free(t1);
15626     tcg_temp_free(v1_t);
15627     tcg_temp_free(v2_t);
15628
15629     (void)opn; /* avoid a compiler warning */
15630     MIPS_DEBUG("%s", opn);
15631 }
15632
15633 static void gen_mipsdsp_append(CPUMIPSState *env, DisasContext *ctx,
15634                                uint32_t op1, int rt, int rs, int sa)
15635 {
15636     const char *opn = "mipsdsp append/dappend";
15637     TCGv t0;
15638
15639     check_dspr2(ctx);
15640
15641     if (rt == 0) {
15642         /* Treat as NOP. */
15643         MIPS_DEBUG("NOP");
15644         return;
15645     }
15646
15647     t0 = tcg_temp_new();
15648     gen_load_gpr(t0, rs);
15649
15650     switch (op1) {
15651     case OPC_APPEND_DSP:
15652         switch (MASK_APPEND(ctx->opcode)) {
15653         case OPC_APPEND:
15654             if (sa != 0) {
15655                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 32 - sa);
15656             }
15657             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
15658             break;
15659         case OPC_PREPEND:
15660             if (sa != 0) {
15661                 tcg_gen_ext32u_tl(cpu_gpr[rt], cpu_gpr[rt]);
15662                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
15663                 tcg_gen_shli_tl(t0, t0, 32 - sa);
15664                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
15665             }
15666             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
15667             break;
15668         case OPC_BALIGN:
15669             sa &= 3;
15670             if (sa != 0 && sa != 2) {
15671                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
15672                 tcg_gen_ext32u_tl(t0, t0);
15673                 tcg_gen_shri_tl(t0, t0, 8 * (4 - sa));
15674                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
15675             }
15676             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
15677             break;
15678         default:            /* Invalid */
15679             MIPS_INVAL("MASK APPEND");
15680             generate_exception(ctx, EXCP_RI);
15681             break;
15682         }
15683         break;
15684 #ifdef TARGET_MIPS64
15685     case OPC_DAPPEND_DSP:
15686         switch (MASK_DAPPEND(ctx->opcode)) {
15687         case OPC_DAPPEND:
15688             if (sa != 0) {
15689                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 64 - sa);
15690             }
15691             break;
15692         case OPC_PREPENDD:
15693             tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], 0x20 | sa);
15694             tcg_gen_shli_tl(t0, t0, 64 - (0x20 | sa));
15695             tcg_gen_or_tl(cpu_gpr[rt], t0, t0);
15696             break;
15697         case OPC_PREPENDW:
15698             if (sa != 0) {
15699                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
15700                 tcg_gen_shli_tl(t0, t0, 64 - sa);
15701                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
15702             }
15703             break;
15704         case OPC_DBALIGN:
15705             sa &= 7;
15706             if (sa != 0 && sa != 2 && sa != 4) {
15707                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
15708                 tcg_gen_shri_tl(t0, t0, 8 * (8 - sa));
15709                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
15710             }
15711             break;
15712         default:            /* Invalid */
15713             MIPS_INVAL("MASK DAPPEND");
15714             generate_exception(ctx, EXCP_RI);
15715             break;
15716         }
15717         break;
15718 #endif
15719     }
15720     tcg_temp_free(t0);
15721     (void)opn; /* avoid a compiler warning */
15722     MIPS_DEBUG("%s", opn);
15723 }
15724
15725 static void gen_mipsdsp_accinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
15726                                 int ret, int v1, int v2, int check_ret)
15727
15728 {
15729     const char *opn = "mipsdsp accumulator";
15730     TCGv t0;
15731     TCGv t1;
15732     TCGv v1_t;
15733     TCGv v2_t;
15734     int16_t imm;
15735
15736     if ((ret == 0) && (check_ret == 1)) {
15737         /* Treat as NOP. */
15738         MIPS_DEBUG("NOP");
15739         return;
15740     }
15741
15742     t0 = tcg_temp_new();
15743     t1 = tcg_temp_new();
15744     v1_t = tcg_temp_new();
15745     v2_t = tcg_temp_new();
15746
15747     gen_load_gpr(v1_t, v1);
15748     gen_load_gpr(v2_t, v2);
15749
15750     switch (op1) {
15751     case OPC_EXTR_W_DSP:
15752         check_dsp(ctx);
15753         switch (op2) {
15754         case OPC_EXTR_W:
15755             tcg_gen_movi_tl(t0, v2);
15756             tcg_gen_movi_tl(t1, v1);
15757             gen_helper_extr_w(cpu_gpr[ret], t0, t1, cpu_env);
15758             break;
15759         case OPC_EXTR_R_W:
15760             tcg_gen_movi_tl(t0, v2);
15761             tcg_gen_movi_tl(t1, v1);
15762             gen_helper_extr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
15763             break;
15764         case OPC_EXTR_RS_W:
15765             tcg_gen_movi_tl(t0, v2);
15766             tcg_gen_movi_tl(t1, v1);
15767             gen_helper_extr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
15768             break;
15769         case OPC_EXTR_S_H:
15770             tcg_gen_movi_tl(t0, v2);
15771             tcg_gen_movi_tl(t1, v1);
15772             gen_helper_extr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
15773             break;
15774         case OPC_EXTRV_S_H:
15775             tcg_gen_movi_tl(t0, v2);
15776             gen_helper_extr_s_h(cpu_gpr[ret], t0, v1_t, cpu_env);
15777             break;
15778         case OPC_EXTRV_W:
15779             tcg_gen_movi_tl(t0, v2);
15780             gen_helper_extr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
15781             break;
15782         case OPC_EXTRV_R_W:
15783             tcg_gen_movi_tl(t0, v2);
15784             gen_helper_extr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
15785             break;
15786         case OPC_EXTRV_RS_W:
15787             tcg_gen_movi_tl(t0, v2);
15788             gen_helper_extr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
15789             break;
15790         case OPC_EXTP:
15791             tcg_gen_movi_tl(t0, v2);
15792             tcg_gen_movi_tl(t1, v1);
15793             gen_helper_extp(cpu_gpr[ret], t0, t1, cpu_env);
15794             break;
15795         case OPC_EXTPV:
15796             tcg_gen_movi_tl(t0, v2);
15797             gen_helper_extp(cpu_gpr[ret], t0, v1_t, cpu_env);
15798             break;
15799         case OPC_EXTPDP:
15800             tcg_gen_movi_tl(t0, v2);
15801             tcg_gen_movi_tl(t1, v1);
15802             gen_helper_extpdp(cpu_gpr[ret], t0, t1, cpu_env);
15803             break;
15804         case OPC_EXTPDPV:
15805             tcg_gen_movi_tl(t0, v2);
15806             gen_helper_extpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
15807             break;
15808         case OPC_SHILO:
15809             imm = (ctx->opcode >> 20) & 0x3F;
15810             tcg_gen_movi_tl(t0, ret);
15811             tcg_gen_movi_tl(t1, imm);
15812             gen_helper_shilo(t0, t1, cpu_env);
15813             break;
15814         case OPC_SHILOV:
15815             tcg_gen_movi_tl(t0, ret);
15816             gen_helper_shilo(t0, v1_t, cpu_env);
15817             break;
15818         case OPC_MTHLIP:
15819             tcg_gen_movi_tl(t0, ret);
15820             gen_helper_mthlip(t0, v1_t, cpu_env);
15821             break;
15822         case OPC_WRDSP:
15823             imm = (ctx->opcode >> 11) & 0x3FF;
15824             tcg_gen_movi_tl(t0, imm);
15825             gen_helper_wrdsp(v1_t, t0, cpu_env);
15826             break;
15827         case OPC_RDDSP:
15828             imm = (ctx->opcode >> 16) & 0x03FF;
15829             tcg_gen_movi_tl(t0, imm);
15830             gen_helper_rddsp(cpu_gpr[ret], t0, cpu_env);
15831             break;
15832         }
15833         break;
15834 #ifdef TARGET_MIPS64
15835     case OPC_DEXTR_W_DSP:
15836         check_dsp(ctx);
15837         switch (op2) {
15838         case OPC_DMTHLIP:
15839             tcg_gen_movi_tl(t0, ret);
15840             gen_helper_dmthlip(v1_t, t0, cpu_env);
15841             break;
15842         case OPC_DSHILO:
15843             {
15844                 int shift = (ctx->opcode >> 19) & 0x7F;
15845                 int ac = (ctx->opcode >> 11) & 0x03;
15846                 tcg_gen_movi_tl(t0, shift);
15847                 tcg_gen_movi_tl(t1, ac);
15848                 gen_helper_dshilo(t0, t1, cpu_env);
15849                 break;
15850             }
15851         case OPC_DSHILOV:
15852             {
15853                 int ac = (ctx->opcode >> 11) & 0x03;
15854                 tcg_gen_movi_tl(t0, ac);
15855                 gen_helper_dshilo(v1_t, t0, cpu_env);
15856                 break;
15857             }
15858         case OPC_DEXTP:
15859             tcg_gen_movi_tl(t0, v2);
15860             tcg_gen_movi_tl(t1, v1);
15861
15862             gen_helper_dextp(cpu_gpr[ret], t0, t1, cpu_env);
15863             break;
15864         case OPC_DEXTPV:
15865             tcg_gen_movi_tl(t0, v2);
15866             gen_helper_dextp(cpu_gpr[ret], t0, v1_t, cpu_env);
15867             break;
15868         case OPC_DEXTPDP:
15869             tcg_gen_movi_tl(t0, v2);
15870             tcg_gen_movi_tl(t1, v1);
15871             gen_helper_dextpdp(cpu_gpr[ret], t0, t1, cpu_env);
15872             break;
15873         case OPC_DEXTPDPV:
15874             tcg_gen_movi_tl(t0, v2);
15875             gen_helper_dextpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
15876             break;
15877         case OPC_DEXTR_L:
15878             tcg_gen_movi_tl(t0, v2);
15879             tcg_gen_movi_tl(t1, v1);
15880             gen_helper_dextr_l(cpu_gpr[ret], t0, t1, cpu_env);
15881             break;
15882         case OPC_DEXTR_R_L:
15883             tcg_gen_movi_tl(t0, v2);
15884             tcg_gen_movi_tl(t1, v1);
15885             gen_helper_dextr_r_l(cpu_gpr[ret], t0, t1, cpu_env);
15886             break;
15887         case OPC_DEXTR_RS_L:
15888             tcg_gen_movi_tl(t0, v2);
15889             tcg_gen_movi_tl(t1, v1);
15890             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, t1, cpu_env);
15891             break;
15892         case OPC_DEXTR_W:
15893             tcg_gen_movi_tl(t0, v2);
15894             tcg_gen_movi_tl(t1, v1);
15895             gen_helper_dextr_w(cpu_gpr[ret], t0, t1, cpu_env);
15896             break;
15897         case OPC_DEXTR_R_W:
15898             tcg_gen_movi_tl(t0, v2);
15899             tcg_gen_movi_tl(t1, v1);
15900             gen_helper_dextr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
15901             break;
15902         case OPC_DEXTR_RS_W:
15903             tcg_gen_movi_tl(t0, v2);
15904             tcg_gen_movi_tl(t1, v1);
15905             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
15906             break;
15907         case OPC_DEXTR_S_H:
15908             tcg_gen_movi_tl(t0, v2);
15909             tcg_gen_movi_tl(t1, v1);
15910             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
15911             break;
15912         case OPC_DEXTRV_S_H:
15913             tcg_gen_movi_tl(t0, v2);
15914             tcg_gen_movi_tl(t1, v1);
15915             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
15916             break;
15917         case OPC_DEXTRV_L:
15918             tcg_gen_movi_tl(t0, v2);
15919             gen_helper_dextr_l(cpu_gpr[ret], t0, v1_t, cpu_env);
15920             break;
15921         case OPC_DEXTRV_R_L:
15922             tcg_gen_movi_tl(t0, v2);
15923             gen_helper_dextr_r_l(cpu_gpr[ret], t0, v1_t, cpu_env);
15924             break;
15925         case OPC_DEXTRV_RS_L:
15926             tcg_gen_movi_tl(t0, v2);
15927             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, v1_t, cpu_env);
15928             break;
15929         case OPC_DEXTRV_W:
15930             tcg_gen_movi_tl(t0, v2);
15931             gen_helper_dextr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
15932             break;
15933         case OPC_DEXTRV_R_W:
15934             tcg_gen_movi_tl(t0, v2);
15935             gen_helper_dextr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
15936             break;
15937         case OPC_DEXTRV_RS_W:
15938             tcg_gen_movi_tl(t0, v2);
15939             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
15940             break;
15941         }
15942         break;
15943 #endif
15944     }
15945
15946     tcg_temp_free(t0);
15947     tcg_temp_free(t1);
15948     tcg_temp_free(v1_t);
15949     tcg_temp_free(v2_t);
15950
15951     (void)opn; /* avoid a compiler warning */
15952     MIPS_DEBUG("%s", opn);
15953 }
15954
15955 /* End MIPSDSP functions. */
15956
15957 /* Compact Branches */
15958 static void gen_compute_compact_branch(DisasContext *ctx, uint32_t opc,
15959                                        int rs, int rt, int32_t offset)
15960 {
15961     int bcond_compute = 0;
15962     TCGv t0 = tcg_temp_new();
15963     TCGv t1 = tcg_temp_new();
15964
15965     if (ctx->hflags & MIPS_HFLAG_BMASK) {
15966 #ifdef MIPS_DEBUG_DISAS
15967         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
15968                   "\n", ctx->pc);
15969 #endif
15970         generate_exception(ctx, EXCP_RI);
15971         goto out;
15972     }
15973
15974     /* Load needed operands and calculate btarget */
15975     switch (opc) {
15976     /* compact branch */
15977     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
15978     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
15979         gen_load_gpr(t0, rs);
15980         gen_load_gpr(t1, rt);
15981         bcond_compute = 1;
15982         ctx->btarget = addr_add(ctx, ctx->pc + 4, offset);
15983         if (rs <= rt && rs == 0) {
15984             /* OPC_BEQZALC, OPC_BNEZALC */
15985             tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 4);
15986         }
15987         break;
15988     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
15989     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
15990         gen_load_gpr(t0, rs);
15991         gen_load_gpr(t1, rt);
15992         bcond_compute = 1;
15993         ctx->btarget = addr_add(ctx, ctx->pc + 4, offset);
15994         break;
15995     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
15996     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
15997         if (rs == 0 || rs == rt) {
15998             /* OPC_BLEZALC, OPC_BGEZALC */
15999             /* OPC_BGTZALC, OPC_BLTZALC */
16000             tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 4);
16001         }
16002         gen_load_gpr(t0, rs);
16003         gen_load_gpr(t1, rt);
16004         bcond_compute = 1;
16005         ctx->btarget = addr_add(ctx, ctx->pc + 4, offset);
16006         break;
16007     case OPC_BC:
16008     case OPC_BALC:
16009         ctx->btarget = addr_add(ctx, ctx->pc + 4, offset);
16010         break;
16011     case OPC_BEQZC:
16012     case OPC_BNEZC:
16013         if (rs != 0) {
16014             /* OPC_BEQZC, OPC_BNEZC */
16015             gen_load_gpr(t0, rs);
16016             bcond_compute = 1;
16017             ctx->btarget = addr_add(ctx, ctx->pc + 4, offset);
16018         } else {
16019             /* OPC_JIC, OPC_JIALC */
16020             TCGv tbase = tcg_temp_new();
16021             TCGv toffset = tcg_temp_new();
16022
16023             gen_load_gpr(tbase, rt);
16024             tcg_gen_movi_tl(toffset, offset);
16025             gen_op_addr_add(ctx, btarget, tbase, toffset);
16026             tcg_temp_free(tbase);
16027             tcg_temp_free(toffset);
16028         }
16029         break;
16030     default:
16031         MIPS_INVAL("Compact branch/jump");
16032         generate_exception(ctx, EXCP_RI);
16033         goto out;
16034     }
16035
16036     if (bcond_compute == 0) {
16037         /* Uncoditional compact branch */
16038         switch (opc) {
16039         case OPC_JIALC:
16040             tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 4);
16041             /* Fallthrough */
16042         case OPC_JIC:
16043             ctx->hflags |= MIPS_HFLAG_BR;
16044             break;
16045         case OPC_BALC:
16046             tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 4);
16047             /* Fallthrough */
16048         case OPC_BC:
16049             ctx->hflags |= MIPS_HFLAG_B;
16050             break;
16051         default:
16052             MIPS_INVAL("Compact branch/jump");
16053             generate_exception(ctx, EXCP_RI);
16054             goto out;
16055         }
16056
16057         /* Generating branch here as compact branches don't have delay slot */
16058         gen_branch(ctx, 4);
16059     } else {
16060         /* Conditional compact branch */
16061         TCGLabel *fs = gen_new_label();
16062         save_cpu_state(ctx, 0);
16063
16064         switch (opc) {
16065         case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
16066             if (rs == 0 && rt != 0) {
16067                 /* OPC_BLEZALC */
16068                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
16069             } else if (rs != 0 && rt != 0 && rs == rt) {
16070                 /* OPC_BGEZALC */
16071                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
16072             } else {
16073                 /* OPC_BGEUC */
16074                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GEU), t0, t1, fs);
16075             }
16076             break;
16077         case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
16078             if (rs == 0 && rt != 0) {
16079                 /* OPC_BGTZALC */
16080                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
16081             } else if (rs != 0 && rt != 0 && rs == rt) {
16082                 /* OPC_BLTZALC */
16083                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
16084             } else {
16085                 /* OPC_BLTUC */
16086                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LTU), t0, t1, fs);
16087             }
16088             break;
16089         case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
16090             if (rs == 0 && rt != 0) {
16091                 /* OPC_BLEZC */
16092                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
16093             } else if (rs != 0 && rt != 0 && rs == rt) {
16094                 /* OPC_BGEZC */
16095                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
16096             } else {
16097                 /* OPC_BGEC */
16098                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GE), t0, t1, fs);
16099             }
16100             break;
16101         case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
16102             if (rs == 0 && rt != 0) {
16103                 /* OPC_BGTZC */
16104                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
16105             } else if (rs != 0 && rt != 0 && rs == rt) {
16106                 /* OPC_BLTZC */
16107                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
16108             } else {
16109                 /* OPC_BLTC */
16110                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LT), t0, t1, fs);
16111             }
16112             break;
16113         case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
16114         case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
16115             if (rs >= rt) {
16116                 /* OPC_BOVC, OPC_BNVC */
16117                 TCGv t2 = tcg_temp_new();
16118                 TCGv t3 = tcg_temp_new();
16119                 TCGv t4 = tcg_temp_new();
16120                 TCGv input_overflow = tcg_temp_new();
16121
16122                 gen_load_gpr(t0, rs);
16123                 gen_load_gpr(t1, rt);
16124                 tcg_gen_ext32s_tl(t2, t0);
16125                 tcg_gen_setcond_tl(TCG_COND_NE, input_overflow, t2, t0);
16126                 tcg_gen_ext32s_tl(t3, t1);
16127                 tcg_gen_setcond_tl(TCG_COND_NE, t4, t3, t1);
16128                 tcg_gen_or_tl(input_overflow, input_overflow, t4);
16129
16130                 tcg_gen_add_tl(t4, t2, t3);
16131                 tcg_gen_ext32s_tl(t4, t4);
16132                 tcg_gen_xor_tl(t2, t2, t3);
16133                 tcg_gen_xor_tl(t3, t4, t3);
16134                 tcg_gen_andc_tl(t2, t3, t2);
16135                 tcg_gen_setcondi_tl(TCG_COND_LT, t4, t2, 0);
16136                 tcg_gen_or_tl(t4, t4, input_overflow);
16137                 if (opc == OPC_BOVC) {
16138                     /* OPC_BOVC */
16139                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t4, 0, fs);
16140                 } else {
16141                     /* OPC_BNVC */
16142                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t4, 0, fs);
16143                 }
16144                 tcg_temp_free(input_overflow);
16145                 tcg_temp_free(t4);
16146                 tcg_temp_free(t3);
16147                 tcg_temp_free(t2);
16148             } else if (rs < rt && rs == 0) {
16149                 /* OPC_BEQZALC, OPC_BNEZALC */
16150                 if (opc == OPC_BEQZALC) {
16151                     /* OPC_BEQZALC */
16152                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t1, 0, fs);
16153                 } else {
16154                     /* OPC_BNEZALC */
16155                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t1, 0, fs);
16156                 }
16157             } else {
16158                 /* OPC_BEQC, OPC_BNEC */
16159                 if (opc == OPC_BEQC) {
16160                     /* OPC_BEQC */
16161                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_EQ), t0, t1, fs);
16162                 } else {
16163                     /* OPC_BNEC */
16164                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_NE), t0, t1, fs);
16165                 }
16166             }
16167             break;
16168         case OPC_BEQZC:
16169             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t0, 0, fs);
16170             break;
16171         case OPC_BNEZC:
16172             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t0, 0, fs);
16173             break;
16174         default:
16175             MIPS_INVAL("Compact conditional branch/jump");
16176             generate_exception(ctx, EXCP_RI);
16177             goto out;
16178         }
16179
16180         /* Generating branch here as compact branches don't have delay slot */
16181         gen_goto_tb(ctx, 1, ctx->btarget);
16182         gen_set_label(fs);
16183
16184         ctx->hflags |= MIPS_HFLAG_FBNSLOT;
16185         MIPS_DEBUG("Compact conditional branch");
16186     }
16187
16188 out:
16189     tcg_temp_free(t0);
16190     tcg_temp_free(t1);
16191 }
16192
16193 static void decode_opc_special_r6(CPUMIPSState *env, DisasContext *ctx)
16194 {
16195     int rs, rt, rd, sa;
16196     uint32_t op1, op2;
16197
16198     rs = (ctx->opcode >> 21) & 0x1f;
16199     rt = (ctx->opcode >> 16) & 0x1f;
16200     rd = (ctx->opcode >> 11) & 0x1f;
16201     sa = (ctx->opcode >> 6) & 0x1f;
16202
16203     op1 = MASK_SPECIAL(ctx->opcode);
16204     switch (op1) {
16205     case OPC_LSA:
16206         if (rd != 0) {
16207             int imm2 = extract32(ctx->opcode, 6, 3);
16208             TCGv t0 = tcg_temp_new();
16209             TCGv t1 = tcg_temp_new();
16210             gen_load_gpr(t0, rs);
16211             gen_load_gpr(t1, rt);
16212             tcg_gen_shli_tl(t0, t0, imm2 + 1);
16213             tcg_gen_add_tl(t0, t0, t1);
16214             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
16215             tcg_temp_free(t1);
16216             tcg_temp_free(t0);
16217         }
16218         break;
16219     case OPC_MULT ... OPC_DIVU:
16220         op2 = MASK_R6_MULDIV(ctx->opcode);
16221         switch (op2) {
16222         case R6_OPC_MUL:
16223         case R6_OPC_MUH:
16224         case R6_OPC_MULU:
16225         case R6_OPC_MUHU:
16226         case R6_OPC_DIV:
16227         case R6_OPC_MOD:
16228         case R6_OPC_DIVU:
16229         case R6_OPC_MODU:
16230             gen_r6_muldiv(ctx, op2, rd, rs, rt);
16231             break;
16232         default:
16233             MIPS_INVAL("special_r6 muldiv");
16234             generate_exception(ctx, EXCP_RI);
16235             break;
16236         }
16237         break;
16238     case OPC_SELEQZ:
16239     case OPC_SELNEZ:
16240         gen_cond_move(ctx, op1, rd, rs, rt);
16241         break;
16242     case R6_OPC_CLO:
16243     case R6_OPC_CLZ:
16244         if (rt == 0 && sa == 1) {
16245             /* Major opcode and function field is shared with preR6 MFHI/MTHI.
16246                We need additionally to check other fields */
16247             gen_cl(ctx, op1, rd, rs);
16248         } else {
16249             generate_exception(ctx, EXCP_RI);
16250         }
16251         break;
16252     case R6_OPC_SDBBP:
16253         if (ctx->hflags & MIPS_HFLAG_SBRI) {
16254             generate_exception(ctx, EXCP_RI);
16255         } else {
16256             generate_exception(ctx, EXCP_DBp);
16257         }
16258         break;
16259 #if defined(TARGET_MIPS64)
16260     case OPC_DLSA:
16261         check_mips_64(ctx);
16262         if (rd != 0) {
16263             int imm2 = extract32(ctx->opcode, 6, 3);
16264             TCGv t0 = tcg_temp_new();
16265             TCGv t1 = tcg_temp_new();
16266             gen_load_gpr(t0, rs);
16267             gen_load_gpr(t1, rt);
16268             tcg_gen_shli_tl(t0, t0, imm2 + 1);
16269             tcg_gen_add_tl(cpu_gpr[rd], t0, t1);
16270             tcg_temp_free(t1);
16271             tcg_temp_free(t0);
16272         }
16273         break;
16274     case R6_OPC_DCLO:
16275     case R6_OPC_DCLZ:
16276         if (rt == 0 && sa == 1) {
16277             /* Major opcode and function field is shared with preR6 MFHI/MTHI.
16278                We need additionally to check other fields */
16279             check_mips_64(ctx);
16280             gen_cl(ctx, op1, rd, rs);
16281         } else {
16282             generate_exception(ctx, EXCP_RI);
16283         }
16284         break;
16285     case OPC_DMULT ... OPC_DDIVU:
16286         op2 = MASK_R6_MULDIV(ctx->opcode);
16287         switch (op2) {
16288         case R6_OPC_DMUL:
16289         case R6_OPC_DMUH:
16290         case R6_OPC_DMULU:
16291         case R6_OPC_DMUHU:
16292         case R6_OPC_DDIV:
16293         case R6_OPC_DMOD:
16294         case R6_OPC_DDIVU:
16295         case R6_OPC_DMODU:
16296             check_mips_64(ctx);
16297             gen_r6_muldiv(ctx, op2, rd, rs, rt);
16298             break;
16299         default:
16300             MIPS_INVAL("special_r6 muldiv");
16301             generate_exception(ctx, EXCP_RI);
16302             break;
16303         }
16304         break;
16305 #endif
16306     default:            /* Invalid */
16307         MIPS_INVAL("special_r6");
16308         generate_exception(ctx, EXCP_RI);
16309         break;
16310     }
16311 }
16312
16313 static void decode_opc_special_legacy(CPUMIPSState *env, DisasContext *ctx)
16314 {
16315     int rs, rt, rd, sa;
16316     uint32_t op1;
16317
16318     rs = (ctx->opcode >> 21) & 0x1f;
16319     rt = (ctx->opcode >> 16) & 0x1f;
16320     rd = (ctx->opcode >> 11) & 0x1f;
16321     sa = (ctx->opcode >> 6) & 0x1f;
16322
16323     op1 = MASK_SPECIAL(ctx->opcode);
16324     switch (op1) {
16325     case OPC_MOVN:         /* Conditional move */
16326     case OPC_MOVZ:
16327         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32 |
16328                    INSN_LOONGSON2E | INSN_LOONGSON2F);
16329         gen_cond_move(ctx, op1, rd, rs, rt);
16330         break;
16331     case OPC_MFHI:          /* Move from HI/LO */
16332     case OPC_MFLO:
16333         gen_HILO(ctx, op1, rs & 3, rd);
16334         break;
16335     case OPC_MTHI:
16336     case OPC_MTLO:          /* Move to HI/LO */
16337         gen_HILO(ctx, op1, rd & 3, rs);
16338         break;
16339     case OPC_MOVCI:
16340         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
16341         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
16342             check_cp1_enabled(ctx);
16343             gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7,
16344                       (ctx->opcode >> 16) & 1);
16345         } else {
16346             generate_exception_err(ctx, EXCP_CpU, 1);
16347         }
16348         break;
16349     case OPC_MULT:
16350     case OPC_MULTU:
16351         if (sa) {
16352             check_insn(ctx, INSN_VR54XX);
16353             op1 = MASK_MUL_VR54XX(ctx->opcode);
16354             gen_mul_vr54xx(ctx, op1, rd, rs, rt);
16355         } else {
16356             gen_muldiv(ctx, op1, rd & 3, rs, rt);
16357         }
16358         break;
16359     case OPC_DIV:
16360     case OPC_DIVU:
16361         gen_muldiv(ctx, op1, 0, rs, rt);
16362         break;
16363 #if defined(TARGET_MIPS64)
16364     case OPC_DMULT ... OPC_DDIVU:
16365         check_insn(ctx, ISA_MIPS3);
16366         check_mips_64(ctx);
16367         gen_muldiv(ctx, op1, 0, rs, rt);
16368         break;
16369 #endif
16370     case OPC_JR:
16371         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
16372         break;
16373     case OPC_SPIM:
16374 #ifdef MIPS_STRICT_STANDARD
16375         MIPS_INVAL("SPIM");
16376         generate_exception(ctx, EXCP_RI);
16377 #else
16378         /* Implemented as RI exception for now. */
16379         MIPS_INVAL("spim (unofficial)");
16380         generate_exception(ctx, EXCP_RI);
16381 #endif
16382         break;
16383     default:            /* Invalid */
16384         MIPS_INVAL("special_legacy");
16385         generate_exception(ctx, EXCP_RI);
16386         break;
16387     }
16388 }
16389
16390 static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx)
16391 {
16392     int rs, rt, rd, sa;
16393     uint32_t op1;
16394
16395     rs = (ctx->opcode >> 21) & 0x1f;
16396     rt = (ctx->opcode >> 16) & 0x1f;
16397     rd = (ctx->opcode >> 11) & 0x1f;
16398     sa = (ctx->opcode >> 6) & 0x1f;
16399
16400     op1 = MASK_SPECIAL(ctx->opcode);
16401     switch (op1) {
16402     case OPC_SLL:          /* Shift with immediate */
16403         if (sa == 5 && rd == 0 &&
16404             rs == 0 && rt == 0) { /* PAUSE */
16405             if ((ctx->insn_flags & ISA_MIPS32R6) &&
16406                 (ctx->hflags & MIPS_HFLAG_BMASK)) {
16407                 MIPS_DEBUG("CTI in delay / forbidden slot");
16408                 generate_exception(ctx, EXCP_RI);
16409                 break;
16410             }
16411         }
16412         /* Fallthrough */
16413     case OPC_SRA:
16414         gen_shift_imm(ctx, op1, rd, rt, sa);
16415         break;
16416     case OPC_SRL:
16417         switch ((ctx->opcode >> 21) & 0x1f) {
16418         case 1:
16419             /* rotr is decoded as srl on non-R2 CPUs */
16420             if (ctx->insn_flags & ISA_MIPS32R2) {
16421                 op1 = OPC_ROTR;
16422             }
16423             /* Fallthrough */
16424         case 0:
16425             gen_shift_imm(ctx, op1, rd, rt, sa);
16426             break;
16427         default:
16428             generate_exception(ctx, EXCP_RI);
16429             break;
16430         }
16431         break;
16432     case OPC_ADD ... OPC_SUBU:
16433         gen_arith(ctx, op1, rd, rs, rt);
16434         break;
16435     case OPC_SLLV:         /* Shifts */
16436     case OPC_SRAV:
16437         gen_shift(ctx, op1, rd, rs, rt);
16438         break;
16439     case OPC_SRLV:
16440         switch ((ctx->opcode >> 6) & 0x1f) {
16441         case 1:
16442             /* rotrv is decoded as srlv on non-R2 CPUs */
16443             if (ctx->insn_flags & ISA_MIPS32R2) {
16444                 op1 = OPC_ROTRV;
16445             }
16446             /* Fallthrough */
16447         case 0:
16448             gen_shift(ctx, op1, rd, rs, rt);
16449             break;
16450         default:
16451             generate_exception(ctx, EXCP_RI);
16452             break;
16453         }
16454         break;
16455     case OPC_SLT:          /* Set on less than */
16456     case OPC_SLTU:
16457         gen_slt(ctx, op1, rd, rs, rt);
16458         break;
16459     case OPC_AND:          /* Logic*/
16460     case OPC_OR:
16461     case OPC_NOR:
16462     case OPC_XOR:
16463         gen_logic(ctx, op1, rd, rs, rt);
16464         break;
16465     case OPC_JALR:
16466         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
16467         break;
16468     case OPC_TGE ... OPC_TEQ: /* Traps */
16469     case OPC_TNE:
16470         check_insn(ctx, ISA_MIPS2);
16471         gen_trap(ctx, op1, rs, rt, -1);
16472         break;
16473     case OPC_LSA: /* OPC_PMON */
16474         if ((ctx->insn_flags & ISA_MIPS32R6) ||
16475             (env->CP0_Config3 & (1 << CP0C3_MSAP))) {
16476             decode_opc_special_r6(env, ctx);
16477         } else {
16478             /* Pmon entry point, also R4010 selsl */
16479 #ifdef MIPS_STRICT_STANDARD
16480             MIPS_INVAL("PMON / selsl");
16481             generate_exception(ctx, EXCP_RI);
16482 #else
16483             gen_helper_0e0i(pmon, sa);
16484 #endif
16485         }
16486         break;
16487     case OPC_SYSCALL:
16488         generate_exception(ctx, EXCP_SYSCALL);
16489         ctx->bstate = BS_STOP;
16490         break;
16491     case OPC_BREAK:
16492         generate_exception(ctx, EXCP_BREAK);
16493         break;
16494     case OPC_SYNC:
16495         check_insn(ctx, ISA_MIPS2);
16496         /* Treat as NOP. */
16497         break;
16498
16499 #if defined(TARGET_MIPS64)
16500         /* MIPS64 specific opcodes */
16501     case OPC_DSLL:
16502     case OPC_DSRA:
16503     case OPC_DSLL32:
16504     case OPC_DSRA32:
16505         check_insn(ctx, ISA_MIPS3);
16506         check_mips_64(ctx);
16507         gen_shift_imm(ctx, op1, rd, rt, sa);
16508         break;
16509     case OPC_DSRL:
16510         switch ((ctx->opcode >> 21) & 0x1f) {
16511         case 1:
16512             /* drotr is decoded as dsrl on non-R2 CPUs */
16513             if (ctx->insn_flags & ISA_MIPS32R2) {
16514                 op1 = OPC_DROTR;
16515             }
16516             /* Fallthrough */
16517         case 0:
16518             check_insn(ctx, ISA_MIPS3);
16519             check_mips_64(ctx);
16520             gen_shift_imm(ctx, op1, rd, rt, sa);
16521             break;
16522         default:
16523             generate_exception(ctx, EXCP_RI);
16524             break;
16525         }
16526         break;
16527     case OPC_DSRL32:
16528         switch ((ctx->opcode >> 21) & 0x1f) {
16529         case 1:
16530             /* drotr32 is decoded as dsrl32 on non-R2 CPUs */
16531             if (ctx->insn_flags & ISA_MIPS32R2) {
16532                 op1 = OPC_DROTR32;
16533             }
16534             /* Fallthrough */
16535         case 0:
16536             check_insn(ctx, ISA_MIPS3);
16537             check_mips_64(ctx);
16538             gen_shift_imm(ctx, op1, rd, rt, sa);
16539             break;
16540         default:
16541             generate_exception(ctx, EXCP_RI);
16542             break;
16543         }
16544         break;
16545     case OPC_DADD ... OPC_DSUBU:
16546         check_insn(ctx, ISA_MIPS3);
16547         check_mips_64(ctx);
16548         gen_arith(ctx, op1, rd, rs, rt);
16549         break;
16550     case OPC_DSLLV:
16551     case OPC_DSRAV:
16552         check_insn(ctx, ISA_MIPS3);
16553         check_mips_64(ctx);
16554         gen_shift(ctx, op1, rd, rs, rt);
16555         break;
16556     case OPC_DSRLV:
16557         switch ((ctx->opcode >> 6) & 0x1f) {
16558         case 1:
16559             /* drotrv is decoded as dsrlv on non-R2 CPUs */
16560             if (ctx->insn_flags & ISA_MIPS32R2) {
16561                 op1 = OPC_DROTRV;
16562             }
16563             /* Fallthrough */
16564         case 0:
16565             check_insn(ctx, ISA_MIPS3);
16566             check_mips_64(ctx);
16567             gen_shift(ctx, op1, rd, rs, rt);
16568             break;
16569         default:
16570             generate_exception(ctx, EXCP_RI);
16571             break;
16572         }
16573         break;
16574     case OPC_DLSA:
16575         if ((ctx->insn_flags & ISA_MIPS32R6) ||
16576             (env->CP0_Config3 & (1 << CP0C3_MSAP))) {
16577             decode_opc_special_r6(env, ctx);
16578         }
16579         break;
16580 #endif
16581     default:
16582         if (ctx->insn_flags & ISA_MIPS32R6) {
16583             decode_opc_special_r6(env, ctx);
16584         } else {
16585             decode_opc_special_legacy(env, ctx);
16586         }
16587     }
16588 }
16589
16590 static void decode_opc_special2_legacy(CPUMIPSState *env, DisasContext *ctx)
16591 {
16592     int rs, rt, rd;
16593     uint32_t op1;
16594
16595     check_insn_opc_removed(ctx, ISA_MIPS32R6);
16596
16597     rs = (ctx->opcode >> 21) & 0x1f;
16598     rt = (ctx->opcode >> 16) & 0x1f;
16599     rd = (ctx->opcode >> 11) & 0x1f;
16600
16601     op1 = MASK_SPECIAL2(ctx->opcode);
16602     switch (op1) {
16603     case OPC_MADD ... OPC_MADDU: /* Multiply and add/sub */
16604     case OPC_MSUB ... OPC_MSUBU:
16605         check_insn(ctx, ISA_MIPS32);
16606         gen_muldiv(ctx, op1, rd & 3, rs, rt);
16607         break;
16608     case OPC_MUL:
16609         gen_arith(ctx, op1, rd, rs, rt);
16610         break;
16611     case OPC_DIV_G_2F:
16612     case OPC_DIVU_G_2F:
16613     case OPC_MULT_G_2F:
16614     case OPC_MULTU_G_2F:
16615     case OPC_MOD_G_2F:
16616     case OPC_MODU_G_2F:
16617         check_insn(ctx, INSN_LOONGSON2F);
16618         gen_loongson_integer(ctx, op1, rd, rs, rt);
16619         break;
16620     case OPC_CLO:
16621     case OPC_CLZ:
16622         check_insn(ctx, ISA_MIPS32);
16623         gen_cl(ctx, op1, rd, rs);
16624         break;
16625     case OPC_SDBBP:
16626         /* XXX: not clear which exception should be raised
16627          *      when in debug mode...
16628          */
16629         check_insn(ctx, ISA_MIPS32);
16630         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
16631             generate_exception(ctx, EXCP_DBp);
16632         } else {
16633             generate_exception(ctx, EXCP_DBp);
16634         }
16635         /* Treat as NOP. */
16636         break;
16637 #if defined(TARGET_MIPS64)
16638     case OPC_DCLO:
16639     case OPC_DCLZ:
16640         check_insn(ctx, ISA_MIPS64);
16641         check_mips_64(ctx);
16642         gen_cl(ctx, op1, rd, rs);
16643         break;
16644     case OPC_DMULT_G_2F:
16645     case OPC_DMULTU_G_2F:
16646     case OPC_DDIV_G_2F:
16647     case OPC_DDIVU_G_2F:
16648     case OPC_DMOD_G_2F:
16649     case OPC_DMODU_G_2F:
16650         check_insn(ctx, INSN_LOONGSON2F);
16651         gen_loongson_integer(ctx, op1, rd, rs, rt);
16652         break;
16653 #endif
16654     default:            /* Invalid */
16655         MIPS_INVAL("special2_legacy");
16656         generate_exception(ctx, EXCP_RI);
16657         break;
16658     }
16659 }
16660
16661 static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx)
16662 {
16663     int rs, rt, rd, sa;
16664     uint32_t op1, op2;
16665     int16_t imm;
16666
16667     rs = (ctx->opcode >> 21) & 0x1f;
16668     rt = (ctx->opcode >> 16) & 0x1f;
16669     rd = (ctx->opcode >> 11) & 0x1f;
16670     sa = (ctx->opcode >> 6) & 0x1f;
16671     imm = (int16_t)ctx->opcode >> 7;
16672
16673     op1 = MASK_SPECIAL3(ctx->opcode);
16674     switch (op1) {
16675     case R6_OPC_PREF:
16676         if (rt >= 24) {
16677             /* hint codes 24-31 are reserved and signal RI */
16678             generate_exception(ctx, EXCP_RI);
16679         }
16680         /* Treat as NOP. */
16681         break;
16682     case R6_OPC_CACHE:
16683         /* Treat as NOP. */
16684         break;
16685     case R6_OPC_SC:
16686         gen_st_cond(ctx, op1, rt, rs, imm);
16687         break;
16688     case R6_OPC_LL:
16689         gen_ld(ctx, op1, rt, rs, imm);
16690         break;
16691     case OPC_BSHFL:
16692         {
16693             if (rd == 0) {
16694                 /* Treat as NOP. */
16695                 break;
16696             }
16697             TCGv t0 = tcg_temp_new();
16698             gen_load_gpr(t0, rt);
16699
16700             op2 = MASK_BSHFL(ctx->opcode);
16701             switch (op2) {
16702             case OPC_ALIGN ... OPC_ALIGN_END:
16703                 sa &= 3;
16704                 if (sa == 0) {
16705                     tcg_gen_mov_tl(cpu_gpr[rd], t0);
16706                 } else {
16707                     TCGv t1 = tcg_temp_new();
16708                     TCGv_i64 t2 = tcg_temp_new_i64();
16709                     gen_load_gpr(t1, rs);
16710                     tcg_gen_concat_tl_i64(t2, t1, t0);
16711                     tcg_gen_shri_i64(t2, t2, 8 * (4 - sa));
16712 #if defined(TARGET_MIPS64)
16713                     tcg_gen_ext32s_i64(cpu_gpr[rd], t2);
16714 #else
16715                     tcg_gen_trunc_i64_i32(cpu_gpr[rd], t2);
16716 #endif
16717                     tcg_temp_free_i64(t2);
16718                     tcg_temp_free(t1);
16719                 }
16720                 break;
16721             case OPC_BITSWAP:
16722                 gen_helper_bitswap(cpu_gpr[rd], t0);
16723                 break;
16724             }
16725             tcg_temp_free(t0);
16726         }
16727         break;
16728 #if defined(TARGET_MIPS64)
16729     case R6_OPC_SCD:
16730         gen_st_cond(ctx, op1, rt, rs, imm);
16731         break;
16732     case R6_OPC_LLD:
16733         gen_ld(ctx, op1, rt, rs, imm);
16734         break;
16735     case OPC_DBSHFL:
16736         check_mips_64(ctx);
16737         {
16738             if (rd == 0) {
16739                 /* Treat as NOP. */
16740                 break;
16741             }
16742             TCGv t0 = tcg_temp_new();
16743             gen_load_gpr(t0, rt);
16744
16745             op2 = MASK_DBSHFL(ctx->opcode);
16746             switch (op2) {
16747             case OPC_DALIGN ... OPC_DALIGN_END:
16748                 sa &= 7;
16749                 if (sa == 0) {
16750                     tcg_gen_mov_tl(cpu_gpr[rd], t0);
16751                 } else {
16752                     TCGv t1 = tcg_temp_new();
16753                     gen_load_gpr(t1, rs);
16754                     tcg_gen_shli_tl(t0, t0, 8 * sa);
16755                     tcg_gen_shri_tl(t1, t1, 8 * (8 - sa));
16756                     tcg_gen_or_tl(cpu_gpr[rd], t1, t0);
16757                     tcg_temp_free(t1);
16758                 }
16759                 break;
16760             case OPC_DBITSWAP:
16761                 gen_helper_dbitswap(cpu_gpr[rd], t0);
16762                 break;
16763             }
16764             tcg_temp_free(t0);
16765         }
16766         break;
16767 #endif
16768     default:            /* Invalid */
16769         MIPS_INVAL("special3_r6");
16770         generate_exception(ctx, EXCP_RI);
16771         break;
16772     }
16773 }
16774
16775 static void decode_opc_special3_legacy(CPUMIPSState *env, DisasContext *ctx)
16776 {
16777     int rs, rt, rd;
16778     uint32_t op1, op2;
16779
16780     rs = (ctx->opcode >> 21) & 0x1f;
16781     rt = (ctx->opcode >> 16) & 0x1f;
16782     rd = (ctx->opcode >> 11) & 0x1f;
16783
16784     op1 = MASK_SPECIAL3(ctx->opcode);
16785     switch (op1) {
16786     case OPC_DIV_G_2E ... OPC_DIVU_G_2E:
16787     case OPC_MOD_G_2E ... OPC_MODU_G_2E:
16788     case OPC_MULT_G_2E ... OPC_MULTU_G_2E:
16789         /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
16790          * the same mask and op1. */
16791         if ((ctx->insn_flags & ASE_DSPR2) && (op1 == OPC_MULT_G_2E)) {
16792             op2 = MASK_ADDUH_QB(ctx->opcode);
16793             switch (op2) {
16794             case OPC_ADDUH_QB:
16795             case OPC_ADDUH_R_QB:
16796             case OPC_ADDQH_PH:
16797             case OPC_ADDQH_R_PH:
16798             case OPC_ADDQH_W:
16799             case OPC_ADDQH_R_W:
16800             case OPC_SUBUH_QB:
16801             case OPC_SUBUH_R_QB:
16802             case OPC_SUBQH_PH:
16803             case OPC_SUBQH_R_PH:
16804             case OPC_SUBQH_W:
16805             case OPC_SUBQH_R_W:
16806                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
16807                 break;
16808             case OPC_MUL_PH:
16809             case OPC_MUL_S_PH:
16810             case OPC_MULQ_S_W:
16811             case OPC_MULQ_RS_W:
16812                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
16813                 break;
16814             default:
16815                 MIPS_INVAL("MASK ADDUH.QB");
16816                 generate_exception(ctx, EXCP_RI);
16817                 break;
16818             }
16819         } else if (ctx->insn_flags & INSN_LOONGSON2E) {
16820             gen_loongson_integer(ctx, op1, rd, rs, rt);
16821         } else {
16822             generate_exception(ctx, EXCP_RI);
16823         }
16824         break;
16825     case OPC_LX_DSP:
16826         op2 = MASK_LX(ctx->opcode);
16827         switch (op2) {
16828 #if defined(TARGET_MIPS64)
16829         case OPC_LDX:
16830 #endif
16831         case OPC_LBUX:
16832         case OPC_LHX:
16833         case OPC_LWX:
16834             gen_mipsdsp_ld(ctx, op2, rd, rs, rt);
16835             break;
16836         default:            /* Invalid */
16837             MIPS_INVAL("MASK LX");
16838             generate_exception(ctx, EXCP_RI);
16839             break;
16840         }
16841         break;
16842     case OPC_ABSQ_S_PH_DSP:
16843         op2 = MASK_ABSQ_S_PH(ctx->opcode);
16844         switch (op2) {
16845         case OPC_ABSQ_S_QB:
16846         case OPC_ABSQ_S_PH:
16847         case OPC_ABSQ_S_W:
16848         case OPC_PRECEQ_W_PHL:
16849         case OPC_PRECEQ_W_PHR:
16850         case OPC_PRECEQU_PH_QBL:
16851         case OPC_PRECEQU_PH_QBR:
16852         case OPC_PRECEQU_PH_QBLA:
16853         case OPC_PRECEQU_PH_QBRA:
16854         case OPC_PRECEU_PH_QBL:
16855         case OPC_PRECEU_PH_QBR:
16856         case OPC_PRECEU_PH_QBLA:
16857         case OPC_PRECEU_PH_QBRA:
16858             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
16859             break;
16860         case OPC_BITREV:
16861         case OPC_REPL_QB:
16862         case OPC_REPLV_QB:
16863         case OPC_REPL_PH:
16864         case OPC_REPLV_PH:
16865             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
16866             break;
16867         default:
16868             MIPS_INVAL("MASK ABSQ_S.PH");
16869             generate_exception(ctx, EXCP_RI);
16870             break;
16871         }
16872         break;
16873     case OPC_ADDU_QB_DSP:
16874         op2 = MASK_ADDU_QB(ctx->opcode);
16875         switch (op2) {
16876         case OPC_ADDQ_PH:
16877         case OPC_ADDQ_S_PH:
16878         case OPC_ADDQ_S_W:
16879         case OPC_ADDU_QB:
16880         case OPC_ADDU_S_QB:
16881         case OPC_ADDU_PH:
16882         case OPC_ADDU_S_PH:
16883         case OPC_SUBQ_PH:
16884         case OPC_SUBQ_S_PH:
16885         case OPC_SUBQ_S_W:
16886         case OPC_SUBU_QB:
16887         case OPC_SUBU_S_QB:
16888         case OPC_SUBU_PH:
16889         case OPC_SUBU_S_PH:
16890         case OPC_ADDSC:
16891         case OPC_ADDWC:
16892         case OPC_MODSUB:
16893         case OPC_RADDU_W_QB:
16894             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
16895             break;
16896         case OPC_MULEU_S_PH_QBL:
16897         case OPC_MULEU_S_PH_QBR:
16898         case OPC_MULQ_RS_PH:
16899         case OPC_MULEQ_S_W_PHL:
16900         case OPC_MULEQ_S_W_PHR:
16901         case OPC_MULQ_S_PH:
16902             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
16903             break;
16904         default:            /* Invalid */
16905             MIPS_INVAL("MASK ADDU.QB");
16906             generate_exception(ctx, EXCP_RI);
16907             break;
16908
16909         }
16910         break;
16911     case OPC_CMPU_EQ_QB_DSP:
16912         op2 = MASK_CMPU_EQ_QB(ctx->opcode);
16913         switch (op2) {
16914         case OPC_PRECR_SRA_PH_W:
16915         case OPC_PRECR_SRA_R_PH_W:
16916             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
16917             break;
16918         case OPC_PRECR_QB_PH:
16919         case OPC_PRECRQ_QB_PH:
16920         case OPC_PRECRQ_PH_W:
16921         case OPC_PRECRQ_RS_PH_W:
16922         case OPC_PRECRQU_S_QB_PH:
16923             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
16924             break;
16925         case OPC_CMPU_EQ_QB:
16926         case OPC_CMPU_LT_QB:
16927         case OPC_CMPU_LE_QB:
16928         case OPC_CMP_EQ_PH:
16929         case OPC_CMP_LT_PH:
16930         case OPC_CMP_LE_PH:
16931             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
16932             break;
16933         case OPC_CMPGU_EQ_QB:
16934         case OPC_CMPGU_LT_QB:
16935         case OPC_CMPGU_LE_QB:
16936         case OPC_CMPGDU_EQ_QB:
16937         case OPC_CMPGDU_LT_QB:
16938         case OPC_CMPGDU_LE_QB:
16939         case OPC_PICK_QB:
16940         case OPC_PICK_PH:
16941         case OPC_PACKRL_PH:
16942             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
16943             break;
16944         default:            /* Invalid */
16945             MIPS_INVAL("MASK CMPU.EQ.QB");
16946             generate_exception(ctx, EXCP_RI);
16947             break;
16948         }
16949         break;
16950     case OPC_SHLL_QB_DSP:
16951         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
16952         break;
16953     case OPC_DPA_W_PH_DSP:
16954         op2 = MASK_DPA_W_PH(ctx->opcode);
16955         switch (op2) {
16956         case OPC_DPAU_H_QBL:
16957         case OPC_DPAU_H_QBR:
16958         case OPC_DPSU_H_QBL:
16959         case OPC_DPSU_H_QBR:
16960         case OPC_DPA_W_PH:
16961         case OPC_DPAX_W_PH:
16962         case OPC_DPAQ_S_W_PH:
16963         case OPC_DPAQX_S_W_PH:
16964         case OPC_DPAQX_SA_W_PH:
16965         case OPC_DPS_W_PH:
16966         case OPC_DPSX_W_PH:
16967         case OPC_DPSQ_S_W_PH:
16968         case OPC_DPSQX_S_W_PH:
16969         case OPC_DPSQX_SA_W_PH:
16970         case OPC_MULSAQ_S_W_PH:
16971         case OPC_DPAQ_SA_L_W:
16972         case OPC_DPSQ_SA_L_W:
16973         case OPC_MAQ_S_W_PHL:
16974         case OPC_MAQ_S_W_PHR:
16975         case OPC_MAQ_SA_W_PHL:
16976         case OPC_MAQ_SA_W_PHR:
16977         case OPC_MULSA_W_PH:
16978             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
16979             break;
16980         default:            /* Invalid */
16981             MIPS_INVAL("MASK DPAW.PH");
16982             generate_exception(ctx, EXCP_RI);
16983             break;
16984         }
16985         break;
16986     case OPC_INSV_DSP:
16987         op2 = MASK_INSV(ctx->opcode);
16988         switch (op2) {
16989         case OPC_INSV:
16990             check_dsp(ctx);
16991             {
16992                 TCGv t0, t1;
16993
16994                 if (rt == 0) {
16995                     MIPS_DEBUG("NOP");
16996                     break;
16997                 }
16998
16999                 t0 = tcg_temp_new();
17000                 t1 = tcg_temp_new();
17001
17002                 gen_load_gpr(t0, rt);
17003                 gen_load_gpr(t1, rs);
17004
17005                 gen_helper_insv(cpu_gpr[rt], cpu_env, t1, t0);
17006
17007                 tcg_temp_free(t0);
17008                 tcg_temp_free(t1);
17009                 break;
17010             }
17011         default:            /* Invalid */
17012             MIPS_INVAL("MASK INSV");
17013             generate_exception(ctx, EXCP_RI);
17014             break;
17015         }
17016         break;
17017     case OPC_APPEND_DSP:
17018         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
17019         break;
17020     case OPC_EXTR_W_DSP:
17021         op2 = MASK_EXTR_W(ctx->opcode);
17022         switch (op2) {
17023         case OPC_EXTR_W:
17024         case OPC_EXTR_R_W:
17025         case OPC_EXTR_RS_W:
17026         case OPC_EXTR_S_H:
17027         case OPC_EXTRV_S_H:
17028         case OPC_EXTRV_W:
17029         case OPC_EXTRV_R_W:
17030         case OPC_EXTRV_RS_W:
17031         case OPC_EXTP:
17032         case OPC_EXTPV:
17033         case OPC_EXTPDP:
17034         case OPC_EXTPDPV:
17035             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
17036             break;
17037         case OPC_RDDSP:
17038             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 1);
17039             break;
17040         case OPC_SHILO:
17041         case OPC_SHILOV:
17042         case OPC_MTHLIP:
17043         case OPC_WRDSP:
17044             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
17045             break;
17046         default:            /* Invalid */
17047             MIPS_INVAL("MASK EXTR.W");
17048             generate_exception(ctx, EXCP_RI);
17049             break;
17050         }
17051         break;
17052 #if defined(TARGET_MIPS64)
17053     case OPC_DDIV_G_2E ... OPC_DDIVU_G_2E:
17054     case OPC_DMULT_G_2E ... OPC_DMULTU_G_2E:
17055     case OPC_DMOD_G_2E ... OPC_DMODU_G_2E:
17056         check_insn(ctx, INSN_LOONGSON2E);
17057         gen_loongson_integer(ctx, op1, rd, rs, rt);
17058         break;
17059     case OPC_ABSQ_S_QH_DSP:
17060         op2 = MASK_ABSQ_S_QH(ctx->opcode);
17061         switch (op2) {
17062         case OPC_PRECEQ_L_PWL:
17063         case OPC_PRECEQ_L_PWR:
17064         case OPC_PRECEQ_PW_QHL:
17065         case OPC_PRECEQ_PW_QHR:
17066         case OPC_PRECEQ_PW_QHLA:
17067         case OPC_PRECEQ_PW_QHRA:
17068         case OPC_PRECEQU_QH_OBL:
17069         case OPC_PRECEQU_QH_OBR:
17070         case OPC_PRECEQU_QH_OBLA:
17071         case OPC_PRECEQU_QH_OBRA:
17072         case OPC_PRECEU_QH_OBL:
17073         case OPC_PRECEU_QH_OBR:
17074         case OPC_PRECEU_QH_OBLA:
17075         case OPC_PRECEU_QH_OBRA:
17076         case OPC_ABSQ_S_OB:
17077         case OPC_ABSQ_S_PW:
17078         case OPC_ABSQ_S_QH:
17079             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
17080             break;
17081         case OPC_REPL_OB:
17082         case OPC_REPL_PW:
17083         case OPC_REPL_QH:
17084         case OPC_REPLV_OB:
17085         case OPC_REPLV_PW:
17086         case OPC_REPLV_QH:
17087             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
17088             break;
17089         default:            /* Invalid */
17090             MIPS_INVAL("MASK ABSQ_S.QH");
17091             generate_exception(ctx, EXCP_RI);
17092             break;
17093         }
17094         break;
17095     case OPC_ADDU_OB_DSP:
17096         op2 = MASK_ADDU_OB(ctx->opcode);
17097         switch (op2) {
17098         case OPC_RADDU_L_OB:
17099         case OPC_SUBQ_PW:
17100         case OPC_SUBQ_S_PW:
17101         case OPC_SUBQ_QH:
17102         case OPC_SUBQ_S_QH:
17103         case OPC_SUBU_OB:
17104         case OPC_SUBU_S_OB:
17105         case OPC_SUBU_QH:
17106         case OPC_SUBU_S_QH:
17107         case OPC_SUBUH_OB:
17108         case OPC_SUBUH_R_OB:
17109         case OPC_ADDQ_PW:
17110         case OPC_ADDQ_S_PW:
17111         case OPC_ADDQ_QH:
17112         case OPC_ADDQ_S_QH:
17113         case OPC_ADDU_OB:
17114         case OPC_ADDU_S_OB:
17115         case OPC_ADDU_QH:
17116         case OPC_ADDU_S_QH:
17117         case OPC_ADDUH_OB:
17118         case OPC_ADDUH_R_OB:
17119             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
17120             break;
17121         case OPC_MULEQ_S_PW_QHL:
17122         case OPC_MULEQ_S_PW_QHR:
17123         case OPC_MULEU_S_QH_OBL:
17124         case OPC_MULEU_S_QH_OBR:
17125         case OPC_MULQ_RS_QH:
17126             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
17127             break;
17128         default:            /* Invalid */
17129             MIPS_INVAL("MASK ADDU.OB");
17130             generate_exception(ctx, EXCP_RI);
17131             break;
17132         }
17133         break;
17134     case OPC_CMPU_EQ_OB_DSP:
17135         op2 = MASK_CMPU_EQ_OB(ctx->opcode);
17136         switch (op2) {
17137         case OPC_PRECR_SRA_QH_PW:
17138         case OPC_PRECR_SRA_R_QH_PW:
17139             /* Return value is rt. */
17140             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
17141             break;
17142         case OPC_PRECR_OB_QH:
17143         case OPC_PRECRQ_OB_QH:
17144         case OPC_PRECRQ_PW_L:
17145         case OPC_PRECRQ_QH_PW:
17146         case OPC_PRECRQ_RS_QH_PW:
17147         case OPC_PRECRQU_S_OB_QH:
17148             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
17149             break;
17150         case OPC_CMPU_EQ_OB:
17151         case OPC_CMPU_LT_OB:
17152         case OPC_CMPU_LE_OB:
17153         case OPC_CMP_EQ_QH:
17154         case OPC_CMP_LT_QH:
17155         case OPC_CMP_LE_QH:
17156         case OPC_CMP_EQ_PW:
17157         case OPC_CMP_LT_PW:
17158         case OPC_CMP_LE_PW:
17159             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
17160             break;
17161         case OPC_CMPGDU_EQ_OB:
17162         case OPC_CMPGDU_LT_OB:
17163         case OPC_CMPGDU_LE_OB:
17164         case OPC_CMPGU_EQ_OB:
17165         case OPC_CMPGU_LT_OB:
17166         case OPC_CMPGU_LE_OB:
17167         case OPC_PACKRL_PW:
17168         case OPC_PICK_OB:
17169         case OPC_PICK_PW:
17170         case OPC_PICK_QH:
17171             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
17172             break;
17173         default:            /* Invalid */
17174             MIPS_INVAL("MASK CMPU_EQ.OB");
17175             generate_exception(ctx, EXCP_RI);
17176             break;
17177         }
17178         break;
17179     case OPC_DAPPEND_DSP:
17180         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
17181         break;
17182     case OPC_DEXTR_W_DSP:
17183         op2 = MASK_DEXTR_W(ctx->opcode);
17184         switch (op2) {
17185         case OPC_DEXTP:
17186         case OPC_DEXTPDP:
17187         case OPC_DEXTPDPV:
17188         case OPC_DEXTPV:
17189         case OPC_DEXTR_L:
17190         case OPC_DEXTR_R_L:
17191         case OPC_DEXTR_RS_L:
17192         case OPC_DEXTR_W:
17193         case OPC_DEXTR_R_W:
17194         case OPC_DEXTR_RS_W:
17195         case OPC_DEXTR_S_H:
17196         case OPC_DEXTRV_L:
17197         case OPC_DEXTRV_R_L:
17198         case OPC_DEXTRV_RS_L:
17199         case OPC_DEXTRV_S_H:
17200         case OPC_DEXTRV_W:
17201         case OPC_DEXTRV_R_W:
17202         case OPC_DEXTRV_RS_W:
17203             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
17204             break;
17205         case OPC_DMTHLIP:
17206         case OPC_DSHILO:
17207         case OPC_DSHILOV:
17208             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
17209             break;
17210         default:            /* Invalid */
17211             MIPS_INVAL("MASK EXTR.W");
17212             generate_exception(ctx, EXCP_RI);
17213             break;
17214         }
17215         break;
17216     case OPC_DPAQ_W_QH_DSP:
17217         op2 = MASK_DPAQ_W_QH(ctx->opcode);
17218         switch (op2) {
17219         case OPC_DPAU_H_OBL:
17220         case OPC_DPAU_H_OBR:
17221         case OPC_DPSU_H_OBL:
17222         case OPC_DPSU_H_OBR:
17223         case OPC_DPA_W_QH:
17224         case OPC_DPAQ_S_W_QH:
17225         case OPC_DPS_W_QH:
17226         case OPC_DPSQ_S_W_QH:
17227         case OPC_MULSAQ_S_W_QH:
17228         case OPC_DPAQ_SA_L_PW:
17229         case OPC_DPSQ_SA_L_PW:
17230         case OPC_MULSAQ_S_L_PW:
17231             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
17232             break;
17233         case OPC_MAQ_S_W_QHLL:
17234         case OPC_MAQ_S_W_QHLR:
17235         case OPC_MAQ_S_W_QHRL:
17236         case OPC_MAQ_S_W_QHRR:
17237         case OPC_MAQ_SA_W_QHLL:
17238         case OPC_MAQ_SA_W_QHLR:
17239         case OPC_MAQ_SA_W_QHRL:
17240         case OPC_MAQ_SA_W_QHRR:
17241         case OPC_MAQ_S_L_PWL:
17242         case OPC_MAQ_S_L_PWR:
17243         case OPC_DMADD:
17244         case OPC_DMADDU:
17245         case OPC_DMSUB:
17246         case OPC_DMSUBU:
17247             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
17248             break;
17249         default:            /* Invalid */
17250             MIPS_INVAL("MASK DPAQ.W.QH");
17251             generate_exception(ctx, EXCP_RI);
17252             break;
17253         }
17254         break;
17255     case OPC_DINSV_DSP:
17256         op2 = MASK_INSV(ctx->opcode);
17257         switch (op2) {
17258         case OPC_DINSV:
17259         {
17260             TCGv t0, t1;
17261
17262             if (rt == 0) {
17263                 MIPS_DEBUG("NOP");
17264                 break;
17265             }
17266             check_dsp(ctx);
17267
17268             t0 = tcg_temp_new();
17269             t1 = tcg_temp_new();
17270
17271             gen_load_gpr(t0, rt);
17272             gen_load_gpr(t1, rs);
17273
17274             gen_helper_dinsv(cpu_gpr[rt], cpu_env, t1, t0);
17275
17276             tcg_temp_free(t0);
17277             tcg_temp_free(t1);
17278             break;
17279         }
17280         default:            /* Invalid */
17281             MIPS_INVAL("MASK DINSV");
17282             generate_exception(ctx, EXCP_RI);
17283             break;
17284         }
17285         break;
17286     case OPC_SHLL_OB_DSP:
17287         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
17288         break;
17289 #endif
17290     default:            /* Invalid */
17291         MIPS_INVAL("special3_legacy");
17292         generate_exception(ctx, EXCP_RI);
17293         break;
17294     }
17295 }
17296
17297 static void decode_opc_special3(CPUMIPSState *env, DisasContext *ctx)
17298 {
17299     int rs, rt, rd, sa;
17300     uint32_t op1, op2;
17301
17302     rs = (ctx->opcode >> 21) & 0x1f;
17303     rt = (ctx->opcode >> 16) & 0x1f;
17304     rd = (ctx->opcode >> 11) & 0x1f;
17305     sa = (ctx->opcode >> 6) & 0x1f;
17306
17307     op1 = MASK_SPECIAL3(ctx->opcode);
17308     switch (op1) {
17309     case OPC_EXT:
17310     case OPC_INS:
17311         check_insn(ctx, ISA_MIPS32R2);
17312         gen_bitops(ctx, op1, rt, rs, sa, rd);
17313         break;
17314     case OPC_BSHFL:
17315         op2 = MASK_BSHFL(ctx->opcode);
17316         switch (op2) {
17317         case OPC_ALIGN ... OPC_ALIGN_END:
17318         case OPC_BITSWAP:
17319             check_insn(ctx, ISA_MIPS32R6);
17320             decode_opc_special3_r6(env, ctx);
17321             break;
17322         default:
17323             check_insn(ctx, ISA_MIPS32R2);
17324             gen_bshfl(ctx, op2, rt, rd);
17325             break;
17326         }
17327         break;
17328 #if defined(TARGET_MIPS64)
17329     case OPC_DEXTM ... OPC_DEXT:
17330     case OPC_DINSM ... OPC_DINS:
17331         check_insn(ctx, ISA_MIPS64R2);
17332         check_mips_64(ctx);
17333         gen_bitops(ctx, op1, rt, rs, sa, rd);
17334         break;
17335     case OPC_DBSHFL:
17336         op2 = MASK_DBSHFL(ctx->opcode);
17337         switch (op2) {
17338         case OPC_DALIGN ... OPC_DALIGN_END:
17339         case OPC_DBITSWAP:
17340             check_insn(ctx, ISA_MIPS32R6);
17341             decode_opc_special3_r6(env, ctx);
17342             break;
17343         default:
17344             check_insn(ctx, ISA_MIPS64R2);
17345             check_mips_64(ctx);
17346             op2 = MASK_DBSHFL(ctx->opcode);
17347             gen_bshfl(ctx, op2, rt, rd);
17348             break;
17349         }
17350         break;
17351 #endif
17352     case OPC_RDHWR:
17353         gen_rdhwr(ctx, rt, rd);
17354         break;
17355     case OPC_FORK:
17356         check_insn(ctx, ASE_MT);
17357         {
17358             TCGv t0 = tcg_temp_new();
17359             TCGv t1 = tcg_temp_new();
17360
17361             gen_load_gpr(t0, rt);
17362             gen_load_gpr(t1, rs);
17363             gen_helper_fork(t0, t1);
17364             tcg_temp_free(t0);
17365             tcg_temp_free(t1);
17366         }
17367         break;
17368     case OPC_YIELD:
17369         check_insn(ctx, ASE_MT);
17370         {
17371             TCGv t0 = tcg_temp_new();
17372
17373             save_cpu_state(ctx, 1);
17374             gen_load_gpr(t0, rs);
17375             gen_helper_yield(t0, cpu_env, t0);
17376             gen_store_gpr(t0, rd);
17377             tcg_temp_free(t0);
17378         }
17379         break;
17380     default:
17381         if (ctx->insn_flags & ISA_MIPS32R6) {
17382             decode_opc_special3_r6(env, ctx);
17383         } else {
17384             decode_opc_special3_legacy(env, ctx);
17385         }
17386     }
17387 }
17388
17389 /* MIPS SIMD Architecture (MSA)  */
17390 static inline int check_msa_access(DisasContext *ctx)
17391 {
17392     if (unlikely((ctx->hflags & MIPS_HFLAG_FPU) &&
17393                  !(ctx->hflags & MIPS_HFLAG_F64))) {
17394         generate_exception(ctx, EXCP_RI);
17395         return 0;
17396     }
17397
17398     if (unlikely(!(ctx->hflags & MIPS_HFLAG_MSA))) {
17399         if (ctx->insn_flags & ASE_MSA) {
17400             generate_exception(ctx, EXCP_MSADIS);
17401             return 0;
17402         } else {
17403             generate_exception(ctx, EXCP_RI);
17404             return 0;
17405         }
17406     }
17407     return 1;
17408 }
17409
17410 static void gen_check_zero_element(TCGv tresult, uint8_t df, uint8_t wt)
17411 {
17412     /* generates tcg ops to check if any element is 0 */
17413     /* Note this function only works with MSA_WRLEN = 128 */
17414     uint64_t eval_zero_or_big = 0;
17415     uint64_t eval_big = 0;
17416     TCGv_i64 t0 = tcg_temp_new_i64();
17417     TCGv_i64 t1 = tcg_temp_new_i64();
17418     switch (df) {
17419     case DF_BYTE:
17420         eval_zero_or_big = 0x0101010101010101ULL;
17421         eval_big = 0x8080808080808080ULL;
17422         break;
17423     case DF_HALF:
17424         eval_zero_or_big = 0x0001000100010001ULL;
17425         eval_big = 0x8000800080008000ULL;
17426         break;
17427     case DF_WORD:
17428         eval_zero_or_big = 0x0000000100000001ULL;
17429         eval_big = 0x8000000080000000ULL;
17430         break;
17431     case DF_DOUBLE:
17432         eval_zero_or_big = 0x0000000000000001ULL;
17433         eval_big = 0x8000000000000000ULL;
17434         break;
17435     }
17436     tcg_gen_subi_i64(t0, msa_wr_d[wt<<1], eval_zero_or_big);
17437     tcg_gen_andc_i64(t0, t0, msa_wr_d[wt<<1]);
17438     tcg_gen_andi_i64(t0, t0, eval_big);
17439     tcg_gen_subi_i64(t1, msa_wr_d[(wt<<1)+1], eval_zero_or_big);
17440     tcg_gen_andc_i64(t1, t1, msa_wr_d[(wt<<1)+1]);
17441     tcg_gen_andi_i64(t1, t1, eval_big);
17442     tcg_gen_or_i64(t0, t0, t1);
17443     /* if all bits are zero then all elements are not zero */
17444     /* if some bit is non-zero then some element is zero */
17445     tcg_gen_setcondi_i64(TCG_COND_NE, t0, t0, 0);
17446     tcg_gen_trunc_i64_tl(tresult, t0);
17447     tcg_temp_free_i64(t0);
17448     tcg_temp_free_i64(t1);
17449 }
17450
17451 static void gen_msa_branch(CPUMIPSState *env, DisasContext *ctx, uint32_t op1)
17452 {
17453     uint8_t df = (ctx->opcode >> 21) & 0x3;
17454     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
17455     int64_t s16 = (int16_t)ctx->opcode;
17456
17457     check_msa_access(ctx);
17458
17459     if (ctx->insn_flags & ISA_MIPS32R6 && ctx->hflags & MIPS_HFLAG_BMASK) {
17460         MIPS_DEBUG("CTI in delay / forbidden slot");
17461         generate_exception(ctx, EXCP_RI);
17462         return;
17463     }
17464     switch (op1) {
17465     case OPC_BZ_V:
17466     case OPC_BNZ_V:
17467         {
17468             TCGv_i64 t0 = tcg_temp_new_i64();
17469             tcg_gen_or_i64(t0, msa_wr_d[wt<<1], msa_wr_d[(wt<<1)+1]);
17470             tcg_gen_setcondi_i64((op1 == OPC_BZ_V) ?
17471                     TCG_COND_EQ : TCG_COND_NE, t0, t0, 0);
17472             tcg_gen_trunc_i64_tl(bcond, t0);
17473             tcg_temp_free_i64(t0);
17474         }
17475         break;
17476     case OPC_BZ_B:
17477     case OPC_BZ_H:
17478     case OPC_BZ_W:
17479     case OPC_BZ_D:
17480         gen_check_zero_element(bcond, df, wt);
17481         break;
17482     case OPC_BNZ_B:
17483     case OPC_BNZ_H:
17484     case OPC_BNZ_W:
17485     case OPC_BNZ_D:
17486         gen_check_zero_element(bcond, df, wt);
17487         tcg_gen_setcondi_tl(TCG_COND_EQ, bcond, bcond, 0);
17488         break;
17489     }
17490
17491     ctx->btarget = ctx->pc + (s16 << 2) + 4;
17492
17493     ctx->hflags |= MIPS_HFLAG_BC;
17494     ctx->hflags |= MIPS_HFLAG_BDS32;
17495 }
17496
17497 static void gen_msa_i8(CPUMIPSState *env, DisasContext *ctx)
17498 {
17499 #define MASK_MSA_I8(op)    (MASK_MSA_MINOR(op) | (op & (0x03 << 24)))
17500     uint8_t i8 = (ctx->opcode >> 16) & 0xff;
17501     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
17502     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
17503
17504     TCGv_i32 twd = tcg_const_i32(wd);
17505     TCGv_i32 tws = tcg_const_i32(ws);
17506     TCGv_i32 ti8 = tcg_const_i32(i8);
17507
17508     switch (MASK_MSA_I8(ctx->opcode)) {
17509     case OPC_ANDI_B:
17510         gen_helper_msa_andi_b(cpu_env, twd, tws, ti8);
17511         break;
17512     case OPC_ORI_B:
17513         gen_helper_msa_ori_b(cpu_env, twd, tws, ti8);
17514         break;
17515     case OPC_NORI_B:
17516         gen_helper_msa_nori_b(cpu_env, twd, tws, ti8);
17517         break;
17518     case OPC_XORI_B:
17519         gen_helper_msa_xori_b(cpu_env, twd, tws, ti8);
17520         break;
17521     case OPC_BMNZI_B:
17522         gen_helper_msa_bmnzi_b(cpu_env, twd, tws, ti8);
17523         break;
17524     case OPC_BMZI_B:
17525         gen_helper_msa_bmzi_b(cpu_env, twd, tws, ti8);
17526         break;
17527     case OPC_BSELI_B:
17528         gen_helper_msa_bseli_b(cpu_env, twd, tws, ti8);
17529         break;
17530     case OPC_SHF_B:
17531     case OPC_SHF_H:
17532     case OPC_SHF_W:
17533         {
17534             uint8_t df = (ctx->opcode >> 24) & 0x3;
17535             if (df == DF_DOUBLE) {
17536                 generate_exception(ctx, EXCP_RI);
17537             } else {
17538                 TCGv_i32 tdf = tcg_const_i32(df);
17539                 gen_helper_msa_shf_df(cpu_env, tdf, twd, tws, ti8);
17540                 tcg_temp_free_i32(tdf);
17541             }
17542         }
17543         break;
17544     default:
17545         MIPS_INVAL("MSA instruction");
17546         generate_exception(ctx, EXCP_RI);
17547         break;
17548     }
17549
17550     tcg_temp_free_i32(twd);
17551     tcg_temp_free_i32(tws);
17552     tcg_temp_free_i32(ti8);
17553 }
17554
17555 static void gen_msa_i5(CPUMIPSState *env, DisasContext *ctx)
17556 {
17557 #define MASK_MSA_I5(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
17558     uint8_t df = (ctx->opcode >> 21) & 0x3;
17559     int8_t s5 = (int8_t) sextract32(ctx->opcode, 16, 5);
17560     uint8_t u5 = (ctx->opcode >> 16) & 0x1f;
17561     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
17562     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
17563
17564     TCGv_i32 tdf = tcg_const_i32(df);
17565     TCGv_i32 twd = tcg_const_i32(wd);
17566     TCGv_i32 tws = tcg_const_i32(ws);
17567     TCGv_i32 timm = tcg_temp_new_i32();
17568     tcg_gen_movi_i32(timm, u5);
17569
17570     switch (MASK_MSA_I5(ctx->opcode)) {
17571     case OPC_ADDVI_df:
17572         gen_helper_msa_addvi_df(cpu_env, tdf, twd, tws, timm);
17573         break;
17574     case OPC_SUBVI_df:
17575         gen_helper_msa_subvi_df(cpu_env, tdf, twd, tws, timm);
17576         break;
17577     case OPC_MAXI_S_df:
17578         tcg_gen_movi_i32(timm, s5);
17579         gen_helper_msa_maxi_s_df(cpu_env, tdf, twd, tws, timm);
17580         break;
17581     case OPC_MAXI_U_df:
17582         gen_helper_msa_maxi_u_df(cpu_env, tdf, twd, tws, timm);
17583         break;
17584     case OPC_MINI_S_df:
17585         tcg_gen_movi_i32(timm, s5);
17586         gen_helper_msa_mini_s_df(cpu_env, tdf, twd, tws, timm);
17587         break;
17588     case OPC_MINI_U_df:
17589         gen_helper_msa_mini_u_df(cpu_env, tdf, twd, tws, timm);
17590         break;
17591     case OPC_CEQI_df:
17592         tcg_gen_movi_i32(timm, s5);
17593         gen_helper_msa_ceqi_df(cpu_env, tdf, twd, tws, timm);
17594         break;
17595     case OPC_CLTI_S_df:
17596         tcg_gen_movi_i32(timm, s5);
17597         gen_helper_msa_clti_s_df(cpu_env, tdf, twd, tws, timm);
17598         break;
17599     case OPC_CLTI_U_df:
17600         gen_helper_msa_clti_u_df(cpu_env, tdf, twd, tws, timm);
17601         break;
17602     case OPC_CLEI_S_df:
17603         tcg_gen_movi_i32(timm, s5);
17604         gen_helper_msa_clei_s_df(cpu_env, tdf, twd, tws, timm);
17605         break;
17606     case OPC_CLEI_U_df:
17607         gen_helper_msa_clei_u_df(cpu_env, tdf, twd, tws, timm);
17608         break;
17609     case OPC_LDI_df:
17610         {
17611             int32_t s10 = sextract32(ctx->opcode, 11, 10);
17612             tcg_gen_movi_i32(timm, s10);
17613             gen_helper_msa_ldi_df(cpu_env, tdf, twd, timm);
17614         }
17615         break;
17616     default:
17617         MIPS_INVAL("MSA instruction");
17618         generate_exception(ctx, EXCP_RI);
17619         break;
17620     }
17621
17622     tcg_temp_free_i32(tdf);
17623     tcg_temp_free_i32(twd);
17624     tcg_temp_free_i32(tws);
17625     tcg_temp_free_i32(timm);
17626 }
17627
17628 static void gen_msa_bit(CPUMIPSState *env, DisasContext *ctx)
17629 {
17630 #define MASK_MSA_BIT(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
17631     uint8_t dfm = (ctx->opcode >> 16) & 0x7f;
17632     uint32_t df = 0, m = 0;
17633     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
17634     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
17635
17636     TCGv_i32 tdf;
17637     TCGv_i32 tm;
17638     TCGv_i32 twd;
17639     TCGv_i32 tws;
17640
17641     if ((dfm & 0x40) == 0x00) {
17642         m = dfm & 0x3f;
17643         df = DF_DOUBLE;
17644     } else if ((dfm & 0x60) == 0x40) {
17645         m = dfm & 0x1f;
17646         df = DF_WORD;
17647     } else if ((dfm & 0x70) == 0x60) {
17648         m = dfm & 0x0f;
17649         df = DF_HALF;
17650     } else if ((dfm & 0x78) == 0x70) {
17651         m = dfm & 0x7;
17652         df = DF_BYTE;
17653     } else {
17654         generate_exception(ctx, EXCP_RI);
17655         return;
17656     }
17657
17658     tdf = tcg_const_i32(df);
17659     tm  = tcg_const_i32(m);
17660     twd = tcg_const_i32(wd);
17661     tws = tcg_const_i32(ws);
17662
17663     switch (MASK_MSA_BIT(ctx->opcode)) {
17664     case OPC_SLLI_df:
17665         gen_helper_msa_slli_df(cpu_env, tdf, twd, tws, tm);
17666         break;
17667     case OPC_SRAI_df:
17668         gen_helper_msa_srai_df(cpu_env, tdf, twd, tws, tm);
17669         break;
17670     case OPC_SRLI_df:
17671         gen_helper_msa_srli_df(cpu_env, tdf, twd, tws, tm);
17672         break;
17673     case OPC_BCLRI_df:
17674         gen_helper_msa_bclri_df(cpu_env, tdf, twd, tws, tm);
17675         break;
17676     case OPC_BSETI_df:
17677         gen_helper_msa_bseti_df(cpu_env, tdf, twd, tws, tm);
17678         break;
17679     case OPC_BNEGI_df:
17680         gen_helper_msa_bnegi_df(cpu_env, tdf, twd, tws, tm);
17681         break;
17682     case OPC_BINSLI_df:
17683         gen_helper_msa_binsli_df(cpu_env, tdf, twd, tws, tm);
17684         break;
17685     case OPC_BINSRI_df:
17686         gen_helper_msa_binsri_df(cpu_env, tdf, twd, tws, tm);
17687         break;
17688     case OPC_SAT_S_df:
17689         gen_helper_msa_sat_s_df(cpu_env, tdf, twd, tws, tm);
17690         break;
17691     case OPC_SAT_U_df:
17692         gen_helper_msa_sat_u_df(cpu_env, tdf, twd, tws, tm);
17693         break;
17694     case OPC_SRARI_df:
17695         gen_helper_msa_srari_df(cpu_env, tdf, twd, tws, tm);
17696         break;
17697     case OPC_SRLRI_df:
17698         gen_helper_msa_srlri_df(cpu_env, tdf, twd, tws, tm);
17699         break;
17700     default:
17701         MIPS_INVAL("MSA instruction");
17702         generate_exception(ctx, EXCP_RI);
17703         break;
17704     }
17705
17706     tcg_temp_free_i32(tdf);
17707     tcg_temp_free_i32(tm);
17708     tcg_temp_free_i32(twd);
17709     tcg_temp_free_i32(tws);
17710 }
17711
17712 static void gen_msa_3r(CPUMIPSState *env, DisasContext *ctx)
17713 {
17714 #define MASK_MSA_3R(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
17715     uint8_t df = (ctx->opcode >> 21) & 0x3;
17716     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
17717     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
17718     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
17719
17720     TCGv_i32 tdf = tcg_const_i32(df);
17721     TCGv_i32 twd = tcg_const_i32(wd);
17722     TCGv_i32 tws = tcg_const_i32(ws);
17723     TCGv_i32 twt = tcg_const_i32(wt);
17724
17725     switch (MASK_MSA_3R(ctx->opcode)) {
17726     case OPC_SLL_df:
17727         gen_helper_msa_sll_df(cpu_env, tdf, twd, tws, twt);
17728         break;
17729     case OPC_ADDV_df:
17730         gen_helper_msa_addv_df(cpu_env, tdf, twd, tws, twt);
17731         break;
17732     case OPC_CEQ_df:
17733         gen_helper_msa_ceq_df(cpu_env, tdf, twd, tws, twt);
17734         break;
17735     case OPC_ADD_A_df:
17736         gen_helper_msa_add_a_df(cpu_env, tdf, twd, tws, twt);
17737         break;
17738     case OPC_SUBS_S_df:
17739         gen_helper_msa_subs_s_df(cpu_env, tdf, twd, tws, twt);
17740         break;
17741     case OPC_MULV_df:
17742         gen_helper_msa_mulv_df(cpu_env, tdf, twd, tws, twt);
17743         break;
17744     case OPC_SLD_df:
17745         gen_helper_msa_sld_df(cpu_env, tdf, twd, tws, twt);
17746         break;
17747     case OPC_VSHF_df:
17748         gen_helper_msa_vshf_df(cpu_env, tdf, twd, tws, twt);
17749         break;
17750     case OPC_SRA_df:
17751         gen_helper_msa_sra_df(cpu_env, tdf, twd, tws, twt);
17752         break;
17753     case OPC_SUBV_df:
17754         gen_helper_msa_subv_df(cpu_env, tdf, twd, tws, twt);
17755         break;
17756     case OPC_ADDS_A_df:
17757         gen_helper_msa_adds_a_df(cpu_env, tdf, twd, tws, twt);
17758         break;
17759     case OPC_SUBS_U_df:
17760         gen_helper_msa_subs_u_df(cpu_env, tdf, twd, tws, twt);
17761         break;
17762     case OPC_MADDV_df:
17763         gen_helper_msa_maddv_df(cpu_env, tdf, twd, tws, twt);
17764         break;
17765     case OPC_SPLAT_df:
17766         gen_helper_msa_splat_df(cpu_env, tdf, twd, tws, twt);
17767         break;
17768     case OPC_SRAR_df:
17769         gen_helper_msa_srar_df(cpu_env, tdf, twd, tws, twt);
17770         break;
17771     case OPC_SRL_df:
17772         gen_helper_msa_srl_df(cpu_env, tdf, twd, tws, twt);
17773         break;
17774     case OPC_MAX_S_df:
17775         gen_helper_msa_max_s_df(cpu_env, tdf, twd, tws, twt);
17776         break;
17777     case OPC_CLT_S_df:
17778         gen_helper_msa_clt_s_df(cpu_env, tdf, twd, tws, twt);
17779         break;
17780     case OPC_ADDS_S_df:
17781         gen_helper_msa_adds_s_df(cpu_env, tdf, twd, tws, twt);
17782         break;
17783     case OPC_SUBSUS_U_df:
17784         gen_helper_msa_subsus_u_df(cpu_env, tdf, twd, tws, twt);
17785         break;
17786     case OPC_MSUBV_df:
17787         gen_helper_msa_msubv_df(cpu_env, tdf, twd, tws, twt);
17788         break;
17789     case OPC_PCKEV_df:
17790         gen_helper_msa_pckev_df(cpu_env, tdf, twd, tws, twt);
17791         break;
17792     case OPC_SRLR_df:
17793         gen_helper_msa_srlr_df(cpu_env, tdf, twd, tws, twt);
17794         break;
17795     case OPC_BCLR_df:
17796         gen_helper_msa_bclr_df(cpu_env, tdf, twd, tws, twt);
17797         break;
17798     case OPC_MAX_U_df:
17799         gen_helper_msa_max_u_df(cpu_env, tdf, twd, tws, twt);
17800         break;
17801     case OPC_CLT_U_df:
17802         gen_helper_msa_clt_u_df(cpu_env, tdf, twd, tws, twt);
17803         break;
17804     case OPC_ADDS_U_df:
17805         gen_helper_msa_adds_u_df(cpu_env, tdf, twd, tws, twt);
17806         break;
17807     case OPC_SUBSUU_S_df:
17808         gen_helper_msa_subsuu_s_df(cpu_env, tdf, twd, tws, twt);
17809         break;
17810     case OPC_PCKOD_df:
17811         gen_helper_msa_pckod_df(cpu_env, tdf, twd, tws, twt);
17812         break;
17813     case OPC_BSET_df:
17814         gen_helper_msa_bset_df(cpu_env, tdf, twd, tws, twt);
17815         break;
17816     case OPC_MIN_S_df:
17817         gen_helper_msa_min_s_df(cpu_env, tdf, twd, tws, twt);
17818         break;
17819     case OPC_CLE_S_df:
17820         gen_helper_msa_cle_s_df(cpu_env, tdf, twd, tws, twt);
17821         break;
17822     case OPC_AVE_S_df:
17823         gen_helper_msa_ave_s_df(cpu_env, tdf, twd, tws, twt);
17824         break;
17825     case OPC_ASUB_S_df:
17826         gen_helper_msa_asub_s_df(cpu_env, tdf, twd, tws, twt);
17827         break;
17828     case OPC_DIV_S_df:
17829         gen_helper_msa_div_s_df(cpu_env, tdf, twd, tws, twt);
17830         break;
17831     case OPC_ILVL_df:
17832         gen_helper_msa_ilvl_df(cpu_env, tdf, twd, tws, twt);
17833         break;
17834     case OPC_BNEG_df:
17835         gen_helper_msa_bneg_df(cpu_env, tdf, twd, tws, twt);
17836         break;
17837     case OPC_MIN_U_df:
17838         gen_helper_msa_min_u_df(cpu_env, tdf, twd, tws, twt);
17839         break;
17840     case OPC_CLE_U_df:
17841         gen_helper_msa_cle_u_df(cpu_env, tdf, twd, tws, twt);
17842         break;
17843     case OPC_AVE_U_df:
17844         gen_helper_msa_ave_u_df(cpu_env, tdf, twd, tws, twt);
17845         break;
17846     case OPC_ASUB_U_df:
17847         gen_helper_msa_asub_u_df(cpu_env, tdf, twd, tws, twt);
17848         break;
17849     case OPC_DIV_U_df:
17850         gen_helper_msa_div_u_df(cpu_env, tdf, twd, tws, twt);
17851         break;
17852     case OPC_ILVR_df:
17853         gen_helper_msa_ilvr_df(cpu_env, tdf, twd, tws, twt);
17854         break;
17855     case OPC_BINSL_df:
17856         gen_helper_msa_binsl_df(cpu_env, tdf, twd, tws, twt);
17857         break;
17858     case OPC_MAX_A_df:
17859         gen_helper_msa_max_a_df(cpu_env, tdf, twd, tws, twt);
17860         break;
17861     case OPC_AVER_S_df:
17862         gen_helper_msa_aver_s_df(cpu_env, tdf, twd, tws, twt);
17863         break;
17864     case OPC_MOD_S_df:
17865         gen_helper_msa_mod_s_df(cpu_env, tdf, twd, tws, twt);
17866         break;
17867     case OPC_ILVEV_df:
17868         gen_helper_msa_ilvev_df(cpu_env, tdf, twd, tws, twt);
17869         break;
17870     case OPC_BINSR_df:
17871         gen_helper_msa_binsr_df(cpu_env, tdf, twd, tws, twt);
17872         break;
17873     case OPC_MIN_A_df:
17874         gen_helper_msa_min_a_df(cpu_env, tdf, twd, tws, twt);
17875         break;
17876     case OPC_AVER_U_df:
17877         gen_helper_msa_aver_u_df(cpu_env, tdf, twd, tws, twt);
17878         break;
17879     case OPC_MOD_U_df:
17880         gen_helper_msa_mod_u_df(cpu_env, tdf, twd, tws, twt);
17881         break;
17882     case OPC_ILVOD_df:
17883         gen_helper_msa_ilvod_df(cpu_env, tdf, twd, tws, twt);
17884         break;
17885
17886     case OPC_DOTP_S_df:
17887     case OPC_DOTP_U_df:
17888     case OPC_DPADD_S_df:
17889     case OPC_DPADD_U_df:
17890     case OPC_DPSUB_S_df:
17891     case OPC_HADD_S_df:
17892     case OPC_DPSUB_U_df:
17893     case OPC_HADD_U_df:
17894     case OPC_HSUB_S_df:
17895     case OPC_HSUB_U_df:
17896         if (df == DF_BYTE) {
17897             generate_exception(ctx, EXCP_RI);
17898         }
17899         switch (MASK_MSA_3R(ctx->opcode)) {
17900         case OPC_DOTP_S_df:
17901             gen_helper_msa_dotp_s_df(cpu_env, tdf, twd, tws, twt);
17902             break;
17903         case OPC_DOTP_U_df:
17904             gen_helper_msa_dotp_u_df(cpu_env, tdf, twd, tws, twt);
17905             break;
17906         case OPC_DPADD_S_df:
17907             gen_helper_msa_dpadd_s_df(cpu_env, tdf, twd, tws, twt);
17908             break;
17909         case OPC_DPADD_U_df:
17910             gen_helper_msa_dpadd_u_df(cpu_env, tdf, twd, tws, twt);
17911             break;
17912         case OPC_DPSUB_S_df:
17913             gen_helper_msa_dpsub_s_df(cpu_env, tdf, twd, tws, twt);
17914             break;
17915         case OPC_HADD_S_df:
17916             gen_helper_msa_hadd_s_df(cpu_env, tdf, twd, tws, twt);
17917             break;
17918         case OPC_DPSUB_U_df:
17919             gen_helper_msa_dpsub_u_df(cpu_env, tdf, twd, tws, twt);
17920             break;
17921         case OPC_HADD_U_df:
17922             gen_helper_msa_hadd_u_df(cpu_env, tdf, twd, tws, twt);
17923             break;
17924         case OPC_HSUB_S_df:
17925             gen_helper_msa_hsub_s_df(cpu_env, tdf, twd, tws, twt);
17926             break;
17927         case OPC_HSUB_U_df:
17928             gen_helper_msa_hsub_u_df(cpu_env, tdf, twd, tws, twt);
17929             break;
17930         }
17931         break;
17932     default:
17933         MIPS_INVAL("MSA instruction");
17934         generate_exception(ctx, EXCP_RI);
17935         break;
17936     }
17937     tcg_temp_free_i32(twd);
17938     tcg_temp_free_i32(tws);
17939     tcg_temp_free_i32(twt);
17940     tcg_temp_free_i32(tdf);
17941 }
17942
17943 static void gen_msa_elm_3e(CPUMIPSState *env, DisasContext *ctx)
17944 {
17945 #define MASK_MSA_ELM_DF3E(op)   (MASK_MSA_MINOR(op) | (op & (0x3FF << 16)))
17946     uint8_t source = (ctx->opcode >> 11) & 0x1f;
17947     uint8_t dest = (ctx->opcode >> 6) & 0x1f;
17948     TCGv telm = tcg_temp_new();
17949     TCGv_i32 tsr = tcg_const_i32(source);
17950     TCGv_i32 tdt = tcg_const_i32(dest);
17951
17952     switch (MASK_MSA_ELM_DF3E(ctx->opcode)) {
17953     case OPC_CTCMSA:
17954         gen_load_gpr(telm, source);
17955         gen_helper_msa_ctcmsa(cpu_env, telm, tdt);
17956         break;
17957     case OPC_CFCMSA:
17958         gen_helper_msa_cfcmsa(telm, cpu_env, tsr);
17959         gen_store_gpr(telm, dest);
17960         break;
17961     case OPC_MOVE_V:
17962         gen_helper_msa_move_v(cpu_env, tdt, tsr);
17963         break;
17964     default:
17965         MIPS_INVAL("MSA instruction");
17966         generate_exception(ctx, EXCP_RI);
17967         break;
17968     }
17969
17970     tcg_temp_free(telm);
17971     tcg_temp_free_i32(tdt);
17972     tcg_temp_free_i32(tsr);
17973 }
17974
17975 static void gen_msa_elm_df(CPUMIPSState *env, DisasContext *ctx, uint32_t df,
17976         uint32_t n)
17977 {
17978 #define MASK_MSA_ELM(op)    (MASK_MSA_MINOR(op) | (op & (0xf << 22)))
17979     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
17980     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
17981
17982     TCGv_i32 tws = tcg_const_i32(ws);
17983     TCGv_i32 twd = tcg_const_i32(wd);
17984     TCGv_i32 tn  = tcg_const_i32(n);
17985     TCGv_i32 tdf = tcg_const_i32(df);
17986
17987     switch (MASK_MSA_ELM(ctx->opcode)) {
17988     case OPC_SLDI_df:
17989         gen_helper_msa_sldi_df(cpu_env, tdf, twd, tws, tn);
17990         break;
17991     case OPC_SPLATI_df:
17992         gen_helper_msa_splati_df(cpu_env, tdf, twd, tws, tn);
17993         break;
17994     case OPC_INSVE_df:
17995         gen_helper_msa_insve_df(cpu_env, tdf, twd, tws, tn);
17996         break;
17997     case OPC_COPY_S_df:
17998     case OPC_COPY_U_df:
17999     case OPC_INSERT_df:
18000 #if !defined(TARGET_MIPS64)
18001         /* Double format valid only for MIPS64 */
18002         if (df == DF_DOUBLE) {
18003             generate_exception(ctx, EXCP_RI);
18004             break;
18005         }
18006 #endif
18007         switch (MASK_MSA_ELM(ctx->opcode)) {
18008         case OPC_COPY_S_df:
18009             gen_helper_msa_copy_s_df(cpu_env, tdf, twd, tws, tn);
18010             break;
18011         case OPC_COPY_U_df:
18012             gen_helper_msa_copy_u_df(cpu_env, tdf, twd, tws, tn);
18013             break;
18014         case OPC_INSERT_df:
18015             gen_helper_msa_insert_df(cpu_env, tdf, twd, tws, tn);
18016             break;
18017         }
18018         break;
18019     default:
18020         MIPS_INVAL("MSA instruction");
18021         generate_exception(ctx, EXCP_RI);
18022     }
18023     tcg_temp_free_i32(twd);
18024     tcg_temp_free_i32(tws);
18025     tcg_temp_free_i32(tn);
18026     tcg_temp_free_i32(tdf);
18027 }
18028
18029 static void gen_msa_elm(CPUMIPSState *env, DisasContext *ctx)
18030 {
18031     uint8_t dfn = (ctx->opcode >> 16) & 0x3f;
18032     uint32_t df = 0, n = 0;
18033
18034     if ((dfn & 0x30) == 0x00) {
18035         n = dfn & 0x0f;
18036         df = DF_BYTE;
18037     } else if ((dfn & 0x38) == 0x20) {
18038         n = dfn & 0x07;
18039         df = DF_HALF;
18040     } else if ((dfn & 0x3c) == 0x30) {
18041         n = dfn & 0x03;
18042         df = DF_WORD;
18043     } else if ((dfn & 0x3e) == 0x38) {
18044         n = dfn & 0x01;
18045         df = DF_DOUBLE;
18046     } else if (dfn == 0x3E) {
18047         /* CTCMSA, CFCMSA, MOVE.V */
18048         gen_msa_elm_3e(env, ctx);
18049         return;
18050     } else {
18051         generate_exception(ctx, EXCP_RI);
18052         return;
18053     }
18054
18055     gen_msa_elm_df(env, ctx, df, n);
18056 }
18057
18058 static void gen_msa_3rf(CPUMIPSState *env, DisasContext *ctx)
18059 {
18060 #define MASK_MSA_3RF(op)    (MASK_MSA_MINOR(op) | (op & (0xf << 22)))
18061     uint8_t df = (ctx->opcode >> 21) & 0x1;
18062     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
18063     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
18064     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18065
18066     TCGv_i32 twd = tcg_const_i32(wd);
18067     TCGv_i32 tws = tcg_const_i32(ws);
18068     TCGv_i32 twt = tcg_const_i32(wt);
18069     TCGv_i32 tdf = tcg_temp_new_i32();
18070
18071     /* adjust df value for floating-point instruction */
18072     tcg_gen_movi_i32(tdf, df + 2);
18073
18074     switch (MASK_MSA_3RF(ctx->opcode)) {
18075     case OPC_FCAF_df:
18076         gen_helper_msa_fcaf_df(cpu_env, tdf, twd, tws, twt);
18077         break;
18078     case OPC_FADD_df:
18079         gen_helper_msa_fadd_df(cpu_env, tdf, twd, tws, twt);
18080         break;
18081     case OPC_FCUN_df:
18082         gen_helper_msa_fcun_df(cpu_env, tdf, twd, tws, twt);
18083         break;
18084     case OPC_FSUB_df:
18085         gen_helper_msa_fsub_df(cpu_env, tdf, twd, tws, twt);
18086         break;
18087     case OPC_FCOR_df:
18088         gen_helper_msa_fcor_df(cpu_env, tdf, twd, tws, twt);
18089         break;
18090     case OPC_FCEQ_df:
18091         gen_helper_msa_fceq_df(cpu_env, tdf, twd, tws, twt);
18092         break;
18093     case OPC_FMUL_df:
18094         gen_helper_msa_fmul_df(cpu_env, tdf, twd, tws, twt);
18095         break;
18096     case OPC_FCUNE_df:
18097         gen_helper_msa_fcune_df(cpu_env, tdf, twd, tws, twt);
18098         break;
18099     case OPC_FCUEQ_df:
18100         gen_helper_msa_fcueq_df(cpu_env, tdf, twd, tws, twt);
18101         break;
18102     case OPC_FDIV_df:
18103         gen_helper_msa_fdiv_df(cpu_env, tdf, twd, tws, twt);
18104         break;
18105     case OPC_FCNE_df:
18106         gen_helper_msa_fcne_df(cpu_env, tdf, twd, tws, twt);
18107         break;
18108     case OPC_FCLT_df:
18109         gen_helper_msa_fclt_df(cpu_env, tdf, twd, tws, twt);
18110         break;
18111     case OPC_FMADD_df:
18112         gen_helper_msa_fmadd_df(cpu_env, tdf, twd, tws, twt);
18113         break;
18114     case OPC_MUL_Q_df:
18115         tcg_gen_movi_i32(tdf, df + 1);
18116         gen_helper_msa_mul_q_df(cpu_env, tdf, twd, tws, twt);
18117         break;
18118     case OPC_FCULT_df:
18119         gen_helper_msa_fcult_df(cpu_env, tdf, twd, tws, twt);
18120         break;
18121     case OPC_FMSUB_df:
18122         gen_helper_msa_fmsub_df(cpu_env, tdf, twd, tws, twt);
18123         break;
18124     case OPC_MADD_Q_df:
18125         tcg_gen_movi_i32(tdf, df + 1);
18126         gen_helper_msa_madd_q_df(cpu_env, tdf, twd, tws, twt);
18127         break;
18128     case OPC_FCLE_df:
18129         gen_helper_msa_fcle_df(cpu_env, tdf, twd, tws, twt);
18130         break;
18131     case OPC_MSUB_Q_df:
18132         tcg_gen_movi_i32(tdf, df + 1);
18133         gen_helper_msa_msub_q_df(cpu_env, tdf, twd, tws, twt);
18134         break;
18135     case OPC_FCULE_df:
18136         gen_helper_msa_fcule_df(cpu_env, tdf, twd, tws, twt);
18137         break;
18138     case OPC_FEXP2_df:
18139         gen_helper_msa_fexp2_df(cpu_env, tdf, twd, tws, twt);
18140         break;
18141     case OPC_FSAF_df:
18142         gen_helper_msa_fsaf_df(cpu_env, tdf, twd, tws, twt);
18143         break;
18144     case OPC_FEXDO_df:
18145         gen_helper_msa_fexdo_df(cpu_env, tdf, twd, tws, twt);
18146         break;
18147     case OPC_FSUN_df:
18148         gen_helper_msa_fsun_df(cpu_env, tdf, twd, tws, twt);
18149         break;
18150     case OPC_FSOR_df:
18151         gen_helper_msa_fsor_df(cpu_env, tdf, twd, tws, twt);
18152         break;
18153     case OPC_FSEQ_df:
18154         gen_helper_msa_fseq_df(cpu_env, tdf, twd, tws, twt);
18155         break;
18156     case OPC_FTQ_df:
18157         gen_helper_msa_ftq_df(cpu_env, tdf, twd, tws, twt);
18158         break;
18159     case OPC_FSUNE_df:
18160         gen_helper_msa_fsune_df(cpu_env, tdf, twd, tws, twt);
18161         break;
18162     case OPC_FSUEQ_df:
18163         gen_helper_msa_fsueq_df(cpu_env, tdf, twd, tws, twt);
18164         break;
18165     case OPC_FSNE_df:
18166         gen_helper_msa_fsne_df(cpu_env, tdf, twd, tws, twt);
18167         break;
18168     case OPC_FSLT_df:
18169         gen_helper_msa_fslt_df(cpu_env, tdf, twd, tws, twt);
18170         break;
18171     case OPC_FMIN_df:
18172         gen_helper_msa_fmin_df(cpu_env, tdf, twd, tws, twt);
18173         break;
18174     case OPC_MULR_Q_df:
18175         tcg_gen_movi_i32(tdf, df + 1);
18176         gen_helper_msa_mulr_q_df(cpu_env, tdf, twd, tws, twt);
18177         break;
18178     case OPC_FSULT_df:
18179         gen_helper_msa_fsult_df(cpu_env, tdf, twd, tws, twt);
18180         break;
18181     case OPC_FMIN_A_df:
18182         gen_helper_msa_fmin_a_df(cpu_env, tdf, twd, tws, twt);
18183         break;
18184     case OPC_MADDR_Q_df:
18185         tcg_gen_movi_i32(tdf, df + 1);
18186         gen_helper_msa_maddr_q_df(cpu_env, tdf, twd, tws, twt);
18187         break;
18188     case OPC_FSLE_df:
18189         gen_helper_msa_fsle_df(cpu_env, tdf, twd, tws, twt);
18190         break;
18191     case OPC_FMAX_df:
18192         gen_helper_msa_fmax_df(cpu_env, tdf, twd, tws, twt);
18193         break;
18194     case OPC_MSUBR_Q_df:
18195         tcg_gen_movi_i32(tdf, df + 1);
18196         gen_helper_msa_msubr_q_df(cpu_env, tdf, twd, tws, twt);
18197         break;
18198     case OPC_FSULE_df:
18199         gen_helper_msa_fsule_df(cpu_env, tdf, twd, tws, twt);
18200         break;
18201     case OPC_FMAX_A_df:
18202         gen_helper_msa_fmax_a_df(cpu_env, tdf, twd, tws, twt);
18203         break;
18204     default:
18205         MIPS_INVAL("MSA instruction");
18206         generate_exception(ctx, EXCP_RI);
18207         break;
18208     }
18209
18210     tcg_temp_free_i32(twd);
18211     tcg_temp_free_i32(tws);
18212     tcg_temp_free_i32(twt);
18213     tcg_temp_free_i32(tdf);
18214 }
18215
18216 static void gen_msa_2r(CPUMIPSState *env, DisasContext *ctx)
18217 {
18218 #define MASK_MSA_2R(op)     (MASK_MSA_MINOR(op) | (op & (0x1f << 21)) | \
18219                             (op & (0x7 << 18)))
18220     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
18221     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
18222     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18223     uint8_t df = (ctx->opcode >> 16) & 0x3;
18224     TCGv_i32 twd = tcg_const_i32(wd);
18225     TCGv_i32 tws = tcg_const_i32(ws);
18226     TCGv_i32 twt = tcg_const_i32(wt);
18227     TCGv_i32 tdf = tcg_const_i32(df);
18228
18229     switch (MASK_MSA_2R(ctx->opcode)) {
18230     case OPC_FILL_df:
18231 #if !defined(TARGET_MIPS64)
18232         /* Double format valid only for MIPS64 */
18233         if (df == DF_DOUBLE) {
18234             generate_exception(ctx, EXCP_RI);
18235             break;
18236         }
18237 #endif
18238         gen_helper_msa_fill_df(cpu_env, tdf, twd, tws); /* trs */
18239         break;
18240     case OPC_PCNT_df:
18241         gen_helper_msa_pcnt_df(cpu_env, tdf, twd, tws);
18242         break;
18243     case OPC_NLOC_df:
18244         gen_helper_msa_nloc_df(cpu_env, tdf, twd, tws);
18245         break;
18246     case OPC_NLZC_df:
18247         gen_helper_msa_nlzc_df(cpu_env, tdf, twd, tws);
18248         break;
18249     default:
18250         MIPS_INVAL("MSA instruction");
18251         generate_exception(ctx, EXCP_RI);
18252         break;
18253     }
18254
18255     tcg_temp_free_i32(twd);
18256     tcg_temp_free_i32(tws);
18257     tcg_temp_free_i32(twt);
18258     tcg_temp_free_i32(tdf);
18259 }
18260
18261 static void gen_msa_2rf(CPUMIPSState *env, DisasContext *ctx)
18262 {
18263 #define MASK_MSA_2RF(op)    (MASK_MSA_MINOR(op) | (op & (0x1f << 21)) | \
18264                             (op & (0xf << 17)))
18265     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
18266     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
18267     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18268     uint8_t df = (ctx->opcode >> 16) & 0x1;
18269     TCGv_i32 twd = tcg_const_i32(wd);
18270     TCGv_i32 tws = tcg_const_i32(ws);
18271     TCGv_i32 twt = tcg_const_i32(wt);
18272     /* adjust df value for floating-point instruction */
18273     TCGv_i32 tdf = tcg_const_i32(df + 2);
18274
18275     switch (MASK_MSA_2RF(ctx->opcode)) {
18276     case OPC_FCLASS_df:
18277         gen_helper_msa_fclass_df(cpu_env, tdf, twd, tws);
18278         break;
18279     case OPC_FTRUNC_S_df:
18280         gen_helper_msa_ftrunc_s_df(cpu_env, tdf, twd, tws);
18281         break;
18282     case OPC_FTRUNC_U_df:
18283         gen_helper_msa_ftrunc_u_df(cpu_env, tdf, twd, tws);
18284         break;
18285     case OPC_FSQRT_df:
18286         gen_helper_msa_fsqrt_df(cpu_env, tdf, twd, tws);
18287         break;
18288     case OPC_FRSQRT_df:
18289         gen_helper_msa_frsqrt_df(cpu_env, tdf, twd, tws);
18290         break;
18291     case OPC_FRCP_df:
18292         gen_helper_msa_frcp_df(cpu_env, tdf, twd, tws);
18293         break;
18294     case OPC_FRINT_df:
18295         gen_helper_msa_frint_df(cpu_env, tdf, twd, tws);
18296         break;
18297     case OPC_FLOG2_df:
18298         gen_helper_msa_flog2_df(cpu_env, tdf, twd, tws);
18299         break;
18300     case OPC_FEXUPL_df:
18301         gen_helper_msa_fexupl_df(cpu_env, tdf, twd, tws);
18302         break;
18303     case OPC_FEXUPR_df:
18304         gen_helper_msa_fexupr_df(cpu_env, tdf, twd, tws);
18305         break;
18306     case OPC_FFQL_df:
18307         gen_helper_msa_ffql_df(cpu_env, tdf, twd, tws);
18308         break;
18309     case OPC_FFQR_df:
18310         gen_helper_msa_ffqr_df(cpu_env, tdf, twd, tws);
18311         break;
18312     case OPC_FTINT_S_df:
18313         gen_helper_msa_ftint_s_df(cpu_env, tdf, twd, tws);
18314         break;
18315     case OPC_FTINT_U_df:
18316         gen_helper_msa_ftint_u_df(cpu_env, tdf, twd, tws);
18317         break;
18318     case OPC_FFINT_S_df:
18319         gen_helper_msa_ffint_s_df(cpu_env, tdf, twd, tws);
18320         break;
18321     case OPC_FFINT_U_df:
18322         gen_helper_msa_ffint_u_df(cpu_env, tdf, twd, tws);
18323         break;
18324     }
18325
18326     tcg_temp_free_i32(twd);
18327     tcg_temp_free_i32(tws);
18328     tcg_temp_free_i32(twt);
18329     tcg_temp_free_i32(tdf);
18330 }
18331
18332 static void gen_msa_vec_v(CPUMIPSState *env, DisasContext *ctx)
18333 {
18334 #define MASK_MSA_VEC(op)    (MASK_MSA_MINOR(op) | (op & (0x1f << 21)))
18335     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
18336     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
18337     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18338     TCGv_i32 twd = tcg_const_i32(wd);
18339     TCGv_i32 tws = tcg_const_i32(ws);
18340     TCGv_i32 twt = tcg_const_i32(wt);
18341
18342     switch (MASK_MSA_VEC(ctx->opcode)) {
18343     case OPC_AND_V:
18344         gen_helper_msa_and_v(cpu_env, twd, tws, twt);
18345         break;
18346     case OPC_OR_V:
18347         gen_helper_msa_or_v(cpu_env, twd, tws, twt);
18348         break;
18349     case OPC_NOR_V:
18350         gen_helper_msa_nor_v(cpu_env, twd, tws, twt);
18351         break;
18352     case OPC_XOR_V:
18353         gen_helper_msa_xor_v(cpu_env, twd, tws, twt);
18354         break;
18355     case OPC_BMNZ_V:
18356         gen_helper_msa_bmnz_v(cpu_env, twd, tws, twt);
18357         break;
18358     case OPC_BMZ_V:
18359         gen_helper_msa_bmz_v(cpu_env, twd, tws, twt);
18360         break;
18361     case OPC_BSEL_V:
18362         gen_helper_msa_bsel_v(cpu_env, twd, tws, twt);
18363         break;
18364     default:
18365         MIPS_INVAL("MSA instruction");
18366         generate_exception(ctx, EXCP_RI);
18367         break;
18368     }
18369
18370     tcg_temp_free_i32(twd);
18371     tcg_temp_free_i32(tws);
18372     tcg_temp_free_i32(twt);
18373 }
18374
18375 static void gen_msa_vec(CPUMIPSState *env, DisasContext *ctx)
18376 {
18377     switch (MASK_MSA_VEC(ctx->opcode)) {
18378     case OPC_AND_V:
18379     case OPC_OR_V:
18380     case OPC_NOR_V:
18381     case OPC_XOR_V:
18382     case OPC_BMNZ_V:
18383     case OPC_BMZ_V:
18384     case OPC_BSEL_V:
18385         gen_msa_vec_v(env, ctx);
18386         break;
18387     case OPC_MSA_2R:
18388         gen_msa_2r(env, ctx);
18389         break;
18390     case OPC_MSA_2RF:
18391         gen_msa_2rf(env, ctx);
18392         break;
18393     default:
18394         MIPS_INVAL("MSA instruction");
18395         generate_exception(ctx, EXCP_RI);
18396         break;
18397     }
18398 }
18399
18400 static void gen_msa(CPUMIPSState *env, DisasContext *ctx)
18401 {
18402     uint32_t opcode = ctx->opcode;
18403     check_insn(ctx, ASE_MSA);
18404     check_msa_access(ctx);
18405
18406     switch (MASK_MSA_MINOR(opcode)) {
18407     case OPC_MSA_I8_00:
18408     case OPC_MSA_I8_01:
18409     case OPC_MSA_I8_02:
18410         gen_msa_i8(env, ctx);
18411         break;
18412     case OPC_MSA_I5_06:
18413     case OPC_MSA_I5_07:
18414         gen_msa_i5(env, ctx);
18415         break;
18416     case OPC_MSA_BIT_09:
18417     case OPC_MSA_BIT_0A:
18418         gen_msa_bit(env, ctx);
18419         break;
18420     case OPC_MSA_3R_0D:
18421     case OPC_MSA_3R_0E:
18422     case OPC_MSA_3R_0F:
18423     case OPC_MSA_3R_10:
18424     case OPC_MSA_3R_11:
18425     case OPC_MSA_3R_12:
18426     case OPC_MSA_3R_13:
18427     case OPC_MSA_3R_14:
18428     case OPC_MSA_3R_15:
18429         gen_msa_3r(env, ctx);
18430         break;
18431     case OPC_MSA_ELM:
18432         gen_msa_elm(env, ctx);
18433         break;
18434     case OPC_MSA_3RF_1A:
18435     case OPC_MSA_3RF_1B:
18436     case OPC_MSA_3RF_1C:
18437         gen_msa_3rf(env, ctx);
18438         break;
18439     case OPC_MSA_VEC:
18440         gen_msa_vec(env, ctx);
18441         break;
18442     case OPC_LD_B:
18443     case OPC_LD_H:
18444     case OPC_LD_W:
18445     case OPC_LD_D:
18446     case OPC_ST_B:
18447     case OPC_ST_H:
18448     case OPC_ST_W:
18449     case OPC_ST_D:
18450         {
18451             int32_t s10 = sextract32(ctx->opcode, 16, 10);
18452             uint8_t rs = (ctx->opcode >> 11) & 0x1f;
18453             uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18454             uint8_t df = (ctx->opcode >> 0) & 0x3;
18455
18456             TCGv_i32 twd = tcg_const_i32(wd);
18457             TCGv taddr = tcg_temp_new();
18458             gen_base_offset_addr(ctx, taddr, rs, s10 << df);
18459
18460             switch (MASK_MSA_MINOR(opcode)) {
18461             case OPC_LD_B:
18462                 gen_helper_msa_ld_b(cpu_env, twd, taddr);
18463                 break;
18464             case OPC_LD_H:
18465                 gen_helper_msa_ld_h(cpu_env, twd, taddr);
18466                 break;
18467             case OPC_LD_W:
18468                 gen_helper_msa_ld_w(cpu_env, twd, taddr);
18469                 break;
18470             case OPC_LD_D:
18471                 gen_helper_msa_ld_d(cpu_env, twd, taddr);
18472                 break;
18473             case OPC_ST_B:
18474                 gen_helper_msa_st_b(cpu_env, twd, taddr);
18475                 break;
18476             case OPC_ST_H:
18477                 gen_helper_msa_st_h(cpu_env, twd, taddr);
18478                 break;
18479             case OPC_ST_W:
18480                 gen_helper_msa_st_w(cpu_env, twd, taddr);
18481                 break;
18482             case OPC_ST_D:
18483                 gen_helper_msa_st_d(cpu_env, twd, taddr);
18484                 break;
18485             }
18486
18487             tcg_temp_free_i32(twd);
18488             tcg_temp_free(taddr);
18489         }
18490         break;
18491     default:
18492         MIPS_INVAL("MSA instruction");
18493         generate_exception(ctx, EXCP_RI);
18494         break;
18495     }
18496
18497 }
18498
18499 static void decode_opc(CPUMIPSState *env, DisasContext *ctx)
18500 {
18501     int32_t offset;
18502     int rs, rt, rd, sa;
18503     uint32_t op, op1;
18504     int16_t imm;
18505
18506     /* make sure instructions are on a word boundary */
18507     if (ctx->pc & 0x3) {
18508         env->CP0_BadVAddr = ctx->pc;
18509         generate_exception_err(ctx, EXCP_AdEL, EXCP_INST_NOTAVAIL);
18510         ctx->bstate = BS_STOP;
18511         return;
18512     }
18513
18514     /* Handle blikely not taken case */
18515     if ((ctx->hflags & MIPS_HFLAG_BMASK_BASE) == MIPS_HFLAG_BL) {
18516         TCGLabel *l1 = gen_new_label();
18517
18518         MIPS_DEBUG("blikely condition (" TARGET_FMT_lx ")", ctx->pc + 4);
18519         tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
18520         tcg_gen_movi_i32(hflags, ctx->hflags & ~MIPS_HFLAG_BMASK);
18521         gen_goto_tb(ctx, 1, ctx->pc + 4);
18522         gen_set_label(l1);
18523     }
18524
18525     if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) {
18526         tcg_gen_debug_insn_start(ctx->pc);
18527     }
18528
18529     op = MASK_OP_MAJOR(ctx->opcode);
18530     rs = (ctx->opcode >> 21) & 0x1f;
18531     rt = (ctx->opcode >> 16) & 0x1f;
18532     rd = (ctx->opcode >> 11) & 0x1f;
18533     sa = (ctx->opcode >> 6) & 0x1f;
18534     imm = (int16_t)ctx->opcode;
18535     switch (op) {
18536     case OPC_SPECIAL:
18537         decode_opc_special(env, ctx);
18538         break;
18539     case OPC_SPECIAL2:
18540         decode_opc_special2_legacy(env, ctx);
18541         break;
18542     case OPC_SPECIAL3:
18543         decode_opc_special3(env, ctx);
18544         break;
18545     case OPC_REGIMM:
18546         op1 = MASK_REGIMM(ctx->opcode);
18547         switch (op1) {
18548         case OPC_BLTZL: /* REGIMM branches */
18549         case OPC_BGEZL:
18550         case OPC_BLTZALL:
18551         case OPC_BGEZALL:
18552             check_insn(ctx, ISA_MIPS2);
18553             check_insn_opc_removed(ctx, ISA_MIPS32R6);
18554             /* Fallthrough */
18555         case OPC_BLTZ:
18556         case OPC_BGEZ:
18557             gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
18558             break;
18559         case OPC_BLTZAL:
18560         case OPC_BGEZAL:
18561             if (ctx->insn_flags & ISA_MIPS32R6) {
18562                 if (rs == 0) {
18563                     /* OPC_NAL, OPC_BAL */
18564                     gen_compute_branch(ctx, op1, 4, 0, -1, imm << 2, 4);
18565                 } else {
18566                     generate_exception(ctx, EXCP_RI);
18567                 }
18568             } else {
18569                 gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
18570             }
18571             break;
18572         case OPC_TGEI ... OPC_TEQI: /* REGIMM traps */
18573         case OPC_TNEI:
18574             check_insn(ctx, ISA_MIPS2);
18575             check_insn_opc_removed(ctx, ISA_MIPS32R6);
18576             gen_trap(ctx, op1, rs, -1, imm);
18577             break;
18578         case OPC_SYNCI:
18579             check_insn(ctx, ISA_MIPS32R2);
18580             /* Break the TB to be able to sync copied instructions
18581                immediately */
18582             ctx->bstate = BS_STOP;
18583             break;
18584         case OPC_BPOSGE32:    /* MIPS DSP branch */
18585 #if defined(TARGET_MIPS64)
18586         case OPC_BPOSGE64:
18587 #endif
18588             check_dsp(ctx);
18589             gen_compute_branch(ctx, op1, 4, -1, -2, (int32_t)imm << 2, 4);
18590             break;
18591 #if defined(TARGET_MIPS64)
18592         case OPC_DAHI:
18593             check_insn(ctx, ISA_MIPS32R6);
18594             check_mips_64(ctx);
18595             if (rs != 0) {
18596                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 32);
18597             }
18598             MIPS_DEBUG("dahi %s, %04x", regnames[rs], imm);
18599             break;
18600         case OPC_DATI:
18601             check_insn(ctx, ISA_MIPS32R6);
18602             check_mips_64(ctx);
18603             if (rs != 0) {
18604                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 48);
18605             }
18606             MIPS_DEBUG("dati %s, %04x", regnames[rs], imm);
18607             break;
18608 #endif
18609         default:            /* Invalid */
18610             MIPS_INVAL("regimm");
18611             generate_exception(ctx, EXCP_RI);
18612             break;
18613         }
18614         break;
18615     case OPC_CP0:
18616         check_cp0_enabled(ctx);
18617         op1 = MASK_CP0(ctx->opcode);
18618         switch (op1) {
18619         case OPC_MFC0:
18620         case OPC_MTC0:
18621         case OPC_MFTR:
18622         case OPC_MTTR:
18623 #if defined(TARGET_MIPS64)
18624         case OPC_DMFC0:
18625         case OPC_DMTC0:
18626 #endif
18627 #ifndef CONFIG_USER_ONLY
18628             gen_cp0(env, ctx, op1, rt, rd);
18629 #endif /* !CONFIG_USER_ONLY */
18630             break;
18631         case OPC_C0_FIRST ... OPC_C0_LAST:
18632 #ifndef CONFIG_USER_ONLY
18633             gen_cp0(env, ctx, MASK_C0(ctx->opcode), rt, rd);
18634 #endif /* !CONFIG_USER_ONLY */
18635             break;
18636         case OPC_MFMC0:
18637 #ifndef CONFIG_USER_ONLY
18638             {
18639                 uint32_t op2;
18640                 TCGv t0 = tcg_temp_new();
18641
18642                 op2 = MASK_MFMC0(ctx->opcode);
18643                 switch (op2) {
18644                 case OPC_DMT:
18645                     check_insn(ctx, ASE_MT);
18646                     gen_helper_dmt(t0);
18647                     gen_store_gpr(t0, rt);
18648                     break;
18649                 case OPC_EMT:
18650                     check_insn(ctx, ASE_MT);
18651                     gen_helper_emt(t0);
18652                     gen_store_gpr(t0, rt);
18653                     break;
18654                 case OPC_DVPE:
18655                     check_insn(ctx, ASE_MT);
18656                     gen_helper_dvpe(t0, cpu_env);
18657                     gen_store_gpr(t0, rt);
18658                     break;
18659                 case OPC_EVPE:
18660                     check_insn(ctx, ASE_MT);
18661                     gen_helper_evpe(t0, cpu_env);
18662                     gen_store_gpr(t0, rt);
18663                     break;
18664                 case OPC_DI:
18665                     check_insn(ctx, ISA_MIPS32R2);
18666                     save_cpu_state(ctx, 1);
18667                     gen_helper_di(t0, cpu_env);
18668                     gen_store_gpr(t0, rt);
18669                     /* Stop translation as we may have switched
18670                        the execution mode.  */
18671                     ctx->bstate = BS_STOP;
18672                     break;
18673                 case OPC_EI:
18674                     check_insn(ctx, ISA_MIPS32R2);
18675                     save_cpu_state(ctx, 1);
18676                     gen_helper_ei(t0, cpu_env);
18677                     gen_store_gpr(t0, rt);
18678                     /* Stop translation as we may have switched
18679                        the execution mode.  */
18680                     ctx->bstate = BS_STOP;
18681                     break;
18682                 default:            /* Invalid */
18683                     MIPS_INVAL("mfmc0");
18684                     generate_exception(ctx, EXCP_RI);
18685                     break;
18686                 }
18687                 tcg_temp_free(t0);
18688             }
18689 #endif /* !CONFIG_USER_ONLY */
18690             break;
18691         case OPC_RDPGPR:
18692             check_insn(ctx, ISA_MIPS32R2);
18693             gen_load_srsgpr(rt, rd);
18694             break;
18695         case OPC_WRPGPR:
18696             check_insn(ctx, ISA_MIPS32R2);
18697             gen_store_srsgpr(rt, rd);
18698             break;
18699         default:
18700             MIPS_INVAL("cp0");
18701             generate_exception(ctx, EXCP_RI);
18702             break;
18703         }
18704         break;
18705     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC, OPC_ADDI */
18706         if (ctx->insn_flags & ISA_MIPS32R6) {
18707             /* OPC_BOVC, OPC_BEQZALC, OPC_BEQC */
18708             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
18709         } else {
18710             /* OPC_ADDI */
18711             /* Arithmetic with immediate opcode */
18712             gen_arith_imm(ctx, op, rt, rs, imm);
18713         }
18714         break;
18715     case OPC_ADDIU:
18716          gen_arith_imm(ctx, op, rt, rs, imm);
18717          break;
18718     case OPC_SLTI: /* Set on less than with immediate opcode */
18719     case OPC_SLTIU:
18720          gen_slt_imm(ctx, op, rt, rs, imm);
18721          break;
18722     case OPC_ANDI: /* Arithmetic with immediate opcode */
18723     case OPC_LUI: /* OPC_AUI */
18724     case OPC_ORI:
18725     case OPC_XORI:
18726          gen_logic_imm(ctx, op, rt, rs, imm);
18727          break;
18728     case OPC_J ... OPC_JAL: /* Jump */
18729          offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
18730          gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
18731          break;
18732     /* Branch */
18733     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC, OPC_BLEZL */
18734         if (ctx->insn_flags & ISA_MIPS32R6) {
18735             if (rt == 0) {
18736                 generate_exception(ctx, EXCP_RI);
18737                 break;
18738             }
18739             /* OPC_BLEZC, OPC_BGEZC, OPC_BGEC */
18740             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
18741         } else {
18742             /* OPC_BLEZL */
18743             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
18744         }
18745         break;
18746     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC, OPC_BGTZL */
18747         if (ctx->insn_flags & ISA_MIPS32R6) {
18748             if (rt == 0) {
18749                 generate_exception(ctx, EXCP_RI);
18750                 break;
18751             }
18752             /* OPC_BGTZC, OPC_BLTZC, OPC_BLTC */
18753             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
18754         } else {
18755             /* OPC_BGTZL */
18756             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
18757         }
18758         break;
18759     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC, OPC_BLEZ */
18760         if (rt == 0) {
18761             /* OPC_BLEZ */
18762             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
18763         } else {
18764             check_insn(ctx, ISA_MIPS32R6);
18765             /* OPC_BLEZALC, OPC_BGEZALC, OPC_BGEUC */
18766             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
18767         }
18768         break;
18769     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC, OPC_BGTZ */
18770         if (rt == 0) {
18771             /* OPC_BGTZ */
18772             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
18773         } else {
18774             check_insn(ctx, ISA_MIPS32R6);
18775             /* OPC_BGTZALC, OPC_BLTZALC, OPC_BLTUC */
18776             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
18777         }
18778         break;
18779     case OPC_BEQL:
18780     case OPC_BNEL:
18781         check_insn(ctx, ISA_MIPS2);
18782          check_insn_opc_removed(ctx, ISA_MIPS32R6);
18783         /* Fallthrough */
18784     case OPC_BEQ:
18785     case OPC_BNE:
18786          gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
18787          break;
18788     case OPC_LL: /* Load and stores */
18789         check_insn(ctx, ISA_MIPS2);
18790         /* Fallthrough */
18791     case OPC_LWL:
18792     case OPC_LWR:
18793         check_insn_opc_removed(ctx, ISA_MIPS32R6);
18794          /* Fallthrough */
18795     case OPC_LB ... OPC_LH:
18796     case OPC_LW ... OPC_LHU:
18797          gen_ld(ctx, op, rt, rs, imm);
18798          break;
18799     case OPC_SWL:
18800     case OPC_SWR:
18801         check_insn_opc_removed(ctx, ISA_MIPS32R6);
18802         /* fall through */
18803     case OPC_SB ... OPC_SH:
18804     case OPC_SW:
18805          gen_st(ctx, op, rt, rs, imm);
18806          break;
18807     case OPC_SC:
18808         check_insn(ctx, ISA_MIPS2);
18809          check_insn_opc_removed(ctx, ISA_MIPS32R6);
18810          gen_st_cond(ctx, op, rt, rs, imm);
18811          break;
18812     case OPC_CACHE:
18813         check_insn_opc_removed(ctx, ISA_MIPS32R6);
18814         check_cp0_enabled(ctx);
18815         check_insn(ctx, ISA_MIPS3 | ISA_MIPS32);
18816         /* Treat as NOP. */
18817         break;
18818     case OPC_PREF:
18819         check_insn_opc_removed(ctx, ISA_MIPS32R6);
18820         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
18821         /* Treat as NOP. */
18822         break;
18823
18824     /* Floating point (COP1). */
18825     case OPC_LWC1:
18826     case OPC_LDC1:
18827     case OPC_SWC1:
18828     case OPC_SDC1:
18829         gen_cop1_ldst(ctx, op, rt, rs, imm);
18830         break;
18831
18832     case OPC_CP1:
18833         op1 = MASK_CP1(ctx->opcode);
18834
18835         switch (op1) {
18836         case OPC_MFHC1:
18837         case OPC_MTHC1:
18838             check_cp1_enabled(ctx);
18839             check_insn(ctx, ISA_MIPS32R2);
18840         case OPC_MFC1:
18841         case OPC_CFC1:
18842         case OPC_MTC1:
18843         case OPC_CTC1:
18844             check_cp1_enabled(ctx);
18845             gen_cp1(ctx, op1, rt, rd);
18846             break;
18847 #if defined(TARGET_MIPS64)
18848         case OPC_DMFC1:
18849         case OPC_DMTC1:
18850             check_cp1_enabled(ctx);
18851             check_insn(ctx, ISA_MIPS3);
18852             check_mips_64(ctx);
18853             gen_cp1(ctx, op1, rt, rd);
18854             break;
18855 #endif
18856         case OPC_BC1EQZ: /* OPC_BC1ANY2 */
18857             check_cp1_enabled(ctx);
18858             if (ctx->insn_flags & ISA_MIPS32R6) {
18859                 /* OPC_BC1EQZ */
18860                 gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
18861                                 rt, imm << 2);
18862             } else {
18863                 /* OPC_BC1ANY2 */
18864                 check_cop1x(ctx);
18865                 check_insn(ctx, ASE_MIPS3D);
18866                 gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
18867                                     (rt >> 2) & 0x7, imm << 2);
18868             }
18869             break;
18870         case OPC_BC1NEZ:
18871             check_cp1_enabled(ctx);
18872             check_insn(ctx, ISA_MIPS32R6);
18873             gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
18874                             rt, imm << 2);
18875             break;
18876         case OPC_BC1ANY4:
18877             check_cp1_enabled(ctx);
18878             check_insn_opc_removed(ctx, ISA_MIPS32R6);
18879             check_cop1x(ctx);
18880             check_insn(ctx, ASE_MIPS3D);
18881             /* fall through */
18882         case OPC_BC1:
18883             check_cp1_enabled(ctx);
18884             check_insn_opc_removed(ctx, ISA_MIPS32R6);
18885             gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
18886                                 (rt >> 2) & 0x7, imm << 2);
18887             break;
18888         case OPC_PS_FMT:
18889             check_cp1_enabled(ctx);
18890             check_insn_opc_removed(ctx, ISA_MIPS32R6);
18891             /* fall through */
18892         case OPC_S_FMT:
18893         case OPC_D_FMT:
18894             check_cp1_enabled(ctx);
18895             gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
18896                        (imm >> 8) & 0x7);
18897             break;
18898         case OPC_W_FMT:
18899         case OPC_L_FMT:
18900         {
18901             int r6_op = ctx->opcode & FOP(0x3f, 0x1f);
18902             check_cp1_enabled(ctx);
18903             if (ctx->insn_flags & ISA_MIPS32R6) {
18904                 switch (r6_op) {
18905                 case R6_OPC_CMP_AF_S:
18906                 case R6_OPC_CMP_UN_S:
18907                 case R6_OPC_CMP_EQ_S:
18908                 case R6_OPC_CMP_UEQ_S:
18909                 case R6_OPC_CMP_LT_S:
18910                 case R6_OPC_CMP_ULT_S:
18911                 case R6_OPC_CMP_LE_S:
18912                 case R6_OPC_CMP_ULE_S:
18913                 case R6_OPC_CMP_SAF_S:
18914                 case R6_OPC_CMP_SUN_S:
18915                 case R6_OPC_CMP_SEQ_S:
18916                 case R6_OPC_CMP_SEUQ_S:
18917                 case R6_OPC_CMP_SLT_S:
18918                 case R6_OPC_CMP_SULT_S:
18919                 case R6_OPC_CMP_SLE_S:
18920                 case R6_OPC_CMP_SULE_S:
18921                 case R6_OPC_CMP_OR_S:
18922                 case R6_OPC_CMP_UNE_S:
18923                 case R6_OPC_CMP_NE_S:
18924                 case R6_OPC_CMP_SOR_S:
18925                 case R6_OPC_CMP_SUNE_S:
18926                 case R6_OPC_CMP_SNE_S:
18927                     gen_r6_cmp_s(ctx, ctx->opcode & 0x1f, rt, rd, sa);
18928                     break;
18929                 case R6_OPC_CMP_AF_D:
18930                 case R6_OPC_CMP_UN_D:
18931                 case R6_OPC_CMP_EQ_D:
18932                 case R6_OPC_CMP_UEQ_D:
18933                 case R6_OPC_CMP_LT_D:
18934                 case R6_OPC_CMP_ULT_D:
18935                 case R6_OPC_CMP_LE_D:
18936                 case R6_OPC_CMP_ULE_D:
18937                 case R6_OPC_CMP_SAF_D:
18938                 case R6_OPC_CMP_SUN_D:
18939                 case R6_OPC_CMP_SEQ_D:
18940                 case R6_OPC_CMP_SEUQ_D:
18941                 case R6_OPC_CMP_SLT_D:
18942                 case R6_OPC_CMP_SULT_D:
18943                 case R6_OPC_CMP_SLE_D:
18944                 case R6_OPC_CMP_SULE_D:
18945                 case R6_OPC_CMP_OR_D:
18946                 case R6_OPC_CMP_UNE_D:
18947                 case R6_OPC_CMP_NE_D:
18948                 case R6_OPC_CMP_SOR_D:
18949                 case R6_OPC_CMP_SUNE_D:
18950                 case R6_OPC_CMP_SNE_D:
18951                     gen_r6_cmp_d(ctx, ctx->opcode & 0x1f, rt, rd, sa);
18952                     break;
18953                 default:
18954                     gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f),
18955                                rt, rd, sa, (imm >> 8) & 0x7);
18956
18957                     break;
18958                 }
18959             } else {
18960                 gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
18961                            (imm >> 8) & 0x7);
18962             }
18963             break;
18964         }
18965         case OPC_BZ_V:
18966         case OPC_BNZ_V:
18967         case OPC_BZ_B:
18968         case OPC_BZ_H:
18969         case OPC_BZ_W:
18970         case OPC_BZ_D:
18971         case OPC_BNZ_B:
18972         case OPC_BNZ_H:
18973         case OPC_BNZ_W:
18974         case OPC_BNZ_D:
18975             check_insn(ctx, ASE_MSA);
18976             gen_msa_branch(env, ctx, op1);
18977             break;
18978         default:
18979             MIPS_INVAL("cp1");
18980             generate_exception(ctx, EXCP_RI);
18981             break;
18982         }
18983         break;
18984
18985     /* Compact branches [R6] and COP2 [non-R6] */
18986     case OPC_BC: /* OPC_LWC2 */
18987     case OPC_BALC: /* OPC_SWC2 */
18988         if (ctx->insn_flags & ISA_MIPS32R6) {
18989             /* OPC_BC, OPC_BALC */
18990             gen_compute_compact_branch(ctx, op, 0, 0,
18991                                        sextract32(ctx->opcode << 2, 0, 28));
18992         } else {
18993             /* OPC_LWC2, OPC_SWC2 */
18994             /* COP2: Not implemented. */
18995             generate_exception_err(ctx, EXCP_CpU, 2);
18996         }
18997         break;
18998     case OPC_BEQZC: /* OPC_JIC, OPC_LDC2 */
18999     case OPC_BNEZC: /* OPC_JIALC, OPC_SDC2 */
19000         if (ctx->insn_flags & ISA_MIPS32R6) {
19001             if (rs != 0) {
19002                 /* OPC_BEQZC, OPC_BNEZC */
19003                 gen_compute_compact_branch(ctx, op, rs, 0,
19004                                            sextract32(ctx->opcode << 2, 0, 23));
19005             } else {
19006                 /* OPC_JIC, OPC_JIALC */
19007                 gen_compute_compact_branch(ctx, op, 0, rt, imm);
19008             }
19009         } else {
19010             /* OPC_LWC2, OPC_SWC2 */
19011             /* COP2: Not implemented. */
19012             generate_exception_err(ctx, EXCP_CpU, 2);
19013         }
19014         break;
19015     case OPC_CP2:
19016         check_insn(ctx, INSN_LOONGSON2F);
19017         /* Note that these instructions use different fields.  */
19018         gen_loongson_multimedia(ctx, sa, rd, rt);
19019         break;
19020
19021     case OPC_CP3:
19022         check_insn_opc_removed(ctx, ISA_MIPS32R6);
19023         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
19024             check_cp1_enabled(ctx);
19025             op1 = MASK_CP3(ctx->opcode);
19026             switch (op1) {
19027             case OPC_LUXC1:
19028             case OPC_SUXC1:
19029                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS32R2);
19030                 /* Fallthrough */
19031             case OPC_LWXC1:
19032             case OPC_LDXC1:
19033             case OPC_SWXC1:
19034             case OPC_SDXC1:
19035                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
19036                 gen_flt3_ldst(ctx, op1, sa, rd, rs, rt);
19037                 break;
19038             case OPC_PREFX:
19039                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
19040                 /* Treat as NOP. */
19041                 break;
19042             case OPC_ALNV_PS:
19043                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS32R2);
19044                 /* Fallthrough */
19045             case OPC_MADD_S:
19046             case OPC_MADD_D:
19047             case OPC_MADD_PS:
19048             case OPC_MSUB_S:
19049             case OPC_MSUB_D:
19050             case OPC_MSUB_PS:
19051             case OPC_NMADD_S:
19052             case OPC_NMADD_D:
19053             case OPC_NMADD_PS:
19054             case OPC_NMSUB_S:
19055             case OPC_NMSUB_D:
19056             case OPC_NMSUB_PS:
19057                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
19058                 gen_flt3_arith(ctx, op1, sa, rs, rd, rt);
19059                 break;
19060             default:
19061                 MIPS_INVAL("cp3");
19062                 generate_exception (ctx, EXCP_RI);
19063                 break;
19064             }
19065         } else {
19066             generate_exception_err(ctx, EXCP_CpU, 1);
19067         }
19068         break;
19069
19070 #if defined(TARGET_MIPS64)
19071     /* MIPS64 opcodes */
19072     case OPC_LDL ... OPC_LDR:
19073     case OPC_LLD:
19074         check_insn_opc_removed(ctx, ISA_MIPS32R6);
19075         /* fall through */
19076     case OPC_LWU:
19077     case OPC_LD:
19078         check_insn(ctx, ISA_MIPS3);
19079         check_mips_64(ctx);
19080         gen_ld(ctx, op, rt, rs, imm);
19081         break;
19082     case OPC_SDL ... OPC_SDR:
19083         check_insn_opc_removed(ctx, ISA_MIPS32R6);
19084         /* fall through */
19085     case OPC_SD:
19086         check_insn(ctx, ISA_MIPS3);
19087         check_mips_64(ctx);
19088         gen_st(ctx, op, rt, rs, imm);
19089         break;
19090     case OPC_SCD:
19091         check_insn_opc_removed(ctx, ISA_MIPS32R6);
19092         check_insn(ctx, ISA_MIPS3);
19093         check_mips_64(ctx);
19094         gen_st_cond(ctx, op, rt, rs, imm);
19095         break;
19096     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC, OPC_DADDI */
19097         if (ctx->insn_flags & ISA_MIPS32R6) {
19098             /* OPC_BNVC, OPC_BNEZALC, OPC_BNEC */
19099             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
19100         } else {
19101             /* OPC_DADDI */
19102             check_insn(ctx, ISA_MIPS3);
19103             check_mips_64(ctx);
19104             gen_arith_imm(ctx, op, rt, rs, imm);
19105         }
19106         break;
19107     case OPC_DADDIU:
19108         check_insn(ctx, ISA_MIPS3);
19109         check_mips_64(ctx);
19110         gen_arith_imm(ctx, op, rt, rs, imm);
19111         break;
19112 #else
19113     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
19114         if (ctx->insn_flags & ISA_MIPS32R6) {
19115             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
19116         } else {
19117             MIPS_INVAL("major opcode");
19118             generate_exception(ctx, EXCP_RI);
19119         }
19120         break;
19121 #endif
19122     case OPC_DAUI: /* OPC_JALX */
19123         if (ctx->insn_flags & ISA_MIPS32R6) {
19124 #if defined(TARGET_MIPS64)
19125             /* OPC_DAUI */
19126             check_mips_64(ctx);
19127             if (rt != 0) {
19128                 TCGv t0 = tcg_temp_new();
19129                 gen_load_gpr(t0, rs);
19130                 tcg_gen_addi_tl(cpu_gpr[rt], t0, imm << 16);
19131                 tcg_temp_free(t0);
19132             }
19133             MIPS_DEBUG("daui %s, %s, %04x", regnames[rt], regnames[rs], imm);
19134 #else
19135             generate_exception(ctx, EXCP_RI);
19136             MIPS_INVAL("major opcode");
19137 #endif
19138         } else {
19139             /* OPC_JALX */
19140             check_insn(ctx, ASE_MIPS16 | ASE_MICROMIPS);
19141             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
19142             gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
19143         }
19144         break;
19145     case OPC_MSA: /* OPC_MDMX */
19146         /* MDMX: Not implemented. */
19147         gen_msa(env, ctx);
19148         break;
19149     case OPC_PCREL:
19150         check_insn(ctx, ISA_MIPS32R6);
19151         gen_pcrel(ctx, rs, imm);
19152         break;
19153     default:            /* Invalid */
19154         MIPS_INVAL("major opcode");
19155         generate_exception(ctx, EXCP_RI);
19156         break;
19157     }
19158 }
19159
19160 static inline void
19161 gen_intermediate_code_internal(MIPSCPU *cpu, TranslationBlock *tb,
19162                                bool search_pc)
19163 {
19164     CPUState *cs = CPU(cpu);
19165     CPUMIPSState *env = &cpu->env;
19166     DisasContext ctx;
19167     target_ulong pc_start;
19168     target_ulong next_page_start;
19169     CPUBreakpoint *bp;
19170     int j, lj = -1;
19171     int num_insns;
19172     int max_insns;
19173     int insn_bytes;
19174     int is_slot;
19175
19176     if (search_pc)
19177         qemu_log("search pc %d\n", search_pc);
19178
19179     pc_start = tb->pc;
19180     next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE;
19181     ctx.pc = pc_start;
19182     ctx.saved_pc = -1;
19183     ctx.singlestep_enabled = cs->singlestep_enabled;
19184     ctx.insn_flags = env->insn_flags;
19185     ctx.CP0_Config1 = env->CP0_Config1;
19186     ctx.tb = tb;
19187     ctx.bstate = BS_NONE;
19188     ctx.kscrexist = (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff;
19189     ctx.rxi = (env->CP0_Config3 >> CP0C3_RXI) & 1;
19190     ctx.ie = (env->CP0_Config4 >> CP0C4_IE) & 3;
19191     ctx.bi = (env->CP0_Config3 >> CP0C3_BI) & 1;
19192     ctx.bp = (env->CP0_Config3 >> CP0C3_BP) & 1;
19193     /* Restore delay slot state from the tb context.  */
19194     ctx.hflags = (uint32_t)tb->flags; /* FIXME: maybe use 64 bits here? */
19195     ctx.ulri = (env->CP0_Config3 >> CP0C3_ULRI) & 1;
19196     restore_cpu_state(env, &ctx);
19197 #ifdef CONFIG_USER_ONLY
19198         ctx.mem_idx = MIPS_HFLAG_UM;
19199 #else
19200         ctx.mem_idx = ctx.hflags & MIPS_HFLAG_KSU;
19201 #endif
19202     ctx.default_tcg_memop_mask = (ctx.insn_flags & ISA_MIPS32R6) ?
19203                                  MO_UNALN : MO_ALIGN;
19204     num_insns = 0;
19205     max_insns = tb->cflags & CF_COUNT_MASK;
19206     if (max_insns == 0)
19207         max_insns = CF_COUNT_MASK;
19208     LOG_DISAS("\ntb %p idx %d hflags %04x\n", tb, ctx.mem_idx, ctx.hflags);
19209     gen_tb_start(tb);
19210     while (ctx.bstate == BS_NONE) {
19211         if (unlikely(!QTAILQ_EMPTY(&cs->breakpoints))) {
19212             QTAILQ_FOREACH(bp, &cs->breakpoints, entry) {
19213                 if (bp->pc == ctx.pc) {
19214                     save_cpu_state(&ctx, 1);
19215                     ctx.bstate = BS_BRANCH;
19216                     gen_helper_0e0i(raise_exception, EXCP_DEBUG);
19217                     /* Include the breakpoint location or the tb won't
19218                      * be flushed when it must be.  */
19219                     ctx.pc += 4;
19220                     goto done_generating;
19221                 }
19222             }
19223         }
19224
19225         if (search_pc) {
19226             j = tcg_op_buf_count();
19227             if (lj < j) {
19228                 lj++;
19229                 while (lj < j)
19230                     tcg_ctx.gen_opc_instr_start[lj++] = 0;
19231             }
19232             tcg_ctx.gen_opc_pc[lj] = ctx.pc;
19233             gen_opc_hflags[lj] = ctx.hflags & MIPS_HFLAG_BMASK;
19234             gen_opc_btarget[lj] = ctx.btarget;
19235             tcg_ctx.gen_opc_instr_start[lj] = 1;
19236             tcg_ctx.gen_opc_icount[lj] = num_insns;
19237         }
19238         if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
19239             gen_io_start();
19240
19241         is_slot = ctx.hflags & MIPS_HFLAG_BMASK;
19242         if (!(ctx.hflags & MIPS_HFLAG_M16)) {
19243             ctx.opcode = cpu_ldl_code(env, ctx.pc);
19244             insn_bytes = 4;
19245             decode_opc(env, &ctx);
19246         } else if (ctx.insn_flags & ASE_MICROMIPS) {
19247             ctx.opcode = cpu_lduw_code(env, ctx.pc);
19248             insn_bytes = decode_micromips_opc(env, &ctx);
19249         } else if (ctx.insn_flags & ASE_MIPS16) {
19250             ctx.opcode = cpu_lduw_code(env, ctx.pc);
19251             insn_bytes = decode_mips16_opc(env, &ctx);
19252         } else {
19253             generate_exception(&ctx, EXCP_RI);
19254             ctx.bstate = BS_STOP;
19255             break;
19256         }
19257
19258         if (ctx.hflags & MIPS_HFLAG_BMASK) {
19259             if (!(ctx.hflags & (MIPS_HFLAG_BDS16 | MIPS_HFLAG_BDS32 |
19260                                 MIPS_HFLAG_FBNSLOT))) {
19261                 /* force to generate branch as there is neither delay nor
19262                    forbidden slot */
19263                 is_slot = 1;
19264             }
19265         }
19266         if (is_slot) {
19267             gen_branch(&ctx, insn_bytes);
19268         }
19269         ctx.pc += insn_bytes;
19270
19271         num_insns++;
19272
19273         /* Execute a branch and its delay slot as a single instruction.
19274            This is what GDB expects and is consistent with what the
19275            hardware does (e.g. if a delay slot instruction faults, the
19276            reported PC is the PC of the branch).  */
19277         if (cs->singlestep_enabled && (ctx.hflags & MIPS_HFLAG_BMASK) == 0) {
19278             break;
19279         }
19280
19281         if (ctx.pc >= next_page_start) {
19282             break;
19283         }
19284
19285         if (tcg_op_buf_full()) {
19286             break;
19287         }
19288
19289         if (num_insns >= max_insns)
19290             break;
19291
19292         if (singlestep)
19293             break;
19294     }
19295     if (tb->cflags & CF_LAST_IO) {
19296         gen_io_end();
19297     }
19298     if (cs->singlestep_enabled && ctx.bstate != BS_BRANCH) {
19299         save_cpu_state(&ctx, ctx.bstate != BS_EXCP);
19300         gen_helper_0e0i(raise_exception, EXCP_DEBUG);
19301     } else {
19302         switch (ctx.bstate) {
19303         case BS_STOP:
19304             gen_goto_tb(&ctx, 0, ctx.pc);
19305             break;
19306         case BS_NONE:
19307             save_cpu_state(&ctx, 0);
19308             gen_goto_tb(&ctx, 0, ctx.pc);
19309             break;
19310         case BS_EXCP:
19311             tcg_gen_exit_tb(0);
19312             break;
19313         case BS_BRANCH:
19314         default:
19315             break;
19316         }
19317     }
19318 done_generating:
19319     gen_tb_end(tb, num_insns);
19320
19321     if (search_pc) {
19322         j = tcg_op_buf_count();
19323         lj++;
19324         while (lj <= j)
19325             tcg_ctx.gen_opc_instr_start[lj++] = 0;
19326     } else {
19327         tb->size = ctx.pc - pc_start;
19328         tb->icount = num_insns;
19329     }
19330 #ifdef DEBUG_DISAS
19331     LOG_DISAS("\n");
19332     if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
19333         qemu_log("IN: %s\n", lookup_symbol(pc_start));
19334         log_target_disas(env, pc_start, ctx.pc - pc_start, 0);
19335         qemu_log("\n");
19336     }
19337 #endif
19338 }
19339
19340 void gen_intermediate_code (CPUMIPSState *env, struct TranslationBlock *tb)
19341 {
19342     gen_intermediate_code_internal(mips_env_get_cpu(env), tb, false);
19343 }
19344
19345 void gen_intermediate_code_pc (CPUMIPSState *env, struct TranslationBlock *tb)
19346 {
19347     gen_intermediate_code_internal(mips_env_get_cpu(env), tb, true);
19348 }
19349
19350 static void fpu_dump_state(CPUMIPSState *env, FILE *f, fprintf_function fpu_fprintf,
19351                            int flags)
19352 {
19353     int i;
19354     int is_fpu64 = !!(env->hflags & MIPS_HFLAG_F64);
19355
19356 #define printfpr(fp)                                                    \
19357     do {                                                                \
19358         if (is_fpu64)                                                   \
19359             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
19360                         " fd:%13g fs:%13g psu: %13g\n",                 \
19361                         (fp)->w[FP_ENDIAN_IDX], (fp)->d,                \
19362                         (double)(fp)->fd,                               \
19363                         (double)(fp)->fs[FP_ENDIAN_IDX],                \
19364                         (double)(fp)->fs[!FP_ENDIAN_IDX]);              \
19365         else {                                                          \
19366             fpr_t tmp;                                                  \
19367             tmp.w[FP_ENDIAN_IDX] = (fp)->w[FP_ENDIAN_IDX];              \
19368             tmp.w[!FP_ENDIAN_IDX] = ((fp) + 1)->w[FP_ENDIAN_IDX];       \
19369             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
19370                         " fd:%13g fs:%13g psu:%13g\n",                  \
19371                         tmp.w[FP_ENDIAN_IDX], tmp.d,                    \
19372                         (double)tmp.fd,                                 \
19373                         (double)tmp.fs[FP_ENDIAN_IDX],                  \
19374                         (double)tmp.fs[!FP_ENDIAN_IDX]);                \
19375         }                                                               \
19376     } while(0)
19377
19378
19379     fpu_fprintf(f, "CP1 FCR0 0x%08x  FCR31 0x%08x  SR.FR %d  fp_status 0x%02x\n",
19380                 env->active_fpu.fcr0, env->active_fpu.fcr31, is_fpu64,
19381                 get_float_exception_flags(&env->active_fpu.fp_status));
19382     for (i = 0; i < 32; (is_fpu64) ? i++ : (i += 2)) {
19383         fpu_fprintf(f, "%3s: ", fregnames[i]);
19384         printfpr(&env->active_fpu.fpr[i]);
19385     }
19386
19387 #undef printfpr
19388 }
19389
19390 #if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS)
19391 /* Debug help: The architecture requires 32bit code to maintain proper
19392    sign-extended values on 64bit machines.  */
19393
19394 #define SIGN_EXT_P(val) ((((val) & ~0x7fffffff) == 0) || (((val) & ~0x7fffffff) == ~0x7fffffff))
19395
19396 static void
19397 cpu_mips_check_sign_extensions (CPUMIPSState *env, FILE *f,
19398                                 fprintf_function cpu_fprintf,
19399                                 int flags)
19400 {
19401     int i;
19402
19403     if (!SIGN_EXT_P(env->active_tc.PC))
19404         cpu_fprintf(f, "BROKEN: pc=0x" TARGET_FMT_lx "\n", env->active_tc.PC);
19405     if (!SIGN_EXT_P(env->active_tc.HI[0]))
19406         cpu_fprintf(f, "BROKEN: HI=0x" TARGET_FMT_lx "\n", env->active_tc.HI[0]);
19407     if (!SIGN_EXT_P(env->active_tc.LO[0]))
19408         cpu_fprintf(f, "BROKEN: LO=0x" TARGET_FMT_lx "\n", env->active_tc.LO[0]);
19409     if (!SIGN_EXT_P(env->btarget))
19410         cpu_fprintf(f, "BROKEN: btarget=0x" TARGET_FMT_lx "\n", env->btarget);
19411
19412     for (i = 0; i < 32; i++) {
19413         if (!SIGN_EXT_P(env->active_tc.gpr[i]))
19414             cpu_fprintf(f, "BROKEN: %s=0x" TARGET_FMT_lx "\n", regnames[i], env->active_tc.gpr[i]);
19415     }
19416
19417     if (!SIGN_EXT_P(env->CP0_EPC))
19418         cpu_fprintf(f, "BROKEN: EPC=0x" TARGET_FMT_lx "\n", env->CP0_EPC);
19419     if (!SIGN_EXT_P(env->lladdr))
19420         cpu_fprintf(f, "BROKEN: LLAddr=0x" TARGET_FMT_lx "\n", env->lladdr);
19421 }
19422 #endif
19423
19424 void mips_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
19425                          int flags)
19426 {
19427     MIPSCPU *cpu = MIPS_CPU(cs);
19428     CPUMIPSState *env = &cpu->env;
19429     int i;
19430
19431     cpu_fprintf(f, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx
19432                 " LO=0x" TARGET_FMT_lx " ds %04x "
19433                 TARGET_FMT_lx " " TARGET_FMT_ld "\n",
19434                 env->active_tc.PC, env->active_tc.HI[0], env->active_tc.LO[0],
19435                 env->hflags, env->btarget, env->bcond);
19436     for (i = 0; i < 32; i++) {
19437         if ((i & 3) == 0)
19438             cpu_fprintf(f, "GPR%02d:", i);
19439         cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], env->active_tc.gpr[i]);
19440         if ((i & 3) == 3)
19441             cpu_fprintf(f, "\n");
19442     }
19443
19444     cpu_fprintf(f, "CP0 Status  0x%08x Cause   0x%08x EPC    0x" TARGET_FMT_lx "\n",
19445                 env->CP0_Status, env->CP0_Cause, env->CP0_EPC);
19446     cpu_fprintf(f, "    Config0 0x%08x Config1 0x%08x LLAddr 0x%016"
19447                 PRIx64 "\n",
19448                 env->CP0_Config0, env->CP0_Config1, env->lladdr);
19449     cpu_fprintf(f, "    Config2 0x%08x Config3 0x%08x\n",
19450                 env->CP0_Config2, env->CP0_Config3);
19451     cpu_fprintf(f, "    Config4 0x%08x Config5 0x%08x\n",
19452                 env->CP0_Config4, env->CP0_Config5);
19453     if (env->hflags & MIPS_HFLAG_FPU)
19454         fpu_dump_state(env, f, cpu_fprintf, flags);
19455 #if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS)
19456     cpu_mips_check_sign_extensions(env, f, cpu_fprintf, flags);
19457 #endif
19458 }
19459
19460 void mips_tcg_init(void)
19461 {
19462     int i;
19463     static int inited;
19464
19465     /* Initialize various static tables. */
19466     if (inited)
19467         return;
19468
19469     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
19470     TCGV_UNUSED(cpu_gpr[0]);
19471     for (i = 1; i < 32; i++)
19472         cpu_gpr[i] = tcg_global_mem_new(TCG_AREG0,
19473                                         offsetof(CPUMIPSState, active_tc.gpr[i]),
19474                                         regnames[i]);
19475
19476     for (i = 0; i < 32; i++) {
19477         int off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[0]);
19478         msa_wr_d[i * 2] =
19479                 tcg_global_mem_new_i64(TCG_AREG0, off, msaregnames[i * 2]);
19480         /* The scalar floating-point unit (FPU) registers are mapped on
19481          * the MSA vector registers. */
19482         fpu_f64[i] = msa_wr_d[i * 2];
19483         off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[1]);
19484         msa_wr_d[i * 2 + 1] =
19485                 tcg_global_mem_new_i64(TCG_AREG0, off, msaregnames[i * 2 + 1]);
19486     }
19487
19488     cpu_PC = tcg_global_mem_new(TCG_AREG0,
19489                                 offsetof(CPUMIPSState, active_tc.PC), "PC");
19490     for (i = 0; i < MIPS_DSP_ACC; i++) {
19491         cpu_HI[i] = tcg_global_mem_new(TCG_AREG0,
19492                                        offsetof(CPUMIPSState, active_tc.HI[i]),
19493                                        regnames_HI[i]);
19494         cpu_LO[i] = tcg_global_mem_new(TCG_AREG0,
19495                                        offsetof(CPUMIPSState, active_tc.LO[i]),
19496                                        regnames_LO[i]);
19497     }
19498     cpu_dspctrl = tcg_global_mem_new(TCG_AREG0,
19499                                      offsetof(CPUMIPSState, active_tc.DSPControl),
19500                                      "DSPControl");
19501     bcond = tcg_global_mem_new(TCG_AREG0,
19502                                offsetof(CPUMIPSState, bcond), "bcond");
19503     btarget = tcg_global_mem_new(TCG_AREG0,
19504                                  offsetof(CPUMIPSState, btarget), "btarget");
19505     hflags = tcg_global_mem_new_i32(TCG_AREG0,
19506                                     offsetof(CPUMIPSState, hflags), "hflags");
19507
19508     fpu_fcr0 = tcg_global_mem_new_i32(TCG_AREG0,
19509                                       offsetof(CPUMIPSState, active_fpu.fcr0),
19510                                       "fcr0");
19511     fpu_fcr31 = tcg_global_mem_new_i32(TCG_AREG0,
19512                                        offsetof(CPUMIPSState, active_fpu.fcr31),
19513                                        "fcr31");
19514
19515     inited = 1;
19516 }
19517
19518 #include "translate_init.c"
19519
19520 MIPSCPU *cpu_mips_init(const char *cpu_model)
19521 {
19522     MIPSCPU *cpu;
19523     CPUMIPSState *env;
19524     const mips_def_t *def;
19525
19526     def = cpu_mips_find_by_name(cpu_model);
19527     if (!def)
19528         return NULL;
19529     cpu = MIPS_CPU(object_new(TYPE_MIPS_CPU));
19530     env = &cpu->env;
19531     env->cpu_model = def;
19532
19533 #ifndef CONFIG_USER_ONLY
19534     mmu_init(env, def);
19535 #endif
19536     fpu_init(env, def);
19537     mvp_init(env, def);
19538
19539     object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
19540
19541     return cpu;
19542 }
19543
19544 void cpu_state_reset(CPUMIPSState *env)
19545 {
19546     MIPSCPU *cpu = mips_env_get_cpu(env);
19547     CPUState *cs = CPU(cpu);
19548
19549     /* Reset registers to their default values */
19550     env->CP0_PRid = env->cpu_model->CP0_PRid;
19551     env->CP0_Config0 = env->cpu_model->CP0_Config0;
19552 #ifdef TARGET_WORDS_BIGENDIAN
19553     env->CP0_Config0 |= (1 << CP0C0_BE);
19554 #endif
19555     env->CP0_Config1 = env->cpu_model->CP0_Config1;
19556     env->CP0_Config2 = env->cpu_model->CP0_Config2;
19557     env->CP0_Config3 = env->cpu_model->CP0_Config3;
19558     env->CP0_Config4 = env->cpu_model->CP0_Config4;
19559     env->CP0_Config4_rw_bitmask = env->cpu_model->CP0_Config4_rw_bitmask;
19560     env->CP0_Config5 = env->cpu_model->CP0_Config5;
19561     env->CP0_Config5_rw_bitmask = env->cpu_model->CP0_Config5_rw_bitmask;
19562     env->CP0_Config6 = env->cpu_model->CP0_Config6;
19563     env->CP0_Config7 = env->cpu_model->CP0_Config7;
19564     env->CP0_LLAddr_rw_bitmask = env->cpu_model->CP0_LLAddr_rw_bitmask
19565                                  << env->cpu_model->CP0_LLAddr_shift;
19566     env->CP0_LLAddr_shift = env->cpu_model->CP0_LLAddr_shift;
19567     env->SYNCI_Step = env->cpu_model->SYNCI_Step;
19568     env->CCRes = env->cpu_model->CCRes;
19569     env->CP0_Status_rw_bitmask = env->cpu_model->CP0_Status_rw_bitmask;
19570     env->CP0_TCStatus_rw_bitmask = env->cpu_model->CP0_TCStatus_rw_bitmask;
19571     env->CP0_SRSCtl = env->cpu_model->CP0_SRSCtl;
19572     env->current_tc = 0;
19573     env->SEGBITS = env->cpu_model->SEGBITS;
19574     env->SEGMask = (target_ulong)((1ULL << env->cpu_model->SEGBITS) - 1);
19575 #if defined(TARGET_MIPS64)
19576     if (env->cpu_model->insn_flags & ISA_MIPS3) {
19577         env->SEGMask |= 3ULL << 62;
19578     }
19579 #endif
19580     env->PABITS = env->cpu_model->PABITS;
19581     env->PAMask = (1ULL << env->cpu_model->PABITS) - 1;
19582     env->CP0_SRSConf0_rw_bitmask = env->cpu_model->CP0_SRSConf0_rw_bitmask;
19583     env->CP0_SRSConf0 = env->cpu_model->CP0_SRSConf0;
19584     env->CP0_SRSConf1_rw_bitmask = env->cpu_model->CP0_SRSConf1_rw_bitmask;
19585     env->CP0_SRSConf1 = env->cpu_model->CP0_SRSConf1;
19586     env->CP0_SRSConf2_rw_bitmask = env->cpu_model->CP0_SRSConf2_rw_bitmask;
19587     env->CP0_SRSConf2 = env->cpu_model->CP0_SRSConf2;
19588     env->CP0_SRSConf3_rw_bitmask = env->cpu_model->CP0_SRSConf3_rw_bitmask;
19589     env->CP0_SRSConf3 = env->cpu_model->CP0_SRSConf3;
19590     env->CP0_SRSConf4_rw_bitmask = env->cpu_model->CP0_SRSConf4_rw_bitmask;
19591     env->CP0_SRSConf4 = env->cpu_model->CP0_SRSConf4;
19592     env->CP0_PageGrain_rw_bitmask = env->cpu_model->CP0_PageGrain_rw_bitmask;
19593     env->CP0_PageGrain = env->cpu_model->CP0_PageGrain;
19594     env->active_fpu.fcr0 = env->cpu_model->CP1_fcr0;
19595     env->msair = env->cpu_model->MSAIR;
19596     env->insn_flags = env->cpu_model->insn_flags;
19597
19598 #if defined(CONFIG_USER_ONLY)
19599     env->CP0_Status = (MIPS_HFLAG_UM << CP0St_KSU);
19600 # ifdef TARGET_MIPS64
19601     /* Enable 64-bit register mode.  */
19602     env->CP0_Status |= (1 << CP0St_PX);
19603 # endif
19604 # ifdef TARGET_ABI_MIPSN64
19605     /* Enable 64-bit address mode.  */
19606     env->CP0_Status |= (1 << CP0St_UX);
19607 # endif
19608     /* Enable access to the CPUNum, SYNCI_Step, CC, and CCRes RDHWR
19609        hardware registers.  */
19610     env->CP0_HWREna |= 0x0000000F;
19611     if (env->CP0_Config1 & (1 << CP0C1_FP)) {
19612         env->CP0_Status |= (1 << CP0St_CU1);
19613     }
19614     if (env->CP0_Config3 & (1 << CP0C3_DSPP)) {
19615         env->CP0_Status |= (1 << CP0St_MX);
19616     }
19617 # if defined(TARGET_MIPS64)
19618     /* For MIPS64, init FR bit to 1 if FPU unit is there and bit is writable. */
19619     if ((env->CP0_Config1 & (1 << CP0C1_FP)) &&
19620         (env->CP0_Status_rw_bitmask & (1 << CP0St_FR))) {
19621         env->CP0_Status |= (1 << CP0St_FR);
19622     }
19623 # endif
19624 #else
19625     if (env->hflags & MIPS_HFLAG_BMASK) {
19626         /* If the exception was raised from a delay slot,
19627            come back to the jump.  */
19628         env->CP0_ErrorEPC = (env->active_tc.PC
19629                              - (env->hflags & MIPS_HFLAG_B16 ? 2 : 4));
19630     } else {
19631         env->CP0_ErrorEPC = env->active_tc.PC;
19632     }
19633     env->active_tc.PC = (int32_t)0xBFC00000;
19634     env->CP0_Random = env->tlb->nb_tlb - 1;
19635     env->tlb->tlb_in_use = env->tlb->nb_tlb;
19636     env->CP0_Wired = 0;
19637     env->CP0_EBase = (cs->cpu_index & 0x3FF);
19638     if (kvm_enabled()) {
19639         env->CP0_EBase |= 0x40000000;
19640     } else {
19641         env->CP0_EBase |= 0x80000000;
19642     }
19643     env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
19644     /* vectored interrupts not implemented, timer on int 7,
19645        no performance counters. */
19646     env->CP0_IntCtl = 0xe0000000;
19647     {
19648         int i;
19649
19650         for (i = 0; i < 7; i++) {
19651             env->CP0_WatchLo[i] = 0;
19652             env->CP0_WatchHi[i] = 0x80000000;
19653         }
19654         env->CP0_WatchLo[7] = 0;
19655         env->CP0_WatchHi[7] = 0;
19656     }
19657     /* Count register increments in debug mode, EJTAG version 1 */
19658     env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
19659
19660     cpu_mips_store_count(env, 1);
19661
19662     if (env->CP0_Config3 & (1 << CP0C3_MT)) {
19663         int i;
19664
19665         /* Only TC0 on VPE 0 starts as active.  */
19666         for (i = 0; i < ARRAY_SIZE(env->tcs); i++) {
19667             env->tcs[i].CP0_TCBind = cs->cpu_index << CP0TCBd_CurVPE;
19668             env->tcs[i].CP0_TCHalt = 1;
19669         }
19670         env->active_tc.CP0_TCHalt = 1;
19671         cs->halted = 1;
19672
19673         if (cs->cpu_index == 0) {
19674             /* VPE0 starts up enabled.  */
19675             env->mvp->CP0_MVPControl |= (1 << CP0MVPCo_EVP);
19676             env->CP0_VPEConf0 |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA);
19677
19678             /* TC0 starts up unhalted.  */
19679             cs->halted = 0;
19680             env->active_tc.CP0_TCHalt = 0;
19681             env->tcs[0].CP0_TCHalt = 0;
19682             /* With thread 0 active.  */
19683             env->active_tc.CP0_TCStatus = (1 << CP0TCSt_A);
19684             env->tcs[0].CP0_TCStatus = (1 << CP0TCSt_A);
19685         }
19686     }
19687 #endif
19688     if ((env->insn_flags & ISA_MIPS32R6) &&
19689         (env->active_fpu.fcr0 & (1 << FCR0_F64))) {
19690         /* Status.FR = 0 mode in 64-bit FPU not allowed in R6 */
19691         env->CP0_Status |= (1 << CP0St_FR);
19692     }
19693
19694     /* MSA */
19695     if (env->CP0_Config3 & (1 << CP0C3_MSAP)) {
19696         msa_reset(env);
19697     }
19698
19699     compute_hflags(env);
19700     restore_rounding_mode(env);
19701     restore_flush_mode(env);
19702     cs->exception_index = EXCP_NONE;
19703 }
19704
19705 void restore_state_to_opc(CPUMIPSState *env, TranslationBlock *tb, int pc_pos)
19706 {
19707     env->active_tc.PC = tcg_ctx.gen_opc_pc[pc_pos];
19708     env->hflags &= ~MIPS_HFLAG_BMASK;
19709     env->hflags |= gen_opc_hflags[pc_pos];
19710     switch (env->hflags & MIPS_HFLAG_BMASK_BASE) {
19711     case MIPS_HFLAG_BR:
19712         break;
19713     case MIPS_HFLAG_BC:
19714     case MIPS_HFLAG_BL:
19715     case MIPS_HFLAG_B:
19716         env->btarget = gen_opc_btarget[pc_pos];
19717         break;
19718     }
19719 }
This page took 1.145027 seconds and 4 git commands to generate.